Lines Matching refs:etnaviv_obj
19 static void etnaviv_gem_scatter_map(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_scatter_map() argument
21 struct drm_device *dev = etnaviv_obj->base.dev; in etnaviv_gem_scatter_map()
22 struct sg_table *sgt = etnaviv_obj->sgt; in etnaviv_gem_scatter_map()
28 if (etnaviv_obj->flags & ETNA_BO_CACHE_MASK) in etnaviv_gem_scatter_map()
32 static void etnaviv_gem_scatterlist_unmap(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_scatterlist_unmap() argument
34 struct drm_device *dev = etnaviv_obj->base.dev; in etnaviv_gem_scatterlist_unmap()
35 struct sg_table *sgt = etnaviv_obj->sgt; in etnaviv_gem_scatterlist_unmap()
52 if (etnaviv_obj->flags & ETNA_BO_CACHE_MASK) in etnaviv_gem_scatterlist_unmap()
57 static int etnaviv_gem_shmem_get_pages(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_shmem_get_pages() argument
59 struct drm_device *dev = etnaviv_obj->base.dev; in etnaviv_gem_shmem_get_pages()
60 struct page **p = drm_gem_get_pages(&etnaviv_obj->base); in etnaviv_gem_shmem_get_pages()
67 etnaviv_obj->pages = p; in etnaviv_gem_shmem_get_pages()
72 static void put_pages(struct etnaviv_gem_object *etnaviv_obj) in put_pages() argument
74 if (etnaviv_obj->sgt) { in put_pages()
75 etnaviv_gem_scatterlist_unmap(etnaviv_obj); in put_pages()
76 sg_free_table(etnaviv_obj->sgt); in put_pages()
77 kfree(etnaviv_obj->sgt); in put_pages()
78 etnaviv_obj->sgt = NULL; in put_pages()
80 if (etnaviv_obj->pages) { in put_pages()
81 drm_gem_put_pages(&etnaviv_obj->base, etnaviv_obj->pages, in put_pages()
84 etnaviv_obj->pages = NULL; in put_pages()
88 struct page **etnaviv_gem_get_pages(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_get_pages() argument
92 lockdep_assert_held(&etnaviv_obj->lock); in etnaviv_gem_get_pages()
94 if (!etnaviv_obj->pages) { in etnaviv_gem_get_pages()
95 ret = etnaviv_obj->ops->get_pages(etnaviv_obj); in etnaviv_gem_get_pages()
100 if (!etnaviv_obj->sgt) { in etnaviv_gem_get_pages()
101 struct drm_device *dev = etnaviv_obj->base.dev; in etnaviv_gem_get_pages()
102 int npages = etnaviv_obj->base.size >> PAGE_SHIFT; in etnaviv_gem_get_pages()
105 sgt = drm_prime_pages_to_sg(etnaviv_obj->pages, npages); in etnaviv_gem_get_pages()
112 etnaviv_obj->sgt = sgt; in etnaviv_gem_get_pages()
114 etnaviv_gem_scatter_map(etnaviv_obj); in etnaviv_gem_get_pages()
117 return etnaviv_obj->pages; in etnaviv_gem_get_pages()
120 void etnaviv_gem_put_pages(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_put_pages() argument
122 lockdep_assert_held(&etnaviv_obj->lock); in etnaviv_gem_put_pages()
126 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 get_file(etnaviv_obj->base.filp); in etnaviv_gem_mmap_obj()
149 vma->vm_file = etnaviv_obj->base.filp; in etnaviv_gem_mmap_obj()
176 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_fault() local
186 err = mutex_lock_interruptible(&etnaviv_obj->lock); in etnaviv_gem_fault()
190 pages = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_fault()
191 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_fault()
239 struct etnaviv_gem_object *etnaviv_obj = mapping->object; in etnaviv_gem_mapping_reference() local
241 drm_gem_object_get(&etnaviv_obj->base); in etnaviv_gem_mapping_reference()
243 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_mapping_reference()
246 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_mapping_reference()
251 struct etnaviv_gem_object *etnaviv_obj = mapping->object; in etnaviv_gem_mapping_unreference() local
253 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_mapping_unreference()
256 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_mapping_unreference()
258 drm_gem_object_put_unlocked(&etnaviv_obj->base); in etnaviv_gem_mapping_unreference()
264 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_mapping_get() local
269 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_mapping_get()
270 mapping = etnaviv_gem_get_vram_mapping(etnaviv_obj, gpu->mmu); in etnaviv_gem_mapping_get()
293 pages = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_mapping_get()
303 mapping = etnaviv_gem_get_vram_mapping(etnaviv_obj, NULL); in etnaviv_gem_mapping_get()
312 mapping->object = etnaviv_obj; in etnaviv_gem_mapping_get()
320 ret = etnaviv_iommu_map_gem(gpu->mmu, etnaviv_obj, gpu->memory_base, in etnaviv_gem_mapping_get()
325 list_add_tail(&mapping->obj_node, &etnaviv_obj->vram_list); in etnaviv_gem_mapping_get()
328 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_mapping_get()
340 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_vmap() local
342 if (etnaviv_obj->vaddr) in etnaviv_gem_vmap()
343 return etnaviv_obj->vaddr; in etnaviv_gem_vmap()
345 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_vmap()
350 if (!etnaviv_obj->vaddr) in etnaviv_gem_vmap()
351 etnaviv_obj->vaddr = etnaviv_obj->ops->vmap(etnaviv_obj); in etnaviv_gem_vmap()
352 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_vmap()
354 return etnaviv_obj->vaddr; in etnaviv_gem_vmap()
384 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_cpu_prep() local
389 if (!etnaviv_obj->sgt) { in etnaviv_gem_cpu_prep()
392 mutex_lock(&etnaviv_obj->lock); in etnaviv_gem_cpu_prep()
393 ret = etnaviv_gem_get_pages(etnaviv_obj); in etnaviv_gem_cpu_prep()
394 mutex_unlock(&etnaviv_obj->lock); in etnaviv_gem_cpu_prep()
400 if (!reservation_object_test_signaled_rcu(etnaviv_obj->resv, in etnaviv_gem_cpu_prep()
406 ret = reservation_object_wait_timeout_rcu(etnaviv_obj->resv, in etnaviv_gem_cpu_prep()
412 if (etnaviv_obj->flags & ETNA_BO_CACHED) { in etnaviv_gem_cpu_prep()
413 dma_sync_sg_for_cpu(dev->dev, etnaviv_obj->sgt->sgl, in etnaviv_gem_cpu_prep()
414 etnaviv_obj->sgt->nents, in etnaviv_gem_cpu_prep()
416 etnaviv_obj->last_cpu_prep_op = op; in etnaviv_gem_cpu_prep()
425 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_cpu_fini() local
427 if (etnaviv_obj->flags & ETNA_BO_CACHED) { in etnaviv_gem_cpu_fini()
429 WARN_ON(etnaviv_obj->last_cpu_prep_op == 0); in etnaviv_gem_cpu_fini()
430 dma_sync_sg_for_device(dev->dev, etnaviv_obj->sgt->sgl, in etnaviv_gem_cpu_fini()
431 etnaviv_obj->sgt->nents, in etnaviv_gem_cpu_fini()
432 etnaviv_op_to_dma_dir(etnaviv_obj->last_cpu_prep_op)); in etnaviv_gem_cpu_fini()
433 etnaviv_obj->last_cpu_prep_op = 0; in etnaviv_gem_cpu_fini()
442 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_wait_bo() local
444 return etnaviv_gpu_wait_obj_inactive(gpu, etnaviv_obj, timeout); in etnaviv_gem_wait_bo()
461 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_describe() local
462 struct reservation_object *robj = etnaviv_obj->resv; in etnaviv_gem_describe()
468 etnaviv_obj->flags, is_active(etnaviv_obj) ? 'A' : 'I', in etnaviv_gem_describe()
470 off, etnaviv_obj->vaddr, obj->size); in etnaviv_gem_describe()
492 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_describe_objects() local
497 list_for_each_entry(etnaviv_obj, &priv->gem_list, gem_node) { in etnaviv_gem_describe_objects()
498 struct drm_gem_object *obj = &etnaviv_obj->base; in etnaviv_gem_describe_objects()
511 static void etnaviv_gem_shmem_release(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_shmem_release() argument
513 vunmap(etnaviv_obj->vaddr); in etnaviv_gem_shmem_release()
514 put_pages(etnaviv_obj); in etnaviv_gem_shmem_release()
526 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_free_object() local
531 WARN_ON(is_active(etnaviv_obj)); in etnaviv_gem_free_object()
534 list_del(&etnaviv_obj->gem_node); in etnaviv_gem_free_object()
537 list_for_each_entry_safe(mapping, tmp, &etnaviv_obj->vram_list, in etnaviv_gem_free_object()
551 etnaviv_obj->ops->release(etnaviv_obj); in etnaviv_gem_free_object()
552 if (etnaviv_obj->resv == &etnaviv_obj->_resv) in etnaviv_gem_free_object()
553 reservation_object_fini(&etnaviv_obj->_resv); in etnaviv_gem_free_object()
556 kfree(etnaviv_obj); in etnaviv_gem_free_object()
562 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); in etnaviv_gem_obj_add() local
565 list_add_tail(&etnaviv_obj->gem_node, &priv->gem_list); in etnaviv_gem_obj_add()
573 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_new_impl() local
574 unsigned sz = sizeof(*etnaviv_obj); in etnaviv_gem_new_impl()
593 etnaviv_obj = kzalloc(sz, GFP_KERNEL); in etnaviv_gem_new_impl()
594 if (!etnaviv_obj) in etnaviv_gem_new_impl()
597 etnaviv_obj->flags = flags; in etnaviv_gem_new_impl()
598 etnaviv_obj->ops = ops; in etnaviv_gem_new_impl()
600 etnaviv_obj->resv = robj; in etnaviv_gem_new_impl()
602 etnaviv_obj->resv = &etnaviv_obj->_resv; in etnaviv_gem_new_impl()
603 reservation_object_init(&etnaviv_obj->_resv); in etnaviv_gem_new_impl()
606 mutex_init(&etnaviv_obj->lock); in etnaviv_gem_new_impl()
607 INIT_LIST_HEAD(&etnaviv_obj->vram_list); in etnaviv_gem_new_impl()
609 *obj = &etnaviv_obj->base; in etnaviv_gem_new_impl()
678 static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_userptr_get_pages() argument
681 struct etnaviv_gem_userptr *userptr = &etnaviv_obj->userptr; in etnaviv_gem_userptr_get_pages()
682 int ret, pinned = 0, npages = etnaviv_obj->base.size >> PAGE_SHIFT; in etnaviv_gem_userptr_get_pages()
710 etnaviv_obj->pages = pvec; in etnaviv_gem_userptr_get_pages()
715 static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj) in etnaviv_gem_userptr_release() argument
717 if (etnaviv_obj->sgt) { in etnaviv_gem_userptr_release()
718 etnaviv_gem_scatterlist_unmap(etnaviv_obj); in etnaviv_gem_userptr_release()
719 sg_free_table(etnaviv_obj->sgt); in etnaviv_gem_userptr_release()
720 kfree(etnaviv_obj->sgt); in etnaviv_gem_userptr_release()
722 if (etnaviv_obj->pages) { in etnaviv_gem_userptr_release()
723 int npages = etnaviv_obj->base.size >> PAGE_SHIFT; in etnaviv_gem_userptr_release()
725 release_pages(etnaviv_obj->pages, npages); in etnaviv_gem_userptr_release()
726 kvfree(etnaviv_obj->pages); in etnaviv_gem_userptr_release()
730 static int etnaviv_gem_userptr_mmap_obj(struct etnaviv_gem_object *etnaviv_obj, in etnaviv_gem_userptr_mmap_obj() argument
746 struct etnaviv_gem_object *etnaviv_obj; in etnaviv_gem_new_userptr() local
750 &etnaviv_gem_userptr_ops, &etnaviv_obj); in etnaviv_gem_new_userptr()
754 lockdep_set_class(&etnaviv_obj->lock, &etnaviv_userptr_lock_class); in etnaviv_gem_new_userptr()
756 etnaviv_obj->userptr.ptr = ptr; in etnaviv_gem_new_userptr()
757 etnaviv_obj->userptr.mm = current->mm; in etnaviv_gem_new_userptr()
758 etnaviv_obj->userptr.ro = !(flags & ETNA_USERPTR_WRITE); in etnaviv_gem_new_userptr()
760 etnaviv_gem_obj_add(dev, &etnaviv_obj->base); in etnaviv_gem_new_userptr()
762 ret = drm_gem_handle_create(file, &etnaviv_obj->base, handle); in etnaviv_gem_new_userptr()
765 drm_gem_object_put_unlocked(&etnaviv_obj->base); in etnaviv_gem_new_userptr()