aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaura Abbott <lauraa@codeaurora.org>2014-04-13 17:54:58 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2014-05-31 20:17:12 -0400
commit1c2f87c22566cd057bc8cde10c37ae9da1a1bb76 (patch)
tree6c135a3b2b6af6be3b6593ac6329d6d4f353b7dd
parent1c8c3cf0b5239388e712508a85821f4718f4d889 (diff)
ARM: 8025/1: Get rid of meminfo
memblock is now fully integrated into the kernel and is the prefered method for tracking memory. Rather than reinvent the wheel with meminfo, migrate to using memblock directly instead of meminfo as an intermediate. Acked-by: Jason Cooper <jason@lakedaemon.net> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Acked-by: Kukjin Kim <kgene.kim@samsung.com> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> Tested-by: Leif Lindholm <leif.lindholm@linaro.org> Signed-off-by: Laura Abbott <lauraa@codeaurora.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--arch/arm/Kconfig5
-rw-r--r--arch/arm/boot/compressed/atags_to_fdt.c2
-rw-r--r--arch/arm/include/asm/mach/arch.h4
-rw-r--r--arch/arm/include/asm/memblock.h3
-rw-r--r--arch/arm/include/asm/setup.h28
-rw-r--r--arch/arm/kernel/atags_parse.c5
-rw-r--r--arch/arm/kernel/devtree.c5
-rw-r--r--arch/arm/kernel/setup.c30
-rw-r--r--arch/arm/mach-clps711x/board-clep7312.c7
-rw-r--r--arch/arm/mach-clps711x/board-edb7211.c10
-rw-r--r--arch/arm/mach-clps711x/board-p720t.c2
-rw-r--r--arch/arm/mach-footbridge/cats-hw.c2
-rw-r--r--arch/arm/mach-footbridge/netwinder-hw.c2
-rw-r--r--arch/arm/mach-msm/board-halibut.c6
-rw-r--r--arch/arm/mach-msm/board-mahimahi.c13
-rw-r--r--arch/arm/mach-msm/board-msm7x30.c3
-rw-r--r--arch/arm/mach-msm/board-sapphire.c13
-rw-r--r--arch/arm/mach-msm/board-trout.c8
-rw-r--r--arch/arm/mach-orion5x/common.c3
-rw-r--r--arch/arm/mach-orion5x/common.h3
-rw-r--r--arch/arm/mach-pxa/cm-x300.c3
-rw-r--r--arch/arm/mach-pxa/corgi.c10
-rw-r--r--arch/arm/mach-pxa/eseries.c9
-rw-r--r--arch/arm/mach-pxa/poodle.c8
-rw-r--r--arch/arm/mach-pxa/spitz.c8
-rw-r--r--arch/arm/mach-pxa/tosa.c8
-rw-r--r--arch/arm/mach-realview/core.c11
-rw-r--r--arch/arm/mach-realview/core.h3
-rw-r--r--arch/arm/mach-realview/realview_pb1176.c8
-rw-r--r--arch/arm/mach-realview/realview_pbx.c17
-rw-r--r--arch/arm/mach-s3c24xx/mach-smdk2413.c8
-rw-r--r--arch/arm/mach-s3c24xx/mach-vstms.c8
-rw-r--r--arch/arm/mach-sa1100/assabet.c2
-rw-r--r--arch/arm/mm/init.c72
-rw-r--r--arch/arm/mm/mmu.c117
-rw-r--r--arch/arm/mm/nommu.c66
36 files changed, 179 insertions, 333 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index ce64b7f66328..03551fafb1fd 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1101,11 +1101,6 @@ source "arch/arm/firmware/Kconfig"
1101 1101
1102source arch/arm/mm/Kconfig 1102source arch/arm/mm/Kconfig
1103 1103
1104config ARM_NR_BANKS
1105 int
1106 default 16 if ARCH_EP93XX
1107 default 8
1108
1109config IWMMXT 1104config IWMMXT
1110 bool "Enable iWMMXt support" if !CPU_PJ4 1105 bool "Enable iWMMXt support" if !CPU_PJ4
1111 depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 1106 depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
diff --git a/arch/arm/boot/compressed/atags_to_fdt.c b/arch/arm/boot/compressed/atags_to_fdt.c
index d1153c8a765a..9448aa0c6686 100644
--- a/arch/arm/boot/compressed/atags_to_fdt.c
+++ b/arch/arm/boot/compressed/atags_to_fdt.c
@@ -7,6 +7,8 @@
7#define do_extend_cmdline 0 7#define do_extend_cmdline 0
8#endif 8#endif
9 9
10#define NR_BANKS 16
11
10static int node_offset(void *fdt, const char *node_path) 12static int node_offset(void *fdt, const char *node_path)
11{ 13{
12 int offset = fdt_path_offset(fdt, node_path); 14 int offset = fdt_path_offset(fdt, node_path);
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index 17a3fa2979e8..c43473afde8a 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -14,7 +14,6 @@
14#include <linux/reboot.h> 14#include <linux/reboot.h>
15 15
16struct tag; 16struct tag;
17struct meminfo;
18struct pt_regs; 17struct pt_regs;
19struct smp_operations; 18struct smp_operations;
20#ifdef CONFIG_SMP 19#ifdef CONFIG_SMP
@@ -47,8 +46,7 @@ struct machine_desc {
47 enum reboot_mode reboot_mode; /* default restart mode */ 46 enum reboot_mode reboot_mode; /* default restart mode */
48 struct smp_operations *smp; /* SMP operations */ 47 struct smp_operations *smp; /* SMP operations */
49 bool (*smp_init)(void); 48 bool (*smp_init)(void);
50 void (*fixup)(struct tag *, char **, 49 void (*fixup)(struct tag *, char **);
51 struct meminfo *);
52 void (*init_meminfo)(void); 50 void (*init_meminfo)(void);
53 void (*reserve)(void);/* reserve mem blocks */ 51 void (*reserve)(void);/* reserve mem blocks */
54 void (*map_io)(void);/* IO mapping function */ 52 void (*map_io)(void);/* IO mapping function */
diff --git a/arch/arm/include/asm/memblock.h b/arch/arm/include/asm/memblock.h
index c2f5102ae659..bf47a6c110a2 100644
--- a/arch/arm/include/asm/memblock.h
+++ b/arch/arm/include/asm/memblock.h
@@ -1,10 +1,9 @@
1#ifndef _ASM_ARM_MEMBLOCK_H 1#ifndef _ASM_ARM_MEMBLOCK_H
2#define _ASM_ARM_MEMBLOCK_H 2#define _ASM_ARM_MEMBLOCK_H
3 3
4struct meminfo;
5struct machine_desc; 4struct machine_desc;
6 5
7void arm_memblock_init(struct meminfo *, const struct machine_desc *); 6void arm_memblock_init(const struct machine_desc *);
8phys_addr_t arm_memblock_steal(phys_addr_t size, phys_addr_t align); 7phys_addr_t arm_memblock_steal(phys_addr_t size, phys_addr_t align);
9 8
10#endif 9#endif
diff --git a/arch/arm/include/asm/setup.h b/arch/arm/include/asm/setup.h
index 8d6a089dfb76..e0adb9f1bf94 100644
--- a/arch/arm/include/asm/setup.h
+++ b/arch/arm/include/asm/setup.h
@@ -21,34 +21,6 @@
21#define __tagtable(tag, fn) \ 21#define __tagtable(tag, fn) \
22static const struct tagtable __tagtable_##fn __tag = { tag, fn } 22static const struct tagtable __tagtable_##fn __tag = { tag, fn }
23 23
24/*
25 * Memory map description
26 */
27#define NR_BANKS CONFIG_ARM_NR_BANKS
28
29struct membank {
30 phys_addr_t start;
31 phys_addr_t size;
32 unsigned int highmem;
33};
34
35struct meminfo {
36 int nr_banks;
37 struct membank bank[NR_BANKS];
38};
39
40extern struct meminfo meminfo;
41
42#define for_each_bank(iter,mi) \
43 for (iter = 0; iter < (mi)->nr_banks; iter++)
44
45#define bank_pfn_start(bank) __phys_to_pfn((bank)->start)
46#define bank_pfn_end(bank) __phys_to_pfn((bank)->start + (bank)->size)
47#define bank_pfn_size(bank) ((bank)->size >> PAGE_SHIFT)
48#define bank_phys_start(bank) (bank)->start
49#define bank_phys_end(bank) ((bank)->start + (bank)->size)
50#define bank_phys_size(bank) (bank)->size
51
52extern int arm_add_memory(u64 start, u64 size); 24extern int arm_add_memory(u64 start, u64 size);
53extern void early_print(const char *str, ...); 25extern void early_print(const char *str, ...);
54extern void dump_machine_table(void); 26extern void dump_machine_table(void);
diff --git a/arch/arm/kernel/atags_parse.c b/arch/arm/kernel/atags_parse.c
index 8c14de8180c0..7807ef58a2ab 100644
--- a/arch/arm/kernel/atags_parse.c
+++ b/arch/arm/kernel/atags_parse.c
@@ -22,6 +22,7 @@
22#include <linux/fs.h> 22#include <linux/fs.h>
23#include <linux/root_dev.h> 23#include <linux/root_dev.h>
24#include <linux/screen_info.h> 24#include <linux/screen_info.h>
25#include <linux/memblock.h>
25 26
26#include <asm/setup.h> 27#include <asm/setup.h>
27#include <asm/system_info.h> 28#include <asm/system_info.h>
@@ -222,10 +223,10 @@ setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr)
222 } 223 }
223 224
224 if (mdesc->fixup) 225 if (mdesc->fixup)
225 mdesc->fixup(tags, &from, &meminfo); 226 mdesc->fixup(tags, &from);
226 227
227 if (tags->hdr.tag == ATAG_CORE) { 228 if (tags->hdr.tag == ATAG_CORE) {
228 if (meminfo.nr_banks != 0) 229 if (memblock_phys_mem_size())
229 squash_mem_tags(tags); 230 squash_mem_tags(tags);
230 save_atags(tags); 231 save_atags(tags);
231 parse_tags(tags); 232 parse_tags(tags);
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
index c7419a585ddc..679a83d470cc 100644
--- a/arch/arm/kernel/devtree.c
+++ b/arch/arm/kernel/devtree.c
@@ -27,11 +27,6 @@
27#include <asm/mach/arch.h> 27#include <asm/mach/arch.h>
28#include <asm/mach-types.h> 28#include <asm/mach-types.h>
29 29
30void __init early_init_dt_add_memory_arch(u64 base, u64 size)
31{
32 arm_add_memory(base, size);
33}
34
35void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) 30void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
36{ 31{
37 return memblock_virt_alloc(size, align); 32 return memblock_virt_alloc(size, align);
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 50e198c1e9c8..6d78ba47ea5b 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -628,15 +628,8 @@ void __init dump_machine_table(void)
628 628
629int __init arm_add_memory(u64 start, u64 size) 629int __init arm_add_memory(u64 start, u64 size)
630{ 630{
631 struct membank *bank = &meminfo.bank[meminfo.nr_banks];
632 u64 aligned_start; 631 u64 aligned_start;
633 632
634 if (meminfo.nr_banks >= NR_BANKS) {
635 pr_crit("NR_BANKS too low, ignoring memory at 0x%08llx\n",
636 (long long)start);
637 return -EINVAL;
638 }
639
640 /* 633 /*
641 * Ensure that start/size are aligned to a page boundary. 634 * Ensure that start/size are aligned to a page boundary.
642 * Size is appropriately rounded down, start is rounded up. 635 * Size is appropriately rounded down, start is rounded up.
@@ -677,17 +670,17 @@ int __init arm_add_memory(u64 start, u64 size)
677 aligned_start = PHYS_OFFSET; 670 aligned_start = PHYS_OFFSET;
678 } 671 }
679 672
680 bank->start = aligned_start; 673 start = aligned_start;
681 bank->size = size & ~(phys_addr_t)(PAGE_SIZE - 1); 674 size = size & ~(phys_addr_t)(PAGE_SIZE - 1);
682 675
683 /* 676 /*
684 * Check whether this memory region has non-zero size or 677 * Check whether this memory region has non-zero size or
685 * invalid node number. 678 * invalid node number.
686 */ 679 */
687 if (bank->size == 0) 680 if (size == 0)
688 return -EINVAL; 681 return -EINVAL;
689 682
690 meminfo.nr_banks++; 683 memblock_add(start, size);
691 return 0; 684 return 0;
692} 685}
693 686
@@ -695,6 +688,7 @@ int __init arm_add_memory(u64 start, u64 size)
695 * Pick out the memory size. We look for mem=size@start, 688 * Pick out the memory size. We look for mem=size@start,
696 * where start and size are "size[KkMm]" 689 * where start and size are "size[KkMm]"
697 */ 690 */
691
698static int __init early_mem(char *p) 692static int __init early_mem(char *p)
699{ 693{
700 static int usermem __initdata = 0; 694 static int usermem __initdata = 0;
@@ -709,7 +703,8 @@ static int __init early_mem(char *p)
709 */ 703 */
710 if (usermem == 0) { 704 if (usermem == 0) {
711 usermem = 1; 705 usermem = 1;
712 meminfo.nr_banks = 0; 706 memblock_remove(memblock_start_of_DRAM(),
707 memblock_end_of_DRAM() - memblock_start_of_DRAM());
713 } 708 }
714 709
715 start = PHYS_OFFSET; 710 start = PHYS_OFFSET;
@@ -854,13 +849,6 @@ static void __init reserve_crashkernel(void)
854static inline void reserve_crashkernel(void) {} 849static inline void reserve_crashkernel(void) {}
855#endif /* CONFIG_KEXEC */ 850#endif /* CONFIG_KEXEC */
856 851
857static int __init meminfo_cmp(const void *_a, const void *_b)
858{
859 const struct membank *a = _a, *b = _b;
860 long cmp = bank_pfn_start(a) - bank_pfn_start(b);
861 return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
862}
863
864void __init hyp_mode_check(void) 852void __init hyp_mode_check(void)
865{ 853{
866#ifdef CONFIG_ARM_VIRT_EXT 854#ifdef CONFIG_ARM_VIRT_EXT
@@ -903,12 +891,10 @@ void __init setup_arch(char **cmdline_p)
903 891
904 parse_early_param(); 892 parse_early_param();
905 893
906 sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL);
907
908 early_paging_init(mdesc, lookup_processor_type(read_cpuid_id())); 894 early_paging_init(mdesc, lookup_processor_type(read_cpuid_id()));
909 setup_dma_zone(mdesc); 895 setup_dma_zone(mdesc);
910 sanity_check_meminfo(); 896 sanity_check_meminfo();
911 arm_memblock_init(&meminfo, mdesc); 897 arm_memblock_init(mdesc);
912 898
913 paging_init(mdesc); 899 paging_init(mdesc);
914 request_standard_resources(mdesc); 900 request_standard_resources(mdesc);
diff --git a/arch/arm/mach-clps711x/board-clep7312.c b/arch/arm/mach-clps711x/board-clep7312.c
index 221b9de32dd6..94a7add88a3f 100644
--- a/arch/arm/mach-clps711x/board-clep7312.c
+++ b/arch/arm/mach-clps711x/board-clep7312.c
@@ -18,6 +18,7 @@
18#include <linux/init.h> 18#include <linux/init.h>
19#include <linux/types.h> 19#include <linux/types.h>
20#include <linux/string.h> 20#include <linux/string.h>
21#include <linux/memblock.h>
21 22
22#include <asm/setup.h> 23#include <asm/setup.h>
23#include <asm/mach-types.h> 24#include <asm/mach-types.h>
@@ -26,11 +27,9 @@
26#include "common.h" 27#include "common.h"
27 28
28static void __init 29static void __init
29fixup_clep7312(struct tag *tags, char **cmdline, struct meminfo *mi) 30fixup_clep7312(struct tag *tags, char **cmdline)
30{ 31{
31 mi->nr_banks=1; 32 memblock_add(0xc0000000, 0x01000000);
32 mi->bank[0].start = 0xc0000000;
33 mi->bank[0].size = 0x01000000;
34} 33}
35 34
36MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312") 35MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312")
diff --git a/arch/arm/mach-clps711x/board-edb7211.c b/arch/arm/mach-clps711x/board-edb7211.c
index 077609841f14..f9828f89972a 100644
--- a/arch/arm/mach-clps711x/board-edb7211.c
+++ b/arch/arm/mach-clps711x/board-edb7211.c
@@ -16,6 +16,7 @@
16#include <linux/interrupt.h> 16#include <linux/interrupt.h>
17#include <linux/backlight.h> 17#include <linux/backlight.h>
18#include <linux/platform_device.h> 18#include <linux/platform_device.h>
19#include <linux/memblock.h>
19 20
20#include <linux/mtd/physmap.h> 21#include <linux/mtd/physmap.h>
21#include <linux/mtd/partitions.h> 22#include <linux/mtd/partitions.h>
@@ -133,7 +134,7 @@ static void __init edb7211_reserve(void)
133} 134}
134 135
135static void __init 136static void __init
136fixup_edb7211(struct tag *tags, char **cmdline, struct meminfo *mi) 137fixup_edb7211(struct tag *tags, char **cmdline)
137{ 138{
138 /* 139 /*
139 * Bank start addresses are not present in the information 140 * Bank start addresses are not present in the information
@@ -143,11 +144,8 @@ fixup_edb7211(struct tag *tags, char **cmdline, struct meminfo *mi)
143 * Banks sizes _are_ present in the param block, but we're 144 * Banks sizes _are_ present in the param block, but we're
144 * not using that information yet. 145 * not using that information yet.
145 */ 146 */
146 mi->bank[0].start = 0xc0000000; 147 memblock_add(0xc0000000, SZ_8M);
147 mi->bank[0].size = SZ_8M; 148 memblock_add(0xc1000000, SZ_8M);
148 mi->bank[1].start = 0xc1000000;
149 mi->bank[1].size = SZ_8M;
150 mi->nr_banks = 2;
151} 149}
152 150
153static void __init edb7211_init(void) 151static void __init edb7211_init(void)
diff --git a/arch/arm/mach-clps711x/board-p720t.c b/arch/arm/mach-clps711x/board-p720t.c
index 67b733744ed7..0cf0e51e6546 100644
--- a/arch/arm/mach-clps711x/board-p720t.c
+++ b/arch/arm/mach-clps711x/board-p720t.c
@@ -295,7 +295,7 @@ static struct generic_bl_info p720t_lcd_backlight_pdata = {
295}; 295};
296 296
297static void __init 297static void __init
298fixup_p720t(struct tag *tag, char **cmdline, struct meminfo *mi) 298fixup_p720t(struct tag *tag, char **cmdline)
299{ 299{
300 /* 300 /*
301 * Our bootloader doesn't setup any tags (yet). 301 * Our bootloader doesn't setup any tags (yet).
diff --git a/arch/arm/mach-footbridge/cats-hw.c b/arch/arm/mach-footbridge/cats-hw.c
index da0415094856..8f05489671b7 100644
--- a/arch/arm/mach-footbridge/cats-hw.c
+++ b/arch/arm/mach-footbridge/cats-hw.c
@@ -76,7 +76,7 @@ __initcall(cats_hw_init);
76 * hard reboots fail on early boards. 76 * hard reboots fail on early boards.
77 */ 77 */
78static void __init 78static void __init
79fixup_cats(struct tag *tags, char **cmdline, struct meminfo *mi) 79fixup_cats(struct tag *tags, char **cmdline)
80{ 80{
81#if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE) 81#if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
82 screen_info.orig_video_lines = 25; 82 screen_info.orig_video_lines = 25;
diff --git a/arch/arm/mach-footbridge/netwinder-hw.c b/arch/arm/mach-footbridge/netwinder-hw.c
index eb1fa5c84723..cdee08c6d239 100644
--- a/arch/arm/mach-footbridge/netwinder-hw.c
+++ b/arch/arm/mach-footbridge/netwinder-hw.c
@@ -620,7 +620,7 @@ __initcall(nw_hw_init);
620 * the parameter page. 620 * the parameter page.
621 */ 621 */
622static void __init 622static void __init
623fixup_netwinder(struct tag *tags, char **cmdline, struct meminfo *mi) 623fixup_netwinder(struct tag *tags, char **cmdline)
624{ 624{
625#ifdef CONFIG_ISAPNP 625#ifdef CONFIG_ISAPNP
626 extern int isapnp_disable; 626 extern int isapnp_disable;
diff --git a/arch/arm/mach-msm/board-halibut.c b/arch/arm/mach-msm/board-halibut.c
index a77529887cbc..61bfe584a9d7 100644
--- a/arch/arm/mach-msm/board-halibut.c
+++ b/arch/arm/mach-msm/board-halibut.c
@@ -83,11 +83,6 @@ static void __init halibut_init(void)
83 platform_add_devices(devices, ARRAY_SIZE(devices)); 83 platform_add_devices(devices, ARRAY_SIZE(devices));
84} 84}
85 85
86static void __init halibut_fixup(struct tag *tags, char **cmdline,
87 struct meminfo *mi)
88{
89}
90
91static void __init halibut_map_io(void) 86static void __init halibut_map_io(void)
92{ 87{
93 msm_map_common_io(); 88 msm_map_common_io();
@@ -100,7 +95,6 @@ static void __init halibut_init_late(void)
100 95
101MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)") 96MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)")
102 .atag_offset = 0x100, 97 .atag_offset = 0x100,
103 .fixup = halibut_fixup,
104 .map_io = halibut_map_io, 98 .map_io = halibut_map_io,
105 .init_early = halibut_init_early, 99 .init_early = halibut_init_early,
106 .init_irq = halibut_init_irq, 100 .init_irq = halibut_init_irq,
diff --git a/arch/arm/mach-msm/board-mahimahi.c b/arch/arm/mach-msm/board-mahimahi.c
index 7d9981cb400e..873c3ca3cd7e 100644
--- a/arch/arm/mach-msm/board-mahimahi.c
+++ b/arch/arm/mach-msm/board-mahimahi.c
@@ -22,6 +22,7 @@
22#include <linux/io.h> 22#include <linux/io.h>
23#include <linux/kernel.h> 23#include <linux/kernel.h>
24#include <linux/platform_device.h> 24#include <linux/platform_device.h>
25#include <linux/memblock.h>
25 26
26#include <asm/mach-types.h> 27#include <asm/mach-types.h>
27#include <asm/mach/arch.h> 28#include <asm/mach/arch.h>
@@ -52,16 +53,10 @@ static void __init mahimahi_init(void)
52 platform_add_devices(devices, ARRAY_SIZE(devices)); 53 platform_add_devices(devices, ARRAY_SIZE(devices));
53} 54}
54 55
55static void __init mahimahi_fixup(struct tag *tags, char **cmdline, 56static void __init mahimahi_fixup(struct tag *tags, char **cmdline)
56 struct meminfo *mi)
57{ 57{
58 mi->nr_banks = 2; 58 memblock_add(PHYS_OFFSET, 219*SZ_1M);
59 mi->bank[0].start = PHYS_OFFSET; 59 memblock_add(MSM_HIGHMEM_BASE, MSM_HIGHMEM_SIZE);
60 mi->bank[0].node = PHYS_TO_NID(PHYS_OFFSET);
61 mi->bank[0].size = (219*1024*1024);
62 mi->bank[1].start = MSM_HIGHMEM_BASE;
63 mi->bank[1].node = PHYS_TO_NID(MSM_HIGHMEM_BASE);
64 mi->bank[1].size = MSM_HIGHMEM_SIZE;
65} 60}
66 61
67static void __init mahimahi_map_io(void) 62static void __init mahimahi_map_io(void)
diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c
index 46de789ad3ae..b621b23a5ecc 100644
--- a/arch/arm/mach-msm/board-msm7x30.c
+++ b/arch/arm/mach-msm/board-msm7x30.c
@@ -40,8 +40,7 @@
40#include "proc_comm.h" 40#include "proc_comm.h"
41#include "common.h" 41#include "common.h"
42 42
43static void __init msm7x30_fixup(struct tag *tag, char **cmdline, 43static void __init msm7x30_fixup(struct tag *tag, char **cmdline)
44 struct meminfo *mi)
45{ 44{
46 for (; tag->hdr.size; tag = tag_next(tag)) 45 for (; tag->hdr.size; tag = tag_next(tag))
47 if (tag->hdr.tag == ATAG_MEM && tag->u.mem.start == 0x200000) { 46 if (tag->hdr.tag == ATAG_MEM && tag->u.mem.start == 0x200000) {
diff --git a/arch/arm/mach-msm/board-sapphire.c b/arch/arm/mach-msm/board-sapphire.c
index 327605174d63..e50967926dcd 100644
--- a/arch/arm/mach-msm/board-sapphire.c
+++ b/arch/arm/mach-msm/board-sapphire.c
@@ -35,6 +35,7 @@
35 35
36#include <linux/mtd/nand.h> 36#include <linux/mtd/nand.h>
37#include <linux/mtd/partitions.h> 37#include <linux/mtd/partitions.h>
38#include <linux/memblock.h>
38 39
39#include "gpio_chip.h" 40#include "gpio_chip.h"
40#include "board-sapphire.h" 41#include "board-sapphire.h"
@@ -74,22 +75,18 @@ static struct map_desc sapphire_io_desc[] __initdata = {
74 } 75 }
75}; 76};
76 77
77static void __init sapphire_fixup(struct tag *tags, char **cmdline, 78static void __init sapphire_fixup(struct tag *tags, char **cmdline)
78 struct meminfo *mi)
79{ 79{
80 int smi_sz = parse_tag_smi((const struct tag *)tags); 80 int smi_sz = parse_tag_smi((const struct tag *)tags);
81 81
82 mi->nr_banks = 1;
83 mi->bank[0].start = PHYS_OFFSET;
84 mi->bank[0].node = PHYS_TO_NID(PHYS_OFFSET);
85 if (smi_sz == 32) { 82 if (smi_sz == 32) {
86 mi->bank[0].size = (84*1024*1024); 83 memblock_add(PHYS_OFFSET, 84*SZ_1M);
87 } else if (smi_sz == 64) { 84 } else if (smi_sz == 64) {
88 mi->bank[0].size = (101*1024*1024); 85 memblock_add(PHYS_OFFSET, 101*SZ_1M);
89 } else { 86 } else {
87 memblock_add(PHYS_OFFSET, 101*SZ_1M);
90 /* Give a default value when not get smi size */ 88 /* Give a default value when not get smi size */
91 smi_sz = 64; 89 smi_sz = 64;
92 mi->bank[0].size = (101*1024*1024);
93 } 90 }
94} 91}
95 92
diff --git a/arch/arm/mach-msm/board-trout.c b/arch/arm/mach-msm/board-trout.c
index 015d544aa017..58826cfab6b0 100644
--- a/arch/arm/mach-msm/board-trout.c
+++ b/arch/arm/mach-msm/board-trout.c
@@ -19,6 +19,7 @@
19#include <linux/init.h> 19#include <linux/init.h>
20#include <linux/platform_device.h> 20#include <linux/platform_device.h>
21#include <linux/clkdev.h> 21#include <linux/clkdev.h>
22#include <linux/memblock.h>
22 23
23#include <asm/system_info.h> 24#include <asm/system_info.h>
24#include <asm/mach-types.h> 25#include <asm/mach-types.h>
@@ -55,12 +56,9 @@ static void __init trout_init_irq(void)
55 msm_init_irq(); 56 msm_init_irq();
56} 57}
57 58
58static void __init trout_fixup(struct tag *tags, char **cmdline, 59static void __init trout_fixup(struct tag *tags, char **cmdline)
59 struct meminfo *mi)
60{ 60{
61 mi->nr_banks = 1; 61 memblock_add(PHYS_OFFSET, 101*SZ_1M);
62 mi->bank[0].start = PHYS_OFFSET;
63 mi->bank[0].size = (101*1024*1024);
64} 62}
65 63
66static void __init trout_init(void) 64static void __init trout_init(void)
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c
index 3f1de1111e0f..6bbb7b55c6d1 100644
--- a/arch/arm/mach-orion5x/common.c
+++ b/arch/arm/mach-orion5x/common.c
@@ -365,8 +365,7 @@ void orion5x_restart(enum reboot_mode mode, const char *cmd)
365 * Many orion-based systems have buggy bootloader implementations. 365 * Many orion-based systems have buggy bootloader implementations.
366 * This is a common fixup for bogus memory tags. 366 * This is a common fixup for bogus memory tags.
367 */ 367 */
368void __init tag_fixup_mem32(struct tag *t, char **from, 368void __init tag_fixup_mem32(struct tag *t, char **from)
369 struct meminfo *meminfo)
370{ 369{
371 for (; t->hdr.size; t = tag_next(t)) 370 for (; t->hdr.size; t = tag_next(t))
372 if (t->hdr.tag == ATAG_MEM && 371 if (t->hdr.tag == ATAG_MEM &&
diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h
index f565f9944af2..175ec4ca8df6 100644
--- a/arch/arm/mach-orion5x/common.h
+++ b/arch/arm/mach-orion5x/common.h
@@ -71,9 +71,8 @@ void edmini_v2_init(void);
71static inline void edmini_v2_init(void) {}; 71static inline void edmini_v2_init(void) {};
72#endif 72#endif
73 73
74struct meminfo;
75struct tag; 74struct tag;
76extern void __init tag_fixup_mem32(struct tag *, char **, struct meminfo *); 75extern void __init tag_fixup_mem32(struct tag *, char **);
77 76
78/***************************************************************************** 77/*****************************************************************************
79 * Helpers to access Orion registers 78 * Helpers to access Orion registers
diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c
index 584439bfa59f..4d3588d26c2a 100644
--- a/arch/arm/mach-pxa/cm-x300.c
+++ b/arch/arm/mach-pxa/cm-x300.c
@@ -837,8 +837,7 @@ static void __init cm_x300_init(void)
837 cm_x300_init_bl(); 837 cm_x300_init_bl();
838} 838}
839 839
840static void __init cm_x300_fixup(struct tag *tags, char **cmdline, 840static void __init cm_x300_fixup(struct tag *tags, char **cmdline)
841 struct meminfo *mi)
842{ 841{
843 /* Make sure that mi->bank[0].start = PHYS_ADDR */ 842 /* Make sure that mi->bank[0].start = PHYS_ADDR */
844 for (; tags->hdr.size; tags = tag_next(tags)) 843 for (; tags->hdr.size; tags = tag_next(tags))
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c
index 57d60542f982..91dd1c7cdbcd 100644
--- a/arch/arm/mach-pxa/corgi.c
+++ b/arch/arm/mach-pxa/corgi.c
@@ -34,6 +34,7 @@
34#include <linux/input/matrix_keypad.h> 34#include <linux/input/matrix_keypad.h>
35#include <linux/gpio_keys.h> 35#include <linux/gpio_keys.h>
36#include <linux/module.h> 36#include <linux/module.h>
37#include <linux/memblock.h>
37#include <video/w100fb.h> 38#include <video/w100fb.h>
38 39
39#include <asm/setup.h> 40#include <asm/setup.h>
@@ -753,16 +754,13 @@ static void __init corgi_init(void)
753 platform_add_devices(devices, ARRAY_SIZE(devices)); 754 platform_add_devices(devices, ARRAY_SIZE(devices));
754} 755}
755 756
756static void __init fixup_corgi(struct tag *tags, char **cmdline, 757static void __init fixup_corgi(struct tag *tags, char **cmdline)
757 struct meminfo *mi)
758{ 758{
759 sharpsl_save_param(); 759 sharpsl_save_param();
760 mi->nr_banks=1;
761 mi->bank[0].start = 0xa0000000;
762 if (machine_is_corgi()) 760 if (machine_is_corgi())
763 mi->bank[0].size = (32*1024*1024); 761 memblock_add(0xa0000000, SZ_32M);
764 else 762 else
765 mi->bank[0].size = (64*1024*1024); 763 memblock_add(0xa0000000, SZ_64M);
766} 764}
767 765
768#ifdef CONFIG_MACH_CORGI 766#ifdef CONFIG_MACH_CORGI
diff --git a/arch/arm/mach-pxa/eseries.c b/arch/arm/mach-pxa/eseries.c
index 8280ebcaab9f..cfb864173ce3 100644
--- a/arch/arm/mach-pxa/eseries.c
+++ b/arch/arm/mach-pxa/eseries.c
@@ -21,6 +21,7 @@
21#include <linux/mtd/nand.h> 21#include <linux/mtd/nand.h>
22#include <linux/mtd/partitions.h> 22#include <linux/mtd/partitions.h>
23#include <linux/usb/gpio_vbus.h> 23#include <linux/usb/gpio_vbus.h>
24#include <linux/memblock.h>
24 25
25#include <video/w100fb.h> 26#include <video/w100fb.h>
26 27
@@ -41,14 +42,12 @@
41#include "clock.h" 42#include "clock.h"
42 43
43/* Only e800 has 128MB RAM */ 44/* Only e800 has 128MB RAM */
44void __init eseries_fixup(struct tag *tags, char **cmdline, struct meminfo *mi) 45void __init eseries_fixup(struct tag *tags, char **cmdline)
45{ 46{
46 mi->nr_banks=1;
47 mi->bank[0].start = 0xa0000000;
48 if (machine_is_e800()) 47 if (machine_is_e800())
49 mi->bank[0].size = (128*1024*1024); 48 memblock_add(0xa0000000, SZ_128M);
50 else 49 else
51 mi->bank[0].size = (64*1024*1024); 50 memblock_add(0xa0000000, SZ_64M);
52} 51}
53 52
54struct gpio_vbus_mach_info e7xx_udc_info = { 53struct gpio_vbus_mach_info e7xx_udc_info = {
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c
index aedf053a1de5..131991629116 100644
--- a/arch/arm/mach-pxa/poodle.c
+++ b/arch/arm/mach-pxa/poodle.c
@@ -29,6 +29,7 @@
29#include <linux/spi/ads7846.h> 29#include <linux/spi/ads7846.h>
30#include <linux/spi/pxa2xx_spi.h> 30#include <linux/spi/pxa2xx_spi.h>
31#include <linux/mtd/sharpsl.h> 31#include <linux/mtd/sharpsl.h>
32#include <linux/memblock.h>
32 33
33#include <mach/hardware.h> 34#include <mach/hardware.h>
34#include <asm/mach-types.h> 35#include <asm/mach-types.h>
@@ -456,13 +457,10 @@ static void __init poodle_init(void)
456 poodle_init_spi(); 457 poodle_init_spi();
457} 458}
458 459
459static void __init fixup_poodle(struct tag *tags, char **cmdline, 460static void __init fixup_poodle(struct tag *tags, char **cmdline)
460 struct meminfo *mi)
461{ 461{
462 sharpsl_save_param(); 462 sharpsl_save_param();
463 mi->nr_banks=1; 463 memblock_add(0xa0000000, SZ_32M);
464 mi->bank[0].start = 0xa0000000;
465 mi->bank[0].size = (32*1024*1024);
466} 464}
467 465
468MACHINE_START(POODLE, "SHARP Poodle") 466MACHINE_START(POODLE, "SHARP Poodle")
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
index 0b11c1af51c4..840c3a48e720 100644
--- a/arch/arm/mach-pxa/spitz.c
+++ b/arch/arm/mach-pxa/spitz.c
@@ -32,6 +32,7 @@
32#include <linux/io.h> 32#include <linux/io.h>
33#include <linux/module.h> 33#include <linux/module.h>
34#include <linux/reboot.h> 34#include <linux/reboot.h>
35#include <linux/memblock.h>
35 36
36#include <asm/setup.h> 37#include <asm/setup.h>
37#include <asm/mach-types.h> 38#include <asm/mach-types.h>
@@ -971,13 +972,10 @@ static void __init spitz_init(void)
971 spitz_i2c_init(); 972 spitz_i2c_init();
972} 973}
973 974
974static void __init spitz_fixup(struct tag *tags, char **cmdline, 975static void __init spitz_fixup(struct tag *tags, char **cmdline)
975 struct meminfo *mi)
976{ 976{
977 sharpsl_save_param(); 977 sharpsl_save_param();
978 mi->nr_banks = 1; 978 memblock_add(0xa0000000, SZ_64M);
979 mi->bank[0].start = 0xa0000000;
980 mi->bank[0].size = (64*1024*1024);
981} 979}
982 980
983#ifdef CONFIG_MACH_SPITZ 981#ifdef CONFIG_MACH_SPITZ
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c
index ef5557b807ed..c158a6e3e0aa 100644
--- a/arch/arm/mach-pxa/tosa.c
+++ b/arch/arm/mach-pxa/tosa.c
@@ -37,6 +37,7 @@
37#include <linux/i2c/pxa-i2c.h> 37#include <linux/i2c/pxa-i2c.h>
38#include <linux/usb/gpio_vbus.h> 38#include <linux/usb/gpio_vbus.h>
39#include <linux/reboot.h> 39#include <linux/reboot.h>
40#include <linux/memblock.h>
40 41
41#include <asm/setup.h> 42#include <asm/setup.h>
42#include <asm/mach-types.h> 43#include <asm/mach-types.h>
@@ -960,13 +961,10 @@ static void __init tosa_init(void)
960 platform_add_devices(devices, ARRAY_SIZE(devices)); 961 platform_add_devices(devices, ARRAY_SIZE(devices));
961} 962}
962 963
963static void __init fixup_tosa(struct tag *tags, char **cmdline, 964static void __init fixup_tosa(struct tag *tags, char **cmdline)
964 struct meminfo *mi)
965{ 965{
966 sharpsl_save_param(); 966 sharpsl_save_param();
967 mi->nr_banks=1; 967 memblock_add(0xa0000000, SZ_64M);
968 mi->bank[0].start = 0xa0000000;
969 mi->bank[0].size = (64*1024*1024);
970} 968}
971 969
972MACHINE_START(TOSA, "SHARP Tosa") 970MACHINE_START(TOSA, "SHARP Tosa")
diff --git a/arch/arm/mach-realview/core.c b/arch/arm/mach-realview/core.c
index 1d5ee5c9a1dc..c2fae3a5aad8 100644
--- a/arch/arm/mach-realview/core.c
+++ b/arch/arm/mach-realview/core.c
@@ -31,6 +31,7 @@
31#include <linux/amba/mmci.h> 31#include <linux/amba/mmci.h>
32#include <linux/gfp.h> 32#include <linux/gfp.h>
33#include <linux/mtd/physmap.h> 33#include <linux/mtd/physmap.h>
34#include <linux/memblock.h>
34 35
35#include <mach/hardware.h> 36#include <mach/hardware.h>
36#include <asm/irq.h> 37#include <asm/irq.h>
@@ -370,19 +371,15 @@ void __init realview_timer_init(unsigned int timer_irq)
370/* 371/*
371 * Setup the memory banks. 372 * Setup the memory banks.
372 */ 373 */
373void realview_fixup(struct tag *tags, char **from, struct meminfo *meminfo) 374void realview_fixup(struct tag *tags, char **from)
374{ 375{
375 /* 376 /*
376 * Most RealView platforms have 512MB contiguous RAM at 0x70000000. 377 * Most RealView platforms have 512MB contiguous RAM at 0x70000000.
377 * Half of this is mirrored at 0. 378 * Half of this is mirrored at 0.
378 */ 379 */
379#ifdef CONFIG_REALVIEW_HIGH_PHYS_OFFSET 380#ifdef CONFIG_REALVIEW_HIGH_PHYS_OFFSET
380 meminfo->bank[0].start = 0x70000000; 381 memblock_add(0x70000000, SZ_512M);
381 meminfo->bank[0].size = SZ_512M;
382 meminfo->nr_banks = 1;
383#else 382#else
384 meminfo->bank[0].start = 0; 383 memblock_add(0, SZ_256M);
385 meminfo->bank[0].size = SZ_256M;
386 meminfo->nr_banks = 1;
387#endif 384#endif
388} 385}
diff --git a/arch/arm/mach-realview/core.h b/arch/arm/mach-realview/core.h
index 602ca5ec52c5..844946da3c66 100644
--- a/arch/arm/mach-realview/core.h
+++ b/arch/arm/mach-realview/core.h
@@ -51,8 +51,7 @@ extern int realview_flash_register(struct resource *res, u32 num);
51extern int realview_eth_register(const char *name, struct resource *res); 51extern int realview_eth_register(const char *name, struct resource *res);
52extern int realview_usb_register(struct resource *res); 52extern int realview_usb_register(struct resource *res);
53extern void realview_init_early(void); 53extern void realview_init_early(void);
54extern void realview_fixup(struct tag *tags, char **from, 54extern void realview_fixup(struct tag *tags, char **from);
55 struct meminfo *meminfo);
56 55
57extern struct smp_operations realview_smp_ops; 56extern struct smp_operations realview_smp_ops;
58extern void realview_cpu_die(unsigned int cpu); 57extern void realview_cpu_die(unsigned int cpu);
diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c
index c5eade76461b..6abf6a037b9e 100644
--- a/arch/arm/mach-realview/realview_pb1176.c
+++ b/arch/arm/mach-realview/realview_pb1176.c
@@ -32,6 +32,7 @@
32#include <linux/irqchip/arm-gic.h> 32#include <linux/irqchip/arm-gic.h>
33#include <linux/platform_data/clk-realview.h> 33#include <linux/platform_data/clk-realview.h>
34#include <linux/reboot.h> 34#include <linux/reboot.h>
35#include <linux/memblock.h>
35 36
36#include <mach/hardware.h> 37#include <mach/hardware.h>
37#include <asm/irq.h> 38#include <asm/irq.h>
@@ -339,15 +340,12 @@ static void realview_pb1176_restart(enum reboot_mode mode, const char *cmd)
339 dsb(); 340 dsb();
340} 341}
341 342
342static void realview_pb1176_fixup(struct tag *tags, char **from, 343static void realview_pb1176_fixup(struct tag *tags, char **from)
343 struct meminfo *meminfo)
344{ 344{
345 /* 345 /*
346 * RealView PB1176 only has 128MB of RAM mapped at 0. 346 * RealView PB1176 only has 128MB of RAM mapped at 0.
347 */ 347 */
348 meminfo->bank[0].start = 0; 348 memblock_add(0, SZ_128M);
349 meminfo->bank[0].size = SZ_128M;
350 meminfo->nr_banks = 1;
351} 349}
352 350
353static void __init realview_pb1176_init(void) 351static void __init realview_pb1176_init(void)
diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c
index 9d75493e3f0c..60d322ad9db4 100644
--- a/arch/arm/mach-realview/realview_pbx.c
+++ b/arch/arm/mach-realview/realview_pbx.c
@@ -29,6 +29,7 @@
29#include <linux/irqchip/arm-gic.h> 29#include <linux/irqchip/arm-gic.h>
30#include <linux/platform_data/clk-realview.h> 30#include <linux/platform_data/clk-realview.h>
31#include <linux/reboot.h> 31#include <linux/reboot.h>
32#include <linux/memblock.h>
32 33
33#include <asm/irq.h> 34#include <asm/irq.h>
34#include <asm/mach-types.h> 35#include <asm/mach-types.h>
@@ -325,23 +326,19 @@ static void __init realview_pbx_timer_init(void)
325 realview_pbx_twd_init(); 326 realview_pbx_twd_init();
326} 327}
327 328
328static void realview_pbx_fixup(struct tag *tags, char **from, 329static void realview_pbx_fixup(struct tag *tags, char **from)
329 struct meminfo *meminfo)
330{ 330{
331#ifdef CONFIG_SPARSEMEM 331#ifdef CONFIG_SPARSEMEM
332 /* 332 /*
333 * Memory configuration with SPARSEMEM enabled on RealView PBX (see 333 * Memory configuration with SPARSEMEM enabled on RealView PBX (see
334 * asm/mach/memory.h for more information). 334 * asm/mach/memory.h for more information).
335 */ 335 */
336 meminfo->bank[0].start = 0; 336
337 meminfo->bank[0].size = SZ_256M; 337 memblock_add(0, SZ_256M);
338 meminfo->bank[1].start = 0x20000000; 338 memblock_add(0x20000000, SZ_512M);
339 meminfo->bank[1].size = SZ_512M; 339 memblock_add(0x80000000, SZ_256M);
340 meminfo->bank[2].start = 0x80000000;
341 meminfo->bank[2].size = SZ_256M;
342 meminfo->nr_banks = 3;
343#else 340#else
344 realview_fixup(tags, from, meminfo); 341 realview_fixup(tags, from);
345#endif 342#endif
346} 343}
347 344
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2413.c b/arch/arm/mach-s3c24xx/mach-smdk2413.c
index 233fe52d2015..a03c855ee854 100644
--- a/arch/arm/mach-s3c24xx/mach-smdk2413.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2413.c
@@ -22,6 +22,7 @@
22#include <linux/serial_s3c.h> 22#include <linux/serial_s3c.h>
23#include <linux/platform_device.h> 23#include <linux/platform_device.h>
24#include <linux/io.h> 24#include <linux/io.h>
25#include <linux/memblock.h>
25 26
26#include <asm/mach/arch.h> 27#include <asm/mach/arch.h>
27#include <asm/mach/map.h> 28#include <asm/mach/map.h>
@@ -93,13 +94,10 @@ static struct platform_device *smdk2413_devices[] __initdata = {
93 &s3c2412_device_dma, 94 &s3c2412_device_dma,
94}; 95};
95 96
96static void __init smdk2413_fixup(struct tag *tags, char **cmdline, 97static void __init smdk2413_fixup(struct tag *tags, char **cmdline)
97 struct meminfo *mi)
98{ 98{
99 if (tags != phys_to_virt(S3C2410_SDRAM_PA + 0x100)) { 99 if (tags != phys_to_virt(S3C2410_SDRAM_PA + 0x100)) {
100 mi->nr_banks=1; 100 memblock_add(0x30000000, SZ_64M);
101 mi->bank[0].start = 0x30000000;
102 mi->bank[0].size = SZ_64M;
103 } 101 }
104} 102}
105 103
diff --git a/arch/arm/mach-s3c24xx/mach-vstms.c b/arch/arm/mach-s3c24xx/mach-vstms.c
index 40868c0e0a68..a79af7843aed 100644
--- a/arch/arm/mach-s3c24xx/mach-vstms.c
+++ b/arch/arm/mach-s3c24xx/mach-vstms.c
@@ -23,6 +23,7 @@
23#include <linux/mtd/nand.h> 23#include <linux/mtd/nand.h>
24#include <linux/mtd/nand_ecc.h> 24#include <linux/mtd/nand_ecc.h>
25#include <linux/mtd/partitions.h> 25#include <linux/mtd/partitions.h>
26#include <linux/memblock.h>
26 27
27#include <asm/mach/arch.h> 28#include <asm/mach/arch.h>
28#include <asm/mach/map.h> 29#include <asm/mach/map.h>
@@ -129,13 +130,10 @@ static struct platform_device *vstms_devices[] __initdata = {
129 &s3c2412_device_dma, 130 &s3c2412_device_dma,
130}; 131};
131 132
132static void __init vstms_fixup(struct tag *tags, char **cmdline, 133static void __init vstms_fixup(struct tag *tags, char **cmdline)
133 struct meminfo *mi)
134{ 134{
135 if (tags != phys_to_virt(S3C2410_SDRAM_PA + 0x100)) { 135 if (tags != phys_to_virt(S3C2410_SDRAM_PA + 0x100)) {
136 mi->nr_banks=1; 136 memblock_add(0x30000000, SZ_64M);
137 mi->bank[0].start = 0x30000000;
138 mi->bank[0].size = SZ_64M;
139 } 137 }
140} 138}
141 139
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c
index 8443a27bca2f..7dd894ece9ae 100644
--- a/arch/arm/mach-sa1100/assabet.c
+++ b/arch/arm/mach-sa1100/assabet.c
@@ -531,7 +531,7 @@ static void __init get_assabet_scr(void)
531} 531}
532 532
533static void __init 533static void __init
534fixup_assabet(struct tag *tags, char **cmdline, struct meminfo *mi) 534fixup_assabet(struct tag *tags, char **cmdline)
535{ 535{
536 /* This must be done before any call to machine_has_neponset() */ 536 /* This must be done before any call to machine_has_neponset() */
537 map_sa1100_gpio_regs(); 537 map_sa1100_gpio_regs();
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 2a77ba8796ae..c8ab21dc2178 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -81,24 +81,21 @@ __tagtable(ATAG_INITRD2, parse_tag_initrd2);
81 * initialization functions, as well as show_mem() for the skipping 81 * initialization functions, as well as show_mem() for the skipping
82 * of holes in the memory map. It is populated by arm_add_memory(). 82 * of holes in the memory map. It is populated by arm_add_memory().
83 */ 83 */
84struct meminfo meminfo;
85
86void show_mem(unsigned int filter) 84void show_mem(unsigned int filter)
87{ 85{
88 int free = 0, total = 0, reserved = 0; 86 int free = 0, total = 0, reserved = 0;
89 int shared = 0, cached = 0, slab = 0, i; 87 int shared = 0, cached = 0, slab = 0;
90 struct meminfo * mi = &meminfo; 88 struct memblock_region *reg;
91 89
92 printk("Mem-info:\n"); 90 printk("Mem-info:\n");
93 show_free_areas(filter); 91 show_free_areas(filter);
94 92
95 for_each_bank (i, mi) { 93 for_each_memblock (memory, reg) {
96 struct membank *bank = &mi->bank[i];
97 unsigned int pfn1, pfn2; 94 unsigned int pfn1, pfn2;
98 struct page *page, *end; 95 struct page *page, *end;
99 96
100 pfn1 = bank_pfn_start(bank); 97 pfn1 = memblock_region_memory_base_pfn(reg);
101 pfn2 = bank_pfn_end(bank); 98 pfn2 = memblock_region_memory_end_pfn(reg);
102 99
103 page = pfn_to_page(pfn1); 100 page = pfn_to_page(pfn1);
104 end = pfn_to_page(pfn2 - 1) + 1; 101 end = pfn_to_page(pfn2 - 1) + 1;
@@ -115,8 +112,9 @@ void show_mem(unsigned int filter)
115 free++; 112 free++;
116 else 113 else
117 shared += page_count(page) - 1; 114 shared += page_count(page) - 1;
118 page++; 115 pfn1++;
119 } while (page < end); 116 page = pfn_to_page(pfn1);
117 } while (pfn1 < pfn2);
120 } 118 }
121 119
122 printk("%d pages of RAM\n", total); 120 printk("%d pages of RAM\n", total);
@@ -130,16 +128,9 @@ void show_mem(unsigned int filter)
130static void __init find_limits(unsigned long *min, unsigned long *max_low, 128static void __init find_limits(unsigned long *min, unsigned long *max_low,
131 unsigned long *max_high) 129 unsigned long *max_high)
132{ 130{
133 struct meminfo *mi = &meminfo; 131 *max_low = PFN_DOWN(memblock_get_current_limit());
134 int i; 132 *min = PFN_UP(memblock_start_of_DRAM());
135 133 *max_high = PFN_DOWN(memblock_end_of_DRAM());
136 /* This assumes the meminfo array is properly sorted */
137 *min = bank_pfn_start(&mi->bank[0]);
138 for_each_bank (i, mi)
139 if (mi->bank[i].highmem)
140 break;
141 *max_low = bank_pfn_end(&mi->bank[i - 1]);
142 *max_high = bank_pfn_end(&mi->bank[mi->nr_banks - 1]);
143} 134}
144 135
145#ifdef CONFIG_ZONE_DMA 136#ifdef CONFIG_ZONE_DMA
@@ -274,14 +265,8 @@ phys_addr_t __init arm_memblock_steal(phys_addr_t size, phys_addr_t align)
274 return phys; 265 return phys;
275} 266}
276 267
277void __init arm_memblock_init(struct meminfo *mi, 268void __init arm_memblock_init(const struct machine_desc *mdesc)
278 const struct machine_desc *mdesc)
279{ 269{
280 int i;
281
282 for (i = 0; i < mi->nr_banks; i++)
283 memblock_add(mi->bank[i].start, mi->bank[i].size);
284
285 /* Register the kernel text, kernel data and initrd with memblock. */ 270 /* Register the kernel text, kernel data and initrd with memblock. */
286#ifdef CONFIG_XIP_KERNEL 271#ifdef CONFIG_XIP_KERNEL
287 memblock_reserve(__pa(_sdata), _end - _sdata); 272 memblock_reserve(__pa(_sdata), _end - _sdata);
@@ -413,54 +398,53 @@ free_memmap(unsigned long start_pfn, unsigned long end_pfn)
413/* 398/*
414 * The mem_map array can get very big. Free the unused area of the memory map. 399 * The mem_map array can get very big. Free the unused area of the memory map.
415 */ 400 */
416static void __init free_unused_memmap(struct meminfo *mi) 401static void __init free_unused_memmap(void)
417{ 402{
418 unsigned long bank_start, prev_bank_end = 0; 403 unsigned long start, prev_end = 0;
419 unsigned int i; 404 struct memblock_region *reg;
420 405
421 /* 406 /*
422 * This relies on each bank being in address order. 407 * This relies on each bank being in address order.
423 * The banks are sorted previously in bootmem_init(). 408 * The banks are sorted previously in bootmem_init().
424 */ 409 */
425 for_each_bank(i, mi) { 410 for_each_memblock(memory, reg) {
426 struct membank *bank = &mi->bank[i]; 411 start = memblock_region_memory_base_pfn(reg);
427
428 bank_start = bank_pfn_start(bank);
429 412
430#ifdef CONFIG_SPARSEMEM 413#ifdef CONFIG_SPARSEMEM
431 /* 414 /*
432 * Take care not to free memmap entries that don't exist 415 * Take care not to free memmap entries that don't exist
433 * due to SPARSEMEM sections which aren't present. 416 * due to SPARSEMEM sections which aren't present.
434 */ 417 */
435 bank_start = min(bank_start, 418 start = min(start,
436 ALIGN(prev_bank_end, PAGES_PER_SECTION)); 419 ALIGN(prev_end, PAGES_PER_SECTION));
437#else 420#else
438 /* 421 /*
439 * Align down here since the VM subsystem insists that the 422 * Align down here since the VM subsystem insists that the
440 * memmap entries are valid from the bank start aligned to 423 * memmap entries are valid from the bank start aligned to
441 * MAX_ORDER_NR_PAGES. 424 * MAX_ORDER_NR_PAGES.
442 */ 425 */
443 bank_start = round_down(bank_start, MAX_ORDER_NR_PAGES); 426 start = round_down(start, MAX_ORDER_NR_PAGES);
444#endif 427#endif
445 /* 428 /*
446 * If we had a previous bank, and there is a space 429 * If we had a previous bank, and there is a space
447 * between the current bank and the previous, free it. 430 * between the current bank and the previous, free it.
448 */ 431 */
449 if (prev_bank_end && prev_bank_end < bank_start) 432 if (prev_end && prev_end < start)
450 free_memmap(prev_bank_end, bank_start); 433 free_memmap(prev_end, start);
451 434
452 /* 435 /*
453 * Align up here since the VM subsystem insists that the 436 * Align up here since the VM subsystem insists that the
454 * memmap entries are valid from the bank end aligned to 437 * memmap entries are valid from the bank end aligned to
455 * MAX_ORDER_NR_PAGES. 438 * MAX_ORDER_NR_PAGES.
456 */ 439 */
457 prev_bank_end = ALIGN(bank_pfn_end(bank), MAX_ORDER_NR_PAGES); 440 prev_end = ALIGN(memblock_region_memory_end_pfn(reg),
441 MAX_ORDER_NR_PAGES);
458 } 442 }
459 443
460#ifdef CONFIG_SPARSEMEM 444#ifdef CONFIG_SPARSEMEM
461 if (!IS_ALIGNED(prev_bank_end, PAGES_PER_SECTION)) 445 if (!IS_ALIGNED(prev_end, PAGES_PER_SECTION))
462 free_memmap(prev_bank_end, 446 free_memmap(prev_end,
463 ALIGN(prev_bank_end, PAGES_PER_SECTION)); 447 ALIGN(prev_end, PAGES_PER_SECTION));
464#endif 448#endif
465} 449}
466 450
@@ -536,7 +520,7 @@ void __init mem_init(void)
536 set_max_mapnr(pfn_to_page(max_pfn) - mem_map); 520 set_max_mapnr(pfn_to_page(max_pfn) - mem_map);
537 521
538 /* this will put all unused low memory onto the freelists */ 522 /* this will put all unused low memory onto the freelists */
539 free_unused_memmap(&meminfo); 523 free_unused_memmap();
540 free_all_bootmem(); 524 free_all_bootmem();
541 525
542#ifdef CONFIG_SA1111 526#ifdef CONFIG_SA1111
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index a991ce2f18d4..82ea2b3fb9b5 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -1062,74 +1062,47 @@ phys_addr_t arm_lowmem_limit __initdata = 0;
1062void __init sanity_check_meminfo(void) 1062void __init sanity_check_meminfo(void)
1063{ 1063{
1064 phys_addr_t memblock_limit = 0; 1064 phys_addr_t memblock_limit = 0;
1065 int i, j, highmem = 0; 1065 int highmem = 0;
1066 phys_addr_t vmalloc_limit = __pa(vmalloc_min - 1) + 1; 1066 phys_addr_t vmalloc_limit = __pa(vmalloc_min - 1) + 1;
1067 struct memblock_region *reg;
1067 1068
1068 for (i = 0, j = 0; i < meminfo.nr_banks; i++) { 1069 for_each_memblock(memory, reg) {
1069 struct membank *bank = &meminfo.bank[j]; 1070 phys_addr_t block_start = reg->base;
1070 phys_addr_t size_limit; 1071 phys_addr_t block_end = reg->base + reg->size;
1071 1072 phys_addr_t size_limit = reg->size;
1072 *bank = meminfo.bank[i];
1073 size_limit = bank->size;
1074 1073
1075 if (bank->start >= vmalloc_limit) 1074 if (reg->base >= vmalloc_limit)
1076 highmem = 1; 1075 highmem = 1;
1077 else 1076 else
1078 size_limit = vmalloc_limit - bank->start; 1077 size_limit = vmalloc_limit - reg->base;
1079 1078
1080 bank->highmem = highmem;
1081 1079
1082#ifdef CONFIG_HIGHMEM 1080 if (!IS_ENABLED(CONFIG_HIGHMEM) || cache_is_vipt_aliasing()) {
1083 /* 1081
1084 * Split those memory banks which are partially overlapping 1082 if (highmem) {
1085 * the vmalloc area greatly simplifying things later. 1083 pr_notice("Ignoring RAM at %pa-%pa (!CONFIG_HIGHMEM)\n",
1086 */ 1084 &block_start, &block_end);
1087 if (!highmem && bank->size > size_limit) { 1085 memblock_remove(reg->base, reg->size);
1088 if (meminfo.nr_banks >= NR_BANKS) { 1086 continue;
1089 printk(KERN_CRIT "NR_BANKS too low, "
1090 "ignoring high memory\n");
1091 } else {
1092 memmove(bank + 1, bank,
1093 (meminfo.nr_banks - i) * sizeof(*bank));
1094 meminfo.nr_banks++;
1095 i++;
1096 bank[1].size -= size_limit;
1097 bank[1].start = vmalloc_limit;
1098 bank[1].highmem = highmem = 1;
1099 j++;
1100 } 1087 }
1101 bank->size = size_limit;
1102 }
1103#else
1104 /*
1105 * Highmem banks not allowed with !CONFIG_HIGHMEM.
1106 */
1107 if (highmem) {
1108 printk(KERN_NOTICE "Ignoring RAM at %.8llx-%.8llx "
1109 "(!CONFIG_HIGHMEM).\n",
1110 (unsigned long long)bank->start,
1111 (unsigned long long)bank->start + bank->size - 1);
1112 continue;
1113 }
1114 1088
1115 /* 1089 if (reg->size > size_limit) {
1116 * Check whether this memory bank would partially overlap 1090 phys_addr_t overlap_size = reg->size - size_limit;
1117 * the vmalloc area. 1091
1118 */ 1092 pr_notice("Truncating RAM at %pa-%pa to -%pa",
1119 if (bank->size > size_limit) { 1093 &block_start, &block_end, &vmalloc_limit);
1120 printk(KERN_NOTICE "Truncating RAM at %.8llx-%.8llx " 1094 memblock_remove(vmalloc_limit, overlap_size);
1121 "to -%.8llx (vmalloc region overlap).\n", 1095 block_end = vmalloc_limit;
1122 (unsigned long long)bank->start, 1096 }
1123 (unsigned long long)bank->start + bank->size - 1,
1124 (unsigned long long)bank->start + size_limit - 1);
1125 bank->size = size_limit;
1126 } 1097 }
1127#endif
1128 if (!bank->highmem) {
1129 phys_addr_t bank_end = bank->start + bank->size;
1130 1098
1131 if (bank_end > arm_lowmem_limit) 1099 if (!highmem) {
1132 arm_lowmem_limit = bank_end; 1100 if (block_end > arm_lowmem_limit) {
1101 if (reg->size > size_limit)
1102 arm_lowmem_limit = vmalloc_limit;
1103 else
1104 arm_lowmem_limit = block_end;
1105 }
1133 1106
1134 /* 1107 /*
1135 * Find the first non-section-aligned page, and point 1108 * Find the first non-section-aligned page, and point
@@ -1145,35 +1118,15 @@ void __init sanity_check_meminfo(void)
1145 * occurs before any free memory is mapped. 1118 * occurs before any free memory is mapped.
1146 */ 1119 */
1147 if (!memblock_limit) { 1120 if (!memblock_limit) {
1148 if (!IS_ALIGNED(bank->start, SECTION_SIZE)) 1121 if (!IS_ALIGNED(block_start, SECTION_SIZE))
1149 memblock_limit = bank->start; 1122 memblock_limit = block_start;
1150 else if (!IS_ALIGNED(bank_end, SECTION_SIZE)) 1123 else if (!IS_ALIGNED(block_end, SECTION_SIZE))
1151 memblock_limit = bank_end; 1124 memblock_limit = arm_lowmem_limit;
1152 } 1125 }
1153 }
1154 j++;
1155 }
1156#ifdef CONFIG_HIGHMEM
1157 if (highmem) {
1158 const char *reason = NULL;
1159 1126
1160 if (cache_is_vipt_aliasing()) {
1161 /*
1162 * Interactions between kmap and other mappings
1163 * make highmem support with aliasing VIPT caches
1164 * rather difficult.
1165 */
1166 reason = "with VIPT aliasing cache";
1167 }
1168 if (reason) {
1169 printk(KERN_CRIT "HIGHMEM is not supported %s, ignoring high memory\n",
1170 reason);
1171 while (j > 0 && meminfo.bank[j - 1].highmem)
1172 j--;
1173 } 1127 }
1174 } 1128 }
1175#endif 1129
1176 meminfo.nr_banks = j;
1177 high_memory = __va(arm_lowmem_limit - 1) + 1; 1130 high_memory = __va(arm_lowmem_limit - 1) + 1;
1178 1131
1179 /* 1132 /*
diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c
index 55764a7ef1f0..da1874f9f8cf 100644
--- a/arch/arm/mm/nommu.c
+++ b/arch/arm/mm/nommu.c
@@ -88,30 +88,35 @@ static unsigned long irbar_read(void)
88void __init sanity_check_meminfo_mpu(void) 88void __init sanity_check_meminfo_mpu(void)
89{ 89{
90 int i; 90 int i;
91 struct membank *bank = meminfo.bank;
92 phys_addr_t phys_offset = PHYS_OFFSET; 91 phys_addr_t phys_offset = PHYS_OFFSET;
93 phys_addr_t aligned_region_size, specified_mem_size, rounded_mem_size; 92 phys_addr_t aligned_region_size, specified_mem_size, rounded_mem_size;
94 93 struct memblock_region *reg;
95 /* Initially only use memory continuous from PHYS_OFFSET */ 94 bool first = true;
96 if (bank_phys_start(&bank[0]) != phys_offset) 95 phys_addr_t mem_start;
97 panic("First memory bank must be contiguous from PHYS_OFFSET"); 96 phys_addr_t mem_end;
98 97
99 /* Banks have already been sorted by start address */ 98 for_each_memblock(memory, reg) {
100 for (i = 1; i < meminfo.nr_banks; i++) { 99 if (first) {
101 if (bank[i].start <= bank_phys_end(&bank[0]) && 100 /*
102 bank_phys_end(&bank[i]) > bank_phys_end(&bank[0])) { 101 * Initially only use memory continuous from
103 bank[0].size = bank_phys_end(&bank[i]) - bank[0].start; 102 * PHYS_OFFSET */
103 if (reg->base != phys_offset)
104 panic("First memory bank must be contiguous from PHYS_OFFSET");
105
106 mem_start = reg->base;
107 mem_end = reg->base + reg->size;
108 specified_mem_size = reg->size;
109 first = false;
104 } else { 110 } else {
105 pr_notice("Ignoring RAM after 0x%.8lx. " 111 /*
106 "First non-contiguous (ignored) bank start: 0x%.8lx\n", 112 * memblock auto merges contiguous blocks, remove
107 (unsigned long)bank_phys_end(&bank[0]), 113 * all blocks afterwards
108 (unsigned long)bank_phys_start(&bank[i])); 114 */
109 break; 115 pr_notice("Ignoring RAM after %pa, memory at %pa ignored\n",
116 &mem_start, &reg->base);
117 memblock_remove(reg->base, reg->size);
110 } 118 }
111 } 119 }
112 /* All contiguous banks are now merged in to the first bank */
113 meminfo.nr_banks = 1;
114 specified_mem_size = bank[0].size;
115 120
116 /* 121 /*
117 * MPU has curious alignment requirements: Size must be power of 2, and 122 * MPU has curious alignment requirements: Size must be power of 2, and
@@ -128,23 +133,24 @@ void __init sanity_check_meminfo_mpu(void)
128 */ 133 */
129 aligned_region_size = (phys_offset - 1) ^ (phys_offset); 134 aligned_region_size = (phys_offset - 1) ^ (phys_offset);
130 /* Find the max power-of-two sized region that fits inside our bank */ 135 /* Find the max power-of-two sized region that fits inside our bank */
131 rounded_mem_size = (1 << __fls(bank[0].size)) - 1; 136 rounded_mem_size = (1 << __fls(specified_mem_size)) - 1;
132 137
133 /* The actual region size is the smaller of the two */ 138 /* The actual region size is the smaller of the two */
134 aligned_region_size = aligned_region_size < rounded_mem_size 139 aligned_region_size = aligned_region_size < rounded_mem_size
135 ? aligned_region_size + 1 140 ? aligned_region_size + 1
136 : rounded_mem_size + 1; 141 : rounded_mem_size + 1;
137 142
138 if (aligned_region_size != specified_mem_size) 143 if (aligned_region_size != specified_mem_size) {
139 pr_warn("Truncating memory from 0x%.8lx to 0x%.8lx (MPU region constraints)", 144 pr_warn("Truncating memory from %pa to %pa (MPU region constraints)",
140 (unsigned long)specified_mem_size, 145 &specified_mem_size, &aligned_region_size);
141 (unsigned long)aligned_region_size); 146 memblock_remove(mem_start + aligned_region_size,
147 specified_mem_size - aligned_round_size);
148
149 mem_end = mem_start + aligned_region_size;
150 }
142 151
143 meminfo.bank[0].size = aligned_region_size; 152 pr_debug("MPU Region from %pa size %pa (end %pa))\n",
144 pr_debug("MPU Region from 0x%.8lx size 0x%.8lx (end 0x%.8lx))\n", 153 &phys_offset, &aligned_region_size, &mem_end);
145 (unsigned long)phys_offset,
146 (unsigned long)aligned_region_size,
147 (unsigned long)bank_phys_end(&bank[0]));
148 154
149} 155}
150 156
@@ -292,7 +298,7 @@ void __init sanity_check_meminfo(void)
292{ 298{
293 phys_addr_t end; 299 phys_addr_t end;
294 sanity_check_meminfo_mpu(); 300 sanity_check_meminfo_mpu();
295 end = bank_phys_end(&meminfo.bank[meminfo.nr_banks - 1]); 301 end = memblock_end_of_DRAM();
296 high_memory = __va(end - 1) + 1; 302 high_memory = __va(end - 1) + 1;
297} 303}
298 304