summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2009-07-15 13:59:24 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2009-07-27 08:39:29 -0500
commitd271de9f1bd7c4671af8cc8edca4ac677371cfff (patch)
treed970ac5d39660127b33ad3b2a58e346085b79b39
parenta6307b086bb8de32c25b59cc2212a69a987c24a6 (diff)
qdev: create default bus names.
Create a default bus name if none is passed to qbus_create(). If the parent device has DeviceState->id set it will be used to create the bus name,. i.e. -device lsi,id=foo will give you a scsi bus named "foo.0". If there is no id BusInfo->name (lowercased) will be used instead, i.e. -device lsi will give you a scsi bus named "scsi.0". A scsi adapter with two scsi busses would have "scsi.0" and "scsi.1" or "$id.0" and "$id.1" busses. The numbers of the child busses are per device, i.e. when adding two lsi adapters both will have a "*.0" child bus. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--hw/qdev.c25
-rw-r--r--hw/qdev.h1
2 files changed, 25 insertions, 1 deletions
diff --git a/hw/qdev.c b/hw/qdev.c
index faecc767af..3be321ad57 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -232,14 +232,37 @@ void scsi_bus_new(DeviceState *host, SCSIAttachFn attach)
BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name)
{
BusState *bus;
+ char *buf;
+ int i,len;
bus = qemu_mallocz(info->size);
bus->info = info;
bus->parent = parent;
- bus->name = qemu_strdup(name);
+
+ if (name) {
+ /* use supplied name */
+ bus->name = qemu_strdup(name);
+ } else if (parent && parent->id) {
+ /* parent device has id -> use it for bus name */
+ len = strlen(parent->id) + 16;
+ buf = qemu_malloc(len);
+ snprintf(buf, len, "%s.%d", parent->id, parent->num_child_bus);
+ bus->name = buf;
+ } else {
+ /* no id -> use lowercase bus type for bus name */
+ len = strlen(info->name) + 16;
+ buf = qemu_malloc(len);
+ len = snprintf(buf, len, "%s.%d", info->name,
+ parent ? parent->num_child_bus : 0);
+ for (i = 0; i < len; i++)
+ buf[i] = tolower(buf[i]);
+ bus->name = buf;
+ }
+
LIST_INIT(&bus->children);
if (parent) {
LIST_INSERT_HEAD(&parent->child_bus, bus, sibling);
+ parent->num_child_bus++;
}
return bus;
}
diff --git a/hw/qdev.h b/hw/qdev.h
index dfd3e92ab0..d9c78eba60 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -27,6 +27,7 @@ struct DeviceState {
int num_gpio_in;
qemu_irq *gpio_in;
LIST_HEAD(, BusState) child_bus;
+ int num_child_bus;
NICInfo *nd;
LIST_ENTRY(DeviceState) sibling;
};