Date: Fri, 12 Sep 2008 18:50:10 -0500 Subject: [PATCH] BRIDGE GT mask for DSP traces Separate GT trace option provided to monitor DSP sys traces Signed-off-by: Omar Ramirez Luna <x00omar@xxxxxx> --- arch/arm/plat-omap/include/mach/bridge/io_sm.h | 9 + drivers/dsp/bridge/wmd/io_sm.c | 204 +++++++++++++++++++++++- drivers/dsp/bridge/wmd/mmu_fault.c | 1 - drivers/dsp/bridge/wmd/mmu_fault.h | 7 - drivers/dsp/bridge/wmd/tiomap3430.c | 2 + drivers/dsp/bridge/wmd/ue_deh.c | 190 +--------------------- 6 files changed, 215 insertions(+), 198 deletions(-) diff --git a/arch/arm/plat-omap/include/mach/bridge/io_sm.h b/arch/arm/plat-omap/include/mach/bridge/io_sm.h index 892c06a..b881475 100644 --- a/arch/arm/plat-omap/include/mach/bridge/io_sm.h +++ b/arch/arm/plat-omap/include/mach/bridge/io_sm.h @@ -326,4 +326,13 @@ extern void IO_IntrDSP2(IN struct IO_MGR *pIOMgr, IN u16 wMbVal); + extern void IO_SM_init(void); + +/* + * ========PrintDspTraceBuffer ======== + * Print DSP tracebuffer. + */ + extern DSP_STATUS PrintDspTraceBuffer(struct WMD_DEV_CONTEXT + *hWmdContext); + #endif /* IOSM_ */ diff --git a/drivers/dsp/bridge/wmd/io_sm.c b/drivers/dsp/bridge/wmd/io_sm.c index 09ea3b1..2e6a401 100644 --- a/drivers/dsp/bridge/wmd/io_sm.c +++ b/drivers/dsp/bridge/wmd/io_sm.c @@ -165,6 +165,7 @@ /* ----------------------------------- This */ #include <io_sm.h> #include "_msg_sm.h" +#include <gt.h> /* ----------------------------------- Defines, Data Structures, Typedefs */ #define OUTPUTNOTREADY 0xffff @@ -260,6 +261,11 @@ extern struct constraint_handle *dsp_constraint_handle; #endif #endif #endif + +#if GT_TRACE +static struct GT_Mask dsp_trace_mask = { NULL, NULL }; /* GT trace variable */ +#endif + /* * ======== WMD_IO_Create ======== * Create an IO manager object. @@ -1796,6 +1802,8 @@ void PrintDSPDebugTrace(struct IO_MGR *hIOMgr) { u32 ulNewMessageLength = 0, ulGPPCurPointer; + GT_0trace(dsp_trace_mask, GT_ENTER, "Entering PrintDSPDebugTrace\n"); + while (true) { /* Get the DSP current pointer */ ulGPPCurPointer = *(u32 *) (hIOMgr->ulTraceBufferCurrent); @@ -1818,8 +1826,7 @@ void PrintDSPDebugTrace(struct IO_MGR *hIOMgr) * pointer */ hIOMgr->ulGPPReadPointer += ulNewMessageLength; /* Print the trace messages */ - DBG_Trace(DBG_LEVEL3, "hIOMgr->pMsg=0x%x", - hIOMgr->pMsg); + GT_0trace(dsp_trace_mask, GT_1CLASS, hIOMgr->pMsg); } /* Handle trace buffer wraparound */ else if (ulGPPCurPointer < hIOMgr->ulGPPReadPointer) { @@ -1840,10 +1847,199 @@ void PrintDSPDebugTrace(struct IO_MGR *hIOMgr) hIOMgr->ulGPPReadPointer = hIOMgr->ulTraceBufferBegin + ulNewMessageLength; /* Print the trace messages */ - DBG_Trace(DBG_LEVEL3, "hIOMgr->pMsg=0x%x", - hIOMgr->pMsg); + GT_0trace(dsp_trace_mask, GT_1CLASS, hIOMgr->pMsg); } } } #endif +/* + * ======== PackTraceBuffer ======== + * Removes extra nulls from the trace buffer returned from the DSP. + * Works even on buffers that already are packed (null removed); but has + * one bug in that case -- loses the last character (replaces with '\0'). + * Continues through conversion for full set of nBytes input characters. + * Parameters: + * lpBuf: Pointer to input/output buffer + * nBytes: Number of characters in the buffer + * ulNumWords: Number of DSP words in the buffer. Indicates potential + * number of extra carriage returns to generate. + * Returns: + * DSP_SOK: Success. + * DSP_EMEMORY: Unable to allocate memory. + * Requires: + * lpBuf must be a fully allocated writable block of at least nBytes. + * There are no more than ulNumWords extra characters needed (the number of + * linefeeds minus the number of NULLS in the input buffer). + */ +#if ((defined DEBUG) || (defined DDSP_DEBUG_PRODUCT))\ + && GT_TRACE +static DSP_STATUS PackTraceBuffer(char *lpBuf, u32 nBytes, u32 ulNumWords) +{ + DSP_STATUS status = DSP_SOK; + + char *lpTmpBuf; + char *lpBufStart; + char *lpTmpStart; + u32 nCnt; + char thisChar; + + /* tmp workspace, 1 KB longer than input buf */ + lpTmpBuf = MEM_Calloc((nBytes + ulNumWords), MEM_PAGED); + if (lpTmpBuf == NULL) { + DBG_Trace(DBG_LEVEL7, "PackTrace buffer:OutofMemory \n"); + status = DSP_EMEMORY; + } + + if (DSP_SUCCEEDED(status)) { + lpBufStart = lpBuf; + lpTmpStart = lpTmpBuf; + for (nCnt = nBytes; nCnt > 0; nCnt--) { + thisChar = *lpBuf++; + switch (thisChar) { + case '\0': /* Skip null bytes */ + break; + case '\n': /* Convert \n to \r\n */ + /* NOTE: do not reverse order; Some OS */ + /* editors control doesn't understand "\n\r" */ + *lpTmpBuf++ = '\r'; + *lpTmpBuf++ = '\n'; + break; + default: /* Copy in the actual ascii byte */ + *lpTmpBuf++ = thisChar; + break; + } + } + *lpTmpBuf = '\0'; /* Make sure tmp buf is null terminated */ + /* Cut output down to input buf size */ + strncpy(lpBufStart, lpTmpStart, nBytes); + /*Make sure output is null terminated */ + lpBufStart[nBytes - 1] = '\0'; + MEM_Free(lpTmpStart); + } + + return status; +} +#endif /* ((defined DEBUG) || (defined DDSP_DEBUG_PRODUCT)) && GT_TRACE */ + +/* + * ======== PrintDspTraceBuffer ======== + * Prints the trace buffer returned from the DSP (if DBG_Trace is enabled). + * Parameters: + * hDehMgr: Handle to DEH manager object + * number of extra carriage returns to generate. + * Returns: + * DSP_SOK: Success. + * DSP_EMEMORY: Unable to allocate memory. + * Requires: + * hDehMgr muse be valid. Checked in WMD_DEH_Notify. + */ +DSP_STATUS PrintDspTraceBuffer(struct WMD_DEV_CONTEXT *hWmdContext) +{ + DSP_STATUS status = DSP_SOK; + +#if ((defined DEBUG) || (defined DDSP_DEBUG_PRODUCT))\ + && GT_TRACE + + struct COD_MANAGER *hCodMgr; + u32 ulTraceEnd; + u32 ulTraceBegin; + u32 ulNumBytes = 0; + u32 ulNumWords = 0; + u32 ulWordSize = 2; + CONST u32 uMaxSize = 512; + char *pszBuf; + u16 *lpszBuf; + + struct WMD_DEV_CONTEXT *pWmdContext = (struct WMD_DEV_CONTEXT *) + hWmdContext; + struct WMD_DRV_INTERFACE *pIntfFxns; + struct DEV_OBJECT *pDevObject = (struct DEV_OBJECT *) + pWmdContext->hDevObject; + + status = DEV_GetCodMgr(pDevObject, &hCodMgr); + if (DSP_FAILED(status)) + GT_0trace(dsp_trace_mask, GT_2CLASS, + "PrintDspTraceBuffer: Failed on DEV_GetCodMgr.\n"); + + if (DSP_SUCCEEDED(status)) { + /* Look for SYS_PUTCBEG/SYS_PUTCEND: */ + status = COD_GetSymValue(hCodMgr, COD_TRACEBEG, &ulTraceBegin); + GT_1trace(dsp_trace_mask, GT_2CLASS, + "PrintDspTraceBuffer: ulTraceBegin Value 0x%x\n", + ulTraceBegin); + if (DSP_FAILED(status)) + GT_0trace(dsp_trace_mask, GT_2CLASS, + "PrintDspTraceBuffer: Failed on " + "COD_GetSymValue.\n"); + + } + if (DSP_SUCCEEDED(status)) { + status = COD_GetSymValue(hCodMgr, COD_TRACEEND, &ulTraceEnd); + GT_1trace(dsp_trace_mask, GT_2CLASS, + "PrintDspTraceBuffer: ulTraceEnd Value 0x%x\n", + ulTraceEnd); + if (DSP_FAILED(status)) + GT_0trace(dsp_trace_mask, GT_2CLASS, + "PrintDspTraceBuffer: Failed on " + "COD_GetSymValue.\n"); + + } + if (DSP_SUCCEEDED(status)) { + ulNumBytes = (ulTraceEnd - ulTraceBegin) * ulWordSize; + /* If the chip type is 55 then the addresses will be + * byte addresses; convert them to word addresses. */ + if (ulNumBytes > uMaxSize) + ulNumBytes = uMaxSize; + + /* make sure the data we request fits evenly */ + ulNumBytes = (ulNumBytes / ulWordSize) * ulWordSize; + GT_1trace(dsp_trace_mask, GT_2CLASS, "PrintDspTraceBuffer: " + "ulNumBytes 0x%x\n", ulNumBytes); + ulNumWords = ulNumBytes * ulWordSize; + GT_1trace(dsp_trace_mask, GT_2CLASS, "PrintDspTraceBuffer: " + "ulNumWords 0x%x\n", ulNumWords); + status = DEV_GetIntfFxns(pDevObject, &pIntfFxns); + } + + if (DSP_SUCCEEDED(status)) { + pszBuf = MEM_Calloc(uMaxSize, MEM_NONPAGED); + lpszBuf = MEM_Calloc(ulNumBytes * 2, MEM_NONPAGED); + if (pszBuf != NULL) { + /* Read bytes from the DSP trace buffer... */ + status = (*pIntfFxns->pfnBrdRead)(hWmdContext, + (u8 *)pszBuf, (u32)ulTraceBegin, + ulNumBytes, 0); + if (DSP_FAILED(status)) + GT_0trace(dsp_trace_mask, GT_2CLASS, + "PrintDspTraceBuffer: " + "Failed to Read Trace Buffer.\n"); + + if (DSP_SUCCEEDED(status)) { + /* Pack and do newline conversion */ + GT_0trace(dsp_trace_mask, GT_2CLASS, + "PrintDspTraceBuffer: " + "before pack and unpack.\n"); + PackTraceBuffer(pszBuf, ulNumBytes, ulNumWords); + GT_1trace(dsp_trace_mask, GT_1CLASS, + "DSP Trace Buffer:\n%s\n", pszBuf); + } + MEM_Free(pszBuf); + MEM_Free(lpszBuf); + } else { + GT_0trace(dsp_trace_mask, GT_2CLASS, + "PrintDspTraceBuffer: Failed to " + "allocate trace buffer.\n"); + status = DSP_EMEMORY; + } + } +#endif + return status; +} + +void IO_SM_init(void) +{ + + GT_create(&dsp_trace_mask, "DT"); /* DSP Trace Mask */ + +} diff --git a/drivers/dsp/bridge/wmd/mmu_fault.c b/drivers/dsp/bridge/wmd/mmu_fault.c index 936af22..683d0b2 100644 --- a/drivers/dsp/bridge/wmd/mmu_fault.c +++ b/drivers/dsp/bridge/wmd/mmu_fault.c @@ -137,7 +137,6 @@ irqreturn_t MMU_FaultIsr(int irq, IN void *pRefData) HW_MMU_EventDisable(resources.dwDmmuBase, HW_MMU_ALL_INTERRUPTS); } - PrintDspTraceBuffer(pDehMgr); } return IRQ_HANDLED; } diff --git a/drivers/dsp/bridge/wmd/mmu_fault.h b/drivers/dsp/bridge/wmd/mmu_fault.h index 009382a..e05e475 100644 --- a/drivers/dsp/bridge/wmd/mmu_fault.h +++ b/drivers/dsp/bridge/wmd/mmu_fault.h @@ -41,12 +41,5 @@ */ irqreturn_t MMU_FaultIsr(int irq, IN void *pRefData); -/* - * ========PrintDspTraceBuffer ======== - * Print DSP tracebuffer. - */ - -extern DSP_STATUS PrintDspTraceBuffer(struct DEH_MGR *hDehMgr); - #endif /* MMU_FAULT_ */ diff --git a/drivers/dsp/bridge/wmd/tiomap3430.c b/drivers/dsp/bridge/wmd/tiomap3430.c index b850f23..e5c235d 100644 --- a/drivers/dsp/bridge/wmd/tiomap3430.c +++ b/drivers/dsp/bridge/wmd/tiomap3430.c @@ -246,6 +246,8 @@ void WMD_DRV_Entry(OUT struct WMD_DRV_INTERFACE **ppDrvInterface, DBC_Require(pstrWMDFileName != NULL); DBG_Trace(DBG_ENTER, "In the WMD_DRV_Entry \n"); + IO_SM_init(); /* Initialization of io_sm module */ + if (strcmp(pstrWMDFileName, "UMA") == 0) *ppDrvInterface = &drvInterfaceFxns; else diff --git a/drivers/dsp/bridge/wmd/ue_deh.c b/drivers/dsp/bridge/wmd/ue_deh.c index 665304f..b2a85e2 100644 --- a/drivers/dsp/bridge/wmd/ue_deh.c +++ b/drivers/dsp/bridge/wmd/ue_deh.c @@ -67,6 +67,7 @@ #include "_tiomap.h" #include "_deh.h" #include <_tiomap_mmu.h> +#include <io_sm.h> static struct HW_MMUMapAttrs_t mapAttrs = { HW_LITTLE_ENDIAN, HW_ELEM_SIZE_16BIT, @@ -186,186 +187,6 @@ DSP_STATUS WMD_DEH_RegisterNotify(struct DEH_MGR *hDehMgr, u32 uEventMask, /* - * ======== PackTraceBuffer ======== - * Removes extra nulls from the trace buffer returned from the DSP. - * Works even on buffers that already are packed (null removed); but has - * one bug in that case -- loses the last character (replaces with '\0'). - * Continues through conversion for full set of nBytes input characters. - * Parameters: - * lpBuf: Pointer to input/output buffer - * nBytes: Number of characters in the buffer - * ulNumWords: Number of DSP words in the buffer. Indicates potential - * number of extra carriage returns to generate. - * Returns: - * DSP_SOK: Success. - * DSP_EMEMORY: Unable to allocate memory. - * Requires: - * lpBuf must be a fully allocated writable block of at least nBytes. - * There are no more than ulNumWords extra characters needed (the number of - * linefeeds minus the number of NULLS in the input buffer). - */ -#if ((defined DEBUG) || (defined DDSP_DEBUG_PRODUCT))\ - && GT_TRACE -static DSP_STATUS PackTraceBuffer(char *lpBuf, u32 nBytes, u32 ulNumWords) -{ - DSP_STATUS status = DSP_SOK; - - char *lpTmpBuf; - char *lpBufStart; - char *lpTmpStart; - u32 nCnt; - char thisChar; - - /* tmp workspace, 1 KB longer than input buf */ - lpTmpBuf = MEM_Calloc((nBytes + ulNumWords), MEM_PAGED); - if (lpTmpBuf == NULL) { - DBG_Trace(DBG_LEVEL7, "PackTrace buffer:OutofMemory \n"); - status = DSP_EMEMORY; - } - - if (DSP_SUCCEEDED(status)) { - lpBufStart = lpBuf; - lpTmpStart = lpTmpBuf; - for (nCnt = nBytes; nCnt > 0; nCnt--) { - thisChar = *lpBuf++; - switch (thisChar) { - case '\0': /* Skip null bytes */ - break; - case '\n': /* Convert \n to \r\n */ - /* NOTE: do not reverse order; Some OS */ - /* editors control doesn't understand "\n\r" */ - *lpTmpBuf++ = '\r'; - *lpTmpBuf++ = '\n'; - break; - default: /* Copy in the actual ascii byte */ - *lpTmpBuf++ = thisChar; - break; - } - } - *lpTmpBuf = '\0'; /* Make sure tmp buf is null terminated */ - /* Cut output down to input buf size */ - strncpy(lpBufStart, lpTmpStart, nBytes); - /*Make sure output is null terminated */ - lpBufStart[nBytes - 1] = '\0'; - MEM_Free(lpTmpStart); - } - - return status; -} -#endif /* ((defined DEBUG) || (defined DDSP_DEBUG_PRODUCT)) && GT_TRACE */ - -/* - * ======== PrintDspTraceBuffer ======== - * Prints the trace buffer returned from the DSP (if DBG_Trace is enabled). - * Parameters: - * hDehMgr: Handle to DEH manager object - * number of extra carriage returns to generate. - * Returns: - * DSP_SOK: Success. - * DSP_EMEMORY: Unable to allocate memory. - * Requires: - * hDehMgr muse be valid. Checked in WMD_DEH_Notify. - */ -DSP_STATUS PrintDspTraceBuffer(struct DEH_MGR *hDehMgr) -{ - DSP_STATUS status = DSP_SOK; - -#if ((defined DEBUG) || (defined DDSP_DEBUG_PRODUCT))\ - && GT_TRACE - - struct COD_MANAGER *hCodMgr; - u32 ulTraceEnd; - u32 ulTraceBegin; - u32 ulNumBytes = 0; - u32 ulNumWords = 0; - u32 ulWordSize = 2; - CONST u32 uMaxSize = 512; - char *pszBuf; - u16 *lpszBuf; - struct WMD_DRV_INTERFACE *pIntfFxns; - struct DEH_MGR *pDehMgr = (struct DEH_MGR *)hDehMgr; - struct DEV_OBJECT *hDevObject = ((struct WMD_DEV_CONTEXT *) - pDehMgr->hWmdContext)->hDevObject; - - status = DEV_GetCodMgr(hDevObject, &hCodMgr); - if (DSP_FAILED(status)) { - DBG_Trace(DBG_LEVEL7, - "PrintDspTraceBuffer: Failed on DEV_GetCodMgr.\n"); - } - - if (DSP_SUCCEEDED(status)) { - /* Look for SYS_PUTCBEG/SYS_PUTCEND: */ - status = COD_GetSymValue(hCodMgr, COD_TRACEBEG, &ulTraceBegin); - DBG_Trace(DBG_LEVEL1, - "PrintDspTraceBuffer: ulTraceBegin Value 0x%x\n", - ulTraceBegin); - if (DSP_FAILED(status)) { - DBG_Trace(DBG_LEVEL7, "PrintDspTraceBuffer: Failed on " - "COD_GetSymValue.\n"); - } - } - if (DSP_SUCCEEDED(status)) { - status = COD_GetSymValue(hCodMgr, COD_TRACEEND, &ulTraceEnd); - DBG_Trace(DBG_LEVEL1, - "PrintDspTraceBuffer: ulTraceEnd Value 0x%x\n", - ulTraceEnd); - if (DSP_FAILED(status)) { - DBG_Trace(DBG_LEVEL7, "PrintDspTraceBuffer: Failed on " - "COD_GetSymValue.\n"); - } - } - if (DSP_SUCCEEDED(status)) { - ulNumBytes = (ulTraceEnd - ulTraceBegin) * ulWordSize; - /* If the chip type is 55 then the addresses will be - * byte addresses; convert them to word addresses. */ - if (ulNumBytes > uMaxSize) - ulNumBytes = uMaxSize; - - /* make sure the data we request fits evenly */ - ulNumBytes = (ulNumBytes / ulWordSize) * ulWordSize; - DBG_Trace(DBG_LEVEL1, "PrintDspTraceBuffer: ulNumBytes 0x%x\n", - ulNumBytes); - ulNumWords = ulNumBytes * ulWordSize; - DBG_Trace(DBG_LEVEL1, "PrintDspTraceBuffer: ulNumWords 0x%x\n", - ulNumWords); - status = DEV_GetIntfFxns(hDevObject, &pIntfFxns); - } - - - if (DSP_SUCCEEDED(status)) { - pszBuf = MEM_Calloc(uMaxSize, MEM_NONPAGED); - lpszBuf = MEM_Calloc(ulNumBytes * 2, MEM_NONPAGED); - if (pszBuf != NULL) { - /* Read bytes from the DSP trace buffer... */ - status = (*pIntfFxns->pfnBrdRead)(pDehMgr->hWmdContext, - (u8 *)pszBuf, (u32)ulTraceBegin, - ulNumBytes, 0); - if (DSP_FAILED(status)) { - DBG_Trace(DBG_LEVEL7, "PrintDspTraceBuffer: " - "Failed to Read Trace Buffer.\n"); - } - if (DSP_SUCCEEDED(status)) { - /* Pack and do newline conversion */ - DBG_Trace(DBG_LEVEL1, "PrintDspTraceBuffer: " - "before pack and unpack.\n"); - PackTraceBuffer(pszBuf, ulNumBytes, ulNumWords); - DBG_Trace(DBG_LEVEL7, "DSP Trace Buffer:\n%s\n", - pszBuf); - } - MEM_Free(pszBuf); - MEM_Free(lpszBuf); - } else { - DBG_Trace(DBG_LEVEL7, "PrintDspTraceBuffer: Failed to " - "allocate trace buffer.\n"); - status = DSP_EMEMORY; - } - } -#endif - return status; -} - - -/* * ======== WMD_DEH_Notify ======== * DEH error notification function. Informs user about the error. */ @@ -456,11 +277,6 @@ void WMD_DEH_Notify(struct DEH_MGR *hDehMgr, u32 ulEventMask, /* Clear MMU interrupt */ HW_MMU_EventAck(resources.dwDmmuBase, HW_MMU_TRANSLATION_FAULT); - DBG_Trace(DBG_LEVEL6, - "***** PrintDspTraceBuffer: before\n"); - PrintDspTraceBuffer(hDehMgr); - DBG_Trace(DBG_LEVEL6, - "***** PrintDspTraceBuffer: after \n"); break; default: DBG_Trace(DBG_LEVEL6, @@ -468,6 +284,9 @@ void WMD_DEH_Notify(struct DEH_MGR *hDehMgr, u32 ulEventMask, "0x%x\n", dwErrInfo); break; } + /* Call DSP Trace Buffer */ + PrintDspTraceBuffer(hDehMgr->hWmdContext); + /* Signal DSP error/exception event. */ NTFY_Notify(pDehMgr->hNtfy, ulEventMask); } @@ -503,4 +322,3 @@ DSP_STATUS WMD_DEH_GetInfo(struct DEH_MGR *hDehMgr, return status; } - -- 1.5.5.4 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html