]> git.proxmox.com Git - mirror_qemu.git/blob - hw/core/qdev.c
Merge remote-tracking branch 'remotes/kraxel/tags/audio-20210316-pull-request' into...
[mirror_qemu.git] / hw / core / qdev.c
1 /*
2 * Dynamic device configuration and creation.
3 *
4 * Copyright (c) 2009 CodeSourcery
5 *
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.1 of the License, or (at your option) any later version.
10 *
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.
15 *
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/>.
18 */
19
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. */
27
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"
43
44 static bool qdev_hot_added = false;
45 bool qdev_hot_removed = false;
46
47 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
48 {
49 DeviceClass *dc = DEVICE_GET_CLASS(dev);
50 return dc->vmsd;
51 }
52
53 static void bus_free_bus_child(BusChild *kid)
54 {
55 object_unref(OBJECT(kid->child));
56 g_free(kid);
57 }
58
59 static void bus_remove_child(BusState *bus, DeviceState *child)
60 {
61 BusChild *kid;
62
63 QTAILQ_FOREACH(kid, &bus->children, sibling) {
64 if (kid->child == child) {
65 char name[32];
66
67 snprintf(name, sizeof(name), "child[%d]", kid->index);
68 QTAILQ_REMOVE_RCU(&bus->children, kid, sibling);
69
70 bus->num_children--;
71
72 /* This gives back ownership of kid->child back to us. */
73 object_property_del(OBJECT(bus), name);
74
75 /* free the bus kid, when it is safe to do so*/
76 call_rcu(kid, bus_free_bus_child, rcu);
77 break;
78 }
79 }
80 }
81
82 static void bus_add_child(BusState *bus, DeviceState *child)
83 {
84 char name[32];
85 BusChild *kid = g_malloc0(sizeof(*kid));
86
87 bus->num_children++;
88 kid->index = bus->max_index++;
89 kid->child = child;
90 object_ref(OBJECT(kid->child));
91
92 QTAILQ_INSERT_HEAD_RCU(&bus->children, kid, sibling);
93
94 /* This transfers ownership of kid->child to the property. */
95 snprintf(name, sizeof(name), "child[%d]", kid->index);
96 object_property_add_link(OBJECT(bus), name,
97 object_get_typename(OBJECT(child)),
98 (Object **)&kid->child,
99 NULL, /* read-only property */
100 0);
101 }
102
103 static bool bus_check_address(BusState *bus, DeviceState *child, Error **errp)
104 {
105 BusClass *bc = BUS_GET_CLASS(bus);
106 return !bc->check_address || bc->check_address(bus, child, errp);
107 }
108
109 bool qdev_set_parent_bus(DeviceState *dev, BusState *bus, Error **errp)
110 {
111 BusState *old_parent_bus = dev->parent_bus;
112 DeviceClass *dc = DEVICE_GET_CLASS(dev);
113
114 assert(dc->bus_type && object_dynamic_cast(OBJECT(bus), dc->bus_type));
115
116 if (!bus_check_address(bus, dev, errp)) {
117 return false;
118 }
119
120 if (old_parent_bus) {
121 trace_qdev_update_parent_bus(dev, object_get_typename(OBJECT(dev)),
122 old_parent_bus, object_get_typename(OBJECT(old_parent_bus)),
123 OBJECT(bus), object_get_typename(OBJECT(bus)));
124 /*
125 * Keep a reference to the device while it's not plugged into
126 * any bus, to avoid it potentially evaporating when it is
127 * dereffed in bus_remove_child().
128 * Also keep the ref of the parent bus until the end, so that
129 * we can safely call resettable_change_parent() below.
130 */
131 object_ref(OBJECT(dev));
132 bus_remove_child(dev->parent_bus, dev);
133 }
134 dev->parent_bus = bus;
135 object_ref(OBJECT(bus));
136 bus_add_child(bus, dev);
137 if (dev->realized) {
138 resettable_change_parent(OBJECT(dev), OBJECT(bus),
139 OBJECT(old_parent_bus));
140 }
141 if (old_parent_bus) {
142 object_unref(OBJECT(old_parent_bus));
143 object_unref(OBJECT(dev));
144 }
145 return true;
146 }
147
148 DeviceState *qdev_new(const char *name)
149 {
150 if (!object_class_by_name(name)) {
151 module_load_qom_one(name);
152 }
153 return DEVICE(object_new(name));
154 }
155
156 DeviceState *qdev_try_new(const char *name)
157 {
158 if (!module_object_class_by_name(name)) {
159 return NULL;
160 }
161 return DEVICE(object_new(name));
162 }
163
164 static QTAILQ_HEAD(, DeviceListener) device_listeners
165 = QTAILQ_HEAD_INITIALIZER(device_listeners);
166
167 enum ListenerDirection { Forward, Reverse };
168
169 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
170 do { \
171 DeviceListener *_listener; \
172 \
173 switch (_direction) { \
174 case Forward: \
175 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
176 if (_listener->_callback) { \
177 _listener->_callback(_listener, ##_args); \
178 } \
179 } \
180 break; \
181 case Reverse: \
182 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
183 link) { \
184 if (_listener->_callback) { \
185 _listener->_callback(_listener, ##_args); \
186 } \
187 } \
188 break; \
189 default: \
190 abort(); \
191 } \
192 } while (0)
193
194 static int device_listener_add(DeviceState *dev, void *opaque)
195 {
196 DEVICE_LISTENER_CALL(realize, Forward, dev);
197
198 return 0;
199 }
200
201 void device_listener_register(DeviceListener *listener)
202 {
203 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
204
205 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
206 NULL, NULL);
207 }
208
209 void device_listener_unregister(DeviceListener *listener)
210 {
211 QTAILQ_REMOVE(&device_listeners, listener, link);
212 }
213
214 bool qdev_should_hide_device(QemuOpts *opts)
215 {
216 DeviceListener *listener;
217
218 QTAILQ_FOREACH(listener, &device_listeners, link) {
219 if (listener->hide_device) {
220 if (listener->hide_device(listener, opts)) {
221 return true;
222 }
223 }
224 }
225
226 return false;
227 }
228
229 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
230 int required_for_version)
231 {
232 assert(!dev->realized);
233 dev->instance_id_alias = alias_id;
234 dev->alias_required_for_version = required_for_version;
235 }
236
237 HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
238 {
239 MachineState *machine;
240 MachineClass *mc;
241 Object *m_obj = qdev_get_machine();
242
243 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
244 machine = MACHINE(m_obj);
245 mc = MACHINE_GET_CLASS(machine);
246 if (mc->get_hotplug_handler) {
247 return mc->get_hotplug_handler(machine, dev);
248 }
249 }
250
251 return NULL;
252 }
253
254 bool qdev_hotplug_allowed(DeviceState *dev, Error **errp)
255 {
256 MachineState *machine;
257 MachineClass *mc;
258 Object *m_obj = qdev_get_machine();
259
260 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
261 machine = MACHINE(m_obj);
262 mc = MACHINE_GET_CLASS(machine);
263 if (mc->hotplug_allowed) {
264 return mc->hotplug_allowed(machine, dev, errp);
265 }
266 }
267
268 return true;
269 }
270
271 HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev)
272 {
273 if (dev->parent_bus) {
274 return dev->parent_bus->hotplug_handler;
275 }
276 return NULL;
277 }
278
279 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
280 {
281 HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
282
283 if (hotplug_ctrl == NULL && dev->parent_bus) {
284 hotplug_ctrl = qdev_get_bus_hotplug_handler(dev);
285 }
286 return hotplug_ctrl;
287 }
288
289 static int qdev_prereset(DeviceState *dev, void *opaque)
290 {
291 trace_qdev_reset_tree(dev, object_get_typename(OBJECT(dev)));
292 return 0;
293 }
294
295 static int qbus_prereset(BusState *bus, void *opaque)
296 {
297 trace_qbus_reset_tree(bus, object_get_typename(OBJECT(bus)));
298 return 0;
299 }
300
301 static int qdev_reset_one(DeviceState *dev, void *opaque)
302 {
303 device_legacy_reset(dev);
304
305 return 0;
306 }
307
308 static int qbus_reset_one(BusState *bus, void *opaque)
309 {
310 BusClass *bc = BUS_GET_CLASS(bus);
311 trace_qbus_reset(bus, object_get_typename(OBJECT(bus)));
312 if (bc->reset) {
313 bc->reset(bus);
314 }
315 return 0;
316 }
317
318 void qdev_reset_all(DeviceState *dev)
319 {
320 trace_qdev_reset_all(dev, object_get_typename(OBJECT(dev)));
321 qdev_walk_children(dev, qdev_prereset, qbus_prereset,
322 qdev_reset_one, qbus_reset_one, NULL);
323 }
324
325 void qdev_reset_all_fn(void *opaque)
326 {
327 qdev_reset_all(DEVICE(opaque));
328 }
329
330 void qbus_reset_all(BusState *bus)
331 {
332 trace_qbus_reset_all(bus, object_get_typename(OBJECT(bus)));
333 qbus_walk_children(bus, qdev_prereset, qbus_prereset,
334 qdev_reset_one, qbus_reset_one, NULL);
335 }
336
337 void qbus_reset_all_fn(void *opaque)
338 {
339 BusState *bus = opaque;
340 qbus_reset_all(bus);
341 }
342
343 void device_cold_reset(DeviceState *dev)
344 {
345 resettable_reset(OBJECT(dev), RESET_TYPE_COLD);
346 }
347
348 bool device_is_in_reset(DeviceState *dev)
349 {
350 return resettable_is_in_reset(OBJECT(dev));
351 }
352
353 static ResettableState *device_get_reset_state(Object *obj)
354 {
355 DeviceState *dev = DEVICE(obj);
356 return &dev->reset;
357 }
358
359 static void device_reset_child_foreach(Object *obj, ResettableChildCallback cb,
360 void *opaque, ResetType type)
361 {
362 DeviceState *dev = DEVICE(obj);
363 BusState *bus;
364
365 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
366 cb(OBJECT(bus), opaque, type);
367 }
368 }
369
370 /* can be used as ->unplug() callback for the simple cases */
371 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
372 DeviceState *dev, Error **errp)
373 {
374 qdev_unrealize(dev);
375 }
376
377 bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
378 {
379 assert(!dev->realized && !dev->parent_bus);
380
381 if (bus) {
382 if (!qdev_set_parent_bus(dev, bus, errp)) {
383 return false;
384 }
385 } else {
386 assert(!DEVICE_GET_CLASS(dev)->bus_type);
387 }
388
389 return object_property_set_bool(OBJECT(dev), "realized", true, errp);
390 }
391
392 bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp)
393 {
394 bool ret;
395
396 ret = qdev_realize(dev, bus, errp);
397 object_unref(OBJECT(dev));
398 return ret;
399 }
400
401 void qdev_unrealize(DeviceState *dev)
402 {
403 object_property_set_bool(OBJECT(dev), "realized", false, &error_abort);
404 }
405
406 static int qdev_assert_realized_properly_cb(Object *obj, void *opaque)
407 {
408 DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE));
409 DeviceClass *dc;
410
411 if (dev) {
412 dc = DEVICE_GET_CLASS(dev);
413 assert(dev->realized);
414 assert(dev->parent_bus || !dc->bus_type);
415 }
416 return 0;
417 }
418
419 void qdev_assert_realized_properly(void)
420 {
421 object_child_foreach_recursive(object_get_root(),
422 qdev_assert_realized_properly_cb, NULL);
423 }
424
425 bool qdev_machine_modified(void)
426 {
427 return qdev_hot_added || qdev_hot_removed;
428 }
429
430 BusState *qdev_get_parent_bus(DeviceState *dev)
431 {
432 return dev->parent_bus;
433 }
434
435 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
436 const char *name)
437 {
438 NamedGPIOList *ngl;
439
440 QLIST_FOREACH(ngl, &dev->gpios, node) {
441 /* NULL is a valid and matchable name. */
442 if (g_strcmp0(name, ngl->name) == 0) {
443 return ngl;
444 }
445 }
446
447 ngl = g_malloc0(sizeof(*ngl));
448 ngl->name = g_strdup(name);
449 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
450 return ngl;
451 }
452
453 void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
454 qemu_irq_handler handler,
455 void *opaque,
456 const char *name, int n)
457 {
458 int i;
459 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
460
461 assert(gpio_list->num_out == 0 || !name);
462 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
463 opaque, n);
464
465 if (!name) {
466 name = "unnamed-gpio-in";
467 }
468 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
469 gchar *propname = g_strdup_printf("%s[%u]", name, i);
470
471 object_property_add_child(OBJECT(dev), propname,
472 OBJECT(gpio_list->in[i]));
473 g_free(propname);
474 }
475
476 gpio_list->num_in += n;
477 }
478
479 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
480 {
481 qdev_init_gpio_in_named(dev, handler, NULL, n);
482 }
483
484 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
485 const char *name, int n)
486 {
487 int i;
488 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
489
490 assert(gpio_list->num_in == 0 || !name);
491
492 if (!name) {
493 name = "unnamed-gpio-out";
494 }
495 memset(pins, 0, sizeof(*pins) * n);
496 for (i = 0; i < n; ++i) {
497 gchar *propname = g_strdup_printf("%s[%u]", name,
498 gpio_list->num_out + i);
499
500 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
501 (Object **)&pins[i],
502 object_property_allow_set_link,
503 OBJ_PROP_LINK_STRONG);
504 g_free(propname);
505 }
506 gpio_list->num_out += n;
507 }
508
509 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
510 {
511 qdev_init_gpio_out_named(dev, pins, NULL, n);
512 }
513
514 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
515 {
516 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
517
518 assert(n >= 0 && n < gpio_list->num_in);
519 return gpio_list->in[n];
520 }
521
522 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
523 {
524 return qdev_get_gpio_in_named(dev, NULL, n);
525 }
526
527 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
528 qemu_irq pin)
529 {
530 char *propname = g_strdup_printf("%s[%d]",
531 name ? name : "unnamed-gpio-out", n);
532 if (pin && !OBJECT(pin)->parent) {
533 /* We need a name for object_property_set_link to work */
534 object_property_add_child(container_get(qdev_get_machine(),
535 "/unattached"),
536 "non-qdev-gpio[*]", OBJECT(pin));
537 }
538 object_property_set_link(OBJECT(dev), propname, OBJECT(pin), &error_abort);
539 g_free(propname);
540 }
541
542 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
543 {
544 g_autofree char *propname = g_strdup_printf("%s[%d]",
545 name ? name : "unnamed-gpio-out", n);
546
547 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
548 NULL);
549
550 return ret;
551 }
552
553 /* disconnect a GPIO output, returning the disconnected input (if any) */
554
555 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
556 const char *name, int n)
557 {
558 char *propname = g_strdup_printf("%s[%d]",
559 name ? name : "unnamed-gpio-out", n);
560
561 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
562 NULL);
563 if (ret) {
564 object_property_set_link(OBJECT(dev), propname, NULL, NULL);
565 }
566 g_free(propname);
567 return ret;
568 }
569
570 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
571 const char *name, int n)
572 {
573 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
574 qdev_connect_gpio_out_named(dev, name, n, icpt);
575 return disconnected;
576 }
577
578 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
579 {
580 qdev_connect_gpio_out_named(dev, NULL, n, pin);
581 }
582
583 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
584 const char *name)
585 {
586 int i;
587 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
588
589 for (i = 0; i < ngl->num_in; i++) {
590 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
591 char *propname = g_strdup_printf("%s[%d]", nm, i);
592
593 object_property_add_alias(OBJECT(container), propname,
594 OBJECT(dev), propname);
595 g_free(propname);
596 }
597 for (i = 0; i < ngl->num_out; i++) {
598 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
599 char *propname = g_strdup_printf("%s[%d]", nm, i);
600
601 object_property_add_alias(OBJECT(container), propname,
602 OBJECT(dev), propname);
603 g_free(propname);
604 }
605 QLIST_REMOVE(ngl, node);
606 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
607 }
608
609 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
610 {
611 BusState *bus;
612 Object *child = object_resolve_path_component(OBJECT(dev), name);
613
614 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
615 if (bus) {
616 return bus;
617 }
618
619 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
620 if (strcmp(name, bus->name) == 0) {
621 return bus;
622 }
623 }
624 return NULL;
625 }
626
627 int qdev_walk_children(DeviceState *dev,
628 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
629 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
630 void *opaque)
631 {
632 BusState *bus;
633 int err;
634
635 if (pre_devfn) {
636 err = pre_devfn(dev, opaque);
637 if (err) {
638 return err;
639 }
640 }
641
642 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
643 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
644 post_devfn, post_busfn, opaque);
645 if (err < 0) {
646 return err;
647 }
648 }
649
650 if (post_devfn) {
651 err = post_devfn(dev, opaque);
652 if (err) {
653 return err;
654 }
655 }
656
657 return 0;
658 }
659
660 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
661 {
662 BusChild *kid;
663 DeviceState *ret;
664 BusState *child;
665
666 WITH_RCU_READ_LOCK_GUARD() {
667 QTAILQ_FOREACH_RCU(kid, &bus->children, sibling) {
668 DeviceState *dev = kid->child;
669
670 if (dev->id && strcmp(dev->id, id) == 0) {
671 return dev;
672 }
673
674 QLIST_FOREACH(child, &dev->child_bus, sibling) {
675 ret = qdev_find_recursive(child, id);
676 if (ret) {
677 return ret;
678 }
679 }
680 }
681 }
682 return NULL;
683 }
684
685 char *qdev_get_dev_path(DeviceState *dev)
686 {
687 BusClass *bc;
688
689 if (!dev || !dev->parent_bus) {
690 return NULL;
691 }
692
693 bc = BUS_GET_CLASS(dev->parent_bus);
694 if (bc->get_dev_path) {
695 return bc->get_dev_path(dev);
696 }
697
698 return NULL;
699 }
700
701 static bool device_get_realized(Object *obj, Error **errp)
702 {
703 DeviceState *dev = DEVICE(obj);
704 return dev->realized;
705 }
706
707 static bool check_only_migratable(Object *obj, Error **errp)
708 {
709 DeviceClass *dc = DEVICE_GET_CLASS(obj);
710
711 if (!vmstate_check_only_migratable(dc->vmsd)) {
712 error_setg(errp, "Device %s is not migratable, but "
713 "--only-migratable was specified",
714 object_get_typename(obj));
715 return false;
716 }
717
718 return true;
719 }
720
721 static void device_set_realized(Object *obj, bool value, Error **errp)
722 {
723 DeviceState *dev = DEVICE(obj);
724 DeviceClass *dc = DEVICE_GET_CLASS(dev);
725 HotplugHandler *hotplug_ctrl;
726 BusState *bus;
727 NamedClockList *ncl;
728 Error *local_err = NULL;
729 bool unattached_parent = false;
730 static int unattached_count;
731
732 if (dev->hotplugged && !dc->hotpluggable) {
733 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
734 return;
735 }
736
737 if (value && !dev->realized) {
738 if (!check_only_migratable(obj, errp)) {
739 goto fail;
740 }
741
742 if (!obj->parent) {
743 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
744
745 object_property_add_child(container_get(qdev_get_machine(),
746 "/unattached"),
747 name, obj);
748 unattached_parent = true;
749 g_free(name);
750 }
751
752 hotplug_ctrl = qdev_get_hotplug_handler(dev);
753 if (hotplug_ctrl) {
754 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
755 if (local_err != NULL) {
756 goto fail;
757 }
758 }
759
760 if (dc->realize) {
761 dc->realize(dev, &local_err);
762 if (local_err != NULL) {
763 goto fail;
764 }
765 }
766
767 DEVICE_LISTENER_CALL(realize, Forward, dev);
768
769 /*
770 * always free/re-initialize here since the value cannot be cleaned up
771 * in device_unrealize due to its usage later on in the unplug path
772 */
773 g_free(dev->canonical_path);
774 dev->canonical_path = object_get_canonical_path(OBJECT(dev));
775 QLIST_FOREACH(ncl, &dev->clocks, node) {
776 if (ncl->alias) {
777 continue;
778 } else {
779 clock_setup_canonical_path(ncl->clock);
780 }
781 }
782
783 if (qdev_get_vmsd(dev)) {
784 if (vmstate_register_with_alias_id(VMSTATE_IF(dev),
785 VMSTATE_INSTANCE_ID_ANY,
786 qdev_get_vmsd(dev), dev,
787 dev->instance_id_alias,
788 dev->alias_required_for_version,
789 &local_err) < 0) {
790 goto post_realize_fail;
791 }
792 }
793
794 /*
795 * Clear the reset state, in case the object was previously unrealized
796 * with a dirty state.
797 */
798 resettable_state_clear(&dev->reset);
799
800 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
801 if (!qbus_realize(bus, errp)) {
802 goto child_realize_fail;
803 }
804 }
805 if (dev->hotplugged) {
806 /*
807 * Reset the device, as well as its subtree which, at this point,
808 * should be realized too.
809 */
810 resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD);
811 resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus),
812 NULL);
813 resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD);
814 }
815 dev->pending_deleted_event = false;
816
817 if (hotplug_ctrl) {
818 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
819 if (local_err != NULL) {
820 goto child_realize_fail;
821 }
822 }
823
824 qatomic_store_release(&dev->realized, value);
825
826 } else if (!value && dev->realized) {
827
828 /*
829 * Change the value so that any concurrent users are aware
830 * that the device is going to be unrealized
831 *
832 * TODO: change .realized property to enum that states
833 * each phase of the device realization/unrealization
834 */
835
836 qatomic_set(&dev->realized, value);
837 /*
838 * Ensure that concurrent users see this update prior to
839 * any other changes done by unrealize.
840 */
841 smp_wmb();
842
843 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
844 qbus_unrealize(bus);
845 }
846 if (qdev_get_vmsd(dev)) {
847 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
848 }
849 if (dc->unrealize) {
850 dc->unrealize(dev);
851 }
852 dev->pending_deleted_event = true;
853 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
854 }
855
856 assert(local_err == NULL);
857 return;
858
859 child_realize_fail:
860 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
861 qbus_unrealize(bus);
862 }
863
864 if (qdev_get_vmsd(dev)) {
865 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
866 }
867
868 post_realize_fail:
869 g_free(dev->canonical_path);
870 dev->canonical_path = NULL;
871 if (dc->unrealize) {
872 dc->unrealize(dev);
873 }
874
875 fail:
876 error_propagate(errp, local_err);
877 if (unattached_parent) {
878 /*
879 * Beware, this doesn't just revert
880 * object_property_add_child(), it also runs bus_remove()!
881 */
882 object_unparent(OBJECT(dev));
883 unattached_count--;
884 }
885 }
886
887 static bool device_get_hotpluggable(Object *obj, Error **errp)
888 {
889 DeviceClass *dc = DEVICE_GET_CLASS(obj);
890 DeviceState *dev = DEVICE(obj);
891
892 return dc->hotpluggable && (dev->parent_bus == NULL ||
893 qbus_is_hotpluggable(dev->parent_bus));
894 }
895
896 static bool device_get_hotplugged(Object *obj, Error **errp)
897 {
898 DeviceState *dev = DEVICE(obj);
899
900 return dev->hotplugged;
901 }
902
903 static void device_initfn(Object *obj)
904 {
905 DeviceState *dev = DEVICE(obj);
906
907 if (phase_check(PHASE_MACHINE_READY)) {
908 dev->hotplugged = 1;
909 qdev_hot_added = true;
910 }
911
912 dev->instance_id_alias = -1;
913 dev->realized = false;
914 dev->allow_unplug_during_migration = false;
915
916 QLIST_INIT(&dev->gpios);
917 QLIST_INIT(&dev->clocks);
918 }
919
920 static void device_post_init(Object *obj)
921 {
922 /*
923 * Note: ordered so that the user's global properties take
924 * precedence.
925 */
926 object_apply_compat_props(obj);
927 qdev_prop_set_globals(DEVICE(obj));
928 }
929
930 /* Unlink device from bus and free the structure. */
931 static void device_finalize(Object *obj)
932 {
933 NamedGPIOList *ngl, *next;
934
935 DeviceState *dev = DEVICE(obj);
936
937 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
938 QLIST_REMOVE(ngl, node);
939 qemu_free_irqs(ngl->in, ngl->num_in);
940 g_free(ngl->name);
941 g_free(ngl);
942 /* ngl->out irqs are owned by the other end and should not be freed
943 * here
944 */
945 }
946
947 qdev_finalize_clocklist(dev);
948
949 /* Only send event if the device had been completely realized */
950 if (dev->pending_deleted_event) {
951 g_assert(dev->canonical_path);
952
953 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
954 g_free(dev->canonical_path);
955 dev->canonical_path = NULL;
956 }
957
958 qemu_opts_del(dev->opts);
959 }
960
961 static void device_class_base_init(ObjectClass *class, void *data)
962 {
963 DeviceClass *klass = DEVICE_CLASS(class);
964
965 /* We explicitly look up properties in the superclasses,
966 * so do not propagate them to the subclasses.
967 */
968 klass->props_ = NULL;
969 }
970
971 static void device_unparent(Object *obj)
972 {
973 DeviceState *dev = DEVICE(obj);
974 BusState *bus;
975
976 if (dev->realized) {
977 qdev_unrealize(dev);
978 }
979 while (dev->num_child_bus) {
980 bus = QLIST_FIRST(&dev->child_bus);
981 object_unparent(OBJECT(bus));
982 }
983 if (dev->parent_bus) {
984 bus_remove_child(dev->parent_bus, dev);
985 object_unref(OBJECT(dev->parent_bus));
986 dev->parent_bus = NULL;
987 }
988 }
989
990 static char *
991 device_vmstate_if_get_id(VMStateIf *obj)
992 {
993 DeviceState *dev = DEVICE(obj);
994
995 return qdev_get_dev_path(dev);
996 }
997
998 /**
999 * device_phases_reset:
1000 * Transition reset method for devices to allow moving
1001 * smoothly from legacy reset method to multi-phases
1002 */
1003 static void device_phases_reset(DeviceState *dev)
1004 {
1005 ResettableClass *rc = RESETTABLE_GET_CLASS(dev);
1006
1007 if (rc->phases.enter) {
1008 rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD);
1009 }
1010 if (rc->phases.hold) {
1011 rc->phases.hold(OBJECT(dev));
1012 }
1013 if (rc->phases.exit) {
1014 rc->phases.exit(OBJECT(dev));
1015 }
1016 }
1017
1018 static void device_transitional_reset(Object *obj)
1019 {
1020 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1021
1022 /*
1023 * This will call either @device_phases_reset (for multi-phases transitioned
1024 * devices) or a device's specific method for not-yet transitioned devices.
1025 * In both case, it does not reset children.
1026 */
1027 if (dc->reset) {
1028 dc->reset(DEVICE(obj));
1029 }
1030 }
1031
1032 /**
1033 * device_get_transitional_reset:
1034 * check if the device's class is ready for multi-phase
1035 */
1036 static ResettableTrFunction device_get_transitional_reset(Object *obj)
1037 {
1038 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1039 if (dc->reset != device_phases_reset) {
1040 /*
1041 * dc->reset has been overridden by a subclass,
1042 * the device is not ready for multi phase yet.
1043 */
1044 return device_transitional_reset;
1045 }
1046 return NULL;
1047 }
1048
1049 static void device_class_init(ObjectClass *class, void *data)
1050 {
1051 DeviceClass *dc = DEVICE_CLASS(class);
1052 VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
1053 ResettableClass *rc = RESETTABLE_CLASS(class);
1054
1055 class->unparent = device_unparent;
1056
1057 /* by default all devices were considered as hotpluggable,
1058 * so with intent to check it in generic qdev_unplug() /
1059 * device_set_realized() functions make every device
1060 * hotpluggable. Devices that shouldn't be hotpluggable,
1061 * should override it in their class_init()
1062 */
1063 dc->hotpluggable = true;
1064 dc->user_creatable = true;
1065 vc->get_id = device_vmstate_if_get_id;
1066 rc->get_state = device_get_reset_state;
1067 rc->child_foreach = device_reset_child_foreach;
1068
1069 /*
1070 * @device_phases_reset is put as the default reset method below, allowing
1071 * to do the multi-phase transition from base classes to leaf classes. It
1072 * allows a legacy-reset Device class to extend a multi-phases-reset
1073 * Device class for the following reason:
1074 * + If a base class B has been moved to multi-phase, then it does not
1075 * override this default reset method and may have defined phase methods.
1076 * + A child class C (extending class B) which uses
1077 * device_class_set_parent_reset() (or similar means) to override the
1078 * reset method will still work as expected. @device_phases_reset function
1079 * will be registered as the parent reset method and effectively call
1080 * parent reset phases.
1081 */
1082 dc->reset = device_phases_reset;
1083 rc->get_transitional_function = device_get_transitional_reset;
1084
1085 object_class_property_add_bool(class, "realized",
1086 device_get_realized, device_set_realized);
1087 object_class_property_add_bool(class, "hotpluggable",
1088 device_get_hotpluggable, NULL);
1089 object_class_property_add_bool(class, "hotplugged",
1090 device_get_hotplugged, NULL);
1091 object_class_property_add_link(class, "parent_bus", TYPE_BUS,
1092 offsetof(DeviceState, parent_bus), NULL, 0);
1093 }
1094
1095 void device_class_set_parent_reset(DeviceClass *dc,
1096 DeviceReset dev_reset,
1097 DeviceReset *parent_reset)
1098 {
1099 *parent_reset = dc->reset;
1100 dc->reset = dev_reset;
1101 }
1102
1103 void device_class_set_parent_realize(DeviceClass *dc,
1104 DeviceRealize dev_realize,
1105 DeviceRealize *parent_realize)
1106 {
1107 *parent_realize = dc->realize;
1108 dc->realize = dev_realize;
1109 }
1110
1111 void device_class_set_parent_unrealize(DeviceClass *dc,
1112 DeviceUnrealize dev_unrealize,
1113 DeviceUnrealize *parent_unrealize)
1114 {
1115 *parent_unrealize = dc->unrealize;
1116 dc->unrealize = dev_unrealize;
1117 }
1118
1119 void device_legacy_reset(DeviceState *dev)
1120 {
1121 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1122
1123 trace_qdev_reset(dev, object_get_typename(OBJECT(dev)));
1124 if (klass->reset) {
1125 klass->reset(dev);
1126 }
1127 }
1128
1129 Object *qdev_get_machine(void)
1130 {
1131 static Object *dev;
1132
1133 if (dev == NULL) {
1134 dev = container_get(object_get_root(), "/machine");
1135 }
1136
1137 return dev;
1138 }
1139
1140 static MachineInitPhase machine_phase;
1141
1142 bool phase_check(MachineInitPhase phase)
1143 {
1144 return machine_phase >= phase;
1145 }
1146
1147 void phase_advance(MachineInitPhase phase)
1148 {
1149 assert(machine_phase == phase - 1);
1150 machine_phase = phase;
1151 }
1152
1153 static const TypeInfo device_type_info = {
1154 .name = TYPE_DEVICE,
1155 .parent = TYPE_OBJECT,
1156 .instance_size = sizeof(DeviceState),
1157 .instance_init = device_initfn,
1158 .instance_post_init = device_post_init,
1159 .instance_finalize = device_finalize,
1160 .class_base_init = device_class_base_init,
1161 .class_init = device_class_init,
1162 .abstract = true,
1163 .class_size = sizeof(DeviceClass),
1164 .interfaces = (InterfaceInfo[]) {
1165 { TYPE_VMSTATE_IF },
1166 { TYPE_RESETTABLE_INTERFACE },
1167 { }
1168 }
1169 };
1170
1171 static void qdev_register_types(void)
1172 {
1173 type_register_static(&device_type_info);
1174 }
1175
1176 type_init(qdev_register_types)