There are more ioctls to add but the ones in this patch are most commonly used. Signed-off-by: Patrik Jakobsson <patrik.jakobsson@xxxxxxxxxxxxxxx> --- Makefile.am | 1 + defs.h | 2 + drm.c | 6 + drm_i915.c | 287 +++++++++++++++++++++++++++++++++++++++++++++ ioctl.c | 6 + xlat/drm_i915_getparams.in | 28 +++++ xlat/drm_i915_ioctls.in | 51 ++++++++ xlat/drm_i915_setparams.in | 4 + 8 files changed, 385 insertions(+) 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 50d5140..941e12a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -122,6 +122,7 @@ strace_SOURCES = \ utimes.c \ v4l2.c \ drm.c \ + drm_i915.c \ vsprintf.c \ wait.c \ xattr.c diff --git a/defs.h b/defs.h index f77330b..e9286a1 100644 --- a/defs.h +++ b/defs.h @@ -575,6 +575,8 @@ extern int v4l2_ioctl(struct tcb *, const unsigned int, long); extern int drm_is_priv(const unsigned int); extern int drm_is_driver(struct tcb *tcp, const char *name); extern int drm_ioctl(struct tcb *, const unsigned int, long); +extern int drm_i915_ioctl(struct tcb *, const unsigned int, long); +extern int drm_i915_decode_number(struct tcb *, unsigned int); extern int tv_nz(const struct timeval *); extern int tv_cmp(const struct timeval *, const struct timeval *); diff --git a/drm.c b/drm.c index 56ef98b..fa98fb7 100644 --- a/drm.c +++ b/drm.c @@ -84,5 +84,11 @@ int drm_is_driver(struct tcb *tcp, const char *name) int drm_ioctl(struct tcb *tcp, const unsigned int code, long arg) { + /* Check for device specific ioctls */ + if (drm_is_priv(tcp->u_arg[1])) { + if (verbose(tcp) && drm_is_driver(tcp, "i915")) + return drm_i915_ioctl(tcp, code, arg); + } + return 0; } diff --git a/drm_i915.c b/drm_i915.c new file mode 100644 index 0000000..b7b32f7 --- /dev/null +++ b/drm_i915.c @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2015 Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: + * Patrik Jakobsson <patrik.jakobsson@xxxxxxxxxxxxxxx> + */ + +#include "defs.h" + +#include <drm.h> +#include <i915_drm.h> +#include "xlat/drm_i915_ioctls.h" +#include "xlat/drm_i915_getparams.h" +#include "xlat/drm_i915_setparams.h" + +static int i915_getparam(struct tcb *tcp, const unsigned int code, long arg) +{ + struct drm_i915_getparam param; + int value; + + if (entering(tcp) || umove(tcp, arg, ¶m)) + return 0; + if (umove(tcp, (long)param.value, &value)) + return 0; + + tprintf(", {param="); + printxval(drm_i915_getparams, param.param, "I915_PARAM_???"); + tprintf(", value="); + switch (param.param) { + case I915_PARAM_CHIPSET_ID: + tprintf("0x%04x", value); + break; + default: + tprintf("%d", value); + } + tprintf("}"); + + return 1; +} + +static int i915_setparam(struct tcb *tcp, const unsigned int code, long arg) +{ + struct drm_i915_setparam param; + + if (exiting(tcp) || umove(tcp, arg, ¶m)) + return 0; + + tprintf(", {param="); + printxval(drm_i915_setparams, param.param, "I915_PARAM_???"); + tprintf(", value=%d}", param.value); + + return 1; +} + +static int i915_gem_execbuffer2(struct tcb *tcp, const unsigned int code, + long arg) +{ + struct drm_i915_gem_execbuffer2 eb; + + if (exiting(tcp) || umove(tcp, arg, &eb)) + return 0; + + 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 1; +} + +static int i915_gem_busy(struct tcb *tcp, const unsigned int code, long arg) +{ + struct drm_i915_gem_busy busy; + + if (entering(tcp) || umove(tcp, arg, &busy)) + return 0; + + tprintf(", {handle=%u, busy=%c, ring=%u}", + busy.handle, (busy.busy & 0x1) ? 'Y' : 'N', (busy.busy >> 16)); + + return 1; +} + +static int i915_gem_create(struct tcb *tcp, const unsigned int code, long arg) +{ + struct drm_i915_gem_create create; + + if (entering(tcp) || umove(tcp, arg, &create)) + return 0; + + tprintf(", {size=%Lu, handle=%u}", create.size, create.handle); + + return 1; +} + +static int i915_gem_pread(struct tcb *tcp, const unsigned int code, long arg) +{ + struct drm_i915_gem_pread pr; + + if (exiting(tcp) || umove(tcp, arg, &pr)) + return 0; + + tprintf(", {handle=%u, offset=%Lu, size=%Lu, data_ptr=%p}", + pr.handle, pr.offset, pr.size, (void *)pr.data_ptr); + + return 1; +} + +static int i915_gem_pwrite(struct tcb *tcp, const unsigned int code, long arg) +{ + struct drm_i915_gem_pwrite pw; + + if (exiting(tcp) || umove(tcp, arg, &pw)) + return 0; + + tprintf(", {handle=%u, offset=%Lu, size=%Lu, data_ptr=%p}", + pw.handle, pw.offset, pw.size, (void *)pw.data_ptr); + + return 1; +} + +static int i915_gem_mmap(struct tcb *tcp, const unsigned int code, long arg) +{ + struct drm_i915_gem_mmap mmap; + + if (entering(tcp) || umove(tcp, arg, &mmap)) + return 0; + + tprintf(", {handle=%u, offset=%Lu, size=%Lu, addr_ptr=%p}", + mmap.handle, mmap.offset, mmap.size, (void *)mmap.addr_ptr); + + return 1; +} + +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) || umove(tcp, arg, &mmap)) + return 0; + + tprintf(", {handle=%u, offset=%Lu}", mmap.handle, mmap.offset); + + return 1; +} + +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) || umove(tcp, arg, &dom)) + return 0; + + tprintf(", {handle=%u, read_domains=%x, write_domain=%x}", + dom.handle, dom.read_domains, dom.write_domain); + + return 1; +} + +static int i915_gem_madvise(struct tcb *tcp, const unsigned int code, long arg) +{ + struct drm_i915_gem_madvise madv; + + if (entering(tcp) || umove(tcp, arg, &madv)) + return 0; + + tprintf(", {handle=%u, madv=%u, retained=%u}", + madv.handle, madv.madv, madv.retained); + + return 1; +} + +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) || umove(tcp, arg, &tiling)) + return 0; + + tprintf(", {handle=%u, tiling_mode=%u, swizzle_mode=%u}", + tiling.handle, tiling.tiling_mode, tiling.swizzle_mode); + + return 1; +} + +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) || umove(tcp, arg, &tiling)) + return 0; + + tprintf(", {handle=%u, tiling_mode=%u, stride=%u, swizzle_mode=%u}", + tiling.handle, tiling.tiling_mode, tiling.stride, + tiling.swizzle_mode); + + return 1; +} + +static int i915_gem_userptr(struct tcb *tcp, const unsigned int code, long arg) +{ + struct drm_i915_gem_userptr uptr; + + if (entering(tcp) || umove(tcp, arg, &uptr)) + return 0; + + tprintf(", {user_ptr=%p, user_size=%Lu, flags=0x%x, handle=%u}", + (void *)uptr.user_ptr, uptr.user_size, uptr.flags, uptr.handle); + + return 1; +} + +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 1; + } + + return 0; +} + +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 0; +} diff --git a/ioctl.c b/ioctl.c index 690e7aa..f12ded8 100644 --- a/ioctl.c +++ b/ioctl.c @@ -184,6 +184,12 @@ hiddev_decode_number(unsigned int arg) static int drm_decode_number(struct tcb *tcp, unsigned int arg) { + /* Check for device specific ioctls */ + if (drm_is_priv(tcp->u_arg[1])) { + if (verbose(tcp) && drm_is_driver(tcp, "i915")) + return drm_i915_decode_number(tcp, arg); + } + return 0; } diff --git a/xlat/drm_i915_getparams.in b/xlat/drm_i915_getparams.in new file mode 100644 index 0000000..15275cb --- /dev/null +++ b/xlat/drm_i915_getparams.in @@ -0,0 +1,28 @@ +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 diff --git a/xlat/drm_i915_ioctls.in b/xlat/drm_i915_ioctls.in new file mode 100644 index 0000000..21c3397 --- /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 0000000..d93d2ea --- /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.1.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx