]> git.proxmox.com Git - mirror_qemu.git/blame - hw/core/qdev.c
Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20141010' into staging
[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
83c9f4ca 28#include "hw/qdev.h"
6b1566cb 29#include "hw/fw-path-provider.h"
9c17d615 30#include "sysemu/sysemu.h"
7b1b5d19 31#include "qapi/error.h"
b4a42f81 32#include "qapi/qmp/qerror.h"
7b1b5d19 33#include "qapi/visitor.h"
0402a5d6 34#include "qapi/qmp/qjson.h"
0ee4de6c 35#include "hw/hotplug.h"
b7454548 36#include "hw/boards.h"
24b699fb 37#include "qapi-event.h"
aae9460e 38
ee46d8a5 39int qdev_hotplug = 0;
0ac8ef71
AW
40static bool qdev_hot_added = false;
41static bool qdev_hot_removed = false;
3418bd25 42
4be9f0d1
AL
43const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
44{
6e008585
AL
45 DeviceClass *dc = DEVICE_GET_CLASS(dev);
46 return dc->vmsd;
4be9f0d1
AL
47}
48
4be9f0d1
AL
49const char *qdev_fw_name(DeviceState *dev)
50{
6e008585 51 DeviceClass *dc = DEVICE_GET_CLASS(dev);
4be9f0d1 52
6e008585
AL
53 if (dc->fw_name) {
54 return dc->fw_name;
4be9f0d1
AL
55 }
56
57 return object_get_typename(OBJECT(dev));
58}
59
ca2cc788
PB
60static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
61 Error **errp);
62
0866aca1 63static void bus_remove_child(BusState *bus, DeviceState *child)
0c17542d 64{
0866aca1
AL
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);
9d127820
PB
73
74 /* This gives back ownership of kid->child back to us. */
0866aca1 75 object_property_del(OBJECT(bus), name, NULL);
9d127820 76 object_unref(OBJECT(kid->child));
0866aca1
AL
77 g_free(kid);
78 return;
79 }
80 }
81}
82
83static void bus_add_child(BusState *bus, DeviceState *child)
84{
85 char name[32];
86 BusChild *kid = g_malloc0(sizeof(*kid));
0c17542d 87
0c17542d
MA
88 if (qdev_hotplug) {
89 assert(bus->allow_hotplug);
0c17542d 90 }
a5296ca9 91
0866aca1
AL
92 kid->index = bus->max_index++;
93 kid->child = child;
9d127820 94 object_ref(OBJECT(kid->child));
a5296ca9 95
0866aca1
AL
96 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
97
9d127820 98 /* This transfers ownership of kid->child to the property. */
0866aca1
AL
99 snprintf(name, sizeof(name), "child[%d]", kid->index);
100 object_property_add_link(OBJECT(bus), name,
101 object_get_typename(OBJECT(child)),
39f72ef9
SH
102 (Object **)&kid->child,
103 NULL, /* read-only property */
104 0, /* return ownership on prop deletion */
105 NULL);
0866aca1
AL
106}
107
108void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
109{
9fbe6127 110 dev->parent_bus = bus;
62d7ba66 111 object_ref(OBJECT(bus));
0866aca1 112 bus_add_child(bus, dev);
0c17542d
MA
113}
114
aae9460e
PB
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. */
02e2da45 118DeviceState *qdev_create(BusState *bus, const char *name)
0bcdeda7
BS
119{
120 DeviceState *dev;
121
122 dev = qdev_try_create(bus, name);
123 if (!dev) {
e92714c7 124 if (bus) {
312fd5f2 125 error_report("Unknown device '%s' for bus '%s'", name,
23e3fbec 126 object_get_typename(OBJECT(bus)));
e92714c7 127 } else {
312fd5f2 128 error_report("Unknown device '%s' for default sysbus", name);
e92714c7 129 }
01ed1d52 130 abort();
0bcdeda7
BS
131 }
132
133 return dev;
134}
135
da57febf 136DeviceState *qdev_try_create(BusState *bus, const char *type)
aae9460e 137{
9fbe6127
AL
138 DeviceState *dev;
139
da57febf 140 if (object_class_by_name(type) == NULL) {
4ed658ca
AF
141 return NULL;
142 }
da57febf 143 dev = DEVICE(object_new(type));
9fbe6127
AL
144 if (!dev) {
145 return NULL;
146 }
147
10c4c98a 148 if (!bus) {
68694897 149 bus = sysbus_get_default();
10c4c98a
GH
150 }
151
9fbe6127 152 qdev_set_parent_bus(dev, bus);
b09995ae 153 object_unref(OBJECT(dev));
9fbe6127 154 return dev;
aae9460e
PB
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
18cfeb52
MA
159 calling this function.
160 On failure, destroy the device and return negative value.
161 Return 0 on success. */
81a322d4 162int qdev_init(DeviceState *dev)
aae9460e 163{
249d4172 164 Error *local_err = NULL;
959f733a 165
7983c8a3 166 assert(!dev->realized);
6e008585 167
249d4172
AF
168 object_property_set_bool(OBJECT(dev), true, "realized", &local_err);
169 if (local_err != NULL) {
cffc5113 170 qerror_report_err(local_err);
249d4172 171 error_free(local_err);
02a5c4c9 172 object_unparent(OBJECT(dev));
249d4172 173 return -1;
18cfeb52 174 }
249d4172
AF
175 return 0;
176}
da57febf 177
a7737e44 178static void device_realize(DeviceState *dev, Error **errp)
249d4172
AF
179{
180 DeviceClass *dc = DEVICE_GET_CLASS(dev);
da57febf 181
249d4172
AF
182 if (dc->init) {
183 int rc = dc->init(dev);
184 if (rc < 0) {
a7737e44 185 error_setg(errp, "Device initialization failed.");
249d4172
AF
186 return;
187 }
5ab28c83 188 }
02e2da45
PB
189}
190
fe6c2117
AF
191static 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
4d2ffa08
JK
204void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
205 int required_for_version)
206{
7983c8a3 207 assert(!dev->realized);
4d2ffa08
JK
208 dev->instance_id_alias = alias_id;
209 dev->alias_required_for_version = required_for_version;
210}
211
56f9107e 212void qdev_unplug(DeviceState *dev, Error **errp)
3418bd25 213{
6e008585
AL
214 DeviceClass *dc = DEVICE_GET_CLASS(dev);
215
120dc38f 216 if (dev->parent_bus && !dev->parent_bus->allow_hotplug) {
56f9107e
LC
217 error_set(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
218 return;
3418bd25 219 }
593831de 220
1a37eca1
IM
221 if (!dc->hotpluggable) {
222 error_set(errp, QERR_DEVICE_NO_HOTPLUG,
223 object_get_typename(OBJECT(dev)));
224 return;
225 }
226
0ac8ef71
AW
227 qdev_hot_removed = true;
228
5e954943
IM
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 }
56f9107e 236 }
3418bd25
GH
237}
238
ec990eb6
AL
239static int qdev_reset_one(DeviceState *dev, void *opaque)
240{
94afdadc 241 device_reset(dev);
ec990eb6
AL
242
243 return 0;
244}
245
b4694b7c
IY
246static int qbus_reset_one(BusState *bus, void *opaque)
247{
0d936928
AL
248 BusClass *bc = BUS_GET_CLASS(bus);
249 if (bc->reset) {
dcc20931 250 bc->reset(bus);
b4694b7c
IY
251 }
252 return 0;
253}
254
5af0a04b
IY
255void qdev_reset_all(DeviceState *dev)
256{
dcc20931 257 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
5af0a04b
IY
258}
259
d0508c36
PB
260void qbus_reset_all(BusState *bus)
261{
dcc20931 262 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
d0508c36
PB
263}
264
80376c3f
IY
265void qbus_reset_all_fn(void *opaque)
266{
267 BusState *bus = opaque;
d0508c36 268 qbus_reset_all(bus);
80376c3f
IY
269}
270
3418bd25
GH
271/* can be used as ->unplug() callback for the simple cases */
272int qdev_simple_unplug_cb(DeviceState *dev)
273{
274 /* just zap it */
02a5c4c9 275 object_unparent(OBJECT(dev));
3418bd25
GH
276 return 0;
277}
278
3b29a101
MT
279
280/* Like qdev_init(), but terminate program via error_report() instead of
e23a1b33
MA
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. */
287void qdev_init_nofail(DeviceState *dev)
288{
7de3abe5
AL
289 const char *typename = object_get_typename(OBJECT(dev));
290
bd6c9a61 291 if (qdev_init(dev) < 0) {
7de3abe5 292 error_report("Initialization of device %s failed", typename);
bd6c9a61
MA
293 exit(1);
294 }
e23a1b33
MA
295}
296
3418bd25
GH
297void 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
0ac8ef71
AW
306bool qdev_machine_modified(void)
307{
308 return qdev_hot_added || qdev_hot_removed;
309}
310
02e2da45 311BusState *qdev_get_parent_bus(DeviceState *dev)
aae9460e 312{
02e2da45 313 return dev->parent_bus;
aae9460e
PB
314}
315
a5f54290
PC
316static 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
337void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
338 const char *name, int n)
339{
340 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
341
342 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
343 dev, n);
344 gpio_list->num_in += n;
345}
346
aae9460e
PB
347void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
348{
a5f54290
PC
349 qdev_init_gpio_in_named(dev, handler, NULL, n);
350}
351
352void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
353 const char *name, int n)
354{
355 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
356
357 assert(gpio_list->num_out == 0);
358 gpio_list->num_out = n;
359 gpio_list->out = pins;
aae9460e
PB
360}
361
362void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
363{
a5f54290
PC
364 qdev_init_gpio_out_named(dev, pins, NULL, n);
365}
366
367qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
368{
369 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
370
371 assert(n >= 0 && n < gpio_list->num_in);
372 return gpio_list->in[n];
aae9460e
PB
373}
374
375qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
376{
a5f54290
PC
377 return qdev_get_gpio_in_named(dev, NULL, n);
378}
379
380void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
381 qemu_irq pin)
382{
383 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
384
385 assert(n >= 0 && n < gpio_list->num_out);
386 gpio_list->out[n] = pin;
aae9460e
PB
387}
388
389void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
390{
a5f54290 391 qdev_connect_gpio_out_named(dev, NULL, n, pin);
aae9460e
PB
392}
393
02e2da45 394BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
4d6ae674 395{
02e2da45 396 BusState *bus;
4d6ae674 397
72cf2d4f 398 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
4d6ae674 399 if (strcmp(name, bus->name) == 0) {
02e2da45 400 return bus;
4d6ae674
PB
401 }
402 }
403 return NULL;
404}
405
0293214b
PB
406int qbus_walk_children(BusState *bus,
407 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
408 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
409 void *opaque)
81699d8a 410{
0866aca1 411 BusChild *kid;
81699d8a
AL
412 int err;
413
0293214b
PB
414 if (pre_busfn) {
415 err = pre_busfn(bus, opaque);
81699d8a
AL
416 if (err) {
417 return err;
418 }
419 }
420
0866aca1 421 QTAILQ_FOREACH(kid, &bus->children, sibling) {
0293214b
PB
422 err = qdev_walk_children(kid->child,
423 pre_devfn, pre_busfn,
424 post_devfn, post_busfn, opaque);
81699d8a
AL
425 if (err < 0) {
426 return err;
427 }
428 }
429
0293214b
PB
430 if (post_busfn) {
431 err = post_busfn(bus, opaque);
432 if (err) {
433 return err;
434 }
435 }
436
81699d8a
AL
437 return 0;
438}
439
0293214b
PB
440int qdev_walk_children(DeviceState *dev,
441 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
442 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
443 void *opaque)
81699d8a
AL
444{
445 BusState *bus;
446 int err;
447
0293214b
PB
448 if (pre_devfn) {
449 err = pre_devfn(dev, opaque);
81699d8a
AL
450 if (err) {
451 return err;
452 }
453 }
454
455 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
0293214b
PB
456 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
457 post_devfn, post_busfn, opaque);
81699d8a
AL
458 if (err < 0) {
459 return err;
460 }
461 }
462
0293214b
PB
463 if (post_devfn) {
464 err = post_devfn(dev, opaque);
465 if (err) {
466 return err;
467 }
468 }
469
81699d8a
AL
470 return 0;
471}
472
a2ee6b4f 473DeviceState *qdev_find_recursive(BusState *bus, const char *id)
3418bd25 474{
0866aca1
AL
475 BusChild *kid;
476 DeviceState *ret;
3418bd25
GH
477 BusState *child;
478
0866aca1
AL
479 QTAILQ_FOREACH(kid, &bus->children, sibling) {
480 DeviceState *dev = kid->child;
481
482 if (dev->id && strcmp(dev->id, id) == 0) {
3418bd25 483 return dev;
0866aca1
AL
484 }
485
3418bd25
GH
486 QLIST_FOREACH(child, &dev->child_bus, sibling) {
487 ret = qdev_find_recursive(child, id);
488 if (ret) {
489 return ret;
490 }
491 }
492 }
493 return NULL;
494}
495
013e1182 496static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
02e2da45 497{
ac7d1ba6 498 const char *typename = object_get_typename(OBJECT(bus));
61de3676 499 BusClass *bc;
d271de9f 500 char *buf;
61de3676 501 int i, len, bus_id;
02e2da45 502
013e1182
PB
503 bus->parent = parent;
504
505 if (name) {
506 bus->name = g_strdup(name);
ac7d1ba6 507 } else if (bus->parent && bus->parent->id) {
61de3676
AG
508 /* parent device has id -> use it plus parent-bus-id for bus name */
509 bus_id = bus->parent->num_child_bus;
510
ac7d1ba6 511 len = strlen(bus->parent->id) + 16;
7267c094 512 buf = g_malloc(len);
61de3676 513 snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
d271de9f
GH
514 bus->name = buf;
515 } else {
61de3676
AG
516 /* no id -> use lowercase bus type plus global bus-id for bus name */
517 bc = BUS_GET_CLASS(bus);
518 bus_id = bc->automatic_ids++;
519
0d936928 520 len = strlen(typename) + 16;
7267c094 521 buf = g_malloc(len);
61de3676
AG
522 len = snprintf(buf, len, "%s.%d", typename, bus_id);
523 for (i = 0; i < len; i++) {
bb87ece5 524 buf[i] = qemu_tolower(buf[i]);
61de3676 525 }
d271de9f
GH
526 bus->name = buf;
527 }
528
ac7d1ba6
AL
529 if (bus->parent) {
530 QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
531 bus->parent->num_child_bus++;
532 object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL);
b09995ae 533 object_unref(OBJECT(bus));
8185d216 534 } else if (bus != sysbus_get_default()) {
80376c3f
IY
535 /* TODO: once all bus devices are qdevified,
536 only reset handler for main_system_bus should be registered here. */
537 qemu_register_reset(qbus_reset_all_fn, bus);
02e2da45 538 }
cd739fb6
GH
539}
540
6853d27a
PB
541static void bus_unparent(Object *obj)
542{
543 BusState *bus = BUS(obj);
544 BusChild *kid;
545
546 while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
547 DeviceState *dev = kid->child;
02a5c4c9 548 object_unparent(OBJECT(dev));
6853d27a
PB
549 }
550 if (bus->parent) {
551 QLIST_REMOVE(bus, sibling);
552 bus->parent->num_child_bus--;
553 bus->parent = NULL;
554 } else {
555 assert(bus != sysbus_get_default()); /* main_system_bus is never freed */
556 qemu_unregister_reset(qbus_reset_all_fn, bus);
557 }
558}
559
a7737e44 560static bool bus_get_realized(Object *obj, Error **errp)
02e7f85d
BD
561{
562 BusState *bus = BUS(obj);
563
564 return bus->realized;
565}
566
a7737e44 567static void bus_set_realized(Object *obj, bool value, Error **errp)
02e7f85d
BD
568{
569 BusState *bus = BUS(obj);
570 BusClass *bc = BUS_GET_CLASS(bus);
5942a190 571 BusChild *kid;
02e7f85d
BD
572 Error *local_err = NULL;
573
574 if (value && !bus->realized) {
575 if (bc->realize) {
576 bc->realize(bus, &local_err);
02e7f85d 577 }
5942a190
PB
578
579 /* TODO: recursive realization */
02e7f85d 580 } else if (!value && bus->realized) {
5942a190
PB
581 QTAILQ_FOREACH(kid, &bus->children, sibling) {
582 DeviceState *dev = kid->child;
583 object_property_set_bool(OBJECT(dev), false, "realized",
584 &local_err);
585 if (local_err != NULL) {
586 break;
587 }
588 }
589 if (bc->unrealize && local_err == NULL) {
02e7f85d 590 bc->unrealize(bus, &local_err);
02e7f85d
BD
591 }
592 }
593
b7b34d05
PB
594 if (local_err != NULL) {
595 error_propagate(errp, local_err);
596 return;
597 }
02e7f85d 598
b7b34d05 599 bus->realized = value;
02e7f85d
BD
600}
601
fb17dfe0 602void qbus_create_inplace(void *bus, size_t size, const char *typename,
0d936928 603 DeviceState *parent, const char *name)
cd739fb6 604{
213f0c4f 605 object_initialize(bus, size, typename);
013e1182 606 qbus_realize(bus, parent, name);
02e2da45 607}
cae4956e 608
0d936928 609BusState *qbus_create(const char *typename, DeviceState *parent, const char *name)
2da8bb92 610{
cd739fb6
GH
611 BusState *bus;
612
0d936928 613 bus = BUS(object_new(typename));
013e1182 614 qbus_realize(bus, parent, name);
ac7d1ba6 615
02e2da45 616 return bus;
2da8bb92
IY
617}
618
0d936928
AL
619static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
620{
621 BusClass *bc = BUS_GET_CLASS(bus);
622
623 if (bc->get_fw_dev_path) {
624 return bc->get_fw_dev_path(dev);
131ec1bd 625 }
0d936928
AL
626
627 return NULL;
131ec1bd
GH
628}
629
6b1566cb
PB
630static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
631{
632 Object *obj = OBJECT(dev);
633 char *d = NULL;
634
635 while (!d && obj->parent) {
636 obj = obj->parent;
637 d = fw_path_provider_try_get_dev_path(obj, bus, dev);
638 }
639 return d;
640}
641
1ca4d09a
GN
642static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
643{
644 int l = 0;
645
646 if (dev && dev->parent_bus) {
647 char *d;
648 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
6b1566cb
PB
649 d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
650 if (!d) {
651 d = bus_get_fw_dev_path(dev->parent_bus, dev);
652 }
0d936928 653 if (d) {
1ca4d09a 654 l += snprintf(p + l, size - l, "%s", d);
7267c094 655 g_free(d);
1ca4d09a 656 } else {
bbfa18fc 657 return l;
1ca4d09a
GN
658 }
659 }
660 l += snprintf(p + l , size - l, "/");
661
662 return l;
663}
664
665char* qdev_get_fw_dev_path(DeviceState *dev)
666{
667 char path[128];
668 int l;
669
670 l = qdev_get_fw_dev_path_helper(dev, path, 128);
671
672 path[l-1] = '\0';
673
a5cf8262 674 return g_strdup(path);
1ca4d09a 675}
85ed303b 676
09e5ab63 677char *qdev_get_dev_path(DeviceState *dev)
85ed303b 678{
0d936928 679 BusClass *bc;
09e5ab63
AL
680
681 if (!dev || !dev->parent_bus) {
682 return NULL;
683 }
684
0d936928
AL
685 bc = BUS_GET_CLASS(dev->parent_bus);
686 if (bc->get_dev_path) {
687 return bc->get_dev_path(dev);
09e5ab63
AL
688 }
689
690 return NULL;
44677ded 691}
a5296ca9
AL
692
693/**
694 * Legacy property handling
695 */
696
57c9fafe 697static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque,
a5296ca9
AL
698 const char *name, Error **errp)
699{
57c9fafe 700 DeviceState *dev = DEVICE(obj);
a5296ca9
AL
701 Property *prop = opaque;
702
e3cb6ba6
PB
703 char buffer[1024];
704 char *ptr = buffer;
a5296ca9 705
e3cb6ba6
PB
706 prop->info->print(dev, prop, buffer, sizeof(buffer));
707 visit_type_str(v, &ptr, name, errp);
a5296ca9
AL
708}
709
a5296ca9
AL
710/**
711 * @qdev_add_legacy_property - adds a legacy property
712 *
713 * Do not use this is new code! Properties added through this interface will
ca2cc788 714 * be given names and types in the "legacy" namespace.
a5296ca9 715 *
68ee3569
PB
716 * Legacy properties are string versions of other OOM properties. The format
717 * of the string depends on the property type.
a5296ca9 718 */
f5a014d2
SW
719static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
720 Error **errp)
a5296ca9 721{
7ce7ffe0 722 gchar *name;
a5296ca9 723
f3be016d 724 /* Register pointer properties as legacy properties */
03ff7770 725 if (!prop->info->print && prop->info->get) {
68ee3569
PB
726 return;
727 }
f3be016d 728
ca2cc788 729 name = g_strdup_printf("legacy-%s", prop->name);
7ce7ffe0 730 object_property_add(OBJECT(dev), name, "str",
68ee3569 731 prop->info->print ? qdev_get_legacy_property : prop->info->get,
03ff7770 732 NULL,
57c9fafe
AL
733 NULL,
734 prop, errp);
a5296ca9 735
ca2cc788
PB
736 g_free(name);
737}
738
739/**
740 * @qdev_property_add_static - add a @Property to a device.
741 *
742 * Static properties access data in a struct. The actual type of the
743 * property and the field depends on the property type.
744 */
745void qdev_property_add_static(DeviceState *dev, Property *prop,
746 Error **errp)
747{
fdae245f
PB
748 Error *local_err = NULL;
749 Object *obj = OBJECT(dev);
750
d822979b
PB
751 /*
752 * TODO qdev_prop_ptr does not have getters or setters. It must
753 * go now that it can be replaced with links. The test should be
754 * removed along with it: all static properties are read/write.
755 */
756 if (!prop->info->get && !prop->info->set) {
757 return;
758 }
759
fdae245f 760 object_property_add(obj, prop->name, prop->info->name,
57c9fafe 761 prop->info->get, prop->info->set,
dd0ba250 762 prop->info->release,
fdae245f
PB
763 prop, &local_err);
764
765 if (local_err) {
766 error_propagate(errp, local_err);
767 return;
768 }
769 if (prop->qtype == QTYPE_NONE) {
770 return;
771 }
772
773 if (prop->qtype == QTYPE_QBOOL) {
5433a0a8 774 object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
fdae245f
PB
775 } else if (prop->info->enum_table) {
776 object_property_set_str(obj, prop->info->enum_table[prop->defval],
5433a0a8 777 prop->name, &error_abort);
fdae245f 778 } else if (prop->qtype == QTYPE_QINT) {
5433a0a8 779 object_property_set_int(obj, prop->defval, prop->name, &error_abort);
fdae245f 780 }
6a146eba 781}
1de81d28 782
67cc7e0a
SH
783/* @qdev_alias_all_properties - Add alias properties to the source object for
784 * all qdev properties on the target DeviceState.
785 */
786void qdev_alias_all_properties(DeviceState *target, Object *source)
787{
788 ObjectClass *class;
789 Property *prop;
790
791 class = object_get_class(OBJECT(target));
792 do {
793 DeviceClass *dc = DEVICE_CLASS(class);
794
795 for (prop = dc->props; prop && prop->name; prop++) {
796 object_property_add_alias(source, prop->name,
797 OBJECT(target), prop->name,
798 &error_abort);
799 }
800 class = object_class_get_parent(class);
801 } while (class != object_class_by_name(TYPE_DEVICE));
802}
803
a7737e44 804static bool device_get_realized(Object *obj, Error **errp)
249d4172
AF
805{
806 DeviceState *dev = DEVICE(obj);
807 return dev->realized;
808}
809
a7737e44 810static void device_set_realized(Object *obj, bool value, Error **errp)
249d4172
AF
811{
812 DeviceState *dev = DEVICE(obj);
813 DeviceClass *dc = DEVICE_GET_CLASS(dev);
5c21ce77 814 BusState *bus;
249d4172
AF
815 Error *local_err = NULL;
816
1a37eca1 817 if (dev->hotplugged && !dc->hotpluggable) {
a7737e44 818 error_set(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
1a37eca1
IM
819 return;
820 }
821
249d4172 822 if (value && !dev->realized) {
d578029e 823 if (!obj->parent) {
249d4172
AF
824 static int unattached_count;
825 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
826
827 object_property_add_child(container_get(qdev_get_machine(),
828 "/unattached"),
d578029e 829 name, obj, &error_abort);
249d4172
AF
830 g_free(name);
831 }
832
a7ddba52
IM
833 if (dc->realize) {
834 dc->realize(dev, &local_err);
835 }
836
1d45a705
GA
837 if (local_err != NULL) {
838 goto fail;
839 }
840
841 if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
5e954943
IM
842 hotplug_handler_plug(dev->parent_bus->hotplug_handler,
843 dev, &local_err);
1d45a705 844 } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
b7454548
IM
845 HotplugHandler *hotplug_ctrl;
846 MachineState *machine = MACHINE(qdev_get_machine());
847 MachineClass *mc = MACHINE_GET_CLASS(machine);
848
849 if (mc->get_hotplug_handler) {
850 hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
851 if (hotplug_ctrl) {
852 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
853 }
854 }
5e954943
IM
855 }
856
1d45a705
GA
857 if (local_err != NULL) {
858 goto post_realize_fail;
859 }
860
861 if (qdev_get_vmsd(dev)) {
249d4172
AF
862 vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
863 dev->instance_id_alias,
864 dev->alias_required_for_version);
865 }
1d45a705
GA
866
867 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
868 object_property_set_bool(OBJECT(bus), true, "realized",
5c21ce77 869 &local_err);
1d45a705
GA
870 if (local_err != NULL) {
871 goto child_realize_fail;
5c21ce77
BD
872 }
873 }
1d45a705 874 if (dev->hotplugged) {
249d4172
AF
875 device_reset(dev);
876 }
352e8da7 877 dev->pending_deleted_event = false;
249d4172 878 } else if (!value && dev->realized) {
cd4520ad 879 Error **local_errp = NULL;
5c21ce77 880 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
cd4520ad 881 local_errp = local_err ? NULL : &local_err;
5c21ce77 882 object_property_set_bool(OBJECT(bus), false, "realized",
cd4520ad 883 local_errp);
5c21ce77 884 }
cd4520ad 885 if (qdev_get_vmsd(dev)) {
fe6c2117
AF
886 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
887 }
cd4520ad
GA
888 if (dc->unrealize) {
889 local_errp = local_err ? NULL : &local_err;
890 dc->unrealize(dev, local_errp);
249d4172 891 }
352e8da7 892 dev->pending_deleted_event = true;
249d4172
AF
893 }
894
895 if (local_err != NULL) {
1d45a705 896 goto fail;
249d4172
AF
897 }
898
899 dev->realized = value;
1d45a705
GA
900 return;
901
902child_realize_fail:
903 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
904 object_property_set_bool(OBJECT(bus), false, "realized",
905 NULL);
906 }
907
908 if (qdev_get_vmsd(dev)) {
909 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
910 }
911
912post_realize_fail:
913 if (dc->unrealize) {
914 dc->unrealize(dev, NULL);
915 }
916
917fail:
918 error_propagate(errp, local_err);
919 return;
249d4172
AF
920}
921
a7737e44 922static bool device_get_hotpluggable(Object *obj, Error **errp)
1a37eca1
IM
923{
924 DeviceClass *dc = DEVICE_GET_CLASS(obj);
925 DeviceState *dev = DEVICE(obj);
926
2b81b35f
AF
927 return dc->hotpluggable && (dev->parent_bus == NULL ||
928 dev->parent_bus->allow_hotplug);
1a37eca1
IM
929}
930
d012ffc1
IM
931static bool device_get_hotplugged(Object *obj, Error **err)
932{
933 DeviceState *dev = DEVICE(obj);
934
935 return dev->hotplugged;
936}
937
938static void device_set_hotplugged(Object *obj, bool value, Error **err)
939{
940 DeviceState *dev = DEVICE(obj);
941
942 dev->hotplugged = value;
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
IM
963 object_property_add_bool(obj, "hotplugged",
964 device_get_hotplugged, device_set_hotplugged,
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
99a0b036
EH
982static void device_post_init(Object *obj)
983{
31962700
EH
984 Error *err = NULL;
985 qdev_prop_set_globals(DEVICE(obj), &err);
986 if (err) {
987 qerror_report_err(err);
988 error_free(err);
989 exit(EXIT_FAILURE);
990 }
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);
06f7f2bb
PB
999 if (dev->opts) {
1000 qemu_opts_del(dev->opts);
60adba37 1001 }
a5f54290
PC
1002
1003 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1004 QLIST_REMOVE(ngl, node);
f173d57a 1005 qemu_free_irqs(ngl->in, ngl->num_in);
a5f54290
PC
1006 g_free(ngl->name);
1007 g_free(ngl);
1008 /* ngl->out irqs are owned by the other end and should not be freed
1009 * here
1010 */
1011 }
60adba37
AL
1012}
1013
bce54474
PB
1014static void device_class_base_init(ObjectClass *class, void *data)
1015{
1016 DeviceClass *klass = DEVICE_CLASS(class);
1017
1018 /* We explicitly look up properties in the superclasses,
1019 * so do not propagate them to the subclasses.
1020 */
1021 klass->props = NULL;
60adba37
AL
1022}
1023
5d5b24d0 1024static void device_unparent(Object *obj)
667d22d1
PB
1025{
1026 DeviceState *dev = DEVICE(obj);
06f7f2bb 1027 BusState *bus;
667d22d1 1028
5c21ce77
BD
1029 if (dev->realized) {
1030 object_property_set_bool(obj, false, "realized", NULL);
1031 }
06f7f2bb
PB
1032 while (dev->num_child_bus) {
1033 bus = QLIST_FIRST(&dev->child_bus);
6780a22c 1034 object_unparent(OBJECT(bus));
06f7f2bb 1035 }
06f7f2bb 1036 if (dev->parent_bus) {
5d5b24d0 1037 bus_remove_child(dev->parent_bus, dev);
62d7ba66
PB
1038 object_unref(OBJECT(dev->parent_bus));
1039 dev->parent_bus = NULL;
5d5b24d0 1040 }
0402a5d6 1041
b1ee5829 1042 /* Only send event if the device had been completely realized */
352e8da7 1043 if (dev->pending_deleted_event) {
b1ee5829
AL
1044 gchar *path = object_get_canonical_path(OBJECT(dev));
1045
24b699fb 1046 qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
b1ee5829 1047 g_free(path);
0402a5d6 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;
249d4172 1056 dc->realize = device_realize;
fe6c2117 1057 dc->unrealize = device_unrealize;
267a3264
IM
1058
1059 /* by default all devices were considered as hotpluggable,
1060 * so with intent to check it in generic qdev_unplug() /
1061 * device_set_realized() functions make every device
1062 * hotpluggable. Devices that shouldn't be hotpluggable,
1063 * should override it in their class_init()
1064 */
1065 dc->hotpluggable = true;
667d22d1
PB
1066}
1067
94afdadc
AL
1068void device_reset(DeviceState *dev)
1069{
1070 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1071
1072 if (klass->reset) {
1073 klass->reset(dev);
1074 }
1075}
1076
f05f6b4a
PB
1077Object *qdev_get_machine(void)
1078{
1079 static Object *dev;
1080
1081 if (dev == NULL) {
dfe47e70 1082 dev = container_get(object_get_root(), "/machine");
f05f6b4a
PB
1083 }
1084
1085 return dev;
1086}
1087
8c43a6f0 1088static const TypeInfo device_type_info = {
32fea402
AL
1089 .name = TYPE_DEVICE,
1090 .parent = TYPE_OBJECT,
1091 .instance_size = sizeof(DeviceState),
9674bfe4 1092 .instance_init = device_initfn,
99a0b036 1093 .instance_post_init = device_post_init,
60adba37 1094 .instance_finalize = device_finalize,
bce54474 1095 .class_base_init = device_class_base_init,
667d22d1 1096 .class_init = device_class_init,
32fea402
AL
1097 .abstract = true,
1098 .class_size = sizeof(DeviceClass),
1099};
1100
ac7d1ba6
AL
1101static void qbus_initfn(Object *obj)
1102{
1103 BusState *bus = BUS(obj);
1104
1105 QTAILQ_INIT(&bus->children);
0ee4de6c
IM
1106 object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY,
1107 TYPE_HOTPLUG_HANDLER,
9561fda8 1108 (Object **)&bus->hotplug_handler,
39f72ef9 1109 object_property_allow_set_link,
9561fda8
SH
1110 OBJ_PROP_LINK_UNREF_ON_RELEASE,
1111 NULL);
02e7f85d
BD
1112 object_property_add_bool(obj, "realized",
1113 bus_get_realized, bus_set_realized, NULL);
ac7d1ba6
AL
1114}
1115
bbfa18fc
AK
1116static char *default_bus_get_fw_dev_path(DeviceState *dev)
1117{
1118 return g_strdup(object_get_typename(OBJECT(dev)));
1119}
1120
6853d27a
PB
1121static void bus_class_init(ObjectClass *class, void *data)
1122{
bbfa18fc
AK
1123 BusClass *bc = BUS_CLASS(class);
1124
6853d27a 1125 class->unparent = bus_unparent;
bbfa18fc 1126 bc->get_fw_dev_path = default_bus_get_fw_dev_path;
6853d27a
PB
1127}
1128
ac7d1ba6
AL
1129static void qbus_finalize(Object *obj)
1130{
1131 BusState *bus = BUS(obj);
ac7d1ba6 1132
ac7d1ba6
AL
1133 g_free((char *)bus->name);
1134}
1135
0d936928
AL
1136static const TypeInfo bus_info = {
1137 .name = TYPE_BUS,
1138 .parent = TYPE_OBJECT,
1139 .instance_size = sizeof(BusState),
1140 .abstract = true,
1141 .class_size = sizeof(BusClass),
ac7d1ba6
AL
1142 .instance_init = qbus_initfn,
1143 .instance_finalize = qbus_finalize,
6853d27a 1144 .class_init = bus_class_init,
0d936928
AL
1145};
1146
83f7d43a 1147static void qdev_register_types(void)
32fea402 1148{
0d936928 1149 type_register_static(&bus_info);
32fea402
AL
1150 type_register_static(&device_type_info);
1151}
1152
83f7d43a 1153type_init(qdev_register_types)