source: branches/8.09/target/linux/brcm47xx/patches-2.6.25/800-fix_cfe_detection.patch @ 13014

Last change on this file since 13014 was 13014, checked in by nbd, 8 years ago

sync 8.09 with changes from trunk

File size: 2.3 KB
  • arch/mips/bcm47xx/prom.c

    a b  
    3232#include <asm/fw/cfe/cfe_error.h> 
    3333 
    3434static int cfe_cons_handle; 
     35static void (* __prom_putchar)(char c); 
    3536 
    3637const char *get_system_type(void) 
    3738{ 
     
    4041 
    4142void prom_putchar(char c) 
    4243{ 
     44        if (__prom_putchar) 
     45                __prom_putchar(c); 
     46} 
     47 
     48void prom_putchar_cfe(char c) 
     49{ 
    4350        while (cfe_write(cfe_cons_handle, &c, 1) == 0) 
    4451                ; 
    4552} 
    4653 
    47 static __init void prom_init_cfe(void) 
     54static __init int prom_init_cfe(void) 
    4855{ 
    4956        uint32_t cfe_ept; 
    5057        uint32_t cfe_handle; 
    5158        uint32_t cfe_eptseal; 
    52         int argc = fw_arg0; 
    53         char **envp = (char **) fw_arg2; 
    54         int *prom_vec = (int *) fw_arg3; 
    55  
    56         /* 
    57          * Check if a loader was used; if NOT, the 4 arguments are 
    58          * what CFE gives us (handle, 0, EPT and EPTSEAL) 
    59          */ 
    60         if (argc < 0) { 
    61                 cfe_handle = (uint32_t)argc; 
    62                 cfe_ept = (uint32_t)envp; 
    63                 cfe_eptseal = (uint32_t)prom_vec; 
    64         } else { 
    65                 if ((int)prom_vec < 0) { 
    66                         /* 
    67                          * Old loader; all it gives us is the handle, 
    68                          * so use the "known" entrypoint and assume 
    69                          * the seal. 
    70                          */ 
    71                         cfe_handle = (uint32_t)prom_vec; 
    72                         cfe_ept = 0xBFC00500; 
    73                         cfe_eptseal = CFE_EPTSEAL; 
    74                 } else { 
    75                         /* 
    76                          * Newer loaders bundle the handle/ept/eptseal 
    77                          * Note: prom_vec is in the loader's useg 
    78                          * which is still alive in the TLB. 
    79                          */ 
    80                         cfe_handle = prom_vec[0]; 
    81                         cfe_ept = prom_vec[2]; 
    82                         cfe_eptseal = prom_vec[3]; 
    83                 } 
    84         } 
    8559 
    86         if (cfe_eptseal != CFE_EPTSEAL) { 
    87                 /* too early for panic to do any good */ 
    88                 printk(KERN_ERR "CFE's entrypoint seal doesn't match."); 
    89                 while (1) ; 
    90         } 
     60        cfe_eptseal = (uint32_t) fw_arg3; 
     61        cfe_handle = (uint32_t) fw_arg0; 
     62        cfe_ept = (uint32_t) fw_arg2; 
     63 
     64        if (cfe_eptseal != CFE_EPTSEAL) 
     65                return -1; 
    9166 
    9267        cfe_init(cfe_handle, cfe_ept); 
     68        return 0; 
    9369} 
    9470 
    95 static __init void prom_init_console(void) 
     71static __init void prom_init_console_cfe(void) 
    9672{ 
    9773        /* Initialize CFE console */ 
    9874        cfe_cons_handle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE); 
    9975} 
    10076 
    101 static __init void prom_init_cmdline(void) 
     77static __init void prom_init_cmdline_cfe(void) 
    10278{ 
    10379        char buf[CL_SIZE]; 
    10480 
     
    146122 
    147123void __init prom_init(void) 
    148124{ 
    149         prom_init_cfe(); 
    150         prom_init_console(); 
    151         prom_init_cmdline(); 
     125        if (prom_init_cfe() == 0) { 
     126                prom_init_console_cfe(); 
     127                prom_init_cmdline_cfe(); 
     128                __prom_putchar = prom_putchar_cfe; 
     129        } 
     130 
    152131        prom_init_mem(); 
    153132} 
    154133 
Note: See TracBrowser for help on using the repository browser.