summaryrefslogtreecommitdiff
path: root/drivers/staging/nmf-cm/cm/engine/component/src/initializer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/nmf-cm/cm/engine/component/src/initializer.c')
-rw-r--r--drivers/staging/nmf-cm/cm/engine/component/src/initializer.c23
1 files changed, 20 insertions, 3 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);
+ }
+}