mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/afaerber/tags/qom-devices-for-peter' into staging
QOM infrastructure fixes and device conversions * GPIO conversion to QOM, continued * Device property description support * QTest cases for hotplug * Hotplug handler conversion # gpg: Signature made Wed 15 Oct 2014 04:05:17 BST using RSA key ID 3E7E013F # gpg: Good signature from "Andreas Färber <afaerber@suse.de>" # gpg: aka "Andreas Färber <afaerber@suse.com>" * remotes/afaerber/tags/qom-devices-for-peter: (47 commits) qdev: Drop legacy_name from qdev properties qmp: Print descriptions of object properties qdev: Set the object property's description to the qdev property's. qom: Add description field in ObjectProperty struct qdev: Add description field in PropertyInfo struct qdev: device_del: Search for to be unplugged device in 'peripheral' container qdev: HotplugHandler: Add support for unplugging BUS-less devices qdev: Drop legacy hotplug fields/methods usb: Convert usb devices to hotplug handler API usb: Convert usb-ccid to hotplug handler API usb-storage: Drop not needed "allow_hotplug = 0" usb-bot: Drop not needed "allow_hotplug = 0" usb-bot: Mark device as non hotpluggable scsi: Cleanup not used anymore SCSIBusInfo{hotplug, hot_unplug} fields scsi: Convert virtio-scsi HBA to hotplug handler API scsi: Convert pvscsi HBA to hotplug handler API scsi: Set SCSI BUS itself as default HotplugHandler s390x: Convert virtio-ccw to hotplug handler API s390x: Convert s390-virtio to hotplug handler API s390x: Drop not used allow_hotplug in event-facility ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
+3
-3
@@ -354,8 +354,8 @@ static void piix4_device_plug_cb(HotplugHandler *hotplug_dev,
|
||||
}
|
||||
}
|
||||
|
||||
static void piix4_device_unplug_cb(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
static void piix4_device_unplug_request_cb(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
PIIX4PMState *s = PIIX4_PM(hotplug_dev);
|
||||
|
||||
@@ -615,7 +615,7 @@ static void piix4_pm_class_init(ObjectClass *klass, void *data)
|
||||
dc->cannot_instantiate_with_device_add_yet = true;
|
||||
dc->hotpluggable = false;
|
||||
hc->plug = piix4_device_plug_cb;
|
||||
hc->unplug = piix4_device_unplug_cb;
|
||||
hc->unplug_request = piix4_device_unplug_request_cb;
|
||||
adevc->ospm_status = piix4_ospm_status;
|
||||
}
|
||||
|
||||
|
||||
@@ -904,6 +904,12 @@ static void virtser_port_device_realize(DeviceState *dev, Error **errp)
|
||||
}
|
||||
|
||||
port->elem.out_num = 0;
|
||||
}
|
||||
|
||||
static void virtser_port_device_plug(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
|
||||
|
||||
QTAILQ_INSERT_TAIL(&port->vser->ports, port, next);
|
||||
port->ivq = port->vser->ivqs[port->id];
|
||||
@@ -912,7 +918,7 @@ static void virtser_port_device_realize(DeviceState *dev, Error **errp)
|
||||
add_port(port->vser, port->id);
|
||||
|
||||
/* Send an update to the guest about this new port added */
|
||||
virtio_notify_config(vdev);
|
||||
virtio_notify_config(VIRTIO_DEVICE(hotplug_dev));
|
||||
}
|
||||
|
||||
static void virtser_port_device_unrealize(DeviceState *dev, Error **errp)
|
||||
@@ -935,7 +941,6 @@ static void virtio_serial_device_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
|
||||
VirtIOSerial *vser = VIRTIO_SERIAL(dev);
|
||||
BusState *bus;
|
||||
uint32_t i, max_supported_ports;
|
||||
|
||||
if (!vser->serial.max_virtserial_ports) {
|
||||
@@ -957,8 +962,7 @@ static void virtio_serial_device_realize(DeviceState *dev, Error **errp)
|
||||
/* Spawn a new virtio-serial bus on which the ports will ride as devices */
|
||||
qbus_create_inplace(&vser->bus, sizeof(vser->bus), TYPE_VIRTIO_SERIAL_BUS,
|
||||
dev, vdev->bus_name);
|
||||
bus = BUS(&vser->bus);
|
||||
bus->allow_hotplug = 1;
|
||||
qbus_set_hotplug_handler(BUS(&vser->bus), DEVICE(vser), errp);
|
||||
vser->bus.vser = vser;
|
||||
QTAILQ_INIT(&vser->ports);
|
||||
|
||||
@@ -1021,7 +1025,6 @@ static void virtio_serial_port_class_init(ObjectClass *klass, void *data)
|
||||
k->bus_type = TYPE_VIRTIO_SERIAL_BUS;
|
||||
k->realize = virtser_port_device_realize;
|
||||
k->unrealize = virtser_port_device_unrealize;
|
||||
k->unplug = qdev_simple_unplug_cb;
|
||||
k->props = virtser_props;
|
||||
}
|
||||
|
||||
@@ -1064,6 +1067,7 @@ static void virtio_serial_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
|
||||
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
|
||||
|
||||
QLIST_INIT(&vserdevices.devices);
|
||||
|
||||
@@ -1077,6 +1081,8 @@ static void virtio_serial_class_init(ObjectClass *klass, void *data)
|
||||
vdc->reset = vser_reset;
|
||||
vdc->save = virtio_serial_save_device;
|
||||
vdc->load = virtio_serial_load_device;
|
||||
hc->plug = virtser_port_device_plug;
|
||||
hc->unplug = qdev_simple_device_unplug_cb;
|
||||
}
|
||||
|
||||
static const TypeInfo virtio_device_info = {
|
||||
@@ -1084,6 +1090,10 @@ static const TypeInfo virtio_device_info = {
|
||||
.parent = TYPE_VIRTIO_DEVICE,
|
||||
.instance_size = sizeof(VirtIOSerial),
|
||||
.class_init = virtio_serial_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_HOTPLUG_HANDLER },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
||||
static void virtio_serial_register_types(void)
|
||||
|
||||
@@ -23,6 +23,17 @@ void hotplug_handler_plug(HotplugHandler *plug_handler,
|
||||
}
|
||||
}
|
||||
|
||||
void hotplug_handler_unplug_request(HotplugHandler *plug_handler,
|
||||
DeviceState *plugged_dev,
|
||||
Error **errp)
|
||||
{
|
||||
HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
|
||||
|
||||
if (hdc->unplug_request) {
|
||||
hdc->unplug_request(plug_handler, plugged_dev, errp);
|
||||
}
|
||||
}
|
||||
|
||||
void hotplug_handler_unplug(HotplugHandler *plug_handler,
|
||||
DeviceState *plugged_dev,
|
||||
Error **errp)
|
||||
|
||||
@@ -112,7 +112,7 @@ static void set_drive(Object *obj, Visitor *v, void *opaque,
|
||||
|
||||
PropertyInfo qdev_prop_drive = {
|
||||
.name = "str",
|
||||
.legacy_name = "drive",
|
||||
.description = "ID of a drive to use as a backend",
|
||||
.get = get_drive,
|
||||
.set = set_drive,
|
||||
.release = release_drive,
|
||||
@@ -169,7 +169,7 @@ static void set_chr(Object *obj, Visitor *v, void *opaque,
|
||||
|
||||
PropertyInfo qdev_prop_chr = {
|
||||
.name = "str",
|
||||
.legacy_name = "chr",
|
||||
.description = "ID of a chardev to use as a backend",
|
||||
.get = get_chr,
|
||||
.set = set_chr,
|
||||
.release = release_chr,
|
||||
@@ -248,7 +248,7 @@ static void set_netdev(Object *obj, Visitor *v, void *opaque,
|
||||
|
||||
PropertyInfo qdev_prop_netdev = {
|
||||
.name = "str",
|
||||
.legacy_name = "netdev",
|
||||
.description = "ID of a netdev to use as a backend",
|
||||
.get = get_netdev,
|
||||
.set = set_netdev,
|
||||
};
|
||||
@@ -328,7 +328,7 @@ static void set_vlan(Object *obj, Visitor *v, void *opaque,
|
||||
|
||||
PropertyInfo qdev_prop_vlan = {
|
||||
.name = "int32",
|
||||
.legacy_name = "vlan",
|
||||
.description = "Integer VLAN id to connect to",
|
||||
.print = print_vlan,
|
||||
.get = get_vlan,
|
||||
.set = set_vlan,
|
||||
|
||||
@@ -120,7 +120,7 @@ static void prop_set_bit(Object *obj, Visitor *v, void *opaque,
|
||||
|
||||
PropertyInfo qdev_prop_bit = {
|
||||
.name = "bool",
|
||||
.legacy_name = "on/off",
|
||||
.description = "on/off",
|
||||
.get = prop_get_bit,
|
||||
.set = prop_set_bit,
|
||||
};
|
||||
@@ -455,7 +455,7 @@ inval:
|
||||
|
||||
PropertyInfo qdev_prop_macaddr = {
|
||||
.name = "str",
|
||||
.legacy_name = "macaddr",
|
||||
.description = "Ethernet 6-byte MAC Address, example: 52:54:00:12:34:56",
|
||||
.get = get_mac,
|
||||
.set = set_mac,
|
||||
};
|
||||
@@ -477,7 +477,8 @@ QEMU_BUILD_BUG_ON(sizeof(BiosAtaTranslation) != sizeof(int));
|
||||
|
||||
PropertyInfo qdev_prop_bios_chs_trans = {
|
||||
.name = "BiosAtaTranslation",
|
||||
.legacy_name = "bios-chs-trans",
|
||||
.description = "Logical CHS translation algorithm, "
|
||||
"auto/none/lba/large/rechs",
|
||||
.enum_table = BiosAtaTranslation_lookup,
|
||||
.get = get_enum,
|
||||
.set = set_enum,
|
||||
@@ -551,7 +552,7 @@ static int print_pci_devfn(DeviceState *dev, Property *prop, char *dest,
|
||||
|
||||
PropertyInfo qdev_prop_pci_devfn = {
|
||||
.name = "int32",
|
||||
.legacy_name = "pci-devfn",
|
||||
.description = "Slot and optional function number, example: 06.0 or 06",
|
||||
.print = print_pci_devfn,
|
||||
.get = get_int32,
|
||||
.set = set_pci_devfn,
|
||||
@@ -598,7 +599,7 @@ static void set_blocksize(Object *obj, Visitor *v, void *opaque,
|
||||
|
||||
PropertyInfo qdev_prop_blocksize = {
|
||||
.name = "uint16",
|
||||
.legacy_name = "blocksize",
|
||||
.description = "A power of two between 512 and 32768",
|
||||
.get = get_uint16,
|
||||
.set = set_blocksize,
|
||||
};
|
||||
@@ -706,7 +707,8 @@ inval:
|
||||
|
||||
PropertyInfo qdev_prop_pci_host_devaddr = {
|
||||
.name = "str",
|
||||
.legacy_name = "pci-host-devaddr",
|
||||
.description = "Address (bus/device/function) of "
|
||||
"the host device, example: 04:10.0",
|
||||
.get = get_pci_host_devaddr,
|
||||
.set = set_pci_host_devaddr,
|
||||
};
|
||||
|
||||
+84
-29
@@ -85,10 +85,6 @@ static void bus_add_child(BusState *bus, DeviceState *child)
|
||||
char name[32];
|
||||
BusChild *kid = g_malloc0(sizeof(*kid));
|
||||
|
||||
if (qdev_hotplug) {
|
||||
assert(bus->allow_hotplug);
|
||||
}
|
||||
|
||||
kid->index = bus->max_index++;
|
||||
kid->child = child;
|
||||
object_ref(OBJECT(kid->child));
|
||||
@@ -112,6 +108,24 @@ void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
|
||||
bus_add_child(bus, dev);
|
||||
}
|
||||
|
||||
static void qbus_set_hotplug_handler_internal(BusState *bus, Object *handler,
|
||||
Error **errp)
|
||||
{
|
||||
|
||||
object_property_set_link(OBJECT(bus), OBJECT(handler),
|
||||
QDEV_HOTPLUG_HANDLER_PROPERTY, errp);
|
||||
}
|
||||
|
||||
void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler, Error **errp)
|
||||
{
|
||||
qbus_set_hotplug_handler_internal(bus, OBJECT(handler), errp);
|
||||
}
|
||||
|
||||
void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp)
|
||||
{
|
||||
qbus_set_hotplug_handler_internal(bus, OBJECT(bus), errp);
|
||||
}
|
||||
|
||||
/* Create a new device. This only initializes the device state structure
|
||||
and allows properties to be set. qdev_init should be called to
|
||||
initialize the actual device emulation. */
|
||||
@@ -209,11 +223,30 @@ void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
|
||||
dev->alias_required_for_version = required_for_version;
|
||||
}
|
||||
|
||||
static HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
|
||||
{
|
||||
HotplugHandler *hotplug_ctrl = NULL;
|
||||
|
||||
if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
|
||||
hotplug_ctrl = dev->parent_bus->hotplug_handler;
|
||||
} else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
|
||||
MachineState *machine = MACHINE(qdev_get_machine());
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
|
||||
if (mc->get_hotplug_handler) {
|
||||
hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
|
||||
}
|
||||
}
|
||||
return hotplug_ctrl;
|
||||
}
|
||||
|
||||
void qdev_unplug(DeviceState *dev, Error **errp)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_GET_CLASS(dev);
|
||||
HotplugHandler *hotplug_ctrl;
|
||||
HotplugHandlerClass *hdc;
|
||||
|
||||
if (dev->parent_bus && !dev->parent_bus->allow_hotplug) {
|
||||
if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
|
||||
error_set(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
|
||||
return;
|
||||
}
|
||||
@@ -226,13 +259,18 @@ void qdev_unplug(DeviceState *dev, Error **errp)
|
||||
|
||||
qdev_hot_removed = true;
|
||||
|
||||
if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
|
||||
hotplug_handler_unplug(dev->parent_bus->hotplug_handler, dev, errp);
|
||||
hotplug_ctrl = qdev_get_hotplug_handler(dev);
|
||||
/* hotpluggable device MUST have HotplugHandler, if it doesn't
|
||||
* then something is very wrong with it */
|
||||
g_assert(hotplug_ctrl);
|
||||
|
||||
/* If device supports async unplug just request it to be done,
|
||||
* otherwise just remove it synchronously */
|
||||
hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl);
|
||||
if (hdc->unplug_request) {
|
||||
hotplug_handler_unplug_request(hotplug_ctrl, dev, errp);
|
||||
} else {
|
||||
assert(dc->unplug != NULL);
|
||||
if (dc->unplug(dev) < 0) { /* legacy handler */
|
||||
error_set(errp, QERR_UNDEFINED_ERROR);
|
||||
}
|
||||
hotplug_handler_unplug(hotplug_ctrl, dev, errp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -269,14 +307,13 @@ void qbus_reset_all_fn(void *opaque)
|
||||
}
|
||||
|
||||
/* can be used as ->unplug() callback for the simple cases */
|
||||
int qdev_simple_unplug_cb(DeviceState *dev)
|
||||
void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
/* just zap it */
|
||||
object_unparent(OBJECT(dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Like qdev_init(), but terminate program via error_report() instead of
|
||||
returning an error value. This is okay during machine creation.
|
||||
Don't use for hotplug, because there callers need to recover from
|
||||
@@ -337,10 +374,20 @@ static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
|
||||
void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
|
||||
const char *name, int n)
|
||||
{
|
||||
int i;
|
||||
NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
|
||||
char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-in");
|
||||
|
||||
assert(gpio_list->num_out == 0 || !name);
|
||||
gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
|
||||
dev, n);
|
||||
|
||||
for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
|
||||
object_property_add_child(OBJECT(dev), propname,
|
||||
OBJECT(gpio_list->in[i]), &error_abort);
|
||||
}
|
||||
g_free(propname);
|
||||
|
||||
gpio_list->num_in += n;
|
||||
}
|
||||
|
||||
@@ -352,11 +399,24 @@ void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
|
||||
void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
|
||||
const char *name, int n)
|
||||
{
|
||||
int i;
|
||||
NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
|
||||
char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-out");
|
||||
|
||||
assert(gpio_list->num_in == 0 || !name);
|
||||
assert(gpio_list->num_out == 0);
|
||||
gpio_list->num_out = n;
|
||||
gpio_list->out = pins;
|
||||
|
||||
for (i = 0; i < n; ++i) {
|
||||
memset(&pins[i], 0, sizeof(*pins));
|
||||
object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
|
||||
(Object **)&pins[i],
|
||||
object_property_allow_set_link,
|
||||
OBJ_PROP_LINK_UNREF_ON_RELEASE,
|
||||
&error_abort);
|
||||
}
|
||||
g_free(propname);
|
||||
}
|
||||
|
||||
void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
|
||||
@@ -766,6 +826,11 @@ void qdev_property_add_static(DeviceState *dev, Property *prop,
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
object_property_set_description(obj, prop->name,
|
||||
prop->info->description,
|
||||
&error_abort);
|
||||
|
||||
if (prop->qtype == QTYPE_NONE) {
|
||||
return;
|
||||
}
|
||||
@@ -811,6 +876,7 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
DeviceClass *dc = DEVICE_GET_CLASS(dev);
|
||||
HotplugHandler *hotplug_ctrl;
|
||||
BusState *bus;
|
||||
Error *local_err = NULL;
|
||||
|
||||
@@ -838,20 +904,9 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
|
||||
hotplug_handler_plug(dev->parent_bus->hotplug_handler,
|
||||
dev, &local_err);
|
||||
} else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
|
||||
HotplugHandler *hotplug_ctrl;
|
||||
MachineState *machine = MACHINE(qdev_get_machine());
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
|
||||
if (mc->get_hotplug_handler) {
|
||||
hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
|
||||
if (hotplug_ctrl) {
|
||||
hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
|
||||
}
|
||||
}
|
||||
hotplug_ctrl = qdev_get_hotplug_handler(dev);
|
||||
if (hotplug_ctrl) {
|
||||
hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
|
||||
}
|
||||
|
||||
if (local_err != NULL) {
|
||||
@@ -925,7 +980,7 @@ static bool device_get_hotpluggable(Object *obj, Error **errp)
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
|
||||
return dc->hotpluggable && (dev->parent_bus == NULL ||
|
||||
dev->parent_bus->allow_hotplug);
|
||||
qbus_is_hotpluggable(dev->parent_bus));
|
||||
}
|
||||
|
||||
static bool device_get_hotplugged(Object *obj, Error **err)
|
||||
|
||||
@@ -24,18 +24,10 @@
|
||||
|
||||
/* icc-bridge implementation */
|
||||
|
||||
static void icc_bus_init(Object *obj)
|
||||
{
|
||||
BusState *b = BUS(obj);
|
||||
|
||||
b->allow_hotplug = true;
|
||||
}
|
||||
|
||||
static const TypeInfo icc_bus_info = {
|
||||
.name = TYPE_ICC_BUS,
|
||||
.parent = TYPE_BUS,
|
||||
.instance_size = sizeof(ICCBus),
|
||||
.instance_init = icc_bus_init,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -774,7 +774,7 @@ static void *acpi_set_bsel(PCIBus *bus, void *opaque)
|
||||
unsigned *bsel_alloc = opaque;
|
||||
unsigned *bus_bsel;
|
||||
|
||||
if (bus->qbus.allow_hotplug) {
|
||||
if (qbus_is_hotpluggable(BUS(bus))) {
|
||||
bus_bsel = g_malloc(sizeof *bus_bsel);
|
||||
|
||||
*bus_bsel = (*bsel_alloc)++;
|
||||
|
||||
+3
-3
@@ -607,8 +607,8 @@ static void ich9_device_plug_cb(HotplugHandler *hotplug_dev,
|
||||
ich9_pm_device_plug_cb(&lpc->pm, dev, errp);
|
||||
}
|
||||
|
||||
static void ich9_device_unplug_cb(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
static void ich9_device_unplug_request_cb(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
error_setg(errp, "acpi: device unplug request for not supported device"
|
||||
" type: %s", object_get_typename(OBJECT(dev)));
|
||||
@@ -676,7 +676,7 @@ static void ich9_lpc_class_init(ObjectClass *klass, void *data)
|
||||
*/
|
||||
dc->cannot_instantiate_with_device_add_yet = true;
|
||||
hc->plug = ich9_device_plug_cb;
|
||||
hc->unplug = ich9_device_unplug_cb;
|
||||
hc->unplug_request = ich9_device_unplug_request_cb;
|
||||
adevc->ospm_status = ich9_pm_ospm_status;
|
||||
}
|
||||
|
||||
|
||||
@@ -150,7 +150,7 @@ static void pci_bridge_dev_class_init(ObjectClass *klass, void *data)
|
||||
dc->vmsd = &pci_bridge_dev_vmstate;
|
||||
set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
|
||||
hc->plug = shpc_device_hotplug_cb;
|
||||
hc->unplug = shpc_device_hot_unplug_cb;
|
||||
hc->unplug_request = shpc_device_hot_unplug_request_cb;
|
||||
}
|
||||
|
||||
static const TypeInfo pci_bridge_dev_info = {
|
||||
|
||||
@@ -77,7 +77,7 @@ static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon,
|
||||
monitor_printf(mon, "Invalid PCI device address %s\n", devaddr);
|
||||
return NULL;
|
||||
}
|
||||
if (!((BusState*)bus)->allow_hotplug) {
|
||||
if (!qbus_is_hotpluggable(BUS(bus))) {
|
||||
monitor_printf(mon, "PCI bus doesn't support hotplug\n");
|
||||
return NULL;
|
||||
}
|
||||
@@ -227,7 +227,7 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
|
||||
monitor_printf(mon, "Invalid PCI device address %s\n", devaddr);
|
||||
return NULL;
|
||||
}
|
||||
if (!((BusState*)bus)->allow_hotplug) {
|
||||
if (!qbus_is_hotpluggable(BUS(bus))) {
|
||||
monitor_printf(mon, "PCI bus doesn't support hotplug\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+2
-2
@@ -262,8 +262,8 @@ void pcie_cap_slot_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
PCI_EXP_HP_EV_PDC | PCI_EXP_HP_EV_ABP);
|
||||
}
|
||||
|
||||
void pcie_cap_slot_hot_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
Error **errp)
|
||||
void pcie_cap_slot_hot_unplug_request_cb(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
uint8_t *exp_cap;
|
||||
|
||||
|
||||
+1
-1
@@ -154,7 +154,7 @@ static void pcie_slot_class_init(ObjectClass *oc, void *data)
|
||||
|
||||
dc->props = pcie_slot_props;
|
||||
hc->plug = pcie_cap_slot_hotplug_cb;
|
||||
hc->unplug = pcie_cap_slot_hot_unplug_cb;
|
||||
hc->unplug_request = pcie_cap_slot_hot_unplug_request_cb;
|
||||
}
|
||||
|
||||
static const TypeInfo pcie_slot_type_info = {
|
||||
|
||||
+2
-2
@@ -549,8 +549,8 @@ void shpc_device_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
shpc_interrupt_update(pci_hotplug_dev);
|
||||
}
|
||||
|
||||
void shpc_device_hot_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
Error **errp)
|
||||
void shpc_device_hot_unplug_request_cb(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
Error *local_err = NULL;
|
||||
PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
|
||||
|
||||
@@ -333,7 +333,6 @@ static int init_event_facility(SCLPEventFacility *event_facility)
|
||||
/* Spawn a new bus for SCLP events */
|
||||
qbus_create_inplace(&event_facility->sbus, sizeof(event_facility->sbus),
|
||||
TYPE_SCLP_EVENTS_BUS, sdev, NULL);
|
||||
event_facility->sbus.qbus.allow_hotplug = 0;
|
||||
|
||||
quiesce = qdev_create(&event_facility->sbus.qbus, "sclpquiesce");
|
||||
if (!quiesce) {
|
||||
@@ -408,7 +407,6 @@ static void event_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
dc->bus_type = TYPE_SCLP_EVENTS_BUS;
|
||||
dc->unplug = qdev_simple_unplug_cb;
|
||||
dc->realize = event_realize;
|
||||
dc->unrealize = event_unrealize;
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ VirtIOS390Bus *s390_virtio_bus_init(ram_addr_t *ram_size)
|
||||
bus->next_ring = bus->dev_page + TARGET_PAGE_SIZE;
|
||||
|
||||
/* Enable hotplugging */
|
||||
_bus->allow_hotplug = 1;
|
||||
qbus_set_hotplug_handler(_bus, dev, &error_abort);
|
||||
|
||||
/* Allocate RAM for VirtIO device pages (descriptors, queues, rings) */
|
||||
*ram_size += S390_DEVICE_PAGES * TARGET_PAGE_SIZE;
|
||||
@@ -600,7 +600,6 @@ static void virtio_s390_device_class_init(ObjectClass *klass, void *data)
|
||||
|
||||
dc->init = s390_virtio_busdev_init;
|
||||
dc->bus_type = TYPE_S390_VIRTIO_BUS;
|
||||
dc->unplug = qdev_simple_unplug_cb;
|
||||
dc->reset = s390_virtio_busdev_reset;
|
||||
}
|
||||
|
||||
@@ -681,6 +680,10 @@ static const TypeInfo s390_virtio_bridge_info = {
|
||||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.instance_size = sizeof(SysBusDevice),
|
||||
.class_init = s390_virtio_bridge_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_HOTPLUG_HANDLER },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
||||
/* virtio-s390-bus */
|
||||
@@ -689,13 +692,10 @@ static void virtio_s390_bus_new(VirtioBusState *bus, size_t bus_size,
|
||||
VirtIOS390Device *dev)
|
||||
{
|
||||
DeviceState *qdev = DEVICE(dev);
|
||||
BusState *qbus;
|
||||
char virtio_bus_name[] = "virtio-bus";
|
||||
|
||||
qbus_create_inplace(bus, bus_size, TYPE_VIRTIO_S390_BUS,
|
||||
qdev, virtio_bus_name);
|
||||
qbus = BUS(bus);
|
||||
qbus->allow_hotplug = 1;
|
||||
}
|
||||
|
||||
static void virtio_s390_bus_class_init(ObjectClass *klass, void *data)
|
||||
|
||||
@@ -230,7 +230,7 @@ VirtualCssBus *virtual_css_bus_init(void)
|
||||
cbus = VIRTUAL_CSS_BUS(bus);
|
||||
|
||||
/* Enable hotplugging */
|
||||
bus->allow_hotplug = 1;
|
||||
qbus_set_hotplug_handler(bus, dev, &error_abort);
|
||||
|
||||
return cbus;
|
||||
}
|
||||
@@ -1590,7 +1590,8 @@ static int virtio_ccw_busdev_exit(DeviceState *dev)
|
||||
return _info->exit(_dev);
|
||||
}
|
||||
|
||||
static int virtio_ccw_busdev_unplug(DeviceState *dev)
|
||||
static void virtio_ccw_busdev_unplug(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
VirtioCcwDevice *_dev = (VirtioCcwDevice *)dev;
|
||||
SubchDev *sch = _dev->sch;
|
||||
@@ -1609,7 +1610,6 @@ static int virtio_ccw_busdev_unplug(DeviceState *dev)
|
||||
css_generate_sch_crws(sch->cssid, sch->ssid, sch->schid, 1, 0);
|
||||
|
||||
object_unparent(OBJECT(dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Property virtio_ccw_properties[] = {
|
||||
@@ -1624,9 +1624,7 @@ static void virtio_ccw_device_class_init(ObjectClass *klass, void *data)
|
||||
dc->props = virtio_ccw_properties;
|
||||
dc->init = virtio_ccw_busdev_init;
|
||||
dc->exit = virtio_ccw_busdev_exit;
|
||||
dc->unplug = virtio_ccw_busdev_unplug;
|
||||
dc->bus_type = TYPE_VIRTUAL_CSS_BUS;
|
||||
|
||||
}
|
||||
|
||||
static const TypeInfo virtio_ccw_device_info = {
|
||||
@@ -1650,8 +1648,10 @@ static int virtual_css_bridge_init(SysBusDevice *dev)
|
||||
static void virtual_css_bridge_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
|
||||
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
|
||||
|
||||
k->init = virtual_css_bridge_init;
|
||||
hc->unplug = virtio_ccw_busdev_unplug;
|
||||
}
|
||||
|
||||
static const TypeInfo virtual_css_bridge_info = {
|
||||
@@ -1659,6 +1659,10 @@ static const TypeInfo virtual_css_bridge_info = {
|
||||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.instance_size = sizeof(SysBusDevice),
|
||||
.class_init = virtual_css_bridge_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_HOTPLUG_HANDLER },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
||||
/* virtio-ccw-bus */
|
||||
@@ -1667,13 +1671,10 @@ static void virtio_ccw_bus_new(VirtioBusState *bus, size_t bus_size,
|
||||
VirtioCcwDevice *dev)
|
||||
{
|
||||
DeviceState *qdev = DEVICE(dev);
|
||||
BusState *qbus;
|
||||
char virtio_bus_name[] = "virtio-bus";
|
||||
|
||||
qbus_create_inplace(bus, bus_size, TYPE_VIRTIO_CCW_BUS,
|
||||
qdev, virtio_bus_name);
|
||||
qbus = BUS(bus);
|
||||
qbus->allow_hotplug = 1;
|
||||
}
|
||||
|
||||
static void virtio_ccw_bus_class_init(ObjectClass *klass, void *data)
|
||||
|
||||
+7
-17
@@ -23,9 +23,11 @@ static Property scsi_props[] = {
|
||||
static void scsi_bus_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
BusClass *k = BUS_CLASS(klass);
|
||||
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
|
||||
|
||||
k->get_dev_path = scsibus_get_dev_path;
|
||||
k->get_fw_dev_path = scsibus_get_fw_dev_path;
|
||||
hc->unplug = qdev_simple_device_unplug_cb;
|
||||
}
|
||||
|
||||
static const TypeInfo scsi_bus_info = {
|
||||
@@ -33,6 +35,10 @@ static const TypeInfo scsi_bus_info = {
|
||||
.parent = TYPE_BUS,
|
||||
.instance_size = sizeof(SCSIBus),
|
||||
.class_init = scsi_bus_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_HOTPLUG_HANDLER },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
static int next_scsi_bus;
|
||||
|
||||
@@ -92,7 +98,7 @@ void scsi_bus_new(SCSIBus *bus, size_t bus_size, DeviceState *host,
|
||||
qbus_create_inplace(bus, bus_size, TYPE_SCSI_BUS, host, bus_name);
|
||||
bus->busnr = next_scsi_bus++;
|
||||
bus->info = info;
|
||||
bus->qbus.allow_hotplug = 1;
|
||||
qbus_set_bus_hotplug_handler(BUS(bus), &error_abort);
|
||||
}
|
||||
|
||||
static void scsi_dma_restart_bh(void *opaque)
|
||||
@@ -202,10 +208,6 @@ static void scsi_qdev_realize(DeviceState *qdev, Error **errp)
|
||||
}
|
||||
dev->vmsentry = qemu_add_vm_change_state_handler(scsi_dma_restart_cb,
|
||||
dev);
|
||||
|
||||
if (bus->info->hotplug) {
|
||||
bus->info->hotplug(bus, dev);
|
||||
}
|
||||
}
|
||||
|
||||
static void scsi_qdev_unrealize(DeviceState *qdev, Error **errp)
|
||||
@@ -1937,17 +1939,6 @@ static int get_scsi_requests(QEMUFile *f, void *pv, size_t size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int scsi_qdev_unplug(DeviceState *qdev)
|
||||
{
|
||||
SCSIDevice *dev = SCSI_DEVICE(qdev);
|
||||
SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus);
|
||||
|
||||
if (bus->info->hot_unplug) {
|
||||
bus->info->hot_unplug(bus, dev);
|
||||
}
|
||||
return qdev_simple_unplug_cb(qdev);
|
||||
}
|
||||
|
||||
static const VMStateInfo vmstate_info_scsi_requests = {
|
||||
.name = "scsi-requests",
|
||||
.get = get_scsi_requests,
|
||||
@@ -2011,7 +2002,6 @@ static void scsi_device_class_init(ObjectClass *klass, void *data)
|
||||
set_bit(DEVICE_CATEGORY_STORAGE, k->categories);
|
||||
k->bus_type = TYPE_SCSI_BUS;
|
||||
k->realize = scsi_qdev_realize;
|
||||
k->unplug = scsi_qdev_unplug;
|
||||
k->unrealize = scsi_qdev_unrealize;
|
||||
k->props = scsi_props;
|
||||
}
|
||||
|
||||
+20
-10
@@ -737,26 +737,29 @@ static void virtio_scsi_change(SCSIBus *bus, SCSIDevice *dev, SCSISense sense)
|
||||
}
|
||||
}
|
||||
|
||||
static void virtio_scsi_hotplug(SCSIBus *bus, SCSIDevice *dev)
|
||||
static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
Error **errp)
|
||||
{
|
||||
VirtIOSCSI *s = container_of(bus, VirtIOSCSI, bus);
|
||||
VirtIODevice *vdev = VIRTIO_DEVICE(s);
|
||||
VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
|
||||
|
||||
if ((vdev->guest_features >> VIRTIO_SCSI_F_HOTPLUG) & 1) {
|
||||
virtio_scsi_push_event(s, dev, VIRTIO_SCSI_T_TRANSPORT_RESET,
|
||||
virtio_scsi_push_event(VIRTIO_SCSI(hotplug_dev), SCSI_DEVICE(dev),
|
||||
VIRTIO_SCSI_T_TRANSPORT_RESET,
|
||||
VIRTIO_SCSI_EVT_RESET_RESCAN);
|
||||
}
|
||||
}
|
||||
|
||||
static void virtio_scsi_hot_unplug(SCSIBus *bus, SCSIDevice *dev)
|
||||
static void virtio_scsi_hotunplug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
Error **errp)
|
||||
{
|
||||
VirtIOSCSI *s = container_of(bus, VirtIOSCSI, bus);
|
||||
VirtIODevice *vdev = VIRTIO_DEVICE(s);
|
||||
VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
|
||||
|
||||
if ((vdev->guest_features >> VIRTIO_SCSI_F_HOTPLUG) & 1) {
|
||||
virtio_scsi_push_event(s, dev, VIRTIO_SCSI_T_TRANSPORT_RESET,
|
||||
virtio_scsi_push_event(VIRTIO_SCSI(hotplug_dev), SCSI_DEVICE(dev),
|
||||
VIRTIO_SCSI_T_TRANSPORT_RESET,
|
||||
VIRTIO_SCSI_EVT_RESET_REMOVED);
|
||||
}
|
||||
qdev_simple_device_unplug_cb(hotplug_dev, dev, errp);
|
||||
}
|
||||
|
||||
static struct SCSIBusInfo virtio_scsi_scsi_info = {
|
||||
@@ -768,8 +771,6 @@ static struct SCSIBusInfo virtio_scsi_scsi_info = {
|
||||
.complete = virtio_scsi_command_complete,
|
||||
.cancel = virtio_scsi_request_cancelled,
|
||||
.change = virtio_scsi_change,
|
||||
.hotplug = virtio_scsi_hotplug,
|
||||
.hot_unplug = virtio_scsi_hot_unplug,
|
||||
.parse_cdb = virtio_scsi_parse_cdb,
|
||||
.get_sg_list = virtio_scsi_get_sg_list,
|
||||
.save_request = virtio_scsi_save_request,
|
||||
@@ -853,6 +854,8 @@ static void virtio_scsi_device_realize(DeviceState *dev, Error **errp)
|
||||
|
||||
scsi_bus_new(&s->bus, sizeof(s->bus), dev,
|
||||
&virtio_scsi_scsi_info, vdev->bus_name);
|
||||
/* override default SCSI bus hotplug-handler, with virtio-scsi's one */
|
||||
qbus_set_hotplug_handler(BUS(&s->bus), dev, &error_abort);
|
||||
|
||||
if (!dev->hotplugged) {
|
||||
scsi_bus_legacy_handle_cmdline(&s->bus, &err);
|
||||
@@ -915,6 +918,7 @@ static void virtio_scsi_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
|
||||
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
|
||||
|
||||
dc->props = virtio_scsi_properties;
|
||||
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
|
||||
@@ -923,6 +927,8 @@ static void virtio_scsi_class_init(ObjectClass *klass, void *data)
|
||||
vdc->set_config = virtio_scsi_set_config;
|
||||
vdc->get_features = virtio_scsi_get_features;
|
||||
vdc->reset = virtio_scsi_reset;
|
||||
hc->plug = virtio_scsi_hotplug;
|
||||
hc->unplug = virtio_scsi_hotunplug;
|
||||
}
|
||||
|
||||
static const TypeInfo virtio_scsi_common_info = {
|
||||
@@ -939,6 +945,10 @@ static const TypeInfo virtio_scsi_info = {
|
||||
.instance_size = sizeof(VirtIOSCSI),
|
||||
.instance_init = virtio_scsi_instance_init,
|
||||
.class_init = virtio_scsi_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_HOTPLUG_HANDLER },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
||||
static void virtio_register_types(void)
|
||||
|
||||
+18
-8
@@ -524,17 +524,20 @@ pvscsi_send_msg(PVSCSIState *s, SCSIDevice *dev, uint32_t msg_type)
|
||||
}
|
||||
|
||||
static void
|
||||
pvscsi_hotplug(SCSIBus *bus, SCSIDevice *dev)
|
||||
pvscsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp)
|
||||
{
|
||||
PVSCSIState *s = container_of(bus, PVSCSIState, bus);
|
||||
pvscsi_send_msg(s, dev, PVSCSI_MSG_DEV_ADDED);
|
||||
PVSCSIState *s = PVSCSI(hotplug_dev);
|
||||
|
||||
pvscsi_send_msg(s, SCSI_DEVICE(dev), PVSCSI_MSG_DEV_ADDED);
|
||||
}
|
||||
|
||||
static void
|
||||
pvscsi_hot_unplug(SCSIBus *bus, SCSIDevice *dev)
|
||||
pvscsi_hot_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp)
|
||||
{
|
||||
PVSCSIState *s = container_of(bus, PVSCSIState, bus);
|
||||
pvscsi_send_msg(s, dev, PVSCSI_MSG_DEV_REMOVED);
|
||||
PVSCSIState *s = PVSCSI(hotplug_dev);
|
||||
|
||||
pvscsi_send_msg(s, SCSI_DEVICE(dev), PVSCSI_MSG_DEV_REMOVED);
|
||||
qdev_simple_device_unplug_cb(hotplug_dev, dev, errp);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1057,8 +1060,6 @@ static const struct SCSIBusInfo pvscsi_scsi_info = {
|
||||
.get_sg_list = pvscsi_get_sg_list,
|
||||
.complete = pvscsi_command_complete,
|
||||
.cancel = pvscsi_request_cancelled,
|
||||
.hotplug = pvscsi_hotplug,
|
||||
.hot_unplug = pvscsi_hot_unplug,
|
||||
};
|
||||
|
||||
static int
|
||||
@@ -1092,6 +1093,8 @@ pvscsi_init(PCIDevice *pci_dev)
|
||||
|
||||
scsi_bus_new(&s->bus, sizeof(s->bus), DEVICE(pci_dev),
|
||||
&pvscsi_scsi_info, NULL);
|
||||
/* override default SCSI bus hotplug-handler, with pvscsi's one */
|
||||
qbus_set_hotplug_handler(BUS(&s->bus), DEVICE(s), &error_abort);
|
||||
pvscsi_reset_state(s);
|
||||
|
||||
return 0;
|
||||
@@ -1187,6 +1190,7 @@ static void pvscsi_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
|
||||
|
||||
k->init = pvscsi_init;
|
||||
k->exit = pvscsi_uninit;
|
||||
@@ -1199,6 +1203,8 @@ static void pvscsi_class_init(ObjectClass *klass, void *data)
|
||||
dc->props = pvscsi_properties;
|
||||
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
|
||||
k->config_write = pvscsi_write_config;
|
||||
hc->unplug = pvscsi_hot_unplug;
|
||||
hc->plug = pvscsi_hotplug;
|
||||
}
|
||||
|
||||
static const TypeInfo pvscsi_info = {
|
||||
@@ -1206,6 +1212,10 @@ static const TypeInfo pvscsi_info = {
|
||||
.parent = TYPE_PCI_DEVICE,
|
||||
.instance_size = sizeof(PVSCSIState),
|
||||
.class_init = pvscsi_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_HOTPLUG_HANDLER },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
||||
static void
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user