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;
35 /* This is a nasty hack to allow passing a NULL bus to qdev_create. */
36 static BusState
*main_system_bus
;
38 DeviceInfo
*device_info_list
;
40 static BusState
*qbus_find_recursive(BusState
*bus
, const char *name
,
42 static BusState
*qbus_find(const char *path
);
44 /* Register a new device type. */
45 void qdev_register(DeviceInfo
*info
)
47 assert(info
->size
>= sizeof(DeviceState
));
50 info
->next
= device_info_list
;
51 device_info_list
= info
;
54 static DeviceInfo
*qdev_find_info(BusInfo
*bus_info
, const char *name
)
58 /* first check device names */
59 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
60 if (bus_info
&& info
->bus_info
!= bus_info
)
62 if (strcmp(info
->name
, name
) != 0)
67 /* failing that check the aliases */
68 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
69 if (bus_info
&& info
->bus_info
!= bus_info
)
73 if (strcmp(info
->alias
, name
) != 0)
80 static DeviceState
*qdev_create_from_info(BusState
*bus
, DeviceInfo
*info
)
84 assert(bus
->info
== info
->bus_info
);
85 dev
= qemu_mallocz(info
->size
);
87 dev
->parent_bus
= bus
;
88 qdev_prop_set_defaults(dev
, dev
->info
->props
);
89 qdev_prop_set_defaults(dev
, dev
->parent_bus
->info
->props
);
90 qdev_prop_set_globals(dev
);
91 QLIST_INSERT_HEAD(&bus
->children
, dev
, sibling
);
93 assert(bus
->allow_hotplug
);
96 dev
->instance_id_alias
= -1;
97 dev
->state
= DEV_STATE_CREATED
;
101 /* Create a new device. This only initializes the device state structure
102 and allows properties to be set. qdev_init should be called to
103 initialize the actual device emulation. */
104 DeviceState
*qdev_create(BusState
*bus
, const char *name
)
109 if (!main_system_bus
) {
110 main_system_bus
= qbus_create(&system_bus_info
, NULL
, "main-system-bus");
112 bus
= main_system_bus
;
115 info
= qdev_find_info(bus
->info
, name
);
117 hw_error("Unknown device '%s' for bus '%s'\n", name
, bus
->info
->name
);
120 return qdev_create_from_info(bus
, info
);
123 static void qdev_print_devinfo(DeviceInfo
*info
)
125 error_printf("name \"%s\", bus %s",
126 info
->name
, info
->bus_info
->name
);
128 error_printf(", alias \"%s\"", info
->alias
);
131 error_printf(", desc \"%s\"", info
->desc
);
134 error_printf(", no-user");
139 static int set_property(const char *name
, const char *value
, void *opaque
)
141 DeviceState
*dev
= opaque
;
143 if (strcmp(name
, "driver") == 0)
145 if (strcmp(name
, "bus") == 0)
148 if (qdev_prop_parse(dev
, name
, value
) == -1) {
154 int qdev_device_help(QemuOpts
*opts
)
160 driver
= qemu_opt_get(opts
, "driver");
161 if (driver
&& !strcmp(driver
, "?")) {
162 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
164 continue; /* not available, don't show */
166 qdev_print_devinfo(info
);
171 if (!qemu_opt_get(opts
, "?")) {
175 info
= qdev_find_info(NULL
, driver
);
180 for (prop
= info
->props
; prop
&& prop
->name
; prop
++) {
182 * TODO Properties without a parser are just for dirty hacks.
183 * qdev_prop_ptr is the only such PropertyInfo. It's marked
184 * for removal. This conditional should be removed along with
187 if (!prop
->info
->parse
) {
188 continue; /* no way to set it, don't show */
190 error_printf("%s.%s=%s\n", info
->name
, prop
->name
, prop
->info
->name
);
195 DeviceState
*qdev_device_add(QemuOpts
*opts
)
197 const char *driver
, *path
, *id
;
202 driver
= qemu_opt_get(opts
, "driver");
204 qerror_report(QERR_MISSING_PARAMETER
, "driver");
209 info
= qdev_find_info(NULL
, driver
);
210 if (!info
|| info
->no_user
) {
211 qerror_report(QERR_INVALID_PARAMETER_VALUE
, "driver", "a driver name");
212 error_printf_unless_qmp("Try with argument '?' for a list.\n");
217 path
= qemu_opt_get(opts
, "bus");
219 bus
= qbus_find(path
);
223 if (bus
->info
!= info
->bus_info
) {
224 qerror_report(QERR_BAD_BUS_FOR_DEVICE
,
225 driver
, bus
->info
->name
);
229 bus
= qbus_find_recursive(main_system_bus
, NULL
, info
->bus_info
);
231 qerror_report(QERR_NO_BUS_FOR_DEVICE
,
232 info
->name
, info
->bus_info
->name
);
236 if (qdev_hotplug
&& !bus
->allow_hotplug
) {
237 qerror_report(QERR_BUS_NO_HOTPLUG
, bus
->name
);
241 /* create device, set properties */
242 qdev
= qdev_create_from_info(bus
, info
);
243 id
= qemu_opts_id(opts
);
247 if (qemu_opt_foreach(opts
, set_property
, qdev
, 1) != 0) {
251 if (qdev_init(qdev
) < 0) {
252 qerror_report(QERR_DEVICE_INIT_FAILED
, driver
);
259 static void qdev_reset(void *opaque
)
261 DeviceState
*dev
= opaque
;
262 if (dev
->info
->reset
)
263 dev
->info
->reset(dev
);
266 /* Initialize a device. Device properties should be set before calling
267 this function. IRQs and MMIO regions should be connected/mapped after
268 calling this function.
269 On failure, destroy the device and return negative value.
270 Return 0 on success. */
271 int qdev_init(DeviceState
*dev
)
275 assert(dev
->state
== DEV_STATE_CREATED
);
276 rc
= dev
->info
->init(dev
, dev
->info
);
281 qemu_register_reset(qdev_reset
, dev
);
282 if (dev
->info
->vmsd
) {
283 vmstate_register_with_alias_id(-1, dev
->info
->vmsd
, dev
,
284 dev
->instance_id_alias
,
285 dev
->alias_required_for_version
);
287 dev
->state
= DEV_STATE_INITIALIZED
;
291 void qdev_set_legacy_instance_id(DeviceState
*dev
, int alias_id
,
292 int required_for_version
)
294 assert(dev
->state
== DEV_STATE_CREATED
);
295 dev
->instance_id_alias
= alias_id
;
296 dev
->alias_required_for_version
= required_for_version
;
299 int qdev_unplug(DeviceState
*dev
)
301 if (!dev
->parent_bus
->allow_hotplug
) {
302 qerror_report(QERR_BUS_NO_HOTPLUG
, dev
->parent_bus
->name
);
305 assert(dev
->info
->unplug
!= NULL
);
307 return dev
->info
->unplug(dev
);
310 /* can be used as ->unplug() callback for the simple cases */
311 int qdev_simple_unplug_cb(DeviceState
*dev
)
318 /* Like qdev_init(), but terminate program via hw_error() instead of
319 returning an error value. This is okay during machine creation.
320 Don't use for hotplug, because there callers need to recover from
321 failure. Exception: if you know the device's init() callback can't
322 fail, then qdev_init_nofail() can't fail either, and is therefore
323 usable even then. But relying on the device implementation that
324 way is somewhat unclean, and best avoided. */
325 void qdev_init_nofail(DeviceState
*dev
)
327 DeviceInfo
*info
= dev
->info
;
329 if (qdev_init(dev
) < 0)
330 hw_error("Initialization of device %s failed\n", info
->name
);
333 /* Unlink device from bus and free the structure. */
334 void qdev_free(DeviceState
*dev
)
339 if (dev
->state
== DEV_STATE_INITIALIZED
) {
340 while (dev
->num_child_bus
) {
341 bus
= QLIST_FIRST(&dev
->child_bus
);
345 vmstate_unregister(dev
->info
->vmsd
, dev
);
347 dev
->info
->exit(dev
);
349 qemu_opts_del(dev
->opts
);
351 qemu_unregister_reset(qdev_reset
, dev
);
352 QLIST_REMOVE(dev
, sibling
);
353 for (prop
= dev
->info
->props
; prop
&& prop
->name
; prop
++) {
354 if (prop
->info
->free
) {
355 prop
->info
->free(dev
, prop
);
361 void qdev_machine_creation_done(void)
364 * ok, initial machine setup is done, starting from now we can
365 * only create hotpluggable devices
370 /* Get a character (serial) device interface. */
371 CharDriverState
*qdev_init_chardev(DeviceState
*dev
)
373 static int next_serial
;
375 /* FIXME: This function needs to go away: use chardev properties! */
376 return serial_hds
[next_serial
++];
379 BusState
*qdev_get_parent_bus(DeviceState
*dev
)
381 return dev
->parent_bus
;
384 void qdev_init_gpio_in(DeviceState
*dev
, qemu_irq_handler handler
, int n
)
386 assert(dev
->num_gpio_in
== 0);
387 dev
->num_gpio_in
= n
;
388 dev
->gpio_in
= qemu_allocate_irqs(handler
, dev
, n
);
391 void qdev_init_gpio_out(DeviceState
*dev
, qemu_irq
*pins
, int n
)
393 assert(dev
->num_gpio_out
== 0);
394 dev
->num_gpio_out
= n
;
395 dev
->gpio_out
= pins
;
398 qemu_irq
qdev_get_gpio_in(DeviceState
*dev
, int n
)
400 assert(n
>= 0 && n
< dev
->num_gpio_in
);
401 return dev
->gpio_in
[n
];
404 void qdev_connect_gpio_out(DeviceState
* dev
, int n
, qemu_irq pin
)
406 assert(n
>= 0 && n
< dev
->num_gpio_out
);
407 dev
->gpio_out
[n
] = pin
;
410 void qdev_set_nic_properties(DeviceState
*dev
, NICInfo
*nd
)
412 qdev_prop_set_macaddr(dev
, "mac", nd
->macaddr
);
414 qdev_prop_set_vlan(dev
, "vlan", nd
->vlan
);
416 qdev_prop_set_netdev(dev
, "netdev", nd
->netdev
);
417 if (nd
->nvectors
!= DEV_NVECTORS_UNSPECIFIED
&&
418 qdev_prop_exists(dev
, "vectors")) {
419 qdev_prop_set_uint32(dev
, "vectors", nd
->nvectors
);
423 static int next_block_unit
[IF_COUNT
];
425 /* Get a block device. This should only be used for single-drive devices
426 (e.g. SD/Floppy/MTD). Multi-disk devices (scsi/ide) should use the
428 BlockDriverState
*qdev_init_bdrv(DeviceState
*dev
, BlockInterfaceType type
)
430 int unit
= next_block_unit
[type
]++;
433 dinfo
= drive_get(type
, 0, unit
);
434 return dinfo
? dinfo
->bdrv
: NULL
;
437 BusState
*qdev_get_child_bus(DeviceState
*dev
, const char *name
)
441 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
442 if (strcmp(name
, bus
->name
) == 0) {
449 static BusState
*qbus_find_recursive(BusState
*bus
, const char *name
,
453 BusState
*child
, *ret
;
456 if (name
&& (strcmp(bus
->name
, name
) != 0)) {
459 if (info
&& (bus
->info
!= info
)) {
466 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
467 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
468 ret
= qbus_find_recursive(child
, name
, info
);
477 static DeviceState
*qdev_find_recursive(BusState
*bus
, const char *id
)
479 DeviceState
*dev
, *ret
;
482 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
483 if (dev
->id
&& strcmp(dev
->id
, id
) == 0)
485 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
486 ret
= qdev_find_recursive(child
, id
);
495 static void qbus_list_bus(DeviceState
*dev
)
498 const char *sep
= " ";
500 error_printf("child busses at \"%s\":",
501 dev
->id
? dev
->id
: dev
->info
->name
);
502 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
503 error_printf("%s\"%s\"", sep
, child
->name
);
509 static void qbus_list_dev(BusState
*bus
)
512 const char *sep
= " ";
514 error_printf("devices at \"%s\":", bus
->name
);
515 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
516 error_printf("%s\"%s\"", sep
, dev
->info
->name
);
518 error_printf("/\"%s\"", dev
->id
);
524 static BusState
*qbus_find_bus(DeviceState
*dev
, char *elem
)
528 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
529 if (strcmp(child
->name
, elem
) == 0) {
536 static DeviceState
*qbus_find_dev(BusState
*bus
, char *elem
)
541 * try to match in order:
542 * (1) instance id, if present
544 * (3) driver alias, if present
546 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
547 if (dev
->id
&& strcmp(dev
->id
, elem
) == 0) {
551 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
552 if (strcmp(dev
->info
->name
, elem
) == 0) {
556 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
557 if (dev
->info
->alias
&& strcmp(dev
->info
->alias
, elem
) == 0) {
564 static BusState
*qbus_find(const char *path
)
571 /* find start element */
572 if (path
[0] == '/') {
573 bus
= main_system_bus
;
576 if (sscanf(path
, "%127[^/]%n", elem
, &len
) != 1) {
580 bus
= qbus_find_recursive(main_system_bus
, elem
, NULL
);
582 qerror_report(QERR_BUS_NOT_FOUND
, elem
);
589 assert(path
[pos
] == '/' || !path
[pos
]);
590 while (path
[pos
] == '/') {
593 if (path
[pos
] == '\0') {
598 if (sscanf(path
+pos
, "%127[^/]%n", elem
, &len
) != 1) {
603 dev
= qbus_find_dev(bus
, elem
);
605 qerror_report(QERR_DEVICE_NOT_FOUND
, elem
);
606 if (!monitor_cur_is_qmp()) {
612 assert(path
[pos
] == '/' || !path
[pos
]);
613 while (path
[pos
] == '/') {
616 if (path
[pos
] == '\0') {
617 /* last specified element is a device. If it has exactly
618 * one child bus accept it nevertheless */
619 switch (dev
->num_child_bus
) {
621 qerror_report(QERR_DEVICE_NO_BUS
, elem
);
624 return QLIST_FIRST(&dev
->child_bus
);
626 qerror_report(QERR_DEVICE_MULTIPLE_BUSSES
, elem
);
627 if (!monitor_cur_is_qmp()) {
635 if (sscanf(path
+pos
, "%127[^/]%n", elem
, &len
) != 1) {
640 bus
= qbus_find_bus(dev
, elem
);
642 qerror_report(QERR_BUS_NOT_FOUND
, elem
);
643 if (!monitor_cur_is_qmp()) {
651 void qbus_create_inplace(BusState
*bus
, BusInfo
*info
,
652 DeviceState
*parent
, const char *name
)
658 bus
->parent
= parent
;
661 /* use supplied name */
662 bus
->name
= qemu_strdup(name
);
663 } else if (parent
&& parent
->id
) {
664 /* parent device has id -> use it for bus name */
665 len
= strlen(parent
->id
) + 16;
666 buf
= qemu_malloc(len
);
667 snprintf(buf
, len
, "%s.%d", parent
->id
, parent
->num_child_bus
);
670 /* no id -> use lowercase bus type for bus name */
671 len
= strlen(info
->name
) + 16;
672 buf
= qemu_malloc(len
);
673 len
= snprintf(buf
, len
, "%s.%d", info
->name
,
674 parent
? parent
->num_child_bus
: 0);
675 for (i
= 0; i
< len
; i
++)
676 buf
[i
] = qemu_tolower(buf
[i
]);
680 QLIST_INIT(&bus
->children
);
682 QLIST_INSERT_HEAD(&parent
->child_bus
, bus
, sibling
);
683 parent
->num_child_bus
++;
688 BusState
*qbus_create(BusInfo
*info
, DeviceState
*parent
, const char *name
)
692 bus
= qemu_mallocz(info
->size
);
693 bus
->qdev_allocated
= 1;
694 qbus_create_inplace(bus
, info
, parent
, name
);
698 void qbus_free(BusState
*bus
)
702 while ((dev
= QLIST_FIRST(&bus
->children
)) != NULL
) {
706 QLIST_REMOVE(bus
, sibling
);
707 bus
->parent
->num_child_bus
--;
709 qemu_free((void*)bus
->name
);
710 if (bus
->qdev_allocated
) {
715 #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
716 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
);
718 static void qdev_print_props(Monitor
*mon
, DeviceState
*dev
, Property
*props
,
719 const char *prefix
, int indent
)
725 while (props
->name
) {
727 * TODO Properties without a print method are just for dirty
728 * hacks. qdev_prop_ptr is the only such PropertyInfo. It's
729 * marked for removal. The test props->info->print should be
730 * removed along with it.
732 if (props
->info
->print
) {
733 props
->info
->print(dev
, props
, buf
, sizeof(buf
));
734 qdev_printf("%s-prop: %s = %s\n", prefix
, props
->name
, buf
);
740 static void qdev_print(Monitor
*mon
, DeviceState
*dev
, int indent
)
743 qdev_printf("dev: %s, id \"%s\"\n", dev
->info
->name
,
744 dev
->id
? dev
->id
: "");
746 if (dev
->num_gpio_in
) {
747 qdev_printf("gpio-in %d\n", dev
->num_gpio_in
);
749 if (dev
->num_gpio_out
) {
750 qdev_printf("gpio-out %d\n", dev
->num_gpio_out
);
752 qdev_print_props(mon
, dev
, dev
->info
->props
, "dev", indent
);
753 qdev_print_props(mon
, dev
, dev
->parent_bus
->info
->props
, "bus", indent
);
754 if (dev
->parent_bus
->info
->print_dev
)
755 dev
->parent_bus
->info
->print_dev(mon
, dev
, indent
);
756 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
757 qbus_print(mon
, child
, indent
);
761 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
)
763 struct DeviceState
*dev
;
765 qdev_printf("bus: %s\n", bus
->name
);
767 qdev_printf("type %s\n", bus
->info
->name
);
768 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
769 qdev_print(mon
, dev
, indent
);
774 void do_info_qtree(Monitor
*mon
)
777 qbus_print(mon
, main_system_bus
, 0);
780 void do_info_qdm(Monitor
*mon
)
784 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
785 qdev_print_devinfo(info
);
789 int do_device_add(Monitor
*mon
, const QDict
*qdict
, QObject
**ret_data
)
793 opts
= qemu_opts_from_qdict(&qemu_device_opts
, qdict
);
797 if (!monitor_cur_is_qmp() && qdev_device_help(opts
)) {
801 if (!qdev_device_add(opts
)) {
808 int do_device_del(Monitor
*mon
, const QDict
*qdict
, QObject
**ret_data
)
810 const char *id
= qdict_get_str(qdict
, "id");
813 dev
= qdev_find_recursive(main_system_bus
, id
);
815 qerror_report(QERR_DEVICE_NOT_FOUND
, id
);
818 return qdev_unplug(dev
);