Blackfin: pass RETX to Linux
authorMike Frysinger <vapier@gentoo.org>
Sun, 12 Oct 2008 01:44:00 +0000 (21:44 -0400)
committerMike Frysinger <vapier@gentoo.org>
Wed, 28 Jan 2009 18:26:15 +0000 (13:26 -0500)
Make sure we save the value of RETX at power on and then pass it on to the
kernel so that it can nicely debug a "double-fault-caused-a-reset" crash.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
cpu/blackfin/cpu.c
lib_blackfin/boot.c

index 9efd88e7ec9c87df91333bd714126bafd3f4f67d..30c214be7bc370268257fcaf4eac0af119be2a47 100644 (file)
 #include <asm/blackfin.h>
 #include <asm/cplb.h>
 #include <asm/mach-common/bits/core.h>
+#include <asm/mach-common/bits/ebiu.h>
 #include <asm/mach-common/bits/trace.h>
 
 #include "cpu.h"
 #include "serial.h"
 
+ulong bfin_poweron_retx;
+
 __attribute__ ((__noreturn__))
 void cpu_init_f(ulong bootflag, ulong loaded_from_ldr)
 {
@@ -48,6 +51,9 @@ void cpu_init_f(ulong bootflag, ulong loaded_from_ldr)
                bfin_write_EBIU_AMGCTL(CONFIG_EBIU_AMGCTL_VAL);
 #endif
 
+       /* Save RETX so we can pass it while booting Linux */
+       bfin_poweron_retx = bootflag;
+
 #ifdef CONFIG_DEBUG_DUMP
        /* Turn on hardware trace buffer */
        bfin_write_TBUFCTL(TBUFPWR | TBUFEN);
index 47e27de3057cc67bad7091e18d934364080237cf..537be2bd1e91928b5fc580a1a5a038208e0a2164 100644 (file)
@@ -31,6 +31,8 @@ static char *make_command_line(void)
        return dest;
 }
 
+extern ulong bfin_poweron_retx;
+
 int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
 {
        int     (*appl) (char *cmdline);
@@ -49,7 +51,12 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
        cmdline = make_command_line();
        icache_disable();
        dcache_disable();
-       (*appl) (cmdline);
+       asm __volatile__(
+               "RETX = %[retx];"
+               "CALL (%0);"
+               :
+               : "p"(appl), "q0"(cmdline), [retx] "d"(bfin_poweron_retx)
+       );
        /* does not return */
 
        return 1;