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
34 static int qdev_hotplug
= 0;
36 /* This is a nasty hack to allow passing a NULL bus to qdev_create. */
37 static BusState
*main_system_bus
;
39 DeviceInfo
*device_info_list
;
41 static BusState
*qbus_find_recursive(BusState
*bus
, const char *name
,
43 static BusState
*qbus_find(const char *path
);
45 /* Register a new device type. */
46 void qdev_register(DeviceInfo
*info
)
48 assert(info
->size
>= sizeof(DeviceState
));
51 info
->next
= device_info_list
;
52 device_info_list
= info
;
55 static DeviceInfo
*qdev_find_info(BusInfo
*bus_info
, const char *name
)
59 /* first check device names */
60 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
61 if (bus_info
&& info
->bus_info
!= bus_info
)
63 if (strcmp(info
->name
, name
) != 0)
68 /* failing that check the aliases */
69 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
70 if (bus_info
&& info
->bus_info
!= bus_info
)
74 if (strcmp(info
->alias
, name
) != 0)
81 static DeviceState
*qdev_create_from_info(BusState
*bus
, DeviceInfo
*info
)
85 assert(bus
->info
== info
->bus_info
);
86 dev
= qemu_mallocz(info
->size
);
88 dev
->parent_bus
= bus
;
89 qdev_prop_set_defaults(dev
, dev
->info
->props
);
90 qdev_prop_set_defaults(dev
, dev
->parent_bus
->info
->props
);
91 qdev_prop_set_globals(dev
);
92 QLIST_INSERT_HEAD(&bus
->children
, dev
, sibling
);
94 assert(bus
->allow_hotplug
);
97 dev
->instance_id_alias
= -1;
98 dev
->state
= DEV_STATE_CREATED
;
102 /* Create a new device. This only initializes the device state structure
103 and allows properties to be set. qdev_init should be called to
104 initialize the actual device emulation. */
105 DeviceState
*qdev_create(BusState
*bus
, const char *name
)
110 bus
= sysbus_get_default();
113 info
= qdev_find_info(bus
->info
, name
);
115 hw_error("Unknown device '%s' for bus '%s'\n", name
, bus
->info
->name
);
118 return qdev_create_from_info(bus
, info
);
121 static void qdev_print_devinfo(DeviceInfo
*info
)
123 error_printf("name \"%s\", bus %s",
124 info
->name
, info
->bus_info
->name
);
126 error_printf(", alias \"%s\"", info
->alias
);
129 error_printf(", desc \"%s\"", info
->desc
);
132 error_printf(", no-user");
137 static int set_property(const char *name
, const char *value
, void *opaque
)
139 DeviceState
*dev
= opaque
;
141 if (strcmp(name
, "driver") == 0)
143 if (strcmp(name
, "bus") == 0)
146 if (qdev_prop_parse(dev
, name
, value
) == -1) {
152 int qdev_device_help(QemuOpts
*opts
)
158 driver
= qemu_opt_get(opts
, "driver");
159 if (driver
&& !strcmp(driver
, "?")) {
160 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
162 continue; /* not available, don't show */
164 qdev_print_devinfo(info
);
169 if (!qemu_opt_get(opts
, "?")) {
173 info
= qdev_find_info(NULL
, driver
);
178 for (prop
= info
->props
; prop
&& prop
->name
; prop
++) {
180 * TODO Properties without a parser are just for dirty hacks.
181 * qdev_prop_ptr is the only such PropertyInfo. It's marked
182 * for removal. This conditional should be removed along with
185 if (!prop
->info
->parse
) {
186 continue; /* no way to set it, don't show */
188 error_printf("%s.%s=%s\n", info
->name
, prop
->name
, prop
->info
->name
);
193 DeviceState
*qdev_device_add(QemuOpts
*opts
)
195 const char *driver
, *path
, *id
;
200 driver
= qemu_opt_get(opts
, "driver");
202 qerror_report(QERR_MISSING_PARAMETER
, "driver");
207 info
= qdev_find_info(NULL
, driver
);
208 if (!info
|| info
->no_user
) {
209 qerror_report(QERR_INVALID_PARAMETER_VALUE
, "driver", "a driver name");
210 error_printf_unless_qmp("Try with argument '?' for a list.\n");
215 path
= qemu_opt_get(opts
, "bus");
217 bus
= qbus_find(path
);
221 if (bus
->info
!= info
->bus_info
) {
222 qerror_report(QERR_BAD_BUS_FOR_DEVICE
,
223 driver
, bus
->info
->name
);
227 bus
= qbus_find_recursive(main_system_bus
, NULL
, info
->bus_info
);
229 qerror_report(QERR_NO_BUS_FOR_DEVICE
,
230 info
->name
, info
->bus_info
->name
);
234 if (qdev_hotplug
&& !bus
->allow_hotplug
) {
235 qerror_report(QERR_BUS_NO_HOTPLUG
, bus
->name
);
239 /* create device, set properties */
240 qdev
= qdev_create_from_info(bus
, info
);
241 id
= qemu_opts_id(opts
);
245 if (qemu_opt_foreach(opts
, set_property
, qdev
, 1) != 0) {
249 if (qdev_init(qdev
) < 0) {
250 qerror_report(QERR_DEVICE_INIT_FAILED
, driver
);
257 /* Initialize a device. Device properties should be set before calling
258 this function. IRQs and MMIO regions should be connected/mapped after
259 calling this function.
260 On failure, destroy the device and return negative value.
261 Return 0 on success. */
262 int qdev_init(DeviceState
*dev
)
266 assert(dev
->state
== DEV_STATE_CREATED
);
267 rc
= dev
->info
->init(dev
, dev
->info
);
272 if (dev
->info
->vmsd
) {
273 vmstate_register_with_alias_id(dev
, -1, dev
->info
->vmsd
, dev
,
274 dev
->instance_id_alias
,
275 dev
->alias_required_for_version
);
277 dev
->state
= DEV_STATE_INITIALIZED
;
281 void qdev_set_legacy_instance_id(DeviceState
*dev
, int alias_id
,
282 int required_for_version
)
284 assert(dev
->state
== DEV_STATE_CREATED
);
285 dev
->instance_id_alias
= alias_id
;
286 dev
->alias_required_for_version
= required_for_version
;
289 int qdev_unplug(DeviceState
*dev
)
291 if (!dev
->parent_bus
->allow_hotplug
) {
292 qerror_report(QERR_BUS_NO_HOTPLUG
, dev
->parent_bus
->name
);
295 assert(dev
->info
->unplug
!= NULL
);
297 return dev
->info
->unplug(dev
);
300 static int qdev_reset_one(DeviceState
*dev
, void *opaque
)
302 if (dev
->info
->reset
) {
303 dev
->info
->reset(dev
);
309 BusState
*sysbus_get_default(void)
311 if (!main_system_bus
) {
312 main_system_bus
= qbus_create(&system_bus_info
, NULL
,
315 return main_system_bus
;
318 static int qbus_reset_one(BusState
*bus
, void *opaque
)
320 if (bus
->info
->reset
) {
321 return bus
->info
->reset(bus
);
326 void qdev_reset_all(DeviceState
*dev
)
328 qdev_walk_children(dev
, qdev_reset_one
, qbus_reset_one
, NULL
);
331 void qbus_reset_all(BusState
*bus
)
333 qbus_walk_children(bus
, qdev_reset_one
, qbus_reset_one
, NULL
);
336 void qbus_reset_all_fn(void *opaque
)
338 BusState
*bus
= opaque
;
342 /* can be used as ->unplug() callback for the simple cases */
343 int qdev_simple_unplug_cb(DeviceState
*dev
)
350 /* Like qdev_init(), but terminate program via hw_error() instead of
351 returning an error value. This is okay during machine creation.
352 Don't use for hotplug, because there callers need to recover from
353 failure. Exception: if you know the device's init() callback can't
354 fail, then qdev_init_nofail() can't fail either, and is therefore
355 usable even then. But relying on the device implementation that
356 way is somewhat unclean, and best avoided. */
357 void qdev_init_nofail(DeviceState
*dev
)
359 DeviceInfo
*info
= dev
->info
;
361 if (qdev_init(dev
) < 0) {
362 error_report("Initialization of device %s failed\n", info
->name
);
367 /* Unlink device from bus and free the structure. */
368 void qdev_free(DeviceState
*dev
)
373 if (dev
->state
== DEV_STATE_INITIALIZED
) {
374 while (dev
->num_child_bus
) {
375 bus
= QLIST_FIRST(&dev
->child_bus
);
379 vmstate_unregister(dev
, dev
->info
->vmsd
, dev
);
381 dev
->info
->exit(dev
);
383 qemu_opts_del(dev
->opts
);
385 QLIST_REMOVE(dev
, sibling
);
386 for (prop
= dev
->info
->props
; prop
&& prop
->name
; prop
++) {
387 if (prop
->info
->free
) {
388 prop
->info
->free(dev
, prop
);
394 void qdev_machine_creation_done(void)
397 * ok, initial machine setup is done, starting from now we can
398 * only create hotpluggable devices
403 /* Get a character (serial) device interface. */
404 CharDriverState
*qdev_init_chardev(DeviceState
*dev
)
406 static int next_serial
;
408 /* FIXME: This function needs to go away: use chardev properties! */
409 return serial_hds
[next_serial
++];
412 BusState
*qdev_get_parent_bus(DeviceState
*dev
)
414 return dev
->parent_bus
;
417 void qdev_init_gpio_in(DeviceState
*dev
, qemu_irq_handler handler
, int n
)
419 assert(dev
->num_gpio_in
== 0);
420 dev
->num_gpio_in
= n
;
421 dev
->gpio_in
= qemu_allocate_irqs(handler
, dev
, n
);
424 void qdev_init_gpio_out(DeviceState
*dev
, qemu_irq
*pins
, int n
)
426 assert(dev
->num_gpio_out
== 0);
427 dev
->num_gpio_out
= n
;
428 dev
->gpio_out
= pins
;
431 qemu_irq
qdev_get_gpio_in(DeviceState
*dev
, int n
)
433 assert(n
>= 0 && n
< dev
->num_gpio_in
);
434 return dev
->gpio_in
[n
];
437 void qdev_connect_gpio_out(DeviceState
* dev
, int n
, qemu_irq pin
)
439 assert(n
>= 0 && n
< dev
->num_gpio_out
);
440 dev
->gpio_out
[n
] = pin
;
443 void qdev_set_nic_properties(DeviceState
*dev
, NICInfo
*nd
)
445 qdev_prop_set_macaddr(dev
, "mac", nd
->macaddr
);
447 qdev_prop_set_vlan(dev
, "vlan", nd
->vlan
);
449 qdev_prop_set_netdev(dev
, "netdev", nd
->netdev
);
450 if (nd
->nvectors
!= DEV_NVECTORS_UNSPECIFIED
&&
451 qdev_prop_exists(dev
, "vectors")) {
452 qdev_prop_set_uint32(dev
, "vectors", nd
->nvectors
);
456 static int next_block_unit
[IF_COUNT
];
458 /* Get a block device. This should only be used for single-drive devices
459 (e.g. SD/Floppy/MTD). Multi-disk devices (scsi/ide) should use the
461 BlockDriverState
*qdev_init_bdrv(DeviceState
*dev
, BlockInterfaceType type
)
463 int unit
= next_block_unit
[type
]++;
466 dinfo
= drive_get(type
, 0, unit
);
467 return dinfo
? dinfo
->bdrv
: NULL
;
470 BusState
*qdev_get_child_bus(DeviceState
*dev
, const char *name
)
474 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
475 if (strcmp(name
, bus
->name
) == 0) {
482 int qbus_walk_children(BusState
*bus
, qdev_walkerfn
*devfn
,
483 qbus_walkerfn
*busfn
, void *opaque
)
489 err
= busfn(bus
, opaque
);
495 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
496 err
= qdev_walk_children(dev
, devfn
, busfn
, opaque
);
505 int qdev_walk_children(DeviceState
*dev
, qdev_walkerfn
*devfn
,
506 qbus_walkerfn
*busfn
, void *opaque
)
512 err
= devfn(dev
, opaque
);
518 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
519 err
= qbus_walk_children(bus
, devfn
, busfn
, opaque
);
528 static BusState
*qbus_find_recursive(BusState
*bus
, const char *name
,
532 BusState
*child
, *ret
;
535 if (name
&& (strcmp(bus
->name
, name
) != 0)) {
538 if (info
&& (bus
->info
!= info
)) {
545 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
546 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
547 ret
= qbus_find_recursive(child
, name
, info
);
556 static DeviceState
*qdev_find_recursive(BusState
*bus
, const char *id
)
558 DeviceState
*dev
, *ret
;
561 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
562 if (dev
->id
&& strcmp(dev
->id
, id
) == 0)
564 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
565 ret
= qdev_find_recursive(child
, id
);
574 static void qbus_list_bus(DeviceState
*dev
)
577 const char *sep
= " ";
579 error_printf("child busses at \"%s\":",
580 dev
->id
? dev
->id
: dev
->info
->name
);
581 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
582 error_printf("%s\"%s\"", sep
, child
->name
);
588 static void qbus_list_dev(BusState
*bus
)
591 const char *sep
= " ";
593 error_printf("devices at \"%s\":", bus
->name
);
594 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
595 error_printf("%s\"%s\"", sep
, dev
->info
->name
);
597 error_printf("/\"%s\"", dev
->id
);
603 static BusState
*qbus_find_bus(DeviceState
*dev
, char *elem
)
607 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
608 if (strcmp(child
->name
, elem
) == 0) {
615 static DeviceState
*qbus_find_dev(BusState
*bus
, char *elem
)
620 * try to match in order:
621 * (1) instance id, if present
623 * (3) driver alias, if present
625 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
626 if (dev
->id
&& strcmp(dev
->id
, elem
) == 0) {
630 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
631 if (strcmp(dev
->info
->name
, elem
) == 0) {
635 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
636 if (dev
->info
->alias
&& strcmp(dev
->info
->alias
, elem
) == 0) {
643 static BusState
*qbus_find(const char *path
)
650 /* find start element */
651 if (path
[0] == '/') {
652 bus
= main_system_bus
;
655 if (sscanf(path
, "%127[^/]%n", elem
, &len
) != 1) {
659 bus
= qbus_find_recursive(main_system_bus
, elem
, NULL
);
661 qerror_report(QERR_BUS_NOT_FOUND
, elem
);
668 assert(path
[pos
] == '/' || !path
[pos
]);
669 while (path
[pos
] == '/') {
672 if (path
[pos
] == '\0') {
677 if (sscanf(path
+pos
, "%127[^/]%n", elem
, &len
) != 1) {
682 dev
= qbus_find_dev(bus
, elem
);
684 qerror_report(QERR_DEVICE_NOT_FOUND
, elem
);
685 if (!monitor_cur_is_qmp()) {
691 assert(path
[pos
] == '/' || !path
[pos
]);
692 while (path
[pos
] == '/') {
695 if (path
[pos
] == '\0') {
696 /* last specified element is a device. If it has exactly
697 * one child bus accept it nevertheless */
698 switch (dev
->num_child_bus
) {
700 qerror_report(QERR_DEVICE_NO_BUS
, elem
);
703 return QLIST_FIRST(&dev
->child_bus
);
705 qerror_report(QERR_DEVICE_MULTIPLE_BUSSES
, elem
);
706 if (!monitor_cur_is_qmp()) {
714 if (sscanf(path
+pos
, "%127[^/]%n", elem
, &len
) != 1) {
719 bus
= qbus_find_bus(dev
, elem
);
721 qerror_report(QERR_BUS_NOT_FOUND
, elem
);
722 if (!monitor_cur_is_qmp()) {
730 void qbus_create_inplace(BusState
*bus
, BusInfo
*info
,
731 DeviceState
*parent
, const char *name
)
737 bus
->parent
= parent
;
740 /* use supplied name */
741 bus
->name
= qemu_strdup(name
);
742 } else if (parent
&& parent
->id
) {
743 /* parent device has id -> use it for bus name */
744 len
= strlen(parent
->id
) + 16;
745 buf
= qemu_malloc(len
);
746 snprintf(buf
, len
, "%s.%d", parent
->id
, parent
->num_child_bus
);
749 /* no id -> use lowercase bus type for bus name */
750 len
= strlen(info
->name
) + 16;
751 buf
= qemu_malloc(len
);
752 len
= snprintf(buf
, len
, "%s.%d", info
->name
,
753 parent
? parent
->num_child_bus
: 0);
754 for (i
= 0; i
< len
; i
++)
755 buf
[i
] = qemu_tolower(buf
[i
]);
759 QLIST_INIT(&bus
->children
);
761 QLIST_INSERT_HEAD(&parent
->child_bus
, bus
, sibling
);
762 parent
->num_child_bus
++;
763 } else if (bus
!= main_system_bus
) {
764 /* TODO: once all bus devices are qdevified,
765 only reset handler for main_system_bus should be registered here. */
766 qemu_register_reset(qbus_reset_all_fn
, bus
);
770 BusState
*qbus_create(BusInfo
*info
, DeviceState
*parent
, const char *name
)
774 bus
= qemu_mallocz(info
->size
);
775 bus
->qdev_allocated
= 1;
776 qbus_create_inplace(bus
, info
, parent
, name
);
780 void qbus_free(BusState
*bus
)
784 while ((dev
= QLIST_FIRST(&bus
->children
)) != NULL
) {
788 QLIST_REMOVE(bus
, sibling
);
789 bus
->parent
->num_child_bus
--;
791 assert(bus
!= main_system_bus
); /* main_system_bus is never freed */
792 qemu_unregister_reset(qbus_reset_all_fn
, bus
);
794 qemu_free((void*)bus
->name
);
795 if (bus
->qdev_allocated
) {
800 #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
801 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
);
803 static void qdev_print_props(Monitor
*mon
, DeviceState
*dev
, Property
*props
,
804 const char *prefix
, int indent
)
810 while (props
->name
) {
812 * TODO Properties without a print method are just for dirty
813 * hacks. qdev_prop_ptr is the only such PropertyInfo. It's
814 * marked for removal. The test props->info->print should be
815 * removed along with it.
817 if (props
->info
->print
) {
818 props
->info
->print(dev
, props
, buf
, sizeof(buf
));
819 qdev_printf("%s-prop: %s = %s\n", prefix
, props
->name
, buf
);
825 static void qdev_print(Monitor
*mon
, DeviceState
*dev
, int indent
)
828 qdev_printf("dev: %s, id \"%s\"\n", dev
->info
->name
,
829 dev
->id
? dev
->id
: "");
831 if (dev
->num_gpio_in
) {
832 qdev_printf("gpio-in %d\n", dev
->num_gpio_in
);
834 if (dev
->num_gpio_out
) {
835 qdev_printf("gpio-out %d\n", dev
->num_gpio_out
);
837 qdev_print_props(mon
, dev
, dev
->info
->props
, "dev", indent
);
838 qdev_print_props(mon
, dev
, dev
->parent_bus
->info
->props
, "bus", indent
);
839 if (dev
->parent_bus
->info
->print_dev
)
840 dev
->parent_bus
->info
->print_dev(mon
, dev
, indent
);
841 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
842 qbus_print(mon
, child
, indent
);
846 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
)
848 struct DeviceState
*dev
;
850 qdev_printf("bus: %s\n", bus
->name
);
852 qdev_printf("type %s\n", bus
->info
->name
);
853 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
854 qdev_print(mon
, dev
, indent
);
859 void do_info_qtree(Monitor
*mon
)
862 qbus_print(mon
, main_system_bus
, 0);
865 void do_info_qdm(Monitor
*mon
)
869 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
870 qdev_print_devinfo(info
);
874 int do_device_add(Monitor
*mon
, const QDict
*qdict
, QObject
**ret_data
)
878 opts
= qemu_opts_from_qdict(qemu_find_opts("device"), qdict
);
882 if (!monitor_cur_is_qmp() && qdev_device_help(opts
)) {
886 if (!qdev_device_add(opts
)) {
893 int do_device_del(Monitor
*mon
, const QDict
*qdict
, QObject
**ret_data
)
895 const char *id
= qdict_get_str(qdict
, "id");
898 dev
= qdev_find_recursive(main_system_bus
, id
);
900 qerror_report(QERR_DEVICE_NOT_FOUND
, id
);
903 return qdev_unplug(dev
);
906 static int qdev_get_fw_dev_path_helper(DeviceState
*dev
, char *p
, int size
)
910 if (dev
&& dev
->parent_bus
) {
912 l
= qdev_get_fw_dev_path_helper(dev
->parent_bus
->parent
, p
, size
);
913 if (dev
->parent_bus
->info
->get_fw_dev_path
) {
914 d
= dev
->parent_bus
->info
->get_fw_dev_path(dev
);
915 l
+= snprintf(p
+ l
, size
- l
, "%s", d
);
918 l
+= snprintf(p
+ l
, size
- l
, "%s", dev
->info
->name
);
921 l
+= snprintf(p
+ l
, size
- l
, "/");
926 char* qdev_get_fw_dev_path(DeviceState
*dev
)
931 l
= qdev_get_fw_dev_path_helper(dev
, path
, 128);