patch-2.3.50 linux/arch/sparc64/kernel/smp.c
Next file: linux/arch/sparc64/kernel/sys_sparc32.c
Previous file: linux/arch/sparc64/kernel/setup.c
Back to the patch index
Back to the overall index
- Lines: 29
- Date:
Tue Mar 7 11:10:54 2000
- Orig file:
v2.3.49/linux/arch/sparc64/kernel/smp.c
- Orig date:
Thu Mar 2 14:36:22 2000
diff -u --recursive --new-file v2.3.49/linux/arch/sparc64/kernel/smp.c linux/arch/sparc64/kernel/smp.c
@@ -312,6 +312,13 @@
smp_processor_id(), data0, data1, data2, target);
#endif
again:
+ /* Ok, this is the real Spitfire Errata #54.
+ * One must read back from a UDB internal register
+ * after writes to the UDB interrupt dispatch, but
+ * before the membar Sync for that write.
+ * So we use the high UDB control register (ASI 0x7f,
+ * ADDR 0x20) for the dummy read. -DaveM
+ */
tmp = 0x40;
__asm__ __volatile__("
wrpr %1, %2, %%pstate
@@ -321,10 +328,13 @@
stxa %6, [%0+%8] %3
membar #Sync
stxa %%g0, [%7] %3
+ mov 0x20, %%g1
+ ldxa [%%g1] 0x7f, %%g0
membar #Sync"
: "=r" (tmp)
: "r" (pstate), "i" (PSTATE_IE), "i" (ASI_UDB_INTR_W),
- "r" (data0), "r" (data1), "r" (data2), "r" (target), "r" (0x10), "0" (tmp));
+ "r" (data0), "r" (data1), "r" (data2), "r" (target), "r" (0x10), "0" (tmp)
+ : "g1");
/* NOTE: PSTATE_IE is still clear. */
stuck = 100000;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)