All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1
@ 2013-07-01 10:18 Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 01/26] sysbus: document SysBusDeviceClass about @init Hu Tao
                   ` (26 more replies)
  0 siblings, 27 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel
  Cc: Igor Mammedov, Peter Crosthwaite, Andreas Färber, Eduardo Habkost

This series updates part of devices inheriting from SysbusDevice
to use DeviceState::realize, and QOM'ify them.

These devices are default to x86_64-softmmu. I'm planning to
make patches in the same manner, that is, each series is for
devices default to each target. After all devices are converted
to realizefn, SysBusDeviceClass::init can be removed.

v2 is based on qom-next at https://github.com/afaerber/qemu-cpu/tree/qom-next

Changes:

  v2:  1. swap the order of some patches to first use type-cast macro
          then convert to realizefn.
       2. document SysBusDeviceClass::init
       3. don't touch VMStateDescription::name
       4. drop patch for ehci as the part's already been done by Andreas

Cc: Andreas Färber <afaerber@suse.de>
Cc: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: Igor Mammedov <imammedo@redhat.com>

Hu Tao (26):
  sysbus: document SysBusDeviceClass about @init
  ohci: QOM'ify some more
  ohci: use realize for ohci
  i440fx-pcihost: use realize for i440fx-pcihost
  i440fx: use type-safe cast instead of directly access of parent dev
  q35: use type-safe cast instead of directly access of parent dev
  q35: use realize for q35 host
  fdc: QOM'ify some more
  fdc: use realize for fdc.
  pflash-cfi01: QOM'ify some more
  pflash_cfi01: use realize for pflash_cfi01
  pflash-cfi02: QOM'ify some more
  pflash_cfi02: use realize for pflash_cfi02
  ahci: QOM'ify some more
  ahci: use realize for ahci
  fwcfg: QOM'ify some more
  fwcfg: use realize for fwcfg
  scsi esp: QOM'ify some more
  scsi esp: use realize for scsi esp
  hpet: QOM'ify some more
  hpet: use realize for hpet
  kvmclock: QOM'ify some more
  kvmclock: use realize for kvmclock
  kvmvapic realize
  ioapic: use realize for ioapic
  isa bus: remove isabus_bridge_init since it does nothing

 hw/block/fdc.c          | 87 +++++++++++++++++++++++++++++++------------------
 hw/block/pflash_cfi01.c | 28 ++++++++--------
 hw/block/pflash_cfi02.c | 31 +++++++++---------
 hw/i386/kvm/clock.c     | 15 +++++----
 hw/i386/kvmvapic.c      | 12 +++----
 hw/ide/ahci.c           | 21 ++++++------
 hw/intc/ioapic_common.c | 12 +++----
 hw/isa/isa-bus.c        |  8 -----
 hw/nvram/fw_cfg.c       | 36 +++++++++++---------
 hw/pci-host/piix.c      | 36 ++++++++++++--------
 hw/pci-host/q35.c       | 60 +++++++++++++++++-----------------
 hw/scsi/esp.c           | 46 ++++++++++++++++----------
 hw/timer/hpet.c         | 44 +++++++++++++++----------
 hw/usb/hcd-ohci.c       | 32 +++++++++---------
 include/hw/sysbus.h     | 10 ++++++
 15 files changed, 268 insertions(+), 210 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 01/26] sysbus: document SysBusDeviceClass about @init
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-03  1:19   ` Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 02/26] ohci: QOM'ify some more Hu Tao
                   ` (25 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 include/hw/sysbus.h | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
index 7c2e316..9614758 100644
--- a/include/hw/sysbus.h
+++ b/include/hw/sysbus.h
@@ -23,6 +23,16 @@ typedef struct SysBusDevice SysBusDevice;
 #define SYS_BUS_DEVICE_GET_CLASS(obj) \
      OBJECT_GET_CLASS(SysBusDeviceClass, (obj), TYPE_SYS_BUS_DEVICE)
 
+/*
+ * SysBusDeviceClass:
+ * @parent_class: This is private
+ * @init: Callback function invoked when the #DeviceState::realized property
+ * is changed to %true. Deprecated, new types inheriting directly from
+ * TYPE_SYS_BUS_DEVICE should use #DeviceClass::realize instead, new leaf
+ * types should consult their respective parent type. SysBusDeviceClass is
+ * not implementing #DeviceClass::realize, so deriving classes can simply
+ * ignore it.
+ */
 typedef struct SysBusDeviceClass {
     DeviceClass parent_class;
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 02/26] ohci: QOM'ify some more
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 01/26] sysbus: document SysBusDeviceClass about @init Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-03  1:52   ` Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 03/26] ohci: use realize for ohci Hu Tao
                   ` (24 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Introduce type constant and avoid DO_UPCAST().

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/usb/hcd-ohci.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 5513924..912255d 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -1842,6 +1842,8 @@ static int usb_ohci_init(OHCIState *ohci, DeviceState *dev,
     return 0;
 }
 
+#define TYPE_PCI_OHCI "pci-ohci"
+#define PCI_OHCI(obj) OBJECT_CHECK(OHCIPCIState, (obj), TYPE_PCI_OHCI)
 typedef struct {
     PCIDevice pci_dev;
     OHCIState state;
@@ -1852,23 +1854,25 @@ typedef struct {
 
 static int usb_ohci_initfn_pci(struct PCIDevice *dev)
 {
-    OHCIPCIState *ohci = DO_UPCAST(OHCIPCIState, pci_dev, dev);
+    OHCIPCIState *ohci = PCI_OHCI(dev);
 
     ohci->pci_dev.config[PCI_CLASS_PROG] = 0x10; /* OHCI */
     ohci->pci_dev.config[PCI_INTERRUPT_PIN] = 0x01; /* interrupt pin A */
 
-    if (usb_ohci_init(&ohci->state, &dev->qdev, ohci->num_ports, 0,
+    if (usb_ohci_init(&ohci->state, DEVICE(dev), ohci->num_ports, 0,
                       ohci->masterbus, ohci->firstport,
                       pci_get_address_space(dev)) != 0) {
         return -1;
     }
     ohci->state.irq = ohci->pci_dev.irq[0];
 
-    /* TODO: avoid cast below by using dev */
-    pci_register_bar(&ohci->pci_dev, 0, 0, &ohci->state.mem);
+    pci_register_bar(dev, 0, 0, &ohci->state.mem);
     return 0;
 }
 
+#define TYPE_SYSBUS_OHCI "sysbus-ohci"
+#define SYSBUS_OHCI(obj) OBJECT_CHECK(OHCISysBusState, (obj), TYPE_SYSBUS_OHCI)
+
 typedef struct {
     SysBusDevice busdev;
     OHCIState ohci;
@@ -1878,10 +1882,10 @@ typedef struct {
 
 static int ohci_init_pxa(SysBusDevice *dev)
 {
-    OHCISysBusState *s = FROM_SYSBUS(OHCISysBusState, dev);
+    OHCISysBusState *s = SYSBUS_OHCI(dev);
 
     /* Cannot fail as we pass NULL for masterbus */
-    usb_ohci_init(&s->ohci, &dev->qdev, s->num_ports, s->dma_offset, NULL, 0,
+    usb_ohci_init(&s->ohci, DEVICE(dev), s->num_ports, s->dma_offset, NULL, 0,
                   &address_space_memory);
     sysbus_init_irq(dev, &s->ohci.irq);
     sysbus_init_mmio(dev, &s->ohci.mem);
@@ -1911,7 +1915,7 @@ static void ohci_pci_class_init(ObjectClass *klass, void *data)
 }
 
 static const TypeInfo ohci_pci_info = {
-    .name          = "pci-ohci",
+    .name          = TYPE_PCI_OHCI,
     .parent        = TYPE_PCI_DEVICE,
     .instance_size = sizeof(OHCIPCIState),
     .class_init    = ohci_pci_class_init,
@@ -1934,7 +1938,7 @@ static void ohci_sysbus_class_init(ObjectClass *klass, void *data)
 }
 
 static const TypeInfo ohci_sysbus_info = {
-    .name          = "sysbus-ohci",
+    .name          = TYPE_SYSBUS_OHCI,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(OHCISysBusState),
     .class_init    = ohci_sysbus_class_init,
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 03/26] ohci: use realize for ohci
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 01/26] sysbus: document SysBusDeviceClass about @init Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 02/26] ohci: QOM'ify some more Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-07 15:22   ` Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 04/26] i440fx-pcihost: use realize for i440fx-pcihost Hu Tao
                   ` (23 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/usb/hcd-ohci.c | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 912255d..ee824ee 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -1880,17 +1880,16 @@ typedef struct {
     dma_addr_t dma_offset;
 } OHCISysBusState;
 
-static int ohci_init_pxa(SysBusDevice *dev)
+static void ohci_realize_pxa(DeviceState *dev, Error **errp)
 {
     OHCISysBusState *s = SYSBUS_OHCI(dev);
+    SysBusDevice *b = SYS_BUS_DEVICE(dev);
 
     /* Cannot fail as we pass NULL for masterbus */
-    usb_ohci_init(&s->ohci, DEVICE(dev), s->num_ports, s->dma_offset, NULL, 0,
+    usb_ohci_init(&s->ohci, dev, s->num_ports, s->dma_offset, NULL, 0,
                   &address_space_memory);
-    sysbus_init_irq(dev, &s->ohci.irq);
-    sysbus_init_mmio(dev, &s->ohci.mem);
-
-    return 0;
+    sysbus_init_irq(b, &s->ohci.irq);
+    sysbus_init_mmio(b, &s->ohci.mem);
 }
 
 static Property ohci_pci_properties[] = {
@@ -1930,9 +1929,8 @@ static Property ohci_sysbus_properties[] = {
 static void ohci_sysbus_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
 
-    sbc->init = ohci_init_pxa;
+    dc->realize = ohci_realize_pxa;
     dc->desc = "OHCI USB Controller";
     dc->props = ohci_sysbus_properties;
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 04/26] i440fx-pcihost: use realize for i440fx-pcihost
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (2 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 03/26] ohci: use realize for ohci Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-07 21:24   ` Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 05/26] i440fx: use type-safe cast instead of directly access of parent dev Hu Tao
                   ` (22 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/pci-host/piix.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
index f9e68c3..801341a 100644
--- a/hw/pci-host/piix.c
+++ b/hw/pci-host/piix.c
@@ -197,21 +197,26 @@ static const VMStateDescription vmstate_i440fx = {
     }
 };
 
-static int i440fx_pcihost_initfn(SysBusDevice *dev)
+static void i440fx_pcihost_initfn(Object *obj)
 {
-    PCIHostState *s = PCI_HOST_BRIDGE(dev);
+    PCIHostState *s = PCI_HOST_BRIDGE(obj);
 
     memory_region_init_io(&s->conf_mem, &pci_host_conf_le_ops, s,
                           "pci-conf-idx", 4);
-    sysbus_add_io(dev, 0xcf8, &s->conf_mem);
-    sysbus_init_ioports(&s->busdev, 0xcf8, 4);
-
     memory_region_init_io(&s->data_mem, &pci_host_data_le_ops, s,
                           "pci-conf-data", 4);
-    sysbus_add_io(dev, 0xcfc, &s->data_mem);
-    sysbus_init_ioports(&s->busdev, 0xcfc, 4);
+}
 
-    return 0;
+static void i440fx_pcihost_realize(DeviceState *dev, Error **errp)
+{
+    PCIHostState *s = PCI_HOST_BRIDGE(dev);
+    SysBusDevice *b = SYS_BUS_DEVICE(dev);
+
+    sysbus_add_io(b, 0xcf8, &s->conf_mem);
+    sysbus_init_ioports(b, 0xcf8, 4);
+
+    sysbus_add_io(b, 0xcfc, &s->data_mem);
+    sysbus_init_ioports(b, 0xcfc, 4);
 }
 
 static int i440fx_initfn(PCIDevice *dev)
@@ -632,9 +637,8 @@ static const TypeInfo i440fx_info = {
 static void i440fx_pcihost_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-    k->init = i440fx_pcihost_initfn;
+    dc->realize = i440fx_pcihost_realize;
     dc->fw_name = "pci";
     dc->no_user = 1;
 }
@@ -643,6 +647,7 @@ static const TypeInfo i440fx_pcihost_info = {
     .name          = "i440FX-pcihost",
     .parent        = TYPE_PCI_HOST_BRIDGE,
     .instance_size = sizeof(I440FXState),
+    .instance_init = i440fx_pcihost_initfn,
     .class_init    = i440fx_pcihost_class_init,
 };
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 05/26] i440fx: use type-safe cast instead of directly access of parent dev
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (3 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 04/26] i440fx-pcihost: use realize for i440fx-pcihost Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-07 17:03   ` Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 06/26] q35: " Hu Tao
                   ` (21 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/pci-host/piix.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
index 801341a..e2437df 100644
--- a/hw/pci-host/piix.c
+++ b/hw/pci-host/piix.c
@@ -121,22 +121,24 @@ static int pci_slot_get_pirq(PCIDevice *pci_dev, int pci_intx)
 static void i440fx_update_memory_mappings(PCII440FXState *d)
 {
     int i;
+    PCIDevice *pd = PCI_DEVICE(d);
 
     memory_region_transaction_begin();
     for (i = 0; i < 13; i++) {
         pam_update(&d->pam_regions[i], i,
-                   d->dev.config[I440FX_PAM + ((i + 1) / 2)]);
+                   pd->config[I440FX_PAM + ((i + 1) / 2)]);
     }
-    smram_update(&d->smram_region, d->dev.config[I440FX_SMRAM], d->smm_enabled);
+    smram_update(&d->smram_region, pd->config[I440FX_SMRAM], d->smm_enabled);
     memory_region_transaction_commit();
 }
 
 static void i440fx_set_smm(int val, void *arg)
 {
     PCII440FXState *d = arg;
+    PCIDevice *pd = PCI_DEVICE(d);
 
     memory_region_transaction_begin();
-    smram_set_smm(&d->smm_enabled, val, d->dev.config[I440FX_SMRAM],
+    smram_set_smm(&d->smm_enabled, val, pd->config[I440FX_SMRAM],
                   &d->smram_region);
     memory_region_transaction_commit();
 }
@@ -158,9 +160,10 @@ static void i440fx_write_config(PCIDevice *dev,
 static int i440fx_load_old(QEMUFile* f, void *opaque, int version_id)
 {
     PCII440FXState *d = opaque;
+    PCIDevice *pd = PCI_DEVICE(d);
     int ret, i;
 
-    ret = pci_device_load(&d->dev, f);
+    ret = pci_device_load(pd, f);
     if (ret < 0)
         return ret;
     i440fx_update_memory_mappings(d);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 06/26] q35: use type-safe cast instead of directly access of parent dev
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (4 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 05/26] i440fx: use type-safe cast instead of directly access of parent dev Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-07 23:05   ` Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 07/26] q35: use realize for q35 host Hu Tao
                   ` (20 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

And remove variables if possible.

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/pci-host/q35.c | 35 ++++++++++++++++++-----------------
 1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index 24df6b5..61b525f 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -36,28 +36,26 @@
 
 static int q35_host_init(SysBusDevice *dev)
 {
-    PCIBus *b;
-    PCIHostState *pci = FROM_SYSBUS(PCIHostState, dev);
-    Q35PCIHost *s = Q35_HOST_DEVICE(&dev->qdev);
+    PCIHostState *pci = PCI_HOST_BRIDGE(dev);
+    Q35PCIHost *s = Q35_HOST_DEVICE(dev);
 
     memory_region_init_io(&pci->conf_mem, &pci_host_conf_le_ops, pci,
                           "pci-conf-idx", 4);
     sysbus_add_io(dev, MCH_HOST_BRIDGE_CONFIG_ADDR, &pci->conf_mem);
-    sysbus_init_ioports(&pci->busdev, MCH_HOST_BRIDGE_CONFIG_ADDR, 4);
+    sysbus_init_ioports(dev, MCH_HOST_BRIDGE_CONFIG_ADDR, 4);
 
     memory_region_init_io(&pci->data_mem, &pci_host_data_le_ops, pci,
                           "pci-conf-data", 4);
     sysbus_add_io(dev, MCH_HOST_BRIDGE_CONFIG_DATA, &pci->data_mem);
-    sysbus_init_ioports(&pci->busdev, MCH_HOST_BRIDGE_CONFIG_DATA, 4);
+    sysbus_init_ioports(dev, MCH_HOST_BRIDGE_CONFIG_DATA, 4);
 
-    if (pcie_host_init(&s->host) < 0) {
+    if (pcie_host_init(PCIE_HOST_BRIDGE(s)) < 0) {
         return -1;
     }
-    b = pci_bus_new(&s->host.pci.busdev.qdev, "pcie.0",
-                    s->mch.pci_address_space, s->mch.address_space_io,
-                    0, TYPE_PCIE_BUS);
-    s->host.pci.bus = b;
-    qdev_set_parent_bus(DEVICE(&s->mch), BUS(b));
+    pci->bus = pci_bus_new(DEVICE(s), "pcie.0",
+                           s->mch.pci_address_space, s->mch.address_space_io,
+                           0, TYPE_PCIE_BUS);
+    qdev_set_parent_bus(DEVICE(&s->mch), BUS(pci->bus));
     qdev_init_nofail(DEVICE(&s->mch));
 
     return 0;
@@ -105,9 +103,8 @@ static const TypeInfo q35_host_info = {
 static void mch_update_pciexbar(MCHPCIState *mch)
 {
     PCIDevice *pci_dev = &mch->d;
-    BusState *bus = qdev_get_parent_bus(&pci_dev->qdev);
+    BusState *bus = qdev_get_parent_bus(DEVICE(pci_dev));
     DeviceState *qdev = bus->parent;
-    Q35PCIHost *s = Q35_HOST_DEVICE(qdev);
 
     uint64_t pciexbar;
     int enable;
@@ -139,18 +136,19 @@ static void mch_update_pciexbar(MCHPCIState *mch)
         break;
     }
     addr = pciexbar & addr_mask;
-    pcie_host_mmcfg_update(&s->host, enable, addr, length);
+    pcie_host_mmcfg_update(PCIE_HOST_BRIDGE(qdev), enable, addr, length);
 }
 
 /* PAM */
 static void mch_update_pam(MCHPCIState *mch)
 {
+    PCIDevice *pd = PCI_DEVICE(mch);
     int i;
 
     memory_region_transaction_begin();
     for (i = 0; i < 13; i++) {
         pam_update(&mch->pam_regions[i], i,
-                   mch->d.config[MCH_HOST_BRIDGE_PAM0 + ((i + 1) / 2)]);
+                   pd->config[MCH_HOST_BRIDGE_PAM0 + ((i + 1) / 2)]);
     }
     memory_region_transaction_commit();
 }
@@ -158,8 +156,10 @@ static void mch_update_pam(MCHPCIState *mch)
 /* SMRAM */
 static void mch_update_smram(MCHPCIState *mch)
 {
+    PCIDevice *pd = PCI_DEVICE(mch);
+
     memory_region_transaction_begin();
-    smram_update(&mch->smram_region, mch->d.config[MCH_HOST_BRDIGE_SMRAM],
+    smram_update(&mch->smram_region, pd->config[MCH_HOST_BRDIGE_SMRAM],
                     mch->smm_enabled);
     memory_region_transaction_commit();
 }
@@ -167,9 +167,10 @@ static void mch_update_smram(MCHPCIState *mch)
 static void mch_set_smm(int smm, void *arg)
 {
     MCHPCIState *mch = arg;
+    PCIDevice *pd = PCI_DEVICE(mch);
 
     memory_region_transaction_begin();
-    smram_set_smm(&mch->smm_enabled, smm, mch->d.config[MCH_HOST_BRDIGE_SMRAM],
+    smram_set_smm(&mch->smm_enabled, smm, pd->config[MCH_HOST_BRDIGE_SMRAM],
                     &mch->smram_region);
     memory_region_transaction_commit();
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 07/26] q35: use realize for q35 host
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (5 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 06/26] q35: " Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-08  1:20   ` Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 08/26] fdc: QOM'ify some more Hu Tao
                   ` (19 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

and split off memory region initialization into instance_init.

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/pci-host/q35.c | 29 +++++++++++++++--------------
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index 61b525f..244e2f5 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -34,31 +34,27 @@
  * Q35 host
  */
 
-static int q35_host_init(SysBusDevice *dev)
+static void q35_host_realize(DeviceState *dev, Error **errp)
 {
     PCIHostState *pci = PCI_HOST_BRIDGE(dev);
     Q35PCIHost *s = Q35_HOST_DEVICE(dev);
+    SysBusDevice *b = SYS_BUS_DEVICE(dev);
 
-    memory_region_init_io(&pci->conf_mem, &pci_host_conf_le_ops, pci,
-                          "pci-conf-idx", 4);
-    sysbus_add_io(dev, MCH_HOST_BRIDGE_CONFIG_ADDR, &pci->conf_mem);
-    sysbus_init_ioports(dev, MCH_HOST_BRIDGE_CONFIG_ADDR, 4);
+    sysbus_add_io(b, MCH_HOST_BRIDGE_CONFIG_ADDR, &pci->conf_mem);
+    sysbus_init_ioports(b, MCH_HOST_BRIDGE_CONFIG_ADDR, 4);
 
-    memory_region_init_io(&pci->data_mem, &pci_host_data_le_ops, pci,
-                          "pci-conf-data", 4);
-    sysbus_add_io(dev, MCH_HOST_BRIDGE_CONFIG_DATA, &pci->data_mem);
-    sysbus_init_ioports(dev, MCH_HOST_BRIDGE_CONFIG_DATA, 4);
+    sysbus_add_io(b, MCH_HOST_BRIDGE_CONFIG_DATA, &pci->data_mem);
+    sysbus_init_ioports(b, MCH_HOST_BRIDGE_CONFIG_DATA, 4);
 
     if (pcie_host_init(PCIE_HOST_BRIDGE(s)) < 0) {
-        return -1;
+        error_setg(errp, "failed to initialize pcie host");
+        return;
     }
     pci->bus = pci_bus_new(DEVICE(s), "pcie.0",
                            s->mch.pci_address_space, s->mch.address_space_io,
                            0, TYPE_PCIE_BUS);
     qdev_set_parent_bus(DEVICE(&s->mch), BUS(pci->bus));
     qdev_init_nofail(DEVICE(&s->mch));
-
-    return 0;
 }
 
 static Property mch_props[] = {
@@ -70,9 +66,8 @@ static Property mch_props[] = {
 static void q35_host_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-    k->init = q35_host_init;
+    dc->realize = q35_host_realize;
     dc->props = mch_props;
     dc->fw_name = "pci";
 }
@@ -80,6 +75,12 @@ static void q35_host_class_init(ObjectClass *klass, void *data)
 static void q35_host_initfn(Object *obj)
 {
     Q35PCIHost *s = Q35_HOST_DEVICE(obj);
+    PCIHostState *pci = PCI_HOST_BRIDGE(obj);
+
+    memory_region_init_io(&pci->conf_mem, &pci_host_conf_le_ops, pci,
+                          "pci-conf-idx", 4);
+    memory_region_init_io(&pci->data_mem, &pci_host_data_le_ops, pci,
+                          "pci-conf-data", 4);
 
     object_initialize(&s->mch, TYPE_MCH_PCI_DEVICE);
     object_property_add_child(OBJECT(s), "mch", OBJECT(&s->mch), NULL);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 08/26] fdc: QOM'ify some more
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (6 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 07/26] q35: use realize for q35 host Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 09/26] fdc: use realize for fdc Hu Tao
                   ` (18 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Introduce type constant and avoid DO_UPCAST(), container_of(),
and use DEVICE() to avoid accessing parent qdev directly.

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/block/fdc.c | 37 ++++++++++++++++++++-----------------
 1 file changed, 20 insertions(+), 17 deletions(-)

diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index 930f191..f8270cb 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -544,6 +544,9 @@ struct FDCtrl {
     uint8_t timer1;
 };
 
+#define TYPE_SYSBUS_FDC "sysbus-fdc"
+#define SYSBUS_FDC(obj) OBJECT_CHECK(FDCtrlSysBus, (obj), TYPE_SYSBUS_FDC)
+
 typedef struct FDCtrlSysBus {
     SysBusDevice busdev;
     struct FDCtrl state;
@@ -773,10 +776,9 @@ static const VMStateDescription vmstate_fdc = {
 
 static void fdctrl_external_reset_sysbus(DeviceState *d)
 {
-    FDCtrlSysBus *sys = container_of(d, FDCtrlSysBus, busdev.qdev);
-    FDCtrl *s = &sys->state;
+    FDCtrlSysBus *sys = SYSBUS_FDC(d);
 
-    fdctrl_reset(s, 0);
+    fdctrl_reset(&sys->state, 0);
 }
 
 static void fdctrl_external_reset_isa(DeviceState *d)
@@ -2049,8 +2051,8 @@ void fdctrl_init_sysbus(qemu_irq irq, int dma_chann,
     DeviceState *dev;
     FDCtrlSysBus *sys;
 
-    dev = qdev_create(NULL, "sysbus-fdc");
-    sys = DO_UPCAST(FDCtrlSysBus, busdev.qdev, dev);
+    dev = qdev_create(NULL, TYPE_SYSBUS_FDC);
+    sys = SYSBUS_FDC(dev);
     fdctrl = &sys->state;
     fdctrl->dma_chann = dma_chann; /* FIXME */
     if (fds[0]) {
@@ -2060,8 +2062,8 @@ void fdctrl_init_sysbus(qemu_irq irq, int dma_chann,
         qdev_prop_set_drive_nofail(dev, "driveB", fds[1]->bdrv);
     }
     qdev_init_nofail(dev);
-    sysbus_connect_irq(&sys->busdev, 0, irq);
-    sysbus_mmio_map(&sys->busdev, 0, mmio_base);
+    sysbus_connect_irq(SYS_BUS_DEVICE(sys), 0, irq);
+    sysbus_mmio_map(SYS_BUS_DEVICE(sys), 0, mmio_base);
 }
 
 void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base,
@@ -2075,9 +2077,9 @@ void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base,
         qdev_prop_set_drive_nofail(dev, "drive", fds[0]->bdrv);
     }
     qdev_init_nofail(dev);
-    sys = DO_UPCAST(FDCtrlSysBus, busdev.qdev, dev);
-    sysbus_connect_irq(&sys->busdev, 0, irq);
-    sysbus_mmio_map(&sys->busdev, 0, io_base);
+    sys = SYSBUS_FDC(dev);
+    sysbus_connect_irq(SYS_BUS_DEVICE(sys), 0, irq);
+    sysbus_mmio_map(SYS_BUS_DEVICE(sys), 0, io_base);
     *fdc_tc = qdev_get_gpio_in(dev, 0);
 }
 
@@ -2145,17 +2147,17 @@ static void isabus_fdc_realize(DeviceState *dev, Error **errp)
 
 static int sysbus_fdc_init1(SysBusDevice *dev)
 {
-    FDCtrlSysBus *sys = DO_UPCAST(FDCtrlSysBus, busdev, dev);
+    FDCtrlSysBus *sys = SYSBUS_FDC(dev);
     FDCtrl *fdctrl = &sys->state;
     int ret;
 
     memory_region_init_io(&fdctrl->iomem, &fdctrl_mem_ops, fdctrl, "fdc", 0x08);
     sysbus_init_mmio(dev, &fdctrl->iomem);
     sysbus_init_irq(dev, &fdctrl->irq);
-    qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1);
+    qdev_init_gpio_in(DEVICE(dev), fdctrl_handle_tc, 1);
     fdctrl->dma_chann = -1;
 
-    qdev_set_legacy_instance_id(&dev->qdev, 0 /* io */, 2); /* FIXME */
+    qdev_set_legacy_instance_id(DEVICE(dev), 0 /* io */, 2); /* FIXME */
     ret = fdctrl_init_common(fdctrl);
 
     return ret;
@@ -2163,16 +2165,17 @@ static int sysbus_fdc_init1(SysBusDevice *dev)
 
 static int sun4m_fdc_init1(SysBusDevice *dev)
 {
-    FDCtrl *fdctrl = &(FROM_SYSBUS(FDCtrlSysBus, dev)->state);
+    FDCtrlSysBus *sys = SYSBUS_FDC(dev);
+    FDCtrl *fdctrl = &sys->state;
 
     memory_region_init_io(&fdctrl->iomem, &fdctrl_mem_strict_ops, fdctrl,
                           "fdctrl", 0x08);
     sysbus_init_mmio(dev, &fdctrl->iomem);
     sysbus_init_irq(dev, &fdctrl->irq);
-    qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1);
+    qdev_init_gpio_in(DEVICE(dev), fdctrl_handle_tc, 1);
 
     fdctrl->sun4m = 1;
-    qdev_set_legacy_instance_id(&dev->qdev, 0 /* io */, 2); /* FIXME */
+    qdev_set_legacy_instance_id(DEVICE(dev), 0 /* io */, 2); /* FIXME */
     return fdctrl_init_common(fdctrl);
 }
 
@@ -2253,7 +2256,7 @@ static void sysbus_fdc_class_init(ObjectClass *klass, void *data)
 }
 
 static const TypeInfo sysbus_fdc_info = {
-    .name          = "sysbus-fdc",
+    .name          = TYPE_SYSBUS_FDC,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(FDCtrlSysBus),
     .class_init    = sysbus_fdc_class_init,
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 09/26] fdc: use realize for fdc.
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (7 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 08/26] fdc: QOM'ify some more Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-21  9:27   ` Andreas Färber
  2013-07-21  9:31   ` [Qemu-devel] [PATCH qom-next] fdc: Improve error propagation for QOM realize Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 10/26] pflash-cfi01: QOM'ify some more Hu Tao
                   ` (17 subsequent siblings)
  26 siblings, 2 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/block/fdc.c | 62 ++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 41 insertions(+), 21 deletions(-)

diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index f8270cb..0fe0cf9 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -2145,38 +2145,58 @@ static void isabus_fdc_realize(DeviceState *dev, Error **errp)
     add_boot_device_path(isa->bootindexB, dev, "/floppy@1");
 }
 
-static int sysbus_fdc_init1(SysBusDevice *dev)
+static void sysbus_fdc_initfn(Object *obj)
 {
-    FDCtrlSysBus *sys = SYSBUS_FDC(dev);
+    FDCtrlSysBus *sys = SYSBUS_FDC(obj);
     FDCtrl *fdctrl = &sys->state;
-    int ret;
 
     memory_region_init_io(&fdctrl->iomem, &fdctrl_mem_ops, fdctrl, "fdc", 0x08);
-    sysbus_init_mmio(dev, &fdctrl->iomem);
-    sysbus_init_irq(dev, &fdctrl->irq);
-    qdev_init_gpio_in(DEVICE(dev), fdctrl_handle_tc, 1);
-    fdctrl->dma_chann = -1;
+}
 
-    qdev_set_legacy_instance_id(DEVICE(dev), 0 /* io */, 2); /* FIXME */
-    ret = fdctrl_init_common(fdctrl);
+static void sysbus_fdc_realize(DeviceState *dev, Error **errp)
+{
+    FDCtrlSysBus *sys = SYSBUS_FDC(dev);
+    FDCtrl *fdctrl = &sys->state;
+    SysBusDevice *b = SYS_BUS_DEVICE(dev);
 
-    return ret;
+
+    sysbus_init_mmio(b, &fdctrl->iomem);
+    sysbus_init_irq(b, &fdctrl->irq);
+    qdev_init_gpio_in(dev, fdctrl_handle_tc, 1);
+    fdctrl->dma_chann = -1;
+
+    qdev_set_legacy_instance_id(dev, 0 /* io */, 2); /* FIXME */
+    if (fdctrl_init_common(fdctrl) < 0) {
+        error_setg(errp, "Floppy init failed.");
+        return;
+    }
 }
 
-static int sun4m_fdc_init1(SysBusDevice *dev)
+static void sun4m_fdc_initfn(Object *obj)
 {
-    FDCtrlSysBus *sys = SYSBUS_FDC(dev);
+    FDCtrlSysBus *sys = SYSBUS_FDC(obj);
     FDCtrl *fdctrl = &sys->state;
 
     memory_region_init_io(&fdctrl->iomem, &fdctrl_mem_strict_ops, fdctrl,
                           "fdctrl", 0x08);
-    sysbus_init_mmio(dev, &fdctrl->iomem);
-    sysbus_init_irq(dev, &fdctrl->irq);
-    qdev_init_gpio_in(DEVICE(dev), fdctrl_handle_tc, 1);
+}
+
+static void sun4m_fdc_realize(DeviceState *dev, Error **errp)
+{
+    FDCtrlSysBus *sys = SYSBUS_FDC(dev);
+    FDCtrl *fdctrl = &sys->state;
+    SysBusDevice *b = SYS_BUS_DEVICE(dev);
+
+    sysbus_init_mmio(b, &fdctrl->iomem);
+    sysbus_init_irq(b, &fdctrl->irq);
+    qdev_init_gpio_in(dev, fdctrl_handle_tc, 1);
 
     fdctrl->sun4m = 1;
-    qdev_set_legacy_instance_id(DEVICE(dev), 0 /* io */, 2); /* FIXME */
-    return fdctrl_init_common(fdctrl);
+    qdev_set_legacy_instance_id(dev, 0 /* io */, 2); /* FIXME */
+    if (fdctrl_init_common(fdctrl) < 0) {
+        error_setg(errp, "Floppy init failed.");
+        return;
+    }
 }
 
 FDriveType isa_fdc_get_drive_type(ISADevice *fdc, int i)
@@ -2247,9 +2267,8 @@ static Property sysbus_fdc_properties[] = {
 static void sysbus_fdc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-    k->init = sysbus_fdc_init1;
+    dc->realize = sysbus_fdc_realize;
     dc->reset = fdctrl_external_reset_sysbus;
     dc->vmsd = &vmstate_sysbus_fdc;
     dc->props = sysbus_fdc_properties;
@@ -2259,6 +2278,7 @@ static const TypeInfo sysbus_fdc_info = {
     .name          = TYPE_SYSBUS_FDC,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(FDCtrlSysBus),
+    .instance_init = sysbus_fdc_initfn,
     .class_init    = sysbus_fdc_class_init,
 };
 
@@ -2270,9 +2290,8 @@ static Property sun4m_fdc_properties[] = {
 static void sun4m_fdc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-    k->init = sun4m_fdc_init1;
+    dc->realize = sun4m_fdc_realize;
     dc->reset = fdctrl_external_reset_sysbus;
     dc->vmsd = &vmstate_sysbus_fdc;
     dc->props = sun4m_fdc_properties;
@@ -2282,6 +2301,7 @@ static const TypeInfo sun4m_fdc_info = {
     .name          = "SUNW,fdtwo",
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(FDCtrlSysBus),
+    .instance_init = sun4m_fdc_initfn,
     .class_init    = sun4m_fdc_class_init,
 };
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 10/26] pflash-cfi01: QOM'ify some more
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (8 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 09/26] fdc: use realize for fdc Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 11/26] pflash_cfi01: use realize for pflash_cfi01 Hu Tao
                   ` (16 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Introduce type constant and replace FROM_SYSBUS().

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/block/pflash_cfi01.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
index 63d7c99..7f7af06 100644
--- a/hw/block/pflash_cfi01.c
+++ b/hw/block/pflash_cfi01.c
@@ -60,6 +60,9 @@ do {                                                        \
 #define DPRINTF(fmt, ...) do { } while (0)
 #endif
 
+#define TYPE_CFI_PFLASH01 "cfi.pflash01"
+#define CFI_PFLASH01(obj) OBJECT_CHECK(pflash_t, (obj), TYPE_CFI_PFLASH01)
+
 struct pflash_t {
     SysBusDevice busdev;
     BlockDriverState *bs;
@@ -565,7 +568,7 @@ static const MemoryRegionOps pflash_cfi01_ops_le = {
 
 static int pflash_cfi01_init(SysBusDevice *dev)
 {
-    pflash_t *pfl = FROM_SYSBUS(typeof(*pfl), dev);
+    pflash_t *pfl = CFI_PFLASH01(dev);
     uint64_t total_len;
     int ret;
 
@@ -719,7 +722,7 @@ static void pflash_cfi01_class_init(ObjectClass *klass, void *data)
 
 
 static const TypeInfo pflash_cfi01_info = {
-    .name           = "cfi.pflash01",
+    .name           = TYPE_CFI_PFLASH01,
     .parent         = TYPE_SYS_BUS_DEVICE,
     .instance_size  = sizeof(struct pflash_t),
     .class_init     = pflash_cfi01_class_init,
@@ -740,10 +743,7 @@ pflash_t *pflash_cfi01_register(hwaddr base,
                                 uint16_t id0, uint16_t id1,
                                 uint16_t id2, uint16_t id3, int be)
 {
-    DeviceState *dev = qdev_create(NULL, "cfi.pflash01");
-    SysBusDevice *busdev = SYS_BUS_DEVICE(dev);
-    pflash_t *pfl = (pflash_t *)object_dynamic_cast(OBJECT(dev),
-                                                    "cfi.pflash01");
+    DeviceState *dev = qdev_create(NULL, TYPE_CFI_PFLASH01);
 
     if (bs && qdev_prop_set_drive(dev, "drive", bs)) {
         abort();
@@ -759,8 +759,8 @@ pflash_t *pflash_cfi01_register(hwaddr base,
     qdev_prop_set_string(dev, "name", name);
     qdev_init_nofail(dev);
 
-    sysbus_mmio_map(busdev, 0, base);
-    return pfl;
+    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
+    return CFI_PFLASH01(dev);
 }
 
 MemoryRegion *pflash_cfi01_get_memory(pflash_t *fl)
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 11/26] pflash_cfi01: use realize for pflash_cfi01
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (9 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 10/26] pflash-cfi01: QOM'ify some more Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 12/26] pflash-cfi02: QOM'ify some more Hu Tao
                   ` (15 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/block/pflash_cfi01.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
index 7f7af06..06c045b 100644
--- a/hw/block/pflash_cfi01.c
+++ b/hw/block/pflash_cfi01.c
@@ -566,7 +566,7 @@ static const MemoryRegionOps pflash_cfi01_ops_le = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static int pflash_cfi01_init(SysBusDevice *dev)
+static void pflash_cfi01_realize(DeviceState *dev, Error **err)
 {
     pflash_t *pfl = CFI_PFLASH01(dev);
     uint64_t total_len;
@@ -586,7 +586,7 @@ static int pflash_cfi01_init(SysBusDevice *dev)
         pfl->name, total_len);
     vmstate_register_ram(&pfl->mem, DEVICE(pfl));
     pfl->storage = memory_region_get_ram_ptr(&pfl->mem);
-    sysbus_init_mmio(dev, &pfl->mem);
+    sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem);
 
     if (pfl->bs) {
         /* read the initial flash content */
@@ -595,7 +595,8 @@ static int pflash_cfi01_init(SysBusDevice *dev)
         if (ret < 0) {
             vmstate_unregister_ram(&pfl->mem, DEVICE(pfl));
             memory_region_destroy(&pfl->mem);
-            return 1;
+            error_setg(err, "failed to read the initial flash content");
+            return;
         }
     }
 
@@ -692,8 +693,6 @@ static int pflash_cfi01_init(SysBusDevice *dev)
     pfl->cfi_table[0x3c] = 0x00;
 
     pfl->cfi_table[0x3f] = 0x01; /* Number of protection fields */
-
-    return 0;
 }
 
 static Property pflash_cfi01_properties[] = {
@@ -713,9 +712,8 @@ static Property pflash_cfi01_properties[] = {
 static void pflash_cfi01_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-    k->init = pflash_cfi01_init;
+    dc->realize = pflash_cfi01_realize;
     dc->props = pflash_cfi01_properties;
     dc->vmsd = &vmstate_pflash;
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 12/26] pflash-cfi02: QOM'ify some more
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (10 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 11/26] pflash_cfi01: use realize for pflash_cfi01 Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 13/26] pflash_cfi02: use realize for pflash_cfi02 Hu Tao
                   ` (14 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Introduce type constant and replace FROM_SYSBUS().

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/block/pflash_cfi02.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
index 5f25246..f1e76f0 100644
--- a/hw/block/pflash_cfi02.c
+++ b/hw/block/pflash_cfi02.c
@@ -55,6 +55,9 @@ do {                                                       \
 
 #define PFLASH_LAZY_ROMD_THRESHOLD 42
 
+#define TYPE_CFI_PFLASH02 "cfi.pflash02"
+#define CFI_PFLASH02(obj) OBJECT_CHECK(pflash_t, (obj), TYPE_CFI_PFLASH02)
+
 struct pflash_t {
     SysBusDevice busdev;
     BlockDriverState *bs;
@@ -588,7 +591,7 @@ static const MemoryRegionOps pflash_cfi02_ops_le = {
 
 static int pflash_cfi02_init(SysBusDevice *dev)
 {
-    pflash_t *pfl = FROM_SYSBUS(typeof(*pfl), dev);
+    pflash_t *pfl = CFI_PFLASH02(dev);
     uint32_t chip_len;
     int ret;
 
@@ -737,7 +740,7 @@ static void pflash_cfi02_class_init(ObjectClass *klass, void *data)
 }
 
 static const TypeInfo pflash_cfi02_info = {
-    .name           = "cfi.pflash02",
+    .name           = TYPE_CFI_PFLASH02,
     .parent         = TYPE_SYS_BUS_DEVICE,
     .instance_size  = sizeof(struct pflash_t),
     .class_init     = pflash_cfi02_class_init,
@@ -760,10 +763,7 @@ pflash_t *pflash_cfi02_register(hwaddr base,
                                 uint16_t unlock_addr0, uint16_t unlock_addr1,
                                 int be)
 {
-    DeviceState *dev = qdev_create(NULL, "cfi.pflash02");
-    SysBusDevice *busdev = SYS_BUS_DEVICE(dev);
-    pflash_t *pfl = (pflash_t *)object_dynamic_cast(OBJECT(dev),
-                                                    "cfi.pflash02");
+    DeviceState *dev = qdev_create(NULL, TYPE_CFI_PFLASH02);
 
     if (bs && qdev_prop_set_drive(dev, "drive", bs)) {
         abort();
@@ -782,6 +782,6 @@ pflash_t *pflash_cfi02_register(hwaddr base,
     qdev_prop_set_string(dev, "name", name);
     qdev_init_nofail(dev);
 
-    sysbus_mmio_map(busdev, 0, base);
-    return pfl;
+    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
+    return CFI_PFLASH02(dev);
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 13/26] pflash_cfi02: use realize for pflash_cfi02
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (11 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 12/26] pflash-cfi02: QOM'ify some more Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 14/26] ahci: QOM'ify some more Hu Tao
                   ` (13 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/block/pflash_cfi02.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
index f1e76f0..a31fd25 100644
--- a/hw/block/pflash_cfi02.c
+++ b/hw/block/pflash_cfi02.c
@@ -589,7 +589,7 @@ static const MemoryRegionOps pflash_cfi02_ops_le = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static int pflash_cfi02_init(SysBusDevice *dev)
+static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
 {
     pflash_t *pfl = CFI_PFLASH02(dev);
     uint32_t chip_len;
@@ -613,14 +613,16 @@ static int pflash_cfi02_init(SysBusDevice *dev)
         /* read the initial flash content */
         ret = bdrv_read(pfl->bs, 0, pfl->storage, chip_len >> 9);
         if (ret < 0) {
-            g_free(pfl);
-            return 1;
+            vmstate_unregister_ram(&pfl->orig_mem, DEVICE(pfl));
+            memory_region_destroy(&pfl->orig_mem);
+            error_setg(errp, "failed to read the initial flash content");
+            return;
         }
     }
 
     pflash_setup_mappings(pfl);
     pfl->rom_mode = 1;
-    sysbus_init_mmio(dev, &pfl->mem);
+    sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem);
 
     if (pfl->bs) {
         pfl->ro = bdrv_is_read_only(pfl->bs);
@@ -709,8 +711,6 @@ static int pflash_cfi02_init(SysBusDevice *dev)
 
     pfl->cfi_table[0x3b] = 0x00;
     pfl->cfi_table[0x3c] = 0x00;
-
-    return 0;
 }
 
 static Property pflash_cfi02_properties[] = {
@@ -733,9 +733,8 @@ static Property pflash_cfi02_properties[] = {
 static void pflash_cfi02_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-    k->init = pflash_cfi02_init;
+    dc->realize = pflash_cfi02_realize;
     dc->props = pflash_cfi02_properties;
 }
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 14/26] ahci: QOM'ify some more
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (12 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 13/26] pflash_cfi02: use realize for pflash_cfi02 Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 15/26] ahci: use realize for ahci Hu Tao
                   ` (12 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Introduce type constant and avoid DO_UPCAST().

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/ide/ahci.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 3c86b3a..5dcd662 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -1275,6 +1275,9 @@ const VMStateDescription vmstate_ahci = {
     },
 };
 
+#define TYPE_SYSBUS_AHCI "sysbus-ahci"
+#define SYSBUS_AHCI(obj) OBJECT_CHECK(SysbusAHCIState, (obj), TYPE_SYSBUS_AHCI)
+
 typedef struct SysbusAHCIState {
     SysBusDevice busdev;
     AHCIState ahci;
@@ -1292,15 +1295,15 @@ static const VMStateDescription vmstate_sysbus_ahci = {
 
 static void sysbus_ahci_reset(DeviceState *dev)
 {
-    SysbusAHCIState *s = DO_UPCAST(SysbusAHCIState, busdev.qdev, dev);
+    SysbusAHCIState *s = SYSBUS_AHCI(dev);
 
     ahci_reset(&s->ahci);
 }
 
 static int sysbus_ahci_init(SysBusDevice *dev)
 {
-    SysbusAHCIState *s = FROM_SYSBUS(SysbusAHCIState, dev);
-    ahci_init(&s->ahci, &dev->qdev, NULL, s->num_ports);
+    SysbusAHCIState *s = SYSBUS_AHCI(dev);
+    ahci_init(&s->ahci, DEVICE(dev), NULL, s->num_ports);
 
     sysbus_init_mmio(dev, &s->ahci.mem);
     sysbus_init_irq(dev, &s->ahci.irq);
@@ -1324,7 +1327,7 @@ static void sysbus_ahci_class_init(ObjectClass *klass, void *data)
 }
 
 static const TypeInfo sysbus_ahci_info = {
-    .name          = "sysbus-ahci",
+    .name          = TYPE_SYSBUS_AHCI,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(SysbusAHCIState),
     .class_init    = sysbus_ahci_class_init,
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 15/26] ahci: use realize for ahci
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (13 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 14/26] ahci: QOM'ify some more Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-21  9:13   ` Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 16/26] fwcfg: QOM'ify some more Hu Tao
                   ` (11 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/ide/ahci.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 5dcd662..d92239b 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -1300,14 +1300,13 @@ static void sysbus_ahci_reset(DeviceState *dev)
     ahci_reset(&s->ahci);
 }
 
-static int sysbus_ahci_init(SysBusDevice *dev)
+static void sysbus_ahci_realize(DeviceState *dev, Error **errp)
 {
     SysbusAHCIState *s = SYSBUS_AHCI(dev);
-    ahci_init(&s->ahci, DEVICE(dev), NULL, s->num_ports);
+    ahci_init(&s->ahci, dev, NULL, s->num_ports);
 
-    sysbus_init_mmio(dev, &s->ahci.mem);
-    sysbus_init_irq(dev, &s->ahci.irq);
-    return 0;
+    sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->ahci.mem);
+    sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->ahci.irq);
 }
 
 static Property sysbus_ahci_properties[] = {
@@ -1317,10 +1316,9 @@ static Property sysbus_ahci_properties[] = {
 
 static void sysbus_ahci_class_init(ObjectClass *klass, void *data)
 {
-    SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    sbc->init = sysbus_ahci_init;
+    dc->realize = sysbus_ahci_realize;
     dc->vmsd = &vmstate_sysbus_ahci;
     dc->props = sysbus_ahci_properties;
     dc->reset = sysbus_ahci_reset;
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 16/26] fwcfg: QOM'ify some more
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (14 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 15/26] ahci: use realize for ahci Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 17/26] fwcfg: use realize for fwcfg Hu Tao
                   ` (10 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Use type constant if possible and avoid DO_UPCAST().

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/nvram/fw_cfg.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index 3c255ce..c8722c2 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -35,6 +35,7 @@
 #define TYPE_FW_CFG "fw_cfg"
 #define FW_CFG_NAME "fw_cfg"
 #define FW_CFG_PATH "/machine/" FW_CFG_NAME
+#define FW_CFG(obj) OBJECT_CHECK(FWCfgState, (obj), TYPE_FW_CFG)
 
 typedef struct FWCfgEntry {
     uint32_t len;
@@ -326,7 +327,7 @@ static const MemoryRegionOps fw_cfg_comb_mem_ops = {
 
 static void fw_cfg_reset(DeviceState *d)
 {
-    FWCfgState *s = DO_UPCAST(FWCfgState, busdev.qdev, d);
+    FWCfgState *s = FW_CFG(d);
 
     fw_cfg_select(s, 0);
 }
@@ -489,12 +490,12 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
     SysBusDevice *d;
     FWCfgState *s;
 
-    dev = qdev_create(NULL, "fw_cfg");
+    dev = qdev_create(NULL, TYPE_FW_CFG);
     qdev_prop_set_uint32(dev, "ctl_iobase", ctl_port);
     qdev_prop_set_uint32(dev, "data_iobase", data_port);
     d = SYS_BUS_DEVICE(dev);
 
-    s = DO_UPCAST(FWCfgState, busdev.qdev, dev);
+    s = FW_CFG(dev);
 
     assert(!object_resolve_path(FW_CFG_PATH, NULL));
 
@@ -524,7 +525,7 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
 
 static int fw_cfg_init1(SysBusDevice *dev)
 {
-    FWCfgState *s = FROM_SYSBUS(FWCfgState, dev);
+    FWCfgState *s = FW_CFG(dev);
 
     memory_region_init_io(&s->ctl_iomem, &fw_cfg_ctl_mem_ops, s,
                           "fwcfg.ctl", FW_CFG_SIZE);
@@ -557,8 +558,7 @@ static Property fw_cfg_properties[] = {
 
 FWCfgState *fw_cfg_find(void)
 {
-    return OBJECT_CHECK(FWCfgState, object_resolve_path(FW_CFG_PATH, NULL),
-                        TYPE_FW_CFG);
+    return FW_CFG(object_resolve_path(FW_CFG_PATH, NULL));
 }
 
 static void fw_cfg_class_init(ObjectClass *klass, void *data)
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 17/26] fwcfg: use realize for fwcfg
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (15 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 16/26] fwcfg: QOM'ify some more Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-21  9:35   ` Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 18/26] scsi esp: QOM'ify some more Hu Tao
                   ` (9 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/nvram/fw_cfg.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index c8722c2..656ffcc 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -523,31 +523,37 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
     return s;
 }
 
-static int fw_cfg_init1(SysBusDevice *dev)
+static void fw_cfg_initfn(Object *obj)
 {
-    FWCfgState *s = FW_CFG(dev);
+    FWCfgState *s = FW_CFG(obj);
 
     memory_region_init_io(&s->ctl_iomem, &fw_cfg_ctl_mem_ops, s,
                           "fwcfg.ctl", FW_CFG_SIZE);
-    sysbus_init_mmio(dev, &s->ctl_iomem);
     memory_region_init_io(&s->data_iomem, &fw_cfg_data_mem_ops, s,
                           "fwcfg.data", FW_CFG_DATA_SIZE);
-    sysbus_init_mmio(dev, &s->data_iomem);
     /* In case ctl and data overlap: */
     memory_region_init_io(&s->comb_iomem, &fw_cfg_comb_mem_ops, s,
                           "fwcfg", FW_CFG_SIZE);
+}
+
+static void fw_cfg_realize(DeviceState *dev, Error **errp)
+{
+    FWCfgState *s = FW_CFG(dev);
+    SysBusDevice *b = SYS_BUS_DEVICE(dev);
+
+    sysbus_init_mmio(b, &s->ctl_iomem);
+    sysbus_init_mmio(b, &s->data_iomem);
 
     if (s->ctl_iobase + 1 == s->data_iobase) {
-        sysbus_add_io(dev, s->ctl_iobase, &s->comb_iomem);
+        sysbus_add_io(b, s->ctl_iobase, &s->comb_iomem);
     } else {
         if (s->ctl_iobase) {
-            sysbus_add_io(dev, s->ctl_iobase, &s->ctl_iomem);
+            sysbus_add_io(b, s->ctl_iobase, &s->ctl_iomem);
         }
         if (s->data_iobase) {
-            sysbus_add_io(dev, s->data_iobase, &s->data_iomem);
+            sysbus_add_io(b, s->data_iobase, &s->data_iomem);
         }
     }
-    return 0;
 }
 
 static Property fw_cfg_properties[] = {
@@ -564,9 +570,8 @@ FWCfgState *fw_cfg_find(void)
 static void fw_cfg_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-    k->init = fw_cfg_init1;
+    dc->realize = fw_cfg_realize;
     dc->no_user = 1;
     dc->reset = fw_cfg_reset;
     dc->vmsd = &vmstate_fw_cfg;
@@ -577,6 +582,7 @@ static const TypeInfo fw_cfg_info = {
     .name          = TYPE_FW_CFG,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(FWCfgState),
+    .instance_init = fw_cfg_initfn,
     .class_init    = fw_cfg_class_init,
 };
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 18/26] scsi esp: QOM'ify some more
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (16 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 17/26] fwcfg: use realize for fwcfg Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 19/26] scsi esp: use realize for scsi esp Hu Tao
                   ` (8 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Introduce type constant and avoid DO_UPCAST().

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/scsi/esp.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
index 0c81a50..f7d6389 100644
--- a/hw/scsi/esp.c
+++ b/hw/scsi/esp.c
@@ -578,6 +578,9 @@ const VMStateDescription vmstate_esp = {
     }
 };
 
+#define TYPE_ESP "esp"
+#define ESP(obj) OBJECT_CHECK(SysBusESPState, (obj), TYPE_ESP)
+
 typedef struct {
     SysBusDevice busdev;
     MemoryRegion iomem;
@@ -623,8 +626,8 @@ void esp_init(hwaddr espaddr, int it_shift,
     SysBusESPState *sysbus;
     ESPState *esp;
 
-    dev = qdev_create(NULL, "esp");
-    sysbus = DO_UPCAST(SysBusESPState, busdev.qdev, dev);
+    dev = qdev_create(NULL, TYPE_ESP);
+    sysbus = ESP(dev);
     esp = &sysbus->esp;
     esp->dma_memory_read = dma_memory_read;
     esp->dma_memory_write = dma_memory_write;
@@ -652,8 +655,7 @@ static const struct SCSIBusInfo esp_scsi_info = {
 
 static void sysbus_esp_gpio_demux(void *opaque, int irq, int level)
 {
-    DeviceState *d = opaque;
-    SysBusESPState *sysbus = container_of(d, SysBusESPState, busdev.qdev);
+    SysBusESPState *sysbus = ESP(opaque);
     ESPState *s = &sysbus->esp;
 
     switch (irq) {
@@ -668,7 +670,7 @@ static void sysbus_esp_gpio_demux(void *opaque, int irq, int level)
 
 static int sysbus_esp_init(SysBusDevice *dev)
 {
-    SysBusESPState *sysbus = FROM_SYSBUS(SysBusESPState, dev);
+    SysBusESPState *sysbus = ESP(dev);
     ESPState *s = &sysbus->esp;
 
     sysbus_init_irq(dev, &s->irq);
@@ -687,7 +689,7 @@ static int sysbus_esp_init(SysBusDevice *dev)
 
 static void sysbus_esp_hard_reset(DeviceState *dev)
 {
-    SysBusESPState *sysbus = DO_UPCAST(SysBusESPState, busdev.qdev, dev);
+    SysBusESPState *sysbus = ESP(dev);
     esp_hard_reset(&sysbus->esp);
 }
 
@@ -713,7 +715,7 @@ static void sysbus_esp_class_init(ObjectClass *klass, void *data)
 }
 
 static const TypeInfo sysbus_esp_info = {
-    .name          = "esp",
+    .name          = TYPE_ESP,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(SysBusESPState),
     .class_init    = sysbus_esp_class_init,
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 19/26] scsi esp: use realize for scsi esp
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (17 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 18/26] scsi esp: QOM'ify some more Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-21  9:47   ` Andreas Färber
  2013-07-21 10:30   ` [Qemu-devel] [PATCH qom-next] scsi: Improve error propagation for scsi_bus_legacy_handle_cmdline() Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 20/26] hpet: QOM'ify some more Hu Tao
                   ` (7 subsequent siblings)
  26 siblings, 2 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/scsi/esp.c | 30 ++++++++++++++++++++----------
 1 file changed, 20 insertions(+), 10 deletions(-)

diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
index f7d6389..714d2fd 100644
--- a/hw/scsi/esp.c
+++ b/hw/scsi/esp.c
@@ -668,23 +668,33 @@ static void sysbus_esp_gpio_demux(void *opaque, int irq, int level)
     }
 }
 
-static int sysbus_esp_init(SysBusDevice *dev)
+static void sysbus_esp_init(Object *obj)
+{
+    SysBusESPState *sysbus = ESP(obj);
+
+    memory_region_init_io(&sysbus->iomem, &sysbus_esp_mem_ops, sysbus,
+                          "esp", ESP_REGS << sysbus->it_shift);
+}
+
+static void sysbus_esp_realize(DeviceState *dev, Error **errp)
 {
     SysBusESPState *sysbus = ESP(dev);
+    SysBusDevice *b = SYS_BUS_DEVICE(dev);
     ESPState *s = &sysbus->esp;
 
-    sysbus_init_irq(dev, &s->irq);
+    sysbus_init_irq(b, &s->irq);
     assert(sysbus->it_shift != -1);
 
     s->chip_id = TCHI_FAS100A;
-    memory_region_init_io(&sysbus->iomem, &sysbus_esp_mem_ops, sysbus,
-                          "esp", ESP_REGS << sysbus->it_shift);
-    sysbus_init_mmio(dev, &sysbus->iomem);
+    sysbus_init_mmio(b, &sysbus->iomem);
 
-    qdev_init_gpio_in(&dev->qdev, sysbus_esp_gpio_demux, 2);
+    qdev_init_gpio_in(dev, sysbus_esp_gpio_demux, 2);
 
-    scsi_bus_new(&s->bus, &dev->qdev, &esp_scsi_info, NULL);
-    return scsi_bus_legacy_handle_cmdline(&s->bus);
+    scsi_bus_new(&s->bus, dev, &esp_scsi_info, NULL);
+    if (scsi_bus_legacy_handle_cmdline(&s->bus) < 0) {
+        error_setg(errp, "handling scsi bus failed");
+        return;
+    }
 }
 
 static void sysbus_esp_hard_reset(DeviceState *dev)
@@ -707,9 +717,8 @@ static const VMStateDescription vmstate_sysbus_esp_scsi = {
 static void sysbus_esp_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-    k->init = sysbus_esp_init;
+    dc->realize = sysbus_esp_realize;
     dc->reset = sysbus_esp_hard_reset;
     dc->vmsd = &vmstate_sysbus_esp_scsi;
 }
@@ -718,6 +727,7 @@ static const TypeInfo sysbus_esp_info = {
     .name          = TYPE_ESP,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(SysBusESPState),
+    .instance_init = sysbus_esp_init,
     .class_init    = sysbus_esp_class_init,
 };
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 20/26] hpet: QOM'ify some more
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (18 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 19/26] scsi esp: use realize for scsi esp Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 21/26] hpet: use realize for hpet Hu Tao
                   ` (6 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Introduce type constant, avoid FROM_SYSBUS().

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/timer/hpet.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
index 95dd01d..af80e63 100644
--- a/hw/timer/hpet.c
+++ b/hw/timer/hpet.c
@@ -42,6 +42,9 @@
 
 #define HPET_MSI_SUPPORT        0
 
+#define TYPE_HPET "hpet"
+#define HPET(obj) OBJECT_CHECK(HPETState, (obj), TYPE_HPET)
+
 struct HPETState;
 typedef struct HPETTimer {  /* timers */
     uint8_t tn;             /*timer number*/
@@ -634,7 +637,8 @@ static const MemoryRegionOps hpet_ram_ops = {
 
 static void hpet_reset(DeviceState *d)
 {
-    HPETState *s = FROM_SYSBUS(HPETState, SYS_BUS_DEVICE(d));
+    HPETState *s = HPET(d);
+    SysBusDevice *bus = SYS_BUS_DEVICE(d);
     int i;
 
     for (i = 0; i < s->num_timers; i++) {
@@ -657,7 +661,7 @@ static void hpet_reset(DeviceState *d)
     s->hpet_offset = 0ULL;
     s->config = 0ULL;
     hpet_cfg.hpet[s->hpet_id].event_timer_block_id = (uint32_t)s->capability;
-    hpet_cfg.hpet[s->hpet_id].address = SYS_BUS_DEVICE(d)->mmio[0].addr;
+    hpet_cfg.hpet[s->hpet_id].address = bus->mmio[0].addr;
 
     /* to document that the RTC lowers its output on reset as well */
     s->rtc_irq_level = 0;
@@ -665,7 +669,7 @@ static void hpet_reset(DeviceState *d)
 
 static void hpet_handle_legacy_irq(void *opaque, int n, int level)
 {
-    HPETState *s = FROM_SYSBUS(HPETState, opaque);
+    HPETState *s = HPET(opaque);
 
     if (n == HPET_LEGACY_PIT_INT) {
         if (!hpet_in_legacy_mode(s)) {
@@ -681,7 +685,7 @@ static void hpet_handle_legacy_irq(void *opaque, int n, int level)
 
 static int hpet_init(SysBusDevice *dev)
 {
-    HPETState *s = FROM_SYSBUS(HPETState, dev);
+    HPETState *s = HPET(dev);
     int i;
     HPETTimer *timer;
 
@@ -746,7 +750,7 @@ static void hpet_device_class_init(ObjectClass *klass, void *data)
 }
 
 static const TypeInfo hpet_device_info = {
-    .name          = "hpet",
+    .name          = TYPE_HPET,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(HPETState),
     .class_init    = hpet_device_class_init,
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 21/26] hpet: use realize for hpet
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (19 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 20/26] hpet: QOM'ify some more Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 22/26] kvmclock: QOM'ify some more Hu Tao
                   ` (5 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/timer/hpet.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
index af80e63..731fb92 100644
--- a/hw/timer/hpet.c
+++ b/hw/timer/hpet.c
@@ -683,7 +683,16 @@ static void hpet_handle_legacy_irq(void *opaque, int n, int level)
     }
 }
 
-static int hpet_init(SysBusDevice *dev)
+static void hpet_init(Object *obj)
+{
+    HPETState *s = HPET(obj);
+
+    /* HPET Area */
+    memory_region_init_io(&s->iomem, &hpet_ram_ops, s, "hpet", 0x400);
+    sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);
+}
+
+static void hpet_realize(DeviceState *dev, Error **errp)
 {
     HPETState *s = HPET(dev);
     int i;
@@ -695,14 +704,14 @@ static int hpet_init(SysBusDevice *dev)
     }
 
     if (hpet_cfg.count == 8) {
-        fprintf(stderr, "Only 8 instances of HPET is allowed\n");
-        return -1;
+        error_setg(errp, "Only 8 instances of HPET is allowed");
+        return;
     }
 
     s->hpet_id = hpet_cfg.count++;
 
     for (i = 0; i < HPET_NUM_IRQ_ROUTES; i++) {
-        sysbus_init_irq(dev, &s->irqs[i]);
+        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irqs[i]);
     }
 
     if (s->num_timers < HPET_MIN_TIMERS) {
@@ -722,13 +731,8 @@ static int hpet_init(SysBusDevice *dev)
     s->capability |= (s->num_timers - 1) << HPET_ID_NUM_TIM_SHIFT;
     s->capability |= ((HPET_CLK_PERIOD) << 32);
 
-    qdev_init_gpio_in(&dev->qdev, hpet_handle_legacy_irq, 2);
-    qdev_init_gpio_out(&dev->qdev, &s->pit_enabled, 1);
-
-    /* HPET Area */
-    memory_region_init_io(&s->iomem, &hpet_ram_ops, s, "hpet", 0x400);
-    sysbus_init_mmio(dev, &s->iomem);
-    return 0;
+    qdev_init_gpio_in(dev, hpet_handle_legacy_irq, 2);
+    qdev_init_gpio_out(dev, &s->pit_enabled, 1);
 }
 
 static Property hpet_device_properties[] = {
@@ -740,9 +744,8 @@ static Property hpet_device_properties[] = {
 static void hpet_device_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-    k->init = hpet_init;
+    dc->realize = hpet_realize;
     dc->no_user = 1;
     dc->reset = hpet_reset;
     dc->vmsd = &vmstate_hpet;
@@ -753,6 +756,7 @@ static const TypeInfo hpet_device_info = {
     .name          = TYPE_HPET,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(HPETState),
+    .instance_init = hpet_init,
     .class_init    = hpet_device_class_init,
 };
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 22/26] kvmclock: QOM'ify some more
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (20 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 21/26] hpet: use realize for hpet Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-16 14:00   ` Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 23/26] kvmclock: use realize for kvmclock Hu Tao
                   ` (4 subsequent siblings)
  26 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Introduce type constant and avoid FROM_SYSBUS().

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/i386/kvm/clock.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c
index 87d4d0f..fcdcbca 100644
--- a/hw/i386/kvm/clock.c
+++ b/hw/i386/kvm/clock.c
@@ -22,6 +22,9 @@
 #include <linux/kvm.h>
 #include <linux/kvm_para.h>
 
+#define TYPE_KVM_CLOCK "kvmclock"
+#define KVM_CLOCK(obj) OBJECT_CHECK(KVMClockState, (obj), TYPE_KVM_CLOCK)
+
 typedef struct KVMClockState {
     SysBusDevice busdev;
     uint64_t clock;
@@ -89,7 +92,7 @@ static void kvmclock_vm_state_change(void *opaque, int running,
 
 static int kvmclock_init(SysBusDevice *dev)
 {
-    KVMClockState *s = FROM_SYSBUS(KVMClockState, dev);
+    KVMClockState *s = KVM_CLOCK(dev);
 
     qemu_add_vm_change_state_handler(kvmclock_vm_state_change, s);
     return 0;
@@ -119,7 +122,7 @@ static void kvmclock_class_init(ObjectClass *klass, void *data)
 }
 
 static const TypeInfo kvmclock_info = {
-    .name          = "kvmclock",
+    .name          = TYPE_KVM_CLOCK,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(KVMClockState),
     .class_init    = kvmclock_class_init,
@@ -131,7 +134,7 @@ void kvmclock_create(void)
     if (kvm_enabled() &&
         first_cpu->features[FEAT_KVM] & ((1ULL << KVM_FEATURE_CLOCKSOURCE) |
                                          (1ULL << KVM_FEATURE_CLOCKSOURCE2))) {
-        sysbus_create_simple("kvmclock", -1, NULL);
+        sysbus_create_simple(TYPE_KVM_CLOCK, -1, NULL);
     }
 }
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 23/26] kvmclock: use realize for kvmclock
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (21 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 22/26] kvmclock: QOM'ify some more Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 24/26] kvmvapic realize Hu Tao
                   ` (3 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/i386/kvm/clock.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c
index fcdcbca..4f6e6f9 100644
--- a/hw/i386/kvm/clock.c
+++ b/hw/i386/kvm/clock.c
@@ -90,12 +90,11 @@ static void kvmclock_vm_state_change(void *opaque, int running,
     }
 }
 
-static int kvmclock_init(SysBusDevice *dev)
+static void kvmclock_realize(DeviceState *dev, Error **errp)
 {
     KVMClockState *s = KVM_CLOCK(dev);
 
     qemu_add_vm_change_state_handler(kvmclock_vm_state_change, s);
-    return 0;
 }
 
 static const VMStateDescription kvmclock_vmsd = {
@@ -114,9 +113,8 @@ static const VMStateDescription kvmclock_vmsd = {
 static void kvmclock_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-    k->init = kvmclock_init;
+    dc->realize = kvmclock_realize;
     dc->no_user = 1;
     dc->vmsd = &kvmclock_vmsd;
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 24/26] kvmvapic realize
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (22 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 23/26] kvmclock: use realize for kvmclock Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 25/26] ioapic: use realize for ioapic Hu Tao
                   ` (2 subsequent siblings)
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/i386/kvmvapic.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/i386/kvmvapic.c b/hw/i386/kvmvapic.c
index f93629f..fa85096 100644
--- a/hw/i386/kvmvapic.c
+++ b/hw/i386/kvmvapic.c
@@ -698,19 +698,18 @@ static const MemoryRegionOps vapic_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static int vapic_init(SysBusDevice *dev)
+static void vapic_realize(DeviceState *dev, Error **errp)
 {
     VAPICROMState *s = VAPIC(dev);
+    SysBusDevice *b = SYS_BUS_DEVICE(dev);
 
     memory_region_init_io(&s->io, &vapic_ops, s, "kvmvapic", 2);
-    sysbus_add_io(dev, VAPIC_IO_PORT, &s->io);
-    sysbus_init_ioports(dev, VAPIC_IO_PORT, 2);
+    sysbus_add_io(b, VAPIC_IO_PORT, &s->io);
+    sysbus_init_ioports(b, VAPIC_IO_PORT, 2);
 
     option_rom[nb_option_roms].name = "kvmvapic.bin";
     option_rom[nb_option_roms].bootindex = -1;
     nb_option_roms++;
-
-    return 0;
 }
 
 static void do_vapic_enable(void *data)
@@ -806,13 +805,12 @@ static const VMStateDescription vmstate_vapic = {
 
 static void vapic_class_init(ObjectClass *klass, void *data)
 {
-    SysBusDeviceClass *sc = SYS_BUS_DEVICE_CLASS(klass);
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->no_user = 1;
     dc->reset   = vapic_reset;
     dc->vmsd    = &vmstate_vapic;
-    sc->init    = vapic_init;
+    dc->realize = vapic_realize;
 }
 
 static const TypeInfo vapic_type = {
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 25/26] ioapic: use realize for ioapic
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (23 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 24/26] kvmvapic realize Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-21 10:35   ` Andreas Färber
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 26/26] isa bus: remove isabus_bridge_init since it does nothing Hu Tao
  2013-07-21 10:58 ` [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Andreas Färber
  26 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/intc/ioapic_common.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/intc/ioapic_common.c b/hw/intc/ioapic_common.c
index 5c5bb3c..5dc1f1e 100644
--- a/hw/intc/ioapic_common.c
+++ b/hw/intc/ioapic_common.c
@@ -57,23 +57,22 @@ static int ioapic_dispatch_post_load(void *opaque, int version_id)
     return 0;
 }
 
-static int ioapic_init_common(SysBusDevice *dev)
+static void ioapic_common_realize(DeviceState *dev, Error **errp)
 {
     IOAPICCommonState *s = IOAPIC_COMMON(dev);
     IOAPICCommonClass *info;
     static int ioapic_no;
 
     if (ioapic_no >= MAX_IOAPICS) {
-        return -1;
+        error_setg(errp, "invalid ioapic number: %d", ioapic_no);
+        return;
     }
 
     info = IOAPIC_COMMON_GET_CLASS(s);
     info->init(s, ioapic_no);
 
-    sysbus_init_mmio(&s->busdev, &s->io_memory);
+    sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->io_memory);
     ioapic_no++;
-
-    return 0;
 }
 
 static const VMStateDescription vmstate_ioapic_common = {
@@ -95,10 +94,9 @@ static const VMStateDescription vmstate_ioapic_common = {
 
 static void ioapic_common_class_init(ObjectClass *klass, void *data)
 {
-    SysBusDeviceClass *sc = SYS_BUS_DEVICE_CLASS(klass);
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    sc->init = ioapic_init_common;
+    dc->realize = ioapic_common_realize;
     dc->vmsd = &vmstate_ioapic_common;
     dc->no_user = 1;
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH v2 26/26] isa bus: remove isabus_bridge_init since it does nothing
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (24 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 25/26] ioapic: use realize for ioapic Hu Tao
@ 2013-07-01 10:18 ` Hu Tao
  2013-07-21 10:58 ` [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Andreas Färber
  26 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-01 10:18 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/isa/isa-bus.c | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
index 136d17e..6aea97b 100644
--- a/hw/isa/isa-bus.c
+++ b/hw/isa/isa-bus.c
@@ -192,18 +192,10 @@ static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent)
     }
 }
 
-static int isabus_bridge_init(SysBusDevice *dev)
-{
-    /* nothing */
-    return 0;
-}
-
 static void isabus_bridge_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-    k->init = isabus_bridge_init;
     dc->fw_name = "isa";
     dc->no_user = 1;
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 01/26] sysbus: document SysBusDeviceClass about @init
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 01/26] sysbus: document SysBusDeviceClass about @init Hu Tao
@ 2013-07-03  1:19   ` Andreas Färber
  2013-07-03  1:24     ` Hu Tao
  0 siblings, 1 reply; 49+ messages in thread
From: Andreas Färber @ 2013-07-03  1:19 UTC (permalink / raw)
  To: Hu Tao; +Cc: qemu-devel

Am 01.07.2013 12:18, schrieb Hu Tao:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  include/hw/sysbus.h | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
> index 7c2e316..9614758 100644
> --- a/include/hw/sysbus.h
> +++ b/include/hw/sysbus.h
> @@ -23,6 +23,16 @@ typedef struct SysBusDevice SysBusDevice;
>  #define SYS_BUS_DEVICE_GET_CLASS(obj) \
>       OBJECT_GET_CLASS(SysBusDeviceClass, (obj), TYPE_SYS_BUS_DEVICE)
>  
> +/*
> + * SysBusDeviceClass:
> + * @parent_class: This is private

Because it is private, the usual way is to suppress its documentation
below via private/public markers.

> + * @init: Callback function invoked when the #DeviceState::realized property
> + * is changed to %true. Deprecated, new types inheriting directly from
> + * TYPE_SYS_BUS_DEVICE should use #DeviceClass::realize instead, new leaf
> + * types should consult their respective parent type. SysBusDeviceClass is
> + * not implementing #DeviceClass::realize, so deriving classes can simply
> + * ignore it.
> + */
>  typedef struct SysBusDeviceClass {
>      DeviceClass parent_class;
>  

Thanks for documenting this. I'm queuing it with the following gtk-doc
syntax and contential modifications, please let me know if you wish for
any wording changes.

Andreas

diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
index 9614758..8c17165 100644
--- a/include/hw/sysbus.h
+++ b/include/hw/sysbus.h
@@ -23,18 +23,20 @@ typedef struct SysBusDevice SysBusDevice;
 #define SYS_BUS_DEVICE_GET_CLASS(obj) \
      OBJECT_GET_CLASS(SysBusDeviceClass, (obj), TYPE_SYS_BUS_DEVICE)

-/*
+/**
  * SysBusDeviceClass:
- * @parent_class: This is private
- * @init: Callback function invoked when the #DeviceState::realized
property
+ * @init: Callback function invoked when the #DeviceState.realized property
  * is changed to %true. Deprecated, new types inheriting directly from
- * TYPE_SYS_BUS_DEVICE should use #DeviceClass::realize instead, new leaf
- * types should consult their respective parent type. SysBusDeviceClass is
- * not implementing #DeviceClass::realize, so deriving classes can simply
- * ignore it.
+ * TYPE_SYS_BUS_DEVICE should use #DeviceClass.realize instead, new leaf
+ * types should consult their respective parent type.
+ *
+ * SysBusDeviceClass is not overriding #DeviceClass.realize, so derived
+ * classes overriding it are not required to invoke its implementation.
  */
 typedef struct SysBusDeviceClass {
+    /*< private >*/
     DeviceClass parent_class;
+    /*< public >*/

     int (*init)(SysBusDevice *dev);
 } SysBusDeviceClass;

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 01/26] sysbus: document SysBusDeviceClass about @init
  2013-07-03  1:19   ` Andreas Färber
@ 2013-07-03  1:24     ` Hu Tao
  0 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-03  1:24 UTC (permalink / raw)
  To: Andreas Färber; +Cc: qemu-devel

On Wed, Jul 03, 2013 at 03:19:53AM +0200, Andreas Färber wrote:
> Am 01.07.2013 12:18, schrieb Hu Tao:
> > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> > ---
> >  include/hw/sysbus.h | 10 ++++++++++
> >  1 file changed, 10 insertions(+)
> > 
> > diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
> > index 7c2e316..9614758 100644
> > --- a/include/hw/sysbus.h
> > +++ b/include/hw/sysbus.h
> > @@ -23,6 +23,16 @@ typedef struct SysBusDevice SysBusDevice;
> >  #define SYS_BUS_DEVICE_GET_CLASS(obj) \
> >       OBJECT_GET_CLASS(SysBusDeviceClass, (obj), TYPE_SYS_BUS_DEVICE)
> >  
> > +/*
> > + * SysBusDeviceClass:
> > + * @parent_class: This is private
> 
> Because it is private, the usual way is to suppress its documentation
> below via private/public markers.
> 
> > + * @init: Callback function invoked when the #DeviceState::realized property
> > + * is changed to %true. Deprecated, new types inheriting directly from
> > + * TYPE_SYS_BUS_DEVICE should use #DeviceClass::realize instead, new leaf
> > + * types should consult their respective parent type. SysBusDeviceClass is
> > + * not implementing #DeviceClass::realize, so deriving classes can simply
> > + * ignore it.
> > + */
> >  typedef struct SysBusDeviceClass {
> >      DeviceClass parent_class;
> >  
> 
> Thanks for documenting this. I'm queuing it with the following gtk-doc
> syntax and contential modifications, please let me know if you wish for
> any wording changes.

Thanks for the changes, looks OK to me.

> 
> Andreas
> 
> diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
> index 9614758..8c17165 100644
> --- a/include/hw/sysbus.h
> +++ b/include/hw/sysbus.h
> @@ -23,18 +23,20 @@ typedef struct SysBusDevice SysBusDevice;
>  #define SYS_BUS_DEVICE_GET_CLASS(obj) \
>       OBJECT_GET_CLASS(SysBusDeviceClass, (obj), TYPE_SYS_BUS_DEVICE)
> 
> -/*
> +/**
>   * SysBusDeviceClass:
> - * @parent_class: This is private
> - * @init: Callback function invoked when the #DeviceState::realized
> property
> + * @init: Callback function invoked when the #DeviceState.realized property
>   * is changed to %true. Deprecated, new types inheriting directly from
> - * TYPE_SYS_BUS_DEVICE should use #DeviceClass::realize instead, new leaf
> - * types should consult their respective parent type. SysBusDeviceClass is
> - * not implementing #DeviceClass::realize, so deriving classes can simply
> - * ignore it.
> + * TYPE_SYS_BUS_DEVICE should use #DeviceClass.realize instead, new leaf
> + * types should consult their respective parent type.
> + *
> + * SysBusDeviceClass is not overriding #DeviceClass.realize, so derived
> + * classes overriding it are not required to invoke its implementation.
>   */
>  typedef struct SysBusDeviceClass {
> +    /*< private >*/
>      DeviceClass parent_class;
> +    /*< public >*/
> 
>      int (*init)(SysBusDevice *dev);
>  } SysBusDeviceClass;
> 
> -- 
> SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
> GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 02/26] ohci: QOM'ify some more
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 02/26] ohci: QOM'ify some more Hu Tao
@ 2013-07-03  1:52   ` Andreas Färber
  0 siblings, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-03  1:52 UTC (permalink / raw)
  To: Hu Tao; +Cc: Peter Crosthwaite, qemu-devel, Gerd Hoffmann

Am 01.07.2013 12:18, schrieb Hu Tao:
> Introduce type constant and avoid DO_UPCAST().
> 
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/usb/hcd-ohci.c | 20 ++++++++++++--------
>  1 file changed, 12 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
> index 5513924..912255d 100644
> --- a/hw/usb/hcd-ohci.c
> +++ b/hw/usb/hcd-ohci.c
> @@ -1842,6 +1842,8 @@ static int usb_ohci_init(OHCIState *ohci, DeviceState *dev,
>      return 0;
>  }
>  
> +#define TYPE_PCI_OHCI "pci-ohci"
> +#define PCI_OHCI(obj) OBJECT_CHECK(OHCIPCIState, (obj), TYPE_PCI_OHCI)

I added a while line here and converted the last three remaining uses of
pci_dev in the initfn so that both fields could be renamed to parent_obj
as proof of complete conversion.

Thanks, queued this and the following one on qom-next:
https://github.com/afaerber/qemu-cpu/commits/qom-next

There was an overlap with Peter's usb/* PCIDevice patch, I believe this
one is a superset of the ohci part.

Andreas

>  typedef struct {
>      PCIDevice pci_dev;
>      OHCIState state;
> @@ -1852,23 +1854,25 @@ typedef struct {
>  
>  static int usb_ohci_initfn_pci(struct PCIDevice *dev)
>  {
> -    OHCIPCIState *ohci = DO_UPCAST(OHCIPCIState, pci_dev, dev);
> +    OHCIPCIState *ohci = PCI_OHCI(dev);
>  
>      ohci->pci_dev.config[PCI_CLASS_PROG] = 0x10; /* OHCI */
>      ohci->pci_dev.config[PCI_INTERRUPT_PIN] = 0x01; /* interrupt pin A */
>  
> -    if (usb_ohci_init(&ohci->state, &dev->qdev, ohci->num_ports, 0,
> +    if (usb_ohci_init(&ohci->state, DEVICE(dev), ohci->num_ports, 0,
>                        ohci->masterbus, ohci->firstport,
>                        pci_get_address_space(dev)) != 0) {
>          return -1;
>      }
>      ohci->state.irq = ohci->pci_dev.irq[0];
>  
> -    /* TODO: avoid cast below by using dev */
> -    pci_register_bar(&ohci->pci_dev, 0, 0, &ohci->state.mem);
> +    pci_register_bar(dev, 0, 0, &ohci->state.mem);
>      return 0;
>  }
>  
> +#define TYPE_SYSBUS_OHCI "sysbus-ohci"
> +#define SYSBUS_OHCI(obj) OBJECT_CHECK(OHCISysBusState, (obj), TYPE_SYSBUS_OHCI)
> +
>  typedef struct {
>      SysBusDevice busdev;
>      OHCIState ohci;
> @@ -1878,10 +1882,10 @@ typedef struct {
>  
>  static int ohci_init_pxa(SysBusDevice *dev)
>  {
> -    OHCISysBusState *s = FROM_SYSBUS(OHCISysBusState, dev);
> +    OHCISysBusState *s = SYSBUS_OHCI(dev);
>  
>      /* Cannot fail as we pass NULL for masterbus */
> -    usb_ohci_init(&s->ohci, &dev->qdev, s->num_ports, s->dma_offset, NULL, 0,
> +    usb_ohci_init(&s->ohci, DEVICE(dev), s->num_ports, s->dma_offset, NULL, 0,
>                    &address_space_memory);
>      sysbus_init_irq(dev, &s->ohci.irq);
>      sysbus_init_mmio(dev, &s->ohci.mem);
> @@ -1911,7 +1915,7 @@ static void ohci_pci_class_init(ObjectClass *klass, void *data)
>  }
>  
>  static const TypeInfo ohci_pci_info = {
> -    .name          = "pci-ohci",
> +    .name          = TYPE_PCI_OHCI,
>      .parent        = TYPE_PCI_DEVICE,
>      .instance_size = sizeof(OHCIPCIState),
>      .class_init    = ohci_pci_class_init,
> @@ -1934,7 +1938,7 @@ static void ohci_sysbus_class_init(ObjectClass *klass, void *data)
>  }
>  
>  static const TypeInfo ohci_sysbus_info = {
> -    .name          = "sysbus-ohci",
> +    .name          = TYPE_SYSBUS_OHCI,
>      .parent        = TYPE_SYS_BUS_DEVICE,
>      .instance_size = sizeof(OHCISysBusState),
>      .class_init    = ohci_sysbus_class_init,
> 


-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 03/26] ohci: use realize for ohci
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 03/26] ohci: use realize for ohci Hu Tao
@ 2013-07-07 15:22   ` Andreas Färber
  0 siblings, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-07 15:22 UTC (permalink / raw)
  To: Hu Tao; +Cc: Peter Crosthwaite, qemu-devel

Am 01.07.2013 12:18, schrieb Hu Tao:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/usb/hcd-ohci.c | 14 ++++++--------
>  1 file changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
> index 912255d..ee824ee 100644
> --- a/hw/usb/hcd-ohci.c
> +++ b/hw/usb/hcd-ohci.c
> @@ -1880,17 +1880,16 @@ typedef struct {
>      dma_addr_t dma_offset;
>  } OHCISysBusState;
>  
> -static int ohci_init_pxa(SysBusDevice *dev)
> +static void ohci_realize_pxa(DeviceState *dev, Error **errp)
>  {
>      OHCISysBusState *s = SYSBUS_OHCI(dev);
> +    SysBusDevice *b = SYS_BUS_DEVICE(dev);

I stumbled over b not being very descriptive for SysBusDevice (I
would've expected d for ...Device). Seeing that PCIDevice *pd was used
elsewhere, I will adopt sbd here, as suggested by Peter C.

https://github.com/afaerber/qemu-cpu/commits/qom-next

Regards,
Andreas

>  
>      /* Cannot fail as we pass NULL for masterbus */
> -    usb_ohci_init(&s->ohci, DEVICE(dev), s->num_ports, s->dma_offset, NULL, 0,
> +    usb_ohci_init(&s->ohci, dev, s->num_ports, s->dma_offset, NULL, 0,
>                    &address_space_memory);
> -    sysbus_init_irq(dev, &s->ohci.irq);
> -    sysbus_init_mmio(dev, &s->ohci.mem);
> -
> -    return 0;
> +    sysbus_init_irq(b, &s->ohci.irq);
> +    sysbus_init_mmio(b, &s->ohci.mem);
>  }
>  
>  static Property ohci_pci_properties[] = {
> @@ -1930,9 +1929,8 @@ static Property ohci_sysbus_properties[] = {
>  static void ohci_sysbus_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
> -    SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
>  
> -    sbc->init = ohci_init_pxa;
> +    dc->realize = ohci_realize_pxa;
>      dc->desc = "OHCI USB Controller";
>      dc->props = ohci_sysbus_properties;
>  }
> 


-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 05/26] i440fx: use type-safe cast instead of directly access of parent dev
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 05/26] i440fx: use type-safe cast instead of directly access of parent dev Hu Tao
@ 2013-07-07 17:03   ` Andreas Färber
  0 siblings, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-07 17:03 UTC (permalink / raw)
  To: Hu Tao; +Cc: Peter Crosthwaite, qemu-devel

Am 01.07.2013 12:18, schrieb Hu Tao:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/pci-host/piix.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)

Thanks, converting the remaining dev uses on top and renaming.
https://github.com/afaerber/qemu-cpu/commits/qom-next

Andreas

@@ -194,7 +197,7 @@ static const VMStateDescription vmstate_i440fx = {
     .load_state_old = i440fx_load_old,
     .post_load = i440fx_post_load,
     .fields      = (VMStateField []) {
-        VMSTATE_PCI_DEVICE(dev, PCII440FXState),
+        VMSTATE_PCI_DEVICE(parent_obj, PCII440FXState),
         VMSTATE_UINT8(smm_enabled, PCII440FXState),
         VMSTATE_END_OF_LIST()
     }
@@ -221,7 +224,7 @@ static int i440fx_initfn(PCIDevice *dev)
 {
     PCII440FXState *d = I440FX_PCI_DEVICE(dev);

-    d->dev.config[I440FX_SMRAM] = 0x02;
+    dev->config[I440FX_SMRAM] = 0x02;

     cpu_smm_register(&i440fx_set_smm, d);
     return 0;
@@ -308,9 +311,10 @@ static PCIBus *i440fx_common_init(const char
*device_name,
     *piix3_devfn = piix3->dev.devfn;

     ram_size = ram_size / 8 / 1024 / 1024;
-    if (ram_size > 255)
+    if (ram_size > 255) {
         ram_size = 255;
-    (*pi440fx_state)->dev.config[0x57]=ram_size;
+    }
+    d->config[0x57] = ram_size;

     i440fx_update_memory_mappings(f);



-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 04/26] i440fx-pcihost: use realize for i440fx-pcihost
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 04/26] i440fx-pcihost: use realize for i440fx-pcihost Hu Tao
@ 2013-07-07 21:24   ` Andreas Färber
  0 siblings, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-07 21:24 UTC (permalink / raw)
  To: Hu Tao; +Cc: qemu-devel

Am 01.07.2013 12:18, schrieb Hu Tao:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/pci-host/piix.c | 25 +++++++++++++++----------
>  1 file changed, 15 insertions(+), 10 deletions(-)

Thanks, rebased and applied to qom-next:
https://github.com/afaerber/qemu-cpu/commits/qom-next

Andreas

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 06/26] q35: use type-safe cast instead of directly access of parent dev
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 06/26] q35: " Hu Tao
@ 2013-07-07 23:05   ` Andreas Färber
  0 siblings, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-07 23:05 UTC (permalink / raw)
  To: Hu Tao; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 631 bytes --]

Am 01.07.2013 12:18, schrieb Hu Tao:
> And remove variables if possible.
> 
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/pci-host/q35.c | 35 ++++++++++++++++++-----------------
>  1 file changed, 18 insertions(+), 17 deletions(-)

Thanks, converted the remaining ones as attached and queued on qom-next:
https://github.com/afaerber/qemu-cpu/commits/qom-next

Do note that we will need to later touch the PCIBus again to use
pci_bus_new_inplace().

Andreas

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

[-- Attachment #2: q35.diff --]
[-- Type: text/x-patch, Size: 3138 bytes --]

diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index e4cde04..480d981 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -59,6 +59,7 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
     const char *boot_device = args->boot_device;
     ram_addr_t below_4g_mem_size, above_4g_mem_size;
     Q35PCIHost *q35_host;
+    PCIDevice *q35_pci;
     PCIBus *host_bus;
     PCIDevice *lpc;
     BusState *idebus[MAX_SATA_PORTS];
@@ -133,7 +134,8 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
     q35_host->mch.above_4g_mem_size = above_4g_mem_size;
     /* pci */
     qdev_init_nofail(DEVICE(q35_host));
-    host_bus = q35_host->host.pci.bus;
+    q35_pci = PCI_DEVICE(q35_host);
+    host_bus = q35_pci->bus;
     /* create ISA bus */
     lpc = pci_create_simple_multifunction(host_bus, PCI_DEVFN(ICH9_LPC_DEV,
                                           ICH9_LPC_FUNC), true,
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index f92f661..beda3e6 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -62,7 +62,7 @@ static int q35_host_init(SysBusDevice *dev)
 }
 
 static Property mch_props[] = {
-    DEFINE_PROP_UINT64("MCFG", Q35PCIHost, host.base_addr,
+    DEFINE_PROP_UINT64("MCFG", Q35PCIHost, parent_obj.base_addr,
                         MCH_HOST_BRIDGE_PCIEXBAR_DEFAULT),
     DEFINE_PROP_END_OF_LIST(),
 };
@@ -102,9 +102,9 @@ static const TypeInfo q35_host_info = {
 /* PCIe MMCFG */
 static void mch_update_pciexbar(MCHPCIState *mch)
 {
-    PCIDevice *pci_dev = &mch->d;
-    BusState *bus = qdev_get_parent_bus(DEVICE(pci_dev));
-    DeviceState *qdev = bus->parent;
+    PCIDevice *pci_dev = PCI_DEVICE(mch);
+    BusState *bus = qdev_get_parent_bus(DEVICE(mch));
+    PCIExpressHost *pehb = PCIE_HOST_BRIDGE(bus->parent);
 
     uint64_t pciexbar;
     int enable;
@@ -136,7 +136,7 @@ static void mch_update_pciexbar(MCHPCIState *mch)
         break;
     }
     addr = pciexbar & addr_mask;
-    pcie_host_mmcfg_update(PCIE_HOST_BRIDGE(qdev), enable, addr, length);
+    pcie_host_mmcfg_update(pehb, enable, addr, length);
 }
 
 /* PAM */
@@ -220,7 +220,7 @@ static const VMStateDescription vmstate_mch = {
     .minimum_version_id_old = 1,
     .post_load = mch_post_load,
     .fields = (VMStateField []) {
-        VMSTATE_PCI_DEVICE(d, MCHPCIState),
+        VMSTATE_PCI_DEVICE(parent_obj, MCHPCIState),
         VMSTATE_UINT8(smm_enabled, MCHPCIState),
         VMSTATE_END_OF_LIST()
     }
diff --git a/include/hw/pci-host/q35.h b/include/hw/pci-host/q35.h
index e182c82..1a8ff83 100644
--- a/include/hw/pci-host/q35.h
+++ b/include/hw/pci-host/q35.h
@@ -43,7 +43,10 @@
      OBJECT_CHECK(MCHPCIState, (obj), TYPE_MCH_PCI_DEVICE)
 
 typedef struct MCHPCIState {
-    PCIDevice d;
+    /*< private >*/
+    PCIDevice parent_obj;
+    /*< public >*/
+
     MemoryRegion *ram_memory;
     MemoryRegion *pci_address_space;
     MemoryRegion *system_memory;
@@ -58,7 +61,10 @@ typedef struct MCHPCIState {
 } MCHPCIState;
 
 typedef struct Q35PCIHost {
-    PCIExpressHost host;
+    /*< private >*/
+    PCIExpressHost parent_obj;
+    /*< public >*/
+
     MCHPCIState mch;
 } Q35PCIHost;
 

[-- Attachment #3: q35a.diff --]
[-- Type: text/x-patch, Size: 941 bytes --]

diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 480d981..bdac09e 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -59,7 +59,7 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
     const char *boot_device = args->boot_device;
     ram_addr_t below_4g_mem_size, above_4g_mem_size;
     Q35PCIHost *q35_host;
-    PCIDevice *q35_pci;
+    PCIHostState *phb;
     PCIBus *host_bus;
     PCIDevice *lpc;
     BusState *idebus[MAX_SATA_PORTS];
@@ -134,8 +134,8 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
     q35_host->mch.above_4g_mem_size = above_4g_mem_size;
     /* pci */
     qdev_init_nofail(DEVICE(q35_host));
-    q35_pci = PCI_DEVICE(q35_host);
-    host_bus = q35_pci->bus;
+    phb = PCI_HOST_BRIDGE(q35_host);
+    host_bus = phb->bus;
     /* create ISA bus */
     lpc = pci_create_simple_multifunction(host_bus, PCI_DEVFN(ICH9_LPC_DEV,
                                           ICH9_LPC_FUNC), true,

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 07/26] q35: use realize for q35 host
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 07/26] q35: use realize for q35 host Hu Tao
@ 2013-07-08  1:20   ` Andreas Färber
  0 siblings, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-08  1:20 UTC (permalink / raw)
  To: Hu Tao; +Cc: Paolo Bonzini, qemu-devel, Anthony Liguori

Am 01.07.2013 12:18, schrieb Hu Tao:
> and split off memory region initialization into instance_init.
> 
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/pci-host/q35.c | 29 +++++++++++++++--------------
>  1 file changed, 15 insertions(+), 14 deletions(-)

Thanks, rebased and applied to qom-next:
https://github.com/afaerber/qemu-cpu/commits/qom-next

As mentioned, pci_bus_new() in realize should be replaced with
pci_bus_new_inplace() in instance_init. However investigating that, I
noticed that either function registers VMState, which is supposed to be
done at realize time. This being a system chipset device, I think we can
get away with that (same as for PReP), but I'll do it in a follow-up so
that the blame goes on me.

I think the long-term solution would be extending our realize/unrealize
mechanisms to BusClass.

Regards,
Andreas

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 22/26] kvmclock: QOM'ify some more
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 22/26] kvmclock: QOM'ify some more Hu Tao
@ 2013-07-16 14:00   ` Andreas Färber
  0 siblings, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-16 14:00 UTC (permalink / raw)
  To: Hu Tao; +Cc: Peter Crosthwaite, qemu-devel

Am 01.07.2013 12:18, schrieb Hu Tao:
> Introduce type constant and avoid FROM_SYSBUS().
> 
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/i386/kvm/clock.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)

Thanks, by now I've picked up all remaining QOM cast patches (and
renamed and marked up their parent field):
https://github.com/afaerber/qemu-cpu/commits/qom-next

The remaining realizefn patches still need some calm review time.

Andreas

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 15/26] ahci: use realize for ahci
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 15/26] ahci: use realize for ahci Hu Tao
@ 2013-07-21  9:13   ` Andreas Färber
  0 siblings, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-21  9:13 UTC (permalink / raw)
  To: Hu Tao; +Cc: qemu-devel

Am 01.07.2013 12:18, schrieb Hu Tao:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/ide/ahci.c | 12 +++++-------
>  1 file changed, 5 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
> index 5dcd662..d92239b 100644
> --- a/hw/ide/ahci.c
> +++ b/hw/ide/ahci.c
> @@ -1300,14 +1300,13 @@ static void sysbus_ahci_reset(DeviceState *dev)
>      ahci_reset(&s->ahci);
>  }
>  
> -static int sysbus_ahci_init(SysBusDevice *dev)
> +static void sysbus_ahci_realize(DeviceState *dev, Error **errp)
>  {
>      SysbusAHCIState *s = SYSBUS_AHCI(dev);
> -    ahci_init(&s->ahci, DEVICE(dev), NULL, s->num_ports);
> +    ahci_init(&s->ahci, dev, NULL, s->num_ports);

I prepared a local patch to rename ahci_init() to ahci_realize(), but
didn't find the time to investigate which parts could safely stay in an
ahci_init() called from instance_init, so postponing that.

Andreas

>  
> -    sysbus_init_mmio(dev, &s->ahci.mem);
> -    sysbus_init_irq(dev, &s->ahci.irq);
> -    return 0;
> +    sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->ahci.mem);
> +    sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->ahci.irq);
>  }
>  
>  static Property sysbus_ahci_properties[] = {
> @@ -1317,10 +1316,9 @@ static Property sysbus_ahci_properties[] = {
>  
>  static void sysbus_ahci_class_init(ObjectClass *klass, void *data)
>  {
> -    SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
>      DeviceClass *dc = DEVICE_CLASS(klass);
>  
> -    sbc->init = sysbus_ahci_init;
> +    dc->realize = sysbus_ahci_realize;
>      dc->vmsd = &vmstate_sysbus_ahci;
>      dc->props = sysbus_ahci_properties;
>      dc->reset = sysbus_ahci_reset;
> 


-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 09/26] fdc: use realize for fdc.
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 09/26] fdc: use realize for fdc Hu Tao
@ 2013-07-21  9:27   ` Andreas Färber
  2013-07-21  9:31   ` [Qemu-devel] [PATCH qom-next] fdc: Improve error propagation for QOM realize Andreas Färber
  1 sibling, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-21  9:27 UTC (permalink / raw)
  To: Hu Tao; +Cc: Kevin Wolf, Stefan Hajnoczi, Peter Crosthwaite, qemu-devel

Am 01.07.2013 12:18, schrieb Hu Tao:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/block/fdc.c | 62 ++++++++++++++++++++++++++++++++++++++--------------------
>  1 file changed, 41 insertions(+), 21 deletions(-)
> 
> diff --git a/hw/block/fdc.c b/hw/block/fdc.c
> index f8270cb..0fe0cf9 100644
> --- a/hw/block/fdc.c
> +++ b/hw/block/fdc.c
> @@ -2145,38 +2145,58 @@ static void isabus_fdc_realize(DeviceState *dev, Error **errp)
>      add_boot_device_path(isa->bootindexB, dev, "/floppy@1");
>  }
>  
> -static int sysbus_fdc_init1(SysBusDevice *dev)
> +static void sysbus_fdc_initfn(Object *obj)
>  {
> -    FDCtrlSysBus *sys = SYSBUS_FDC(dev);
> +    FDCtrlSysBus *sys = SYSBUS_FDC(obj);
>      FDCtrl *fdctrl = &sys->state;
> -    int ret;
>  
>      memory_region_init_io(&fdctrl->iomem, &fdctrl_mem_ops, fdctrl, "fdc", 0x08);
> -    sysbus_init_mmio(dev, &fdctrl->iomem);
> -    sysbus_init_irq(dev, &fdctrl->irq);
> -    qdev_init_gpio_in(DEVICE(dev), fdctrl_handle_tc, 1);
> -    fdctrl->dma_chann = -1;
> +}
>  
> -    qdev_set_legacy_instance_id(DEVICE(dev), 0 /* io */, 2); /* FIXME */
> -    ret = fdctrl_init_common(fdctrl);
> +static void sysbus_fdc_realize(DeviceState *dev, Error **errp)
> +{
> +    FDCtrlSysBus *sys = SYSBUS_FDC(dev);
> +    FDCtrl *fdctrl = &sys->state;
> +    SysBusDevice *b = SYS_BUS_DEVICE(dev);
>  
> -    return ret;
> +
> +    sysbus_init_mmio(b, &fdctrl->iomem);
> +    sysbus_init_irq(b, &fdctrl->irq);
> +    qdev_init_gpio_in(dev, fdctrl_handle_tc, 1);
> +    fdctrl->dma_chann = -1;
> +
> +    qdev_set_legacy_instance_id(dev, 0 /* io */, 2); /* FIXME */
> +    if (fdctrl_init_common(fdctrl) < 0) {
> +        error_setg(errp, "Floppy init failed.");
> +        return;
> +    }
>  }
>  
> -static int sun4m_fdc_init1(SysBusDevice *dev)
> +static void sun4m_fdc_initfn(Object *obj)
>  {
> -    FDCtrlSysBus *sys = SYSBUS_FDC(dev);
> +    FDCtrlSysBus *sys = SYSBUS_FDC(obj);
>      FDCtrl *fdctrl = &sys->state;
>  
>      memory_region_init_io(&fdctrl->iomem, &fdctrl_mem_strict_ops, fdctrl,
>                            "fdctrl", 0x08);
> -    sysbus_init_mmio(dev, &fdctrl->iomem);
> -    sysbus_init_irq(dev, &fdctrl->irq);
> -    qdev_init_gpio_in(DEVICE(dev), fdctrl_handle_tc, 1);
> +}
> +
> +static void sun4m_fdc_realize(DeviceState *dev, Error **errp)
> +{
> +    FDCtrlSysBus *sys = SYSBUS_FDC(dev);
> +    FDCtrl *fdctrl = &sys->state;
> +    SysBusDevice *b = SYS_BUS_DEVICE(dev);

I've renamed this variable to Peter's suggested sbd and posted a
follow-up to rename fdctrl_init_common() to fdctrl_realize_common() and
to propagate Error** from fdctrl_connect_drives() directly into the
realizefn.

Andreas

> +
> +    sysbus_init_mmio(b, &fdctrl->iomem);
> +    sysbus_init_irq(b, &fdctrl->irq);
> +    qdev_init_gpio_in(dev, fdctrl_handle_tc, 1);
>  
>      fdctrl->sun4m = 1;
> -    qdev_set_legacy_instance_id(DEVICE(dev), 0 /* io */, 2); /* FIXME */
> -    return fdctrl_init_common(fdctrl);
> +    qdev_set_legacy_instance_id(dev, 0 /* io */, 2); /* FIXME */
> +    if (fdctrl_init_common(fdctrl) < 0) {
> +        error_setg(errp, "Floppy init failed.");
> +        return;
> +    }
>  }
>  
>  FDriveType isa_fdc_get_drive_type(ISADevice *fdc, int i)
> @@ -2247,9 +2267,8 @@ static Property sysbus_fdc_properties[] = {
>  static void sysbus_fdc_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
> -    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
>  
> -    k->init = sysbus_fdc_init1;
> +    dc->realize = sysbus_fdc_realize;
>      dc->reset = fdctrl_external_reset_sysbus;
>      dc->vmsd = &vmstate_sysbus_fdc;
>      dc->props = sysbus_fdc_properties;
> @@ -2259,6 +2278,7 @@ static const TypeInfo sysbus_fdc_info = {
>      .name          = TYPE_SYSBUS_FDC,
>      .parent        = TYPE_SYS_BUS_DEVICE,
>      .instance_size = sizeof(FDCtrlSysBus),
> +    .instance_init = sysbus_fdc_initfn,
>      .class_init    = sysbus_fdc_class_init,
>  };
>  
> @@ -2270,9 +2290,8 @@ static Property sun4m_fdc_properties[] = {
>  static void sun4m_fdc_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
> -    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
>  
> -    k->init = sun4m_fdc_init1;
> +    dc->realize = sun4m_fdc_realize;
>      dc->reset = fdctrl_external_reset_sysbus;
>      dc->vmsd = &vmstate_sysbus_fdc;
>      dc->props = sun4m_fdc_properties;
> @@ -2282,6 +2301,7 @@ static const TypeInfo sun4m_fdc_info = {
>      .name          = "SUNW,fdtwo",
>      .parent        = TYPE_SYS_BUS_DEVICE,
>      .instance_size = sizeof(FDCtrlSysBus),
> +    .instance_init = sun4m_fdc_initfn,
>      .class_init    = sun4m_fdc_class_init,
>  };
>  
> 


-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH qom-next] fdc: Improve error propagation for QOM realize
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 09/26] fdc: use realize for fdc Hu Tao
  2013-07-21  9:27   ` Andreas Färber
@ 2013-07-21  9:31   ` Andreas Färber
  2013-07-22  7:38     ` Hu Tao
  2013-07-22  8:26     ` Stefan Hajnoczi
  1 sibling, 2 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-21  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, Hu Tao, Andreas Färber, Stefan Hajnoczi

Rename fdctrl_init_common() to fdctrl_realize_common() and let
fdctrl_connect_drives() propagate an Error through it.

Signed-off-by: Andreas Färber <afaerber@suse.de>
---
 hw/block/fdc.c | 40 ++++++++++++++++++++++------------------
 1 file changed, 22 insertions(+), 18 deletions(-)

diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index 9a983fb..d32f6ba 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -1997,7 +1997,7 @@ static const BlockDevOps fdctrl_block_ops = {
 };
 
 /* Init functions */
-static int fdctrl_connect_drives(FDCtrl *fdctrl)
+static void fdctrl_connect_drives(FDCtrl *fdctrl, Error **errp)
 {
     unsigned int i;
     FDrive *drive;
@@ -2008,12 +2008,12 @@ static int fdctrl_connect_drives(FDCtrl *fdctrl)
 
         if (drive->bs) {
             if (bdrv_get_on_error(drive->bs, 0) != BLOCKDEV_ON_ERROR_ENOSPC) {
-                error_report("fdc doesn't support drive option werror");
-                return -1;
+                error_setg(errp, "fdc doesn't support drive option werror");
+                return;
             }
             if (bdrv_get_on_error(drive->bs, 1) != BLOCKDEV_ON_ERROR_REPORT) {
-                error_report("fdc doesn't support drive option rerror");
-                return -1;
+                error_setg(errp, "fdc doesn't support drive option rerror");
+                return;
             }
         }
 
@@ -2023,7 +2023,6 @@ static int fdctrl_connect_drives(FDCtrl *fdctrl)
             bdrv_set_dev_ops(drive->bs, &fdctrl_block_ops, drive);
         }
     }
-    return 0;
 }
 
 ISADevice *fdctrl_init_isa(ISABus *bus, DriveInfo **fds)
@@ -2089,7 +2088,7 @@ void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base,
     *fdc_tc = qdev_get_gpio_in(dev, 0);
 }
 
-static int fdctrl_init_common(FDCtrl *fdctrl)
+static void fdctrl_realize_common(FDCtrl *fdctrl, Error **errp)
 {
     int i, j;
     static int command_tables_inited = 0;
@@ -2110,15 +2109,16 @@ static int fdctrl_init_common(FDCtrl *fdctrl)
     fdctrl->fifo = qemu_memalign(512, FD_SECTOR_LEN);
     fdctrl->fifo_size = 512;
     fdctrl->result_timer = qemu_new_timer_ns(vm_clock,
-                                          fdctrl_result_timer, fdctrl);
+                                             fdctrl_result_timer, fdctrl);
 
     fdctrl->version = 0x90; /* Intel 82078 controller */
     fdctrl->config = FD_CONFIG_EIS | FD_CONFIG_EFIFO; /* Implicit seek, polling & FIFO enabled */
     fdctrl->num_floppies = MAX_FD;
 
-    if (fdctrl->dma_chann != -1)
+    if (fdctrl->dma_chann != -1) {
         DMA_register_channel(fdctrl->dma_chann, &fdctrl_transfer_handler, fdctrl);
-    return fdctrl_connect_drives(fdctrl);
+    }
+    fdctrl_connect_drives(fdctrl, errp);
 }
 
 static const MemoryRegionPortio fdc_portio_list[] = {
@@ -2132,7 +2132,7 @@ static void isabus_fdc_realize(DeviceState *dev, Error **errp)
     ISADevice *isadev = ISA_DEVICE(dev);
     FDCtrlISABus *isa = ISA_FDC(dev);
     FDCtrl *fdctrl = &isa->state;
-    int ret;
+    Error *err = NULL;
 
     isa_register_portio_list(isadev, isa->iobase, fdc_portio_list, fdctrl,
                              "fdc");
@@ -2141,9 +2141,9 @@ static void isabus_fdc_realize(DeviceState *dev, Error **errp)
     fdctrl->dma_chann = isa->dma;
 
     qdev_set_legacy_instance_id(dev, isa->iobase, 2);
-    ret = fdctrl_init_common(fdctrl);
-    if (ret < 0) {
-        error_setg(errp, "Floppy init failed.");
+    fdctrl_realize_common(fdctrl, &err);
+    if (err != NULL) {
+        error_propagate(errp, err);
         return;
     }
 
@@ -2165,6 +2165,7 @@ static void sysbus_fdc_realize(DeviceState *dev, Error **errp)
     FDCtrlSysBus *sys = SYSBUS_FDC(dev);
     FDCtrl *fdctrl = &sys->state;
     SysBusDevice *b = SYS_BUS_DEVICE(dev);
+    Error *err = NULL;
 
     sysbus_init_mmio(b, &fdctrl->iomem);
     sysbus_init_irq(b, &fdctrl->irq);
@@ -2172,8 +2173,9 @@ static void sysbus_fdc_realize(DeviceState *dev, Error **errp)
     fdctrl->dma_chann = -1;
 
     qdev_set_legacy_instance_id(dev, 0 /* io */, 2); /* FIXME */
-    if (fdctrl_init_common(fdctrl) < 0) {
-        error_setg(errp, "Floppy init failed.");
+    fdctrl_realize_common(fdctrl, &err);
+    if (err != NULL) {
+        error_propagate(errp, err);
         return;
     }
 }
@@ -2192,6 +2194,7 @@ static void sun4m_fdc_realize(DeviceState *dev, Error **errp)
     FDCtrlSysBus *sys = SYSBUS_FDC(dev);
     FDCtrl *fdctrl = &sys->state;
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+    Error *err = NULL;
 
     sysbus_init_mmio(sbd, &fdctrl->iomem);
     sysbus_init_irq(sbd, &fdctrl->irq);
@@ -2199,8 +2202,9 @@ static void sun4m_fdc_realize(DeviceState *dev, Error **errp)
 
     fdctrl->sun4m = 1;
     qdev_set_legacy_instance_id(dev, 0 /* io */, 2); /* FIXME */
-    if (fdctrl_init_common(fdctrl) < 0) {
-        error_setg(errp, "Floppy init failed.");
+    fdctrl_realize_common(fdctrl, &err);
+    if (err != NULL) {
+        error_propagate(errp, err);
         return;
     }
 }
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 17/26] fwcfg: use realize for fwcfg
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 17/26] fwcfg: use realize for fwcfg Hu Tao
@ 2013-07-21  9:35   ` Andreas Färber
  2013-07-22  8:37     ` Hu Tao
  0 siblings, 1 reply; 49+ messages in thread
From: Andreas Färber @ 2013-07-21  9:35 UTC (permalink / raw)
  To: Hu Tao; +Cc: qemu-devel

Am 01.07.2013 12:18, schrieb Hu Tao:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/nvram/fw_cfg.c | 26 ++++++++++++++++----------
>  1 file changed, 16 insertions(+), 10 deletions(-)
> 
> diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
> index c8722c2..656ffcc 100644
> --- a/hw/nvram/fw_cfg.c
> +++ b/hw/nvram/fw_cfg.c
> @@ -523,31 +523,37 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
>      return s;
>  }
>  
> -static int fw_cfg_init1(SysBusDevice *dev)
> +static void fw_cfg_initfn(Object *obj)
>  {
> -    FWCfgState *s = FW_CFG(dev);
> +    FWCfgState *s = FW_CFG(obj);
>  
>      memory_region_init_io(&s->ctl_iomem, &fw_cfg_ctl_mem_ops, s,
>                            "fwcfg.ctl", FW_CFG_SIZE);
> -    sysbus_init_mmio(dev, &s->ctl_iomem);
>      memory_region_init_io(&s->data_iomem, &fw_cfg_data_mem_ops, s,
>                            "fwcfg.data", FW_CFG_DATA_SIZE);
> -    sysbus_init_mmio(dev, &s->data_iomem);
>      /* In case ctl and data overlap: */
>      memory_region_init_io(&s->comb_iomem, &fw_cfg_comb_mem_ops, s,
>                            "fwcfg", FW_CFG_SIZE);
> +}

There's no reason not to have sysbus_init_mmio() in instance_init,
changed that.

Andreas

> +
> +static void fw_cfg_realize(DeviceState *dev, Error **errp)
> +{
> +    FWCfgState *s = FW_CFG(dev);
> +    SysBusDevice *b = SYS_BUS_DEVICE(dev);
> +
> +    sysbus_init_mmio(b, &s->ctl_iomem);
> +    sysbus_init_mmio(b, &s->data_iomem);
>  
>      if (s->ctl_iobase + 1 == s->data_iobase) {
> -        sysbus_add_io(dev, s->ctl_iobase, &s->comb_iomem);
> +        sysbus_add_io(b, s->ctl_iobase, &s->comb_iomem);
>      } else {
>          if (s->ctl_iobase) {
> -            sysbus_add_io(dev, s->ctl_iobase, &s->ctl_iomem);
> +            sysbus_add_io(b, s->ctl_iobase, &s->ctl_iomem);
>          }
>          if (s->data_iobase) {
> -            sysbus_add_io(dev, s->data_iobase, &s->data_iomem);
> +            sysbus_add_io(b, s->data_iobase, &s->data_iomem);
>          }
>      }
> -    return 0;
>  }
>  
>  static Property fw_cfg_properties[] = {
> @@ -564,9 +570,8 @@ FWCfgState *fw_cfg_find(void)
>  static void fw_cfg_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
> -    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
>  
> -    k->init = fw_cfg_init1;
> +    dc->realize = fw_cfg_realize;
>      dc->no_user = 1;
>      dc->reset = fw_cfg_reset;
>      dc->vmsd = &vmstate_fw_cfg;
> @@ -577,6 +582,7 @@ static const TypeInfo fw_cfg_info = {
>      .name          = TYPE_FW_CFG,
>      .parent        = TYPE_SYS_BUS_DEVICE,
>      .instance_size = sizeof(FWCfgState),
> +    .instance_init = fw_cfg_initfn,
>      .class_init    = fw_cfg_class_init,
>  };
>  
> 


-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 19/26] scsi esp: use realize for scsi esp
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 19/26] scsi esp: use realize for scsi esp Hu Tao
@ 2013-07-21  9:47   ` Andreas Färber
  2013-07-21 10:30   ` [Qemu-devel] [PATCH qom-next] scsi: Improve error propagation for scsi_bus_legacy_handle_cmdline() Andreas Färber
  1 sibling, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-21  9:47 UTC (permalink / raw)
  To: Hu Tao; +Cc: Paolo Bonzini, Peter Crosthwaite, qemu-devel

Am 01.07.2013 12:18, schrieb Hu Tao:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/scsi/esp.c | 30 ++++++++++++++++++++----------
>  1 file changed, 20 insertions(+), 10 deletions(-)
> 
> diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
> index f7d6389..714d2fd 100644
> --- a/hw/scsi/esp.c
> +++ b/hw/scsi/esp.c
> @@ -668,23 +668,33 @@ static void sysbus_esp_gpio_demux(void *opaque, int irq, int level)
>      }
>  }
>  
> -static int sysbus_esp_init(SysBusDevice *dev)
> +static void sysbus_esp_init(Object *obj)
> +{
> +    SysBusESPState *sysbus = ESP(obj);
> +
> +    memory_region_init_io(&sysbus->iomem, &sysbus_esp_mem_ops, sysbus,
> +                          "esp", ESP_REGS << sysbus->it_shift);

it_shift is a field set after initialization, so moving this back into
realizefn.

> +}
> +
> +static void sysbus_esp_realize(DeviceState *dev, Error **errp)
>  {
>      SysBusESPState *sysbus = ESP(dev);
> +    SysBusDevice *b = SYS_BUS_DEVICE(dev);

Please try to order variables from DeviceState to specific type, also
renaming to sbd for clarity.

>      ESPState *s = &sysbus->esp;
>  
> -    sysbus_init_irq(dev, &s->irq);
> +    sysbus_init_irq(b, &s->irq);
>      assert(sysbus->it_shift != -1);
>  
>      s->chip_id = TCHI_FAS100A;
> -    memory_region_init_io(&sysbus->iomem, &sysbus_esp_mem_ops, sysbus,
> -                          "esp", ESP_REGS << sysbus->it_shift);
> -    sysbus_init_mmio(dev, &sysbus->iomem);
> +    sysbus_init_mmio(b, &sysbus->iomem);
>  
> -    qdev_init_gpio_in(&dev->qdev, sysbus_esp_gpio_demux, 2);
> +    qdev_init_gpio_in(dev, sysbus_esp_gpio_demux, 2);
>  
> -    scsi_bus_new(&s->bus, &dev->qdev, &esp_scsi_info, NULL);
> -    return scsi_bus_legacy_handle_cmdline(&s->bus);
> +    scsi_bus_new(&s->bus, dev, &esp_scsi_info, NULL);
> +    if (scsi_bus_legacy_handle_cmdline(&s->bus) < 0) {
> +        error_setg(errp, "handling scsi bus failed");
> +        return;
> +    }

scsi_bus_legacy_handle_cmdline() is calling for better error
propagation, will post a follow-up.

Andreas

>  }
>  
>  static void sysbus_esp_hard_reset(DeviceState *dev)
> @@ -707,9 +717,8 @@ static const VMStateDescription vmstate_sysbus_esp_scsi = {
>  static void sysbus_esp_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
> -    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
>  
> -    k->init = sysbus_esp_init;
> +    dc->realize = sysbus_esp_realize;
>      dc->reset = sysbus_esp_hard_reset;
>      dc->vmsd = &vmstate_sysbus_esp_scsi;
>  }
> @@ -718,6 +727,7 @@ static const TypeInfo sysbus_esp_info = {
>      .name          = TYPE_ESP,
>      .parent        = TYPE_SYS_BUS_DEVICE,
>      .instance_size = sizeof(SysBusESPState),
> +    .instance_init = sysbus_esp_init,
>      .class_init    = sysbus_esp_class_init,
>  };
>  
> 


-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* [Qemu-devel] [PATCH qom-next] scsi: Improve error propagation for scsi_bus_legacy_handle_cmdline()
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 19/26] scsi esp: use realize for scsi esp Hu Tao
  2013-07-21  9:47   ` Andreas Färber
@ 2013-07-21 10:30   ` Andreas Färber
  2013-07-22  9:16     ` Hu Tao
  1 sibling, 1 reply; 49+ messages in thread
From: Andreas Färber @ 2013-07-21 10:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Anthony Liguori, Michael S. Tsirkin, Alexander Graf,
	open list:sPAPR, Paul Brook, Paolo Bonzini, Andreas Färber,
	Gerd Hoffmann

Let scsi_bus_legacy_add_drive() and scsi_bus_legacy_handle_cmdline()
return an Error**. Prepare qdev initfns for QOM realize error model.

Signed-off-by: Andreas Färber <afaerber@suse.de>
---
 hw/pci/pci-hotplug-old.c |  2 +-
 hw/scsi/esp-pci.c        |  7 ++++++-
 hw/scsi/esp.c            |  6 ++++--
 hw/scsi/lsi53c895a.c     |  7 ++++++-
 hw/scsi/megasas.c        |  7 ++++++-
 hw/scsi/scsi-bus.c       | 22 +++++++++++++++-------
 hw/scsi/spapr_vscsi.c    |  7 ++++++-
 hw/scsi/virtio-scsi.c    |  7 ++++++-
 hw/usb/dev-storage.c     |  4 +++-
 include/hw/scsi/scsi.h   |  4 ++--
 10 files changed, 55 insertions(+), 18 deletions(-)

diff --git a/hw/pci/pci-hotplug-old.c b/hw/pci/pci-hotplug-old.c
index 8077289..619fe47 100644
--- a/hw/pci/pci-hotplug-old.c
+++ b/hw/pci/pci-hotplug-old.c
@@ -127,7 +127,7 @@ static int scsi_hot_add(Monitor *mon, DeviceState *adapter,
     dinfo->unit = qemu_opt_get_number(dinfo->opts, "unit", -1);
     dinfo->bus = scsibus->busnr;
     scsidev = scsi_bus_legacy_add_drive(scsibus, dinfo->bdrv, dinfo->unit,
-                                        false, -1, NULL);
+                                        false, -1, NULL, NULL);
     if (!scsidev) {
         return -1;
     }
diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
index 6cdfd53..2ac21d4 100644
--- a/hw/scsi/esp-pci.c
+++ b/hw/scsi/esp-pci.c
@@ -346,6 +346,7 @@ static int esp_pci_scsi_init(PCIDevice *dev)
     DeviceState *d = DEVICE(dev);
     ESPState *s = &pci->esp;
     uint8_t *pci_conf;
+    Error *err = NULL;
 
     pci_conf = dev->config;
 
@@ -364,7 +365,11 @@ static int esp_pci_scsi_init(PCIDevice *dev)
 
     scsi_bus_new(&s->bus, d, &esp_pci_scsi_info, NULL);
     if (!d->hotplugged) {
-        return scsi_bus_legacy_handle_cmdline(&s->bus);
+        scsi_bus_legacy_handle_cmdline(&s->bus, &err);
+        if (err != NULL) {
+            error_free(err);
+            return -1;
+        }
     }
     return 0;
 }
diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
index c24b632..94639b8 100644
--- a/hw/scsi/esp.c
+++ b/hw/scsi/esp.c
@@ -676,6 +676,7 @@ static void sysbus_esp_realize(DeviceState *dev, Error **errp)
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     SysBusESPState *sysbus = ESP(dev);
     ESPState *s = &sysbus->esp;
+    Error *err = NULL;
 
     sysbus_init_irq(sbd, &s->irq);
     assert(sysbus->it_shift != -1);
@@ -688,8 +689,9 @@ static void sysbus_esp_realize(DeviceState *dev, Error **errp)
     qdev_init_gpio_in(dev, sysbus_esp_gpio_demux, 2);
 
     scsi_bus_new(&s->bus, dev, &esp_scsi_info, NULL);
-    if (scsi_bus_legacy_handle_cmdline(&s->bus) < 0) {
-        error_setg(errp, "Handling legacy SCSI command line failed");
+    scsi_bus_legacy_handle_cmdline(&s->bus, &err);
+    if (err != NULL) {
+        error_propagate(errp, err);
         return;
     }
 }
diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
index e11224f..776e31a 100644
--- a/hw/scsi/lsi53c895a.c
+++ b/hw/scsi/lsi53c895a.c
@@ -2096,6 +2096,7 @@ static int lsi_scsi_init(PCIDevice *dev)
     LSIState *s = LSI53C895A(dev);
     DeviceState *d = DEVICE(dev);
     uint8_t *pci_conf;
+    Error *err = NULL;
 
     pci_conf = dev->config;
 
@@ -2118,7 +2119,11 @@ static int lsi_scsi_init(PCIDevice *dev)
 
     scsi_bus_new(&s->bus, d, &lsi_scsi_info, NULL);
     if (!d->hotplugged) {
-        return scsi_bus_legacy_handle_cmdline(&s->bus);
+        scsi_bus_legacy_handle_cmdline(&s->bus, &err);
+        if (err != NULL) {
+            error_free(err);
+            return -1;
+        }
     }
     return 0;
 }
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
index 2ae4346..eb52164 100644
--- a/hw/scsi/megasas.c
+++ b/hw/scsi/megasas.c
@@ -2102,6 +2102,7 @@ static int megasas_scsi_init(PCIDevice *dev)
     MegasasState *s = MEGASAS(dev);
     uint8_t *pci_conf;
     int i, bar_type;
+    Error *err = NULL;
 
     pci_conf = dev->config;
 
@@ -2172,7 +2173,11 @@ static int megasas_scsi_init(PCIDevice *dev)
 
     scsi_bus_new(&s->bus, DEVICE(dev), &megasas_scsi_info, NULL);
     if (!d->hotplugged) {
-        return scsi_bus_legacy_handle_cmdline(&s->bus);
+        scsi_bus_legacy_handle_cmdline(&s->bus, &err);
+        if (err != NULL) {
+            error_free(err);
+            return -1;
+        }
     }
     return 0;
 }
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index a92b7c1..b5a863a 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -209,10 +209,11 @@ static int scsi_qdev_exit(DeviceState *qdev)
 /* handle legacy '-drive if=scsi,...' cmd line args */
 SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
                                       int unit, bool removable, int bootindex,
-                                      const char *serial)
+                                      const char *serial, Error **errp)
 {
     const char *driver;
     DeviceState *dev;
+    Error *err = NULL;
 
     driver = bdrv_is_sg(bdrv) ? "scsi-generic" : "scsi-disk";
     dev = qdev_create(&bus->qbus, driver);
@@ -227,19 +228,25 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
         qdev_prop_set_string(dev, "serial", serial);
     }
     if (qdev_prop_set_drive(dev, "drive", bdrv) < 0) {
+        error_setg(errp, "Setting drive property failed");
         qdev_free(dev);
         return NULL;
     }
-    if (qdev_init(dev) < 0)
+    object_property_set_bool(OBJECT(dev), true, "realized", &err);
+    if (err != NULL) {
+        error_propagate(errp, err);
+        qdev_free(dev);
         return NULL;
+    }
     return SCSI_DEVICE(dev);
 }
 
-int scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
+void scsi_bus_legacy_handle_cmdline(SCSIBus *bus, Error **errp)
 {
     Location loc;
     DriveInfo *dinfo;
-    int res = 0, unit;
+    int unit;
+    Error *err = NULL;
 
     loc_push_none(&loc);
     for (unit = 0; unit <= bus->info->max_target; unit++) {
@@ -248,13 +255,14 @@ int scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
             continue;
         }
         qemu_opts_loc_restore(dinfo->opts);
-        if (!scsi_bus_legacy_add_drive(bus, dinfo->bdrv, unit, false, -1, NULL)) {
-            res = -1;
+        scsi_bus_legacy_add_drive(bus, dinfo->bdrv, unit, false, -1, NULL,
+                                  &err);
+        if (err != NULL) {
+            error_propagate(errp, err);
             break;
         }
     }
     loc_pop(&loc);
-    return res;
 }
 
 static int32_t scsi_invalid_field(SCSIRequest *req, uint8_t *buf)
diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
index e8978bf..55b44b9 100644
--- a/hw/scsi/spapr_vscsi.c
+++ b/hw/scsi/spapr_vscsi.c
@@ -912,12 +912,17 @@ static void spapr_vscsi_reset(VIOsPAPRDevice *dev)
 static int spapr_vscsi_init(VIOsPAPRDevice *dev)
 {
     VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(dev);
+    Error *err = NULL;
 
     dev->crq.SendFunc = vscsi_do_crq;
 
     scsi_bus_new(&s->bus, &dev->qdev, &vscsi_scsi_info, NULL);
     if (!dev->qdev.hotplugged) {
-        scsi_bus_legacy_handle_cmdline(&s->bus);
+        scsi_bus_legacy_handle_cmdline(&s->bus, &err);
+        if (err != NULL) {
+            error_free(err);
+            return -1;
+        }
     }
 
     return 0;
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index 712f0ad..42cb73b 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -619,6 +619,7 @@ static int virtio_scsi_device_init(VirtIODevice *vdev)
     VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev);
     VirtIOSCSI *s = VIRTIO_SCSI(vdev);
     static int virtio_scsi_id;
+    Error *err = NULL;
     int ret;
 
     ret = virtio_scsi_common_init(vs);
@@ -629,7 +630,11 @@ static int virtio_scsi_device_init(VirtIODevice *vdev)
     scsi_bus_new(&s->bus, qdev, &virtio_scsi_scsi_info, vdev->bus_name);
 
     if (!qdev->hotplugged) {
-        scsi_bus_legacy_handle_cmdline(&s->bus);
+        scsi_bus_legacy_handle_cmdline(&s->bus, &err);
+        if (err != NULL) {
+            error_free(err);
+            return -1;
+        }
     }
 
     register_savevm(qdev, "virtio-scsi", virtio_scsi_id++, 1,
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index fe914ab..1954811 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -595,6 +595,7 @@ static int usb_msd_initfn_storage(USBDevice *dev)
     MSDState *s = DO_UPCAST(MSDState, dev, dev);
     BlockDriverState *bs = s->conf.bs;
     SCSIDevice *scsi_dev;
+    Error *err = NULL;
 
     if (!bs) {
         error_report("drive property not set");
@@ -619,7 +620,8 @@ static int usb_msd_initfn_storage(USBDevice *dev)
     usb_desc_init(dev);
     scsi_bus_new(&s->bus, &s->dev.qdev, &usb_msd_scsi_info_storage, NULL);
     scsi_dev = scsi_bus_legacy_add_drive(&s->bus, bs, 0, !!s->removable,
-                                            s->conf.bootindex, dev->serial);
+                                         s->conf.bootindex, dev->serial,
+                                         &err);
     if (!scsi_dev) {
         return -1;
     }
diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h
index 9786e00..8786531 100644
--- a/include/hw/scsi/scsi.h
+++ b/include/hw/scsi/scsi.h
@@ -162,8 +162,8 @@ static inline SCSIBus *scsi_bus_from_device(SCSIDevice *d)
 
 SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
                                       int unit, bool removable, int bootindex,
-                                      const char *serial);
-int scsi_bus_legacy_handle_cmdline(SCSIBus *bus);
+                                      const char *serial, Error **errp);
+void scsi_bus_legacy_handle_cmdline(SCSIBus *bus, Error **errp);
 
 /*
  * Predefined sense codes
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 25/26] ioapic: use realize for ioapic
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 25/26] ioapic: use realize for ioapic Hu Tao
@ 2013-07-21 10:35   ` Andreas Färber
  0 siblings, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-21 10:35 UTC (permalink / raw)
  To: Hu Tao; +Cc: qemu-devel

Am 01.07.2013 12:18, schrieb Hu Tao:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  hw/intc/ioapic_common.c | 12 +++++-------
>  1 file changed, 5 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/intc/ioapic_common.c b/hw/intc/ioapic_common.c
> index 5c5bb3c..5dc1f1e 100644
> --- a/hw/intc/ioapic_common.c
> +++ b/hw/intc/ioapic_common.c
> @@ -57,23 +57,22 @@ static int ioapic_dispatch_post_load(void *opaque, int version_id)
>      return 0;
>  }
>  
> -static int ioapic_init_common(SysBusDevice *dev)
> +static void ioapic_common_realize(DeviceState *dev, Error **errp)
>  {
>      IOAPICCommonState *s = IOAPIC_COMMON(dev);
>      IOAPICCommonClass *info;
>      static int ioapic_no;
>  
>      if (ioapic_no >= MAX_IOAPICS) {
> -        return -1;
> +        error_setg(errp, "invalid ioapic number: %d", ioapic_no);

Since the ioapic number was not chosen by the user, I have changed this
similar to the preceding error message, referring to the maximum instead.

Andreas

> +        return;
>      }
>  
>      info = IOAPIC_COMMON_GET_CLASS(s);
>      info->init(s, ioapic_no);
>  
> -    sysbus_init_mmio(&s->busdev, &s->io_memory);
> +    sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->io_memory);
>      ioapic_no++;
> -
> -    return 0;
>  }
>  
>  static const VMStateDescription vmstate_ioapic_common = {
> @@ -95,10 +94,9 @@ static const VMStateDescription vmstate_ioapic_common = {
>  
>  static void ioapic_common_class_init(ObjectClass *klass, void *data)
>  {
> -    SysBusDeviceClass *sc = SYS_BUS_DEVICE_CLASS(klass);
>      DeviceClass *dc = DEVICE_CLASS(klass);
>  
> -    sc->init = ioapic_init_common;
> +    dc->realize = ioapic_common_realize;
>      dc->vmsd = &vmstate_ioapic_common;
>      dc->no_user = 1;
>  }
> 


-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1
  2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
                   ` (25 preceding siblings ...)
  2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 26/26] isa bus: remove isabus_bridge_init since it does nothing Hu Tao
@ 2013-07-21 10:58 ` Andreas Färber
  26 siblings, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-21 10:58 UTC (permalink / raw)
  To: Hu Tao
  Cc: Kevin Wolf, Peter Crosthwaite, Eduardo Habkost, Stefan Hajnoczi,
	qemu-devel, Anthony Liguori, Paolo Bonzini, Igor Mammedov

Am 01.07.2013 12:18, schrieb Hu Tao:
> Hu Tao (26):
>   sysbus: document SysBusDeviceClass about @init
>   ohci: QOM'ify some more
>   ohci: use realize for ohci
>   i440fx-pcihost: use realize for i440fx-pcihost
>   i440fx: use type-safe cast instead of directly access of parent dev
>   q35: use type-safe cast instead of directly access of parent dev
>   q35: use realize for q35 host
>   fdc: QOM'ify some more
>   fdc: use realize for fdc.
>   pflash-cfi01: QOM'ify some more
>   pflash_cfi01: use realize for pflash_cfi01
>   pflash-cfi02: QOM'ify some more
>   pflash_cfi02: use realize for pflash_cfi02
>   ahci: QOM'ify some more
>   ahci: use realize for ahci
>   fwcfg: QOM'ify some more
>   fwcfg: use realize for fwcfg
>   scsi esp: QOM'ify some more
>   scsi esp: use realize for scsi esp
>   hpet: QOM'ify some more
>   hpet: use realize for hpet
>   kvmclock: QOM'ify some more
>   kvmclock: use realize for kvmclock
>   kvmvapic realize
>   ioapic: use realize for ioapic
>   isa bus: remove isabus_bridge_init since it does nothing

By now I believe I've queued all of these, partially with minor changes
like b or err-vs.-errp variable renames or replacement of repeated
in-place QOM casts with a variable and one bug fix. Most realizefn
patches conflicted due to Memory API changes. In two cases I inserted
error propagation improvements as indicated. Testing appreciated.

git://github.com/afaerber/qemu-cpu.git qom-next
https://github.com/afaerber/qemu-cpu/commits/qom-next

Regards,
Andreas

>  hw/block/fdc.c          | 87 +++++++++++++++++++++++++++++++------------------
>  hw/block/pflash_cfi01.c | 28 ++++++++--------
>  hw/block/pflash_cfi02.c | 31 +++++++++---------
>  hw/i386/kvm/clock.c     | 15 +++++----
>  hw/i386/kvmvapic.c      | 12 +++----
>  hw/ide/ahci.c           | 21 ++++++------
>  hw/intc/ioapic_common.c | 12 +++----
>  hw/isa/isa-bus.c        |  8 -----
>  hw/nvram/fw_cfg.c       | 36 +++++++++++---------
>  hw/pci-host/piix.c      | 36 ++++++++++++--------
>  hw/pci-host/q35.c       | 60 +++++++++++++++++-----------------
>  hw/scsi/esp.c           | 46 ++++++++++++++++----------
>  hw/timer/hpet.c         | 44 +++++++++++++++----------
>  hw/usb/hcd-ohci.c       | 32 +++++++++---------
>  include/hw/sysbus.h     | 10 ++++++
>  15 files changed, 268 insertions(+), 210 deletions(-)

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH qom-next] fdc: Improve error propagation for QOM realize
  2013-07-21  9:31   ` [Qemu-devel] [PATCH qom-next] fdc: Improve error propagation for QOM realize Andreas Färber
@ 2013-07-22  7:38     ` Hu Tao
  2013-07-22  8:26     ` Stefan Hajnoczi
  1 sibling, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-22  7:38 UTC (permalink / raw)
  To: Andreas Färber; +Cc: Kevin Wolf, qemu-devel, Stefan Hajnoczi

On Sun, Jul 21, 2013 at 11:31:57AM +0200, Andreas Färber wrote:
> Rename fdctrl_init_common() to fdctrl_realize_common() and let
> fdctrl_connect_drives() propagate an Error through it.
> 
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> ---
>  hw/block/fdc.c | 40 ++++++++++++++++++++++------------------
>  1 file changed, 22 insertions(+), 18 deletions(-)
> 
> diff --git a/hw/block/fdc.c b/hw/block/fdc.c
> index 9a983fb..d32f6ba 100644
> --- a/hw/block/fdc.c
> +++ b/hw/block/fdc.c
> @@ -1997,7 +1997,7 @@ static const BlockDevOps fdctrl_block_ops = {
>  };
>  
>  /* Init functions */
> -static int fdctrl_connect_drives(FDCtrl *fdctrl)
> +static void fdctrl_connect_drives(FDCtrl *fdctrl, Error **errp)
>  {
>      unsigned int i;
>      FDrive *drive;
> @@ -2008,12 +2008,12 @@ static int fdctrl_connect_drives(FDCtrl *fdctrl)
>  
>          if (drive->bs) {
>              if (bdrv_get_on_error(drive->bs, 0) != BLOCKDEV_ON_ERROR_ENOSPC) {
> -                error_report("fdc doesn't support drive option werror");
> -                return -1;
> +                error_setg(errp, "fdc doesn't support drive option werror");
> +                return;
>              }
>              if (bdrv_get_on_error(drive->bs, 1) != BLOCKDEV_ON_ERROR_REPORT) {
> -                error_report("fdc doesn't support drive option rerror");
> -                return -1;
> +                error_setg(errp, "fdc doesn't support drive option rerror");
> +                return;
>              }
>          }
>  
> @@ -2023,7 +2023,6 @@ static int fdctrl_connect_drives(FDCtrl *fdctrl)
>              bdrv_set_dev_ops(drive->bs, &fdctrl_block_ops, drive);
>          }
>      }
> -    return 0;
>  }
>  
>  ISADevice *fdctrl_init_isa(ISABus *bus, DriveInfo **fds)
> @@ -2089,7 +2088,7 @@ void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base,
>      *fdc_tc = qdev_get_gpio_in(dev, 0);
>  }
>  
> -static int fdctrl_init_common(FDCtrl *fdctrl)
> +static void fdctrl_realize_common(FDCtrl *fdctrl, Error **errp)
>  {
>      int i, j;
>      static int command_tables_inited = 0;
> @@ -2110,15 +2109,16 @@ static int fdctrl_init_common(FDCtrl *fdctrl)
>      fdctrl->fifo = qemu_memalign(512, FD_SECTOR_LEN);
>      fdctrl->fifo_size = 512;
>      fdctrl->result_timer = qemu_new_timer_ns(vm_clock,
> -                                          fdctrl_result_timer, fdctrl);
> +                                             fdctrl_result_timer, fdctrl);
>  
>      fdctrl->version = 0x90; /* Intel 82078 controller */
>      fdctrl->config = FD_CONFIG_EIS | FD_CONFIG_EFIFO; /* Implicit seek, polling & FIFO enabled */
>      fdctrl->num_floppies = MAX_FD;
>  
> -    if (fdctrl->dma_chann != -1)
> +    if (fdctrl->dma_chann != -1) {
>          DMA_register_channel(fdctrl->dma_chann, &fdctrl_transfer_handler, fdctrl);
> -    return fdctrl_connect_drives(fdctrl);
> +    }
> +    fdctrl_connect_drives(fdctrl, errp);
>  }
>  
>  static const MemoryRegionPortio fdc_portio_list[] = {
> @@ -2132,7 +2132,7 @@ static void isabus_fdc_realize(DeviceState *dev, Error **errp)
>      ISADevice *isadev = ISA_DEVICE(dev);
>      FDCtrlISABus *isa = ISA_FDC(dev);
>      FDCtrl *fdctrl = &isa->state;
> -    int ret;
> +    Error *err = NULL;
>  
>      isa_register_portio_list(isadev, isa->iobase, fdc_portio_list, fdctrl,
>                               "fdc");
> @@ -2141,9 +2141,9 @@ static void isabus_fdc_realize(DeviceState *dev, Error **errp)
>      fdctrl->dma_chann = isa->dma;
>  
>      qdev_set_legacy_instance_id(dev, isa->iobase, 2);
> -    ret = fdctrl_init_common(fdctrl);
> -    if (ret < 0) {
> -        error_setg(errp, "Floppy init failed.");
> +    fdctrl_realize_common(fdctrl, &err);
> +    if (err != NULL) {
> +        error_propagate(errp, err);
>          return;
>      }
>  
> @@ -2165,6 +2165,7 @@ static void sysbus_fdc_realize(DeviceState *dev, Error **errp)
>      FDCtrlSysBus *sys = SYSBUS_FDC(dev);
>      FDCtrl *fdctrl = &sys->state;
>      SysBusDevice *b = SYS_BUS_DEVICE(dev);
> +    Error *err = NULL;
>  
>      sysbus_init_mmio(b, &fdctrl->iomem);
>      sysbus_init_irq(b, &fdctrl->irq);
> @@ -2172,8 +2173,9 @@ static void sysbus_fdc_realize(DeviceState *dev, Error **errp)
>      fdctrl->dma_chann = -1;
>  
>      qdev_set_legacy_instance_id(dev, 0 /* io */, 2); /* FIXME */
> -    if (fdctrl_init_common(fdctrl) < 0) {
> -        error_setg(errp, "Floppy init failed.");
> +    fdctrl_realize_common(fdctrl, &err);
> +    if (err != NULL) {
> +        error_propagate(errp, err);
>          return;
>      }
>  }
> @@ -2192,6 +2194,7 @@ static void sun4m_fdc_realize(DeviceState *dev, Error **errp)
>      FDCtrlSysBus *sys = SYSBUS_FDC(dev);
>      FDCtrl *fdctrl = &sys->state;
>      SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
> +    Error *err = NULL;
>  
>      sysbus_init_mmio(sbd, &fdctrl->iomem);
>      sysbus_init_irq(sbd, &fdctrl->irq);
> @@ -2199,8 +2202,9 @@ static void sun4m_fdc_realize(DeviceState *dev, Error **errp)
>  
>      fdctrl->sun4m = 1;
>      qdev_set_legacy_instance_id(dev, 0 /* io */, 2); /* FIXME */
> -    if (fdctrl_init_common(fdctrl) < 0) {
> -        error_setg(errp, "Floppy init failed.");
> +    fdctrl_realize_common(fdctrl, &err);
> +    if (err != NULL) {
> +        error_propagate(errp, err);
>          return;
>      }
>  }
> -- 
> 1.8.1.4
> 

Reviewed-by: Hu Tao <hutao@cn.fujitsu.com>

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH qom-next] fdc: Improve error propagation for QOM realize
  2013-07-21  9:31   ` [Qemu-devel] [PATCH qom-next] fdc: Improve error propagation for QOM realize Andreas Färber
  2013-07-22  7:38     ` Hu Tao
@ 2013-07-22  8:26     ` Stefan Hajnoczi
  1 sibling, 0 replies; 49+ messages in thread
From: Stefan Hajnoczi @ 2013-07-22  8:26 UTC (permalink / raw)
  To: Andreas Färber; +Cc: Kevin Wolf, Hu Tao, qemu-devel

On Sun, Jul 21, 2013 at 11:31:57AM +0200, Andreas Färber wrote:
> Rename fdctrl_init_common() to fdctrl_realize_common() and let
> fdctrl_connect_drives() propagate an Error through it.
> 
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> ---
>  hw/block/fdc.c | 40 ++++++++++++++++++++++------------------
>  1 file changed, 22 insertions(+), 18 deletions(-)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH v2 17/26] fwcfg: use realize for fwcfg
  2013-07-21  9:35   ` Andreas Färber
@ 2013-07-22  8:37     ` Hu Tao
  0 siblings, 0 replies; 49+ messages in thread
From: Hu Tao @ 2013-07-22  8:37 UTC (permalink / raw)
  To: Andreas Färber; +Cc: qemu-devel

On Sun, Jul 21, 2013 at 11:35:55AM +0200, Andreas Färber wrote:
> Am 01.07.2013 12:18, schrieb Hu Tao:
> > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> > ---
> >  hw/nvram/fw_cfg.c | 26 ++++++++++++++++----------
> >  1 file changed, 16 insertions(+), 10 deletions(-)
> > 
> > diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
> > index c8722c2..656ffcc 100644
> > --- a/hw/nvram/fw_cfg.c
> > +++ b/hw/nvram/fw_cfg.c
> > @@ -523,31 +523,37 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
> >      return s;
> >  }
> >  
> > -static int fw_cfg_init1(SysBusDevice *dev)
> > +static void fw_cfg_initfn(Object *obj)
> >  {
> > -    FWCfgState *s = FW_CFG(dev);
> > +    FWCfgState *s = FW_CFG(obj);
> >  
> >      memory_region_init_io(&s->ctl_iomem, &fw_cfg_ctl_mem_ops, s,
> >                            "fwcfg.ctl", FW_CFG_SIZE);
> > -    sysbus_init_mmio(dev, &s->ctl_iomem);
> >      memory_region_init_io(&s->data_iomem, &fw_cfg_data_mem_ops, s,
> >                            "fwcfg.data", FW_CFG_DATA_SIZE);
> > -    sysbus_init_mmio(dev, &s->data_iomem);
> >      /* In case ctl and data overlap: */
> >      memory_region_init_io(&s->comb_iomem, &fw_cfg_comb_mem_ops, s,
> >                            "fwcfg", FW_CFG_SIZE);
> > +}
> 
> There's no reason not to have sysbus_init_mmio() in instance_init,
> changed that.

Thanks.


^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH qom-next] scsi: Improve error propagation for scsi_bus_legacy_handle_cmdline()
  2013-07-21 10:30   ` [Qemu-devel] [PATCH qom-next] scsi: Improve error propagation for scsi_bus_legacy_handle_cmdline() Andreas Färber
@ 2013-07-22  9:16     ` Hu Tao
  2013-07-22 10:24       ` Andreas Färber
  0 siblings, 1 reply; 49+ messages in thread
From: Hu Tao @ 2013-07-22  9:16 UTC (permalink / raw)
  To: Andreas Färber
  Cc: Anthony Liguori, Michael S. Tsirkin, Alexander Graf, qemu-devel,
	open list:sPAPR, Paul Brook, Paolo Bonzini, Gerd Hoffmann

On Sun, Jul 21, 2013 at 12:30:54PM +0200, Andreas Färber wrote:
> Let scsi_bus_legacy_add_drive() and scsi_bus_legacy_handle_cmdline()
> return an Error**. Prepare qdev initfns for QOM realize error model.
> 
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> ---
>  hw/pci/pci-hotplug-old.c |  2 +-
>  hw/scsi/esp-pci.c        |  7 ++++++-
>  hw/scsi/esp.c            |  6 ++++--
>  hw/scsi/lsi53c895a.c     |  7 ++++++-
>  hw/scsi/megasas.c        |  7 ++++++-
>  hw/scsi/scsi-bus.c       | 22 +++++++++++++++-------
>  hw/scsi/spapr_vscsi.c    |  7 ++++++-
>  hw/scsi/virtio-scsi.c    |  7 ++++++-
>  hw/usb/dev-storage.c     |  4 +++-
>  include/hw/scsi/scsi.h   |  4 ++--
>  10 files changed, 55 insertions(+), 18 deletions(-)
> 
> diff --git a/hw/pci/pci-hotplug-old.c b/hw/pci/pci-hotplug-old.c
> index 8077289..619fe47 100644
> --- a/hw/pci/pci-hotplug-old.c
> +++ b/hw/pci/pci-hotplug-old.c
> @@ -127,7 +127,7 @@ static int scsi_hot_add(Monitor *mon, DeviceState *adapter,
>      dinfo->unit = qemu_opt_get_number(dinfo->opts, "unit", -1);
>      dinfo->bus = scsibus->busnr;
>      scsidev = scsi_bus_legacy_add_drive(scsibus, dinfo->bdrv, dinfo->unit,
> -                                        false, -1, NULL);
> +                                        false, -1, NULL, NULL);
>      if (!scsidev) {
>          return -1;
>      }
> diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
> index 6cdfd53..2ac21d4 100644
> --- a/hw/scsi/esp-pci.c
> +++ b/hw/scsi/esp-pci.c
> @@ -346,6 +346,7 @@ static int esp_pci_scsi_init(PCIDevice *dev)
>      DeviceState *d = DEVICE(dev);
>      ESPState *s = &pci->esp;
>      uint8_t *pci_conf;
> +    Error *err = NULL;
>  
>      pci_conf = dev->config;
>  
> @@ -364,7 +365,11 @@ static int esp_pci_scsi_init(PCIDevice *dev)
>  
>      scsi_bus_new(&s->bus, d, &esp_pci_scsi_info, NULL);
>      if (!d->hotplugged) {
> -        return scsi_bus_legacy_handle_cmdline(&s->bus);
> +        scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> +        if (err != NULL) {

           if (error_is_set(&err))

> +            error_free(err);
> +            return -1;
> +        }
>      }
>      return 0;
>  }
> diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
> index c24b632..94639b8 100644
> --- a/hw/scsi/esp.c
> +++ b/hw/scsi/esp.c
> @@ -676,6 +676,7 @@ static void sysbus_esp_realize(DeviceState *dev, Error **errp)
>      SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
>      SysBusESPState *sysbus = ESP(dev);
>      ESPState *s = &sysbus->esp;
> +    Error *err = NULL;
>  
>      sysbus_init_irq(sbd, &s->irq);
>      assert(sysbus->it_shift != -1);
> @@ -688,8 +689,9 @@ static void sysbus_esp_realize(DeviceState *dev, Error **errp)
>      qdev_init_gpio_in(dev, sysbus_esp_gpio_demux, 2);
>  
>      scsi_bus_new(&s->bus, dev, &esp_scsi_info, NULL);
> -    if (scsi_bus_legacy_handle_cmdline(&s->bus) < 0) {
> -        error_setg(errp, "Handling legacy SCSI command line failed");
> +    scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> +    if (err != NULL) {

       if (error_is_set(&err))

> +        error_propagate(errp, err);
>          return;
>      }
>  }
> diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
> index e11224f..776e31a 100644
> --- a/hw/scsi/lsi53c895a.c
> +++ b/hw/scsi/lsi53c895a.c
> @@ -2096,6 +2096,7 @@ static int lsi_scsi_init(PCIDevice *dev)
>      LSIState *s = LSI53C895A(dev);
>      DeviceState *d = DEVICE(dev);
>      uint8_t *pci_conf;
> +    Error *err = NULL;
>  
>      pci_conf = dev->config;
>  
> @@ -2118,7 +2119,11 @@ static int lsi_scsi_init(PCIDevice *dev)
>  
>      scsi_bus_new(&s->bus, d, &lsi_scsi_info, NULL);
>      if (!d->hotplugged) {
> -        return scsi_bus_legacy_handle_cmdline(&s->bus);
> +        scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> +        if (err != NULL) {

           if (error_is_set(&err))

> +            error_free(err);
> +            return -1;
> +        }
>      }
>      return 0;
>  }
> diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
> index 2ae4346..eb52164 100644
> --- a/hw/scsi/megasas.c
> +++ b/hw/scsi/megasas.c
> @@ -2102,6 +2102,7 @@ static int megasas_scsi_init(PCIDevice *dev)
>      MegasasState *s = MEGASAS(dev);
>      uint8_t *pci_conf;
>      int i, bar_type;
> +    Error *err = NULL;
>  
>      pci_conf = dev->config;
>  
> @@ -2172,7 +2173,11 @@ static int megasas_scsi_init(PCIDevice *dev)
>  
>      scsi_bus_new(&s->bus, DEVICE(dev), &megasas_scsi_info, NULL);
>      if (!d->hotplugged) {
> -        return scsi_bus_legacy_handle_cmdline(&s->bus);
> +        scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> +        if (err != NULL) {

           if (error_is_set(&err))

> +            error_free(err);
> +            return -1;
> +        }
>      }
>      return 0;
>  }
> diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
> index a92b7c1..b5a863a 100644
> --- a/hw/scsi/scsi-bus.c
> +++ b/hw/scsi/scsi-bus.c
> @@ -209,10 +209,11 @@ static int scsi_qdev_exit(DeviceState *qdev)
>  /* handle legacy '-drive if=scsi,...' cmd line args */
>  SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
>                                        int unit, bool removable, int bootindex,
> -                                      const char *serial)
> +                                      const char *serial, Error **errp)
>  {
>      const char *driver;
>      DeviceState *dev;
> +    Error *err = NULL;
>  
>      driver = bdrv_is_sg(bdrv) ? "scsi-generic" : "scsi-disk";
>      dev = qdev_create(&bus->qbus, driver);
> @@ -227,19 +228,25 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
>          qdev_prop_set_string(dev, "serial", serial);
>      }
>      if (qdev_prop_set_drive(dev, "drive", bdrv) < 0) {
> +        error_setg(errp, "Setting drive property failed");
>          qdev_free(dev);
>          return NULL;
>      }
> -    if (qdev_init(dev) < 0)
> +    object_property_set_bool(OBJECT(dev), true, "realized", &err);
> +    if (err != NULL) {

       if (error_is_set(&err))

> +        error_propagate(errp, err);
> +        qdev_free(dev);
>          return NULL;
> +    }
>      return SCSI_DEVICE(dev);
>  }
>  
> -int scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
> +void scsi_bus_legacy_handle_cmdline(SCSIBus *bus, Error **errp)
>  {
>      Location loc;
>      DriveInfo *dinfo;
> -    int res = 0, unit;
> +    int unit;
> +    Error *err = NULL;
>  
>      loc_push_none(&loc);
>      for (unit = 0; unit <= bus->info->max_target; unit++) {
> @@ -248,13 +255,14 @@ int scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
>              continue;
>          }
>          qemu_opts_loc_restore(dinfo->opts);
> -        if (!scsi_bus_legacy_add_drive(bus, dinfo->bdrv, unit, false, -1, NULL)) {
> -            res = -1;
> +        scsi_bus_legacy_add_drive(bus, dinfo->bdrv, unit, false, -1, NULL,
> +                                  &err);
> +        if (err != NULL) {

           if (error_is_set(&err))

> +            error_propagate(errp, err);
>              break;
>          }
>      }
>      loc_pop(&loc);
> -    return res;
>  }
>  
>  static int32_t scsi_invalid_field(SCSIRequest *req, uint8_t *buf)
> diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
> index e8978bf..55b44b9 100644
> --- a/hw/scsi/spapr_vscsi.c
> +++ b/hw/scsi/spapr_vscsi.c
> @@ -912,12 +912,17 @@ static void spapr_vscsi_reset(VIOsPAPRDevice *dev)
>  static int spapr_vscsi_init(VIOsPAPRDevice *dev)
>  {
>      VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(dev);
> +    Error *err = NULL;
>  
>      dev->crq.SendFunc = vscsi_do_crq;
>  
>      scsi_bus_new(&s->bus, &dev->qdev, &vscsi_scsi_info, NULL);
>      if (!dev->qdev.hotplugged) {
> -        scsi_bus_legacy_handle_cmdline(&s->bus);
> +        scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> +        if (err != NULL) {

           if (error_is_set(&err))

> +            error_free(err);
> +            return -1;
> +        }
>      }
>  
>      return 0;
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index 712f0ad..42cb73b 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -619,6 +619,7 @@ static int virtio_scsi_device_init(VirtIODevice *vdev)
>      VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev);
>      VirtIOSCSI *s = VIRTIO_SCSI(vdev);
>      static int virtio_scsi_id;
> +    Error *err = NULL;
>      int ret;
>  
>      ret = virtio_scsi_common_init(vs);
> @@ -629,7 +630,11 @@ static int virtio_scsi_device_init(VirtIODevice *vdev)
>      scsi_bus_new(&s->bus, qdev, &virtio_scsi_scsi_info, vdev->bus_name);
>  
>      if (!qdev->hotplugged) {
> -        scsi_bus_legacy_handle_cmdline(&s->bus);
> +        scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> +        if (err != NULL) {

           if (error_is_set(&err))

> +            error_free(err);
> +            return -1;
> +        }
>      }
>  
>      register_savevm(qdev, "virtio-scsi", virtio_scsi_id++, 1,
> diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
> index fe914ab..1954811 100644
> --- a/hw/usb/dev-storage.c
> +++ b/hw/usb/dev-storage.c
> @@ -595,6 +595,7 @@ static int usb_msd_initfn_storage(USBDevice *dev)
>      MSDState *s = DO_UPCAST(MSDState, dev, dev);
>      BlockDriverState *bs = s->conf.bs;
>      SCSIDevice *scsi_dev;
> +    Error *err = NULL;
>  
>      if (!bs) {
>          error_report("drive property not set");
> @@ -619,7 +620,8 @@ static int usb_msd_initfn_storage(USBDevice *dev)
>      usb_desc_init(dev);
>      scsi_bus_new(&s->bus, &s->dev.qdev, &usb_msd_scsi_info_storage, NULL);
>      scsi_dev = scsi_bus_legacy_add_drive(&s->bus, bs, 0, !!s->removable,
> -                                            s->conf.bootindex, dev->serial);
> +                                         s->conf.bootindex, dev->serial,
> +                                         &err);
>      if (!scsi_dev) {
>          return -1;
>      }
> diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h
> index 9786e00..8786531 100644
> --- a/include/hw/scsi/scsi.h
> +++ b/include/hw/scsi/scsi.h
> @@ -162,8 +162,8 @@ static inline SCSIBus *scsi_bus_from_device(SCSIDevice *d)
>  
>  SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
>                                        int unit, bool removable, int bootindex,
> -                                      const char *serial);
> -int scsi_bus_legacy_handle_cmdline(SCSIBus *bus);
> +                                      const char *serial, Error **errp);
> +void scsi_bus_legacy_handle_cmdline(SCSIBus *bus, Error **errp);
>  
>  /*
>   * Predefined sense codes
> -- 
> 1.8.1.4
> 
> 

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [Qemu-devel] [PATCH qom-next] scsi: Improve error propagation for scsi_bus_legacy_handle_cmdline()
  2013-07-22  9:16     ` Hu Tao
@ 2013-07-22 10:24       ` Andreas Färber
  0 siblings, 0 replies; 49+ messages in thread
From: Andreas Färber @ 2013-07-22 10:24 UTC (permalink / raw)
  To: Hu Tao
  Cc: Anthony Liguori, Michael S. Tsirkin, Alexander Graf, qemu-devel,
	qemu-ppc, Paul Brook, Paolo Bonzini, Luiz Capitulino,
	Gerd Hoffmann

Am 22.07.2013 11:16, schrieb Hu Tao:
> On Sun, Jul 21, 2013 at 12:30:54PM +0200, Andreas Färber wrote:
>> Let scsi_bus_legacy_add_drive() and scsi_bus_legacy_handle_cmdline()
>> return an Error**. Prepare qdev initfns for QOM realize error model.
>>
>> Signed-off-by: Andreas Färber <afaerber@suse.de>
>> ---
>>  hw/pci/pci-hotplug-old.c |  2 +-
>>  hw/scsi/esp-pci.c        |  7 ++++++-
>>  hw/scsi/esp.c            |  6 ++++--
>>  hw/scsi/lsi53c895a.c     |  7 ++++++-
>>  hw/scsi/megasas.c        |  7 ++++++-
>>  hw/scsi/scsi-bus.c       | 22 +++++++++++++++-------
>>  hw/scsi/spapr_vscsi.c    |  7 ++++++-
>>  hw/scsi/virtio-scsi.c    |  7 ++++++-
>>  hw/usb/dev-storage.c     |  4 +++-
>>  include/hw/scsi/scsi.h   |  4 ++--
>>  10 files changed, 55 insertions(+), 18 deletions(-)
>>
>> diff --git a/hw/pci/pci-hotplug-old.c b/hw/pci/pci-hotplug-old.c
>> index 8077289..619fe47 100644
>> --- a/hw/pci/pci-hotplug-old.c
>> +++ b/hw/pci/pci-hotplug-old.c
>> @@ -127,7 +127,7 @@ static int scsi_hot_add(Monitor *mon, DeviceState *adapter,
>>      dinfo->unit = qemu_opt_get_number(dinfo->opts, "unit", -1);
>>      dinfo->bus = scsibus->busnr;
>>      scsidev = scsi_bus_legacy_add_drive(scsibus, dinfo->bdrv, dinfo->unit,
>> -                                        false, -1, NULL);
>> +                                        false, -1, NULL, NULL);
>>      if (!scsidev) {
>>          return -1;
>>      }
>> diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
>> index 6cdfd53..2ac21d4 100644
>> --- a/hw/scsi/esp-pci.c
>> +++ b/hw/scsi/esp-pci.c
>> @@ -346,6 +346,7 @@ static int esp_pci_scsi_init(PCIDevice *dev)
>>      DeviceState *d = DEVICE(dev);
>>      ESPState *s = &pci->esp;
>>      uint8_t *pci_conf;
>> +    Error *err = NULL;
>>  
>>      pci_conf = dev->config;
>>  
>> @@ -364,7 +365,11 @@ static int esp_pci_scsi_init(PCIDevice *dev)
>>  
>>      scsi_bus_new(&s->bus, d, &esp_pci_scsi_info, NULL);
>>      if (!d->hotplugged) {
>> -        return scsi_bus_legacy_handle_cmdline(&s->bus);
>> +        scsi_bus_legacy_handle_cmdline(&s->bus, &err);
>> +        if (err != NULL) {
> 
>            if (error_is_set(&err))

I was specifically instructed not to use error_is_set() on local err
variables. It is intended for potentially-NULL errp only, which &err
will never be.

Andreas

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 49+ messages in thread

end of thread, other threads:[~2013-07-22 10:24 UTC | newest]

Thread overview: 49+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-01 10:18 [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 01/26] sysbus: document SysBusDeviceClass about @init Hu Tao
2013-07-03  1:19   ` Andreas Färber
2013-07-03  1:24     ` Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 02/26] ohci: QOM'ify some more Hu Tao
2013-07-03  1:52   ` Andreas Färber
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 03/26] ohci: use realize for ohci Hu Tao
2013-07-07 15:22   ` Andreas Färber
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 04/26] i440fx-pcihost: use realize for i440fx-pcihost Hu Tao
2013-07-07 21:24   ` Andreas Färber
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 05/26] i440fx: use type-safe cast instead of directly access of parent dev Hu Tao
2013-07-07 17:03   ` Andreas Färber
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 06/26] q35: " Hu Tao
2013-07-07 23:05   ` Andreas Färber
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 07/26] q35: use realize for q35 host Hu Tao
2013-07-08  1:20   ` Andreas Färber
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 08/26] fdc: QOM'ify some more Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 09/26] fdc: use realize for fdc Hu Tao
2013-07-21  9:27   ` Andreas Färber
2013-07-21  9:31   ` [Qemu-devel] [PATCH qom-next] fdc: Improve error propagation for QOM realize Andreas Färber
2013-07-22  7:38     ` Hu Tao
2013-07-22  8:26     ` Stefan Hajnoczi
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 10/26] pflash-cfi01: QOM'ify some more Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 11/26] pflash_cfi01: use realize for pflash_cfi01 Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 12/26] pflash-cfi02: QOM'ify some more Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 13/26] pflash_cfi02: use realize for pflash_cfi02 Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 14/26] ahci: QOM'ify some more Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 15/26] ahci: use realize for ahci Hu Tao
2013-07-21  9:13   ` Andreas Färber
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 16/26] fwcfg: QOM'ify some more Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 17/26] fwcfg: use realize for fwcfg Hu Tao
2013-07-21  9:35   ` Andreas Färber
2013-07-22  8:37     ` Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 18/26] scsi esp: QOM'ify some more Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 19/26] scsi esp: use realize for scsi esp Hu Tao
2013-07-21  9:47   ` Andreas Färber
2013-07-21 10:30   ` [Qemu-devel] [PATCH qom-next] scsi: Improve error propagation for scsi_bus_legacy_handle_cmdline() Andreas Färber
2013-07-22  9:16     ` Hu Tao
2013-07-22 10:24       ` Andreas Färber
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 20/26] hpet: QOM'ify some more Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 21/26] hpet: use realize for hpet Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 22/26] kvmclock: QOM'ify some more Hu Tao
2013-07-16 14:00   ` Andreas Färber
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 23/26] kvmclock: use realize for kvmclock Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 24/26] kvmvapic realize Hu Tao
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 25/26] ioapic: use realize for ioapic Hu Tao
2013-07-21 10:35   ` Andreas Färber
2013-07-01 10:18 ` [Qemu-devel] [PATCH v2 26/26] isa bus: remove isabus_bridge_init since it does nothing Hu Tao
2013-07-21 10:58 ` [Qemu-devel] [PATCH v2 00/26] use realizefn for SysBusDevice, part 1 Andreas Färber

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.