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 int npages = etnaviv_obj->base.size >> PAGE_SHIFT; in etnaviv_gem_get_pages()
106 sgt = drm_prime_pages_to_sg(etnaviv_obj->base.dev, in etnaviv_gem_get_pages()
107 etnaviv_obj->pages, npages); in etnaviv_gem_get_pages()
114 etnaviv_obj->sgt = sgt; in etnaviv_gem_get_pages()
116 etnaviv_gem_scatter_map(etnaviv_obj); in etnaviv_gem_get_pages()
119 return etnaviv_obj->pages; in etnaviv_gem_get_pages()
122 void etnaviv_gem_put_pages(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_put_pages() argument
124 lockdep_assert_held(&etnaviv_obj->lock); in etnaviv_gem_put_pages()
128 static int etnaviv_gem_mmap_obj(struct etnaviv_gem_object *etnaviv_obj, in etnaviv_gem_mmap_obj() argument
137 if (etnaviv_obj->flags & ETNA_BO_WC) { in etnaviv_gem_mmap_obj()
139 } else if (etnaviv_obj->flags & ETNA_BO_UNCACHED) { in etnaviv_gem_mmap_obj()
148 vma_set_file(vma, etnaviv_obj->base.filp); in etnaviv_gem_mmap_obj()
158 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_mmap() local
160 return etnaviv_obj->ops->mmap(etnaviv_obj, vma); in etnaviv_gem_mmap()
167 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_fault() local
178 err = mutex_lock_interruptible(&etnaviv_obj->lock); in etnaviv_gem_fault()
182 pages = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_fault()
183 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_fault()
231 struct etnaviv_gem_object *etnaviv_obj = mapping->object; in etnaviv_gem_mapping_unreference() local
233 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_mapping_unreference()
236 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_mapping_unreference()
238 drm_gem_object_put(&etnaviv_obj->base); in etnaviv_gem_mapping_unreference()
245 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_mapping_get() local
250 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_mapping_get()
251 mapping = etnaviv_gem_get_vram_mapping(etnaviv_obj, mmu_context); in etnaviv_gem_mapping_get()
279 pages = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_mapping_get()
289 mapping = etnaviv_gem_get_vram_mapping(etnaviv_obj, NULL); in etnaviv_gem_mapping_get()
298 mapping->object = etnaviv_obj; in etnaviv_gem_mapping_get()
305 ret = etnaviv_iommu_map_gem(mmu_context, etnaviv_obj, in etnaviv_gem_mapping_get()
311 list_add_tail(&mapping->obj_node, &etnaviv_obj->vram_list); in etnaviv_gem_mapping_get()
314 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_mapping_get()
326 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_vmap() local
328 if (etnaviv_obj->vaddr) in etnaviv_gem_vmap()
329 return etnaviv_obj->vaddr; in etnaviv_gem_vmap()
331 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_vmap()
336 if (!etnaviv_obj->vaddr) in etnaviv_gem_vmap()
337 etnaviv_obj->vaddr = etnaviv_obj->ops->vmap(etnaviv_obj); in etnaviv_gem_vmap()
338 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_vmap()
340 return etnaviv_obj->vaddr; in etnaviv_gem_vmap()
370 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_cpu_prep() local
375 if (!etnaviv_obj->sgt) { in etnaviv_gem_cpu_prep()
378 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_cpu_prep()
379 ret = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_cpu_prep()
380 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_cpu_prep()
398 if (etnaviv_obj->flags & ETNA_BO_CACHED) { in etnaviv_gem_cpu_prep()
399 dma_sync_sgtable_for_cpu(dev->dev, etnaviv_obj->sgt, in etnaviv_gem_cpu_prep()
401 etnaviv_obj->last_cpu_prep_op = op; in etnaviv_gem_cpu_prep()
410 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_cpu_fini() local
412 if (etnaviv_obj->flags & ETNA_BO_CACHED) { in etnaviv_gem_cpu_fini()
414 WARN_ON(etnaviv_obj->last_cpu_prep_op == 0); in etnaviv_gem_cpu_fini()
415 dma_sync_sgtable_for_device(dev->dev, etnaviv_obj->sgt, in etnaviv_gem_cpu_fini()
416 etnaviv_op_to_dma_dir(etnaviv_obj->last_cpu_prep_op)); in etnaviv_gem_cpu_fini()
417 etnaviv_obj->last_cpu_prep_op = 0; in etnaviv_gem_cpu_fini()
426 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_wait_bo() local
428 return etnaviv_gpu_wait_obj_inactive(gpu, etnaviv_obj, timeout); in etnaviv_gem_wait_bo()
434 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_describe() local
440 etnaviv_obj->flags, is_active(etnaviv_obj) ? 'A' : 'I', in etnaviv_gem_describe()
442 off, etnaviv_obj->vaddr, obj->size); in etnaviv_gem_describe()
455 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_describe_objects() local
460 list_for_each_entry(etnaviv_obj, &priv->gem_list, gem_node) { in etnaviv_gem_describe_objects()
461 struct drm_gem_object *obj = &etnaviv_obj->base; in etnaviv_gem_describe_objects()
474 static void etnaviv_gem_shmem_release(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_shmem_release() argument
476 vunmap(etnaviv_obj->vaddr); in etnaviv_gem_shmem_release()
477 put_pages(etnaviv_obj); in etnaviv_gem_shmem_release()
489 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_free_object() local
494 WARN_ON(is_active(etnaviv_obj)); in etnaviv_gem_free_object()
497 list_del(&etnaviv_obj->gem_node); in etnaviv_gem_free_object()
500 list_for_each_entry_safe(mapping, tmp, &etnaviv_obj->vram_list, in etnaviv_gem_free_object()
513 etnaviv_obj->ops->release(etnaviv_obj); in etnaviv_gem_free_object()
516 kfree(etnaviv_obj); in etnaviv_gem_free_object()
522 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_obj_add() local
525 list_add_tail(&etnaviv_obj->gem_node, &priv->gem_list); in etnaviv_gem_obj_add()
548 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_new_impl() local
549 unsigned sz = sizeof(*etnaviv_obj); in etnaviv_gem_new_impl()
568 etnaviv_obj = kzalloc(sz, GFP_KERNEL); in etnaviv_gem_new_impl()
569 if (!etnaviv_obj) in etnaviv_gem_new_impl()
572 etnaviv_obj->flags = flags; in etnaviv_gem_new_impl()
573 etnaviv_obj->ops = ops; in etnaviv_gem_new_impl()
575 mutex_init(&etnaviv_obj->lock); in etnaviv_gem_new_impl()
576 INIT_LIST_HEAD(&etnaviv_obj->vram_list); in etnaviv_gem_new_impl()
578 *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()