}
}
- /* 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.
* 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;
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",
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");
*/
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);
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);
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;
* 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 */
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 )
{
}
#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 )
{