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 /* This is a nasty hack to allow passing a NULL bus to qdev_create. */
34 static BusState
*main_system_bus
;
36 static DeviceInfo
*device_info_list
;
38 static BusState
*qbus_find_recursive(BusState
*bus
, const char *name
,
40 static BusState
*qbus_find(const char *path
);
42 /* Register a new device type. */
43 void qdev_register(DeviceInfo
*info
)
45 assert(info
->size
>= sizeof(DeviceState
));
48 info
->next
= device_info_list
;
49 device_info_list
= info
;
52 static DeviceInfo
*qdev_find_info(BusInfo
*bus_info
, const char *name
)
56 /* first check device names */
57 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
58 if (bus_info
&& info
->bus_info
!= bus_info
)
60 if (strcmp(info
->name
, name
) != 0)
65 /* failing that check the aliases */
66 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
67 if (bus_info
&& info
->bus_info
!= bus_info
)
71 if (strcmp(info
->alias
, name
) != 0)
78 /* Create a new device. This only initializes the device state structure
79 and allows properties to be set. qdev_init should be called to
80 initialize the actual device emulation. */
81 DeviceState
*qdev_create(BusState
*bus
, const char *name
)
87 if (!main_system_bus
) {
88 main_system_bus
= qbus_create(&system_bus_info
, NULL
, "main-system-bus");
90 bus
= main_system_bus
;
93 info
= qdev_find_info(bus
->info
, name
);
95 hw_error("Unknown device '%s' for bus '%s'\n", name
, bus
->info
->name
);
98 dev
= qemu_mallocz(info
->size
);
100 dev
->parent_bus
= bus
;
101 qdev_prop_set_defaults(dev
, dev
->info
->props
);
102 qdev_prop_set_defaults(dev
, dev
->parent_bus
->info
->props
);
103 qdev_prop_set_compat(dev
);
104 QLIST_INSERT_HEAD(&bus
->children
, dev
, sibling
);
108 static int qdev_print_devinfo(DeviceInfo
*info
, char *dest
, int len
)
113 ret
= snprintf(dest
+pos
, len
-pos
, "name \"%s\", bus %s",
114 info
->name
, info
->bus_info
->name
);
115 pos
+= MIN(len
-pos
,ret
);
117 ret
= snprintf(dest
+pos
, len
-pos
, ", alias \"%s\"", info
->alias
);
118 pos
+= MIN(len
-pos
,ret
);
121 ret
= snprintf(dest
+pos
, len
-pos
, ", desc \"%s\"", info
->desc
);
122 pos
+= MIN(len
-pos
,ret
);
125 ret
= snprintf(dest
+pos
, len
-pos
, ", no-user");
126 pos
+= MIN(len
-pos
,ret
);
131 static int set_property(const char *name
, const char *value
, void *opaque
)
133 DeviceState
*dev
= opaque
;
135 if (strcmp(name
, "driver") == 0)
137 if (strcmp(name
, "bus") == 0)
140 if (qdev_prop_parse(dev
, name
, value
) == -1) {
141 qemu_error("can't set property \"%s\" to \"%s\" for \"%s\"\n",
142 name
, value
, dev
->info
->name
);
148 DeviceState
*qdev_device_add(QemuOpts
*opts
)
150 const char *driver
, *path
, *id
;
155 driver
= qemu_opt_get(opts
, "driver");
157 qemu_error("-device: no driver specified\n");
160 if (strcmp(driver
, "?") == 0) {
162 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
163 qdev_print_devinfo(info
, msg
, sizeof(msg
));
164 qemu_error("%s\n", msg
);
170 info
= qdev_find_info(NULL
, driver
);
172 qemu_error("Device \"%s\" not found. Try -device '?' for a list.\n",
177 qemu_error("device \"%s\" can't be added via command line\n",
183 path
= qemu_opt_get(opts
, "bus");
185 bus
= qbus_find(path
);
187 bus
= qbus_find_recursive(main_system_bus
, NULL
, info
->bus_info
);
190 qemu_error("Did not find %s bus for %s\n",
191 path
? path
: info
->bus_info
->name
, info
->name
);
195 /* create device, set properties */
196 qdev
= qdev_create(bus
, driver
);
197 id
= qemu_opts_id(opts
);
201 if (qemu_opt_foreach(opts
, set_property
, qdev
, 1) != 0) {
205 if (qdev_init(qdev
) != 0) {
212 /* Initialize a device. Device properties should be set before calling
213 this function. IRQs and MMIO regions should be connected/mapped after
214 calling this function. */
215 int qdev_init(DeviceState
*dev
)
219 rc
= dev
->info
->init(dev
, dev
->info
);
222 if (dev
->info
->reset
)
223 qemu_register_reset(dev
->info
->reset
, dev
);
225 vmstate_register(-1, dev
->info
->vmsd
, dev
);
229 /* Unlink device from bus and free the structure. */
230 void qdev_free(DeviceState
*dev
)
232 #if 0 /* FIXME: need sane vmstate_unregister function */
234 vmstate_unregister(dev
->info
->vmsd
, dev
);
236 if (dev
->info
->reset
)
237 qemu_unregister_reset(dev
->info
->reset
, dev
);
238 QLIST_REMOVE(dev
, sibling
);
242 /* Get a character (serial) device interface. */
243 CharDriverState
*qdev_init_chardev(DeviceState
*dev
)
245 static int next_serial
;
246 static int next_virtconsole
;
247 /* FIXME: This is a nasty hack that needs to go away. */
248 if (strncmp(dev
->info
->name
, "virtio", 6) == 0) {
249 return virtcon_hds
[next_virtconsole
++];
251 return serial_hds
[next_serial
++];
255 BusState
*qdev_get_parent_bus(DeviceState
*dev
)
257 return dev
->parent_bus
;
260 void qdev_init_gpio_in(DeviceState
*dev
, qemu_irq_handler handler
, int n
)
262 assert(dev
->num_gpio_in
== 0);
263 dev
->num_gpio_in
= n
;
264 dev
->gpio_in
= qemu_allocate_irqs(handler
, dev
, n
);
267 void qdev_init_gpio_out(DeviceState
*dev
, qemu_irq
*pins
, int n
)
269 assert(dev
->num_gpio_out
== 0);
270 dev
->num_gpio_out
= n
;
271 dev
->gpio_out
= pins
;
274 qemu_irq
qdev_get_gpio_in(DeviceState
*dev
, int n
)
276 assert(n
>= 0 && n
< dev
->num_gpio_in
);
277 return dev
->gpio_in
[n
];
280 void qdev_connect_gpio_out(DeviceState
* dev
, int n
, qemu_irq pin
)
282 assert(n
>= 0 && n
< dev
->num_gpio_out
);
283 dev
->gpio_out
[n
] = pin
;
286 VLANClientState
*qdev_get_vlan_client(DeviceState
*dev
,
287 NetCanReceive
*can_receive
,
289 NetReceiveIOV
*receive_iov
,
293 NICInfo
*nd
= dev
->nd
;
295 nd
->vc
= qemu_new_vlan_client(nd
->vlan
, nd
->model
, nd
->name
, can_receive
,
296 receive
, receive_iov
, cleanup
, opaque
);
301 void qdev_get_macaddr(DeviceState
*dev
, uint8_t *macaddr
)
303 memcpy(macaddr
, dev
->nd
->macaddr
, 6);
306 static int next_block_unit
[IF_COUNT
];
308 /* Get a block device. This should only be used for single-drive devices
309 (e.g. SD/Floppy/MTD). Multi-disk devices (scsi/ide) should use the
311 BlockDriverState
*qdev_init_bdrv(DeviceState
*dev
, BlockInterfaceType type
)
313 int unit
= next_block_unit
[type
]++;
316 dinfo
= drive_get(type
, 0, unit
);
317 return dinfo
? dinfo
->bdrv
: NULL
;
320 BusState
*qdev_get_child_bus(DeviceState
*dev
, const char *name
)
324 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
325 if (strcmp(name
, bus
->name
) == 0) {
332 static BusState
*qbus_find_recursive(BusState
*bus
, const char *name
,
336 BusState
*child
, *ret
;
339 if (name
&& (strcmp(bus
->name
, name
) != 0)) {
342 if (info
&& (bus
->info
!= info
)) {
349 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
350 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
351 ret
= qbus_find_recursive(child
, name
, info
);
360 static void qbus_list_bus(DeviceState
*dev
, char *dest
, int len
)
363 const char *sep
= " ";
366 pos
+= snprintf(dest
+pos
, len
-pos
,"child busses at \"%s\":",
367 dev
->id
? dev
->id
: dev
->info
->name
);
368 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
369 pos
+= snprintf(dest
+pos
, len
-pos
, "%s\"%s\"", sep
, child
->name
);
374 static void qbus_list_dev(BusState
*bus
, char *dest
, int len
)
377 const char *sep
= " ";
380 pos
+= snprintf(dest
+pos
, len
-pos
, "devices at \"%s\":",
382 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
383 pos
+= snprintf(dest
+pos
, len
-pos
, "%s\"%s\"",
384 sep
, dev
->info
->name
);
386 pos
+= snprintf(dest
+pos
, len
-pos
, "/\"%s\"", dev
->id
);
391 static BusState
*qbus_find_bus(DeviceState
*dev
, char *elem
)
395 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
396 if (strcmp(child
->name
, elem
) == 0) {
403 static DeviceState
*qbus_find_dev(BusState
*bus
, char *elem
)
408 * try to match in order:
409 * (1) instance id, if present
411 * (3) driver alias, if present
413 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
414 if (dev
->id
&& strcmp(dev
->id
, elem
) == 0) {
418 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
419 if (strcmp(dev
->info
->name
, elem
) == 0) {
423 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
424 if (dev
->info
->alias
&& strcmp(dev
->info
->alias
, elem
) == 0) {
431 static BusState
*qbus_find(const char *path
)
435 char elem
[128], msg
[256];
438 /* find start element */
439 if (path
[0] == '/') {
440 bus
= main_system_bus
;
443 if (sscanf(path
, "%127[^/]%n", elem
, &len
) != 1) {
444 qemu_error("path parse error (\"%s\")\n", path
);
447 bus
= qbus_find_recursive(main_system_bus
, elem
, NULL
);
449 qemu_error("bus \"%s\" not found\n", elem
);
456 if (path
[pos
] == '\0') {
462 if (sscanf(path
+pos
, "/%127[^/]%n", elem
, &len
) != 1) {
463 qemu_error("path parse error (\"%s\" pos %d)\n", path
, pos
);
467 dev
= qbus_find_dev(bus
, elem
);
469 qbus_list_dev(bus
, msg
, sizeof(msg
));
470 qemu_error("device \"%s\" not found\n%s\n", elem
, msg
);
473 if (path
[pos
] == '\0') {
474 /* last specified element is a device. If it has exactly
475 * one child bus accept it nevertheless */
476 switch (dev
->num_child_bus
) {
478 qemu_error("device has no child bus (%s)\n", path
);
481 return QLIST_FIRST(&dev
->child_bus
);
483 qbus_list_bus(dev
, msg
, sizeof(msg
));
484 qemu_error("device has multiple child busses (%s)\n%s\n",
491 if (sscanf(path
+pos
, "/%127[^/]%n", elem
, &len
) != 1) {
492 qemu_error("path parse error (\"%s\" pos %d)\n", path
, pos
);
496 bus
= qbus_find_bus(dev
, elem
);
498 qbus_list_bus(dev
, msg
, sizeof(msg
));
499 qemu_error("child bus \"%s\" not found\n%s\n", elem
, msg
);
505 void qbus_create_inplace(BusState
*bus
, BusInfo
*info
,
506 DeviceState
*parent
, const char *name
)
512 bus
->parent
= parent
;
515 /* use supplied name */
516 bus
->name
= qemu_strdup(name
);
517 } else if (parent
&& parent
->id
) {
518 /* parent device has id -> use it for bus name */
519 len
= strlen(parent
->id
) + 16;
520 buf
= qemu_malloc(len
);
521 snprintf(buf
, len
, "%s.%d", parent
->id
, parent
->num_child_bus
);
524 /* no id -> use lowercase bus type for bus name */
525 len
= strlen(info
->name
) + 16;
526 buf
= qemu_malloc(len
);
527 len
= snprintf(buf
, len
, "%s.%d", info
->name
,
528 parent
? parent
->num_child_bus
: 0);
529 for (i
= 0; i
< len
; i
++)
530 buf
[i
] = qemu_tolower(buf
[i
]);
534 QLIST_INIT(&bus
->children
);
536 QLIST_INSERT_HEAD(&parent
->child_bus
, bus
, sibling
);
537 parent
->num_child_bus
++;
542 BusState
*qbus_create(BusInfo
*info
, DeviceState
*parent
, const char *name
)
546 bus
= qemu_mallocz(info
->size
);
547 bus
->qdev_allocated
= 1;
548 qbus_create_inplace(bus
, info
, parent
, name
);
552 #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
553 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
);
555 static void qdev_print_props(Monitor
*mon
, DeviceState
*dev
, Property
*props
,
556 const char *prefix
, int indent
)
562 while (props
->name
) {
563 if (props
->info
->print
) {
564 props
->info
->print(dev
, props
, buf
, sizeof(buf
));
565 qdev_printf("%s-prop: %s = %s\n", prefix
, props
->name
, buf
);
571 static void qdev_print(Monitor
*mon
, DeviceState
*dev
, int indent
)
574 qdev_printf("dev: %s, id \"%s\"\n", dev
->info
->name
,
575 dev
->id
? dev
->id
: "");
577 if (dev
->num_gpio_in
) {
578 qdev_printf("gpio-in %d\n", dev
->num_gpio_in
);
580 if (dev
->num_gpio_out
) {
581 qdev_printf("gpio-out %d\n", dev
->num_gpio_out
);
583 qdev_print_props(mon
, dev
, dev
->info
->props
, "dev", indent
);
584 qdev_print_props(mon
, dev
, dev
->parent_bus
->info
->props
, "bus", indent
);
585 if (dev
->parent_bus
->info
->print_dev
)
586 dev
->parent_bus
->info
->print_dev(mon
, dev
, indent
);
587 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
588 qbus_print(mon
, child
, indent
);
592 static void qbus_print(Monitor
*mon
, BusState
*bus
, int indent
)
594 struct DeviceState
*dev
;
596 qdev_printf("bus: %s\n", bus
->name
);
598 qdev_printf("type %s\n", bus
->info
->name
);
599 QLIST_FOREACH(dev
, &bus
->children
, sibling
) {
600 qdev_print(mon
, dev
, indent
);
605 void do_info_qtree(Monitor
*mon
)
608 qbus_print(mon
, main_system_bus
, 0);
611 void do_info_qdm(Monitor
*mon
)
616 for (info
= device_info_list
; info
!= NULL
; info
= info
->next
) {
617 qdev_print_devinfo(info
, msg
, sizeof(msg
));
618 monitor_printf(mon
, "%s\n", msg
);