|
|
|
@ -18,15 +18,16 @@ |
|
|
|
|
#include <asm/addrspace.h> |
|
|
|
|
|
|
|
|
|
#include <asm/mach-ar71xx/ar71xx.h> |
|
|
|
|
#include <asm/mach-ar71xx/platform.h> |
|
|
|
|
|
|
|
|
|
struct board_rec { |
|
|
|
|
char *name; |
|
|
|
|
unsigned long mach_type; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static int prom_argc __initdata; |
|
|
|
|
static char **prom_argv __initdata; |
|
|
|
|
static char **prom_envp __initdata; |
|
|
|
|
static int ar71xx_prom_argc __initdata; |
|
|
|
|
static char **ar71xx_prom_argv __initdata; |
|
|
|
|
static char **ar71xx_prom_envp __initdata; |
|
|
|
|
|
|
|
|
|
static struct board_rec boards[] __initdata = { |
|
|
|
|
{ |
|
|
|
@ -41,30 +42,37 @@ static struct board_rec boards[] __initdata = { |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
char *(*prom_getenv)(const char *envname) __initdata; |
|
|
|
|
|
|
|
|
|
static __init char *dummy_getenv(const char *envname) |
|
|
|
|
static __init void routerboot_printargs(void) |
|
|
|
|
{ |
|
|
|
|
return NULL; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < ar71xx_prom_argc; i++) |
|
|
|
|
printk(KERN_DEBUG "prom: routerboot envp[%d]: %s\n", |
|
|
|
|
i, ar71xx_prom_argv[i]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void __init routerboot_printargs(void) |
|
|
|
|
static __init char *routerboot_getenv(const char *envname) |
|
|
|
|
{ |
|
|
|
|
int len = strlen(envname); |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < prom_argc; i++) |
|
|
|
|
printk(KERN_DEBUG "prom: routerboot envp[%d]: %s\n", |
|
|
|
|
i, prom_envp[i]); |
|
|
|
|
for (i = 0; i < ar71xx_prom_argc; i++) { |
|
|
|
|
char *env = ar71xx_prom_argv[i]; |
|
|
|
|
if (strncmp(envname, env, len) == 0 && (env)[len] == '=') |
|
|
|
|
return env + len + 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static __init char *routerboot_getenv(const char *envname) |
|
|
|
|
static __init char *redboot_getenv(const char *envname) |
|
|
|
|
{ |
|
|
|
|
int len = strlen(envname); |
|
|
|
|
char **env; |
|
|
|
|
int i = strlen(envname); |
|
|
|
|
|
|
|
|
|
for (env = prom_envp; *env != NULL; env++) |
|
|
|
|
if (strncmp(envname, *env, i) == 0 && (*env)[i] == '=') |
|
|
|
|
return *env + i + 1; |
|
|
|
|
for (env = ar71xx_prom_envp; *env != NULL; env++) |
|
|
|
|
if (strncmp(envname, *env, len) == 0 && (*env)[len] == '=') |
|
|
|
|
return *env + len + 1; |
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
@ -82,28 +90,37 @@ static __init unsigned long find_board_byname(char *name) |
|
|
|
|
|
|
|
|
|
void __init prom_init(void) |
|
|
|
|
{ |
|
|
|
|
char *board; |
|
|
|
|
char *board = NULL; |
|
|
|
|
char *mac = NULL; |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
prom_getenv = dummy_getenv; |
|
|
|
|
|
|
|
|
|
if ((fw_arg0 == 7) && (fw_arg2 == 0)) { |
|
|
|
|
prom_argc = fw_arg0; |
|
|
|
|
prom_envp = (char **)fw_arg1; |
|
|
|
|
prom_getenv = routerboot_getenv; |
|
|
|
|
if ((fw_arg0 == 7) && (fw_arg2 == 0) && (fw_arg3 == 0)) { |
|
|
|
|
/* assume RouterBOOT */ |
|
|
|
|
ar71xx_prom_argc = fw_arg0; |
|
|
|
|
ar71xx_prom_argv = (char **)fw_arg1; |
|
|
|
|
routerboot_printargs(); |
|
|
|
|
board = routerboot_getenv("board"); |
|
|
|
|
mac = routerboot_getenv("kmac"); |
|
|
|
|
} else { |
|
|
|
|
/* assume Redboot */ |
|
|
|
|
ar71xx_prom_argc = fw_arg0; |
|
|
|
|
ar71xx_prom_argv = (char **)fw_arg1; |
|
|
|
|
ar71xx_prom_envp = (char **)fw_arg2; |
|
|
|
|
mac = redboot_getenv("ethaddr"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
board = prom_getenv("board"); |
|
|
|
|
if (board) |
|
|
|
|
mips_machtype = find_board_byname(board); |
|
|
|
|
else |
|
|
|
|
mips_machtype = MACH_AR71XX_GENERIC; |
|
|
|
|
|
|
|
|
|
if (mac) |
|
|
|
|
ar71xx_set_mac_base(mac); |
|
|
|
|
|
|
|
|
|
ar71xx_print_cmdline(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|