Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+61 -45
+2 -11
arch/xtensa/include/asm/bootparam.h
··· 37 37 unsigned long data[0]; /* data */ 38 38 } bp_tag_t; 39 39 40 - typedef struct meminfo { 40 + struct bp_meminfo { 41 41 unsigned long type; 42 42 unsigned long start; 43 43 unsigned long end; 44 - } meminfo_t; 45 - 46 - #define SYSMEM_BANKS_MAX 5 44 + }; 47 45 48 46 #define MEMORY_TYPE_CONVENTIONAL 0x1000 49 47 #define MEMORY_TYPE_NONE 0x2000 50 - 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 48 58 49 #endif 59 50 #endif
+33
arch/xtensa/include/asm/sysmem.h
··· 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 */
+9 -34
arch/xtensa/kernel/setup.c
··· 50 50 #include <asm/param.h> 51 51 #include <asm/traps.h> 52 52 #include <asm/smp.h> 53 + #include <asm/sysmem.h> 53 54 54 55 #include <platform/hardware.h> 55 56 ··· 89 88 static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE; 90 89 #endif 91 90 92 - sysmem_info_t __initdata sysmem; 93 - 94 - extern int mem_reserve(unsigned long, unsigned long, int); 95 - extern void bootmem_init(void); 96 - extern void zones_init(void); 97 - 98 91 /* 99 92 * Boot parameter parsing. 100 93 * ··· 108 113 109 114 /* parse current tag */ 110 115 111 - static int __init add_sysmem_bank(unsigned long type, unsigned long start, 112 - unsigned long end) 113 - { 114 - if (sysmem.nr_banks >= SYSMEM_BANKS_MAX) { 115 - printk(KERN_WARNING 116 - "Ignoring memory bank 0x%08lx size %ldKB\n", 117 - start, end - start); 118 - return -EINVAL; 119 - } 120 - sysmem.bank[sysmem.nr_banks].type = type; 121 - sysmem.bank[sysmem.nr_banks].start = PAGE_ALIGN(start); 122 - sysmem.bank[sysmem.nr_banks].end = end & PAGE_MASK; 123 - sysmem.nr_banks++; 124 - 125 - return 0; 126 - } 127 - 128 116 static int __init parse_tag_mem(const bp_tag_t *tag) 129 117 { 130 - meminfo_t *mi = (meminfo_t *)(tag->data); 118 + struct bp_meminfo *mi = (struct bp_meminfo *)(tag->data); 131 119 132 120 if (mi->type != MEMORY_TYPE_CONVENTIONAL) 133 121 return -1; 134 122 135 - return add_sysmem_bank(mi->type, mi->start, mi->end); 123 + return add_sysmem_bank(mi->start, mi->end); 136 124 } 137 125 138 126 __tagtable(BP_TAG_MEMORY, parse_tag_mem); ··· 124 146 125 147 static int __init parse_tag_initrd(const bp_tag_t* tag) 126 148 { 127 - meminfo_t* mi; 128 - mi = (meminfo_t*)(tag->data); 149 + struct bp_meminfo *mi = (struct bp_meminfo *)(tag->data); 150 + 129 151 initrd_start = (unsigned long)__va(mi->start); 130 152 initrd_end = (unsigned long)__va(mi->end); 131 153 ··· 233 255 return; 234 256 235 257 size &= PAGE_MASK; 236 - add_sysmem_bank(MEMORY_TYPE_CONVENTIONAL, base, base + size); 258 + add_sysmem_bank(base, base + size); 237 259 } 238 260 239 261 void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) ··· 270 292 271 293 void __init init_arch(bp_tag_t *bp_start) 272 294 { 273 - sysmem.nr_banks = 0; 274 - 275 295 /* Parse boot parameters */ 276 296 277 297 if (bp_start) ··· 280 304 #endif 281 305 282 306 if (sysmem.nr_banks == 0) { 283 - sysmem.nr_banks = 1; 284 - sysmem.bank[0].start = PLATFORM_DEFAULT_MEM_START; 285 - sysmem.bank[0].end = PLATFORM_DEFAULT_MEM_START 286 - + PLATFORM_DEFAULT_MEM_SIZE; 307 + add_sysmem_bank(PLATFORM_DEFAULT_MEM_START, 308 + PLATFORM_DEFAULT_MEM_START + 309 + PLATFORM_DEFAULT_MEM_SIZE); 287 310 } 288 311 289 312 #ifdef CONFIG_CMDLINE_BOOL
+17
arch/xtensa/mm/init.c
··· 27 27 #include <asm/bootparam.h> 28 28 #include <asm/page.h> 29 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 49 * mem_reserve(start, end, must_exist)