From: Fernando Guzman Lugo <x0095840@xxxxxx> Added support for reloading the base image after DSP error Signed-off-by: Hari Kanigeri <h-kanigeri2@xxxxxx> Signed-off-by: Fernando Guzman Lugo <x0095840@xxxxxx> Signed-off-by: Omar Ramirez Luna <x00omar@xxxxxx> --- arch/arm/plat-omap/include/dspbridge/wmddeh.h | 2 + drivers/dsp/bridge/rmgr/node.c | 72 +++++++------ drivers/dsp/bridge/rmgr/proc.c | 153 +++++++++++++++++++------ drivers/dsp/bridge/wmd/ue_deh.c | 37 +++++- 4 files changed, 188 insertions(+), 76 deletions(-) diff --git a/arch/arm/plat-omap/include/dspbridge/wmddeh.h b/arch/arm/plat-omap/include/dspbridge/wmddeh.h index dd50a3a..60704da 100644 --- a/arch/arm/plat-omap/include/dspbridge/wmddeh.h +++ b/arch/arm/plat-omap/include/dspbridge/wmddeh.h @@ -61,4 +61,6 @@ extern void WMD_DEH_Notify(struct DEH_MGR *hDehMgr, u32 ulEventMask, u32 dwErrInfo); + + extern void WMD_DEH_ReleaseDummyMem(void); #endif /* WMDDEH_ */ diff --git a/drivers/dsp/bridge/rmgr/node.c b/drivers/dsp/bridge/rmgr/node.c index af604f9..53a42bf 100644 --- a/drivers/dsp/bridge/rmgr/node.c +++ b/drivers/dsp/bridge/rmgr/node.c @@ -864,8 +864,7 @@ DBAPI NODE_AllocMsgBuf(struct NODE_OBJECT *hNode, u32 uSize, if (!MEM_IsValidHandle(pNode, NODE_SIGNATURE)) status = DSP_EHANDLE; - - if (NODE_GetType(pNode) == NODE_DEVICE) + else if (NODE_GetType(pNode) == NODE_DEVICE) status = DSP_ENODETYPE; if (DSP_FAILED(status)) @@ -1337,6 +1336,10 @@ DSP_STATUS NODE_Create(struct NODE_OBJECT *hNode) DBC_Require(cRefs > 0); GT_1trace(NODE_debugMask, GT_ENTER, "NODE_Create: hNode: 0x%x\n", hNode); + if (!MEM_IsValidHandle(pNode, NODE_SIGNATURE)) { + status = DSP_EHANDLE; + goto func_end; + } hProcessor = hNode->hProcessor; status = PROC_GetState(hProcessor, &procStatus, sizeof(struct DSP_PROCESSORSTATE)); @@ -1921,9 +1924,10 @@ DSP_STATUS NODE_FreeMsgBuf(struct NODE_OBJECT *hNode, IN u8 *pBuffer, DBC_Require(pNode->hXlator != NULL); GT_3trace(NODE_debugMask, GT_ENTER, "NODE_FreeMsgBuf: hNode: 0x%x\t" "pBuffer: 0x%x\tpAttr: 0x%x\n", hNode, pBuffer, pAttr); - if (!MEM_IsValidHandle(hNode, NODE_SIGNATURE)) + if (!MEM_IsValidHandle(hNode, NODE_SIGNATURE)) { status = DSP_EHANDLE; - + goto func_end; + } status = PROC_GetProcessorId(pNode->hProcessor, &procId); if (procId == DSP_UNIT) { if (DSP_SUCCEEDED(status)) { @@ -1946,6 +1950,7 @@ DSP_STATUS NODE_FreeMsgBuf(struct NODE_OBJECT *hNode, IN u8 *pBuffer, } else { DBC_Assert(NULL); /* BUG */ } +func_end: return status; } @@ -2063,6 +2068,10 @@ DSP_STATUS NODE_GetMessage(struct NODE_OBJECT *hNode, OUT struct DSP_MSG *pMsg, GT_3trace(NODE_debugMask, GT_ENTER, "NODE_GetMessage: hNode: 0x%x\tpMsg: " "0x%x\tuTimeout: 0x%x\n", hNode, pMsg, uTimeout); + if (!MEM_IsValidHandle(hNode, NODE_SIGNATURE)) { + status = DSP_EHANDLE; + goto func_end; + } hProcessor = hNode->hProcessor; status = PROC_GetState(hProcessor, &procStatus, sizeof(struct DSP_PROCESSORSTATE)); @@ -2076,10 +2085,6 @@ DSP_STATUS NODE_GetMessage(struct NODE_OBJECT *hNode, OUT struct DSP_MSG *pMsg, status = DSP_EFAIL; goto func_end; } - if (!MEM_IsValidHandle(hNode, NODE_SIGNATURE)) { - status = DSP_EHANDLE; - goto func_end; - } hNodeMgr = hNode->hNodeMgr; nodeType = NODE_GetType(hNode); if (nodeType != NODE_MESSAGE && nodeType != NODE_TASK && @@ -2295,12 +2300,14 @@ DSP_STATUS NODE_Pause(struct NODE_OBJECT *hNode) if (!MEM_IsValidHandle(hNode, NODE_SIGNATURE)) { status = DSP_EHANDLE; + goto func_end; } else { nodeType = NODE_GetType(hNode); if (nodeType != NODE_TASK && nodeType != NODE_DAISSOCKET) status = DSP_ENODETYPE; - } + if (DSP_FAILED(status)) + goto func_end; status = PROC_GetProcessorId(pNode->hProcessor, &procId); @@ -2387,6 +2394,10 @@ DSP_STATUS NODE_PutMessage(struct NODE_OBJECT *hNode, GT_3trace(NODE_debugMask, GT_ENTER, "NODE_PutMessage: hNode: 0x%x\tpMsg: " "0x%x\tuTimeout: 0x%x\n", hNode, pMsg, uTimeout); + if (!MEM_IsValidHandle(hNode, NODE_SIGNATURE)) { + status = DSP_EHANDLE; + goto func_end; + } hProcessor = hNode->hProcessor; status = PROC_GetState(hProcessor, &procStatus, sizeof(struct DSP_PROCESSORSTATE)); @@ -2400,15 +2411,12 @@ DSP_STATUS NODE_PutMessage(struct NODE_OBJECT *hNode, status = DSP_EFAIL; goto func_end; } - if (!MEM_IsValidHandle(hNode, NODE_SIGNATURE)) - status = DSP_EHANDLE; - else { - hNodeMgr = hNode->hNodeMgr; - nodeType = NODE_GetType(hNode); - if (nodeType != NODE_MESSAGE && nodeType != NODE_TASK && - nodeType != NODE_DAISSOCKET) - status = DSP_ENODETYPE; - } + hNodeMgr = hNode->hNodeMgr; + nodeType = NODE_GetType(hNode); + if (nodeType != NODE_MESSAGE && nodeType != NODE_TASK && + nodeType != NODE_DAISSOCKET) + status = DSP_ENODETYPE; + if (DSP_SUCCEEDED(status)) { /* Check node state. Can't send messages to a node after * we've sent the RMS_EXIT command. There is still the @@ -2545,6 +2553,10 @@ DSP_STATUS NODE_Run(struct NODE_OBJECT *hNode) DBC_Require(cRefs > 0); GT_1trace(NODE_debugMask, GT_ENTER, "NODE_Run: hNode: 0x%x\n", hNode); + if (!MEM_IsValidHandle(hNode, NODE_SIGNATURE)) { + status = DSP_EHANDLE; + goto func_end; + } hProcessor = hNode->hProcessor; status = PROC_GetState(hProcessor, &procStatus, sizeof(struct DSP_PROCESSORSTATE)); @@ -2557,13 +2569,9 @@ DSP_STATUS NODE_Run(struct NODE_OBJECT *hNode) status = DSP_EFAIL; goto func_end; } - if (!MEM_IsValidHandle(hNode, NODE_SIGNATURE)) { - status = DSP_EHANDLE; - } else { - nodeType = NODE_GetType(hNode); - if (nodeType == NODE_DEVICE) - status = DSP_ENODETYPE; - } + nodeType = NODE_GetType(hNode); + if (nodeType == NODE_DEVICE) + status = DSP_ENODETYPE; if (DSP_FAILED(status)) goto func_end; @@ -2666,7 +2674,10 @@ DSP_STATUS NODE_Terminate(struct NODE_OBJECT *hNode, OUT DSP_STATUS *pStatus) GT_1trace(NODE_debugMask, GT_ENTER, "NODE_Terminate: hNode: 0x%x\n", hNode); - + if (!MEM_IsValidHandle(hNode, NODE_SIGNATURE)) { + status = DSP_EHANDLE; + goto func_end; + } if (pNode->hProcessor == NULL) { GT_1trace(NODE_debugMask, GT_4CLASS, "NODE_Terminate: pNode->hProcessor = 0x%x\n", @@ -2677,15 +2688,10 @@ DSP_STATUS NODE_Terminate(struct NODE_OBJECT *hNode, OUT DSP_STATUS *pStatus) if (DSP_SUCCEEDED(status)) { hNodeMgr = hNode->hNodeMgr; - - if (!MEM_IsValidHandle(hNode, NODE_SIGNATURE)) - status = DSP_EHANDLE; - else { - nodeType = NODE_GetType(hNode); - if (nodeType != NODE_TASK && nodeType != + nodeType = NODE_GetType(hNode); + if (nodeType != NODE_TASK && nodeType != NODE_DAISSOCKET) status = DSP_ENODETYPE; - } } if (DSP_SUCCEEDED(status)) { /* Check node state */ diff --git a/drivers/dsp/bridge/rmgr/proc.c b/drivers/dsp/bridge/rmgr/proc.c index 59073dd..bb8cff3 100644 --- a/drivers/dsp/bridge/rmgr/proc.c +++ b/drivers/dsp/bridge/rmgr/proc.c @@ -121,7 +121,7 @@ #include <dspbridge/sync.h> /* ----------------------------------- Mini Driver */ #include <dspbridge/wmd.h> - +#include <dspbridge/wmddeh.h> /* ----------------------------------- Platform Manager */ #include <dspbridge/cod.h> #include <dspbridge/dev.h> @@ -197,6 +197,37 @@ static s32 GetEnvpCount(char **envp); static char **PrependEnvp(char **newEnvp, char **envp, s32 cEnvp, s32 cNewEnvp, char *szVar); +/* + * ======== PROC_CleanupAllResources ===== + * Purpose: + * Funtion to clean the process resources. + * This function is intended to be called when the + * processor is in error state + */ +DSP_STATUS PROC_CleanupAllResources(void) +{ + DSP_STATUS dsp_status = DSP_SOK; + HANDLE hDrvObject = NULL; + struct PROCESS_CONTEXT *pCtxtclosed = NULL; + GT_0trace(PROC_DebugMask, GT_ENTER, "PROC_CleanupAllResources\n"); + dsp_status = CFG_GetObject((u32 *)&hDrvObject, REG_DRV_OBJECT); + if (DSP_FAILED(dsp_status)) + goto func_end; + DRV_GetProcCtxtList(&pCtxtclosed, (struct DRV_OBJECT *)hDrvObject); + while (pCtxtclosed != NULL) { + if (current->pid != pCtxtclosed->pid) { + GT_1trace(PROC_DebugMask, GT_5CLASS, + "***Cleanup of " + "process***%d\n", pCtxtclosed->pid); + if (pCtxtclosed->hProcessor) + PROC_Detach(pCtxtclosed->hProcessor); + } + pCtxtclosed = pCtxtclosed->next; + } + WMD_DEH_ReleaseDummyMem(); +func_end: + return dsp_status; +} /* * ======== PROC_Attach ======== @@ -619,33 +650,30 @@ DSP_STATUS PROC_Detach(DSP_HPROCESSOR hProcessor) "hProcessor: 0x%x\n", hProcessor); if (MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) { - /* Notify the Client */ - NTFY_Notify(pProcObject->hNtfy, DSP_PROCESSORDETACH); - /* Remove the notification memory */ - if (pProcObject->hNtfy) - NTFY_Delete(pProcObject->hNtfy); - - if (pProcObject->g_pszLastCoff) { - MEM_Free(pProcObject->g_pszLastCoff); - pProcObject->g_pszLastCoff = NULL; - } - #ifndef RES_CLEANUP_DISABLE /* Return PID instead of process handle */ - hProcess = current->pid; - + hProcess = pProcObject->hProcess; res_status = CFG_GetObject((u32 *)&hDRVObject, REG_DRV_OBJECT); if (DSP_SUCCEEDED(res_status)) { DRV_GetProcContext(hProcess, (struct DRV_OBJECT *)hDRVObject, &pPctxt, NULL, 0); if (pPctxt != NULL) { - DRV_ProcFreeDMMRes(pPctxt); + DRV_RemoveAllResources(pPctxt); pPctxt->hProcessor = NULL; } } #endif + /* Notify the Client */ + NTFY_Notify(pProcObject->hNtfy, DSP_PROCESSORDETACH); + /* Remove the notification memory */ + if (pProcObject->hNtfy) + NTFY_Delete(pProcObject->hNtfy); + if (pProcObject->g_pszLastCoff) { + MEM_Free(pProcObject->g_pszLastCoff); + pProcObject->g_pszLastCoff = NULL; + } /* Remove the Proc from the DEV List */ (void)DEV_RemoveProcObject(pProcObject->hDevObject, (u32)pProcObject); @@ -720,17 +748,23 @@ DSP_STATUS PROC_FlushMemory(DSP_HPROCESSOR hProcessor, void *pMpuAddr, /* Keep STATUS here for future additions to this function */ DSP_STATUS status = DSP_SOK; enum DSP_FLUSHTYPE FlushMemType = PROC_WRITEBACK_INVALIDATE_MEM; + struct PROC_OBJECT *pProcObject = (struct PROC_OBJECT *)hProcessor; DBC_Require(cRefs > 0); GT_4trace(PROC_DebugMask, GT_ENTER, "Entered PROC_FlushMemory, args:\n\t" "hProcessor: 0x%x pMpuAddr: 0x%x ulSize 0x%x, ulFlags 0x%x\n", hProcessor, pMpuAddr, ulSize, ulFlags); - /* Critical section */ - (void)SYNC_EnterCS(hProcLock); - MEM_FlushCache(pMpuAddr, ulSize, FlushMemType); - (void)SYNC_LeaveCS(hProcLock); - + if (MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) { + /* Critical section */ + (void)SYNC_EnterCS(hProcLock); + MEM_FlushCache(pMpuAddr, ulSize, FlushMemType); + (void)SYNC_LeaveCS(hProcLock); + } else { + status = DSP_EHANDLE; + GT_0trace(PROC_DebugMask, GT_7CLASS, "PROC_FlushMemory: " + "InValid Processor Handle \n"); + } GT_1trace(PROC_DebugMask, GT_ENTER, "Leaving PROC_FlushMemory [0x%x]", status); return status; @@ -748,15 +782,21 @@ DSP_STATUS PROC_InvalidateMemory(DSP_HPROCESSOR hProcessor, void *pMpuAddr, /* Keep STATUS here for future additions to this function */ DSP_STATUS status = DSP_SOK; enum DSP_FLUSHTYPE FlushMemType = PROC_INVALIDATE_MEM; + struct PROC_OBJECT *pProcObject = (struct PROC_OBJECT *)hProcessor; DBC_Require(cRefs > 0); GT_3trace(PROC_DebugMask, GT_ENTER, "Entered PROC_InvalidateMemory, args:\n\t" "hProcessor: 0x%x pMpuAddr: 0x%x ulSize 0x%x\n", hProcessor, pMpuAddr, ulSize); - (void)SYNC_EnterCS(hProcLock); - MEM_FlushCache(pMpuAddr, ulSize, FlushMemType); - (void)SYNC_LeaveCS(hProcLock); - + if (MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) { + (void)SYNC_EnterCS(hProcLock); + MEM_FlushCache(pMpuAddr, ulSize, FlushMemType); + (void)SYNC_LeaveCS(hProcLock); + } else { + status = DSP_EHANDLE; + GT_0trace(PROC_DebugMask, GT_7CLASS, "PROC_InvalidateMemory: " + "InValid Processor Handle \n"); + } GT_1trace(PROC_DebugMask, GT_ENTER, "Leaving PROC_InvalidateMemory [0x%x]", status); return status; @@ -874,6 +914,7 @@ DSP_STATUS PROC_GetDevObject(DSP_HPROCESSOR hProcessor, status = DSP_SOK; } else { *phDevObject = NULL; + status = DSP_EHANDLE; } DBC_Ensure((DSP_SUCCEEDED(status) && *phDevObject != NULL) || @@ -1061,11 +1102,9 @@ DSP_STATUS PROC_Load(DSP_HPROCESSOR hProcessor, IN CONST s32 iArgc, goto func_end; } if (pProcObject->bIsAlreadyAttached) { - status = DSP_EATTACHED; - GT_1trace(PROC_DebugMask, GT_7CLASS, - "PROC_Load Abort becuase a GPP " - "Client is already attached status 0x%x \n", status); - goto func_end; + GT_0trace(PROC_DebugMask, GT_7CLASS, + "PROC_Load GPP " + "Client is already attached status \n"); } if (DSP_FAILED(DEV_GetCodMgr(pProcObject->hDevObject, &hCodMgr))) { status = DSP_EFAIL; @@ -1370,6 +1409,12 @@ DSP_STATUS PROC_Map(DSP_HPROCESSOR hProcessor, void *pMpuAddr, u32 ulSize, GT_3trace(PROC_DebugMask, GT_ENTER, "PROC_Map: vaAlign %x, paAlign %x, " "sizeAlign %x\n", vaAlign, paAlign, sizeAlign); + if (!MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) { + status = DSP_EHANDLE; + GT_0trace(PROC_DebugMask, GT_7CLASS, "PROC_Map: " + "InValid Processor Handle \n"); + goto func_end; + } /* Critical section */ (void)SYNC_EnterCS(hProcLock); status = DMM_GetHandle(pProcObject, &hDmmMgr); @@ -1416,6 +1461,7 @@ DSP_STATUS PROC_Map(DSP_HPROCESSOR hProcessor, void *pMpuAddr, u32 ulSize, } } #endif +func_end: GT_1trace(PROC_DebugMask, GT_ENTER, "Leaving PROC_Map [0x%x]", status); return status; } @@ -1518,6 +1564,12 @@ DSP_STATUS PROC_ReserveMemory(DSP_HPROCESSOR hProcessor, u32 ulSize, "Entered PROC_ReserveMemory, args:\n\t" "hProcessor: 0x%x ulSize: 0x%x ppRsvAddr: 0x%x\n", hProcessor, ulSize, ppRsvAddr); + if (!MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) { + status = DSP_EHANDLE; + GT_0trace(PROC_DebugMask, GT_7CLASS, "PROC_Map: " + "InValid Processor Handle \n"); + goto func_end; + } status = DMM_GetHandle(pProcObject, &hDmmMgr); if (DSP_FAILED(status)) { GT_1trace(PROC_DebugMask, GT_7CLASS, "PROC_ReserveMemory: " @@ -1527,6 +1579,7 @@ DSP_STATUS PROC_ReserveMemory(DSP_HPROCESSOR hProcessor, u32 ulSize, GT_1trace(PROC_DebugMask, GT_ENTER, "Leaving PROC_ReserveMemory [0x%x]", status); +func_end: return status; } @@ -1642,9 +1695,8 @@ DSP_STATUS PROC_Stop(DSP_HPROCESSOR hProcessor) u32 uNodeTabSize = 1; u32 uNumNodes = 0; u32 uNodesAllocated = 0; -#ifdef DEBUG BRD_STATUS uBrdState; -#endif + DBC_Require(cRefs > 0); GT_1trace(PROC_DebugMask, GT_ENTER, "Entered PROC_Stop, args:\n\t" "hProcessor: 0x%x\n", hProcessor); @@ -1654,6 +1706,13 @@ DSP_STATUS PROC_Stop(DSP_HPROCESSOR hProcessor) "PROC_Stop :InValid Handle \n"); goto func_end; } + if (DSP_SUCCEEDED((*pProcObject->pIntfFxns->pfnBrdStatus) + (pProcObject->hWmdContext, &uBrdState))) { + /* Clean up all the resources except the current running + * process resources */ + if (uBrdState == BRD_ERROR) + PROC_CleanupAllResources(); + } /* check if there are any running nodes */ status = DEV_GetNodeManager(pProcObject->hDevObject, &hNodeMgr); if (DSP_SUCCEEDED(status) && hNodeMgr) { @@ -1731,6 +1790,12 @@ DSP_STATUS PROC_UnMap(DSP_HPROCESSOR hProcessor, void *pMapAddr) "0x%x pMapAddr: 0x%x\n", hProcessor, pMapAddr); vaAlign = PG_ALIGN_LOW((u32) pMapAddr, PG_SIZE_4K); + if (!MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) { + status = DSP_EHANDLE; + GT_0trace(PROC_DebugMask, GT_7CLASS, "PROC_UnMap: " + "InValid Processor Handle \n"); + goto func_end; + } status = DMM_GetHandle(hProcessor, &hDmmMgr); /* Critical section */ @@ -1792,7 +1857,12 @@ DSP_STATUS PROC_UnReserveMemory(DSP_HPROCESSOR hProcessor, void *pRsvAddr) GT_2trace(PROC_DebugMask, GT_ENTER, "Entered PROC_UnReserveMemory, args:\n\t" "hProcessor: 0x%x pRsvAddr: 0x%x\n", hProcessor, pRsvAddr); - + if (!MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) { + status = DSP_EHANDLE; + GT_0trace(PROC_DebugMask, GT_7CLASS, "PROC_UnMap: " + "InValid Processor Handle \n"); + goto func_end; + } status = DMM_GetHandle(pProcObject, &hDmmMgr); if (DSP_FAILED(status)) GT_1trace(PROC_DebugMask, GT_7CLASS, @@ -1804,7 +1874,7 @@ DSP_STATUS PROC_UnReserveMemory(DSP_HPROCESSOR hProcessor, void *pRsvAddr) GT_1trace(PROC_DebugMask, GT_ENTER, "Leaving PROC_UnReserveMemory [0x%x]", status); - +func_end: return status; } @@ -1938,11 +2008,17 @@ DSP_STATUS PROC_NotifyClients(DSP_HPROCESSOR hProc, u32 uEvents) DBC_Require(MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)); DBC_Require(IsValidProcEvent(uEvents)); DBC_Require(cRefs > 0); + if (!MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) { + status = DSP_EHANDLE; + GT_0trace(PROC_DebugMask, GT_7CLASS, "PROC_NotifyClients: " + "InValid Processor Handle \n"); + goto func_end; + } NTFY_Notify(pProcObject->hNtfy, uEvents); GT_0trace(PROC_DebugMask, GT_1CLASS, "PROC_NotifyClients :Signaled. \n"); - +func_end: return status; } @@ -1979,8 +2055,13 @@ DSP_STATUS PROC_GetProcessorId(DSP_HPROCESSOR hProc, u32 *procID) DSP_STATUS status = DSP_SOK; struct PROC_OBJECT *pProcObject = (struct PROC_OBJECT *)hProc; - *procID = pProcObject->uProcessor; - + if (MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) + *procID = pProcObject->uProcessor; + else { + status = DSP_EHANDLE; + GT_0trace(PROC_DebugMask, GT_7CLASS, "PROC_GetProcessorId: " + "InValid Processor Handle \n"); + } return status; } diff --git a/drivers/dsp/bridge/wmd/ue_deh.c b/drivers/dsp/bridge/wmd/ue_deh.c index 278dae2..b7fd795 100644 --- a/drivers/dsp/bridge/wmd/ue_deh.c +++ b/drivers/dsp/bridge/wmd/ue_deh.c @@ -74,6 +74,8 @@ static struct HW_MMUMapAttrs_t mapAttrs = { HW_LITTLE_ENDIAN, HW_ELEM_SIZE_16BIT, HW_MMU_CPUES} ; #define VirtToPhys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET) + +static u32 dummyVaAddr; /* * ======== WMD_DEH_Create ======== * Creates DEH manager object. @@ -94,6 +96,7 @@ DSP_STATUS WMD_DEH_Create(OUT struct DEH_MGR **phDehMgr, /* Get WMD context info. */ DEV_GetWMDContext(hDevObject, &hWmdContext); DBC_Assert(hWmdContext); + dummyVaAddr = 0; /* Allocate IO manager object: */ MEM_AllocObject(pDehMgr, struct DEH_MGR, SIGNATURE); if (pDehMgr == NULL) { @@ -151,6 +154,8 @@ DSP_STATUS WMD_DEH_Destroy(struct DEH_MGR *hDehMgr) DBG_Trace(DBG_LEVEL1, "Entering DEH_Destroy: 0x%x\n", pDehMgr); if (MEM_IsValidHandle(pDehMgr, SIGNATURE)) { + /* Release dummy VA buffer */ + WMD_DEH_ReleaseDummyMem(); /* If notification object exists, delete it */ if (pDehMgr->hNtfy) (void)NTFY_Delete(pDehMgr->hNtfy); @@ -202,7 +207,6 @@ void WMD_DEH_Notify(struct DEH_MGR *hDehMgr, u32 ulEventMask, u32 HW_MMU_MAX_TLB_COUNT = 31; u32 extern faultAddr; struct CFG_HOSTRES resources; - u32 dummyVaAddr; HW_STATUS hwStatus; status = CFG_GetHostResources( @@ -246,12 +250,9 @@ void WMD_DEH_Notify(struct DEH_MGR *hDehMgr, u32 ulEventMask, "address = 0x%x\n", (unsigned int)faultAddr); dummyVaAddr = (u32)MEM_Calloc(sizeof(char) * 0x1000, MEM_PAGED); - memPhysical = (u32)MEM_Calloc(sizeof(char) * 0x1000, - MEM_PAGED); - dummyVaAddr = PG_ALIGN_LOW((u32)dummyVaAddr, - PG_SIZE_4K); - memPhysical = VirtToPhys(dummyVaAddr); - DBG_Trace(DBG_LEVEL6, "WMD_DEH_Notify: DSP_MMUFAULT, " + memPhysical = VirtToPhys(PG_ALIGN_LOW((u32)dummyVaAddr, + PG_SIZE_4K)); +DBG_Trace(DBG_LEVEL6, "WMD_DEH_Notify: DSP_MMUFAULT, " "mem Physical= 0x%x\n", memPhysical); pDevContext = (struct WMD_DEV_CONTEXT *) pDehMgr->hWmdContext; @@ -288,6 +289,14 @@ void WMD_DEH_Notify(struct DEH_MGR *hDehMgr, u32 ulEventMask, } /* Filter subsequent notifications when an error occurs */ + if (pDevContext->dwBrdState != BRD_ERROR) { + /* Use it as a flag to send notifications the + * first time and error occurred, next time + * state will be BRD_ERROR */ + status1 = DSP_EFAIL; + } + + /* Filter subsequent notifications when an error occurs */ if (pDevContext->dwBrdState != BRD_ERROR) status1 = DSP_SOK; @@ -336,3 +345,17 @@ DSP_STATUS WMD_DEH_GetInfo(struct DEH_MGR *hDehMgr, return status; } + + +/* + * ======== WMD_DEH_ReleaseDummyMem ======== + * Releases memory allocated for dummy page + */ +void WMD_DEH_ReleaseDummyMem(void) +{ + if (dummyVaAddr) { + MEM_Free((void *)dummyVaAddr); + dummyVaAddr = 0; + } +} + -- 1.6.2.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