drivers/gpu/drm/i915/i915_ioc32.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/i915/i915_ioc32.c
Extension
.c
Size
2948 bytes
Lines
95
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

struct drm_i915_getparam32 {
	s32 param;
	/*
	 * We screwed up the generic ioctl struct here and used a variable-sized
	 * pointer. Use u32 in the compat struct to match the 32bit pointer
	 * userspace expects.
	 */
	u32 value;
};

static int compat_i915_getparam(struct file *file, unsigned int cmd,
				unsigned long arg)
{
	struct drm_i915_getparam32 req32;
	struct drm_i915_getparam req;

	if (copy_from_user(&req32, (void __user *)arg, sizeof(req32)))
		return -EFAULT;

	req.param = req32.param;
	req.value = compat_ptr(req32.value);

	return drm_ioctl_kernel(file, i915_getparam_ioctl, &req,
				DRM_RENDER_ALLOW);
}

static drm_ioctl_compat_t *i915_compat_ioctls[] = {
	[DRM_I915_GETPARAM] = compat_i915_getparam,
};

/**
 * i915_ioc32_compat_ioctl - handle the mistakes of the past
 * @filp: the file pointer
 * @cmd: the ioctl command (and encoded flags)
 * @arg: the ioctl argument (from userspace)
 *
 * Called whenever a 32-bit process running under a 64-bit kernel
 * performs an ioctl on /dev/dri/card<n>.
 */
long i915_ioc32_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
	unsigned int nr = DRM_IOCTL_NR(cmd);
	drm_ioctl_compat_t *fn = NULL;
	int ret;

	if (nr < DRM_COMMAND_BASE || nr >= DRM_COMMAND_END)
		return drm_compat_ioctl(filp, cmd, arg);

	if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(i915_compat_ioctls))
		fn = i915_compat_ioctls[nr - DRM_COMMAND_BASE];

	if (fn != NULL)
		ret = (*fn) (filp, cmd, arg);
	else
		ret = drm_ioctl(filp, cmd, arg);

	return ret;
}

Annotation

Implementation Notes