| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- --- 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];
- - }
- - }
-
- - 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) ;
- - }
- + cfe_eptseal = (uint32_t) fw_arg3;
- + cfe_handle = (uint32_t) fw_arg0;
- + cfe_ept = (uint32_t) fw_arg2;
- +
- + 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();
- }
-
|