Lines Matching +full:mm +full:- +full:0
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
57 #define DRM_FILE_PAGE_OFFSET_START ((0xFFFFFFFFUL >> PAGE_SHIFT) + 1)
58 #define DRM_FILE_PAGE_OFFSET_SIZE ((0xFFFFFFFFUL >> PAGE_SHIFT) * 16)
60 #define DRM_FILE_PAGE_OFFSET_START ((0xFFFFFFFUL >> PAGE_SHIFT) + 1)
61 #define DRM_FILE_PAGE_OFFSET_SIZE ((0xFFFFFFFUL >> PAGE_SHIFT) * 16)
71 struct drm_gem_mm *mm; in drm_gem_init() local
73 drm_gem_names_init(&dev->object_names); in drm_gem_init()
75 mm = malloc(sizeof(*mm), DRM_MEM_DRIVER, M_NOWAIT); in drm_gem_init()
76 if (!mm) { in drm_gem_init()
78 return -ENOMEM; in drm_gem_init()
81 dev->mm_private = mm; in drm_gem_init()
83 if (drm_ht_create(&mm->offset_hash, 19)) { in drm_gem_init()
84 free(mm, DRM_MEM_DRIVER); in drm_gem_init()
85 return -ENOMEM; in drm_gem_init()
88 mm->idxunr = new_unrhdr(0, DRM_GEM_MAX_IDX, NULL); in drm_gem_init()
90 return 0; in drm_gem_init()
96 struct drm_gem_mm *mm = dev->mm_private; in drm_gem_destroy() local
98 dev->mm_private = NULL; in drm_gem_destroy()
99 drm_ht_remove(&mm->offset_hash); in drm_gem_destroy()
100 delete_unrhdr(mm->idxunr); in drm_gem_destroy()
101 free(mm, DRM_MEM_DRIVER); in drm_gem_destroy()
102 drm_gem_names_fini(&dev->object_names); in drm_gem_destroy()
108 KASSERT((size & (PAGE_SIZE - 1)) == 0, in drm_gem_object_init()
111 obj->dev = dev; in drm_gem_object_init()
112 obj->vm_obj = vm_pager_allocate(OBJT_SWAP, NULL, size, in drm_gem_object_init()
113 VM_PROT_READ | VM_PROT_WRITE, 0, curthread->td_ucred); in drm_gem_object_init()
115 obj->refcount = 1; in drm_gem_object_init()
116 obj->handle_count = 0; in drm_gem_object_init()
117 obj->size = size; in drm_gem_object_init()
119 return 0; in drm_gem_object_init()
131 MPASS((size & (PAGE_SIZE - 1)) == 0); in drm_gem_private_object_init()
133 obj->dev = dev; in drm_gem_private_object_init()
134 obj->vm_obj = NULL; in drm_gem_private_object_init()
136 obj->refcount = 1; in drm_gem_private_object_init()
137 atomic_store_rel_int(&obj->handle_count, 0); in drm_gem_private_object_init()
138 obj->size = size; in drm_gem_private_object_init()
140 return 0; in drm_gem_private_object_init()
153 if (drm_gem_object_init(dev, obj, size) != 0) in drm_gem_object_alloc()
156 if (dev->driver->gem_init_object != NULL && in drm_gem_object_alloc()
157 dev->driver->gem_init_object(obj) != 0) { in drm_gem_object_alloc()
162 vm_object_deallocate(obj->vm_obj); in drm_gem_object_alloc()
173 if (obj->import_attach) { in drm_gem_remove_prime_handles()
174 drm_prime_remove_buf_handle(&filp->prime, in drm_gem_remove_prime_handles()
175 obj->import_attach->dmabuf); in drm_gem_remove_prime_handles()
177 if (obj->export_dma_buf) { in drm_gem_remove_prime_handles()
178 drm_prime_remove_buf_handle(&filp->prime, in drm_gem_remove_prime_handles()
179 obj->export_dma_buf); in drm_gem_remove_prime_handles()
193 obj = drm_gem_names_remove(&filp->object_names, handle); in drm_gem_handle_delete()
195 return -EINVAL; in drm_gem_handle_delete()
197 dev = obj->dev; in drm_gem_handle_delete()
203 if (dev->driver->gem_close_object) in drm_gem_handle_delete()
204 dev->driver->gem_close_object(obj, filp); in drm_gem_handle_delete()
207 return 0; in drm_gem_handle_delete()
221 struct drm_device *dev = obj->dev; in drm_gem_handle_create()
224 *handlep = 0; in drm_gem_handle_create()
225 ret = drm_gem_name_create(&file_priv->object_names, obj, handlep); in drm_gem_handle_create()
226 if (ret != 0) in drm_gem_handle_create()
231 if (dev->driver->gem_open_object) { in drm_gem_handle_create()
232 ret = dev->driver->gem_open_object(obj, file_priv); in drm_gem_handle_create()
239 return 0; in drm_gem_handle_create()
246 struct drm_device *dev = obj->dev; in drm_gem_free_mmap_offset()
247 struct drm_gem_mm *mm = dev->mm_private; in drm_gem_free_mmap_offset() local
248 struct drm_hash_item *list = &obj->map_list; in drm_gem_free_mmap_offset()
250 if (!obj->on_map) in drm_gem_free_mmap_offset()
253 drm_ht_remove_item(&mm->offset_hash, list); in drm_gem_free_mmap_offset()
254 free_unr(mm->idxunr, list->key); in drm_gem_free_mmap_offset()
255 obj->on_map = false; in drm_gem_free_mmap_offset()
262 struct drm_device *dev = obj->dev; in drm_gem_create_mmap_offset()
263 struct drm_gem_mm *mm = dev->mm_private; in drm_gem_create_mmap_offset() local
266 if (obj->on_map) in drm_gem_create_mmap_offset()
267 return 0; in drm_gem_create_mmap_offset()
269 obj->map_list.key = alloc_unr(mm->idxunr); in drm_gem_create_mmap_offset()
270 ret = drm_ht_insert_item(&mm->offset_hash, &obj->map_list); in drm_gem_create_mmap_offset()
273 free_unr(mm->idxunr, obj->map_list.key); in drm_gem_create_mmap_offset()
276 obj->on_map = true; in drm_gem_create_mmap_offset()
278 return 0; in drm_gem_create_mmap_offset()
289 obj = drm_gem_name_ref(&filp->object_names, handle, in drm_gem_object_lookup()
303 if (!(dev->driver->driver_features & DRIVER_GEM)) in drm_gem_close_ioctl()
304 return -ENODEV; in drm_gem_close_ioctl()
306 ret = drm_gem_handle_delete(file_priv, args->handle); in drm_gem_close_ioctl()
319 if (!(dev->driver->driver_features & DRIVER_GEM)) in drm_gem_flink_ioctl()
320 return -ENODEV; in drm_gem_flink_ioctl()
322 obj = drm_gem_object_lookup(dev, file_priv, args->handle); in drm_gem_flink_ioctl()
324 return -ENOENT; in drm_gem_flink_ioctl()
326 ret = drm_gem_name_create(&dev->object_names, obj, &obj->name); in drm_gem_flink_ioctl()
327 if (ret != 0) { in drm_gem_flink_ioctl()
328 if (ret == -EALREADY) in drm_gem_flink_ioctl()
329 ret = 0; in drm_gem_flink_ioctl()
332 if (ret == 0) in drm_gem_flink_ioctl()
333 args->name = obj->name; in drm_gem_flink_ioctl()
346 if (!(dev->driver->driver_features & DRIVER_GEM)) in drm_gem_open_ioctl()
347 return -ENODEV; in drm_gem_open_ioctl()
349 obj = drm_gem_name_ref(&dev->object_names, args->name, in drm_gem_open_ioctl()
352 return -ENOENT; in drm_gem_open_ioctl()
359 args->handle = handle; in drm_gem_open_ioctl()
360 args->size = obj->size; in drm_gem_open_ioctl()
362 return 0; in drm_gem_open_ioctl()
369 drm_gem_names_init(&file_private->object_names); in drm_gem_open()
377 struct drm_device *dev = obj->dev; in drm_gem_object_release_handle()
383 if (dev->driver->gem_close_object) in drm_gem_object_release_handle()
384 dev->driver->gem_close_object(obj, file_priv); in drm_gem_object_release_handle()
388 return 0; in drm_gem_object_release_handle()
394 drm_gem_names_foreach(&file_private->object_names, in drm_gem_release()
397 drm_gem_names_fini(&file_private->object_names); in drm_gem_release()
405 * obj->vm_obj can be NULL for private gem objects. in drm_gem_object_release()
407 vm_object_deallocate(obj->vm_obj); in drm_gem_object_release()
414 struct drm_device *dev = obj->dev; in drm_gem_object_free()
417 if (dev->driver->gem_free_object != NULL) in drm_gem_object_free()
418 dev->driver->gem_free_object(obj); in drm_gem_object_free()
424 struct drm_device *dev = obj->dev; in drm_gem_object_handle_free()
427 if (obj->name) { in drm_gem_object_handle_free()
428 obj1 = drm_gem_names_remove(&dev->object_names, obj->name); in drm_gem_object_handle_free()
429 obj->name = 0; in drm_gem_object_handle_free()
438 struct drm_gem_mm *mm; in drm_gem_object_from_offset() local
444 mm = dev->mm_private; in drm_gem_object_from_offset()
445 if (drm_ht_find_item(&mm->offset_hash, DRM_GEM_MAPPING_IDX(offset), in drm_gem_object_from_offset()
446 &map_list) != 0) { in drm_gem_object_from_offset()
447 DRM_DEBUG("drm_gem_object_from_offset: offset 0x%jx obj not found\n", in drm_gem_object_from_offset()
466 return (-ENODEV); in drm_gem_mmap_single()
471 dev->driver->gem_pager_ops, size, nprot, in drm_gem_mmap_single()
472 DRM_GEM_MAPPING_MAPOFF(*offset), curthread->td_ucred); in drm_gem_mmap_single()
475 return (-EINVAL); in drm_gem_mmap_single()
479 return (0); in drm_gem_mmap_single()
489 dev = obj->dev; in drm_gem_pager_dtr()