From: Imre Deak Date: Tue, 14 Dec 2010 00:48:37 +0000 (+0200) Subject: gpu: pvr: add snprint_edm_trace X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b67f63c5d445ea974ded303ab34f383c65c35eea;p=sgx.git gpu: pvr: add snprint_edm_trace Needed by an upcoming patch adding a debugfs entry to dump the trace. Signed-off-by: Imre Deak --- diff --git a/pvr/sgxinfokm.h b/pvr/sgxinfokm.h index 887ebe6..83228d4 100644 --- a/pvr/sgxinfokm.h +++ b/pvr/sgxinfokm.h @@ -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, diff --git a/pvr/sgxinit.c b/pvr/sgxinit.c index dd05eb9..0184eea 100644 --- a/pvr/sgxinit.c +++ b/pvr/sgxinit.c @@ -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;