Blackfin arch: Add Workaround for ANOMALY 05000257
Michael Hennerich [Mon, 21 May 2007 10:09:09 +0000 (18:09 +0800)]
Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

arch/blackfin/lib/ins.S
arch/blackfin/mach-common/entry.S

index 730d2b4..7d5e984 100644 (file)
@@ -29,6 +29,7 @@
  */
 
 #include <linux/linkage.h>
+#include <asm/blackfin.h>
 
 .align 2
 
@@ -39,11 +40,14 @@ ENTRY(_insl)
        P2 = R2;        /* P2 = count */
        SSYNC;
        LSETUP( .Llong_loop_s, .Llong_loop_e) LC0 = P2;
-.Llong_loop_s: R0 = [P0];
-.Llong_loop_e: [P1++] = R0;
+.Llong_loop_s:  R0 = [P0];
+               [P1++] = R0;
+               NOP;
+.Llong_loop_e:         NOP;
        sti R3;
        RTS;
 
+
 ENTRY(_insw)
        P0 = R0;        /* P0 = port */
        cli R3;
@@ -51,8 +55,10 @@ ENTRY(_insw)
        P2 = R2;        /* P2 = count */
        SSYNC;
        LSETUP( .Lword_loop_s, .Lword_loop_e) LC0 = P2;
-.Lword_loop_s: R0 = W[P0];
-.Lword_loop_e: W[P1++] = R0;
+.Lword_loop_s:  R0 = W[P0];
+               W[P1++] = R0;
+               NOP;
+.Lword_loop_e:         NOP;
        sti R3;
        RTS;
 
@@ -63,7 +69,9 @@ ENTRY(_insb)
        P2 = R2;        /* P2 = count */
        SSYNC;
        LSETUP( .Lbyte_loop_s, .Lbyte_loop_e) LC0 = P2;
-.Lbyte_loop_s: R0 = B[P0];
-.Lbyte_loop_e: B[P1++] = R0;
+.Lbyte_loop_s:  R0 = B[P0];
+               B[P1++] = R0;
+               NOP;
+.Lbyte_loop_e:  NOP;
        sti R3;
        RTS;
index 8eb0a90..e463733 100644 (file)
@@ -181,6 +181,12 @@ ENTRY(_ex_single_step)
 
 _return_from_exception:
        DEBUG_START_HWTRACE
+#ifdef ANOMALY_05000257
+       R7=LC0;
+       LC0=R7;
+       R7=LC1;
+       LC1=R7;
+#endif
        (R7:6,P5:4) = [sp++];
        ASTAT = [sp++];
        sp = retn;