aboutsummaryrefslogtreecommitdiff
path: root/core/mem_region.c
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2015-08-17 14:49:53 +0800
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-08-17 17:04:14 +1000
commit03676d28dd4f2c05c9a1f1c695ded90182458d8b (patch)
tree557ce7f8b160b3be683d5caec18f78570e768c2b /core/mem_region.c
parenta1218c9589404211d01c633e6c41c95caf2002b0 (diff)
downloadskiboot-03676d28dd4f2c05c9a1f1c695ded90182458d8b.zip
skiboot-03676d28dd4f2c05c9a1f1c695ded90182458d8b.tar.gz
skiboot-03676d28dd4f2c05c9a1f1c695ded90182458d8b.tar.bz2
core/mem_region: Move reserved-ranges parsing into a separate function
This change moves the property-style reserved-memory parsing code to a separate function. We split dropping the properties into mem_region_add_dt_reserved (before creating the updated range properties), as we need to do that regardless of where the reservations are parsed from. Signed-off-by: Jeremy Kerr <jk@ozlabs.org> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'core/mem_region.c')
-rw-r--r--core/mem_region.c80
1 files changed, 46 insertions, 34 deletions
diff --git a/core/mem_region.c b/core/mem_region.c
index 48fdd7d..f46afda 100644
--- a/core/mem_region.c
+++ b/core/mem_region.c
@@ -798,10 +798,44 @@ void adjust_cpu_stacks_alloc(void)
skiboot_cpu_stacks.len = (cpu_max_pir + 1) * STACK_SIZE;
}
+static void mem_region_parse_reserved_properties(void)
+{
+ const struct dt_property *names, *ranges;
+ struct mem_region *region;
+
+ names = dt_find_property(dt_root, "reserved-names");
+ ranges = dt_find_property(dt_root, "reserved-ranges");
+ if (names && ranges) {
+ const uint64_t *range;
+ int n, len;
+
+ range = (const void *)ranges->prop;
+
+ for (n = 0; n < names->len; n += len, range += 2) {
+ char *name;
+
+ len = strlen(names->prop + n) + 1;
+ name = strdup(names->prop + n);
+
+ region = new_region(name,
+ dt_get_number(range, 2),
+ dt_get_number(range + 1, 2),
+ NULL, REGION_HW_RESERVED);
+ list_add(&regions, &region->list);
+ }
+ } else if (names || ranges) {
+ prerror("Invalid properties: reserved-names=%p "
+ "with reserved-ranges=%p\n",
+ names, ranges);
+ abort();
+ } else {
+ return;
+ }
+}
+
/* Trawl through device tree, create memory regions from nodes. */
void mem_region_init(void)
{
- const struct dt_property *names, *ranges;
struct mem_region *region;
struct dt_node *i;
@@ -861,42 +895,10 @@ void mem_region_init(void)
}
/* Add reserved ranges from the DT */
- names = dt_find_property(dt_root, "reserved-names");
- ranges = dt_find_property(dt_root, "reserved-ranges");
- if (names && ranges) {
- const uint64_t *range;
- int n, len;
-
- range = (const void *)ranges->prop;
-
- for (n = 0; n < names->len; n += len, range += 2) {
- char *name;
-
- len = strlen(names->prop + n) + 1;
- name = strdup(names->prop + n);
-
- region = new_region(name,
- dt_get_number(range, 2),
- dt_get_number(range + 1, 2),
- NULL, REGION_HW_RESERVED);
- list_add(&regions, &region->list);
- }
- } else if (names || ranges) {
- prerror("Invalid properties: reserved-names=%p "
- "with reserved-ranges=%p\n",
- names, ranges);
- abort();
- }
+ mem_region_parse_reserved_properties();
unlock(&mem_region_lock);
- /* We generate the reservation properties from our own region list,
- * which now includes the existing data.
- */
- if (names)
- dt_del_property(dt_root, (struct dt_property *)names);
- if (ranges)
- dt_del_property(dt_root, (struct dt_property *)ranges);
}
static uint64_t allocated_length(const struct mem_region *r)
@@ -992,6 +994,7 @@ static void mem_region_add_dt_reserved_node(struct dt_node *parent,
void mem_region_add_dt_reserved(void)
{
int names_len, ranges_len, len;
+ const struct dt_property *prop;
struct mem_region *region;
void *names, *ranges;
struct dt_node *node;
@@ -1046,6 +1049,15 @@ 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);
+
+ prop = dt_find_property(dt_root, "reserved-ranges");
+ if (prop)
+ dt_del_property(dt_root, (struct dt_property *)prop);
+
dt_add_property(dt_root, "reserved-names", names, names_len);
dt_add_property(dt_root, "reserved-ranges", ranges, ranges_len);