Add qemu_get_buffer_in_place to avoid copies some of the time
[qemu/ar7.git] / hw / core / qdev.c
blob4ab04aa31e788ccc7b38597fec14c95aed1f8879
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 "qemu/error-report.h"
36 #include "hw/hotplug.h"
37 #include "hw/boards.h"
38 #include "qapi-event.h"
40 int qdev_hotplug = 0;
41 static bool qdev_hot_added = false;
42 static bool qdev_hot_removed = false;
44 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
46 DeviceClass *dc = DEVICE_GET_CLASS(dev);
47 return dc->vmsd;
50 const char *qdev_fw_name(DeviceState *dev)
52 DeviceClass *dc = DEVICE_GET_CLASS(dev);
54 if (dc->fw_name) {
55 return dc->fw_name;
58 return object_get_typename(OBJECT(dev));
61 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
62 Error **errp);
64 static void bus_remove_child(BusState *bus, DeviceState *child)
66 BusChild *kid;
68 QTAILQ_FOREACH(kid, &bus->children, sibling) {
69 if (kid->child == child) {
70 char name[32];
72 snprintf(name, sizeof(name), "child[%d]", kid->index);
73 QTAILQ_REMOVE(&bus->children, kid, sibling);
75 /* This gives back ownership of kid->child back to us. */
76 object_property_del(OBJECT(bus), name, NULL);
77 object_unref(OBJECT(kid->child));
78 g_free(kid);
79 return;
84 static void bus_add_child(BusState *bus, DeviceState *child)
86 char name[32];
87 BusChild *kid = g_malloc0(sizeof(*kid));
89 kid->index = bus->max_index++;
90 kid->child = child;
91 object_ref(OBJECT(kid->child));
93 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
95 /* This transfers ownership of kid->child to the property. */
96 snprintf(name, sizeof(name), "child[%d]", kid->index);
97 object_property_add_link(OBJECT(bus), name,
98 object_get_typename(OBJECT(child)),
99 (Object **)&kid->child,
100 NULL, /* read-only property */
101 0, /* return ownership on prop deletion */
102 NULL);
105 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
107 dev->parent_bus = bus;
108 object_ref(OBJECT(bus));
109 bus_add_child(bus, dev);
112 static void qbus_set_hotplug_handler_internal(BusState *bus, Object *handler,
113 Error **errp)
116 object_property_set_link(OBJECT(bus), OBJECT(handler),
117 QDEV_HOTPLUG_HANDLER_PROPERTY, errp);
120 void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler, Error **errp)
122 qbus_set_hotplug_handler_internal(bus, OBJECT(handler), errp);
125 void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp)
127 qbus_set_hotplug_handler_internal(bus, OBJECT(bus), errp);
130 /* Create a new device. This only initializes the device state
131 structure and allows properties to be set. The device still needs
132 to be realized. See qdev-core.h. */
133 DeviceState *qdev_create(BusState *bus, const char *name)
135 DeviceState *dev;
137 dev = qdev_try_create(bus, name);
138 if (!dev) {
139 if (bus) {
140 error_report("Unknown device '%s' for bus '%s'", name,
141 object_get_typename(OBJECT(bus)));
142 } else {
143 error_report("Unknown device '%s' for default sysbus", name);
145 abort();
148 return dev;
151 DeviceState *qdev_try_create(BusState *bus, const char *type)
153 DeviceState *dev;
155 if (object_class_by_name(type) == NULL) {
156 return NULL;
158 dev = DEVICE(object_new(type));
159 if (!dev) {
160 return NULL;
163 if (!bus) {
164 bus = sysbus_get_default();
167 qdev_set_parent_bus(dev, bus);
168 object_unref(OBJECT(dev));
169 return dev;
172 static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
173 = QTAILQ_HEAD_INITIALIZER(device_listeners);
175 enum ListenerDirection { Forward, Reverse };
177 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
178 do { \
179 DeviceListener *_listener; \
181 switch (_direction) { \
182 case Forward: \
183 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
184 if (_listener->_callback) { \
185 _listener->_callback(_listener, ##_args); \
188 break; \
189 case Reverse: \
190 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
191 device_listeners, link) { \
192 if (_listener->_callback) { \
193 _listener->_callback(_listener, ##_args); \
196 break; \
197 default: \
198 abort(); \
200 } while (0)
202 static int device_listener_add(DeviceState *dev, void *opaque)
204 DEVICE_LISTENER_CALL(realize, Forward, dev);
206 return 0;
209 void device_listener_register(DeviceListener *listener)
211 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
213 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
214 NULL, NULL);
217 void device_listener_unregister(DeviceListener *listener)
219 QTAILQ_REMOVE(&device_listeners, listener, link);
222 static void device_realize(DeviceState *dev, Error **errp)
224 DeviceClass *dc = DEVICE_GET_CLASS(dev);
226 if (dc->init) {
227 int rc = dc->init(dev);
228 if (rc < 0) {
229 error_setg(errp, "Device initialization failed.");
230 return;
235 static void device_unrealize(DeviceState *dev, Error **errp)
237 DeviceClass *dc = DEVICE_GET_CLASS(dev);
239 if (dc->exit) {
240 int rc = dc->exit(dev);
241 if (rc < 0) {
242 error_setg(errp, "Device exit failed.");
243 return;
248 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
249 int required_for_version)
251 assert(!dev->realized);
252 dev->instance_id_alias = alias_id;
253 dev->alias_required_for_version = required_for_version;
256 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
258 HotplugHandler *hotplug_ctrl = NULL;
260 if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
261 hotplug_ctrl = dev->parent_bus->hotplug_handler;
262 } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
263 MachineState *machine = MACHINE(qdev_get_machine());
264 MachineClass *mc = MACHINE_GET_CLASS(machine);
266 if (mc->get_hotplug_handler) {
267 hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
270 return hotplug_ctrl;
273 void qdev_unplug(DeviceState *dev, Error **errp)
275 DeviceClass *dc = DEVICE_GET_CLASS(dev);
276 HotplugHandler *hotplug_ctrl;
277 HotplugHandlerClass *hdc;
279 if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
280 error_setg(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
281 return;
284 if (!dc->hotpluggable) {
285 error_setg(errp, QERR_DEVICE_NO_HOTPLUG,
286 object_get_typename(OBJECT(dev)));
287 return;
290 qdev_hot_removed = true;
292 hotplug_ctrl = qdev_get_hotplug_handler(dev);
293 /* hotpluggable device MUST have HotplugHandler, if it doesn't
294 * then something is very wrong with it */
295 g_assert(hotplug_ctrl);
297 /* If device supports async unplug just request it to be done,
298 * otherwise just remove it synchronously */
299 hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl);
300 if (hdc->unplug_request) {
301 hotplug_handler_unplug_request(hotplug_ctrl, dev, errp);
302 } else {
303 hotplug_handler_unplug(hotplug_ctrl, dev, errp);
307 static int qdev_reset_one(DeviceState *dev, void *opaque)
309 device_reset(dev);
311 return 0;
314 static int qbus_reset_one(BusState *bus, void *opaque)
316 BusClass *bc = BUS_GET_CLASS(bus);
317 if (bc->reset) {
318 bc->reset(bus);
320 return 0;
323 void qdev_reset_all(DeviceState *dev)
325 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
328 void qbus_reset_all(BusState *bus)
330 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
333 void qbus_reset_all_fn(void *opaque)
335 BusState *bus = opaque;
336 qbus_reset_all(bus);
339 /* can be used as ->unplug() callback for the simple cases */
340 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
341 DeviceState *dev, Error **errp)
343 /* just zap it */
344 object_unparent(OBJECT(dev));
348 * Realize @dev.
349 * Device properties should be set before calling this function. IRQs
350 * and MMIO regions should be connected/mapped after calling this
351 * function.
352 * On failure, report an error with error_report() and terminate the
353 * program. This is okay during machine creation. Don't use for
354 * hotplug, because there callers need to recover from failure.
355 * Exception: if you know the device's init() callback can't fail,
356 * then qdev_init_nofail() can't fail either, and is therefore usable
357 * even then. But relying on the device implementation that way is
358 * somewhat unclean, and best avoided.
360 void qdev_init_nofail(DeviceState *dev)
362 Error *err = NULL;
364 assert(!dev->realized);
366 object_property_set_bool(OBJECT(dev), true, "realized", &err);
367 if (err) {
368 error_report("Initialization of device %s failed: %s",
369 object_get_typename(OBJECT(dev)),
370 error_get_pretty(err));
371 exit(1);
375 void qdev_machine_creation_done(void)
378 * ok, initial machine setup is done, starting from now we can
379 * only create hotpluggable devices
381 qdev_hotplug = 1;
384 bool qdev_machine_modified(void)
386 return qdev_hot_added || qdev_hot_removed;
389 BusState *qdev_get_parent_bus(DeviceState *dev)
391 return dev->parent_bus;
394 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
395 const char *name)
397 NamedGPIOList *ngl;
399 QLIST_FOREACH(ngl, &dev->gpios, node) {
400 /* NULL is a valid and matchable name, otherwise do a normal
401 * strcmp match.
403 if ((!ngl->name && !name) ||
404 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
405 return ngl;
409 ngl = g_malloc0(sizeof(*ngl));
410 ngl->name = g_strdup(name);
411 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
412 return ngl;
415 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
416 const char *name, int n)
418 int i;
419 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
421 assert(gpio_list->num_out == 0 || !name);
422 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
423 dev, n);
425 if (!name) {
426 name = "unnamed-gpio-in";
428 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
429 gchar *propname = g_strdup_printf("%s[%u]", name, i);
431 object_property_add_child(OBJECT(dev), propname,
432 OBJECT(gpio_list->in[i]), &error_abort);
433 g_free(propname);
436 gpio_list->num_in += n;
439 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
441 qdev_init_gpio_in_named(dev, handler, NULL, n);
444 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
445 const char *name, int n)
447 int i;
448 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
450 assert(gpio_list->num_in == 0 || !name);
452 if (!name) {
453 name = "unnamed-gpio-out";
455 memset(pins, 0, sizeof(*pins) * n);
456 for (i = 0; i < n; ++i) {
457 gchar *propname = g_strdup_printf("%s[%u]", name,
458 gpio_list->num_out + i);
460 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
461 (Object **)&pins[i],
462 object_property_allow_set_link,
463 OBJ_PROP_LINK_UNREF_ON_RELEASE,
464 &error_abort);
465 g_free(propname);
467 gpio_list->num_out += n;
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(container_get(qdev_get_machine(),
500 "/unattached"),
501 "non-qdev-gpio[*]", OBJECT(pin), NULL);
503 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
504 g_free(propname);
507 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
509 char *propname = g_strdup_printf("%s[%d]",
510 name ? name : "unnamed-gpio-out", n);
512 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
513 NULL);
515 return ret;
518 /* disconnect a GPIO output, returning the disconnected input (if any) */
520 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
521 const char *name, int n)
523 char *propname = g_strdup_printf("%s[%d]",
524 name ? name : "unnamed-gpio-out", n);
526 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
527 NULL);
528 if (ret) {
529 object_property_set_link(OBJECT(dev), NULL, propname, NULL);
531 g_free(propname);
532 return ret;
535 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
536 const char *name, int n)
538 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
539 qdev_connect_gpio_out_named(dev, name, n, icpt);
540 return disconnected;
543 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
545 qdev_connect_gpio_out_named(dev, NULL, n, pin);
548 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
549 const char *name)
551 int i;
552 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
554 for (i = 0; i < ngl->num_in; i++) {
555 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
556 char *propname = g_strdup_printf("%s[%d]", nm, i);
558 object_property_add_alias(OBJECT(container), propname,
559 OBJECT(dev), propname,
560 &error_abort);
561 g_free(propname);
563 for (i = 0; i < ngl->num_out; i++) {
564 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
565 char *propname = g_strdup_printf("%s[%d]", nm, i);
567 object_property_add_alias(OBJECT(container), propname,
568 OBJECT(dev), propname,
569 &error_abort);
570 g_free(propname);
572 QLIST_REMOVE(ngl, node);
573 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
576 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
578 BusState *bus;
580 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
581 if (strcmp(name, bus->name) == 0) {
582 return bus;
585 return NULL;
588 int qbus_walk_children(BusState *bus,
589 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
590 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
591 void *opaque)
593 BusChild *kid;
594 int err;
596 if (pre_busfn) {
597 err = pre_busfn(bus, opaque);
598 if (err) {
599 return err;
603 QTAILQ_FOREACH(kid, &bus->children, sibling) {
604 err = qdev_walk_children(kid->child,
605 pre_devfn, pre_busfn,
606 post_devfn, post_busfn, opaque);
607 if (err < 0) {
608 return err;
612 if (post_busfn) {
613 err = post_busfn(bus, opaque);
614 if (err) {
615 return err;
619 return 0;
622 int qdev_walk_children(DeviceState *dev,
623 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
624 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
625 void *opaque)
627 BusState *bus;
628 int err;
630 if (pre_devfn) {
631 err = pre_devfn(dev, opaque);
632 if (err) {
633 return err;
637 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
638 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
639 post_devfn, post_busfn, opaque);
640 if (err < 0) {
641 return err;
645 if (post_devfn) {
646 err = post_devfn(dev, opaque);
647 if (err) {
648 return err;
652 return 0;
655 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
657 BusChild *kid;
658 DeviceState *ret;
659 BusState *child;
661 QTAILQ_FOREACH(kid, &bus->children, sibling) {
662 DeviceState *dev = kid->child;
664 if (dev->id && strcmp(dev->id, id) == 0) {
665 return dev;
668 QLIST_FOREACH(child, &dev->child_bus, sibling) {
669 ret = qdev_find_recursive(child, id);
670 if (ret) {
671 return ret;
675 return NULL;
678 static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
680 const char *typename = object_get_typename(OBJECT(bus));
681 BusClass *bc;
682 char *buf;
683 int i, len, bus_id;
685 bus->parent = parent;
687 if (name) {
688 bus->name = g_strdup(name);
689 } else if (bus->parent && bus->parent->id) {
690 /* parent device has id -> use it plus parent-bus-id for bus name */
691 bus_id = bus->parent->num_child_bus;
693 len = strlen(bus->parent->id) + 16;
694 buf = g_malloc(len);
695 snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
696 bus->name = buf;
697 } else {
698 /* no id -> use lowercase bus type plus global bus-id for bus name */
699 bc = BUS_GET_CLASS(bus);
700 bus_id = bc->automatic_ids++;
702 len = strlen(typename) + 16;
703 buf = g_malloc(len);
704 len = snprintf(buf, len, "%s.%d", typename, bus_id);
705 for (i = 0; i < len; i++) {
706 buf[i] = qemu_tolower(buf[i]);
708 bus->name = buf;
711 if (bus->parent) {
712 QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
713 bus->parent->num_child_bus++;
714 object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL);
715 object_unref(OBJECT(bus));
716 } else if (bus != sysbus_get_default()) {
717 /* TODO: once all bus devices are qdevified,
718 only reset handler for main_system_bus should be registered here. */
719 qemu_register_reset(qbus_reset_all_fn, bus);
723 static void bus_unparent(Object *obj)
725 BusState *bus = BUS(obj);
726 BusChild *kid;
728 while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
729 DeviceState *dev = kid->child;
730 object_unparent(OBJECT(dev));
732 if (bus->parent) {
733 QLIST_REMOVE(bus, sibling);
734 bus->parent->num_child_bus--;
735 bus->parent = NULL;
736 } else {
737 assert(bus != sysbus_get_default()); /* main_system_bus is never freed */
738 qemu_unregister_reset(qbus_reset_all_fn, bus);
742 static bool bus_get_realized(Object *obj, Error **errp)
744 BusState *bus = BUS(obj);
746 return bus->realized;
749 static void bus_set_realized(Object *obj, bool value, Error **errp)
751 BusState *bus = BUS(obj);
752 BusClass *bc = BUS_GET_CLASS(bus);
753 BusChild *kid;
754 Error *local_err = NULL;
756 if (value && !bus->realized) {
757 if (bc->realize) {
758 bc->realize(bus, &local_err);
761 /* TODO: recursive realization */
762 } else if (!value && bus->realized) {
763 QTAILQ_FOREACH(kid, &bus->children, sibling) {
764 DeviceState *dev = kid->child;
765 object_property_set_bool(OBJECT(dev), false, "realized",
766 &local_err);
767 if (local_err != NULL) {
768 break;
771 if (bc->unrealize && local_err == NULL) {
772 bc->unrealize(bus, &local_err);
776 if (local_err != NULL) {
777 error_propagate(errp, local_err);
778 return;
781 bus->realized = value;
784 void qbus_create_inplace(void *bus, size_t size, const char *typename,
785 DeviceState *parent, const char *name)
787 object_initialize(bus, size, typename);
788 qbus_realize(bus, parent, name);
791 BusState *qbus_create(const char *typename, DeviceState *parent, const char *name)
793 BusState *bus;
795 bus = BUS(object_new(typename));
796 qbus_realize(bus, parent, name);
798 return bus;
801 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
803 BusClass *bc = BUS_GET_CLASS(bus);
805 if (bc->get_fw_dev_path) {
806 return bc->get_fw_dev_path(dev);
809 return NULL;
812 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
814 Object *obj = OBJECT(dev);
815 char *d = NULL;
817 while (!d && obj->parent) {
818 obj = obj->parent;
819 d = fw_path_provider_try_get_dev_path(obj, bus, dev);
821 return d;
824 char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
826 Object *obj = OBJECT(dev);
828 return fw_path_provider_try_get_dev_path(obj, bus, dev);
831 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
833 int l = 0;
835 if (dev && dev->parent_bus) {
836 char *d;
837 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
838 d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
839 if (!d) {
840 d = bus_get_fw_dev_path(dev->parent_bus, dev);
842 if (d) {
843 l += snprintf(p + l, size - l, "%s", d);
844 g_free(d);
845 } else {
846 return l;
849 l += snprintf(p + l , size - l, "/");
851 return l;
854 char* qdev_get_fw_dev_path(DeviceState *dev)
856 char path[128];
857 int l;
859 l = qdev_get_fw_dev_path_helper(dev, path, 128);
861 path[l-1] = '\0';
863 return g_strdup(path);
866 char *qdev_get_dev_path(DeviceState *dev)
868 BusClass *bc;
870 if (!dev || !dev->parent_bus) {
871 return NULL;
874 bc = BUS_GET_CLASS(dev->parent_bus);
875 if (bc->get_dev_path) {
876 return bc->get_dev_path(dev);
879 return NULL;
883 * Legacy property handling
886 static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque,
887 const char *name, Error **errp)
889 DeviceState *dev = DEVICE(obj);
890 Property *prop = opaque;
892 char buffer[1024];
893 char *ptr = buffer;
895 prop->info->print(dev, prop, buffer, sizeof(buffer));
896 visit_type_str(v, &ptr, name, errp);
900 * @qdev_add_legacy_property - adds a legacy property
902 * Do not use this is new code! Properties added through this interface will
903 * be given names and types in the "legacy" namespace.
905 * Legacy properties are string versions of other OOM properties. The format
906 * of the string depends on the property type.
908 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
909 Error **errp)
911 gchar *name;
913 /* Register pointer properties as legacy properties */
914 if (!prop->info->print && prop->info->get) {
915 return;
918 name = g_strdup_printf("legacy-%s", prop->name);
919 object_property_add(OBJECT(dev), name, "str",
920 prop->info->print ? qdev_get_legacy_property : prop->info->get,
921 NULL,
922 NULL,
923 prop, errp);
925 g_free(name);
929 * @qdev_property_add_static - add a @Property to a device.
931 * Static properties access data in a struct. The actual type of the
932 * property and the field depends on the property type.
934 void qdev_property_add_static(DeviceState *dev, Property *prop,
935 Error **errp)
937 Error *local_err = NULL;
938 Object *obj = OBJECT(dev);
941 * TODO qdev_prop_ptr does not have getters or setters. It must
942 * go now that it can be replaced with links. The test should be
943 * removed along with it: all static properties are read/write.
945 if (!prop->info->get && !prop->info->set) {
946 return;
949 object_property_add(obj, prop->name, prop->info->name,
950 prop->info->get, prop->info->set,
951 prop->info->release,
952 prop, &local_err);
954 if (local_err) {
955 error_propagate(errp, local_err);
956 return;
959 object_property_set_description(obj, prop->name,
960 prop->info->description,
961 &error_abort);
963 if (prop->qtype == QTYPE_NONE) {
964 return;
967 if (prop->qtype == QTYPE_QBOOL) {
968 object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
969 } else if (prop->info->enum_table) {
970 object_property_set_str(obj, prop->info->enum_table[prop->defval],
971 prop->name, &error_abort);
972 } else if (prop->qtype == QTYPE_QINT) {
973 object_property_set_int(obj, prop->defval, prop->name, &error_abort);
977 /* @qdev_alias_all_properties - Add alias properties to the source object for
978 * all qdev properties on the target DeviceState.
980 void qdev_alias_all_properties(DeviceState *target, Object *source)
982 ObjectClass *class;
983 Property *prop;
985 class = object_get_class(OBJECT(target));
986 do {
987 DeviceClass *dc = DEVICE_CLASS(class);
989 for (prop = dc->props; prop && prop->name; prop++) {
990 object_property_add_alias(source, prop->name,
991 OBJECT(target), prop->name,
992 &error_abort);
994 class = object_class_get_parent(class);
995 } while (class != object_class_by_name(TYPE_DEVICE));
998 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
1000 GSList **list = opaque;
1001 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
1002 TYPE_DEVICE);
1004 if (dev == NULL) {
1005 return 0;
1008 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
1009 *list = g_slist_append(*list, dev);
1012 return 0;
1015 GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
1017 GSList *list = NULL;
1019 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
1021 return list;
1024 static bool device_get_realized(Object *obj, Error **errp)
1026 DeviceState *dev = DEVICE(obj);
1027 return dev->realized;
1030 static void device_set_realized(Object *obj, bool value, Error **errp)
1032 DeviceState *dev = DEVICE(obj);
1033 DeviceClass *dc = DEVICE_GET_CLASS(dev);
1034 HotplugHandler *hotplug_ctrl;
1035 BusState *bus;
1036 Error *local_err = NULL;
1038 if (dev->hotplugged && !dc->hotpluggable) {
1039 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
1040 return;
1043 if (value && !dev->realized) {
1044 if (!obj->parent) {
1045 static int unattached_count;
1046 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
1048 object_property_add_child(container_get(qdev_get_machine(),
1049 "/unattached"),
1050 name, obj, &error_abort);
1051 g_free(name);
1054 if (dc->realize) {
1055 dc->realize(dev, &local_err);
1058 if (local_err != NULL) {
1059 goto fail;
1062 DEVICE_LISTENER_CALL(realize, Forward, dev);
1064 hotplug_ctrl = qdev_get_hotplug_handler(dev);
1065 if (hotplug_ctrl) {
1066 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
1069 if (local_err != NULL) {
1070 goto post_realize_fail;
1073 if (qdev_get_vmsd(dev)) {
1074 vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
1075 dev->instance_id_alias,
1076 dev->alias_required_for_version);
1079 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1080 object_property_set_bool(OBJECT(bus), true, "realized",
1081 &local_err);
1082 if (local_err != NULL) {
1083 goto child_realize_fail;
1086 if (dev->hotplugged) {
1087 device_reset(dev);
1089 dev->pending_deleted_event = false;
1090 } else if (!value && dev->realized) {
1091 Error **local_errp = NULL;
1092 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1093 local_errp = local_err ? NULL : &local_err;
1094 object_property_set_bool(OBJECT(bus), false, "realized",
1095 local_errp);
1097 if (qdev_get_vmsd(dev)) {
1098 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1100 if (dc->unrealize) {
1101 local_errp = local_err ? NULL : &local_err;
1102 dc->unrealize(dev, local_errp);
1104 dev->pending_deleted_event = true;
1105 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
1108 if (local_err != NULL) {
1109 goto fail;
1112 dev->realized = value;
1113 return;
1115 child_realize_fail:
1116 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1117 object_property_set_bool(OBJECT(bus), false, "realized",
1118 NULL);
1121 if (qdev_get_vmsd(dev)) {
1122 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1125 post_realize_fail:
1126 if (dc->unrealize) {
1127 dc->unrealize(dev, NULL);
1130 fail:
1131 error_propagate(errp, local_err);
1132 return;
1135 static bool device_get_hotpluggable(Object *obj, Error **errp)
1137 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1138 DeviceState *dev = DEVICE(obj);
1140 return dc->hotpluggable && (dev->parent_bus == NULL ||
1141 qbus_is_hotpluggable(dev->parent_bus));
1144 static bool device_get_hotplugged(Object *obj, Error **err)
1146 DeviceState *dev = DEVICE(obj);
1148 return dev->hotplugged;
1151 static void device_set_hotplugged(Object *obj, bool value, Error **err)
1153 DeviceState *dev = DEVICE(obj);
1155 dev->hotplugged = value;
1158 static void device_initfn(Object *obj)
1160 DeviceState *dev = DEVICE(obj);
1161 ObjectClass *class;
1162 Property *prop;
1164 if (qdev_hotplug) {
1165 dev->hotplugged = 1;
1166 qdev_hot_added = true;
1169 dev->instance_id_alias = -1;
1170 dev->realized = false;
1172 object_property_add_bool(obj, "realized",
1173 device_get_realized, device_set_realized, NULL);
1174 object_property_add_bool(obj, "hotpluggable",
1175 device_get_hotpluggable, NULL, NULL);
1176 object_property_add_bool(obj, "hotplugged",
1177 device_get_hotplugged, device_set_hotplugged,
1178 &error_abort);
1180 class = object_get_class(OBJECT(dev));
1181 do {
1182 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
1183 qdev_property_add_legacy(dev, prop, &error_abort);
1184 qdev_property_add_static(dev, prop, &error_abort);
1186 class = object_class_get_parent(class);
1187 } while (class != object_class_by_name(TYPE_DEVICE));
1189 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
1190 (Object **)&dev->parent_bus, NULL, 0,
1191 &error_abort);
1192 QLIST_INIT(&dev->gpios);
1195 static void device_post_init(Object *obj)
1197 qdev_prop_set_globals(DEVICE(obj));
1200 /* Unlink device from bus and free the structure. */
1201 static void device_finalize(Object *obj)
1203 NamedGPIOList *ngl, *next;
1205 DeviceState *dev = DEVICE(obj);
1206 qemu_opts_del(dev->opts);
1208 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1209 QLIST_REMOVE(ngl, node);
1210 qemu_free_irqs(ngl->in, ngl->num_in);
1211 g_free(ngl->name);
1212 g_free(ngl);
1213 /* ngl->out irqs are owned by the other end and should not be freed
1214 * here
1219 static void device_class_base_init(ObjectClass *class, void *data)
1221 DeviceClass *klass = DEVICE_CLASS(class);
1223 /* We explicitly look up properties in the superclasses,
1224 * so do not propagate them to the subclasses.
1226 klass->props = NULL;
1229 static void device_unparent(Object *obj)
1231 DeviceState *dev = DEVICE(obj);
1232 BusState *bus;
1234 if (dev->realized) {
1235 object_property_set_bool(obj, false, "realized", NULL);
1237 while (dev->num_child_bus) {
1238 bus = QLIST_FIRST(&dev->child_bus);
1239 object_unparent(OBJECT(bus));
1241 if (dev->parent_bus) {
1242 bus_remove_child(dev->parent_bus, dev);
1243 object_unref(OBJECT(dev->parent_bus));
1244 dev->parent_bus = NULL;
1247 /* Only send event if the device had been completely realized */
1248 if (dev->pending_deleted_event) {
1249 gchar *path = object_get_canonical_path(OBJECT(dev));
1251 qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
1252 g_free(path);
1256 static void device_class_init(ObjectClass *class, void *data)
1258 DeviceClass *dc = DEVICE_CLASS(class);
1260 class->unparent = device_unparent;
1261 dc->realize = device_realize;
1262 dc->unrealize = device_unrealize;
1264 /* by default all devices were considered as hotpluggable,
1265 * so with intent to check it in generic qdev_unplug() /
1266 * device_set_realized() functions make every device
1267 * hotpluggable. Devices that shouldn't be hotpluggable,
1268 * should override it in their class_init()
1270 dc->hotpluggable = true;
1273 void device_reset(DeviceState *dev)
1275 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1277 if (klass->reset) {
1278 klass->reset(dev);
1282 Object *qdev_get_machine(void)
1284 static Object *dev;
1286 if (dev == NULL) {
1287 dev = container_get(object_get_root(), "/machine");
1290 return dev;
1293 static const TypeInfo device_type_info = {
1294 .name = TYPE_DEVICE,
1295 .parent = TYPE_OBJECT,
1296 .instance_size = sizeof(DeviceState),
1297 .instance_init = device_initfn,
1298 .instance_post_init = device_post_init,
1299 .instance_finalize = device_finalize,
1300 .class_base_init = device_class_base_init,
1301 .class_init = device_class_init,
1302 .abstract = true,
1303 .class_size = sizeof(DeviceClass),
1306 static void qbus_initfn(Object *obj)
1308 BusState *bus = BUS(obj);
1310 QTAILQ_INIT(&bus->children);
1311 object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY,
1312 TYPE_HOTPLUG_HANDLER,
1313 (Object **)&bus->hotplug_handler,
1314 object_property_allow_set_link,
1315 OBJ_PROP_LINK_UNREF_ON_RELEASE,
1316 NULL);
1317 object_property_add_bool(obj, "realized",
1318 bus_get_realized, bus_set_realized, NULL);
1321 static char *default_bus_get_fw_dev_path(DeviceState *dev)
1323 return g_strdup(object_get_typename(OBJECT(dev)));
1326 static void bus_class_init(ObjectClass *class, void *data)
1328 BusClass *bc = BUS_CLASS(class);
1330 class->unparent = bus_unparent;
1331 bc->get_fw_dev_path = default_bus_get_fw_dev_path;
1334 static void qbus_finalize(Object *obj)
1336 BusState *bus = BUS(obj);
1338 g_free((char *)bus->name);
1341 static const TypeInfo bus_info = {
1342 .name = TYPE_BUS,
1343 .parent = TYPE_OBJECT,
1344 .instance_size = sizeof(BusState),
1345 .abstract = true,
1346 .class_size = sizeof(BusClass),
1347 .instance_init = qbus_initfn,
1348 .instance_finalize = qbus_finalize,
1349 .class_init = bus_class_init,
1352 static void qdev_register_types(void)
1354 type_register_static(&bus_info);
1355 type_register_static(&device_type_info);
1358 type_init(qdev_register_types)