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
This commit is contained in:
nwhitehorn 2008-09-23 02:12:47 +00:00
parent 3c671d9bb6
commit 4c77244de0
4 changed files with 14 additions and 11 deletions

View File

@ -488,9 +488,9 @@ bm_attach(device_t dev)
return (ENXIO);
}
error = dbdma_allocate_channel(sc->sc_txdmar, bus_get_dma_tag(dev),
error = dbdma_allocate_channel(sc->sc_txdmar, 0, bus_get_dma_tag(dev),
BM_MAX_DMA_COMMANDS, &sc->sc_txdma);
error += dbdma_allocate_channel(sc->sc_rxdmar, bus_get_dma_tag(dev),
error += dbdma_allocate_channel(sc->sc_rxdmar, 0, bus_get_dma_tag(dev),
BM_MAX_DMA_COMMANDS, &sc->sc_rxdma);
if (error) {

View File

@ -78,7 +78,7 @@ typedef struct dbdma_command dbdma_command_t;
struct dbdma_channel;
typedef struct dbdma_channel dbdma_channel_t;
int dbdma_allocate_channel(struct resource *dbdma_regs,
int dbdma_allocate_channel(struct resource *dbdma_regs, u_int offset,
bus_dma_tag_t parent_dma, int slots, dbdma_channel_t **chan);
int dbdma_resize_channel(dbdma_channel_t *chan, int newslots);

View File

@ -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);
}

View File

@ -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