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 #include <linux/iommu.h> 21 22 enum etnaviv_iommu_version { 23 ETNAVIV_IOMMU_V1 = 0, 24 ETNAVIV_IOMMU_V2, 25 }; 26 27 struct etnaviv_gpu; 28 struct etnaviv_vram_mapping; 29 30 struct etnaviv_iommu_ops { 31 struct iommu_ops ops; 32 size_t (*dump_size)(struct iommu_domain *); 33 void (*dump)(struct iommu_domain *, void *); 34 }; 35 36 struct etnaviv_iommu { 37 struct etnaviv_gpu *gpu; 38 struct iommu_domain *domain; 39 40 enum etnaviv_iommu_version version; 41 42 /* memory manager for GPU address area */ 43 struct mutex lock; 44 struct list_head mappings; 45 struct drm_mm mm; 46 u32 last_iova; 47 bool need_flush; 48 }; 49 50 struct etnaviv_gem_object; 51 52 int etnaviv_iommu_attach(struct etnaviv_iommu *iommu, const char **names, 53 int cnt); 54 int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova, 55 struct sg_table *sgt, unsigned len, int prot); 56 int etnaviv_iommu_unmap(struct etnaviv_iommu *iommu, u32 iova, 57 struct sg_table *sgt, unsigned len); 58 int etnaviv_iommu_map_gem(struct etnaviv_iommu *mmu, 59 struct etnaviv_gem_object *etnaviv_obj, u32 memory_base, 60 struct etnaviv_vram_mapping *mapping); 61 void etnaviv_iommu_unmap_gem(struct etnaviv_iommu *mmu, 62 struct etnaviv_vram_mapping *mapping); 63 void etnaviv_iommu_destroy(struct etnaviv_iommu *iommu); 64 65 size_t etnaviv_iommu_dump_size(struct etnaviv_iommu *iommu); 66 void etnaviv_iommu_dump(struct etnaviv_iommu *iommu, void *buf); 67 68 struct etnaviv_iommu *etnaviv_iommu_new(struct etnaviv_gpu *gpu, 69 struct iommu_domain *domain, enum etnaviv_iommu_version version); 70 71 #endif /* __ETNAVIV_MMU_H__ */ 72