Arm Fast Models are still implementing legacy virtio-pci devices behind the SMMU, which continue to be problematic as "real hardware" devices (from the point of view of the simulated system) without the mitigating VIRTIO_F_ACCESS_PLATFORM feature.
Since we now have the ability to force passthrough on a device-specific basis, let's use it to work around this particular oddity so that people who just want to boot Linux on a model don't have to fiddle around with things to avoid the SMMU getting in the way by default (and I don't have to keep telling them which things...) Signed-off-by: Robin Murphy <robin.mur...@arm.com> --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 54b2f27b81d4..13cf16e8f45b 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2649,6 +2649,20 @@ static int arm_smmu_dev_disable_feature(struct device *dev, } } +static int arm_smmu_def_domain_type(struct device *dev) +{ + if (dev_is_pci(dev)) { + struct pci_dev *pdev = to_pci_dev(dev); + + /* Legacy virtio-block devices on Arm Fast Models */ + if (pdev->vendor == 0x1af4 && pdev->device == 0x1001 && + pdev->subsystem_vendor == 0x00ff && pdev->subsystem_device == 0x0002) + return IOMMU_DOMAIN_IDENTITY; + } + + return 0; +} + static struct iommu_ops arm_smmu_ops = { .capable = arm_smmu_capable, .domain_alloc = arm_smmu_domain_alloc, @@ -2673,6 +2687,7 @@ static struct iommu_ops arm_smmu_ops = { .sva_bind = arm_smmu_sva_bind, .sva_unbind = arm_smmu_sva_unbind, .sva_get_pasid = arm_smmu_sva_get_pasid, + .def_domain_type = arm_smmu_def_domain_type, .pgsize_bitmap = -1UL, /* Restricted during device attach */ .owner = THIS_MODULE, }; -- 2.25.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu