mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 23:12:32 +00:00
c2b878a384
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> SVN-Revision: 13909
109 lines
2.5 KiB
Diff
109 lines
2.5 KiB
Diff
diff --git a/arch/mips/bcm47xx/prom.c b/arch/mips/bcm47xx/prom.c
|
|
--- a/arch/mips/bcm47xx/prom.c
|
|
+++ b/arch/mips/bcm47xx/prom.c
|
|
@@ -32,6 +32,7 @@
|
|
#include <asm/fw/cfe/cfe_error.h>
|
|
|
|
static int cfe_cons_handle;
|
|
+static void (* __prom_putchar)(char c);
|
|
|
|
const char *get_system_type(void)
|
|
{
|
|
@@ -40,65 +41,40 @@ const char *get_system_type(void)
|
|
|
|
void prom_putchar(char c)
|
|
{
|
|
+ if (__prom_putchar)
|
|
+ __prom_putchar(c);
|
|
+}
|
|
+
|
|
+void prom_putchar_cfe(char c)
|
|
+{
|
|
while (cfe_write(cfe_cons_handle, &c, 1) == 0)
|
|
;
|
|
}
|
|
|
|
-static __init void prom_init_cfe(void)
|
|
+static __init int prom_init_cfe(void)
|
|
{
|
|
uint32_t cfe_ept;
|
|
uint32_t cfe_handle;
|
|
uint32_t cfe_eptseal;
|
|
- int argc = fw_arg0;
|
|
- char **envp = (char **) fw_arg2;
|
|
- int *prom_vec = (int *) fw_arg3;
|
|
|
|
- /*
|
|
- * Check if a loader was used; if NOT, the 4 arguments are
|
|
- * what CFE gives us (handle, 0, EPT and EPTSEAL)
|
|
- */
|
|
- if (argc < 0) {
|
|
- cfe_handle = (uint32_t)argc;
|
|
- cfe_ept = (uint32_t)envp;
|
|
- cfe_eptseal = (uint32_t)prom_vec;
|
|
- } else {
|
|
- if ((int)prom_vec < 0) {
|
|
- /*
|
|
- * Old loader; all it gives us is the handle,
|
|
- * so use the "known" entrypoint and assume
|
|
- * the seal.
|
|
- */
|
|
- cfe_handle = (uint32_t)prom_vec;
|
|
- cfe_ept = 0xBFC00500;
|
|
- cfe_eptseal = CFE_EPTSEAL;
|
|
- } else {
|
|
- /*
|
|
- * Newer loaders bundle the handle/ept/eptseal
|
|
- * Note: prom_vec is in the loader's useg
|
|
- * which is still alive in the TLB.
|
|
- */
|
|
- cfe_handle = prom_vec[0];
|
|
- cfe_ept = prom_vec[2];
|
|
- cfe_eptseal = prom_vec[3];
|
|
- }
|
|
- }
|
|
+ cfe_eptseal = (uint32_t) fw_arg3;
|
|
+ cfe_handle = (uint32_t) fw_arg0;
|
|
+ cfe_ept = (uint32_t) fw_arg2;
|
|
|
|
- if (cfe_eptseal != CFE_EPTSEAL) {
|
|
- /* too early for panic to do any good */
|
|
- printk(KERN_ERR "CFE's entrypoint seal doesn't match.");
|
|
- while (1) ;
|
|
- }
|
|
+ if (cfe_eptseal != CFE_EPTSEAL)
|
|
+ return -1;
|
|
|
|
cfe_init(cfe_handle, cfe_ept);
|
|
+ return 0;
|
|
}
|
|
|
|
-static __init void prom_init_console(void)
|
|
+static __init void prom_init_console_cfe(void)
|
|
{
|
|
/* Initialize CFE console */
|
|
cfe_cons_handle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE);
|
|
}
|
|
|
|
-static __init void prom_init_cmdline(void)
|
|
+static __init void prom_init_cmdline_cfe(void)
|
|
{
|
|
char buf[CL_SIZE];
|
|
|
|
@@ -146,9 +122,12 @@ static __init void prom_init_mem(void)
|
|
|
|
void __init prom_init(void)
|
|
{
|
|
- prom_init_cfe();
|
|
- prom_init_console();
|
|
- prom_init_cmdline();
|
|
+ if (prom_init_cfe() == 0) {
|
|
+ prom_init_console_cfe();
|
|
+ prom_init_cmdline_cfe();
|
|
+ __prom_putchar = prom_putchar_cfe;
|
|
+ }
|
|
+
|
|
prom_init_mem();
|
|
}
|
|
|