[PATCH 4/4] drm: Add decoding of i915 ioctls

Patrik Jakobsson pjakobsson at suse.de
Tue Mar 12 07:49:19 UTC 2019


* Makefile.am: Add compilation of drm_i915.c.
* defs.h: Add extern i915 declarations
* drm.c (drm_ioctl): Dispatch i915 ioctls.
* drm_i915.c: New file.
* xlat/drm_i915_getparams.in: New file.
* xlat/drm_i915_setparams.in: New file.
* xlat/drm_i915_ioctls.in: New file.

Signed-off-by: Patrik Jakobsson <pjakobsson at suse.de>
---
 Makefile.am                |   1 +
 drm.c                      |   6 +-
 drm_i915.c                 | 330 +++++++++++++++++++++++++++++++++++++
 xlat/drm_i915_getparams.in |  51 ++++++
 xlat/drm_i915_ioctls.in    |  51 ++++++
 xlat/drm_i915_setparams.in |   4 +
 6 files changed, 441 insertions(+), 2 deletions(-)
 create mode 100644 drm_i915.c
 create mode 100644 xlat/drm_i915_getparams.in
 create mode 100644 xlat/drm_i915_ioctls.in
 create mode 100644 xlat/drm_i915_setparams.in

diff --git a/Makefile.am b/Makefile.am
index d7dd2e7b..714ee84c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -102,6 +102,7 @@ strace_SOURCES =	\
 	dirent64.c	\
 	dm.c		\
 	drm.c		\
+	drm_i915.c	\
 	dyxlat.c	\
 	empty.h		\
 	epoll.c		\
diff --git a/drm.c b/drm.c
index d44de663..c43677f2 100644
--- a/drm.c
+++ b/drm.c
@@ -70,7 +70,8 @@ static int drm_is_driver(struct tcb *tcp, const char *name)
 MPERS_PRINTER_DECL(int, drm_decode_number, struct tcb *tcp, unsigned int code)
 {
 	if (drm_is_priv(tcp->u_arg[1])) {
-		/* Detection of drm driver with drm_is_driver(...) goes here */
+		if (verbose(tcp) && drm_is_driver(tcp, "i915"))
+			return MPERS_FUNC_NAME(drm_i915_decode_number)(tcp, code);
 	}
 
 	return 0;
@@ -614,7 +615,8 @@ MPERS_PRINTER_DECL(int, drm_ioctl, struct tcb *tcp, const unsigned int code,
 
 	/* Check for device specific ioctls */
 	if (drm_is_priv(tcp->u_arg[1])) {
-		/* Detection of drm driver with drm_is_driver(...) goes here */
+		if (verbose(tcp) && drm_is_driver(tcp, "i915"))
+			return MPERS_FUNC_NAME(drm_i915_ioctl)(tcp, code, arg);
 	} else {
 		switch (code) {
 		case DRM_IOCTL_VERSION:
diff --git a/drm_i915.c b/drm_i915.c
new file mode 100644
index 00000000..80166bca
--- /dev/null
+++ b/drm_i915.c
@@ -0,0 +1,330 @@
+/*
+ * Copyright (c) 2019 Patrik Jakobsson <pjakobsson at suse.de>
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include "defs.h"
+
+#if defined(HAVE_DRM_H) || defined(HAVE_DRM_DRM_H)
+
+#ifdef HAVE_DRM_H
+#include <drm.h>
+#include <i915_drm.h>
+#else
+#include <drm/drm.h>
+#include <drm/i915_drm.h>
+#endif
+
+#include "xlat/drm_i915_ioctls.h"
+#include "xlat/drm_i915_getparams.h"
+#include "xlat/drm_i915_setparams.h"
+
+#include MPERS_DEFS
+
+static int i915_getparam(struct tcb *tcp, const unsigned int code, long arg)
+{
+	struct drm_i915_getparam param;
+	int value;
+
+	if (entering(tcp)) {
+		if (umove_or_printaddr(tcp, arg, &param))
+			return RVAL_IOCTL_DECODED;
+		tprints(", {param=");
+		printxval(drm_i915_getparams, param.param, "I915_PARAM_???");
+
+		return 0;
+	}
+
+	if (!syserror(tcp) && !umove(tcp, arg, &param)) {
+		if (umove(tcp, (long)param.value, &value))
+			return RVAL_IOCTL_DECODED;
+
+		tprints(", value=");
+		switch (param.param) {
+		case I915_PARAM_CHIPSET_ID:
+			tprintf("0x%04x", value);
+			break;
+		default:
+			tprintf("%d", value);
+		}
+		tprints("}");
+	}
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_setparam(struct tcb *tcp, const unsigned int code, long arg)
+{
+	struct drm_i915_setparam param;
+
+	if (!umove_or_printaddr(tcp, arg, &param)) {
+		tprints(", {param=");
+		printxval(drm_i915_setparams, param.param, "I915_PARAM_???");
+		tprintf(", value=%d}", param.value);
+	}
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_execbuffer2(struct tcb *tcp, const unsigned int code,
+				long arg)
+{
+	struct drm_i915_gem_execbuffer2 eb;
+
+	if (!umove_or_printaddr(tcp, arg, &eb)) {
+		tprintf(", {buffers_ptr=%p, buffer_count=%u, "
+			"batch_start_offset=%x, batch_len=%u, DR1=%u, DR4=%u, "
+			"num_cliprects=%u, cliprects_ptr=%p, flags=0x%Lx}",
+			(void *)eb.buffers_ptr, eb.buffer_count,
+			eb.batch_start_offset, eb.batch_len, eb.DR1, eb.DR4,
+			eb.num_cliprects, (void *)eb.cliprects_ptr, eb.flags);
+	}
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_busy(struct tcb *tcp, const unsigned int code, long arg)
+{
+	struct drm_i915_gem_busy busy;
+
+	if (entering(tcp)) {
+		if (umove_or_printaddr(tcp, arg, &busy))
+			return RVAL_IOCTL_DECODED;
+		tprintf(", {handle=%u", busy.handle);
+
+		return 0;
+	}
+
+	if (!syserror(tcp) && !umove(tcp, arg, &busy)) {
+		tprintf(", busy=%c, ring=%u}",
+			(busy.busy & 0x1) ? 'Y' : 'N', (busy.busy >> 16));
+	}
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_create(struct tcb *tcp, const unsigned int code, long arg)
+{
+	struct drm_i915_gem_create create;
+
+	if (entering(tcp)) {
+		if (umove_or_printaddr(tcp, arg, &create))
+			return RVAL_IOCTL_DECODED;
+		tprintf(", {size=%Lu", create.size);
+
+		return 0;
+	}
+
+	if (!syserror(tcp) && !umove(tcp, arg, &create))
+		tprintf(", handle=%u}", create.handle);
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_pread(struct tcb *tcp, const unsigned int code, long arg)
+{
+	struct drm_i915_gem_pread pr;
+
+	if (!umove_or_printaddr(tcp, arg, &pr)) {
+		tprintf(", {handle=%u, offset=%Lu, size=%Lu, data_ptr=%p}",
+			pr.handle, pr.offset, pr.size, (void *)pr.data_ptr);
+	}
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_pwrite(struct tcb *tcp, const unsigned int code, long arg)
+{
+	struct drm_i915_gem_pwrite pw;
+
+	if (!umove_or_printaddr(tcp, arg, &pw)) {
+		tprintf(", {handle=%u, offset=%Lu, size=%Lu, data_ptr=%p}",
+			pw.handle, pw.offset, pw.size, (void *)pw.data_ptr);
+	}
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_mmap(struct tcb *tcp, const unsigned int code, long arg)
+{
+	struct drm_i915_gem_mmap mmap;
+
+	if (entering(tcp)) {
+		if (umove_or_printaddr(tcp, arg, &mmap))
+			return RVAL_IOCTL_DECODED;
+		tprintf(", {handle=%u, size=%Lu", mmap.handle, mmap.size);
+
+		return 0;
+	}
+
+	if (!syserror(tcp) && !umove(tcp, arg, &mmap)) {
+		tprintf(", offset=%Lu, addr_ptr=%p}",
+			mmap.offset, (void *)mmap.addr_ptr);
+	}
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_mmap_gtt(struct tcb *tcp, const unsigned int code, long arg)
+{
+	struct drm_i915_gem_mmap_gtt mmap;
+
+
+	if (entering(tcp)) {
+		if (umove_or_printaddr(tcp, arg, &mmap))
+			return RVAL_IOCTL_DECODED;
+		tprintf(", {handle=%u", mmap.handle);
+
+		return 0;
+	}
+
+	if (!syserror(tcp) && !umove(tcp, arg, &mmap))
+		tprintf(", offset=%Lu}", mmap.offset);
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_set_domain(struct tcb *tcp, const unsigned int code,
+			       long arg)
+{
+	struct drm_i915_gem_set_domain dom;
+
+	if (entering(tcp)) {
+		if (umove_or_printaddr(tcp, arg, &dom))
+			return RVAL_IOCTL_DECODED;
+
+		tprintf(", {handle=%u, read_domains=%x, write_domain=%x}",
+			dom.handle, dom.read_domains, dom.write_domain);
+	}
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_madvise(struct tcb *tcp, const unsigned int code, long arg)
+{
+	struct drm_i915_gem_madvise madv;
+
+	if (entering(tcp)) {
+		if (umove_or_printaddr(tcp, arg, &madv))
+			return RVAL_IOCTL_DECODED;
+		tprintf(", {handle=%u, madv=%u", madv.handle, madv.madv);
+
+		return 0;
+	}
+
+	if (!syserror(tcp) && !umove(tcp, arg, &madv))
+		tprintf(", retained=%u}", madv.retained);
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_get_tiling(struct tcb *tcp, const unsigned int code,
+			       long arg)
+{
+	struct drm_i915_gem_get_tiling tiling;
+
+	if (entering(tcp)) {
+		if (umove_or_printaddr(tcp, arg, &tiling))
+			return RVAL_IOCTL_DECODED;
+		tprintf(", {handle=%u", tiling.handle);
+
+		return 0;
+	}
+
+	if (!syserror(tcp) && !umove(tcp, arg, &tiling)) {
+		tprintf(", tiling_mode=%u, swizzle_mode=%u}",
+			tiling.tiling_mode, tiling.swizzle_mode);
+	}
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_set_tiling(struct tcb *tcp, const unsigned int code,
+			       long arg)
+{
+	struct drm_i915_gem_set_tiling tiling;
+
+	if (entering(tcp)) {
+		if (umove(tcp, arg, &tiling))
+			return RVAL_IOCTL_DECODED;
+		tprintf(", {handle=%u, tiling_mode=%u, stride=%u",
+			tiling.handle, tiling.tiling_mode, tiling.stride);
+
+		return 0;
+	}
+
+	if (!syserror(tcp) && !umove(tcp, arg, &tiling))
+		tprintf(", swizzle_mode=%u}", tiling.swizzle_mode);
+
+	return RVAL_IOCTL_DECODED;
+}
+
+static int i915_gem_userptr(struct tcb *tcp, const unsigned int code, long arg)
+{
+	struct drm_i915_gem_userptr uptr;
+
+	if (entering(tcp)) {
+		if (umove_or_printaddr(tcp, arg, &uptr))
+			return RVAL_DECODED;
+		tprintf(", {user_ptr=%p, user_size=%Lu", (void *)uptr.user_ptr,
+			uptr.user_size);
+
+		return 0;
+	}
+
+	if (!syserror(tcp) && !umove(tcp, arg, &uptr))
+		tprintf(", flags=0x%x, handle=%u}", uptr.flags, uptr.handle);
+
+	return RVAL_IOCTL_DECODED;
+}
+
+MPERS_PRINTER_DECL(int, drm_i915_decode_number, struct tcb *tcp, unsigned int arg)
+{
+	const char *str = xlookup(drm_i915_ioctls, arg);
+
+	if (str) {
+		tprintf("%s", str);
+		return IOCTL_NUMBER_STOP_LOOKUP;
+	}
+
+	return 0;
+}
+
+MPERS_PRINTER_DECL(int, drm_i915_ioctl, struct tcb *tcp, const unsigned int code, long arg)
+{
+	switch (code) {
+	case DRM_IOCTL_I915_GETPARAM:
+		return i915_getparam(tcp, code, arg);
+	case DRM_IOCTL_I915_SETPARAM:
+		return i915_setparam(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_EXECBUFFER2:
+		return i915_gem_execbuffer2(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_BUSY:
+		return i915_gem_busy(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_CREATE:
+		return i915_gem_create(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_PREAD:
+		return i915_gem_pread(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_PWRITE:
+		return i915_gem_pwrite(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_MMAP:
+		return i915_gem_mmap(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_MMAP_GTT:
+		return i915_gem_mmap_gtt(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_SET_DOMAIN:
+		return i915_gem_set_domain(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_MADVISE:
+		return i915_gem_madvise(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_GET_TILING:
+		return i915_gem_get_tiling(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_SET_TILING:
+		return i915_gem_set_tiling(tcp, code, arg);
+	case DRM_IOCTL_I915_GEM_USERPTR:
+		return i915_gem_userptr(tcp, code, arg);
+	}
+
+	return RVAL_DECODED;
+}
+
+#endif /* HAVE_DRM_H || HAVE_DRM_DRM_H */
diff --git a/xlat/drm_i915_getparams.in b/xlat/drm_i915_getparams.in
new file mode 100644
index 00000000..723f0a7c
--- /dev/null
+++ b/xlat/drm_i915_getparams.in
@@ -0,0 +1,51 @@
+I915_PARAM_IRQ_ACTIVE
+I915_PARAM_ALLOW_BATCHBUFFER
+I915_PARAM_LAST_DISPATCH
+I915_PARAM_CHIPSET_ID
+I915_PARAM_HAS_GEM
+I915_PARAM_NUM_FENCES_AVAIL
+I915_PARAM_HAS_OVERLAY
+I915_PARAM_HAS_PAGEFLIPPING
+I915_PARAM_HAS_EXECBUF2
+I915_PARAM_HAS_BSD
+I915_PARAM_HAS_BLT
+I915_PARAM_HAS_RELAXED_FENCING
+I915_PARAM_HAS_COHERENT_RINGS
+I915_PARAM_HAS_EXEC_CONSTANTS
+I915_PARAM_HAS_RELAXED_DELTA
+I915_PARAM_HAS_GEN7_SOL_RESET
+I915_PARAM_HAS_LLC
+I915_PARAM_HAS_ALIASING_PPGTT
+I915_PARAM_HAS_WAIT_TIMEOUT
+I915_PARAM_HAS_SEMAPHORES
+I915_PARAM_HAS_PRIME_VMAP_FLUSH
+I915_PARAM_HAS_VEBOX
+I915_PARAM_HAS_SECURE_BATCHES
+I915_PARAM_HAS_PINNED_BATCHES
+I915_PARAM_HAS_EXEC_NO_RELOC
+I915_PARAM_HAS_EXEC_HANDLE_LUT
+I915_PARAM_HAS_WT
+I915_PARAM_CMD_PARSER_VERSION
+I915_PARAM_HAS_COHERENT_PHYS_GTT
+I915_PARAM_MMAP_VERSION
+I915_PARAM_HAS_BSD2
+I915_PARAM_REVISION
+I915_PARAM_SUBSLICE_TOTAL
+I915_PARAM_EU_TOTAL
+I915_PARAM_HAS_GPU_RESET
+I915_PARAM_HAS_RESOURCE_STREAMER
+I915_PARAM_HAS_EXEC_SOFTPIN
+I915_PARAM_HAS_POOLED_EU
+I915_PARAM_MIN_EU_IN_POOL
+I915_PARAM_MMAP_GTT_VERSION
+I915_PARAM_HAS_SCHEDULER
+I915_PARAM_HUC_STATUS
+I915_PARAM_HAS_EXEC_ASYNC
+I915_PARAM_HAS_EXEC_FENCE
+I915_PARAM_HAS_EXEC_CAPTURE
+I915_PARAM_SLICE_MASK
+I915_PARAM_SUBSLICE_MASK
+I915_PARAM_HAS_EXEC_BATCH_FIRST
+I915_PARAM_HAS_EXEC_FENCE_ARRAY
+I915_PARAM_HAS_CONTEXT_ISOLATION
+I915_PARAM_CS_TIMESTAMP_FREQUENCY
diff --git a/xlat/drm_i915_ioctls.in b/xlat/drm_i915_ioctls.in
new file mode 100644
index 00000000..21c33975
--- /dev/null
+++ b/xlat/drm_i915_ioctls.in
@@ -0,0 +1,51 @@
+/* Unfortunately i915 collides with other DRM drivers so we must specify these */
+DRM_IOCTL_I915_INIT
+DRM_IOCTL_I915_FLUSH
+DRM_IOCTL_I915_FLIP
+DRM_IOCTL_I915_BATCHBUFFER
+DRM_IOCTL_I915_IRQ_EMIT
+DRM_IOCTL_I915_IRQ_WAIT
+DRM_IOCTL_I915_GETPARAM
+DRM_IOCTL_I915_SETPARAM
+DRM_IOCTL_I915_ALLOC
+DRM_IOCTL_I915_FREE
+DRM_IOCTL_I915_INIT_HEAP
+DRM_IOCTL_I915_CMDBUFFER
+DRM_IOCTL_I915_DESTROY_HEAP
+DRM_IOCTL_I915_SET_VBLANK_PIPE
+DRM_IOCTL_I915_GET_VBLANK_PIPE
+DRM_IOCTL_I915_VBLANK_SWAP
+DRM_IOCTL_I915_HWS_ADDR
+DRM_IOCTL_I915_GEM_INIT
+DRM_IOCTL_I915_GEM_EXECBUFFER
+DRM_IOCTL_I915_GEM_EXECBUFFER2
+DRM_IOCTL_I915_GEM_PIN
+DRM_IOCTL_I915_GEM_UNPIN
+DRM_IOCTL_I915_GEM_BUSY
+DRM_IOCTL_I915_GEM_SET_CACHING
+DRM_IOCTL_I915_GEM_GET_CACHING
+DRM_IOCTL_I915_GEM_THROTTLE
+DRM_IOCTL_I915_GEM_ENTERVT
+DRM_IOCTL_I915_GEM_LEAVEVT
+DRM_IOCTL_I915_GEM_CREATE
+DRM_IOCTL_I915_GEM_PREAD
+DRM_IOCTL_I915_GEM_PWRITE
+DRM_IOCTL_I915_GEM_MMAP
+DRM_IOCTL_I915_GEM_MMAP_GTT
+DRM_IOCTL_I915_GEM_SET_DOMAIN
+DRM_IOCTL_I915_GEM_SW_FINISH
+DRM_IOCTL_I915_GEM_SET_TILING
+DRM_IOCTL_I915_GEM_GET_TILING
+DRM_IOCTL_I915_GEM_GET_APERTURE
+DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID
+DRM_IOCTL_I915_GEM_MADVISE
+DRM_IOCTL_I915_OVERLAY_PUT_IMAGE
+DRM_IOCTL_I915_OVERLAY_ATTRS
+DRM_IOCTL_I915_SET_SPRITE_COLORKEY
+DRM_IOCTL_I915_GET_SPRITE_COLORKEY
+DRM_IOCTL_I915_GEM_WAIT
+DRM_IOCTL_I915_GEM_CONTEXT_CREATE
+DRM_IOCTL_I915_GEM_CONTEXT_DESTROY
+DRM_IOCTL_I915_REG_READ
+DRM_IOCTL_I915_GET_RESET_STATS
+DRM_IOCTL_I915_GEM_USERPTR
diff --git a/xlat/drm_i915_setparams.in b/xlat/drm_i915_setparams.in
new file mode 100644
index 00000000..d93d2ea8
--- /dev/null
+++ b/xlat/drm_i915_setparams.in
@@ -0,0 +1,4 @@
+I915_SETPARAM_USE_MI_BATCHBUFFER_START
+I915_SETPARAM_TEX_LRU_LOG_GRANULARITY
+I915_SETPARAM_ALLOW_BATCHBUFFER
+I915_SETPARAM_NUM_USED_FENCES
-- 
2.21.0



More information about the Strace-devel mailing list