aboutsummaryrefslogtreecommitdiffstats
path: root/xen
diff options
context:
space:
mode:
authorJulien Grall <julien.grall@linaro.org>2013-09-27 17:56:37 +0100
committerIan Campbell <ian.campbell@citrix.com>2013-10-08 15:46:42 +0100
commitd96e7b898136ff88ee5c8fac9e0ae8a695e37d9b (patch)
tree579308f883ac9c1adafcae2dcf7bd5e9308b7940 /xen
parente501dc9aa9100c5a6ffa21234f37d2f66403cc30 (diff)
downloadxen-d96e7b898136ff88ee5c8fac9e0ae8a695e37d9b.tar.gz
xen-d96e7b898136ff88ee5c8fac9e0ae8a695e37d9b.tar.bz2
xen-d96e7b898136ff88ee5c8fac9e0ae8a695e37d9b.zip
xen/dts: Support Linux initrd DT bindings
Linux uses the property linux,initrd-start and linux,initrd-end to know where the initrd lives in memory. Signed-off-by: Julien Grall <julien.grall@linaro.org> Acked-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'xen')
-rw-r--r--xen/common/device_tree.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c
index ea8ed56b9f..af0fb0446a 100644
--- a/xen/common/device_tree.c
+++ b/xen/common/device_tree.c
@@ -380,6 +380,29 @@ static void __init process_multiboot_node(const void *fdt, int node,
early_info.modules.nr_mods = nr;
}
+static void __init process_chosen_node(const void *fdt, int node,
+ const char *name,
+ u32 address_cells, u32 size_cells)
+{
+ struct dt_mb_module *mod = &early_info.modules.module[MOD_INITRD];
+ u32 start, end;
+
+ dt_printk("Checking for initrd in /chosen\n");
+
+ start = device_tree_get_u32(fdt, node, "linux,initrd-start", 0);
+ end = device_tree_get_u32(fdt, node, "linux,initrd-end", 0);
+
+ if ( !start || !end || (start >= end) )
+ return;
+
+ dt_printk("Initrd 0x%x-0x%x\n", start, end);
+
+ mod->start = start;
+ mod->size = end - start;
+
+ early_info.modules.nr_mods = MAX(MOD_INITRD, early_info.modules.nr_mods);
+}
+
static int __init early_scan_node(const void *fdt,
int node, const char *name, int depth,
u32 address_cells, u32 size_cells,
@@ -389,6 +412,8 @@ static int __init early_scan_node(const void *fdt,
process_memory_node(fdt, node, name, address_cells, size_cells);
else if ( device_tree_node_compatible(fdt, node, "xen,multiboot-module" ) )
process_multiboot_node(fdt, node, name, address_cells, size_cells);
+ else if ( depth == 1 && device_tree_node_matches(fdt, node, "chosen") )
+ process_chosen_node(fdt, node, name, address_cells, size_cells);
return 0;
}