Lines Matching defs:obj
119 * @obj: drm_gem_object to initialize
126 struct drm_gem_object *obj, size_t size)
130 drm_gem_private_object_init(dev, obj, size);
136 obj->filp = filp;
145 * @obj: drm_gem_object to initialize
153 struct drm_gem_object *obj, size_t size)
157 obj->dev = dev;
158 obj->filp = NULL;
160 kref_init(&obj->refcount);
161 obj->handle_count = 0;
162 obj->size = size;
163 dma_resv_init(&obj->_resv);
164 if (!obj->resv)
165 obj->resv = &obj->_resv;
168 drm_gem_gpuva_init(obj);
170 drm_vma_node_reset(&obj->vma_node);
171 INIT_LIST_HEAD(&obj->lru_node);
177 * @obj: drm_gem_object
181 void drm_gem_private_object_fini(struct drm_gem_object *obj)
183 WARN_ON(obj->dma_buf);
185 dma_resv_fini(&obj->_resv);
191 * @obj: GEM object to clean up.
199 static void drm_gem_object_handle_free(struct drm_gem_object *obj)
201 struct drm_device *dev = obj->dev;
204 if (obj->name) {
205 idr_remove(&dev->object_name_idr, obj->name);
206 obj->name = 0;
210 static void drm_gem_object_exported_dma_buf_free(struct drm_gem_object *obj)
213 if (obj->dma_buf) {
214 dma_buf_put(obj->dma_buf);
215 obj->dma_buf = NULL;
220 drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj)
222 struct drm_device *dev = obj->dev;
225 if (WARN_ON(READ_ONCE(obj->handle_count) == 0))
235 if (--obj->handle_count == 0) {
236 drm_gem_object_handle_free(obj);
237 drm_gem_object_exported_dma_buf_free(obj);
243 drm_gem_object_put(obj);
254 struct drm_gem_object *obj = ptr;
256 if (obj->funcs->close)
257 obj->funcs->close(obj, file_priv);
260 drm_vma_node_revoke(&obj->vma_node, file_priv);
262 drm_gem_object_handle_put_unlocked(obj);
279 struct drm_gem_object *obj;
284 obj = idr_replace(&filp->object_idr, NULL, handle);
286 if (IS_ERR_OR_NULL(obj))
290 drm_gem_object_release_handle(handle, obj, filp);
317 struct drm_gem_object *obj;
320 obj = drm_gem_object_lookup(file, handle);
321 if (!obj)
325 if (obj->import_attach) {
330 ret = drm_gem_create_mmap_offset(obj);
334 *offset = drm_vma_node_offset_addr(&obj->vma_node);
336 drm_gem_object_put(obj);
345 * @obj: object to register
358 struct drm_gem_object *obj,
361 struct drm_device *dev = obj->dev;
366 if (obj->handle_count++ == 0)
367 drm_gem_object_get(obj);
376 ret = idr_alloc(&file_priv->object_idr, obj, 1, 0, GFP_NOWAIT);
387 ret = drm_vma_node_allow(&obj->vma_node, file_priv);
391 if (obj->funcs->open) {
392 ret = obj->funcs->open(obj, file_priv);
401 drm_vma_node_revoke(&obj->vma_node, file_priv);
407 drm_gem_object_handle_put_unlocked(obj);
414 * @obj: object to register
421 * Since this publishes @obj to userspace it must be fully set up by this point,
425 struct drm_gem_object *obj,
428 mutex_lock(&obj->dev->object_name_lock);
430 return drm_gem_handle_create_tail(file_priv, obj, handlep);
437 * @obj: obj in question
446 drm_gem_free_mmap_offset(struct drm_gem_object *obj)
448 struct drm_device *dev = obj->dev;
450 drm_vma_offset_remove(dev->vma_offset_manager, &obj->vma_node);
456 * @obj: obj in question
464 * This routine allocates and attaches a fake offset for @obj, in cases where
472 drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size)
474 struct drm_device *dev = obj->dev;
476 return drm_vma_offset_add(dev->vma_offset_manager, &obj->vma_node,
483 * @obj: obj in question
490 * This routine allocates and attaches a fake offset for @obj.
492 * Drivers can call drm_gem_free_mmap_offset() before freeing @obj to release
495 int drm_gem_create_mmap_offset(struct drm_gem_object *obj)
497 return drm_gem_create_mmap_offset_size(obj, obj->size);
515 * @obj: obj in question
537 struct page **drm_gem_get_pages(struct drm_gem_object *obj)
545 if (WARN_ON(!obj->filp))
549 mapping = obj->filp->f_mapping;
555 WARN_ON((obj->size & (PAGE_SIZE - 1)) != 0);
557 npages = obj->size >> PAGE_SHIFT;
607 * @obj: obj in question
612 void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
619 mapping = file_inode(obj->filp)->i_mapping;
626 WARN_ON((obj->size & (PAGE_SIZE - 1)) != 0);
628 npages = obj->size >> PAGE_SHIFT;
660 struct drm_gem_object *obj;
666 obj = idr_find(&filp->object_idr, handle[i]);
667 if (!obj) {
671 drm_gem_object_get(obj);
672 objs[i] = obj;
750 struct drm_gem_object *obj = NULL;
752 objects_lookup(filp, &handle, 1, &obj);
753 return obj;
774 struct drm_gem_object *obj;
776 obj = drm_gem_object_lookup(filep, handle);
777 if (!obj) {
782 ret = dma_resv_wait_timeout(obj->resv, dma_resv_usage_rw(wait_all),
789 drm_gem_object_put(obj);
834 struct drm_gem_object *obj;
840 obj = drm_gem_object_lookup(file_priv, args->handle);
841 if (obj == NULL)
846 if (obj->handle_count == 0) {
851 if (!obj->name) {
852 ret = idr_alloc(&dev->object_name_idr, obj, 1, 0, GFP_KERNEL);
856 obj->name = ret;
859 args->name = (uint64_t) obj->name;
864 drm_gem_object_put(obj);
884 struct drm_gem_object *obj;
892 obj = idr_find(&dev->object_name_idr, (int) args->name);
893 if (obj) {
894 drm_gem_object_get(obj);
901 ret = drm_gem_handle_create_tail(file_priv, obj, &handle);
906 args->size = obj->size;
909 drm_gem_object_put(obj);
947 * @obj: GEM buffer object
949 * This releases any structures and resources used by @obj and is the inverse of
953 drm_gem_object_release(struct drm_gem_object *obj)
955 if (obj->filp)
956 fput(obj->filp);
958 drm_gem_private_object_fini(obj);
960 drm_gem_free_mmap_offset(obj);
961 drm_gem_lru_remove(obj);
976 struct drm_gem_object *obj =
979 if (WARN_ON(!obj->funcs->free))
982 obj->funcs->free(obj);
995 struct drm_gem_object *obj = vma->vm_private_data;
997 drm_gem_object_get(obj);
1010 struct drm_gem_object *obj = vma->vm_private_data;
1012 drm_gem_object_put(obj);
1018 * @obj: the GEM object to map
1040 int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
1055 drm_gem_object_get(obj);
1057 vma->vm_private_data = obj;
1058 vma->vm_ops = obj->funcs->vm_ops;
1060 if (obj->funcs->mmap) {
1061 ret = obj->funcs->mmap(obj, vma);
1079 drm_gem_object_put(obj);
1103 struct drm_gem_object *obj = NULL;
1115 obj = container_of(node, struct drm_gem_object, vma_node);
1126 if (!kref_get_unless_zero(&obj->refcount))
1127 obj = NULL;
1131 if (!obj)
1135 drm_gem_object_put(obj);
1139 ret = drm_gem_mmap_obj(obj, drm_vma_node_size(node) << PAGE_SHIFT,
1142 drm_gem_object_put(obj);
1149 const struct drm_gem_object *obj)
1151 drm_printf_indent(p, indent, "name=%d\n", obj->name);
1153 kref_read(&obj->refcount));
1155 drm_vma_node_start(&obj->vma_node));
1156 drm_printf_indent(p, indent, "size=%zu\n", obj->size);
1158 str_yes_no(obj->import_attach));
1160 if (obj->funcs->print_info)
1161 obj->funcs->print_info(p, indent, obj);
1164 int drm_gem_pin(struct drm_gem_object *obj)
1166 if (obj->funcs->pin)
1167 return obj->funcs->pin(obj);
1172 void drm_gem_unpin(struct drm_gem_object *obj)
1174 if (obj->funcs->unpin)
1175 obj->funcs->unpin(obj);
1178 int drm_gem_vmap(struct drm_gem_object *obj, struct iosys_map *map)
1182 dma_resv_assert_held(obj->resv);
1184 if (!obj->funcs->vmap)
1187 ret = obj->funcs->vmap(obj, map);
1197 void drm_gem_vunmap(struct drm_gem_object *obj, struct iosys_map *map)
1199 dma_resv_assert_held(obj->resv);
1204 if (obj->funcs->vunmap)
1205 obj->funcs->vunmap(obj, map);
1212 int drm_gem_vmap_unlocked(struct drm_gem_object *obj, struct iosys_map *map)
1216 dma_resv_lock(obj->resv, NULL);
1217 ret = drm_gem_vmap(obj, map);
1218 dma_resv_unlock(obj->resv);
1224 void drm_gem_vunmap_unlocked(struct drm_gem_object *obj, struct iosys_map *map)
1226 dma_resv_lock(obj->resv, NULL);
1227 drm_gem_vunmap(obj, map);
1228 dma_resv_unlock(obj->resv);
1256 struct drm_gem_object *obj = objs[contended];
1258 ret = dma_resv_lock_slow_interruptible(obj->resv,
1326 drm_gem_lru_remove_locked(struct drm_gem_object *obj)
1328 obj->lru->count -= obj->size >> PAGE_SHIFT;
1329 WARN_ON(obj->lru->count < 0);
1330 list_del(&obj->lru_node);
1331 obj->lru = NULL;
1339 * @obj: The GEM object to remove from current LRU
1342 drm_gem_lru_remove(struct drm_gem_object *obj)
1344 struct drm_gem_lru *lru = obj->lru;
1350 drm_gem_lru_remove_locked(obj);
1361 * @obj: The GEM object to move into this LRU
1364 drm_gem_lru_move_tail_locked(struct drm_gem_lru *lru, struct drm_gem_object *obj)
1368 if (obj->lru)
1369 drm_gem_lru_remove_locked(obj);
1371 lru->count += obj->size >> PAGE_SHIFT;
1372 list_add_tail(&obj->lru_node, &lru->list);
1373 obj->lru = lru;
1385 * @obj: The GEM object to move into this LRU
1388 drm_gem_lru_move_tail(struct drm_gem_lru *lru, struct drm_gem_object *obj)
1391 drm_gem_lru_move_tail_locked(lru, obj);
1415 bool (*shrink)(struct drm_gem_object *obj))
1418 struct drm_gem_object *obj;
1426 obj = list_first_entry_or_null(&lru->list, typeof(*obj), lru_node);
1428 if (!obj)
1431 drm_gem_lru_move_tail_locked(&still_in_lru, obj);
1438 if (!kref_get_unless_zero(&obj->refcount))
1451 * for this obj (ie. while it's lock is already held)
1453 if (!dma_resv_trylock(obj->resv)) {
1454 *remaining += obj->size >> PAGE_SHIFT;
1458 if (shrink(obj)) {
1459 freed += obj->size >> PAGE_SHIFT;
1466 WARN_ON(obj->lru == &still_in_lru);
1467 WARN_ON(obj->lru == lru);
1470 dma_resv_unlock(obj->resv);
1473 drm_gem_object_put(obj);
1481 list_for_each_entry (obj, &still_in_lru.list, lru_node)
1482 obj->lru = lru;
1494 * @obj: obj in question
1496 int drm_gem_evict(struct drm_gem_object *obj)
1498 dma_resv_assert_held(obj->resv);
1500 if (!dma_resv_test_signaled(obj->resv, DMA_RESV_USAGE_READ))
1503 if (obj->funcs->evict)
1504 return obj->funcs->evict(obj);