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
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()
273 pages = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_mapping_get()
283 mapping = etnaviv_gem_get_vram_mapping(etnaviv_obj, NULL); in etnaviv_gem_mapping_get()
292 mapping->object = etnaviv_obj; in etnaviv_gem_mapping_get()
300 ret = etnaviv_iommu_map_gem(mmu_context, etnaviv_obj, in etnaviv_gem_mapping_get()
307 list_add_tail(&mapping->obj_node, &etnaviv_obj->vram_list); in etnaviv_gem_mapping_get()
311 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_mapping_get()
323 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_vmap() local
325 if (etnaviv_obj->vaddr) in etnaviv_gem_vmap()
326 return etnaviv_obj->vaddr; in etnaviv_gem_vmap()
328 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_vmap()
333 if (!etnaviv_obj->vaddr) in etnaviv_gem_vmap()
334 etnaviv_obj->vaddr = etnaviv_obj->ops->vmap(etnaviv_obj); in etnaviv_gem_vmap()
335 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_vmap()
337 return etnaviv_obj->vaddr; in etnaviv_gem_vmap()
367 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_cpu_prep() local
372 if (!etnaviv_obj->sgt) { in etnaviv_gem_cpu_prep()
375 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_cpu_prep()
376 ret = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_cpu_prep()
377 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_cpu_prep()
393 if (etnaviv_obj->flags & ETNA_BO_CACHED) { in etnaviv_gem_cpu_prep()
394 dma_sync_sgtable_for_cpu(dev->dev, etnaviv_obj->sgt, in etnaviv_gem_cpu_prep()
396 etnaviv_obj->last_cpu_prep_op = op; in etnaviv_gem_cpu_prep()
405 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_cpu_fini() local
407 if (etnaviv_obj->flags & ETNA_BO_CACHED) { in etnaviv_gem_cpu_fini()
409 WARN_ON(etnaviv_obj->last_cpu_prep_op == 0); in etnaviv_gem_cpu_fini()
410 dma_sync_sgtable_for_device(dev->dev, etnaviv_obj->sgt, in etnaviv_gem_cpu_fini()
411 etnaviv_op_to_dma_dir(etnaviv_obj->last_cpu_prep_op)); in etnaviv_gem_cpu_fini()
412 etnaviv_obj->last_cpu_prep_op = 0; in etnaviv_gem_cpu_fini()
421 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_wait_bo() local
423 return etnaviv_gpu_wait_obj_inactive(gpu, etnaviv_obj, timeout); in etnaviv_gem_wait_bo()
440 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_describe() local
447 etnaviv_obj->flags, is_active(etnaviv_obj) ? 'A' : 'I', in etnaviv_gem_describe()
449 off, etnaviv_obj->vaddr, obj->size); in etnaviv_gem_describe()
471 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_describe_objects() local
476 list_for_each_entry(etnaviv_obj, &priv->gem_list, gem_node) { in etnaviv_gem_describe_objects()
477 struct drm_gem_object *obj = &etnaviv_obj->base; in etnaviv_gem_describe_objects()
490 static void etnaviv_gem_shmem_release(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_shmem_release() argument
492 vunmap(etnaviv_obj->vaddr); in etnaviv_gem_shmem_release()
493 put_pages(etnaviv_obj); in etnaviv_gem_shmem_release()
505 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_free_object() local
510 WARN_ON(is_active(etnaviv_obj)); in etnaviv_gem_free_object()
513 list_del(&etnaviv_obj->gem_node); in etnaviv_gem_free_object()
516 list_for_each_entry_safe(mapping, tmp, &etnaviv_obj->vram_list, in etnaviv_gem_free_object()
532 etnaviv_obj->ops->release(etnaviv_obj); in etnaviv_gem_free_object()
535 kfree(etnaviv_obj); in etnaviv_gem_free_object()
541 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_obj_add() local
544 list_add_tail(&etnaviv_obj->gem_node, &priv->gem_list); in etnaviv_gem_obj_add()
567 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_new_impl() local
568 unsigned sz = sizeof(*etnaviv_obj); in etnaviv_gem_new_impl()
587 etnaviv_obj = kzalloc(sz, GFP_KERNEL); in etnaviv_gem_new_impl()
588 if (!etnaviv_obj) in etnaviv_gem_new_impl()
591 etnaviv_obj->flags = flags; in etnaviv_gem_new_impl()
592 etnaviv_obj->ops = ops; in etnaviv_gem_new_impl()
594 mutex_init(&etnaviv_obj->lock); in etnaviv_gem_new_impl()
595 INIT_LIST_HEAD(&etnaviv_obj->vram_list); in etnaviv_gem_new_impl()
597 *obj = &etnaviv_obj->base; in etnaviv_gem_new_impl()
660 static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_userptr_get_pages() argument
663 struct etnaviv_gem_userptr *userptr = &etnaviv_obj->userptr; in etnaviv_gem_userptr_get_pages()
664 int ret, pinned = 0, npages = etnaviv_obj->base.size >> PAGE_SHIFT; in etnaviv_gem_userptr_get_pages()
693 etnaviv_obj->pages = pvec; in etnaviv_gem_userptr_get_pages()
698 static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_userptr_release() argument
700 if (etnaviv_obj->sgt) { in etnaviv_gem_userptr_release()
701 etnaviv_gem_scatterlist_unmap(etnaviv_obj); in etnaviv_gem_userptr_release()
702 sg_free_table(etnaviv_obj->sgt); in etnaviv_gem_userptr_release()
703 kfree(etnaviv_obj->sgt); in etnaviv_gem_userptr_release()
705 if (etnaviv_obj->pages) { in etnaviv_gem_userptr_release()
706 int npages = etnaviv_obj->base.size >> PAGE_SHIFT; in etnaviv_gem_userptr_release()
708 unpin_user_pages(etnaviv_obj->pages, npages); in etnaviv_gem_userptr_release()
709 kvfree(etnaviv_obj->pages); in etnaviv_gem_userptr_release()
713 static int etnaviv_gem_userptr_mmap_obj(struct etnaviv_gem_object *etnaviv_obj, in etnaviv_gem_userptr_mmap_obj() argument
729 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_new_userptr() local
733 &etnaviv_gem_userptr_ops, &etnaviv_obj); in etnaviv_gem_new_userptr()
737 lockdep_set_class(&etnaviv_obj->lock, &etnaviv_userptr_lock_class); in etnaviv_gem_new_userptr()
739 etnaviv_obj->userptr.ptr = ptr; in etnaviv_gem_new_userptr()
740 etnaviv_obj->userptr.mm = current->mm; in etnaviv_gem_new_userptr()
741 etnaviv_obj->userptr.ro = !(flags & ETNA_USERPTR_WRITE); in etnaviv_gem_new_userptr()
743 etnaviv_gem_obj_add(dev, &etnaviv_obj->base); in etnaviv_gem_new_userptr()
745 ret = drm_gem_handle_create(file, &etnaviv_obj->base, handle); in etnaviv_gem_new_userptr()
748 drm_gem_object_put(&etnaviv_obj->base); in etnaviv_gem_new_userptr()