1 /* 2 * Copyright (C) 2015 Etnaviv Project 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 as published by 6 * the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * more details. 12 * 13 * You should have received a copy of the GNU General Public License along with 14 * this program. If not, see <http://www.gnu.org/licenses/>. 15 */ 16 17 #ifndef __ETNAVIV_MMU_H__ 18 #define __ETNAVIV_MMU_H__ 19 20 #define ETNAVIV_PROT_READ (1 << 0) 21 #define ETNAVIV_PROT_WRITE (1 << 1) 22 23 enum etnaviv_iommu_version { 24 ETNAVIV_IOMMU_V1 = 0, 25 ETNAVIV_IOMMU_V2, 26 }; 27 28 struct etnaviv_gpu; 29 struct etnaviv_vram_mapping; 30 struct etnaviv_iommu_domain; 31 32 struct etnaviv_iommu_domain_ops { 33 void (*free)(struct etnaviv_iommu_domain *); 34 int (*map)(struct etnaviv_iommu_domain *domain, unsigned long iova, 35 phys_addr_t paddr, size_t size, int prot); 36 size_t (*unmap)(struct etnaviv_iommu_domain *domain, unsigned long iova, 37 size_t size); 38 size_t (*dump_size)(struct etnaviv_iommu_domain *); 39 void (*dump)(struct etnaviv_iommu_domain *, void *); 40 }; 41 42 struct etnaviv_iommu_domain { 43 struct device *dev; 44 void *bad_page_cpu; 45 dma_addr_t bad_page_dma; 46 u64 base; 47 u64 size; 48 49 const struct etnaviv_iommu_domain_ops *ops; 50 }; 51 52 struct etnaviv_iommu { 53 struct etnaviv_gpu *gpu; 54 struct etnaviv_iommu_domain *domain; 55 56 enum etnaviv_iommu_version version; 57 58 /* memory manager for GPU address area */ 59 struct mutex lock; 60 struct list_head mappings; 61 struct drm_mm mm; 62 u32 last_iova; 63 bool need_flush; 64 }; 65 66 struct etnaviv_gem_object; 67 68 int etnaviv_iommu_map_gem(struct etnaviv_iommu *mmu, 69 struct etnaviv_gem_object *etnaviv_obj, u32 memory_base, 70 struct etnaviv_vram_mapping *mapping); 71 void etnaviv_iommu_unmap_gem(struct etnaviv_iommu *mmu, 72 struct etnaviv_vram_mapping *mapping); 73 74 int etnaviv_iommu_get_suballoc_va(struct etnaviv_gpu *gpu, dma_addr_t paddr, 75 struct drm_mm_node *vram_node, size_t size, 76 u32 *iova); 77 void etnaviv_iommu_put_suballoc_va(struct etnaviv_gpu *gpu, 78 struct drm_mm_node *vram_node, size_t size, 79 u32 iova); 80 81 size_t etnaviv_iommu_dump_size(struct etnaviv_iommu *iommu); 82 void etnaviv_iommu_dump(struct etnaviv_iommu *iommu, void *buf); 83 84 struct etnaviv_iommu *etnaviv_iommu_new(struct etnaviv_gpu *gpu); 85 void etnaviv_iommu_destroy(struct etnaviv_iommu *iommu); 86 void etnaviv_iommu_restore(struct etnaviv_gpu *gpu); 87 88 #endif /* __ETNAVIV_MMU_H__ */ 89