X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/926e540be235f7757036b65509bf75f118f07694..86f7e2834ff8cc45f639d4a22a8af4cfdff015df:/target/linux/ramips/files/arch/mips/ralink/common/prom.c diff --git a/target/linux/ramips/files/arch/mips/ralink/common/prom.c b/target/linux/ramips/files/arch/mips/ralink/common/prom.c index edc3c5e46..b207b66a8 100644 --- a/target/linux/ramips/files/arch/mips/ralink/common/prom.c +++ b/target/linux/ramips/files/arch/mips/ralink/common/prom.c @@ -1,6 +1,7 @@ /* * Ralink SoC specific prom routines * + * Copyright (C) 2010 Joonas Lahtinen * Copyright (C) 2009 Gabor Juhos * * This program is free software; you can redistribute it and/or modify it @@ -19,25 +20,6 @@ #include #include -struct board_rec { - char *name; - enum ramips_mach_type mach_type; -}; - -static int ramips_prom_argc __initdata; -static char **ramips_prom_argv __initdata; -static char **ramips_prom_envp __initdata; - -static struct board_rec boards[] __initdata = { - { - .name = "RT-N15", - .mach_type = RAMIPS_MACH_RT_N15, - }, { - .name = "WHR-G300N", - .mach_type = RAMIPS_MACH_WHR_G300N, - } -}; - static inline void *to_ram_addr(void *addr) { u32 base; @@ -61,46 +43,82 @@ static inline void *to_ram_addr(void *addr) return NULL; } -static __init char *ramips_prom_getargv(const char *name) +static void __init prom_append_cmdline(const char *name, + const char *value) +{ + char buf[COMMAND_LINE_SIZE]; + + snprintf(buf, sizeof(buf), " %s=%s", name, value); + strlcat(arcs_cmdline, buf, sizeof(arcs_cmdline)); +} + +#ifdef CONFIG_IMAGE_CMDLINE_HACK +extern char __image_cmdline[]; + +static int __init use_image_cmdline(void) +{ + char *p = __image_cmdline; + int replace = 0; + + if (*p == '-') { + replace = 1; + p++; + } + + if (*p == '\0') + return 0; + + if (replace) { + strlcpy(arcs_cmdline, p, sizeof(arcs_cmdline)); + } else { + strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline)); + strlcat(arcs_cmdline, p, sizeof(arcs_cmdline)); + } + + return 1; +} +#else +static int inline use_image_cmdline(void) { return 0; } +#endif + +static __init void prom_init_cmdline(int argc, char **argv) { - int len = strlen(name); int i; - if (!ramips_prom_argv) { + if (use_image_cmdline()) + return; + + if (!argv) { printk(KERN_DEBUG "argv=%p is invalid, skipping\n", - ramips_prom_argv); - return NULL; + argv); + return; } - for (i = 0; i < ramips_prom_argc; i++) { - char *argv = to_ram_addr(ramips_prom_argv[i]); + for (i = 0; i < argc; i++) { + char *p = to_ram_addr(argv[i]); - if (!argv) { + if (!p) { printk(KERN_DEBUG "argv[%d]=%p is invalid, skipping\n", - i, ramips_prom_argv[i]); + i, argv[i]); continue; } - printk(KERN_DEBUG "argv[%d]: %s\n", i, argv); - if (strncmp(name, argv, len) == 0 && (argv)[len] == '=') - return argv + len + 1; + printk(KERN_DEBUG "argv[%d]: %s\n", i, p); + strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline)); + strlcat(arcs_cmdline, p, sizeof(arcs_cmdline)); } - - return NULL; } -static __init char *ramips_prom_getenv(const char *envname) +static __init char *prom_append_env(char **env, const char *envname) { #define PROM_MAX_ENVS 256 int len = strlen(envname); - char **env; int i; - env = ramips_prom_envp; if (!env) { - printk(KERN_DEBUG "envp=%p is not in RAM, skipping\n", - ramips_prom_envp); + printk(KERN_DEBUG "env=%p is not in RAM, skipping\n", + env); return NULL; } @@ -112,42 +130,31 @@ static __init char *ramips_prom_getenv(const char *envname) printk(KERN_DEBUG "env[%d]: %s\n", i, p); if (strncmp(envname, p, len) == 0 && p[len] == '=') - return p + len + 1; + prom_append_cmdline(envname, p + len + 1); } return NULL; #undef PROM_MAX_ENVS } -static __init void find_board_byname(char *name) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(boards); i++) - if (strcmp(name, boards[i].name) == 0) { - ramips_mach = boards[i].mach_type; - break; - } -} - void __init prom_init(void) { - char *p; + int argc; + char **envp; + char **argv; printk(KERN_DEBUG "prom: fw_arg0=%08x, fw_arg1=%08x, fw_arg2=%08x, fw_arg3=%08x\n", (unsigned int)fw_arg0, (unsigned int)fw_arg1, (unsigned int)fw_arg2, (unsigned int)fw_arg3); - ramips_prom_argc = fw_arg0; - ramips_prom_argv = to_ram_addr((void *)fw_arg1); - ramips_prom_envp = to_ram_addr((void *)fw_arg2); + argc = fw_arg0; + argv = to_ram_addr((void *)fw_arg1); + prom_init_cmdline(argc, argv); - p = ramips_prom_getargv("board"); - if (!p) - p = ramips_prom_getenv("board"); - if (p) - find_board_byname(p); + envp = to_ram_addr((void *)fw_arg2); + prom_append_env(envp, "board"); + prom_append_env(envp, "ethaddr"); } void __init prom_free_prom_memory(void)