diff options
| author | Max Filippov <jcmvbkbc@gmail.com> | 2014-03-22 19:17:43 -0400 |
|---|---|---|
| committer | Max Filippov <jcmvbkbc@gmail.com> | 2014-04-01 17:35:51 -0400 |
| commit | 9ba067f93f1eec0d241f002812806b873dd4f802 (patch) | |
| tree | 423c136a38f9290bf8fba0ede928f9bc8e9bc3a8 /arch | |
| parent | 25df8198f4b257cf6db4d4f000c53accfa9c28f8 (diff) | |
xtensa: split bootparam and kernel meminfo
Bootparam meminfo is a bootloader ABI, kernel meminfo is for the kernel
bookkeeping, keep them separate. Kernel doesn't care of memory region
types, so drop the type field and don't pass it to add_sysmem_bank.
Move kernel sysmem structures and prototypes to asm/sysmem.h and sysmem
variable and add_sysmem_bank to mm/init.c
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/xtensa/include/asm/bootparam.h | 13 | ||||
| -rw-r--r-- | arch/xtensa/include/asm/sysmem.h | 33 | ||||
| -rw-r--r-- | arch/xtensa/kernel/setup.c | 43 | ||||
| -rw-r--r-- | arch/xtensa/mm/init.c | 17 |
4 files changed, 61 insertions, 45 deletions
diff --git a/arch/xtensa/include/asm/bootparam.h b/arch/xtensa/include/asm/bootparam.h index 23392c5630ce..892aab399ac8 100644 --- a/arch/xtensa/include/asm/bootparam.h +++ b/arch/xtensa/include/asm/bootparam.h | |||
| @@ -37,23 +37,14 @@ typedef struct bp_tag { | |||
| 37 | unsigned long data[0]; /* data */ | 37 | unsigned long data[0]; /* data */ |
| 38 | } bp_tag_t; | 38 | } bp_tag_t; |
| 39 | 39 | ||
| 40 | typedef struct meminfo { | 40 | struct bp_meminfo { |
| 41 | unsigned long type; | 41 | unsigned long type; |
| 42 | unsigned long start; | 42 | unsigned long start; |
| 43 | unsigned long end; | 43 | unsigned long end; |
| 44 | } meminfo_t; | 44 | }; |
| 45 | |||
| 46 | #define SYSMEM_BANKS_MAX 5 | ||
| 47 | 45 | ||
| 48 | #define MEMORY_TYPE_CONVENTIONAL 0x1000 | 46 | #define MEMORY_TYPE_CONVENTIONAL 0x1000 |
| 49 | #define MEMORY_TYPE_NONE 0x2000 | 47 | #define MEMORY_TYPE_NONE 0x2000 |
| 50 | 48 | ||
| 51 | typedef struct sysmem_info { | ||
| 52 | int nr_banks; | ||
| 53 | meminfo_t bank[SYSMEM_BANKS_MAX]; | ||
| 54 | } sysmem_info_t; | ||
| 55 | |||
| 56 | extern sysmem_info_t sysmem; | ||
| 57 | |||
| 58 | #endif | 49 | #endif |
| 59 | #endif | 50 | #endif |
diff --git a/arch/xtensa/include/asm/sysmem.h b/arch/xtensa/include/asm/sysmem.h new file mode 100644 index 000000000000..fe7ad750a158 --- /dev/null +++ b/arch/xtensa/include/asm/sysmem.h | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | /* | ||
| 2 | * sysmem-related prototypes. | ||
| 3 | * | ||
| 4 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 5 | * License. See the file "COPYING" in the main directory of this archive | ||
| 6 | * for more details. | ||
| 7 | * | ||
| 8 | * Copyright (C) 2014 Cadence Design Systems Inc. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef _XTENSA_SYSMEM_H | ||
| 12 | #define _XTENSA_SYSMEM_H | ||
| 13 | |||
| 14 | #define SYSMEM_BANKS_MAX 31 | ||
| 15 | |||
| 16 | struct meminfo { | ||
| 17 | unsigned long start; | ||
| 18 | unsigned long end; | ||
| 19 | }; | ||
| 20 | |||
| 21 | struct sysmem_info { | ||
| 22 | int nr_banks; | ||
| 23 | struct meminfo bank[SYSMEM_BANKS_MAX]; | ||
| 24 | }; | ||
| 25 | |||
| 26 | extern struct sysmem_info sysmem; | ||
| 27 | |||
| 28 | int add_sysmem_bank(unsigned long start, unsigned long end); | ||
| 29 | int mem_reserve(unsigned long, unsigned long, int); | ||
| 30 | void bootmem_init(void); | ||
| 31 | void zones_init(void); | ||
| 32 | |||
| 33 | #endif /* _XTENSA_SYSMEM_H */ | ||
diff --git a/arch/xtensa/kernel/setup.c b/arch/xtensa/kernel/setup.c index 84fe931bb60e..df2b1d6fc843 100644 --- a/arch/xtensa/kernel/setup.c +++ b/arch/xtensa/kernel/setup.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #include <asm/param.h> | 50 | #include <asm/param.h> |
| 51 | #include <asm/traps.h> | 51 | #include <asm/traps.h> |
| 52 | #include <asm/smp.h> | 52 | #include <asm/smp.h> |
| 53 | #include <asm/sysmem.h> | ||
| 53 | 54 | ||
| 54 | #include <platform/hardware.h> | 55 | #include <platform/hardware.h> |
| 55 | 56 | ||
| @@ -88,12 +89,6 @@ static char __initdata command_line[COMMAND_LINE_SIZE]; | |||
| 88 | static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE; | 89 | static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE; |
| 89 | #endif | 90 | #endif |
| 90 | 91 | ||
| 91 | sysmem_info_t __initdata sysmem; | ||
| 92 | |||
| 93 | extern int mem_reserve(unsigned long, unsigned long, int); | ||
| 94 | extern void bootmem_init(void); | ||
| 95 | extern void zones_init(void); | ||
| 96 | |||
| 97 | /* | 92 | /* |
| 98 | * Boot parameter parsing. | 93 | * Boot parameter parsing. |
| 99 | * | 94 | * |
| @@ -113,31 +108,14 @@ typedef struct tagtable { | |||
| 113 | 108 | ||
| 114 | /* parse current tag */ | 109 | /* parse current tag */ |
| 115 | 110 | ||
| 116 | static int __init add_sysmem_bank(unsigned long type, unsigned long start, | ||
| 117 | unsigned long end) | ||
| 118 | { | ||
| 119 | if (sysmem.nr_banks >= SYSMEM_BANKS_MAX) { | ||
| 120 | printk(KERN_WARNING | ||
| 121 | "Ignoring memory bank 0x%08lx size %ldKB\n", | ||
| 122 | start, end - start); | ||
| 123 | return -EINVAL; | ||
| 124 | } | ||
| 125 | sysmem.bank[sysmem.nr_banks].type = type; | ||
| 126 | sysmem.bank[sysmem.nr_banks].start = PAGE_ALIGN(start); | ||
| 127 | sysmem.bank[sysmem.nr_banks].end = end & PAGE_MASK; | ||
| 128 | sysmem.nr_banks++; | ||
| 129 | |||
| 130 | return 0; | ||
| 131 | } | ||
| 132 | |||
| 133 | static int __init parse_tag_mem(const bp_tag_t *tag) | 111 | static int __init parse_tag_mem(const bp_tag_t *tag) |
| 134 | { | 112 | { |
| 135 | meminfo_t *mi = (meminfo_t *)(tag->data); | 113 | struct bp_meminfo *mi = (struct bp_meminfo *)(tag->data); |
| 136 | 114 | ||
| 137 | if (mi->type != MEMORY_TYPE_CONVENTIONAL) | 115 | if (mi->type != MEMORY_TYPE_CONVENTIONAL) |
| 138 | return -1; | 116 | return -1; |
| 139 | 117 | ||
| 140 | return add_sysmem_bank(mi->type, mi->start, mi->end); | 118 | return add_sysmem_bank(mi->start, mi->end); |
| 141 | } | 119 | } |
| 142 | 120 | ||
| 143 | __tagtable(BP_TAG_MEMORY, parse_tag_mem); | 121 | __tagtable(BP_TAG_MEMORY, parse_tag_mem); |
| @@ -146,8 +124,8 @@ __tagtable(BP_TAG_MEMORY, parse_tag_mem); | |||
| 146 | 124 | ||
| 147 | static int __init parse_tag_initrd(const bp_tag_t* tag) | 125 | static int __init parse_tag_initrd(const bp_tag_t* tag) |
| 148 | { | 126 | { |
| 149 | meminfo_t* mi; | 127 | struct bp_meminfo *mi = (struct bp_meminfo *)(tag->data); |
| 150 | mi = (meminfo_t*)(tag->data); | 128 | |
| 151 | initrd_start = (unsigned long)__va(mi->start); | 129 | initrd_start = (unsigned long)__va(mi->start); |
| 152 | initrd_end = (unsigned long)__va(mi->end); | 130 | initrd_end = (unsigned long)__va(mi->end); |
| 153 | 131 | ||
| @@ -255,7 +233,7 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size) | |||
| 255 | return; | 233 | return; |
| 256 | 234 | ||
| 257 | size &= PAGE_MASK; | 235 | size &= PAGE_MASK; |
| 258 | add_sysmem_bank(MEMORY_TYPE_CONVENTIONAL, base, base + size); | 236 | add_sysmem_bank(base, base + size); |
| 259 | } | 237 | } |
| 260 | 238 | ||
| 261 | void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) | 239 | void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) |
| @@ -292,8 +270,6 @@ device_initcall(xtensa_device_probe); | |||
| 292 | 270 | ||
| 293 | void __init init_arch(bp_tag_t *bp_start) | 271 | void __init init_arch(bp_tag_t *bp_start) |
| 294 | { | 272 | { |
| 295 | sysmem.nr_banks = 0; | ||
| 296 | |||
| 297 | /* Parse boot parameters */ | 273 | /* Parse boot parameters */ |
| 298 | 274 | ||
| 299 | if (bp_start) | 275 | if (bp_start) |
| @@ -304,10 +280,9 @@ void __init init_arch(bp_tag_t *bp_start) | |||
| 304 | #endif | 280 | #endif |
| 305 | 281 | ||
| 306 | if (sysmem.nr_banks == 0) { | 282 | if (sysmem.nr_banks == 0) { |
| 307 | sysmem.nr_banks = 1; | 283 | add_sysmem_bank(PLATFORM_DEFAULT_MEM_START, |
| 308 | sysmem.bank[0].start = PLATFORM_DEFAULT_MEM_START; | 284 | PLATFORM_DEFAULT_MEM_START + |
| 309 | sysmem.bank[0].end = PLATFORM_DEFAULT_MEM_START | 285 | PLATFORM_DEFAULT_MEM_SIZE); |
| 310 | + PLATFORM_DEFAULT_MEM_SIZE; | ||
| 311 | } | 286 | } |
| 312 | 287 | ||
| 313 | #ifdef CONFIG_CMDLINE_BOOL | 288 | #ifdef CONFIG_CMDLINE_BOOL |
diff --git a/arch/xtensa/mm/init.c b/arch/xtensa/mm/init.c index aff108df92d3..4f78264e8bd8 100644 --- a/arch/xtensa/mm/init.c +++ b/arch/xtensa/mm/init.c | |||
| @@ -27,6 +27,23 @@ | |||
| 27 | #include <asm/bootparam.h> | 27 | #include <asm/bootparam.h> |
| 28 | #include <asm/page.h> | 28 | #include <asm/page.h> |
| 29 | #include <asm/sections.h> | 29 | #include <asm/sections.h> |
| 30 | #include <asm/sysmem.h> | ||
| 31 | |||
| 32 | struct sysmem_info sysmem __initdata; | ||
| 33 | |||
| 34 | int __init add_sysmem_bank(unsigned long start, unsigned long end) | ||
| 35 | { | ||
| 36 | if (sysmem.nr_banks >= SYSMEM_BANKS_MAX) { | ||
| 37 | pr_warn("Ignoring memory bank 0x%08lx size %ldKB\n", | ||
| 38 | start, end - start); | ||
| 39 | return -EINVAL; | ||
| 40 | } | ||
| 41 | sysmem.bank[sysmem.nr_banks].start = PAGE_ALIGN(start); | ||
| 42 | sysmem.bank[sysmem.nr_banks].end = end & PAGE_MASK; | ||
| 43 | sysmem.nr_banks++; | ||
| 44 | |||
| 45 | return 0; | ||
| 46 | } | ||
| 30 | 47 | ||
| 31 | /* | 48 | /* |
| 32 | * mem_reserve(start, end, must_exist) | 49 | * mem_reserve(start, end, must_exist) |
