]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/linux/iommu.h
Merge branches 'iommu/fixes', 'arm/smmu', 'x86/amd', 'x86/vt-d' and 'core' into next
[linux.git] / include / linux / iommu.h
index f2223cbb5fd58ea8ae7fc88f90894736ef071cd4..d1b5f4d98569de91c6982300cdadc9a92a8f5a4a 100644 (file)
@@ -246,9 +246,10 @@ struct iommu_iotlb_gather {
  * @sva_get_pasid: Get PASID associated to a SVA handle
  * @page_response: handle page request response
  * @cache_invalidate: invalidate translation caches
- * @pgsize_bitmap: bitmap of all possible supported page sizes
  * @sva_bind_gpasid: bind guest pasid and mm
  * @sva_unbind_gpasid: unbind guest pasid and mm
+ * @pgsize_bitmap: bitmap of all possible supported page sizes
+ * @owner: Driver module providing these ops
  */
 struct iommu_ops {
        bool (*capable)(enum iommu_cap);
@@ -318,6 +319,7 @@ struct iommu_ops {
        int (*sva_unbind_gpasid)(struct device *dev, int pasid);
 
        unsigned long pgsize_bitmap;
+       struct module *owner;
 };
 
 /**
@@ -386,12 +388,19 @@ void iommu_device_sysfs_remove(struct iommu_device *iommu);
 int  iommu_device_link(struct iommu_device   *iommu, struct device *link);
 void iommu_device_unlink(struct iommu_device *iommu, struct device *link);
 
-static inline void iommu_device_set_ops(struct iommu_device *iommu,
-                                       const struct iommu_ops *ops)
+static inline void __iommu_device_set_ops(struct iommu_device *iommu,
+                                         const struct iommu_ops *ops)
 {
        iommu->ops = ops;
 }
 
+#define iommu_device_set_ops(iommu, ops)                               \
+do {                                                                   \
+       struct iommu_ops *__ops = (struct iommu_ops *)(ops);            \
+       __ops->owner = THIS_MODULE;                                     \
+       __iommu_device_set_ops(iommu, __ops);                           \
+} while (0)
+
 static inline void iommu_device_set_fwnode(struct iommu_device *iommu,
                                           struct fwnode_handle *fwnode)
 {
@@ -456,6 +465,8 @@ extern void iommu_set_fault_handler(struct iommu_domain *domain,
 
 extern void iommu_get_resv_regions(struct device *dev, struct list_head *list);
 extern void iommu_put_resv_regions(struct device *dev, struct list_head *list);
+extern void generic_iommu_put_resv_regions(struct device *dev,
+                                          struct list_head *list);
 extern int iommu_request_dm_for_dev(struct device *dev);
 extern int iommu_request_dma_domain_for_dev(struct device *dev);
 extern void iommu_set_default_passthrough(bool cmd_line);
@@ -570,6 +581,7 @@ struct iommu_group *fsl_mc_device_group(struct device *dev);
  * @ops: ops for this device's IOMMU
  * @iommu_fwnode: firmware handle for this device's IOMMU
  * @iommu_priv: IOMMU driver private data for this device
+ * @num_pasid_bits: number of PASID bits supported by this device
  * @num_ids: number of associated device IDs
  * @ids: IDs which this device may present to the IOMMU
  */
@@ -578,6 +590,7 @@ struct iommu_fwspec {
        struct fwnode_handle    *iommu_fwnode;
        void                    *iommu_priv;
        u32                     flags;
+       u32                     num_pasid_bits;
        unsigned int            num_ids;
        u32                     ids[1];
 };