xref: /openbmc/qemu/hw/core/qdev.c (revision 4a09d0bb)
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 "qemu/osdep.h"
29 #include "hw/qdev.h"
30 #include "hw/fw-path-provider.h"
31 #include "sysemu/sysemu.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 "hw/sysbus.h"
39 #include "qapi-event.h"
40 
41 int qdev_hotplug = 0;
42 static bool qdev_hot_added = false;
43 static bool qdev_hot_removed = false;
44 
45 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
46 {
47     DeviceClass *dc = DEVICE_GET_CLASS(dev);
48     return dc->vmsd;
49 }
50 
51 const char *qdev_fw_name(DeviceState *dev)
52 {
53     DeviceClass *dc = DEVICE_GET_CLASS(dev);
54 
55     if (dc->fw_name) {
56         return dc->fw_name;
57     }
58 
59     return object_get_typename(OBJECT(dev));
60 }
61 
62 static void bus_remove_child(BusState *bus, DeviceState *child)
63 {
64     BusChild *kid;
65 
66     QTAILQ_FOREACH(kid, &bus->children, sibling) {
67         if (kid->child == child) {
68             char name[32];
69 
70             snprintf(name, sizeof(name), "child[%d]", kid->index);
71             QTAILQ_REMOVE(&bus->children, kid, sibling);
72 
73             /* This gives back ownership of kid->child back to us.  */
74             object_property_del(OBJECT(bus), name, NULL);
75             object_unref(OBJECT(kid->child));
76             g_free(kid);
77             return;
78         }
79     }
80 }
81 
82 static void bus_add_child(BusState *bus, DeviceState *child)
83 {
84     char name[32];
85     BusChild *kid = g_malloc0(sizeof(*kid));
86 
87     kid->index = bus->max_index++;
88     kid->child = child;
89     object_ref(OBJECT(kid->child));
90 
91     QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
92 
93     /* This transfers ownership of kid->child to the property.  */
94     snprintf(name, sizeof(name), "child[%d]", kid->index);
95     object_property_add_link(OBJECT(bus), name,
96                              object_get_typename(OBJECT(child)),
97                              (Object **)&kid->child,
98                              NULL, /* read-only property */
99                              0, /* return ownership on prop deletion */
100                              NULL);
101 }
102 
103 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
104 {
105     dev->parent_bus = bus;
106     object_ref(OBJECT(bus));
107     bus_add_child(bus, dev);
108 }
109 
110 /* Create a new device.  This only initializes the device state
111    structure and allows properties to be set.  The device still needs
112    to be realized.  See qdev-core.h.  */
113 DeviceState *qdev_create(BusState *bus, const char *name)
114 {
115     DeviceState *dev;
116 
117     dev = qdev_try_create(bus, name);
118     if (!dev) {
119         if (bus) {
120             error_report("Unknown device '%s' for bus '%s'", name,
121                          object_get_typename(OBJECT(bus)));
122         } else {
123             error_report("Unknown device '%s' for default sysbus", name);
124         }
125         abort();
126     }
127 
128     return dev;
129 }
130 
131 DeviceState *qdev_try_create(BusState *bus, const char *type)
132 {
133     DeviceState *dev;
134 
135     if (object_class_by_name(type) == NULL) {
136         return NULL;
137     }
138     dev = DEVICE(object_new(type));
139     if (!dev) {
140         return NULL;
141     }
142 
143     if (!bus) {
144         /* Assert that the device really is a SysBusDevice before
145          * we put it onto the sysbus. Non-sysbus devices which aren't
146          * being put onto a bus should be created with object_new(TYPE_FOO),
147          * not qdev_create(NULL, TYPE_FOO).
148          */
149         g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE));
150         bus = sysbus_get_default();
151     }
152 
153     qdev_set_parent_bus(dev, bus);
154     object_unref(OBJECT(dev));
155     return dev;
156 }
157 
158 static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
159     = QTAILQ_HEAD_INITIALIZER(device_listeners);
160 
161 enum ListenerDirection { Forward, Reverse };
162 
163 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...)     \
164     do {                                                          \
165         DeviceListener *_listener;                                \
166                                                                   \
167         switch (_direction) {                                     \
168         case Forward:                                             \
169             QTAILQ_FOREACH(_listener, &device_listeners, link) {  \
170                 if (_listener->_callback) {                       \
171                     _listener->_callback(_listener, ##_args);     \
172                 }                                                 \
173             }                                                     \
174             break;                                                \
175         case Reverse:                                             \
176             QTAILQ_FOREACH_REVERSE(_listener, &device_listeners,  \
177                                    device_listeners, link) {      \
178                 if (_listener->_callback) {                       \
179                     _listener->_callback(_listener, ##_args);     \
180                 }                                                 \
181             }                                                     \
182             break;                                                \
183         default:                                                  \
184             abort();                                              \
185         }                                                         \
186     } while (0)
187 
188 static int device_listener_add(DeviceState *dev, void *opaque)
189 {
190     DEVICE_LISTENER_CALL(realize, Forward, dev);
191 
192     return 0;
193 }
194 
195 void device_listener_register(DeviceListener *listener)
196 {
197     QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
198 
199     qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
200                        NULL, NULL);
201 }
202 
203 void device_listener_unregister(DeviceListener *listener)
204 {
205     QTAILQ_REMOVE(&device_listeners, listener, link);
206 }
207 
208 static void device_realize(DeviceState *dev, Error **errp)
209 {
210     DeviceClass *dc = DEVICE_GET_CLASS(dev);
211 
212     if (dc->init) {
213         int rc = dc->init(dev);
214         if (rc < 0) {
215             error_setg(errp, "Device initialization failed.");
216             return;
217         }
218     }
219 }
220 
221 static void device_unrealize(DeviceState *dev, Error **errp)
222 {
223     DeviceClass *dc = DEVICE_GET_CLASS(dev);
224 
225     if (dc->exit) {
226         int rc = dc->exit(dev);
227         if (rc < 0) {
228             error_setg(errp, "Device exit failed.");
229             return;
230         }
231     }
232 }
233 
234 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
235                                  int required_for_version)
236 {
237     assert(!dev->realized);
238     dev->instance_id_alias = alias_id;
239     dev->alias_required_for_version = required_for_version;
240 }
241 
242 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
243 {
244     HotplugHandler *hotplug_ctrl = NULL;
245 
246     if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
247         hotplug_ctrl = dev->parent_bus->hotplug_handler;
248     } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
249         MachineState *machine = MACHINE(qdev_get_machine());
250         MachineClass *mc = MACHINE_GET_CLASS(machine);
251 
252         if (mc->get_hotplug_handler) {
253             hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
254         }
255     }
256     return hotplug_ctrl;
257 }
258 
259 void qdev_unplug(DeviceState *dev, Error **errp)
260 {
261     DeviceClass *dc = DEVICE_GET_CLASS(dev);
262     HotplugHandler *hotplug_ctrl;
263     HotplugHandlerClass *hdc;
264 
265     if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
266         error_setg(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
267         return;
268     }
269 
270     if (!dc->hotpluggable) {
271         error_setg(errp, QERR_DEVICE_NO_HOTPLUG,
272                    object_get_typename(OBJECT(dev)));
273         return;
274     }
275 
276     qdev_hot_removed = true;
277 
278     hotplug_ctrl = qdev_get_hotplug_handler(dev);
279     /* hotpluggable device MUST have HotplugHandler, if it doesn't
280      * then something is very wrong with it */
281     g_assert(hotplug_ctrl);
282 
283     /* If device supports async unplug just request it to be done,
284      * otherwise just remove it synchronously */
285     hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl);
286     if (hdc->unplug_request) {
287         hotplug_handler_unplug_request(hotplug_ctrl, dev, errp);
288     } else {
289         hotplug_handler_unplug(hotplug_ctrl, dev, errp);
290     }
291 }
292 
293 static int qdev_reset_one(DeviceState *dev, void *opaque)
294 {
295     device_reset(dev);
296 
297     return 0;
298 }
299 
300 static int qbus_reset_one(BusState *bus, void *opaque)
301 {
302     BusClass *bc = BUS_GET_CLASS(bus);
303     if (bc->reset) {
304         bc->reset(bus);
305     }
306     return 0;
307 }
308 
309 void qdev_reset_all(DeviceState *dev)
310 {
311     qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
312 }
313 
314 void qdev_reset_all_fn(void *opaque)
315 {
316     qdev_reset_all(DEVICE(opaque));
317 }
318 
319 void qbus_reset_all(BusState *bus)
320 {
321     qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
322 }
323 
324 void qbus_reset_all_fn(void *opaque)
325 {
326     BusState *bus = opaque;
327     qbus_reset_all(bus);
328 }
329 
330 /* can be used as ->unplug() callback for the simple cases */
331 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
332                                   DeviceState *dev, Error **errp)
333 {
334     /* just zap it */
335     object_unparent(OBJECT(dev));
336 }
337 
338 /*
339  * Realize @dev.
340  * Device properties should be set before calling this function.  IRQs
341  * and MMIO regions should be connected/mapped after calling this
342  * function.
343  * On failure, report an error with error_report() and terminate the
344  * program.  This is okay during machine creation.  Don't use for
345  * hotplug, because there callers need to recover from failure.
346  * Exception: if you know the device's init() callback can't fail,
347  * then qdev_init_nofail() can't fail either, and is therefore usable
348  * even then.  But relying on the device implementation that way is
349  * somewhat unclean, and best avoided.
350  */
351 void qdev_init_nofail(DeviceState *dev)
352 {
353     Error *err = NULL;
354 
355     assert(!dev->realized);
356 
357     object_ref(OBJECT(dev));
358     object_property_set_bool(OBJECT(dev), true, "realized", &err);
359     if (err) {
360         error_reportf_err(err, "Initialization of device %s failed: ",
361                           object_get_typename(OBJECT(dev)));
362         exit(1);
363     }
364     object_unref(OBJECT(dev));
365 }
366 
367 void qdev_machine_creation_done(void)
368 {
369     /*
370      * ok, initial machine setup is done, starting from now we can
371      * only create hotpluggable devices
372      */
373     qdev_hotplug = 1;
374 }
375 
376 bool qdev_machine_modified(void)
377 {
378     return qdev_hot_added || qdev_hot_removed;
379 }
380 
381 BusState *qdev_get_parent_bus(DeviceState *dev)
382 {
383     return dev->parent_bus;
384 }
385 
386 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
387                                                const char *name)
388 {
389     NamedGPIOList *ngl;
390 
391     QLIST_FOREACH(ngl, &dev->gpios, node) {
392         /* NULL is a valid and matchable name, otherwise do a normal
393          * strcmp match.
394          */
395         if ((!ngl->name && !name) ||
396                 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
397             return ngl;
398         }
399     }
400 
401     ngl = g_malloc0(sizeof(*ngl));
402     ngl->name = g_strdup(name);
403     QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
404     return ngl;
405 }
406 
407 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
408                              const char *name, int n)
409 {
410     int i;
411     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
412 
413     assert(gpio_list->num_out == 0 || !name);
414     gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
415                                      dev, n);
416 
417     if (!name) {
418         name = "unnamed-gpio-in";
419     }
420     for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
421         gchar *propname = g_strdup_printf("%s[%u]", name, i);
422 
423         object_property_add_child(OBJECT(dev), propname,
424                                   OBJECT(gpio_list->in[i]), &error_abort);
425         g_free(propname);
426     }
427 
428     gpio_list->num_in += n;
429 }
430 
431 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
432 {
433     qdev_init_gpio_in_named(dev, handler, NULL, n);
434 }
435 
436 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
437                               const char *name, int n)
438 {
439     int i;
440     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
441 
442     assert(gpio_list->num_in == 0 || !name);
443 
444     if (!name) {
445         name = "unnamed-gpio-out";
446     }
447     memset(pins, 0, sizeof(*pins) * n);
448     for (i = 0; i < n; ++i) {
449         gchar *propname = g_strdup_printf("%s[%u]", name,
450                                           gpio_list->num_out + i);
451 
452         object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
453                                  (Object **)&pins[i],
454                                  object_property_allow_set_link,
455                                  OBJ_PROP_LINK_UNREF_ON_RELEASE,
456                                  &error_abort);
457         g_free(propname);
458     }
459     gpio_list->num_out += n;
460 }
461 
462 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
463 {
464     qdev_init_gpio_out_named(dev, pins, NULL, n);
465 }
466 
467 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
468 {
469     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
470 
471     assert(n >= 0 && n < gpio_list->num_in);
472     return gpio_list->in[n];
473 }
474 
475 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
476 {
477     return qdev_get_gpio_in_named(dev, NULL, n);
478 }
479 
480 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
481                                  qemu_irq pin)
482 {
483     char *propname = g_strdup_printf("%s[%d]",
484                                      name ? name : "unnamed-gpio-out", n);
485     if (pin) {
486         /* We need a name for object_property_set_link to work.  If the
487          * object has a parent, object_property_add_child will come back
488          * with an error without doing anything.  If it has none, it will
489          * never fail.  So we can just call it with a NULL Error pointer.
490          */
491         object_property_add_child(container_get(qdev_get_machine(),
492                                                 "/unattached"),
493                                   "non-qdev-gpio[*]", OBJECT(pin), NULL);
494     }
495     object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
496     g_free(propname);
497 }
498 
499 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
500 {
501     char *propname = g_strdup_printf("%s[%d]",
502                                      name ? name : "unnamed-gpio-out", n);
503 
504     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
505                                                       NULL);
506 
507     return ret;
508 }
509 
510 /* disconnect a GPIO output, returning the disconnected input (if any) */
511 
512 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
513                                                const char *name, int n)
514 {
515     char *propname = g_strdup_printf("%s[%d]",
516                                      name ? name : "unnamed-gpio-out", n);
517 
518     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
519                                                       NULL);
520     if (ret) {
521         object_property_set_link(OBJECT(dev), NULL, propname, NULL);
522     }
523     g_free(propname);
524     return ret;
525 }
526 
527 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
528                                  const char *name, int n)
529 {
530     qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
531     qdev_connect_gpio_out_named(dev, name, n, icpt);
532     return disconnected;
533 }
534 
535 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
536 {
537     qdev_connect_gpio_out_named(dev, NULL, n, pin);
538 }
539 
540 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
541                      const char *name)
542 {
543     int i;
544     NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
545 
546     for (i = 0; i < ngl->num_in; i++) {
547         const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
548         char *propname = g_strdup_printf("%s[%d]", nm, i);
549 
550         object_property_add_alias(OBJECT(container), propname,
551                                   OBJECT(dev), propname,
552                                   &error_abort);
553         g_free(propname);
554     }
555     for (i = 0; i < ngl->num_out; i++) {
556         const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
557         char *propname = g_strdup_printf("%s[%d]", nm, i);
558 
559         object_property_add_alias(OBJECT(container), propname,
560                                   OBJECT(dev), propname,
561                                   &error_abort);
562         g_free(propname);
563     }
564     QLIST_REMOVE(ngl, node);
565     QLIST_INSERT_HEAD(&container->gpios, ngl, node);
566 }
567 
568 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
569 {
570     BusState *bus;
571     Object *child = object_resolve_path_component(OBJECT(dev), name);
572 
573     bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
574     if (bus) {
575         return bus;
576     }
577 
578     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
579         if (strcmp(name, bus->name) == 0) {
580             return bus;
581         }
582     }
583     return NULL;
584 }
585 
586 int qdev_walk_children(DeviceState *dev,
587                        qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
588                        qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
589                        void *opaque)
590 {
591     BusState *bus;
592     int err;
593 
594     if (pre_devfn) {
595         err = pre_devfn(dev, opaque);
596         if (err) {
597             return err;
598         }
599     }
600 
601     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
602         err = qbus_walk_children(bus, pre_devfn, pre_busfn,
603                                  post_devfn, post_busfn, opaque);
604         if (err < 0) {
605             return err;
606         }
607     }
608 
609     if (post_devfn) {
610         err = post_devfn(dev, opaque);
611         if (err) {
612             return err;
613         }
614     }
615 
616     return 0;
617 }
618 
619 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
620 {
621     BusChild *kid;
622     DeviceState *ret;
623     BusState *child;
624 
625     QTAILQ_FOREACH(kid, &bus->children, sibling) {
626         DeviceState *dev = kid->child;
627 
628         if (dev->id && strcmp(dev->id, id) == 0) {
629             return dev;
630         }
631 
632         QLIST_FOREACH(child, &dev->child_bus, sibling) {
633             ret = qdev_find_recursive(child, id);
634             if (ret) {
635                 return ret;
636             }
637         }
638     }
639     return NULL;
640 }
641 
642 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
643 {
644     BusClass *bc = BUS_GET_CLASS(bus);
645 
646     if (bc->get_fw_dev_path) {
647         return bc->get_fw_dev_path(dev);
648     }
649 
650     return NULL;
651 }
652 
653 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
654 {
655     Object *obj = OBJECT(dev);
656     char *d = NULL;
657 
658     while (!d && obj->parent) {
659         obj = obj->parent;
660         d = fw_path_provider_try_get_dev_path(obj, bus, dev);
661     }
662     return d;
663 }
664 
665 char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
666 {
667     Object *obj = OBJECT(dev);
668 
669     return fw_path_provider_try_get_dev_path(obj, bus, dev);
670 }
671 
672 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
673 {
674     int l = 0;
675 
676     if (dev && dev->parent_bus) {
677         char *d;
678         l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
679         d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
680         if (!d) {
681             d = bus_get_fw_dev_path(dev->parent_bus, dev);
682         }
683         if (d) {
684             l += snprintf(p + l, size - l, "%s", d);
685             g_free(d);
686         } else {
687             return l;
688         }
689     }
690     l += snprintf(p + l , size - l, "/");
691 
692     return l;
693 }
694 
695 char* qdev_get_fw_dev_path(DeviceState *dev)
696 {
697     char path[128];
698     int l;
699 
700     l = qdev_get_fw_dev_path_helper(dev, path, 128);
701 
702     path[l-1] = '\0';
703 
704     return g_strdup(path);
705 }
706 
707 char *qdev_get_dev_path(DeviceState *dev)
708 {
709     BusClass *bc;
710 
711     if (!dev || !dev->parent_bus) {
712         return NULL;
713     }
714 
715     bc = BUS_GET_CLASS(dev->parent_bus);
716     if (bc->get_dev_path) {
717         return bc->get_dev_path(dev);
718     }
719 
720     return NULL;
721 }
722 
723 /**
724  * Legacy property handling
725  */
726 
727 static void qdev_get_legacy_property(Object *obj, Visitor *v,
728                                      const char *name, void *opaque,
729                                      Error **errp)
730 {
731     DeviceState *dev = DEVICE(obj);
732     Property *prop = opaque;
733 
734     char buffer[1024];
735     char *ptr = buffer;
736 
737     prop->info->print(dev, prop, buffer, sizeof(buffer));
738     visit_type_str(v, name, &ptr, errp);
739 }
740 
741 /**
742  * qdev_property_add_legacy:
743  * @dev: Device to add the property to.
744  * @prop: The qdev property definition.
745  * @errp: location to store error information.
746  *
747  * Add a legacy QOM property to @dev for qdev property @prop.
748  * On error, store error in @errp.
749  *
750  * Legacy properties are string versions of QOM properties.  The format of
751  * the string depends on the property type.  Legacy properties are only
752  * needed for "info qtree".
753  *
754  * Do not use this is new code!  QOM Properties added through this interface
755  * will be given names in the "legacy" namespace.
756  */
757 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
758                                      Error **errp)
759 {
760     gchar *name;
761 
762     /* Register pointer properties as legacy properties */
763     if (!prop->info->print && prop->info->get) {
764         return;
765     }
766 
767     name = g_strdup_printf("legacy-%s", prop->name);
768     object_property_add(OBJECT(dev), name, "str",
769                         prop->info->print ? qdev_get_legacy_property : prop->info->get,
770                         NULL,
771                         NULL,
772                         prop, errp);
773 
774     g_free(name);
775 }
776 
777 /**
778  * qdev_property_add_static:
779  * @dev: Device to add the property to.
780  * @prop: The qdev property definition.
781  * @errp: location to store error information.
782  *
783  * Add a static QOM property to @dev for qdev property @prop.
784  * On error, store error in @errp.  Static properties access data in a struct.
785  * The type of the QOM property is derived from prop->info.
786  */
787 void qdev_property_add_static(DeviceState *dev, Property *prop,
788                               Error **errp)
789 {
790     Error *local_err = NULL;
791     Object *obj = OBJECT(dev);
792 
793     /*
794      * TODO qdev_prop_ptr does not have getters or setters.  It must
795      * go now that it can be replaced with links.  The test should be
796      * removed along with it: all static properties are read/write.
797      */
798     if (!prop->info->get && !prop->info->set) {
799         return;
800     }
801 
802     object_property_add(obj, prop->name, prop->info->name,
803                         prop->info->get, prop->info->set,
804                         prop->info->release,
805                         prop, &local_err);
806 
807     if (local_err) {
808         error_propagate(errp, local_err);
809         return;
810     }
811 
812     object_property_set_description(obj, prop->name,
813                                     prop->info->description,
814                                     &error_abort);
815 
816     if (prop->qtype == QTYPE_NONE) {
817         return;
818     }
819 
820     if (prop->qtype == QTYPE_QBOOL) {
821         object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
822     } else if (prop->info->enum_table) {
823         object_property_set_str(obj, prop->info->enum_table[prop->defval],
824                                 prop->name, &error_abort);
825     } else if (prop->qtype == QTYPE_QINT) {
826         object_property_set_int(obj, prop->defval, prop->name, &error_abort);
827     }
828 }
829 
830 /* @qdev_alias_all_properties - Add alias properties to the source object for
831  * all qdev properties on the target DeviceState.
832  */
833 void qdev_alias_all_properties(DeviceState *target, Object *source)
834 {
835     ObjectClass *class;
836     Property *prop;
837 
838     class = object_get_class(OBJECT(target));
839     do {
840         DeviceClass *dc = DEVICE_CLASS(class);
841 
842         for (prop = dc->props; prop && prop->name; prop++) {
843             object_property_add_alias(source, prop->name,
844                                       OBJECT(target), prop->name,
845                                       &error_abort);
846         }
847         class = object_class_get_parent(class);
848     } while (class != object_class_by_name(TYPE_DEVICE));
849 }
850 
851 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
852 {
853     GSList **list = opaque;
854     DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
855                                                           TYPE_DEVICE);
856 
857     if (dev == NULL) {
858         return 0;
859     }
860 
861     if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
862         *list = g_slist_append(*list, dev);
863     }
864 
865     return 0;
866 }
867 
868 GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
869 {
870     GSList *list = NULL;
871 
872     object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
873 
874     return list;
875 }
876 
877 static bool device_get_realized(Object *obj, Error **errp)
878 {
879     DeviceState *dev = DEVICE(obj);
880     return dev->realized;
881 }
882 
883 static void device_set_realized(Object *obj, bool value, Error **errp)
884 {
885     DeviceState *dev = DEVICE(obj);
886     DeviceClass *dc = DEVICE_GET_CLASS(dev);
887     HotplugHandler *hotplug_ctrl;
888     BusState *bus;
889     Error *local_err = NULL;
890     bool unattached_parent = false;
891     static int unattached_count;
892 
893     if (dev->hotplugged && !dc->hotpluggable) {
894         error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
895         return;
896     }
897 
898     if (value && !dev->realized) {
899         if (!obj->parent) {
900             gchar *name = g_strdup_printf("device[%d]", unattached_count++);
901 
902             object_property_add_child(container_get(qdev_get_machine(),
903                                                     "/unattached"),
904                                       name, obj, &error_abort);
905             unattached_parent = true;
906             g_free(name);
907         }
908 
909         hotplug_ctrl = qdev_get_hotplug_handler(dev);
910         if (hotplug_ctrl) {
911             hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
912             if (local_err != NULL) {
913                 goto fail;
914             }
915         }
916 
917         if (dc->realize) {
918             dc->realize(dev, &local_err);
919         }
920 
921         if (local_err != NULL) {
922             goto fail;
923         }
924 
925         DEVICE_LISTENER_CALL(realize, Forward, dev);
926 
927         if (hotplug_ctrl) {
928             hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
929         }
930 
931         if (local_err != NULL) {
932             goto post_realize_fail;
933         }
934 
935         if (qdev_get_vmsd(dev)) {
936             if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
937                                                dev->instance_id_alias,
938                                                dev->alias_required_for_version,
939                                                &local_err) < 0) {
940                 goto post_realize_fail;
941             }
942         }
943 
944         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
945             object_property_set_bool(OBJECT(bus), true, "realized",
946                                          &local_err);
947             if (local_err != NULL) {
948                 goto child_realize_fail;
949             }
950         }
951         if (dev->hotplugged) {
952             device_reset(dev);
953         }
954         dev->pending_deleted_event = false;
955     } else if (!value && dev->realized) {
956         Error **local_errp = NULL;
957         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
958             local_errp = local_err ? NULL : &local_err;
959             object_property_set_bool(OBJECT(bus), false, "realized",
960                                      local_errp);
961         }
962         if (qdev_get_vmsd(dev)) {
963             vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
964         }
965         if (dc->unrealize) {
966             local_errp = local_err ? NULL : &local_err;
967             dc->unrealize(dev, local_errp);
968         }
969         dev->pending_deleted_event = true;
970         DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
971     }
972 
973     if (local_err != NULL) {
974         goto fail;
975     }
976 
977     dev->realized = value;
978     return;
979 
980 child_realize_fail:
981     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
982         object_property_set_bool(OBJECT(bus), false, "realized",
983                                  NULL);
984     }
985 
986     if (qdev_get_vmsd(dev)) {
987         vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
988     }
989 
990 post_realize_fail:
991     if (dc->unrealize) {
992         dc->unrealize(dev, NULL);
993     }
994 
995 fail:
996     error_propagate(errp, local_err);
997     if (unattached_parent) {
998         object_unparent(OBJECT(dev));
999         unattached_count--;
1000     }
1001 }
1002 
1003 static bool device_get_hotpluggable(Object *obj, Error **errp)
1004 {
1005     DeviceClass *dc = DEVICE_GET_CLASS(obj);
1006     DeviceState *dev = DEVICE(obj);
1007 
1008     return dc->hotpluggable && (dev->parent_bus == NULL ||
1009                                 qbus_is_hotpluggable(dev->parent_bus));
1010 }
1011 
1012 static bool device_get_hotplugged(Object *obj, Error **err)
1013 {
1014     DeviceState *dev = DEVICE(obj);
1015 
1016     return dev->hotplugged;
1017 }
1018 
1019 static void device_set_hotplugged(Object *obj, bool value, Error **err)
1020 {
1021     DeviceState *dev = DEVICE(obj);
1022 
1023     dev->hotplugged = value;
1024 }
1025 
1026 static void device_initfn(Object *obj)
1027 {
1028     DeviceState *dev = DEVICE(obj);
1029     ObjectClass *class;
1030     Property *prop;
1031 
1032     if (qdev_hotplug) {
1033         dev->hotplugged = 1;
1034         qdev_hot_added = true;
1035     }
1036 
1037     dev->instance_id_alias = -1;
1038     dev->realized = false;
1039 
1040     object_property_add_bool(obj, "realized",
1041                              device_get_realized, device_set_realized, NULL);
1042     object_property_add_bool(obj, "hotpluggable",
1043                              device_get_hotpluggable, NULL, NULL);
1044     object_property_add_bool(obj, "hotplugged",
1045                              device_get_hotplugged, device_set_hotplugged,
1046                              &error_abort);
1047 
1048     class = object_get_class(OBJECT(dev));
1049     do {
1050         for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
1051             qdev_property_add_legacy(dev, prop, &error_abort);
1052             qdev_property_add_static(dev, prop, &error_abort);
1053         }
1054         class = object_class_get_parent(class);
1055     } while (class != object_class_by_name(TYPE_DEVICE));
1056 
1057     object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
1058                              (Object **)&dev->parent_bus, NULL, 0,
1059                              &error_abort);
1060     QLIST_INIT(&dev->gpios);
1061 }
1062 
1063 static void device_post_init(Object *obj)
1064 {
1065     qdev_prop_set_globals(DEVICE(obj));
1066 }
1067 
1068 /* Unlink device from bus and free the structure.  */
1069 static void device_finalize(Object *obj)
1070 {
1071     NamedGPIOList *ngl, *next;
1072 
1073     DeviceState *dev = DEVICE(obj);
1074 
1075     QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1076         QLIST_REMOVE(ngl, node);
1077         qemu_free_irqs(ngl->in, ngl->num_in);
1078         g_free(ngl->name);
1079         g_free(ngl);
1080         /* ngl->out irqs are owned by the other end and should not be freed
1081          * here
1082          */
1083     }
1084 }
1085 
1086 static void device_class_base_init(ObjectClass *class, void *data)
1087 {
1088     DeviceClass *klass = DEVICE_CLASS(class);
1089 
1090     /* We explicitly look up properties in the superclasses,
1091      * so do not propagate them to the subclasses.
1092      */
1093     klass->props = NULL;
1094 }
1095 
1096 static void device_unparent(Object *obj)
1097 {
1098     DeviceState *dev = DEVICE(obj);
1099     BusState *bus;
1100 
1101     if (dev->realized) {
1102         object_property_set_bool(obj, false, "realized", NULL);
1103     }
1104     while (dev->num_child_bus) {
1105         bus = QLIST_FIRST(&dev->child_bus);
1106         object_unparent(OBJECT(bus));
1107     }
1108     if (dev->parent_bus) {
1109         bus_remove_child(dev->parent_bus, dev);
1110         object_unref(OBJECT(dev->parent_bus));
1111         dev->parent_bus = NULL;
1112     }
1113 
1114     /* Only send event if the device had been completely realized */
1115     if (dev->pending_deleted_event) {
1116         gchar *path = object_get_canonical_path(OBJECT(dev));
1117 
1118         qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
1119         g_free(path);
1120     }
1121 
1122     qemu_opts_del(dev->opts);
1123     dev->opts = NULL;
1124 }
1125 
1126 static void device_class_init(ObjectClass *class, void *data)
1127 {
1128     DeviceClass *dc = DEVICE_CLASS(class);
1129 
1130     class->unparent = device_unparent;
1131     dc->realize = device_realize;
1132     dc->unrealize = device_unrealize;
1133 
1134     /* by default all devices were considered as hotpluggable,
1135      * so with intent to check it in generic qdev_unplug() /
1136      * device_set_realized() functions make every device
1137      * hotpluggable. Devices that shouldn't be hotpluggable,
1138      * should override it in their class_init()
1139      */
1140     dc->hotpluggable = true;
1141 }
1142 
1143 void device_reset(DeviceState *dev)
1144 {
1145     DeviceClass *klass = DEVICE_GET_CLASS(dev);
1146 
1147     if (klass->reset) {
1148         klass->reset(dev);
1149     }
1150 }
1151 
1152 Object *qdev_get_machine(void)
1153 {
1154     static Object *dev;
1155 
1156     if (dev == NULL) {
1157         dev = container_get(object_get_root(), "/machine");
1158     }
1159 
1160     return dev;
1161 }
1162 
1163 static const TypeInfo device_type_info = {
1164     .name = TYPE_DEVICE,
1165     .parent = TYPE_OBJECT,
1166     .instance_size = sizeof(DeviceState),
1167     .instance_init = device_initfn,
1168     .instance_post_init = device_post_init,
1169     .instance_finalize = device_finalize,
1170     .class_base_init = device_class_base_init,
1171     .class_init = device_class_init,
1172     .abstract = true,
1173     .class_size = sizeof(DeviceClass),
1174 };
1175 
1176 static void qdev_register_types(void)
1177 {
1178     type_register_static(&device_type_info);
1179 }
1180 
1181 type_init(qdev_register_types)
1182