gpu: pvr: add snprint_edm_trace
authorImre Deak <imre.deak@nokia.com>
Tue, 14 Dec 2010 00:48:37 +0000 (02:48 +0200)
committerGrazvydas Ignotas <notasas@gmail.com>
Sun, 20 May 2012 18:43:02 +0000 (21:43 +0300)
Needed by an upcoming patch adding a debugfs entry to dump the trace.

Signed-off-by: Imre Deak <imre.deak@nokia.com>
pvr/sgxinfokm.h
pvr/sgxinit.c

index 887ebe6..83228d4 100644 (file)
@@ -56,6 +56,9 @@
 
 #define PVRSRV_USSE_MISCINFO_READY                             0x1UL
 
+#define SGXMK_TRACE_BUFFER_SIZE                                        512
+#define SGXMK_TRACE_BUF_STR_LEN                                        80
+
 struct PVRSRV_SGX_CCB_INFO;
 
 struct PVRSRV_SGXDEV_INFO {
@@ -249,6 +252,19 @@ enum PVRSRV_ERROR SGXDevInitCompatCheck(struct PVRSRV_DEVICE_NODE
 
 void SysGetSGXTimingInformation(struct SGX_TIMING_INFORMATION *psSGXTimingInfo);
 
+#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) || defined(CONFIG_DEBUG_FS)
+size_t snprint_edm_trace(struct PVRSRV_SGXDEV_INFO *sdev, char *buf,
+                        size_t buf_size);
+#else
+static inline size_t snprint_edm_trace(struct PVRSRV_SGXDEV_INFO *sdev,
+                                       char *buf, size_t buf_size)
+{
+       return 0;
+}
+#endif
+
+
+
 #if defined(NO_HARDWARE)
 static inline void NoHardwareGenerateEvent(struct PVRSRV_SGXDEV_INFO *psDevInfo,
                                           u32 ui32StatusRegister,
index dd05eb9..0184eea 100644 (file)
@@ -586,38 +586,68 @@ static enum PVRSRV_ERROR DevDeInitSGX(void *pvDeviceNode)
        return PVRSRV_OK;
 }
 
-#ifdef PVRSRV_USSE_EDM_STATUS_DEBUG
-
-#define SGXMK_TRACE_BUFFER_SIZE                512
+#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) || defined(CONFIG_DEBUG_FS)
 
-static void dump_edm(struct PVRSRV_SGXDEV_INFO *psDevInfo)
+static size_t __print_edm_trace(struct PVRSRV_SGXDEV_INFO *sdev, char *dst,
+                               size_t dst_len)
 {
-       u32 *trace_buffer =
-               psDevInfo->psKernelEDMStatusBufferMemInfo->pvLinAddrKM;
-       u32 last_code, write_offset;
+       u32 *buf_start;
+       u32 *buf_end;
+       u32 *buf;
+       size_t p = 0;
+       size_t wr_ofs;
        int i;
 
-       last_code = *trace_buffer;
-       trace_buffer++;
-       write_offset = *trace_buffer;
+#define _PR(fmt, ...) do {                                                \
+       if (dst)                                                           \
+               p += snprintf(dst + p, dst_len - p, fmt, ## __VA_ARGS__);  \
+       else                                                               \
+               pr_err(fmt, ## __VA_ARGS__);                               \
+} while (0)
 
-       pr_err("Last SGX microkernel status code: 0x%x\n", last_code);
+       if (!sdev->psKernelEDMStatusBufferMemInfo)
+               return 0;
 
-       trace_buffer++;
-       /* Dump the status values */
+       buf = sdev->psKernelEDMStatusBufferMemInfo->pvLinAddrKM;
+
+       _PR("Last SGX microkernel status code: 0x%x\n", *buf);
+       buf++;
+       wr_ofs = *buf;
+       buf++;
+
+       buf_start = buf;
+       buf_end = buf + SGXMK_TRACE_BUFFER_SIZE * 4;
 
+       buf += wr_ofs * 4;
+
+       /* Dump the status values */
        for (i = 0; i < SGXMK_TRACE_BUFFER_SIZE; i++) {
-               u32     *buf;
-               buf = trace_buffer + (((write_offset + i) %
-                                       SGXMK_TRACE_BUFFER_SIZE) * 4);
-               pr_err("(MKT%u) %8.8X %8.8X %8.8X %8.8X\n", i,
-                               buf[2], buf[3], buf[1], buf[0]);
+               _PR("%3d %08X %08X %08X %08X\n",
+                   i, buf[2], buf[3], buf[1], buf[0]);
+               buf += 4;
+               if (buf >= buf_end)
+                       buf = buf_start;
        }
+
+       return p > dst_len ? dst_len : p;
+#undef _PR
 }
-#else
-static void dump_edm(struct PVRSRV_SGXDEV_INFO *psDevInfo) {}
+
+size_t snprint_edm_trace(struct PVRSRV_SGXDEV_INFO *sdev, char *buf,
+                        size_t buf_size)
+{
+       return __print_edm_trace(sdev, buf, buf_size);
+}
+
 #endif
 
+static void dump_edm(struct PVRSRV_SGXDEV_INFO *sdev)
+{
+#ifdef PVRSRV_USSE_EDM_STATUS_DEBUG
+       __print_edm_trace(sdev, NULL, 0);
+#endif
+}
+
 static void dump_process_info(struct PVRSRV_DEVICE_NODE *dev)
 {
        struct PVRSRV_SGXDEV_INFO *dev_info = dev->pvDevice;