From: Marc-André Lureau <marcandre.lureau@redhat.com>
This helper is used next by -audio code.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
include/monitor/qdev.h | 3 +++
system/qdev-monitor.c | 25 +++++++++++++++++++++----
2 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/include/monitor/qdev.h b/include/monitor/qdev.h
index 1d57bf6577..de33637869 100644
--- a/include/monitor/qdev.h
+++ b/include/monitor/qdev.h
@@ -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.
diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
index ec4a2394ce..f2aa400a77 100644
--- a/system/qdev-monitor.c
+++ b/system/qdev-monitor.c
@@ -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;
}
}
--
2.51.0