165c0f135SJuan Quintela #ifndef HW_IDE_PCI_H 265c0f135SJuan Quintela #define HW_IDE_PCI_H 365c0f135SJuan Quintela 4a9c94277SMarkus Armbruster #include "hw/ide/internal.h" 5*edf5ca5dSMarkus Armbruster #include "hw/pci/pci_device.h" 6db1015e9SEduardo Habkost #include "qom/object.h" 765c0f135SJuan Quintela 87e2648dfSPaolo Bonzini #define BM_STATUS_DMAING 0x01 97e2648dfSPaolo Bonzini #define BM_STATUS_ERROR 0x02 107e2648dfSPaolo Bonzini #define BM_STATUS_INT 0x04 117e2648dfSPaolo Bonzini 127e2648dfSPaolo Bonzini #define BM_CMD_START 0x01 137e2648dfSPaolo Bonzini #define BM_CMD_READ 0x08 147e2648dfSPaolo Bonzini 1540a6238aSAlexander Graf typedef struct BMDMAState { 1640a6238aSAlexander Graf IDEDMA dma; 1740a6238aSAlexander Graf uint8_t cmd; 1840a6238aSAlexander Graf uint8_t status; 1940a6238aSAlexander Graf uint32_t addr; 2040a6238aSAlexander Graf 2140a6238aSAlexander Graf IDEBus *bus; 2240a6238aSAlexander Graf /* current transfer state */ 2340a6238aSAlexander Graf uint32_t cur_addr; 2440a6238aSAlexander Graf uint32_t cur_prd_last; 2540a6238aSAlexander Graf uint32_t cur_prd_addr; 2640a6238aSAlexander Graf uint32_t cur_prd_len; 27097310b5SMarkus Armbruster BlockCompletionFunc *dma_cb; 28a9deb8c6SAvi Kivity MemoryRegion addr_ioport; 29a9deb8c6SAvi Kivity MemoryRegion extra_io; 3040a6238aSAlexander Graf qemu_irq irq; 31def93791SKevin Wolf 32def93791SKevin Wolf /* Bit 0-2 and 7: BM status register 33def93791SKevin Wolf * Bit 3-6: bus->error_status */ 34def93791SKevin Wolf uint8_t migration_compat_status; 35a96cb236SPaolo Bonzini uint8_t migration_retry_unit; 36dc5d0af4SPaolo Bonzini int64_t migration_retry_sector_num; 37dc5d0af4SPaolo Bonzini uint32_t migration_retry_nsector; 38a96cb236SPaolo Bonzini 39a9deb8c6SAvi Kivity struct PCIIDEState *pci_dev; 4040a6238aSAlexander Graf } BMDMAState; 4140a6238aSAlexander Graf 42f6c11d56SAndreas Färber #define TYPE_PCI_IDE "pci-ide" 438063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(PCIIDEState, PCI_IDE) 44f6c11d56SAndreas Färber 45db1015e9SEduardo Habkost struct PCIIDEState { 46f6c11d56SAndreas Färber /*< private >*/ 47f6c11d56SAndreas Färber PCIDevice parent_obj; 48f6c11d56SAndreas Färber /*< public >*/ 49f6c11d56SAndreas Färber 5065c0f135SJuan Quintela IDEBus bus[2]; 5165c0f135SJuan Quintela BMDMAState bmdma[2]; 527e078316SJuan Quintela uint32_t secondary; /* used only for cmd646 */ 53a9deb8c6SAvi Kivity MemoryRegion bmdma_bar; 548ac98d1aSBALATON Zoltan MemoryRegion cmd_bar[2]; 558ac98d1aSBALATON Zoltan MemoryRegion data_bar[2]; 56db1015e9SEduardo Habkost }; 5765c0f135SJuan Quintela 5840a6238aSAlexander Graf static inline IDEState *bmdma_active_if(BMDMAState *bmdma) 5940a6238aSAlexander Graf { 60a96cb236SPaolo Bonzini assert(bmdma->bus->retry_unit != (uint8_t)-1); 61a96cb236SPaolo Bonzini return bmdma->bus->ifs + bmdma->bus->retry_unit; 6240a6238aSAlexander Graf } 6340a6238aSAlexander Graf 64a9deb8c6SAvi Kivity void bmdma_init(IDEBus *bus, BMDMAState *bm, PCIIDEState *d); 65a9deb8c6SAvi Kivity void bmdma_cmd_writeb(BMDMAState *bm, uint32_t val); 66a9deb8c6SAvi Kivity extern MemoryRegionOps bmdma_addr_ioport_ops; 67be1765f3SBALATON Zoltan void pci_ide_create_devs(PCIDevice *dev); 68407a4f30SJuan Quintela 69407a4f30SJuan Quintela extern const VMStateDescription vmstate_ide_pci; 70c9ebc75dSBALATON Zoltan extern const MemoryRegionOps pci_ide_cmd_le_ops; 71c9ebc75dSBALATON Zoltan extern const MemoryRegionOps pci_ide_data_le_ops; 7265c0f135SJuan Quintela #endif 73