]> git.ipfire.org Git - thirdparty/qemu.git/blame - hw/core/qdev.c
Include hw/irq.h a lot less
[thirdparty/qemu.git] / hw / core / qdev.c
CommitLineData
aae9460e
PB
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
8167ee88 17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
aae9460e
PB
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
18c86e2b 28#include "qemu/osdep.h"
83c9f4ca 29#include "hw/qdev.h"
9c17d615 30#include "sysemu/sysemu.h"
e688df6b 31#include "qapi/error.h"
c577ff62 32#include "qapi/qapi-events-qdev.h"
b4a42f81 33#include "qapi/qmp/qerror.h"
7b1b5d19 34#include "qapi/visitor.h"
d49b6836 35#include "qemu/error-report.h"
922a01a0 36#include "qemu/option.h"
0ee4de6c 37#include "hw/hotplug.h"
64552b6b 38#include "hw/irq.h"
b7454548 39#include "hw/boards.h"
7474f1be 40#include "hw/sysbus.h"
aae9460e 41
9bed84c1 42bool qdev_hotplug = false;
0ac8ef71 43static bool qdev_hot_added = false;
21def24a 44bool qdev_hot_removed = false;
3418bd25 45
4be9f0d1
AL
46const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
47{
6e008585
AL
48 DeviceClass *dc = DEVICE_GET_CLASS(dev);
49 return dc->vmsd;
4be9f0d1
AL
50}
51
0866aca1 52static void bus_remove_child(BusState *bus, DeviceState *child)
0c17542d 53{
0866aca1
AL
54 BusChild *kid;
55
56 QTAILQ_FOREACH(kid, &bus->children, sibling) {
57 if (kid->child == child) {
58 char name[32];
59
60 snprintf(name, sizeof(name), "child[%d]", kid->index);
61 QTAILQ_REMOVE(&bus->children, kid, sibling);
9d127820 62
12b2e9f3
TK
63 bus->num_children--;
64
9d127820 65 /* This gives back ownership of kid->child back to us. */
0866aca1 66 object_property_del(OBJECT(bus), name, NULL);
9d127820 67 object_unref(OBJECT(kid->child));
0866aca1
AL
68 g_free(kid);
69 return;
70 }
71 }
72}
73
74static void bus_add_child(BusState *bus, DeviceState *child)
75{
76 char name[32];
77 BusChild *kid = g_malloc0(sizeof(*kid));
0c17542d 78
12b2e9f3 79 bus->num_children++;
0866aca1
AL
80 kid->index = bus->max_index++;
81 kid->child = child;
9d127820 82 object_ref(OBJECT(kid->child));
a5296ca9 83
0866aca1
AL
84 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
85
9d127820 86 /* This transfers ownership of kid->child to the property. */
0866aca1
AL
87 snprintf(name, sizeof(name), "child[%d]", kid->index);
88 object_property_add_link(OBJECT(bus), name,
89 object_get_typename(OBJECT(child)),
39f72ef9
SH
90 (Object **)&kid->child,
91 NULL, /* read-only property */
92 0, /* return ownership on prop deletion */
93 NULL);
0866aca1
AL
94}
95
96void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
97{
91c968ac
PM
98 bool replugging = dev->parent_bus != NULL;
99
100 if (replugging) {
101 /* Keep a reference to the device while it's not plugged into
102 * any bus, to avoid it potentially evaporating when it is
103 * dereffed in bus_remove_child().
104 */
105 object_ref(OBJECT(dev));
106 bus_remove_child(dev->parent_bus, dev);
107 object_unref(OBJECT(dev->parent_bus));
108 }
9fbe6127 109 dev->parent_bus = bus;
62d7ba66 110 object_ref(OBJECT(bus));
0866aca1 111 bus_add_child(bus, dev);
91c968ac
PM
112 if (replugging) {
113 object_unref(OBJECT(dev));
114 }
0c17542d
MA
115}
116
0210afe6
MA
117/* Create a new device. This only initializes the device state
118 structure and allows properties to be set. The device still needs
119 to be realized. See qdev-core.h. */
02e2da45 120DeviceState *qdev_create(BusState *bus, const char *name)
0bcdeda7
BS
121{
122 DeviceState *dev;
123
124 dev = qdev_try_create(bus, name);
125 if (!dev) {
e92714c7 126 if (bus) {
312fd5f2 127 error_report("Unknown device '%s' for bus '%s'", name,
23e3fbec 128 object_get_typename(OBJECT(bus)));
e92714c7 129 } else {
312fd5f2 130 error_report("Unknown device '%s' for default sysbus", name);
e92714c7 131 }
01ed1d52 132 abort();
0bcdeda7
BS
133 }
134
135 return dev;
136}
137
da57febf 138DeviceState *qdev_try_create(BusState *bus, const char *type)
aae9460e 139{
9fbe6127
AL
140 DeviceState *dev;
141
da57febf 142 if (object_class_by_name(type) == NULL) {
4ed658ca
AF
143 return NULL;
144 }
da57febf 145 dev = DEVICE(object_new(type));
9fbe6127
AL
146 if (!dev) {
147 return NULL;
148 }
149
10c4c98a 150 if (!bus) {
7474f1be
PM
151 /* Assert that the device really is a SysBusDevice before
152 * we put it onto the sysbus. Non-sysbus devices which aren't
153 * being put onto a bus should be created with object_new(TYPE_FOO),
154 * not qdev_create(NULL, TYPE_FOO).
155 */
156 g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE));
68694897 157 bus = sysbus_get_default();
10c4c98a
GH
158 }
159
9fbe6127 160 qdev_set_parent_bus(dev, bus);
b09995ae 161 object_unref(OBJECT(dev));
9fbe6127 162 return dev;
aae9460e
PB
163}
164
eae3eb3e 165static QTAILQ_HEAD(, DeviceListener) device_listeners
707ff800
PD
166 = QTAILQ_HEAD_INITIALIZER(device_listeners);
167
168enum ListenerDirection { Forward, Reverse };
169
170#define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
171 do { \
172 DeviceListener *_listener; \
173 \
174 switch (_direction) { \
175 case Forward: \
176 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
177 if (_listener->_callback) { \
178 _listener->_callback(_listener, ##_args); \
179 } \
180 } \
181 break; \
182 case Reverse: \
183 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
eae3eb3e 184 link) { \
707ff800
PD
185 if (_listener->_callback) { \
186 _listener->_callback(_listener, ##_args); \
187 } \
188 } \
189 break; \
190 default: \
191 abort(); \
192 } \
193 } while (0)
194
195static int device_listener_add(DeviceState *dev, void *opaque)
196{
197 DEVICE_LISTENER_CALL(realize, Forward, dev);
198
199 return 0;
200}
201
202void device_listener_register(DeviceListener *listener)
203{
204 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
205
206 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
207 NULL, NULL);
208}
209
210void device_listener_unregister(DeviceListener *listener)
211{
212 QTAILQ_REMOVE(&device_listeners, listener, link);
213}
214
4d2ffa08
JK
215void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
216 int required_for_version)
217{
7983c8a3 218 assert(!dev->realized);
4d2ffa08
JK
219 dev->instance_id_alias = alias_id;
220 dev->alias_required_for_version = required_for_version;
221}
222
03fcbd9d
TH
223HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
224{
225 MachineState *machine;
226 MachineClass *mc;
227 Object *m_obj = qdev_get_machine();
228
229 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
230 machine = MACHINE(m_obj);
231 mc = MACHINE_GET_CLASS(machine);
232 if (mc->get_hotplug_handler) {
233 return mc->get_hotplug_handler(machine, dev);
234 }
235 }
236
237 return NULL;
238}
239
14405c27
DH
240HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev)
241{
242 if (dev->parent_bus) {
243 return dev->parent_bus->hotplug_handler;
244 }
245 return NULL;
246}
247
c06b2ffb 248HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
7716b8ca 249{
17cc0128 250 HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
7716b8ca 251
17cc0128 252 if (hotplug_ctrl == NULL && dev->parent_bus) {
14405c27 253 hotplug_ctrl = qdev_get_bus_hotplug_handler(dev);
7716b8ca
IM
254 }
255 return hotplug_ctrl;
256}
257
ec990eb6
AL
258static int qdev_reset_one(DeviceState *dev, void *opaque)
259{
94afdadc 260 device_reset(dev);
ec990eb6
AL
261
262 return 0;
263}
264
b4694b7c
IY
265static int qbus_reset_one(BusState *bus, void *opaque)
266{
0d936928
AL
267 BusClass *bc = BUS_GET_CLASS(bus);
268 if (bc->reset) {
dcc20931 269 bc->reset(bus);
b4694b7c
IY
270 }
271 return 0;
272}
273
5af0a04b
IY
274void qdev_reset_all(DeviceState *dev)
275{
dcc20931 276 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
5af0a04b
IY
277}
278
ff8de075
DH
279void qdev_reset_all_fn(void *opaque)
280{
281 qdev_reset_all(DEVICE(opaque));
282}
283
d0508c36
PB
284void qbus_reset_all(BusState *bus)
285{
dcc20931 286 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
d0508c36
PB
287}
288
80376c3f
IY
289void qbus_reset_all_fn(void *opaque)
290{
291 BusState *bus = opaque;
d0508c36 292 qbus_reset_all(bus);
80376c3f
IY
293}
294
3418bd25 295/* can be used as ->unplug() callback for the simple cases */
014176f9
IM
296void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
297 DeviceState *dev, Error **errp)
298{
07578b0a 299 object_property_set_bool(OBJECT(dev), false, "realized", NULL);
014176f9 300}
3b29a101 301
0210afe6
MA
302/*
303 * Realize @dev.
304 * Device properties should be set before calling this function. IRQs
305 * and MMIO regions should be connected/mapped after calling this
306 * function.
307 * On failure, report an error with error_report() and terminate the
308 * program. This is okay during machine creation. Don't use for
309 * hotplug, because there callers need to recover from failure.
310 * Exception: if you know the device's init() callback can't fail,
311 * then qdev_init_nofail() can't fail either, and is therefore usable
312 * even then. But relying on the device implementation that way is
313 * somewhat unclean, and best avoided.
314 */
e23a1b33
MA
315void qdev_init_nofail(DeviceState *dev)
316{
c4bacafb 317 Error *err = NULL;
7de3abe5 318
c4bacafb
MA
319 assert(!dev->realized);
320
0d4104e5 321 object_ref(OBJECT(dev));
c4bacafb
MA
322 object_property_set_bool(OBJECT(dev), true, "realized", &err);
323 if (err) {
c29b77f9
MA
324 error_reportf_err(err, "Initialization of device %s failed: ",
325 object_get_typename(OBJECT(dev)));
bd6c9a61
MA
326 exit(1);
327 }
0d4104e5 328 object_unref(OBJECT(dev));
e23a1b33
MA
329}
330
3418bd25
GH
331void qdev_machine_creation_done(void)
332{
333 /*
334 * ok, initial machine setup is done, starting from now we can
335 * only create hotpluggable devices
336 */
9bed84c1 337 qdev_hotplug = true;
3418bd25
GH
338}
339
0ac8ef71
AW
340bool qdev_machine_modified(void)
341{
342 return qdev_hot_added || qdev_hot_removed;
343}
344
02e2da45 345BusState *qdev_get_parent_bus(DeviceState *dev)
aae9460e 346{
02e2da45 347 return dev->parent_bus;
aae9460e
PB
348}
349
a5f54290
PC
350static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
351 const char *name)
352{
353 NamedGPIOList *ngl;
354
355 QLIST_FOREACH(ngl, &dev->gpios, node) {
356 /* NULL is a valid and matchable name, otherwise do a normal
357 * strcmp match.
358 */
359 if ((!ngl->name && !name) ||
360 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
361 return ngl;
362 }
363 }
364
365 ngl = g_malloc0(sizeof(*ngl));
366 ngl->name = g_strdup(name);
367 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
368 return ngl;
369}
370
4a151677
PM
371void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
372 qemu_irq_handler handler,
373 void *opaque,
374 const char *name, int n)
a5f54290 375{
a69bef1c 376 int i;
a5f54290
PC
377 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
378
b235a71f 379 assert(gpio_list->num_out == 0 || !name);
a5f54290 380 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
4a151677 381 opaque, n);
a69bef1c 382
6c76b377
PF
383 if (!name) {
384 name = "unnamed-gpio-in";
385 }
a69bef1c 386 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
6c76b377
PF
387 gchar *propname = g_strdup_printf("%s[%u]", name, i);
388
a69bef1c
PC
389 object_property_add_child(OBJECT(dev), propname,
390 OBJECT(gpio_list->in[i]), &error_abort);
6c76b377 391 g_free(propname);
a69bef1c 392 }
a69bef1c 393
a5f54290
PC
394 gpio_list->num_in += n;
395}
396
aae9460e
PB
397void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
398{
a5f54290
PC
399 qdev_init_gpio_in_named(dev, handler, NULL, n);
400}
401
402void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
403 const char *name, int n)
404{
688b057a 405 int i;
a5f54290
PC
406 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
407
b235a71f 408 assert(gpio_list->num_in == 0 || !name);
688b057a 409
6c76b377
PF
410 if (!name) {
411 name = "unnamed-gpio-out";
412 }
413 memset(pins, 0, sizeof(*pins) * n);
688b057a 414 for (i = 0; i < n; ++i) {
6c76b377
PF
415 gchar *propname = g_strdup_printf("%s[%u]", name,
416 gpio_list->num_out + i);
417
688b057a
PC
418 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
419 (Object **)&pins[i],
420 object_property_allow_set_link,
265b578c 421 OBJ_PROP_LINK_STRONG,
688b057a 422 &error_abort);
6c76b377 423 g_free(propname);
688b057a 424 }
6c76b377 425 gpio_list->num_out += n;
aae9460e
PB
426}
427
428void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
429{
a5f54290
PC
430 qdev_init_gpio_out_named(dev, pins, NULL, n);
431}
432
433qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
434{
435 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
436
437 assert(n >= 0 && n < gpio_list->num_in);
438 return gpio_list->in[n];
aae9460e
PB
439}
440
441qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
442{
a5f54290
PC
443 return qdev_get_gpio_in_named(dev, NULL, n);
444}
445
446void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
447 qemu_irq pin)
448{
02757df2
PC
449 char *propname = g_strdup_printf("%s[%d]",
450 name ? name : "unnamed-gpio-out", n);
451 if (pin) {
452 /* We need a name for object_property_set_link to work. If the
453 * object has a parent, object_property_add_child will come back
454 * with an error without doing anything. If it has none, it will
455 * never fail. So we can just call it with a NULL Error pointer.
456 */
88950eef
AF
457 object_property_add_child(container_get(qdev_get_machine(),
458 "/unattached"),
459 "non-qdev-gpio[*]", OBJECT(pin), NULL);
02757df2
PC
460 }
461 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
462 g_free(propname);
aae9460e
PB
463}
464
b7973186
AG
465qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
466{
467 char *propname = g_strdup_printf("%s[%d]",
468 name ? name : "unnamed-gpio-out", n);
469
470 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
471 NULL);
472
473 return ret;
474}
475
67cc32eb 476/* disconnect a GPIO output, returning the disconnected input (if any) */
0c24db2b
PC
477
478static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
479 const char *name, int n)
480{
481 char *propname = g_strdup_printf("%s[%d]",
482 name ? name : "unnamed-gpio-out", n);
483
484 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
485 NULL);
486 if (ret) {
487 object_property_set_link(OBJECT(dev), NULL, propname, NULL);
488 }
489 g_free(propname);
490 return ret;
491}
a5f54290 492
0c24db2b
PC
493qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
494 const char *name, int n)
495{
496 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
497 qdev_connect_gpio_out_named(dev, name, n, icpt);
498 return disconnected;
aae9460e
PB
499}
500
501void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
502{
a5f54290 503 qdev_connect_gpio_out_named(dev, NULL, n, pin);
aae9460e
PB
504}
505
17a96a14
PC
506void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
507 const char *name)
508{
509 int i;
510 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
511
512 for (i = 0; i < ngl->num_in; i++) {
513 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
514 char *propname = g_strdup_printf("%s[%d]", nm, i);
515
516 object_property_add_alias(OBJECT(container), propname,
517 OBJECT(dev), propname,
518 &error_abort);
6bc5cf92 519 g_free(propname);
17a96a14
PC
520 }
521 for (i = 0; i < ngl->num_out; i++) {
522 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
523 char *propname = g_strdup_printf("%s[%d]", nm, i);
524
525 object_property_add_alias(OBJECT(container), propname,
526 OBJECT(dev), propname,
527 &error_abort);
6bc5cf92 528 g_free(propname);
17a96a14
PC
529 }
530 QLIST_REMOVE(ngl, node);
531 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
532}
533
02e2da45 534BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
4d6ae674 535{
02e2da45 536 BusState *bus;
f698c8ba
PC
537 Object *child = object_resolve_path_component(OBJECT(dev), name);
538
539 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
540 if (bus) {
541 return bus;
542 }
4d6ae674 543
72cf2d4f 544 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
4d6ae674 545 if (strcmp(name, bus->name) == 0) {
02e2da45 546 return bus;
4d6ae674
PB
547 }
548 }
549 return NULL;
550}
551
0293214b
PB
552int qdev_walk_children(DeviceState *dev,
553 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
554 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
555 void *opaque)
81699d8a
AL
556{
557 BusState *bus;
558 int err;
559
0293214b
PB
560 if (pre_devfn) {
561 err = pre_devfn(dev, opaque);
81699d8a
AL
562 if (err) {
563 return err;
564 }
565 }
566
567 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
0293214b
PB
568 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
569 post_devfn, post_busfn, opaque);
81699d8a
AL
570 if (err < 0) {
571 return err;
572 }
573 }
574
0293214b
PB
575 if (post_devfn) {
576 err = post_devfn(dev, opaque);
577 if (err) {
578 return err;
579 }
580 }
581
81699d8a
AL
582 return 0;
583}
584
a2ee6b4f 585DeviceState *qdev_find_recursive(BusState *bus, const char *id)
3418bd25 586{
0866aca1
AL
587 BusChild *kid;
588 DeviceState *ret;
3418bd25
GH
589 BusState *child;
590
0866aca1
AL
591 QTAILQ_FOREACH(kid, &bus->children, sibling) {
592 DeviceState *dev = kid->child;
593
594 if (dev->id && strcmp(dev->id, id) == 0) {
3418bd25 595 return dev;
0866aca1
AL
596 }
597
3418bd25
GH
598 QLIST_FOREACH(child, &dev->child_bus, sibling) {
599 ret = qdev_find_recursive(child, id);
600 if (ret) {
601 return ret;
602 }
603 }
604 }
605 return NULL;
606}
607
09e5ab63 608char *qdev_get_dev_path(DeviceState *dev)
85ed303b 609{
0d936928 610 BusClass *bc;
09e5ab63
AL
611
612 if (!dev || !dev->parent_bus) {
613 return NULL;
614 }
615
0d936928
AL
616 bc = BUS_GET_CLASS(dev->parent_bus);
617 if (bc->get_dev_path) {
618 return bc->get_dev_path(dev);
09e5ab63
AL
619 }
620
621 return NULL;
44677ded 622}
a5296ca9
AL
623
624/**
625 * Legacy property handling
626 */
627
d7bce999
EB
628static void qdev_get_legacy_property(Object *obj, Visitor *v,
629 const char *name, void *opaque,
630 Error **errp)
a5296ca9 631{
57c9fafe 632 DeviceState *dev = DEVICE(obj);
a5296ca9
AL
633 Property *prop = opaque;
634
e3cb6ba6
PB
635 char buffer[1024];
636 char *ptr = buffer;
a5296ca9 637
e3cb6ba6 638 prop->info->print(dev, prop, buffer, sizeof(buffer));
51e72bc1 639 visit_type_str(v, name, &ptr, errp);
a5296ca9
AL
640}
641
a5296ca9 642/**
d9d8d452
C
643 * qdev_property_add_legacy:
644 * @dev: Device to add the property to.
645 * @prop: The qdev property definition.
646 * @errp: location to store error information.
647 *
648 * Add a legacy QOM property to @dev for qdev property @prop.
649 * On error, store error in @errp.
a5296ca9 650 *
d9d8d452
C
651 * Legacy properties are string versions of QOM properties. The format of
652 * the string depends on the property type. Legacy properties are only
653 * needed for "info qtree".
a5296ca9 654 *
6871a0d0 655 * Do not use this in new code! QOM Properties added through this interface
d9d8d452 656 * will be given names in the "legacy" namespace.
a5296ca9 657 */
f5a014d2
SW
658static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
659 Error **errp)
a5296ca9 660{
7ce7ffe0 661 gchar *name;
a5296ca9 662
f3be016d 663 /* Register pointer properties as legacy properties */
03ff7770 664 if (!prop->info->print && prop->info->get) {
68ee3569
PB
665 return;
666 }
f3be016d 667
faabdbb7
FZ
668 if (prop->info->create) {
669 return;
670 }
671
ca2cc788 672 name = g_strdup_printf("legacy-%s", prop->name);
7ce7ffe0 673 object_property_add(OBJECT(dev), name, "str",
68ee3569 674 prop->info->print ? qdev_get_legacy_property : prop->info->get,
03ff7770 675 NULL,
57c9fafe
AL
676 NULL,
677 prop, errp);
a5296ca9 678
ca2cc788
PB
679 g_free(name);
680}
681
682/**
d9d8d452
C
683 * qdev_property_add_static:
684 * @dev: Device to add the property to.
685 * @prop: The qdev property definition.
686 * @errp: location to store error information.
ca2cc788 687 *
d9d8d452
C
688 * Add a static QOM property to @dev for qdev property @prop.
689 * On error, store error in @errp. Static properties access data in a struct.
690 * The type of the QOM property is derived from prop->info.
ca2cc788
PB
691 */
692void qdev_property_add_static(DeviceState *dev, Property *prop,
693 Error **errp)
694{
fdae245f
PB
695 Error *local_err = NULL;
696 Object *obj = OBJECT(dev);
697
faabdbb7
FZ
698 if (prop->info->create) {
699 prop->info->create(obj, prop, &local_err);
700 } else {
701 /*
702 * TODO qdev_prop_ptr does not have getters or setters. It must
703 * go now that it can be replaced with links. The test should be
704 * removed along with it: all static properties are read/write.
705 */
706 if (!prop->info->get && !prop->info->set) {
707 return;
708 }
709 object_property_add(obj, prop->name, prop->info->name,
710 prop->info->get, prop->info->set,
711 prop->info->release,
712 prop, &local_err);
d822979b
PB
713 }
714
fdae245f
PB
715 if (local_err) {
716 error_propagate(errp, local_err);
717 return;
718 }
b8c9cd5c
GA
719
720 object_property_set_description(obj, prop->name,
721 prop->info->description,
722 &error_abort);
723
5cc56cc6 724 if (prop->set_default) {
a2740ad5 725 prop->info->set_default_value(obj, prop);
fdae245f 726 }
6a146eba 727}
1de81d28 728
67cc7e0a
SH
729/* @qdev_alias_all_properties - Add alias properties to the source object for
730 * all qdev properties on the target DeviceState.
731 */
732void qdev_alias_all_properties(DeviceState *target, Object *source)
733{
734 ObjectClass *class;
735 Property *prop;
736
737 class = object_get_class(OBJECT(target));
738 do {
739 DeviceClass *dc = DEVICE_CLASS(class);
740
741 for (prop = dc->props; prop && prop->name; prop++) {
742 object_property_add_alias(source, prop->name,
743 OBJECT(target), prop->name,
744 &error_abort);
745 }
746 class = object_class_get_parent(class);
747 } while (class != object_class_by_name(TYPE_DEVICE));
748}
749
4cae4d5a 750static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
66e56b13
ZG
751{
752 GSList **list = opaque;
09d56017
JL
753 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
754 TYPE_DEVICE);
755
756 if (dev == NULL) {
757 return 0;
758 }
66e56b13
ZG
759
760 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
761 *list = g_slist_append(*list, dev);
762 }
763
66e56b13
ZG
764 return 0;
765}
766
4cae4d5a
MA
767GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
768{
769 GSList *list = NULL;
770
771 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
772
773 return list;
774}
775
a7737e44 776static bool device_get_realized(Object *obj, Error **errp)
249d4172
AF
777{
778 DeviceState *dev = DEVICE(obj);
779 return dev->realized;
780}
781
1bfe5f05
JQ
782static bool check_only_migratable(Object *obj, Error **err)
783{
784 DeviceClass *dc = DEVICE_GET_CLASS(obj);
785
786 if (!vmstate_check_only_migratable(dc->vmsd)) {
787 error_setg(err, "Device %s is not migratable, but "
788 "--only-migratable was specified",
789 object_get_typename(obj));
790 return false;
791 }
792
793 return true;
794}
795
a7737e44 796static void device_set_realized(Object *obj, bool value, Error **errp)
249d4172
AF
797{
798 DeviceState *dev = DEVICE(obj);
799 DeviceClass *dc = DEVICE_GET_CLASS(dev);
7716b8ca 800 HotplugHandler *hotplug_ctrl;
5c21ce77 801 BusState *bus;
249d4172 802 Error *local_err = NULL;
69382d8b
IM
803 bool unattached_parent = false;
804 static int unattached_count;
249d4172 805
1a37eca1 806 if (dev->hotplugged && !dc->hotpluggable) {
c6bd8c70 807 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
1a37eca1
IM
808 return;
809 }
810
249d4172 811 if (value && !dev->realized) {
1bfe5f05 812 if (!check_only_migratable(obj, &local_err)) {
7562f907
AA
813 goto fail;
814 }
815
d578029e 816 if (!obj->parent) {
249d4172
AF
817 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
818
819 object_property_add_child(container_get(qdev_get_machine(),
820 "/unattached"),
d578029e 821 name, obj, &error_abort);
69382d8b 822 unattached_parent = true;
249d4172
AF
823 g_free(name);
824 }
825
41346263
IM
826 hotplug_ctrl = qdev_get_hotplug_handler(dev);
827 if (hotplug_ctrl) {
828 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
829 if (local_err != NULL) {
830 goto fail;
831 }
832 }
833
a7ddba52
IM
834 if (dc->realize) {
835 dc->realize(dev, &local_err);
836 }
837
1d45a705
GA
838 if (local_err != NULL) {
839 goto fail;
840 }
841
707ff800
PD
842 DEVICE_LISTENER_CALL(realize, Forward, dev);
843
04162f8f
MR
844 /*
845 * always free/re-initialize here since the value cannot be cleaned up
846 * in device_unrealize due to its usage later on in the unplug path
847 */
848 g_free(dev->canonical_path);
849 dev->canonical_path = object_get_canonical_path(OBJECT(dev));
850
1d45a705 851 if (qdev_get_vmsd(dev)) {
67980031
DDAG
852 if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
853 dev->instance_id_alias,
854 dev->alias_required_for_version,
855 &local_err) < 0) {
856 goto post_realize_fail;
857 }
249d4172 858 }
1d45a705
GA
859
860 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
861 object_property_set_bool(OBJECT(bus), true, "realized",
5c21ce77 862 &local_err);
1d45a705
GA
863 if (local_err != NULL) {
864 goto child_realize_fail;
5c21ce77
BD
865 }
866 }
1d45a705 867 if (dev->hotplugged) {
249d4172
AF
868 device_reset(dev);
869 }
352e8da7 870 dev->pending_deleted_event = false;
25e89788
SH
871
872 if (hotplug_ctrl) {
8b5e6caf
IM
873 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
874 if (local_err != NULL) {
875 goto child_realize_fail;
876 }
877 }
878
249d4172 879 } else if (!value && dev->realized) {
cd4520ad 880 Error **local_errp = NULL;
5c21ce77 881 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
cd4520ad 882 local_errp = local_err ? NULL : &local_err;
5c21ce77 883 object_property_set_bool(OBJECT(bus), false, "realized",
cd4520ad 884 local_errp);
5c21ce77 885 }
cd4520ad 886 if (qdev_get_vmsd(dev)) {
fe6c2117
AF
887 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
888 }
cd4520ad
GA
889 if (dc->unrealize) {
890 local_errp = local_err ? NULL : &local_err;
891 dc->unrealize(dev, local_errp);
249d4172 892 }
352e8da7 893 dev->pending_deleted_event = true;
707ff800 894 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
c7f8d0f3 895 }
249d4172 896
c7f8d0f3
XG
897 if (local_err != NULL) {
898 goto fail;
249d4172
AF
899 }
900
c7f8d0f3 901 dev->realized = value;
1d45a705
GA
902 return;
903
904child_realize_fail:
905 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
906 object_property_set_bool(OBJECT(bus), false, "realized",
907 NULL);
908 }
909
910 if (qdev_get_vmsd(dev)) {
911 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
912 }
913
914post_realize_fail:
04162f8f
MR
915 g_free(dev->canonical_path);
916 dev->canonical_path = NULL;
1d45a705
GA
917 if (dc->unrealize) {
918 dc->unrealize(dev, NULL);
919 }
920
921fail:
922 error_propagate(errp, local_err);
69382d8b
IM
923 if (unattached_parent) {
924 object_unparent(OBJECT(dev));
925 unattached_count--;
926 }
249d4172
AF
927}
928
a7737e44 929static bool device_get_hotpluggable(Object *obj, Error **errp)
1a37eca1
IM
930{
931 DeviceClass *dc = DEVICE_GET_CLASS(obj);
932 DeviceState *dev = DEVICE(obj);
933
2b81b35f 934 return dc->hotpluggable && (dev->parent_bus == NULL ||
39b888bd 935 qbus_is_hotpluggable(dev->parent_bus));
1a37eca1
IM
936}
937
d012ffc1
IM
938static bool device_get_hotplugged(Object *obj, Error **err)
939{
940 DeviceState *dev = DEVICE(obj);
941
942 return dev->hotplugged;
943}
944
9674bfe4
AL
945static void device_initfn(Object *obj)
946{
947 DeviceState *dev = DEVICE(obj);
bce54474 948 ObjectClass *class;
9674bfe4
AL
949 Property *prop;
950
951 if (qdev_hotplug) {
952 dev->hotplugged = 1;
953 qdev_hot_added = true;
954 }
955
956 dev->instance_id_alias = -1;
7983c8a3 957 dev->realized = false;
9674bfe4 958
249d4172
AF
959 object_property_add_bool(obj, "realized",
960 device_get_realized, device_set_realized, NULL);
1a37eca1
IM
961 object_property_add_bool(obj, "hotpluggable",
962 device_get_hotpluggable, NULL, NULL);
d012ffc1 963 object_property_add_bool(obj, "hotplugged",
36cccb8c 964 device_get_hotplugged, NULL,
d012ffc1 965 &error_abort);
249d4172 966
bce54474
PB
967 class = object_get_class(OBJECT(dev));
968 do {
969 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
5433a0a8
PC
970 qdev_property_add_legacy(dev, prop, &error_abort);
971 qdev_property_add_static(dev, prop, &error_abort);
bce54474 972 }
bce54474
PB
973 class = object_class_get_parent(class);
974 } while (class != object_class_by_name(TYPE_DEVICE));
9674bfe4 975
f968fc68 976 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
39f72ef9 977 (Object **)&dev->parent_bus, NULL, 0,
9561fda8 978 &error_abort);
a5f54290 979 QLIST_INIT(&dev->gpios);
9674bfe4
AL
980}
981
1c3994f6
MAL
982static void device_post_init(Object *obj)
983{
1a3ec8c1
MA
984 /*
985 * Note: ordered so that the user's global properties take
986 * precedence.
987 */
1c3994f6 988 object_apply_compat_props(obj);
25f8dd96 989 qdev_prop_set_globals(DEVICE(obj));
99a0b036
EH
990}
991
60adba37
AL
992/* Unlink device from bus and free the structure. */
993static void device_finalize(Object *obj)
994{
a5f54290
PC
995 NamedGPIOList *ngl, *next;
996
60adba37 997 DeviceState *dev = DEVICE(obj);
a5f54290
PC
998
999 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1000 QLIST_REMOVE(ngl, node);
f173d57a 1001 qemu_free_irqs(ngl->in, ngl->num_in);
a5f54290
PC
1002 g_free(ngl->name);
1003 g_free(ngl);
1004 /* ngl->out irqs are owned by the other end and should not be freed
1005 * here
1006 */
1007 }
f7b879e0
MR
1008
1009 /* Only send event if the device had been completely realized */
1010 if (dev->pending_deleted_event) {
1011 g_assert(dev->canonical_path);
1012
3ab72385 1013 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
f7b879e0
MR
1014 g_free(dev->canonical_path);
1015 dev->canonical_path = NULL;
1016 }
1017
1018 qemu_opts_del(dev->opts);
60adba37
AL
1019}
1020
bce54474
PB
1021static void device_class_base_init(ObjectClass *class, void *data)
1022{
1023 DeviceClass *klass = DEVICE_CLASS(class);
1024
1025 /* We explicitly look up properties in the superclasses,
1026 * so do not propagate them to the subclasses.
1027 */
1028 klass->props = NULL;
60adba37
AL
1029}
1030
5d5b24d0 1031static void device_unparent(Object *obj)
667d22d1
PB
1032{
1033 DeviceState *dev = DEVICE(obj);
06f7f2bb 1034 BusState *bus;
667d22d1 1035
5c21ce77
BD
1036 if (dev->realized) {
1037 object_property_set_bool(obj, false, "realized", NULL);
1038 }
06f7f2bb
PB
1039 while (dev->num_child_bus) {
1040 bus = QLIST_FIRST(&dev->child_bus);
6780a22c 1041 object_unparent(OBJECT(bus));
06f7f2bb 1042 }
06f7f2bb 1043 if (dev->parent_bus) {
5d5b24d0 1044 bus_remove_child(dev->parent_bus, dev);
62d7ba66
PB
1045 object_unref(OBJECT(dev->parent_bus));
1046 dev->parent_bus = NULL;
5d5b24d0 1047 }
667d22d1
PB
1048}
1049
1050static void device_class_init(ObjectClass *class, void *data)
1051{
249d4172
AF
1052 DeviceClass *dc = DEVICE_CLASS(class);
1053
5d5b24d0 1054 class->unparent = device_unparent;
267a3264
IM
1055
1056 /* by default all devices were considered as hotpluggable,
1057 * so with intent to check it in generic qdev_unplug() /
1058 * device_set_realized() functions make every device
1059 * hotpluggable. Devices that shouldn't be hotpluggable,
1060 * should override it in their class_init()
1061 */
1062 dc->hotpluggable = true;
e90f2a8c 1063 dc->user_creatable = true;
667d22d1
PB
1064}
1065
46795cf2
PMD
1066void device_class_set_parent_reset(DeviceClass *dc,
1067 DeviceReset dev_reset,
1068 DeviceReset *parent_reset)
1069{
1070 *parent_reset = dc->reset;
1071 dc->reset = dev_reset;
1072}
1073
1074void device_class_set_parent_realize(DeviceClass *dc,
1075 DeviceRealize dev_realize,
1076 DeviceRealize *parent_realize)
1077{
1078 *parent_realize = dc->realize;
1079 dc->realize = dev_realize;
1080}
1081
1082void device_class_set_parent_unrealize(DeviceClass *dc,
1083 DeviceUnrealize dev_unrealize,
1084 DeviceUnrealize *parent_unrealize)
1085{
1086 *parent_unrealize = dc->unrealize;
1087 dc->unrealize = dev_unrealize;
1088}
1089
94afdadc
AL
1090void device_reset(DeviceState *dev)
1091{
1092 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1093
1094 if (klass->reset) {
1095 klass->reset(dev);
1096 }
1097}
1098
f05f6b4a
PB
1099Object *qdev_get_machine(void)
1100{
1101 static Object *dev;
1102
1103 if (dev == NULL) {
dfe47e70 1104 dev = container_get(object_get_root(), "/machine");
f05f6b4a
PB
1105 }
1106
1107 return dev;
1108}
1109
8c43a6f0 1110static const TypeInfo device_type_info = {
32fea402
AL
1111 .name = TYPE_DEVICE,
1112 .parent = TYPE_OBJECT,
1113 .instance_size = sizeof(DeviceState),
9674bfe4 1114 .instance_init = device_initfn,
99a0b036 1115 .instance_post_init = device_post_init,
60adba37 1116 .instance_finalize = device_finalize,
bce54474 1117 .class_base_init = device_class_base_init,
667d22d1 1118 .class_init = device_class_init,
32fea402
AL
1119 .abstract = true,
1120 .class_size = sizeof(DeviceClass),
1121};
1122
83f7d43a 1123static void qdev_register_types(void)
32fea402
AL
1124{
1125 type_register_static(&device_type_info);
1126}
1127
83f7d43a 1128type_init(qdev_register_types)