drivers/gpu/drm/msm/msm_gem_prime.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/msm/msm_gem_prime.c
Extension
.c
Size
3055 bytes
Lines
135
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source 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 (obj->dev == dev) {
			/*
			 * Importing dmabuf exported from our own gem increases
			 * refcount on gem itself instead of f_count of dmabuf.
			 */
			drm_gem_object_get(obj);
			return obj;
		}
	}

	return drm_gem_prime_import(dev, buf);
}

struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
		struct dma_buf_attachment *attach, struct sg_table *sg)
{
	return msm_gem_import(dev, attach->dmabuf, sg);
}

struct dma_buf *msm_gem_prime_export(struct drm_gem_object *obj, int flags)
{
	if (to_msm_bo(obj)->flags & MSM_BO_NO_SHARE)
		return ERR_PTR(-EPERM);

	msm_gem_vma_get(obj);

	struct drm_device *dev = obj->dev;
	struct dma_buf_export_info exp_info = {
		.exp_name = KBUILD_MODNAME, /* white lie for debug */
		.owner = dev->driver->fops->owner,
		.ops = &msm_gem_prime_dmabuf_ops,
		.size = obj->size,
		.flags = flags,
		.priv = obj,
		.resv = obj->resv,
	};

	return drm_gem_dmabuf_export(dev, &exp_info);
}

int msm_gem_prime_pin(struct drm_gem_object *obj)
{
	struct page **pages;
	int ret = 0;

	if (drm_gem_is_imported(obj))
		return 0;

	if (to_msm_bo(obj)->flags & MSM_BO_NO_SHARE)
		return -EINVAL;

	pages = msm_gem_pin_pages_locked(obj);
	if (IS_ERR(pages))
		ret = PTR_ERR(pages);

	return ret;
}

void msm_gem_prime_unpin(struct drm_gem_object *obj)
{
	if (drm_gem_is_imported(obj))
		return;

	msm_gem_unpin_pages_locked(obj);
}

Annotation

Implementation Notes