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 /* can be used as ->unplug() callback for the simple cases */
337 int qdev_simple_unplug_cb(DeviceState
*dev
)
344 /* Like qdev_init(), but terminate program via hw_error() instead of
345 returning an error value. This is okay during machine creation.
346 Don't use for hotplug, because there callers need to recover from
347 failure. Exception: if you know the device's init() callback can't
348 fail, then qdev_init_nofail() can't fail either, and is therefore
349 usable even then. But relying on the device implementation that
350 way is somewhat unclean, and best avoided. */
351 void qdev_init_nofail(DeviceState
*dev
)
353 DeviceInfo
*info
= dev
->info
;
355 if (qdev_init(dev
) < 0) {
356 error_report("Initialization of device %s failed\n", info
->name
);
361 /* Unlink device from bus and free the structure. */
362 void qdev_free(DeviceState
*dev
)
367 if (dev
->state
== DEV_STATE_INITIALIZED
) {
368 while (dev
->num_child_bus
) {
369 bus
= QLIST_FIRST(&dev
->child_bus
);
373 vmstate_unregister(dev
, dev
->info
->vmsd
, dev
);
375 dev
->info
->exit(dev
);
377 qemu_opts_del(dev
->opts
);
379 QLIST_REMOVE(dev
, sibling
);
380 for (prop
= dev
->info
->props
; prop
&& prop
->name
; prop
++) {
381 if (prop
->info
->free
) {
382 prop
->info
->free(dev
, prop
);
388 void qdev_machine_creation_done(void)
391 * ok, initial machine setup is done, starting from now we can
392 * only create hotpluggable devices
397 /* Get a character (serial) device interface. */
398 CharDriverState
*qdev_init_chardev(DeviceState
*dev
)
400 static int next_serial
;
402 /* FIXME: This function needs to go away: use chardev properties! */
403 return serial_hds
[next_serial
++];
406 BusState
*qdev_get_parent_bus(DeviceState
*dev
)
408 return dev
->parent_bus
;
411 void qdev_init_gpio_in(DeviceState
*dev
, qemu_irq_handler handler
, int n
)
413 assert(dev
->num_gpio_in
== 0);
414 dev
->num_gpio_in
= n
;
415 dev
->gpio_in
= qemu_allocate_irqs(handler
, dev
, n
);
418 void qdev_init_gpio_out(DeviceState
*dev
, qemu_irq
*pins
, int n
)
420 assert(dev
->num_gpio_out
== 0);
421 dev
->num_gpio_out
= n
;
422 dev
->gpio_out
= pins
;
425 qemu_irq
qdev_get_gpio_in(DeviceState
*dev
, int n
)
427 assert(n
>= 0 && n
< dev
->num_gpio_in
);
428 return dev
->gpio_in
[n
];
431 void qdev_connect_gpio_out(DeviceState
* dev
, int n
, qemu_irq pin
)
433 assert(n
>= 0 && n
< dev
->num_gpio_out
);
434 dev
->gpio_out
[n
] = pin
;
437 void qdev_set_nic_properties(DeviceState
*dev
, NICInfo
*nd
)
439 qdev_prop_set_macaddr(dev
, "mac", nd
->macaddr
);
441 qdev_prop_set_vlan(dev
, "vlan", nd
->vlan
);
443 qdev_prop_set_netdev(dev
, "netdev", nd
->netdev
);
444 if (nd
->nvectors
!= DEV_NVECTORS_UNSPECIFIED
&&
445 qdev_prop_exists(dev
, "vectors")) {
446 qdev_prop_set_uint32(dev
, "vectors", nd
->nvectors
);
450 static int next_block_unit
[IF_COUNT
];
452 /* Get a block device. This should only be used for single-drive devices
453 (e.g. SD/Floppy/MTD). Multi-disk devices (scsi/ide) should use the
455 BlockDriverState
*qdev_init_bdrv(DeviceState
*dev
, BlockInterfaceType type
)
457 int unit
= next_block_unit
[type
]++;
460 dinfo
= drive_get(type
, 0, unit
);
461 return dinfo
? dinfo
->bdrv
: NULL
;
464 BusState
*qdev_get_child_bus(DeviceState
*dev
, const char *name
)
468 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
469 if (strcmp(name
, bus
->name
) == 0) {
476 int qbus_walk_children(BusState
*bus
, qdev_walkerfn
*devfn
,
477 qbus_walkerfn
*busfn
, void *opaque
)
483 err
= busfn(bus
, opaque
);
489 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
490 err
= qdev_walk_children(dev
, devfn
, busfn
, opaque
);
499 int qdev_walk_children(DeviceState
*dev
, qdev_walkerfn
*devfn
,
500 qbus_walkerfn
*busfn
, void *opaque
)
506 err
= devfn(dev
, opaque
);
512 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
513 err
= qbus_walk_children(bus
, devfn
, busfn
, opaque
);
522 static BusState
*qbus_find_recursive(BusState
*bus
, const char *name
,
526 BusState
*child
, *ret
;
529 if (name
&& (strcmp(bus
->name
, name
) != 0)) {
532 if (info
&& (bus
->info
!= info
)) {
539 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
540 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
541 ret
= qbus_find_recursive(child
, name
, info
);
550 static DeviceState
*qdev_find_recursive(BusState
*bus
, const char *id
)
552 DeviceState
*dev
, *ret
;
555 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
556 if (dev
->id
&& strcmp(dev
->id
, id
) == 0)
558 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
559 ret
= qdev_find_recursive(child
, id
);
568 static void qbus_list_bus(DeviceState
*dev
)
571 const char *sep
= " ";
573 error_printf("child busses at \"%s\":",
574 dev
->id
? dev
->id
: dev
->info
->name
);
575 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
576 error_printf("%s\"%s\"", sep
, child
->name
);
582 static void qbus_list_dev(BusState
*bus
)
585 const char *sep
= " ";
587 error_printf("devices at \"%s\":", bus
->name
);
588 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
589 error_printf("%s\"%s\"", sep
, dev
->info
->name
);
591 error_printf("/\"%s\"", dev
->id
);
597 static BusState
*qbus_find_bus(DeviceState
*dev
, char *elem
)
601 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
602 if (strcmp(child
->name
, elem
) == 0) {
609 static DeviceState
*qbus_find_dev(BusState
*bus
, char *elem
)
614 * try to match in order:
615 * (1) instance id, if present
617 * (3) driver alias, if present
619 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
620 if (dev
->id
&& strcmp(dev
->id
, elem
) == 0) {
624 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
625 if (strcmp(dev
->info
->name
, elem
) == 0) {
629 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
630 if (dev
->info
->alias
&& strcmp(dev
->info
->alias
, elem
) == 0) {
637 static BusState
*qbus_find(const char *path
)
644 /* find start element */
645 if (path
[0] == '/') {
646 bus
= main_system_bus
;
649 if (sscanf(path
, "%127[^/]%n", elem
, &len
) != 1) {
653 bus
= qbus_find_recursive(main_system_bus
, elem
, NULL
);
655 qerror_report(QERR_BUS_NOT_FOUND
, elem
);
662 assert(path
[pos
] == '/' || !path
[pos
]);
663 while (path
[pos
] == '/') {
666 if (path
[pos
] == '\0') {
671 if (sscanf(path
+pos
, "%127[^/]%n", elem
, &len
) != 1) {
676 dev
= qbus_find_dev(bus
, elem
);
678 qerror_report(QERR_DEVICE_NOT_FOUND
, elem
);
679 if (!monitor_cur_is_qmp()) {
685 assert(path
[pos
] == '/' || !path
[pos
]);
686 while (path
[pos
] == '/') {
689 if (path
[pos
] == '\0') {
690 /* last specified element is a device. If it has exactly
691 * one child bus accept it nevertheless */
692 switch (dev
->num_child_bus
) {
694 qerror_report(QERR_DEVICE_NO_BUS
, elem
);
697 return QLIST_FIRST(&dev
->child_bus
);
699 qerror_report(QERR_DEVICE_MULTIPLE_BUSSES
, elem
);
700 if (!monitor_cur_is_qmp()) {
708 if (sscanf(path
+pos
, "%127[^/]%n", elem
, &len
) != 1) {
713 bus
= qbus_find_bus(dev
, elem
);
715 qerror_report(QERR_BUS_NOT_FOUND
, elem
);
716 if (!monitor_cur_is_qmp()) {
724 void qbus_create_inplace(BusState
*bus
, BusInfo
*info
,
725 DeviceState
*parent
, const char *name
)
731 bus
->parent
= parent
;
734 /* use supplied name */
735 bus
->name
= qemu_strdup(name
);
736 } else if (parent
&& parent
->id
) {
737 /* parent device has id -> use it for bus name */
738 len
= strlen(parent
->id
) + 16;
739 buf
= qemu_malloc(len
);
740 snprintf(buf
, len
, "%s.%d", parent
->id
, parent
->num_child_bus
);
743 /* no id -> use lowercase bus type for bus name */
744 len
= strlen(info
->name
) + 16;
745 buf
= qemu_malloc(len
);
746 len
= snprintf(buf
, len
, "%s.%d", info
->name
,
747 parent
? parent
->num_child_bus
: 0);
748 for (i
= 0; i
< len
; i
++)
749 buf
[i
] = qemu_tolower(buf
[i
]);
753 QLIST_INIT(&bus
->children
);
755 QLIST_INSERT_HEAD(&parent
->child_bus
, bus
, sibling
);
756 parent
->num_child_bus
++;
761 BusState
*qbus_create(BusInfo
*info
, DeviceState
*parent
, const char *name
)
765 bus
= qemu_mallocz(info
->size
);
766 bus
->qdev_allocated
= 1;
767 qbus_create_inplace(bus
, info
, parent
, name
);
771 void qbus_free(BusState
*bus
)
775 while ((dev
= QLIST_FIRST(&bus
->children
)) != NULL
) {
779 QLIST_REMOVE(bus
, sibling
);
780 bus
->parent
->num_child_bus
--;
782 qemu_free((void*)bus
->name
);
783 if (bus
->qdev_allocated
) {
788 #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
789 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
);
791 static void qdev_print_props(Monitor
*mon
, DeviceState
*dev
, Property
*props
,
792 const char *prefix
, int indent
)
798 while (props
->name
) {
800 * TODO Properties without a print method are just for dirty
801 * hacks. qdev_prop_ptr is the only such PropertyInfo. It's
802 * marked for removal. The test props->info->print should be
803 * removed along with it.
805 if (props
->info
->print
) {
806 props
->info
->print(dev
, props
, buf
, sizeof(buf
));
807 qdev_printf("%s-prop: %s = %s\n", prefix
, props
->name
, buf
);
813 static void qdev_print(Monitor
*mon
, DeviceState
*dev
, int indent
)
816 qdev_printf("dev: %s, id \"%s\"\n", dev
->info
->name
,
817 dev
->id
? dev
->id
: "");
819 if (dev
->num_gpio_in
) {
820 qdev_printf("gpio-in %d\n", dev
->num_gpio_in
);
822 if (dev
->num_gpio_out
) {
823 qdev_printf("gpio-out %d\n", dev
->num_gpio_out
);
825 qdev_print_props(mon
, dev
, dev
->info
->props
, "dev", indent
);
826 qdev_print_props(mon
, dev
, dev
->parent_bus
->info
->props
, "bus", indent
);
827 if (dev
->parent_bus
->info
->print_dev
)
828 dev
->parent_bus
->info
->print_dev(mon
, dev
, indent
);
829 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
830 qbus_print(mon
, child
, indent
);
834 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
)
836 struct DeviceState
*dev
;
838 qdev_printf("bus: %s\n", bus
->name
);
840 qdev_printf("type %s\n", bus
->info
->name
);
841 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
842 qdev_print(mon
, dev
, indent
);
847 void do_info_qtree(Monitor
*mon
)
850 qbus_print(mon
, main_system_bus
, 0);
853 void do_info_qdm(Monitor
*mon
)
857 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
858 qdev_print_devinfo(info
);
862 int do_device_add(Monitor
*mon
, const QDict
*qdict
, QObject
**ret_data
)
866 opts
= qemu_opts_from_qdict(qemu_find_opts("device"), qdict
);
870 if (!monitor_cur_is_qmp() && qdev_device_help(opts
)) {
874 if (!qdev_device_add(opts
)) {
881 int do_device_del(Monitor
*mon
, const QDict
*qdict
, QObject
**ret_data
)
883 const char *id
= qdict_get_str(qdict
, "id");
886 dev
= qdev_find_recursive(main_system_bus
, id
);
888 qerror_report(QERR_DEVICE_NOT_FOUND
, id
);
891 return qdev_unplug(dev
);
894 static int qdev_get_fw_dev_path_helper(DeviceState
*dev
, char *p
, int size
)
898 if (dev
&& dev
->parent_bus
) {
900 l
= qdev_get_fw_dev_path_helper(dev
->parent_bus
->parent
, p
, size
);
901 if (dev
->parent_bus
->info
->get_fw_dev_path
) {
902 d
= dev
->parent_bus
->info
->get_fw_dev_path(dev
);
903 l
+= snprintf(p
+ l
, size
- l
, "%s", d
);
906 l
+= snprintf(p
+ l
, size
- l
, "%s", dev
->info
->name
);
909 l
+= snprintf(p
+ l
, size
- l
, "/");
914 char* qdev_get_fw_dev_path(DeviceState
*dev
)
919 l
= qdev_get_fw_dev_path_helper(dev
, path
, 128);