165c0f135SJuan Quintela #ifndef HW_IDE_PCI_H 265c0f135SJuan Quintela #define HW_IDE_PCI_H 365c0f135SJuan Quintela 4a9c94277SMarkus Armbruster #include "hw/ide/internal.h" 565c0f135SJuan Quintela 67e2648dfSPaolo Bonzini #define BM_STATUS_DMAING 0x01 77e2648dfSPaolo Bonzini #define BM_STATUS_ERROR 0x02 87e2648dfSPaolo Bonzini #define BM_STATUS_INT 0x04 97e2648dfSPaolo Bonzini 107e2648dfSPaolo Bonzini #define BM_CMD_START 0x01 117e2648dfSPaolo Bonzini #define BM_CMD_READ 0x08 127e2648dfSPaolo Bonzini 1340a6238aSAlexander Graf typedef struct BMDMAState { 1440a6238aSAlexander Graf IDEDMA dma; 1540a6238aSAlexander Graf uint8_t cmd; 1640a6238aSAlexander Graf uint8_t status; 1740a6238aSAlexander Graf uint32_t addr; 1840a6238aSAlexander Graf 1940a6238aSAlexander Graf IDEBus *bus; 2040a6238aSAlexander Graf /* current transfer state */ 2140a6238aSAlexander Graf uint32_t cur_addr; 2240a6238aSAlexander Graf uint32_t cur_prd_last; 2340a6238aSAlexander Graf uint32_t cur_prd_addr; 2440a6238aSAlexander Graf uint32_t cur_prd_len; 25097310b5SMarkus Armbruster BlockCompletionFunc *dma_cb; 26a9deb8c6SAvi Kivity MemoryRegion addr_ioport; 27a9deb8c6SAvi Kivity MemoryRegion extra_io; 2840a6238aSAlexander Graf qemu_irq irq; 29def93791SKevin Wolf 30def93791SKevin Wolf /* Bit 0-2 and 7: BM status register 31def93791SKevin Wolf * Bit 3-6: bus->error_status */ 32def93791SKevin Wolf uint8_t migration_compat_status; 33a96cb236SPaolo Bonzini uint8_t migration_retry_unit; 34dc5d0af4SPaolo Bonzini int64_t migration_retry_sector_num; 35dc5d0af4SPaolo Bonzini uint32_t migration_retry_nsector; 36a96cb236SPaolo Bonzini 37a9deb8c6SAvi Kivity struct PCIIDEState *pci_dev; 3840a6238aSAlexander Graf } BMDMAState; 3940a6238aSAlexander Graf 40a9deb8c6SAvi Kivity typedef struct CMD646BAR { 41a9deb8c6SAvi Kivity MemoryRegion cmd; 42a9deb8c6SAvi Kivity MemoryRegion data; 43a9deb8c6SAvi Kivity } CMD646BAR; 44a9deb8c6SAvi Kivity 45f6c11d56SAndreas Färber #define TYPE_PCI_IDE "pci-ide" 46f6c11d56SAndreas Färber #define PCI_IDE(obj) OBJECT_CHECK(PCIIDEState, (obj), TYPE_PCI_IDE) 47f6c11d56SAndreas Färber 4865c0f135SJuan Quintela typedef struct PCIIDEState { 49f6c11d56SAndreas Färber /*< private >*/ 50f6c11d56SAndreas Färber PCIDevice parent_obj; 51f6c11d56SAndreas Färber /*< public >*/ 52f6c11d56SAndreas Färber 5365c0f135SJuan Quintela IDEBus bus[2]; 5465c0f135SJuan Quintela BMDMAState bmdma[2]; 557e078316SJuan Quintela uint32_t secondary; /* used only for cmd646 */ 56a9deb8c6SAvi Kivity MemoryRegion bmdma_bar; 57a9deb8c6SAvi Kivity CMD646BAR cmd646_bar[2]; /* used only for cmd646 */ 5865c0f135SJuan Quintela } PCIIDEState; 5965c0f135SJuan Quintela 6040a6238aSAlexander Graf 6140a6238aSAlexander Graf static inline IDEState *bmdma_active_if(BMDMAState *bmdma) 6240a6238aSAlexander Graf { 63a96cb236SPaolo Bonzini assert(bmdma->bus->retry_unit != (uint8_t)-1); 64a96cb236SPaolo Bonzini return bmdma->bus->ifs + bmdma->bus->retry_unit; 6540a6238aSAlexander Graf } 6640a6238aSAlexander Graf 6740a6238aSAlexander Graf 68a9deb8c6SAvi Kivity void bmdma_init(IDEBus *bus, BMDMAState *bm, PCIIDEState *d); 69a9deb8c6SAvi Kivity void bmdma_cmd_writeb(BMDMAState *bm, uint32_t val); 70a9deb8c6SAvi Kivity extern MemoryRegionOps bmdma_addr_ioport_ops; 713e7e1558SJuan Quintela void pci_ide_create_devs(PCIDevice *dev, DriveInfo **hd_table); 72407a4f30SJuan Quintela 73407a4f30SJuan Quintela extern const VMStateDescription vmstate_ide_pci; 74*c9ebc75dSBALATON Zoltan extern const MemoryRegionOps pci_ide_cmd_le_ops; 75*c9ebc75dSBALATON Zoltan extern const MemoryRegionOps pci_ide_data_le_ops; 7665c0f135SJuan Quintela #endif 77