qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@us.ibm.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>,
	Anthony Liguori <aliguori@us.ibm.com>,
	Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>,
	Jan Kiszka <jan.kiszka@siemens.com>,
	Markus Armbruster <armbru@redhat.com>,
	Luiz Capitulino <lcapitulino@redhat.com>
Subject: [Qemu-devel] [PATCH v3 023/197] pc: fill out most of the composition tree
Date: Mon, 12 Dec 2011 14:18:19 -0600	[thread overview]
Message-ID: <1323721273-32404-24-git-send-email-aliguori@us.ibm.com> (raw)
In-Reply-To: <1323721273-32404-1-git-send-email-aliguori@us.ibm.com>

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
---
 hw/acpi_piix4.c |    7 +++--
 hw/ide/pci.c    |   11 +++++++-
 hw/kvmclock.c   |    5 ++-
 hw/kvmclock.h   |    5 ++-
 hw/pc.c         |   49 ++++++++++++++++++++++++++++++++-------
 hw/pc.h         |   37 ++++++++++++++++-------------
 hw/pc_piix.c    |   68 ++++++++++++++++++++++++++++++++++--------------------
 hw/piix_pci.c   |   12 +++++++--
 hw/usb-uhci.c   |    4 +-
 hw/usb-uhci.h   |    2 +-
 10 files changed, 134 insertions(+), 66 deletions(-)

diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index d9075e6..401baaa 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -372,14 +372,15 @@ static int piix4_pm_initfn(PCIDevice *dev)
     return 0;
 }
 
-i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
-                       qemu_irq sci_irq, qemu_irq cmos_s3, qemu_irq smi_irq,
-                       int kvm_enabled)
+i2c_bus *piix4_pm_init(PCIBus *bus, DeviceState **pdev, int devfn,
+                       uint32_t smb_io_base, qemu_irq sci_irq,
+                       qemu_irq cmos_s3, qemu_irq smi_irq, int kvm_enabled)
 {
     PCIDevice *dev;
     PIIX4PMState *s;
 
     dev = pci_create(bus, devfn, "PIIX4_PM");
+    *pdev = &dev->qdev;
     qdev_prop_set_uint32(&dev->qdev, "smb_io_base", smb_io_base);
 
     s = DO_UPCAST(PIIX4PMState, dev, dev);
diff --git a/hw/ide/pci.c b/hw/ide/pci.c
index 49b823d..897bca2 100644
--- a/hw/ide/pci.c
+++ b/hw/ide/pci.c
@@ -498,9 +498,16 @@ void pci_ide_create_devs(PCIDevice *dev, DriveInfo **hd_table)
     int i;
 
     for (i = 0; i < 4; i++) {
-        if (hd_table[i] == NULL)
+        char name[32];
+        IDEDevice *c;
+
+        if (hd_table[i] == NULL) {
             continue;
-        ide_create_drive(d->bus+bus[i], unit[i], hd_table[i]);
+        }
+
+        c = ide_create_drive(d->bus+bus[i], unit[i], hd_table[i]);
+        snprintf(name, sizeof(name), "drive[%d]", i);
+        qdev_property_add_child(&dev->qdev, name, &c->qdev, NULL);
     }
 }
 
diff --git a/hw/kvmclock.c b/hw/kvmclock.c
index 5388bc4..ddfaf3c 100644
--- a/hw/kvmclock.c
+++ b/hw/kvmclock.c
@@ -99,13 +99,14 @@ static SysBusDeviceInfo kvmclock_info = {
 };
 
 /* Note: Must be called after VCPU initialization. */
-void kvmclock_create(void)
+DeviceState *kvmclock_create(void)
 {
     if (kvm_enabled() &&
         first_cpu->cpuid_kvm_features & ((1ULL << KVM_FEATURE_CLOCKSOURCE) |
                                          (1ULL << KVM_FEATURE_CLOCKSOURCE2))) {
-        sysbus_create_simple("kvmclock", -1, NULL);
+        return sysbus_create_simple("kvmclock", -1, NULL);
     }
+    return NULL;
 }
 
 static void kvmclock_register_device(void)
diff --git a/hw/kvmclock.h b/hw/kvmclock.h
index 252ea13..40dda86 100644
--- a/hw/kvmclock.h
+++ b/hw/kvmclock.h
@@ -13,12 +13,13 @@
 
 #ifdef CONFIG_KVM
 
-void kvmclock_create(void);
+DeviceState *kvmclock_create(void);
 
 #else /* CONFIG_KVM */
 
-static inline void kvmclock_create(void)
+static inline DeviceState *kvmclock_create(void)
 {
+    return NULL;
 }
 
 #endif /* !CONFIG_KVM */
diff --git a/hw/pc.c b/hw/pc.c
index 2fd124a..47e6fb9 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -849,15 +849,17 @@ static const int ne2000_irq[NE2000_NB_MAX] = { 9, 10, 11, 3, 4, 5 };
 static const int parallel_io[MAX_PARALLEL_PORTS] = { 0x378, 0x278, 0x3bc };
 static const int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 };
 
-void pc_init_ne2k_isa(NICInfo *nd)
+DeviceState *pc_init_ne2k_isa(NICInfo *nd)
 {
     static int nb_ne2k = 0;
+    DeviceState *dev;
 
     if (nb_ne2k == NE2000_NB_MAX)
-        return;
-    isa_ne2000_init(ne2000_io[nb_ne2k],
-                    ne2000_irq[nb_ne2k], nd);
+        return NULL;
+    dev = isa_ne2000_init(ne2000_io[nb_ne2k],
+                          ne2000_irq[nb_ne2k], nd);
     nb_ne2k++;
+    return dev;
 }
 
 int cpu_is_bsp(CPUState *env)
@@ -1118,7 +1120,9 @@ static void cpu_request_exit(void *opaque, int irq, int level)
     }
 }
 
-void pc_basic_device_init(qemu_irq *gsi,
+void pc_basic_device_init(DeviceState *board,
+                          DeviceState *superio,
+                          qemu_irq *gsi,
                           ISADevice **rtc_state,
                           ISADevice **floppy,
                           bool no_vmport)
@@ -1142,33 +1146,51 @@ void pc_basic_device_init(qemu_irq *gsi,
                 sysbus_connect_irq(sysbus_from_qdev(hpet), i, gsi[i]);
             }
             rtc_irq = qdev_get_gpio_in(hpet, 0);
+
+            qdev_property_add_child(board, "hpet", hpet, NULL);
         }
     }
     *rtc_state = rtc_init(2000, rtc_irq);
+    qdev_property_add_child(superio, "rtc", &(*rtc_state)->qdev, NULL);
 
     qemu_register_boot_set(pc_boot_set, *rtc_state);
 
     pit = pit_init(0x40, 0);
+    qdev_property_add_child(superio, "pit", &pit->qdev, NULL);
+
+    /* FIXME not qdev */
     pcspk_init(pit);
 
     for(i = 0; i < MAX_SERIAL_PORTS; i++) {
         if (serial_hds[i]) {
-            serial_isa_init(i, serial_hds[i]);
+            DeviceState *dev;
+            char name[1024];
+
+            dev = serial_isa_init(i, serial_hds[i]);
+            snprintf(name, sizeof(name), "serial[%d]", i);
+            qdev_property_add_child(board, name, dev, NULL);
         }
     }
 
     for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
         if (parallel_hds[i]) {
-            parallel_init(i, parallel_hds[i]);
+            DeviceState *dev;
+            char name[1024];
+
+            dev = parallel_init(i, parallel_hds[i]);
+            snprintf(name, sizeof(name), "parallel[%d]", i);
+            qdev_property_add_child(board, name, dev, NULL);
         }
     }
 
     a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
     i8042 = isa_create_simple("i8042");
+    qdev_property_add_child(superio, "pckbd", &i8042->qdev, NULL);
     i8042_setup_a20_line(i8042, &a20_line[0]);
     if (!no_vmport) {
         vmport_init();
         vmmouse = isa_try_create("vmmouse");
+        qdev_property_add_child(superio, "vmmouse", &vmmouse->qdev, NULL);
     } else {
         vmmouse = NULL;
     }
@@ -1178,23 +1200,32 @@ void pc_basic_device_init(qemu_irq *gsi,
     }
     port92 = isa_create_simple("port92");
     port92_init(port92, &a20_line[1]);
+    qdev_property_add_child(superio, "port92", &port92->qdev, NULL);
 
     cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
+
+    /* FIXME not qdev */
     DMA_init(0, cpu_exit_irq);
 
     for(i = 0; i < MAX_FD; i++) {
         fd[i] = drive_get(IF_FLOPPY, 0, i);
     }
     *floppy = fdctrl_init_isa(fd);
+    qdev_property_add_child(superio, "floppy", &(*floppy)->qdev, NULL);
 }
 
-void pc_pci_device_init(PCIBus *pci_bus)
+void pc_pci_device_init(PCIBus *pci_bus, DeviceState *board)
 {
     int max_bus;
     int bus;
 
     max_bus = drive_get_max_bus(IF_SCSI);
     for (bus = 0; bus <= max_bus; bus++) {
-        pci_create_simple(pci_bus, -1, "lsi53c895a");
+        DeviceState *dev;
+        char name[32];
+
+        snprintf(name, sizeof(name), "scsi[%d]", bus);
+        dev = &pci_create_simple(pci_bus, -1, "lsi53c895a")->qdev;
+        qdev_property_add_child(board, name, dev, NULL);
     }
 }
diff --git a/hw/pc.h b/hw/pc.h
index 8d2e553..cd64755 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -20,39 +20,39 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
                             target_phys_addr_t base, int it_shift,
                             qemu_irq irq, int baudbase,
                             CharDriverState *chr, enum device_endian);
-static inline bool serial_isa_init(int index, CharDriverState *chr)
+static inline DeviceState *serial_isa_init(int index, CharDriverState *chr)
 {
     ISADevice *dev;
 
     dev = isa_try_create("isa-serial");
     if (!dev) {
-        return false;
+        return NULL;
     }
     qdev_prop_set_uint32(&dev->qdev, "index", index);
     qdev_prop_set_chr(&dev->qdev, "chardev", chr);
     if (qdev_init(&dev->qdev) < 0) {
-        return false;
+        return NULL;
     }
-    return true;
+    return &dev->qdev;
 }
 
 void serial_set_frequency(SerialState *s, uint32_t frequency);
 
 /* parallel.c */
-static inline bool parallel_init(int index, CharDriverState *chr)
+static inline DeviceState *parallel_init(int index, CharDriverState *chr)
 {
     ISADevice *dev;
 
     dev = isa_try_create("isa-parallel");
     if (!dev) {
-        return false;
+        return NULL;
     }
     qdev_prop_set_uint32(&dev->qdev, "index", index);
     qdev_prop_set_chr(&dev->qdev, "chardev", chr);
     if (qdev_init(&dev->qdev) < 0) {
-        return false;
+        return NULL;
     }
-    return true;
+    return &dev->qdev;
 }
 
 bool parallel_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq,
@@ -140,16 +140,18 @@ void pc_memory_init(MemoryRegion *system_memory,
                     MemoryRegion **ram_memory);
 qemu_irq *pc_allocate_cpu_irq(void);
 DeviceState *pc_vga_init(PCIBus *pci_bus);
-void pc_basic_device_init(qemu_irq *gsi,
+void pc_basic_device_init(DeviceState *board,
+                          DeviceState *superio,
+                          qemu_irq *gsi,
                           ISADevice **rtc_state,
                           ISADevice **floppy,
                           bool no_vmport);
-void pc_init_ne2k_isa(NICInfo *nd);
+DeviceState *pc_init_ne2k_isa(NICInfo *nd);
 void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
                   const char *boot_device,
                   ISADevice *floppy, BusState *ide0, BusState *ide1,
                   ISADevice *s);
-void pc_pci_device_init(PCIBus *pci_bus);
+void pc_pci_device_init(PCIBus *pci_bus, DeviceState *board);
 
 typedef void (*cpu_set_smm_t)(int smm, void *arg);
 void cpu_smm_register(cpu_set_smm_t callback, void *arg);
@@ -164,9 +166,9 @@ int acpi_table_add(const char *table_desc);
 
 /* acpi_piix.c */
 
-i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
-                       qemu_irq sci_irq, qemu_irq cmos_s3, qemu_irq smi_irq,
-                       int kvm_enabled);
+i2c_bus *piix4_pm_init(PCIBus *bus, DeviceState **pdev, int devfn,
+                       uint32_t smb_io_base, qemu_irq sci_irq,
+                       qemu_irq cmos_s3, qemu_irq smi_irq, int kvm_enabled);
 void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
 
 /* hpet.c */
@@ -181,6 +183,7 @@ struct PCII440FXState;
 typedef struct PCII440FXState PCII440FXState;
 
 PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
+                    DeviceState **i440fx, DeviceState **piix3,
                     qemu_irq *pic,
                     MemoryRegion *address_space_mem,
                     MemoryRegion *address_space_io,
@@ -227,7 +230,7 @@ DeviceState *pci_cirrus_vga_init(PCIBus *bus);
 DeviceState *isa_cirrus_vga_init(MemoryRegion *address_space);
 
 /* ne2000.c */
-static inline bool isa_ne2000_init(int base, int irq, NICInfo *nd)
+static inline DeviceState *isa_ne2000_init(int base, int irq, NICInfo *nd)
 {
     ISADevice *dev;
 
@@ -235,13 +238,13 @@ static inline bool isa_ne2000_init(int base, int irq, NICInfo *nd)
 
     dev = isa_try_create("ne2k_isa");
     if (!dev) {
-        return false;
+        return NULL;
     }
     qdev_prop_set_uint32(&dev->qdev, "iobase", base);
     qdev_prop_set_uint32(&dev->qdev, "irq",    irq);
     qdev_set_nic_properties(&dev->qdev, nd);
     qdev_init_nofail(&dev->qdev);
-    return true;
+    return &dev->qdev;
 }
 
 /* e820 types */
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 166c2fc..e4e2c26 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -53,7 +53,7 @@ static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
 static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
 static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
 
-static void ioapic_init(GSIState *gsi_state)
+static DeviceState *ioapic_init(GSIState *gsi_state)
 {
     DeviceState *dev;
     SysBusDevice *d;
@@ -67,6 +67,8 @@ static void ioapic_init(GSIState *gsi_state)
     for (i = 0; i < IOAPIC_NUM_PINS; i++) {
         gsi_state->ioapic_irq[i] = qdev_get_gpio_in(dev, i);
     }
+
+    return dev;
 }
 
 /* PC hardware initialisation */
@@ -99,12 +101,18 @@ static void pc_init1(MemoryRegion *system_memory,
     MemoryRegion *ram_memory;
     MemoryRegion *pci_memory;
     MemoryRegion *rom_memory;
+    DeviceState *superio = NULL;
+    DeviceState *board;
     DeviceState *dev;
 
+    board = qdev_create(NULL, "container");
+    qdev_property_add_child(qdev_get_root(), "pc", board, NULL);
+
     pc_cpus_init(cpu_model);
 
     if (kvmclock_enabled) {
-        kvmclock_create();
+        dev = kvmclock_create();
+        qdev_property_add_child(board, "kvmclock", dev, NULL);
     }
 
     if (ram_size >= 0xe0000000 ) {
@@ -136,7 +144,10 @@ static void pc_init1(MemoryRegion *system_memory,
     gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
 
     if (pci_enabled) {
-        pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, gsi,
+        DeviceState *i440fx, *piix3;
+
+        pci_bus = i440fx_init(&i440fx_state, &piix3_devfn,
+                              &i440fx, &piix3, gsi,
                               system_memory, system_io, ram_size,
                               below_4g_mem_size,
                               0x100000000ULL - below_4g_mem_size,
@@ -145,6 +156,9 @@ static void pc_init1(MemoryRegion *system_memory,
                                ? 0
                                : ((uint64_t)1 << 62)),
                               pci_memory, ram_memory);
+
+        qdev_property_add_child(board, "host-controller", i440fx, NULL);
+        superio = piix3;
     } else {
         pci_bus = NULL;
         i440fx_state = NULL;
@@ -164,30 +178,39 @@ static void pc_init1(MemoryRegion *system_memory,
         gsi_state->i8259_irq[i] = i8259[i];
     }
     if (pci_enabled) {
-        ioapic_init(gsi_state);
+        dev = ioapic_init(gsi_state);
+        qdev_property_add_child(board, "ioapic", dev, NULL);
     }
 
     pc_register_ferr_irq(gsi[13]);
 
     dev = pc_vga_init(pci_enabled? pci_bus: NULL);
     if (dev) {
-        qdev_property_add_child(qdev_get_root(), "vga", dev, NULL);
+        qdev_property_add_child(board, "vga", dev, NULL);
     }
 
     if (xen_enabled()) {
-        pci_create_simple(pci_bus, -1, "xen-platform");
+        dev = &pci_create_simple(pci_bus, -1, "xen-platform")->qdev;
+        qdev_property_add_child(board, "xen", dev, NULL);
     }
 
     /* init basic PC hardware */
-    pc_basic_device_init(gsi, &rtc_state, &floppy, xen_enabled());
+    pc_basic_device_init(board, superio, gsi, &rtc_state,
+                         &floppy, xen_enabled());
 
     for(i = 0; i < nb_nics; i++) {
         NICInfo *nd = &nd_table[i];
+        DeviceState *dev;
+        char buffer[32];
 
-        if (!pci_enabled || (nd->model && strcmp(nd->model, "ne2k_isa") == 0))
-            pc_init_ne2k_isa(nd);
-        else
-            pci_nic_init_nofail(nd, "e1000", NULL);
+        if (!pci_enabled || (nd->model && strcmp(nd->model, "ne2k_isa") == 0)) {
+            dev = pc_init_ne2k_isa(nd);
+        } else {
+            dev = &pci_nic_init_nofail(nd, "e1000", NULL)->qdev;
+        }
+
+        snprintf(buffer, sizeof(buffer), "nic[%d]", i);
+        qdev_property_add_child(board, buffer, dev, NULL);
     }
 
     ide_drive_get(hd, MAX_IDE_BUS);
@@ -200,33 +223,27 @@ static void pc_init1(MemoryRegion *system_memory,
         }
         idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0");
         idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1");
+        qdev_property_add_child(board, "ide", &dev->qdev, NULL);
     } else {
         for(i = 0; i < MAX_IDE_BUS; i++) {
             ISADevice *dev;
+            char buffer[32];
             dev = isa_ide_init(ide_iobase[i], ide_iobase2[i], ide_irq[i],
                                hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
             idebus[i] = qdev_get_child_bus(&dev->qdev, "ide.0");
+            snprintf(buffer, sizeof(buffer), "ide[%d]", i);
+            qdev_property_add_child(board, buffer, &dev->qdev, NULL);
         }
     }
 
-    /* FIXME there's some major spaghetti here.  Somehow we create the devices
-     * on the PIIX before we actually create it.  We create the PIIX3 deep in
-     * the recess of the i440fx creation too and then lose the DeviceState.
-     *
-     * For now, let's "fix" this by making judicious use of paths.  This is not
-     * generally the right way to do this.
-     */
-
-    qdev_property_add_child(qdev_resolve_path("/i440fx/piix3", NULL),
-                            "rtc", (DeviceState *)rtc_state, NULL);
-
     audio_init(gsi, pci_enabled ? pci_bus : NULL);
 
     pc_cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device,
                  floppy, idebus[0], idebus[1], rtc_state);
 
     if (pci_enabled && usb_enabled) {
-        usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
+        dev = usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
+        qdev_property_add_child(board, "usb-host", dev, NULL);
     }
 
     if (pci_enabled && acpi_enabled) {
@@ -239,14 +256,15 @@ static void pc_init1(MemoryRegion *system_memory,
         }
         smi_irq = qemu_allocate_irqs(pc_acpi_smi_interrupt, first_cpu, 1);
         /* TODO: Populate SPD eeprom data.  */
-        smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
+        smbus = piix4_pm_init(pci_bus, &dev, piix3_devfn + 3, 0xb100,
                               gsi[9], *cmos_s3, *smi_irq,
                               kvm_enabled());
+        qdev_property_add_child(superio, "pm", dev, NULL);
         smbus_eeprom_init(smbus, 8, NULL, 0);
     }
 
     if (pci_enabled) {
-        pc_pci_device_init(pci_bus);
+        pc_pci_device_init(pci_bus, board);
     }
 }
 
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index d785d4b..e690ee1 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -262,6 +262,7 @@ static int i440fx_initfn(PCIDevice *dev)
 
 static PCIBus *i440fx_common_init(const char *device_name,
                                   PCII440FXState **pi440fx_state,
+                                  DeviceState **i440fx,
                                   int *piix3_devfn,
                                   qemu_irq *pic,
                                   MemoryRegion *address_space_mem,
@@ -288,7 +289,7 @@ static PCIBus *i440fx_common_init(const char *device_name,
                     address_space_io, 0);
     s->bus = b;
     qdev_init_nofail(dev);
-    qdev_property_add_child(qdev_get_root(), "i440fx", dev, NULL);
+    *i440fx = dev;
 
     d = pci_create_simple(b, 0, device_name);
     *pi440fx_state = DO_UPCAST(PCII440FXState, dev, d);
@@ -296,6 +297,9 @@ static PCIBus *i440fx_common_init(const char *device_name,
     f->system_memory = address_space_mem;
     f->pci_address_space = pci_address_space;
     f->ram_memory = ram_memory;
+
+    qdev_property_add_child(dev, "i440fx", &d->qdev, NULL);
+
     memory_region_init_alias(&f->pci_hole, "pci-hole", f->pci_address_space,
                              pci_hole_start, pci_hole_size);
     memory_region_add_subregion(f->system_memory, pci_hole_start, &f->pci_hole);
@@ -325,7 +329,7 @@ static PCIBus *i440fx_common_init(const char *device_name,
         pci_bus_irqs(b, piix3_set_irq, pci_slot_get_pirq, piix3,
                 PIIX_NUM_PIRQS);
 
-        qdev_property_add_child(dev, "piix3", &piix3->dev.qdev, NULL);
+        qdev_property_add_child(&d->qdev, "piix3", &piix3->dev.qdev, NULL);
     }
     piix3->pic = pic;
 
@@ -344,6 +348,7 @@ static PCIBus *i440fx_common_init(const char *device_name,
 }
 
 PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix3_devfn,
+                    DeviceState **i440fx, DeviceState **piix3,
                     qemu_irq *pic,
                     MemoryRegion *address_space_mem,
                     MemoryRegion *address_space_io,
@@ -357,11 +362,12 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix3_devfn,
 {
     PCIBus *b;
 
-    b = i440fx_common_init("i440FX", pi440fx_state, piix3_devfn, pic,
+    b = i440fx_common_init("i440FX", pi440fx_state, i440fx, piix3_devfn, pic,
                            address_space_mem, address_space_io, ram_size,
                            pci_hole_start, pci_hole_size,
                            pci_hole64_size, pci_hole64_size,
                            pci_memory, ram_memory);
+    *piix3 = &(*pi440fx_state)->piix3->dev.qdev;
     return b;
 }
 
diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
index f9e3ea5..3e4456a 100644
--- a/hw/usb-uhci.c
+++ b/hw/usb-uhci.c
@@ -1269,9 +1269,9 @@ static void uhci_register(void)
 }
 device_init(uhci_register);
 
-void usb_uhci_piix3_init(PCIBus *bus, int devfn)
+DeviceState *usb_uhci_piix3_init(PCIBus *bus, int devfn)
 {
-    pci_create_simple(bus, devfn, "piix3-usb-uhci");
+    return &pci_create_simple(bus, devfn, "piix3-usb-uhci")->qdev;
 }
 
 void usb_uhci_piix4_init(PCIBus *bus, int devfn)
diff --git a/hw/usb-uhci.h b/hw/usb-uhci.h
index 3e4d377..1fef610 100644
--- a/hw/usb-uhci.h
+++ b/hw/usb-uhci.h
@@ -3,7 +3,7 @@
 
 #include "qemu-common.h"
 
-void usb_uhci_piix3_init(PCIBus *bus, int devfn);
+DeviceState *usb_uhci_piix3_init(PCIBus *bus, int devfn);
 void usb_uhci_piix4_init(PCIBus *bus, int devfn);
 void usb_uhci_vt82c686b_init(PCIBus *bus, int devfn);
 
-- 
1.7.4.1

  parent reply	other threads:[~2011-12-12 20:23 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-12 20:17 [Qemu-devel] [PATCH v3 000/197] qom: dynamic properties and composition tree (v2) Anthony Liguori
2011-12-12 20:17 ` [Qemu-devel] [PATCH v3 001/197] qom: add a reference count to qdev objects Anthony Liguori
2011-12-12 20:28   ` Anthony Liguori
2011-12-12 20:17 ` [Qemu-devel] [PATCH v3 002/197] qom: add new dynamic property infrastructure based on Visitors (v2) Anthony Liguori
2011-12-12 20:17 ` [Qemu-devel] [PATCH v3 003/197] qom: register legacy properties as new style properties (v2) Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 004/197] qom: introduce root device Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 005/197] qdev: provide an interface to return canonical path from root (v2) Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 006/197] qdev: provide a path resolution (v2) Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 007/197] qom: add child properties (composition) (v2) Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 008/197] qom: add link properties (v2) Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 009/197] qapi: allow a 'gen' key to suppress code generation Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 010/197] qmp: add qom-list command Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 011/197] qom: qom_{get, set} monitor commands (v2) Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 012/197] qdev: add explicitly named devices to the root complex Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 013/197] dev: add an anonymous peripheral container Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 014/197] rtc: make piix3 set the rtc as a child (v2) Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 015/197] rtc: add a dynamic property for retrieving the date Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 016/197] qom: optimize qdev_get_canonical_path using a parent link Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 017/197] qmp: make qmp.py easier to use Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 018/197] qom: add test tools (v2) Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 019/197] bug fix spotted by paolo Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 020/197] qom: add vga node to the pc composition tree Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 021/197] qom: add string property type Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 022/197] qdev: add a qdev_get_type() function and expose as a 'type' property Anthony Liguori
2011-12-12 20:18 ` Anthony Liguori [this message]
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 024/197] i440fx: split out piix3 device Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 025/197] i440fx: rename piix_pci -> i440fx Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 026/197] qom: add qobject Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 027/197] rename qobject -> object Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 028/197] more renames Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 029/197] Start integration of qom w/qdev Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 030/197] qdev: move qdev->info to class Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 031/197] qdev: don't access name through info Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 032/197] qdev: user a wrapper to access reset and promote reset to a class method Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 033/197] a little better approach to this Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 034/197] qdev: add isa-device as a subclass of device Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 035/197] isa: more isa stuff Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 036/197] qom: make pcidevice part of the hierarchy Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 039/197] virtio-serial-port Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 040/197] get rid of more DO_UPCAST Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 041/197] add class_init to deviceinfo Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 042/197] isa: move methods from isadeviceinfo to isadeviceclass Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 043/197] kill off ISADeviceInfo Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 044/197] usb: don't access dev->info directly Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 045/197] usb: get rid of info pointer Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 046/197] usb: promote all of the methods for USBDevice to class methods Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 047/197] usb: use a factory instead of doing silly things for legacy Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 048/197] usb: kill USBDeviceInfo Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 049/197] usb-hid: simply class initialization a bit Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 050/197] accessors for scsideviceinfo Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 051/197] drop info link in SCSIDeviceInfo Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 052/197] move methods out of SCSIDeviceInfo into SCSIDeviceClass Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 053/197] kill off SCSIDeviceInfo Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 054/197] get rid of CCIDCardInfo Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 055/197] rename i2c_slave -> I2CSlave Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 056/197] add I2CSlave to the type hierarchy Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 057/197] add SMBusDevice to the type hiearchy Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 058/197] fixup type registration Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 059/197] kill off SMBusDeviceInfo Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 060/197] add guards Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 061/197] killall I2CSlaveInfo Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 062/197] killall HDACodecDeviceInfo Anthony Liguori
2011-12-12 20:18 ` [Qemu-devel] [PATCH v3 063/197] make spapr a bit more patch monkey friendly Anthony Liguori
2011-12-12 20:19 ` [Qemu-devel] [PATCH v3 064/197] killall VIOsPAPRDeviceInfo Anthony Liguori
2011-12-13  2:04   ` Michael Ellerman
2011-12-13  2:10     ` Anthony Liguori
2011-12-13  2:22       ` Michael Ellerman
2011-12-13  2:25         ` Anthony Liguori
2011-12-13  3:26           ` David Gibson
2011-12-12 20:19 ` [Qemu-devel] [PATCH v3 065/197] qxl: be more patch monkey friendly Anthony Liguori
2011-12-12 20:19 ` [Qemu-devel] [PATCH v3 066/197] make es1370 more script " Anthony Liguori
2011-12-12 20:19 ` [Qemu-devel] [PATCH v3 067/197] remove arrays of PCIDeviceInfo Anthony Liguori
2011-12-12 20:19 ` [Qemu-devel] [PATCH v3 068/197] Patch monkey PCIDeviceInfo conversion Anthony Liguori
2011-12-12 20:19 ` [Qemu-devel] [PATCH v3 069/197] patch monkey, that funky monkey Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1323721273-32404-24-git-send-email-aliguori@us.ibm.com \
    --to=aliguori@us.ibm.com \
    --cc=armbru@redhat.com \
    --cc=jan.kiszka@siemens.com \
    --cc=kwolf@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).