]> git.proxmox.com Git - mirror_qemu.git/blame - hw/core/qdev.c
Merge remote-tracking branch 'remotes/awilliam/tags/vfio-update-20150609.0' into...
[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
0866aca1
AL
88 kid->index = bus->max_index++;
89 kid->child = child;
9d127820 90 object_ref(OBJECT(kid->child));
a5296ca9 91
0866aca1
AL
92 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
93
9d127820 94 /* This transfers ownership of kid->child to the property. */
0866aca1
AL
95 snprintf(name, sizeof(name), "child[%d]", kid->index);
96 object_property_add_link(OBJECT(bus), name,
97 object_get_typename(OBJECT(child)),
39f72ef9
SH
98 (Object **)&kid->child,
99 NULL, /* read-only property */
100 0, /* return ownership on prop deletion */
101 NULL);
0866aca1
AL
102}
103
104void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
105{
9fbe6127 106 dev->parent_bus = bus;
62d7ba66 107 object_ref(OBJECT(bus));
0866aca1 108 bus_add_child(bus, dev);
0c17542d
MA
109}
110
431bbb26
IM
111static void qbus_set_hotplug_handler_internal(BusState *bus, Object *handler,
112 Error **errp)
113{
114
115 object_property_set_link(OBJECT(bus), OBJECT(handler),
116 QDEV_HOTPLUG_HANDLER_PROPERTY, errp);
431bbb26
IM
117}
118
119void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler, Error **errp)
120{
121 qbus_set_hotplug_handler_internal(bus, OBJECT(handler), errp);
122}
123
124void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp)
125{
126 qbus_set_hotplug_handler_internal(bus, OBJECT(bus), errp);
127}
128
aae9460e
PB
129/* Create a new device. This only initializes the device state structure
130 and allows properties to be set. qdev_init should be called to
131 initialize the actual device emulation. */
02e2da45 132DeviceState *qdev_create(BusState *bus, const char *name)
0bcdeda7
BS
133{
134 DeviceState *dev;
135
136 dev = qdev_try_create(bus, name);
137 if (!dev) {
e92714c7 138 if (bus) {
312fd5f2 139 error_report("Unknown device '%s' for bus '%s'", name,
23e3fbec 140 object_get_typename(OBJECT(bus)));
e92714c7 141 } else {
312fd5f2 142 error_report("Unknown device '%s' for default sysbus", name);
e92714c7 143 }
01ed1d52 144 abort();
0bcdeda7
BS
145 }
146
147 return dev;
148}
149
da57febf 150DeviceState *qdev_try_create(BusState *bus, const char *type)
aae9460e 151{
9fbe6127
AL
152 DeviceState *dev;
153
da57febf 154 if (object_class_by_name(type) == NULL) {
4ed658ca
AF
155 return NULL;
156 }
da57febf 157 dev = DEVICE(object_new(type));
9fbe6127
AL
158 if (!dev) {
159 return NULL;
160 }
161
10c4c98a 162 if (!bus) {
68694897 163 bus = sysbus_get_default();
10c4c98a
GH
164 }
165
9fbe6127 166 qdev_set_parent_bus(dev, bus);
b09995ae 167 object_unref(OBJECT(dev));
9fbe6127 168 return dev;
aae9460e
PB
169}
170
171/* Initialize a device. Device properties should be set before calling
172 this function. IRQs and MMIO regions should be connected/mapped after
18cfeb52
MA
173 calling this function.
174 On failure, destroy the device and return negative value.
175 Return 0 on success. */
81a322d4 176int qdev_init(DeviceState *dev)
aae9460e 177{
249d4172 178 Error *local_err = NULL;
959f733a 179
7983c8a3 180 assert(!dev->realized);
6e008585 181
249d4172
AF
182 object_property_set_bool(OBJECT(dev), true, "realized", &local_err);
183 if (local_err != NULL) {
cffc5113 184 qerror_report_err(local_err);
249d4172 185 error_free(local_err);
02a5c4c9 186 object_unparent(OBJECT(dev));
249d4172 187 return -1;
18cfeb52 188 }
249d4172
AF
189 return 0;
190}
da57febf 191
707ff800
PD
192static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
193 = QTAILQ_HEAD_INITIALIZER(device_listeners);
194
195enum ListenerDirection { Forward, Reverse };
196
197#define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
198 do { \
199 DeviceListener *_listener; \
200 \
201 switch (_direction) { \
202 case Forward: \
203 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
204 if (_listener->_callback) { \
205 _listener->_callback(_listener, ##_args); \
206 } \
207 } \
208 break; \
209 case Reverse: \
210 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
211 device_listeners, link) { \
212 if (_listener->_callback) { \
213 _listener->_callback(_listener, ##_args); \
214 } \
215 } \
216 break; \
217 default: \
218 abort(); \
219 } \
220 } while (0)
221
222static int device_listener_add(DeviceState *dev, void *opaque)
223{
224 DEVICE_LISTENER_CALL(realize, Forward, dev);
225
226 return 0;
227}
228
229void device_listener_register(DeviceListener *listener)
230{
231 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
232
233 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
234 NULL, NULL);
235}
236
237void device_listener_unregister(DeviceListener *listener)
238{
239 QTAILQ_REMOVE(&device_listeners, listener, link);
240}
241
a7737e44 242static void device_realize(DeviceState *dev, Error **errp)
249d4172
AF
243{
244 DeviceClass *dc = DEVICE_GET_CLASS(dev);
da57febf 245
249d4172
AF
246 if (dc->init) {
247 int rc = dc->init(dev);
248 if (rc < 0) {
a7737e44 249 error_setg(errp, "Device initialization failed.");
249d4172
AF
250 return;
251 }
5ab28c83 252 }
02e2da45
PB
253}
254
fe6c2117
AF
255static void device_unrealize(DeviceState *dev, Error **errp)
256{
257 DeviceClass *dc = DEVICE_GET_CLASS(dev);
258
259 if (dc->exit) {
260 int rc = dc->exit(dev);
261 if (rc < 0) {
262 error_setg(errp, "Device exit failed.");
263 return;
264 }
265 }
266}
267
4d2ffa08
JK
268void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
269 int required_for_version)
270{
7983c8a3 271 assert(!dev->realized);
4d2ffa08
JK
272 dev->instance_id_alias = alias_id;
273 dev->alias_required_for_version = required_for_version;
274}
275
c06b2ffb 276HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
7716b8ca
IM
277{
278 HotplugHandler *hotplug_ctrl = NULL;
279
280 if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
281 hotplug_ctrl = dev->parent_bus->hotplug_handler;
282 } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
283 MachineState *machine = MACHINE(qdev_get_machine());
284 MachineClass *mc = MACHINE_GET_CLASS(machine);
285
286 if (mc->get_hotplug_handler) {
287 hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
288 }
289 }
290 return hotplug_ctrl;
291}
292
56f9107e 293void qdev_unplug(DeviceState *dev, Error **errp)
3418bd25 294{
6e008585 295 DeviceClass *dc = DEVICE_GET_CLASS(dev);
7716b8ca
IM
296 HotplugHandler *hotplug_ctrl;
297 HotplugHandlerClass *hdc;
6e008585 298
39b888bd 299 if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
56f9107e
LC
300 error_set(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
301 return;
3418bd25 302 }
593831de 303
1a37eca1
IM
304 if (!dc->hotpluggable) {
305 error_set(errp, QERR_DEVICE_NO_HOTPLUG,
306 object_get_typename(OBJECT(dev)));
307 return;
308 }
309
0ac8ef71
AW
310 qdev_hot_removed = true;
311
7716b8ca
IM
312 hotplug_ctrl = qdev_get_hotplug_handler(dev);
313 /* hotpluggable device MUST have HotplugHandler, if it doesn't
314 * then something is very wrong with it */
315 g_assert(hotplug_ctrl);
316
317 /* If device supports async unplug just request it to be done,
318 * otherwise just remove it synchronously */
319 hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl);
320 if (hdc->unplug_request) {
321 hotplug_handler_unplug_request(hotplug_ctrl, dev, errp);
5e954943 322 } else {
7716b8ca 323 hotplug_handler_unplug(hotplug_ctrl, dev, errp);
56f9107e 324 }
3418bd25
GH
325}
326
ec990eb6
AL
327static int qdev_reset_one(DeviceState *dev, void *opaque)
328{
94afdadc 329 device_reset(dev);
ec990eb6
AL
330
331 return 0;
332}
333
b4694b7c
IY
334static int qbus_reset_one(BusState *bus, void *opaque)
335{
0d936928
AL
336 BusClass *bc = BUS_GET_CLASS(bus);
337 if (bc->reset) {
dcc20931 338 bc->reset(bus);
b4694b7c
IY
339 }
340 return 0;
341}
342
5af0a04b
IY
343void qdev_reset_all(DeviceState *dev)
344{
dcc20931 345 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
5af0a04b
IY
346}
347
d0508c36
PB
348void qbus_reset_all(BusState *bus)
349{
dcc20931 350 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
d0508c36
PB
351}
352
80376c3f
IY
353void qbus_reset_all_fn(void *opaque)
354{
355 BusState *bus = opaque;
d0508c36 356 qbus_reset_all(bus);
80376c3f
IY
357}
358
3418bd25 359/* can be used as ->unplug() callback for the simple cases */
014176f9
IM
360void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
361 DeviceState *dev, Error **errp)
362{
2d9a982f
IM
363 /* just zap it */
364 object_unparent(OBJECT(dev));
014176f9 365}
3b29a101
MT
366
367/* Like qdev_init(), but terminate program via error_report() instead of
e23a1b33
MA
368 returning an error value. This is okay during machine creation.
369 Don't use for hotplug, because there callers need to recover from
370 failure. Exception: if you know the device's init() callback can't
371 fail, then qdev_init_nofail() can't fail either, and is therefore
372 usable even then. But relying on the device implementation that
373 way is somewhat unclean, and best avoided. */
374void qdev_init_nofail(DeviceState *dev)
375{
c4bacafb 376 Error *err = NULL;
7de3abe5 377
c4bacafb
MA
378 assert(!dev->realized);
379
380 object_property_set_bool(OBJECT(dev), true, "realized", &err);
381 if (err) {
382 error_report("Initialization of device %s failed: %s",
383 object_get_typename(OBJECT(dev)),
384 error_get_pretty(err));
bd6c9a61
MA
385 exit(1);
386 }
e23a1b33
MA
387}
388
3418bd25
GH
389void qdev_machine_creation_done(void)
390{
391 /*
392 * ok, initial machine setup is done, starting from now we can
393 * only create hotpluggable devices
394 */
395 qdev_hotplug = 1;
396}
397
0ac8ef71
AW
398bool qdev_machine_modified(void)
399{
400 return qdev_hot_added || qdev_hot_removed;
401}
402
02e2da45 403BusState *qdev_get_parent_bus(DeviceState *dev)
aae9460e 404{
02e2da45 405 return dev->parent_bus;
aae9460e
PB
406}
407
a5f54290
PC
408static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
409 const char *name)
410{
411 NamedGPIOList *ngl;
412
413 QLIST_FOREACH(ngl, &dev->gpios, node) {
414 /* NULL is a valid and matchable name, otherwise do a normal
415 * strcmp match.
416 */
417 if ((!ngl->name && !name) ||
418 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
419 return ngl;
420 }
421 }
422
423 ngl = g_malloc0(sizeof(*ngl));
424 ngl->name = g_strdup(name);
425 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
426 return ngl;
427}
428
429void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
430 const char *name, int n)
431{
a69bef1c 432 int i;
a5f54290 433 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
a69bef1c 434 char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-in");
a5f54290 435
b235a71f 436 assert(gpio_list->num_out == 0 || !name);
a5f54290
PC
437 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
438 dev, n);
a69bef1c
PC
439
440 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
441 object_property_add_child(OBJECT(dev), propname,
442 OBJECT(gpio_list->in[i]), &error_abort);
443 }
444 g_free(propname);
445
a5f54290
PC
446 gpio_list->num_in += n;
447}
448
aae9460e
PB
449void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
450{
a5f54290
PC
451 qdev_init_gpio_in_named(dev, handler, NULL, n);
452}
453
454void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
455 const char *name, int n)
456{
688b057a 457 int i;
a5f54290 458 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
688b057a 459 char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-out");
a5f54290 460
b235a71f 461 assert(gpio_list->num_in == 0 || !name);
aef0869e 462 gpio_list->num_out += n;
688b057a
PC
463
464 for (i = 0; i < n; ++i) {
465 memset(&pins[i], 0, sizeof(*pins));
466 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
467 (Object **)&pins[i],
468 object_property_allow_set_link,
469 OBJ_PROP_LINK_UNREF_ON_RELEASE,
470 &error_abort);
471 }
472 g_free(propname);
aae9460e
PB
473}
474
475void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
476{
a5f54290
PC
477 qdev_init_gpio_out_named(dev, pins, NULL, n);
478}
479
480qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
481{
482 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
483
484 assert(n >= 0 && n < gpio_list->num_in);
485 return gpio_list->in[n];
aae9460e
PB
486}
487
488qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
489{
a5f54290
PC
490 return qdev_get_gpio_in_named(dev, NULL, n);
491}
492
493void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
494 qemu_irq pin)
495{
02757df2
PC
496 char *propname = g_strdup_printf("%s[%d]",
497 name ? name : "unnamed-gpio-out", n);
498 if (pin) {
499 /* We need a name for object_property_set_link to work. If the
500 * object has a parent, object_property_add_child will come back
501 * with an error without doing anything. If it has none, it will
502 * never fail. So we can just call it with a NULL Error pointer.
503 */
88950eef
AF
504 object_property_add_child(container_get(qdev_get_machine(),
505 "/unattached"),
506 "non-qdev-gpio[*]", OBJECT(pin), NULL);
02757df2
PC
507 }
508 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
509 g_free(propname);
aae9460e
PB
510}
511
b7973186
AG
512qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
513{
514 char *propname = g_strdup_printf("%s[%d]",
515 name ? name : "unnamed-gpio-out", n);
516
517 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
518 NULL);
519
520 return ret;
521}
522
0c24db2b
PC
523/* disconnect a GPIO ouput, returning the disconnected input (if any) */
524
525static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
526 const char *name, int n)
527{
528 char *propname = g_strdup_printf("%s[%d]",
529 name ? name : "unnamed-gpio-out", n);
530
531 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
532 NULL);
533 if (ret) {
534 object_property_set_link(OBJECT(dev), NULL, propname, NULL);
535 }
536 g_free(propname);
537 return ret;
538}
a5f54290 539
0c24db2b
PC
540qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
541 const char *name, int n)
542{
543 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
544 qdev_connect_gpio_out_named(dev, name, n, icpt);
545 return disconnected;
aae9460e
PB
546}
547
548void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
549{
a5f54290 550 qdev_connect_gpio_out_named(dev, NULL, n, pin);
aae9460e
PB
551}
552
17a96a14
PC
553void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
554 const char *name)
555{
556 int i;
557 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
558
559 for (i = 0; i < ngl->num_in; i++) {
560 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
561 char *propname = g_strdup_printf("%s[%d]", nm, i);
562
563 object_property_add_alias(OBJECT(container), propname,
564 OBJECT(dev), propname,
565 &error_abort);
566 }
567 for (i = 0; i < ngl->num_out; i++) {
568 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
569 char *propname = g_strdup_printf("%s[%d]", nm, i);
570
571 object_property_add_alias(OBJECT(container), propname,
572 OBJECT(dev), propname,
573 &error_abort);
574 }
575 QLIST_REMOVE(ngl, node);
576 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
577}
578
02e2da45 579BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
4d6ae674 580{
02e2da45 581 BusState *bus;
4d6ae674 582
72cf2d4f 583 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
4d6ae674 584 if (strcmp(name, bus->name) == 0) {
02e2da45 585 return bus;
4d6ae674
PB
586 }
587 }
588 return NULL;
589}
590
0293214b
PB
591int qbus_walk_children(BusState *bus,
592 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
593 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
594 void *opaque)
81699d8a 595{
0866aca1 596 BusChild *kid;
81699d8a
AL
597 int err;
598
0293214b
PB
599 if (pre_busfn) {
600 err = pre_busfn(bus, opaque);
81699d8a
AL
601 if (err) {
602 return err;
603 }
604 }
605
0866aca1 606 QTAILQ_FOREACH(kid, &bus->children, sibling) {
0293214b
PB
607 err = qdev_walk_children(kid->child,
608 pre_devfn, pre_busfn,
609 post_devfn, post_busfn, opaque);
81699d8a
AL
610 if (err < 0) {
611 return err;
612 }
613 }
614
0293214b
PB
615 if (post_busfn) {
616 err = post_busfn(bus, opaque);
617 if (err) {
618 return err;
619 }
620 }
621
81699d8a
AL
622 return 0;
623}
624
0293214b
PB
625int qdev_walk_children(DeviceState *dev,
626 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
627 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
628 void *opaque)
81699d8a
AL
629{
630 BusState *bus;
631 int err;
632
0293214b
PB
633 if (pre_devfn) {
634 err = pre_devfn(dev, opaque);
81699d8a
AL
635 if (err) {
636 return err;
637 }
638 }
639
640 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
0293214b
PB
641 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
642 post_devfn, post_busfn, opaque);
81699d8a
AL
643 if (err < 0) {
644 return err;
645 }
646 }
647
0293214b
PB
648 if (post_devfn) {
649 err = post_devfn(dev, opaque);
650 if (err) {
651 return err;
652 }
653 }
654
81699d8a
AL
655 return 0;
656}
657
a2ee6b4f 658DeviceState *qdev_find_recursive(BusState *bus, const char *id)
3418bd25 659{
0866aca1
AL
660 BusChild *kid;
661 DeviceState *ret;
3418bd25
GH
662 BusState *child;
663
0866aca1
AL
664 QTAILQ_FOREACH(kid, &bus->children, sibling) {
665 DeviceState *dev = kid->child;
666
667 if (dev->id && strcmp(dev->id, id) == 0) {
3418bd25 668 return dev;
0866aca1
AL
669 }
670
3418bd25
GH
671 QLIST_FOREACH(child, &dev->child_bus, sibling) {
672 ret = qdev_find_recursive(child, id);
673 if (ret) {
674 return ret;
675 }
676 }
677 }
678 return NULL;
679}
680
013e1182 681static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
02e2da45 682{
ac7d1ba6 683 const char *typename = object_get_typename(OBJECT(bus));
61de3676 684 BusClass *bc;
d271de9f 685 char *buf;
61de3676 686 int i, len, bus_id;
02e2da45 687
013e1182
PB
688 bus->parent = parent;
689
690 if (name) {
691 bus->name = g_strdup(name);
ac7d1ba6 692 } else if (bus->parent && bus->parent->id) {
61de3676
AG
693 /* parent device has id -> use it plus parent-bus-id for bus name */
694 bus_id = bus->parent->num_child_bus;
695
ac7d1ba6 696 len = strlen(bus->parent->id) + 16;
7267c094 697 buf = g_malloc(len);
61de3676 698 snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
d271de9f
GH
699 bus->name = buf;
700 } else {
61de3676
AG
701 /* no id -> use lowercase bus type plus global bus-id for bus name */
702 bc = BUS_GET_CLASS(bus);
703 bus_id = bc->automatic_ids++;
704
0d936928 705 len = strlen(typename) + 16;
7267c094 706 buf = g_malloc(len);
61de3676
AG
707 len = snprintf(buf, len, "%s.%d", typename, bus_id);
708 for (i = 0; i < len; i++) {
bb87ece5 709 buf[i] = qemu_tolower(buf[i]);
61de3676 710 }
d271de9f
GH
711 bus->name = buf;
712 }
713
ac7d1ba6
AL
714 if (bus->parent) {
715 QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
716 bus->parent->num_child_bus++;
717 object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL);
b09995ae 718 object_unref(OBJECT(bus));
8185d216 719 } else if (bus != sysbus_get_default()) {
80376c3f
IY
720 /* TODO: once all bus devices are qdevified,
721 only reset handler for main_system_bus should be registered here. */
722 qemu_register_reset(qbus_reset_all_fn, bus);
02e2da45 723 }
cd739fb6
GH
724}
725
6853d27a
PB
726static void bus_unparent(Object *obj)
727{
728 BusState *bus = BUS(obj);
729 BusChild *kid;
730
731 while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
732 DeviceState *dev = kid->child;
02a5c4c9 733 object_unparent(OBJECT(dev));
6853d27a
PB
734 }
735 if (bus->parent) {
736 QLIST_REMOVE(bus, sibling);
737 bus->parent->num_child_bus--;
738 bus->parent = NULL;
739 } else {
740 assert(bus != sysbus_get_default()); /* main_system_bus is never freed */
741 qemu_unregister_reset(qbus_reset_all_fn, bus);
742 }
743}
744
a7737e44 745static bool bus_get_realized(Object *obj, Error **errp)
02e7f85d
BD
746{
747 BusState *bus = BUS(obj);
748
749 return bus->realized;
750}
751
a7737e44 752static void bus_set_realized(Object *obj, bool value, Error **errp)
02e7f85d
BD
753{
754 BusState *bus = BUS(obj);
755 BusClass *bc = BUS_GET_CLASS(bus);
5942a190 756 BusChild *kid;
02e7f85d
BD
757 Error *local_err = NULL;
758
759 if (value && !bus->realized) {
760 if (bc->realize) {
761 bc->realize(bus, &local_err);
02e7f85d 762 }
5942a190
PB
763
764 /* TODO: recursive realization */
02e7f85d 765 } else if (!value && bus->realized) {
5942a190
PB
766 QTAILQ_FOREACH(kid, &bus->children, sibling) {
767 DeviceState *dev = kid->child;
768 object_property_set_bool(OBJECT(dev), false, "realized",
769 &local_err);
770 if (local_err != NULL) {
771 break;
772 }
773 }
774 if (bc->unrealize && local_err == NULL) {
02e7f85d 775 bc->unrealize(bus, &local_err);
02e7f85d
BD
776 }
777 }
778
b7b34d05
PB
779 if (local_err != NULL) {
780 error_propagate(errp, local_err);
781 return;
782 }
02e7f85d 783
b7b34d05 784 bus->realized = value;
02e7f85d
BD
785}
786
fb17dfe0 787void qbus_create_inplace(void *bus, size_t size, const char *typename,
0d936928 788 DeviceState *parent, const char *name)
cd739fb6 789{
213f0c4f 790 object_initialize(bus, size, typename);
013e1182 791 qbus_realize(bus, parent, name);
02e2da45 792}
cae4956e 793
0d936928 794BusState *qbus_create(const char *typename, DeviceState *parent, const char *name)
2da8bb92 795{
cd739fb6
GH
796 BusState *bus;
797
0d936928 798 bus = BUS(object_new(typename));
013e1182 799 qbus_realize(bus, parent, name);
ac7d1ba6 800
02e2da45 801 return bus;
2da8bb92
IY
802}
803
0d936928
AL
804static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
805{
806 BusClass *bc = BUS_GET_CLASS(bus);
807
808 if (bc->get_fw_dev_path) {
809 return bc->get_fw_dev_path(dev);
131ec1bd 810 }
0d936928
AL
811
812 return NULL;
131ec1bd
GH
813}
814
6b1566cb
PB
815static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
816{
817 Object *obj = OBJECT(dev);
818 char *d = NULL;
819
820 while (!d && obj->parent) {
821 obj = obj->parent;
822 d = fw_path_provider_try_get_dev_path(obj, bus, dev);
823 }
824 return d;
825}
826
0be63901
GA
827char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
828{
829 Object *obj = OBJECT(dev);
830
831 return fw_path_provider_try_get_dev_path(obj, bus, dev);
832}
833
1ca4d09a
GN
834static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
835{
836 int l = 0;
837
838 if (dev && dev->parent_bus) {
839 char *d;
840 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
6b1566cb
PB
841 d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
842 if (!d) {
843 d = bus_get_fw_dev_path(dev->parent_bus, dev);
844 }
0d936928 845 if (d) {
1ca4d09a 846 l += snprintf(p + l, size - l, "%s", d);
7267c094 847 g_free(d);
1ca4d09a 848 } else {
bbfa18fc 849 return l;
1ca4d09a
GN
850 }
851 }
852 l += snprintf(p + l , size - l, "/");
853
854 return l;
855}
856
857char* qdev_get_fw_dev_path(DeviceState *dev)
858{
859 char path[128];
860 int l;
861
862 l = qdev_get_fw_dev_path_helper(dev, path, 128);
863
864 path[l-1] = '\0';
865
a5cf8262 866 return g_strdup(path);
1ca4d09a 867}
85ed303b 868
09e5ab63 869char *qdev_get_dev_path(DeviceState *dev)
85ed303b 870{
0d936928 871 BusClass *bc;
09e5ab63
AL
872
873 if (!dev || !dev->parent_bus) {
874 return NULL;
875 }
876
0d936928
AL
877 bc = BUS_GET_CLASS(dev->parent_bus);
878 if (bc->get_dev_path) {
879 return bc->get_dev_path(dev);
09e5ab63
AL
880 }
881
882 return NULL;
44677ded 883}
a5296ca9
AL
884
885/**
886 * Legacy property handling
887 */
888
57c9fafe 889static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque,
a5296ca9
AL
890 const char *name, Error **errp)
891{
57c9fafe 892 DeviceState *dev = DEVICE(obj);
a5296ca9
AL
893 Property *prop = opaque;
894
e3cb6ba6
PB
895 char buffer[1024];
896 char *ptr = buffer;
a5296ca9 897
e3cb6ba6
PB
898 prop->info->print(dev, prop, buffer, sizeof(buffer));
899 visit_type_str(v, &ptr, name, errp);
a5296ca9
AL
900}
901
a5296ca9
AL
902/**
903 * @qdev_add_legacy_property - adds a legacy property
904 *
905 * Do not use this is new code! Properties added through this interface will
ca2cc788 906 * be given names and types in the "legacy" namespace.
a5296ca9 907 *
68ee3569
PB
908 * Legacy properties are string versions of other OOM properties. The format
909 * of the string depends on the property type.
a5296ca9 910 */
f5a014d2
SW
911static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
912 Error **errp)
a5296ca9 913{
7ce7ffe0 914 gchar *name;
a5296ca9 915
f3be016d 916 /* Register pointer properties as legacy properties */
03ff7770 917 if (!prop->info->print && prop->info->get) {
68ee3569
PB
918 return;
919 }
f3be016d 920
ca2cc788 921 name = g_strdup_printf("legacy-%s", prop->name);
7ce7ffe0 922 object_property_add(OBJECT(dev), name, "str",
68ee3569 923 prop->info->print ? qdev_get_legacy_property : prop->info->get,
03ff7770 924 NULL,
57c9fafe
AL
925 NULL,
926 prop, errp);
a5296ca9 927
ca2cc788
PB
928 g_free(name);
929}
930
931/**
932 * @qdev_property_add_static - add a @Property to a device.
933 *
934 * Static properties access data in a struct. The actual type of the
935 * property and the field depends on the property type.
936 */
937void qdev_property_add_static(DeviceState *dev, Property *prop,
938 Error **errp)
939{
fdae245f
PB
940 Error *local_err = NULL;
941 Object *obj = OBJECT(dev);
942
d822979b
PB
943 /*
944 * TODO qdev_prop_ptr does not have getters or setters. It must
945 * go now that it can be replaced with links. The test should be
946 * removed along with it: all static properties are read/write.
947 */
948 if (!prop->info->get && !prop->info->set) {
949 return;
950 }
951
fdae245f 952 object_property_add(obj, prop->name, prop->info->name,
57c9fafe 953 prop->info->get, prop->info->set,
dd0ba250 954 prop->info->release,
fdae245f
PB
955 prop, &local_err);
956
957 if (local_err) {
958 error_propagate(errp, local_err);
959 return;
960 }
b8c9cd5c
GA
961
962 object_property_set_description(obj, prop->name,
963 prop->info->description,
964 &error_abort);
965
fdae245f
PB
966 if (prop->qtype == QTYPE_NONE) {
967 return;
968 }
969
970 if (prop->qtype == QTYPE_QBOOL) {
5433a0a8 971 object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
fdae245f
PB
972 } else if (prop->info->enum_table) {
973 object_property_set_str(obj, prop->info->enum_table[prop->defval],
5433a0a8 974 prop->name, &error_abort);
fdae245f 975 } else if (prop->qtype == QTYPE_QINT) {
5433a0a8 976 object_property_set_int(obj, prop->defval, prop->name, &error_abort);
fdae245f 977 }
6a146eba 978}
1de81d28 979
67cc7e0a
SH
980/* @qdev_alias_all_properties - Add alias properties to the source object for
981 * all qdev properties on the target DeviceState.
982 */
983void qdev_alias_all_properties(DeviceState *target, Object *source)
984{
985 ObjectClass *class;
986 Property *prop;
987
988 class = object_get_class(OBJECT(target));
989 do {
990 DeviceClass *dc = DEVICE_CLASS(class);
991
992 for (prop = dc->props; prop && prop->name; prop++) {
993 object_property_add_alias(source, prop->name,
994 OBJECT(target), prop->name,
995 &error_abort);
996 }
997 class = object_class_get_parent(class);
998 } while (class != object_class_by_name(TYPE_DEVICE));
999}
1000
4cae4d5a 1001static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
66e56b13
ZG
1002{
1003 GSList **list = opaque;
09d56017
JL
1004 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
1005 TYPE_DEVICE);
1006
1007 if (dev == NULL) {
1008 return 0;
1009 }
66e56b13
ZG
1010
1011 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
1012 *list = g_slist_append(*list, dev);
1013 }
1014
66e56b13
ZG
1015 return 0;
1016}
1017
4cae4d5a
MA
1018GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
1019{
1020 GSList *list = NULL;
1021
1022 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
1023
1024 return list;
1025}
1026
a7737e44 1027static bool device_get_realized(Object *obj, Error **errp)
249d4172
AF
1028{
1029 DeviceState *dev = DEVICE(obj);
1030 return dev->realized;
1031}
1032
a7737e44 1033static void device_set_realized(Object *obj, bool value, Error **errp)
249d4172
AF
1034{
1035 DeviceState *dev = DEVICE(obj);
1036 DeviceClass *dc = DEVICE_GET_CLASS(dev);
7716b8ca 1037 HotplugHandler *hotplug_ctrl;
5c21ce77 1038 BusState *bus;
249d4172
AF
1039 Error *local_err = NULL;
1040
1a37eca1 1041 if (dev->hotplugged && !dc->hotpluggable) {
a7737e44 1042 error_set(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
1a37eca1
IM
1043 return;
1044 }
1045
249d4172 1046 if (value && !dev->realized) {
d578029e 1047 if (!obj->parent) {
249d4172
AF
1048 static int unattached_count;
1049 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
1050
1051 object_property_add_child(container_get(qdev_get_machine(),
1052 "/unattached"),
d578029e 1053 name, obj, &error_abort);
249d4172
AF
1054 g_free(name);
1055 }
1056
a7ddba52
IM
1057 if (dc->realize) {
1058 dc->realize(dev, &local_err);
1059 }
1060
1d45a705
GA
1061 if (local_err != NULL) {
1062 goto fail;
1063 }
1064
707ff800
PD
1065 DEVICE_LISTENER_CALL(realize, Forward, dev);
1066
7716b8ca
IM
1067 hotplug_ctrl = qdev_get_hotplug_handler(dev);
1068 if (hotplug_ctrl) {
1069 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
5e954943
IM
1070 }
1071
1d45a705
GA
1072 if (local_err != NULL) {
1073 goto post_realize_fail;
1074 }
1075
1076 if (qdev_get_vmsd(dev)) {
249d4172
AF
1077 vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
1078 dev->instance_id_alias,
1079 dev->alias_required_for_version);
1080 }
1d45a705
GA
1081
1082 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1083 object_property_set_bool(OBJECT(bus), true, "realized",
5c21ce77 1084 &local_err);
1d45a705
GA
1085 if (local_err != NULL) {
1086 goto child_realize_fail;
5c21ce77
BD
1087 }
1088 }
1d45a705 1089 if (dev->hotplugged) {
249d4172
AF
1090 device_reset(dev);
1091 }
352e8da7 1092 dev->pending_deleted_event = false;
249d4172 1093 } else if (!value && dev->realized) {
cd4520ad 1094 Error **local_errp = NULL;
5c21ce77 1095 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
cd4520ad 1096 local_errp = local_err ? NULL : &local_err;
5c21ce77 1097 object_property_set_bool(OBJECT(bus), false, "realized",
cd4520ad 1098 local_errp);
5c21ce77 1099 }
cd4520ad 1100 if (qdev_get_vmsd(dev)) {
fe6c2117
AF
1101 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1102 }
cd4520ad
GA
1103 if (dc->unrealize) {
1104 local_errp = local_err ? NULL : &local_err;
1105 dc->unrealize(dev, local_errp);
249d4172 1106 }
352e8da7 1107 dev->pending_deleted_event = true;
707ff800 1108 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
249d4172
AF
1109 }
1110
1111 if (local_err != NULL) {
1d45a705 1112 goto fail;
249d4172
AF
1113 }
1114
1115 dev->realized = value;
1d45a705
GA
1116 return;
1117
1118child_realize_fail:
1119 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1120 object_property_set_bool(OBJECT(bus), false, "realized",
1121 NULL);
1122 }
1123
1124 if (qdev_get_vmsd(dev)) {
1125 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1126 }
1127
1128post_realize_fail:
1129 if (dc->unrealize) {
1130 dc->unrealize(dev, NULL);
1131 }
1132
1133fail:
1134 error_propagate(errp, local_err);
1135 return;
249d4172
AF
1136}
1137
a7737e44 1138static bool device_get_hotpluggable(Object *obj, Error **errp)
1a37eca1
IM
1139{
1140 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1141 DeviceState *dev = DEVICE(obj);
1142
2b81b35f 1143 return dc->hotpluggable && (dev->parent_bus == NULL ||
39b888bd 1144 qbus_is_hotpluggable(dev->parent_bus));
1a37eca1
IM
1145}
1146
d012ffc1
IM
1147static bool device_get_hotplugged(Object *obj, Error **err)
1148{
1149 DeviceState *dev = DEVICE(obj);
1150
1151 return dev->hotplugged;
1152}
1153
1154static void device_set_hotplugged(Object *obj, bool value, Error **err)
1155{
1156 DeviceState *dev = DEVICE(obj);
1157
1158 dev->hotplugged = value;
1159}
1160
9674bfe4
AL
1161static void device_initfn(Object *obj)
1162{
1163 DeviceState *dev = DEVICE(obj);
bce54474 1164 ObjectClass *class;
9674bfe4
AL
1165 Property *prop;
1166
1167 if (qdev_hotplug) {
1168 dev->hotplugged = 1;
1169 qdev_hot_added = true;
1170 }
1171
1172 dev->instance_id_alias = -1;
7983c8a3 1173 dev->realized = false;
9674bfe4 1174
249d4172
AF
1175 object_property_add_bool(obj, "realized",
1176 device_get_realized, device_set_realized, NULL);
1a37eca1
IM
1177 object_property_add_bool(obj, "hotpluggable",
1178 device_get_hotpluggable, NULL, NULL);
d012ffc1
IM
1179 object_property_add_bool(obj, "hotplugged",
1180 device_get_hotplugged, device_set_hotplugged,
1181 &error_abort);
249d4172 1182
bce54474
PB
1183 class = object_get_class(OBJECT(dev));
1184 do {
1185 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
5433a0a8
PC
1186 qdev_property_add_legacy(dev, prop, &error_abort);
1187 qdev_property_add_static(dev, prop, &error_abort);
bce54474 1188 }
bce54474
PB
1189 class = object_class_get_parent(class);
1190 } while (class != object_class_by_name(TYPE_DEVICE));
9674bfe4 1191
f968fc68 1192 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
39f72ef9 1193 (Object **)&dev->parent_bus, NULL, 0,
9561fda8 1194 &error_abort);
a5f54290 1195 QLIST_INIT(&dev->gpios);
9674bfe4
AL
1196}
1197
99a0b036
EH
1198static void device_post_init(Object *obj)
1199{
25f8dd96 1200 qdev_prop_set_globals(DEVICE(obj));
99a0b036
EH
1201}
1202
60adba37
AL
1203/* Unlink device from bus and free the structure. */
1204static void device_finalize(Object *obj)
1205{
a5f54290
PC
1206 NamedGPIOList *ngl, *next;
1207
60adba37 1208 DeviceState *dev = DEVICE(obj);
4ad60880 1209 qemu_opts_del(dev->opts);
a5f54290
PC
1210
1211 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1212 QLIST_REMOVE(ngl, node);
f173d57a 1213 qemu_free_irqs(ngl->in, ngl->num_in);
a5f54290
PC
1214 g_free(ngl->name);
1215 g_free(ngl);
1216 /* ngl->out irqs are owned by the other end and should not be freed
1217 * here
1218 */
1219 }
60adba37
AL
1220}
1221
bce54474
PB
1222static void device_class_base_init(ObjectClass *class, void *data)
1223{
1224 DeviceClass *klass = DEVICE_CLASS(class);
1225
1226 /* We explicitly look up properties in the superclasses,
1227 * so do not propagate them to the subclasses.
1228 */
1229 klass->props = NULL;
60adba37
AL
1230}
1231
5d5b24d0 1232static void device_unparent(Object *obj)
667d22d1
PB
1233{
1234 DeviceState *dev = DEVICE(obj);
06f7f2bb 1235 BusState *bus;
667d22d1 1236
5c21ce77
BD
1237 if (dev->realized) {
1238 object_property_set_bool(obj, false, "realized", NULL);
1239 }
06f7f2bb
PB
1240 while (dev->num_child_bus) {
1241 bus = QLIST_FIRST(&dev->child_bus);
6780a22c 1242 object_unparent(OBJECT(bus));
06f7f2bb 1243 }
06f7f2bb 1244 if (dev->parent_bus) {
5d5b24d0 1245 bus_remove_child(dev->parent_bus, dev);
62d7ba66
PB
1246 object_unref(OBJECT(dev->parent_bus));
1247 dev->parent_bus = NULL;
5d5b24d0 1248 }
0402a5d6 1249
b1ee5829 1250 /* Only send event if the device had been completely realized */
352e8da7 1251 if (dev->pending_deleted_event) {
b1ee5829
AL
1252 gchar *path = object_get_canonical_path(OBJECT(dev));
1253
24b699fb 1254 qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
b1ee5829 1255 g_free(path);
0402a5d6 1256 }
667d22d1
PB
1257}
1258
1259static void device_class_init(ObjectClass *class, void *data)
1260{
249d4172
AF
1261 DeviceClass *dc = DEVICE_CLASS(class);
1262
5d5b24d0 1263 class->unparent = device_unparent;
249d4172 1264 dc->realize = device_realize;
fe6c2117 1265 dc->unrealize = device_unrealize;
267a3264
IM
1266
1267 /* by default all devices were considered as hotpluggable,
1268 * so with intent to check it in generic qdev_unplug() /
1269 * device_set_realized() functions make every device
1270 * hotpluggable. Devices that shouldn't be hotpluggable,
1271 * should override it in their class_init()
1272 */
1273 dc->hotpluggable = true;
667d22d1
PB
1274}
1275
94afdadc
AL
1276void device_reset(DeviceState *dev)
1277{
1278 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1279
1280 if (klass->reset) {
1281 klass->reset(dev);
1282 }
1283}
1284
f05f6b4a
PB
1285Object *qdev_get_machine(void)
1286{
1287 static Object *dev;
1288
1289 if (dev == NULL) {
dfe47e70 1290 dev = container_get(object_get_root(), "/machine");
f05f6b4a
PB
1291 }
1292
1293 return dev;
1294}
1295
8c43a6f0 1296static const TypeInfo device_type_info = {
32fea402
AL
1297 .name = TYPE_DEVICE,
1298 .parent = TYPE_OBJECT,
1299 .instance_size = sizeof(DeviceState),
9674bfe4 1300 .instance_init = device_initfn,
99a0b036 1301 .instance_post_init = device_post_init,
60adba37 1302 .instance_finalize = device_finalize,
bce54474 1303 .class_base_init = device_class_base_init,
667d22d1 1304 .class_init = device_class_init,
32fea402
AL
1305 .abstract = true,
1306 .class_size = sizeof(DeviceClass),
1307};
1308
ac7d1ba6
AL
1309static void qbus_initfn(Object *obj)
1310{
1311 BusState *bus = BUS(obj);
1312
1313 QTAILQ_INIT(&bus->children);
0ee4de6c
IM
1314 object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY,
1315 TYPE_HOTPLUG_HANDLER,
9561fda8 1316 (Object **)&bus->hotplug_handler,
39f72ef9 1317 object_property_allow_set_link,
9561fda8
SH
1318 OBJ_PROP_LINK_UNREF_ON_RELEASE,
1319 NULL);
02e7f85d
BD
1320 object_property_add_bool(obj, "realized",
1321 bus_get_realized, bus_set_realized, NULL);
ac7d1ba6
AL
1322}
1323
bbfa18fc
AK
1324static char *default_bus_get_fw_dev_path(DeviceState *dev)
1325{
1326 return g_strdup(object_get_typename(OBJECT(dev)));
1327}
1328
6853d27a
PB
1329static void bus_class_init(ObjectClass *class, void *data)
1330{
bbfa18fc
AK
1331 BusClass *bc = BUS_CLASS(class);
1332
6853d27a 1333 class->unparent = bus_unparent;
bbfa18fc 1334 bc->get_fw_dev_path = default_bus_get_fw_dev_path;
6853d27a
PB
1335}
1336
ac7d1ba6
AL
1337static void qbus_finalize(Object *obj)
1338{
1339 BusState *bus = BUS(obj);
ac7d1ba6 1340
ac7d1ba6
AL
1341 g_free((char *)bus->name);
1342}
1343
0d936928
AL
1344static const TypeInfo bus_info = {
1345 .name = TYPE_BUS,
1346 .parent = TYPE_OBJECT,
1347 .instance_size = sizeof(BusState),
1348 .abstract = true,
1349 .class_size = sizeof(BusClass),
ac7d1ba6
AL
1350 .instance_init = qbus_initfn,
1351 .instance_finalize = qbus_finalize,
6853d27a 1352 .class_init = bus_class_init,
0d936928
AL
1353};
1354
83f7d43a 1355static void qdev_register_types(void)
32fea402 1356{
0d936928 1357 type_register_static(&bus_info);
32fea402
AL
1358 type_register_static(&device_type_info);
1359}
1360
83f7d43a 1361type_init(qdev_register_types)