diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2018-02-20 13:35:58 +0800 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2018-02-21 13:28:08 +1100 |
commit | 237cd0c50a669af3aff4e804d19b785f7515179d (patch) | |
tree | 712bf5571f8e1af1348614e5aa0c1940504c7d8c /core/mem_region.c | |
parent | 4c6539c1350418d83a86fec44ff1cc939152c383 (diff) | |
download | skiboot-237cd0c50a669af3aff4e804d19b785f7515179d.zip skiboot-237cd0c50a669af3aff4e804d19b785f7515179d.tar.gz skiboot-237cd0c50a669af3aff4e804d19b785f7515179d.tar.bz2 |
core: Fix mismatched names between reserved memory nodes & properties
OPAL exposes reserved memory regions through the device tree in both new
(nodes) and old (properties) formats.
However, the names used for these don't match - we use a generated cell
address for the nodes, but the plain region name for the properties.
This change, heavily based on code from Oliver O'Halloran
<oohall@gmail.com>, reworks the dt-generation code to firstly generate
the new-format nodes, then uses those same names to generate the
property data.
Reported-by: Deb McLemore <debmc@linux.vnet.ibm.com>
CC: Oliver O'Halloran <oohall@gmail.com>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
[stewart: fix test case]
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'core/mem_region.c')
-rw-r--r-- | core/mem_region.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/core/mem_region.c b/core/mem_region.c index 3c93cd4..4479a23 100644 --- a/core/mem_region.c +++ b/core/mem_region.c @@ -1232,32 +1232,39 @@ void mem_region_add_dt_reserved(void) dt_add_property(node, "ranges", NULL, 0); } - /* First pass: calculate length of property data */ + prlog(PR_INFO, "Reserved regions:\n"); + + /* First pass, create /reserved-memory/ nodes for each reservation, + * and calculate the length for the /reserved-names and + * /reserved-ranges properties */ list_for_each(®ions, region, list) { if (!region_is_reservable(region)) continue; - names_len += strlen(region->name) + 1; + + prlog(PR_INFO, " 0x%012llx..%012llx : %s\n", + (long long)region->start, + (long long)(region->start + region->len - 1), + region->name); + + mem_region_add_dt_reserved_node(node, region); + + /* calculate the size of the properties populated later */ + names_len += strlen(region->node->name) + 1; ranges_len += 2 * sizeof(uint64_t); } name = names = malloc(names_len); range = ranges = malloc(ranges_len); - prlog(PR_INFO, "Reserved regions:\n"); - /* Second pass: populate property data */ + /* Second pass: populate the old-style reserved-names and + * reserved-regions arrays based on the node data */ list_for_each(®ions, region, list) { if (!region_is_reservable(region)) continue; - len = strlen(region->name) + 1; - memcpy(name, region->name, len); - name += len; - - prlog(PR_INFO, " 0x%012llx..%012llx : %s\n", - (long long)region->start, - (long long)(region->start + region->len - 1), - region->name); - mem_region_add_dt_reserved_node(node, region); + len = strlen(region->node->name) + 1; + memcpy(name, region->node->name, len); + name += len; range[0] = cpu_to_fdt64(region->start); range[1] = cpu_to_fdt64(region->len); @@ -1265,7 +1272,6 @@ void mem_region_add_dt_reserved(void) } unlock(&mem_region_lock); - prop = dt_find_property(dt_root, "reserved-names"); if (prop) dt_del_property(dt_root, (struct dt_property *)prop); |