Lines Matching refs:etnaviv_obj

20 static void etnaviv_gem_scatter_map(struct etnaviv_gem_object *etnaviv_obj)  in etnaviv_gem_scatter_map()  argument
22 struct drm_device *dev = etnaviv_obj->base.dev; in etnaviv_gem_scatter_map()
23 struct sg_table *sgt = etnaviv_obj->sgt; in etnaviv_gem_scatter_map()
29 if (etnaviv_obj->flags & ETNA_BO_CACHE_MASK) in etnaviv_gem_scatter_map()
33 static void etnaviv_gem_scatterlist_unmap(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_scatterlist_unmap() argument
35 struct drm_device *dev = etnaviv_obj->base.dev; in etnaviv_gem_scatterlist_unmap()
36 struct sg_table *sgt = etnaviv_obj->sgt; in etnaviv_gem_scatterlist_unmap()
53 if (etnaviv_obj->flags & ETNA_BO_CACHE_MASK) in etnaviv_gem_scatterlist_unmap()
58 static int etnaviv_gem_shmem_get_pages(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_shmem_get_pages() argument
60 struct drm_device *dev = etnaviv_obj->base.dev; in etnaviv_gem_shmem_get_pages()
61 struct page **p = drm_gem_get_pages(&etnaviv_obj->base); in etnaviv_gem_shmem_get_pages()
68 etnaviv_obj->pages = p; in etnaviv_gem_shmem_get_pages()
73 static void put_pages(struct etnaviv_gem_object *etnaviv_obj) in put_pages() argument
75 if (etnaviv_obj->sgt) { in put_pages()
76 etnaviv_gem_scatterlist_unmap(etnaviv_obj); in put_pages()
77 sg_free_table(etnaviv_obj->sgt); in put_pages()
78 kfree(etnaviv_obj->sgt); in put_pages()
79 etnaviv_obj->sgt = NULL; in put_pages()
81 if (etnaviv_obj->pages) { in put_pages()
82 drm_gem_put_pages(&etnaviv_obj->base, etnaviv_obj->pages, in put_pages()
85 etnaviv_obj->pages = NULL; in put_pages()
89 struct page **etnaviv_gem_get_pages(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_get_pages() argument
93 lockdep_assert_held(&etnaviv_obj->lock); in etnaviv_gem_get_pages()
95 if (!etnaviv_obj->pages) { in etnaviv_gem_get_pages()
96 ret = etnaviv_obj->ops->get_pages(etnaviv_obj); in etnaviv_gem_get_pages()
101 if (!etnaviv_obj->sgt) { in etnaviv_gem_get_pages()
102 struct drm_device *dev = etnaviv_obj->base.dev; in etnaviv_gem_get_pages()
103 unsigned int npages = etnaviv_obj->base.size >> PAGE_SHIFT; in etnaviv_gem_get_pages()
106 sgt = drm_prime_pages_to_sg(dev, etnaviv_obj->pages, npages); in etnaviv_gem_get_pages()
113 etnaviv_obj->sgt = sgt; in etnaviv_gem_get_pages()
115 etnaviv_gem_scatter_map(etnaviv_obj); in etnaviv_gem_get_pages()
118 return etnaviv_obj->pages; in etnaviv_gem_get_pages()
121 void etnaviv_gem_put_pages(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_put_pages() argument
123 lockdep_assert_held(&etnaviv_obj->lock); in etnaviv_gem_put_pages()
127 static int etnaviv_gem_mmap_obj(struct etnaviv_gem_object *etnaviv_obj, in etnaviv_gem_mmap_obj() argument
136 if (etnaviv_obj->flags & ETNA_BO_WC) { in etnaviv_gem_mmap_obj()
138 } else if (etnaviv_obj->flags & ETNA_BO_UNCACHED) { in etnaviv_gem_mmap_obj()
147 vma_set_file(vma, etnaviv_obj->base.filp); in etnaviv_gem_mmap_obj()
157 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_mmap() local
159 return etnaviv_obj->ops->mmap(etnaviv_obj, vma); in etnaviv_gem_mmap()
166 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_fault() local
177 err = mutex_lock_interruptible(&etnaviv_obj->lock); in etnaviv_gem_fault()
181 pages = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_fault()
182 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_fault()
230 struct etnaviv_gem_object *etnaviv_obj = mapping->object; in etnaviv_gem_mapping_unreference() local
232 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_mapping_unreference()
235 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_mapping_unreference()
237 drm_gem_object_put(&etnaviv_obj->base); in etnaviv_gem_mapping_unreference()
244 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_mapping_get() local
249 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_mapping_get()
250 mapping = etnaviv_gem_get_vram_mapping(etnaviv_obj, mmu_context); in etnaviv_gem_mapping_get()
278 pages = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_mapping_get()
288 mapping = etnaviv_gem_get_vram_mapping(etnaviv_obj, NULL); in etnaviv_gem_mapping_get()
297 mapping->object = etnaviv_obj; in etnaviv_gem_mapping_get()
304 ret = etnaviv_iommu_map_gem(mmu_context, etnaviv_obj, in etnaviv_gem_mapping_get()
310 list_add_tail(&mapping->obj_node, &etnaviv_obj->vram_list); in etnaviv_gem_mapping_get()
313 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_mapping_get()
325 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_vmap() local
327 if (etnaviv_obj->vaddr) in etnaviv_gem_vmap()
328 return etnaviv_obj->vaddr; in etnaviv_gem_vmap()
330 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_vmap()
335 if (!etnaviv_obj->vaddr) in etnaviv_gem_vmap()
336 etnaviv_obj->vaddr = etnaviv_obj->ops->vmap(etnaviv_obj); in etnaviv_gem_vmap()
337 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_vmap()
339 return etnaviv_obj->vaddr; in etnaviv_gem_vmap()
371 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_cpu_prep() local
376 if (!etnaviv_obj->sgt) { in etnaviv_gem_cpu_prep()
379 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_cpu_prep()
380 ret = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_cpu_prep()
381 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_cpu_prep()
399 if (etnaviv_obj->flags & ETNA_BO_CACHED) { in etnaviv_gem_cpu_prep()
400 dma_sync_sgtable_for_cpu(dev->dev, etnaviv_obj->sgt, in etnaviv_gem_cpu_prep()
402 etnaviv_obj->last_cpu_prep_op = op; in etnaviv_gem_cpu_prep()
411 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_cpu_fini() local
413 if (etnaviv_obj->flags & ETNA_BO_CACHED) { in etnaviv_gem_cpu_fini()
415 WARN_ON(etnaviv_obj->last_cpu_prep_op == 0); in etnaviv_gem_cpu_fini()
416 dma_sync_sgtable_for_device(dev->dev, etnaviv_obj->sgt, in etnaviv_gem_cpu_fini()
417 etnaviv_op_to_dma_dir(etnaviv_obj->last_cpu_prep_op)); in etnaviv_gem_cpu_fini()
418 etnaviv_obj->last_cpu_prep_op = 0; in etnaviv_gem_cpu_fini()
427 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_wait_bo() local
429 return etnaviv_gpu_wait_obj_inactive(gpu, etnaviv_obj, timeout); in etnaviv_gem_wait_bo()
435 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_describe() local
441 etnaviv_obj->flags, is_active(etnaviv_obj) ? 'A' : 'I', in etnaviv_gem_describe()
443 off, etnaviv_obj->vaddr, obj->size); in etnaviv_gem_describe()
456 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_describe_objects() local
461 list_for_each_entry(etnaviv_obj, &priv->gem_list, gem_node) { in etnaviv_gem_describe_objects()
462 struct drm_gem_object *obj = &etnaviv_obj->base; in etnaviv_gem_describe_objects()
475 static void etnaviv_gem_shmem_release(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_shmem_release() argument
477 vunmap(etnaviv_obj->vaddr); in etnaviv_gem_shmem_release()
478 put_pages(etnaviv_obj); in etnaviv_gem_shmem_release()
490 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_free_object() local
495 WARN_ON(is_active(etnaviv_obj)); in etnaviv_gem_free_object()
498 list_del(&etnaviv_obj->gem_node); in etnaviv_gem_free_object()
501 list_for_each_entry_safe(mapping, tmp, &etnaviv_obj->vram_list, in etnaviv_gem_free_object()
514 etnaviv_obj->ops->release(etnaviv_obj); in etnaviv_gem_free_object()
517 kfree(etnaviv_obj); in etnaviv_gem_free_object()
523 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_obj_add() local
526 list_add_tail(&etnaviv_obj->gem_node, &priv->gem_list); in etnaviv_gem_obj_add()
549 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_new_impl() local
550 unsigned sz = sizeof(*etnaviv_obj); in etnaviv_gem_new_impl()
569 etnaviv_obj = kzalloc(sz, GFP_KERNEL); in etnaviv_gem_new_impl()
570 if (!etnaviv_obj) in etnaviv_gem_new_impl()
573 etnaviv_obj->flags = flags; in etnaviv_gem_new_impl()
574 etnaviv_obj->ops = ops; in etnaviv_gem_new_impl()
576 mutex_init(&etnaviv_obj->lock); in etnaviv_gem_new_impl()
577 INIT_LIST_HEAD(&etnaviv_obj->vram_list); in etnaviv_gem_new_impl()
579 *obj = &etnaviv_obj->base; in etnaviv_gem_new_impl()
641 static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_userptr_get_pages() argument
644 struct etnaviv_gem_userptr *userptr = &etnaviv_obj->userptr; in etnaviv_gem_userptr_get_pages()
645 int ret, pinned = 0, npages = etnaviv_obj->base.size >> PAGE_SHIFT; in etnaviv_gem_userptr_get_pages()
676 etnaviv_obj->pages = pvec; in etnaviv_gem_userptr_get_pages()
681 static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_userptr_release() argument
683 if (etnaviv_obj->sgt) { in etnaviv_gem_userptr_release()
684 etnaviv_gem_scatterlist_unmap(etnaviv_obj); in etnaviv_gem_userptr_release()
685 sg_free_table(etnaviv_obj->sgt); in etnaviv_gem_userptr_release()
686 kfree(etnaviv_obj->sgt); in etnaviv_gem_userptr_release()
688 if (etnaviv_obj->pages) { in etnaviv_gem_userptr_release()
689 int npages = etnaviv_obj->base.size >> PAGE_SHIFT; in etnaviv_gem_userptr_release()
691 unpin_user_pages(etnaviv_obj->pages, npages); in etnaviv_gem_userptr_release()
692 kvfree(etnaviv_obj->pages); in etnaviv_gem_userptr_release()
696 static int etnaviv_gem_userptr_mmap_obj(struct etnaviv_gem_object *etnaviv_obj, in etnaviv_gem_userptr_mmap_obj() argument
712 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_new_userptr() local
716 &etnaviv_gem_userptr_ops, &etnaviv_obj); in etnaviv_gem_new_userptr()
720 lockdep_set_class(&etnaviv_obj->lock, &etnaviv_userptr_lock_class); in etnaviv_gem_new_userptr()
722 etnaviv_obj->userptr.ptr = ptr; in etnaviv_gem_new_userptr()
723 etnaviv_obj->userptr.mm = current->mm; in etnaviv_gem_new_userptr()
724 etnaviv_obj->userptr.ro = !(flags & ETNA_USERPTR_WRITE); in etnaviv_gem_new_userptr()
726 etnaviv_gem_obj_add(dev, &etnaviv_obj->base); in etnaviv_gem_new_userptr()
728 ret = drm_gem_handle_create(file, &etnaviv_obj->base, handle); in etnaviv_gem_new_userptr()
731 drm_gem_object_put(&etnaviv_obj->base); in etnaviv_gem_new_userptr()