diff options
author | Robin Murphy <robin.murphy@arm.com> | 2022-04-25 13:42:02 +0100 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2022-04-28 10:30:25 +0200 |
commit | ed36d04e8f8d7b00db451b0fa56a54e8e02ec43e (patch) | |
tree | fbf6b85e5f30de228ecf43abeea69ce86881b8e5 /drivers/iommu | |
parent | f316ba0a8814f4c91e80a435da3421baf0ddd24c (diff) | |
download | linux-stable-ed36d04e8f8d7b00db451b0fa56a54e8e02ec43e.tar.gz linux-stable-ed36d04e8f8d7b00db451b0fa56a54e8e02ec43e.tar.bz2 linux-stable-ed36d04e8f8d7b00db451b0fa56a54e8e02ec43e.zip |
iommu: Introduce device_iommu_capable()
iommu_capable() only really works for systems where all IOMMU instances
are completely homogeneous, and all devices are IOMMU-mapped. Implement
the new variant which will be able to give a more accurate answer for
whichever device the caller is actually interested in, and even more so
once all the external users have been converted and we can reliably pass
the device pointer through the internal driver interface too.
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/8407eb9586677995b7a9fd70d0fd82d85929a9bb.1650878781.git.robin.murphy@arm.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/iommu')
-rw-r--r-- | drivers/iommu/iommu.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index f2c45b85b9fc..780c11734979 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -1906,6 +1906,29 @@ bool iommu_present(struct bus_type *bus) } EXPORT_SYMBOL_GPL(iommu_present); +/** + * device_iommu_capable() - check for a general IOMMU capability + * @dev: device to which the capability would be relevant, if available + * @cap: IOMMU capability + * + * Return: true if an IOMMU is present and supports the given capability + * for the given device, otherwise false. + */ +bool device_iommu_capable(struct device *dev, enum iommu_cap cap) +{ + const struct iommu_ops *ops; + + if (!dev->iommu || !dev->iommu->iommu_dev) + return false; + + ops = dev_iommu_ops(dev); + if (!ops->capable) + return false; + + return ops->capable(cap); +} +EXPORT_SYMBOL_GPL(device_iommu_capable); + bool iommu_capable(struct bus_type *bus, enum iommu_cap cap) { if (!bus->iommu_ops || !bus->iommu_ops->capable) |