|
@@ -73,72 +73,37 @@ void bmdma_cmd_writeb(void *opaque, uint32_t addr, uint32_t val)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-uint32_t bmdma_addr_readb(void *opaque, uint32_t addr)
|
|
|
|
|
|
+static void bmdma_addr_read(IORange *ioport, uint64_t addr,
|
|
|
|
+ unsigned width, uint64_t *data)
|
|
{
|
|
{
|
|
- BMDMAState *bm = opaque;
|
|
|
|
- uint32_t val;
|
|
|
|
- val = (bm->addr >> ((addr & 3) * 8)) & 0xff;
|
|
|
|
-#ifdef DEBUG_IDE
|
|
|
|
- printf("%s: 0x%08x\n", __func__, val);
|
|
|
|
-#endif
|
|
|
|
- return val;
|
|
|
|
-}
|
|
|
|
|
|
+ BMDMAState *bm = container_of(ioport, BMDMAState, addr_ioport);
|
|
|
|
+ uint32_t mask = (1ULL << (width * 8)) - 1;
|
|
|
|
|
|
-void bmdma_addr_writeb(void *opaque, uint32_t addr, uint32_t val)
|
|
|
|
-{
|
|
|
|
- BMDMAState *bm = opaque;
|
|
|
|
- int shift = (addr & 3) * 8;
|
|
|
|
|
|
+ *data = (bm->addr >> (addr * 8)) & mask;
|
|
#ifdef DEBUG_IDE
|
|
#ifdef DEBUG_IDE
|
|
- printf("%s: 0x%08x\n", __func__, val);
|
|
|
|
|
|
+ printf("%s: 0x%08x\n", __func__, (unsigned)*data);
|
|
#endif
|
|
#endif
|
|
- bm->addr &= ~(0xFF << shift);
|
|
|
|
- bm->addr |= ((val & 0xFF) << shift) & ~3;
|
|
|
|
- bm->cur_addr = bm->addr;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-uint32_t bmdma_addr_readw(void *opaque, uint32_t addr)
|
|
|
|
|
|
+static void bmdma_addr_write(IORange *ioport, uint64_t addr,
|
|
|
|
+ unsigned width, uint64_t data)
|
|
{
|
|
{
|
|
- BMDMAState *bm = opaque;
|
|
|
|
- uint32_t val;
|
|
|
|
- val = (bm->addr >> ((addr & 3) * 8)) & 0xffff;
|
|
|
|
-#ifdef DEBUG_IDE
|
|
|
|
- printf("%s: 0x%08x\n", __func__, val);
|
|
|
|
-#endif
|
|
|
|
- return val;
|
|
|
|
-}
|
|
|
|
|
|
+ BMDMAState *bm = container_of(ioport, BMDMAState, addr_ioport);
|
|
|
|
+ int shift = addr * 8;
|
|
|
|
+ uint32_t mask = (1ULL << (width * 8)) - 1;
|
|
|
|
|
|
-void bmdma_addr_writew(void *opaque, uint32_t addr, uint32_t val)
|
|
|
|
-{
|
|
|
|
- BMDMAState *bm = opaque;
|
|
|
|
- int shift = (addr & 3) * 8;
|
|
|
|
#ifdef DEBUG_IDE
|
|
#ifdef DEBUG_IDE
|
|
- printf("%s: 0x%08x\n", __func__, val);
|
|
|
|
|
|
+ printf("%s: 0x%08x\n", __func__, (unsigned)data);
|
|
#endif
|
|
#endif
|
|
- bm->addr &= ~(0xFFFF << shift);
|
|
|
|
- bm->addr |= ((val & 0xFFFF) << shift) & ~3;
|
|
|
|
|
|
+ bm->addr &= ~(mask << shift);
|
|
|
|
+ bm->addr |= ((data & mask) << shift) & ~3;
|
|
bm->cur_addr = bm->addr;
|
|
bm->cur_addr = bm->addr;
|
|
}
|
|
}
|
|
|
|
|
|
-uint32_t bmdma_addr_readl(void *opaque, uint32_t addr)
|
|
|
|
-{
|
|
|
|
- BMDMAState *bm = opaque;
|
|
|
|
- uint32_t val;
|
|
|
|
- val = bm->addr;
|
|
|
|
-#ifdef DEBUG_IDE
|
|
|
|
- printf("%s: 0x%08x\n", __func__, val);
|
|
|
|
-#endif
|
|
|
|
- return val;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void bmdma_addr_writel(void *opaque, uint32_t addr, uint32_t val)
|
|
|
|
-{
|
|
|
|
- BMDMAState *bm = opaque;
|
|
|
|
-#ifdef DEBUG_IDE
|
|
|
|
- printf("%s: 0x%08x\n", __func__, val);
|
|
|
|
-#endif
|
|
|
|
- bm->addr = val & ~3;
|
|
|
|
- bm->cur_addr = bm->addr;
|
|
|
|
-}
|
|
|
|
|
|
+const IORangeOps bmdma_addr_ioport_ops = {
|
|
|
|
+ .read = bmdma_addr_read,
|
|
|
|
+ .write = bmdma_addr_write,
|
|
|
|
+};
|
|
|
|
|
|
static bool ide_bmdma_current_needed(void *opaque)
|
|
static bool ide_bmdma_current_needed(void *opaque)
|
|
{
|
|
{
|