freedreno/drm: sync uapi and enable softpin
authorRob Clark <robdclark@gmail.com>
Wed, 28 Nov 2018 13:50:19 +0000 (08:50 -0500)
committerRob Clark <robdclark@gmail.com>
Thu, 13 Dec 2018 20:51:01 +0000 (15:51 -0500)
Pull in updated UAPI and use kernel API version to enable softpin.
Since MSM_SUBMIT_BO_DUMP flag was added at same time, use that to
signal to kernel that cmdstream buffers are useful to dump for
debugging/cmdstream-traces.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/freedreno/drm/freedreno_drmif.h
src/freedreno/drm/freedreno_ringbuffer.h
src/freedreno/drm/msm_bo.c
src/freedreno/drm/msm_drm.h
src/freedreno/drm/msm_pipe.c
src/freedreno/drm/msm_ringbuffer_sp.c

index e12ab970c8f3c10472d0b172aa51e87ed615f1d2..27ca0a96f264124900d159ee57b7ad6d32284681 100644 (file)
@@ -85,6 +85,7 @@ enum fd_version {
        FD_VERSION_FENCE_FD = 2,           /* submit command supports in/out fences */
        FD_VERSION_SUBMIT_QUEUES = 3,      /* submit queues and multiple priority levels */
        FD_VERSION_BO_IOVA = 3,            /* supports fd_bo_get/put_iova() */
+       FD_VERSION_SOFTPIN = 4,            /* adds softpin, bo name, and dump flag */
 };
 enum fd_version fd_device_version(struct fd_device *dev);
 
index 4292c8f65d60f240ccb4190637c35ff2e70fd73e..3ee3e9ba992245674722b09befe56f10ec4ee2a1 100644 (file)
@@ -124,6 +124,7 @@ struct fd_reloc {
        struct fd_bo *bo;
 #define FD_RELOC_READ             0x0001
 #define FD_RELOC_WRITE            0x0002
+#define FD_RELOC_DUMP             0x0004
        uint32_t flags;
        uint32_t offset;
        uint32_t or;
index d93dfbeab2e64875db2959b6ef94bc7a43f3348a..95f888b6cf68e7680f0f5aa44229a935a64270b6 100644 (file)
@@ -32,6 +32,7 @@ static int bo_allocate(struct msm_bo *msm_bo)
        if (!msm_bo->offset) {
                struct drm_msm_gem_info req = {
                                .handle = bo->handle,
+                               .info = MSM_INFO_GET_OFFSET,
                };
                int ret;
 
@@ -46,7 +47,7 @@ static int bo_allocate(struct msm_bo *msm_bo)
                        return ret;
                }
 
-               msm_bo->offset = req.offset;
+               msm_bo->offset = req.value;
        }
 
        return 0;
@@ -106,14 +107,14 @@ static uint64_t msm_bo_iova(struct fd_bo *bo)
 {
        struct drm_msm_gem_info req = {
                        .handle = bo->handle,
-                       .flags = MSM_INFO_IOVA,
+                       .info = MSM_INFO_GET_IOVA,
        };
        int ret;
 
        ret = drmCommandWriteRead(bo->dev->fd, DRM_MSM_GEM_INFO, &req, sizeof(req));
        debug_assert(ret == 0);
 
-       return req.offset;
+       return req.value;
 }
 
 static void msm_bo_destroy(struct fd_bo *bo)
index c06d0a5bdd808235850c2d3ac54c2eb07ef561b1..09f16fd7beda26a200bc01035a88e24d5a5b246c 100644 (file)
@@ -105,14 +105,23 @@ struct drm_msm_gem_new {
        __u32 handle;         /* out */
 };
 
-#define MSM_INFO_IOVA  0x01
-
-#define MSM_INFO_FLAGS (MSM_INFO_IOVA)
+/* Get or set GEM buffer info.  The requested value can be passed
+ * directly in 'value', or for data larger than 64b 'value' is a
+ * pointer to userspace buffer, with 'len' specifying the number of
+ * bytes copied into that buffer.  For info returned by pointer,
+ * calling the GEM_INFO ioctl with null 'value' will return the
+ * required buffer size in 'len'
+ */
+#define MSM_INFO_GET_OFFSET    0x00   /* get mmap() offset, returned by value */
+#define MSM_INFO_GET_IOVA      0x01   /* get iova, returned by value */
+#define MSM_INFO_SET_NAME      0x02   /* set the debug name (by pointer) */
+#define MSM_INFO_GET_NAME      0x03   /* get debug name, returned by pointer */
 
 struct drm_msm_gem_info {
        __u32 handle;         /* in */
-       __u32 flags;          /* in - combination of MSM_INFO_* flags */
-       __u64 offset;         /* out, mmap() offset or iova */
+       __u32 info;           /* in - one of MSM_INFO_* */
+       __u64 value;          /* in or out */
+       __u32 len;            /* in or out */
 };
 
 #define MSM_PREP_READ        0x01
@@ -188,8 +197,11 @@ struct drm_msm_gem_submit_cmd {
  */
 #define MSM_SUBMIT_BO_READ             0x0001
 #define MSM_SUBMIT_BO_WRITE            0x0002
+#define MSM_SUBMIT_BO_DUMP             0x0004
 
-#define MSM_SUBMIT_BO_FLAGS            (MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE)
+#define MSM_SUBMIT_BO_FLAGS            (MSM_SUBMIT_BO_READ | \
+                                       MSM_SUBMIT_BO_WRITE | \
+                                       MSM_SUBMIT_BO_DUMP)
 
 struct drm_msm_gem_submit_bo {
        __u32 flags;          /* in, mask of MSM_SUBMIT_BO_x */
index 13defc6d9178078bbc82c4237d79c8b4501a241a..7d5b9fcd76ff82e6db5216f147f54de801acffb0 100644 (file)
@@ -168,16 +168,6 @@ static uint64_t get_param(struct fd_pipe *pipe, uint32_t param)
        return value;
 }
 
-static bool use_softpin(void)
-{
-       static int sp = -1;
-       if (sp < 0) {
-               const char *str = getenv("FD_MESA_DEBUG");
-               sp = str && strstr(str, "softpin");
-       }
-       return sp;
-}
-
 struct fd_pipe * msm_pipe_new(struct fd_device *dev,
                enum fd_pipe_id id, uint32_t prio)
 {
@@ -196,9 +186,7 @@ struct fd_pipe * msm_pipe_new(struct fd_device *dev,
 
        pipe = &msm_pipe->base;
 
-       // TODO once kernel changes are in place, this switch will be
-       // based on kernel version:
-       if (use_softpin()) {
+       if (fd_device_version(dev) >= FD_VERSION_SOFTPIN) {
                pipe->funcs = &sp_funcs;
        } else {
                pipe->funcs = &legacy_funcs;
index 8e4e4a5a18ce7d07e799ca2690418e9bb7f5f047..228740d783b2e4c89158cd3e0efdb227487600c5 100644 (file)
@@ -156,6 +156,8 @@ append_bo(struct msm_submit_sp *submit, struct fd_bo *bo, uint32_t flags)
                submit->submit_bos[idx].flags |= MSM_SUBMIT_BO_READ;
        if (flags & FD_RELOC_WRITE)
                submit->submit_bos[idx].flags |= MSM_SUBMIT_BO_WRITE;
+       if (flags & FD_RELOC_DUMP)
+               submit->submit_bos[idx].flags |= MSM_SUBMIT_BO_DUMP;
        return idx;
 }
 
@@ -257,8 +259,8 @@ msm_submit_sp_flush(struct fd_submit *submit, int in_fence_fd,
 
        for (unsigned i = 0; i < primary->u.nr_cmds; i++) {
                cmds[i].type = MSM_SUBMIT_CMD_BUF;
-               cmds[i].submit_idx =
-                       append_bo(msm_submit, primary->u.cmds[i].ring_bo, FD_RELOC_READ);
+               cmds[i].submit_idx = append_bo(msm_submit,
+                               primary->u.cmds[i].ring_bo, FD_RELOC_READ | FD_RELOC_DUMP);
                cmds[i].submit_offset = primary->offset;
                cmds[i].size = primary->u.cmds[i].size;
                cmds[i].pad = 0;
@@ -447,7 +449,7 @@ msm_ringbuffer_sp_emit_reloc_ring(struct fd_ringbuffer *ring,
 
        msm_ringbuffer_sp_emit_reloc(ring, &(struct fd_reloc){
                .bo     = bo,
-               .flags  = FD_RELOC_READ,
+               .flags  = FD_RELOC_READ | FD_RELOC_DUMP,
                .offset = msm_target->offset,
        });