aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Herring <robh@kernel.org>2014-04-01 23:46:48 -0400
committerRob Herring <robh@kernel.org>2014-04-30 01:59:17 -0400
commitd1552ce449eb0a8d2f0bd6599da3a8a3d7f77a84 (patch)
tree10e5d7505664ee5270eb8e0b895099decea030de
parentb0a6fb36a49f720c93c3da0b3f040e49e42435ad (diff)
of/fdt: move memreserve and dtb memory reservations into core
Move the /memreserve/ processing and dtb memory reservations into early_init_fdt_scan_reserved_mem. This converts arm, arm64, and powerpc as they are the only users of early_init_fdt_scan_reserved_mem. memblock_reserve is safe to call on the same region twice, so the reservation check for the dtb in powerpc 32-bit reservations is safe to remove. Signed-off-by: Rob Herring <robh@kernel.org> Tested-by: Michal Simek <michal.simek@xilinx.com> Cc: Russell King <linux@arm.linux.org.uk> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Tested-by: Grant Likely <grant.likely@linaro.org> Tested-by: Stephen Chivers <schivers@csc.com>
-rw-r--r--arch/arm/include/asm/prom.h2
-rw-r--r--arch/arm/kernel/devtree.c27
-rw-r--r--arch/arm/mm/init.c1
-rw-r--r--arch/arm64/mm/init.c21
-rw-r--r--arch/powerpc/kernel/prom.c22
-rw-r--r--drivers/of/fdt.c16
6 files changed, 16 insertions, 73 deletions
diff --git a/arch/arm/include/asm/prom.h b/arch/arm/include/asm/prom.h
index b681575ad3de..cd94ef2ef283 100644
--- a/arch/arm/include/asm/prom.h
+++ b/arch/arm/include/asm/prom.h
@@ -14,7 +14,6 @@
14#ifdef CONFIG_OF 14#ifdef CONFIG_OF
15 15
16extern const struct machine_desc *setup_machine_fdt(unsigned int dt_phys); 16extern const struct machine_desc *setup_machine_fdt(unsigned int dt_phys);
17extern void arm_dt_memblock_reserve(void);
18extern void __init arm_dt_init_cpu_maps(void); 17extern void __init arm_dt_init_cpu_maps(void);
19 18
20#else /* CONFIG_OF */ 19#else /* CONFIG_OF */
@@ -24,7 +23,6 @@ static inline const struct machine_desc *setup_machine_fdt(unsigned int dt_phys)
24 return NULL; 23 return NULL;
25} 24}
26 25
27static inline void arm_dt_memblock_reserve(void) { }
28static inline void arm_dt_init_cpu_maps(void) { } 26static inline void arm_dt_init_cpu_maps(void) { }
29 27
30#endif /* CONFIG_OF */ 28#endif /* CONFIG_OF */
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
index 38f4711b4995..3e5a2056a466 100644
--- a/arch/arm/kernel/devtree.c
+++ b/arch/arm/kernel/devtree.c
@@ -32,33 +32,6 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
32 arm_add_memory(base, size); 32 arm_add_memory(base, size);
33} 33}
34 34
35void __init arm_dt_memblock_reserve(void)
36{
37 u64 *reserve_map, base, size;
38
39 if (!initial_boot_params)
40 return;
41
42 /* Reserve the dtb region */
43 memblock_reserve(virt_to_phys(initial_boot_params),
44 be32_to_cpu(initial_boot_params->totalsize));
45
46 /*
47 * Process the reserve map. This will probably overlap the initrd
48 * and dtb locations which are already reserved, but overlaping
49 * doesn't hurt anything
50 */
51 reserve_map = ((void*)initial_boot_params) +
52 be32_to_cpu(initial_boot_params->off_mem_rsvmap);
53 while (1) {
54 base = be64_to_cpup(reserve_map++);
55 size = be64_to_cpup(reserve_map++);
56 if (!size)
57 break;
58 memblock_reserve(base, size);
59 }
60}
61
62#ifdef CONFIG_SMP 35#ifdef CONFIG_SMP
63extern struct of_cpu_method __cpu_method_of_table_begin[]; 36extern struct of_cpu_method __cpu_method_of_table_begin[];
64extern struct of_cpu_method __cpu_method_of_table_end[]; 37extern struct of_cpu_method __cpu_method_of_table_end[];
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 2a77ba8796ae..928d596d9ab4 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -317,7 +317,6 @@ void __init arm_memblock_init(struct meminfo *mi,
317#endif 317#endif
318 318
319 arm_mm_memblock_reserve(); 319 arm_mm_memblock_reserve();
320 arm_dt_memblock_reserve();
321 320
322 /* reserve any platform specific memblock areas */ 321 /* reserve any platform specific memblock areas */
323 if (mdesc->reserve) 322 if (mdesc->reserve)
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
index 51d5352e6ad5..091d428d64ac 100644
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -126,8 +126,6 @@ static void arm64_memory_present(void)
126 126
127void __init arm64_memblock_init(void) 127void __init arm64_memblock_init(void)
128{ 128{
129 u64 *reserve_map, base, size;
130
131 /* Register the kernel text, kernel data and initrd with memblock */ 129 /* Register the kernel text, kernel data and initrd with memblock */
132 memblock_reserve(__pa(_text), _end - _text); 130 memblock_reserve(__pa(_text), _end - _text);
133#ifdef CONFIG_BLK_DEV_INITRD 131#ifdef CONFIG_BLK_DEV_INITRD
@@ -142,25 +140,6 @@ void __init arm64_memblock_init(void)
142 memblock_reserve(__pa(swapper_pg_dir), SWAPPER_DIR_SIZE); 140 memblock_reserve(__pa(swapper_pg_dir), SWAPPER_DIR_SIZE);
143 memblock_reserve(__pa(idmap_pg_dir), IDMAP_DIR_SIZE); 141 memblock_reserve(__pa(idmap_pg_dir), IDMAP_DIR_SIZE);
144 142
145 /* Reserve the dtb region */
146 memblock_reserve(virt_to_phys(initial_boot_params),
147 be32_to_cpu(initial_boot_params->totalsize));
148
149 /*
150 * Process the reserve map. This will probably overlap the initrd
151 * and dtb locations which are already reserved, but overlapping
152 * doesn't hurt anything
153 */
154 reserve_map = ((void*)initial_boot_params) +
155 be32_to_cpu(initial_boot_params->off_mem_rsvmap);
156 while (1) {
157 base = be64_to_cpup(reserve_map++);
158 size = be64_to_cpup(reserve_map++);
159 if (!size)
160 break;
161 memblock_reserve(base, size);
162 }
163
164 early_init_fdt_scan_reserved_mem(); 143 early_init_fdt_scan_reserved_mem();
165 dma_contiguous_reserve(0); 144 dma_contiguous_reserve(0);
166 145
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index e5e2b6f63567..73b7e9b45054 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -596,19 +596,11 @@ static void __init early_reserve_mem_dt(void)
596 596
597static void __init early_reserve_mem(void) 597static void __init early_reserve_mem(void)
598{ 598{
599 u64 base, size;
600 __be64 *reserve_map; 599 __be64 *reserve_map;
601 unsigned long self_base;
602 unsigned long self_size;
603 600
604 reserve_map = (__be64 *)(((unsigned long)initial_boot_params) + 601 reserve_map = (__be64 *)(((unsigned long)initial_boot_params) +
605 be32_to_cpu(initial_boot_params->off_mem_rsvmap)); 602 be32_to_cpu(initial_boot_params->off_mem_rsvmap));
606 603
607 /* before we do anything, lets reserve the dt blob */
608 self_base = __pa((unsigned long)initial_boot_params);
609 self_size = be32_to_cpu(initial_boot_params->totalsize);
610 memblock_reserve(self_base, self_size);
611
612 /* Look for the new "reserved-regions" property in the DT */ 604 /* Look for the new "reserved-regions" property in the DT */
613 early_reserve_mem_dt(); 605 early_reserve_mem_dt();
614 606
@@ -637,26 +629,12 @@ static void __init early_reserve_mem(void)
637 size_32 = be32_to_cpup(reserve_map_32++); 629 size_32 = be32_to_cpup(reserve_map_32++);
638 if (size_32 == 0) 630 if (size_32 == 0)
639 break; 631 break;
640 /* skip if the reservation is for the blob */
641 if (base_32 == self_base && size_32 == self_size)
642 continue;
643 DBG("reserving: %x -> %x\n", base_32, size_32); 632 DBG("reserving: %x -> %x\n", base_32, size_32);
644 memblock_reserve(base_32, size_32); 633 memblock_reserve(base_32, size_32);
645 } 634 }
646 return; 635 return;
647 } 636 }
648#endif 637#endif
649 DBG("Processing reserve map\n");
650
651 /* Handle the reserve map in the fdt blob if it exists */
652 while (1) {
653 base = be64_to_cpup(reserve_map++);
654 size = be64_to_cpup(reserve_map++);
655 if (size == 0)
656 break;
657 DBG("reserving: %llx -> %llx\n", base, size);
658 memblock_reserve(base, size);
659 }
660} 638}
661 639
662void __init early_init_devtree(void *params) 640void __init early_init_devtree(void *params)
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 4129f7442244..051be4ca25b9 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -492,9 +492,25 @@ static int __init __fdt_scan_reserved_mem(unsigned long node, const char *uname,
492 */ 492 */
493void __init early_init_fdt_scan_reserved_mem(void) 493void __init early_init_fdt_scan_reserved_mem(void)
494{ 494{
495 int n;
496 u64 base, size;
497
495 if (!initial_boot_params) 498 if (!initial_boot_params)
496 return; 499 return;
497 500
501 /* Reserve the dtb region */
502 early_init_dt_reserve_memory_arch(__pa(initial_boot_params),
503 fdt_totalsize(initial_boot_params),
504 0);
505
506 /* Process header /memreserve/ fields */
507 for (n = 0; ; n++) {
508 fdt_get_mem_rsv(initial_boot_params, n, &base, &size);
509 if (!size)
510 break;
511 early_init_dt_reserve_memory_arch(base, size, 0);
512 }
513
498 of_scan_flat_dt(__fdt_scan_reserved_mem, NULL); 514 of_scan_flat_dt(__fdt_scan_reserved_mem, NULL);
499 fdt_init_reserved_mem(); 515 fdt_init_reserved_mem();
500} 516}