1
2
3
4
5
6#ifndef __ETNAVIV_MMU_H__
7#define __ETNAVIV_MMU_H__
8
9#define ETNAVIV_PROT_READ (1 << 0)
10#define ETNAVIV_PROT_WRITE (1 << 1)
11
12enum etnaviv_iommu_version {
13 ETNAVIV_IOMMU_V1 = 0,
14 ETNAVIV_IOMMU_V2,
15};
16
17struct etnaviv_gpu;
18struct etnaviv_vram_mapping;
19struct etnaviv_iommu_domain;
20
21struct etnaviv_iommu_domain_ops {
22 void (*free)(struct etnaviv_iommu_domain *);
23 int (*map)(struct etnaviv_iommu_domain *domain, unsigned long iova,
24 phys_addr_t paddr, size_t size, int prot);
25 size_t (*unmap)(struct etnaviv_iommu_domain *domain, unsigned long iova,
26 size_t size);
27 size_t (*dump_size)(struct etnaviv_iommu_domain *);
28 void (*dump)(struct etnaviv_iommu_domain *, void *);
29};
30
31struct etnaviv_iommu_domain {
32 struct device *dev;
33 void *bad_page_cpu;
34 dma_addr_t bad_page_dma;
35 u64 base;
36 u64 size;
37
38 const struct etnaviv_iommu_domain_ops *ops;
39};
40
41struct etnaviv_iommu {
42 struct etnaviv_gpu *gpu;
43 struct etnaviv_iommu_domain *domain;
44
45 enum etnaviv_iommu_version version;
46
47
48 struct mutex lock;
49 struct list_head mappings;
50 struct drm_mm mm;
51 bool need_flush;
52};
53
54struct etnaviv_gem_object;
55
56int etnaviv_iommu_map_gem(struct etnaviv_iommu *mmu,
57 struct etnaviv_gem_object *etnaviv_obj, u32 memory_base,
58 struct etnaviv_vram_mapping *mapping);
59void etnaviv_iommu_unmap_gem(struct etnaviv_iommu *mmu,
60 struct etnaviv_vram_mapping *mapping);
61
62int etnaviv_iommu_get_suballoc_va(struct etnaviv_gpu *gpu, dma_addr_t paddr,
63 struct drm_mm_node *vram_node, size_t size,
64 u32 *iova);
65void etnaviv_iommu_put_suballoc_va(struct etnaviv_gpu *gpu,
66 struct drm_mm_node *vram_node, size_t size,
67 u32 iova);
68
69size_t etnaviv_iommu_dump_size(struct etnaviv_iommu *iommu);
70void etnaviv_iommu_dump(struct etnaviv_iommu *iommu, void *buf);
71
72struct etnaviv_iommu *etnaviv_iommu_new(struct etnaviv_gpu *gpu);
73void etnaviv_iommu_destroy(struct etnaviv_iommu *iommu);
74void etnaviv_iommu_restore(struct etnaviv_gpu *gpu);
75
76#endif
77