Lines Matching full:context

16 static void etnaviv_context_unmap(struct etnaviv_iommu_context *context,  in etnaviv_context_unmap()  argument
23 unmapped_page = context->global->ops->unmap(context, iova, in etnaviv_context_unmap()
33 static int etnaviv_context_map(struct etnaviv_iommu_context *context, in etnaviv_context_map() argument
43 ret = context->global->ops->map(context, iova, paddr, pgsize, in etnaviv_context_map()
55 etnaviv_context_unmap(context, orig_iova, orig_size - size); in etnaviv_context_map()
60 static int etnaviv_iommu_map(struct etnaviv_iommu_context *context, in etnaviv_iommu_map() argument
69 if (!context || !sgt) in etnaviv_iommu_map()
80 dev_err(context->global->dev, in etnaviv_iommu_map()
87 ret = etnaviv_context_map(context, da, pa, bytes, prot); in etnaviv_iommu_map()
95 context->flush_seq++; in etnaviv_iommu_map()
100 etnaviv_context_unmap(context, iova, da - iova); in etnaviv_iommu_map()
104 static void etnaviv_iommu_unmap(struct etnaviv_iommu_context *context, u32 iova, in etnaviv_iommu_unmap() argument
107 etnaviv_context_unmap(context, iova, len); in etnaviv_iommu_unmap()
109 context->flush_seq++; in etnaviv_iommu_unmap()
112 static void etnaviv_iommu_remove_mapping(struct etnaviv_iommu_context *context, in etnaviv_iommu_remove_mapping() argument
117 lockdep_assert_held(&context->lock); in etnaviv_iommu_remove_mapping()
119 etnaviv_iommu_unmap(context, mapping->vram_node.start, in etnaviv_iommu_remove_mapping()
126 struct etnaviv_iommu_context *context = mapping->context; in etnaviv_iommu_reap_mapping() local
128 lockdep_assert_held(&context->lock); in etnaviv_iommu_reap_mapping()
131 etnaviv_iommu_remove_mapping(context, mapping); in etnaviv_iommu_reap_mapping()
132 etnaviv_iommu_context_put(mapping->context); in etnaviv_iommu_reap_mapping()
133 mapping->context = NULL; in etnaviv_iommu_reap_mapping()
137 static int etnaviv_iommu_find_iova(struct etnaviv_iommu_context *context, in etnaviv_iommu_find_iova() argument
144 lockdep_assert_held(&context->lock); in etnaviv_iommu_find_iova()
152 ret = drm_mm_insert_node_in_range(&context->mm, node, in etnaviv_iommu_find_iova()
158 drm_mm_scan_init(&scan, &context->mm, size, 0, 0, mode); in etnaviv_iommu_find_iova()
162 list_for_each_entry(free, &context->mappings, mmu_node) { in etnaviv_iommu_find_iova()
219 static int etnaviv_iommu_insert_exact(struct etnaviv_iommu_context *context, in etnaviv_iommu_insert_exact() argument
227 lockdep_assert_held(&context->lock); in etnaviv_iommu_insert_exact()
229 ret = drm_mm_insert_node_in_range(&context->mm, node, size, 0, 0, va, in etnaviv_iommu_insert_exact()
240 * destroyed yet (likely due to being referenced by another context) in in etnaviv_iommu_insert_exact()
245 drm_mm_for_each_node_in_range(scan_node, &context->mm, va, va + size) { in etnaviv_iommu_insert_exact()
260 return drm_mm_insert_node_in_range(&context->mm, node, size, 0, 0, va, in etnaviv_iommu_insert_exact()
264 int etnaviv_iommu_map_gem(struct etnaviv_iommu_context *context, in etnaviv_iommu_map_gem() argument
274 mutex_lock(&context->lock); in etnaviv_iommu_map_gem()
277 if (context->global->version == ETNAVIV_IOMMU_V1 && in etnaviv_iommu_map_gem()
284 mapping->context = etnaviv_iommu_context_get(context); in etnaviv_iommu_map_gem()
285 list_add_tail(&mapping->mmu_node, &context->mappings); in etnaviv_iommu_map_gem()
294 ret = etnaviv_iommu_insert_exact(context, node, etnaviv_obj->size, va); in etnaviv_iommu_map_gem()
296 ret = etnaviv_iommu_find_iova(context, node, etnaviv_obj->size); in etnaviv_iommu_map_gem()
301 ret = etnaviv_iommu_map(context, node->start, etnaviv_obj->size, sgt, in etnaviv_iommu_map_gem()
309 mapping->context = etnaviv_iommu_context_get(context); in etnaviv_iommu_map_gem()
310 list_add_tail(&mapping->mmu_node, &context->mappings); in etnaviv_iommu_map_gem()
312 mutex_unlock(&context->lock); in etnaviv_iommu_map_gem()
317 void etnaviv_iommu_unmap_gem(struct etnaviv_iommu_context *context, in etnaviv_iommu_unmap_gem() argument
322 mutex_lock(&context->lock); in etnaviv_iommu_unmap_gem()
325 if (!mapping->context) { in etnaviv_iommu_unmap_gem()
326 mutex_unlock(&context->lock); in etnaviv_iommu_unmap_gem()
331 if (mapping->vram_node.mm == &context->mm) in etnaviv_iommu_unmap_gem()
332 etnaviv_iommu_remove_mapping(context, mapping); in etnaviv_iommu_unmap_gem()
335 mutex_unlock(&context->lock); in etnaviv_iommu_unmap_gem()
336 etnaviv_iommu_context_put(context); in etnaviv_iommu_unmap_gem()
341 struct etnaviv_iommu_context *context = in etnaviv_iommu_context_free() local
344 etnaviv_cmdbuf_suballoc_unmap(context, &context->cmdbuf_mapping); in etnaviv_iommu_context_free()
345 mutex_destroy(&context->lock); in etnaviv_iommu_context_free()
346 context->global->ops->free(context); in etnaviv_iommu_context_free()
348 void etnaviv_iommu_context_put(struct etnaviv_iommu_context *context) in etnaviv_iommu_context_put() argument
350 kref_put(&context->refcount, etnaviv_iommu_context_free); in etnaviv_iommu_context_put()
390 struct etnaviv_iommu_context *context) in etnaviv_iommu_restore() argument
392 context->global->ops->restore(gpu, context); in etnaviv_iommu_restore()
395 int etnaviv_iommu_get_suballoc_va(struct etnaviv_iommu_context *context, in etnaviv_iommu_get_suballoc_va() argument
400 mutex_lock(&context->lock); in etnaviv_iommu_get_suballoc_va()
404 mutex_unlock(&context->lock); in etnaviv_iommu_get_suballoc_va()
414 if (context->global->version == ETNAVIV_IOMMU_V1) { in etnaviv_iommu_get_suballoc_va()
420 ret = etnaviv_iommu_find_iova(context, node, size); in etnaviv_iommu_get_suballoc_va()
422 mutex_unlock(&context->lock); in etnaviv_iommu_get_suballoc_va()
427 ret = etnaviv_context_map(context, node->start, paddr, size, in etnaviv_iommu_get_suballoc_va()
431 mutex_unlock(&context->lock); in etnaviv_iommu_get_suballoc_va()
435 context->flush_seq++; in etnaviv_iommu_get_suballoc_va()
438 list_add_tail(&mapping->mmu_node, &context->mappings); in etnaviv_iommu_get_suballoc_va()
441 mutex_unlock(&context->lock); in etnaviv_iommu_get_suballoc_va()
446 void etnaviv_iommu_put_suballoc_va(struct etnaviv_iommu_context *context, in etnaviv_iommu_put_suballoc_va() argument
451 mutex_lock(&context->lock); in etnaviv_iommu_put_suballoc_va()
454 if (mapping->use > 0 || context->global->version == ETNAVIV_IOMMU_V1) { in etnaviv_iommu_put_suballoc_va()
455 mutex_unlock(&context->lock); in etnaviv_iommu_put_suballoc_va()
459 etnaviv_context_unmap(context, node->start, node->size); in etnaviv_iommu_put_suballoc_va()
461 mutex_unlock(&context->lock); in etnaviv_iommu_put_suballoc_va()
464 size_t etnaviv_iommu_dump_size(struct etnaviv_iommu_context *context) in etnaviv_iommu_dump_size() argument
466 return context->global->ops->dump_size(context); in etnaviv_iommu_dump_size()
469 void etnaviv_iommu_dump(struct etnaviv_iommu_context *context, void *buf) in etnaviv_iommu_dump() argument
471 context->global->ops->dump(context, buf); in etnaviv_iommu_dump()