|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/6] xen/arm: keep track of reserved-memory regions
As we parse the device tree in Xen, keep track of the reserved-memory
regions as they need special treatment (follow-up patches will make use
of the stored information.)
Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
---
xen/arch/arm/bootfdt.c | 73 +++++++++++++++++++++++++++++++++++++++++++++
xen/include/asm-arm/setup.h | 1 +
2 files changed, 74 insertions(+)
diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
index 44af11c..a86b1b3 100644
--- a/xen/arch/arm/bootfdt.c
+++ b/xen/arch/arm/bootfdt.c
@@ -163,6 +163,76 @@ static void __init process_memory_node(const void *fdt,
int node,
}
}
+static void __init process_reserved_memory_node(const void *fdt,
+ int node,
+ int depth,
+ const char *name,
+ u32 as,
+ u32 ss)
+{
+ const struct fdt_property *prop;
+ int i;
+ int banks;
+ const __be32 *cell;
+ paddr_t start, size;
+ u32 reg_cells;
+ u32 address_cells[DEVICE_TREE_MAX_DEPTH];
+ u32 size_cells[DEVICE_TREE_MAX_DEPTH];
+
+ address_cells[depth] = as;
+ size_cells[depth] = ss;
+ node = fdt_next_node(fdt, node, &depth);
+
+ for ( ; node >= 0 && depth > 1;
+ node = fdt_next_node(fdt, node, &depth) )
+ {
+ name = fdt_get_name(fdt, node, NULL);
+
+ if ( depth >= DEVICE_TREE_MAX_DEPTH )
+ {
+ printk("Warning: device tree node `%s' is nested too deep\n",
+ name);
+ continue;
+ }
+
+ address_cells[depth] = device_tree_get_u32(fdt, node,
+ "#address-cells",
+ address_cells[depth-1]);
+ size_cells[depth] = device_tree_get_u32(fdt, node,
+ "#size-cells",
+ size_cells[depth-1]);
+ if ( address_cells[depth-1] < 1 || size_cells[depth-1] < 1 )
+ {
+ printk("fdt: node `%s': invalid #address-cells or #size-cells",
+ name);
+ continue;
+ }
+
+ prop = fdt_get_property(fdt, node, "reg", NULL);
+ if ( !prop )
+ {
+ printk("fdt: node `%s': missing `reg' property\n", name);
+ continue;
+ }
+
+ reg_cells = address_cells[depth-1] + size_cells[depth-1];
+ cell = (const __be32 *)prop->data;
+ banks = fdt32_to_cpu(prop->len) / (reg_cells * sizeof (u32));
+
+ for ( i = 0; i < banks && bootinfo.reserved_mem.nr_banks <
NR_MEM_BANKS; i++ )
+ {
+ device_tree_get_reg(&cell, address_cells[depth-1],
size_cells[depth-1],
+ &start, &size);
+ if ( !size )
+ continue;
+
+ bootinfo.reserved_mem.bank[bootinfo.reserved_mem.nr_banks].start =
start;
+ bootinfo.reserved_mem.bank[bootinfo.reserved_mem.nr_banks].size =
size;
+ bootinfo.reserved_mem.nr_banks++;
+ }
+ }
+}
+
static void __init process_multiboot_node(const void *fdt, int node,
const char *name,
u32 address_cells, u32 size_cells)
@@ -286,6 +356,9 @@ static int __init early_scan_node(const void *fdt,
{
if ( device_tree_node_matches(fdt, node, "memory") )
process_memory_node(fdt, node, name, address_cells, size_cells);
+ else if ( device_tree_node_matches(fdt, node, "reserved-memory") )
+ process_reserved_memory_node(fdt, node, depth, name,
+ address_cells, size_cells);
else if ( device_tree_node_compatible(fdt, node, "xen,multiboot-module" )
||
device_tree_node_compatible(fdt, node, "multiboot,module" ))
process_multiboot_node(fdt, node, name, address_cells, size_cells);
diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
index 11e1b2a..18eca89 100644
--- a/xen/include/asm-arm/setup.h
+++ b/xen/include/asm-arm/setup.h
@@ -45,6 +45,7 @@ struct bootmodules {
struct bootinfo {
struct meminfo mem;
+ struct meminfo reserved_mem;
struct bootmodules modules;
#ifdef CONFIG_ACPI
struct meminfo acpi;
--
1.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |