Add device listener interface
[qemu.git] / hw / core / qdev.c
blob2eacac0787af6e6d042f566d3a3ed87fec52c6c4
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 "hw/qdev.h"
29 #include "hw/fw-path-provider.h"
30 #include "sysemu/sysemu.h"
31 #include "qapi/error.h"
32 #include "qapi/qmp/qerror.h"
33 #include "qapi/visitor.h"
34 #include "qapi/qmp/qjson.h"
35 #include "hw/hotplug.h"
36 #include "hw/boards.h"
37 #include "qapi-event.h"
39 int qdev_hotplug = 0;
40 static bool qdev_hot_added = false;
41 static bool qdev_hot_removed = false;
43 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
45 DeviceClass *dc = DEVICE_GET_CLASS(dev);
46 return dc->vmsd;
49 const char *qdev_fw_name(DeviceState *dev)
51 DeviceClass *dc = DEVICE_GET_CLASS(dev);
53 if (dc->fw_name) {
54 return dc->fw_name;
57 return object_get_typename(OBJECT(dev));
60 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
61 Error **errp);
63 static void bus_remove_child(BusState *bus, DeviceState *child)
65 BusChild *kid;
67 QTAILQ_FOREACH(kid, &bus->children, sibling) {
68 if (kid->child == child) {
69 char name[32];
71 snprintf(name, sizeof(name), "child[%d]", kid->index);
72 QTAILQ_REMOVE(&bus->children, kid, sibling);
74 /* This gives back ownership of kid->child back to us. */
75 object_property_del(OBJECT(bus), name, NULL);
76 object_unref(OBJECT(kid->child));
77 g_free(kid);
78 return;
83 static void bus_add_child(BusState *bus, DeviceState *child)
85 char name[32];
86 BusChild *kid = g_malloc0(sizeof(*kid));
88 kid->index = bus->max_index++;
89 kid->child = child;
90 object_ref(OBJECT(kid->child));
92 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
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, /* return ownership on prop deletion */
101 NULL);
104 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
106 dev->parent_bus = bus;
107 object_ref(OBJECT(bus));
108 bus_add_child(bus, dev);
111 static void qbus_set_hotplug_handler_internal(BusState *bus, Object *handler,
112 Error **errp)
115 object_property_set_link(OBJECT(bus), OBJECT(handler),
116 QDEV_HOTPLUG_HANDLER_PROPERTY, errp);
119 void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler, Error **errp)
121 qbus_set_hotplug_handler_internal(bus, OBJECT(handler), errp);
124 void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp)
126 qbus_set_hotplug_handler_internal(bus, OBJECT(bus), errp);
129 /* Create a new device. This only initializes the device state structure
130 and allows properties to be set. qdev_init should be called to
131 initialize the actual device emulation. */
132 DeviceState *qdev_create(BusState *bus, const char *name)
134 DeviceState *dev;
136 dev = qdev_try_create(bus, name);
137 if (!dev) {
138 if (bus) {
139 error_report("Unknown device '%s' for bus '%s'", name,
140 object_get_typename(OBJECT(bus)));
141 } else {
142 error_report("Unknown device '%s' for default sysbus", name);
144 abort();
147 return dev;
150 DeviceState *qdev_try_create(BusState *bus, const char *type)
152 DeviceState *dev;
154 if (object_class_by_name(type) == NULL) {
155 return NULL;
157 dev = DEVICE(object_new(type));
158 if (!dev) {
159 return NULL;
162 if (!bus) {
163 bus = sysbus_get_default();
166 qdev_set_parent_bus(dev, bus);
167 object_unref(OBJECT(dev));
168 return dev;
171 /* Initialize a device. Device properties should be set before calling
172 this function. IRQs and MMIO regions should be connected/mapped after
173 calling this function.
174 On failure, destroy the device and return negative value.
175 Return 0 on success. */
176 int qdev_init(DeviceState *dev)
178 Error *local_err = NULL;
180 assert(!dev->realized);
182 object_property_set_bool(OBJECT(dev), true, "realized", &local_err);
183 if (local_err != NULL) {
184 qerror_report_err(local_err);
185 error_free(local_err);
186 object_unparent(OBJECT(dev));
187 return -1;
189 return 0;
192 static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
193 = QTAILQ_HEAD_INITIALIZER(device_listeners);
195 enum ListenerDirection { Forward, Reverse };
197 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
198 do { \
199 DeviceListener *_listener; \
201 switch (_direction) { \
202 case Forward: \
203 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
204 if (_listener->_callback) { \
205 _listener->_callback(_listener, ##_args); \
208 break; \
209 case Reverse: \
210 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
211 device_listeners, link) { \
212 if (_listener->_callback) { \
213 _listener->_callback(_listener, ##_args); \
216 break; \
217 default: \
218 abort(); \
220 } while (0)
222 static int device_listener_add(DeviceState *dev, void *opaque)
224 DEVICE_LISTENER_CALL(realize, Forward, dev);
226 return 0;
229 void device_listener_register(DeviceListener *listener)
231 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
233 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
234 NULL, NULL);
237 void device_listener_unregister(DeviceListener *listener)
239 QTAILQ_REMOVE(&device_listeners, listener, link);
242 static void device_realize(DeviceState *dev, Error **errp)
244 DeviceClass *dc = DEVICE_GET_CLASS(dev);
246 if (dc->init) {
247 int rc = dc->init(dev);
248 if (rc < 0) {
249 error_setg(errp, "Device initialization failed.");
250 return;
255 static void device_unrealize(DeviceState *dev, Error **errp)
257 DeviceClass *dc = DEVICE_GET_CLASS(dev);
259 if (dc->exit) {
260 int rc = dc->exit(dev);
261 if (rc < 0) {
262 error_setg(errp, "Device exit failed.");
263 return;
268 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
269 int required_for_version)
271 assert(!dev->realized);
272 dev->instance_id_alias = alias_id;
273 dev->alias_required_for_version = required_for_version;
276 static HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
278 HotplugHandler *hotplug_ctrl = NULL;
280 if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
281 hotplug_ctrl = dev->parent_bus->hotplug_handler;
282 } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
283 MachineState *machine = MACHINE(qdev_get_machine());
284 MachineClass *mc = MACHINE_GET_CLASS(machine);
286 if (mc->get_hotplug_handler) {
287 hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
290 return hotplug_ctrl;
293 void qdev_unplug(DeviceState *dev, Error **errp)
295 DeviceClass *dc = DEVICE_GET_CLASS(dev);
296 HotplugHandler *hotplug_ctrl;
297 HotplugHandlerClass *hdc;
299 if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
300 error_set(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
301 return;
304 if (!dc->hotpluggable) {
305 error_set(errp, QERR_DEVICE_NO_HOTPLUG,
306 object_get_typename(OBJECT(dev)));
307 return;
310 qdev_hot_removed = true;
312 hotplug_ctrl = qdev_get_hotplug_handler(dev);
313 /* hotpluggable device MUST have HotplugHandler, if it doesn't
314 * then something is very wrong with it */
315 g_assert(hotplug_ctrl);
317 /* If device supports async unplug just request it to be done,
318 * otherwise just remove it synchronously */
319 hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl);
320 if (hdc->unplug_request) {
321 hotplug_handler_unplug_request(hotplug_ctrl, dev, errp);
322 } else {
323 hotplug_handler_unplug(hotplug_ctrl, dev, errp);
327 static int qdev_reset_one(DeviceState *dev, void *opaque)
329 device_reset(dev);
331 return 0;
334 static int qbus_reset_one(BusState *bus, void *opaque)
336 BusClass *bc = BUS_GET_CLASS(bus);
337 if (bc->reset) {
338 bc->reset(bus);
340 return 0;
343 void qdev_reset_all(DeviceState *dev)
345 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
348 void qbus_reset_all(BusState *bus)
350 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
353 void qbus_reset_all_fn(void *opaque)
355 BusState *bus = opaque;
356 qbus_reset_all(bus);
359 /* can be used as ->unplug() callback for the simple cases */
360 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
361 DeviceState *dev, Error **errp)
363 /* just zap it */
364 object_unparent(OBJECT(dev));
367 /* Like qdev_init(), but terminate program via error_report() instead of
368 returning an error value. This is okay during machine creation.
369 Don't use for hotplug, because there callers need to recover from
370 failure. Exception: if you know the device's init() callback can't
371 fail, then qdev_init_nofail() can't fail either, and is therefore
372 usable even then. But relying on the device implementation that
373 way is somewhat unclean, and best avoided. */
374 void qdev_init_nofail(DeviceState *dev)
376 const char *typename = object_get_typename(OBJECT(dev));
378 if (qdev_init(dev) < 0) {
379 error_report("Initialization of device %s failed", typename);
380 exit(1);
384 void qdev_machine_creation_done(void)
387 * ok, initial machine setup is done, starting from now we can
388 * only create hotpluggable devices
390 qdev_hotplug = 1;
393 bool qdev_machine_modified(void)
395 return qdev_hot_added || qdev_hot_removed;
398 BusState *qdev_get_parent_bus(DeviceState *dev)
400 return dev->parent_bus;
403 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
404 const char *name)
406 NamedGPIOList *ngl;
408 QLIST_FOREACH(ngl, &dev->gpios, node) {
409 /* NULL is a valid and matchable name, otherwise do a normal
410 * strcmp match.
412 if ((!ngl->name && !name) ||
413 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
414 return ngl;
418 ngl = g_malloc0(sizeof(*ngl));
419 ngl->name = g_strdup(name);
420 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
421 return ngl;
424 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
425 const char *name, int n)
427 int i;
428 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
429 char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-in");
431 assert(gpio_list->num_out == 0 || !name);
432 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
433 dev, n);
435 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
436 object_property_add_child(OBJECT(dev), propname,
437 OBJECT(gpio_list->in[i]), &error_abort);
439 g_free(propname);
441 gpio_list->num_in += n;
444 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
446 qdev_init_gpio_in_named(dev, handler, NULL, n);
449 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
450 const char *name, int n)
452 int i;
453 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
454 char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-out");
456 assert(gpio_list->num_in == 0 || !name);
457 gpio_list->num_out += n;
459 for (i = 0; i < n; ++i) {
460 memset(&pins[i], 0, sizeof(*pins));
461 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
462 (Object **)&pins[i],
463 object_property_allow_set_link,
464 OBJ_PROP_LINK_UNREF_ON_RELEASE,
465 &error_abort);
467 g_free(propname);
470 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
472 qdev_init_gpio_out_named(dev, pins, NULL, n);
475 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
477 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
479 assert(n >= 0 && n < gpio_list->num_in);
480 return gpio_list->in[n];
483 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
485 return qdev_get_gpio_in_named(dev, NULL, n);
488 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
489 qemu_irq pin)
491 char *propname = g_strdup_printf("%s[%d]",
492 name ? name : "unnamed-gpio-out", n);
493 if (pin) {
494 /* We need a name for object_property_set_link to work. If the
495 * object has a parent, object_property_add_child will come back
496 * with an error without doing anything. If it has none, it will
497 * never fail. So we can just call it with a NULL Error pointer.
499 object_property_add_child(qdev_get_machine(), "non-qdev-gpio[*]",
500 OBJECT(pin), NULL);
502 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
503 g_free(propname);
506 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
508 char *propname = g_strdup_printf("%s[%d]",
509 name ? name : "unnamed-gpio-out", n);
511 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
512 NULL);
514 return ret;
517 /* disconnect a GPIO ouput, returning the disconnected input (if any) */
519 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
520 const char *name, int n)
522 char *propname = g_strdup_printf("%s[%d]",
523 name ? name : "unnamed-gpio-out", n);
525 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
526 NULL);
527 if (ret) {
528 object_property_set_link(OBJECT(dev), NULL, propname, NULL);
530 g_free(propname);
531 return ret;
534 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
535 const char *name, int n)
537 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
538 qdev_connect_gpio_out_named(dev, name, n, icpt);
539 return disconnected;
542 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
544 qdev_connect_gpio_out_named(dev, NULL, n, pin);
547 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
548 const char *name)
550 int i;
551 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
553 for (i = 0; i < ngl->num_in; i++) {
554 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
555 char *propname = g_strdup_printf("%s[%d]", nm, i);
557 object_property_add_alias(OBJECT(container), propname,
558 OBJECT(dev), propname,
559 &error_abort);
561 for (i = 0; i < ngl->num_out; i++) {
562 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
563 char *propname = g_strdup_printf("%s[%d]", nm, i);
565 object_property_add_alias(OBJECT(container), propname,
566 OBJECT(dev), propname,
567 &error_abort);
569 QLIST_REMOVE(ngl, node);
570 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
573 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
575 BusState *bus;
577 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
578 if (strcmp(name, bus->name) == 0) {
579 return bus;
582 return NULL;
585 int qbus_walk_children(BusState *bus,
586 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
587 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
588 void *opaque)
590 BusChild *kid;
591 int err;
593 if (pre_busfn) {
594 err = pre_busfn(bus, opaque);
595 if (err) {
596 return err;
600 QTAILQ_FOREACH(kid, &bus->children, sibling) {
601 err = qdev_walk_children(kid->child,
602 pre_devfn, pre_busfn,
603 post_devfn, post_busfn, opaque);
604 if (err < 0) {
605 return err;
609 if (post_busfn) {
610 err = post_busfn(bus, opaque);
611 if (err) {
612 return err;
616 return 0;
619 int qdev_walk_children(DeviceState *dev,
620 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
621 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
622 void *opaque)
624 BusState *bus;
625 int err;
627 if (pre_devfn) {
628 err = pre_devfn(dev, opaque);
629 if (err) {
630 return err;
634 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
635 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
636 post_devfn, post_busfn, opaque);
637 if (err < 0) {
638 return err;
642 if (post_devfn) {
643 err = post_devfn(dev, opaque);
644 if (err) {
645 return err;
649 return 0;
652 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
654 BusChild *kid;
655 DeviceState *ret;
656 BusState *child;
658 QTAILQ_FOREACH(kid, &bus->children, sibling) {
659 DeviceState *dev = kid->child;
661 if (dev->id && strcmp(dev->id, id) == 0) {
662 return dev;
665 QLIST_FOREACH(child, &dev->child_bus, sibling) {
666 ret = qdev_find_recursive(child, id);
667 if (ret) {
668 return ret;
672 return NULL;
675 static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
677 const char *typename = object_get_typename(OBJECT(bus));
678 BusClass *bc;
679 char *buf;
680 int i, len, bus_id;
682 bus->parent = parent;
684 if (name) {
685 bus->name = g_strdup(name);
686 } else if (bus->parent && bus->parent->id) {
687 /* parent device has id -> use it plus parent-bus-id for bus name */
688 bus_id = bus->parent->num_child_bus;
690 len = strlen(bus->parent->id) + 16;
691 buf = g_malloc(len);
692 snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
693 bus->name = buf;
694 } else {
695 /* no id -> use lowercase bus type plus global bus-id for bus name */
696 bc = BUS_GET_CLASS(bus);
697 bus_id = bc->automatic_ids++;
699 len = strlen(typename) + 16;
700 buf = g_malloc(len);
701 len = snprintf(buf, len, "%s.%d", typename, bus_id);
702 for (i = 0; i < len; i++) {
703 buf[i] = qemu_tolower(buf[i]);
705 bus->name = buf;
708 if (bus->parent) {
709 QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
710 bus->parent->num_child_bus++;
711 object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL);
712 object_unref(OBJECT(bus));
713 } else if (bus != sysbus_get_default()) {
714 /* TODO: once all bus devices are qdevified,
715 only reset handler for main_system_bus should be registered here. */
716 qemu_register_reset(qbus_reset_all_fn, bus);
720 static void bus_unparent(Object *obj)
722 BusState *bus = BUS(obj);
723 BusChild *kid;
725 while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
726 DeviceState *dev = kid->child;
727 object_unparent(OBJECT(dev));
729 if (bus->parent) {
730 QLIST_REMOVE(bus, sibling);
731 bus->parent->num_child_bus--;
732 bus->parent = NULL;
733 } else {
734 assert(bus != sysbus_get_default()); /* main_system_bus is never freed */
735 qemu_unregister_reset(qbus_reset_all_fn, bus);
739 static bool bus_get_realized(Object *obj, Error **errp)
741 BusState *bus = BUS(obj);
743 return bus->realized;
746 static void bus_set_realized(Object *obj, bool value, Error **errp)
748 BusState *bus = BUS(obj);
749 BusClass *bc = BUS_GET_CLASS(bus);
750 BusChild *kid;
751 Error *local_err = NULL;
753 if (value && !bus->realized) {
754 if (bc->realize) {
755 bc->realize(bus, &local_err);
758 /* TODO: recursive realization */
759 } else if (!value && bus->realized) {
760 QTAILQ_FOREACH(kid, &bus->children, sibling) {
761 DeviceState *dev = kid->child;
762 object_property_set_bool(OBJECT(dev), false, "realized",
763 &local_err);
764 if (local_err != NULL) {
765 break;
768 if (bc->unrealize && local_err == NULL) {
769 bc->unrealize(bus, &local_err);
773 if (local_err != NULL) {
774 error_propagate(errp, local_err);
775 return;
778 bus->realized = value;
781 void qbus_create_inplace(void *bus, size_t size, const char *typename,
782 DeviceState *parent, const char *name)
784 object_initialize(bus, size, typename);
785 qbus_realize(bus, parent, name);
788 BusState *qbus_create(const char *typename, DeviceState *parent, const char *name)
790 BusState *bus;
792 bus = BUS(object_new(typename));
793 qbus_realize(bus, parent, name);
795 return bus;
798 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
800 BusClass *bc = BUS_GET_CLASS(bus);
802 if (bc->get_fw_dev_path) {
803 return bc->get_fw_dev_path(dev);
806 return NULL;
809 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
811 Object *obj = OBJECT(dev);
812 char *d = NULL;
814 while (!d && obj->parent) {
815 obj = obj->parent;
816 d = fw_path_provider_try_get_dev_path(obj, bus, dev);
818 return d;
821 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
823 int l = 0;
825 if (dev && dev->parent_bus) {
826 char *d;
827 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
828 d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
829 if (!d) {
830 d = bus_get_fw_dev_path(dev->parent_bus, dev);
832 if (d) {
833 l += snprintf(p + l, size - l, "%s", d);
834 g_free(d);
835 } else {
836 return l;
839 l += snprintf(p + l , size - l, "/");
841 return l;
844 char* qdev_get_fw_dev_path(DeviceState *dev)
846 char path[128];
847 int l;
849 l = qdev_get_fw_dev_path_helper(dev, path, 128);
851 path[l-1] = '\0';
853 return g_strdup(path);
856 char *qdev_get_dev_path(DeviceState *dev)
858 BusClass *bc;
860 if (!dev || !dev->parent_bus) {
861 return NULL;
864 bc = BUS_GET_CLASS(dev->parent_bus);
865 if (bc->get_dev_path) {
866 return bc->get_dev_path(dev);
869 return NULL;
873 * Legacy property handling
876 static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque,
877 const char *name, Error **errp)
879 DeviceState *dev = DEVICE(obj);
880 Property *prop = opaque;
882 char buffer[1024];
883 char *ptr = buffer;
885 prop->info->print(dev, prop, buffer, sizeof(buffer));
886 visit_type_str(v, &ptr, name, errp);
890 * @qdev_add_legacy_property - adds a legacy property
892 * Do not use this is new code! Properties added through this interface will
893 * be given names and types in the "legacy" namespace.
895 * Legacy properties are string versions of other OOM properties. The format
896 * of the string depends on the property type.
898 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
899 Error **errp)
901 gchar *name;
903 /* Register pointer properties as legacy properties */
904 if (!prop->info->print && prop->info->get) {
905 return;
908 name = g_strdup_printf("legacy-%s", prop->name);
909 object_property_add(OBJECT(dev), name, "str",
910 prop->info->print ? qdev_get_legacy_property : prop->info->get,
911 NULL,
912 NULL,
913 prop, errp);
915 g_free(name);
919 * @qdev_property_add_static - add a @Property to a device.
921 * Static properties access data in a struct. The actual type of the
922 * property and the field depends on the property type.
924 void qdev_property_add_static(DeviceState *dev, Property *prop,
925 Error **errp)
927 Error *local_err = NULL;
928 Object *obj = OBJECT(dev);
931 * TODO qdev_prop_ptr does not have getters or setters. It must
932 * go now that it can be replaced with links. The test should be
933 * removed along with it: all static properties are read/write.
935 if (!prop->info->get && !prop->info->set) {
936 return;
939 object_property_add(obj, prop->name, prop->info->name,
940 prop->info->get, prop->info->set,
941 prop->info->release,
942 prop, &local_err);
944 if (local_err) {
945 error_propagate(errp, local_err);
946 return;
949 object_property_set_description(obj, prop->name,
950 prop->info->description,
951 &error_abort);
953 if (prop->qtype == QTYPE_NONE) {
954 return;
957 if (prop->qtype == QTYPE_QBOOL) {
958 object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
959 } else if (prop->info->enum_table) {
960 object_property_set_str(obj, prop->info->enum_table[prop->defval],
961 prop->name, &error_abort);
962 } else if (prop->qtype == QTYPE_QINT) {
963 object_property_set_int(obj, prop->defval, prop->name, &error_abort);
967 /* @qdev_alias_all_properties - Add alias properties to the source object for
968 * all qdev properties on the target DeviceState.
970 void qdev_alias_all_properties(DeviceState *target, Object *source)
972 ObjectClass *class;
973 Property *prop;
975 class = object_get_class(OBJECT(target));
976 do {
977 DeviceClass *dc = DEVICE_CLASS(class);
979 for (prop = dc->props; prop && prop->name; prop++) {
980 object_property_add_alias(source, prop->name,
981 OBJECT(target), prop->name,
982 &error_abort);
984 class = object_class_get_parent(class);
985 } while (class != object_class_by_name(TYPE_DEVICE));
988 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
990 GSList **list = opaque;
991 DeviceState *dev = DEVICE(obj);
993 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
994 *list = g_slist_append(*list, dev);
997 return 0;
1000 GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
1002 GSList *list = NULL;
1004 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
1006 return list;
1009 static bool device_get_realized(Object *obj, Error **errp)
1011 DeviceState *dev = DEVICE(obj);
1012 return dev->realized;
1015 static void device_set_realized(Object *obj, bool value, Error **errp)
1017 DeviceState *dev = DEVICE(obj);
1018 DeviceClass *dc = DEVICE_GET_CLASS(dev);
1019 HotplugHandler *hotplug_ctrl;
1020 BusState *bus;
1021 Error *local_err = NULL;
1023 if (dev->hotplugged && !dc->hotpluggable) {
1024 error_set(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
1025 return;
1028 if (value && !dev->realized) {
1029 if (!obj->parent) {
1030 static int unattached_count;
1031 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
1033 object_property_add_child(container_get(qdev_get_machine(),
1034 "/unattached"),
1035 name, obj, &error_abort);
1036 g_free(name);
1039 if (dc->realize) {
1040 dc->realize(dev, &local_err);
1043 if (local_err != NULL) {
1044 goto fail;
1047 DEVICE_LISTENER_CALL(realize, Forward, dev);
1049 hotplug_ctrl = qdev_get_hotplug_handler(dev);
1050 if (hotplug_ctrl) {
1051 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
1054 if (local_err != NULL) {
1055 goto post_realize_fail;
1058 if (qdev_get_vmsd(dev)) {
1059 vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
1060 dev->instance_id_alias,
1061 dev->alias_required_for_version);
1064 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1065 object_property_set_bool(OBJECT(bus), true, "realized",
1066 &local_err);
1067 if (local_err != NULL) {
1068 goto child_realize_fail;
1071 if (dev->hotplugged) {
1072 device_reset(dev);
1074 dev->pending_deleted_event = false;
1075 } else if (!value && dev->realized) {
1076 Error **local_errp = NULL;
1077 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1078 local_errp = local_err ? NULL : &local_err;
1079 object_property_set_bool(OBJECT(bus), false, "realized",
1080 local_errp);
1082 if (qdev_get_vmsd(dev)) {
1083 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1085 if (dc->unrealize) {
1086 local_errp = local_err ? NULL : &local_err;
1087 dc->unrealize(dev, local_errp);
1089 dev->pending_deleted_event = true;
1090 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
1093 if (local_err != NULL) {
1094 goto fail;
1097 dev->realized = value;
1098 return;
1100 child_realize_fail:
1101 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1102 object_property_set_bool(OBJECT(bus), false, "realized",
1103 NULL);
1106 if (qdev_get_vmsd(dev)) {
1107 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1110 post_realize_fail:
1111 if (dc->unrealize) {
1112 dc->unrealize(dev, NULL);
1115 fail:
1116 error_propagate(errp, local_err);
1117 return;
1120 static bool device_get_hotpluggable(Object *obj, Error **errp)
1122 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1123 DeviceState *dev = DEVICE(obj);
1125 return dc->hotpluggable && (dev->parent_bus == NULL ||
1126 qbus_is_hotpluggable(dev->parent_bus));
1129 static bool device_get_hotplugged(Object *obj, Error **err)
1131 DeviceState *dev = DEVICE(obj);
1133 return dev->hotplugged;
1136 static void device_set_hotplugged(Object *obj, bool value, Error **err)
1138 DeviceState *dev = DEVICE(obj);
1140 dev->hotplugged = value;
1143 static void device_initfn(Object *obj)
1145 DeviceState *dev = DEVICE(obj);
1146 ObjectClass *class;
1147 Property *prop;
1149 if (qdev_hotplug) {
1150 dev->hotplugged = 1;
1151 qdev_hot_added = true;
1154 dev->instance_id_alias = -1;
1155 dev->realized = false;
1157 object_property_add_bool(obj, "realized",
1158 device_get_realized, device_set_realized, NULL);
1159 object_property_add_bool(obj, "hotpluggable",
1160 device_get_hotpluggable, NULL, NULL);
1161 object_property_add_bool(obj, "hotplugged",
1162 device_get_hotplugged, device_set_hotplugged,
1163 &error_abort);
1165 class = object_get_class(OBJECT(dev));
1166 do {
1167 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
1168 qdev_property_add_legacy(dev, prop, &error_abort);
1169 qdev_property_add_static(dev, prop, &error_abort);
1171 class = object_class_get_parent(class);
1172 } while (class != object_class_by_name(TYPE_DEVICE));
1174 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
1175 (Object **)&dev->parent_bus, NULL, 0,
1176 &error_abort);
1177 QLIST_INIT(&dev->gpios);
1180 static void device_post_init(Object *obj)
1182 Error *err = NULL;
1183 qdev_prop_set_globals(DEVICE(obj), &err);
1184 if (err) {
1185 qerror_report_err(err);
1186 error_free(err);
1187 exit(EXIT_FAILURE);
1191 /* Unlink device from bus and free the structure. */
1192 static void device_finalize(Object *obj)
1194 NamedGPIOList *ngl, *next;
1196 DeviceState *dev = DEVICE(obj);
1197 qemu_opts_del(dev->opts);
1199 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1200 QLIST_REMOVE(ngl, node);
1201 qemu_free_irqs(ngl->in, ngl->num_in);
1202 g_free(ngl->name);
1203 g_free(ngl);
1204 /* ngl->out irqs are owned by the other end and should not be freed
1205 * here
1210 static void device_class_base_init(ObjectClass *class, void *data)
1212 DeviceClass *klass = DEVICE_CLASS(class);
1214 /* We explicitly look up properties in the superclasses,
1215 * so do not propagate them to the subclasses.
1217 klass->props = NULL;
1220 static void device_unparent(Object *obj)
1222 DeviceState *dev = DEVICE(obj);
1223 BusState *bus;
1225 if (dev->realized) {
1226 object_property_set_bool(obj, false, "realized", NULL);
1228 while (dev->num_child_bus) {
1229 bus = QLIST_FIRST(&dev->child_bus);
1230 object_unparent(OBJECT(bus));
1232 if (dev->parent_bus) {
1233 bus_remove_child(dev->parent_bus, dev);
1234 object_unref(OBJECT(dev->parent_bus));
1235 dev->parent_bus = NULL;
1238 /* Only send event if the device had been completely realized */
1239 if (dev->pending_deleted_event) {
1240 gchar *path = object_get_canonical_path(OBJECT(dev));
1242 qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
1243 g_free(path);
1247 static void device_class_init(ObjectClass *class, void *data)
1249 DeviceClass *dc = DEVICE_CLASS(class);
1251 class->unparent = device_unparent;
1252 dc->realize = device_realize;
1253 dc->unrealize = device_unrealize;
1255 /* by default all devices were considered as hotpluggable,
1256 * so with intent to check it in generic qdev_unplug() /
1257 * device_set_realized() functions make every device
1258 * hotpluggable. Devices that shouldn't be hotpluggable,
1259 * should override it in their class_init()
1261 dc->hotpluggable = true;
1264 void device_reset(DeviceState *dev)
1266 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1268 if (klass->reset) {
1269 klass->reset(dev);
1273 Object *qdev_get_machine(void)
1275 static Object *dev;
1277 if (dev == NULL) {
1278 dev = container_get(object_get_root(), "/machine");
1281 return dev;
1284 static const TypeInfo device_type_info = {
1285 .name = TYPE_DEVICE,
1286 .parent = TYPE_OBJECT,
1287 .instance_size = sizeof(DeviceState),
1288 .instance_init = device_initfn,
1289 .instance_post_init = device_post_init,
1290 .instance_finalize = device_finalize,
1291 .class_base_init = device_class_base_init,
1292 .class_init = device_class_init,
1293 .abstract = true,
1294 .class_size = sizeof(DeviceClass),
1297 static void qbus_initfn(Object *obj)
1299 BusState *bus = BUS(obj);
1301 QTAILQ_INIT(&bus->children);
1302 object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY,
1303 TYPE_HOTPLUG_HANDLER,
1304 (Object **)&bus->hotplug_handler,
1305 object_property_allow_set_link,
1306 OBJ_PROP_LINK_UNREF_ON_RELEASE,
1307 NULL);
1308 object_property_add_bool(obj, "realized",
1309 bus_get_realized, bus_set_realized, NULL);
1312 static char *default_bus_get_fw_dev_path(DeviceState *dev)
1314 return g_strdup(object_get_typename(OBJECT(dev)));
1317 static void bus_class_init(ObjectClass *class, void *data)
1319 BusClass *bc = BUS_CLASS(class);
1321 class->unparent = bus_unparent;
1322 bc->get_fw_dev_path = default_bus_get_fw_dev_path;
1325 static void qbus_finalize(Object *obj)
1327 BusState *bus = BUS(obj);
1329 g_free((char *)bus->name);
1332 static const TypeInfo bus_info = {
1333 .name = TYPE_BUS,
1334 .parent = TYPE_OBJECT,
1335 .instance_size = sizeof(BusState),
1336 .abstract = true,
1337 .class_size = sizeof(BusClass),
1338 .instance_init = qbus_initfn,
1339 .instance_finalize = qbus_finalize,
1340 .class_init = bus_class_init,
1343 static void qdev_register_types(void)
1345 type_register_static(&bus_info);
1346 type_register_static(&device_type_info);
1349 type_init(qdev_register_types)