Merge branches 'iommu/fixes', 'x86/amd', 'groups', 'arm/tegra' and 'api/domain-attr...
[platform/adaptation/renesas_rcar/renesas_kernel.git] / include / linux / iommu.h
index a71df92..54d6d69 100644 (file)
@@ -38,16 +38,28 @@ struct iommu_domain;
 typedef int (*iommu_fault_handler_t)(struct iommu_domain *,
                        struct device *, unsigned long, int, void *);
 
+struct iommu_domain_geometry {
+       dma_addr_t aperture_start; /* First address that can be mapped    */
+       dma_addr_t aperture_end;   /* Last address that can be mapped     */
+       bool force_aperture;       /* DMA only allowed in mappable range? */
+};
+
 struct iommu_domain {
        struct iommu_ops *ops;
        void *priv;
        iommu_fault_handler_t handler;
        void *handler_token;
+       struct iommu_domain_geometry geometry;
 };
 
 #define IOMMU_CAP_CACHE_COHERENCY      0x1
 #define IOMMU_CAP_INTR_REMAP           0x2     /* isolates device intrs */
 
+enum iommu_attr {
+       DOMAIN_ATTR_MAX,
+       DOMAIN_ATTR_GEOMETRY,
+};
+
 #ifdef CONFIG_IOMMU_API
 
 /**
@@ -60,9 +72,10 @@ struct iommu_domain {
  * @unmap: unmap a physically contiguous memory region from an iommu domain
  * @iova_to_phys: translate iova to physical address
  * @domain_has_cap: domain capabilities query
- * @commit: commit iommu domain
  * @add_device: add device to iommu grouping
  * @remove_device: remove device from iommu grouping
+ * @domain_get_attr: Query domain attributes
+ * @domain_set_attr: Change domain attributes
  * @pgsize_bitmap: bitmap of supported page sizes
  */
 struct iommu_ops {
@@ -80,6 +93,11 @@ struct iommu_ops {
                              unsigned long cap);
        int (*add_device)(struct device *dev);
        void (*remove_device)(struct device *dev);
+       int (*device_group)(struct device *dev, unsigned int *groupid);
+       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);
        unsigned long pgsize_bitmap;
 };
 
@@ -132,6 +150,11 @@ extern int iommu_group_unregister_notifier(struct iommu_group *group,
                                           struct notifier_block *nb);
 extern int iommu_group_id(struct iommu_group *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);
+
 /**
  * report_iommu_fault() - report about an IOMMU fault to the IOMMU framework
  * @domain: the iommu domain where the fault has happened
@@ -300,6 +323,19 @@ 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)
+{
+       return -EINVAL;
+}
+
+static inline int iommu_domain_set_attr(struct iommu_domain *domain,
+                                       enum iommu_attr attr, void *data)
+{
+       return -EINVAL;
+}
+
 #endif /* CONFIG_IOMMU_API */
 
 #endif /* __LINUX_IOMMU_H */