Lines Matching refs:context
16 static void etnaviv_context_unmap(struct etnaviv_iommu_context *context, in etnaviv_context_unmap() argument
29 unmapped_page = context->global->ops->unmap(context, iova, in etnaviv_context_unmap()
39 static int etnaviv_context_map(struct etnaviv_iommu_context *context, in etnaviv_context_map() argument
55 ret = context->global->ops->map(context, iova, paddr, pgsize, in etnaviv_context_map()
67 etnaviv_context_unmap(context, orig_iova, orig_size - size); in etnaviv_context_map()
72 static int etnaviv_iommu_map(struct etnaviv_iommu_context *context, u32 iova, in etnaviv_iommu_map() argument
79 if (!context || !sgt) in etnaviv_iommu_map()
88 ret = etnaviv_context_map(context, da, pa, bytes, prot); in etnaviv_iommu_map()
98 etnaviv_context_unmap(context, iova, da - iova); in etnaviv_iommu_map()
102 static void etnaviv_iommu_unmap(struct etnaviv_iommu_context *context, u32 iova, in etnaviv_iommu_unmap() argument
112 etnaviv_context_unmap(context, da, bytes); in etnaviv_iommu_unmap()
122 static void etnaviv_iommu_remove_mapping(struct etnaviv_iommu_context *context, in etnaviv_iommu_remove_mapping() argument
127 lockdep_assert_held(&context->lock); in etnaviv_iommu_remove_mapping()
129 etnaviv_iommu_unmap(context, mapping->vram_node.start, in etnaviv_iommu_remove_mapping()
134 static int etnaviv_iommu_find_iova(struct etnaviv_iommu_context *context, in etnaviv_iommu_find_iova() argument
141 lockdep_assert_held(&context->lock); in etnaviv_iommu_find_iova()
149 ret = drm_mm_insert_node_in_range(&context->mm, node, in etnaviv_iommu_find_iova()
155 drm_mm_scan_init(&scan, &context->mm, size, 0, 0, mode); in etnaviv_iommu_find_iova()
159 list_for_each_entry(free, &context->mappings, mmu_node) { in etnaviv_iommu_find_iova()
201 etnaviv_iommu_remove_mapping(context, m); in etnaviv_iommu_find_iova()
202 etnaviv_iommu_context_put(m->context); in etnaviv_iommu_find_iova()
203 m->context = NULL; in etnaviv_iommu_find_iova()
219 static int etnaviv_iommu_insert_exact(struct etnaviv_iommu_context *context, in etnaviv_iommu_insert_exact() argument
222 lockdep_assert_held(&context->lock); in etnaviv_iommu_insert_exact()
224 return drm_mm_insert_node_in_range(&context->mm, node, size, 0, 0, va, in etnaviv_iommu_insert_exact()
228 int etnaviv_iommu_map_gem(struct etnaviv_iommu_context *context, in etnaviv_iommu_map_gem() argument
238 mutex_lock(&context->lock); in etnaviv_iommu_map_gem()
241 if (context->global->version == ETNAVIV_IOMMU_V1 && in etnaviv_iommu_map_gem()
248 list_add_tail(&mapping->mmu_node, &context->mappings); in etnaviv_iommu_map_gem()
257 ret = etnaviv_iommu_insert_exact(context, node, in etnaviv_iommu_map_gem()
260 ret = etnaviv_iommu_find_iova(context, node, in etnaviv_iommu_map_gem()
266 ret = etnaviv_iommu_map(context, node->start, sgt, etnaviv_obj->base.size, in etnaviv_iommu_map_gem()
274 list_add_tail(&mapping->mmu_node, &context->mappings); in etnaviv_iommu_map_gem()
275 context->flush_seq++; in etnaviv_iommu_map_gem()
277 mutex_unlock(&context->lock); in etnaviv_iommu_map_gem()
282 void etnaviv_iommu_unmap_gem(struct etnaviv_iommu_context *context, in etnaviv_iommu_unmap_gem() argument
287 mutex_lock(&context->lock); in etnaviv_iommu_unmap_gem()
290 if (mapping->vram_node.mm == &context->mm) in etnaviv_iommu_unmap_gem()
291 etnaviv_iommu_remove_mapping(context, mapping); in etnaviv_iommu_unmap_gem()
294 context->flush_seq++; in etnaviv_iommu_unmap_gem()
295 mutex_unlock(&context->lock); in etnaviv_iommu_unmap_gem()
300 struct etnaviv_iommu_context *context = in etnaviv_iommu_context_free() local
303 etnaviv_cmdbuf_suballoc_unmap(context, &context->cmdbuf_mapping); in etnaviv_iommu_context_free()
305 context->global->ops->free(context); in etnaviv_iommu_context_free()
307 void etnaviv_iommu_context_put(struct etnaviv_iommu_context *context) in etnaviv_iommu_context_put() argument
309 kref_put(&context->refcount, etnaviv_iommu_context_free); in etnaviv_iommu_context_put()
349 struct etnaviv_iommu_context *context) in etnaviv_iommu_restore() argument
351 context->global->ops->restore(gpu, context); in etnaviv_iommu_restore()
354 int etnaviv_iommu_get_suballoc_va(struct etnaviv_iommu_context *context, in etnaviv_iommu_get_suballoc_va() argument
359 mutex_lock(&context->lock); in etnaviv_iommu_get_suballoc_va()
363 mutex_unlock(&context->lock); in etnaviv_iommu_get_suballoc_va()
373 if (context->global->version == ETNAVIV_IOMMU_V1) { in etnaviv_iommu_get_suballoc_va()
379 ret = etnaviv_iommu_find_iova(context, node, size); in etnaviv_iommu_get_suballoc_va()
381 mutex_unlock(&context->lock); in etnaviv_iommu_get_suballoc_va()
386 ret = etnaviv_context_map(context, node->start, paddr, size, in etnaviv_iommu_get_suballoc_va()
390 mutex_unlock(&context->lock); in etnaviv_iommu_get_suballoc_va()
394 context->flush_seq++; in etnaviv_iommu_get_suballoc_va()
397 list_add_tail(&mapping->mmu_node, &context->mappings); in etnaviv_iommu_get_suballoc_va()
400 mutex_unlock(&context->lock); in etnaviv_iommu_get_suballoc_va()
405 void etnaviv_iommu_put_suballoc_va(struct etnaviv_iommu_context *context, in etnaviv_iommu_put_suballoc_va() argument
410 mutex_lock(&context->lock); in etnaviv_iommu_put_suballoc_va()
413 if (mapping->use > 0 || context->global->version == ETNAVIV_IOMMU_V1) { in etnaviv_iommu_put_suballoc_va()
414 mutex_unlock(&context->lock); in etnaviv_iommu_put_suballoc_va()
418 etnaviv_context_unmap(context, node->start, node->size); in etnaviv_iommu_put_suballoc_va()
420 mutex_unlock(&context->lock); in etnaviv_iommu_put_suballoc_va()
423 size_t etnaviv_iommu_dump_size(struct etnaviv_iommu_context *context) in etnaviv_iommu_dump_size() argument
425 return context->global->ops->dump_size(context); in etnaviv_iommu_dump_size()
428 void etnaviv_iommu_dump(struct etnaviv_iommu_context *context, void *buf) in etnaviv_iommu_dump() argument
430 context->global->ops->dump(context, buf); in etnaviv_iommu_dump()