[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 12/12] xen/arm: List static shared memory regions as /memory nodes
Hi Luca, On 18/04/2024 09:36, Luca Fancellu wrote: > > > Currently Xen is not exporting the static shared memory regions > to the device tree as /memory node, this commit is fixing this > issue. > > Given that now make_memory_node needs a parameter 'struct kernel_info' > in order to call the new function shm_mem_node_fill_reg_range, > take the occasion to remove the unused struct domain parameter. > > Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx> > --- > v3: > - removed previous patch that was merging the intervals, rebase > changes. > v2: > - try to use make_memory_node, don't add overlapping ranges of > memory, commit message changed. > v1: > - new patch > --- > --- > xen/arch/arm/dom0less-build.c | 2 +- > xen/arch/arm/domain_build.c | 34 +++++++++++++++++-------- > xen/arch/arm/include/asm/domain_build.h | 2 +- > xen/arch/arm/include/asm/static-shmem.h | 15 +++++++++++ > xen/arch/arm/static-shmem.c | 23 +++++++++++++++++ > 5 files changed, 63 insertions(+), 13 deletions(-) > > diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c > index 51cf03221d56..74f053c242f4 100644 > --- a/xen/arch/arm/dom0less-build.c > +++ b/xen/arch/arm/dom0less-build.c > @@ -642,7 +642,7 @@ static int __init prepare_dtb_domU(struct domain *d, > struct kernel_info *kinfo) > if ( ret ) > goto err; > > - ret = make_memory_node(d, kinfo->fdt, addrcells, sizecells, > + ret = make_memory_node(kinfo, addrcells, sizecells, > kernel_info_get_mem(kinfo)); > if ( ret ) > goto err; > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c > index 68532ddc084c..15f888169c4e 100644 > --- a/xen/arch/arm/domain_build.c > +++ b/xen/arch/arm/domain_build.c > @@ -756,15 +756,14 @@ int __init domain_fdt_begin_node(void *fdt, const char > *name, uint64_t unit) > return fdt_begin_node(fdt, buf); > } > > -int __init make_memory_node(const struct domain *d, > - void *fdt, > - int addrcells, int sizecells, > - const struct membanks *mem) > +int __init make_memory_node(const struct kernel_info *kinfo, int addrcells, > + int sizecells, const struct membanks *mem) > { > + void *fdt = kinfo->fdt; > unsigned int i; > int res, reg_size = addrcells + sizecells; > int nr_cells = 0; > - __be32 reg[NR_MEM_BANKS * 4 /* Worst case addrcells + sizecells */]; > + __be32 reg[DT_MEM_NODE_REG_RANGE_SIZE]; > __be32 *cells; > > if ( mem->nr_banks == 0 ) > @@ -797,14 +796,28 @@ int __init make_memory_node(const struct domain *d, > if ( mem->bank[i].type == MEMBANK_STATIC_DOMAIN ) > continue; > > - dt_dprintk(" Bank %d: %#"PRIx64"->%#"PRIx64"\n", > - i, start, start + size); > - > nr_cells += reg_size; > BUG_ON(nr_cells >= ARRAY_SIZE(reg)); > dt_child_set_range(&cells, addrcells, sizecells, start, size); > } > > + /* > + * static shared memory banks need to be listed as /memory node, so when > + * this function is handling the normal memory, add the banks. > + */ > + if ( mem == kernel_info_get_mem(kinfo) ) > + shm_mem_node_fill_reg_range(kinfo, reg, &nr_cells, addrcells, > + sizecells); > + > + for ( cells = reg, i = 0; cells < reg + nr_cells; i++, cells += reg_size > ) > + { > + u64 start = dt_read_number(cells, addrcells); We should no longer use Linux derived types like u64. Use uint64_t. > + u64 size = dt_read_number(cells + addrcells, sizecells); > + > + dt_dprintk(" Bank %d: %#"PRIx64"->%#"PRIx64"\n", > + i, start, start + size); i is unsigned so the correct format specifier should be %u > + } > + > dt_dprintk("(reg size %d, nr cells %d)\n", reg_size, nr_cells); > > res = fdt_property(fdt, "reg", reg, nr_cells * sizeof(*reg)); > @@ -1783,7 +1796,7 @@ static int __init handle_node(struct domain *d, struct > kernel_info *kinfo, > if ( res ) > return res; > > - res = make_memory_node(d, kinfo->fdt, addrcells, sizecells, > + res = make_memory_node(kinfo, addrcells, sizecells, > kernel_info_get_mem(kinfo)); > if ( res ) > return res; > @@ -1794,8 +1807,7 @@ static int __init handle_node(struct domain *d, struct > kernel_info *kinfo, > */ > if ( reserved_mem->nr_banks > 0 ) > { > - res = make_memory_node(d, kinfo->fdt, addrcells, sizecells, > - reserved_mem); > + res = make_memory_node(kinfo, addrcells, sizecells, > reserved_mem); > if ( res ) > return res; > } > diff --git a/xen/arch/arm/include/asm/domain_build.h > b/xen/arch/arm/include/asm/domain_build.h > index 026d975da28e..45936212ca21 100644 > --- a/xen/arch/arm/include/asm/domain_build.h > +++ b/xen/arch/arm/include/asm/domain_build.h > @@ -14,7 +14,7 @@ int make_chosen_node(const struct kernel_info *kinfo); > int make_cpus_node(const struct domain *d, void *fdt); > int make_hypervisor_node(struct domain *d, const struct kernel_info *kinfo, > int addrcells, int sizecells); > -int make_memory_node(const struct domain *d, void *fdt, int addrcells, > +int make_memory_node(const struct kernel_info *kinfo, int addrcells, > int sizecells, const struct membanks *mem); > int make_psci_node(void *fdt); > int make_timer_node(const struct kernel_info *kinfo); > diff --git a/xen/arch/arm/include/asm/static-shmem.h > b/xen/arch/arm/include/asm/static-shmem.h > index 7495a91e7a31..3b6569e5703f 100644 > --- a/xen/arch/arm/include/asm/static-shmem.h > +++ b/xen/arch/arm/include/asm/static-shmem.h > @@ -3,10 +3,15 @@ > #ifndef __ASM_STATIC_SHMEM_H_ > #define __ASM_STATIC_SHMEM_H_ > > +#include <xen/types.h> > #include <asm/kernel.h> > +#include <asm/setup.h> > > #ifdef CONFIG_STATIC_SHM > > +/* Worst case /memory node reg element: (addrcells + sizecells) */ > +#define DT_MEM_NODE_REG_RANGE_SIZE ((NR_MEM_BANKS + NR_SHMEM_BANKS) * 4) > + > int make_resv_memory_node(const struct kernel_info *kinfo, int addrcells, > int sizecells); > > @@ -37,8 +42,14 @@ int remove_shm_holes_for_domU(const struct kernel_info > *kinfo, > int make_shm_resv_memory_node(const struct kernel_info *kinfo, int addrcells, > int sizecells); > > +void shm_mem_node_fill_reg_range(const struct kernel_info *kinfo, __be32 > *reg, > + int *nr_cells, int addrcells, int > sizecells); > + > #else /* !CONFIG_STATIC_SHM */ > > +/* Worst case /memory node reg element: (addrcells + sizecells) */ > +#define DT_MEM_NODE_REG_RANGE_SIZE (NR_MEM_BANKS * 4) > + > static inline int make_resv_memory_node(const struct kernel_info *kinfo, > int addrcells, int sizecells) > { > @@ -86,6 +97,10 @@ static inline int make_shm_resv_memory_node(const struct > kernel_info *kinfo, > return 0; > } > > +static inline void shm_mem_node_fill_reg_range(const struct kernel_info > *kinfo, > + __be32 *reg, int *nr_cells, > + int addrcells, int sizecells) > {}; > + > #endif /* CONFIG_STATIC_SHM */ > > #endif /* __ASM_STATIC_SHMEM_H_ */ > diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c > index c85f60dd1bf7..07c93a820508 100644 > --- a/xen/arch/arm/static-shmem.c > +++ b/xen/arch/arm/static-shmem.c > @@ -1,5 +1,6 @@ > /* SPDX-License-Identifier: GPL-2.0-only */ > > +#include <xen/device_tree.h> > #include <xen/libfdt/libfdt.h> > #include <xen/rangeset.h> > #include <xen/sched.h> > @@ -668,6 +669,28 @@ int __init remove_shm_holes_for_domU(const struct > kernel_info *kinfo, > return res; > } > > +void __init shm_mem_node_fill_reg_range(const struct kernel_info *kinfo, > + __be32 *reg, int *nr_cells, > + int addrcells, int sizecells) > +{ > + const struct membanks *mem = &kinfo->shm_mem.common; > + unsigned int i; > + __be32 *cells; > + > + BUG_ON(!nr_cells || !reg); > + > + cells = ®[*nr_cells]; > + for ( i = 0; i < mem->nr_banks; i++ ) > + { > + u64 start = mem->bank[i].start; ditto Rest LGTM: Reviewed-by: Michal Orzel <michal.orzel@xxxxxxx> ~Michal
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |