]>
Commit | Line | Data |
---|---|---|
65c0f135 JQ |
1 | #ifndef HW_IDE_PCI_H |
2 | #define HW_IDE_PCI_H | |
3 | ||
4 | #include <hw/ide/internal.h> | |
5 | ||
7e2648df PB |
6 | #define BM_STATUS_DMAING 0x01 |
7 | #define BM_STATUS_ERROR 0x02 | |
8 | #define BM_STATUS_INT 0x04 | |
9 | ||
10 | #define BM_CMD_START 0x01 | |
11 | #define BM_CMD_READ 0x08 | |
12 | ||
40a6238a AG |
13 | typedef struct BMDMAState { |
14 | IDEDMA dma; | |
15 | uint8_t cmd; | |
16 | uint8_t status; | |
17 | uint32_t addr; | |
18 | ||
19 | IDEBus *bus; | |
20 | /* current transfer state */ | |
21 | uint32_t cur_addr; | |
22 | uint32_t cur_prd_last; | |
23 | uint32_t cur_prd_addr; | |
24 | uint32_t cur_prd_len; | |
097310b5 | 25 | BlockCompletionFunc *dma_cb; |
a9deb8c6 AK |
26 | MemoryRegion addr_ioport; |
27 | MemoryRegion extra_io; | |
40a6238a | 28 | qemu_irq irq; |
def93791 KW |
29 | |
30 | /* Bit 0-2 and 7: BM status register | |
31 | * Bit 3-6: bus->error_status */ | |
32 | uint8_t migration_compat_status; | |
a96cb236 | 33 | uint8_t migration_retry_unit; |
dc5d0af4 PB |
34 | int64_t migration_retry_sector_num; |
35 | uint32_t migration_retry_nsector; | |
a96cb236 | 36 | |
a9deb8c6 | 37 | struct PCIIDEState *pci_dev; |
40a6238a AG |
38 | } BMDMAState; |
39 | ||
a9deb8c6 AK |
40 | typedef struct CMD646BAR { |
41 | MemoryRegion cmd; | |
42 | MemoryRegion data; | |
43 | IDEBus *bus; | |
44 | struct PCIIDEState *pci_dev; | |
45 | } CMD646BAR; | |
46 | ||
f6c11d56 AF |
47 | #define TYPE_PCI_IDE "pci-ide" |
48 | #define PCI_IDE(obj) OBJECT_CHECK(PCIIDEState, (obj), TYPE_PCI_IDE) | |
49 | ||
65c0f135 | 50 | typedef struct PCIIDEState { |
f6c11d56 AF |
51 | /*< private >*/ |
52 | PCIDevice parent_obj; | |
53 | /*< public >*/ | |
54 | ||
65c0f135 JQ |
55 | IDEBus bus[2]; |
56 | BMDMAState bmdma[2]; | |
7e078316 | 57 | uint32_t secondary; /* used only for cmd646 */ |
a9deb8c6 AK |
58 | MemoryRegion bmdma_bar; |
59 | CMD646BAR cmd646_bar[2]; /* used only for cmd646 */ | |
65c0f135 JQ |
60 | } PCIIDEState; |
61 | ||
40a6238a AG |
62 | |
63 | static inline IDEState *bmdma_active_if(BMDMAState *bmdma) | |
64 | { | |
a96cb236 PB |
65 | assert(bmdma->bus->retry_unit != (uint8_t)-1); |
66 | return bmdma->bus->ifs + bmdma->bus->retry_unit; | |
40a6238a AG |
67 | } |
68 | ||
69 | ||
a9deb8c6 AK |
70 | void bmdma_init(IDEBus *bus, BMDMAState *bm, PCIIDEState *d); |
71 | void bmdma_cmd_writeb(BMDMAState *bm, uint32_t val); | |
72 | extern MemoryRegionOps bmdma_addr_ioport_ops; | |
3e7e1558 | 73 | void pci_ide_create_devs(PCIDevice *dev, DriveInfo **hd_table); |
407a4f30 JQ |
74 | |
75 | extern const VMStateDescription vmstate_ide_pci; | |
65c0f135 | 76 | #endif |