blob: 6b3cc55b27c2537d2f39aec1f0dd2721f54c34cb [file] [log] [blame]
Paul Brookaae94602009-05-14 22:35:06 +01001/*
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
Blue Swirl8167ee82009-07-16 20:47:01 +000017 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
Paul Brookaae94602009-05-14 22:35:06 +010018 */
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
Peter Maydell18c86e22016-01-26 18:17:29 +000028#include "qemu/osdep.h"
Paolo Bonzini83c9f4c2013-02-04 15:40:22 +010029#include "hw/qdev.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010030#include "sysemu/sysemu.h"
Markus Armbrustere688df62018-02-01 12:18:31 +010031#include "qapi/error.h"
Markus Armbruster112ed242018-02-26 17:13:27 -060032#include "qapi/qapi-events-misc.h"
Paolo Bonzinib4a42f82013-02-04 11:37:52 +010033#include "qapi/qmp/qerror.h"
Paolo Bonzini7b1b5d12012-12-17 18:19:43 +010034#include "qapi/visitor.h"
Markus Armbrusterd49b6832015-03-17 18:29:20 +010035#include "qemu/error-report.h"
Markus Armbruster922a01a2018-02-01 12:18:46 +010036#include "qemu/option.h"
Igor Mammedov0ee4de62014-02-05 16:36:45 +010037#include "hw/hotplug.h"
Igor Mammedovb7454542014-06-02 15:25:03 +020038#include "hw/boards.h"
Peter Maydell7474f1b2016-05-10 11:30:42 +010039#include "hw/sysbus.h"
Paul Brookaae94602009-05-14 22:35:06 +010040
Juan Quintela9bed84c2017-03-28 11:08:52 +020041bool qdev_hotplug = false;
Alex Williamson0ac8ef72011-01-04 12:37:50 -070042static bool qdev_hot_added = false;
Juan Quintela21def242017-03-28 11:22:10 +020043bool qdev_hot_removed = false;
Gerd Hoffmann3418bd22009-09-25 21:42:41 +020044
Anthony Liguori4be9f0d2011-12-09 10:51:49 -060045const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
46{
Anthony Liguori6e008582011-12-09 11:06:57 -060047 DeviceClass *dc = DEVICE_GET_CLASS(dev);
48 return dc->vmsd;
Anthony Liguori4be9f0d2011-12-09 10:51:49 -060049}
50
Anthony Liguori0866aca2011-12-23 15:34:39 -060051static void bus_remove_child(BusState *bus, DeviceState *child)
Paul Brookaae94602009-05-14 22:35:06 +010052{
Anthony Liguori0866aca2011-12-23 15:34:39 -060053 BusChild *kid;
54
55 QTAILQ_FOREACH(kid, &bus->children, sibling) {
56 if (kid->child == child) {
57 char name[32];
58
59 snprintf(name, sizeof(name), "child[%d]", kid->index);
60 QTAILQ_REMOVE(&bus->children, kid, sibling);
Paolo Bonzini9d127822013-01-25 14:12:32 +010061
62 /* This gives back ownership of kid->child back to us. */
Anthony Liguori0866aca2011-12-23 15:34:39 -060063 object_property_del(OBJECT(bus), name, NULL);
Paolo Bonzini9d127822013-01-25 14:12:32 +010064 object_unref(OBJECT(kid->child));
Anthony Liguori0866aca2011-12-23 15:34:39 -060065 g_free(kid);
66 return;
67 }
68 }
69}
70
71static void bus_add_child(BusState *bus, DeviceState *child)
72{
73 char name[32];
74 BusChild *kid = g_malloc0(sizeof(*kid));
Paul Brookaae94602009-05-14 22:35:06 +010075
Anthony Liguori0866aca2011-12-23 15:34:39 -060076 kid->index = bus->max_index++;
77 kid->child = child;
Paolo Bonzini9d127822013-01-25 14:12:32 +010078 object_ref(OBJECT(kid->child));
Anthony Liguoria5296ca2011-12-12 14:29:27 -060079
Anthony Liguori0866aca2011-12-23 15:34:39 -060080 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
81
Paolo Bonzini9d127822013-01-25 14:12:32 +010082 /* This transfers ownership of kid->child to the property. */
Anthony Liguori0866aca2011-12-23 15:34:39 -060083 snprintf(name, sizeof(name), "child[%d]", kid->index);
84 object_property_add_link(OBJECT(bus), name,
85 object_get_typename(OBJECT(child)),
Stefan Hajnoczi39f72ef2014-03-19 08:58:56 +010086 (Object **)&kid->child,
87 NULL, /* read-only property */
88 0, /* return ownership on prop deletion */
89 NULL);
Anthony Liguori0866aca2011-12-23 15:34:39 -060090}
91
92void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
93{
Peter Maydell91c968a2017-02-28 14:55:08 +000094 bool replugging = dev->parent_bus != NULL;
95
96 if (replugging) {
97 /* Keep a reference to the device while it's not plugged into
98 * any bus, to avoid it potentially evaporating when it is
99 * dereffed in bus_remove_child().
100 */
101 object_ref(OBJECT(dev));
102 bus_remove_child(dev->parent_bus, dev);
103 object_unref(OBJECT(dev->parent_bus));
104 }
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600105 dev->parent_bus = bus;
Paolo Bonzini62d7ba62013-01-25 14:12:35 +0100106 object_ref(OBJECT(bus));
Anthony Liguori0866aca2011-12-23 15:34:39 -0600107 bus_add_child(bus, dev);
Peter Maydell91c968a2017-02-28 14:55:08 +0000108 if (replugging) {
109 object_unref(OBJECT(dev));
110 }
Paul Brookaae94602009-05-14 22:35:06 +0100111}
112
Markus Armbruster0210afe2015-06-19 16:17:22 +0200113/* Create a new device. This only initializes the device state
114 structure and allows properties to be set. The device still needs
115 to be realized. See qdev-core.h. */
Markus Armbruster0c175422010-02-19 19:12:18 +0100116DeviceState *qdev_create(BusState *bus, const char *name)
117{
Blue Swirl0bcdeda2011-02-05 14:34:25 +0000118 DeviceState *dev;
119
120 dev = qdev_try_create(bus, name);
121 if (!dev) {
Peter Maydelle92714c2011-08-03 23:49:04 +0100122 if (bus) {
Markus Armbruster312fd5f2013-02-08 21:22:16 +0100123 error_report("Unknown device '%s' for bus '%s'", name,
Eduardo Habkost23e3fbe2012-12-04 11:19:34 -0200124 object_get_typename(OBJECT(bus)));
Peter Maydelle92714c2011-08-03 23:49:04 +0100125 } else {
Markus Armbruster312fd5f2013-02-08 21:22:16 +0100126 error_report("Unknown device '%s' for default sysbus", name);
Peter Maydelle92714c2011-08-03 23:49:04 +0100127 }
liguang01ed1d52013-03-22 16:44:14 +0800128 abort();
Blue Swirl0bcdeda2011-02-05 14:34:25 +0000129 }
130
131 return dev;
132}
133
Paolo Bonzinida57feb2012-03-27 18:38:47 +0200134DeviceState *qdev_try_create(BusState *bus, const char *type)
Blue Swirl0bcdeda2011-02-05 14:34:25 +0000135{
Anthony Liguori9fbe6122011-12-22 15:14:27 -0600136 DeviceState *dev;
137
Paolo Bonzinida57feb2012-03-27 18:38:47 +0200138 if (object_class_by_name(type) == NULL) {
Andreas Färber4ed658c2012-02-17 02:47:44 +0100139 return NULL;
140 }
Paolo Bonzinida57feb2012-03-27 18:38:47 +0200141 dev = DEVICE(object_new(type));
Anthony Liguori9fbe6122011-12-22 15:14:27 -0600142 if (!dev) {
143 return NULL;
144 }
145
Markus Armbruster0c175422010-02-19 19:12:18 +0100146 if (!bus) {
Peter Maydell7474f1b2016-05-10 11:30:42 +0100147 /* Assert that the device really is a SysBusDevice before
148 * we put it onto the sysbus. Non-sysbus devices which aren't
149 * being put onto a bus should be created with object_new(TYPE_FOO),
150 * not qdev_create(NULL, TYPE_FOO).
151 */
152 g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE));
Stefan Weil68694892010-12-16 19:33:22 +0100153 bus = sysbus_get_default();
Markus Armbruster0c175422010-02-19 19:12:18 +0100154 }
155
Anthony Liguori9fbe6122011-12-22 15:14:27 -0600156 qdev_set_parent_bus(dev, bus);
Paolo Bonzinib09995a2013-01-25 14:12:37 +0100157 object_unref(OBJECT(dev));
Anthony Liguori9fbe6122011-12-22 15:14:27 -0600158 return dev;
Markus Armbruster0c175422010-02-19 19:12:18 +0100159}
160
Paul Durrant707ff802015-01-20 11:05:07 +0000161static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
162 = QTAILQ_HEAD_INITIALIZER(device_listeners);
163
164enum ListenerDirection { Forward, Reverse };
165
166#define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
167 do { \
168 DeviceListener *_listener; \
169 \
170 switch (_direction) { \
171 case Forward: \
172 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
173 if (_listener->_callback) { \
174 _listener->_callback(_listener, ##_args); \
175 } \
176 } \
177 break; \
178 case Reverse: \
179 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
180 device_listeners, link) { \
181 if (_listener->_callback) { \
182 _listener->_callback(_listener, ##_args); \
183 } \
184 } \
185 break; \
186 default: \
187 abort(); \
188 } \
189 } while (0)
190
191static int device_listener_add(DeviceState *dev, void *opaque)
192{
193 DEVICE_LISTENER_CALL(realize, Forward, dev);
194
195 return 0;
196}
197
198void device_listener_register(DeviceListener *listener)
199{
200 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
201
202 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
203 NULL, NULL);
204}
205
206void device_listener_unregister(DeviceListener *listener)
207{
208 QTAILQ_REMOVE(&device_listeners, listener, link);
209}
210
Jan Kiszka4d2ffa02010-05-15 13:32:40 +0200211void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
212 int required_for_version)
213{
Andreas Färber7983c8a2013-01-09 03:58:10 +0100214 assert(!dev->realized);
Jan Kiszka4d2ffa02010-05-15 13:32:40 +0200215 dev->instance_id_alias = alias_id;
216 dev->alias_required_for_version = required_for_version;
217}
218
Thomas Huth03fcbd92017-11-02 11:10:06 +0100219HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
220{
221 MachineState *machine;
222 MachineClass *mc;
223 Object *m_obj = qdev_get_machine();
224
225 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
226 machine = MACHINE(m_obj);
227 mc = MACHINE_GET_CLASS(machine);
228 if (mc->get_hotplug_handler) {
229 return mc->get_hotplug_handler(machine, dev);
230 }
231 }
232
233 return NULL;
234}
235
Zhu Guihuac06b2ff2015-04-27 16:47:21 +0800236HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
Igor Mammedov7716b8c2014-09-26 09:28:41 +0000237{
Thomas Huth03fcbd92017-11-02 11:10:06 +0100238 HotplugHandler *hotplug_ctrl;
Igor Mammedov7716b8c2014-09-26 09:28:41 +0000239
240 if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
241 hotplug_ctrl = dev->parent_bus->hotplug_handler;
Thomas Huth03fcbd92017-11-02 11:10:06 +0100242 } else {
243 hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
Igor Mammedov7716b8c2014-09-26 09:28:41 +0000244 }
245 return hotplug_ctrl;
246}
247
Anthony Liguoriec990eb2010-11-19 18:55:59 +0900248static int qdev_reset_one(DeviceState *dev, void *opaque)
249{
Anthony Liguori94afdad2011-12-04 11:36:01 -0600250 device_reset(dev);
Anthony Liguoriec990eb2010-11-19 18:55:59 +0900251
252 return 0;
253}
254
Isaku Yamahatab4694b72010-11-19 18:56:00 +0900255static int qbus_reset_one(BusState *bus, void *opaque)
256{
Anthony Liguori0d936922012-05-02 09:00:20 +0200257 BusClass *bc = BUS_GET_CLASS(bus);
258 if (bc->reset) {
Paolo Bonzinidcc20932013-12-06 17:54:27 +0100259 bc->reset(bus);
Isaku Yamahatab4694b72010-11-19 18:56:00 +0900260 }
261 return 0;
262}
263
Isaku Yamahata5af0a042010-11-19 18:56:01 +0900264void qdev_reset_all(DeviceState *dev)
265{
Paolo Bonzinidcc20932013-12-06 17:54:27 +0100266 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
Isaku Yamahata5af0a042010-11-19 18:56:01 +0900267}
268
David Hildenbrandff8de072015-07-21 08:32:07 +0200269void qdev_reset_all_fn(void *opaque)
270{
271 qdev_reset_all(DEVICE(opaque));
272}
273
Paolo Bonzinid0508c32013-01-10 15:49:07 +0100274void qbus_reset_all(BusState *bus)
275{
Paolo Bonzinidcc20932013-12-06 17:54:27 +0100276 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
Paolo Bonzinid0508c32013-01-10 15:49:07 +0100277}
278
Isaku Yamahata80376c32010-12-20 14:33:35 +0900279void qbus_reset_all_fn(void *opaque)
280{
281 BusState *bus = opaque;
Paolo Bonzinid0508c32013-01-10 15:49:07 +0100282 qbus_reset_all(bus);
Isaku Yamahata80376c32010-12-20 14:33:35 +0900283}
284
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200285/* can be used as ->unplug() callback for the simple cases */
Igor Mammedov014176f2014-09-26 09:28:21 +0000286void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
287 DeviceState *dev, Error **errp)
288{
Igor Mammedov2d9a9822014-09-26 09:28:40 +0000289 /* just zap it */
290 object_unparent(OBJECT(dev));
Igor Mammedov014176f2014-09-26 09:28:21 +0000291}
Michael Tokarev3b29a102011-04-06 17:51:59 +0400292
Markus Armbruster0210afe2015-06-19 16:17:22 +0200293/*
294 * Realize @dev.
295 * Device properties should be set before calling this function. IRQs
296 * and MMIO regions should be connected/mapped after calling this
297 * function.
298 * On failure, report an error with error_report() and terminate the
299 * program. This is okay during machine creation. Don't use for
300 * hotplug, because there callers need to recover from failure.
301 * Exception: if you know the device's init() callback can't fail,
302 * then qdev_init_nofail() can't fail either, and is therefore usable
303 * even then. But relying on the device implementation that way is
304 * somewhat unclean, and best avoided.
305 */
Markus Armbrustere23a1b32009-10-07 01:15:58 +0200306void qdev_init_nofail(DeviceState *dev)
307{
Markus Armbrusterc4bacaf2015-02-04 18:33:01 +0100308 Error *err = NULL;
Anthony Liguori7de3abe2012-06-27 07:37:54 -0500309
Markus Armbrusterc4bacaf2015-02-04 18:33:01 +0100310 assert(!dev->realized);
311
Fam Zheng0d4104e2016-08-02 11:41:41 +0800312 object_ref(OBJECT(dev));
Markus Armbrusterc4bacaf2015-02-04 18:33:01 +0100313 object_property_set_bool(OBJECT(dev), true, "realized", &err);
314 if (err) {
Markus Armbrusterc29b77f2015-12-18 16:35:14 +0100315 error_reportf_err(err, "Initialization of device %s failed: ",
316 object_get_typename(OBJECT(dev)));
Markus Armbrusterbd6c9a62010-05-27 21:23:08 +0200317 exit(1);
318 }
Fam Zheng0d4104e2016-08-02 11:41:41 +0800319 object_unref(OBJECT(dev));
Markus Armbrustere23a1b32009-10-07 01:15:58 +0200320}
321
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200322void qdev_machine_creation_done(void)
323{
324 /*
325 * ok, initial machine setup is done, starting from now we can
326 * only create hotpluggable devices
327 */
Juan Quintela9bed84c2017-03-28 11:08:52 +0200328 qdev_hotplug = true;
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200329}
330
Alex Williamson0ac8ef72011-01-04 12:37:50 -0700331bool qdev_machine_modified(void)
332{
333 return qdev_hot_added || qdev_hot_removed;
334}
335
Paul Brook02e2da42009-05-23 00:05:19 +0100336BusState *qdev_get_parent_bus(DeviceState *dev)
Paul Brookaae94602009-05-14 22:35:06 +0100337{
Paul Brook02e2da42009-05-23 00:05:19 +0100338 return dev->parent_bus;
Paul Brookaae94602009-05-14 22:35:06 +0100339}
340
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700341static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
342 const char *name)
343{
344 NamedGPIOList *ngl;
345
346 QLIST_FOREACH(ngl, &dev->gpios, node) {
347 /* NULL is a valid and matchable name, otherwise do a normal
348 * strcmp match.
349 */
350 if ((!ngl->name && !name) ||
351 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
352 return ngl;
353 }
354 }
355
356 ngl = g_malloc0(sizeof(*ngl));
357 ngl->name = g_strdup(name);
358 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
359 return ngl;
360}
361
Peter Maydell4a151672018-03-02 10:45:38 +0000362void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
363 qemu_irq_handler handler,
364 void *opaque,
365 const char *name, int n)
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700366{
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700367 int i;
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700368 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
369
Peter Crosthwaiteb235a712014-09-25 22:17:08 -0700370 assert(gpio_list->num_out == 0 || !name);
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700371 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
Peter Maydell4a151672018-03-02 10:45:38 +0000372 opaque, n);
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700373
Pavel Fedin6c76b372015-07-31 15:23:22 +0300374 if (!name) {
375 name = "unnamed-gpio-in";
376 }
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700377 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
Pavel Fedin6c76b372015-07-31 15:23:22 +0300378 gchar *propname = g_strdup_printf("%s[%u]", name, i);
379
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700380 object_property_add_child(OBJECT(dev), propname,
381 OBJECT(gpio_list->in[i]), &error_abort);
Pavel Fedin6c76b372015-07-31 15:23:22 +0300382 g_free(propname);
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700383 }
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700384
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700385 gpio_list->num_in += n;
386}
387
Paul Brookaae94602009-05-14 22:35:06 +0100388void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
389{
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700390 qdev_init_gpio_in_named(dev, handler, NULL, n);
391}
392
393void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
394 const char *name, int n)
395{
Peter Crosthwaite688b0572014-09-25 22:18:14 -0700396 int i;
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700397 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
398
Peter Crosthwaiteb235a712014-09-25 22:17:08 -0700399 assert(gpio_list->num_in == 0 || !name);
Peter Crosthwaite688b0572014-09-25 22:18:14 -0700400
Pavel Fedin6c76b372015-07-31 15:23:22 +0300401 if (!name) {
402 name = "unnamed-gpio-out";
403 }
404 memset(pins, 0, sizeof(*pins) * n);
Peter Crosthwaite688b0572014-09-25 22:18:14 -0700405 for (i = 0; i < n; ++i) {
Pavel Fedin6c76b372015-07-31 15:23:22 +0300406 gchar *propname = g_strdup_printf("%s[%u]", name,
407 gpio_list->num_out + i);
408
Peter Crosthwaite688b0572014-09-25 22:18:14 -0700409 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
410 (Object **)&pins[i],
411 object_property_allow_set_link,
Marc-André Lureau265b5782018-05-31 21:51:17 +0200412 OBJ_PROP_LINK_STRONG,
Peter Crosthwaite688b0572014-09-25 22:18:14 -0700413 &error_abort);
Pavel Fedin6c76b372015-07-31 15:23:22 +0300414 g_free(propname);
Peter Crosthwaite688b0572014-09-25 22:18:14 -0700415 }
Pavel Fedin6c76b372015-07-31 15:23:22 +0300416 gpio_list->num_out += n;
Paul Brookaae94602009-05-14 22:35:06 +0100417}
418
419void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
420{
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700421 qdev_init_gpio_out_named(dev, pins, NULL, n);
422}
423
424qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
425{
426 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
427
428 assert(n >= 0 && n < gpio_list->num_in);
429 return gpio_list->in[n];
Paul Brookaae94602009-05-14 22:35:06 +0100430}
431
432qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
433{
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700434 return qdev_get_gpio_in_named(dev, NULL, n);
435}
436
437void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
438 qemu_irq pin)
439{
Peter Crosthwaite02757df2014-09-25 22:20:25 -0700440 char *propname = g_strdup_printf("%s[%d]",
441 name ? name : "unnamed-gpio-out", n);
442 if (pin) {
443 /* We need a name for object_property_set_link to work. If the
444 * object has a parent, object_property_add_child will come back
445 * with an error without doing anything. If it has none, it will
446 * never fail. So we can just call it with a NULL Error pointer.
447 */
Andreas Färber88950ee2015-03-12 16:09:34 +0100448 object_property_add_child(container_get(qdev_get_machine(),
449 "/unattached"),
450 "non-qdev-gpio[*]", OBJECT(pin), NULL);
Peter Crosthwaite02757df2014-09-25 22:20:25 -0700451 }
452 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
453 g_free(propname);
Paul Brookaae94602009-05-14 22:35:06 +0100454}
Paul Brookaae94602009-05-14 22:35:06 +0100455
Alexander Grafb7973182014-09-24 12:32:17 +0200456qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
457{
458 char *propname = g_strdup_printf("%s[%d]",
459 name ? name : "unnamed-gpio-out", n);
460
461 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
462 NULL);
463
464 return ret;
465}
466
Veres Lajos67cc32e2015-09-08 22:45:14 +0100467/* disconnect a GPIO output, returning the disconnected input (if any) */
Peter Crosthwaite0c24db22014-09-25 22:20:58 -0700468
469static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
470 const char *name, int n)
471{
472 char *propname = g_strdup_printf("%s[%d]",
473 name ? name : "unnamed-gpio-out", n);
474
475 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
476 NULL);
477 if (ret) {
478 object_property_set_link(OBJECT(dev), NULL, propname, NULL);
479 }
480 g_free(propname);
481 return ret;
482}
483
484qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
485 const char *name, int n)
486{
487 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
488 qdev_connect_gpio_out_named(dev, name, n, icpt);
489 return disconnected;
Paul Brookaae94602009-05-14 22:35:06 +0100490}
491
492void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
493{
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700494 qdev_connect_gpio_out_named(dev, NULL, n, pin);
Paul Brookaae94602009-05-14 22:35:06 +0100495}
496
Peter Crosthwaite17a96a12014-09-25 22:23:42 -0700497void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
498 const char *name)
499{
500 int i;
501 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
502
503 for (i = 0; i < ngl->num_in; i++) {
504 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
505 char *propname = g_strdup_printf("%s[%d]", nm, i);
506
507 object_property_add_alias(OBJECT(container), propname,
508 OBJECT(dev), propname,
509 &error_abort);
Eduardo Habkost6bc5cf92015-04-09 16:57:30 -0300510 g_free(propname);
Peter Crosthwaite17a96a12014-09-25 22:23:42 -0700511 }
512 for (i = 0; i < ngl->num_out; i++) {
513 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
514 char *propname = g_strdup_printf("%s[%d]", nm, i);
515
516 object_property_add_alias(OBJECT(container), propname,
517 OBJECT(dev), propname,
518 &error_abort);
Eduardo Habkost6bc5cf92015-04-09 16:57:30 -0300519 g_free(propname);
Peter Crosthwaite17a96a12014-09-25 22:23:42 -0700520 }
521 QLIST_REMOVE(ngl, node);
522 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
523}
524
Paul Brook02e2da42009-05-23 00:05:19 +0100525BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
Paul Brook4d6ae672009-05-14 22:35:06 +0100526{
Paul Brook02e2da42009-05-23 00:05:19 +0100527 BusState *bus;
Peter Crosthwaitef698c8b2016-01-21 14:15:03 +0000528 Object *child = object_resolve_path_component(OBJECT(dev), name);
529
530 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
531 if (bus) {
532 return bus;
533 }
Paul Brook4d6ae672009-05-14 22:35:06 +0100534
Blue Swirl72cf2d42009-09-12 07:36:22 +0000535 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
Paul Brook4d6ae672009-05-14 22:35:06 +0100536 if (strcmp(name, bus->name) == 0) {
Paul Brook02e2da42009-05-23 00:05:19 +0100537 return bus;
Paul Brook4d6ae672009-05-14 22:35:06 +0100538 }
539 }
540 return NULL;
541}
542
Paolo Bonzini02932142013-12-06 17:54:26 +0100543int qdev_walk_children(DeviceState *dev,
544 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
545 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
546 void *opaque)
Anthony Liguori81699d82010-11-19 18:55:58 +0900547{
548 BusState *bus;
549 int err;
550
Paolo Bonzini02932142013-12-06 17:54:26 +0100551 if (pre_devfn) {
552 err = pre_devfn(dev, opaque);
Anthony Liguori81699d82010-11-19 18:55:58 +0900553 if (err) {
554 return err;
555 }
556 }
557
558 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
Paolo Bonzini02932142013-12-06 17:54:26 +0100559 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
560 post_devfn, post_busfn, opaque);
Anthony Liguori81699d82010-11-19 18:55:58 +0900561 if (err < 0) {
562 return err;
563 }
564 }
565
Paolo Bonzini02932142013-12-06 17:54:26 +0100566 if (post_devfn) {
567 err = post_devfn(dev, opaque);
568 if (err) {
569 return err;
570 }
571 }
572
Anthony Liguori81699d82010-11-19 18:55:58 +0900573 return 0;
574}
575
Isaku Yamahataa2ee6b42010-12-24 12:14:12 +0900576DeviceState *qdev_find_recursive(BusState *bus, const char *id)
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200577{
Anthony Liguori0866aca2011-12-23 15:34:39 -0600578 BusChild *kid;
579 DeviceState *ret;
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200580 BusState *child;
581
Anthony Liguori0866aca2011-12-23 15:34:39 -0600582 QTAILQ_FOREACH(kid, &bus->children, sibling) {
583 DeviceState *dev = kid->child;
584
585 if (dev->id && strcmp(dev->id, id) == 0) {
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200586 return dev;
Anthony Liguori0866aca2011-12-23 15:34:39 -0600587 }
588
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200589 QLIST_FOREACH(child, &dev->child_bus, sibling) {
590 ret = qdev_find_recursive(child, id);
591 if (ret) {
592 return ret;
593 }
594 }
595 }
596 return NULL;
597}
598
Anthony Liguori09e5ab62012-02-03 12:28:43 -0600599char *qdev_get_dev_path(DeviceState *dev)
Anthony Liguoricd34d662011-12-12 14:29:43 -0600600{
Anthony Liguori0d936922012-05-02 09:00:20 +0200601 BusClass *bc;
Anthony Liguori09e5ab62012-02-03 12:28:43 -0600602
603 if (!dev || !dev->parent_bus) {
604 return NULL;
605 }
606
Anthony Liguori0d936922012-05-02 09:00:20 +0200607 bc = BUS_GET_CLASS(dev->parent_bus);
608 if (bc->get_dev_path) {
609 return bc->get_dev_path(dev);
Anthony Liguori09e5ab62012-02-03 12:28:43 -0600610 }
611
612 return NULL;
Anthony Liguori44677de2011-12-12 14:29:26 -0600613}
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600614
615/**
616 * Legacy property handling
617 */
618
Eric Blaked7bce992016-01-29 06:48:55 -0700619static void qdev_get_legacy_property(Object *obj, Visitor *v,
620 const char *name, void *opaque,
621 Error **errp)
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600622{
Anthony Liguori57c9faf2012-01-30 08:55:55 -0600623 DeviceState *dev = DEVICE(obj);
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600624 Property *prop = opaque;
625
Paolo Bonzinie3cb6ba2011-12-18 17:05:06 +0100626 char buffer[1024];
627 char *ptr = buffer;
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600628
Paolo Bonzinie3cb6ba2011-12-18 17:05:06 +0100629 prop->info->print(dev, prop, buffer, sizeof(buffer));
Eric Blake51e72bc2016-01-29 06:48:54 -0700630 visit_type_str(v, name, &ptr, errp);
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600631}
632
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600633/**
Cao jind9d8d452016-04-17 15:45:54 +0800634 * qdev_property_add_legacy:
635 * @dev: Device to add the property to.
636 * @prop: The qdev property definition.
637 * @errp: location to store error information.
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600638 *
Cao jind9d8d452016-04-17 15:45:54 +0800639 * Add a legacy QOM property to @dev for qdev property @prop.
640 * On error, store error in @errp.
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600641 *
Cao jind9d8d452016-04-17 15:45:54 +0800642 * Legacy properties are string versions of QOM properties. The format of
643 * the string depends on the property type. Legacy properties are only
644 * needed for "info qtree".
645 *
Li Qiang6871a0d2018-09-04 23:49:01 -0700646 * Do not use this in new code! QOM Properties added through this interface
Cao jind9d8d452016-04-17 15:45:54 +0800647 * will be given names in the "legacy" namespace.
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600648 */
Stefan Weilf5a014d2014-05-02 22:22:57 +0200649static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
650 Error **errp)
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600651{
Paolo Bonzini7ce7ffe2014-02-08 11:01:48 +0100652 gchar *name;
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600653
Anthony Liguorif3be0162012-05-02 13:31:07 +0200654 /* Register pointer properties as legacy properties */
Paolo Bonzini03ff7772014-02-08 11:01:47 +0100655 if (!prop->info->print && prop->info->get) {
Paolo Bonzini68ee3562012-02-02 10:17:19 +0100656 return;
657 }
Anthony Liguorif3be0162012-05-02 13:31:07 +0200658
Fam Zhengfaabdbb2017-07-14 10:14:51 +0800659 if (prop->info->create) {
660 return;
661 }
662
Paolo Bonzinica2cc782011-12-18 17:05:11 +0100663 name = g_strdup_printf("legacy-%s", prop->name);
Paolo Bonzini7ce7ffe2014-02-08 11:01:48 +0100664 object_property_add(OBJECT(dev), name, "str",
Paolo Bonzini68ee3562012-02-02 10:17:19 +0100665 prop->info->print ? qdev_get_legacy_property : prop->info->get,
Paolo Bonzini03ff7772014-02-08 11:01:47 +0100666 NULL,
Anthony Liguori57c9faf2012-01-30 08:55:55 -0600667 NULL,
668 prop, errp);
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600669
Paolo Bonzinica2cc782011-12-18 17:05:11 +0100670 g_free(name);
671}
672
673/**
Cao jind9d8d452016-04-17 15:45:54 +0800674 * qdev_property_add_static:
675 * @dev: Device to add the property to.
676 * @prop: The qdev property definition.
677 * @errp: location to store error information.
Paolo Bonzinica2cc782011-12-18 17:05:11 +0100678 *
Cao jind9d8d452016-04-17 15:45:54 +0800679 * Add a static QOM property to @dev for qdev property @prop.
680 * On error, store error in @errp. Static properties access data in a struct.
681 * The type of the QOM property is derived from prop->info.
Paolo Bonzinica2cc782011-12-18 17:05:11 +0100682 */
683void qdev_property_add_static(DeviceState *dev, Property *prop,
684 Error **errp)
685{
Paolo Bonzinifdae2452012-04-02 22:40:26 +0200686 Error *local_err = NULL;
687 Object *obj = OBJECT(dev);
688
Fam Zhengfaabdbb2017-07-14 10:14:51 +0800689 if (prop->info->create) {
690 prop->info->create(obj, prop, &local_err);
691 } else {
692 /*
693 * TODO qdev_prop_ptr does not have getters or setters. It must
694 * go now that it can be replaced with links. The test should be
695 * removed along with it: all static properties are read/write.
696 */
697 if (!prop->info->get && !prop->info->set) {
698 return;
699 }
700 object_property_add(obj, prop->name, prop->info->name,
701 prop->info->get, prop->info->set,
702 prop->info->release,
703 prop, &local_err);
Paolo Bonzinid8229792012-02-02 09:47:13 +0100704 }
705
Paolo Bonzinifdae2452012-04-02 22:40:26 +0200706 if (local_err) {
707 error_propagate(errp, local_err);
708 return;
709 }
Gongleib8c9cd52014-10-07 14:33:22 +0800710
711 object_property_set_description(obj, prop->name,
712 prop->info->description,
713 &error_abort);
714
Peter Maydell5cc56cc2017-07-17 13:36:06 +0100715 if (prop->set_default) {
Marc-André Lureaua2740ad2017-06-07 20:35:53 +0400716 prop->info->set_default_value(obj, prop);
Paolo Bonzinifdae2452012-04-02 22:40:26 +0200717 }
Anthony Liguori6a146eb2011-12-12 14:29:42 -0600718}
Anthony Liguori1de81d22011-12-19 16:37:46 -0600719
Stefan Hajnoczi67cc7e02014-06-18 17:58:32 +0800720/* @qdev_alias_all_properties - Add alias properties to the source object for
721 * all qdev properties on the target DeviceState.
722 */
723void qdev_alias_all_properties(DeviceState *target, Object *source)
724{
725 ObjectClass *class;
726 Property *prop;
727
728 class = object_get_class(OBJECT(target));
729 do {
730 DeviceClass *dc = DEVICE_CLASS(class);
731
732 for (prop = dc->props; prop && prop->name; prop++) {
733 object_property_add_alias(source, prop->name,
734 OBJECT(target), prop->name,
735 &error_abort);
736 }
737 class = object_class_get_parent(class);
738 } while (class != object_class_by_name(TYPE_DEVICE));
739}
740
Marcel Apfelbaum4cae4d52014-11-26 13:50:01 +0200741static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
Zhu Guihua66e56b12014-10-21 19:46:04 +0800742{
743 GSList **list = opaque;
Jun Li09d56012014-11-05 15:03:03 +0800744 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
745 TYPE_DEVICE);
746
747 if (dev == NULL) {
748 return 0;
749 }
Zhu Guihua66e56b12014-10-21 19:46:04 +0800750
751 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
752 *list = g_slist_append(*list, dev);
753 }
754
Zhu Guihua66e56b12014-10-21 19:46:04 +0800755 return 0;
756}
757
Marcel Apfelbaum4cae4d52014-11-26 13:50:01 +0200758GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
759{
760 GSList *list = NULL;
761
762 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
763
764 return list;
765}
766
Markus Armbrustera7737e42014-04-25 12:44:21 +0200767static bool device_get_realized(Object *obj, Error **errp)
Andreas Färber249d4172013-01-09 03:58:11 +0100768{
769 DeviceState *dev = DEVICE(obj);
770 return dev->realized;
771}
772
Juan Quintela1bfe5f02017-04-17 14:57:54 +0200773static bool check_only_migratable(Object *obj, Error **err)
774{
775 DeviceClass *dc = DEVICE_GET_CLASS(obj);
776
777 if (!vmstate_check_only_migratable(dc->vmsd)) {
778 error_setg(err, "Device %s is not migratable, but "
779 "--only-migratable was specified",
780 object_get_typename(obj));
781 return false;
782 }
783
784 return true;
785}
786
Markus Armbrustera7737e42014-04-25 12:44:21 +0200787static void device_set_realized(Object *obj, bool value, Error **errp)
Andreas Färber249d4172013-01-09 03:58:11 +0100788{
789 DeviceState *dev = DEVICE(obj);
790 DeviceClass *dc = DEVICE_GET_CLASS(dev);
Igor Mammedov7716b8c2014-09-26 09:28:41 +0000791 HotplugHandler *hotplug_ctrl;
Bandan Das5c21ce72014-03-12 21:02:12 +0100792 BusState *bus;
Andreas Färber249d4172013-01-09 03:58:11 +0100793 Error *local_err = NULL;
Igor Mammedov69382d82016-07-25 11:59:22 +0200794 bool unattached_parent = false;
795 static int unattached_count;
Andreas Färber249d4172013-01-09 03:58:11 +0100796
Igor Mammedov1a37eca2014-02-05 16:36:46 +0100797 if (dev->hotplugged && !dc->hotpluggable) {
Markus Armbrusterc6bd8c72015-03-17 11:54:50 +0100798 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
Igor Mammedov1a37eca2014-02-05 16:36:46 +0100799 return;
800 }
801
Andreas Färber249d4172013-01-09 03:58:11 +0100802 if (value && !dev->realized) {
Juan Quintela1bfe5f02017-04-17 14:57:54 +0200803 if (!check_only_migratable(obj, &local_err)) {
Ashijeet Acharya7562f902017-02-13 23:34:48 +0530804 goto fail;
805 }
806
Gongleid5780292014-09-02 20:03:05 +0800807 if (!obj->parent) {
Andreas Färber249d4172013-01-09 03:58:11 +0100808 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
809
810 object_property_add_child(container_get(qdev_get_machine(),
811 "/unattached"),
Gongleid5780292014-09-02 20:03:05 +0800812 name, obj, &error_abort);
Igor Mammedov69382d82016-07-25 11:59:22 +0200813 unattached_parent = true;
Andreas Färber249d4172013-01-09 03:58:11 +0100814 g_free(name);
815 }
816
Igor Mammedov41346262016-05-12 09:18:15 +0530817 hotplug_ctrl = qdev_get_hotplug_handler(dev);
818 if (hotplug_ctrl) {
819 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
820 if (local_err != NULL) {
821 goto fail;
822 }
823 }
824
Igor Mammedova7ddba52013-04-11 16:51:56 +0200825 if (dc->realize) {
826 dc->realize(dev, &local_err);
827 }
828
Gonglei1d45a702014-09-04 10:18:26 +0800829 if (local_err != NULL) {
830 goto fail;
831 }
832
Paul Durrant707ff802015-01-20 11:05:07 +0000833 DEVICE_LISTENER_CALL(realize, Forward, dev);
834
Michael Roth04162f82017-10-16 17:23:13 -0500835 /*
836 * always free/re-initialize here since the value cannot be cleaned up
837 * in device_unrealize due to its usage later on in the unplug path
838 */
839 g_free(dev->canonical_path);
840 dev->canonical_path = object_get_canonical_path(OBJECT(dev));
841
Gonglei1d45a702014-09-04 10:18:26 +0800842 if (qdev_get_vmsd(dev)) {
Dr. David Alan Gilbert67980032017-02-02 12:59:56 +0000843 if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
844 dev->instance_id_alias,
845 dev->alias_required_for_version,
846 &local_err) < 0) {
847 goto post_realize_fail;
848 }
Andreas Färber249d4172013-01-09 03:58:11 +0100849 }
Gonglei1d45a702014-09-04 10:18:26 +0800850
851 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
852 object_property_set_bool(OBJECT(bus), true, "realized",
Bandan Das5c21ce72014-03-12 21:02:12 +0100853 &local_err);
Gonglei1d45a702014-09-04 10:18:26 +0800854 if (local_err != NULL) {
855 goto child_realize_fail;
Bandan Das5c21ce72014-03-12 21:02:12 +0100856 }
857 }
Gonglei1d45a702014-09-04 10:18:26 +0800858 if (dev->hotplugged) {
Andreas Färber249d4172013-01-09 03:58:11 +0100859 device_reset(dev);
860 }
Paolo Bonzini352e8da2014-06-26 15:10:03 +0200861 dev->pending_deleted_event = false;
Stefan Hajnoczi25e89782018-07-16 09:37:31 +0100862
863 if (hotplug_ctrl) {
Igor Mammedov8b5e6ca2018-10-16 15:33:40 +0200864 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
865 if (local_err != NULL) {
866 goto child_realize_fail;
867 }
868 }
869
Andreas Färber249d4172013-01-09 03:58:11 +0100870 } else if (!value && dev->realized) {
Gongleicd4520a2014-09-04 10:18:25 +0800871 Error **local_errp = NULL;
Bandan Das5c21ce72014-03-12 21:02:12 +0100872 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
Gongleicd4520a2014-09-04 10:18:25 +0800873 local_errp = local_err ? NULL : &local_err;
Bandan Das5c21ce72014-03-12 21:02:12 +0100874 object_property_set_bool(OBJECT(bus), false, "realized",
Gongleicd4520a2014-09-04 10:18:25 +0800875 local_errp);
Bandan Das5c21ce72014-03-12 21:02:12 +0100876 }
Gongleicd4520a2014-09-04 10:18:25 +0800877 if (qdev_get_vmsd(dev)) {
Andreas Färberfe6c2112013-04-15 18:34:10 +0200878 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
879 }
Gongleicd4520a2014-09-04 10:18:25 +0800880 if (dc->unrealize) {
881 local_errp = local_err ? NULL : &local_err;
882 dc->unrealize(dev, local_errp);
Andreas Färber249d4172013-01-09 03:58:11 +0100883 }
Paolo Bonzini352e8da2014-06-26 15:10:03 +0200884 dev->pending_deleted_event = true;
Paul Durrant707ff802015-01-20 11:05:07 +0000885 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
Andreas Färber249d4172013-01-09 03:58:11 +0100886 }
887
Xiao Guangrongc7f8d0f2016-11-07 19:13:36 +0800888 if (local_err != NULL) {
889 goto fail;
890 }
891
892 dev->realized = value;
Gonglei1d45a702014-09-04 10:18:26 +0800893 return;
894
895child_realize_fail:
896 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
897 object_property_set_bool(OBJECT(bus), false, "realized",
898 NULL);
899 }
900
901 if (qdev_get_vmsd(dev)) {
902 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
903 }
904
905post_realize_fail:
Michael Roth04162f82017-10-16 17:23:13 -0500906 g_free(dev->canonical_path);
907 dev->canonical_path = NULL;
Gonglei1d45a702014-09-04 10:18:26 +0800908 if (dc->unrealize) {
909 dc->unrealize(dev, NULL);
910 }
911
912fail:
913 error_propagate(errp, local_err);
Igor Mammedov69382d82016-07-25 11:59:22 +0200914 if (unattached_parent) {
915 object_unparent(OBJECT(dev));
916 unattached_count--;
917 }
Andreas Färber249d4172013-01-09 03:58:11 +0100918}
919
Markus Armbrustera7737e42014-04-25 12:44:21 +0200920static bool device_get_hotpluggable(Object *obj, Error **errp)
Igor Mammedov1a37eca2014-02-05 16:36:46 +0100921{
922 DeviceClass *dc = DEVICE_GET_CLASS(obj);
923 DeviceState *dev = DEVICE(obj);
924
Andreas Färber2b81b352014-03-07 19:04:13 +0100925 return dc->hotpluggable && (dev->parent_bus == NULL ||
Igor Mammedov39b888b2014-09-26 09:28:17 +0000926 qbus_is_hotpluggable(dev->parent_bus));
Igor Mammedov1a37eca2014-02-05 16:36:46 +0100927}
928
Igor Mammedovd012ffc2014-06-02 15:25:04 +0200929static bool device_get_hotplugged(Object *obj, Error **err)
930{
931 DeviceState *dev = DEVICE(obj);
932
933 return dev->hotplugged;
934}
935
Anthony Liguori9674bfe2011-12-22 15:06:37 -0600936static void device_initfn(Object *obj)
937{
938 DeviceState *dev = DEVICE(obj);
Paolo Bonzinibce54472012-03-28 18:12:47 +0200939 ObjectClass *class;
Anthony Liguori9674bfe2011-12-22 15:06:37 -0600940 Property *prop;
941
942 if (qdev_hotplug) {
943 dev->hotplugged = 1;
944 qdev_hot_added = true;
945 }
946
947 dev->instance_id_alias = -1;
Andreas Färber7983c8a2013-01-09 03:58:10 +0100948 dev->realized = false;
Anthony Liguori9674bfe2011-12-22 15:06:37 -0600949
Andreas Färber249d4172013-01-09 03:58:11 +0100950 object_property_add_bool(obj, "realized",
951 device_get_realized, device_set_realized, NULL);
Igor Mammedov1a37eca2014-02-05 16:36:46 +0100952 object_property_add_bool(obj, "hotpluggable",
953 device_get_hotpluggable, NULL, NULL);
Igor Mammedovd012ffc2014-06-02 15:25:04 +0200954 object_property_add_bool(obj, "hotplugged",
Eduardo Habkost36cccb82017-02-22 16:26:47 -0300955 device_get_hotplugged, NULL,
Igor Mammedovd012ffc2014-06-02 15:25:04 +0200956 &error_abort);
Andreas Färber249d4172013-01-09 03:58:11 +0100957
Paolo Bonzinibce54472012-03-28 18:12:47 +0200958 class = object_get_class(OBJECT(dev));
959 do {
960 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
Peter Crosthwaite5433a0a2014-01-01 18:48:08 -0800961 qdev_property_add_legacy(dev, prop, &error_abort);
962 qdev_property_add_static(dev, prop, &error_abort);
Paolo Bonzinibce54472012-03-28 18:12:47 +0200963 }
Paolo Bonzinibce54472012-03-28 18:12:47 +0200964 class = object_class_get_parent(class);
965 } while (class != object_class_by_name(TYPE_DEVICE));
Anthony Liguori9674bfe2011-12-22 15:06:37 -0600966
Anthony Liguorif968fc62012-05-02 10:39:01 +0200967 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
Stefan Hajnoczi39f72ef2014-03-19 08:58:56 +0100968 (Object **)&dev->parent_bus, NULL, 0,
Stefan Hajnoczi9561fda2014-03-19 08:58:55 +0100969 &error_abort);
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700970 QLIST_INIT(&dev->gpios);
Anthony Liguori9674bfe2011-12-22 15:06:37 -0600971}
972
Eduardo Habkost99a0b032013-07-10 17:08:42 -0300973static void device_post_init(Object *obj)
974{
Markus Armbruster25f8dd92015-01-20 10:04:07 +0100975 qdev_prop_set_globals(DEVICE(obj));
Eduardo Habkost99a0b032013-07-10 17:08:42 -0300976}
977
Anthony Liguori60adba32011-12-23 08:38:56 -0600978/* Unlink device from bus and free the structure. */
979static void device_finalize(Object *obj)
980{
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700981 NamedGPIOList *ngl, *next;
982
Anthony Liguori60adba32011-12-23 08:38:56 -0600983 DeviceState *dev = DEVICE(obj);
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700984
985 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
986 QLIST_REMOVE(ngl, node);
Peter Crosthwaitef173d572014-06-18 00:56:31 -0700987 qemu_free_irqs(ngl->in, ngl->num_in);
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700988 g_free(ngl->name);
989 g_free(ngl);
990 /* ngl->out irqs are owned by the other end and should not be freed
991 * here
992 */
993 }
Michael Rothf7b879e2017-10-16 17:23:15 -0500994
995 /* Only send event if the device had been completely realized */
996 if (dev->pending_deleted_event) {
997 g_assert(dev->canonical_path);
998
Peter Xu3ab72382018-08-15 21:37:37 +0800999 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
Michael Rothf7b879e2017-10-16 17:23:15 -05001000 g_free(dev->canonical_path);
1001 dev->canonical_path = NULL;
1002 }
1003
1004 qemu_opts_del(dev->opts);
Anthony Liguori60adba32011-12-23 08:38:56 -06001005}
1006
Paolo Bonzinibce54472012-03-28 18:12:47 +02001007static void device_class_base_init(ObjectClass *class, void *data)
1008{
1009 DeviceClass *klass = DEVICE_CLASS(class);
1010
1011 /* We explicitly look up properties in the superclasses,
1012 * so do not propagate them to the subclasses.
1013 */
1014 klass->props = NULL;
Anthony Liguori1de81d22011-12-19 16:37:46 -06001015}
Anthony Liguori32fea402011-12-16 14:34:46 -06001016
Andreas Färber5d5b24d2013-01-04 18:13:00 +01001017static void device_unparent(Object *obj)
Paolo Bonzini667d22d2012-11-23 09:47:13 +01001018{
1019 DeviceState *dev = DEVICE(obj);
Paolo Bonzini06f7f2b2013-01-25 14:12:34 +01001020 BusState *bus;
Paolo Bonzini667d22d2012-11-23 09:47:13 +01001021
Bandan Das5c21ce72014-03-12 21:02:12 +01001022 if (dev->realized) {
1023 object_property_set_bool(obj, false, "realized", NULL);
1024 }
Paolo Bonzini06f7f2b2013-01-25 14:12:34 +01001025 while (dev->num_child_bus) {
1026 bus = QLIST_FIRST(&dev->child_bus);
Stefan Hajnoczi6780a222013-12-18 17:15:51 +01001027 object_unparent(OBJECT(bus));
Paolo Bonzini06f7f2b2013-01-25 14:12:34 +01001028 }
Paolo Bonzini06f7f2b2013-01-25 14:12:34 +01001029 if (dev->parent_bus) {
Andreas Färber5d5b24d2013-01-04 18:13:00 +01001030 bus_remove_child(dev->parent_bus, dev);
Paolo Bonzini62d7ba62013-01-25 14:12:35 +01001031 object_unref(OBJECT(dev->parent_bus));
1032 dev->parent_bus = NULL;
Andreas Färber5d5b24d2013-01-04 18:13:00 +01001033 }
Paolo Bonzini667d22d2012-11-23 09:47:13 +01001034}
1035
1036static void device_class_init(ObjectClass *class, void *data)
1037{
Andreas Färber249d4172013-01-09 03:58:11 +01001038 DeviceClass *dc = DEVICE_CLASS(class);
1039
Andreas Färber5d5b24d2013-01-04 18:13:00 +01001040 class->unparent = device_unparent;
Igor Mammedov267a3262014-02-18 17:56:53 +01001041
1042 /* by default all devices were considered as hotpluggable,
1043 * so with intent to check it in generic qdev_unplug() /
1044 * device_set_realized() functions make every device
1045 * hotpluggable. Devices that shouldn't be hotpluggable,
1046 * should override it in their class_init()
1047 */
1048 dc->hotpluggable = true;
Eduardo Habkoste90f2a82017-05-03 17:35:44 -03001049 dc->user_creatable = true;
Paolo Bonzini667d22d2012-11-23 09:47:13 +01001050}
1051
Philippe Mathieu-Daudé46795cf2018-01-13 23:04:11 -03001052void device_class_set_parent_reset(DeviceClass *dc,
1053 DeviceReset dev_reset,
1054 DeviceReset *parent_reset)
1055{
1056 *parent_reset = dc->reset;
1057 dc->reset = dev_reset;
1058}
1059
1060void device_class_set_parent_realize(DeviceClass *dc,
1061 DeviceRealize dev_realize,
1062 DeviceRealize *parent_realize)
1063{
1064 *parent_realize = dc->realize;
1065 dc->realize = dev_realize;
1066}
1067
1068void device_class_set_parent_unrealize(DeviceClass *dc,
1069 DeviceUnrealize dev_unrealize,
1070 DeviceUnrealize *parent_unrealize)
1071{
1072 *parent_unrealize = dc->unrealize;
1073 dc->unrealize = dev_unrealize;
1074}
1075
Anthony Liguori94afdad2011-12-04 11:36:01 -06001076void device_reset(DeviceState *dev)
1077{
1078 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1079
1080 if (klass->reset) {
1081 klass->reset(dev);
1082 }
1083}
1084
Paolo Bonzinif05f6b42012-03-28 16:34:12 +02001085Object *qdev_get_machine(void)
1086{
1087 static Object *dev;
1088
1089 if (dev == NULL) {
Andreas Färberdfe47e72012-04-05 13:21:46 +02001090 dev = container_get(object_get_root(), "/machine");
Paolo Bonzinif05f6b42012-03-28 16:34:12 +02001091 }
1092
1093 return dev;
1094}
1095
Andreas Färber8c43a6f2013-01-10 16:19:07 +01001096static const TypeInfo device_type_info = {
Anthony Liguori32fea402011-12-16 14:34:46 -06001097 .name = TYPE_DEVICE,
1098 .parent = TYPE_OBJECT,
1099 .instance_size = sizeof(DeviceState),
Anthony Liguori9674bfe2011-12-22 15:06:37 -06001100 .instance_init = device_initfn,
Eduardo Habkost99a0b032013-07-10 17:08:42 -03001101 .instance_post_init = device_post_init,
Anthony Liguori60adba32011-12-23 08:38:56 -06001102 .instance_finalize = device_finalize,
Paolo Bonzinibce54472012-03-28 18:12:47 +02001103 .class_base_init = device_class_base_init,
Paolo Bonzini667d22d2012-11-23 09:47:13 +01001104 .class_init = device_class_init,
Anthony Liguori32fea402011-12-16 14:34:46 -06001105 .abstract = true,
1106 .class_size = sizeof(DeviceClass),
1107};
1108
Andreas Färber83f7d432012-02-09 15:20:55 +01001109static void qdev_register_types(void)
Anthony Liguori32fea402011-12-16 14:34:46 -06001110{
1111 type_register_static(&device_type_info);
1112}
1113
Andreas Färber83f7d432012-02-09 15:20:55 +01001114type_init(qdev_register_types)