-
Type:
Bug
-
Resolution: Fixed
-
Priority:
Urgent
-
Imaging System Software
-
ISS-1171
-
PSDK_11.0
-
psdk_11.1.1
-
A bug has been identified in the Watchdog Timer time-out error interrupt callback defined in the target kernels in the imaging layer where the interrupt status is set incorrectly due to incorrect masking of the error event passed by the driver.
As a result, the system may fail to detect related error conditions, allowing actual failures to go undetected and specifically prevent detection of watchdog timer time-out error. This can leave the IP in an unrecovered error state until a manual reset is performed.
Workaround/Fix:
The below fix can be used in the code base to overcome the issue.
1. /kernels/hwa/dmpac_dof/vx_dmpac_dof_target.c
@@ -2499,7 +2499,7 @@ static void tivxDmpacDofWdTimerErrorCb(Fvid2_Handle handle, uint32_t wdTimerErrE
tivxDmpacDofObj *dof_obj = (tivxDmpacDofObj *)appData;
if (NULL != dof_obj)
{
- dof_obj->wdTimerErrStatus = dof_obj->enableErrorEvents & wdTimerErrEvents;
+ dof_obj->wdTimerErrStatus = dof_obj->wdTimererrEvtPrms.WdTimererrEvents & wdTimerErrEvents;
if(0u != dof_obj->wdTimerErrStatus)
{
2. /kernels/hwa/dmpac_sde/vx_dmpac_sde_target.c
@@ -1430,7 +1430,7 @@ static void tivxDmpacSdeWdTimerErrorCb(Fvid2_Handle handle, uint32_t wdTimerErrE
tivxDmpacSdeObj *sde_obj = (tivxDmpacSdeObj *)appData;
if (NULL != sde_obj)
{ - sde_obj->wdTimerErrStatus = sde_obj->enableErrorEvents & wdTimerErrEvents;
+ sde_obj->wdTimerErrStatus = sde_obj->wdTimererrEvtPrms.WdTimererrEvents & wdTimerErrEvents;
if(0u != sde_obj->wdTimerErrStatus)
{
3. /kernels/hwa/vpac_ldc/vx_vpac_ldc_target.c
@@ -3212,7 +3212,7 @@ static void tivxVpacLdcWdTimerErrorCb(Fvid2_Handle handle, uint32_t wdTimerErrEv
tivxVpacLdcObj *ldc_obj = (tivxVpacLdcObj *)appData;
if (NULL != ldc_obj)
{ - ldc_obj->wdTimerErrStatus = ldc_obj->enableErrorEvents & wdTimerErrEvents;
+ ldc_obj->wdTimerErrStatus = ldc_obj->wdTimererrEvtPrms.WdTimererrEvents & wdTimerErrEvents;
if(0u != ldc_obj->wdTimerErrStatus)
{
4. /kernels/hwa/vpac_msc/vx_vpac_msc_multi_scale_output_target.c
@@ -3602,7 +3602,7 @@ static void tivxVpacMscMultiScaleWdTimerErrorCb(Fvid2_Handle handle, uint32_t wd
if (NULL != msc_obj)
{ - msc_obj->wdTimerErrStatus = msc_obj->enable_error_events & wdTimerErrEvents;
+ msc_obj->wdTimerErrStatus = msc_obj->wdTimererrEvtPrms.WdTimererrEvents & wdTimerErrEvents;
if(0u != msc_obj->wdTimerErrStatus)
{
5. /kernels/hwa/vpac_msc/vx_vpac_msc_pyramid_target.c
@@ -3259,7 +3259,7 @@ static void tivxVpacMscPmdWdTimerErrorCb(Fvid2_Handle handle, uint32_t wdTimerEr
if (NULL != msc_obj)
{ - msc_obj->wdTimerErrStatus = msc_obj->enable_error_events & wdTimerErrEvents;
+ msc_obj->wdTimerErrStatus = msc_obj->wdTimererrEvtPrms.WdTimererrEvents & wdTimerErrEvents;
if(0u != msc_obj->wdTimerErrStatus)
{
6. /kernels/hwa/vpac_nf/vx_vpac_nf_bilateral_target.c
@@ -1917,7 +1917,7 @@ static void tivxVpacNfBilateralWdTimerErrorCb(Fvid2_Handle handle, uint32_t wdTi
tivxVpacNfBilateralObj *nf_bilateral_obj = (tivxVpacNfBilateralObj *)appData;
if (NULL != nf_bilateral_obj)
{ - nf_bilateral_obj->wdTimerErrStatus = nf_bilateral_obj->enableErrorEvents & wdTimerErrEvents;
+ nf_bilateral_obj->wdTimerErrStatus = nf_bilateral_obj->wdTimererrEvtPrms.WdTimererrEvents & wdTimerErrEvents;
if(0u != nf_bilateral_obj->wdTimerErrStatus)
{
7. /kernels/hwa/vpac_nf/vx_vpac_nf_generic_target.c
@@ -1734,7 +1734,7 @@ static void tivxVpacNfGenericWdTimerErrorCb(Fvid2_Handle handle, uint32_t wdTime
tivxVpacNfGenericObj *nf_generic_obj = (tivxVpacNfGenericObj *)appData;
if (NULL != nf_generic_obj)
{ - nf_generic_obj->wdTimerErrStatus = nf_generic_obj->enableErrorEvents & wdTimerErrEvents;
+ nf_generic_obj->wdTimerErrStatus = nf_generic_obj->wdTimererrEvtPrms.WdTimererrEvents & wdTimerErrEvents;
if(0u != nf_generic_obj->wdTimerErrStatus)
{
8. /kernels/hwa/vpac_viss/vx_vpac_viss_target.c
@ -3738,7 +3738,7 @@ static void tivxVpacVissWdTimerErrorCb(Fvid2_Handle handle, uint32_t wdTimerErrE
tivxVpacVissObj *vissObj = (tivxVpacVissObj *)appData;
if (NULL != vissObj)
{ - vissObj->wdTimerErrStatus = vissObj->enableErrorEvents & wdTimerErrEvents;
+ vissObj->wdTimerErrStatus = vissObj->wdTimererrEvtPrms.WdTimererrEvents & wdTimerErrEvents;
if(0u != vissObj->wdTimerErrStatus)
{