Module Name: src
Committed By: phx
Date: Fri Feb 5 12:13:36 UTC 2010
Modified Files:
src/sys/arch/amiga/amiga: device.h
src/sys/arch/amiga/dev: ahsc.c atzsc.c cbiiisc.c grf_cv.c grf_cvreg.h
gtsc.c sbic.c sbicreg.h siop2.c
Log Message:
Added two new macros to device.h:
amiga_membarrier() enforces a reorder protection on memory read/writes.
amiga_cpu_sync() makes sure the instruction pipelines are flushed.
Both macros may be used in all amiga device drivers for compatibility with
amigappc. For the start I fixed some SCSI drivers.
cbiiisc and ahsc were tested and seem to work really fast with DMA now.
Some stability problems with amigappc remain nevertheless (spontaneous
kernel DSI traps with high CPU/SCSI load).
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/amiga/amiga/device.h
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/amiga/dev/ahsc.c
cvs rdiff -u -r1.39 -r1.40 src/sys/arch/amiga/dev/atzsc.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/amiga/dev/cbiiisc.c
cvs rdiff -u -r1.50 -r1.51 src/sys/arch/amiga/dev/grf_cv.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/amiga/dev/grf_cvreg.h
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/amiga/dev/gtsc.c
cvs rdiff -u -r1.65 -r1.66 src/sys/arch/amiga/dev/sbic.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/amiga/dev/sbicreg.h
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/amiga/dev/siop2.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amiga/amiga/device.h
diff -u src/sys/arch/amiga/amiga/device.h:1.11 src/sys/arch/amiga/amiga/device.h:1.12
--- src/sys/arch/amiga/amiga/device.h:1.11 Wed Jun 11 12:59:10 2008
+++ src/sys/arch/amiga/amiga/device.h Fri Feb 5 12:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: device.h,v 1.11 2008/06/11 12:59:10 tsutsui Exp $ */
+/* $NetBSD: device.h,v 1.12 2010/02/05 12:13:36 phx Exp $ */
/*
* Copyright (c) 1994 Christian E. Hopps
@@ -49,4 +49,22 @@
#define getsoftc(cdnam, unit) device_lookup_private(&(cdnam), (unit))
+/*
+ * Reorder protection when accessing device registers.
+ */
+#if defined(__m68k__)
+#define amiga_membarrier()
+#elif defined(__powerpc__)
+#define amiga_membarrier() __asm volatile ("eieio")
+#endif
+
+/*
+ * Finish all bus operations and flush pipelines.
+ */
+#if defined(__m68k__)
+#define amiga_cpu_sync() __asm volatile ("nop")
+#elif defined(__powerpc__)
+#define amiga_cpu_sync() __asm volatile ("sync; isync")
+#endif
+
#endif /* _AMIGA_DEVICE_H_ */
Index: src/sys/arch/amiga/dev/ahsc.c
diff -u src/sys/arch/amiga/dev/ahsc.c:1.36 src/sys/arch/amiga/dev/ahsc.c:1.37
--- src/sys/arch/amiga/dev/ahsc.c:1.36 Fri Jun 13 08:13:37 2008
+++ src/sys/arch/amiga/dev/ahsc.c Fri Feb 5 12:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: ahsc.c,v 1.36 2008/06/13 08:13:37 cegger Exp $ */
+/* $NetBSD: ahsc.c,v 1.37 2010/02/05 12:13:36 phx Exp $ */
/*
* Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ahsc.c,v 1.36 2008/06/13 08:13:37 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ahsc.c,v 1.37 2010/02/05 12:13:36 phx Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -144,7 +144,9 @@
* disable ints and reset bank register
*/
rp->CNTR = CNTR_PDMD;
+ amiga_membarrier();
rp->DAWR = DAWR_AHSC;
+ amiga_membarrier();
sc->sc_enintr = ahsc_enintr;
sc->sc_dmago = ahsc_dmago;
sc->sc_dmanext = ahsc_dmanext;
@@ -212,6 +214,7 @@
dev->sc_flags |= SBICF_INTR;
sdp->CNTR = CNTR_PDMD | CNTR_INTEN;
+ amiga_membarrier();
}
int
@@ -233,8 +236,11 @@
dev->sc_flags |= SBICF_INTR;
sdp->CNTR = dev->sc_dmacmd;
+ amiga_membarrier();
sdp->ACR = (u_int) dev->sc_cur->dc_addr;
+ amiga_membarrier();
sdp->ST_DMA = 1;
+ amiga_membarrier();
return(dev->sc_tcnt);
}
@@ -244,6 +250,7 @@
{
volatile struct sdmac *sdp;
int s;
+ vu_short istr;
sdp = dev->sc_cregs;
@@ -259,14 +266,19 @@
* and reading from peripheral
*/
sdp->FLUSH = 1;
- while ((sdp->ISTR & ISTR_FE_FLG) == 0)
- ;
+ amiga_membarrier();
+ do {
+ istr = sdp->ISTR;
+ amiga_membarrier();
+ } while ((istr & ISTR_FE_FLG) == 0);
}
/*
* clear possible interrupt and stop DMA
*/
sdp->CINT = 1;
+ amiga_membarrier();
sdp->SP_DMA = 1;
+ amiga_membarrier();
dev->sc_dmacmd = 0;
splx(s);
}
@@ -281,6 +293,7 @@
sdp = dev->sc_cregs;
stat = sdp->ISTR;
+ amiga_membarrier();
if ((stat & (ISTR_INT_F|ISTR_INT_P)) == 0)
return (0);
@@ -300,6 +313,7 @@
++found;
sdp->CINT = 1; /* clear possible interrupt */
+ amiga_membarrier();
/*
* check for SCSI ints in the same go and
@@ -317,6 +331,7 @@
ahsc_dmanext(struct sbic_softc *dev)
{
volatile struct sdmac *sdp;
+ vu_short istr;
sdp = dev->sc_cregs;
@@ -332,17 +347,25 @@
* and reading from peripheral
*/
sdp->FLUSH = 1;
- while ((sdp->ISTR & ISTR_FE_FLG) == 0)
- ;
+ amiga_membarrier();
+ do {
+ istr = sdp->ISTR;
+ amiga_membarrier();
+ } while ((istr & ISTR_FE_FLG) == 0);
}
/*
* clear possible interrupt and stop DMA
*/
sdp->CINT = 1; /* clear possible interrupt */
+ amiga_membarrier();
sdp->SP_DMA = 1; /* stop DMA */
+ amiga_membarrier();
sdp->CNTR = dev->sc_dmacmd;
+ amiga_membarrier();
sdp->ACR = (u_int)dev->sc_cur->dc_addr;
+ amiga_membarrier();
sdp->ST_DMA = 1;
+ amiga_membarrier();
dev->sc_tcnt = dev->sc_cur->dc_count << 1;
return(dev->sc_tcnt);
Index: src/sys/arch/amiga/dev/atzsc.c
diff -u src/sys/arch/amiga/dev/atzsc.c:1.39 src/sys/arch/amiga/dev/atzsc.c:1.40
--- src/sys/arch/amiga/dev/atzsc.c:1.39 Fri Oct 16 09:36:35 2009
+++ src/sys/arch/amiga/dev/atzsc.c Fri Feb 5 12:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: atzsc.c,v 1.39 2009/10/16 09:36:35 phx Exp $ */
+/* $NetBSD: atzsc.c,v 1.40 2010/02/05 12:13:36 phx Exp $ */
/*
* Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: atzsc.c,v 1.39 2009/10/16 09:36:35 phx Exp $");
+__KERNEL_RCSID(0, "$NetBSD: atzsc.c,v 1.40 2010/02/05 12:13:36 phx Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -107,7 +107,7 @@
atzscmatch, atzscattach, NULL, NULL);
/*
- * if we are an A3000 we are here.
+ * if we are a A2091 SCSI
*/
int
atzscmatch(struct device *pdp, struct cfdata *cfp, void *auxp)
@@ -142,7 +142,9 @@
* disable ints and reset bank register
*/
rp->CNTR = CNTR_PDMD;
+ amiga_membarrier();
rp->DAWR = DAWR_ATZSC;
+ amiga_membarrier();
sc->sc_enintr = atzsc_enintr;
sc->sc_dmago = atzsc_dmago;
sc->sc_dmanext = atzsc_dmanext;
@@ -219,12 +221,14 @@
dev->sc_flags |= SBICF_INTR;
sdp->CNTR = CNTR_PDMD | CNTR_INTEN;
+ amiga_membarrier();
}
int
atzsc_dmago(struct sbic_softc *dev, char *addr, int count, int flags)
{
volatile struct sdmac *sdp;
+ vu_short istr;
sdp = dev->sc_cregs;
/*
@@ -240,8 +244,11 @@
dev->sc_flags |= SBICF_INTR;
sdp->CNTR = dev->sc_dmacmd;
+ amiga_membarrier();
sdp->ACR = (u_int) dev->sc_cur->dc_addr;
+ amiga_membarrier();
sdp->ST_DMA = 1;
+ amiga_membarrier();
return(dev->sc_tcnt);
}
@@ -251,6 +258,7 @@
{
volatile struct sdmac *sdp;
int s;
+ vu_short istr;
sdp = dev->sc_cregs;
@@ -266,14 +274,19 @@
* and reading from peripheral
*/
sdp->FLUSH = 1;
- while ((sdp->ISTR & ISTR_FE_FLG) == 0)
- ;
+ amiga_membarrier();
+ do {
+ istr = sdp->ISTR;
+ amiga_membarrier();
+ } while ((istr & ISTR_FE_FLG) == 0);
}
/*
* clear possible interrupt and stop DMA
*/
sdp->CINT = 1;
+ amiga_membarrier();
sdp->SP_DMA = 1;
+ amiga_membarrier();
dev->sc_dmacmd = 0;
splx(s);
}
@@ -307,6 +320,7 @@
found++;
sdp->CINT = 1; /* clear possible interrupt */
+ amiga_membarrier();
/*
* check for SCSI ints in the same go and
@@ -324,6 +338,7 @@
atzsc_dmanext(struct sbic_softc *dev)
{
volatile struct sdmac *sdp;
+ vu_short istr;
sdp = dev->sc_cregs;
@@ -339,17 +354,25 @@
* and reading from peripheral
*/
sdp->FLUSH = 1;
- while ((sdp->ISTR & ISTR_FE_FLG) == 0)
- ;
+ amiga_membarrier();
+ do {
+ istr = sdp->ISTR;
+ amiga_membarrier();
+ } while ((istr & ISTR_FE_FLG) == 0);
}
/*
* clear possible interrupt and stop DMA
*/
sdp->CINT = 1; /* clear possible interrupt */
+ amiga_membarrier();
sdp->SP_DMA = 1; /* stop DMA */
+ amiga_membarrier();
sdp->CNTR = dev->sc_dmacmd;
+ amiga_membarrier();
sdp->ACR = (u_int)dev->sc_cur->dc_addr;
+ amiga_membarrier();
sdp->ST_DMA = 1;
+ amiga_membarrier();
dev->sc_tcnt = dev->sc_cur->dc_count << 1;
return(dev->sc_tcnt);
Index: src/sys/arch/amiga/dev/cbiiisc.c
diff -u src/sys/arch/amiga/dev/cbiiisc.c:1.17 src/sys/arch/amiga/dev/cbiiisc.c:1.18
--- src/sys/arch/amiga/dev/cbiiisc.c:1.17 Fri Jan 9 19:37:37 2009
+++ src/sys/arch/amiga/dev/cbiiisc.c Fri Feb 5 12:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: cbiiisc.c,v 1.17 2009/01/09 19:37:37 mhitch Exp $ */
+/* $NetBSD: cbiiisc.c,v 1.18 2010/02/05 12:13:36 phx Exp $ */
/*
* Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cbiiisc.c,v 1.17 2009/01/09 19:37:37 mhitch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cbiiisc.c,v 1.18 2010/02/05 12:13:36 phx Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -179,6 +179,7 @@
if (sc->sc_flags & SIOP_INTSOFF)
return (0); /* interrupts are not active */
rp = sc->sc_siopp;
+ amiga_membarrier();
istat = rp->siop_istat;
if ((istat & (SIOP_ISTAT_SIP | SIOP_ISTAT_DIP)) == 0)
return(0);
@@ -189,6 +190,7 @@
sc->sc_sist = rp->siop_sist;
sc->sc_istat = istat;
sc->sc_dstat = rp->siop_dstat;
+ amiga_membarrier();
siopngintr(sc);
return(1);
}
Index: src/sys/arch/amiga/dev/grf_cv.c
diff -u src/sys/arch/amiga/dev/grf_cv.c:1.50 src/sys/arch/amiga/dev/grf_cv.c:1.51
--- src/sys/arch/amiga/dev/grf_cv.c:1.50 Sun Jan 31 19:56:19 2010
+++ src/sys/arch/amiga/dev/grf_cv.c Fri Feb 5 12:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: grf_cv.c,v 1.50 2010/01/31 19:56:19 phx Exp $ */
+/* $NetBSD: grf_cv.c,v 1.51 2010/02/05 12:13:36 phx Exp $ */
/*
* Copyright (c) 1995 Michael Teske
@@ -33,7 +33,7 @@
#include "opt_amigacons.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: grf_cv.c,v 1.50 2010/01/31 19:56:19 phx Exp $");
+__KERNEL_RCSID(0, "$NetBSD: grf_cv.c,v 1.51 2010/02/05 12:13:36 phx Exp $");
#include "grfcv.h"
#if NGRFCV > 0
@@ -336,7 +336,7 @@
/* Restore the old CR index */
vgaw(ba, CRT_ADDRESS, cridx);
- cpu_sync();
+ amiga_cpu_sync();
#endif /* !CV_NO_HARDWARE_CURSOR */
return (1);
}
@@ -358,7 +358,7 @@
testfbw = (volatile unsigned long *)fb;
testfbr = (volatile unsigned long *)((volatile char*)fb + 0x02000000);
*testfbw = 0x87654321;
- cpu_sync();
+ amiga_cpu_sync();
if (*testfbr != 0x87654321)
return (0);
@@ -366,15 +366,15 @@
testfbw = (volatile unsigned long *)((volatile char*)fb + 0x00200000);
testfbr = (volatile unsigned long *)((volatile char*)fb + 0x02200000);
*testfbw = 0x87654321;
- cpu_sync();
+ amiga_cpu_sync();
if (*testfbr != 0x87654321)
return (0);
*testfbw = 0xAAAAAAAA;
- cpu_sync();
+ amiga_cpu_sync();
if (*testfbr != 0xAAAAAAAA)
return (0);
*testfbw = 0x55555555;
- cpu_sync();
+ amiga_cpu_sync();
if (*testfbr != 0x55555555)
return (0);
return (1);
@@ -1850,7 +1850,7 @@
/* reset colour stack */
#if !defined(__m68k__)
test = RCrt(ba, CRT_ID_HWGC_MODE);
- cpu_sync();
+ amiga_cpu_sync();
#else
/* do it in assembler, the above does't seem to work */
__asm volatile ("moveb #0x45, %1@(0x3d4); \
@@ -1865,7 +1865,7 @@
#if !defined(__m68k__)
test = RCrt(ba, CRT_ID_HWGC_MODE);
- cpu_sync();
+ amiga_cpu_sync();
#else
/* do it in assembler, the above does't seem to work */
__asm volatile ("moveb #0x45, %1@(0x3d4); \
@@ -2107,7 +2107,7 @@
/* reset colour stack */
test = RCrt(ba, CRT_ID_HWGC_MODE);
- cpu_sync();
+ amiga_cpu_sync();
switch (depth) {
case 8:
case 15:
@@ -2126,7 +2126,7 @@
}
test = RCrt(ba, CRT_ID_HWGC_MODE);
- cpu_sync();
+ amiga_cpu_sync();
switch (depth) {
case 8:
WCrt (ba, CRT_ID_HWGC_BG_STACK, 1);
Index: src/sys/arch/amiga/dev/grf_cvreg.h
diff -u src/sys/arch/amiga/dev/grf_cvreg.h:1.14 src/sys/arch/amiga/dev/grf_cvreg.h:1.15
--- src/sys/arch/amiga/dev/grf_cvreg.h:1.14 Sun Jan 31 19:56:19 2010
+++ src/sys/arch/amiga/dev/grf_cvreg.h Fri Feb 5 12:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: grf_cvreg.h,v 1.14 2010/01/31 19:56:19 phx Exp $ */
+/* $NetBSD: grf_cvreg.h,v 1.15 2010/02/05 12:13:36 phx Exp $ */
/*
* Copyright (c) 1995 Michael Teske
@@ -59,26 +59,15 @@
#define MAXROWS 200
#define MAXCOLS 200
-/*
- * macros for
- * finishing all bus operations and flush pipelines: cpu_sync()
- * barrier to ensure in order execution: barrier()
- */
-#if defined(__m68k__)
-#define cpu_sync() __asm volatile ("nop")
-#define barrier()
-#elif defined(__powerpc__)
-#define cpu_sync() __asm volatile ("sync; isync")
-#define barrier() __asm volatile ("eieio")
-#endif
/* read VGA register */
-#define vgar(ba, reg) (*(((volatile char *)ba)+reg))
+#define vgar(ba, reg) \
+ (*(((volatile char *)ba)+reg))
/* write VGA register */
#define vgaw(ba, reg, val) \
- *(((volatile char *)ba)+reg) = ((val) & 0xff); barrier()
-
+ *(((volatile char *)ba)+reg) = ((val) & 0xff); \
+ amiga_membarrier()
/* read 32 Bit VGA register */
#define vgar32(ba, reg) \
@@ -86,7 +75,8 @@
/* write 32 Bit VGA register */
#define vgaw32(ba, reg, val) \
- *((unsigned long *) (((volatile char *)ba)+reg)) = val; barrier()
+ *((unsigned long *) (((volatile char *)ba)+reg)) = val; \
+ amiga_membarrier()
/* read 16 Bit VGA register */
#define vgar16(ba, reg) \
@@ -94,7 +84,8 @@
/* write 16 Bit VGA register */
#define vgaw16(ba, reg, val) \
- *((volatile unsigned short *) (((volatile char *)ba)+reg)) = val; barrier()
+ *((volatile unsigned short *) (((volatile char *)ba)+reg)) = val; \
+ amiga_membarrier()
#ifdef _KERNEL
int grfcv_cnprobe(void);
@@ -387,7 +378,7 @@
do {
test = vgar16 (ba, ECR_GP_STAT);
- cpu_sync();
+ amiga_cpu_sync();
} while (test & (1 << 9));
}
Index: src/sys/arch/amiga/dev/gtsc.c
diff -u src/sys/arch/amiga/dev/gtsc.c:1.38 src/sys/arch/amiga/dev/gtsc.c:1.39
--- src/sys/arch/amiga/dev/gtsc.c:1.38 Fri Jun 13 08:13:37 2008
+++ src/sys/arch/amiga/dev/gtsc.c Fri Feb 5 12:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: gtsc.c,v 1.38 2008/06/13 08:13:37 cegger Exp $ */
+/* $NetBSD: gtsc.c,v 1.39 2010/02/05 12:13:36 phx Exp $ */
/*
* Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gtsc.c,v 1.38 2008/06/13 08:13:37 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gtsc.c,v 1.39 2010/02/05 12:13:36 phx Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -142,8 +142,11 @@
* disable ints and reset bank register
*/
rp->CNTR = 0;
- if ((gap->flags & GVP_NOBANK) == 0)
+ amiga_membarrier();
+ if ((gap->flags & GVP_NOBANK) == 0) {
rp->bank = 0;
+ amiga_membarrier();
+ }
sc->sc_dmago = gtsc_dmago;
sc->sc_enintr = gtsc_enintr;
@@ -196,6 +199,7 @@
sc->sc_sbic.sbic_asr_p = (volatile unsigned char *)rp + 0x61;
sc->sc_sbic.sbic_value_p = (volatile unsigned char *)rp + 0x63;
+ amiga_membarrier();
sc->sc_clkfreq = gtsc_clock_override ? gtsc_clock_override :
((gap->flags & GVP_14MHZ) ? 143 : 72);
@@ -245,6 +249,7 @@
dev->sc_flags |= SBICF_INTR;
sdp->CNTR = GVP_CNTR_INTEN;
+ amiga_membarrier();
}
int
@@ -266,6 +271,7 @@
#endif
dev->sc_flags |= SBICF_INTR;
sdp->CNTR = dev->sc_dmacmd;
+ amiga_membarrier();
if((u_int)dev->sc_cur->dc_addr & dev->sc_dmamask) {
#if 1
printf("gtsc_dmago: pa %p->%lx dmacmd %x",
@@ -276,10 +282,14 @@
sdp->ACR = 0x00f80000; /***********************************/
} else
sdp->ACR = (u_int) dev->sc_cur->dc_addr;
- if (dev->gtsc_bankmask)
+ amiga_membarrier();
+ if (dev->gtsc_bankmask) {
sdp->bank =
dev->gtsc_bankmask & (((u_int)dev->sc_cur->dc_addr) >> 18);
+ amiga_membarrier();
+ }
sdp->ST_DMA = 1;
+ amiga_membarrier();
/*
* restrict transfer count to maximum
@@ -311,7 +321,9 @@
*/
s = splbio();
sdp->CNTR &= ~GVP_CNTR_INT_P;
+ amiga_membarrier();
sdp->SP_DMA = 1;
+ amiga_membarrier();
dev->sc_dmacmd = 0;
splx(s);
}
@@ -326,6 +338,7 @@
sdp = dev->sc_cregs;
stat = sdp->CNTR;
+ amiga_membarrier();
if ((stat & GVP_CNTR_INT_P) == 0)
return (0);
#ifdef DEBUG
@@ -356,14 +369,21 @@
* clear possible interrupt and stop DMA
*/
sdp->CNTR &= ~GVP_CNTR_INT_P;
+ amiga_membarrier();
sdp->SP_DMA = 1;
+ amiga_membarrier();
sdp->CNTR = dev->sc_dmacmd;
+ amiga_membarrier();
sdp->ACR = (u_int) dev->sc_cur->dc_addr;
- if (dev->gtsc_bankmask)
+ amiga_membarrier();
+ if (dev->gtsc_bankmask) {
sdp->bank =
dev->gtsc_bankmask & ((u_int)dev->sc_cur->dc_addr >> 18);
+ amiga_membarrier();
+ }
sdp->ST_DMA = 1;
+ amiga_membarrier();
dev->sc_tcnt = dev->sc_cur->dc_count << 1;
if (dev->sc_tcnt > gtsc_maxdma)
Index: src/sys/arch/amiga/dev/sbic.c
diff -u src/sys/arch/amiga/dev/sbic.c:1.65 src/sys/arch/amiga/dev/sbic.c:1.66
--- src/sys/arch/amiga/dev/sbic.c:1.65 Mon Oct 26 19:16:54 2009
+++ src/sys/arch/amiga/dev/sbic.c Fri Feb 5 12:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: sbic.c,v 1.65 2009/10/26 19:16:54 cegger Exp $ */
+/* $NetBSD: sbic.c,v 1.66 2010/02/05 12:13:36 phx Exp $ */
/*
* Copyright (c) 1990 The Regents of the University of California.
@@ -78,7 +78,7 @@
#include "opt_ddb.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sbic.c,v 1.65 2009/10/26 19:16:54 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sbic.c,v 1.66 2010/02/05 12:13:36 phx Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1747,6 +1747,9 @@
dev->sc_flags |= SBICF_DCFLUSH;
}
#endif
+#ifdef __powerpc__
+ dma_cachectl(addr, count);
+#endif
/*
* enintr() also enables interrupts for the sbic
Index: src/sys/arch/amiga/dev/sbicreg.h
diff -u src/sys/arch/amiga/dev/sbicreg.h:1.7 src/sys/arch/amiga/dev/sbicreg.h:1.8
--- src/sys/arch/amiga/dev/sbicreg.h:1.7 Sun May 14 21:55:09 2006
+++ src/sys/arch/amiga/dev/sbicreg.h Fri Feb 5 12:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: sbicreg.h,v 1.7 2006/05/14 21:55:09 elad Exp $ */
+/* $NetBSD: sbicreg.h,v 1.8 2010/02/05 12:13:36 phx Exp $ */
/*
* Copyright (c) 1990 The Regents of the University of California.
@@ -314,12 +314,16 @@
#define sbic_read_reg(regs,regno,val) do { \
*((regs).sbic_address_p) = (regno); \
+ amiga_membarrier(); \
(val) = *((regs).sbic_value_p); \
+ amiga_membarrier(); \
} while (0)
#define sbic_write_reg(regs,regno,val) do { \
*((regs).sbic_address_p) = (regno); \
+ amiga_membarrier(); \
*((regs).sbic_value_p) = (val); \
+ amiga_membarrier(); \
} while (0)
#define SET_SBIC_myid(regs,val) sbic_write_reg(regs,SBIC_myid,val)
Index: src/sys/arch/amiga/dev/siop2.c
diff -u src/sys/arch/amiga/dev/siop2.c:1.37 src/sys/arch/amiga/dev/siop2.c:1.38
--- src/sys/arch/amiga/dev/siop2.c:1.37 Fri Jan 29 19:56:41 2010
+++ src/sys/arch/amiga/dev/siop2.c Fri Feb 5 12:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: siop2.c,v 1.37 2010/01/29 19:56:41 phx Exp $ */
+/* $NetBSD: siop2.c,v 1.38 2010/02/05 12:13:36 phx Exp $ */
/*
* Copyright (c) 1990 The Regents of the University of California.
@@ -70,7 +70,7 @@
#include "opt_ddb.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: siop2.c,v 1.37 2010/01/29 19:56:41 phx Exp $");
+__KERNEL_RCSID(0, "$NetBSD: siop2.c,v 1.38 2010/02/05 12:13:36 phx Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -90,9 +90,10 @@
#ifdef __m68k__
#include <m68k/include/cacheops.h>
#else
-#define DCIAS(pa)
+#define DCIAS(pa) dma_cachectl((void *)(pa), 1)
#endif
#include <amiga/amiga/custom.h>
+#include <amiga/amiga/device.h>
#include <amiga/amiga/isr.h>
#define ARCH_720
@@ -940,8 +941,11 @@
#ifndef FIXME
rp->siop_scntl3 = sc->sc_sync[target].scntl3;
#endif
+ amiga_membarrier();
rp->siop_dsa = kvtop((void *)&acb->ds);
+ amiga_membarrier();
rp->siop_dsp = sc->sc_scriptspa;
+ amiga_membarrier();
SIOP_TRACE('s',1,0,0)
} else {
if ((rp->siop_istat & SIOP_ISTAT_CON) == 0) {
@@ -1086,12 +1090,15 @@
acb->msg[4]);
}
rp->siop_scntl3 = sc->sc_sync[target].scntl3;
+ amiga_membarrier();
if (sc->sc_sync[target].state == NEG_WAITW) {
sc->sc_sync[target].state = NEG_SYNC;
rp->siop_dsp = sc->sc_scriptspa + Ent_clear_ack;
+ amiga_membarrier();
return(0);
}
rp->siop_dcntl |= SIOP_DCNTL_STD;
+ amiga_membarrier();
sc->sc_sync[target].state = NEG_SYNC;
return (0);
}
@@ -1139,12 +1146,15 @@
}
rp->siop_sxfer = sc->sc_sync[target].sxfer;
rp->siop_scntl3 = sc->sc_sync[target].scntl3;
+ amiga_membarrier();
if (sc->sc_sync[target].state == NEG_WAITS) {
sc->sc_sync[target].state = NEG_DONE;
rp->siop_dsp = sc->sc_scriptspa + Ent_clear_ack;
+ amiga_membarrier();
return(0);
}
rp->siop_dcntl |= SIOP_DCNTL_STD;
+ amiga_membarrier();
sc->sc_sync[target].state = NEG_DONE;
return (0);
}
@@ -1212,6 +1222,7 @@
case 6: /* message in */
case 7: /* message out */
rp->siop_dsp = sc->sc_scriptspa + Ent_switch;
+ amiga_membarrier();
break;
default:
goto bad_phase;
@@ -1232,8 +1243,10 @@
printf ("Yikes, it's not busy now!\n");
#if 0
*status = -1;
- if (sc->nexus_list.tqh_first)
+ if (sc->nexus_list.tqh_first) {
rp->siop_dsp = sc->sc_scriptspa + Ent_wait_reselect;
+ amiga_membarrier();
+ }
return 1;
#endif
}
@@ -1246,8 +1259,10 @@
#endif
*status = -1;
acb->xs->error = XS_SELTIMEOUT;
- if (sc->nexus_list.tqh_first)
+ if (sc->nexus_list.tqh_first) {
rp->siop_dsp = sc->sc_scriptspa + Ent_wait_reselect;
+ amiga_membarrier();
+ }
return 1;
}
if (acb)
@@ -1268,8 +1283,10 @@
siopngabort (sc, rp, "siopngchkintr");
#endif
*status = STS_BUSY;
- if (sc->nexus_list.tqh_first)
+ if (sc->nexus_list.tqh_first) {
rp->siop_dsp = sc->sc_scriptspa + Ent_wait_reselect;
+ amiga_membarrier();
+ }
return (acb != NULL);
}
if (dstat & SIOP_DSTAT_SIR && (rp->siop_dsps == 0xff01 ||
@@ -1390,8 +1407,10 @@
TAILQ_INSERT_HEAD(&sc->nexus_list, acb, chain);
sc->sc_nexus = NULL; /* no current device */
/* start script to wait for reselect */
- if (sc->sc_nexus == NULL)
+ if (sc->sc_nexus == NULL) {
rp->siop_dsp = sc->sc_scriptspa + Ent_wait_reselect;
+ amiga_membarrier();
+ }
/* XXXX start another command ? */
if (sc->ready_list.tqh_first)
siopng_sched(sc);
@@ -1441,11 +1460,13 @@
acb->status = 0;
DCIAS(kvtop(&acb->stat[0]));
rp->siop_dsa = kvtop((void *)&acb->ds);
+ amiga_membarrier();
rp->siop_sxfer =
sc->sc_sync[acb->xs->xs_periph->periph_target].sxfer;
#ifndef FIXME
rp->siop_scntl3 =
sc->sc_sync[acb->xs->xs_periph->periph_target].scntl3;
+ amiga_membarrier();
#endif
break;
}
@@ -1458,6 +1479,7 @@
dma_cachectl ((void *)acb, sizeof(*acb));
rp->siop_temp = 0;
rp->siop_dcntl |= SIOP_DCNTL_STD;
+ amiga_membarrier();
return (0);
}
if (dstat & SIOP_DSTAT_SIR && rp->siop_dsps == 0xff04) {
@@ -1489,11 +1511,14 @@
target = sc->sc_nexus->xs->xs_periph->periph_target;
rp->siop_temp = 0;
rp->siop_dsa = kvtop((void *)&sc->sc_nexus->ds);
+ amiga_membarrier();
rp->siop_sxfer = sc->sc_sync[target].sxfer;
#ifndef FIXME
rp->siop_scntl3 = sc->sc_sync[target].scntl3;
+ amiga_membarrier();
#endif
rp->siop_dsp = sc->sc_scriptspa;
+ amiga_membarrier();
return (0);
}
if (dstat & SIOP_DSTAT_SIR && rp->siop_dsps == 0xff06) {
@@ -1507,6 +1532,7 @@
/* what should be done here? */
DCIAS(kvtop(&acb->msg[1]));
rp->siop_dsp = sc->sc_scriptspa + Ent_clear_ack;
+ amiga_membarrier();
return (0);
}
if (dstat & SIOP_DSTAT_SIR && rp->siop_dsps == 0xff0a) {