1b8842209SGerd Hoffmann /* 2b8842209SGerd Hoffmann * QEMU IDE Emulation: MacIO support. 3b8842209SGerd Hoffmann * 4b8842209SGerd Hoffmann * Copyright (c) 2003 Fabrice Bellard 5b8842209SGerd Hoffmann * Copyright (c) 2006 Openedhand Ltd. 6b8842209SGerd Hoffmann * 7b8842209SGerd Hoffmann * Permission is hereby granted, free of charge, to any person obtaining a copy 8b8842209SGerd Hoffmann * of this software and associated documentation files (the "Software"), to deal 9b8842209SGerd Hoffmann * in the Software without restriction, including without limitation the rights 10b8842209SGerd Hoffmann * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11b8842209SGerd Hoffmann * copies of the Software, and to permit persons to whom the Software is 12b8842209SGerd Hoffmann * furnished to do so, subject to the following conditions: 13b8842209SGerd Hoffmann * 14b8842209SGerd Hoffmann * The above copyright notice and this permission notice shall be included in 15b8842209SGerd Hoffmann * all copies or substantial portions of the Software. 16b8842209SGerd Hoffmann * 17b8842209SGerd Hoffmann * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18b8842209SGerd Hoffmann * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19b8842209SGerd Hoffmann * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20b8842209SGerd Hoffmann * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21b8842209SGerd Hoffmann * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22b8842209SGerd Hoffmann * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23b8842209SGerd Hoffmann * THE SOFTWARE. 24b8842209SGerd Hoffmann */ 25baec1910SAndreas Färber #include "hw/hw.h" 26baec1910SAndreas Färber #include "hw/ppc/mac.h" 27baec1910SAndreas Färber #include "hw/mac_dbdma.h" 28737e150eSPaolo Bonzini #include "block/block.h" 299c17d615SPaolo Bonzini #include "sysemu/dma.h" 3059f2a787SGerd Hoffmann 3159f2a787SGerd Hoffmann #include <hw/ide/internal.h> 32b8842209SGerd Hoffmann 33b8842209SGerd Hoffmann /***********************************************************/ 34b8842209SGerd Hoffmann /* MacIO based PowerPC IDE */ 35b8842209SGerd Hoffmann 3602c7c992SBlue Swirl #define MACIO_PAGE_SIZE 4096 3702c7c992SBlue Swirl 38b8842209SGerd Hoffmann static void pmac_ide_atapi_transfer_cb(void *opaque, int ret) 39b8842209SGerd Hoffmann { 40b8842209SGerd Hoffmann DBDMA_io *io = opaque; 41b8842209SGerd Hoffmann MACIOIDEState *m = io->opaque; 42b8842209SGerd Hoffmann IDEState *s = idebus_active_if(&m->bus); 43b8842209SGerd Hoffmann 44b8842209SGerd Hoffmann if (ret < 0) { 45b8842209SGerd Hoffmann m->aiocb = NULL; 46b8842209SGerd Hoffmann qemu_sglist_destroy(&s->sg); 47b8842209SGerd Hoffmann ide_atapi_io_error(s, ret); 48a597e79cSChristoph Hellwig goto done; 49b8842209SGerd Hoffmann } 50b8842209SGerd Hoffmann 51b8842209SGerd Hoffmann if (s->io_buffer_size > 0) { 52b8842209SGerd Hoffmann m->aiocb = NULL; 53b8842209SGerd Hoffmann qemu_sglist_destroy(&s->sg); 54b8842209SGerd Hoffmann 55b8842209SGerd Hoffmann s->packet_transfer_size -= s->io_buffer_size; 56b8842209SGerd Hoffmann 57b8842209SGerd Hoffmann s->io_buffer_index += s->io_buffer_size; 58b8842209SGerd Hoffmann s->lba += s->io_buffer_index >> 11; 59b8842209SGerd Hoffmann s->io_buffer_index &= 0x7ff; 60b8842209SGerd Hoffmann } 61b8842209SGerd Hoffmann 62b8842209SGerd Hoffmann if (s->packet_transfer_size <= 0) 63b8842209SGerd Hoffmann ide_atapi_cmd_ok(s); 64b8842209SGerd Hoffmann 65b8842209SGerd Hoffmann if (io->len == 0) { 66a597e79cSChristoph Hellwig goto done; 67b8842209SGerd Hoffmann } 68b8842209SGerd Hoffmann 69b8842209SGerd Hoffmann /* launch next transfer */ 70b8842209SGerd Hoffmann 71b8842209SGerd Hoffmann s->io_buffer_size = io->len; 72b8842209SGerd Hoffmann 73d688e523SPeter Maydell qemu_sglist_init(&s->sg, io->len / MACIO_PAGE_SIZE + 1, 74d688e523SPeter Maydell &dma_context_memory); 75b8842209SGerd Hoffmann qemu_sglist_add(&s->sg, io->addr, io->len); 76b8842209SGerd Hoffmann io->addr += io->len; 77b8842209SGerd Hoffmann io->len = 0; 78b8842209SGerd Hoffmann 79b8842209SGerd Hoffmann m->aiocb = dma_bdrv_read(s->bs, &s->sg, 80b8842209SGerd Hoffmann (int64_t)(s->lba << 2) + (s->io_buffer_index >> 9), 81b8842209SGerd Hoffmann pmac_ide_atapi_transfer_cb, io); 82a597e79cSChristoph Hellwig return; 83a597e79cSChristoph Hellwig 84a597e79cSChristoph Hellwig done: 85a597e79cSChristoph Hellwig bdrv_acct_done(s->bs, &s->acct); 86b8842209SGerd Hoffmann io->dma_end(opaque); 87b8842209SGerd Hoffmann } 88b8842209SGerd Hoffmann 89b8842209SGerd Hoffmann static void pmac_ide_transfer_cb(void *opaque, int ret) 90b8842209SGerd Hoffmann { 91b8842209SGerd Hoffmann DBDMA_io *io = opaque; 92b8842209SGerd Hoffmann MACIOIDEState *m = io->opaque; 93b8842209SGerd Hoffmann IDEState *s = idebus_active_if(&m->bus); 94b8842209SGerd Hoffmann int n; 95b8842209SGerd Hoffmann int64_t sector_num; 96b8842209SGerd Hoffmann 97b8842209SGerd Hoffmann if (ret < 0) { 98b8842209SGerd Hoffmann m->aiocb = NULL; 99b8842209SGerd Hoffmann qemu_sglist_destroy(&s->sg); 100b8842209SGerd Hoffmann ide_dma_error(s); 101a597e79cSChristoph Hellwig goto done; 102b8842209SGerd Hoffmann } 103b8842209SGerd Hoffmann 104b8842209SGerd Hoffmann sector_num = ide_get_sector(s); 105b8842209SGerd Hoffmann if (s->io_buffer_size > 0) { 106b8842209SGerd Hoffmann m->aiocb = NULL; 107b8842209SGerd Hoffmann qemu_sglist_destroy(&s->sg); 108b8842209SGerd Hoffmann n = (s->io_buffer_size + 0x1ff) >> 9; 109b8842209SGerd Hoffmann sector_num += n; 110b8842209SGerd Hoffmann ide_set_sector(s, sector_num); 111b8842209SGerd Hoffmann s->nsector -= n; 112b8842209SGerd Hoffmann } 113b8842209SGerd Hoffmann 114b8842209SGerd Hoffmann /* end of transfer ? */ 115b8842209SGerd Hoffmann if (s->nsector == 0) { 116b8842209SGerd Hoffmann s->status = READY_STAT | SEEK_STAT; 1179cdd03a7SGerd Hoffmann ide_set_irq(s->bus); 118b8842209SGerd Hoffmann } 119b8842209SGerd Hoffmann 120b8842209SGerd Hoffmann /* end of DMA ? */ 121b8842209SGerd Hoffmann if (io->len == 0) { 122a597e79cSChristoph Hellwig goto done; 123b8842209SGerd Hoffmann } 124b8842209SGerd Hoffmann 125b8842209SGerd Hoffmann /* launch next transfer */ 126b8842209SGerd Hoffmann 127b8842209SGerd Hoffmann s->io_buffer_index = 0; 128b8842209SGerd Hoffmann s->io_buffer_size = io->len; 129b8842209SGerd Hoffmann 130d688e523SPeter Maydell qemu_sglist_init(&s->sg, io->len / MACIO_PAGE_SIZE + 1, 131d688e523SPeter Maydell &dma_context_memory); 132b8842209SGerd Hoffmann qemu_sglist_add(&s->sg, io->addr, io->len); 133b8842209SGerd Hoffmann io->addr += io->len; 134b8842209SGerd Hoffmann io->len = 0; 135b8842209SGerd Hoffmann 1364e1e0051SChristoph Hellwig switch (s->dma_cmd) { 1374e1e0051SChristoph Hellwig case IDE_DMA_READ: 138b8842209SGerd Hoffmann m->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num, 139b8842209SGerd Hoffmann pmac_ide_transfer_cb, io); 1404e1e0051SChristoph Hellwig break; 1414e1e0051SChristoph Hellwig case IDE_DMA_WRITE: 142b8842209SGerd Hoffmann m->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num, 143b8842209SGerd Hoffmann pmac_ide_transfer_cb, io); 1444e1e0051SChristoph Hellwig break; 145d353fb72SChristoph Hellwig case IDE_DMA_TRIM: 146d353fb72SChristoph Hellwig m->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num, 14743cf8ae6SDavid Gibson ide_issue_trim, pmac_ide_transfer_cb, s, 14843cf8ae6SDavid Gibson DMA_DIRECTION_TO_DEVICE); 149d353fb72SChristoph Hellwig break; 1504e1e0051SChristoph Hellwig } 151a597e79cSChristoph Hellwig return; 152b9b2008bSPaolo Bonzini 153a597e79cSChristoph Hellwig done: 154a597e79cSChristoph Hellwig if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) { 155a597e79cSChristoph Hellwig bdrv_acct_done(s->bs, &s->acct); 156a597e79cSChristoph Hellwig } 157a597e79cSChristoph Hellwig io->dma_end(io); 158b8842209SGerd Hoffmann } 159b8842209SGerd Hoffmann 160b8842209SGerd Hoffmann static void pmac_ide_transfer(DBDMA_io *io) 161b8842209SGerd Hoffmann { 162b8842209SGerd Hoffmann MACIOIDEState *m = io->opaque; 163b8842209SGerd Hoffmann IDEState *s = idebus_active_if(&m->bus); 164b8842209SGerd Hoffmann 165b8842209SGerd Hoffmann s->io_buffer_size = 0; 166cd8722bbSMarkus Armbruster if (s->drive_kind == IDE_CD) { 167a597e79cSChristoph Hellwig bdrv_acct_start(s->bs, &s->acct, io->len, BDRV_ACCT_READ); 168b8842209SGerd Hoffmann pmac_ide_atapi_transfer_cb(io, 0); 169b8842209SGerd Hoffmann return; 170b8842209SGerd Hoffmann } 171b8842209SGerd Hoffmann 172a597e79cSChristoph Hellwig switch (s->dma_cmd) { 173a597e79cSChristoph Hellwig case IDE_DMA_READ: 174a597e79cSChristoph Hellwig bdrv_acct_start(s->bs, &s->acct, io->len, BDRV_ACCT_READ); 175a597e79cSChristoph Hellwig break; 176a597e79cSChristoph Hellwig case IDE_DMA_WRITE: 177a597e79cSChristoph Hellwig bdrv_acct_start(s->bs, &s->acct, io->len, BDRV_ACCT_WRITE); 178a597e79cSChristoph Hellwig break; 179a597e79cSChristoph Hellwig default: 180a597e79cSChristoph Hellwig break; 181a597e79cSChristoph Hellwig } 182a597e79cSChristoph Hellwig 183b8842209SGerd Hoffmann pmac_ide_transfer_cb(io, 0); 184b8842209SGerd Hoffmann } 185b8842209SGerd Hoffmann 186b8842209SGerd Hoffmann static void pmac_ide_flush(DBDMA_io *io) 187b8842209SGerd Hoffmann { 188b8842209SGerd Hoffmann MACIOIDEState *m = io->opaque; 189b8842209SGerd Hoffmann 190922453bcSStefan Hajnoczi if (m->aiocb) { 191922453bcSStefan Hajnoczi bdrv_drain_all(); 192922453bcSStefan Hajnoczi } 193b8842209SGerd Hoffmann } 194b8842209SGerd Hoffmann 195b8842209SGerd Hoffmann /* PowerMac IDE memory IO */ 196b8842209SGerd Hoffmann static void pmac_ide_writeb (void *opaque, 197a8170e5eSAvi Kivity hwaddr addr, uint32_t val) 198b8842209SGerd Hoffmann { 199b8842209SGerd Hoffmann MACIOIDEState *d = opaque; 200b8842209SGerd Hoffmann 201b8842209SGerd Hoffmann addr = (addr & 0xFFF) >> 4; 202b8842209SGerd Hoffmann switch (addr) { 203b8842209SGerd Hoffmann case 1 ... 7: 204b8842209SGerd Hoffmann ide_ioport_write(&d->bus, addr, val); 205b8842209SGerd Hoffmann break; 206b8842209SGerd Hoffmann case 8: 207b8842209SGerd Hoffmann case 22: 208b8842209SGerd Hoffmann ide_cmd_write(&d->bus, 0, val); 209b8842209SGerd Hoffmann break; 210b8842209SGerd Hoffmann default: 211b8842209SGerd Hoffmann break; 212b8842209SGerd Hoffmann } 213b8842209SGerd Hoffmann } 214b8842209SGerd Hoffmann 215a8170e5eSAvi Kivity static uint32_t pmac_ide_readb (void *opaque,hwaddr addr) 216b8842209SGerd Hoffmann { 217b8842209SGerd Hoffmann uint8_t retval; 218b8842209SGerd Hoffmann MACIOIDEState *d = opaque; 219b8842209SGerd Hoffmann 220b8842209SGerd Hoffmann addr = (addr & 0xFFF) >> 4; 221b8842209SGerd Hoffmann switch (addr) { 222b8842209SGerd Hoffmann case 1 ... 7: 223b8842209SGerd Hoffmann retval = ide_ioport_read(&d->bus, addr); 224b8842209SGerd Hoffmann break; 225b8842209SGerd Hoffmann case 8: 226b8842209SGerd Hoffmann case 22: 227b8842209SGerd Hoffmann retval = ide_status_read(&d->bus, 0); 228b8842209SGerd Hoffmann break; 229b8842209SGerd Hoffmann default: 230b8842209SGerd Hoffmann retval = 0xFF; 231b8842209SGerd Hoffmann break; 232b8842209SGerd Hoffmann } 233b8842209SGerd Hoffmann return retval; 234b8842209SGerd Hoffmann } 235b8842209SGerd Hoffmann 236b8842209SGerd Hoffmann static void pmac_ide_writew (void *opaque, 237a8170e5eSAvi Kivity hwaddr addr, uint32_t val) 238b8842209SGerd Hoffmann { 239b8842209SGerd Hoffmann MACIOIDEState *d = opaque; 240b8842209SGerd Hoffmann 241b8842209SGerd Hoffmann addr = (addr & 0xFFF) >> 4; 242b8842209SGerd Hoffmann val = bswap16(val); 243b8842209SGerd Hoffmann if (addr == 0) { 244b8842209SGerd Hoffmann ide_data_writew(&d->bus, 0, val); 245b8842209SGerd Hoffmann } 246b8842209SGerd Hoffmann } 247b8842209SGerd Hoffmann 248a8170e5eSAvi Kivity static uint32_t pmac_ide_readw (void *opaque,hwaddr addr) 249b8842209SGerd Hoffmann { 250b8842209SGerd Hoffmann uint16_t retval; 251b8842209SGerd Hoffmann MACIOIDEState *d = opaque; 252b8842209SGerd Hoffmann 253b8842209SGerd Hoffmann addr = (addr & 0xFFF) >> 4; 254b8842209SGerd Hoffmann if (addr == 0) { 255b8842209SGerd Hoffmann retval = ide_data_readw(&d->bus, 0); 256b8842209SGerd Hoffmann } else { 257b8842209SGerd Hoffmann retval = 0xFFFF; 258b8842209SGerd Hoffmann } 259b8842209SGerd Hoffmann retval = bswap16(retval); 260b8842209SGerd Hoffmann return retval; 261b8842209SGerd Hoffmann } 262b8842209SGerd Hoffmann 263b8842209SGerd Hoffmann static void pmac_ide_writel (void *opaque, 264a8170e5eSAvi Kivity hwaddr addr, uint32_t val) 265b8842209SGerd Hoffmann { 266b8842209SGerd Hoffmann MACIOIDEState *d = opaque; 267b8842209SGerd Hoffmann 268b8842209SGerd Hoffmann addr = (addr & 0xFFF) >> 4; 269b8842209SGerd Hoffmann val = bswap32(val); 270b8842209SGerd Hoffmann if (addr == 0) { 271b8842209SGerd Hoffmann ide_data_writel(&d->bus, 0, val); 272b8842209SGerd Hoffmann } 273b8842209SGerd Hoffmann } 274b8842209SGerd Hoffmann 275a8170e5eSAvi Kivity static uint32_t pmac_ide_readl (void *opaque,hwaddr addr) 276b8842209SGerd Hoffmann { 277b8842209SGerd Hoffmann uint32_t retval; 278b8842209SGerd Hoffmann MACIOIDEState *d = opaque; 279b8842209SGerd Hoffmann 280b8842209SGerd Hoffmann addr = (addr & 0xFFF) >> 4; 281b8842209SGerd Hoffmann if (addr == 0) { 282b8842209SGerd Hoffmann retval = ide_data_readl(&d->bus, 0); 283b8842209SGerd Hoffmann } else { 284b8842209SGerd Hoffmann retval = 0xFFFFFFFF; 285b8842209SGerd Hoffmann } 286b8842209SGerd Hoffmann retval = bswap32(retval); 287b8842209SGerd Hoffmann return retval; 288b8842209SGerd Hoffmann } 289b8842209SGerd Hoffmann 290a348f108SStefan Weil static const MemoryRegionOps pmac_ide_ops = { 29123c5e4caSAvi Kivity .old_mmio = { 29223c5e4caSAvi Kivity .write = { 293b8842209SGerd Hoffmann pmac_ide_writeb, 294b8842209SGerd Hoffmann pmac_ide_writew, 295b8842209SGerd Hoffmann pmac_ide_writel, 29623c5e4caSAvi Kivity }, 29723c5e4caSAvi Kivity .read = { 298b8842209SGerd Hoffmann pmac_ide_readb, 299b8842209SGerd Hoffmann pmac_ide_readw, 300b8842209SGerd Hoffmann pmac_ide_readl, 30123c5e4caSAvi Kivity }, 30223c5e4caSAvi Kivity }, 30323c5e4caSAvi Kivity .endianness = DEVICE_NATIVE_ENDIAN, 304b8842209SGerd Hoffmann }; 305b8842209SGerd Hoffmann 30644bfa332SJuan Quintela static const VMStateDescription vmstate_pmac = { 30744bfa332SJuan Quintela .name = "ide", 30844bfa332SJuan Quintela .version_id = 3, 30944bfa332SJuan Quintela .minimum_version_id = 0, 31044bfa332SJuan Quintela .minimum_version_id_old = 0, 31144bfa332SJuan Quintela .fields = (VMStateField []) { 31244bfa332SJuan Quintela VMSTATE_IDE_BUS(bus, MACIOIDEState), 31344bfa332SJuan Quintela VMSTATE_IDE_DRIVES(bus.ifs, MACIOIDEState), 31444bfa332SJuan Quintela VMSTATE_END_OF_LIST() 315b8842209SGerd Hoffmann } 31644bfa332SJuan Quintela }; 317b8842209SGerd Hoffmann 318*07a7484eSAndreas Färber static void macio_ide_reset(DeviceState *dev) 319b8842209SGerd Hoffmann { 320*07a7484eSAndreas Färber MACIOIDEState *d = MACIO_IDE(dev); 321b8842209SGerd Hoffmann 3224a643563SBlue Swirl ide_bus_reset(&d->bus); 323b8842209SGerd Hoffmann } 324b8842209SGerd Hoffmann 325*07a7484eSAndreas Färber static void macio_ide_realizefn(DeviceState *dev, Error **errp) 326b8842209SGerd Hoffmann { 327*07a7484eSAndreas Färber MACIOIDEState *s = MACIO_IDE(dev); 328b8842209SGerd Hoffmann 329*07a7484eSAndreas Färber ide_init2(&s->bus, s->irq); 330b8842209SGerd Hoffmann } 331*07a7484eSAndreas Färber 332*07a7484eSAndreas Färber static void macio_ide_initfn(Object *obj) 333*07a7484eSAndreas Färber { 334*07a7484eSAndreas Färber SysBusDevice *d = SYS_BUS_DEVICE(obj); 335*07a7484eSAndreas Färber MACIOIDEState *s = MACIO_IDE(obj); 336*07a7484eSAndreas Färber 337*07a7484eSAndreas Färber ide_bus_new(&s->bus, DEVICE(obj), 0); 338*07a7484eSAndreas Färber memory_region_init_io(&s->mem, &pmac_ide_ops, s, "pmac-ide", 0x1000); 339*07a7484eSAndreas Färber sysbus_init_mmio(d, &s->mem); 340*07a7484eSAndreas Färber sysbus_init_irq(d, &s->irq); 341*07a7484eSAndreas Färber sysbus_init_irq(d, &s->dma_irq); 342*07a7484eSAndreas Färber } 343*07a7484eSAndreas Färber 344*07a7484eSAndreas Färber static void macio_ide_class_init(ObjectClass *oc, void *data) 345*07a7484eSAndreas Färber { 346*07a7484eSAndreas Färber DeviceClass *dc = DEVICE_CLASS(oc); 347*07a7484eSAndreas Färber 348*07a7484eSAndreas Färber dc->realize = macio_ide_realizefn; 349*07a7484eSAndreas Färber dc->reset = macio_ide_reset; 350*07a7484eSAndreas Färber dc->vmsd = &vmstate_pmac; 351*07a7484eSAndreas Färber } 352*07a7484eSAndreas Färber 353*07a7484eSAndreas Färber static const TypeInfo macio_ide_type_info = { 354*07a7484eSAndreas Färber .name = TYPE_MACIO_IDE, 355*07a7484eSAndreas Färber .parent = TYPE_SYS_BUS_DEVICE, 356*07a7484eSAndreas Färber .instance_size = sizeof(MACIOIDEState), 357*07a7484eSAndreas Färber .instance_init = macio_ide_initfn, 358*07a7484eSAndreas Färber .class_init = macio_ide_class_init, 359*07a7484eSAndreas Färber }; 360*07a7484eSAndreas Färber 361*07a7484eSAndreas Färber static void macio_ide_register_types(void) 362*07a7484eSAndreas Färber { 363*07a7484eSAndreas Färber type_register_static(&macio_ide_type_info); 364*07a7484eSAndreas Färber } 365*07a7484eSAndreas Färber 366*07a7484eSAndreas Färber /* hd_table must contain 4 block drivers */ 367*07a7484eSAndreas Färber void macio_ide_init_drives(MACIOIDEState *s, DriveInfo **hd_table) 368*07a7484eSAndreas Färber { 369*07a7484eSAndreas Färber int i; 370*07a7484eSAndreas Färber 371*07a7484eSAndreas Färber for (i = 0; i < 2; i++) { 372*07a7484eSAndreas Färber if (hd_table[i]) { 373*07a7484eSAndreas Färber ide_create_drive(&s->bus, i, hd_table[i]); 374*07a7484eSAndreas Färber } 375*07a7484eSAndreas Färber } 376*07a7484eSAndreas Färber } 377*07a7484eSAndreas Färber 378*07a7484eSAndreas Färber void macio_ide_register_dma(MACIOIDEState *s, void *dbdma, int channel) 379*07a7484eSAndreas Färber { 380*07a7484eSAndreas Färber DBDMA_register_channel(dbdma, channel, s->dma_irq, 381*07a7484eSAndreas Färber pmac_ide_transfer, pmac_ide_flush, s); 382*07a7484eSAndreas Färber } 383*07a7484eSAndreas Färber 384*07a7484eSAndreas Färber type_init(macio_ide_register_types) 385