1 #ifndef HW_IDE_PCI_H 2 #define HW_IDE_PCI_H 3 4 #include <hw/ide/internal.h> 5 6 typedef struct BMDMAState { 7 IDEDMA dma; 8 uint8_t cmd; 9 uint8_t status; 10 uint32_t addr; 11 12 IDEBus *bus; 13 /* current transfer state */ 14 uint32_t cur_addr; 15 uint32_t cur_prd_last; 16 uint32_t cur_prd_addr; 17 uint32_t cur_prd_len; 18 uint8_t unit; 19 BlockDriverCompletionFunc *dma_cb; 20 int64_t sector_num; 21 uint32_t nsector; 22 IORange addr_ioport; 23 QEMUBH *bh; 24 qemu_irq irq; 25 } BMDMAState; 26 27 typedef struct PCIIDEState { 28 PCIDevice dev; 29 IDEBus bus[2]; 30 BMDMAState bmdma[2]; 31 uint32_t secondary; /* used only for cmd646 */ 32 } PCIIDEState; 33 34 bmdma_active_if(BMDMAState * bmdma)35static inline IDEState *bmdma_active_if(BMDMAState *bmdma) 36 { 37 assert(bmdma->unit != (uint8_t)-1); 38 return bmdma->bus->ifs + bmdma->unit; 39 } 40 41 42 void bmdma_init(IDEBus *bus, BMDMAState *bm); 43 void bmdma_cmd_writeb(void *opaque, uint32_t addr, uint32_t val); 44 extern const IORangeOps bmdma_addr_ioport_ops; 45 void pci_ide_create_devs(PCIDevice *dev, DriveInfo **hd_table); 46 47 extern const VMStateDescription vmstate_ide_pci; 48 #endif 49