ide/qdev: add ide bus.
[qemu] / hw / ide / internal.h
index 8766a3a..9df759d 100644 (file)
@@ -15,6 +15,8 @@
 #define USE_DMA_CDROM
 
 typedef struct IDEBus IDEBus;
+typedef struct IDEDevice IDEDevice;
+typedef struct IDEDeviceInfo IDEDeviceInfo;
 typedef struct IDEState IDEState;
 typedef struct BMDMAState BMDMAState;
 
@@ -379,7 +381,6 @@ struct IDEState {
     int mult_sectors;
     int identify_set;
     uint16_t identify_data[256];
-    qemu_irq irq;
     int drive_serial;
     char drive_serial_str[21];
     /* ide regs */
@@ -399,8 +400,6 @@ struct IDEState {
     uint8_t select;
     uint8_t status;
 
-    /* 0x3f6 command, only meaningful for drive 0 */
-    uint8_t cmd;
     /* set for lba48 access */
     uint8_t lba48;
     BlockDriverState *bs;
@@ -443,9 +442,27 @@ struct IDEState {
 
 struct IDEBus {
     BusState qbus;
+    IDEDevice *master;
+    IDEDevice *slave;
     BMDMAState *bmdma;
     IDEState ifs[2];
     uint8_t unit;
+    uint8_t cmd;
+    qemu_irq irq;
+};
+
+struct IDEDevice {
+    DeviceState qdev;
+    uint32_t unit;
+    DriveInfo *dinfo;
+};
+
+typedef int (*ide_qdev_initfn)(IDEDevice *dev);
+struct IDEDeviceInfo {
+    DeviceInfo qdev;
+    ide_qdev_initfn init;
+    uint32_t unit;
+    DriveInfo *drive;
 };
 
 #define BM_STATUS_DMAING 0x01
@@ -490,18 +507,18 @@ static inline IDEState *bmdma_active_if(BMDMAState *bmdma)
     return bmdma->bus->ifs + bmdma->unit;
 }
 
-static inline void ide_set_irq(IDEState *s)
+static inline void ide_set_irq(IDEBus *bus)
 {
-    BMDMAState *bm = s->bus->bmdma;
-    if (!(s->cmd & IDE_CMD_DISABLE_IRQ)) {
+    BMDMAState *bm = bus->bmdma;
+    if (!(bus->cmd & IDE_CMD_DISABLE_IRQ)) {
         if (bm) {
             bm->status |= BM_STATUS_INT;
         }
-        qemu_irq_raise(s->irq);
+        qemu_irq_raise(bus->irq);
     }
 }
 
-/* ide.c */
+/* hw/ide/core.c */
 void ide_save(QEMUFile* f, IDEState *s);
 void ide_load(QEMUFile* f, IDEState *s, int version_id);
 void idebus_save(QEMUFile* f, IDEBus *bus);
@@ -528,8 +545,13 @@ uint32_t ide_data_readw(void *opaque, uint32_t addr);
 void ide_data_writel(void *opaque, uint32_t addr, uint32_t val);
 uint32_t ide_data_readl(void *opaque, uint32_t addr);
 
-void ide_init2(IDEBus *bus, BlockDriverState *hd0, BlockDriverState *hd1,
+void ide_init_drive(IDEState *s, DriveInfo *dinfo);
+void ide_init2(IDEBus *bus, DriveInfo *hd0, DriveInfo *hd1,
                qemu_irq irq);
 void ide_init_ioport(IDEBus *bus, int iobase, int iobase2);
 
+/* hw/ide/qdev.c */
+IDEBus *ide_bus_new(DeviceState *dev);
+IDEDevice *ide_create_drive(IDEBus *bus, int unit, DriveInfo *drive);
+
 #endif /* HW_IDE_INTERNAL_H */