A few functions iterate over the device tree property to get memory info,
like "reg" or the later "xen,static-mem", so this commit creates a new helper
device_tree_get_meminfo to extract the common codes.
Signed-off-by: Penny Zheng <penny.zheng@arm.com>
---
xen/arch/arm/bootfdt.c | 68 ++++++++++++++++++++++++------------------
1 file changed, 39 insertions(+), 29 deletions(-)
diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
index 476e32e0f5..8c81be3379 100644
--- a/xen/arch/arm/bootfdt.c
+++ b/xen/arch/arm/bootfdt.c
@@ -63,6 +63,44 @@ void __init device_tree_get_reg(const __be32 **cell, u32 address_cells,
*size = dt_next_cell(size_cells, cell);
}
+static int __init device_tree_get_meminfo(const void *fdt, int node,
+ const char *prop_name,
+ u32 address_cells, u32 size_cells,
+ void *data)
+{
+ const struct fdt_property *prop;
+ unsigned int i, banks;
+ const __be32 *cell;
+ u32 reg_cells = address_cells + size_cells;
+ paddr_t start, size;
+ struct meminfo *mem = data;
+
+ prop = fdt_get_property(fdt, node, prop_name, NULL);
+ if ( !prop )
+ return -ENOENT;
+
+ cell = (const __be32 *)prop->data;
+ banks = fdt32_to_cpu(prop->len) / (reg_cells * sizeof (u32));
+
+ for ( i = 0; i < banks && mem->nr_banks < NR_MEM_BANKS; i++ )
+ {
+ device_tree_get_reg(&cell, address_cells, size_cells, &start, &size);
+ /* Some DT may describe empty bank, ignore them */
+ if ( !size )
+ continue;
+ mem->bank[mem->nr_banks].start = start;
+ mem->bank[mem->nr_banks].size = size;
+ mem->nr_banks++;
+ }
+
+ if ( i < banks )
+ {
+ printk("Warning: Max number of supported memory regions reached.\n");
+ return -ENOSPC;
+ }
+ return 0;
+}
+
u32 __init device_tree_get_u32(const void *fdt, int node,
const char *prop_name, u32 dflt)
{
@@ -139,14 +177,6 @@ static int __init process_memory_node(const void *fdt, int node,
u32 address_cells, u32 size_cells,
void *data)
{
- const struct fdt_property *prop;
- int i;
- int banks;
- const __be32 *cell;
- paddr_t start, size;
- u32 reg_cells = address_cells + size_cells;
- struct meminfo *mem = data;
-
if ( address_cells < 1 || size_cells < 1 )
{
printk("fdt: node `%s': invalid #address-cells or #size-cells",
@@ -154,27 +184,7 @@ static int __init process_memory_node(const void *fdt, int node,
return -EINVAL;
}
- prop = fdt_get_property(fdt, node, "reg", NULL);
- if ( !prop )
- return -ENOENT;
-
- cell = (const __be32 *)prop->data;
- banks = fdt32_to_cpu(prop->len) / (reg_cells * sizeof (u32));
-
- for ( i = 0; i < banks && mem->nr_banks < NR_MEM_BANKS; i++ )
- {
- device_tree_get_reg(&cell, address_cells, size_cells, &start, &size);
- /* Some DT may describe empty bank, ignore them */
- if ( !size )
- continue;
- mem->bank[mem->nr_banks].start = start;
- mem->bank[mem->nr_banks].size = size;
- mem->nr_banks++;
- }
-
- if ( i < banks )
- return -ENOSPC;
- return 0;
+ return device_tree_get_meminfo(fdt, node, "reg", address_cells, size_cells, data);
}
static int __init process_reserved_memory_node(const void *fdt, int node,
--
2.25.1
Hi Penny,
On 24/08/2021 10:50, Penny Zheng wrote:
> A few functions iterate over the device tree property to get memory info,
> like "reg" or the later "xen,static-mem", so this commit creates a new helper
> device_tree_get_meminfo to extract the common codes.
The commit message needs to be updated as the patch has been reshuffled.
> Signed-off-by: Penny Zheng <penny.zheng@arm.com>
> ---
> xen/arch/arm/bootfdt.c | 68 ++++++++++++++++++++++++------------------
> 1 file changed, 39 insertions(+), 29 deletions(-)
>
> diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
> index 476e32e0f5..8c81be3379 100644
> --- a/xen/arch/arm/bootfdt.c
> +++ b/xen/arch/arm/bootfdt.c
> @@ -63,6 +63,44 @@ void __init device_tree_get_reg(const __be32 **cell, u32 address_cells,
> *size = dt_next_cell(size_cells, cell);
> }
>
> +static int __init device_tree_get_meminfo(const void *fdt, int node,
> + const char *prop_name,
> + u32 address_cells, u32 size_cells,
> + void *data)
> +{
> + const struct fdt_property *prop;
> + unsigned int i, banks;
> + const __be32 *cell;
> + u32 reg_cells = address_cells + size_cells;
> + paddr_t start, size;
> + struct meminfo *mem = data;
> +
> + prop = fdt_get_property(fdt, node, prop_name, NULL);
> + if ( !prop )
> + return -ENOENT;
> +
> + cell = (const __be32 *)prop->data;
> + banks = fdt32_to_cpu(prop->len) / (reg_cells * sizeof (u32));
> +
> + for ( i = 0; i < banks && mem->nr_banks < NR_MEM_BANKS; i++ )
> + {
> + device_tree_get_reg(&cell, address_cells, size_cells, &start, &size);
> + /* Some DT may describe empty bank, ignore them */
> + if ( !size )
> + continue;
> + mem->bank[mem->nr_banks].start = start;
> + mem->bank[mem->nr_banks].size = size;
> + mem->nr_banks++;
> + }
> +
> + if ( i < banks )
> + {
> + printk("Warning: Max number of supported memory regions reached.\n");
> + return -ENOSPC;
> + }
> + return 0;
> +}
> +
> u32 __init device_tree_get_u32(const void *fdt, int node,
> const char *prop_name, u32 dflt)
> {
> @@ -139,14 +177,6 @@ static int __init process_memory_node(const void *fdt, int node,
> u32 address_cells, u32 size_cells,
> void *data)
> {
> - const struct fdt_property *prop;
> - int i;
> - int banks;
> - const __be32 *cell;
> - paddr_t start, size;
> - u32 reg_cells = address_cells + size_cells;
> - struct meminfo *mem = data;
> -
> if ( address_cells < 1 || size_cells < 1 )
This check will be the same for "xen,static-mem". So can it be moved to
device_tree_get_meminfo()?
> {
> printk("fdt: node `%s': invalid #address-cells or #size-cells",
> @@ -154,27 +184,7 @@ static int __init process_memory_node(const void *fdt, int node,
> return -EINVAL;
> }
>
> - prop = fdt_get_property(fdt, node, "reg", NULL);
> - if ( !prop )
> - return -ENOENT;
> -
> - cell = (const __be32 *)prop->data;
> - banks = fdt32_to_cpu(prop->len) / (reg_cells * sizeof (u32));
> -
> - for ( i = 0; i < banks && mem->nr_banks < NR_MEM_BANKS; i++ )
> - {
> - device_tree_get_reg(&cell, address_cells, size_cells, &start, &size);
> - /* Some DT may describe empty bank, ignore them */
> - if ( !size )
> - continue;
> - mem->bank[mem->nr_banks].start = start;
> - mem->bank[mem->nr_banks].size = size;
> - mem->nr_banks++;
> - }
> -
> - if ( i < banks )
> - return -ENOSPC;
> - return 0;
> + return device_tree_get_meminfo(fdt, node, "reg", address_cells, size_cells, data);
> }
>
> static int __init process_reserved_memory_node(const void *fdt, int node,
>
Cheers,
--
Julien Grall
Hi Julien
> -----Original Message-----
> From: Julien Grall <julien@xen.org>
> Sent: Wednesday, September 1, 2021 4:57 PM
> To: Penny Zheng <Penny.Zheng@arm.com>; xen-devel@lists.xenproject.org;
> sstabellini@kernel.org
> Cc: Bertrand Marquis <Bertrand.Marquis@arm.com>; Wei Chen
> <Wei.Chen@arm.com>; nd <nd@arm.com>
> Subject: Re: [PATCH v5 1/7] xen/arm: introduce new helper
> device_tree_get_meminfo
>
> Hi Penny,
>
> On 24/08/2021 10:50, Penny Zheng wrote:
> > A few functions iterate over the device tree property to get memory
> > info, like "reg" or the later "xen,static-mem", so this commit creates
> > a new helper device_tree_get_meminfo to extract the common codes.
>
> The commit message needs to be updated as the patch has been reshuffled.
>
Yes! I'll reconstruct.
> > Signed-off-by: Penny Zheng <penny.zheng@arm.com>
> > ---
> > xen/arch/arm/bootfdt.c | 68 ++++++++++++++++++++++++------------------
> > 1 file changed, 39 insertions(+), 29 deletions(-)
> >
> > diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c index
> > 476e32e0f5..8c81be3379 100644
> > --- a/xen/arch/arm/bootfdt.c
> > +++ b/xen/arch/arm/bootfdt.c
> > @@ -63,6 +63,44 @@ void __init device_tree_get_reg(const __be32 **cell,
> u32 address_cells,
> > *size = dt_next_cell(size_cells, cell);
> > }
> >
> > +static int __init device_tree_get_meminfo(const void *fdt, int node,
> > + const char *prop_name,
> > + u32 address_cells, u32 size_cells,
> > + void *data) {
> > + const struct fdt_property *prop;
> > + unsigned int i, banks;
> > + const __be32 *cell;
> > + u32 reg_cells = address_cells + size_cells;
> > + paddr_t start, size;
> > + struct meminfo *mem = data;
> > +
> > + prop = fdt_get_property(fdt, node, prop_name, NULL);
> > + if ( !prop )
> > + return -ENOENT;
> > +
> > + cell = (const __be32 *)prop->data;
> > + banks = fdt32_to_cpu(prop->len) / (reg_cells * sizeof (u32));
> > +
> > + for ( i = 0; i < banks && mem->nr_banks < NR_MEM_BANKS; i++ )
> > + {
> > + device_tree_get_reg(&cell, address_cells, size_cells, &start, &size);
> > + /* Some DT may describe empty bank, ignore them */
> > + if ( !size )
> > + continue;
> > + mem->bank[mem->nr_banks].start = start;
> > + mem->bank[mem->nr_banks].size = size;
> > + mem->nr_banks++;
> > + }
> > +
> > + if ( i < banks )
> > + {
> > + printk("Warning: Max number of supported memory regions
> reached.\n");
> > + return -ENOSPC;
> > + }
> > + return 0;
> > +}
> > +
> > u32 __init device_tree_get_u32(const void *fdt, int node,
> > const char *prop_name, u32 dflt)
> > {
> > @@ -139,14 +177,6 @@ static int __init process_memory_node(const void
> *fdt, int node,
> > u32 address_cells, u32 size_cells,
> > void *data)
> > {
> > - const struct fdt_property *prop;
> > - int i;
> > - int banks;
> > - const __be32 *cell;
> > - paddr_t start, size;
> > - u32 reg_cells = address_cells + size_cells;
> > - struct meminfo *mem = data;
> > -
> > if ( address_cells < 1 || size_cells < 1 )
>
> This check will be the same for "xen,static-mem". So can it be moved to
> device_tree_get_meminfo()?
>
Sure. I'll move it.
> > {
> > printk("fdt: node `%s': invalid #address-cells or
> > #size-cells", @@ -154,27 +184,7 @@ static int __init
> process_memory_node(const void *fdt, int node,
> > return -EINVAL;
> > }
> >
> > - prop = fdt_get_property(fdt, node, "reg", NULL);
> > - if ( !prop )
> > - return -ENOENT;
> > -
> > - cell = (const __be32 *)prop->data;
> > - banks = fdt32_to_cpu(prop->len) / (reg_cells * sizeof (u32));
> > -
> > - for ( i = 0; i < banks && mem->nr_banks < NR_MEM_BANKS; i++ )
> > - {
> > - device_tree_get_reg(&cell, address_cells, size_cells, &start, &size);
> > - /* Some DT may describe empty bank, ignore them */
> > - if ( !size )
> > - continue;
> > - mem->bank[mem->nr_banks].start = start;
> > - mem->bank[mem->nr_banks].size = size;
> > - mem->nr_banks++;
> > - }
> > -
> > - if ( i < banks )
> > - return -ENOSPC;
> > - return 0;
> > + return device_tree_get_meminfo(fdt, node, "reg", address_cells,
> > + size_cells, data);
> > }
> >
> > static int __init process_reserved_memory_node(const void *fdt, int
> > node,
> >
>
> Cheers,
>
> --
> Julien Grall
© 2016 - 2026 Red Hat, Inc.