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