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 static 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 /* Create a new device. This only initializes the device state structure
81 and allows properties to be set. qdev_init should be called to
82 initialize the actual device emulation. */
83 DeviceState
*qdev_create(BusState
*bus
, const char *name
)
89 if (!main_system_bus
) {
90 main_system_bus
= qbus_create(&system_bus_info
, NULL
, "main-system-bus");
92 bus
= main_system_bus
;
95 info
= qdev_find_info(bus
->info
, name
);
97 hw_error("Unknown device '%s' for bus '%s'\n", name
, bus
->info
->name
);
100 dev
= qemu_mallocz(info
->size
);
102 dev
->parent_bus
= bus
;
103 qdev_prop_set_defaults(dev
, dev
->info
->props
);
104 qdev_prop_set_defaults(dev
, dev
->parent_bus
->info
->props
);
105 qdev_prop_set_compat(dev
);
106 QLIST_INSERT_HEAD(&bus
->children
, dev
, sibling
);
108 assert(bus
->allow_hotplug
);
111 dev
->state
= DEV_STATE_CREATED
;
115 static int qdev_print_devinfo(DeviceInfo
*info
, char *dest
, int len
)
120 ret
= snprintf(dest
+pos
, len
-pos
, "name \"%s\", bus %s",
121 info
->name
, info
->bus_info
->name
);
122 pos
+= MIN(len
-pos
,ret
);
124 ret
= snprintf(dest
+pos
, len
-pos
, ", alias \"%s\"", info
->alias
);
125 pos
+= MIN(len
-pos
,ret
);
128 ret
= snprintf(dest
+pos
, len
-pos
, ", desc \"%s\"", info
->desc
);
129 pos
+= MIN(len
-pos
,ret
);
132 ret
= snprintf(dest
+pos
, len
-pos
, ", no-user");
133 pos
+= MIN(len
-pos
,ret
);
138 static int set_property(const char *name
, const char *value
, void *opaque
)
140 DeviceState
*dev
= opaque
;
142 if (strcmp(name
, "driver") == 0)
144 if (strcmp(name
, "bus") == 0)
147 if (qdev_prop_parse(dev
, name
, value
) == -1) {
148 qemu_error("can't set property \"%s\" to \"%s\" for \"%s\"\n",
149 name
, value
, dev
->info
->name
);
155 DeviceState
*qdev_device_add(QemuOpts
*opts
)
157 const char *driver
, *path
, *id
;
162 driver
= qemu_opt_get(opts
, "driver");
164 qemu_error("-device: no driver specified\n");
167 if (strcmp(driver
, "?") == 0) {
169 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
170 qdev_print_devinfo(info
, msg
, sizeof(msg
));
171 qemu_error("%s\n", msg
);
177 info
= qdev_find_info(NULL
, driver
);
179 qemu_error("Device \"%s\" not found. Try -device '?' for a list.\n",
184 qemu_error("device \"%s\" can't be added via command line\n",
190 path
= qemu_opt_get(opts
, "bus");
192 bus
= qbus_find(path
);
194 bus
= qbus_find_recursive(main_system_bus
, NULL
, info
->bus_info
);
197 qemu_error("Did not find %s bus for %s\n",
198 path
? path
: info
->bus_info
->name
, info
->name
);
201 if (qdev_hotplug
&& !bus
->allow_hotplug
) {
202 qemu_error("Bus %s does not support hotplugging\n",
207 /* create device, set properties */
208 qdev
= qdev_create(bus
, driver
);
209 id
= qemu_opts_id(opts
);
213 if (qemu_opt_foreach(opts
, set_property
, qdev
, 1) != 0) {
217 if (qdev_init(qdev
) < 0) {
218 qemu_error("Error initializing device %s\n", driver
);
225 static void qdev_reset(void *opaque
)
227 DeviceState
*dev
= opaque
;
228 if (dev
->info
->reset
)
229 dev
->info
->reset(dev
);
232 /* Initialize a device. Device properties should be set before calling
233 this function. IRQs and MMIO regions should be connected/mapped after
234 calling this function.
235 On failure, destroy the device and return negative value.
236 Return 0 on success. */
237 int qdev_init(DeviceState
*dev
)
241 assert(dev
->state
== DEV_STATE_CREATED
);
242 rc
= dev
->info
->init(dev
, dev
->info
);
247 qemu_register_reset(qdev_reset
, dev
);
249 vmstate_register(-1, dev
->info
->vmsd
, dev
);
250 dev
->state
= DEV_STATE_INITIALIZED
;
254 int qdev_unplug(DeviceState
*dev
)
256 if (!dev
->parent_bus
->allow_hotplug
) {
257 qemu_error("Bus %s does not support hotplugging\n",
258 dev
->parent_bus
->name
);
261 return dev
->info
->unplug(dev
);
264 /* can be used as ->unplug() callback for the simple cases */
265 int qdev_simple_unplug_cb(DeviceState
*dev
)
272 /* Like qdev_init(), but terminate program via hw_error() instead of
273 returning an error value. This is okay during machine creation.
274 Don't use for hotplug, because there callers need to recover from
275 failure. Exception: if you know the device's init() callback can't
276 fail, then qdev_init_nofail() can't fail either, and is therefore
277 usable even then. But relying on the device implementation that
278 way is somewhat unclean, and best avoided. */
279 void qdev_init_nofail(DeviceState
*dev
)
281 DeviceInfo
*info
= dev
->info
;
283 if (qdev_init(dev
) < 0)
284 hw_error("Initialization of device %s failed\n", info
->name
);
287 /* Unlink device from bus and free the structure. */
288 void qdev_free(DeviceState
*dev
)
292 if (dev
->state
== DEV_STATE_INITIALIZED
) {
293 while (dev
->num_child_bus
) {
294 bus
= QLIST_FIRST(&dev
->child_bus
);
297 #if 0 /* FIXME: need sane vmstate_unregister function */
299 vmstate_unregister(dev
->info
->vmsd
, dev
);
302 dev
->info
->exit(dev
);
304 qemu_opts_del(dev
->opts
);
306 qemu_unregister_reset(qdev_reset
, dev
);
307 QLIST_REMOVE(dev
, sibling
);
311 void qdev_machine_creation_done(void)
314 * ok, initial machine setup is done, starting from now we can
315 * only create hotpluggable devices
320 /* Get a character (serial) device interface. */
321 CharDriverState
*qdev_init_chardev(DeviceState
*dev
)
323 static int next_serial
;
324 static int next_virtconsole
;
325 /* FIXME: This is a nasty hack that needs to go away. */
326 if (strncmp(dev
->info
->name
, "virtio", 6) == 0) {
327 return virtcon_hds
[next_virtconsole
++];
329 return serial_hds
[next_serial
++];
333 BusState
*qdev_get_parent_bus(DeviceState
*dev
)
335 return dev
->parent_bus
;
338 void qdev_init_gpio_in(DeviceState
*dev
, qemu_irq_handler handler
, int n
)
340 assert(dev
->num_gpio_in
== 0);
341 dev
->num_gpio_in
= n
;
342 dev
->gpio_in
= qemu_allocate_irqs(handler
, dev
, n
);
345 void qdev_init_gpio_out(DeviceState
*dev
, qemu_irq
*pins
, int n
)
347 assert(dev
->num_gpio_out
== 0);
348 dev
->num_gpio_out
= n
;
349 dev
->gpio_out
= pins
;
352 qemu_irq
qdev_get_gpio_in(DeviceState
*dev
, int n
)
354 assert(n
>= 0 && n
< dev
->num_gpio_in
);
355 return dev
->gpio_in
[n
];
358 void qdev_connect_gpio_out(DeviceState
* dev
, int n
, qemu_irq pin
)
360 assert(n
>= 0 && n
< dev
->num_gpio_out
);
361 dev
->gpio_out
[n
] = pin
;
364 VLANClientState
*qdev_get_vlan_client(DeviceState
*dev
,
365 NetCanReceive
*can_receive
,
367 NetReceiveIOV
*receive_iov
,
371 NICInfo
*nd
= dev
->nd
;
373 nd
->vc
= qemu_new_vlan_client(nd
->vlan
, nd
->model
, nd
->name
, can_receive
,
374 receive
, receive_iov
, cleanup
, opaque
);
379 void qdev_get_macaddr(DeviceState
*dev
, uint8_t *macaddr
)
381 memcpy(macaddr
, dev
->nd
->macaddr
, 6);
384 static int next_block_unit
[IF_COUNT
];
386 /* Get a block device. This should only be used for single-drive devices
387 (e.g. SD/Floppy/MTD). Multi-disk devices (scsi/ide) should use the
389 BlockDriverState
*qdev_init_bdrv(DeviceState
*dev
, BlockInterfaceType type
)
391 int unit
= next_block_unit
[type
]++;
394 dinfo
= drive_get(type
, 0, unit
);
395 return dinfo
? dinfo
->bdrv
: NULL
;
398 BusState
*qdev_get_child_bus(DeviceState
*dev
, const char *name
)
402 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
403 if (strcmp(name
, bus
->name
) == 0) {
410 static BusState
*qbus_find_recursive(BusState
*bus
, const char *name
,
414 BusState
*child
, *ret
;
417 if (name
&& (strcmp(bus
->name
, name
) != 0)) {
420 if (info
&& (bus
->info
!= info
)) {
427 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
428 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
429 ret
= qbus_find_recursive(child
, name
, info
);
438 static DeviceState
*qdev_find_recursive(BusState
*bus
, const char *id
)
440 DeviceState
*dev
, *ret
;
443 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
444 if (dev
->id
&& strcmp(dev
->id
, id
) == 0)
446 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
447 ret
= qdev_find_recursive(child
, id
);
456 static void qbus_list_bus(DeviceState
*dev
, char *dest
, int len
)
459 const char *sep
= " ";
462 pos
+= snprintf(dest
+pos
, len
-pos
,"child busses at \"%s\":",
463 dev
->id
? dev
->id
: dev
->info
->name
);
464 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
465 pos
+= snprintf(dest
+pos
, len
-pos
, "%s\"%s\"", sep
, child
->name
);
470 static void qbus_list_dev(BusState
*bus
, char *dest
, int len
)
473 const char *sep
= " ";
476 pos
+= snprintf(dest
+pos
, len
-pos
, "devices at \"%s\":",
478 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
479 pos
+= snprintf(dest
+pos
, len
-pos
, "%s\"%s\"",
480 sep
, dev
->info
->name
);
482 pos
+= snprintf(dest
+pos
, len
-pos
, "/\"%s\"", dev
->id
);
487 static BusState
*qbus_find_bus(DeviceState
*dev
, char *elem
)
491 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
492 if (strcmp(child
->name
, elem
) == 0) {
499 static DeviceState
*qbus_find_dev(BusState
*bus
, char *elem
)
504 * try to match in order:
505 * (1) instance id, if present
507 * (3) driver alias, if present
509 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
510 if (dev
->id
&& strcmp(dev
->id
, elem
) == 0) {
514 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
515 if (strcmp(dev
->info
->name
, elem
) == 0) {
519 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
520 if (dev
->info
->alias
&& strcmp(dev
->info
->alias
, elem
) == 0) {
527 static BusState
*qbus_find(const char *path
)
531 char elem
[128], msg
[256];
534 /* find start element */
535 if (path
[0] == '/') {
536 bus
= main_system_bus
;
539 if (sscanf(path
, "%127[^/]%n", elem
, &len
) != 1) {
540 qemu_error("path parse error (\"%s\")\n", path
);
543 bus
= qbus_find_recursive(main_system_bus
, elem
, NULL
);
545 qemu_error("bus \"%s\" not found\n", elem
);
552 if (path
[pos
] == '\0') {
558 if (sscanf(path
+pos
, "/%127[^/]%n", elem
, &len
) != 1) {
559 qemu_error("path parse error (\"%s\" pos %d)\n", path
, pos
);
563 dev
= qbus_find_dev(bus
, elem
);
565 qbus_list_dev(bus
, msg
, sizeof(msg
));
566 qemu_error("device \"%s\" not found\n%s\n", elem
, msg
);
569 if (path
[pos
] == '\0') {
570 /* last specified element is a device. If it has exactly
571 * one child bus accept it nevertheless */
572 switch (dev
->num_child_bus
) {
574 qemu_error("device has no child bus (%s)\n", path
);
577 return QLIST_FIRST(&dev
->child_bus
);
579 qbus_list_bus(dev
, msg
, sizeof(msg
));
580 qemu_error("device has multiple child busses (%s)\n%s\n",
587 if (sscanf(path
+pos
, "/%127[^/]%n", elem
, &len
) != 1) {
588 qemu_error("path parse error (\"%s\" pos %d)\n", path
, pos
);
592 bus
= qbus_find_bus(dev
, elem
);
594 qbus_list_bus(dev
, msg
, sizeof(msg
));
595 qemu_error("child bus \"%s\" not found\n%s\n", elem
, msg
);
601 void qbus_create_inplace(BusState
*bus
, BusInfo
*info
,
602 DeviceState
*parent
, const char *name
)
608 bus
->parent
= parent
;
611 /* use supplied name */
612 bus
->name
= qemu_strdup(name
);
613 } else if (parent
&& parent
->id
) {
614 /* parent device has id -> use it for bus name */
615 len
= strlen(parent
->id
) + 16;
616 buf
= qemu_malloc(len
);
617 snprintf(buf
, len
, "%s.%d", parent
->id
, parent
->num_child_bus
);
620 /* no id -> use lowercase bus type for bus name */
621 len
= strlen(info
->name
) + 16;
622 buf
= qemu_malloc(len
);
623 len
= snprintf(buf
, len
, "%s.%d", info
->name
,
624 parent
? parent
->num_child_bus
: 0);
625 for (i
= 0; i
< len
; i
++)
626 buf
[i
] = qemu_tolower(buf
[i
]);
630 QLIST_INIT(&bus
->children
);
632 QLIST_INSERT_HEAD(&parent
->child_bus
, bus
, sibling
);
633 parent
->num_child_bus
++;
638 BusState
*qbus_create(BusInfo
*info
, DeviceState
*parent
, const char *name
)
642 bus
= qemu_mallocz(info
->size
);
643 bus
->qdev_allocated
= 1;
644 qbus_create_inplace(bus
, info
, parent
, name
);
648 void qbus_free(BusState
*bus
)
652 while ((dev
= QLIST_FIRST(&bus
->children
)) != NULL
) {
656 QLIST_REMOVE(bus
, sibling
);
657 bus
->parent
->num_child_bus
--;
659 if (bus
->qdev_allocated
) {
664 #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
665 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
);
667 static void qdev_print_props(Monitor
*mon
, DeviceState
*dev
, Property
*props
,
668 const char *prefix
, int indent
)
674 while (props
->name
) {
675 if (props
->info
->print
) {
676 props
->info
->print(dev
, props
, buf
, sizeof(buf
));
677 qdev_printf("%s-prop: %s = %s\n", prefix
, props
->name
, buf
);
683 static void qdev_print(Monitor
*mon
, DeviceState
*dev
, int indent
)
686 qdev_printf("dev: %s, id \"%s\"\n", dev
->info
->name
,
687 dev
->id
? dev
->id
: "");
689 if (dev
->num_gpio_in
) {
690 qdev_printf("gpio-in %d\n", dev
->num_gpio_in
);
692 if (dev
->num_gpio_out
) {
693 qdev_printf("gpio-out %d\n", dev
->num_gpio_out
);
695 qdev_print_props(mon
, dev
, dev
->info
->props
, "dev", indent
);
696 qdev_print_props(mon
, dev
, dev
->parent_bus
->info
->props
, "bus", indent
);
697 if (dev
->parent_bus
->info
->print_dev
)
698 dev
->parent_bus
->info
->print_dev(mon
, dev
, indent
);
699 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
700 qbus_print(mon
, child
, indent
);
704 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
)
706 struct DeviceState
*dev
;
708 qdev_printf("bus: %s\n", bus
->name
);
710 qdev_printf("type %s\n", bus
->info
->name
);
711 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
712 qdev_print(mon
, dev
, indent
);
717 void do_info_qtree(Monitor
*mon
)
720 qbus_print(mon
, main_system_bus
, 0);
723 void do_info_qdm(Monitor
*mon
)
728 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
729 qdev_print_devinfo(info
, msg
, sizeof(msg
));
730 monitor_printf(mon
, "%s\n", msg
);
734 void do_device_add(Monitor
*mon
, const QDict
*qdict
)
738 opts
= qemu_opts_parse(&qemu_device_opts
,
739 qdict_get_str(qdict
, "config"), "driver");
741 qdev_device_add(opts
);
744 void do_device_del(Monitor
*mon
, const QDict
*qdict
)
746 const char *id
= qdict_get_str(qdict
, "id");
749 dev
= qdev_find_recursive(main_system_bus
, id
);
751 qemu_error("Device '%s' not found\n", id
);