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