summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/alpha/isa/isa_dma.c31
-rw-r--r--sys/amd64/isa/isa_dma.c29
-rw-r--r--sys/dev/ic/i8237.h22
-rw-r--r--sys/i386/isa/isa_dma.c29
-rw-r--r--sys/ia64/isa/isa_dma.c31
-rw-r--r--sys/isa/isavar.h17
-rw-r--r--sys/sparc64/isa/isa_dma.c6
7 files changed, 89 insertions, 76 deletions
diff --git a/sys/alpha/isa/isa_dma.c b/sys/alpha/isa/isa_dma.c
index 91ca8bb..1df357a 100644
--- a/sys/alpha/isa/isa_dma.c
+++ b/sys/alpha/isa/isa_dma.c
@@ -60,24 +60,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ic/i8237.h>
#include <machine/bus.h>
-/*
-** Register definitions for DMA controller 1 (channels 0..3):
-*/
-#define DMA1_CHN(c) (IO_DMA1 + 1*(2*(c))) /* addr reg for channel c */
-#define DMA1_SMSK (IO_DMA1 + 1*10) /* single mask register */
-#define DMA1_MODE (IO_DMA1 + 1*11) /* mode register */
-#define DMA1_FFC (IO_DMA1 + 1*12) /* clear first/last FF */
-#define DMA1_RESET (IO_DMA1 + 1*13) /* reset */
-
-/*
-** Register definitions for DMA controller 2 (channels 4..7):
-*/
-#define DMA2_CHN(c) (IO_DMA2 + 2*(2*(c))) /* addr reg for channel c */
-#define DMA2_SMSK (IO_DMA2 + 2*10) /* single mask register */
-#define DMA2_MODE (IO_DMA2 + 2*11) /* mode register */
-#define DMA2_FFC (IO_DMA2 + 2*12) /* clear first/last FF */
-#define DMA2_RESET (IO_DMA2 + 2*13) /* reset */
-
static bus_dma_tag_t dma_tag[8];
static bus_dmamap_t dma_map[8];
static u_int8_t dma_busy = 0; /* Used in isa_dmastart() */
@@ -487,6 +469,19 @@ isa_dmastatus(int chan)
}
/*
+ * Reached terminal count yet ?
+ */
+int
+isa_dmatc(int chan)
+{
+
+ if (chan < 4)
+ return(inb(DMA1_STATUS) & (1 << chan));
+ else
+ return(inb(DMA2_STATUS) & (1 << (chan & 3)));
+}
+
+/*
* Stop a DMA transfer currently in progress.
*/
int
diff --git a/sys/amd64/isa/isa_dma.c b/sys/amd64/isa/isa_dma.c
index 9bd5d01..8404df5 100644
--- a/sys/amd64/isa/isa_dma.c
+++ b/sys/amd64/isa/isa_dma.c
@@ -61,22 +61,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ic/i8237.h>
#include <isa/isavar.h>
-/*
-** Register definitions for DMA controller 1 (channels 0..3):
-*/
-#define DMA1_CHN(c) (IO_DMA1 + 1*(2*(c))) /* addr reg for channel c */
-#define DMA1_SMSK (IO_DMA1 + 1*10) /* single mask register */
-#define DMA1_MODE (IO_DMA1 + 1*11) /* mode register */
-#define DMA1_FFC (IO_DMA1 + 1*12) /* clear first/last FF */
-
-/*
-** Register definitions for DMA controller 2 (channels 4..7):
-*/
-#define DMA2_CHN(c) (IO_DMA2 + 2*(2*(c))) /* addr reg for channel c */
-#define DMA2_SMSK (IO_DMA2 + 2*10) /* single mask register */
-#define DMA2_MODE (IO_DMA2 + 2*11) /* mode register */
-#define DMA2_FFC (IO_DMA2 + 2*12) /* clear first/last FF */
-
#define ISARAM_END 0x1000000
static int isa_dmarangecheck(caddr_t va, u_int length, int chan);
@@ -489,6 +473,19 @@ isa_dmastatus(int chan)
}
/*
+ * Reached terminal count yet ?
+ */
+int
+isa_dmatc(int chan)
+{
+
+ if (chan < 4)
+ return(inb(DMA1_STATUS) & (1 << chan));
+ else
+ return(inb(DMA2_STATUS) & (1 << (chan & 3)));
+}
+
+/*
* Stop a DMA transfer currently in progress.
*/
int
diff --git a/sys/dev/ic/i8237.h b/sys/dev/ic/i8237.h
index 2bc8a08..bdda9fa 100644
--- a/sys/dev/ic/i8237.h
+++ b/sys/dev/ic/i8237.h
@@ -10,3 +10,25 @@
#define DMA37MD_WRITE 0x04 /* read the device, write memory operation */
#define DMA37MD_READ 0x08 /* write the device, read memory operation */
+#ifndef PC98
+/*
+** Register definitions for DMA controller 1 (channels 0..3):
+*/
+#define DMA1_CHN(c) (IO_DMA1 + 1*(2*(c))) /* addr reg for channel c */
+#define DMA1_STATUS (IO_DMA1 + 1*8) /* status register */
+#define DMA1_SMSK (IO_DMA1 + 1*10) /* single mask register */
+#define DMA1_MODE (IO_DMA1 + 1*11) /* mode register */
+#define DMA1_FFC (IO_DMA1 + 1*12) /* clear first/last FF */
+#define DMA1_RESET (IO_DMA1 + 1*13) /* reset */
+
+/*
+** Register definitions for DMA controller 2 (channels 4..7):
+*/
+#define DMA2_CHN(c) (IO_DMA2 + 2*(2*(c))) /* addr reg for channel c */
+#define DMA2_STATUS (IO_DMA2 + 2*8) /* status register */
+#define DMA2_SMSK (IO_DMA2 + 2*10) /* single mask register */
+#define DMA2_MODE (IO_DMA2 + 2*11) /* mode register */
+#define DMA2_FFC (IO_DMA2 + 2*12) /* clear first/last FF */
+#define DMA2_RESET (IO_DMA2 + 2*13) /* reset */
+#endif
+
diff --git a/sys/i386/isa/isa_dma.c b/sys/i386/isa/isa_dma.c
index 1739871..074b7c6 100644
--- a/sys/i386/isa/isa_dma.c
+++ b/sys/i386/isa/isa_dma.c
@@ -61,22 +61,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ic/i8237.h>
#include <isa/isavar.h>
-/*
-** Register definitions for DMA controller 1 (channels 0..3):
-*/
-#define DMA1_CHN(c) (IO_DMA1 + 1*(2*(c))) /* addr reg for channel c */
-#define DMA1_SMSK (IO_DMA1 + 1*10) /* single mask register */
-#define DMA1_MODE (IO_DMA1 + 1*11) /* mode register */
-#define DMA1_FFC (IO_DMA1 + 1*12) /* clear first/last FF */
-
-/*
-** Register definitions for DMA controller 2 (channels 4..7):
-*/
-#define DMA2_CHN(c) (IO_DMA2 + 2*(2*(c))) /* addr reg for channel c */
-#define DMA2_SMSK (IO_DMA2 + 2*10) /* single mask register */
-#define DMA2_MODE (IO_DMA2 + 2*11) /* mode register */
-#define DMA2_FFC (IO_DMA2 + 2*12) /* clear first/last FF */
-
static int isa_dmarangecheck(caddr_t va, u_int length, int chan);
static caddr_t dma_bouncebuf[8];
@@ -488,6 +472,19 @@ isa_dmastatus(int chan)
}
/*
+ * Reached terminal count yet ?
+ */
+int
+isa_dmatc(int chan)
+{
+
+ if (chan < 4)
+ return(inb(DMA1_STATUS) & (1 << chan));
+ else
+ return(inb(DMA2_STATUS) & (1 << (chan & 3)));
+}
+
+/*
* Stop a DMA transfer currently in progress.
*/
int
diff --git a/sys/ia64/isa/isa_dma.c b/sys/ia64/isa/isa_dma.c
index 08ead75..fb7b83c 100644
--- a/sys/ia64/isa/isa_dma.c
+++ b/sys/ia64/isa/isa_dma.c
@@ -58,24 +58,6 @@
#include <dev/ic/i8237.h>
#include <machine/bus.h>
-/*
-** Register definitions for DMA controller 1 (channels 0..3):
-*/
-#define DMA1_CHN(c) (IO_DMA1 + 1*(2*(c))) /* addr reg for channel c */
-#define DMA1_SMSK (IO_DMA1 + 1*10) /* single mask register */
-#define DMA1_MODE (IO_DMA1 + 1*11) /* mode register */
-#define DMA1_FFC (IO_DMA1 + 1*12) /* clear first/last FF */
-#define DMA1_RESET (IO_DMA1 + 1*13) /* reset */
-
-/*
-** Register definitions for DMA controller 2 (channels 4..7):
-*/
-#define DMA2_CHN(c) (IO_DMA2 + 2*(2*(c))) /* addr reg for channel c */
-#define DMA2_SMSK (IO_DMA2 + 2*10) /* single mask register */
-#define DMA2_MODE (IO_DMA2 + 2*11) /* mode register */
-#define DMA2_FFC (IO_DMA2 + 2*12) /* clear first/last FF */
-#define DMA2_RESET (IO_DMA2 + 2*13) /* reset */
-
static bus_dma_tag_t dma_tag[8];
static bus_dmamap_t dma_map[8];
static u_int8_t dma_busy = 0; /* Used in isa_dmastart() */
@@ -490,6 +472,19 @@ isa_dmastatus(int chan)
}
/*
+ * Reached terminal count yet ?
+ */
+int
+isa_dmatc(int chan)
+{
+
+ if (chan < 4)
+ return(inb(DMA1_STATUS) & (1 << chan));
+ else
+ return(inb(DMA2_STATUS) & (1 << (chan & 3)));
+}
+
+/*
* Stop a DMA transfer currently in progress.
*/
int
diff --git a/sys/isa/isavar.h b/sys/isa/isavar.h
index 57fad23..ab87fa3 100644
--- a/sys/isa/isavar.h
+++ b/sys/isa/isavar.h
@@ -159,14 +159,15 @@ extern devclass_t isab_devclass;
extern intrmask_t isa_irq_pending(void);
extern void isa_probe_children(device_t dev);
-extern void isa_dmacascade(int chan);
-extern void isa_dmadone(int flags, caddr_t addr, int nbytes, int chan);
-extern int isa_dma_init(int chan, u_int bouncebufsize, int flag);
-extern void isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan);
-extern int isa_dma_acquire(int chan);
-extern void isa_dma_release(int chan);
-extern int isa_dmastatus(int chan);
-extern int isa_dmastop(int chan);
+void isa_dmacascade(int chan);
+void isa_dmadone(int flags, caddr_t addr, int nbytes, int chan);
+int isa_dma_init(int chan, u_int bouncebufsize, int flag);
+void isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan);
+int isa_dma_acquire(int chan);
+void isa_dma_release(int chan);
+int isa_dmastatus(int chan);
+int isa_dmastop(int chan);
+int isa_dmatc(int chan);
#define isa_dmainit(chan, size) do { \
if (isa_dma_init(chan, size, M_NOWAIT)) \
diff --git a/sys/sparc64/isa/isa_dma.c b/sys/sparc64/isa/isa_dma.c
index 66d93fb..19c4644 100644
--- a/sys/sparc64/isa/isa_dma.c
+++ b/sys/sparc64/isa/isa_dma.c
@@ -84,6 +84,12 @@ isa_dmastatus(int chan)
}
int
+isa_dmatc(int chan)
+{
+ return (0);
+}
+
+int
isa_dmastop(int chan)
{
return (0);
OpenPOWER on IntegriCloud