[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC PATCH 1/2] xen/arm: Add DT reserve map regions to bootinfo.reserved_mem
Currently the code is listing device tree reserve map regions as reserved memory for Xen, but they are not added into bootinfo.reserved_mem and they are fetched in multiple places using the same code sequence, causing duplication. Fix this by adding them to the bootinfo.reserved_mem at early stage. Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx> --- xen/arch/arm/arm32/mmu/mm.c | 29 +---------------- xen/arch/arm/bootfdt.c | 51 ++++++++++++++++++------------ xen/arch/arm/domain_build.c | 3 +- xen/arch/arm/include/asm/setup.h | 5 +++ xen/arch/arm/setup.c | 53 +++++++++----------------------- 5 files changed, 53 insertions(+), 88 deletions(-) diff --git a/xen/arch/arm/arm32/mmu/mm.c b/xen/arch/arm/arm32/mmu/mm.c index 23150122f7c4..be480c31ea05 100644 --- a/xen/arch/arm/arm32/mmu/mm.c +++ b/xen/arch/arm/arm32/mmu/mm.c @@ -73,33 +73,6 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e, } } - /* Now check any fdt reserved areas. */ - - nr = fdt_num_mem_rsv(device_tree_flattened); - - for ( ; i < mi->nr_mods + nr; i++ ) - { - paddr_t mod_s, mod_e; - - if ( fdt_get_mem_rsv_paddr(device_tree_flattened, - i - mi->nr_mods, - &mod_s, &mod_e ) < 0 ) - /* If we can't read it, pretend it doesn't exist... */ - continue; - - /* fdt_get_mem_rsv_paddr returns length */ - mod_e += mod_s; - - if ( s < mod_e && mod_s < e ) - { - mod_e = consider_modules(mod_e, e, size, align, i+1); - if ( mod_e ) - return mod_e; - - return consider_modules(s, mod_s, size, align, i+1); - } - } - /* * i is the current bootmodule we are evaluating, across all * possible kinds of bootmodules. @@ -108,7 +81,7 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e, * need to index the reserved_mem bank starting from 0, and only counting * the reserved-memory modules. Hence, we need to use i - nr. */ - nr += mi->nr_mods; + nr = mi->nr_mods; for ( ; i - nr < reserved_mem->nr_banks; i++ ) { paddr_t r_s = reserved_mem->bank[i - nr].start; diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c index 4d708442a19e..6e060111d95b 100644 --- a/xen/arch/arm/bootfdt.c +++ b/xen/arch/arm/bootfdt.c @@ -475,8 +475,7 @@ static void __init early_print_info(void) const struct membanks *mem_resv = bootinfo_get_reserved_mem(); struct bootmodules *mods = &bootinfo.modules; struct bootcmdlines *cmds = &bootinfo.cmdlines; - unsigned int i, j; - int nr_rsvd; + unsigned int i; for ( i = 0; i < mi->nr_banks; i++ ) printk("RAM: %"PRIpaddr" - %"PRIpaddr"\n", @@ -490,26 +489,11 @@ static void __init early_print_info(void) mods->module[i].start + mods->module[i].size, boot_module_kind_as_string(mods->module[i].kind)); - nr_rsvd = fdt_num_mem_rsv(device_tree_flattened); - if ( nr_rsvd < 0 ) - panic("Parsing FDT memory reserve map failed (%d)\n", nr_rsvd); - - for ( i = 0; i < nr_rsvd; i++ ) - { - paddr_t s, e; - - if ( fdt_get_mem_rsv_paddr(device_tree_flattened, i, &s, &e) < 0 ) - continue; - - /* fdt_get_mem_rsv_paddr returns length */ - e += s; - printk(" RESVD[%u]: %"PRIpaddr" - %"PRIpaddr"\n", i, s, e); - } - for ( j = 0; j < mem_resv->nr_banks; j++, i++ ) + for ( i = 0; i < mem_resv->nr_banks; i++ ) { printk(" RESVD[%u]: %"PRIpaddr" - %"PRIpaddr"\n", i, - mem_resv->bank[j].start, - mem_resv->bank[j].start + mem_resv->bank[j].size - 1); + mem_resv->bank[i].start, + mem_resv->bank[i].start + mem_resv->bank[i].size - 1); } early_print_info_shmem(); printk("\n"); @@ -550,7 +534,10 @@ static void __init swap_memory_node(void *_a, void *_b, size_t size) */ size_t __init boot_fdt_info(const void *fdt, paddr_t paddr) { + struct membanks *reserved_mem = bootinfo_get_reserved_mem(); struct membanks *mem = bootinfo_get_mem(); + unsigned int i; + int nr_rsvd; int ret; ret = fdt_check_header(fdt); @@ -559,6 +546,30 @@ size_t __init boot_fdt_info(const void *fdt, paddr_t paddr) add_boot_module(BOOTMOD_FDT, paddr, fdt_totalsize(fdt), false); + nr_rsvd = fdt_num_mem_rsv(fdt); + if ( nr_rsvd < 0 ) + panic("Parsing FDT memory reserve map failed (%d)\n", nr_rsvd); + + for ( i = 0; i < nr_rsvd; i++ ) + { + struct membank *bank; + paddr_t s, sz; + + if ( fdt_get_mem_rsv_paddr(device_tree_flattened, i, &s, &sz) < 0 ) + continue; + + if ( reserved_mem->nr_banks < reserved_mem->max_banks ) + { + bank = &reserved_mem->bank[reserved_mem->nr_banks]; + bank->start = s; + bank->size = sz; + bank->type = MEMBANK_FDT_RESVMEM; + reserved_mem->nr_banks++; + } + else + panic("Cannot allocate reserved memory bank\n"); + } + ret = device_tree_for_each_node(fdt, 0, early_scan_node, NULL); if ( ret ) panic("Early FDT parsing failed (%d)\n", ret); diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 0784e4c5e315..6fc88a8234e4 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -793,7 +793,8 @@ int __init make_memory_node(const struct kernel_info *kinfo, int addrcells, u64 start = mem->bank[i].start; u64 size = mem->bank[i].size; - if ( mem->bank[i].type == MEMBANK_STATIC_DOMAIN ) + if ( (mem->bank[i].type == MEMBANK_STATIC_DOMAIN) || + (mem->bank[i].type == MEMBANK_FDT_RESVMEM) ) continue; nr_cells += reg_size; diff --git a/xen/arch/arm/include/asm/setup.h b/xen/arch/arm/include/asm/setup.h index 28fb659fe946..fc6967f9a435 100644 --- a/xen/arch/arm/include/asm/setup.h +++ b/xen/arch/arm/include/asm/setup.h @@ -42,6 +42,11 @@ enum membank_type { * in reserved_mem. */ MEMBANK_STATIC_HEAP, + /* + * The MEMBANK_FDT_RESVMEM type is used to indicate whether the memory + * bank is from the FDT reserve map. + */ + MEMBANK_FDT_RESVMEM, }; /* Indicates the maximum number of characters(\0 included) for shm_id */ diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index d242674381d4..c4e5c19b11d6 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -210,48 +210,18 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e, const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); #ifdef CONFIG_STATIC_SHM const struct membanks *shmem = bootinfo_get_shmem(); + unsigned int offset; #endif - unsigned int i, nr; - int rc; - - rc = fdt_num_mem_rsv(device_tree_flattened); - if ( rc < 0 ) - panic("Unable to retrieve the number of reserved regions (rc=%d)\n", - rc); - - nr = rc; - - for ( i = first; i < nr ; i++ ) - { - paddr_t r_s, r_e; - - if ( fdt_get_mem_rsv_paddr(device_tree_flattened, i, &r_s, &r_e ) < 0 ) - /* If we can't read it, pretend it doesn't exist... */ - continue; - - r_e += r_s; /* fdt_get_mem_rsv_paddr returns length */ - - if ( s < r_e && r_s < e ) - { - dt_unreserved_regions(r_e, e, cb, i+1); - dt_unreserved_regions(s, r_s, cb, i+1); - return; - } - } + unsigned int i; /* * i is the current bootmodule we are evaluating across all possible * kinds. - * - * When retrieving the corresponding reserved-memory addresses - * below, we need to index the reserved_mem->bank starting - * from 0, and only counting the reserved-memory modules. Hence, - * we need to use i - nr. */ - for ( ; i - nr < reserved_mem->nr_banks; i++ ) + for ( i = first; i < reserved_mem->nr_banks; i++ ) { - paddr_t r_s = reserved_mem->bank[i - nr].start; - paddr_t r_e = r_s + reserved_mem->bank[i - nr].size; + paddr_t r_s = reserved_mem->bank[i].start; + paddr_t r_e = r_s + reserved_mem->bank[i].size; if ( s < r_e && r_s < e ) { @@ -262,11 +232,16 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e, } #ifdef CONFIG_STATIC_SHM - nr += reserved_mem->nr_banks; - for ( ; i - nr < shmem->nr_banks; i++ ) + /* + * When retrieving the corresponding shared memory addresses + * below, we need to index the shmem->bank starting from 0, hence + * we need to use i - reserved_mem->nr_banks. + */ + offset = reserved_mem->nr_banks; + for ( ; i - offset < shmem->nr_banks; i++ ) { - paddr_t r_s = shmem->bank[i - nr].start; - paddr_t r_e = r_s + shmem->bank[i - nr].size; + paddr_t r_s = shmem->bank[i - offset].start; + paddr_t r_e = r_s + shmem->bank[i - offset].size; if ( s < r_e && r_s < e ) { -- 2.34.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |