blob: ec63fe0354bd783564dcbbcd62cc1b93550ea966 [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 Bonzini6b1566c2014-03-17 13:40:23 +110030#include "hw/fw-path-provider.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010031#include "sysemu/sysemu.h"
Paolo Bonzinib4a42f82013-02-04 11:37:52 +010032#include "qapi/qmp/qerror.h"
Paolo Bonzini7b1b5d12012-12-17 18:19:43 +010033#include "qapi/visitor.h"
Michael S. Tsirkin0402a5d2013-03-06 14:58:59 +020034#include "qapi/qmp/qjson.h"
Markus Armbrusterd49b6832015-03-17 18:29:20 +010035#include "qemu/error-report.h"
Igor Mammedov0ee4de62014-02-05 16:36:45 +010036#include "hw/hotplug.h"
Igor Mammedovb7454542014-06-02 15:25:03 +020037#include "hw/boards.h"
Peter Maydell7474f1b2016-05-10 11:30:42 +010038#include "hw/sysbus.h"
Wenchao Xia24b699f2014-06-18 08:43:43 +020039#include "qapi-event.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 Liguori4be9f0d2011-12-09 10:51:49 -060051const char *qdev_fw_name(DeviceState *dev)
52{
Anthony Liguori6e008582011-12-09 11:06:57 -060053 DeviceClass *dc = DEVICE_GET_CLASS(dev);
Anthony Liguori4be9f0d2011-12-09 10:51:49 -060054
Anthony Liguori6e008582011-12-09 11:06:57 -060055 if (dc->fw_name) {
56 return dc->fw_name;
Anthony Liguori4be9f0d2011-12-09 10:51:49 -060057 }
58
59 return object_get_typename(OBJECT(dev));
60}
61
Anthony Liguori0866aca2011-12-23 15:34:39 -060062static void bus_remove_child(BusState *bus, DeviceState *child)
Paul Brookaae94602009-05-14 22:35:06 +010063{
Anthony Liguori0866aca2011-12-23 15:34:39 -060064 BusChild *kid;
65
66 QTAILQ_FOREACH(kid, &bus->children, sibling) {
67 if (kid->child == child) {
68 char name[32];
69
70 snprintf(name, sizeof(name), "child[%d]", kid->index);
71 QTAILQ_REMOVE(&bus->children, kid, sibling);
Paolo Bonzini9d127822013-01-25 14:12:32 +010072
73 /* This gives back ownership of kid->child back to us. */
Anthony Liguori0866aca2011-12-23 15:34:39 -060074 object_property_del(OBJECT(bus), name, NULL);
Paolo Bonzini9d127822013-01-25 14:12:32 +010075 object_unref(OBJECT(kid->child));
Anthony Liguori0866aca2011-12-23 15:34:39 -060076 g_free(kid);
77 return;
78 }
79 }
80}
81
82static void bus_add_child(BusState *bus, DeviceState *child)
83{
84 char name[32];
85 BusChild *kid = g_malloc0(sizeof(*kid));
Paul Brookaae94602009-05-14 22:35:06 +010086
Anthony Liguori0866aca2011-12-23 15:34:39 -060087 kid->index = bus->max_index++;
88 kid->child = child;
Paolo Bonzini9d127822013-01-25 14:12:32 +010089 object_ref(OBJECT(kid->child));
Anthony Liguoria5296ca2011-12-12 14:29:27 -060090
Anthony Liguori0866aca2011-12-23 15:34:39 -060091 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
92
Paolo Bonzini9d127822013-01-25 14:12:32 +010093 /* This transfers ownership of kid->child to the property. */
Anthony Liguori0866aca2011-12-23 15:34:39 -060094 snprintf(name, sizeof(name), "child[%d]", kid->index);
95 object_property_add_link(OBJECT(bus), name,
96 object_get_typename(OBJECT(child)),
Stefan Hajnoczi39f72ef2014-03-19 08:58:56 +010097 (Object **)&kid->child,
98 NULL, /* read-only property */
99 0, /* return ownership on prop deletion */
100 NULL);
Anthony Liguori0866aca2011-12-23 15:34:39 -0600101}
102
103void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
104{
Peter Maydell91c968a2017-02-28 14:55:08 +0000105 bool replugging = dev->parent_bus != NULL;
106
107 if (replugging) {
108 /* Keep a reference to the device while it's not plugged into
109 * any bus, to avoid it potentially evaporating when it is
110 * dereffed in bus_remove_child().
111 */
112 object_ref(OBJECT(dev));
113 bus_remove_child(dev->parent_bus, dev);
114 object_unref(OBJECT(dev->parent_bus));
115 }
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600116 dev->parent_bus = bus;
Paolo Bonzini62d7ba62013-01-25 14:12:35 +0100117 object_ref(OBJECT(bus));
Anthony Liguori0866aca2011-12-23 15:34:39 -0600118 bus_add_child(bus, dev);
Peter Maydell91c968a2017-02-28 14:55:08 +0000119 if (replugging) {
120 object_unref(OBJECT(dev));
121 }
Paul Brookaae94602009-05-14 22:35:06 +0100122}
123
Markus Armbruster0210afe2015-06-19 16:17:22 +0200124/* Create a new device. This only initializes the device state
125 structure and allows properties to be set. The device still needs
126 to be realized. See qdev-core.h. */
Markus Armbruster0c175422010-02-19 19:12:18 +0100127DeviceState *qdev_create(BusState *bus, const char *name)
128{
Blue Swirl0bcdeda2011-02-05 14:34:25 +0000129 DeviceState *dev;
130
131 dev = qdev_try_create(bus, name);
132 if (!dev) {
Peter Maydelle92714c2011-08-03 23:49:04 +0100133 if (bus) {
Markus Armbruster312fd5f2013-02-08 21:22:16 +0100134 error_report("Unknown device '%s' for bus '%s'", name,
Eduardo Habkost23e3fbe2012-12-04 11:19:34 -0200135 object_get_typename(OBJECT(bus)));
Peter Maydelle92714c2011-08-03 23:49:04 +0100136 } else {
Markus Armbruster312fd5f2013-02-08 21:22:16 +0100137 error_report("Unknown device '%s' for default sysbus", name);
Peter Maydelle92714c2011-08-03 23:49:04 +0100138 }
liguang01ed1d52013-03-22 16:44:14 +0800139 abort();
Blue Swirl0bcdeda2011-02-05 14:34:25 +0000140 }
141
142 return dev;
143}
144
Paolo Bonzinida57feb2012-03-27 18:38:47 +0200145DeviceState *qdev_try_create(BusState *bus, const char *type)
Blue Swirl0bcdeda2011-02-05 14:34:25 +0000146{
Anthony Liguori9fbe6122011-12-22 15:14:27 -0600147 DeviceState *dev;
148
Paolo Bonzinida57feb2012-03-27 18:38:47 +0200149 if (object_class_by_name(type) == NULL) {
Andreas Färber4ed658c2012-02-17 02:47:44 +0100150 return NULL;
151 }
Paolo Bonzinida57feb2012-03-27 18:38:47 +0200152 dev = DEVICE(object_new(type));
Anthony Liguori9fbe6122011-12-22 15:14:27 -0600153 if (!dev) {
154 return NULL;
155 }
156
Markus Armbruster0c175422010-02-19 19:12:18 +0100157 if (!bus) {
Peter Maydell7474f1b2016-05-10 11:30:42 +0100158 /* Assert that the device really is a SysBusDevice before
159 * we put it onto the sysbus. Non-sysbus devices which aren't
160 * being put onto a bus should be created with object_new(TYPE_FOO),
161 * not qdev_create(NULL, TYPE_FOO).
162 */
163 g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE));
Stefan Weil68694892010-12-16 19:33:22 +0100164 bus = sysbus_get_default();
Markus Armbruster0c175422010-02-19 19:12:18 +0100165 }
166
Anthony Liguori9fbe6122011-12-22 15:14:27 -0600167 qdev_set_parent_bus(dev, bus);
Paolo Bonzinib09995a2013-01-25 14:12:37 +0100168 object_unref(OBJECT(dev));
Anthony Liguori9fbe6122011-12-22 15:14:27 -0600169 return dev;
Markus Armbruster0c175422010-02-19 19:12:18 +0100170}
171
Paul Durrant707ff802015-01-20 11:05:07 +0000172static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
173 = QTAILQ_HEAD_INITIALIZER(device_listeners);
174
175enum ListenerDirection { Forward, Reverse };
176
177#define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
178 do { \
179 DeviceListener *_listener; \
180 \
181 switch (_direction) { \
182 case Forward: \
183 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
184 if (_listener->_callback) { \
185 _listener->_callback(_listener, ##_args); \
186 } \
187 } \
188 break; \
189 case Reverse: \
190 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
191 device_listeners, link) { \
192 if (_listener->_callback) { \
193 _listener->_callback(_listener, ##_args); \
194 } \
195 } \
196 break; \
197 default: \
198 abort(); \
199 } \
200 } while (0)
201
202static int device_listener_add(DeviceState *dev, void *opaque)
203{
204 DEVICE_LISTENER_CALL(realize, Forward, dev);
205
206 return 0;
207}
208
209void device_listener_register(DeviceListener *listener)
210{
211 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
212
213 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
214 NULL, NULL);
215}
216
217void device_listener_unregister(DeviceListener *listener)
218{
219 QTAILQ_REMOVE(&device_listeners, listener, link);
220}
221
Markus Armbrustera7737e42014-04-25 12:44:21 +0200222static void device_realize(DeviceState *dev, Error **errp)
Andreas Färber249d4172013-01-09 03:58:11 +0100223{
224 DeviceClass *dc = DEVICE_GET_CLASS(dev);
225
226 if (dc->init) {
227 int rc = dc->init(dev);
228 if (rc < 0) {
Markus Armbrustera7737e42014-04-25 12:44:21 +0200229 error_setg(errp, "Device initialization failed.");
Andreas Färber249d4172013-01-09 03:58:11 +0100230 return;
231 }
232 }
233}
234
Andreas Färberfe6c2112013-04-15 18:34:10 +0200235static void device_unrealize(DeviceState *dev, Error **errp)
236{
237 DeviceClass *dc = DEVICE_GET_CLASS(dev);
238
239 if (dc->exit) {
240 int rc = dc->exit(dev);
241 if (rc < 0) {
242 error_setg(errp, "Device exit failed.");
243 return;
244 }
245 }
246}
247
Jan Kiszka4d2ffa02010-05-15 13:32:40 +0200248void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
249 int required_for_version)
250{
Andreas Färber7983c8a2013-01-09 03:58:10 +0100251 assert(!dev->realized);
Jan Kiszka4d2ffa02010-05-15 13:32:40 +0200252 dev->instance_id_alias = alias_id;
253 dev->alias_required_for_version = required_for_version;
254}
255
Zhu Guihuac06b2ff2015-04-27 16:47:21 +0800256HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
Igor Mammedov7716b8c2014-09-26 09:28:41 +0000257{
258 HotplugHandler *hotplug_ctrl = NULL;
259
260 if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
261 hotplug_ctrl = dev->parent_bus->hotplug_handler;
262 } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
263 MachineState *machine = MACHINE(qdev_get_machine());
264 MachineClass *mc = MACHINE_GET_CLASS(machine);
265
266 if (mc->get_hotplug_handler) {
267 hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
268 }
269 }
270 return hotplug_ctrl;
271}
272
Anthony Liguoriec990eb2010-11-19 18:55:59 +0900273static int qdev_reset_one(DeviceState *dev, void *opaque)
274{
Anthony Liguori94afdad2011-12-04 11:36:01 -0600275 device_reset(dev);
Anthony Liguoriec990eb2010-11-19 18:55:59 +0900276
277 return 0;
278}
279
Isaku Yamahatab4694b72010-11-19 18:56:00 +0900280static int qbus_reset_one(BusState *bus, void *opaque)
281{
Anthony Liguori0d936922012-05-02 09:00:20 +0200282 BusClass *bc = BUS_GET_CLASS(bus);
283 if (bc->reset) {
Paolo Bonzinidcc20932013-12-06 17:54:27 +0100284 bc->reset(bus);
Isaku Yamahatab4694b72010-11-19 18:56:00 +0900285 }
286 return 0;
287}
288
Isaku Yamahata5af0a042010-11-19 18:56:01 +0900289void qdev_reset_all(DeviceState *dev)
290{
Paolo Bonzinidcc20932013-12-06 17:54:27 +0100291 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
Isaku Yamahata5af0a042010-11-19 18:56:01 +0900292}
293
David Hildenbrandff8de072015-07-21 08:32:07 +0200294void qdev_reset_all_fn(void *opaque)
295{
296 qdev_reset_all(DEVICE(opaque));
297}
298
Paolo Bonzinid0508c32013-01-10 15:49:07 +0100299void qbus_reset_all(BusState *bus)
300{
Paolo Bonzinidcc20932013-12-06 17:54:27 +0100301 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
Paolo Bonzinid0508c32013-01-10 15:49:07 +0100302}
303
Isaku Yamahata80376c32010-12-20 14:33:35 +0900304void qbus_reset_all_fn(void *opaque)
305{
306 BusState *bus = opaque;
Paolo Bonzinid0508c32013-01-10 15:49:07 +0100307 qbus_reset_all(bus);
Isaku Yamahata80376c32010-12-20 14:33:35 +0900308}
309
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200310/* can be used as ->unplug() callback for the simple cases */
Igor Mammedov014176f2014-09-26 09:28:21 +0000311void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
312 DeviceState *dev, Error **errp)
313{
Igor Mammedov2d9a9822014-09-26 09:28:40 +0000314 /* just zap it */
315 object_unparent(OBJECT(dev));
Igor Mammedov014176f2014-09-26 09:28:21 +0000316}
Michael Tokarev3b29a102011-04-06 17:51:59 +0400317
Markus Armbruster0210afe2015-06-19 16:17:22 +0200318/*
319 * Realize @dev.
320 * Device properties should be set before calling this function. IRQs
321 * and MMIO regions should be connected/mapped after calling this
322 * function.
323 * On failure, report an error with error_report() and terminate the
324 * program. This is okay during machine creation. Don't use for
325 * hotplug, because there callers need to recover from failure.
326 * Exception: if you know the device's init() callback can't fail,
327 * then qdev_init_nofail() can't fail either, and is therefore usable
328 * even then. But relying on the device implementation that way is
329 * somewhat unclean, and best avoided.
330 */
Markus Armbrustere23a1b32009-10-07 01:15:58 +0200331void qdev_init_nofail(DeviceState *dev)
332{
Markus Armbrusterc4bacaf2015-02-04 18:33:01 +0100333 Error *err = NULL;
Anthony Liguori7de3abe2012-06-27 07:37:54 -0500334
Markus Armbrusterc4bacaf2015-02-04 18:33:01 +0100335 assert(!dev->realized);
336
Fam Zheng0d4104e2016-08-02 11:41:41 +0800337 object_ref(OBJECT(dev));
Markus Armbrusterc4bacaf2015-02-04 18:33:01 +0100338 object_property_set_bool(OBJECT(dev), true, "realized", &err);
339 if (err) {
Markus Armbrusterc29b77f2015-12-18 16:35:14 +0100340 error_reportf_err(err, "Initialization of device %s failed: ",
341 object_get_typename(OBJECT(dev)));
Markus Armbrusterbd6c9a62010-05-27 21:23:08 +0200342 exit(1);
343 }
Fam Zheng0d4104e2016-08-02 11:41:41 +0800344 object_unref(OBJECT(dev));
Markus Armbrustere23a1b32009-10-07 01:15:58 +0200345}
346
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200347void qdev_machine_creation_done(void)
348{
349 /*
350 * ok, initial machine setup is done, starting from now we can
351 * only create hotpluggable devices
352 */
Juan Quintela9bed84c2017-03-28 11:08:52 +0200353 qdev_hotplug = true;
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200354}
355
Alex Williamson0ac8ef72011-01-04 12:37:50 -0700356bool qdev_machine_modified(void)
357{
358 return qdev_hot_added || qdev_hot_removed;
359}
360
Paul Brook02e2da42009-05-23 00:05:19 +0100361BusState *qdev_get_parent_bus(DeviceState *dev)
Paul Brookaae94602009-05-14 22:35:06 +0100362{
Paul Brook02e2da42009-05-23 00:05:19 +0100363 return dev->parent_bus;
Paul Brookaae94602009-05-14 22:35:06 +0100364}
365
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700366static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
367 const char *name)
368{
369 NamedGPIOList *ngl;
370
371 QLIST_FOREACH(ngl, &dev->gpios, node) {
372 /* NULL is a valid and matchable name, otherwise do a normal
373 * strcmp match.
374 */
375 if ((!ngl->name && !name) ||
376 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
377 return ngl;
378 }
379 }
380
381 ngl = g_malloc0(sizeof(*ngl));
382 ngl->name = g_strdup(name);
383 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
384 return ngl;
385}
386
387void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
388 const char *name, int n)
389{
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700390 int i;
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700391 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
392
Peter Crosthwaiteb235a712014-09-25 22:17:08 -0700393 assert(gpio_list->num_out == 0 || !name);
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700394 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
395 dev, n);
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700396
Pavel Fedin6c76b372015-07-31 15:23:22 +0300397 if (!name) {
398 name = "unnamed-gpio-in";
399 }
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700400 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
Pavel Fedin6c76b372015-07-31 15:23:22 +0300401 gchar *propname = g_strdup_printf("%s[%u]", name, i);
402
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700403 object_property_add_child(OBJECT(dev), propname,
404 OBJECT(gpio_list->in[i]), &error_abort);
Pavel Fedin6c76b372015-07-31 15:23:22 +0300405 g_free(propname);
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700406 }
Peter Crosthwaitea69bef12014-09-25 22:17:41 -0700407
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700408 gpio_list->num_in += n;
409}
410
Paul Brookaae94602009-05-14 22:35:06 +0100411void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
412{
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700413 qdev_init_gpio_in_named(dev, handler, NULL, n);
414}
415
416void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
417 const char *name, int n)
418{
Peter Crosthwaite688b0572014-09-25 22:18:14 -0700419 int i;
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700420 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
421
Peter Crosthwaiteb235a712014-09-25 22:17:08 -0700422 assert(gpio_list->num_in == 0 || !name);
Peter Crosthwaite688b0572014-09-25 22:18:14 -0700423
Pavel Fedin6c76b372015-07-31 15:23:22 +0300424 if (!name) {
425 name = "unnamed-gpio-out";
426 }
427 memset(pins, 0, sizeof(*pins) * n);
Peter Crosthwaite688b0572014-09-25 22:18:14 -0700428 for (i = 0; i < n; ++i) {
Pavel Fedin6c76b372015-07-31 15:23:22 +0300429 gchar *propname = g_strdup_printf("%s[%u]", name,
430 gpio_list->num_out + i);
431
Peter Crosthwaite688b0572014-09-25 22:18:14 -0700432 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
433 (Object **)&pins[i],
434 object_property_allow_set_link,
435 OBJ_PROP_LINK_UNREF_ON_RELEASE,
436 &error_abort);
Pavel Fedin6c76b372015-07-31 15:23:22 +0300437 g_free(propname);
Peter Crosthwaite688b0572014-09-25 22:18:14 -0700438 }
Pavel Fedin6c76b372015-07-31 15:23:22 +0300439 gpio_list->num_out += n;
Paul Brookaae94602009-05-14 22:35:06 +0100440}
441
442void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
443{
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700444 qdev_init_gpio_out_named(dev, pins, NULL, n);
445}
446
447qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
448{
449 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
450
451 assert(n >= 0 && n < gpio_list->num_in);
452 return gpio_list->in[n];
Paul Brookaae94602009-05-14 22:35:06 +0100453}
454
455qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
456{
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700457 return qdev_get_gpio_in_named(dev, NULL, n);
458}
459
460void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
461 qemu_irq pin)
462{
Peter Crosthwaite02757df2014-09-25 22:20:25 -0700463 char *propname = g_strdup_printf("%s[%d]",
464 name ? name : "unnamed-gpio-out", n);
465 if (pin) {
466 /* We need a name for object_property_set_link to work. If the
467 * object has a parent, object_property_add_child will come back
468 * with an error without doing anything. If it has none, it will
469 * never fail. So we can just call it with a NULL Error pointer.
470 */
Andreas Färber88950ee2015-03-12 16:09:34 +0100471 object_property_add_child(container_get(qdev_get_machine(),
472 "/unattached"),
473 "non-qdev-gpio[*]", OBJECT(pin), NULL);
Peter Crosthwaite02757df2014-09-25 22:20:25 -0700474 }
475 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
476 g_free(propname);
Paul Brookaae94602009-05-14 22:35:06 +0100477}
Paul Brookaae94602009-05-14 22:35:06 +0100478
Alexander Grafb7973182014-09-24 12:32:17 +0200479qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
480{
481 char *propname = g_strdup_printf("%s[%d]",
482 name ? name : "unnamed-gpio-out", n);
483
484 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
485 NULL);
486
487 return ret;
488}
489
Veres Lajos67cc32e2015-09-08 22:45:14 +0100490/* disconnect a GPIO output, returning the disconnected input (if any) */
Peter Crosthwaite0c24db22014-09-25 22:20:58 -0700491
492static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
493 const char *name, int n)
494{
495 char *propname = g_strdup_printf("%s[%d]",
496 name ? name : "unnamed-gpio-out", n);
497
498 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
499 NULL);
500 if (ret) {
501 object_property_set_link(OBJECT(dev), NULL, propname, NULL);
502 }
503 g_free(propname);
504 return ret;
505}
506
507qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
508 const char *name, int n)
509{
510 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
511 qdev_connect_gpio_out_named(dev, name, n, icpt);
512 return disconnected;
Paul Brookaae94602009-05-14 22:35:06 +0100513}
514
515void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
516{
Peter Crosthwaitea5f54292014-05-19 23:30:58 -0700517 qdev_connect_gpio_out_named(dev, NULL, n, pin);
Paul Brookaae94602009-05-14 22:35:06 +0100518}
519
Peter Crosthwaite17a96a12014-09-25 22:23:42 -0700520void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
521 const char *name)
522{
523 int i;
524 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
525
526 for (i = 0; i < ngl->num_in; i++) {
527 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
528 char *propname = g_strdup_printf("%s[%d]", nm, i);
529
530 object_property_add_alias(OBJECT(container), propname,
531 OBJECT(dev), propname,
532 &error_abort);
Eduardo Habkost6bc5cf92015-04-09 16:57:30 -0300533 g_free(propname);
Peter Crosthwaite17a96a12014-09-25 22:23:42 -0700534 }
535 for (i = 0; i < ngl->num_out; i++) {
536 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
537 char *propname = g_strdup_printf("%s[%d]", nm, i);
538
539 object_property_add_alias(OBJECT(container), propname,
540 OBJECT(dev), propname,
541 &error_abort);
Eduardo Habkost6bc5cf92015-04-09 16:57:30 -0300542 g_free(propname);
Peter Crosthwaite17a96a12014-09-25 22:23:42 -0700543 }
544 QLIST_REMOVE(ngl, node);
545 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
546}
547
Paul Brook02e2da42009-05-23 00:05:19 +0100548BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
Paul Brook4d6ae672009-05-14 22:35:06 +0100549{
Paul Brook02e2da42009-05-23 00:05:19 +0100550 BusState *bus;
Peter Crosthwaitef698c8b2016-01-21 14:15:03 +0000551 Object *child = object_resolve_path_component(OBJECT(dev), name);
552
553 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
554 if (bus) {
555 return bus;
556 }
Paul Brook4d6ae672009-05-14 22:35:06 +0100557
Blue Swirl72cf2d42009-09-12 07:36:22 +0000558 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
Paul Brook4d6ae672009-05-14 22:35:06 +0100559 if (strcmp(name, bus->name) == 0) {
Paul Brook02e2da42009-05-23 00:05:19 +0100560 return bus;
Paul Brook4d6ae672009-05-14 22:35:06 +0100561 }
562 }
563 return NULL;
564}
565
Paolo Bonzini02932142013-12-06 17:54:26 +0100566int qdev_walk_children(DeviceState *dev,
567 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
568 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
569 void *opaque)
Anthony Liguori81699d82010-11-19 18:55:58 +0900570{
571 BusState *bus;
572 int err;
573
Paolo Bonzini02932142013-12-06 17:54:26 +0100574 if (pre_devfn) {
575 err = pre_devfn(dev, opaque);
Anthony Liguori81699d82010-11-19 18:55:58 +0900576 if (err) {
577 return err;
578 }
579 }
580
581 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
Paolo Bonzini02932142013-12-06 17:54:26 +0100582 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
583 post_devfn, post_busfn, opaque);
Anthony Liguori81699d82010-11-19 18:55:58 +0900584 if (err < 0) {
585 return err;
586 }
587 }
588
Paolo Bonzini02932142013-12-06 17:54:26 +0100589 if (post_devfn) {
590 err = post_devfn(dev, opaque);
591 if (err) {
592 return err;
593 }
594 }
595
Anthony Liguori81699d82010-11-19 18:55:58 +0900596 return 0;
597}
598
Isaku Yamahataa2ee6b42010-12-24 12:14:12 +0900599DeviceState *qdev_find_recursive(BusState *bus, const char *id)
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200600{
Anthony Liguori0866aca2011-12-23 15:34:39 -0600601 BusChild *kid;
602 DeviceState *ret;
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200603 BusState *child;
604
Anthony Liguori0866aca2011-12-23 15:34:39 -0600605 QTAILQ_FOREACH(kid, &bus->children, sibling) {
606 DeviceState *dev = kid->child;
607
608 if (dev->id && strcmp(dev->id, id) == 0) {
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200609 return dev;
Anthony Liguori0866aca2011-12-23 15:34:39 -0600610 }
611
Gerd Hoffmann3418bd22009-09-25 21:42:41 +0200612 QLIST_FOREACH(child, &dev->child_bus, sibling) {
613 ret = qdev_find_recursive(child, id);
614 if (ret) {
615 return ret;
616 }
617 }
618 }
619 return NULL;
620}
621
Anthony Liguori0d936922012-05-02 09:00:20 +0200622static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
623{
624 BusClass *bc = BUS_GET_CLASS(bus);
625
626 if (bc->get_fw_dev_path) {
627 return bc->get_fw_dev_path(dev);
Gerd Hoffmann131ec1b2009-09-25 21:42:34 +0200628 }
Anthony Liguori0d936922012-05-02 09:00:20 +0200629
630 return NULL;
Gerd Hoffmann131ec1b2009-09-25 21:42:34 +0200631}
632
Paolo Bonzini6b1566c2014-03-17 13:40:23 +1100633static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
634{
635 Object *obj = OBJECT(dev);
636 char *d = NULL;
637
638 while (!d && obj->parent) {
639 obj = obj->parent;
640 d = fw_path_provider_try_get_dev_path(obj, bus, dev);
641 }
642 return d;
643}
644
Gonglei0be63902015-01-29 15:08:51 +0800645char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
646{
647 Object *obj = OBJECT(dev);
648
649 return fw_path_provider_try_get_dev_path(obj, bus, dev);
650}
651
Gleb Natapov1ca4d092010-12-08 13:35:05 +0200652static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
653{
654 int l = 0;
655
656 if (dev && dev->parent_bus) {
657 char *d;
658 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
Paolo Bonzini6b1566c2014-03-17 13:40:23 +1100659 d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
660 if (!d) {
661 d = bus_get_fw_dev_path(dev->parent_bus, dev);
662 }
Anthony Liguori0d936922012-05-02 09:00:20 +0200663 if (d) {
Gleb Natapov1ca4d092010-12-08 13:35:05 +0200664 l += snprintf(p + l, size - l, "%s", d);
Anthony Liguori7267c092011-08-20 22:09:37 -0500665 g_free(d);
Gleb Natapov1ca4d092010-12-08 13:35:05 +0200666 } else {
Amos Kongbbfa18f2013-05-29 15:56:42 +0800667 return l;
Gleb Natapov1ca4d092010-12-08 13:35:05 +0200668 }
669 }
670 l += snprintf(p + l , size - l, "/");
671
672 return l;
673}
674
675char* qdev_get_fw_dev_path(DeviceState *dev)
676{
677 char path[128];
678 int l;
679
680 l = qdev_get_fw_dev_path_helper(dev, path, 128);
681
682 path[l-1] = '\0';
683
Jim Meyeringa5cf8262012-10-04 13:09:44 +0200684 return g_strdup(path);
Gleb Natapov1ca4d092010-12-08 13:35:05 +0200685}
Anthony Liguori85ed3032011-12-12 14:29:25 -0600686
Anthony Liguori09e5ab62012-02-03 12:28:43 -0600687char *qdev_get_dev_path(DeviceState *dev)
Anthony Liguoricd34d662011-12-12 14:29:43 -0600688{
Anthony Liguori0d936922012-05-02 09:00:20 +0200689 BusClass *bc;
Anthony Liguori09e5ab62012-02-03 12:28:43 -0600690
691 if (!dev || !dev->parent_bus) {
692 return NULL;
693 }
694
Anthony Liguori0d936922012-05-02 09:00:20 +0200695 bc = BUS_GET_CLASS(dev->parent_bus);
696 if (bc->get_dev_path) {
697 return bc->get_dev_path(dev);
Anthony Liguori09e5ab62012-02-03 12:28:43 -0600698 }
699
700 return NULL;
Anthony Liguori44677de2011-12-12 14:29:26 -0600701}
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600702
703/**
704 * Legacy property handling
705 */
706
Eric Blaked7bce992016-01-29 06:48:55 -0700707static void qdev_get_legacy_property(Object *obj, Visitor *v,
708 const char *name, void *opaque,
709 Error **errp)
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600710{
Anthony Liguori57c9faf2012-01-30 08:55:55 -0600711 DeviceState *dev = DEVICE(obj);
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600712 Property *prop = opaque;
713
Paolo Bonzinie3cb6ba2011-12-18 17:05:06 +0100714 char buffer[1024];
715 char *ptr = buffer;
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600716
Paolo Bonzinie3cb6ba2011-12-18 17:05:06 +0100717 prop->info->print(dev, prop, buffer, sizeof(buffer));
Eric Blake51e72bc2016-01-29 06:48:54 -0700718 visit_type_str(v, name, &ptr, errp);
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600719}
720
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600721/**
Cao jind9d8d452016-04-17 15:45:54 +0800722 * qdev_property_add_legacy:
723 * @dev: Device to add the property to.
724 * @prop: The qdev property definition.
725 * @errp: location to store error information.
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600726 *
Cao jind9d8d452016-04-17 15:45:54 +0800727 * Add a legacy QOM property to @dev for qdev property @prop.
728 * On error, store error in @errp.
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600729 *
Cao jind9d8d452016-04-17 15:45:54 +0800730 * Legacy properties are string versions of QOM properties. The format of
731 * the string depends on the property type. Legacy properties are only
732 * needed for "info qtree".
733 *
734 * Do not use this is new code! QOM Properties added through this interface
735 * will be given names in the "legacy" namespace.
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600736 */
Stefan Weilf5a014d2014-05-02 22:22:57 +0200737static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
738 Error **errp)
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600739{
Paolo Bonzini7ce7ffe2014-02-08 11:01:48 +0100740 gchar *name;
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600741
Anthony Liguorif3be0162012-05-02 13:31:07 +0200742 /* Register pointer properties as legacy properties */
Paolo Bonzini03ff7772014-02-08 11:01:47 +0100743 if (!prop->info->print && prop->info->get) {
Paolo Bonzini68ee3562012-02-02 10:17:19 +0100744 return;
745 }
Anthony Liguorif3be0162012-05-02 13:31:07 +0200746
Fam Zhengfaabdbb2017-07-14 10:14:51 +0800747 if (prop->info->create) {
748 return;
749 }
750
Paolo Bonzinica2cc782011-12-18 17:05:11 +0100751 name = g_strdup_printf("legacy-%s", prop->name);
Paolo Bonzini7ce7ffe2014-02-08 11:01:48 +0100752 object_property_add(OBJECT(dev), name, "str",
Paolo Bonzini68ee3562012-02-02 10:17:19 +0100753 prop->info->print ? qdev_get_legacy_property : prop->info->get,
Paolo Bonzini03ff7772014-02-08 11:01:47 +0100754 NULL,
Anthony Liguori57c9faf2012-01-30 08:55:55 -0600755 NULL,
756 prop, errp);
Anthony Liguoria5296ca2011-12-12 14:29:27 -0600757
Paolo Bonzinica2cc782011-12-18 17:05:11 +0100758 g_free(name);
759}
760
761/**
Cao jind9d8d452016-04-17 15:45:54 +0800762 * qdev_property_add_static:
763 * @dev: Device to add the property to.
764 * @prop: The qdev property definition.
765 * @errp: location to store error information.
Paolo Bonzinica2cc782011-12-18 17:05:11 +0100766 *
Cao jind9d8d452016-04-17 15:45:54 +0800767 * Add a static QOM property to @dev for qdev property @prop.
768 * On error, store error in @errp. Static properties access data in a struct.
769 * The type of the QOM property is derived from prop->info.
Paolo Bonzinica2cc782011-12-18 17:05:11 +0100770 */
771void qdev_property_add_static(DeviceState *dev, Property *prop,
772 Error **errp)
773{
Paolo Bonzinifdae2452012-04-02 22:40:26 +0200774 Error *local_err = NULL;
775 Object *obj = OBJECT(dev);
776
Fam Zhengfaabdbb2017-07-14 10:14:51 +0800777 if (prop->info->create) {
778 prop->info->create(obj, prop, &local_err);
779 } else {
780 /*
781 * TODO qdev_prop_ptr does not have getters or setters. It must
782 * go now that it can be replaced with links. The test should be
783 * removed along with it: all static properties are read/write.
784 */
785 if (!prop->info->get && !prop->info->set) {
786 return;
787 }
788 object_property_add(obj, prop->name, prop->info->name,
789 prop->info->get, prop->info->set,
790 prop->info->release,
791 prop, &local_err);
Paolo Bonzinid8229792012-02-02 09:47:13 +0100792 }
793
Paolo Bonzinifdae2452012-04-02 22:40:26 +0200794 if (local_err) {
795 error_propagate(errp, local_err);
796 return;
797 }
Gongleib8c9cd52014-10-07 14:33:22 +0800798
799 object_property_set_description(obj, prop->name,
800 prop->info->description,
801 &error_abort);
802
Marc-André Lureaua2740ad2017-06-07 20:35:53 +0400803 if (prop->info->set_default_value) {
804 prop->info->set_default_value(obj, prop);
Paolo Bonzinifdae2452012-04-02 22:40:26 +0200805 }
Anthony Liguori6a146eb2011-12-12 14:29:42 -0600806}
Anthony Liguori1de81d22011-12-19 16:37:46 -0600807
Stefan Hajnoczi67cc7e02014-06-18 17:58:32 +0800808/* @qdev_alias_all_properties - Add alias properties to the source object for
809 * all qdev properties on the target DeviceState.
810 */
811void qdev_alias_all_properties(DeviceState *target, Object *source)
812{
813 ObjectClass *class;
814 Property *prop;
815
816 class = object_get_class(OBJECT(target));
817 do {
818 DeviceClass *dc = DEVICE_CLASS(class);
819
820 for (prop = dc->props; prop && prop->name; prop++) {
821 object_property_add_alias(source, prop->name,
822 OBJECT(target), prop->name,
823 &error_abort);
824 }
825 class = object_class_get_parent(class);
826 } while (class != object_class_by_name(TYPE_DEVICE));
827}
828
Marcel Apfelbaum4cae4d52014-11-26 13:50:01 +0200829static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
Zhu Guihua66e56b12014-10-21 19:46:04 +0800830{
831 GSList **list = opaque;
Jun Li09d56012014-11-05 15:03:03 +0800832 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
833 TYPE_DEVICE);
834
835 if (dev == NULL) {
836 return 0;
837 }
Zhu Guihua66e56b12014-10-21 19:46:04 +0800838
839 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
840 *list = g_slist_append(*list, dev);
841 }
842
Zhu Guihua66e56b12014-10-21 19:46:04 +0800843 return 0;
844}
845
Marcel Apfelbaum4cae4d52014-11-26 13:50:01 +0200846GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
847{
848 GSList *list = NULL;
849
850 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
851
852 return list;
853}
854
Markus Armbrustera7737e42014-04-25 12:44:21 +0200855static bool device_get_realized(Object *obj, Error **errp)
Andreas Färber249d4172013-01-09 03:58:11 +0100856{
857 DeviceState *dev = DEVICE(obj);
858 return dev->realized;
859}
860
Juan Quintela1bfe5f02017-04-17 14:57:54 +0200861static bool check_only_migratable(Object *obj, Error **err)
862{
863 DeviceClass *dc = DEVICE_GET_CLASS(obj);
864
865 if (!vmstate_check_only_migratable(dc->vmsd)) {
866 error_setg(err, "Device %s is not migratable, but "
867 "--only-migratable was specified",
868 object_get_typename(obj));
869 return false;
870 }
871
872 return true;
873}
874
Markus Armbrustera7737e42014-04-25 12:44:21 +0200875static void device_set_realized(Object *obj, bool value, Error **errp)
Andreas Färber249d4172013-01-09 03:58:11 +0100876{
877 DeviceState *dev = DEVICE(obj);
878 DeviceClass *dc = DEVICE_GET_CLASS(dev);
Igor Mammedov7716b8c2014-09-26 09:28:41 +0000879 HotplugHandler *hotplug_ctrl;
Bandan Das5c21ce72014-03-12 21:02:12 +0100880 BusState *bus;
Andreas Färber249d4172013-01-09 03:58:11 +0100881 Error *local_err = NULL;
Igor Mammedov69382d82016-07-25 11:59:22 +0200882 bool unattached_parent = false;
883 static int unattached_count;
Andreas Färber249d4172013-01-09 03:58:11 +0100884
Igor Mammedov1a37eca2014-02-05 16:36:46 +0100885 if (dev->hotplugged && !dc->hotpluggable) {
Markus Armbrusterc6bd8c72015-03-17 11:54:50 +0100886 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
Igor Mammedov1a37eca2014-02-05 16:36:46 +0100887 return;
888 }
889
Andreas Färber249d4172013-01-09 03:58:11 +0100890 if (value && !dev->realized) {
Juan Quintela1bfe5f02017-04-17 14:57:54 +0200891 if (!check_only_migratable(obj, &local_err)) {
Ashijeet Acharya7562f902017-02-13 23:34:48 +0530892 goto fail;
893 }
894
Gongleid5780292014-09-02 20:03:05 +0800895 if (!obj->parent) {
Andreas Färber249d4172013-01-09 03:58:11 +0100896 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
897
898 object_property_add_child(container_get(qdev_get_machine(),
899 "/unattached"),
Gongleid5780292014-09-02 20:03:05 +0800900 name, obj, &error_abort);
Igor Mammedov69382d82016-07-25 11:59:22 +0200901 unattached_parent = true;
Andreas Färber249d4172013-01-09 03:58:11 +0100902 g_free(name);
903 }
904
Igor Mammedov41346262016-05-12 09:18:15 +0530905 hotplug_ctrl = qdev_get_hotplug_handler(dev);
906 if (hotplug_ctrl) {
907 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
908 if (local_err != NULL) {
909 goto fail;
910 }
911 }
912
Igor Mammedova7ddba52013-04-11 16:51:56 +0200913 if (dc->realize) {
914 dc->realize(dev, &local_err);
915 }
916
Gonglei1d45a702014-09-04 10:18:26 +0800917 if (local_err != NULL) {
918 goto fail;
919 }
920
Paul Durrant707ff802015-01-20 11:05:07 +0000921 DEVICE_LISTENER_CALL(realize, Forward, dev);
922
Igor Mammedov7716b8c2014-09-26 09:28:41 +0000923 if (hotplug_ctrl) {
924 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
Igor Mammedov5e954942014-02-05 16:36:52 +0100925 }
926
Gonglei1d45a702014-09-04 10:18:26 +0800927 if (local_err != NULL) {
928 goto post_realize_fail;
929 }
930
931 if (qdev_get_vmsd(dev)) {
Dr. David Alan Gilbert67980032017-02-02 12:59:56 +0000932 if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
933 dev->instance_id_alias,
934 dev->alias_required_for_version,
935 &local_err) < 0) {
936 goto post_realize_fail;
937 }
Andreas Färber249d4172013-01-09 03:58:11 +0100938 }
Gonglei1d45a702014-09-04 10:18:26 +0800939
940 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
941 object_property_set_bool(OBJECT(bus), true, "realized",
Bandan Das5c21ce72014-03-12 21:02:12 +0100942 &local_err);
Gonglei1d45a702014-09-04 10:18:26 +0800943 if (local_err != NULL) {
944 goto child_realize_fail;
Bandan Das5c21ce72014-03-12 21:02:12 +0100945 }
946 }
Gonglei1d45a702014-09-04 10:18:26 +0800947 if (dev->hotplugged) {
Andreas Färber249d4172013-01-09 03:58:11 +0100948 device_reset(dev);
949 }
Paolo Bonzini352e8da2014-06-26 15:10:03 +0200950 dev->pending_deleted_event = false;
Andreas Färber249d4172013-01-09 03:58:11 +0100951 } else if (!value && dev->realized) {
Gongleicd4520a2014-09-04 10:18:25 +0800952 Error **local_errp = NULL;
Bandan Das5c21ce72014-03-12 21:02:12 +0100953 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
Gongleicd4520a2014-09-04 10:18:25 +0800954 local_errp = local_err ? NULL : &local_err;
Bandan Das5c21ce72014-03-12 21:02:12 +0100955 object_property_set_bool(OBJECT(bus), false, "realized",
Gongleicd4520a2014-09-04 10:18:25 +0800956 local_errp);
Bandan Das5c21ce72014-03-12 21:02:12 +0100957 }
Gongleicd4520a2014-09-04 10:18:25 +0800958 if (qdev_get_vmsd(dev)) {
Andreas Färberfe6c2112013-04-15 18:34:10 +0200959 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
960 }
Gongleicd4520a2014-09-04 10:18:25 +0800961 if (dc->unrealize) {
962 local_errp = local_err ? NULL : &local_err;
963 dc->unrealize(dev, local_errp);
Andreas Färber249d4172013-01-09 03:58:11 +0100964 }
Paolo Bonzini352e8da2014-06-26 15:10:03 +0200965 dev->pending_deleted_event = true;
Paul Durrant707ff802015-01-20 11:05:07 +0000966 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
Andreas Färber249d4172013-01-09 03:58:11 +0100967 }
968
Xiao Guangrongc7f8d0f2016-11-07 19:13:36 +0800969 if (local_err != NULL) {
970 goto fail;
971 }
972
973 dev->realized = value;
Gonglei1d45a702014-09-04 10:18:26 +0800974 return;
975
976child_realize_fail:
977 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
978 object_property_set_bool(OBJECT(bus), false, "realized",
979 NULL);
980 }
981
982 if (qdev_get_vmsd(dev)) {
983 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
984 }
985
986post_realize_fail:
987 if (dc->unrealize) {
988 dc->unrealize(dev, NULL);
989 }
990
991fail:
992 error_propagate(errp, local_err);
Igor Mammedov69382d82016-07-25 11:59:22 +0200993 if (unattached_parent) {
994 object_unparent(OBJECT(dev));
995 unattached_count--;
996 }
Andreas Färber249d4172013-01-09 03:58:11 +0100997}
998
Markus Armbrustera7737e42014-04-25 12:44:21 +0200999static bool device_get_hotpluggable(Object *obj, Error **errp)
Igor Mammedov1a37eca2014-02-05 16:36:46 +01001000{
1001 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1002 DeviceState *dev = DEVICE(obj);
1003
Andreas Färber2b81b352014-03-07 19:04:13 +01001004 return dc->hotpluggable && (dev->parent_bus == NULL ||
Igor Mammedov39b888b2014-09-26 09:28:17 +00001005 qbus_is_hotpluggable(dev->parent_bus));
Igor Mammedov1a37eca2014-02-05 16:36:46 +01001006}
1007
Igor Mammedovd012ffc2014-06-02 15:25:04 +02001008static bool device_get_hotplugged(Object *obj, Error **err)
1009{
1010 DeviceState *dev = DEVICE(obj);
1011
1012 return dev->hotplugged;
1013}
1014
Anthony Liguori9674bfe2011-12-22 15:06:37 -06001015static void device_initfn(Object *obj)
1016{
1017 DeviceState *dev = DEVICE(obj);
Paolo Bonzinibce54472012-03-28 18:12:47 +02001018 ObjectClass *class;
Anthony Liguori9674bfe2011-12-22 15:06:37 -06001019 Property *prop;
1020
1021 if (qdev_hotplug) {
1022 dev->hotplugged = 1;
1023 qdev_hot_added = true;
1024 }
1025
1026 dev->instance_id_alias = -1;
Andreas Färber7983c8a2013-01-09 03:58:10 +01001027 dev->realized = false;
Anthony Liguori9674bfe2011-12-22 15:06:37 -06001028
Andreas Färber249d4172013-01-09 03:58:11 +01001029 object_property_add_bool(obj, "realized",
1030 device_get_realized, device_set_realized, NULL);
Igor Mammedov1a37eca2014-02-05 16:36:46 +01001031 object_property_add_bool(obj, "hotpluggable",
1032 device_get_hotpluggable, NULL, NULL);
Igor Mammedovd012ffc2014-06-02 15:25:04 +02001033 object_property_add_bool(obj, "hotplugged",
Eduardo Habkost36cccb82017-02-22 16:26:47 -03001034 device_get_hotplugged, NULL,
Igor Mammedovd012ffc2014-06-02 15:25:04 +02001035 &error_abort);
Andreas Färber249d4172013-01-09 03:58:11 +01001036
Paolo Bonzinibce54472012-03-28 18:12:47 +02001037 class = object_get_class(OBJECT(dev));
1038 do {
1039 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
Peter Crosthwaite5433a0a2014-01-01 18:48:08 -08001040 qdev_property_add_legacy(dev, prop, &error_abort);
1041 qdev_property_add_static(dev, prop, &error_abort);
Paolo Bonzinibce54472012-03-28 18:12:47 +02001042 }
Paolo Bonzinibce54472012-03-28 18:12:47 +02001043 class = object_class_get_parent(class);
1044 } while (class != object_class_by_name(TYPE_DEVICE));
Anthony Liguori9674bfe2011-12-22 15:06:37 -06001045
Anthony Liguorif968fc62012-05-02 10:39:01 +02001046 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
Stefan Hajnoczi39f72ef2014-03-19 08:58:56 +01001047 (Object **)&dev->parent_bus, NULL, 0,
Stefan Hajnoczi9561fda2014-03-19 08:58:55 +01001048 &error_abort);
Peter Crosthwaitea5f54292014-05-19 23:30:58 -07001049 QLIST_INIT(&dev->gpios);
Anthony Liguori9674bfe2011-12-22 15:06:37 -06001050}
1051
Eduardo Habkost99a0b032013-07-10 17:08:42 -03001052static void device_post_init(Object *obj)
1053{
Markus Armbruster25f8dd92015-01-20 10:04:07 +01001054 qdev_prop_set_globals(DEVICE(obj));
Eduardo Habkost99a0b032013-07-10 17:08:42 -03001055}
1056
Anthony Liguori60adba32011-12-23 08:38:56 -06001057/* Unlink device from bus and free the structure. */
1058static void device_finalize(Object *obj)
1059{
Peter Crosthwaitea5f54292014-05-19 23:30:58 -07001060 NamedGPIOList *ngl, *next;
1061
Anthony Liguori60adba32011-12-23 08:38:56 -06001062 DeviceState *dev = DEVICE(obj);
Peter Crosthwaitea5f54292014-05-19 23:30:58 -07001063
1064 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1065 QLIST_REMOVE(ngl, node);
Peter Crosthwaitef173d572014-06-18 00:56:31 -07001066 qemu_free_irqs(ngl->in, ngl->num_in);
Peter Crosthwaitea5f54292014-05-19 23:30:58 -07001067 g_free(ngl->name);
1068 g_free(ngl);
1069 /* ngl->out irqs are owned by the other end and should not be freed
1070 * here
1071 */
1072 }
Anthony Liguori60adba32011-12-23 08:38:56 -06001073}
1074
Paolo Bonzinibce54472012-03-28 18:12:47 +02001075static void device_class_base_init(ObjectClass *class, void *data)
1076{
1077 DeviceClass *klass = DEVICE_CLASS(class);
1078
1079 /* We explicitly look up properties in the superclasses,
1080 * so do not propagate them to the subclasses.
1081 */
1082 klass->props = NULL;
Anthony Liguori1de81d22011-12-19 16:37:46 -06001083}
Anthony Liguori32fea402011-12-16 14:34:46 -06001084
Andreas Färber5d5b24d2013-01-04 18:13:00 +01001085static void device_unparent(Object *obj)
Paolo Bonzini667d22d2012-11-23 09:47:13 +01001086{
1087 DeviceState *dev = DEVICE(obj);
Paolo Bonzini06f7f2b2013-01-25 14:12:34 +01001088 BusState *bus;
Paolo Bonzini667d22d2012-11-23 09:47:13 +01001089
Bandan Das5c21ce72014-03-12 21:02:12 +01001090 if (dev->realized) {
1091 object_property_set_bool(obj, false, "realized", NULL);
1092 }
Paolo Bonzini06f7f2b2013-01-25 14:12:34 +01001093 while (dev->num_child_bus) {
1094 bus = QLIST_FIRST(&dev->child_bus);
Stefan Hajnoczi6780a222013-12-18 17:15:51 +01001095 object_unparent(OBJECT(bus));
Paolo Bonzini06f7f2b2013-01-25 14:12:34 +01001096 }
Paolo Bonzini06f7f2b2013-01-25 14:12:34 +01001097 if (dev->parent_bus) {
Andreas Färber5d5b24d2013-01-04 18:13:00 +01001098 bus_remove_child(dev->parent_bus, dev);
Paolo Bonzini62d7ba62013-01-25 14:12:35 +01001099 object_unref(OBJECT(dev->parent_bus));
1100 dev->parent_bus = NULL;
Andreas Färber5d5b24d2013-01-04 18:13:00 +01001101 }
Michael S. Tsirkin0402a5d2013-03-06 14:58:59 +02001102
Anthony Liguorib1ee5822013-03-27 11:36:14 -05001103 /* Only send event if the device had been completely realized */
Paolo Bonzini352e8da2014-06-26 15:10:03 +02001104 if (dev->pending_deleted_event) {
Anthony Liguorib1ee5822013-03-27 11:36:14 -05001105 gchar *path = object_get_canonical_path(OBJECT(dev));
1106
Wenchao Xia24b699f2014-06-18 08:43:43 +02001107 qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
Anthony Liguorib1ee5822013-03-27 11:36:14 -05001108 g_free(path);
Michael S. Tsirkin0402a5d2013-03-06 14:58:59 +02001109 }
Paolo Bonziniabed8862015-10-19 13:11:39 +02001110
1111 qemu_opts_del(dev->opts);
1112 dev->opts = NULL;
Paolo Bonzini667d22d2012-11-23 09:47:13 +01001113}
1114
1115static void device_class_init(ObjectClass *class, void *data)
1116{
Andreas Färber249d4172013-01-09 03:58:11 +01001117 DeviceClass *dc = DEVICE_CLASS(class);
1118
Andreas Färber5d5b24d2013-01-04 18:13:00 +01001119 class->unparent = device_unparent;
Andreas Färber249d4172013-01-09 03:58:11 +01001120 dc->realize = device_realize;
Andreas Färberfe6c2112013-04-15 18:34:10 +02001121 dc->unrealize = device_unrealize;
Igor Mammedov267a3262014-02-18 17:56:53 +01001122
1123 /* by default all devices were considered as hotpluggable,
1124 * so with intent to check it in generic qdev_unplug() /
1125 * device_set_realized() functions make every device
1126 * hotpluggable. Devices that shouldn't be hotpluggable,
1127 * should override it in their class_init()
1128 */
1129 dc->hotpluggable = true;
Eduardo Habkoste90f2a82017-05-03 17:35:44 -03001130 dc->user_creatable = true;
Paolo Bonzini667d22d2012-11-23 09:47:13 +01001131}
1132
Anthony Liguori94afdad2011-12-04 11:36:01 -06001133void device_reset(DeviceState *dev)
1134{
1135 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1136
1137 if (klass->reset) {
1138 klass->reset(dev);
1139 }
1140}
1141
Paolo Bonzinif05f6b42012-03-28 16:34:12 +02001142Object *qdev_get_machine(void)
1143{
1144 static Object *dev;
1145
1146 if (dev == NULL) {
Andreas Färberdfe47e72012-04-05 13:21:46 +02001147 dev = container_get(object_get_root(), "/machine");
Paolo Bonzinif05f6b42012-03-28 16:34:12 +02001148 }
1149
1150 return dev;
1151}
1152
Andreas Färber8c43a6f2013-01-10 16:19:07 +01001153static const TypeInfo device_type_info = {
Anthony Liguori32fea402011-12-16 14:34:46 -06001154 .name = TYPE_DEVICE,
1155 .parent = TYPE_OBJECT,
1156 .instance_size = sizeof(DeviceState),
Anthony Liguori9674bfe2011-12-22 15:06:37 -06001157 .instance_init = device_initfn,
Eduardo Habkost99a0b032013-07-10 17:08:42 -03001158 .instance_post_init = device_post_init,
Anthony Liguori60adba32011-12-23 08:38:56 -06001159 .instance_finalize = device_finalize,
Paolo Bonzinibce54472012-03-28 18:12:47 +02001160 .class_base_init = device_class_base_init,
Paolo Bonzini667d22d2012-11-23 09:47:13 +01001161 .class_init = device_class_init,
Anthony Liguori32fea402011-12-16 14:34:46 -06001162 .abstract = true,
1163 .class_size = sizeof(DeviceClass),
1164};
1165
Andreas Färber83f7d432012-02-09 15:20:55 +01001166static void qdev_register_types(void)
Anthony Liguori32fea402011-12-16 14:34:46 -06001167{
1168 type_register_static(&device_type_info);
1169}
1170
Andreas Färber83f7d432012-02-09 15:20:55 +01001171type_init(qdev_register_types)