Skip to content

Commit

Permalink
qdev: Convert busses to QEMU Object Model
Browse files Browse the repository at this point in the history
This is far less interesting than it sounds.  We simply add an Object to each
BusState and then register the types appropriately.  Most of the interesting
refactoring will follow in the next patches.

Since we're changing fundamental type names (BusInfo -> BusClass), it all needs
to convert at once.  Fortunately, not a lot of code is affected.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
[AF: Made all new bus TypeInfos static const.]
[AF: Made qbus_free() call object_delete(), required {qom,glib}_allocated]
Signed-off-by: Andreas Färber <afaerber@suse.de>
  • Loading branch information
Anthony Liguori authored and afaerber committed Jun 18, 2012
1 parent 8185d21 commit 0d93692
Show file tree
Hide file tree
Showing 27 changed files with 299 additions and 142 deletions.
15 changes: 10 additions & 5 deletions hw/i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,13 @@ static Property i2c_props[] = {
DEFINE_PROP_END_OF_LIST(),
};

static struct BusInfo i2c_bus_info = {
.name = "I2C",
.size = sizeof(i2c_bus),
#define TYPE_I2C_BUS "i2c-bus"
#define I2C_BUS(obj) OBJECT_CHECK(i2c_bus, (obj), TYPE_I2C_BUS)

static const TypeInfo i2c_bus_info = {
.name = TYPE_I2C_BUS,
.parent = TYPE_BUS,
.instance_size = sizeof(i2c_bus),
};

static void i2c_bus_pre_save(void *opaque)
Expand Down Expand Up @@ -62,7 +66,7 @@ i2c_bus *i2c_init_bus(DeviceState *parent, const char *name)
{
i2c_bus *bus;

bus = FROM_QBUS(i2c_bus, qbus_create(&i2c_bus_info, parent, name));
bus = FROM_QBUS(i2c_bus, qbus_create(TYPE_I2C_BUS, parent, name));
vmstate_register(NULL, -1, &vmstate_i2c_bus, bus);
return bus;
}
Expand Down Expand Up @@ -219,7 +223,7 @@ static void i2c_slave_class_init(ObjectClass *klass, void *data)
{
DeviceClass *k = DEVICE_CLASS(klass);
k->init = i2c_slave_qdev_init;
k->bus_info = &i2c_bus_info;
k->bus_type = TYPE_I2C_BUS;
k->props = i2c_props;
}

Expand All @@ -234,6 +238,7 @@ static TypeInfo i2c_slave_type_info = {

static void i2c_slave_register_types(void)
{
type_register_static(&i2c_bus_info);
type_register_static(&i2c_slave_type_info);
}

Expand Down
3 changes: 3 additions & 0 deletions hw/ide/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ typedef struct IDEState IDEState;
typedef struct IDEDMA IDEDMA;
typedef struct IDEDMAOps IDEDMAOps;

#define TYPE_IDE_BUS "IDE"
#define IDE_BUS(obj) OBJECT_CHECK(IDEBus, (obj), TYPE_IDE_BUS)

/* Bits of HD_STATUS */
#define ERR_STAT 0x01
#define INDEX_STAT 0x02
Expand Down
21 changes: 15 additions & 6 deletions hw/ide/qdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,23 @@ static Property ide_props[] = {
DEFINE_PROP_END_OF_LIST(),
};

static struct BusInfo ide_bus_info = {
.name = "IDE",
.size = sizeof(IDEBus),
.get_fw_dev_path = idebus_get_fw_dev_path,
static void ide_bus_class_init(ObjectClass *klass, void *data)
{
BusClass *k = BUS_CLASS(klass);

k->get_fw_dev_path = idebus_get_fw_dev_path;
}

static const TypeInfo ide_bus_info = {
.name = TYPE_IDE_BUS,
.parent = TYPE_BUS,
.instance_size = sizeof(IDEBus),
.class_init = ide_bus_class_init,
};

void ide_bus_new(IDEBus *idebus, DeviceState *dev, int bus_id)
{
qbus_create_inplace(&idebus->qbus, &ide_bus_info, dev, NULL);
qbus_create_inplace(&idebus->qbus, TYPE_IDE_BUS, dev, NULL);
idebus->bus_id = bus_id;
}

Expand Down Expand Up @@ -249,7 +257,7 @@ static void ide_device_class_init(ObjectClass *klass, void *data)
{
DeviceClass *k = DEVICE_CLASS(klass);
k->init = ide_qdev_init;
k->bus_info = &ide_bus_info;
k->bus_type = TYPE_IDE_BUS;
k->props = ide_props;
}

Expand All @@ -264,6 +272,7 @@ static TypeInfo ide_device_type_info = {

static void ide_register_types(void)
{
type_register_static(&ide_bus_info);
type_register_static(&ide_hd_info);
type_register_static(&ide_cd_info);
type_register_static(&ide_drive_info);
Expand Down
12 changes: 7 additions & 5 deletions hw/intel-hda.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,17 @@ static Property hda_props[] = {
DEFINE_PROP_END_OF_LIST()
};

static struct BusInfo hda_codec_bus_info = {
.name = "HDA",
.size = sizeof(HDACodecBus),
static const TypeInfo hda_codec_bus_info = {
.name = TYPE_HDA_BUS,
.parent = TYPE_BUS,
.instance_size = sizeof(HDACodecBus),
};

void hda_codec_bus_init(DeviceState *dev, HDACodecBus *bus,
hda_codec_response_func response,
hda_codec_xfer_func xfer)
{
qbus_create_inplace(&bus->qbus, &hda_codec_bus_info, dev, NULL);
qbus_create_inplace(&bus->qbus, TYPE_HDA_BUS, dev, NULL);
bus->response = response;
bus->xfer = xfer;
}
Expand Down Expand Up @@ -1276,7 +1277,7 @@ static void hda_codec_device_class_init(ObjectClass *klass, void *data)
DeviceClass *k = DEVICE_CLASS(klass);
k->init = hda_codec_dev_init;
k->exit = hda_codec_dev_exit;
k->bus_info = &hda_codec_bus_info;
k->bus_type = TYPE_HDA_BUS;
k->props = hda_props;
}

Expand All @@ -1291,6 +1292,7 @@ static TypeInfo hda_codec_device_type_info = {

static void intel_hda_register_types(void)
{
type_register_static(&hda_codec_bus_info);
type_register_static(&intel_hda_info);
type_register_static(&hda_codec_device_type_info);
}
Expand Down
3 changes: 3 additions & 0 deletions hw/intel-hda.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
#define HDA_CODEC_DEVICE_GET_CLASS(obj) \
OBJECT_GET_CLASS(HDACodecDeviceClass, (obj), TYPE_HDA_CODEC_DEVICE)

#define TYPE_HDA_BUS "HDA"
#define HDA_BUS(obj) OBJECT_CHECK(HDACodecBus, (obj), TYPE_HDA_BUS)

typedef struct HDACodecBus HDACodecBus;
typedef struct HDACodecDevice HDACodecDevice;

Expand Down
23 changes: 16 additions & 7 deletions hw/isa-bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,19 @@ target_phys_addr_t isa_mem_base = 0;
static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent);
static char *isabus_get_fw_dev_path(DeviceState *dev);

static struct BusInfo isa_bus_info = {
.name = "ISA",
.size = sizeof(ISABus),
.print_dev = isabus_dev_print,
.get_fw_dev_path = isabus_get_fw_dev_path,
static void isa_bus_class_init(ObjectClass *klass, void *data)
{
BusClass *k = BUS_CLASS(klass);

k->print_dev = isabus_dev_print;
k->get_fw_dev_path = isabus_get_fw_dev_path;
}

static const TypeInfo isa_bus_info = {
.name = TYPE_ISA_BUS,
.parent = TYPE_BUS,
.instance_size = sizeof(ISABus),
.class_init = isa_bus_class_init,
};

ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space_io)
Expand All @@ -46,7 +54,7 @@ ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space_io)
qdev_init_nofail(dev);
}

isabus = FROM_QBUS(ISABus, qbus_create(&isa_bus_info, dev, NULL));
isabus = FROM_QBUS(ISABus, qbus_create(TYPE_ISA_BUS, dev, NULL));
isabus->address_space_io = address_space_io;
return isabus;
}
Expand Down Expand Up @@ -198,7 +206,7 @@ static void isa_device_class_init(ObjectClass *klass, void *data)
{
DeviceClass *k = DEVICE_CLASS(klass);
k->init = isa_qdev_init;
k->bus_info = &isa_bus_info;
k->bus_type = TYPE_ISA_BUS;
}

static TypeInfo isa_device_type_info = {
Expand All @@ -212,6 +220,7 @@ static TypeInfo isa_device_type_info = {

static void isabus_register_types(void)
{
type_register_static(&isa_bus_info);
type_register_static(&isabus_bridge_info);
type_register_static(&isa_device_type_info);
}
Expand Down
3 changes: 3 additions & 0 deletions hw/isa.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ typedef struct ISADevice ISADevice;
#define ISA_DEVICE_GET_CLASS(obj) \
OBJECT_GET_CLASS(ISADeviceClass, (obj), TYPE_ISA_DEVICE)

#define TYPE_ISA_BUS "ISA"
#define ISA_BUS(obj) OBJECT_CHECK(ISABus, (obj), TYPE_ISA_BUS)

typedef struct ISADeviceClass {
DeviceClass parent_class;
int (*init)(ISADevice *dev);
Expand Down
6 changes: 1 addition & 5 deletions hw/pci-hotplug.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,7 @@ static int scsi_hot_add(Monitor *mon, DeviceState *adapter,
SCSIBus *scsibus;
SCSIDevice *scsidev;

scsibus = DO_UPCAST(SCSIBus, qbus, QLIST_FIRST(&adapter->child_bus));
if (!scsibus || strcmp(scsibus->qbus.info->name, "SCSI") != 0) {
error_report("Device is not a SCSI adapter");
return -1;
}
scsibus = SCSI_BUS(QLIST_FIRST(&adapter->child_bus));

/*
* drive_init() tries to find a default for dinfo->unit. Doesn't
Expand Down
29 changes: 19 additions & 10 deletions hw/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,21 @@ static Property pci_props[] = {
DEFINE_PROP_END_OF_LIST()
};

struct BusInfo pci_bus_info = {
.name = "PCI",
.size = sizeof(PCIBus),
.print_dev = pcibus_dev_print,
.get_dev_path = pcibus_get_dev_path,
.get_fw_dev_path = pcibus_get_fw_dev_path,
.reset = pcibus_reset,
static void pci_bus_class_init(ObjectClass *klass, void *data)
{
BusClass *k = BUS_CLASS(klass);

k->print_dev = pcibus_dev_print;
k->get_dev_path = pcibus_get_dev_path;
k->get_fw_dev_path = pcibus_get_fw_dev_path;
k->reset = pcibus_reset;
}

static const TypeInfo pci_bus_info = {
.name = TYPE_PCI_BUS,
.parent = TYPE_BUS,
.instance_size = sizeof(PCIBus),
.class_init = pci_bus_class_init,
};

static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num);
Expand Down Expand Up @@ -266,7 +274,7 @@ void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent,
MemoryRegion *address_space_io,
uint8_t devfn_min)
{
qbus_create_inplace(&bus->qbus, &pci_bus_info, parent, name);
qbus_create_inplace(&bus->qbus, TYPE_PCI_BUS, parent, name);
assert(PCI_FUNC(devfn_min) == 0);
bus->devfn_min = devfn_min;
bus->address_space_mem = address_space_mem;
Expand All @@ -287,7 +295,7 @@ PCIBus *pci_bus_new(DeviceState *parent, const char *name,
PCIBus *bus;

bus = g_malloc0(sizeof(*bus));
bus->qbus.qdev_allocated = 1;
bus->qbus.glib_allocated = true;
pci_bus_new_inplace(bus, parent, name, address_space_mem,
address_space_io, devfn_min);
return bus;
Expand Down Expand Up @@ -2001,7 +2009,7 @@ static void pci_device_class_init(ObjectClass *klass, void *data)
k->init = pci_qdev_init;
k->unplug = pci_unplug_device;
k->exit = pci_unregister_device;
k->bus_info = &pci_bus_info;
k->bus_type = TYPE_PCI_BUS;
k->props = pci_props;
}

Expand All @@ -2016,6 +2024,7 @@ static TypeInfo pci_device_type_info = {

static void pci_register_types(void)
{
type_register_static(&pci_bus_info);
type_register_static(&pci_device_type_info);
}

Expand Down
2 changes: 1 addition & 1 deletion hw/pci_bridge.c
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ int pci_bridge_initfn(PCIDevice *dev)
br->bus_name = dev->qdev.id;
}

qbus_create_inplace(&sec_bus->qbus, &pci_bus_info, &dev->qdev,
qbus_create_inplace(&sec_bus->qbus, TYPE_PCI_BUS, &dev->qdev,
br->bus_name);
sec_bus->parent_dev = dev;
sec_bus->map_irq = br->map_irq;
Expand Down
3 changes: 2 additions & 1 deletion hw/pci_internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
* Use accessor function in pci.h, pci_bridge.h
*/

extern struct BusInfo pci_bus_info;
#define TYPE_PCI_BUS "PCI"
#define PCI_BUS(obj) OBJECT_CHECK(PCIBus, (obj), TYPE_PCI_BUS)

struct PCIBus {
BusState qbus;
Expand Down
33 changes: 21 additions & 12 deletions hw/qdev-monitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ static void qdev_print_devinfo(ObjectClass *klass, void *opaque)
}

error_printf("name \"%s\"", object_class_get_name(klass));
if (dc->bus_info) {
error_printf(", bus %s", dc->bus_info->name);
if (dc->bus_type) {
error_printf(", bus %s", dc->bus_type);
}
if (qdev_class_has_alias(dc)) {
error_printf(", alias \"%s\"", qdev_class_get_alias(dc));
Expand Down Expand Up @@ -262,7 +262,7 @@ static DeviceState *qbus_find_dev(BusState *bus, char *elem)
}

static BusState *qbus_find_recursive(BusState *bus, const char *name,
const BusInfo *info)
const char *bus_typename)
{
DeviceState *dev;
BusState *child, *ret;
Expand All @@ -271,7 +271,8 @@ static BusState *qbus_find_recursive(BusState *bus, const char *name,
if (name && (strcmp(bus->name, name) != 0)) {
match = 0;
}
if (info && (bus->info != info)) {
if (bus_typename &&
(strcmp(object_get_typename(OBJECT(bus)), bus_typename) != 0)) {
match = 0;
}
if (match) {
Expand All @@ -280,7 +281,7 @@ static BusState *qbus_find_recursive(BusState *bus, const char *name,

QTAILQ_FOREACH(dev, &bus->children, sibling) {
QLIST_FOREACH(child, &dev->child_bus, sibling) {
ret = qbus_find_recursive(child, name, info);
ret = qbus_find_recursive(child, name, bus_typename);
if (ret) {
return ret;
}
Expand Down Expand Up @@ -415,16 +416,16 @@ DeviceState *qdev_device_add(QemuOpts *opts)
if (!bus) {
return NULL;
}
if (bus->info != k->bus_info) {
if (strcmp(object_get_typename(OBJECT(bus)), k->bus_type) != 0) {
qerror_report(QERR_BAD_BUS_FOR_DEVICE,
driver, bus->info->name);
driver, object_get_typename(OBJECT(bus)));
return NULL;
}
} else {
bus = qbus_find_recursive(sysbus_get_default(), NULL, k->bus_info);
bus = qbus_find_recursive(sysbus_get_default(), NULL, k->bus_type);
if (!bus) {
qerror_report(QERR_NO_BUS_FOR_DEVICE,
driver, k->bus_info->name);
driver, k->bus_type);
return NULL;
}
}
Expand Down Expand Up @@ -497,6 +498,15 @@ static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props,
}
}

static void bus_print_dev(BusState *bus, Monitor *mon, DeviceState *dev, int indent)
{
BusClass *bc = BUS_GET_CLASS(bus);

if (bc->print_dev) {
bc->print_dev(mon, dev, indent);
}
}

static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
{
ObjectClass *class;
Expand All @@ -515,8 +525,7 @@ static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
qdev_print_props(mon, dev, DEVICE_CLASS(class)->props, indent);
class = object_class_get_parent(class);
} while (class != object_class_by_name(TYPE_DEVICE));
if (dev->parent_bus->info->print_dev)
dev->parent_bus->info->print_dev(mon, dev, indent);
bus_print_dev(dev->parent_bus, mon, dev, indent + 2);
QLIST_FOREACH(child, &dev->child_bus, sibling) {
qbus_print(mon, child, indent);
}
Expand All @@ -528,7 +537,7 @@ static void qbus_print(Monitor *mon, BusState *bus, int indent)

qdev_printf("bus: %s\n", bus->name);
indent += 2;
qdev_printf("type %s\n", bus->info->name);
qdev_printf("type %s\n", object_get_typename(OBJECT(bus)));
QTAILQ_FOREACH(dev, &bus->children, sibling) {
qdev_print(mon, dev, indent);
}
Expand Down
Loading

0 comments on commit 0d93692

Please sign in to comment.