Merge branches 'iommu/fixes', 'arm/mediatek', 'arm/smmu', 'arm/exynos', 'unisoc'...
[linux-2.6-microblaze.git] / include / linux / iommu.h
index 9ca6e6b..9223a82 100644 (file)
@@ -96,32 +96,6 @@ enum iommu_cap {
        IOMMU_CAP_NOEXEC,               /* IOMMU_NOEXEC flag */
 };
 
-/*
- * Following constraints are specifc to FSL_PAMUV1:
- *  -aperture must be power of 2, and naturally aligned
- *  -number of windows must be power of 2, and address space size
- *   of each window is determined by aperture size / # of windows
- *  -the actual size of the mapped region of a window must be power
- *   of 2 starting with 4KB and physical address must be naturally
- *   aligned.
- * DOMAIN_ATTR_FSL_PAMUV1 corresponds to the above mentioned contraints.
- * The caller can invoke iommu_domain_get_attr to check if the underlying
- * iommu implementation supports these constraints.
- */
-
-enum iommu_attr {
-       DOMAIN_ATTR_GEOMETRY,
-       DOMAIN_ATTR_PAGING,
-       DOMAIN_ATTR_WINDOWS,
-       DOMAIN_ATTR_FSL_PAMU_STASH,
-       DOMAIN_ATTR_FSL_PAMU_ENABLE,
-       DOMAIN_ATTR_FSL_PAMUV1,
-       DOMAIN_ATTR_NESTING,    /* two stages of translation */
-       DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE,
-       DOMAIN_ATTR_IO_PGTABLE_CFG,
-       DOMAIN_ATTR_MAX,
-};
-
 /* These are the possible reserved region types */
 enum iommu_resv_type {
        /* Memory regions which must be mapped 1:1 at all times */
@@ -156,10 +130,24 @@ struct iommu_resv_region {
        enum iommu_resv_type    type;
 };
 
-/* Per device IOMMU features */
+/**
+ * enum iommu_dev_features - Per device IOMMU features
+ * @IOMMU_DEV_FEAT_AUX: Auxiliary domain feature
+ * @IOMMU_DEV_FEAT_SVA: Shared Virtual Addresses
+ * @IOMMU_DEV_FEAT_IOPF: I/O Page Faults such as PRI or Stall. Generally
+ *                      enabling %IOMMU_DEV_FEAT_SVA requires
+ *                      %IOMMU_DEV_FEAT_IOPF, but some devices manage I/O Page
+ *                      Faults themselves instead of relying on the IOMMU. When
+ *                      supported, this feature must be enabled before and
+ *                      disabled after %IOMMU_DEV_FEAT_SVA.
+ *
+ * Device drivers query whether a feature is supported using
+ * iommu_dev_has_feature(), and enable it using iommu_dev_enable_feature().
+ */
 enum iommu_dev_features {
-       IOMMU_DEV_FEAT_AUX,     /* Aux-domain feature */
-       IOMMU_DEV_FEAT_SVA,     /* Shared Virtual Addresses */
+       IOMMU_DEV_FEAT_AUX,
+       IOMMU_DEV_FEAT_SVA,
+       IOMMU_DEV_FEAT_IOPF,
 };
 
 #define IOMMU_PASID_INVALID    (-1U)
@@ -203,13 +191,11 @@ struct iommu_iotlb_gather {
  * @probe_finalize: Do final setup work after the device is added to an IOMMU
  *                  group and attached to the groups domain
  * @device_group: find iommu group for a particular device
- * @domain_get_attr: Query domain attributes
- * @domain_set_attr: Change domain attributes
+ * @enable_nesting: Enable nesting
+ * @set_pgtable_quirks: Set io page table quirks (IO_PGTABLE_QUIRK_*)
  * @get_resv_regions: Request list of reserved regions for a device
  * @put_resv_regions: Free list of reserved regions for a device
  * @apply_resv_region: Temporary helper call-back for iova reserved ranges
- * @domain_window_enable: Configure and enable a particular window for a domain
- * @domain_window_disable: Disable a particular window for a domain
  * @of_xlate: add OF master IDs to iommu grouping
  * @is_attach_deferred: Check if domain attach should be deferred from iommu
  *                      driver init to device driver init (default no)
@@ -255,10 +241,9 @@ struct iommu_ops {
        void (*release_device)(struct device *dev);
        void (*probe_finalize)(struct device *dev);
        struct iommu_group *(*device_group)(struct device *dev);
-       int (*domain_get_attr)(struct iommu_domain *domain,
-                              enum iommu_attr attr, void *data);
-       int (*domain_set_attr)(struct iommu_domain *domain,
-                              enum iommu_attr attr, void *data);
+       int (*enable_nesting)(struct iommu_domain *domain);
+       int (*set_pgtable_quirks)(struct iommu_domain *domain,
+                                 unsigned long quirks);
 
        /* Request/Free a list of reserved regions for a device */
        void (*get_resv_regions)(struct device *dev, struct list_head *list);
@@ -267,11 +252,6 @@ struct iommu_ops {
                                  struct iommu_domain *domain,
                                  struct iommu_resv_region *region);
 
-       /* Window handling functions */
-       int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr,
-                                   phys_addr_t paddr, u64 size, int prot);
-       void (*domain_window_disable)(struct iommu_domain *domain, u32 wnd_nr);
-
        int (*of_xlate)(struct device *dev, struct of_phandle_args *args);
        bool (*is_attach_deferred)(struct iommu_domain *domain, struct device *dev);
 
@@ -353,6 +333,7 @@ struct iommu_fault_param {
  * struct dev_iommu - Collection of per-device IOMMU data
  *
  * @fault_param: IOMMU detected device fault reporting data
+ * @iopf_param:         I/O Page Fault queue and data
  * @fwspec:     IOMMU fwspec data
  * @iommu_dev:  IOMMU device this device is linked to
  * @priv:       IOMMU Driver private data
@@ -363,6 +344,7 @@ struct iommu_fault_param {
 struct dev_iommu {
        struct mutex lock;
        struct iommu_fault_param        *fault_param;
+       struct iopf_device_param        *iopf_param;
        struct iommu_fwspec             *fwspec;
        struct iommu_device             *iommu_dev;
        void                            *priv;
@@ -507,15 +489,12 @@ extern int iommu_page_response(struct device *dev,
 extern int iommu_group_id(struct iommu_group *group);
 extern struct iommu_domain *iommu_group_default_domain(struct iommu_group *);
 
-extern int iommu_domain_get_attr(struct iommu_domain *domain, enum iommu_attr,
-                                void *data);
-extern int iommu_domain_set_attr(struct iommu_domain *domain, enum iommu_attr,
-                                void *data);
+int iommu_enable_nesting(struct iommu_domain *domain);
+int iommu_set_pgtable_quirks(struct iommu_domain *domain,
+               unsigned long quirks);
 
-/* Window handling function prototypes */
-extern int iommu_domain_window_enable(struct iommu_domain *domain, u32 wnd_nr,
-                                     phys_addr_t offset, u64 size,
-                                     int prot);
+void iommu_set_dma_strict(bool val);
+bool iommu_get_dma_strict(struct iommu_domain *domain);
 
 extern int report_iommu_fault(struct iommu_domain *domain, struct device *dev,
                              unsigned long iova, int flags);
@@ -571,8 +550,7 @@ struct iommu_group *fsl_mc_device_group(struct device *dev);
  * struct iommu_fwspec - per-device IOMMU instance data
  * @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
+ * @flags: IOMMU_FWSPEC_* flags
  * @num_ids: number of associated device IDs
  * @ids: IDs which this device may present to the IOMMU
  */
@@ -580,7 +558,6 @@ struct iommu_fwspec {
        const struct iommu_ops  *ops;
        struct fwnode_handle    *iommu_fwnode;
        u32                     flags;
-       u32                     num_pasid_bits;
        unsigned int            num_ids;
        u32                     ids[];
 };
@@ -742,13 +719,6 @@ static inline void iommu_iotlb_sync(struct iommu_domain *domain,
 {
 }
 
-static inline int iommu_domain_window_enable(struct iommu_domain *domain,
-                                            u32 wnd_nr, phys_addr_t paddr,
-                                            u64 size, int prot)
-{
-       return -ENODEV;
-}
-
 static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova)
 {
        return 0;
@@ -889,16 +859,10 @@ static inline int iommu_group_id(struct iommu_group *group)
        return -ENODEV;
 }
 
-static inline int iommu_domain_get_attr(struct iommu_domain *domain,
-                                       enum iommu_attr attr, void *data)
+static inline int iommu_set_pgtable_quirks(struct iommu_domain *domain,
+               unsigned long quirks)
 {
-       return -EINVAL;
-}
-
-static inline int iommu_domain_set_attr(struct iommu_domain *domain,
-                                       enum iommu_attr attr, void *data)
-{
-       return -EINVAL;
+       return 0;
 }
 
 static inline int  iommu_device_register(struct iommu_device *iommu)