Merge tag 'iommu-updates-v3.18' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / include / linux / iommu.h
index 7b02bcc..e6a7c9f 100644 (file)
@@ -57,8 +57,11 @@ struct iommu_domain {
        struct iommu_domain_geometry geometry;
 };
 
-#define IOMMU_CAP_CACHE_COHERENCY      0x1
-#define IOMMU_CAP_INTR_REMAP           0x2     /* isolates device intrs */
+enum iommu_cap {
+       IOMMU_CAP_CACHE_COHERENCY,      /* IOMMU can enforce cache coherent DMA
+                                          transactions */
+       IOMMU_CAP_INTR_REMAP,           /* IOMMU supports interrupt isolation */
+};
 
 /*
  * Following constraints are specifc to FSL_PAMUV1:
@@ -95,7 +98,6 @@ enum iommu_attr {
  * @map: map a physically contiguous memory region to an 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
  * @add_device: add device to iommu grouping
  * @remove_device: remove device from iommu grouping
  * @domain_get_attr: Query domain attributes
@@ -103,6 +105,7 @@ enum iommu_attr {
  * @pgsize_bitmap: bitmap of supported page sizes
  */
 struct iommu_ops {
+       bool (*capable)(enum iommu_cap);
        int (*domain_init)(struct iommu_domain *domain);
        void (*domain_destroy)(struct iommu_domain *domain);
        int (*attach_dev)(struct iommu_domain *domain, struct device *dev);
@@ -112,8 +115,6 @@ struct iommu_ops {
        size_t (*unmap)(struct iommu_domain *domain, unsigned long iova,
                     size_t size);
        phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova);
-       int (*domain_has_cap)(struct iommu_domain *domain,
-                             unsigned long cap);
        int (*add_device)(struct device *dev);
        void (*remove_device)(struct device *dev);
        int (*device_group)(struct device *dev, unsigned int *groupid);
@@ -143,6 +144,7 @@ struct iommu_ops {
 
 extern int bus_set_iommu(struct bus_type *bus, const struct iommu_ops *ops);
 extern bool iommu_present(struct bus_type *bus);
+extern bool iommu_capable(struct bus_type *bus, enum iommu_cap cap);
 extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus);
 extern struct iommu_group *iommu_group_get_by_id(int id);
 extern void iommu_domain_free(struct iommu_domain *domain);
@@ -155,8 +157,6 @@ extern int iommu_map(struct iommu_domain *domain, unsigned long iova,
 extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova,
                       size_t size);
 extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova);
-extern int iommu_domain_has_cap(struct iommu_domain *domain,
-                               unsigned long cap);
 extern void iommu_set_fault_handler(struct iommu_domain *domain,
                        iommu_fault_handler_t handler, void *token);
 
@@ -251,6 +251,11 @@ static inline bool iommu_present(struct bus_type *bus)
        return false;
 }
 
+static inline bool iommu_capable(struct bus_type *bus, enum iommu_cap cap)
+{
+       return false;
+}
+
 static inline struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
 {
        return NULL;
@@ -305,12 +310,6 @@ static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_ad
        return 0;
 }
 
-static inline int iommu_domain_has_cap(struct iommu_domain *domain,
-                                      unsigned long cap)
-{
-       return 0;
-}
-
 static inline void iommu_set_fault_handler(struct iommu_domain *domain,
                                iommu_fault_handler_t handler, void *token)
 {