By giving smmuv3_accel_init() the ability to populate an error,
we can fail early in smmu_realize() when CONFIG_ARM_SMMUV3_ACCEL
is not available, simplifying smmu_validate_property().
Suggested-by: Shameer Kolothum Thodi <skolothumtho@nvidia.com>
Co-developed-by: Shameer Kolothum Thodi <skolothumtho@nvidia.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/arm/smmuv3-accel.h | 7 +++++--
hw/arm/smmuv3-accel.c | 3 ++-
hw/arm/smmuv3.c | 11 +++--------
3 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/hw/arm/smmuv3-accel.h b/hw/arm/smmuv3-accel.h
index dba6c71de52..1ca2c80a933 100644
--- a/hw/arm/smmuv3-accel.h
+++ b/hw/arm/smmuv3-accel.h
@@ -42,7 +42,7 @@ typedef struct SMMUv3AccelDevice {
} SMMUv3AccelDevice;
#ifdef CONFIG_ARM_SMMUV3_ACCEL
-void smmuv3_accel_init(SMMUv3State *s);
+bool smmuv3_accel_init(SMMUv3State *s, Error **errp);
bool smmuv3_accel_install_ste(SMMUv3State *s, SMMUDevice *sdev, int sid,
Error **errp);
bool smmuv3_accel_install_ste_range(SMMUv3State *s, SMMUSIDRange *range,
@@ -54,8 +54,11 @@ void smmuv3_accel_idr_override(SMMUv3State *s);
bool smmuv3_accel_alloc_veventq(SMMUv3State *s, Error **errp);
void smmuv3_accel_reset(SMMUv3State *s);
#else
-static inline void smmuv3_accel_init(SMMUv3State *s)
+#include "qapi/error.h"
+static inline bool smmuv3_accel_init(SMMUv3State *s, Error **errp)
{
+ error_setg(errp, "accel=on support not compiled in");
+ return false;
}
static inline bool
smmuv3_accel_install_ste(SMMUv3State *s, SMMUDevice *sdev, int sid,
diff --git a/hw/arm/smmuv3-accel.c b/hw/arm/smmuv3-accel.c
index 65c2f44880a..ae031f1eccf 100644
--- a/hw/arm/smmuv3-accel.c
+++ b/hw/arm/smmuv3-accel.c
@@ -917,11 +917,12 @@ static void smmuv3_accel_as_init(SMMUv3State *s)
address_space_init(shared_as_sysmem, &root, "smmuv3-accel-as-sysmem");
}
-void smmuv3_accel_init(SMMUv3State *s)
+bool smmuv3_accel_init(SMMUv3State *s, Error **errp)
{
SMMUState *bs = ARM_SMMU(s);
s->s_accel = g_new0(SMMUv3AccelState, 1);
bs->iommu_ops = &smmuv3_accel_ops;
smmuv3_accel_as_init(s);
+ return true;
}
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
index 5570a13c8a6..5c2855c3770 100644
--- a/hw/arm/smmuv3.c
+++ b/hw/arm/smmuv3.c
@@ -1965,13 +1965,6 @@ static void smmu_reset_exit(Object *obj, ResetType type)
static bool smmu_validate_property(SMMUv3State *s, Error **errp)
{
-#ifndef CONFIG_ARM_SMMUV3_ACCEL
- if (s->accel) {
- error_setg(errp, "accel=on support not compiled in");
- return false;
- }
-#endif
-
if (s->ats == ON_OFF_AUTO_AUTO) {
error_setg(errp, "ats auto mode is not supported");
return false;
@@ -2033,7 +2026,9 @@ static void smmu_realize(DeviceState *d, Error **errp)
}
if (s->accel) {
- smmuv3_accel_init(s);
+ if (!smmuv3_accel_init(s, errp)) {
+ return;
+ }
error_setg(&s->migration_blocker, "Migration not supported with SMMUv3 "
"accelerator mode enabled");
if (migrate_add_blocker(&s->migration_blocker, errp) < 0) {
--
2.53.0