a0db17ffb686dae5c45c31e8744d2c9fd92dcab7
[linux-2.6-microblaze.git] / drivers / gpu / drm / etnaviv / etnaviv_mmu.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2015-2018 Etnaviv Project
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
12 enum etnaviv_iommu_version {
13         ETNAVIV_IOMMU_V1 = 0,
14         ETNAVIV_IOMMU_V2,
15 };
16
17 struct etnaviv_gpu;
18 struct etnaviv_vram_mapping;
19 struct etnaviv_iommu_domain;
20
21 struct 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
31 struct 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
41 struct etnaviv_iommu {
42         struct etnaviv_gpu *gpu;
43         struct etnaviv_iommu_domain *domain;
44
45         enum etnaviv_iommu_version version;
46
47         /* memory manager for GPU address area */
48         struct mutex lock;
49         struct list_head mappings;
50         struct drm_mm mm;
51         bool need_flush;
52 };
53
54 struct etnaviv_gem_object;
55
56 int etnaviv_iommu_map_gem(struct etnaviv_iommu *mmu,
57         struct etnaviv_gem_object *etnaviv_obj, u32 memory_base,
58         struct etnaviv_vram_mapping *mapping);
59 void etnaviv_iommu_unmap_gem(struct etnaviv_iommu *mmu,
60         struct etnaviv_vram_mapping *mapping);
61
62 int 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);
65 void etnaviv_iommu_put_suballoc_va(struct etnaviv_gpu *gpu,
66                                    struct drm_mm_node *vram_node, size_t size,
67                                    u32 iova);
68
69 size_t etnaviv_iommu_dump_size(struct etnaviv_iommu *iommu);
70 void etnaviv_iommu_dump(struct etnaviv_iommu *iommu, void *buf);
71
72 struct etnaviv_iommu *etnaviv_iommu_new(struct etnaviv_gpu *gpu);
73 void etnaviv_iommu_destroy(struct etnaviv_iommu *iommu);
74 void etnaviv_iommu_restore(struct etnaviv_gpu *gpu);
75
76 #endif /* __ETNAVIV_MMU_H__ */