Commit 9ba067f9 authored by Max Filippov's avatar Max Filippov

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: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 25df8198
...@@ -37,23 +37,14 @@ typedef struct bp_tag { ...@@ -37,23 +37,14 @@ typedef struct bp_tag {
unsigned long data[0]; /* data */ unsigned long data[0]; /* data */
} bp_tag_t; } bp_tag_t;
typedef struct meminfo { struct bp_meminfo {
unsigned long type; unsigned long type;
unsigned long start; unsigned long start;
unsigned long end; unsigned long end;
} meminfo_t; };
#define SYSMEM_BANKS_MAX 5
#define MEMORY_TYPE_CONVENTIONAL 0x1000 #define MEMORY_TYPE_CONVENTIONAL 0x1000
#define MEMORY_TYPE_NONE 0x2000 #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
#endif #endif
/*
* 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 @@ ...@@ -50,6 +50,7 @@
#include <asm/param.h> #include <asm/param.h>
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/smp.h> #include <asm/smp.h>
#include <asm/sysmem.h>
#include <platform/hardware.h> #include <platform/hardware.h>
...@@ -88,12 +89,6 @@ static char __initdata command_line[COMMAND_LINE_SIZE]; ...@@ -88,12 +89,6 @@ static char __initdata command_line[COMMAND_LINE_SIZE];
static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE; static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
#endif #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. * Boot parameter parsing.
* *
...@@ -113,31 +108,14 @@ typedef struct tagtable { ...@@ -113,31 +108,14 @@ typedef struct tagtable {
/* parse current tag */ /* 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) 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) if (mi->type != MEMORY_TYPE_CONVENTIONAL)
return -1; 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); __tagtable(BP_TAG_MEMORY, parse_tag_mem);
...@@ -146,8 +124,8 @@ __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) static int __init parse_tag_initrd(const bp_tag_t* tag)
{ {
meminfo_t* mi; struct bp_meminfo *mi = (struct bp_meminfo *)(tag->data);
mi = (meminfo_t*)(tag->data);
initrd_start = (unsigned long)__va(mi->start); initrd_start = (unsigned long)__va(mi->start);
initrd_end = (unsigned long)__va(mi->end); initrd_end = (unsigned long)__va(mi->end);
...@@ -255,7 +233,7 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size) ...@@ -255,7 +233,7 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
return; return;
size &= PAGE_MASK; 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) void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
...@@ -292,8 +270,6 @@ device_initcall(xtensa_device_probe); ...@@ -292,8 +270,6 @@ device_initcall(xtensa_device_probe);
void __init init_arch(bp_tag_t *bp_start) void __init init_arch(bp_tag_t *bp_start)
{ {
sysmem.nr_banks = 0;
/* Parse boot parameters */ /* Parse boot parameters */
if (bp_start) if (bp_start)
...@@ -304,10 +280,9 @@ void __init init_arch(bp_tag_t *bp_start) ...@@ -304,10 +280,9 @@ void __init init_arch(bp_tag_t *bp_start)
#endif #endif
if (sysmem.nr_banks == 0) { if (sysmem.nr_banks == 0) {
sysmem.nr_banks = 1; add_sysmem_bank(PLATFORM_DEFAULT_MEM_START,
sysmem.bank[0].start = PLATFORM_DEFAULT_MEM_START; PLATFORM_DEFAULT_MEM_START +
sysmem.bank[0].end = PLATFORM_DEFAULT_MEM_START PLATFORM_DEFAULT_MEM_SIZE);
+ PLATFORM_DEFAULT_MEM_SIZE;
} }
#ifdef CONFIG_CMDLINE_BOOL #ifdef CONFIG_CMDLINE_BOOL
......
...@@ -27,6 +27,23 @@ ...@@ -27,6 +27,23 @@
#include <asm/bootparam.h> #include <asm/bootparam.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/sections.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) * mem_reserve(start, end, must_exist)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment