qdev: add qdev_find_default_bus()

This helper is used next by -audio code.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
Marc-André Lureau 2025-10-08 14:31:15 +04:00
parent e090e0312d
commit faa5c9ac3f
2 changed files with 24 additions and 4 deletions

View file

@ -1,6 +1,8 @@
#ifndef MONITOR_QDEV_H
#define MONITOR_QDEV_H
#include "hw/qdev-core.h"
/*** monitor commands ***/
void hmp_info_qtree(Monitor *mon, const QDict *qdict);
@ -11,6 +13,7 @@ int qdev_device_help(QemuOpts *opts);
DeviceState *qdev_device_add(QemuOpts *opts, Error **errp);
DeviceState *qdev_device_add_from_qdict(const QDict *opts,
bool from_json, Error **errp);
BusState *qdev_find_default_bus(DeviceClass *dc, Error **errp);
/**
* qdev_set_id: parent the device and set its id if provided.

View file

@ -621,6 +621,25 @@ const char *qdev_set_id(DeviceState *dev, char *id, Error **errp)
return prop->name;
}
BusState *qdev_find_default_bus(DeviceClass *dc, Error **errp)
{
BusState *bus = NULL;
assert(dc->bus_type != NULL);
bus = qbus_find_recursive(sysbus_get_default(), NULL, dc->bus_type);
if (!bus) {
error_setg(errp, "No '%s' bus found for device '%s'",
dc->bus_type, object_class_get_name(OBJECT_CLASS(dc)));
return NULL;
}
if (qbus_is_full(bus)) {
error_setg(errp, "A '%s' bus was found but is full", dc->bus_type);
return NULL;
}
return bus;
}
DeviceState *qdev_device_add_from_qdict(const QDict *opts,
bool from_json, Error **errp)
{
@ -657,10 +676,8 @@ DeviceState *qdev_device_add_from_qdict(const QDict *opts,
return NULL;
}
} else if (dc->bus_type != NULL) {
bus = qbus_find_recursive(sysbus_get_default(), NULL, dc->bus_type);
if (!bus || qbus_is_full(bus)) {
error_setg(errp, "No '%s' bus found for device '%s'",
dc->bus_type, driver);
bus = qdev_find_default_bus(dc, errp);
if (!bus) {
return NULL;
}
}