diff options
author | Jeremy Kerr <jeremy.kerr@canonical.com> | 2010-02-14 09:13:47 -0500 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2010-02-14 09:13:47 -0500 |
commit | 4ef7b373df330bc0ff037dc4792d373c9346375f (patch) | |
tree | 5e0daa974d6de7b96c95d990cbc191085ec80349 | |
parent | 9dfbf207802c7e8cda9d081a8d750b50633c82d2 (diff) |
of/flattree: Don't assume HAVE_LMB
We don't always have lmb available, so make arches provide an
early_init_dt_alloc_memory_arch() to handle the allocation of
memory in the fdt code.
When we don't have lmb.h included, we need asm/page.h for __va.
Signed-off-by: Jeremy Kerr <jeremy.kerr@canonical.com>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Acked-by: Michal Simek <monstr@monstr.eu>
-rw-r--r-- | arch/microblaze/kernel/prom.c | 5 | ||||
-rw-r--r-- | arch/powerpc/kernel/prom.c | 5 | ||||
-rw-r--r-- | drivers/of/fdt.c | 9 | ||||
-rw-r--r-- | include/linux/of_fdt.h | 1 |
4 files changed, 17 insertions, 3 deletions
diff --git a/arch/microblaze/kernel/prom.c b/arch/microblaze/kernel/prom.c index 050b7993c51c..a7dcaf092200 100644 --- a/arch/microblaze/kernel/prom.c +++ b/arch/microblaze/kernel/prom.c | |||
@@ -55,6 +55,11 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size) | |||
55 | lmb_add(base, size); | 55 | lmb_add(base, size); |
56 | } | 56 | } |
57 | 57 | ||
58 | u64 __init early_init_dt_alloc_memory_arch(u64 size, u64 align) | ||
59 | { | ||
60 | return lmb_alloc(size, align); | ||
61 | } | ||
62 | |||
58 | #ifdef CONFIG_EARLY_PRINTK | 63 | #ifdef CONFIG_EARLY_PRINTK |
59 | /* MS this is Microblaze specifig function */ | 64 | /* MS this is Microblaze specifig function */ |
60 | static int __init early_init_dt_scan_serial(unsigned long node, | 65 | static int __init early_init_dt_scan_serial(unsigned long node, |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 43c78d74ddcb..5bbbdb29f603 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -510,6 +510,11 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size) | |||
510 | memstart_addr = min((u64)memstart_addr, base); | 510 | memstart_addr = min((u64)memstart_addr, base); |
511 | } | 511 | } |
512 | 512 | ||
513 | u64 __init early_init_dt_alloc_memory_arch(u64 size, u64 align) | ||
514 | { | ||
515 | return lmb_alloc(size, align); | ||
516 | } | ||
517 | |||
513 | #ifdef CONFIG_BLK_DEV_INITRD | 518 | #ifdef CONFIG_BLK_DEV_INITRD |
514 | void __init early_init_dt_setup_initrd_arch(unsigned long start, | 519 | void __init early_init_dt_setup_initrd_arch(unsigned long start, |
515 | unsigned long end) | 520 | unsigned long end) |
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index b51f797d9d9d..406757a9d7ea 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c | |||
@@ -10,16 +10,18 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
13 | #include <linux/lmb.h> | ||
14 | #include <linux/initrd.h> | 13 | #include <linux/initrd.h> |
15 | #include <linux/of.h> | 14 | #include <linux/of.h> |
16 | #include <linux/of_fdt.h> | 15 | #include <linux/of_fdt.h> |
17 | 16 | #include <linux/string.h> | |
17 | #include <linux/errno.h> | ||
18 | 18 | ||
19 | #ifdef CONFIG_PPC | 19 | #ifdef CONFIG_PPC |
20 | #include <asm/machdep.h> | 20 | #include <asm/machdep.h> |
21 | #endif /* CONFIG_PPC */ | 21 | #endif /* CONFIG_PPC */ |
22 | 22 | ||
23 | #include <asm/page.h> | ||
24 | |||
23 | int __initdata dt_root_addr_cells; | 25 | int __initdata dt_root_addr_cells; |
24 | int __initdata dt_root_size_cells; | 26 | int __initdata dt_root_size_cells; |
25 | 27 | ||
@@ -560,7 +562,8 @@ void __init unflatten_device_tree(void) | |||
560 | pr_debug(" size is %lx, allocating...\n", size); | 562 | pr_debug(" size is %lx, allocating...\n", size); |
561 | 563 | ||
562 | /* Allocate memory for the expanded device tree */ | 564 | /* Allocate memory for the expanded device tree */ |
563 | mem = lmb_alloc(size + 4, __alignof__(struct device_node)); | 565 | mem = early_init_dt_alloc_memory_arch(size + 4, |
566 | __alignof__(struct device_node)); | ||
564 | mem = (unsigned long) __va(mem); | 567 | mem = (unsigned long) __va(mem); |
565 | 568 | ||
566 | ((__be32 *)mem)[size / 4] = cpu_to_be32(0xdeadbeef); | 569 | ((__be32 *)mem)[size / 4] = cpu_to_be32(0xdeadbeef); |
diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h index c9cb8a7bc065..a1ca92ccb0ff 100644 --- a/include/linux/of_fdt.h +++ b/include/linux/of_fdt.h | |||
@@ -78,6 +78,7 @@ extern void early_init_dt_check_for_initrd(unsigned long node); | |||
78 | extern int early_init_dt_scan_memory(unsigned long node, const char *uname, | 78 | extern int early_init_dt_scan_memory(unsigned long node, const char *uname, |
79 | int depth, void *data); | 79 | int depth, void *data); |
80 | extern void early_init_dt_add_memory_arch(u64 base, u64 size); | 80 | extern void early_init_dt_add_memory_arch(u64 base, u64 size); |
81 | extern u64 early_init_dt_alloc_memory_arch(u64 size, u64 align); | ||
81 | extern u64 dt_mem_next_cell(int s, __be32 **cellp); | 82 | extern u64 dt_mem_next_cell(int s, __be32 **cellp); |
82 | 83 | ||
83 | /* | 84 | /* |