]>
git.proxmox.com Git - mirror_qemu.git/blob - hw/qdev.c
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
)
162 driver
= qemu_opt_get(opts
, "driver");
163 if (driver
&& !strcmp(driver
, "?")) {
164 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
165 qdev_print_devinfo(info
, msg
, sizeof(msg
));
166 qemu_error("%s\n", msg
);
174 DeviceState
*qdev_device_add(QemuOpts
*opts
)
176 const char *driver
, *path
, *id
;
181 driver
= qemu_opt_get(opts
, "driver");
183 qemu_error("-device: no driver specified\n");
188 info
= qdev_find_info(NULL
, driver
);
190 qemu_error_new(QERR_DEVICE_NOT_FOUND
, driver
);
194 qemu_error("device \"%s\" can't be added via command line\n",
200 path
= qemu_opt_get(opts
, "bus");
202 bus
= qbus_find(path
);
204 bus
= qbus_find_recursive(main_system_bus
, NULL
, info
->bus_info
);
207 qemu_error("Did not find %s bus for %s\n",
208 path
? path
: info
->bus_info
->name
, info
->name
);
211 if (qdev_hotplug
&& !bus
->allow_hotplug
) {
212 qemu_error("Bus %s does not support hotplugging\n",
217 /* create device, set properties */
218 qdev
= qdev_create(bus
, driver
);
219 id
= qemu_opts_id(opts
);
223 if (qemu_opt_foreach(opts
, set_property
, qdev
, 1) != 0) {
227 if (qdev_init(qdev
) < 0) {
228 qemu_error("Error initializing device %s\n", driver
);
235 static void qdev_reset(void *opaque
)
237 DeviceState
*dev
= opaque
;
238 if (dev
->info
->reset
)
239 dev
->info
->reset(dev
);
242 /* Initialize a device. Device properties should be set before calling
243 this function. IRQs and MMIO regions should be connected/mapped after
244 calling this function.
245 On failure, destroy the device and return negative value.
246 Return 0 on success. */
247 int qdev_init(DeviceState
*dev
)
251 assert(dev
->state
== DEV_STATE_CREATED
);
252 rc
= dev
->info
->init(dev
, dev
->info
);
257 qemu_register_reset(qdev_reset
, dev
);
259 vmstate_register(-1, dev
->info
->vmsd
, dev
);
260 dev
->state
= DEV_STATE_INITIALIZED
;
264 int qdev_unplug(DeviceState
*dev
)
266 if (!dev
->parent_bus
->allow_hotplug
) {
267 qemu_error("Bus %s does not support hotplugging\n",
268 dev
->parent_bus
->name
);
271 assert(dev
->info
->unplug
!= NULL
);
273 return dev
->info
->unplug(dev
);
276 /* can be used as ->unplug() callback for the simple cases */
277 int qdev_simple_unplug_cb(DeviceState
*dev
)
284 /* Like qdev_init(), but terminate program via hw_error() instead of
285 returning an error value. This is okay during machine creation.
286 Don't use for hotplug, because there callers need to recover from
287 failure. Exception: if you know the device's init() callback can't
288 fail, then qdev_init_nofail() can't fail either, and is therefore
289 usable even then. But relying on the device implementation that
290 way is somewhat unclean, and best avoided. */
291 void qdev_init_nofail(DeviceState
*dev
)
293 DeviceInfo
*info
= dev
->info
;
295 if (qdev_init(dev
) < 0)
296 hw_error("Initialization of device %s failed\n", info
->name
);
299 /* Unlink device from bus and free the structure. */
300 void qdev_free(DeviceState
*dev
)
304 if (dev
->state
== DEV_STATE_INITIALIZED
) {
305 while (dev
->num_child_bus
) {
306 bus
= QLIST_FIRST(&dev
->child_bus
);
310 vmstate_unregister(dev
->info
->vmsd
, dev
);
312 dev
->info
->exit(dev
);
314 qemu_opts_del(dev
->opts
);
316 qemu_unregister_reset(qdev_reset
, dev
);
317 QLIST_REMOVE(dev
, sibling
);
321 void qdev_machine_creation_done(void)
324 * ok, initial machine setup is done, starting from now we can
325 * only create hotpluggable devices
330 /* Get a character (serial) device interface. */
331 CharDriverState
*qdev_init_chardev(DeviceState
*dev
)
333 static int next_serial
;
335 /* FIXME: This function needs to go away: use chardev properties! */
336 return serial_hds
[next_serial
++];
339 BusState
*qdev_get_parent_bus(DeviceState
*dev
)
341 return dev
->parent_bus
;
344 void qdev_init_gpio_in(DeviceState
*dev
, qemu_irq_handler handler
, int n
)
346 assert(dev
->num_gpio_in
== 0);
347 dev
->num_gpio_in
= n
;
348 dev
->gpio_in
= qemu_allocate_irqs(handler
, dev
, n
);
351 void qdev_init_gpio_out(DeviceState
*dev
, qemu_irq
*pins
, int n
)
353 assert(dev
->num_gpio_out
== 0);
354 dev
->num_gpio_out
= n
;
355 dev
->gpio_out
= pins
;
358 qemu_irq
qdev_get_gpio_in(DeviceState
*dev
, int n
)
360 assert(n
>= 0 && n
< dev
->num_gpio_in
);
361 return dev
->gpio_in
[n
];
364 void qdev_connect_gpio_out(DeviceState
* dev
, int n
, qemu_irq pin
)
366 assert(n
>= 0 && n
< dev
->num_gpio_out
);
367 dev
->gpio_out
[n
] = pin
;
370 void qdev_set_nic_properties(DeviceState
*dev
, NICInfo
*nd
)
372 qdev_prop_set_macaddr(dev
, "mac", nd
->macaddr
);
374 qdev_prop_set_vlan(dev
, "vlan", nd
->vlan
);
376 qdev_prop_set_netdev(dev
, "netdev", nd
->netdev
);
377 if (nd
->nvectors
!= NIC_NVECTORS_UNSPECIFIED
&&
378 qdev_prop_exists(dev
, "vectors")) {
379 qdev_prop_set_uint32(dev
, "vectors", nd
->nvectors
);
383 static int next_block_unit
[IF_COUNT
];
385 /* Get a block device. This should only be used for single-drive devices
386 (e.g. SD/Floppy/MTD). Multi-disk devices (scsi/ide) should use the
388 BlockDriverState
*qdev_init_bdrv(DeviceState
*dev
, BlockInterfaceType type
)
390 int unit
= next_block_unit
[type
]++;
393 dinfo
= drive_get(type
, 0, unit
);
394 return dinfo
? dinfo
->bdrv
: NULL
;
397 BusState
*qdev_get_child_bus(DeviceState
*dev
, const char *name
)
401 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
402 if (strcmp(name
, bus
->name
) == 0) {
409 static BusState
*qbus_find_recursive(BusState
*bus
, const char *name
,
413 BusState
*child
, *ret
;
416 if (name
&& (strcmp(bus
->name
, name
) != 0)) {
419 if (info
&& (bus
->info
!= info
)) {
426 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
427 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
428 ret
= qbus_find_recursive(child
, name
, info
);
437 static DeviceState
*qdev_find_recursive(BusState
*bus
, const char *id
)
439 DeviceState
*dev
, *ret
;
442 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
443 if (dev
->id
&& strcmp(dev
->id
, id
) == 0)
445 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
446 ret
= qdev_find_recursive(child
, id
);
455 static void qbus_list_bus(DeviceState
*dev
, char *dest
, int len
)
458 const char *sep
= " ";
461 pos
+= snprintf(dest
+pos
, len
-pos
,"child busses at \"%s\":",
462 dev
->id
? dev
->id
: dev
->info
->name
);
463 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
464 pos
+= snprintf(dest
+pos
, len
-pos
, "%s\"%s\"", sep
, child
->name
);
469 static void qbus_list_dev(BusState
*bus
, char *dest
, int len
)
472 const char *sep
= " ";
475 pos
+= snprintf(dest
+pos
, len
-pos
, "devices at \"%s\":",
477 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
478 pos
+= snprintf(dest
+pos
, len
-pos
, "%s\"%s\"",
479 sep
, dev
->info
->name
);
481 pos
+= snprintf(dest
+pos
, len
-pos
, "/\"%s\"", dev
->id
);
486 static BusState
*qbus_find_bus(DeviceState
*dev
, char *elem
)
490 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
491 if (strcmp(child
->name
, elem
) == 0) {
498 static DeviceState
*qbus_find_dev(BusState
*bus
, char *elem
)
503 * try to match in order:
504 * (1) instance id, if present
506 * (3) driver alias, if present
508 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
509 if (dev
->id
&& strcmp(dev
->id
, elem
) == 0) {
513 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
514 if (strcmp(dev
->info
->name
, elem
) == 0) {
518 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
519 if (dev
->info
->alias
&& strcmp(dev
->info
->alias
, elem
) == 0) {
526 static BusState
*qbus_find(const char *path
)
530 char elem
[128], msg
[256];
533 /* find start element */
534 if (path
[0] == '/') {
535 bus
= main_system_bus
;
538 if (sscanf(path
, "%127[^/]%n", elem
, &len
) != 1) {
539 qemu_error("path parse error (\"%s\")\n", path
);
542 bus
= qbus_find_recursive(main_system_bus
, elem
, NULL
);
544 qemu_error("bus \"%s\" not found\n", elem
);
551 if (path
[pos
] == '\0') {
557 if (sscanf(path
+pos
, "/%127[^/]%n", elem
, &len
) != 1) {
558 qemu_error("path parse error (\"%s\" pos %d)\n", path
, pos
);
562 dev
= qbus_find_dev(bus
, elem
);
564 qbus_list_dev(bus
, msg
, sizeof(msg
));
565 qemu_error("device \"%s\" not found\n%s\n", elem
, msg
);
568 if (path
[pos
] == '\0') {
569 /* last specified element is a device. If it has exactly
570 * one child bus accept it nevertheless */
571 switch (dev
->num_child_bus
) {
573 qemu_error("device has no child bus (%s)\n", path
);
576 return QLIST_FIRST(&dev
->child_bus
);
578 qbus_list_bus(dev
, msg
, sizeof(msg
));
579 qemu_error("device has multiple child busses (%s)\n%s\n",
586 if (sscanf(path
+pos
, "/%127[^/]%n", elem
, &len
) != 1) {
587 qemu_error("path parse error (\"%s\" pos %d)\n", path
, pos
);
591 bus
= qbus_find_bus(dev
, elem
);
593 qbus_list_bus(dev
, msg
, sizeof(msg
));
594 qemu_error("child bus \"%s\" not found\n%s\n", elem
, msg
);
600 void qbus_create_inplace(BusState
*bus
, BusInfo
*info
,
601 DeviceState
*parent
, const char *name
)
607 bus
->parent
= parent
;
610 /* use supplied name */
611 bus
->name
= qemu_strdup(name
);
612 } else if (parent
&& parent
->id
) {
613 /* parent device has id -> use it for bus name */
614 len
= strlen(parent
->id
) + 16;
615 buf
= qemu_malloc(len
);
616 snprintf(buf
, len
, "%s.%d", parent
->id
, parent
->num_child_bus
);
619 /* no id -> use lowercase bus type for bus name */
620 len
= strlen(info
->name
) + 16;
621 buf
= qemu_malloc(len
);
622 len
= snprintf(buf
, len
, "%s.%d", info
->name
,
623 parent
? parent
->num_child_bus
: 0);
624 for (i
= 0; i
< len
; i
++)
625 buf
[i
] = qemu_tolower(buf
[i
]);
629 QLIST_INIT(&bus
->children
);
631 QLIST_INSERT_HEAD(&parent
->child_bus
, bus
, sibling
);
632 parent
->num_child_bus
++;
637 BusState
*qbus_create(BusInfo
*info
, DeviceState
*parent
, const char *name
)
641 bus
= qemu_mallocz(info
->size
);
642 bus
->qdev_allocated
= 1;
643 qbus_create_inplace(bus
, info
, parent
, name
);
647 void qbus_free(BusState
*bus
)
651 while ((dev
= QLIST_FIRST(&bus
->children
)) != NULL
) {
655 QLIST_REMOVE(bus
, sibling
);
656 bus
->parent
->num_child_bus
--;
658 if (bus
->qdev_allocated
) {
663 #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
664 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
);
666 static void qdev_print_props(Monitor
*mon
, DeviceState
*dev
, Property
*props
,
667 const char *prefix
, int indent
)
673 while (props
->name
) {
674 if (props
->info
->print
) {
675 props
->info
->print(dev
, props
, buf
, sizeof(buf
));
676 qdev_printf("%s-prop: %s = %s\n", prefix
, props
->name
, buf
);
682 static void qdev_print(Monitor
*mon
, DeviceState
*dev
, int indent
)
685 qdev_printf("dev: %s, id \"%s\"\n", dev
->info
->name
,
686 dev
->id
? dev
->id
: "");
688 if (dev
->num_gpio_in
) {
689 qdev_printf("gpio-in %d\n", dev
->num_gpio_in
);
691 if (dev
->num_gpio_out
) {
692 qdev_printf("gpio-out %d\n", dev
->num_gpio_out
);
694 qdev_print_props(mon
, dev
, dev
->info
->props
, "dev", indent
);
695 qdev_print_props(mon
, dev
, dev
->parent_bus
->info
->props
, "bus", indent
);
696 if (dev
->parent_bus
->info
->print_dev
)
697 dev
->parent_bus
->info
->print_dev(mon
, dev
, indent
);
698 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
699 qbus_print(mon
, child
, indent
);
703 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
)
705 struct DeviceState
*dev
;
707 qdev_printf("bus: %s\n", bus
->name
);
709 qdev_printf("type %s\n", bus
->info
->name
);
710 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
711 qdev_print(mon
, dev
, indent
);
716 void do_info_qtree(Monitor
*mon
)
719 qbus_print(mon
, main_system_bus
, 0);
722 void do_info_qdm(Monitor
*mon
)
727 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
728 qdev_print_devinfo(info
, msg
, sizeof(msg
));
729 monitor_printf(mon
, "%s\n", msg
);
733 void do_device_add(Monitor
*mon
, const QDict
*qdict
)
737 opts
= qemu_opts_parse(&qemu_device_opts
,
738 qdict_get_str(qdict
, "config"), "driver");
739 if (opts
&& !qdev_device_help(opts
))
740 qdev_device_add(opts
);
743 void do_device_del(Monitor
*mon
, const QDict
*qdict
)
745 const char *id
= qdict_get_str(qdict
, "id");
748 dev
= qdev_find_recursive(main_system_bus
, id
);
750 qemu_error("Device '%s' not found\n", id
);