Lines Matching refs:obj

42 static int msm_gem_open(struct drm_gem_object *obj, struct drm_file *file)  in msm_gem_open()  argument
44 msm_gem_vma_get(obj); in msm_gem_open()
45 update_ctx_mem(file, obj->size); in msm_gem_open()
49 static void put_iova_spaces(struct drm_gem_object *obj, struct drm_gpuvm *vm,
52 static void msm_gem_close(struct drm_gem_object *obj, struct drm_file *file) in msm_gem_close() argument
57 update_ctx_mem(file, -obj->size); in msm_gem_close()
58 msm_gem_vma_put(obj); in msm_gem_close()
80 dma_resv_wait_timeout(obj->resv, DMA_RESV_USAGE_BOOKKEEP, false, in msm_gem_close()
83 msm_gem_lock_vm_and_obj(&exec, obj, ctx->vm); in msm_gem_close()
84 put_iova_spaces(obj, ctx->vm, true, "close"); in msm_gem_close()
92 void msm_gem_vma_get(struct drm_gem_object *obj) in msm_gem_vma_get() argument
94 atomic_inc(&to_msm_bo(obj)->vma_ref); in msm_gem_vma_get()
97 void msm_gem_vma_put(struct drm_gem_object *obj) in msm_gem_vma_put() argument
99 struct msm_drm_private *priv = obj->dev->dev_private; in msm_gem_vma_put()
101 if (atomic_dec_return(&to_msm_bo(obj)->vma_ref)) in msm_gem_vma_put()
110 msm_gem_lock_vm_and_obj(&exec, obj, priv->kms->vm); in msm_gem_vma_put()
111 put_iova_spaces(obj, priv->kms->vm, true, "vma_put"); in msm_gem_vma_put()
144 static void update_lru_active(struct drm_gem_object *obj) in update_lru_active() argument
146 struct msm_drm_private *priv = obj->dev->dev_private; in update_lru_active()
147 struct msm_gem_object *msm_obj = to_msm_bo(obj); in update_lru_active()
152 drm_gem_lru_move_tail_locked(&priv->lru.pinned, obj); in update_lru_active()
154 drm_gem_lru_move_tail_locked(&priv->lru.willneed, obj); in update_lru_active()
158 drm_gem_lru_move_tail_locked(&priv->lru.dontneed, obj); in update_lru_active()
162 static void update_lru_locked(struct drm_gem_object *obj) in update_lru_locked() argument
164 struct msm_drm_private *priv = obj->dev->dev_private; in update_lru_locked()
165 struct msm_gem_object *msm_obj = to_msm_bo(obj); in update_lru_locked()
172 drm_gem_lru_move_tail_locked(&priv->lru.unbacked, obj); in update_lru_locked()
174 update_lru_active(obj); in update_lru_locked()
178 static void update_lru(struct drm_gem_object *obj) in update_lru() argument
180 struct msm_drm_private *priv = obj->dev->dev_private; in update_lru()
183 update_lru_locked(obj); in update_lru()
187 static struct page **get_pages(struct drm_gem_object *obj) in get_pages() argument
189 struct msm_gem_object *msm_obj = to_msm_bo(obj); in get_pages()
191 msm_gem_assert_locked(obj); in get_pages()
194 struct drm_device *dev = obj->dev; in get_pages()
196 size_t npages = obj->size >> PAGE_SHIFT; in get_pages()
198 p = drm_gem_get_pages(obj); in get_pages()
206 update_device_mem(dev->dev_private, obj->size); in get_pages()
210 msm_obj->sgt = drm_prime_pages_to_sg(obj->dev, p, npages); in get_pages()
225 update_lru(obj); in get_pages()
231 static void put_pages(struct drm_gem_object *obj) in put_pages() argument
233 struct msm_gem_object *msm_obj = to_msm_bo(obj); in put_pages()
239 if (kref_read(&obj->refcount)) in put_pages()
240 drm_gpuvm_bo_gem_evict(obj, true); in put_pages()
256 update_device_mem(obj->dev->dev_private, -obj->size); in put_pages()
258 drm_gem_put_pages(obj, msm_obj->pages, true, false); in put_pages()
261 update_lru(obj); in put_pages()
265 struct page **msm_gem_get_pages_locked(struct drm_gem_object *obj, unsigned madv) in msm_gem_get_pages_locked() argument
267 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_get_pages_locked()
269 msm_gem_assert_locked(obj); in msm_gem_get_pages_locked()
272 DRM_DEV_DEBUG_DRIVER(obj->dev->dev, "Invalid madv state: %u vs %u\n", in msm_gem_get_pages_locked()
277 return get_pages(obj); in msm_gem_get_pages_locked()
283 void msm_gem_pin_obj_locked(struct drm_gem_object *obj) in msm_gem_pin_obj_locked() argument
285 struct msm_drm_private *priv = obj->dev->dev_private; in msm_gem_pin_obj_locked()
287 msm_gem_assert_locked(obj); in msm_gem_pin_obj_locked()
289 to_msm_bo(obj)->pin_count++; in msm_gem_pin_obj_locked()
290 drm_gem_lru_move_tail_locked(&priv->lru.pinned, obj); in msm_gem_pin_obj_locked()
293 static void pin_obj_locked(struct drm_gem_object *obj) in pin_obj_locked() argument
295 struct msm_drm_private *priv = obj->dev->dev_private; in pin_obj_locked()
298 msm_gem_pin_obj_locked(obj); in pin_obj_locked()
302 struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj) in msm_gem_pin_pages_locked() argument
306 msm_gem_assert_locked(obj); in msm_gem_pin_pages_locked()
308 p = msm_gem_get_pages_locked(obj, MSM_MADV_WILLNEED); in msm_gem_pin_pages_locked()
310 pin_obj_locked(obj); in msm_gem_pin_pages_locked()
315 void msm_gem_unpin_pages_locked(struct drm_gem_object *obj) in msm_gem_unpin_pages_locked() argument
317 msm_gem_assert_locked(obj); in msm_gem_unpin_pages_locked()
319 msm_gem_unpin_locked(obj); in msm_gem_unpin_pages_locked()
332 struct drm_gem_object *obj = vma->vm_private_data; in msm_gem_fault() local
333 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_fault()
344 err = msm_gem_lock_interruptible(obj); in msm_gem_fault()
351 msm_gem_unlock(obj); in msm_gem_fault()
356 pages = get_pages(obj); in msm_gem_fault()
373 msm_gem_unlock(obj); in msm_gem_fault()
379 static struct drm_gpuva *lookup_vma(struct drm_gem_object *obj, in lookup_vma() argument
384 msm_gem_assert_locked(obj); in lookup_vma()
386 drm_gem_for_each_gpuvm_bo (vm_bo, obj) { in lookup_vma()
411 put_iova_spaces(struct drm_gem_object *obj, struct drm_gpuvm *vm, in put_iova_spaces() argument
416 msm_gem_assert_locked(obj); in put_iova_spaces()
418 drm_gem_for_each_gpuvm_bo_safe (vm_bo, tmp, obj) { in put_iova_spaces()
436 static struct drm_gpuva *get_vma_locked(struct drm_gem_object *obj, in get_vma_locked() argument
442 msm_gem_assert_locked(obj); in get_vma_locked()
444 vma = lookup_vma(obj, vm); in get_vma_locked()
447 vma = msm_gem_vma_new(vm, obj, 0, range_start, range_end); in get_vma_locked()
450 GEM_WARN_ON((vma->va.addr + obj->size) > range_end); in get_vma_locked()
456 int msm_gem_prot(struct drm_gem_object *obj) in msm_gem_prot() argument
458 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_prot()
473 int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct drm_gpuva *vma) in msm_gem_pin_vma_locked() argument
475 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_pin_vma_locked()
477 int prot = msm_gem_prot(obj); in msm_gem_pin_vma_locked()
479 msm_gem_assert_locked(obj); in msm_gem_pin_vma_locked()
481 pages = msm_gem_get_pages_locked(obj, MSM_MADV_WILLNEED); in msm_gem_pin_vma_locked()
488 void msm_gem_unpin_locked(struct drm_gem_object *obj) in msm_gem_unpin_locked() argument
490 struct msm_drm_private *priv = obj->dev->dev_private; in msm_gem_unpin_locked()
491 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_unpin_locked()
493 msm_gem_assert_locked(obj); in msm_gem_unpin_locked()
498 update_lru_locked(obj); in msm_gem_unpin_locked()
508 void msm_gem_unpin_active(struct drm_gem_object *obj) in msm_gem_unpin_active() argument
510 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_unpin_active()
514 update_lru_active(obj); in msm_gem_unpin_active()
517 struct drm_gpuva *msm_gem_get_vma_locked(struct drm_gem_object *obj, in msm_gem_get_vma_locked() argument
520 return get_vma_locked(obj, vm, 0, U64_MAX); in msm_gem_get_vma_locked()
523 static int get_and_pin_iova_range_locked(struct drm_gem_object *obj, in get_and_pin_iova_range_locked() argument
530 msm_gem_assert_locked(obj); in get_and_pin_iova_range_locked()
532 if (to_msm_bo(obj)->flags & MSM_BO_NO_SHARE) in get_and_pin_iova_range_locked()
535 vma = get_vma_locked(obj, vm, range_start, range_end); in get_and_pin_iova_range_locked()
539 ret = msm_gem_pin_vma_locked(obj, vma); in get_and_pin_iova_range_locked()
542 pin_obj_locked(obj); in get_and_pin_iova_range_locked()
552 int msm_gem_get_and_pin_iova_range(struct drm_gem_object *obj, in msm_gem_get_and_pin_iova_range() argument
559 msm_gem_lock_vm_and_obj(&exec, obj, vm); in msm_gem_get_and_pin_iova_range()
560 ret = get_and_pin_iova_range_locked(obj, vm, iova, range_start, range_end); in msm_gem_get_and_pin_iova_range()
567 int msm_gem_get_and_pin_iova(struct drm_gem_object *obj, struct drm_gpuvm *vm, in msm_gem_get_and_pin_iova() argument
570 return msm_gem_get_and_pin_iova_range(obj, vm, iova, 0, U64_MAX); in msm_gem_get_and_pin_iova()
577 int msm_gem_get_iova(struct drm_gem_object *obj, struct drm_gpuvm *vm, in msm_gem_get_iova() argument
584 msm_gem_lock_vm_and_obj(&exec, obj, vm); in msm_gem_get_iova()
585 vma = get_vma_locked(obj, vm, 0, U64_MAX); in msm_gem_get_iova()
596 static int clear_iova(struct drm_gem_object *obj, in clear_iova() argument
599 struct drm_gpuva *vma = lookup_vma(obj, vm); in clear_iova()
617 int msm_gem_set_iova(struct drm_gem_object *obj, in msm_gem_set_iova() argument
623 msm_gem_lock_vm_and_obj(&exec, obj, vm); in msm_gem_set_iova()
625 ret = clear_iova(obj, vm); in msm_gem_set_iova()
628 vma = get_vma_locked(obj, vm, iova, iova + obj->size); in msm_gem_set_iova()
632 clear_iova(obj, vm); in msm_gem_set_iova()
657 void msm_gem_unpin_iova(struct drm_gem_object *obj, struct drm_gpuvm *vm) in msm_gem_unpin_iova() argument
662 msm_gem_lock_vm_and_obj(&exec, obj, vm); in msm_gem_unpin_iova()
663 vma = lookup_vma(obj, vm); in msm_gem_unpin_iova()
665 msm_gem_unpin_locked(obj); in msm_gem_unpin_iova()
668 put_iova_spaces(obj, vm, true, "close"); in msm_gem_unpin_iova()
705 static void *get_vaddr(struct drm_gem_object *obj, unsigned madv) in get_vaddr() argument
707 struct msm_gem_object *msm_obj = to_msm_bo(obj); in get_vaddr()
711 msm_gem_assert_locked(obj); in get_vaddr()
713 if (drm_gem_is_imported(obj)) in get_vaddr()
716 pages = msm_gem_get_pages_locked(obj, madv); in get_vaddr()
720 pin_obj_locked(obj); in get_vaddr()
731 msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT, in get_vaddr()
743 msm_gem_unpin_locked(obj); in get_vaddr()
747 void *msm_gem_get_vaddr_locked(struct drm_gem_object *obj) in msm_gem_get_vaddr_locked() argument
749 return get_vaddr(obj, MSM_MADV_WILLNEED); in msm_gem_get_vaddr_locked()
752 void *msm_gem_get_vaddr(struct drm_gem_object *obj) in msm_gem_get_vaddr() argument
756 msm_gem_lock(obj); in msm_gem_get_vaddr()
757 ret = msm_gem_get_vaddr_locked(obj); in msm_gem_get_vaddr()
758 msm_gem_unlock(obj); in msm_gem_get_vaddr()
769 void *msm_gem_get_vaddr_active(struct drm_gem_object *obj) in msm_gem_get_vaddr_active() argument
771 return get_vaddr(obj, __MSM_MADV_PURGED); in msm_gem_get_vaddr_active()
774 void msm_gem_put_vaddr_locked(struct drm_gem_object *obj) in msm_gem_put_vaddr_locked() argument
776 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_put_vaddr_locked()
778 msm_gem_assert_locked(obj); in msm_gem_put_vaddr_locked()
782 msm_gem_unpin_locked(obj); in msm_gem_put_vaddr_locked()
785 void msm_gem_put_vaddr(struct drm_gem_object *obj) in msm_gem_put_vaddr() argument
787 msm_gem_lock(obj); in msm_gem_put_vaddr()
788 msm_gem_put_vaddr_locked(obj); in msm_gem_put_vaddr()
789 msm_gem_unlock(obj); in msm_gem_put_vaddr()
795 int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv) in msm_gem_madvise() argument
797 struct msm_drm_private *priv = obj->dev->dev_private; in msm_gem_madvise()
798 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_madvise()
800 msm_gem_lock(obj); in msm_gem_madvise()
812 update_lru_locked(obj); in msm_gem_madvise()
816 msm_gem_unlock(obj); in msm_gem_madvise()
821 void msm_gem_purge(struct drm_gem_object *obj) in msm_gem_purge() argument
823 struct drm_device *dev = obj->dev; in msm_gem_purge()
824 struct msm_drm_private *priv = obj->dev->dev_private; in msm_gem_purge()
825 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_purge()
827 msm_gem_assert_locked(obj); in msm_gem_purge()
831 put_iova_spaces(obj, NULL, false, "purge"); in msm_gem_purge()
833 msm_gem_vunmap(obj); in msm_gem_purge()
835 drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping); in msm_gem_purge()
837 put_pages(obj); in msm_gem_purge()
844 drm_gem_free_mmap_offset(obj); in msm_gem_purge()
851 shmem_truncate_range(file_inode(obj->filp), 0, (loff_t)-1); in msm_gem_purge()
853 invalidate_mapping_pages(file_inode(obj->filp)->i_mapping, in msm_gem_purge()
860 void msm_gem_evict(struct drm_gem_object *obj) in msm_gem_evict() argument
862 struct drm_device *dev = obj->dev; in msm_gem_evict()
863 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_evict()
865 msm_gem_assert_locked(obj); in msm_gem_evict()
869 put_iova_spaces(obj, NULL, false, "evict"); in msm_gem_evict()
871 drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping); in msm_gem_evict()
873 put_pages(obj); in msm_gem_evict()
876 void msm_gem_vunmap(struct drm_gem_object *obj) in msm_gem_vunmap() argument
878 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_vunmap()
880 msm_gem_assert_locked(obj); in msm_gem_vunmap()
889 bool msm_gem_active(struct drm_gem_object *obj) in msm_gem_active() argument
891 msm_gem_assert_locked(obj); in msm_gem_active()
893 if (to_msm_bo(obj)->pin_count) in msm_gem_active()
896 return !dma_resv_test_signaled(obj->resv, DMA_RESV_USAGE_BOOKKEEP); in msm_gem_active()
899 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout) in msm_gem_cpu_prep() argument
907 dma_resv_set_deadline(obj->resv, dma_resv_usage_rw(write), in msm_gem_cpu_prep()
911 ret = dma_resv_wait_timeout(obj->resv, dma_resv_usage_rw(write), in msm_gem_cpu_prep()
923 int msm_gem_cpu_fini(struct drm_gem_object *obj) in msm_gem_cpu_fini() argument
930 void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m, in msm_gem_describe() argument
933 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_describe()
934 struct dma_resv *robj = obj->resv; in msm_gem_describe()
935 uint64_t off = drm_vma_node_start(&obj->vma_node); in msm_gem_describe()
938 if (!msm_gem_trylock(obj)) in msm_gem_describe()
942 stats->all.size += obj->size; in msm_gem_describe()
944 if (msm_gem_active(obj)) { in msm_gem_describe()
946 stats->active.size += obj->size; in msm_gem_describe()
951 stats->resident.size += obj->size; in msm_gem_describe()
957 stats->purged.size += obj->size; in msm_gem_describe()
962 stats->purgeable.size += obj->size; in msm_gem_describe()
972 msm_obj->flags, msm_gem_active(obj) ? 'A' : 'I', in msm_gem_describe()
973 obj->name, kref_read(&obj->refcount), in msm_gem_describe()
976 seq_printf(m, " %08zu %9s %-32s\n", obj->size, madv, msm_obj->name); in msm_gem_describe()
978 if (!list_empty(&obj->gpuva.list)) { in msm_gem_describe()
983 drm_gem_for_each_gpuvm_bo (vm_bo, obj) { in msm_gem_describe()
1011 msm_gem_unlock(obj); in msm_gem_describe()
1021 struct drm_gem_object *obj = &msm_obj->base; in msm_gem_describe_objects() local
1023 msm_gem_describe(obj, m, &stats); in msm_gem_describe_objects()
1040 static void msm_gem_free_object(struct drm_gem_object *obj) in msm_gem_free_object() argument
1042 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_free_object()
1043 struct drm_device *dev = obj->dev; in msm_gem_free_object()
1072 if (!list_empty(&obj->gpuva.list)) { in msm_gem_free_object()
1076 drm_gem_for_each_gpuvm_bo (vm_bo, obj) { in msm_gem_free_object()
1082 put_iova_spaces(obj, NULL, true, "free"); in msm_gem_free_object()
1086 if (drm_gem_is_imported(obj)) { in msm_gem_free_object()
1094 drm_prime_gem_destroy(obj, msm_obj->sgt); in msm_gem_free_object()
1096 msm_gem_vunmap(obj); in msm_gem_free_object()
1097 put_pages(obj); in msm_gem_free_object()
1106 if ((msm_obj->flags & MSM_BO_NO_SHARE) && (obj->resv != &obj->_resv)) { in msm_gem_free_object()
1108 container_of(obj->resv, struct drm_gem_object, _resv); in msm_gem_free_object()
1114 drm_gem_object_release(obj); in msm_gem_free_object()
1120 static int msm_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) in msm_gem_object_mmap() argument
1122 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_object_mmap()
1135 struct drm_gem_object *obj; in msm_gem_new_handle() local
1138 obj = msm_gem_new(dev, size, flags); in msm_gem_new_handle()
1140 if (IS_ERR(obj)) in msm_gem_new_handle()
1141 return PTR_ERR(obj); in msm_gem_new_handle()
1144 msm_gem_object_set_name(obj, "%s", name); in msm_gem_new_handle()
1152 obj->resv = r_obj->resv; in msm_gem_new_handle()
1155 ret = drm_gem_handle_create(file, obj, handle); in msm_gem_new_handle()
1158 drm_gem_object_put(obj); in msm_gem_new_handle()
1163 static enum drm_gem_object_status msm_gem_status(struct drm_gem_object *obj) in msm_gem_status() argument
1165 struct msm_gem_object *msm_obj = to_msm_bo(obj); in msm_gem_status()
1199 struct drm_gem_object **obj) in msm_gem_new_impl() argument
1227 *obj = &msm_obj->base; in msm_gem_new_impl()
1228 (*obj)->funcs = &msm_gem_object_funcs; in msm_gem_new_impl()
1237 struct drm_gem_object *obj = NULL; in msm_gem_new() local
1248 ret = msm_gem_new_impl(dev, flags, &obj); in msm_gem_new()
1252 msm_obj = to_msm_bo(obj); in msm_gem_new()
1254 ret = drm_gem_object_init(dev, obj, size); in msm_gem_new()
1263 mapping_set_gfp_mask(obj->filp->f_mapping, GFP_HIGHUSER); in msm_gem_new()
1265 drm_gem_lru_move_tail(&priv->lru.unbacked, obj); in msm_gem_new()
1271 ret = drm_gem_create_mmap_offset(obj); in msm_gem_new()
1275 return obj; in msm_gem_new()
1278 drm_gem_object_put(obj); in msm_gem_new()
1287 struct drm_gem_object *obj; in msm_gem_import() local
1293 ret = msm_gem_new_impl(dev, MSM_BO_WC, &obj); in msm_gem_import()
1297 drm_gem_private_object_init(dev, obj, size); in msm_gem_import()
1301 msm_obj = to_msm_bo(obj); in msm_gem_import()
1302 msm_gem_lock(obj); in msm_gem_import()
1306 msm_gem_unlock(obj); in msm_gem_import()
1313 msm_gem_unlock(obj); in msm_gem_import()
1317 msm_gem_unlock(obj); in msm_gem_import()
1319 drm_gem_lru_move_tail(&priv->lru.pinned, obj); in msm_gem_import()
1325 ret = drm_gem_create_mmap_offset(obj); in msm_gem_import()
1329 return obj; in msm_gem_import()
1332 drm_gem_object_put(obj); in msm_gem_import()
1341 struct drm_gem_object *obj = msm_gem_new(dev, size, flags); in msm_gem_kernel_new() local
1344 if (IS_ERR(obj)) in msm_gem_kernel_new()
1345 return ERR_CAST(obj); in msm_gem_kernel_new()
1348 ret = msm_gem_get_and_pin_iova(obj, vm, iova); in msm_gem_kernel_new()
1353 vaddr = msm_gem_get_vaddr(obj); in msm_gem_kernel_new()
1355 msm_gem_unpin_iova(obj, vm); in msm_gem_kernel_new()
1361 *bo = obj; in msm_gem_kernel_new()
1365 drm_gem_object_put(obj); in msm_gem_kernel_new()