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