Commit d271de9f1bd7c4671af8cc8edca4ac677371cfff

Authored by Gerd Hoffmann
Committed by Anthony Liguori
1 parent a6307b08

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>
Showing 2 changed files with 25 additions and 1 deletions
hw/qdev.c
@@ -232,14 +232,37 @@ void scsi_bus_new(DeviceState *host, SCSIAttachFn attach) @@ -232,14 +232,37 @@ void scsi_bus_new(DeviceState *host, SCSIAttachFn attach)
232 BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name) 232 BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name)
233 { 233 {
234 BusState *bus; 234 BusState *bus;
  235 + char *buf;
  236 + int i,len;
235 237
236 bus = qemu_mallocz(info->size); 238 bus = qemu_mallocz(info->size);
237 bus->info = info; 239 bus->info = info;
238 bus->parent = parent; 240 bus->parent = parent;
239 - bus->name = qemu_strdup(name); 241 +
  242 + if (name) {
  243 + /* use supplied name */
  244 + bus->name = qemu_strdup(name);
  245 + } else if (parent && parent->id) {
  246 + /* parent device has id -> use it for bus name */
  247 + len = strlen(parent->id) + 16;
  248 + buf = qemu_malloc(len);
  249 + snprintf(buf, len, "%s.%d", parent->id, parent->num_child_bus);
  250 + bus->name = buf;
  251 + } else {
  252 + /* no id -> use lowercase bus type for bus name */
  253 + len = strlen(info->name) + 16;
  254 + buf = qemu_malloc(len);
  255 + len = snprintf(buf, len, "%s.%d", info->name,
  256 + parent ? parent->num_child_bus : 0);
  257 + for (i = 0; i < len; i++)
  258 + buf[i] = tolower(buf[i]);
  259 + bus->name = buf;
  260 + }
  261 +
240 LIST_INIT(&bus->children); 262 LIST_INIT(&bus->children);
241 if (parent) { 263 if (parent) {
242 LIST_INSERT_HEAD(&parent->child_bus, bus, sibling); 264 LIST_INSERT_HEAD(&parent->child_bus, bus, sibling);
  265 + parent->num_child_bus++;
243 } 266 }
244 return bus; 267 return bus;
245 } 268 }
hw/qdev.h
@@ -27,6 +27,7 @@ struct DeviceState { @@ -27,6 +27,7 @@ struct DeviceState {
27 int num_gpio_in; 27 int num_gpio_in;
28 qemu_irq *gpio_in; 28 qemu_irq *gpio_in;
29 LIST_HEAD(, BusState) child_bus; 29 LIST_HEAD(, BusState) child_bus;
  30 + int num_child_bus;
30 NICInfo *nd; 31 NICInfo *nd;
31 LIST_ENTRY(DeviceState) sibling; 32 LIST_ENTRY(DeviceState) sibling;
32 }; 33 };