[Top] [All Lists]

Freezing & Unfreezing the au11000

Subject: Freezing & Unfreezing the au11000
From: Rodolfo Giometti <>
Date: Fri, 16 Dec 2005 16:32:03 +0100
\from: Rodolfo Giometti <>
Organization: Programmi e soluzioni GNU/Linux
Original-recipient: rfc822;
User-agent: Mutt/
I'm just trying to support the save_and_sleep() support into u-boot
for an au1100 based board.

Into u-boot I added the following code:

Index: cpu/mips/start.S
RCS file: /home/develop/cvs_private/uboot-mips-exadron/cpu/mips/start.S,v
retrieving revision 1.2
diff -u -r1.2 start.S
--- cpu/mips/start.S    12 Oct 2005 12:55:54 -0000      1.2
+++ cpu/mips/start.S    16 Dec 2005 15:29:22 -0000
@@ -26,6 +26,7 @@
 #include <config.h>
 #include <version.h>
 #include <asm/regdef.h>
+#include <asm/au1x00.h>
 #include <asm/mipsregs.h>
@@ -273,6 +274,33 @@
        mtc0    t0, CP0_CONFIG
+       /* Now check the wakeup cause
+        */
+       li      t0, SYS_WAKESRC
+       lw      t1, 0(t0)
+       andi    t1, t1, 0x00000002      /* check the SW bit */
+       beq     zero, t1, 1f
+       nop
+       li      t0, SYS_SCRATCH0
+       lw      t1, 0(t0)
+       move    sp, t1
+       li      t0, SYS_SCRATCH1
+       lw      t1, 0(t0)
+       j       t1                      /* this cause a jump into already
+       nop                                frozen Linux (brr! :) */     
+       /* If we reach this point we come from a normal system power up,
+           so just clear the wakeup cause registers
+        */
+1:     li      t0, SYS_WAKEMSK
+       li      t1, 0x00000000
+       sw      t1, 0(t0)
+       li      t0, SYS_WAKESRC
+       li      t1, 0x00000000
+       sw      t1, 0(t0)
        /* Set up temporary stack.

in order to restore the scratch registers contents as descibed into
file "linux/arch/mips/au1000/common/sleeper.S":

        /* Now set up the scratch registers so the boot rom will
         * return to this point upon wakeup.
        la      k0, 1f
        lui     k1, 0xb190
        ori     k1, 0x18
        sw      sp, 0(k1)
        ori     k1, 0x1c
        sw      k0, 0(k1)

However it seems something is wrong since the system at the end of
save_and_sleep() does not correctly continue its execution...

Unlikely my JTAG do not allow me to follow the code after the
save_and_sleep()'s return (I definitely have to buy a better one),
however I noticed that when the system tryes to resume the register 29
(the sp) doing:

        lw      $29, PT_R29(sp)

something goes wrong!

Suggestions? :)

Thanks in advance,



GNU/Linux Solutions                  e-mail:
Linux Device Driver                   
Embedded Systems                      
UNIX programming                     phone:     +39 349 2432127

<Prev in Thread] Current Thread [Next in Thread>