tests/acceptance: Test the Arduino MEGA2560 board
[qemu/ar7.git] / hw / core / qdev.c
blob01796823b418e829dc16cf6126f1047a13b58222
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 "qapi/error.h"
30 #include "qapi/qapi-events-qdev.h"
31 #include "qapi/qmp/qerror.h"
32 #include "qapi/visitor.h"
33 #include "qemu/error-report.h"
34 #include "qemu/option.h"
35 #include "hw/hotplug.h"
36 #include "hw/irq.h"
37 #include "hw/qdev-properties.h"
38 #include "hw/boards.h"
39 #include "hw/sysbus.h"
40 #include "hw/qdev-clock.h"
41 #include "migration/vmstate.h"
42 #include "trace.h"
44 bool qdev_hotplug = false;
45 static bool qdev_hot_added = false;
46 bool qdev_hot_removed = false;
48 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
50 DeviceClass *dc = DEVICE_GET_CLASS(dev);
51 return dc->vmsd;
54 static void bus_remove_child(BusState *bus, DeviceState *child)
56 BusChild *kid;
58 QTAILQ_FOREACH(kid, &bus->children, sibling) {
59 if (kid->child == child) {
60 char name[32];
62 snprintf(name, sizeof(name), "child[%d]", kid->index);
63 QTAILQ_REMOVE(&bus->children, kid, sibling);
65 bus->num_children--;
67 /* This gives back ownership of kid->child back to us. */
68 object_property_del(OBJECT(bus), name);
69 object_unref(OBJECT(kid->child));
70 g_free(kid);
71 return;
76 static void bus_add_child(BusState *bus, DeviceState *child)
78 char name[32];
79 BusChild *kid = g_malloc0(sizeof(*kid));
81 bus->num_children++;
82 kid->index = bus->max_index++;
83 kid->child = child;
84 object_ref(OBJECT(kid->child));
86 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
88 /* This transfers ownership of kid->child to the property. */
89 snprintf(name, sizeof(name), "child[%d]", kid->index);
90 object_property_add_link(OBJECT(bus), name,
91 object_get_typename(OBJECT(child)),
92 (Object **)&kid->child,
93 NULL, /* read-only property */
94 0);
97 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
99 BusState *old_parent_bus = dev->parent_bus;
100 DeviceClass *dc = DEVICE_GET_CLASS(dev);
102 assert(dc->bus_type && object_dynamic_cast(OBJECT(bus), dc->bus_type));
104 if (old_parent_bus) {
105 trace_qdev_update_parent_bus(dev, object_get_typename(OBJECT(dev)),
106 old_parent_bus, object_get_typename(OBJECT(old_parent_bus)),
107 OBJECT(bus), object_get_typename(OBJECT(bus)));
109 * Keep a reference to the device while it's not plugged into
110 * any bus, to avoid it potentially evaporating when it is
111 * dereffed in bus_remove_child().
112 * Also keep the ref of the parent bus until the end, so that
113 * we can safely call resettable_change_parent() below.
115 object_ref(OBJECT(dev));
116 bus_remove_child(dev->parent_bus, dev);
118 dev->parent_bus = bus;
119 object_ref(OBJECT(bus));
120 bus_add_child(bus, dev);
121 if (dev->realized) {
122 resettable_change_parent(OBJECT(dev), OBJECT(bus),
123 OBJECT(old_parent_bus));
125 if (old_parent_bus) {
126 object_unref(OBJECT(old_parent_bus));
127 object_unref(OBJECT(dev));
132 * Create a device on the heap.
133 * A type @name must exist.
134 * This only initializes the device state structure and allows
135 * properties to be set. The device still needs to be realized. See
136 * qdev-core.h.
138 DeviceState *qdev_new(const char *name)
140 if (!object_class_by_name(name)) {
141 module_load_qom_one(name);
143 return DEVICE(object_new(name));
147 * Try to create a device on the heap.
148 * This is like qdev_new(), except it returns %NULL when type @name
149 * does not exist.
151 DeviceState *qdev_try_new(const char *name)
153 if (!module_object_class_by_name(name)) {
154 return NULL;
156 return DEVICE(object_new(name));
159 static QTAILQ_HEAD(, DeviceListener) device_listeners
160 = QTAILQ_HEAD_INITIALIZER(device_listeners);
162 enum ListenerDirection { Forward, Reverse };
164 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
165 do { \
166 DeviceListener *_listener; \
168 switch (_direction) { \
169 case Forward: \
170 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
171 if (_listener->_callback) { \
172 _listener->_callback(_listener, ##_args); \
175 break; \
176 case Reverse: \
177 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
178 link) { \
179 if (_listener->_callback) { \
180 _listener->_callback(_listener, ##_args); \
183 break; \
184 default: \
185 abort(); \
187 } while (0)
189 static int device_listener_add(DeviceState *dev, void *opaque)
191 DEVICE_LISTENER_CALL(realize, Forward, dev);
193 return 0;
196 void device_listener_register(DeviceListener *listener)
198 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
200 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
201 NULL, NULL);
204 void device_listener_unregister(DeviceListener *listener)
206 QTAILQ_REMOVE(&device_listeners, listener, link);
209 bool qdev_should_hide_device(QemuOpts *opts)
211 int rc = -1;
212 DeviceListener *listener;
214 QTAILQ_FOREACH(listener, &device_listeners, link) {
215 if (listener->should_be_hidden) {
217 * should_be_hidden_will return
218 * 1 if device matches opts and it should be hidden
219 * 0 if device matches opts and should not be hidden
220 * -1 if device doesn't match ops
222 rc = listener->should_be_hidden(listener, opts);
225 if (rc > 0) {
226 break;
230 return rc > 0;
233 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
234 int required_for_version)
236 assert(!dev->realized);
237 dev->instance_id_alias = alias_id;
238 dev->alias_required_for_version = required_for_version;
241 HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
243 MachineState *machine;
244 MachineClass *mc;
245 Object *m_obj = qdev_get_machine();
247 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
248 machine = MACHINE(m_obj);
249 mc = MACHINE_GET_CLASS(machine);
250 if (mc->get_hotplug_handler) {
251 return mc->get_hotplug_handler(machine, dev);
255 return NULL;
258 bool qdev_hotplug_allowed(DeviceState *dev, Error **errp)
260 MachineState *machine;
261 MachineClass *mc;
262 Object *m_obj = qdev_get_machine();
264 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
265 machine = MACHINE(m_obj);
266 mc = MACHINE_GET_CLASS(machine);
267 if (mc->hotplug_allowed) {
268 return mc->hotplug_allowed(machine, dev, errp);
272 return true;
275 HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev)
277 if (dev->parent_bus) {
278 return dev->parent_bus->hotplug_handler;
280 return NULL;
283 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
285 HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
287 if (hotplug_ctrl == NULL && dev->parent_bus) {
288 hotplug_ctrl = qdev_get_bus_hotplug_handler(dev);
290 return hotplug_ctrl;
293 static int qdev_prereset(DeviceState *dev, void *opaque)
295 trace_qdev_reset_tree(dev, object_get_typename(OBJECT(dev)));
296 return 0;
299 static int qbus_prereset(BusState *bus, void *opaque)
301 trace_qbus_reset_tree(bus, object_get_typename(OBJECT(bus)));
302 return 0;
305 static int qdev_reset_one(DeviceState *dev, void *opaque)
307 device_legacy_reset(dev);
309 return 0;
312 static int qbus_reset_one(BusState *bus, void *opaque)
314 BusClass *bc = BUS_GET_CLASS(bus);
315 trace_qbus_reset(bus, object_get_typename(OBJECT(bus)));
316 if (bc->reset) {
317 bc->reset(bus);
319 return 0;
322 void qdev_reset_all(DeviceState *dev)
324 trace_qdev_reset_all(dev, object_get_typename(OBJECT(dev)));
325 qdev_walk_children(dev, qdev_prereset, qbus_prereset,
326 qdev_reset_one, qbus_reset_one, NULL);
329 void qdev_reset_all_fn(void *opaque)
331 qdev_reset_all(DEVICE(opaque));
334 void qbus_reset_all(BusState *bus)
336 trace_qbus_reset_all(bus, object_get_typename(OBJECT(bus)));
337 qbus_walk_children(bus, qdev_prereset, qbus_prereset,
338 qdev_reset_one, qbus_reset_one, NULL);
341 void qbus_reset_all_fn(void *opaque)
343 BusState *bus = opaque;
344 qbus_reset_all(bus);
347 void device_cold_reset(DeviceState *dev)
349 resettable_reset(OBJECT(dev), RESET_TYPE_COLD);
352 bool device_is_in_reset(DeviceState *dev)
354 return resettable_is_in_reset(OBJECT(dev));
357 static ResettableState *device_get_reset_state(Object *obj)
359 DeviceState *dev = DEVICE(obj);
360 return &dev->reset;
363 static void device_reset_child_foreach(Object *obj, ResettableChildCallback cb,
364 void *opaque, ResetType type)
366 DeviceState *dev = DEVICE(obj);
367 BusState *bus;
369 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
370 cb(OBJECT(bus), opaque, type);
374 /* can be used as ->unplug() callback for the simple cases */
375 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
376 DeviceState *dev, Error **errp)
378 qdev_unrealize(dev);
382 * Realize @dev.
383 * @dev must not be plugged into a bus.
384 * If @bus, plug @dev into @bus. This takes a reference to @dev.
385 * If @dev has no QOM parent, make one up, taking another reference.
386 * On success, return true.
387 * On failure, store an error through @errp and return false.
389 bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
391 assert(!dev->realized && !dev->parent_bus);
393 if (bus) {
394 qdev_set_parent_bus(dev, bus);
395 } else {
396 assert(!DEVICE_GET_CLASS(dev)->bus_type);
399 return object_property_set_bool(OBJECT(dev), "realized", true, errp);
403 * Realize @dev and drop a reference.
404 * This is like qdev_realize(), except the caller must hold a
405 * (private) reference, which is dropped on return regardless of
406 * success or failure. Intended use:
407 * dev = qdev_new();
408 * [...]
409 * qdev_realize_and_unref(dev, bus, errp);
410 * Now @dev can go away without further ado.
412 bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp)
414 bool ret;
416 ret = qdev_realize(dev, bus, errp);
417 object_unref(OBJECT(dev));
418 return ret;
421 void qdev_unrealize(DeviceState *dev)
423 object_property_set_bool(OBJECT(dev), "realized", false, &error_abort);
426 static int qdev_assert_realized_properly(Object *obj, void *opaque)
428 DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE));
429 DeviceClass *dc;
431 if (dev) {
432 dc = DEVICE_GET_CLASS(dev);
433 assert(dev->realized);
434 assert(dev->parent_bus || !dc->bus_type);
436 return 0;
439 void qdev_machine_creation_done(void)
442 * ok, initial machine setup is done, starting from now we can
443 * only create hotpluggable devices
445 qdev_hotplug = true;
447 object_child_foreach_recursive(object_get_root(),
448 qdev_assert_realized_properly, NULL);
451 bool qdev_machine_modified(void)
453 return qdev_hot_added || qdev_hot_removed;
456 BusState *qdev_get_parent_bus(DeviceState *dev)
458 return dev->parent_bus;
461 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
462 const char *name)
464 NamedGPIOList *ngl;
466 QLIST_FOREACH(ngl, &dev->gpios, node) {
467 /* NULL is a valid and matchable name. */
468 if (g_strcmp0(name, ngl->name) == 0) {
469 return ngl;
473 ngl = g_malloc0(sizeof(*ngl));
474 ngl->name = g_strdup(name);
475 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
476 return ngl;
479 void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
480 qemu_irq_handler handler,
481 void *opaque,
482 const char *name, int n)
484 int i;
485 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
487 assert(gpio_list->num_out == 0 || !name);
488 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
489 opaque, n);
491 if (!name) {
492 name = "unnamed-gpio-in";
494 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
495 gchar *propname = g_strdup_printf("%s[%u]", name, i);
497 object_property_add_child(OBJECT(dev), propname,
498 OBJECT(gpio_list->in[i]));
499 g_free(propname);
502 gpio_list->num_in += n;
505 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
507 qdev_init_gpio_in_named(dev, handler, NULL, n);
510 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
511 const char *name, int n)
513 int i;
514 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
516 assert(gpio_list->num_in == 0 || !name);
518 if (!name) {
519 name = "unnamed-gpio-out";
521 memset(pins, 0, sizeof(*pins) * n);
522 for (i = 0; i < n; ++i) {
523 gchar *propname = g_strdup_printf("%s[%u]", name,
524 gpio_list->num_out + i);
526 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
527 (Object **)&pins[i],
528 object_property_allow_set_link,
529 OBJ_PROP_LINK_STRONG);
530 g_free(propname);
532 gpio_list->num_out += n;
535 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
537 qdev_init_gpio_out_named(dev, pins, NULL, n);
540 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
542 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
544 assert(n >= 0 && n < gpio_list->num_in);
545 return gpio_list->in[n];
548 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
550 return qdev_get_gpio_in_named(dev, NULL, n);
553 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
554 qemu_irq pin)
556 char *propname = g_strdup_printf("%s[%d]",
557 name ? name : "unnamed-gpio-out", n);
558 if (pin && !OBJECT(pin)->parent) {
559 /* We need a name for object_property_set_link to work */
560 object_property_add_child(container_get(qdev_get_machine(),
561 "/unattached"),
562 "non-qdev-gpio[*]", OBJECT(pin));
564 object_property_set_link(OBJECT(dev), propname, OBJECT(pin), &error_abort);
565 g_free(propname);
568 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
570 g_autofree char *propname = g_strdup_printf("%s[%d]",
571 name ? name : "unnamed-gpio-out", n);
573 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
574 NULL);
576 return ret;
579 /* disconnect a GPIO output, returning the disconnected input (if any) */
581 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
582 const char *name, int n)
584 char *propname = g_strdup_printf("%s[%d]",
585 name ? name : "unnamed-gpio-out", n);
587 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
588 NULL);
589 if (ret) {
590 object_property_set_link(OBJECT(dev), propname, NULL, NULL);
592 g_free(propname);
593 return ret;
596 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
597 const char *name, int n)
599 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
600 qdev_connect_gpio_out_named(dev, name, n, icpt);
601 return disconnected;
604 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
606 qdev_connect_gpio_out_named(dev, NULL, n, pin);
609 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
610 const char *name)
612 int i;
613 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
615 for (i = 0; i < ngl->num_in; i++) {
616 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
617 char *propname = g_strdup_printf("%s[%d]", nm, i);
619 object_property_add_alias(OBJECT(container), propname,
620 OBJECT(dev), propname);
621 g_free(propname);
623 for (i = 0; i < ngl->num_out; i++) {
624 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
625 char *propname = g_strdup_printf("%s[%d]", nm, i);
627 object_property_add_alias(OBJECT(container), propname,
628 OBJECT(dev), propname);
629 g_free(propname);
631 QLIST_REMOVE(ngl, node);
632 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
635 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
637 BusState *bus;
638 Object *child = object_resolve_path_component(OBJECT(dev), name);
640 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
641 if (bus) {
642 return bus;
645 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
646 if (strcmp(name, bus->name) == 0) {
647 return bus;
650 return NULL;
653 int qdev_walk_children(DeviceState *dev,
654 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
655 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
656 void *opaque)
658 BusState *bus;
659 int err;
661 if (pre_devfn) {
662 err = pre_devfn(dev, opaque);
663 if (err) {
664 return err;
668 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
669 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
670 post_devfn, post_busfn, opaque);
671 if (err < 0) {
672 return err;
676 if (post_devfn) {
677 err = post_devfn(dev, opaque);
678 if (err) {
679 return err;
683 return 0;
686 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
688 BusChild *kid;
689 DeviceState *ret;
690 BusState *child;
692 QTAILQ_FOREACH(kid, &bus->children, sibling) {
693 DeviceState *dev = kid->child;
695 if (dev->id && strcmp(dev->id, id) == 0) {
696 return dev;
699 QLIST_FOREACH(child, &dev->child_bus, sibling) {
700 ret = qdev_find_recursive(child, id);
701 if (ret) {
702 return ret;
706 return NULL;
709 char *qdev_get_dev_path(DeviceState *dev)
711 BusClass *bc;
713 if (!dev || !dev->parent_bus) {
714 return NULL;
717 bc = BUS_GET_CLASS(dev->parent_bus);
718 if (bc->get_dev_path) {
719 return bc->get_dev_path(dev);
722 return NULL;
726 * Legacy property handling
729 static void qdev_get_legacy_property(Object *obj, Visitor *v,
730 const char *name, void *opaque,
731 Error **errp)
733 DeviceState *dev = DEVICE(obj);
734 Property *prop = opaque;
736 char buffer[1024];
737 char *ptr = buffer;
739 prop->info->print(dev, prop, buffer, sizeof(buffer));
740 visit_type_str(v, name, &ptr, errp);
744 * qdev_class_add_legacy_property:
745 * @dev: Device to add the property to.
746 * @prop: The qdev property definition.
748 * Add a legacy QOM property to @dev for qdev property @prop.
750 * Legacy properties are string versions of QOM properties. The format of
751 * the string depends on the property type. Legacy properties are only
752 * needed for "info qtree".
754 * Do not use this in new code! QOM Properties added through this interface
755 * will be given names in the "legacy" namespace.
757 static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop)
759 g_autofree char *name = NULL;
761 /* Register pointer properties as legacy properties */
762 if (!prop->info->print && prop->info->get) {
763 return;
766 name = g_strdup_printf("legacy-%s", prop->name);
767 object_class_property_add(OBJECT_CLASS(dc), name, "str",
768 prop->info->print ? qdev_get_legacy_property : prop->info->get,
769 NULL, NULL, prop);
772 void qdev_property_add_static(DeviceState *dev, Property *prop)
774 Object *obj = OBJECT(dev);
775 ObjectProperty *op;
777 assert(!prop->info->create);
779 op = object_property_add(obj, prop->name, prop->info->name,
780 prop->info->get, prop->info->set,
781 prop->info->release,
782 prop);
784 object_property_set_description(obj, prop->name,
785 prop->info->description);
787 if (prop->set_default) {
788 prop->info->set_default_value(op, prop);
789 if (op->init) {
790 op->init(obj, op);
795 static void qdev_class_add_property(DeviceClass *klass, Property *prop)
797 ObjectClass *oc = OBJECT_CLASS(klass);
799 if (prop->info->create) {
800 prop->info->create(oc, prop);
801 } else {
802 ObjectProperty *op;
804 op = object_class_property_add(oc,
805 prop->name, prop->info->name,
806 prop->info->get, prop->info->set,
807 prop->info->release,
808 prop);
809 if (prop->set_default) {
810 prop->info->set_default_value(op, prop);
813 object_class_property_set_description(oc, prop->name,
814 prop->info->description);
817 /* @qdev_alias_all_properties - Add alias properties to the source object for
818 * all qdev properties on the target DeviceState.
820 void qdev_alias_all_properties(DeviceState *target, Object *source)
822 ObjectClass *class;
823 Property *prop;
825 class = object_get_class(OBJECT(target));
826 do {
827 DeviceClass *dc = DEVICE_CLASS(class);
829 for (prop = dc->props_; prop && prop->name; prop++) {
830 object_property_add_alias(source, prop->name,
831 OBJECT(target), prop->name);
833 class = object_class_get_parent(class);
834 } while (class != object_class_by_name(TYPE_DEVICE));
837 static bool device_get_realized(Object *obj, Error **errp)
839 DeviceState *dev = DEVICE(obj);
840 return dev->realized;
843 static bool check_only_migratable(Object *obj, Error **errp)
845 DeviceClass *dc = DEVICE_GET_CLASS(obj);
847 if (!vmstate_check_only_migratable(dc->vmsd)) {
848 error_setg(errp, "Device %s is not migratable, but "
849 "--only-migratable was specified",
850 object_get_typename(obj));
851 return false;
854 return true;
857 static void device_set_realized(Object *obj, bool value, Error **errp)
859 DeviceState *dev = DEVICE(obj);
860 DeviceClass *dc = DEVICE_GET_CLASS(dev);
861 HotplugHandler *hotplug_ctrl;
862 BusState *bus;
863 NamedClockList *ncl;
864 Error *local_err = NULL;
865 bool unattached_parent = false;
866 static int unattached_count;
868 if (dev->hotplugged && !dc->hotpluggable) {
869 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
870 return;
873 if (value && !dev->realized) {
874 if (!check_only_migratable(obj, errp)) {
875 goto fail;
878 if (!obj->parent) {
879 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
881 object_property_add_child(container_get(qdev_get_machine(),
882 "/unattached"),
883 name, obj);
884 unattached_parent = true;
885 g_free(name);
888 hotplug_ctrl = qdev_get_hotplug_handler(dev);
889 if (hotplug_ctrl) {
890 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
891 if (local_err != NULL) {
892 goto fail;
896 if (dc->realize) {
897 dc->realize(dev, &local_err);
898 if (local_err != NULL) {
899 goto fail;
903 DEVICE_LISTENER_CALL(realize, Forward, dev);
906 * always free/re-initialize here since the value cannot be cleaned up
907 * in device_unrealize due to its usage later on in the unplug path
909 g_free(dev->canonical_path);
910 dev->canonical_path = object_get_canonical_path(OBJECT(dev));
911 QLIST_FOREACH(ncl, &dev->clocks, node) {
912 if (ncl->alias) {
913 continue;
914 } else {
915 clock_setup_canonical_path(ncl->clock);
919 if (qdev_get_vmsd(dev)) {
920 if (vmstate_register_with_alias_id(VMSTATE_IF(dev),
921 VMSTATE_INSTANCE_ID_ANY,
922 qdev_get_vmsd(dev), dev,
923 dev->instance_id_alias,
924 dev->alias_required_for_version,
925 &local_err) < 0) {
926 goto post_realize_fail;
931 * Clear the reset state, in case the object was previously unrealized
932 * with a dirty state.
934 resettable_state_clear(&dev->reset);
936 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
937 if (!qbus_realize(bus, errp)) {
938 goto child_realize_fail;
941 if (dev->hotplugged) {
943 * Reset the device, as well as its subtree which, at this point,
944 * should be realized too.
946 resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD);
947 resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus),
948 NULL);
949 resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD);
951 dev->pending_deleted_event = false;
953 if (hotplug_ctrl) {
954 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
955 if (local_err != NULL) {
956 goto child_realize_fail;
960 } else if (!value && dev->realized) {
961 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
962 qbus_unrealize(bus);
964 if (qdev_get_vmsd(dev)) {
965 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
967 if (dc->unrealize) {
968 dc->unrealize(dev);
970 dev->pending_deleted_event = true;
971 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
974 assert(local_err == NULL);
975 dev->realized = value;
976 return;
978 child_realize_fail:
979 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
980 qbus_unrealize(bus);
983 if (qdev_get_vmsd(dev)) {
984 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
987 post_realize_fail:
988 g_free(dev->canonical_path);
989 dev->canonical_path = NULL;
990 if (dc->unrealize) {
991 dc->unrealize(dev);
994 fail:
995 error_propagate(errp, local_err);
996 if (unattached_parent) {
998 * Beware, this doesn't just revert
999 * object_property_add_child(), it also runs bus_remove()!
1001 object_unparent(OBJECT(dev));
1002 unattached_count--;
1006 static bool device_get_hotpluggable(Object *obj, Error **errp)
1008 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1009 DeviceState *dev = DEVICE(obj);
1011 return dc->hotpluggable && (dev->parent_bus == NULL ||
1012 qbus_is_hotpluggable(dev->parent_bus));
1015 static bool device_get_hotplugged(Object *obj, Error **errp)
1017 DeviceState *dev = DEVICE(obj);
1019 return dev->hotplugged;
1022 static void device_initfn(Object *obj)
1024 DeviceState *dev = DEVICE(obj);
1026 if (qdev_hotplug) {
1027 dev->hotplugged = 1;
1028 qdev_hot_added = true;
1031 dev->instance_id_alias = -1;
1032 dev->realized = false;
1033 dev->allow_unplug_during_migration = false;
1035 QLIST_INIT(&dev->gpios);
1036 QLIST_INIT(&dev->clocks);
1039 static void device_post_init(Object *obj)
1042 * Note: ordered so that the user's global properties take
1043 * precedence.
1045 object_apply_compat_props(obj);
1046 qdev_prop_set_globals(DEVICE(obj));
1049 /* Unlink device from bus and free the structure. */
1050 static void device_finalize(Object *obj)
1052 NamedGPIOList *ngl, *next;
1054 DeviceState *dev = DEVICE(obj);
1056 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1057 QLIST_REMOVE(ngl, node);
1058 qemu_free_irqs(ngl->in, ngl->num_in);
1059 g_free(ngl->name);
1060 g_free(ngl);
1061 /* ngl->out irqs are owned by the other end and should not be freed
1062 * here
1066 qdev_finalize_clocklist(dev);
1068 /* Only send event if the device had been completely realized */
1069 if (dev->pending_deleted_event) {
1070 g_assert(dev->canonical_path);
1072 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
1073 g_free(dev->canonical_path);
1074 dev->canonical_path = NULL;
1077 qemu_opts_del(dev->opts);
1080 static void device_class_base_init(ObjectClass *class, void *data)
1082 DeviceClass *klass = DEVICE_CLASS(class);
1084 /* We explicitly look up properties in the superclasses,
1085 * so do not propagate them to the subclasses.
1087 klass->props_ = NULL;
1090 static void device_unparent(Object *obj)
1092 DeviceState *dev = DEVICE(obj);
1093 BusState *bus;
1095 if (dev->realized) {
1096 qdev_unrealize(dev);
1098 while (dev->num_child_bus) {
1099 bus = QLIST_FIRST(&dev->child_bus);
1100 object_unparent(OBJECT(bus));
1102 if (dev->parent_bus) {
1103 bus_remove_child(dev->parent_bus, dev);
1104 object_unref(OBJECT(dev->parent_bus));
1105 dev->parent_bus = NULL;
1109 static char *
1110 device_vmstate_if_get_id(VMStateIf *obj)
1112 DeviceState *dev = DEVICE(obj);
1114 return qdev_get_dev_path(dev);
1118 * device_phases_reset:
1119 * Transition reset method for devices to allow moving
1120 * smoothly from legacy reset method to multi-phases
1122 static void device_phases_reset(DeviceState *dev)
1124 ResettableClass *rc = RESETTABLE_GET_CLASS(dev);
1126 if (rc->phases.enter) {
1127 rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD);
1129 if (rc->phases.hold) {
1130 rc->phases.hold(OBJECT(dev));
1132 if (rc->phases.exit) {
1133 rc->phases.exit(OBJECT(dev));
1137 static void device_transitional_reset(Object *obj)
1139 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1142 * This will call either @device_phases_reset (for multi-phases transitioned
1143 * devices) or a device's specific method for not-yet transitioned devices.
1144 * In both case, it does not reset children.
1146 if (dc->reset) {
1147 dc->reset(DEVICE(obj));
1152 * device_get_transitional_reset:
1153 * check if the device's class is ready for multi-phase
1155 static ResettableTrFunction device_get_transitional_reset(Object *obj)
1157 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1158 if (dc->reset != device_phases_reset) {
1160 * dc->reset has been overridden by a subclass,
1161 * the device is not ready for multi phase yet.
1163 return device_transitional_reset;
1165 return NULL;
1168 static void device_class_init(ObjectClass *class, void *data)
1170 DeviceClass *dc = DEVICE_CLASS(class);
1171 VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
1172 ResettableClass *rc = RESETTABLE_CLASS(class);
1174 class->unparent = device_unparent;
1176 /* by default all devices were considered as hotpluggable,
1177 * so with intent to check it in generic qdev_unplug() /
1178 * device_set_realized() functions make every device
1179 * hotpluggable. Devices that shouldn't be hotpluggable,
1180 * should override it in their class_init()
1182 dc->hotpluggable = true;
1183 dc->user_creatable = true;
1184 vc->get_id = device_vmstate_if_get_id;
1185 rc->get_state = device_get_reset_state;
1186 rc->child_foreach = device_reset_child_foreach;
1189 * @device_phases_reset is put as the default reset method below, allowing
1190 * to do the multi-phase transition from base classes to leaf classes. It
1191 * allows a legacy-reset Device class to extend a multi-phases-reset
1192 * Device class for the following reason:
1193 * + If a base class B has been moved to multi-phase, then it does not
1194 * override this default reset method and may have defined phase methods.
1195 * + A child class C (extending class B) which uses
1196 * device_class_set_parent_reset() (or similar means) to override the
1197 * reset method will still work as expected. @device_phases_reset function
1198 * will be registered as the parent reset method and effectively call
1199 * parent reset phases.
1201 dc->reset = device_phases_reset;
1202 rc->get_transitional_function = device_get_transitional_reset;
1204 object_class_property_add_bool(class, "realized",
1205 device_get_realized, device_set_realized);
1206 object_class_property_add_bool(class, "hotpluggable",
1207 device_get_hotpluggable, NULL);
1208 object_class_property_add_bool(class, "hotplugged",
1209 device_get_hotplugged, NULL);
1210 object_class_property_add_link(class, "parent_bus", TYPE_BUS,
1211 offsetof(DeviceState, parent_bus), NULL, 0);
1214 void device_class_set_props(DeviceClass *dc, Property *props)
1216 Property *prop;
1218 dc->props_ = props;
1219 for (prop = props; prop && prop->name; prop++) {
1220 qdev_class_add_legacy_property(dc, prop);
1221 qdev_class_add_property(dc, prop);
1225 void device_class_set_parent_reset(DeviceClass *dc,
1226 DeviceReset dev_reset,
1227 DeviceReset *parent_reset)
1229 *parent_reset = dc->reset;
1230 dc->reset = dev_reset;
1233 void device_class_set_parent_realize(DeviceClass *dc,
1234 DeviceRealize dev_realize,
1235 DeviceRealize *parent_realize)
1237 *parent_realize = dc->realize;
1238 dc->realize = dev_realize;
1241 void device_class_set_parent_unrealize(DeviceClass *dc,
1242 DeviceUnrealize dev_unrealize,
1243 DeviceUnrealize *parent_unrealize)
1245 *parent_unrealize = dc->unrealize;
1246 dc->unrealize = dev_unrealize;
1249 void device_legacy_reset(DeviceState *dev)
1251 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1253 trace_qdev_reset(dev, object_get_typename(OBJECT(dev)));
1254 if (klass->reset) {
1255 klass->reset(dev);
1259 Object *qdev_get_machine(void)
1261 static Object *dev;
1263 if (dev == NULL) {
1264 dev = container_get(object_get_root(), "/machine");
1267 return dev;
1270 static const TypeInfo device_type_info = {
1271 .name = TYPE_DEVICE,
1272 .parent = TYPE_OBJECT,
1273 .instance_size = sizeof(DeviceState),
1274 .instance_init = device_initfn,
1275 .instance_post_init = device_post_init,
1276 .instance_finalize = device_finalize,
1277 .class_base_init = device_class_base_init,
1278 .class_init = device_class_init,
1279 .abstract = true,
1280 .class_size = sizeof(DeviceClass),
1281 .interfaces = (InterfaceInfo[]) {
1282 { TYPE_VMSTATE_IF },
1283 { TYPE_RESETTABLE_INTERFACE },
1288 static void qdev_register_types(void)
1290 type_register_static(&device_type_info);
1293 type_init(qdev_register_types)