All of lore.kernel.org
 help / color / mirror / Atom feed
From: Julien Grall <julien.grall@linaro.org>
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: patches@linaro.org, xen-devel@lists.xen.org,
	andre.przywara@linaro.org, stefano.stabellini@eu.citrix.com
Subject: Re: [RFC 16/24] xen/arm: Build DOM0 FDT by browsing the device tree structure
Date: Thu, 22 Aug 2013 15:10:56 +0100	[thread overview]
Message-ID: <52161BF0.4080101@linaro.org> (raw)
In-Reply-To: <1377179381.2825.32.camel@kazak.uk.xensource.com>

On 08/22/2013 02:49 PM, Ian Campbell wrote:
> On Fri, 2013-08-16 at 22:05 +0100, Julien Grall wrote:
>> Remove the usage of the FDT in benefit of the device tree structure.
> 
> "in favour of" is what I think you mean.
> 
>> The latter is easier to use and can embedded meta-data for Xen (ie: is the
>> device is used by Xen...).
>>
>> Signed-off-by: Julien Grall <julien.grall@linaro.org>
>> ---
>>  xen/arch/arm/domain_build.c |  270 ++++++++++++++++---------------------------
>>  1 file changed, 101 insertions(+), 169 deletions(-)
>>
>> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
>> index 604ec1c..c8f24ed 100644
>> --- a/xen/arch/arm/domain_build.c
>> +++ b/xen/arch/arm/domain_build.c
>> @@ -63,10 +63,10 @@ struct vcpu *__init alloc_dom0_vcpu0(void)
>>  }
>>  
>>  static int set_memory_reg_11(struct domain *d, struct kernel_info *kinfo,
>> -                             const void *fdt, const u32 *cell, int len,
>> -                             int address_cells, int size_cells, u32 *new_cell)
>> +                             const struct dt_property *pp,
>> +                             const struct dt_device_node *np, __be32 *new_cell)
>> {
>> -    int reg_size = (address_cells + size_cells) * sizeof(*cell);
>> +    int reg_size = dt_cells_to_size(dt_n_addr_cells(np) + dt_n_size_cells(np));
>>      paddr_t start;
>>      paddr_t size;
>>      struct page_info *pg;
>> @@ -90,7 +90,7 @@ static int set_memory_reg_11(struct domain *d, struct kernel_info *kinfo,
>>      if ( res )
>>          panic("Unable to add pages in DOM0: %d\n", res);
>>  
>> -    device_tree_set_reg(&new_cell, address_cells, size_cells, start, size);
>> +    dt_set_range(&new_cell, np, start, size);
>>  
>>      kinfo->mem.bank[0].start = start;
>>      kinfo->mem.bank[0].size = size;
>> @@ -100,25 +100,30 @@ static int set_memory_reg_11(struct domain *d, struct kernel_info *kinfo,
>>  }
>>  
>>  static int set_memory_reg(struct domain *d, struct kernel_info *kinfo,
>> -                          const void *fdt, const u32 *cell, int len,
>> -                          int address_cells, int size_cells, u32 *new_cell)
>> +                          const struct dt_property *pp,
>> +                          const struct dt_device_node *np, __be32 *new_cell)
>>  {
>> -    int reg_size = (address_cells + size_cells) * sizeof(*cell);
>> +    int reg_size = dt_cells_to_size(dt_n_addr_cells(np) + dt_n_size_cells(np));
>>      int l = 0;
>> +    unsigned int bank = 0;
>>      u64 start;
>>      u64 size;
>> +    int ret;
>>  
>>      if ( platform_has_quirk(PLATFORM_QUIRK_DOM0_MAPPING_11) )
>> -        return set_memory_reg_11(d, kinfo, fdt, cell, len, address_cells,
>> -                                 size_cells, new_cell);
>> +        return set_memory_reg_11(d, kinfo, pp, np, new_cell);
>>  
>> -    while ( kinfo->unassigned_mem > 0 && l + reg_size <= len
>> +    while ( kinfo->unassigned_mem > 0 && l + reg_size <= pp->length
>>              && kinfo->mem.nr_banks < NR_MEM_BANKS )
>>      {
>> -        device_tree_get_reg(&cell, address_cells, size_cells, &start, &size);
>> +        ret = dt_device_get_address(np, bank, &start, &size);
>> +        if ( ret )
>> +            panic("Unable to retrieve the bank %u for %s\n",
> 
> Dropping "the" sounds more natural to me. Perhaps say "memory bank" too?

I will fix it.

>  
>> -static void make_hypervisor_node(void *fdt, int addrcells, int sizecells)
>> +static int make_hypervisor_node(void *fdt, const struct dt_device_node *parent)
>>  {
>>      const char compat[] =
>>          "xen,xen-"__stringify(XEN_VERSION)"."__stringify(XEN_SUBVERSION)"\0"
>>          "xen,xen";
>> -    u32 reg[4];
>> -    u32 intr[3];
>> -    u32 *cell;
>> +    __be32 reg[4];
>> +    __be32 intr[3];
>> +    __be32 *cells;
>> +    int res;
>> +    int addrcells = dt_n_addr_cells(parent);
>> +    int sizecells = dt_n_size_cells(parent);
>> +
>> +    DPRINT("Create hypervisor node\n");
> 
> Not sure there is any point in this print unless you also add DPRINT of
> the things we put into it.

I will add more print. I think it can be usefull for debugging the
device tree.

>>  
>>      /*
>>       * Sanity-check address sizes, since addresses and sizes which do
>> [...]
> 
>> izecells));
>> +    cells = &reg[0];
>> +    dt_set_cell(&cells, addrcells, 0xb0000000);
>> +    dt_set_cell(&cells, sizecells, 0x20000);
> 
> Aside: this really ought to become dynamic, based on finding a hole in
> the physical address map...

Is this address used somewhere in Xen? I didn't find any place.

> 
> [...]
>> +    res = fdt_property(fdt, "interrupts", intr, sizeof(intr[0]) * 3);
>> +    if ( res )
>> +        return res;
> 
> the * 3 come from the interrupt-controller nodes properties I think?
> Should we assert somewhere that they match? Perhaps we would already die
> if it weren't anyway?

The GIC node always has #interrupt-size equals to 3. I don't think an
assert is necessary.

> 
>> @@ -454,7 +374,8 @@ static int handle_node(struct domain *d, const struct dt_device_node *np)
>>      if ( dt_match_node(skip_matches, np ) )
>>          return 0;
>>  
>> -    if ( dt_device_used_by(np) != DOMID_XEN )
>> +    if ( dt_device_used_by(np) != DOMID_XEN &&
>> +         !dt_device_type_is_equal(np, "memory") )
> 
> Can we get a comment about why memory is special here please?

I will add it.

> 
>>      {
>>          res = map_device(d, np);
>>  
> 
> Ian.
> 


-- 
Julien Grall

  reply	other threads:[~2013-08-22 14:10 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-16 21:05 [RFC 00/24] Allow Xen to boot with a raw Device Tree Julien Grall
2013-08-16 21:05 ` [RFC 01/24] xen/char: dt-uart: Allow the user to give a path to the node Julien Grall
2013-08-16 21:25   ` Andre Przywara
2013-08-19 15:09     ` Julien Grall
2013-08-22 12:23       ` Ian Campbell
2013-08-16 21:05 ` [RFC 02/24] xen: Introduce __initconst to store initial const data Julien Grall
2013-08-19  9:46   ` Jan Beulich
2013-08-19 14:56     ` Ian Campbell
2013-08-20  7:12       ` Jan Beulich
2013-08-20  8:31         ` Ian Campbell
2013-08-20  8:53           ` Jan Beulich
2013-08-20  8:59           ` Julien Grall
2013-08-22 13:07   ` Ian Campbell
2013-08-16 21:05 ` [RFC 03/24] xen/dts: Don't check the number of address and size cells in process_cpu_node Julien Grall
2013-08-19  0:59   ` Chen Baozi
2013-08-22 12:51   ` Ian Campbell
2013-08-22 13:14     ` Julien Grall
2013-08-22 14:05       ` Ian Campbell
2013-08-16 21:05 ` [RFC 04/24] xen/dts: Constify device_tree_flattened Julien Grall
2013-08-22 13:05   ` Ian Campbell
2013-08-22 13:35     ` Julien Grall
2013-08-22 14:07       ` Ian Campbell
2013-08-16 21:05 ` [RFC 05/24] xen/arm: Move __PSCI* from traps.c to the header Julien Grall
2013-08-22 13:05   ` Ian Campbell
2013-08-16 21:05 ` [RFC 06/24] xen: Add new string functions Julien Grall
2013-08-19  9:54   ` Jan Beulich
2013-08-19 14:57     ` Ian Campbell
2013-08-19 15:13       ` Julien Grall
2013-08-20  8:32         ` Jan Beulich
2013-08-16 21:05 ` [RFC 07/24] xen: Use the right string comparison function in device tree Julien Grall
2013-08-22 13:11   ` Ian Campbell
2013-08-22 13:23     ` Julien Grall
2013-08-16 21:05 ` [RFC 08/24] xen/dts: Don't add a fake property "name" in the " Julien Grall
2013-08-22 13:16   ` Ian Campbell
2013-08-22 13:43     ` Julien Grall
2013-08-22 14:08       ` Ian Campbell
2013-08-16 21:05 ` [RFC 09/24] xen/dts: Add new helpers to use " Julien Grall
2013-08-22 13:21   ` Ian Campbell
2013-08-22 13:48     ` Julien Grall
2013-08-22 14:09       ` Ian Campbell
2013-08-16 21:05 ` [RFC 10/24] xen/dts: Remove device_get_reg call in process_memory_node Julien Grall
2013-08-22 13:23   ` Ian Campbell
2013-08-22 13:54     ` Julien Grall
2013-08-22 14:10       ` Ian Campbell
2013-08-16 21:05 ` [RFC 11/24] xen/dts: Remove device_get_reg call in process_cpu_node Julien Grall
2013-08-16 21:05 ` [RFC 12/24] xen/dts: Remove device_get_reg call in process_multiboot_node Julien Grall
2013-08-16 21:05 ` [RFC 13/24] xen/dts: Check the CPU ID is not greater than NR_CPUS Julien Grall
2013-08-22 13:24   ` Ian Campbell
2013-08-16 21:05 ` [RFC 14/24] xen/video: hdlcd: Convert the driver to the new device tree API Julien Grall
2013-08-22 13:28   ` Ian Campbell
2013-08-22 14:02     ` Julien Grall
2013-08-22 14:11       ` Ian Campbell
2013-08-16 21:05 ` [RFC 15/24] xen/arm: Use dt_device_match to avoid multiple if conditions Julien Grall
2013-08-22 13:30   ` Ian Campbell
2013-08-22 14:04     ` Julien Grall
2013-08-16 21:05 ` [RFC 16/24] xen/arm: Build DOM0 FDT by browsing the device tree structure Julien Grall
2013-08-22 13:49   ` Ian Campbell
2013-08-22 14:10     ` Julien Grall [this message]
2013-08-22 14:13       ` Ian Campbell
2013-08-16 21:05 ` [RFC 17/24] xen/arm: Mark each device used by Xen as disabled in DOM0 FDT Julien Grall
2013-08-22 13:50   ` Ian Campbell
2013-08-22 14:15     ` Julien Grall
2013-08-22 14:22       ` Ian Campbell
2013-08-16 21:05 ` [RFC 18/24] xen/arm: Don't map disabled device in DOM0 Julien Grall
2013-08-16 21:05 ` [RFC 19/24] xen/arm: Create a fake PSCI node in dom0 device tree Julien Grall
2013-08-21 13:50   ` Julien Grall
2013-08-16 21:05 ` [RFC 20/24] xen/arm: Add new platform specific callback device_is_blacklist Julien Grall
2013-08-22 13:57   ` Ian Campbell
2013-08-16 21:05 ` [RFC 21/24] xen/arm: vexpress: Blacklist a list of board specific devices Julien Grall
2013-08-22 14:00   ` Ian Campbell
2013-08-22 14:24     ` Julien Grall
2013-08-22 14:36       ` Ian Campbell
2013-08-22 14:51         ` Julien Grall
2013-08-22 15:02           ` Ian Campbell
2013-08-22 15:28             ` Julien Grall
2013-08-22 15:32               ` Ian Campbell
2013-08-16 21:05 ` [RFC 22/24] xen/arm: exynos5: Blacklist MCT device Julien Grall
2013-08-16 21:05 ` [RFC 23/24] xen/dts: Clean up the exported API for device tree Julien Grall
2013-08-22 14:01   ` Ian Campbell
2013-08-16 21:05 ` [RFC 24/24] xen/arm: Check if the device is available before using it Julien Grall
2013-08-22 14:01   ` Ian Campbell
2013-08-19 22:11 ` [RFC 00/24] Allow Xen to boot with a raw Device Tree Julien Grall
2013-08-20  8:33   ` Ian Campbell
2013-08-20  8:48     ` Julien Grall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52161BF0.4080101@linaro.org \
    --to=julien.grall@linaro.org \
    --cc=Ian.Campbell@citrix.com \
    --cc=andre.przywara@linaro.org \
    --cc=patches@linaro.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.