Merge branch 'linus-4.14-rc4-acp-prereq' of git://people.freedesktop.org/~agd5f/linux...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / etnaviv / etnaviv_mmu.h
index 54be289e5981c65a9fc2e5a0c11e49071918a21a..ab603f5166b10b5519cbe4a1272c6d430ea5f109 100644 (file)
@@ -17,7 +17,8 @@
 #ifndef __ETNAVIV_MMU_H__
 #define __ETNAVIV_MMU_H__
 
-#include <linux/iommu.h>
+#define ETNAVIV_PROT_READ      (1 << 0)
+#define ETNAVIV_PROT_WRITE     (1 << 1)
 
 enum etnaviv_iommu_version {
        ETNAVIV_IOMMU_V1 = 0,
@@ -26,16 +27,31 @@ enum etnaviv_iommu_version {
 
 struct etnaviv_gpu;
 struct etnaviv_vram_mapping;
+struct etnaviv_iommu_domain;
 
-struct etnaviv_iommu_ops {
-       struct iommu_ops ops;
-       size_t (*dump_size)(struct iommu_domain *);
-       void (*dump)(struct iommu_domain *, void *);
+struct etnaviv_iommu_domain_ops {
+       void (*free)(struct etnaviv_iommu_domain *);
+       int (*map)(struct etnaviv_iommu_domain *domain, unsigned long iova,
+                  phys_addr_t paddr, size_t size, int prot);
+       size_t (*unmap)(struct etnaviv_iommu_domain *domain, unsigned long iova,
+                       size_t size);
+       size_t (*dump_size)(struct etnaviv_iommu_domain *);
+       void (*dump)(struct etnaviv_iommu_domain *, void *);
+};
+
+struct etnaviv_iommu_domain {
+       struct device *dev;
+       void *bad_page_cpu;
+       dma_addr_t bad_page_dma;
+       u64 base;
+       u64 size;
+
+       const struct etnaviv_iommu_domain_ops *ops;
 };
 
 struct etnaviv_iommu {
        struct etnaviv_gpu *gpu;
-       struct iommu_domain *domain;
+       struct etnaviv_iommu_domain *domain;
 
        enum etnaviv_iommu_version version;
 
@@ -49,18 +65,11 @@ struct etnaviv_iommu {
 
 struct etnaviv_gem_object;
 
-int etnaviv_iommu_attach(struct etnaviv_iommu *iommu, const char **names,
-       int cnt);
-int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
-       struct sg_table *sgt, unsigned len, int prot);
-int etnaviv_iommu_unmap(struct etnaviv_iommu *iommu, u32 iova,
-       struct sg_table *sgt, unsigned len);
 int etnaviv_iommu_map_gem(struct etnaviv_iommu *mmu,
        struct etnaviv_gem_object *etnaviv_obj, u32 memory_base,
        struct etnaviv_vram_mapping *mapping);
 void etnaviv_iommu_unmap_gem(struct etnaviv_iommu *mmu,
        struct etnaviv_vram_mapping *mapping);
-void etnaviv_iommu_destroy(struct etnaviv_iommu *iommu);
 
 int etnaviv_iommu_get_suballoc_va(struct etnaviv_gpu *gpu, dma_addr_t paddr,
                                  struct drm_mm_node *vram_node, size_t size,
@@ -73,6 +82,7 @@ size_t etnaviv_iommu_dump_size(struct etnaviv_iommu *iommu);
 void etnaviv_iommu_dump(struct etnaviv_iommu *iommu, void *buf);
 
 struct etnaviv_iommu *etnaviv_iommu_new(struct etnaviv_gpu *gpu);
+void etnaviv_iommu_destroy(struct etnaviv_iommu *iommu);
 void etnaviv_iommu_restore(struct etnaviv_gpu *gpu);
 
 #endif /* __ETNAVIV_MMU_H__ */