Commit 2b0d8c25 authored by Jeremy Kerr's avatar Jeremy Kerr Committed by Russell King

ARM: 5880/1: arm: use generic infrastructure for early params

The ARM setup code includes its own parser for early params, there's
also one in the generic init code.

This patch removes __early_init (and related code) from
arch/arm/kernel/setup.c, and changes users to the generic early_init
macro instead.

The generic macro takes a char * argument, rather than char **, so we
need to update the parser functions a little.
Signed-off-by: default avatarJeremy Kerr <jeremy.kerr@canonical.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent e119bfff
...@@ -223,18 +223,6 @@ extern struct meminfo meminfo; ...@@ -223,18 +223,6 @@ extern struct meminfo meminfo;
#define bank_phys_end(bank) ((bank)->start + (bank)->size) #define bank_phys_end(bank) ((bank)->start + (bank)->size)
#define bank_phys_size(bank) (bank)->size #define bank_phys_size(bank) (bank)->size
/*
* Early command line parameters.
*/
struct early_params {
const char *arg;
void (*fn)(char **p);
};
#define __early_param(name,fn) \
static struct early_params __early_##fn __used \
__attribute__((__section__(".early_param.init"))) = { name, fn }
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif #endif
...@@ -418,10 +418,11 @@ static int __init arm_add_memory(unsigned long start, unsigned long size) ...@@ -418,10 +418,11 @@ static int __init arm_add_memory(unsigned long start, unsigned long size)
* Pick out the memory size. We look for mem=size@start, * Pick out the memory size. We look for mem=size@start,
* where start and size are "size[KkMm]" * where start and size are "size[KkMm]"
*/ */
static void __init early_mem(char **p) static int __init early_mem(char *p)
{ {
static int usermem __initdata = 0; static int usermem __initdata = 0;
unsigned long size, start; unsigned long size, start;
char *endp;
/* /*
* If the user specifies memory size, we * If the user specifies memory size, we
...@@ -434,52 +435,15 @@ static void __init early_mem(char **p) ...@@ -434,52 +435,15 @@ static void __init early_mem(char **p)
} }
start = PHYS_OFFSET; start = PHYS_OFFSET;
size = memparse(*p, p); size = memparse(p, &endp);
if (**p == '@') if (*endp == '@')
start = memparse(*p + 1, p); start = memparse(endp + 1, NULL);
arm_add_memory(start, size); arm_add_memory(start, size);
}
__early_param("mem=", early_mem);
/* return 0;
* Initial parsing of the command line.
*/
static void __init parse_cmdline(char **cmdline_p, char *from)
{
char c = ' ', *to = command_line;
int len = 0;
for (;;) {
if (c == ' ') {
extern struct early_params __early_begin, __early_end;
struct early_params *p;
for (p = &__early_begin; p < &__early_end; p++) {
int arglen = strlen(p->arg);
if (memcmp(from, p->arg, arglen) == 0) {
if (to != command_line)
to -= 1;
from += arglen;
p->fn(&from);
while (*from != ' ' && *from != '\0')
from++;
break;
}
}
}
c = *from++;
if (!c)
break;
if (COMMAND_LINE_SIZE <= ++len)
break;
*to++ = c;
}
*to = '\0';
*cmdline_p = command_line;
} }
early_param("mem", early_mem);
static void __init static void __init
setup_ramdisk(int doload, int prompt, int image_start, unsigned int rd_sz) setup_ramdisk(int doload, int prompt, int image_start, unsigned int rd_sz)
...@@ -740,9 +704,15 @@ void __init setup_arch(char **cmdline_p) ...@@ -740,9 +704,15 @@ void __init setup_arch(char **cmdline_p)
init_mm.end_data = (unsigned long) _edata; init_mm.end_data = (unsigned long) _edata;
init_mm.brk = (unsigned long) _end; init_mm.brk = (unsigned long) _end;
memcpy(boot_command_line, from, COMMAND_LINE_SIZE); /* parse_early_param needs a boot_command_line */
boot_command_line[COMMAND_LINE_SIZE-1] = '\0'; strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);
parse_cmdline(cmdline_p, from);
/* populate command_line too for later use, preserving boot_command_line */
strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
*cmdline_p = command_line;
parse_early_param();
paging_init(mdesc); paging_init(mdesc);
request_standard_resources(&meminfo, mdesc); request_standard_resources(&meminfo, mdesc);
......
...@@ -43,10 +43,6 @@ SECTIONS ...@@ -43,10 +43,6 @@ SECTIONS
INIT_SETUP(16) INIT_SETUP(16)
__early_begin = .;
*(.early_param.init)
__early_end = .;
INIT_CALLS INIT_CALLS
CON_INITCALL CON_INITCALL
SECURITY_INITCALL SECURITY_INITCALL
......
...@@ -32,12 +32,13 @@ unsigned int mem_fclk_21285 = 50000000; ...@@ -32,12 +32,13 @@ unsigned int mem_fclk_21285 = 50000000;
EXPORT_SYMBOL(mem_fclk_21285); EXPORT_SYMBOL(mem_fclk_21285);
static void __init early_fclk(char **arg) static int __init early_fclk(char *arg)
{ {
mem_fclk_21285 = simple_strtoul(*arg, arg, 0); mem_fclk_21285 = simple_strtoul(arg, NULL, 0);
return 0;
} }
__early_param("mem_fclk_21285=", early_fclk); early_param("mem_fclk_21285", early_fclk);
static int __init parse_tag_memclk(const struct tag *tag) static int __init parse_tag_memclk(const struct tag *tag)
{ {
......
...@@ -32,19 +32,21 @@ ...@@ -32,19 +32,21 @@
static unsigned long phys_initrd_start __initdata = 0; static unsigned long phys_initrd_start __initdata = 0;
static unsigned long phys_initrd_size __initdata = 0; static unsigned long phys_initrd_size __initdata = 0;
static void __init early_initrd(char **p) static int __init early_initrd(char *p)
{ {
unsigned long start, size; unsigned long start, size;
char *endp;
start = memparse(*p, p); start = memparse(p, &endp);
if (**p == ',') { if (*endp == ',') {
size = memparse((*p) + 1, p); size = memparse(endp + 1, NULL);
phys_initrd_start = start; phys_initrd_start = start;
phys_initrd_size = size; phys_initrd_size = size;
} }
return 0;
} }
__early_param("initrd=", early_initrd); early_param("initrd", early_initrd);
static int __init parse_tag_initrd(const struct tag *tag) static int __init parse_tag_initrd(const struct tag *tag)
{ {
......
...@@ -100,18 +100,17 @@ static struct cachepolicy cache_policies[] __initdata = { ...@@ -100,18 +100,17 @@ static struct cachepolicy cache_policies[] __initdata = {
* writebuffer to be turned off. (Note: the write * writebuffer to be turned off. (Note: the write
* buffer should not be on and the cache off). * buffer should not be on and the cache off).
*/ */
static void __init early_cachepolicy(char **p) static int __init early_cachepolicy(char *p)
{ {
int i; int i;
for (i = 0; i < ARRAY_SIZE(cache_policies); i++) { for (i = 0; i < ARRAY_SIZE(cache_policies); i++) {
int len = strlen(cache_policies[i].policy); int len = strlen(cache_policies[i].policy);
if (memcmp(*p, cache_policies[i].policy, len) == 0) { if (memcmp(p, cache_policies[i].policy, len) == 0) {
cachepolicy = i; cachepolicy = i;
cr_alignment &= ~cache_policies[i].cr_mask; cr_alignment &= ~cache_policies[i].cr_mask;
cr_no_alignment &= ~cache_policies[i].cr_mask; cr_no_alignment &= ~cache_policies[i].cr_mask;
*p += len;
break; break;
} }
} }
...@@ -130,36 +129,37 @@ static void __init early_cachepolicy(char **p) ...@@ -130,36 +129,37 @@ static void __init early_cachepolicy(char **p)
} }
flush_cache_all(); flush_cache_all();
set_cr(cr_alignment); set_cr(cr_alignment);
return 0;
} }
__early_param("cachepolicy=", early_cachepolicy); early_param("cachepolicy", early_cachepolicy);
static void __init early_nocache(char **__unused) static int __init early_nocache(char *__unused)
{ {
char *p = "buffered"; char *p = "buffered";
printk(KERN_WARNING "nocache is deprecated; use cachepolicy=%s\n", p); printk(KERN_WARNING "nocache is deprecated; use cachepolicy=%s\n", p);
early_cachepolicy(&p); early_cachepolicy(p);
return 0;
} }
__early_param("nocache", early_nocache); early_param("nocache", early_nocache);
static void __init early_nowrite(char **__unused) static int __init early_nowrite(char *__unused)
{ {
char *p = "uncached"; char *p = "uncached";
printk(KERN_WARNING "nowb is deprecated; use cachepolicy=%s\n", p); printk(KERN_WARNING "nowb is deprecated; use cachepolicy=%s\n", p);
early_cachepolicy(&p); early_cachepolicy(p);
return 0;
} }
__early_param("nowb", early_nowrite); early_param("nowb", early_nowrite);
static void __init early_ecc(char **p) static int __init early_ecc(char *p)
{ {
if (memcmp(*p, "on", 2) == 0) { if (memcmp(p, "on", 2) == 0)
ecc_mask = PMD_PROTECTION; ecc_mask = PMD_PROTECTION;
*p += 2; else if (memcmp(p, "off", 3) == 0)
} else if (memcmp(*p, "off", 3) == 0) {
ecc_mask = 0; ecc_mask = 0;
*p += 3; return 0;
}
} }
__early_param("ecc=", early_ecc); early_param("ecc", early_ecc);
static int __init noalign_setup(char *__unused) static int __init noalign_setup(char *__unused)
{ {
...@@ -670,9 +670,9 @@ static unsigned long __initdata vmalloc_reserve = SZ_128M; ...@@ -670,9 +670,9 @@ static unsigned long __initdata vmalloc_reserve = SZ_128M;
* bytes. This can be used to increase (or decrease) the vmalloc * bytes. This can be used to increase (or decrease) the vmalloc
* area - the default is 128m. * area - the default is 128m.
*/ */
static void __init early_vmalloc(char **arg) static int __init early_vmalloc(char *arg)
{ {
vmalloc_reserve = memparse(*arg, arg); vmalloc_reserve = memparse(arg, NULL);
if (vmalloc_reserve < SZ_16M) { if (vmalloc_reserve < SZ_16M) {
vmalloc_reserve = SZ_16M; vmalloc_reserve = SZ_16M;
...@@ -687,8 +687,9 @@ static void __init early_vmalloc(char **arg) ...@@ -687,8 +687,9 @@ static void __init early_vmalloc(char **arg)
"vmalloc area is too big, limiting to %luMB\n", "vmalloc area is too big, limiting to %luMB\n",
vmalloc_reserve >> 20); vmalloc_reserve >> 20);
} }
return 0;
} }
__early_param("vmalloc=", early_vmalloc); early_param("vmalloc", early_vmalloc);
#define VMALLOC_MIN (void *)(VMALLOC_END - vmalloc_reserve) #define VMALLOC_MIN (void *)(VMALLOC_END - vmalloc_reserve)
......
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