1#ifndef HW_IDE_PCI_H 2#define HW_IDE_PCI_H 3 4#include <hw/ide/internal.h> 5 6typedef 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 MemoryRegion addr_ioport; 23 MemoryRegion extra_io; 24 QEMUBH *bh; 25 qemu_irq irq; 26 27 /* Bit 0-2 and 7: BM status register 28 * Bit 3-6: bus->error_status */ 29 uint8_t migration_compat_status; 30 struct PCIIDEState *pci_dev; 31} BMDMAState; 32 33typedef struct CMD646BAR { 34 MemoryRegion cmd; 35 MemoryRegion data; 36 IDEBus *bus; 37 struct PCIIDEState *pci_dev; 38} CMD646BAR; 39 40typedef struct PCIIDEState { 41 PCIDevice dev; 42 IDEBus bus[2]; 43 BMDMAState bmdma[2]; 44 uint32_t secondary; /* used only for cmd646 */ 45 MemoryRegion bmdma_bar; 46 CMD646BAR cmd646_bar[2]; /* used only for cmd646 */ 47} PCIIDEState; 48 49 50static inline IDEState *bmdma_active_if(BMDMAState *bmdma) 51{ 52 assert(bmdma->unit != (uint8_t)-1); 53 return bmdma->bus->ifs + bmdma->unit; 54} 55 56 57void bmdma_init(IDEBus *bus, BMDMAState *bm, PCIIDEState *d); 58void bmdma_cmd_writeb(BMDMAState *bm, uint32_t val); 59extern MemoryRegionOps bmdma_addr_ioport_ops; 60void pci_ide_create_devs(PCIDevice *dev, DriveInfo **hd_table); 61 62extern const VMStateDescription vmstate_ide_pci; 63#endif 64