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:
parent
3c671d9bb6
commit
4c77244de0
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user