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 /* Create a new device. This only initializes the device state structure
82 and allows properties to be set. qdev_init should be called to
83 initialize the actual device emulation. */
84 DeviceState
*qdev_create(BusState
*bus
, const char *name
)
90 if (!main_system_bus
) {
91 main_system_bus
= qbus_create(&system_bus_info
, NULL
, "main-system-bus");
93 bus
= main_system_bus
;
96 info
= qdev_find_info(bus
->info
, name
);
98 hw_error("Unknown device '%s' for bus '%s'\n", name
, bus
->info
->name
);
101 dev
= qemu_mallocz(info
->size
);
103 dev
->parent_bus
= bus
;
104 qdev_prop_set_defaults(dev
, dev
->info
->props
);
105 qdev_prop_set_defaults(dev
, dev
->parent_bus
->info
->props
);
106 qdev_prop_set_globals(dev
);
107 QLIST_INSERT_HEAD(&bus
->children
, dev
, sibling
);
109 assert(bus
->allow_hotplug
);
112 dev
->state
= DEV_STATE_CREATED
;
116 static int qdev_print_devinfo(DeviceInfo
*info
, char *dest
, int len
)
121 ret
= snprintf(dest
+pos
, len
-pos
, "name \"%s\", bus %s",
122 info
->name
, info
->bus_info
->name
);
123 pos
+= MIN(len
-pos
,ret
);
125 ret
= snprintf(dest
+pos
, len
-pos
, ", alias \"%s\"", info
->alias
);
126 pos
+= MIN(len
-pos
,ret
);
129 ret
= snprintf(dest
+pos
, len
-pos
, ", desc \"%s\"", info
->desc
);
130 pos
+= MIN(len
-pos
,ret
);
133 ret
= snprintf(dest
+pos
, len
-pos
, ", no-user");
134 pos
+= MIN(len
-pos
,ret
);
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) {
149 qemu_error("can't set property \"%s\" to \"%s\" for \"%s\"\n",
150 name
, value
, dev
->info
->name
);
156 int qdev_device_help(QemuOpts
*opts
)
163 driver
= qemu_opt_get(opts
, "driver");
164 if (driver
&& !strcmp(driver
, "?")) {
165 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
166 qdev_print_devinfo(info
, msg
, sizeof(msg
));
167 qemu_error("%s\n", msg
);
172 if (!qemu_opt_get(opts
, "?")) {
176 info
= qdev_find_info(NULL
, driver
);
181 for (prop
= info
->props
; prop
&& prop
->name
; prop
++) {
182 qemu_error("%s.%s=%s\n", info
->name
, prop
->name
, prop
->info
->name
);
187 DeviceState
*qdev_device_add(QemuOpts
*opts
)
189 const char *driver
, *path
, *id
;
194 driver
= qemu_opt_get(opts
, "driver");
196 qemu_error("-device: no driver specified\n");
201 info
= qdev_find_info(NULL
, driver
);
203 qemu_error_new(QERR_DEVICE_NOT_FOUND
, driver
);
207 qemu_error("device \"%s\" can't be added via command line\n",
213 path
= qemu_opt_get(opts
, "bus");
215 bus
= qbus_find(path
);
217 bus
= qbus_find_recursive(main_system_bus
, NULL
, info
->bus_info
);
220 qemu_error("Did not find %s bus for %s\n",
221 path
? path
: info
->bus_info
->name
, info
->name
);
224 if (qdev_hotplug
&& !bus
->allow_hotplug
) {
225 qemu_error("Bus %s does not support hotplugging\n",
230 /* create device, set properties */
231 qdev
= qdev_create(bus
, driver
);
232 id
= qemu_opts_id(opts
);
236 if (qemu_opt_foreach(opts
, set_property
, qdev
, 1) != 0) {
240 if (qdev_init(qdev
) < 0) {
241 qemu_error("Error initializing device %s\n", driver
);
248 static void qdev_reset(void *opaque
)
250 DeviceState
*dev
= opaque
;
251 if (dev
->info
->reset
)
252 dev
->info
->reset(dev
);
255 /* Initialize a device. Device properties should be set before calling
256 this function. IRQs and MMIO regions should be connected/mapped after
257 calling this function.
258 On failure, destroy the device and return negative value.
259 Return 0 on success. */
260 int qdev_init(DeviceState
*dev
)
264 assert(dev
->state
== DEV_STATE_CREATED
);
265 rc
= dev
->info
->init(dev
, dev
->info
);
270 qemu_register_reset(qdev_reset
, dev
);
272 vmstate_register(-1, dev
->info
->vmsd
, dev
);
273 dev
->state
= DEV_STATE_INITIALIZED
;
277 int qdev_unplug(DeviceState
*dev
)
279 if (!dev
->parent_bus
->allow_hotplug
) {
280 qemu_error("Bus %s does not support hotplugging\n",
281 dev
->parent_bus
->name
);
284 assert(dev
->info
->unplug
!= NULL
);
286 return dev
->info
->unplug(dev
);
289 /* can be used as ->unplug() callback for the simple cases */
290 int qdev_simple_unplug_cb(DeviceState
*dev
)
297 /* Like qdev_init(), but terminate program via hw_error() instead of
298 returning an error value. This is okay during machine creation.
299 Don't use for hotplug, because there callers need to recover from
300 failure. Exception: if you know the device's init() callback can't
301 fail, then qdev_init_nofail() can't fail either, and is therefore
302 usable even then. But relying on the device implementation that
303 way is somewhat unclean, and best avoided. */
304 void qdev_init_nofail(DeviceState
*dev
)
306 DeviceInfo
*info
= dev
->info
;
308 if (qdev_init(dev
) < 0)
309 hw_error("Initialization of device %s failed\n", info
->name
);
312 /* Unlink device from bus and free the structure. */
313 void qdev_free(DeviceState
*dev
)
317 if (dev
->state
== DEV_STATE_INITIALIZED
) {
318 while (dev
->num_child_bus
) {
319 bus
= QLIST_FIRST(&dev
->child_bus
);
323 vmstate_unregister(dev
->info
->vmsd
, dev
);
325 dev
->info
->exit(dev
);
327 qemu_opts_del(dev
->opts
);
329 qemu_unregister_reset(qdev_reset
, dev
);
330 QLIST_REMOVE(dev
, sibling
);
334 void qdev_machine_creation_done(void)
337 * ok, initial machine setup is done, starting from now we can
338 * only create hotpluggable devices
343 /* Get a character (serial) device interface. */
344 CharDriverState
*qdev_init_chardev(DeviceState
*dev
)
346 static int next_serial
;
348 /* FIXME: This function needs to go away: use chardev properties! */
349 return serial_hds
[next_serial
++];
352 BusState
*qdev_get_parent_bus(DeviceState
*dev
)
354 return dev
->parent_bus
;
357 void qdev_init_gpio_in(DeviceState
*dev
, qemu_irq_handler handler
, int n
)
359 assert(dev
->num_gpio_in
== 0);
360 dev
->num_gpio_in
= n
;
361 dev
->gpio_in
= qemu_allocate_irqs(handler
, dev
, n
);
364 void qdev_init_gpio_out(DeviceState
*dev
, qemu_irq
*pins
, int n
)
366 assert(dev
->num_gpio_out
== 0);
367 dev
->num_gpio_out
= n
;
368 dev
->gpio_out
= pins
;
371 qemu_irq
qdev_get_gpio_in(DeviceState
*dev
, int n
)
373 assert(n
>= 0 && n
< dev
->num_gpio_in
);
374 return dev
->gpio_in
[n
];
377 void qdev_connect_gpio_out(DeviceState
* dev
, int n
, qemu_irq pin
)
379 assert(n
>= 0 && n
< dev
->num_gpio_out
);
380 dev
->gpio_out
[n
] = pin
;
383 void qdev_set_nic_properties(DeviceState
*dev
, NICInfo
*nd
)
385 qdev_prop_set_macaddr(dev
, "mac", nd
->macaddr
);
387 qdev_prop_set_vlan(dev
, "vlan", nd
->vlan
);
389 qdev_prop_set_netdev(dev
, "netdev", nd
->netdev
);
390 if (nd
->nvectors
!= NIC_NVECTORS_UNSPECIFIED
&&
391 qdev_prop_exists(dev
, "vectors")) {
392 qdev_prop_set_uint32(dev
, "vectors", nd
->nvectors
);
396 static int next_block_unit
[IF_COUNT
];
398 /* Get a block device. This should only be used for single-drive devices
399 (e.g. SD/Floppy/MTD). Multi-disk devices (scsi/ide) should use the
401 BlockDriverState
*qdev_init_bdrv(DeviceState
*dev
, BlockInterfaceType type
)
403 int unit
= next_block_unit
[type
]++;
406 dinfo
= drive_get(type
, 0, unit
);
407 return dinfo
? dinfo
->bdrv
: NULL
;
410 BusState
*qdev_get_child_bus(DeviceState
*dev
, const char *name
)
414 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
415 if (strcmp(name
, bus
->name
) == 0) {
422 static BusState
*qbus_find_recursive(BusState
*bus
, const char *name
,
426 BusState
*child
, *ret
;
429 if (name
&& (strcmp(bus
->name
, name
) != 0)) {
432 if (info
&& (bus
->info
!= info
)) {
439 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
440 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
441 ret
= qbus_find_recursive(child
, name
, info
);
450 static DeviceState
*qdev_find_recursive(BusState
*bus
, const char *id
)
452 DeviceState
*dev
, *ret
;
455 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
456 if (dev
->id
&& strcmp(dev
->id
, id
) == 0)
458 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
459 ret
= qdev_find_recursive(child
, id
);
468 static void qbus_list_bus(DeviceState
*dev
, char *dest
, int len
)
471 const char *sep
= " ";
474 pos
+= snprintf(dest
+pos
, len
-pos
,"child busses at \"%s\":",
475 dev
->id
? dev
->id
: dev
->info
->name
);
476 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
477 pos
+= snprintf(dest
+pos
, len
-pos
, "%s\"%s\"", sep
, child
->name
);
482 static void qbus_list_dev(BusState
*bus
, char *dest
, int len
)
485 const char *sep
= " ";
488 pos
+= snprintf(dest
+pos
, len
-pos
, "devices at \"%s\":",
490 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
491 pos
+= snprintf(dest
+pos
, len
-pos
, "%s\"%s\"",
492 sep
, dev
->info
->name
);
494 pos
+= snprintf(dest
+pos
, len
-pos
, "/\"%s\"", dev
->id
);
499 static BusState
*qbus_find_bus(DeviceState
*dev
, char *elem
)
503 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
504 if (strcmp(child
->name
, elem
) == 0) {
511 static DeviceState
*qbus_find_dev(BusState
*bus
, char *elem
)
516 * try to match in order:
517 * (1) instance id, if present
519 * (3) driver alias, if present
521 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
522 if (dev
->id
&& strcmp(dev
->id
, elem
) == 0) {
526 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
527 if (strcmp(dev
->info
->name
, elem
) == 0) {
531 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
532 if (dev
->info
->alias
&& strcmp(dev
->info
->alias
, elem
) == 0) {
539 static BusState
*qbus_find(const char *path
)
543 char elem
[128], msg
[256];
546 /* find start element */
547 if (path
[0] == '/') {
548 bus
= main_system_bus
;
551 if (sscanf(path
, "%127[^/]%n", elem
, &len
) != 1) {
552 qemu_error("path parse error (\"%s\")\n", path
);
555 bus
= qbus_find_recursive(main_system_bus
, elem
, NULL
);
557 qemu_error("bus \"%s\" not found\n", elem
);
564 if (path
[pos
] == '\0') {
570 if (sscanf(path
+pos
, "/%127[^/]%n", elem
, &len
) != 1) {
571 qemu_error("path parse error (\"%s\" pos %d)\n", path
, pos
);
575 dev
= qbus_find_dev(bus
, elem
);
577 qbus_list_dev(bus
, msg
, sizeof(msg
));
578 qemu_error("device \"%s\" not found\n%s\n", elem
, msg
);
581 if (path
[pos
] == '\0') {
582 /* last specified element is a device. If it has exactly
583 * one child bus accept it nevertheless */
584 switch (dev
->num_child_bus
) {
586 qemu_error("device has no child bus (%s)\n", path
);
589 return QLIST_FIRST(&dev
->child_bus
);
591 qbus_list_bus(dev
, msg
, sizeof(msg
));
592 qemu_error("device has multiple child busses (%s)\n%s\n",
599 if (sscanf(path
+pos
, "/%127[^/]%n", elem
, &len
) != 1) {
600 qemu_error("path parse error (\"%s\" pos %d)\n", path
, pos
);
604 bus
= qbus_find_bus(dev
, elem
);
606 qbus_list_bus(dev
, msg
, sizeof(msg
));
607 qemu_error("child bus \"%s\" not found\n%s\n", elem
, msg
);
613 void qbus_create_inplace(BusState
*bus
, BusInfo
*info
,
614 DeviceState
*parent
, const char *name
)
620 bus
->parent
= parent
;
623 /* use supplied name */
624 bus
->name
= qemu_strdup(name
);
625 } else if (parent
&& parent
->id
) {
626 /* parent device has id -> use it for bus name */
627 len
= strlen(parent
->id
) + 16;
628 buf
= qemu_malloc(len
);
629 snprintf(buf
, len
, "%s.%d", parent
->id
, parent
->num_child_bus
);
632 /* no id -> use lowercase bus type for bus name */
633 len
= strlen(info
->name
) + 16;
634 buf
= qemu_malloc(len
);
635 len
= snprintf(buf
, len
, "%s.%d", info
->name
,
636 parent
? parent
->num_child_bus
: 0);
637 for (i
= 0; i
< len
; i
++)
638 buf
[i
] = qemu_tolower(buf
[i
]);
642 QLIST_INIT(&bus
->children
);
644 QLIST_INSERT_HEAD(&parent
->child_bus
, bus
, sibling
);
645 parent
->num_child_bus
++;
650 BusState
*qbus_create(BusInfo
*info
, DeviceState
*parent
, const char *name
)
654 bus
= qemu_mallocz(info
->size
);
655 bus
->qdev_allocated
= 1;
656 qbus_create_inplace(bus
, info
, parent
, name
);
660 void qbus_free(BusState
*bus
)
664 while ((dev
= QLIST_FIRST(&bus
->children
)) != NULL
) {
668 QLIST_REMOVE(bus
, sibling
);
669 bus
->parent
->num_child_bus
--;
671 if (bus
->qdev_allocated
) {
676 #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
677 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
);
679 static void qdev_print_props(Monitor
*mon
, DeviceState
*dev
, Property
*props
,
680 const char *prefix
, int indent
)
686 while (props
->name
) {
687 if (props
->info
->print
) {
688 props
->info
->print(dev
, props
, buf
, sizeof(buf
));
689 qdev_printf("%s-prop: %s = %s\n", prefix
, props
->name
, buf
);
695 static void qdev_print(Monitor
*mon
, DeviceState
*dev
, int indent
)
698 qdev_printf("dev: %s, id \"%s\"\n", dev
->info
->name
,
699 dev
->id
? dev
->id
: "");
701 if (dev
->num_gpio_in
) {
702 qdev_printf("gpio-in %d\n", dev
->num_gpio_in
);
704 if (dev
->num_gpio_out
) {
705 qdev_printf("gpio-out %d\n", dev
->num_gpio_out
);
707 qdev_print_props(mon
, dev
, dev
->info
->props
, "dev", indent
);
708 qdev_print_props(mon
, dev
, dev
->parent_bus
->info
->props
, "bus", indent
);
709 if (dev
->parent_bus
->info
->print_dev
)
710 dev
->parent_bus
->info
->print_dev(mon
, dev
, indent
);
711 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
712 qbus_print(mon
, child
, indent
);
716 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
)
718 struct DeviceState
*dev
;
720 qdev_printf("bus: %s\n", bus
->name
);
722 qdev_printf("type %s\n", bus
->info
->name
);
723 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
724 qdev_print(mon
, dev
, indent
);
729 void do_info_qtree(Monitor
*mon
)
732 qbus_print(mon
, main_system_bus
, 0);
735 void do_info_qdm(Monitor
*mon
)
740 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
741 qdev_print_devinfo(info
, msg
, sizeof(msg
));
742 monitor_printf(mon
, "%s\n", msg
);
746 void do_device_add(Monitor
*mon
, const QDict
*qdict
)
750 opts
= qemu_opts_parse(&qemu_device_opts
,
751 qdict_get_str(qdict
, "config"), "driver");
753 if (qdev_device_help(opts
) || qdev_device_add(opts
) == NULL
) {
759 void do_device_del(Monitor
*mon
, const QDict
*qdict
)
761 const char *id
= qdict_get_str(qdict
, "id");
764 dev
= qdev_find_recursive(main_system_bus
, id
);
766 qemu_error("Device '%s' not found\n", id
);