On Fri, Oct 31, 2025 at 10:49:52AM +0000, Shameer Kolothum wrote: > Just before the device gets attached to the SMMUv3, make sure QEMU SMMUv3 > features are compatible with the host SMMUv3. > > Not all fields in the host SMMUv3 IDR registers are meaningful for userspace. > Only the following fields can be used: > > - IDR0: ST_LEVEL, TERM_MODEL, STALL_MODEL, TTENDIAN, CD2L, ASID16, TTF > - IDR1: SIDSIZE, SSIDSIZE > - IDR3: BBML, RIL > - IDR5: VAX, GRAN64K, GRAN16K, GRAN4K > > For now, the check is to make sure the features are in sync to enable > basic accelerated SMMUv3 support.
Note that SSIDSIZE will be added in the follow-up PASID support. > Signed-off-by: Shameer Kolothum <[email protected]> Reviewed-by: Nicolin Chen <[email protected]> > diff --git a/hw/arm/smmuv3-accel.c b/hw/arm/smmuv3-accel.c > index a2deda3c32..8b9f88dd8e 100644 > --- a/hw/arm/smmuv3-accel.c > +++ b/hw/arm/smmuv3-accel.c > @@ -28,6 +28,98 @@ MemoryRegion root; > MemoryRegion sysmem; > static AddressSpace *shared_as_sysmem; > > +static bool > +smmuv3_accel_check_hw_compatible(SMMUv3State *s, Maybe rename to: SMMUv3State *smmu then... > + struct iommu_hw_info_arm_smmuv3 *info, > + Error **errp) > +{ > + /* QEMU SMMUv3 supports both linear and 2-level stream tables */ > + if (FIELD_EX32(info->idr[0], IDR0, STLEVEL) != > + FIELD_EX32(s->idr[0], IDR0, STLEVEL)) { this looks nicer: if (FIELD_EX32(info->idr[0], IDR0, STLEVEL) != FIELD_EX32(smmu->idr[0], IDR0, STLEVEL)) { > +static bool > +smmuv3_accel_hw_compatible(SMMUv3State *s, HostIOMMUDeviceIOMMUFD *idev, > + Error **errp) > +{ > + struct iommu_hw_info_arm_smmuv3 info; > + uint32_t data_type; > + uint64_t caps; > + > + if (!iommufd_backend_get_device_info(idev->iommufd, idev->devid, > &data_type, > + &info, sizeof(info), &caps, errp)) { > + return false; > + } > + > + if (data_type != IOMMU_HW_INFO_TYPE_ARM_SMMUV3) { > + error_setg(errp, "Wrong data type (%d) for Host SMMUv3 device info", > + data_type); > + return false; > + } > + > + if (!smmuv3_accel_check_hw_compatible(s, &info, errp)) { Nit: it doesn't seem to be necessary to have a wrapper? Nicolin
