Mesa (master): freedreno/drm: sync uapi and enable softpin

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Dec 13 20:53:39 UTC 2018


Module: Mesa
Branch: master
Commit: 7ef722861b691ce99be3827ed05f8c0ddf2cd66e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7ef722861b691ce99be3827ed05f8c0ddf2cd66e

Author: Rob Clark <robdclark at gmail.com>
Date:   Wed Nov 28 08:50:19 2018 -0500

freedreno/drm: sync uapi and enable softpin

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 at gmail.com>

---

 src/freedreno/drm/freedreno_drmif.h      |  1 +
 src/freedreno/drm/freedreno_ringbuffer.h |  1 +
 src/freedreno/drm/msm_bo.c               |  7 ++++---
 src/freedreno/drm/msm_drm.h              | 24 ++++++++++++++++++------
 src/freedreno/drm/msm_pipe.c             | 14 +-------------
 src/freedreno/drm/msm_ringbuffer_sp.c    |  8 +++++---
 6 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/src/freedreno/drm/freedreno_drmif.h b/src/freedreno/drm/freedreno_drmif.h
index e12ab970c8..27ca0a96f2 100644
--- a/src/freedreno/drm/freedreno_drmif.h
+++ b/src/freedreno/drm/freedreno_drmif.h
@@ -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);
 
diff --git a/src/freedreno/drm/freedreno_ringbuffer.h b/src/freedreno/drm/freedreno_ringbuffer.h
index 4292c8f65d..3ee3e9ba99 100644
--- a/src/freedreno/drm/freedreno_ringbuffer.h
+++ b/src/freedreno/drm/freedreno_ringbuffer.h
@@ -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;
diff --git a/src/freedreno/drm/msm_bo.c b/src/freedreno/drm/msm_bo.c
index d93dfbeab2..95f888b6cf 100644
--- a/src/freedreno/drm/msm_bo.c
+++ b/src/freedreno/drm/msm_bo.c
@@ -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)
diff --git a/src/freedreno/drm/msm_drm.h b/src/freedreno/drm/msm_drm.h
index c06d0a5bdd..09f16fd7be 100644
--- a/src/freedreno/drm/msm_drm.h
+++ b/src/freedreno/drm/msm_drm.h
@@ -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 */
diff --git a/src/freedreno/drm/msm_pipe.c b/src/freedreno/drm/msm_pipe.c
index 13defc6d91..7d5b9fcd76 100644
--- a/src/freedreno/drm/msm_pipe.c
+++ b/src/freedreno/drm/msm_pipe.c
@@ -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;
diff --git a/src/freedreno/drm/msm_ringbuffer_sp.c b/src/freedreno/drm/msm_ringbuffer_sp.c
index 8e4e4a5a18..228740d783 100644
--- a/src/freedreno/drm/msm_ringbuffer_sp.c
+++ b/src/freedreno/drm/msm_ringbuffer_sp.c
@@ -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,
 	});
 




More information about the mesa-commit mailing list