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()
383 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_cpu_prep() local
388 if (!etnaviv_obj->sgt) { in etnaviv_gem_cpu_prep()
391 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_cpu_prep()
392 ret = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_cpu_prep()
393 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_cpu_prep()
411 if (etnaviv_obj->flags & ETNA_BO_CACHED) { in etnaviv_gem_cpu_prep()
412 dma_sync_sgtable_for_cpu(dev->dev, etnaviv_obj->sgt, in etnaviv_gem_cpu_prep()
414 etnaviv_obj->last_cpu_prep_op = op; in etnaviv_gem_cpu_prep()
423 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_cpu_fini() local
425 if (etnaviv_obj->flags & ETNA_BO_CACHED) { in etnaviv_gem_cpu_fini()
427 WARN_ON(etnaviv_obj->last_cpu_prep_op == 0); in etnaviv_gem_cpu_fini()
428 dma_sync_sgtable_for_device(dev->dev, etnaviv_obj->sgt, in etnaviv_gem_cpu_fini()
429 etnaviv_op_to_dma_dir(etnaviv_obj->last_cpu_prep_op)); in etnaviv_gem_cpu_fini()
430 etnaviv_obj->last_cpu_prep_op = 0; in etnaviv_gem_cpu_fini()
439 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_wait_bo() local
441 return etnaviv_gpu_wait_obj_inactive(gpu, etnaviv_obj, timeout); in etnaviv_gem_wait_bo()
447 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_describe() local
453 etnaviv_obj->flags, is_active(etnaviv_obj) ? 'A' : 'I', in etnaviv_gem_describe()
455 off, etnaviv_obj->vaddr, obj->size); in etnaviv_gem_describe()
468 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_describe_objects() local
473 list_for_each_entry(etnaviv_obj, &priv->gem_list, gem_node) { in etnaviv_gem_describe_objects()
474 struct drm_gem_object *obj = &etnaviv_obj->base; in etnaviv_gem_describe_objects()
487 static void etnaviv_gem_shmem_release(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_shmem_release() argument
489 vunmap(etnaviv_obj->vaddr); in etnaviv_gem_shmem_release()
490 put_pages(etnaviv_obj); in etnaviv_gem_shmem_release()
502 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_free_object() local
507 WARN_ON(is_active(etnaviv_obj)); in etnaviv_gem_free_object()
510 list_del(&etnaviv_obj->gem_node); in etnaviv_gem_free_object()
513 list_for_each_entry_safe(mapping, tmp, &etnaviv_obj->vram_list, in etnaviv_gem_free_object()
526 etnaviv_obj->ops->release(etnaviv_obj); in etnaviv_gem_free_object()
529 mutex_destroy(&etnaviv_obj->lock); in etnaviv_gem_free_object()
530 kfree(etnaviv_obj); in etnaviv_gem_free_object()
536 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_obj_add() local
539 list_add_tail(&etnaviv_obj->gem_node, &priv->gem_list); in etnaviv_gem_obj_add()
545 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_status() local
548 if (etnaviv_obj->pages) in etnaviv_gem_status()
574 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_new_impl() local
575 unsigned sz = sizeof(*etnaviv_obj); in etnaviv_gem_new_impl()
594 etnaviv_obj = kzalloc(sz, GFP_KERNEL); in etnaviv_gem_new_impl()
595 if (!etnaviv_obj) in etnaviv_gem_new_impl()
598 etnaviv_obj->size = ALIGN(size, SZ_4K); in etnaviv_gem_new_impl()
599 etnaviv_obj->flags = flags; in etnaviv_gem_new_impl()
600 etnaviv_obj->ops = ops; in etnaviv_gem_new_impl()
602 mutex_init(&etnaviv_obj->lock); in etnaviv_gem_new_impl()
603 INIT_LIST_HEAD(&etnaviv_obj->vram_list); in etnaviv_gem_new_impl()
605 *obj = &etnaviv_obj->base; in etnaviv_gem_new_impl()
665 static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_userptr_get_pages() argument
668 struct etnaviv_gem_userptr *userptr = &etnaviv_obj->userptr; in etnaviv_gem_userptr_get_pages()
669 int ret, pinned = 0, npages = etnaviv_obj->base.size >> PAGE_SHIFT; in etnaviv_gem_userptr_get_pages()
700 etnaviv_obj->pages = pvec; in etnaviv_gem_userptr_get_pages()
705 static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_userptr_release() argument
707 if (etnaviv_obj->sgt) { in etnaviv_gem_userptr_release()
708 etnaviv_gem_scatterlist_unmap(etnaviv_obj); in etnaviv_gem_userptr_release()
709 sg_free_table(etnaviv_obj->sgt); in etnaviv_gem_userptr_release()
710 kfree(etnaviv_obj->sgt); in etnaviv_gem_userptr_release()
712 if (etnaviv_obj->pages) { in etnaviv_gem_userptr_release()
713 unsigned int npages = etnaviv_obj->base.size >> PAGE_SHIFT; in etnaviv_gem_userptr_release()
715 unpin_user_pages(etnaviv_obj->pages, npages); in etnaviv_gem_userptr_release()
716 kvfree(etnaviv_obj->pages); in etnaviv_gem_userptr_release()
720 static int etnaviv_gem_userptr_mmap_obj(struct etnaviv_gem_object *etnaviv_obj, in etnaviv_gem_userptr_mmap_obj() argument
736 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_new_userptr() local
740 &etnaviv_gem_userptr_ops, &etnaviv_obj); in etnaviv_gem_new_userptr()
744 lockdep_set_class(&etnaviv_obj->lock, &etnaviv_userptr_lock_class); in etnaviv_gem_new_userptr()
746 etnaviv_obj->userptr.ptr = ptr; in etnaviv_gem_new_userptr()
747 etnaviv_obj->userptr.mm = current->mm; in etnaviv_gem_new_userptr()
748 etnaviv_obj->userptr.ro = !(flags & ETNA_USERPTR_WRITE); in etnaviv_gem_new_userptr()
750 etnaviv_gem_obj_add(dev, &etnaviv_obj->base); in etnaviv_gem_new_userptr()
752 ret = drm_gem_handle_create(file, &etnaviv_obj->base, handle); in etnaviv_gem_new_userptr()
755 drm_gem_object_put(&etnaviv_obj->base); in etnaviv_gem_new_userptr()