fix boot failure on some boards
SVN-Revision: 13013
This commit is contained in:
parent
0b84952303
commit
0b31ea9d82
1 changed files with 108 additions and 0 deletions
108
target/linux/brcm47xx/patches-2.6.25/800-fix_cfe_detection.patch
Normal file
108
target/linux/brcm47xx/patches-2.6.25/800-fix_cfe_detection.patch
Normal file
|
@ -0,0 +1,108 @@
|
|||
--- 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 @@
|
||||
|
||||
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 @@
|
||||
|
||||
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();
|
||||
}
|
||||
|
Loading…
Reference in a new issue