Title: [7237] branches/2009R1/arch/blackfin/include/asm/entry.h: Add workarounds for anomaly 283 which fixes bug [#5430]
Revision
7237
Author
rgetz
Date
2009-08-26 10:52:37 -0400 (Wed, 26 Aug 2009)

Log Message

Add workarounds for anomaly 283 which fixes bug [#5430]
'[!no_src_qa!]' - assembly files

Modified Paths

Diff

Modified: branches/2009R1/arch/blackfin/include/asm/entry.h (7236 => 7237)


--- branches/2009R1/arch/blackfin/include/asm/entry.h	2009-08-26 06:06:38 UTC (rev 7236)
+++ branches/2009R1/arch/blackfin/include/asm/entry.h	2009-08-26 14:52:37 UTC (rev 7237)
@@ -61,6 +61,25 @@
     jump __common_int_entry;
 #else /* CONFIG_EXACT_HWERR is defined */
 
+/*
+ * Add workarounds for 283 and 315
+ * If needed, also make sure that 244 is also not caused,
+ * by adding 3 nops at the end, since the next instruction
+ * is going to be a SSYNC
+ */
+
+# if ANOMALY_05000283 || ANOMALY_05000315
+#  define ANOMALY_05000283_WORKAROUND(preg, dreg)	\
+	cc = dreg == dreg;				\
+	preg.h = HI(CHIPID);				\
+	preg.l = LO(CHIPID);				\
+	if cc jump 1f;					\
+	dreg.l = W[preg];				\
+1:	nop; nop; nop;
+#else
+#  define ANOMALY_05000283_WORKAROUND(preg, dreg)
+# endif /* ANOMALY_05000283 || ANOMALY_05000315 */
+
 /* if we want hardware error to be exact, we need to do a SSYNC (which forces
  * read/writes to complete to the memory controllers), and check to see that
  * caused a pending HW error condition. If so, we assume it was caused by user
@@ -75,9 +94,11 @@
     [--sp] = R0;	/*orig_r0*/					\
     [--sp] = (R7:0,P5:0);						\
     R1 = ASTAT;								\
+    ANOMALY_05000283_WORKAROUND(P0, R0)					\
     P0.L = LO(ILAT);							\
     P0.H = HI(ILAT);							\
     SSYNC;								\
+    SSYNC;								\
     R0 = [P0];								\
     CC = BITTST(R0, EVT_IVHW_P);					\
     IF CC JUMP 1f;							\
@@ -98,9 +119,11 @@
     [--sp] = R0;	/*orig_r0*/					\
     [--sp] = (R7:0,P5:0);						\
     R1 = ASTAT;								\
+    ANOMALY_05000283_WORKAROUND(P0, R0)					\
     P0.L = LO(ILAT);							\
     P0.H = HI(ILAT);							\
     SSYNC;								\
+    SSYNC;								\
     R0 = [P0];								\
     CC = BITTST(R0, EVT_IVHW_P);					\
     IF CC JUMP 1f;							\
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to