diff options
author | edgar_igl <edgar_igl@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-12-07 00:14:21 +0000 |
---|---|---|
committer | edgar_igl <edgar_igl@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-12-07 00:14:21 +0000 |
commit | e63204853e71ffe4493f55ee82db8122f9b44ed1 (patch) | |
tree | f101b9be28d5ab1f21c300543a91f19ee93fb74c /hw/etraxfs_dma.c | |
parent | 0db74b0705eb27993d859493e7ee8c34d222a3e7 (diff) |
ETRAX-FS: Simplify the DMA blocks address registration and decoding.
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5898 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/etraxfs_dma.c')
-rw-r--r-- | hw/etraxfs_dma.c | 25 |
1 files changed, 7 insertions, 18 deletions
diff --git a/hw/etraxfs_dma.c b/hw/etraxfs_dma.c index 54e55d1288..1bc5f4170e 100644 --- a/hw/etraxfs_dma.c +++ b/hw/etraxfs_dma.c @@ -165,11 +165,9 @@ enum dma_ch_state struct fs_dma_channel { - int regmap; qemu_irq *irq; struct etraxfs_dma_client *client; - /* Internal status. */ int stream_cmd_src; enum dma_ch_state state; @@ -187,6 +185,7 @@ struct fs_dma_channel struct fs_dma_ctrl { + int map; CPUState *env; int nr_channels; @@ -570,9 +569,9 @@ dma_readl (void *opaque, target_phys_addr_t addr) int c; uint32_t r = 0; - /* Make addr relative to this instances base. */ + /* Make addr relative to this channel and bounded to nr regs. */ c = fs_channel(addr); - addr &= 0x1fff; + addr &= 0xff; switch (addr) { case RW_STAT: @@ -616,9 +615,9 @@ dma_writel (void *opaque, target_phys_addr_t addr, uint32_t value) struct fs_dma_ctrl *ctrl = opaque; int c; - /* Make addr relative to this instances base. */ + /* Make addr relative to this channel and bounded to nr regs. */ c = fs_channel(addr); - addr &= 0x1fff; + addr &= 0xff; switch (addr) { case RW_DATA: @@ -744,7 +743,6 @@ void *etraxfs_dmac_init(CPUState *env, target_phys_addr_t base, int nr_channels) { struct fs_dma_ctrl *ctrl = NULL; - int i; ctrl = qemu_mallocz(sizeof *ctrl); if (!ctrl) @@ -758,17 +756,8 @@ void *etraxfs_dmac_init(CPUState *env, if (!ctrl->channels) goto err; - for (i = 0; i < nr_channels; i++) - { - ctrl->channels[i].regmap = cpu_register_io_memory(0, - dma_read, - dma_write, - ctrl); - cpu_register_physical_memory_offset (base + i * 0x2000, - sizeof ctrl->channels[i].regs, ctrl->channels[i].regmap, - i * 0x2000); - } - + ctrl->map = cpu_register_io_memory(0, dma_read, dma_write, ctrl); + cpu_register_physical_memory(base, nr_channels * 0x2000, ctrl->map); return ctrl; err: qemu_free(ctrl->channels); |