2 * Dynamic device configuration and creation.
4 * Copyright (c) 2009 CodeSourcery
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.
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.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
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
33 static int qdev_hotplug = 0;
34 static bool qdev_hot_added = false;
35 static bool qdev_hot_removed = false;
37 /* This is a nasty hack to allow passing a NULL bus to qdev_create. */
38 static BusState *main_system_bus;
40 DeviceInfo *device_info_list;
42 static BusState *qbus_find_recursive(BusState *bus, const char *name,
44 static BusState *qbus_find(const char *path);
46 /* Register a new device type. */
47 void qdev_register(DeviceInfo *info)
49 assert(info->size >= sizeof(DeviceState));
52 info->next = device_info_list;
53 device_info_list = info;
56 static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name)
60 /* first check device names */
61 for (info = device_info_list; info != NULL; info = info->next) {
62 if (bus_info && info->bus_info != bus_info)
64 if (strcmp(info->name, name) != 0)
69 /* failing that check the aliases */
70 for (info = device_info_list; info != NULL; info = info->next) {
71 if (bus_info && info->bus_info != bus_info)
75 if (strcmp(info->alias, name) != 0)
82 static DeviceState *qdev_create_from_info(BusState *bus, DeviceInfo *info)
86 assert(bus->info == info->bus_info);
87 dev = qemu_mallocz(info->size);
89 dev->parent_bus = bus;
90 qdev_prop_set_defaults(dev, dev->info->props);
91 qdev_prop_set_defaults(dev, dev->parent_bus->info->props);
92 qdev_prop_set_globals(dev);
93 QLIST_INSERT_HEAD(&bus->children, dev, sibling);
95 assert(bus->allow_hotplug);
97 qdev_hot_added = true;
99 dev->instance_id_alias = -1;
100 dev->state = DEV_STATE_CREATED;
104 /* Create a new device. This only initializes the device state structure
105 and allows properties to be set. qdev_init should be called to
106 initialize the actual device emulation. */
107 DeviceState *qdev_create(BusState *bus, const char *name)
111 dev = qdev_try_create(bus, name);
113 hw_error("Unknown device '%s' for bus '%s'\n", name, bus->info->name);
119 DeviceState *qdev_try_create(BusState *bus, const char *name)
124 bus = sysbus_get_default();
127 info = qdev_find_info(bus->info, name);
132 return qdev_create_from_info(bus, info);
135 static void qdev_print_devinfo(DeviceInfo *info)
137 error_printf("name \"%s\", bus %s",
138 info->name, info->bus_info->name);
140 error_printf(", alias \"%s\"", info->alias);
143 error_printf(", desc \"%s\"", info->desc);
146 error_printf(", no-user");
151 static int set_property(const char *name, const char *value, void *opaque)
153 DeviceState *dev = opaque;
155 if (strcmp(name, "driver") == 0)
157 if (strcmp(name, "bus") == 0)
160 if (qdev_prop_parse(dev, name, value) == -1) {
166 int qdev_device_help(QemuOpts *opts)
172 driver = qemu_opt_get(opts, "driver");
173 if (driver && !strcmp(driver, "?")) {
174 for (info = device_info_list; info != NULL; info = info->next) {
176 continue; /* not available, don't show */
178 qdev_print_devinfo(info);
183 if (!qemu_opt_get(opts, "?")) {
187 info = qdev_find_info(NULL, driver);
192 for (prop = info->props; prop && prop->name; prop++) {
194 * TODO Properties without a parser are just for dirty hacks.
195 * qdev_prop_ptr is the only such PropertyInfo. It's marked
196 * for removal. This conditional should be removed along with
199 if (!prop->info->parse) {
200 continue; /* no way to set it, don't show */
202 error_printf("%s.%s=%s\n", info->name, prop->name, prop->info->name);
207 DeviceState *qdev_device_add(QemuOpts *opts)
209 const char *driver, *path, *id;
214 driver = qemu_opt_get(opts, "driver");
216 qerror_report(QERR_MISSING_PARAMETER, "driver");
221 info = qdev_find_info(NULL, driver);
222 if (!info || info->no_user) {
223 qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver", "a driver name");
224 error_printf_unless_qmp("Try with argument '?' for a list.\n");
229 path = qemu_opt_get(opts, "bus");
231 bus = qbus_find(path);
235 if (bus->info != info->bus_info) {
236 qerror_report(QERR_BAD_BUS_FOR_DEVICE,
237 driver, bus->info->name);
241 bus = qbus_find_recursive(main_system_bus, NULL, info->bus_info);
243 qerror_report(QERR_NO_BUS_FOR_DEVICE,
244 info->name, info->bus_info->name);
248 if (qdev_hotplug && !bus->allow_hotplug) {
249 qerror_report(QERR_BUS_NO_HOTPLUG, bus->name);
253 /* create device, set properties */
254 qdev = qdev_create_from_info(bus, info);
255 id = qemu_opts_id(opts);
259 if (qemu_opt_foreach(opts, set_property, qdev, 1) != 0) {
263 if (qdev_init(qdev) < 0) {
264 qerror_report(QERR_DEVICE_INIT_FAILED, driver);
271 /* Initialize a device. Device properties should be set before calling
272 this function. IRQs and MMIO regions should be connected/mapped after
273 calling this function.
274 On failure, destroy the device and return negative value.
275 Return 0 on success. */
276 int qdev_init(DeviceState *dev)
280 assert(dev->state == DEV_STATE_CREATED);
281 rc = dev->info->init(dev, dev->info);
286 if (dev->info->vmsd) {
287 vmstate_register_with_alias_id(dev, -1, dev->info->vmsd, dev,
288 dev->instance_id_alias,
289 dev->alias_required_for_version);
291 dev->state = DEV_STATE_INITIALIZED;
292 if (dev->hotplugged && dev->info->reset) {
293 dev->info->reset(dev);
298 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
299 int required_for_version)
301 assert(dev->state == DEV_STATE_CREATED);
302 dev->instance_id_alias = alias_id;
303 dev->alias_required_for_version = required_for_version;
306 int qdev_unplug(DeviceState *dev)
308 if (!dev->parent_bus->allow_hotplug) {
309 qerror_report(QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
312 assert(dev->info->unplug != NULL);
314 qdev_hot_removed = true;
316 return dev->info->unplug(dev);
319 static int qdev_reset_one(DeviceState *dev, void *opaque)
321 if (dev->info->reset) {
322 dev->info->reset(dev);
328 BusState *sysbus_get_default(void)
330 if (!main_system_bus) {
331 main_system_bus = qbus_create(&system_bus_info, NULL,
334 return main_system_bus;
337 static int qbus_reset_one(BusState *bus, void *opaque)
339 if (bus->info->reset) {
340 return bus->info->reset(bus);
345 void qdev_reset_all(DeviceState *dev)
347 qdev_walk_children(dev, qdev_reset_one, qbus_reset_one, NULL);
350 void qbus_reset_all_fn(void *opaque)
352 BusState *bus = opaque;
353 qbus_walk_children(bus, qdev_reset_one, qbus_reset_one, NULL);
356 /* can be used as ->unplug() callback for the simple cases */
357 int qdev_simple_unplug_cb(DeviceState *dev)
365 /* Like qdev_init(), but terminate program via error_report() instead of
366 returning an error value. This is okay during machine creation.
367 Don't use for hotplug, because there callers need to recover from
368 failure. Exception: if you know the device's init() callback can't
369 fail, then qdev_init_nofail() can't fail either, and is therefore
370 usable even then. But relying on the device implementation that
371 way is somewhat unclean, and best avoided. */
372 void qdev_init_nofail(DeviceState *dev)
374 DeviceInfo *info = dev->info;
376 if (qdev_init(dev) < 0) {
377 error_report("Initialization of device %s failed", info->name);
382 /* Unlink device from bus and free the structure. */
383 void qdev_free(DeviceState *dev)
388 if (dev->state == DEV_STATE_INITIALIZED) {
389 while (dev->num_child_bus) {
390 bus = QLIST_FIRST(&dev->child_bus);
394 vmstate_unregister(dev, dev->info->vmsd, dev);
396 dev->info->exit(dev);
398 qemu_opts_del(dev->opts);
400 QLIST_REMOVE(dev, sibling);
401 for (prop = dev->info->props; prop && prop->name; prop++) {
402 if (prop->info->free) {
403 prop->info->free(dev, prop);
409 void qdev_machine_creation_done(void)
412 * ok, initial machine setup is done, starting from now we can
413 * only create hotpluggable devices
418 bool qdev_machine_modified(void)
420 return qdev_hot_added || qdev_hot_removed;
423 /* Get a character (serial) device interface. */
424 CharDriverState *qdev_init_chardev(DeviceState *dev)
426 static int next_serial;
428 /* FIXME: This function needs to go away: use chardev properties! */
429 return serial_hds[next_serial++];
432 BusState *qdev_get_parent_bus(DeviceState *dev)
434 return dev->parent_bus;
437 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
439 assert(dev->num_gpio_in == 0);
440 dev->num_gpio_in = n;
441 dev->gpio_in = qemu_allocate_irqs(handler, dev, n);
444 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
446 assert(dev->num_gpio_out == 0);
447 dev->num_gpio_out = n;
448 dev->gpio_out = pins;
451 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
453 assert(n >= 0 && n < dev->num_gpio_in);
454 return dev->gpio_in[n];
457 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
459 assert(n >= 0 && n < dev->num_gpio_out);
460 dev->gpio_out[n] = pin;
463 void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
465 qdev_prop_set_macaddr(dev, "mac", nd->macaddr.a);
467 qdev_prop_set_vlan(dev, "vlan", nd->vlan);
469 qdev_prop_set_netdev(dev, "netdev", nd->netdev);
470 if (nd->nvectors != DEV_NVECTORS_UNSPECIFIED &&
471 qdev_prop_exists(dev, "vectors")) {
472 qdev_prop_set_uint32(dev, "vectors", nd->nvectors);
474 nd->instantiated = 1;
477 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
481 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
482 if (strcmp(name, bus->name) == 0) {
489 int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn,
490 qbus_walkerfn *busfn, void *opaque)
496 err = busfn(bus, opaque);
502 QLIST_FOREACH(dev, &bus->children, sibling) {
503 err = qdev_walk_children(dev, devfn, busfn, opaque);
512 int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
513 qbus_walkerfn *busfn, void *opaque)
519 err = devfn(dev, opaque);
525 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
526 err = qbus_walk_children(bus, devfn, busfn, opaque);
535 static BusState *qbus_find_recursive(BusState *bus, const char *name,
539 BusState *child, *ret;
542 if (name && (strcmp(bus->name, name) != 0)) {
545 if (info && (bus->info != info)) {
552 QLIST_FOREACH(dev, &bus->children, sibling) {
553 QLIST_FOREACH(child, &dev->child_bus, sibling) {
554 ret = qbus_find_recursive(child, name, info);
563 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
565 DeviceState *dev, *ret;
568 QLIST_FOREACH(dev, &bus->children, sibling) {
569 if (dev->id && strcmp(dev->id, id) == 0)
571 QLIST_FOREACH(child, &dev->child_bus, sibling) {
572 ret = qdev_find_recursive(child, id);
581 static void qbus_list_bus(DeviceState *dev)
584 const char *sep = " ";
586 error_printf("child busses at \"%s\":",
587 dev->id ? dev->id : dev->info->name);
588 QLIST_FOREACH(child, &dev->child_bus, sibling) {
589 error_printf("%s\"%s\"", sep, child->name);
595 static void qbus_list_dev(BusState *bus)
598 const char *sep = " ";
600 error_printf("devices at \"%s\":", bus->name);
601 QLIST_FOREACH(dev, &bus->children, sibling) {
602 error_printf("%s\"%s\"", sep, dev->info->name);
604 error_printf("/\"%s\"", dev->id);
610 static BusState *qbus_find_bus(DeviceState *dev, char *elem)
614 QLIST_FOREACH(child, &dev->child_bus, sibling) {
615 if (strcmp(child->name, elem) == 0) {
622 static DeviceState *qbus_find_dev(BusState *bus, char *elem)
627 * try to match in order:
628 * (1) instance id, if present
630 * (3) driver alias, if present
632 QLIST_FOREACH(dev, &bus->children, sibling) {
633 if (dev->id && strcmp(dev->id, elem) == 0) {
637 QLIST_FOREACH(dev, &bus->children, sibling) {
638 if (strcmp(dev->info->name, elem) == 0) {
642 QLIST_FOREACH(dev, &bus->children, sibling) {
643 if (dev->info->alias && strcmp(dev->info->alias, elem) == 0) {
650 static BusState *qbus_find(const char *path)
657 /* find start element */
658 if (path[0] == '/') {
659 bus = main_system_bus;
662 if (sscanf(path, "%127[^/]%n", elem, &len) != 1) {
666 bus = qbus_find_recursive(main_system_bus, elem, NULL);
668 qerror_report(QERR_BUS_NOT_FOUND, elem);
675 assert(path[pos] == '/' || !path[pos]);
676 while (path[pos] == '/') {
679 if (path[pos] == '\0') {
684 if (sscanf(path+pos, "%127[^/]%n", elem, &len) != 1) {
689 dev = qbus_find_dev(bus, elem);
691 qerror_report(QERR_DEVICE_NOT_FOUND, elem);
692 if (!monitor_cur_is_qmp()) {
698 assert(path[pos] == '/' || !path[pos]);
699 while (path[pos] == '/') {
702 if (path[pos] == '\0') {
703 /* last specified element is a device. If it has exactly
704 * one child bus accept it nevertheless */
705 switch (dev->num_child_bus) {
707 qerror_report(QERR_DEVICE_NO_BUS, elem);
710 return QLIST_FIRST(&dev->child_bus);
712 qerror_report(QERR_DEVICE_MULTIPLE_BUSSES, elem);
713 if (!monitor_cur_is_qmp()) {
721 if (sscanf(path+pos, "%127[^/]%n", elem, &len) != 1) {
726 bus = qbus_find_bus(dev, elem);
728 qerror_report(QERR_BUS_NOT_FOUND, elem);
729 if (!monitor_cur_is_qmp()) {
737 void qbus_create_inplace(BusState *bus, BusInfo *info,
738 DeviceState *parent, const char *name)
744 bus->parent = parent;
747 /* use supplied name */
748 bus->name = qemu_strdup(name);
749 } else if (parent && parent->id) {
750 /* parent device has id -> use it for bus name */
751 len = strlen(parent->id) + 16;
752 buf = qemu_malloc(len);
753 snprintf(buf, len, "%s.%d", parent->id, parent->num_child_bus);
756 /* no id -> use lowercase bus type for bus name */
757 len = strlen(info->name) + 16;
758 buf = qemu_malloc(len);
759 len = snprintf(buf, len, "%s.%d", info->name,
760 parent ? parent->num_child_bus : 0);
761 for (i = 0; i < len; i++)
762 buf[i] = qemu_tolower(buf[i]);
766 QLIST_INIT(&bus->children);
768 QLIST_INSERT_HEAD(&parent->child_bus, bus, sibling);
769 parent->num_child_bus++;
770 } else if (bus != main_system_bus) {
771 /* TODO: once all bus devices are qdevified,
772 only reset handler for main_system_bus should be registered here. */
773 qemu_register_reset(qbus_reset_all_fn, bus);
777 BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name)
781 bus = qemu_mallocz(info->size);
782 bus->qdev_allocated = 1;
783 qbus_create_inplace(bus, info, parent, name);
787 void qbus_free(BusState *bus)
791 while ((dev = QLIST_FIRST(&bus->children)) != NULL) {
795 QLIST_REMOVE(bus, sibling);
796 bus->parent->num_child_bus--;
798 assert(bus != main_system_bus); /* main_system_bus is never freed */
799 qemu_unregister_reset(qbus_reset_all_fn, bus);
801 qemu_free((void*)bus->name);
802 if (bus->qdev_allocated) {
807 #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
808 static void qbus_print(Monitor *mon, BusState *bus, int indent);
810 static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props,
811 const char *prefix, int indent)
817 while (props->name) {
819 * TODO Properties without a print method are just for dirty
820 * hacks. qdev_prop_ptr is the only such PropertyInfo. It's
821 * marked for removal. The test props->info->print should be
822 * removed along with it.
824 if (props->info->print) {
825 props->info->print(dev, props, buf, sizeof(buf));
826 qdev_printf("%s-prop: %s = %s\n", prefix, props->name, buf);
832 static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
835 qdev_printf("dev: %s, id \"%s\"\n", dev->info->name,
836 dev->id ? dev->id : "");
838 if (dev->num_gpio_in) {
839 qdev_printf("gpio-in %d\n", dev->num_gpio_in);
841 if (dev->num_gpio_out) {
842 qdev_printf("gpio-out %d\n", dev->num_gpio_out);
844 qdev_print_props(mon, dev, dev->info->props, "dev", indent);
845 qdev_print_props(mon, dev, dev->parent_bus->info->props, "bus", indent);
846 if (dev->parent_bus->info->print_dev)
847 dev->parent_bus->info->print_dev(mon, dev, indent);
848 QLIST_FOREACH(child, &dev->child_bus, sibling) {
849 qbus_print(mon, child, indent);
853 static void qbus_print(Monitor *mon, BusState *bus, int indent)
855 struct DeviceState *dev;
857 qdev_printf("bus: %s\n", bus->name);
859 qdev_printf("type %s\n", bus->info->name);
860 QLIST_FOREACH(dev, &bus->children, sibling) {
861 qdev_print(mon, dev, indent);
866 void do_info_qtree(Monitor *mon)
869 qbus_print(mon, main_system_bus, 0);
872 void do_info_qdm(Monitor *mon)
876 for (info = device_info_list; info != NULL; info = info->next) {
877 qdev_print_devinfo(info);
881 int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
885 opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict);
889 if (!monitor_cur_is_qmp() && qdev_device_help(opts)) {
893 if (!qdev_device_add(opts)) {
900 int do_device_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
902 const char *id = qdict_get_str(qdict, "id");
905 dev = qdev_find_recursive(main_system_bus, id);
907 qerror_report(QERR_DEVICE_NOT_FOUND, id);
910 return qdev_unplug(dev);
913 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
917 if (dev && dev->parent_bus) {
919 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
920 if (dev->parent_bus->info->get_fw_dev_path) {
921 d = dev->parent_bus->info->get_fw_dev_path(dev);
922 l += snprintf(p + l, size - l, "%s", d);
925 l += snprintf(p + l, size - l, "%s", dev->info->name);
928 l += snprintf(p + l , size - l, "/");
933 char* qdev_get_fw_dev_path(DeviceState *dev)
938 l = qdev_get_fw_dev_path_helper(dev, path, 128);