Commit 1c2f87c2 authored by Laura Abbott's avatar Laura Abbott Committed by Russell King

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: default avatarJason Cooper <jason@lakedaemon.net>
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Acked-by: default avatarSantosh Shilimkar <santosh.shilimkar@ti.com>
Acked-by: default avatarKukjin Kim <kgene.kim@samsung.com>
Tested-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
Tested-by: default avatarLeif Lindholm <leif.lindholm@linaro.org>
Signed-off-by: default avatarLaura Abbott <lauraa@codeaurora.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 1c8c3cf0
...@@ -1101,11 +1101,6 @@ source "arch/arm/firmware/Kconfig" ...@@ -1101,11 +1101,6 @@ source "arch/arm/firmware/Kconfig"
source arch/arm/mm/Kconfig source arch/arm/mm/Kconfig
config ARM_NR_BANKS
int
default 16 if ARCH_EP93XX
default 8
config IWMMXT config IWMMXT
bool "Enable iWMMXt support" if !CPU_PJ4 bool "Enable iWMMXt support" if !CPU_PJ4
depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#define do_extend_cmdline 0 #define do_extend_cmdline 0
#endif #endif
#define NR_BANKS 16
static int node_offset(void *fdt, const char *node_path) static int node_offset(void *fdt, const char *node_path)
{ {
int offset = fdt_path_offset(fdt, node_path); int offset = fdt_path_offset(fdt, node_path);
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
#include <linux/reboot.h> #include <linux/reboot.h>
struct tag; struct tag;
struct meminfo;
struct pt_regs; struct pt_regs;
struct smp_operations; struct smp_operations;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
...@@ -47,8 +46,7 @@ struct machine_desc { ...@@ -47,8 +46,7 @@ struct machine_desc {
enum reboot_mode reboot_mode; /* default restart mode */ enum reboot_mode reboot_mode; /* default restart mode */
struct smp_operations *smp; /* SMP operations */ struct smp_operations *smp; /* SMP operations */
bool (*smp_init)(void); bool (*smp_init)(void);
void (*fixup)(struct tag *, char **, void (*fixup)(struct tag *, char **);
struct meminfo *);
void (*init_meminfo)(void); void (*init_meminfo)(void);
void (*reserve)(void);/* reserve mem blocks */ void (*reserve)(void);/* reserve mem blocks */
void (*map_io)(void);/* IO mapping function */ void (*map_io)(void);/* IO mapping function */
......
#ifndef _ASM_ARM_MEMBLOCK_H #ifndef _ASM_ARM_MEMBLOCK_H
#define _ASM_ARM_MEMBLOCK_H #define _ASM_ARM_MEMBLOCK_H
struct meminfo;
struct machine_desc; struct machine_desc;
void arm_memblock_init(struct meminfo *, const struct machine_desc *); void arm_memblock_init(const struct machine_desc *);
phys_addr_t arm_memblock_steal(phys_addr_t size, phys_addr_t align); phys_addr_t arm_memblock_steal(phys_addr_t size, phys_addr_t align);
#endif #endif
...@@ -21,34 +21,6 @@ ...@@ -21,34 +21,6 @@
#define __tagtable(tag, fn) \ #define __tagtable(tag, fn) \
static const struct tagtable __tagtable_##fn __tag = { tag, fn } static const struct tagtable __tagtable_##fn __tag = { tag, fn }
/*
* Memory map description
*/
#define NR_BANKS CONFIG_ARM_NR_BANKS
struct membank {
phys_addr_t start;
phys_addr_t size;
unsigned int highmem;
};
struct meminfo {
int nr_banks;
struct membank bank[NR_BANKS];
};
extern struct meminfo meminfo;
#define for_each_bank(iter,mi) \
for (iter = 0; iter < (mi)->nr_banks; iter++)
#define bank_pfn_start(bank) __phys_to_pfn((bank)->start)
#define bank_pfn_end(bank) __phys_to_pfn((bank)->start + (bank)->size)
#define bank_pfn_size(bank) ((bank)->size >> PAGE_SHIFT)
#define bank_phys_start(bank) (bank)->start
#define bank_phys_end(bank) ((bank)->start + (bank)->size)
#define bank_phys_size(bank) (bank)->size
extern int arm_add_memory(u64 start, u64 size); extern int arm_add_memory(u64 start, u64 size);
extern void early_print(const char *str, ...); extern void early_print(const char *str, ...);
extern void dump_machine_table(void); extern void dump_machine_table(void);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/root_dev.h> #include <linux/root_dev.h>
#include <linux/screen_info.h> #include <linux/screen_info.h>
#include <linux/memblock.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/system_info.h> #include <asm/system_info.h>
...@@ -222,10 +223,10 @@ setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr) ...@@ -222,10 +223,10 @@ setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr)
} }
if (mdesc->fixup) if (mdesc->fixup)
mdesc->fixup(tags, &from, &meminfo); mdesc->fixup(tags, &from);
if (tags->hdr.tag == ATAG_CORE) { if (tags->hdr.tag == ATAG_CORE) {
if (meminfo.nr_banks != 0) if (memblock_phys_mem_size())
squash_mem_tags(tags); squash_mem_tags(tags);
save_atags(tags); save_atags(tags);
parse_tags(tags); parse_tags(tags);
......
...@@ -27,11 +27,6 @@ ...@@ -27,11 +27,6 @@
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
void __init early_init_dt_add_memory_arch(u64 base, u64 size)
{
arm_add_memory(base, size);
}
void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
{ {
return memblock_virt_alloc(size, align); return memblock_virt_alloc(size, align);
......
...@@ -628,15 +628,8 @@ void __init dump_machine_table(void) ...@@ -628,15 +628,8 @@ void __init dump_machine_table(void)
int __init arm_add_memory(u64 start, u64 size) int __init arm_add_memory(u64 start, u64 size)
{ {
struct membank *bank = &meminfo.bank[meminfo.nr_banks];
u64 aligned_start; u64 aligned_start;
if (meminfo.nr_banks >= NR_BANKS) {
pr_crit("NR_BANKS too low, ignoring memory at 0x%08llx\n",
(long long)start);
return -EINVAL;
}
/* /*
* Ensure that start/size are aligned to a page boundary. * Ensure that start/size are aligned to a page boundary.
* Size is appropriately rounded down, start is rounded up. * Size is appropriately rounded down, start is rounded up.
...@@ -677,17 +670,17 @@ int __init arm_add_memory(u64 start, u64 size) ...@@ -677,17 +670,17 @@ int __init arm_add_memory(u64 start, u64 size)
aligned_start = PHYS_OFFSET; aligned_start = PHYS_OFFSET;
} }
bank->start = aligned_start; start = aligned_start;
bank->size = size & ~(phys_addr_t)(PAGE_SIZE - 1); size = size & ~(phys_addr_t)(PAGE_SIZE - 1);
/* /*
* Check whether this memory region has non-zero size or * Check whether this memory region has non-zero size or
* invalid node number. * invalid node number.
*/ */
if (bank->size == 0) if (size == 0)
return -EINVAL; return -EINVAL;
meminfo.nr_banks++; memblock_add(start, size);
return 0; return 0;
} }
...@@ -695,6 +688,7 @@ int __init arm_add_memory(u64 start, u64 size) ...@@ -695,6 +688,7 @@ int __init arm_add_memory(u64 start, u64 size)
* Pick out the memory size. We look for mem=size@start, * Pick out the memory size. We look for mem=size@start,
* where start and size are "size[KkMm]" * where start and size are "size[KkMm]"
*/ */
static int __init early_mem(char *p) static int __init early_mem(char *p)
{ {
static int usermem __initdata = 0; static int usermem __initdata = 0;
...@@ -709,7 +703,8 @@ static int __init early_mem(char *p) ...@@ -709,7 +703,8 @@ static int __init early_mem(char *p)
*/ */
if (usermem == 0) { if (usermem == 0) {
usermem = 1; usermem = 1;
meminfo.nr_banks = 0; memblock_remove(memblock_start_of_DRAM(),
memblock_end_of_DRAM() - memblock_start_of_DRAM());
} }
start = PHYS_OFFSET; start = PHYS_OFFSET;
...@@ -854,13 +849,6 @@ static void __init reserve_crashkernel(void) ...@@ -854,13 +849,6 @@ static void __init reserve_crashkernel(void)
static inline void reserve_crashkernel(void) {} static inline void reserve_crashkernel(void) {}
#endif /* CONFIG_KEXEC */ #endif /* CONFIG_KEXEC */
static int __init meminfo_cmp(const void *_a, const void *_b)
{
const struct membank *a = _a, *b = _b;
long cmp = bank_pfn_start(a) - bank_pfn_start(b);
return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
}
void __init hyp_mode_check(void) void __init hyp_mode_check(void)
{ {
#ifdef CONFIG_ARM_VIRT_EXT #ifdef CONFIG_ARM_VIRT_EXT
...@@ -903,12 +891,10 @@ void __init setup_arch(char **cmdline_p) ...@@ -903,12 +891,10 @@ void __init setup_arch(char **cmdline_p)
parse_early_param(); parse_early_param();
sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL);
early_paging_init(mdesc, lookup_processor_type(read_cpuid_id())); early_paging_init(mdesc, lookup_processor_type(read_cpuid_id()));
setup_dma_zone(mdesc); setup_dma_zone(mdesc);
sanity_check_meminfo(); sanity_check_meminfo();
arm_memblock_init(&meminfo, mdesc); arm_memblock_init(mdesc);
paging_init(mdesc); paging_init(mdesc);
request_standard_resources(mdesc); request_standard_resources(mdesc);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/memblock.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
...@@ -26,11 +27,9 @@ ...@@ -26,11 +27,9 @@
#include "common.h" #include "common.h"
static void __init static void __init
fixup_clep7312(struct tag *tags, char **cmdline, struct meminfo *mi) fixup_clep7312(struct tag *tags, char **cmdline)
{ {
mi->nr_banks=1; memblock_add(0xc0000000, 0x01000000);
mi->bank[0].start = 0xc0000000;
mi->bank[0].size = 0x01000000;
} }
MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312") MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312")
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/backlight.h> #include <linux/backlight.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/memblock.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
...@@ -133,7 +134,7 @@ static void __init edb7211_reserve(void) ...@@ -133,7 +134,7 @@ static void __init edb7211_reserve(void)
} }
static void __init static void __init
fixup_edb7211(struct tag *tags, char **cmdline, struct meminfo *mi) fixup_edb7211(struct tag *tags, char **cmdline)
{ {
/* /*
* Bank start addresses are not present in the information * Bank start addresses are not present in the information
...@@ -143,11 +144,8 @@ fixup_edb7211(struct tag *tags, char **cmdline, struct meminfo *mi) ...@@ -143,11 +144,8 @@ fixup_edb7211(struct tag *tags, char **cmdline, struct meminfo *mi)
* Banks sizes _are_ present in the param block, but we're * Banks sizes _are_ present in the param block, but we're
* not using that information yet. * not using that information yet.
*/ */
mi->bank[0].start = 0xc0000000; memblock_add(0xc0000000, SZ_8M);
mi->bank[0].size = SZ_8M; memblock_add(0xc1000000, SZ_8M);
mi->bank[1].start = 0xc1000000;
mi->bank[1].size = SZ_8M;
mi->nr_banks = 2;
} }
static void __init edb7211_init(void) static void __init edb7211_init(void)
......
...@@ -295,7 +295,7 @@ static struct generic_bl_info p720t_lcd_backlight_pdata = { ...@@ -295,7 +295,7 @@ static struct generic_bl_info p720t_lcd_backlight_pdata = {
}; };
static void __init static void __init
fixup_p720t(struct tag *tag, char **cmdline, struct meminfo *mi) fixup_p720t(struct tag *tag, char **cmdline)
{ {
/* /*
* Our bootloader doesn't setup any tags (yet). * Our bootloader doesn't setup any tags (yet).
......
...@@ -76,7 +76,7 @@ __initcall(cats_hw_init); ...@@ -76,7 +76,7 @@ __initcall(cats_hw_init);
* hard reboots fail on early boards. * hard reboots fail on early boards.
*/ */
static void __init static void __init
fixup_cats(struct tag *tags, char **cmdline, struct meminfo *mi) fixup_cats(struct tag *tags, char **cmdline)
{ {
#if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE) #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
screen_info.orig_video_lines = 25; screen_info.orig_video_lines = 25;
......
...@@ -620,7 +620,7 @@ __initcall(nw_hw_init); ...@@ -620,7 +620,7 @@ __initcall(nw_hw_init);
* the parameter page. * the parameter page.
*/ */
static void __init static void __init
fixup_netwinder(struct tag *tags, char **cmdline, struct meminfo *mi) fixup_netwinder(struct tag *tags, char **cmdline)
{ {
#ifdef CONFIG_ISAPNP #ifdef CONFIG_ISAPNP
extern int isapnp_disable; extern int isapnp_disable;
......
...@@ -83,11 +83,6 @@ static void __init halibut_init(void) ...@@ -83,11 +83,6 @@ static void __init halibut_init(void)
platform_add_devices(devices, ARRAY_SIZE(devices)); platform_add_devices(devices, ARRAY_SIZE(devices));
} }
static void __init halibut_fixup(struct tag *tags, char **cmdline,
struct meminfo *mi)
{
}
static void __init halibut_map_io(void) static void __init halibut_map_io(void)
{ {
msm_map_common_io(); msm_map_common_io();
...@@ -100,7 +95,6 @@ static void __init halibut_init_late(void) ...@@ -100,7 +95,6 @@ static void __init halibut_init_late(void)
MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)") MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)")
.atag_offset = 0x100, .atag_offset = 0x100,
.fixup = halibut_fixup,
.map_io = halibut_map_io, .map_io = halibut_map_io,
.init_early = halibut_init_early, .init_early = halibut_init_early,
.init_irq = halibut_init_irq, .init_irq = halibut_init_irq,
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/memblock.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -52,16 +53,10 @@ static void __init mahimahi_init(void) ...@@ -52,16 +53,10 @@ static void __init mahimahi_init(void)
platform_add_devices(devices, ARRAY_SIZE(devices)); platform_add_devices(devices, ARRAY_SIZE(devices));
} }
static void __init mahimahi_fixup(struct tag *tags, char **cmdline, static void __init mahimahi_fixup(struct tag *tags, char **cmdline)
struct meminfo *mi)
{ {
mi->nr_banks = 2; memblock_add(PHYS_OFFSET, 219*SZ_1M);
mi->bank[0].start = PHYS_OFFSET; memblock_add(MSM_HIGHMEM_BASE, MSM_HIGHMEM_SIZE);
mi->bank[0].node = PHYS_TO_NID(PHYS_OFFSET);
mi->bank[0].size = (219*1024*1024);
mi->bank[1].start = MSM_HIGHMEM_BASE;
mi->bank[1].node = PHYS_TO_NID(MSM_HIGHMEM_BASE);
mi->bank[1].size = MSM_HIGHMEM_SIZE;
} }
static void __init mahimahi_map_io(void) static void __init mahimahi_map_io(void)
......
...@@ -40,8 +40,7 @@ ...@@ -40,8 +40,7 @@
#include "proc_comm.h" #include "proc_comm.h"
#include "common.h" #include "common.h"
static void __init msm7x30_fixup(struct tag *tag, char **cmdline, static void __init msm7x30_fixup(struct tag *tag, char **cmdline)
struct meminfo *mi)
{ {
for (; tag->hdr.size; tag = tag_next(tag)) for (; tag->hdr.size; tag = tag_next(tag))
if (tag->hdr.tag == ATAG_MEM && tag->u.mem.start == 0x200000) { if (tag->hdr.tag == ATAG_MEM && tag->u.mem.start == 0x200000) {
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <linux/mtd/nand.h> #include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/memblock.h>
#include "gpio_chip.h" #include "gpio_chip.h"
#include "board-sapphire.h" #include "board-sapphire.h"
...@@ -74,22 +75,18 @@ static struct map_desc sapphire_io_desc[] __initdata = { ...@@ -74,22 +75,18 @@ static struct map_desc sapphire_io_desc[] __initdata = {
} }
}; };
static void __init sapphire_fixup(struct tag *tags, char **cmdline, static void __init sapphire_fixup(struct tag *tags, char **cmdline)
struct meminfo *mi)
{ {
int smi_sz = parse_tag_smi((const struct tag *)tags); int smi_sz = parse_tag_smi((const struct tag *)tags);
mi->nr_banks = 1;
mi->bank[0].start = PHYS_OFFSET;
mi->bank[0].node = PHYS_TO_NID(PHYS_OFFSET);
if (smi_sz == 32) { if (smi_sz == 32) {
mi->bank[0].size = (84*1024*1024); memblock_add(PHYS_OFFSET, 84*SZ_1M);
} else if (smi_sz == 64) { } else if (smi_sz == 64) {
mi->bank[0].size = (101*1024*1024); memblock_add(PHYS_OFFSET, 101*SZ_1M);
} else { } else {
memblock_add(PHYS_OFFSET, 101*SZ_1M);
/* Give a default value when not get smi size */ /* Give a default value when not get smi size */
smi_sz = 64; smi_sz = 64;
mi->bank[0].size = (101*1024*1024);
} }
} }
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/clkdev.h> #include <linux/clkdev.h>
#include <linux/memblock.h>
#include <asm/system_info.h> #include <asm/system_info.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
...@@ -55,12 +56,9 @@ static void __init trout_init_irq(void) ...@@ -55,12 +56,9 @@ static void __init trout_init_irq(void)
msm_init_irq(); msm_init_irq();
} }
static void __init trout_fixup(struct tag *tags, char **cmdline, static void __init trout_fixup(struct tag *tags, char **cmdline)
struct meminfo *mi)
{ {
mi->nr_banks = 1; memblock_add(PHYS_OFFSET, 101*SZ_1M);
mi->bank[0].start = PHYS_OFFSET;
mi->bank[0].size = (101*1024*1024);
} }
static void __init trout_init(void) static void __init trout_init(void)
......
...@@ -365,8 +365,7 @@ void orion5x_restart(enum reboot_mode mode, const char *cmd) ...@@ -365,8 +365,7 @@ void orion5x_restart(enum reboot_mode mode, const char *cmd)
* Many orion-based systems have buggy bootloader implementations. * Many orion-based systems have buggy bootloader implementations.
* This is a common fixup for bogus memory tags. * This is a common fixup for bogus memory tags.
*/ */
void __init tag_fixup_mem32(struct tag *t, char **from, void __init tag_fixup_mem32(struct tag *t, char **from)
struct meminfo *meminfo)
{ {
for (; t->hdr.size; t = tag_next(t)) for (; t->hdr.size; t = tag_next(t))
if (t->hdr.tag == ATAG_MEM && if (t->hdr.tag == ATAG_MEM &&
......
...@@ -71,9 +71,8 @@ void edmini_v2_init(void); ...@@ -71,9 +71,8 @@ void edmini_v2_init(void);
static inline void edmini_v2_init(void) {}; static inline void edmini_v2_init(void) {};
#endif #endif
struct meminfo;
struct tag; struct tag;