Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iommu: Add new iommu op to get iommu hardware information

Introduce a new iommu op to get the IOMMU hardware capabilities for
iommufd. This information will be used by any vIOMMU driver which is owned
by userspace.

This op chooses to make the special parameters opaque to the core. This
suits the current usage model where accessing any of the IOMMU device
special parameters does require a userspace driver that matches the kernel
driver. If a need for common parameters, implemented similarly by several
drivers, arises then there's room in the design to grow a generic
parameter set as well. No wrapper API is added as it is supposed to be
used by iommufd only.

Different IOMMU hardware would have different hardware information. So the
information reported differs as well. To let the external user understand
the difference, enum iommu_hw_info_type is defined. For the iommu drivers
that are capable to report hardware information, it should have a unique
iommu_hw_info_type and return to caller. For the driver doesn't report
hardware information, caller just uses IOMMU_HW_INFO_TYPE_NONE if a type
is required.

Link: https://lore.kernel.org/r/20230818101033.4100-3-yi.l.liu@intel.com
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Co-developed-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>

authored by

Lu Baolu and committed by
Jason Gunthorpe
60fedb26 92766e1b

+14
+5
include/linux/iommu.h
··· 228 228 /** 229 229 * struct iommu_ops - iommu ops and capabilities 230 230 * @capable: check capability 231 + * @hw_info: report iommu hardware information. The data buffer returned by this 232 + * op is allocated in the iommu driver and freed by the caller after 233 + * use. The information type is one of enum iommu_hw_info_type defined 234 + * in include/uapi/linux/iommufd.h. 231 235 * @domain_alloc: allocate iommu domain 232 236 * @probe_device: Add device to iommu driver handling 233 237 * @release_device: Remove device from iommu driver handling ··· 261 257 */ 262 258 struct iommu_ops { 263 259 bool (*capable)(struct device *dev, enum iommu_cap); 260 + void *(*hw_info)(struct device *dev, u32 *length, u32 *type); 264 261 265 262 /* Domain allocation and freeing by the iommu driver */ 266 263 struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type);
+9
include/uapi/linux/iommufd.h
··· 370 370 __u32 __reserved; 371 371 }; 372 372 #define IOMMU_HWPT_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_HWPT_ALLOC) 373 + 374 + /** 375 + * enum iommu_hw_info_type - IOMMU Hardware Info Types 376 + * @IOMMU_HW_INFO_TYPE_NONE: Used by the drivers that do not report hardware 377 + * info 378 + */ 379 + enum iommu_hw_info_type { 380 + IOMMU_HW_INFO_TYPE_NONE, 381 + }; 373 382 #endif