block/throttle: Remove protocol-related fields
[qemu/ar7.git] / hw / core / qdev.c
blobf6f92473b8fb7f23bc7c7502270af9cffa1156bf
1 /*
2 * Dynamic device configuration and creation.
4 * Copyright (c) 2009 CodeSourcery
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
20 /* The theory here is that it should be possible to create a machine without
21 knowledge of specific devices. Historically board init routines have
22 passed a bunch of arguments to each device, requiring the board know
23 exactly which device it is dealing with. This file provides an abstract
24 API for device configuration and initialization. Devices will generally
25 inherit from a particular bus (e.g. PCI or I2C) rather than
26 this API directly. */
28 #include "qemu/osdep.h"
29 #include "hw/qdev.h"
30 #include "sysemu/sysemu.h"
31 #include "qapi/error.h"
32 #include "qapi/qapi-events-misc.h"
33 #include "qapi/qmp/qerror.h"
34 #include "qapi/visitor.h"
35 #include "qemu/error-report.h"
36 #include "qemu/option.h"
37 #include "hw/hotplug.h"
38 #include "hw/boards.h"
39 #include "hw/sysbus.h"
41 bool qdev_hotplug = false;
42 static bool qdev_hot_added = false;
43 bool qdev_hot_removed = false;
45 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
47 DeviceClass *dc = DEVICE_GET_CLASS(dev);
48 return dc->vmsd;
51 static void bus_remove_child(BusState *bus, DeviceState *child)
53 BusChild *kid;
55 QTAILQ_FOREACH(kid, &bus->children, sibling) {
56 if (kid->child == child) {
57 char name[32];
59 snprintf(name, sizeof(name), "child[%d]", kid->index);
60 QTAILQ_REMOVE(&bus->children, kid, sibling);
62 /* This gives back ownership of kid->child back to us. */
63 object_property_del(OBJECT(bus), name, NULL);
64 object_unref(OBJECT(kid->child));
65 g_free(kid);
66 return;
71 static void bus_add_child(BusState *bus, DeviceState *child)
73 char name[32];
74 BusChild *kid = g_malloc0(sizeof(*kid));
76 kid->index = bus->max_index++;
77 kid->child = child;
78 object_ref(OBJECT(kid->child));
80 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
82 /* This transfers ownership of kid->child to the property. */
83 snprintf(name, sizeof(name), "child[%d]", kid->index);
84 object_property_add_link(OBJECT(bus), name,
85 object_get_typename(OBJECT(child)),
86 (Object **)&kid->child,
87 NULL, /* read-only property */
88 0, /* return ownership on prop deletion */
89 NULL);
92 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
94 bool replugging = dev->parent_bus != NULL;
96 if (replugging) {
97 /* Keep a reference to the device while it's not plugged into
98 * any bus, to avoid it potentially evaporating when it is
99 * dereffed in bus_remove_child().
101 object_ref(OBJECT(dev));
102 bus_remove_child(dev->parent_bus, dev);
103 object_unref(OBJECT(dev->parent_bus));
105 dev->parent_bus = bus;
106 object_ref(OBJECT(bus));
107 bus_add_child(bus, dev);
108 if (replugging) {
109 object_unref(OBJECT(dev));
113 /* Create a new device. This only initializes the device state
114 structure and allows properties to be set. The device still needs
115 to be realized. See qdev-core.h. */
116 DeviceState *qdev_create(BusState *bus, const char *name)
118 DeviceState *dev;
120 dev = qdev_try_create(bus, name);
121 if (!dev) {
122 if (bus) {
123 error_report("Unknown device '%s' for bus '%s'", name,
124 object_get_typename(OBJECT(bus)));
125 } else {
126 error_report("Unknown device '%s' for default sysbus", name);
128 abort();
131 return dev;
134 DeviceState *qdev_try_create(BusState *bus, const char *type)
136 DeviceState *dev;
138 if (object_class_by_name(type) == NULL) {
139 return NULL;
141 dev = DEVICE(object_new(type));
142 if (!dev) {
143 return NULL;
146 if (!bus) {
147 /* Assert that the device really is a SysBusDevice before
148 * we put it onto the sysbus. Non-sysbus devices which aren't
149 * being put onto a bus should be created with object_new(TYPE_FOO),
150 * not qdev_create(NULL, TYPE_FOO).
152 g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE));
153 bus = sysbus_get_default();
156 qdev_set_parent_bus(dev, bus);
157 object_unref(OBJECT(dev));
158 return dev;
161 static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
162 = QTAILQ_HEAD_INITIALIZER(device_listeners);
164 enum ListenerDirection { Forward, Reverse };
166 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
167 do { \
168 DeviceListener *_listener; \
170 switch (_direction) { \
171 case Forward: \
172 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
173 if (_listener->_callback) { \
174 _listener->_callback(_listener, ##_args); \
177 break; \
178 case Reverse: \
179 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
180 device_listeners, link) { \
181 if (_listener->_callback) { \
182 _listener->_callback(_listener, ##_args); \
185 break; \
186 default: \
187 abort(); \
189 } while (0)
191 static int device_listener_add(DeviceState *dev, void *opaque)
193 DEVICE_LISTENER_CALL(realize, Forward, dev);
195 return 0;
198 void device_listener_register(DeviceListener *listener)
200 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
202 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
203 NULL, NULL);
206 void device_listener_unregister(DeviceListener *listener)
208 QTAILQ_REMOVE(&device_listeners, listener, link);
211 static void device_realize(DeviceState *dev, Error **errp)
213 DeviceClass *dc = DEVICE_GET_CLASS(dev);
215 if (dc->init) {
216 int rc = dc->init(dev);
217 if (rc < 0) {
218 error_setg(errp, "Device initialization failed.");
219 return;
224 static void device_unrealize(DeviceState *dev, Error **errp)
226 DeviceClass *dc = DEVICE_GET_CLASS(dev);
228 if (dc->exit) {
229 int rc = dc->exit(dev);
230 if (rc < 0) {
231 error_setg(errp, "Device exit failed.");
232 return;
237 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
238 int required_for_version)
240 assert(!dev->realized);
241 dev->instance_id_alias = alias_id;
242 dev->alias_required_for_version = required_for_version;
245 HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
247 MachineState *machine;
248 MachineClass *mc;
249 Object *m_obj = qdev_get_machine();
251 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
252 machine = MACHINE(m_obj);
253 mc = MACHINE_GET_CLASS(machine);
254 if (mc->get_hotplug_handler) {
255 return mc->get_hotplug_handler(machine, dev);
259 return NULL;
262 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
264 HotplugHandler *hotplug_ctrl;
266 if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
267 hotplug_ctrl = dev->parent_bus->hotplug_handler;
268 } else {
269 hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
271 return hotplug_ctrl;
274 static int qdev_reset_one(DeviceState *dev, void *opaque)
276 device_reset(dev);
278 return 0;
281 static int qbus_reset_one(BusState *bus, void *opaque)
283 BusClass *bc = BUS_GET_CLASS(bus);
284 if (bc->reset) {
285 bc->reset(bus);
287 return 0;
290 void qdev_reset_all(DeviceState *dev)
292 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
295 void qdev_reset_all_fn(void *opaque)
297 qdev_reset_all(DEVICE(opaque));
300 void qbus_reset_all(BusState *bus)
302 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
305 void qbus_reset_all_fn(void *opaque)
307 BusState *bus = opaque;
308 qbus_reset_all(bus);
311 /* can be used as ->unplug() callback for the simple cases */
312 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
313 DeviceState *dev, Error **errp)
315 /* just zap it */
316 object_unparent(OBJECT(dev));
320 * Realize @dev.
321 * Device properties should be set before calling this function. IRQs
322 * and MMIO regions should be connected/mapped after calling this
323 * function.
324 * On failure, report an error with error_report() and terminate the
325 * program. This is okay during machine creation. Don't use for
326 * hotplug, because there callers need to recover from failure.
327 * Exception: if you know the device's init() callback can't fail,
328 * then qdev_init_nofail() can't fail either, and is therefore usable
329 * even then. But relying on the device implementation that way is
330 * somewhat unclean, and best avoided.
332 void qdev_init_nofail(DeviceState *dev)
334 Error *err = NULL;
336 assert(!dev->realized);
338 object_ref(OBJECT(dev));
339 object_property_set_bool(OBJECT(dev), true, "realized", &err);
340 if (err) {
341 error_reportf_err(err, "Initialization of device %s failed: ",
342 object_get_typename(OBJECT(dev)));
343 exit(1);
345 object_unref(OBJECT(dev));
348 void qdev_machine_creation_done(void)
351 * ok, initial machine setup is done, starting from now we can
352 * only create hotpluggable devices
354 qdev_hotplug = true;
357 bool qdev_machine_modified(void)
359 return qdev_hot_added || qdev_hot_removed;
362 BusState *qdev_get_parent_bus(DeviceState *dev)
364 return dev->parent_bus;
367 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
368 const char *name)
370 NamedGPIOList *ngl;
372 QLIST_FOREACH(ngl, &dev->gpios, node) {
373 /* NULL is a valid and matchable name, otherwise do a normal
374 * strcmp match.
376 if ((!ngl->name && !name) ||
377 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
378 return ngl;
382 ngl = g_malloc0(sizeof(*ngl));
383 ngl->name = g_strdup(name);
384 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
385 return ngl;
388 void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
389 qemu_irq_handler handler,
390 void *opaque,
391 const char *name, int n)
393 int i;
394 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
396 assert(gpio_list->num_out == 0 || !name);
397 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
398 opaque, n);
400 if (!name) {
401 name = "unnamed-gpio-in";
403 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
404 gchar *propname = g_strdup_printf("%s[%u]", name, i);
406 object_property_add_child(OBJECT(dev), propname,
407 OBJECT(gpio_list->in[i]), &error_abort);
408 g_free(propname);
411 gpio_list->num_in += n;
414 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
416 qdev_init_gpio_in_named(dev, handler, NULL, n);
419 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
420 const char *name, int n)
422 int i;
423 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
425 assert(gpio_list->num_in == 0 || !name);
427 if (!name) {
428 name = "unnamed-gpio-out";
430 memset(pins, 0, sizeof(*pins) * n);
431 for (i = 0; i < n; ++i) {
432 gchar *propname = g_strdup_printf("%s[%u]", name,
433 gpio_list->num_out + i);
435 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
436 (Object **)&pins[i],
437 object_property_allow_set_link,
438 OBJ_PROP_LINK_UNREF_ON_RELEASE,
439 &error_abort);
440 g_free(propname);
442 gpio_list->num_out += n;
445 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
447 qdev_init_gpio_out_named(dev, pins, NULL, n);
450 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
452 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
454 assert(n >= 0 && n < gpio_list->num_in);
455 return gpio_list->in[n];
458 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
460 return qdev_get_gpio_in_named(dev, NULL, n);
463 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
464 qemu_irq pin)
466 char *propname = g_strdup_printf("%s[%d]",
467 name ? name : "unnamed-gpio-out", n);
468 if (pin) {
469 /* We need a name for object_property_set_link to work. If the
470 * object has a parent, object_property_add_child will come back
471 * with an error without doing anything. If it has none, it will
472 * never fail. So we can just call it with a NULL Error pointer.
474 object_property_add_child(container_get(qdev_get_machine(),
475 "/unattached"),
476 "non-qdev-gpio[*]", OBJECT(pin), NULL);
478 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
479 g_free(propname);
482 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
484 char *propname = g_strdup_printf("%s[%d]",
485 name ? name : "unnamed-gpio-out", n);
487 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
488 NULL);
490 return ret;
493 /* disconnect a GPIO output, returning the disconnected input (if any) */
495 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
496 const char *name, int n)
498 char *propname = g_strdup_printf("%s[%d]",
499 name ? name : "unnamed-gpio-out", n);
501 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
502 NULL);
503 if (ret) {
504 object_property_set_link(OBJECT(dev), NULL, propname, NULL);
506 g_free(propname);
507 return ret;
510 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
511 const char *name, int n)
513 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
514 qdev_connect_gpio_out_named(dev, name, n, icpt);
515 return disconnected;
518 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
520 qdev_connect_gpio_out_named(dev, NULL, n, pin);
523 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
524 const char *name)
526 int i;
527 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
529 for (i = 0; i < ngl->num_in; i++) {
530 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
531 char *propname = g_strdup_printf("%s[%d]", nm, i);
533 object_property_add_alias(OBJECT(container), propname,
534 OBJECT(dev), propname,
535 &error_abort);
536 g_free(propname);
538 for (i = 0; i < ngl->num_out; i++) {
539 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
540 char *propname = g_strdup_printf("%s[%d]", nm, i);
542 object_property_add_alias(OBJECT(container), propname,
543 OBJECT(dev), propname,
544 &error_abort);
545 g_free(propname);
547 QLIST_REMOVE(ngl, node);
548 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
551 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
553 BusState *bus;
554 Object *child = object_resolve_path_component(OBJECT(dev), name);
556 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
557 if (bus) {
558 return bus;
561 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
562 if (strcmp(name, bus->name) == 0) {
563 return bus;
566 return NULL;
569 int qdev_walk_children(DeviceState *dev,
570 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
571 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
572 void *opaque)
574 BusState *bus;
575 int err;
577 if (pre_devfn) {
578 err = pre_devfn(dev, opaque);
579 if (err) {
580 return err;
584 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
585 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
586 post_devfn, post_busfn, opaque);
587 if (err < 0) {
588 return err;
592 if (post_devfn) {
593 err = post_devfn(dev, opaque);
594 if (err) {
595 return err;
599 return 0;
602 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
604 BusChild *kid;
605 DeviceState *ret;
606 BusState *child;
608 QTAILQ_FOREACH(kid, &bus->children, sibling) {
609 DeviceState *dev = kid->child;
611 if (dev->id && strcmp(dev->id, id) == 0) {
612 return dev;
615 QLIST_FOREACH(child, &dev->child_bus, sibling) {
616 ret = qdev_find_recursive(child, id);
617 if (ret) {
618 return ret;
622 return NULL;
625 char *qdev_get_dev_path(DeviceState *dev)
627 BusClass *bc;
629 if (!dev || !dev->parent_bus) {
630 return NULL;
633 bc = BUS_GET_CLASS(dev->parent_bus);
634 if (bc->get_dev_path) {
635 return bc->get_dev_path(dev);
638 return NULL;
642 * Legacy property handling
645 static void qdev_get_legacy_property(Object *obj, Visitor *v,
646 const char *name, void *opaque,
647 Error **errp)
649 DeviceState *dev = DEVICE(obj);
650 Property *prop = opaque;
652 char buffer[1024];
653 char *ptr = buffer;
655 prop->info->print(dev, prop, buffer, sizeof(buffer));
656 visit_type_str(v, name, &ptr, errp);
660 * qdev_property_add_legacy:
661 * @dev: Device to add the property to.
662 * @prop: The qdev property definition.
663 * @errp: location to store error information.
665 * Add a legacy QOM property to @dev for qdev property @prop.
666 * On error, store error in @errp.
668 * Legacy properties are string versions of QOM properties. The format of
669 * the string depends on the property type. Legacy properties are only
670 * needed for "info qtree".
672 * Do not use this is new code! QOM Properties added through this interface
673 * will be given names in the "legacy" namespace.
675 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
676 Error **errp)
678 gchar *name;
680 /* Register pointer properties as legacy properties */
681 if (!prop->info->print && prop->info->get) {
682 return;
685 if (prop->info->create) {
686 return;
689 name = g_strdup_printf("legacy-%s", prop->name);
690 object_property_add(OBJECT(dev), name, "str",
691 prop->info->print ? qdev_get_legacy_property : prop->info->get,
692 NULL,
693 NULL,
694 prop, errp);
696 g_free(name);
700 * qdev_property_add_static:
701 * @dev: Device to add the property to.
702 * @prop: The qdev property definition.
703 * @errp: location to store error information.
705 * Add a static QOM property to @dev for qdev property @prop.
706 * On error, store error in @errp. Static properties access data in a struct.
707 * The type of the QOM property is derived from prop->info.
709 void qdev_property_add_static(DeviceState *dev, Property *prop,
710 Error **errp)
712 Error *local_err = NULL;
713 Object *obj = OBJECT(dev);
715 if (prop->info->create) {
716 prop->info->create(obj, prop, &local_err);
717 } else {
719 * TODO qdev_prop_ptr does not have getters or setters. It must
720 * go now that it can be replaced with links. The test should be
721 * removed along with it: all static properties are read/write.
723 if (!prop->info->get && !prop->info->set) {
724 return;
726 object_property_add(obj, prop->name, prop->info->name,
727 prop->info->get, prop->info->set,
728 prop->info->release,
729 prop, &local_err);
732 if (local_err) {
733 error_propagate(errp, local_err);
734 return;
737 object_property_set_description(obj, prop->name,
738 prop->info->description,
739 &error_abort);
741 if (prop->set_default) {
742 prop->info->set_default_value(obj, prop);
746 /* @qdev_alias_all_properties - Add alias properties to the source object for
747 * all qdev properties on the target DeviceState.
749 void qdev_alias_all_properties(DeviceState *target, Object *source)
751 ObjectClass *class;
752 Property *prop;
754 class = object_get_class(OBJECT(target));
755 do {
756 DeviceClass *dc = DEVICE_CLASS(class);
758 for (prop = dc->props; prop && prop->name; prop++) {
759 object_property_add_alias(source, prop->name,
760 OBJECT(target), prop->name,
761 &error_abort);
763 class = object_class_get_parent(class);
764 } while (class != object_class_by_name(TYPE_DEVICE));
767 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
769 GSList **list = opaque;
770 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
771 TYPE_DEVICE);
773 if (dev == NULL) {
774 return 0;
777 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
778 *list = g_slist_append(*list, dev);
781 return 0;
784 GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
786 GSList *list = NULL;
788 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
790 return list;
793 static bool device_get_realized(Object *obj, Error **errp)
795 DeviceState *dev = DEVICE(obj);
796 return dev->realized;
799 static bool check_only_migratable(Object *obj, Error **err)
801 DeviceClass *dc = DEVICE_GET_CLASS(obj);
803 if (!vmstate_check_only_migratable(dc->vmsd)) {
804 error_setg(err, "Device %s is not migratable, but "
805 "--only-migratable was specified",
806 object_get_typename(obj));
807 return false;
810 return true;
813 static void device_set_realized(Object *obj, bool value, Error **errp)
815 DeviceState *dev = DEVICE(obj);
816 DeviceClass *dc = DEVICE_GET_CLASS(dev);
817 HotplugHandler *hotplug_ctrl;
818 BusState *bus;
819 Error *local_err = NULL;
820 bool unattached_parent = false;
821 static int unattached_count;
823 if (dev->hotplugged && !dc->hotpluggable) {
824 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
825 return;
828 if (value && !dev->realized) {
829 if (!check_only_migratable(obj, &local_err)) {
830 goto fail;
833 if (!obj->parent) {
834 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
836 object_property_add_child(container_get(qdev_get_machine(),
837 "/unattached"),
838 name, obj, &error_abort);
839 unattached_parent = true;
840 g_free(name);
843 hotplug_ctrl = qdev_get_hotplug_handler(dev);
844 if (hotplug_ctrl) {
845 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
846 if (local_err != NULL) {
847 goto fail;
851 if (dc->realize) {
852 dc->realize(dev, &local_err);
855 if (local_err != NULL) {
856 goto fail;
859 DEVICE_LISTENER_CALL(realize, Forward, dev);
861 if (hotplug_ctrl) {
862 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
865 if (local_err != NULL) {
866 goto post_realize_fail;
870 * always free/re-initialize here since the value cannot be cleaned up
871 * in device_unrealize due to its usage later on in the unplug path
873 g_free(dev->canonical_path);
874 dev->canonical_path = object_get_canonical_path(OBJECT(dev));
876 if (qdev_get_vmsd(dev)) {
877 if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
878 dev->instance_id_alias,
879 dev->alias_required_for_version,
880 &local_err) < 0) {
881 goto post_realize_fail;
885 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
886 object_property_set_bool(OBJECT(bus), true, "realized",
887 &local_err);
888 if (local_err != NULL) {
889 goto child_realize_fail;
892 if (dev->hotplugged) {
893 device_reset(dev);
895 dev->pending_deleted_event = false;
896 } else if (!value && dev->realized) {
897 Error **local_errp = NULL;
898 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
899 local_errp = local_err ? NULL : &local_err;
900 object_property_set_bool(OBJECT(bus), false, "realized",
901 local_errp);
903 if (qdev_get_vmsd(dev)) {
904 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
906 if (dc->unrealize) {
907 local_errp = local_err ? NULL : &local_err;
908 dc->unrealize(dev, local_errp);
910 dev->pending_deleted_event = true;
911 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
914 if (local_err != NULL) {
915 goto fail;
918 dev->realized = value;
919 return;
921 child_realize_fail:
922 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
923 object_property_set_bool(OBJECT(bus), false, "realized",
924 NULL);
927 if (qdev_get_vmsd(dev)) {
928 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
931 post_realize_fail:
932 g_free(dev->canonical_path);
933 dev->canonical_path = NULL;
934 if (dc->unrealize) {
935 dc->unrealize(dev, NULL);
938 fail:
939 error_propagate(errp, local_err);
940 if (unattached_parent) {
941 object_unparent(OBJECT(dev));
942 unattached_count--;
946 static bool device_get_hotpluggable(Object *obj, Error **errp)
948 DeviceClass *dc = DEVICE_GET_CLASS(obj);
949 DeviceState *dev = DEVICE(obj);
951 return dc->hotpluggable && (dev->parent_bus == NULL ||
952 qbus_is_hotpluggable(dev->parent_bus));
955 static bool device_get_hotplugged(Object *obj, Error **err)
957 DeviceState *dev = DEVICE(obj);
959 return dev->hotplugged;
962 static void device_initfn(Object *obj)
964 DeviceState *dev = DEVICE(obj);
965 ObjectClass *class;
966 Property *prop;
968 if (qdev_hotplug) {
969 dev->hotplugged = 1;
970 qdev_hot_added = true;
973 dev->instance_id_alias = -1;
974 dev->realized = false;
976 object_property_add_bool(obj, "realized",
977 device_get_realized, device_set_realized, NULL);
978 object_property_add_bool(obj, "hotpluggable",
979 device_get_hotpluggable, NULL, NULL);
980 object_property_add_bool(obj, "hotplugged",
981 device_get_hotplugged, NULL,
982 &error_abort);
984 class = object_get_class(OBJECT(dev));
985 do {
986 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
987 qdev_property_add_legacy(dev, prop, &error_abort);
988 qdev_property_add_static(dev, prop, &error_abort);
990 class = object_class_get_parent(class);
991 } while (class != object_class_by_name(TYPE_DEVICE));
993 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
994 (Object **)&dev->parent_bus, NULL, 0,
995 &error_abort);
996 QLIST_INIT(&dev->gpios);
999 static void device_post_init(Object *obj)
1001 qdev_prop_set_globals(DEVICE(obj));
1004 /* Unlink device from bus and free the structure. */
1005 static void device_finalize(Object *obj)
1007 NamedGPIOList *ngl, *next;
1009 DeviceState *dev = DEVICE(obj);
1011 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1012 QLIST_REMOVE(ngl, node);
1013 qemu_free_irqs(ngl->in, ngl->num_in);
1014 g_free(ngl->name);
1015 g_free(ngl);
1016 /* ngl->out irqs are owned by the other end and should not be freed
1017 * here
1021 /* Only send event if the device had been completely realized */
1022 if (dev->pending_deleted_event) {
1023 g_assert(dev->canonical_path);
1025 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path,
1026 &error_abort);
1027 g_free(dev->canonical_path);
1028 dev->canonical_path = NULL;
1031 qemu_opts_del(dev->opts);
1034 static void device_class_base_init(ObjectClass *class, void *data)
1036 DeviceClass *klass = DEVICE_CLASS(class);
1038 /* We explicitly look up properties in the superclasses,
1039 * so do not propagate them to the subclasses.
1041 klass->props = NULL;
1044 static void device_unparent(Object *obj)
1046 DeviceState *dev = DEVICE(obj);
1047 BusState *bus;
1049 if (dev->realized) {
1050 object_property_set_bool(obj, false, "realized", NULL);
1052 while (dev->num_child_bus) {
1053 bus = QLIST_FIRST(&dev->child_bus);
1054 object_unparent(OBJECT(bus));
1056 if (dev->parent_bus) {
1057 bus_remove_child(dev->parent_bus, dev);
1058 object_unref(OBJECT(dev->parent_bus));
1059 dev->parent_bus = NULL;
1063 static void device_class_init(ObjectClass *class, void *data)
1065 DeviceClass *dc = DEVICE_CLASS(class);
1067 class->unparent = device_unparent;
1068 dc->realize = device_realize;
1069 dc->unrealize = device_unrealize;
1071 /* by default all devices were considered as hotpluggable,
1072 * so with intent to check it in generic qdev_unplug() /
1073 * device_set_realized() functions make every device
1074 * hotpluggable. Devices that shouldn't be hotpluggable,
1075 * should override it in their class_init()
1077 dc->hotpluggable = true;
1078 dc->user_creatable = true;
1081 void device_class_set_parent_reset(DeviceClass *dc,
1082 DeviceReset dev_reset,
1083 DeviceReset *parent_reset)
1085 *parent_reset = dc->reset;
1086 dc->reset = dev_reset;
1089 void device_class_set_parent_realize(DeviceClass *dc,
1090 DeviceRealize dev_realize,
1091 DeviceRealize *parent_realize)
1093 *parent_realize = dc->realize;
1094 dc->realize = dev_realize;
1097 void device_class_set_parent_unrealize(DeviceClass *dc,
1098 DeviceUnrealize dev_unrealize,
1099 DeviceUnrealize *parent_unrealize)
1101 *parent_unrealize = dc->unrealize;
1102 dc->unrealize = dev_unrealize;
1105 void device_reset(DeviceState *dev)
1107 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1109 if (klass->reset) {
1110 klass->reset(dev);
1114 Object *qdev_get_machine(void)
1116 static Object *dev;
1118 if (dev == NULL) {
1119 dev = container_get(object_get_root(), "/machine");
1122 return dev;
1125 static const TypeInfo device_type_info = {
1126 .name = TYPE_DEVICE,
1127 .parent = TYPE_OBJECT,
1128 .instance_size = sizeof(DeviceState),
1129 .instance_init = device_initfn,
1130 .instance_post_init = device_post_init,
1131 .instance_finalize = device_finalize,
1132 .class_base_init = device_class_base_init,
1133 .class_init = device_class_init,
1134 .abstract = true,
1135 .class_size = sizeof(DeviceClass),
1138 static void qdev_register_types(void)
1140 type_register_static(&device_type_info);
1143 type_init(qdev_register_types)