Commit 06bd2824 authored by Max Filippov's avatar Max Filippov

xtensa: handle memmap kernel option

This option is useful for reserving memory regions for secondary cores
in AMP configurations.

Implement the following memmap variants:
- memmap=nn[KMG]@ss[KMG]: force usage of a specific region of memory;
- memmap=nn[KMG]$ss[KMG]: mark specified memory as reserved;
- memmap=nn[KMG]: set end of memory.
Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 62327918
...@@ -507,6 +507,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -507,6 +507,7 @@ void __init setup_arch(char **cmdline_p)
__pa(&_Level6InterruptVector_text_end), 0); __pa(&_Level6InterruptVector_text_end), 0);
#endif #endif
parse_early_param();
bootmem_init(); bootmem_init();
unflatten_and_copy_device_tree(); unflatten_and_copy_device_tree();
......
...@@ -332,3 +332,53 @@ void free_initmem(void) ...@@ -332,3 +332,53 @@ void free_initmem(void)
{ {
free_initmem_default(-1); free_initmem_default(-1);
} }
static void __init parse_memmap_one(char *p)
{
char *oldp;
unsigned long start_at, mem_size;
if (!p)
return;
oldp = p;
mem_size = memparse(p, &p);
if (p == oldp)
return;
switch (*p) {
case '@':
start_at = memparse(p + 1, &p);
add_sysmem_bank(start_at, start_at + mem_size);
break;
case '$':
start_at = memparse(p + 1, &p);
mem_reserve(start_at, start_at + mem_size, 0);
break;
case 0:
mem_reserve(mem_size, 0, 0);
break;
default:
pr_warn("Unrecognized memmap syntax: %s\n", p);
break;
}
}
static int __init parse_memmap_opt(char *str)
{
while (str) {
char *k = strchr(str, ',');
if (k)
*k++ = 0;
parse_memmap_one(str);
str = k;
}
return 0;
}
early_param("memmap", parse_memmap_opt);
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