151
151
EXPORT_SYMBOL(drm_gem_object_init);
154
* Initialize an already allocated GEM object of the specified size with
155
* no GEM provided backing store. Instead the caller is responsible for
156
* backing the object and handling it.
158
int drm_gem_private_object_init(struct drm_device *dev,
159
struct drm_gem_object *obj, size_t size)
161
BUG_ON((size & (PAGE_SIZE - 1)) != 0);
166
kref_init(&obj->refcount);
167
atomic_set(&obj->handle_count, 0);
172
EXPORT_SYMBOL(drm_gem_private_object_init);
154
175
* Allocate a GEM object of the specified size with shmfs backing store
156
177
struct drm_gem_object *
250
274
drm_gem_object_handle_reference(obj);
276
if (dev->driver->gem_open_object) {
277
ret = dev->driver->gem_open_object(obj, file_priv);
279
drm_gem_handle_delete(file_priv, *handlep);
253
286
EXPORT_SYMBOL(drm_gem_handle_create);
290
* drm_gem_free_mmap_offset - release a fake mmap offset for an object
291
* @obj: obj in question
293
* This routine frees fake offsets allocated by drm_gem_create_mmap_offset().
296
drm_gem_free_mmap_offset(struct drm_gem_object *obj)
298
struct drm_device *dev = obj->dev;
299
struct drm_gem_mm *mm = dev->mm_private;
300
struct drm_map_list *list = &obj->map_list;
302
drm_ht_remove_item(&mm->offset_hash, &list->hash);
303
drm_mm_put_block(list->file_offset_node);
307
EXPORT_SYMBOL(drm_gem_free_mmap_offset);
310
* drm_gem_create_mmap_offset - create a fake mmap offset for an object
311
* @obj: obj in question
313
* GEM memory mapping works by handing back to userspace a fake mmap offset
314
* it can use in a subsequent mmap(2) call. The DRM core code then looks
315
* up the object based on the offset and sets up the various memory mapping
318
* This routine allocates and attaches a fake offset for @obj.
321
drm_gem_create_mmap_offset(struct drm_gem_object *obj)
323
struct drm_device *dev = obj->dev;
324
struct drm_gem_mm *mm = dev->mm_private;
325
struct drm_map_list *list;
326
struct drm_local_map *map;
329
/* Set the object up for mmap'ing */
330
list = &obj->map_list;
331
list->map = kzalloc(sizeof(struct drm_map_list), GFP_KERNEL);
336
map->type = _DRM_GEM;
337
map->size = obj->size;
340
/* Get a DRM GEM mmap offset allocated... */
341
list->file_offset_node = drm_mm_search_free(&mm->offset_manager,
342
obj->size / PAGE_SIZE, 0, 0);
344
if (!list->file_offset_node) {
345
DRM_ERROR("failed to allocate offset for bo %d\n", obj->name);
350
list->file_offset_node = drm_mm_get_block(list->file_offset_node,
351
obj->size / PAGE_SIZE, 0);
352
if (!list->file_offset_node) {
357
list->hash.key = list->file_offset_node->start;
358
ret = drm_ht_insert_item(&mm->offset_hash, &list->hash);
360
DRM_ERROR("failed to add to map hash\n");
367
drm_mm_put_block(list->file_offset_node);
374
EXPORT_SYMBOL(drm_gem_create_mmap_offset);
255
376
/** Returns a reference to the object named by the handle. */
256
377
struct drm_gem_object *
257
378
drm_gem_object_lookup(struct drm_device *dev, struct drm_file *filp,
403
524
drm_gem_object_release_handle(int id, void *ptr, void *data)
526
struct drm_file *file_priv = data;
405
527
struct drm_gem_object *obj = ptr;
528
struct drm_device *dev = obj->dev;
530
if (dev->driver->gem_close_object)
531
dev->driver->gem_close_object(obj, file_priv);
407
533
drm_gem_object_handle_unreference_unlocked(obj);
418
544
drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
420
546
idr_for_each(&file_private->object_idr,
421
&drm_gem_object_release_handle, NULL);
547
&drm_gem_object_release_handle, file_private);
423
549
idr_remove_all(&file_private->object_idr);
424
550
idr_destroy(&file_private->object_idr);