diff options
author | Pierre Peiffer <pierre.peiffer@stericsson.com> | 2011-09-09 14:45:37 +0200 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2011-12-06 11:00:49 +0100 |
commit | 1e49f4c24a0f6c8f505a9bbff0cf707ac2be51f3 (patch) | |
tree | 3a8ca564ffc04293a9457e09cc3509bbb1c86cc3 /drivers/staging/nmf-cm/cm/engine | |
parent | d6d4cbab47dd19fccec4e8c48f91ad541cfde2cf (diff) |
U8500 CM: send a DSP Panic if it's not responding
* Generate a DSP Panic and send it to user process when the
DSP does not respond anymore.
The issue is that when a process is using a DSP (ie has some
components deployed on a DSP) without any activity (no interaction
with the DSP), the driver needs to tell it when the DSP is dead.
This Panic message is there to solve this issue.
* Force wake-up of MMDSP before changing hardware power state
This a work around for prcmu issue.
ST-Ericsson ID: 359048
ST-Ericsson Linux next: NA
ST-Ericsson FOSS-OUT ID: Trivial
Signed-off-by: Pierre Peiffer <pierre.peiffer@stericsson.com>
Change-Id: I920cc6a8e79e7dc9b39bd77f700a9e0e056b6a81
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/32584
Reviewed-by: Pierre PEIFFER <pierre.peiffer@stericsson.com>
Tested-by: Pierre PEIFFER <pierre.peiffer@stericsson.com>
Diffstat (limited to 'drivers/staging/nmf-cm/cm/engine')
6 files changed, 63 insertions, 23 deletions
diff --git a/drivers/staging/nmf-cm/cm/engine/component/src/initializer.c b/drivers/staging/nmf-cm/cm/engine/component/src/initializer.c index 011dfa18398..7f99b710401 100644 --- a/drivers/staging/nmf-cm/cm/engine/component/src/initializer.c +++ b/drivers/staging/nmf-cm/cm/engine/component/src/initializer.c @@ -24,6 +24,7 @@ /* private prototype */ PRIVATE t_cm_error cm_COMP_generic(t_nmf_core_id coreId, t_event_params_handle paramArray, t_uint32 paramNumber, t_uint32 serviceIndex); +PRIVATE void cm_COMP_generatePanic(t_nmf_core_id coreId); /* * This module is tightly coupled with cm_DSP_components one (communication/initializer) @@ -153,8 +154,10 @@ PUBLIC t_cm_error cm_COMP_CallService( error = cm_COMP_generic(pComp->Template->dspId, params, sizeof(params) / sizeof(t_uint16), serviceIndex); if (isSynchronous == TRUE && error == CM_OK) { - if (OSAL_SEMAPHORE_WAIT_TIMEOUT(semHandle) != SYNC_OK) + if (OSAL_SEMAPHORE_WAIT_TIMEOUT(semHandle) != SYNC_OK) { + cm_COMP_generatePanic(pComp->Template->dspId); error = CM_MPC_NOT_RESPONDING; + } } return error; @@ -180,6 +183,7 @@ PUBLIC void cm_COMP_Flush(t_nmf_core_id coreId) { if (cm_COMP_generic(coreId, params, sizeof(params) / sizeof(t_uint16), NMF_DESTROY_INDEX) != CM_OK || OSAL_SEMAPHORE_WAIT_TIMEOUT(semHandle) != SYNC_OK) { + cm_COMP_generatePanic(coreId); ERROR("CM_MPC_NOT_RESPONDING: can't call flush service\n", 0, 0, 0, 0, 0, 0); } } @@ -250,8 +254,10 @@ PUBLIC t_cm_error cm_COMP_ULPForceWakeup( error = cm_COMP_generic(coreId, NULL, 0, NMF_ULP_FORCEWAKEUP); if (error == CM_OK) { - if (OSAL_SEMAPHORE_WAIT_TIMEOUT(semHandle) != SYNC_OK) + if (OSAL_SEMAPHORE_WAIT_TIMEOUT(semHandle) != SYNC_OK) { + cm_COMP_generatePanic(coreId); error = CM_MPC_NOT_RESPONDING; + } } return error; @@ -335,8 +341,10 @@ PRIVATE t_cm_error cm_COMP_generic( t_uint32 i; // wait for an event in fifo - if (OSAL_SEMAPHORE_WAIT_TIMEOUT(initializerDesc[coreId].fifoSemHandle) != SYNC_OK) + if (OSAL_SEMAPHORE_WAIT_TIMEOUT(initializerDesc[coreId].fifoSemHandle) != SYNC_OK) { + cm_COMP_generatePanic(coreId); return CM_MPC_NOT_RESPONDING; + } // AllocEvent @@ -364,3 +372,12 @@ unlock: return error; } +PRIVATE void cm_COMP_generatePanic(t_nmf_core_id coreId) +{ + const t_dsp_desc* pDspDesc = cm_DSP_GetState(coreId); + + if (pDspDesc->state != MPC_STATE_PANIC) { + cm_DSP_SetStatePanic(coreId); + OSAL_GeneratePanic(coreId, 0); + } +} diff --git a/drivers/staging/nmf-cm/cm/engine/component/src/instantiater.c b/drivers/staging/nmf-cm/cm/engine/component/src/instantiater.c index bd410c9acd9..92c28b63171 100644 --- a/drivers/staging/nmf-cm/cm/engine/component/src/instantiater.c +++ b/drivers/staging/nmf-cm/cm/engine/component/src/instantiater.c @@ -551,15 +551,7 @@ t_cm_error cm_startComponent(t_component_instance* component, t_nmf_client_id cl value, sizeof(value)) == CM_OK) { - // The PRCMU seem not supporting the transition of asking HW IP on while DSP in retention - // -> Thus force wake up of the MMDSP before asking the transition - if ((error = cm_EEM_ForceWakeup(component->Template->dspId)) != CM_OK) - return error; - error = cm_PWR_EnableMPC(MPC_PWR_HWIP, component->Template->dspId); - - cm_EEM_AllowSleep(component->Template->dspId); - if(error != CM_OK) return error; } diff --git a/drivers/staging/nmf-cm/cm/engine/elf/src/elfmmdsp.c b/drivers/staging/nmf-cm/cm/engine/elf/src/elfmmdsp.c index 452d0f1b175..5f6641b188d 100644 --- a/drivers/staging/nmf-cm/cm/engine/elf/src/elfmmdsp.c +++ b/drivers/staging/nmf-cm/cm/engine/elf/src/elfmmdsp.c @@ -28,7 +28,7 @@ static const t_elfmemory mmdspMemories[NUMBER_OF_MMDSP_MEMORY] = { {9, INTERNAL_YRAM24, 0, CM_MM_ALIGN_2WORDS, MEM_PRIVATE, MEM_DATA, 3, 4, "YRAM"}, /* 2: Y memory */ {10, SDRAM_EXT24, SDRAMMEM24_BASE_ADDR, CM_MM_ALIGN_2WORDS, MEM_PRIVATE, MEM_DATA, 3, 4, "SDRAM24"}, /* 5: SDRAM24 */ {11, SDRAM_EXT16, SDRAMMEM16_BASE_ADDR, CM_MM_ALIGN_2WORDS, MEM_PRIVATE, MEM_DATA, 3, 2, "SDRAM16"}, /* 6: SDRAM16 */ - {12, ESRAM_EXT24, ESRAMMEM16_BASE_ADDR, CM_MM_ALIGN_2WORDS, MEM_PRIVATE, MEM_DATA, 3, 4, "ESRAM24"}, /* 8: ESRAM24 */ + {12, ESRAM_EXT24, ESRAMMEM24_BASE_ADDR, CM_MM_ALIGN_2WORDS, MEM_PRIVATE, MEM_DATA, 3, 4, "ESRAM24"}, /* 8: ESRAM24 */ {13, ESRAM_EXT16, ESRAMMEM16_BASE_ADDR, CM_MM_ALIGN_2WORDS, MEM_PRIVATE, MEM_DATA, 3, 2, "ESRAM16"}, /* 9: ESRAM16 */ {14, LOCKED_CODE, SDRAMTEXT_BASE_ADDR, CM_MM_ALIGN_2WORDS, MEM_SHARABLE, MEM_CODE, 8, 8, "LOCKED_CODE"}, /* : .locked */ }; diff --git a/drivers/staging/nmf-cm/cm/engine/os_adaptation_layer/inc/os_adaptation_layer.h b/drivers/staging/nmf-cm/cm/engine/os_adaptation_layer/inc/os_adaptation_layer.h index e2f6e8dec81..f57c92ea41b 100644 --- a/drivers/staging/nmf-cm/cm/engine/os_adaptation_layer/inc/os_adaptation_layer.h +++ b/drivers/staging/nmf-cm/cm/engine/os_adaptation_layer/inc/os_adaptation_layer.h @@ -430,6 +430,20 @@ PUBLIC void OSAL_DisableServiceMessages(void); */ PUBLIC void OSAL_EnableServiceMessages(void); +/*! + * \brief Generate 'software' panic due to dsp crash + * + * We request that the os part generate a panic to notify cm users +* that a problem occur but not dsp panic has been sent (for example +* a dsp crash) + * + * \param[in] t_nmf_core_id : core_id is the id of dsp for which we need to generate a panic. + * \param[in] reason : additional information. Today only 0 is valid. + * + * \ingroup CM_ENGINE_OSAL_API + */ +PUBLIC void OSAL_GeneratePanic(t_nmf_core_id coreId, t_uint32 reason); + extern /*const*/ t_nmf_osal_sync_handle lockHandleApi; extern /*const*/ t_nmf_osal_sync_handle lockHandleCom; extern /*const*/ t_nmf_osal_sem_handle semHandle; @@ -471,7 +485,6 @@ extern /*const*/ t_nmf_osal_sem_handle semHandle; */ #define OSAL_SEMAPHORE_WAIT_TIMEOUT(semHandle) OSAL_SemaphoreWaitTimed(semHandle, (cm_PWR_GetMode() == NORMAL_PWR_MODE)?SEM_TIMEOUT_NORMAL:SEM_TIMEOUT_DEBUG) - /****************/ /* Generic part */ /****************/ diff --git a/drivers/staging/nmf-cm/cm/engine/power_mgt/src/cmpower.c b/drivers/staging/nmf-cm/cm/engine/power_mgt/src/cmpower.c index 37ba11314f9..a104486db6c 100644 --- a/drivers/staging/nmf-cm/cm/engine/power_mgt/src/cmpower.c +++ b/drivers/staging/nmf-cm/cm/engine/power_mgt/src/cmpower.c @@ -9,6 +9,7 @@ #include <cm/engine/trace/inc/trace.h> #include <cm/engine/utils/inc/convert.h> #include <cm/engine/dsp/inc/dsp.h> +#include <cm/engine/executive_engine_mgt/inc/executive_engine_mgt.h> // ------------------------------------------------------------------------------- // Compilation flags @@ -93,11 +94,20 @@ PUBLIC t_cm_error cm_PWR_EnableMPC( if(_pwrMPCHWIPCountT[coreId]++ == 0) { LOG_INTERNAL(__PWR_DEBUG_TRACE_LEVEL, "[Pwr] MPC %s HW IP enable clock\n",cm_getDspName(coreId), 0, 0, 0, 0, 0); + + // The PRCMU seem not supporting the transition of asking HW IP on while DSP in retention + // -> Thus force wake up of the MMDSP before asking the transition + if ((error = cm_EEM_ForceWakeup(coreId)) != CM_OK) + return error; + if((error = OSAL_EnablePwrRessource(CM_OSAL_POWER_SxA_HARDWARE, coreId, 0)) != CM_OK) { ERROR("[Pwr] MPC %s HW IP clock can't be enabled\n", cm_getDspName(coreId), 0, 0, 0, 0, 0); + cm_EEM_AllowSleep(coreId); return error; } + + cm_EEM_AllowSleep(coreId); } break; } @@ -122,7 +132,15 @@ PUBLIC void cm_PWR_DisableMPC( if(--_pwrMPCHWIPCountT[coreId] == 0) { LOG_INTERNAL(__PWR_DEBUG_TRACE_LEVEL, "[Pwr] MPC %s HW IP disable clock\n",cm_getDspName(coreId), 0, 0, 0, 0, 0); + + // The PRCMU seem not supporting the transition of asking HW IP on while DSP in retention + // -> Thus force wake up of the MMDSP before asking the transition + if (cm_EEM_ForceWakeup(coreId) != CM_OK) + return; + OSAL_DisablePwrRessource(CM_OSAL_POWER_SxA_HARDWARE, coreId, 0); + + cm_EEM_AllowSleep(coreId); } break; } diff --git a/drivers/staging/nmf-cm/cm/engine/trace/src/panic.c b/drivers/staging/nmf-cm/cm/engine/trace/src/panic.c index 8a4d499ce41..68552b38229 100644 --- a/drivers/staging/nmf-cm/cm/engine/trace/src/panic.c +++ b/drivers/staging/nmf-cm/cm/engine/trace/src/panic.c @@ -24,16 +24,16 @@ const struct { unsigned int SP:1; unsigned int interface:1; } reason_descrs[] = { - {"NONE_PANIC", 0, 0, 0, 0}, - {"INTERNAL_PANIC", 1, 0, 0, 0}, - {"Reserved Panic", 0, 0, 0, 0}, - {"USER_STACK_OVERFLOW", 0, 1, 1, 0}, - {"SYSTEM_STACK_OVERFLOW", 0, 1, 1, 0}, - {"UNALIGNED_LONG_ACCESS", 0, 1, 0, 0}, - {"EVENT_FIFO_OVERFLOW", 0, 0, 0, 1}, - {"PARAM_FIFO_OVERFLOW", 0, 0, 0, 1}, - {"INTERFACE_NOT_BINDED", 0, 0, 0, 0}, - {"USER_PANIC", 1, 0, 0, 0} + {"NONE_PANIC", 0, 0, 0, 0}, + {"INTERNAL_PANIC", 1, 0, 0, 0}, + {"MPC_NOT_RESPONDING_PANIC", 0, 0, 0, 0}, /* Should not be useful since in that case CM_getServiceDescription() not call */ + {"USER_STACK_OVERFLOW", 0, 1, 1, 0}, + {"SYSTEM_STACK_OVERFLOW", 0, 1, 1, 0}, + {"UNALIGNED_LONG_ACCESS", 0, 1, 0, 0}, + {"EVENT_FIFO_OVERFLOW", 0, 0, 0, 1}, + {"PARAM_FIFO_OVERFLOW", 0, 0, 0, 1}, + {"INTERFACE_NOT_BINDED", 0, 0, 0, 0}, + {"USER_PANIC", 1, 0, 0, 0} }; static t_component_instance* getCorrespondingInstance( |