Hi Shameer, On 10/31/25 11:49 AM, Shameer Kolothum wrote: > Currently QEMU SMMUv3 has RIL support by default. But if accelerated mode > is enabled, RIL has to be compatible with host SMMUv3 support. > > Add a property so that the user can specify this. > > Reviewed-by: Jonathan Cameron <[email protected]> > Tested-by: Zhangfei Gao <[email protected]> > Signed-off-by: Shameer Kolothum <[email protected]>
I have not seen any reply on https://lore.kernel.org/all/[email protected]/ I guess you chose to restrict RIL to accel only. About AIDR consistency check, did you have a look? Eric > --- > hw/arm/smmuv3-accel.c | 15 +++++++++++++-- > hw/arm/smmuv3-accel.h | 4 ++++ > hw/arm/smmuv3.c | 12 ++++++++++++ > include/hw/arm/smmuv3.h | 1 + > 4 files changed, 30 insertions(+), 2 deletions(-) > > diff --git a/hw/arm/smmuv3-accel.c b/hw/arm/smmuv3-accel.c > index 8b9f88dd8e..35298350cb 100644 > --- a/hw/arm/smmuv3-accel.c > +++ b/hw/arm/smmuv3-accel.c > @@ -63,10 +63,10 @@ smmuv3_accel_check_hw_compatible(SMMUv3State *s, > return false; > } > > - /* QEMU SMMUv3 supports Range Invalidation by default */ > + /* User can disable QEMU SMMUv3 Range Invalidation support */ > if (FIELD_EX32(info->idr[3], IDR3, RIL) != > FIELD_EX32(s->idr[3], IDR3, RIL)) { > - error_setg(errp, "Host SMMUv3 doesn't support Range Invalidation"); > + error_setg(errp, "Host SMMUv3 differs in Range Invalidation > support"); > return false; > } > > @@ -635,6 +635,17 @@ static const PCIIOMMUOps smmuv3_accel_ops = { > .get_msi_address_space = smmuv3_accel_get_msi_as, > }; > > +void smmuv3_accel_idr_override(SMMUv3State *s) > +{ > + if (!s->accel) { > + return; > + } > + > + /* By default QEMU SMMUv3 has RIL. Update IDR3 if user has disabled it */ > + if (!s->ril) { > + s->idr[3] = FIELD_DP32(s->idr[3], IDR3, RIL, 0); > + } > +} > > /* Based on SMUUv3 GBPA configuration, attach a corresponding HWPT */ > void smmuv3_accel_gbpa_update(SMMUv3State *s) > diff --git a/hw/arm/smmuv3-accel.h b/hw/arm/smmuv3-accel.h > index ee79548370..4f5b672712 100644 > --- a/hw/arm/smmuv3-accel.h > +++ b/hw/arm/smmuv3-accel.h > @@ -55,6 +55,7 @@ bool smmuv3_accel_issue_inv_cmd(SMMUv3State *s, void *cmd, > SMMUDevice *sdev, > Error **errp); > void smmuv3_accel_gbpa_update(SMMUv3State *s); > void smmuv3_accel_reset(SMMUv3State *s); > +void smmuv3_accel_idr_override(SMMUv3State *s); > #else > static inline void smmuv3_accel_init(SMMUv3State *s) > { > @@ -83,6 +84,9 @@ static inline void smmuv3_accel_gbpa_update(SMMUv3State *s) > static inline void smmuv3_accel_reset(SMMUv3State *s) > { > } > +static inline void smmuv3_accel_idr_override(SMMUv3State *s) > +{ > +} > #endif > > #endif /* HW_ARM_SMMUV3_ACCEL_H */ > diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c > index f040e6b91e..b9d96f5762 100644 > --- a/hw/arm/smmuv3.c > +++ b/hw/arm/smmuv3.c > @@ -305,6 +305,7 @@ static void smmuv3_init_id_regs(SMMUv3State *s) > s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN16K, 1); > s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN64K, 1); > s->aidr = 0x1; > + smmuv3_accel_idr_override(s); > } > > static void smmuv3_reset(SMMUv3State *s) > @@ -1936,6 +1937,13 @@ static bool smmu_validate_property(SMMUv3State *s, > Error **errp) > return false; > } > #endif > + if (!s->accel) { > + if (!s->ril) { > + error_setg(errp, "ril can only be disabled if accel=on"); > + return false; > + } > + return false; > + } > return true; > } > > @@ -2057,6 +2065,8 @@ static const Property smmuv3_properties[] = { > */ > DEFINE_PROP_STRING("stage", SMMUv3State, stage), > DEFINE_PROP_BOOL("accel", SMMUv3State, accel, false), > + /* RIL can be turned off for accel cases */ > + DEFINE_PROP_BOOL("ril", SMMUv3State, ril, true), > }; > > static void smmuv3_instance_init(Object *obj) > @@ -2084,6 +2094,8 @@ static void smmuv3_class_init(ObjectClass *klass, const > void *data) > "Enable SMMUv3 accelerator > support." > "Allows host SMMUv3 to be > configured " > "in nested mode for vfio-pci dev > assignment"); > + object_class_property_set_description(klass, "ril", > + "Disable range invalidation support (for accel=on)"); > } > > static int smmuv3_notify_flag_changed(IOMMUMemoryRegion *iommu, > diff --git a/include/hw/arm/smmuv3.h b/include/hw/arm/smmuv3.h > index 6b9c27a9c4..95202c2757 100644 > --- a/include/hw/arm/smmuv3.h > +++ b/include/hw/arm/smmuv3.h > @@ -68,6 +68,7 @@ struct SMMUv3State { > bool accel; > struct SMMUv3AccelState *s_accel; > Error *migration_blocker; > + bool ril; > }; > > typedef enum {
