diff options
author | Sachin Gupta <sgupta2m@in.ibm.com> | 2013-12-18 15:58:02 +0530 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2014-01-24 22:28:44 -0600 |
commit | 8dbc8970d6c0cbab9dfe64f48fcb0fca2b0cfe2b (patch) | |
tree | 813dc4f5fe1caa05e4ac5808b50828f5223c2ee1 /src/usr/diag/prdf/common/framework/register/prdfHomRegisterAccess.C | |
parent | 517e9753d105918a67c04754dae90d2d8e546db1 (diff) | |
download | talos-hostboot-8dbc8970d6c0cbab9dfe64f48fcb0fca2b0cfe2b.tar.gz talos-hostboot-8dbc8970d6c0cbab9dfe64f48fcb0fca2b0cfe2b.zip |
PRD: Handling scom failure in case of channel CS on HB
Change-Id: Ie8fd8e702b65cc7c7aacc0d176e790b59b008318
RTC: 44889
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/7788
Tested-by: Jenkins Server
Reviewed-by: Christopher T. Phan <cphan@us.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Reviewed-by: Zane Shelley <zshelle@us.ibm.com>
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/8335
Diffstat (limited to 'src/usr/diag/prdf/common/framework/register/prdfHomRegisterAccess.C')
-rwxr-xr-x | src/usr/diag/prdf/common/framework/register/prdfHomRegisterAccess.C | 66 |
1 files changed, 41 insertions, 25 deletions
diff --git a/src/usr/diag/prdf/common/framework/register/prdfHomRegisterAccess.C b/src/usr/diag/prdf/common/framework/register/prdfHomRegisterAccess.C index cb107b3c6..e089f1336 100755 --- a/src/usr/diag/prdf/common/framework/register/prdfHomRegisterAccess.C +++ b/src/usr/diag/prdf/common/framework/register/prdfHomRegisterAccess.C @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2002,2013 */ +/* COPYRIGHT International Business Machines Corp. 2002,2014 */ /* */ /* p1 */ /* */ @@ -32,6 +32,7 @@ #ifdef __HOSTBOOT_MODULE #include <ecmdDataBufferBase.H> + #include <ibscomreasoncodes.H> #else #include <ecmdDataBuffer.H> #include <hwsvExecutionService.H> @@ -118,11 +119,46 @@ uint32_t ScomService::Access(TARGETING::TargetHandle_t i_target, MopRegisterAccess::Operation operation) const { PRDF_DENTER("ScomService::Access()"); + int32_t rc = SUCCESS; - uint32_t rc = iv_ScomAccessor->Access(i_target, + errlHndl_t errlH = iv_ScomAccessor->Access( i_target, bs, registerId, operation); + #ifdef __HOSTBOOT_MODULE + if( ( NULL != errlH ) && ( MopRegisterAccess::READ == operation ) + && ( IBSCOM::IBSCOM_BUS_FAILURE == errlH->reasonCode() )) + { + PRDF_COMMIT_ERRL(errlH, ERRL_ACTION_SA|ERRL_ACTION_REPORT); + PRDF_INF( "Register access failed with reason code IBSCOM_BUS_FAILURE." + " Trying again, Target HUID:0x%08X Register 0x%016X Op:%u", + PlatServices::getHuid( i_target), registerId, operation ); + + errlH = iv_ScomAccessor->Access( i_target, + bs, + registerId, + operation); + } + #endif + + if(errlH) + { + rc = PRD_SCANCOM_FAILURE; + PRDF_ADD_SW_ERR(errlH, rc, PRDF_HOM_SCOM, __LINE__); + PRDF_ADD_PROCEDURE_CALLOUT(errlH, SRCI_PRIORITY_MED, EPUB_PRC_SP_CODE); + + bool l_isAbort = false; + PRDF_ABORTING(l_isAbort); + if (!l_isAbort) + { + PRDF_COMMIT_ERRL(errlH, ERRL_ACTION_SA|ERRL_ACTION_REPORT); + } + else + { + delete errlH; + errlH = NULL; + } + } PRDF_DEXIT("ScomService::Access(): rc=%d", rc); @@ -130,14 +166,13 @@ uint32_t ScomService::Access(TARGETING::TargetHandle_t i_target, } -uint32_t ScomAccessor::Access(TARGETING::TargetHandle_t i_target, +errlHndl_t ScomAccessor::Access(TARGETING::TargetHandle_t i_target, BIT_STRING_CLASS & bs, uint64_t registerId, MopRegisterAccess::Operation operation) const { PRDF_DENTER("ScomAccessor::Access()"); - uint32_t rc = SUCCESS; errlHndl_t errH = NULL; uint32_t bsize = bs.GetLength(); @@ -224,28 +259,9 @@ uint32_t ScomAccessor::Access(TARGETING::TargetHandle_t i_target, ); } - if(errH) - { - rc = PRD_SCANCOM_FAILURE; - PRDF_ADD_SW_ERR(errH, rc, PRDF_HOM_SCOM, __LINE__); - PRDF_ADD_PROCEDURE_CALLOUT(errH, SRCI_PRIORITY_MED, EPUB_PRC_SP_CODE); + PRDF_DEXIT("ScomAccessor::Access()"); - bool l_isAbort = false; - PRDF_ABORTING(l_isAbort); - if (!l_isAbort) - { - PRDF_COMMIT_ERRL(errH, ERRL_ACTION_SA|ERRL_ACTION_REPORT); - } - else - { - delete errH; - errH = NULL; - } - } - - PRDF_DEXIT("ScomAccessor::Access(): rc=%d", rc); - - return rc; + return errH; } //------------------------------------------------------------------------------ |