1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2015-2018 Etnaviv Project
6 #ifndef __ETNAVIV_MMU_H__
7 #define __ETNAVIV_MMU_H__
9 #define ETNAVIV_PROT_READ (1 << 0)
10 #define ETNAVIV_PROT_WRITE (1 << 1)
12 enum etnaviv_iommu_version {
18 struct etnaviv_vram_mapping;
19 struct etnaviv_iommu_domain;
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,
27 size_t (*dump_size)(struct etnaviv_iommu_domain *);
28 void (*dump)(struct etnaviv_iommu_domain *, void *);
31 struct etnaviv_iommu_domain {
34 dma_addr_t bad_page_dma;
38 const struct etnaviv_iommu_domain_ops *ops;
41 struct etnaviv_iommu {
42 struct etnaviv_gpu *gpu;
43 struct etnaviv_iommu_domain *domain;
45 enum etnaviv_iommu_version version;
47 /* memory manager for GPU address area */
49 struct list_head mappings;
54 struct etnaviv_gem_object;
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);
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,
65 void etnaviv_iommu_put_suballoc_va(struct etnaviv_gpu *gpu,
66 struct drm_mm_node *vram_node, size_t size,
69 size_t etnaviv_iommu_dump_size(struct etnaviv_iommu *iommu);
70 void etnaviv_iommu_dump(struct etnaviv_iommu *iommu, void *buf);
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);
76 #endif /* __ETNAVIV_MMU_H__ */