Commit f35b88b6 authored by Lu Baolu's avatar Lu Baolu Committed by Jason Gunthorpe

iommu: Add cache_invalidate_user op

The updates of the PTEs in the nested page table will be propagated to the
hardware caches.

Add a new domain op cache_invalidate_user() for the userspace to flush the
hardware caches for a nested domain through iommufd. No wrapper for it, as
it's only supposed to be used by iommufd. Then, pass in invalidation
requests in form of a user data array containing a number of invalidation
data entries.

Link: https://lore.kernel.org/r/20240111041015.47920-2-yi.l.liu@intel.comReviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Signed-off-by: default avatarYi Liu <yi.l.liu@intel.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 861deac3
...@@ -284,6 +284,23 @@ struct iommu_user_data { ...@@ -284,6 +284,23 @@ struct iommu_user_data {
size_t len; size_t len;
}; };
/**
* struct iommu_user_data_array - iommu driver specific user space data array
* @type: The data type of all the entries in the user buffer array
* @uptr: Pointer to the user buffer array
* @entry_len: The fixed-width length of an entry in the array, in bytes
* @entry_num: The number of total entries in the array
*
* The user buffer includes an array of requests with format defined in
* include/uapi/linux/iommufd.h
*/
struct iommu_user_data_array {
unsigned int type;
void __user *uptr;
size_t entry_len;
u32 entry_num;
};
/** /**
* __iommu_copy_struct_from_user - Copy iommu driver specific user space data * __iommu_copy_struct_from_user - Copy iommu driver specific user space data
* @dst_data: Pointer to an iommu driver specific user data that is defined in * @dst_data: Pointer to an iommu driver specific user data that is defined in
...@@ -440,6 +457,13 @@ struct iommu_ops { ...@@ -440,6 +457,13 @@ struct iommu_ops {
* @iotlb_sync_map: Sync mappings created recently using @map to the hardware * @iotlb_sync_map: Sync mappings created recently using @map to the hardware
* @iotlb_sync: Flush all queued ranges from the hardware TLBs and empty flush * @iotlb_sync: Flush all queued ranges from the hardware TLBs and empty flush
* queue * queue
* @cache_invalidate_user: Flush hardware cache for user space IO page table.
* The @domain must be IOMMU_DOMAIN_NESTED. The @array
* passes in the cache invalidation requests, in form
* of a driver data structure. The driver must update
* array->entry_num to report the number of handled
* invalidation requests. The driver data structure
* must be defined in include/uapi/linux/iommufd.h
* @iova_to_phys: translate iova to physical address * @iova_to_phys: translate iova to physical address
* @enforce_cache_coherency: Prevent any kind of DMA from bypassing IOMMU_CACHE, * @enforce_cache_coherency: Prevent any kind of DMA from bypassing IOMMU_CACHE,
* including no-snoop TLPs on PCIe or other platform * including no-snoop TLPs on PCIe or other platform
...@@ -465,6 +489,8 @@ struct iommu_domain_ops { ...@@ -465,6 +489,8 @@ struct iommu_domain_ops {
size_t size); size_t size);
void (*iotlb_sync)(struct iommu_domain *domain, void (*iotlb_sync)(struct iommu_domain *domain,
struct iommu_iotlb_gather *iotlb_gather); struct iommu_iotlb_gather *iotlb_gather);
int (*cache_invalidate_user)(struct iommu_domain *domain,
struct iommu_user_data_array *array);
phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, phys_addr_t (*iova_to_phys)(struct iommu_domain *domain,
dma_addr_t iova); dma_addr_t iova);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment