]> git.proxmox.com Git - mirror_qemu.git/blob - hw/core/qdev.c
acpi: add hardware implementation for memory hot unplug
[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 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 "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"
38
39 int qdev_hotplug = 0;
40 static bool qdev_hot_added = false;
41 static bool qdev_hot_removed = false;
42
43 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
44 {
45 DeviceClass *dc = DEVICE_GET_CLASS(dev);
46 return dc->vmsd;
47 }
48
49 const char *qdev_fw_name(DeviceState *dev)
50 {
51 DeviceClass *dc = DEVICE_GET_CLASS(dev);
52
53 if (dc->fw_name) {
54 return dc->fw_name;
55 }
56
57 return object_get_typename(OBJECT(dev));
58 }
59
60 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
61 Error **errp);
62
63 static void bus_remove_child(BusState *bus, DeviceState *child)
64 {
65 BusChild *kid;
66
67 QTAILQ_FOREACH(kid, &bus->children, sibling) {
68 if (kid->child == child) {
69 char name[32];
70
71 snprintf(name, sizeof(name), "child[%d]", kid->index);
72 QTAILQ_REMOVE(&bus->children, kid, sibling);
73
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;
79 }
80 }
81 }
82
83 static void bus_add_child(BusState *bus, DeviceState *child)
84 {
85 char name[32];
86 BusChild *kid = g_malloc0(sizeof(*kid));
87
88 kid->index = bus->max_index++;
89 kid->child = child;
90 object_ref(OBJECT(kid->child));
91
92 QTAILQ_INSERT_HEAD(&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, /* return ownership on prop deletion */
101 NULL);
102 }
103
104 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
105 {
106 dev->parent_bus = bus;
107 object_ref(OBJECT(bus));
108 bus_add_child(bus, dev);
109 }
110
111 static void qbus_set_hotplug_handler_internal(BusState *bus, Object *handler,
112 Error **errp)
113 {
114
115 object_property_set_link(OBJECT(bus), OBJECT(handler),
116 QDEV_HOTPLUG_HANDLER_PROPERTY, errp);
117 }
118
119 void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler, Error **errp)
120 {
121 qbus_set_hotplug_handler_internal(bus, OBJECT(handler), errp);
122 }
123
124 void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp)
125 {
126 qbus_set_hotplug_handler_internal(bus, OBJECT(bus), errp);
127 }
128
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)
133 {
134 DeviceState *dev;
135
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);
143 }
144 abort();
145 }
146
147 return dev;
148 }
149
150 DeviceState *qdev_try_create(BusState *bus, const char *type)
151 {
152 DeviceState *dev;
153
154 if (object_class_by_name(type) == NULL) {
155 return NULL;
156 }
157 dev = DEVICE(object_new(type));
158 if (!dev) {
159 return NULL;
160 }
161
162 if (!bus) {
163 bus = sysbus_get_default();
164 }
165
166 qdev_set_parent_bus(dev, bus);
167 object_unref(OBJECT(dev));
168 return dev;
169 }
170
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)
177 {
178 Error *local_err = NULL;
179
180 assert(!dev->realized);
181
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;
188 }
189 return 0;
190 }
191
192 static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
193 = QTAILQ_HEAD_INITIALIZER(device_listeners);
194
195 enum ListenerDirection { Forward, Reverse };
196
197 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
198 do { \
199 DeviceListener *_listener; \
200 \
201 switch (_direction) { \
202 case Forward: \
203 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
204 if (_listener->_callback) { \
205 _listener->_callback(_listener, ##_args); \
206 } \
207 } \
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); \
214 } \
215 } \
216 break; \
217 default: \
218 abort(); \
219 } \
220 } while (0)
221
222 static int device_listener_add(DeviceState *dev, void *opaque)
223 {
224 DEVICE_LISTENER_CALL(realize, Forward, dev);
225
226 return 0;
227 }
228
229 void device_listener_register(DeviceListener *listener)
230 {
231 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
232
233 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
234 NULL, NULL);
235 }
236
237 void device_listener_unregister(DeviceListener *listener)
238 {
239 QTAILQ_REMOVE(&device_listeners, listener, link);
240 }
241
242 static void device_realize(DeviceState *dev, Error **errp)
243 {
244 DeviceClass *dc = DEVICE_GET_CLASS(dev);
245
246 if (dc->init) {
247 int rc = dc->init(dev);
248 if (rc < 0) {
249 error_setg(errp, "Device initialization failed.");
250 return;
251 }
252 }
253 }
254
255 static void device_unrealize(DeviceState *dev, Error **errp)
256 {
257 DeviceClass *dc = DEVICE_GET_CLASS(dev);
258
259 if (dc->exit) {
260 int rc = dc->exit(dev);
261 if (rc < 0) {
262 error_setg(errp, "Device exit failed.");
263 return;
264 }
265 }
266 }
267
268 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
269 int required_for_version)
270 {
271 assert(!dev->realized);
272 dev->instance_id_alias = alias_id;
273 dev->alias_required_for_version = required_for_version;
274 }
275
276 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
277 {
278 HotplugHandler *hotplug_ctrl = NULL;
279
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);
285
286 if (mc->get_hotplug_handler) {
287 hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
288 }
289 }
290 return hotplug_ctrl;
291 }
292
293 void qdev_unplug(DeviceState *dev, Error **errp)
294 {
295 DeviceClass *dc = DEVICE_GET_CLASS(dev);
296 HotplugHandler *hotplug_ctrl;
297 HotplugHandlerClass *hdc;
298
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;
302 }
303
304 if (!dc->hotpluggable) {
305 error_set(errp, QERR_DEVICE_NO_HOTPLUG,
306 object_get_typename(OBJECT(dev)));
307 return;
308 }
309
310 qdev_hot_removed = true;
311
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);
316
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);
324 }
325 }
326
327 static int qdev_reset_one(DeviceState *dev, void *opaque)
328 {
329 device_reset(dev);
330
331 return 0;
332 }
333
334 static int qbus_reset_one(BusState *bus, void *opaque)
335 {
336 BusClass *bc = BUS_GET_CLASS(bus);
337 if (bc->reset) {
338 bc->reset(bus);
339 }
340 return 0;
341 }
342
343 void qdev_reset_all(DeviceState *dev)
344 {
345 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
346 }
347
348 void qbus_reset_all(BusState *bus)
349 {
350 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
351 }
352
353 void qbus_reset_all_fn(void *opaque)
354 {
355 BusState *bus = opaque;
356 qbus_reset_all(bus);
357 }
358
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)
362 {
363 /* just zap it */
364 object_unparent(OBJECT(dev));
365 }
366
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)
375 {
376 Error *err = NULL;
377
378 assert(!dev->realized);
379
380 object_property_set_bool(OBJECT(dev), true, "realized", &err);
381 if (err) {
382 error_report("Initialization of device %s failed: %s",
383 object_get_typename(OBJECT(dev)),
384 error_get_pretty(err));
385 exit(1);
386 }
387 }
388
389 void qdev_machine_creation_done(void)
390 {
391 /*
392 * ok, initial machine setup is done, starting from now we can
393 * only create hotpluggable devices
394 */
395 qdev_hotplug = 1;
396 }
397
398 bool qdev_machine_modified(void)
399 {
400 return qdev_hot_added || qdev_hot_removed;
401 }
402
403 BusState *qdev_get_parent_bus(DeviceState *dev)
404 {
405 return dev->parent_bus;
406 }
407
408 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
409 const char *name)
410 {
411 NamedGPIOList *ngl;
412
413 QLIST_FOREACH(ngl, &dev->gpios, node) {
414 /* NULL is a valid and matchable name, otherwise do a normal
415 * strcmp match.
416 */
417 if ((!ngl->name && !name) ||
418 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
419 return ngl;
420 }
421 }
422
423 ngl = g_malloc0(sizeof(*ngl));
424 ngl->name = g_strdup(name);
425 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
426 return ngl;
427 }
428
429 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
430 const char *name, int n)
431 {
432 int i;
433 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
434 char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-in");
435
436 assert(gpio_list->num_out == 0 || !name);
437 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
438 dev, n);
439
440 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
441 object_property_add_child(OBJECT(dev), propname,
442 OBJECT(gpio_list->in[i]), &error_abort);
443 }
444 g_free(propname);
445
446 gpio_list->num_in += n;
447 }
448
449 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
450 {
451 qdev_init_gpio_in_named(dev, handler, NULL, n);
452 }
453
454 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
455 const char *name, int n)
456 {
457 int i;
458 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
459 char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-out");
460
461 assert(gpio_list->num_in == 0 || !name);
462 gpio_list->num_out += n;
463
464 for (i = 0; i < n; ++i) {
465 memset(&pins[i], 0, sizeof(*pins));
466 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
467 (Object **)&pins[i],
468 object_property_allow_set_link,
469 OBJ_PROP_LINK_UNREF_ON_RELEASE,
470 &error_abort);
471 }
472 g_free(propname);
473 }
474
475 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
476 {
477 qdev_init_gpio_out_named(dev, pins, NULL, n);
478 }
479
480 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
481 {
482 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
483
484 assert(n >= 0 && n < gpio_list->num_in);
485 return gpio_list->in[n];
486 }
487
488 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
489 {
490 return qdev_get_gpio_in_named(dev, NULL, n);
491 }
492
493 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
494 qemu_irq pin)
495 {
496 char *propname = g_strdup_printf("%s[%d]",
497 name ? name : "unnamed-gpio-out", n);
498 if (pin) {
499 /* We need a name for object_property_set_link to work. If the
500 * object has a parent, object_property_add_child will come back
501 * with an error without doing anything. If it has none, it will
502 * never fail. So we can just call it with a NULL Error pointer.
503 */
504 object_property_add_child(container_get(qdev_get_machine(),
505 "/unattached"),
506 "non-qdev-gpio[*]", OBJECT(pin), NULL);
507 }
508 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
509 g_free(propname);
510 }
511
512 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
513 {
514 char *propname = g_strdup_printf("%s[%d]",
515 name ? name : "unnamed-gpio-out", n);
516
517 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
518 NULL);
519
520 return ret;
521 }
522
523 /* disconnect a GPIO ouput, returning the disconnected input (if any) */
524
525 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
526 const char *name, int n)
527 {
528 char *propname = g_strdup_printf("%s[%d]",
529 name ? name : "unnamed-gpio-out", n);
530
531 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
532 NULL);
533 if (ret) {
534 object_property_set_link(OBJECT(dev), NULL, propname, NULL);
535 }
536 g_free(propname);
537 return ret;
538 }
539
540 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
541 const char *name, int n)
542 {
543 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
544 qdev_connect_gpio_out_named(dev, name, n, icpt);
545 return disconnected;
546 }
547
548 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
549 {
550 qdev_connect_gpio_out_named(dev, NULL, n, pin);
551 }
552
553 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
554 const char *name)
555 {
556 int i;
557 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
558
559 for (i = 0; i < ngl->num_in; i++) {
560 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
561 char *propname = g_strdup_printf("%s[%d]", nm, i);
562
563 object_property_add_alias(OBJECT(container), propname,
564 OBJECT(dev), propname,
565 &error_abort);
566 }
567 for (i = 0; i < ngl->num_out; i++) {
568 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
569 char *propname = g_strdup_printf("%s[%d]", nm, i);
570
571 object_property_add_alias(OBJECT(container), propname,
572 OBJECT(dev), propname,
573 &error_abort);
574 }
575 QLIST_REMOVE(ngl, node);
576 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
577 }
578
579 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
580 {
581 BusState *bus;
582
583 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
584 if (strcmp(name, bus->name) == 0) {
585 return bus;
586 }
587 }
588 return NULL;
589 }
590
591 int qbus_walk_children(BusState *bus,
592 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
593 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
594 void *opaque)
595 {
596 BusChild *kid;
597 int err;
598
599 if (pre_busfn) {
600 err = pre_busfn(bus, opaque);
601 if (err) {
602 return err;
603 }
604 }
605
606 QTAILQ_FOREACH(kid, &bus->children, sibling) {
607 err = qdev_walk_children(kid->child,
608 pre_devfn, pre_busfn,
609 post_devfn, post_busfn, opaque);
610 if (err < 0) {
611 return err;
612 }
613 }
614
615 if (post_busfn) {
616 err = post_busfn(bus, opaque);
617 if (err) {
618 return err;
619 }
620 }
621
622 return 0;
623 }
624
625 int qdev_walk_children(DeviceState *dev,
626 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
627 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
628 void *opaque)
629 {
630 BusState *bus;
631 int err;
632
633 if (pre_devfn) {
634 err = pre_devfn(dev, opaque);
635 if (err) {
636 return err;
637 }
638 }
639
640 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
641 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
642 post_devfn, post_busfn, opaque);
643 if (err < 0) {
644 return err;
645 }
646 }
647
648 if (post_devfn) {
649 err = post_devfn(dev, opaque);
650 if (err) {
651 return err;
652 }
653 }
654
655 return 0;
656 }
657
658 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
659 {
660 BusChild *kid;
661 DeviceState *ret;
662 BusState *child;
663
664 QTAILQ_FOREACH(kid, &bus->children, sibling) {
665 DeviceState *dev = kid->child;
666
667 if (dev->id && strcmp(dev->id, id) == 0) {
668 return dev;
669 }
670
671 QLIST_FOREACH(child, &dev->child_bus, sibling) {
672 ret = qdev_find_recursive(child, id);
673 if (ret) {
674 return ret;
675 }
676 }
677 }
678 return NULL;
679 }
680
681 static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
682 {
683 const char *typename = object_get_typename(OBJECT(bus));
684 BusClass *bc;
685 char *buf;
686 int i, len, bus_id;
687
688 bus->parent = parent;
689
690 if (name) {
691 bus->name = g_strdup(name);
692 } else if (bus->parent && bus->parent->id) {
693 /* parent device has id -> use it plus parent-bus-id for bus name */
694 bus_id = bus->parent->num_child_bus;
695
696 len = strlen(bus->parent->id) + 16;
697 buf = g_malloc(len);
698 snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
699 bus->name = buf;
700 } else {
701 /* no id -> use lowercase bus type plus global bus-id for bus name */
702 bc = BUS_GET_CLASS(bus);
703 bus_id = bc->automatic_ids++;
704
705 len = strlen(typename) + 16;
706 buf = g_malloc(len);
707 len = snprintf(buf, len, "%s.%d", typename, bus_id);
708 for (i = 0; i < len; i++) {
709 buf[i] = qemu_tolower(buf[i]);
710 }
711 bus->name = buf;
712 }
713
714 if (bus->parent) {
715 QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
716 bus->parent->num_child_bus++;
717 object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL);
718 object_unref(OBJECT(bus));
719 } else if (bus != sysbus_get_default()) {
720 /* TODO: once all bus devices are qdevified,
721 only reset handler for main_system_bus should be registered here. */
722 qemu_register_reset(qbus_reset_all_fn, bus);
723 }
724 }
725
726 static void bus_unparent(Object *obj)
727 {
728 BusState *bus = BUS(obj);
729 BusChild *kid;
730
731 while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
732 DeviceState *dev = kid->child;
733 object_unparent(OBJECT(dev));
734 }
735 if (bus->parent) {
736 QLIST_REMOVE(bus, sibling);
737 bus->parent->num_child_bus--;
738 bus->parent = NULL;
739 } else {
740 assert(bus != sysbus_get_default()); /* main_system_bus is never freed */
741 qemu_unregister_reset(qbus_reset_all_fn, bus);
742 }
743 }
744
745 static bool bus_get_realized(Object *obj, Error **errp)
746 {
747 BusState *bus = BUS(obj);
748
749 return bus->realized;
750 }
751
752 static void bus_set_realized(Object *obj, bool value, Error **errp)
753 {
754 BusState *bus = BUS(obj);
755 BusClass *bc = BUS_GET_CLASS(bus);
756 BusChild *kid;
757 Error *local_err = NULL;
758
759 if (value && !bus->realized) {
760 if (bc->realize) {
761 bc->realize(bus, &local_err);
762 }
763
764 /* TODO: recursive realization */
765 } else if (!value && bus->realized) {
766 QTAILQ_FOREACH(kid, &bus->children, sibling) {
767 DeviceState *dev = kid->child;
768 object_property_set_bool(OBJECT(dev), false, "realized",
769 &local_err);
770 if (local_err != NULL) {
771 break;
772 }
773 }
774 if (bc->unrealize && local_err == NULL) {
775 bc->unrealize(bus, &local_err);
776 }
777 }
778
779 if (local_err != NULL) {
780 error_propagate(errp, local_err);
781 return;
782 }
783
784 bus->realized = value;
785 }
786
787 void qbus_create_inplace(void *bus, size_t size, const char *typename,
788 DeviceState *parent, const char *name)
789 {
790 object_initialize(bus, size, typename);
791 qbus_realize(bus, parent, name);
792 }
793
794 BusState *qbus_create(const char *typename, DeviceState *parent, const char *name)
795 {
796 BusState *bus;
797
798 bus = BUS(object_new(typename));
799 qbus_realize(bus, parent, name);
800
801 return bus;
802 }
803
804 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
805 {
806 BusClass *bc = BUS_GET_CLASS(bus);
807
808 if (bc->get_fw_dev_path) {
809 return bc->get_fw_dev_path(dev);
810 }
811
812 return NULL;
813 }
814
815 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
816 {
817 Object *obj = OBJECT(dev);
818 char *d = NULL;
819
820 while (!d && obj->parent) {
821 obj = obj->parent;
822 d = fw_path_provider_try_get_dev_path(obj, bus, dev);
823 }
824 return d;
825 }
826
827 char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
828 {
829 Object *obj = OBJECT(dev);
830
831 return fw_path_provider_try_get_dev_path(obj, bus, dev);
832 }
833
834 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
835 {
836 int l = 0;
837
838 if (dev && dev->parent_bus) {
839 char *d;
840 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
841 d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
842 if (!d) {
843 d = bus_get_fw_dev_path(dev->parent_bus, dev);
844 }
845 if (d) {
846 l += snprintf(p + l, size - l, "%s", d);
847 g_free(d);
848 } else {
849 return l;
850 }
851 }
852 l += snprintf(p + l , size - l, "/");
853
854 return l;
855 }
856
857 char* qdev_get_fw_dev_path(DeviceState *dev)
858 {
859 char path[128];
860 int l;
861
862 l = qdev_get_fw_dev_path_helper(dev, path, 128);
863
864 path[l-1] = '\0';
865
866 return g_strdup(path);
867 }
868
869 char *qdev_get_dev_path(DeviceState *dev)
870 {
871 BusClass *bc;
872
873 if (!dev || !dev->parent_bus) {
874 return NULL;
875 }
876
877 bc = BUS_GET_CLASS(dev->parent_bus);
878 if (bc->get_dev_path) {
879 return bc->get_dev_path(dev);
880 }
881
882 return NULL;
883 }
884
885 /**
886 * Legacy property handling
887 */
888
889 static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque,
890 const char *name, Error **errp)
891 {
892 DeviceState *dev = DEVICE(obj);
893 Property *prop = opaque;
894
895 char buffer[1024];
896 char *ptr = buffer;
897
898 prop->info->print(dev, prop, buffer, sizeof(buffer));
899 visit_type_str(v, &ptr, name, errp);
900 }
901
902 /**
903 * @qdev_add_legacy_property - adds a legacy property
904 *
905 * Do not use this is new code! Properties added through this interface will
906 * be given names and types in the "legacy" namespace.
907 *
908 * Legacy properties are string versions of other OOM properties. The format
909 * of the string depends on the property type.
910 */
911 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
912 Error **errp)
913 {
914 gchar *name;
915
916 /* Register pointer properties as legacy properties */
917 if (!prop->info->print && prop->info->get) {
918 return;
919 }
920
921 name = g_strdup_printf("legacy-%s", prop->name);
922 object_property_add(OBJECT(dev), name, "str",
923 prop->info->print ? qdev_get_legacy_property : prop->info->get,
924 NULL,
925 NULL,
926 prop, errp);
927
928 g_free(name);
929 }
930
931 /**
932 * @qdev_property_add_static - add a @Property to a device.
933 *
934 * Static properties access data in a struct. The actual type of the
935 * property and the field depends on the property type.
936 */
937 void qdev_property_add_static(DeviceState *dev, Property *prop,
938 Error **errp)
939 {
940 Error *local_err = NULL;
941 Object *obj = OBJECT(dev);
942
943 /*
944 * TODO qdev_prop_ptr does not have getters or setters. It must
945 * go now that it can be replaced with links. The test should be
946 * removed along with it: all static properties are read/write.
947 */
948 if (!prop->info->get && !prop->info->set) {
949 return;
950 }
951
952 object_property_add(obj, prop->name, prop->info->name,
953 prop->info->get, prop->info->set,
954 prop->info->release,
955 prop, &local_err);
956
957 if (local_err) {
958 error_propagate(errp, local_err);
959 return;
960 }
961
962 object_property_set_description(obj, prop->name,
963 prop->info->description,
964 &error_abort);
965
966 if (prop->qtype == QTYPE_NONE) {
967 return;
968 }
969
970 if (prop->qtype == QTYPE_QBOOL) {
971 object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
972 } else if (prop->info->enum_table) {
973 object_property_set_str(obj, prop->info->enum_table[prop->defval],
974 prop->name, &error_abort);
975 } else if (prop->qtype == QTYPE_QINT) {
976 object_property_set_int(obj, prop->defval, prop->name, &error_abort);
977 }
978 }
979
980 /* @qdev_alias_all_properties - Add alias properties to the source object for
981 * all qdev properties on the target DeviceState.
982 */
983 void qdev_alias_all_properties(DeviceState *target, Object *source)
984 {
985 ObjectClass *class;
986 Property *prop;
987
988 class = object_get_class(OBJECT(target));
989 do {
990 DeviceClass *dc = DEVICE_CLASS(class);
991
992 for (prop = dc->props; prop && prop->name; prop++) {
993 object_property_add_alias(source, prop->name,
994 OBJECT(target), prop->name,
995 &error_abort);
996 }
997 class = object_class_get_parent(class);
998 } while (class != object_class_by_name(TYPE_DEVICE));
999 }
1000
1001 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
1002 {
1003 GSList **list = opaque;
1004 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
1005 TYPE_DEVICE);
1006
1007 if (dev == NULL) {
1008 return 0;
1009 }
1010
1011 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
1012 *list = g_slist_append(*list, dev);
1013 }
1014
1015 return 0;
1016 }
1017
1018 GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
1019 {
1020 GSList *list = NULL;
1021
1022 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
1023
1024 return list;
1025 }
1026
1027 static bool device_get_realized(Object *obj, Error **errp)
1028 {
1029 DeviceState *dev = DEVICE(obj);
1030 return dev->realized;
1031 }
1032
1033 static void device_set_realized(Object *obj, bool value, Error **errp)
1034 {
1035 DeviceState *dev = DEVICE(obj);
1036 DeviceClass *dc = DEVICE_GET_CLASS(dev);
1037 HotplugHandler *hotplug_ctrl;
1038 BusState *bus;
1039 Error *local_err = NULL;
1040
1041 if (dev->hotplugged && !dc->hotpluggable) {
1042 error_set(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
1043 return;
1044 }
1045
1046 if (value && !dev->realized) {
1047 if (!obj->parent) {
1048 static int unattached_count;
1049 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
1050
1051 object_property_add_child(container_get(qdev_get_machine(),
1052 "/unattached"),
1053 name, obj, &error_abort);
1054 g_free(name);
1055 }
1056
1057 if (dc->realize) {
1058 dc->realize(dev, &local_err);
1059 }
1060
1061 if (local_err != NULL) {
1062 goto fail;
1063 }
1064
1065 DEVICE_LISTENER_CALL(realize, Forward, dev);
1066
1067 hotplug_ctrl = qdev_get_hotplug_handler(dev);
1068 if (hotplug_ctrl) {
1069 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
1070 }
1071
1072 if (local_err != NULL) {
1073 goto post_realize_fail;
1074 }
1075
1076 if (qdev_get_vmsd(dev)) {
1077 vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
1078 dev->instance_id_alias,
1079 dev->alias_required_for_version);
1080 }
1081
1082 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1083 object_property_set_bool(OBJECT(bus), true, "realized",
1084 &local_err);
1085 if (local_err != NULL) {
1086 goto child_realize_fail;
1087 }
1088 }
1089 if (dev->hotplugged) {
1090 device_reset(dev);
1091 }
1092 dev->pending_deleted_event = false;
1093 } else if (!value && dev->realized) {
1094 Error **local_errp = NULL;
1095 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1096 local_errp = local_err ? NULL : &local_err;
1097 object_property_set_bool(OBJECT(bus), false, "realized",
1098 local_errp);
1099 }
1100 if (qdev_get_vmsd(dev)) {
1101 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1102 }
1103 if (dc->unrealize) {
1104 local_errp = local_err ? NULL : &local_err;
1105 dc->unrealize(dev, local_errp);
1106 }
1107 dev->pending_deleted_event = true;
1108 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
1109 }
1110
1111 if (local_err != NULL) {
1112 goto fail;
1113 }
1114
1115 dev->realized = value;
1116 return;
1117
1118 child_realize_fail:
1119 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1120 object_property_set_bool(OBJECT(bus), false, "realized",
1121 NULL);
1122 }
1123
1124 if (qdev_get_vmsd(dev)) {
1125 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1126 }
1127
1128 post_realize_fail:
1129 if (dc->unrealize) {
1130 dc->unrealize(dev, NULL);
1131 }
1132
1133 fail:
1134 error_propagate(errp, local_err);
1135 return;
1136 }
1137
1138 static bool device_get_hotpluggable(Object *obj, Error **errp)
1139 {
1140 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1141 DeviceState *dev = DEVICE(obj);
1142
1143 return dc->hotpluggable && (dev->parent_bus == NULL ||
1144 qbus_is_hotpluggable(dev->parent_bus));
1145 }
1146
1147 static bool device_get_hotplugged(Object *obj, Error **err)
1148 {
1149 DeviceState *dev = DEVICE(obj);
1150
1151 return dev->hotplugged;
1152 }
1153
1154 static void device_set_hotplugged(Object *obj, bool value, Error **err)
1155 {
1156 DeviceState *dev = DEVICE(obj);
1157
1158 dev->hotplugged = value;
1159 }
1160
1161 static void device_initfn(Object *obj)
1162 {
1163 DeviceState *dev = DEVICE(obj);
1164 ObjectClass *class;
1165 Property *prop;
1166
1167 if (qdev_hotplug) {
1168 dev->hotplugged = 1;
1169 qdev_hot_added = true;
1170 }
1171
1172 dev->instance_id_alias = -1;
1173 dev->realized = false;
1174
1175 object_property_add_bool(obj, "realized",
1176 device_get_realized, device_set_realized, NULL);
1177 object_property_add_bool(obj, "hotpluggable",
1178 device_get_hotpluggable, NULL, NULL);
1179 object_property_add_bool(obj, "hotplugged",
1180 device_get_hotplugged, device_set_hotplugged,
1181 &error_abort);
1182
1183 class = object_get_class(OBJECT(dev));
1184 do {
1185 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
1186 qdev_property_add_legacy(dev, prop, &error_abort);
1187 qdev_property_add_static(dev, prop, &error_abort);
1188 }
1189 class = object_class_get_parent(class);
1190 } while (class != object_class_by_name(TYPE_DEVICE));
1191
1192 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
1193 (Object **)&dev->parent_bus, NULL, 0,
1194 &error_abort);
1195 QLIST_INIT(&dev->gpios);
1196 }
1197
1198 static void device_post_init(Object *obj)
1199 {
1200 qdev_prop_set_globals(DEVICE(obj));
1201 }
1202
1203 /* Unlink device from bus and free the structure. */
1204 static void device_finalize(Object *obj)
1205 {
1206 NamedGPIOList *ngl, *next;
1207
1208 DeviceState *dev = DEVICE(obj);
1209 qemu_opts_del(dev->opts);
1210
1211 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1212 QLIST_REMOVE(ngl, node);
1213 qemu_free_irqs(ngl->in, ngl->num_in);
1214 g_free(ngl->name);
1215 g_free(ngl);
1216 /* ngl->out irqs are owned by the other end and should not be freed
1217 * here
1218 */
1219 }
1220 }
1221
1222 static void device_class_base_init(ObjectClass *class, void *data)
1223 {
1224 DeviceClass *klass = DEVICE_CLASS(class);
1225
1226 /* We explicitly look up properties in the superclasses,
1227 * so do not propagate them to the subclasses.
1228 */
1229 klass->props = NULL;
1230 }
1231
1232 static void device_unparent(Object *obj)
1233 {
1234 DeviceState *dev = DEVICE(obj);
1235 BusState *bus;
1236
1237 if (dev->realized) {
1238 object_property_set_bool(obj, false, "realized", NULL);
1239 }
1240 while (dev->num_child_bus) {
1241 bus = QLIST_FIRST(&dev->child_bus);
1242 object_unparent(OBJECT(bus));
1243 }
1244 if (dev->parent_bus) {
1245 bus_remove_child(dev->parent_bus, dev);
1246 object_unref(OBJECT(dev->parent_bus));
1247 dev->parent_bus = NULL;
1248 }
1249
1250 /* Only send event if the device had been completely realized */
1251 if (dev->pending_deleted_event) {
1252 gchar *path = object_get_canonical_path(OBJECT(dev));
1253
1254 qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
1255 g_free(path);
1256 }
1257 }
1258
1259 static void device_class_init(ObjectClass *class, void *data)
1260 {
1261 DeviceClass *dc = DEVICE_CLASS(class);
1262
1263 class->unparent = device_unparent;
1264 dc->realize = device_realize;
1265 dc->unrealize = device_unrealize;
1266
1267 /* by default all devices were considered as hotpluggable,
1268 * so with intent to check it in generic qdev_unplug() /
1269 * device_set_realized() functions make every device
1270 * hotpluggable. Devices that shouldn't be hotpluggable,
1271 * should override it in their class_init()
1272 */
1273 dc->hotpluggable = true;
1274 }
1275
1276 void device_reset(DeviceState *dev)
1277 {
1278 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1279
1280 if (klass->reset) {
1281 klass->reset(dev);
1282 }
1283 }
1284
1285 Object *qdev_get_machine(void)
1286 {
1287 static Object *dev;
1288
1289 if (dev == NULL) {
1290 dev = container_get(object_get_root(), "/machine");
1291 }
1292
1293 return dev;
1294 }
1295
1296 static const TypeInfo device_type_info = {
1297 .name = TYPE_DEVICE,
1298 .parent = TYPE_OBJECT,
1299 .instance_size = sizeof(DeviceState),
1300 .instance_init = device_initfn,
1301 .instance_post_init = device_post_init,
1302 .instance_finalize = device_finalize,
1303 .class_base_init = device_class_base_init,
1304 .class_init = device_class_init,
1305 .abstract = true,
1306 .class_size = sizeof(DeviceClass),
1307 };
1308
1309 static void qbus_initfn(Object *obj)
1310 {
1311 BusState *bus = BUS(obj);
1312
1313 QTAILQ_INIT(&bus->children);
1314 object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY,
1315 TYPE_HOTPLUG_HANDLER,
1316 (Object **)&bus->hotplug_handler,
1317 object_property_allow_set_link,
1318 OBJ_PROP_LINK_UNREF_ON_RELEASE,
1319 NULL);
1320 object_property_add_bool(obj, "realized",
1321 bus_get_realized, bus_set_realized, NULL);
1322 }
1323
1324 static char *default_bus_get_fw_dev_path(DeviceState *dev)
1325 {
1326 return g_strdup(object_get_typename(OBJECT(dev)));
1327 }
1328
1329 static void bus_class_init(ObjectClass *class, void *data)
1330 {
1331 BusClass *bc = BUS_CLASS(class);
1332
1333 class->unparent = bus_unparent;
1334 bc->get_fw_dev_path = default_bus_get_fw_dev_path;
1335 }
1336
1337 static void qbus_finalize(Object *obj)
1338 {
1339 BusState *bus = BUS(obj);
1340
1341 g_free((char *)bus->name);
1342 }
1343
1344 static const TypeInfo bus_info = {
1345 .name = TYPE_BUS,
1346 .parent = TYPE_OBJECT,
1347 .instance_size = sizeof(BusState),
1348 .abstract = true,
1349 .class_size = sizeof(BusClass),
1350 .instance_init = qbus_initfn,
1351 .instance_finalize = qbus_finalize,
1352 .class_init = bus_class_init,
1353 };
1354
1355 static void qdev_register_types(void)
1356 {
1357 type_register_static(&bus_info);
1358 type_register_static(&device_type_info);
1359 }
1360
1361 type_init(qdev_register_types)