summaryrefslogtreecommitdiffstats
path: root/sys/powerpc/powermac
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2008-09-23 02:12:47 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2008-09-23 02:12:47 +0000
commit4c77244de081407f9c0ca3df71360f80e6a0edd2 (patch)
treec455aad037341a9253ffbfdee47dc3338ecbc2ca /sys/powerpc/powermac
parent3c671d9bb6a8e709ab8fd0a8e3b874acf6ea4fac (diff)
downloadFreeBSD-src-4c77244de081407f9c0ca3df71360f80e6a0edd2.zip
FreeBSD-src-4c77244de081407f9c0ca3df71360f80e6a0edd2.tar.gz
Change the DBDMA API to allow DBDMA registers in a subregion of a resource. This is necessary to allow future support of DMA for the various Apple on-board ATA controllers.
MFC after: 1 week
Diffstat (limited to 'sys/powerpc/powermac')
-rw-r--r--sys/powerpc/powermac/dbdma.c14
-rw-r--r--sys/powerpc/powermac/dbdmavar.h5
2 files changed, 11 insertions, 8 deletions
diff --git a/sys/powerpc/powermac/dbdma.c b/sys/powerpc/powermac/dbdma.c
index 71bf417..edae6e2 100644
--- a/sys/powerpc/powermac/dbdma.c
+++ b/sys/powerpc/powermac/dbdma.c
@@ -56,8 +56,8 @@ dbdma_phys_callback(void *chan, bus_dma_segment_t *segs, int nsegs, int error)
}
int
-dbdma_allocate_channel(struct resource *dbdma_regs, bus_dma_tag_t parent_dma,
- int slots, dbdma_channel_t **chan)
+dbdma_allocate_channel(struct resource *dbdma_regs, u_int offset,
+ bus_dma_tag_t parent_dma, int slots, dbdma_channel_t **chan)
{
int error = 0;
dbdma_channel_t *channel;
@@ -65,8 +65,8 @@ dbdma_allocate_channel(struct resource *dbdma_regs, bus_dma_tag_t parent_dma,
channel = *chan = malloc(sizeof(struct dbdma_channel), M_DBDMA,
M_WAITOK | M_ZERO);
- channel->sc_bt = rman_get_bustag(dbdma_regs);
- channel->sc_bh = rman_get_bushandle(dbdma_regs);
+ channel->sc_regs = dbdma_regs;
+ channel->sc_off = offset;
dbdma_stop(channel);
channel->sc_slots_pa = 0;
@@ -82,6 +82,8 @@ dbdma_allocate_channel(struct resource *dbdma_regs, bus_dma_tag_t parent_dma,
error = bus_dmamap_load(channel->sc_dmatag, channel->sc_dmamap,
channel->sc_slots, PAGE_SIZE, dbdma_phys_callback, channel, 0);
+ dbdma_write_reg(channel, CHAN_CMDPTR_HI, 0);
+
channel->sc_nslots = slots;
return (error);
@@ -320,12 +322,12 @@ static uint32_t
dbdma_read_reg(dbdma_channel_t *chan, u_int offset)
{
- return (bus_space_read_4(chan->sc_bt, chan->sc_bh, offset));
+ return (bus_read_4(chan->sc_regs, chan->sc_off + offset));
}
static void
dbdma_write_reg(dbdma_channel_t *chan, u_int offset, uint32_t val)
{
- bus_space_write_4(chan->sc_bt, chan->sc_bh, offset, val);
+ bus_write_4(chan->sc_regs, chan->sc_off + offset, val);
}
diff --git a/sys/powerpc/powermac/dbdmavar.h b/sys/powerpc/powermac/dbdmavar.h
index c69da13..88c3185 100644
--- a/sys/powerpc/powermac/dbdmavar.h
+++ b/sys/powerpc/powermac/dbdmavar.h
@@ -51,8 +51,8 @@ struct dbdma_command {
};
struct dbdma_channel {
- bus_space_tag_t sc_bt;
- bus_space_handle_t sc_bh;
+ struct resource *sc_regs;
+ u_int sc_off;
struct dbdma_command *sc_slots;
int sc_nslots;
@@ -78,6 +78,7 @@ struct dbdma_channel {
#define CHAN_CONTROL_REG 0x00
#define CHAN_STATUS_REG 0x04
+#define CHAN_CMDPTR_HI 0x08
#define CHAN_CMDPTR 0x0C
#define CHAN_INTR_SELECT 0x10
#define CHAN_BRANCH_SELECT 0x14
OpenPOWER on IntegriCloud