drivers/gpu/drm/drm_gem.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/drm_gem.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/drm_gem.c
Extension
.c
Size
48754 bytes
Lines
1770
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (ret < 0) {
			spin_lock(&file_priv->table_lock);
			idr_remove(&file_priv->object_idr, new_handle);
			idr_replace(&file_priv->object_idr, obj, args->handle);
			spin_unlock(&file_priv->table_lock);
			goto out_unlock;
		}

		drm_prime_remove_buf_handle(&file_priv->prime, args->handle);
	}

	ret = 0;

	spin_lock(&file_priv->table_lock);
	idr_remove(&file_priv->object_idr, args->handle);
	obj = idr_replace(&file_priv->object_idr, obj, new_handle);
	spin_unlock(&file_priv->table_lock);
	WARN_ON(obj != NULL);

out_unlock:
	mutex_unlock(&file_priv->prime.lock);

	return ret;
}

/**
 * drm_gem_open - initializes GEM file-private structures at devnode open time
 * @dev: drm_device which is being opened by userspace
 * @file_private: drm file-private structure to set up
 *
 * Called at device open time, sets up the structure for handling refcounting
 * of mm objects.
 */
void
drm_gem_open(struct drm_device *dev, struct drm_file *file_private)
{
	idr_init_base(&file_private->object_idr, 1);
	spin_lock_init(&file_private->table_lock);
}

/**
 * drm_gem_release - release file-private GEM resources
 * @dev: drm_device which is being closed by userspace
 * @file_private: drm file-private structure to clean up
 *
 * Called at close time when the filp is going away.
 *
 * Releases any remaining references on objects by this filp.
 */
void
drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
{
	idr_for_each(&file_private->object_idr,
		     &drm_gem_object_release_handle, file_private);
	idr_destroy(&file_private->object_idr);
}

/**
 * drm_gem_object_release - release GEM buffer object resources
 * @obj: GEM buffer object
 *
 * This releases any structures and resources used by @obj and is the inverse of
 * drm_gem_object_init().
 */
void
drm_gem_object_release(struct drm_gem_object *obj)
{
	if (obj->filp)
		fput(obj->filp);

	drm_gem_private_object_fini(obj);

	drm_gem_free_mmap_offset(obj);
	drm_gem_lru_remove(obj);
}
EXPORT_SYMBOL(drm_gem_object_release);

/**
 * drm_gem_object_free - free a GEM object
 * @kref: kref of the object to free
 *
 * Called after the last reference to the object has been lost.
 *
 * Frees the object
 */
void
drm_gem_object_free(struct kref *kref)
{
	struct drm_gem_object *obj =
		container_of(kref, struct drm_gem_object, refcount);

Annotation

Implementation Notes