mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
25df8198f4
commit
9ba067f93f
|
@ -37,23 +37,14 @@ typedef struct bp_tag {
|
|||
unsigned long data[0]; /* data */
|
||||
} bp_tag_t;
|
||||
|
||||
typedef struct meminfo {
|
||||
struct bp_meminfo {
|
||||
unsigned long type;
|
||||
unsigned long start;
|
||||
unsigned long end;
|
||||
} meminfo_t;
|
||||
|
||||
#define SYSMEM_BANKS_MAX 5
|
||||
};
|
||||
|
||||
#define MEMORY_TYPE_CONVENTIONAL 0x1000
|
||||
#define MEMORY_TYPE_NONE 0x2000
|
||||
|
||||
typedef struct sysmem_info {
|
||||
int nr_banks;
|
||||
meminfo_t bank[SYSMEM_BANKS_MAX];
|
||||
} sysmem_info_t;
|
||||
|
||||
extern sysmem_info_t sysmem;
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* sysmem-related prototypes.
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 2014 Cadence Design Systems Inc.
|
||||
*/
|
||||
|
||||
#ifndef _XTENSA_SYSMEM_H
|
||||
#define _XTENSA_SYSMEM_H
|
||||
|
||||
#define SYSMEM_BANKS_MAX 31
|
||||
|
||||
struct meminfo {
|
||||
unsigned long start;
|
||||
unsigned long end;
|
||||
};
|
||||
|
||||
struct sysmem_info {
|
||||
int nr_banks;
|
||||
struct meminfo bank[SYSMEM_BANKS_MAX];
|
||||
};
|
||||
|
||||
extern struct sysmem_info sysmem;
|
||||
|
||||
int add_sysmem_bank(unsigned long start, unsigned long end);
|
||||
int mem_reserve(unsigned long, unsigned long, int);
|
||||
void bootmem_init(void);
|
||||
void zones_init(void);
|
||||
|
||||
#endif /* _XTENSA_SYSMEM_H */
|
|
@ -50,6 +50,7 @@
|
|||
#include <asm/param.h>
|
||||
#include <asm/traps.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/sysmem.h>
|
||||
|
||||
#include <platform/hardware.h>
|
||||
|
||||
|
@ -88,12 +89,6 @@ static char __initdata command_line[COMMAND_LINE_SIZE];
|
|||
static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
|
||||
#endif
|
||||
|
||||
sysmem_info_t __initdata sysmem;
|
||||
|
||||
extern int mem_reserve(unsigned long, unsigned long, int);
|
||||
extern void bootmem_init(void);
|
||||
extern void zones_init(void);
|
||||
|
||||
/*
|
||||
* Boot parameter parsing.
|
||||
*
|
||||
|
@ -113,31 +108,14 @@ typedef struct tagtable {
|
|||
|
||||
/* parse current tag */
|
||||
|
||||
static int __init add_sysmem_bank(unsigned long type, unsigned long start,
|
||||
unsigned long end)
|
||||
{
|
||||
if (sysmem.nr_banks >= SYSMEM_BANKS_MAX) {
|
||||
printk(KERN_WARNING
|
||||
"Ignoring memory bank 0x%08lx size %ldKB\n",
|
||||
start, end - start);
|
||||
return -EINVAL;
|
||||
}
|
||||
sysmem.bank[sysmem.nr_banks].type = type;
|
||||
sysmem.bank[sysmem.nr_banks].start = PAGE_ALIGN(start);
|
||||
sysmem.bank[sysmem.nr_banks].end = end & PAGE_MASK;
|
||||
sysmem.nr_banks++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init parse_tag_mem(const bp_tag_t *tag)
|
||||
{
|
||||
meminfo_t *mi = (meminfo_t *)(tag->data);
|
||||
struct bp_meminfo *mi = (struct bp_meminfo *)(tag->data);
|
||||
|
||||
if (mi->type != MEMORY_TYPE_CONVENTIONAL)
|
||||
return -1;
|
||||
|
||||
return add_sysmem_bank(mi->type, mi->start, mi->end);
|
||||
return add_sysmem_bank(mi->start, mi->end);
|
||||
}
|
||||
|
||||
__tagtable(BP_TAG_MEMORY, parse_tag_mem);
|
||||
|
@ -146,8 +124,8 @@ __tagtable(BP_TAG_MEMORY, parse_tag_mem);
|
|||
|
||||
static int __init parse_tag_initrd(const bp_tag_t* tag)
|
||||
{
|
||||
meminfo_t* mi;
|
||||
mi = (meminfo_t*)(tag->data);
|
||||
struct bp_meminfo *mi = (struct bp_meminfo *)(tag->data);
|
||||
|
||||
initrd_start = (unsigned long)__va(mi->start);
|
||||
initrd_end = (unsigned long)__va(mi->end);
|
||||
|
||||
|
@ -255,7 +233,7 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
|
|||
return;
|
||||
|
||||
size &= PAGE_MASK;
|
||||
add_sysmem_bank(MEMORY_TYPE_CONVENTIONAL, base, base + size);
|
||||
add_sysmem_bank(base, base + size);
|
||||
}
|
||||
|
||||
void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
|
||||
|
@ -292,8 +270,6 @@ device_initcall(xtensa_device_probe);
|
|||
|
||||
void __init init_arch(bp_tag_t *bp_start)
|
||||
{
|
||||
sysmem.nr_banks = 0;
|
||||
|
||||
/* Parse boot parameters */
|
||||
|
||||
if (bp_start)
|
||||
|
@ -304,10 +280,9 @@ void __init init_arch(bp_tag_t *bp_start)
|
|||
#endif
|
||||
|
||||
if (sysmem.nr_banks == 0) {
|
||||
sysmem.nr_banks = 1;
|
||||
sysmem.bank[0].start = PLATFORM_DEFAULT_MEM_START;
|
||||
sysmem.bank[0].end = PLATFORM_DEFAULT_MEM_START
|
||||
+ PLATFORM_DEFAULT_MEM_SIZE;
|
||||
add_sysmem_bank(PLATFORM_DEFAULT_MEM_START,
|
||||
PLATFORM_DEFAULT_MEM_START +
|
||||
PLATFORM_DEFAULT_MEM_SIZE);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CMDLINE_BOOL
|
||||
|
|
|
@ -27,6 +27,23 @@
|
|||
#include <asm/bootparam.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/sysmem.h>
|
||||
|
||||
struct sysmem_info sysmem __initdata;
|
||||
|
||||
int __init add_sysmem_bank(unsigned long start, unsigned long end)
|
||||
{
|
||||
if (sysmem.nr_banks >= SYSMEM_BANKS_MAX) {
|
||||
pr_warn("Ignoring memory bank 0x%08lx size %ldKB\n",
|
||||
start, end - start);
|
||||
return -EINVAL;
|
||||
}
|
||||
sysmem.bank[sysmem.nr_banks].start = PAGE_ALIGN(start);
|
||||
sysmem.bank[sysmem.nr_banks].end = end & PAGE_MASK;
|
||||
sysmem.nr_banks++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* mem_reserve(start, end, must_exist)
|
||||
|
|
Loading…
Reference in New Issue