diff options
author | Chris Cain <cjcain@us.ibm.com> | 2019-09-09 17:13:04 -0500 |
---|---|---|
committer | Christopher J Cain <cjcain@us.ibm.com> | 2019-09-10 10:29:19 -0500 |
commit | e4597ab273f7b0c2b79789c2193b3407a76a2be0 (patch) | |
tree | e1df5458846f478aa3b7a63490671b870d603a0c | |
parent | 5c32e77370293292a67078270c9c382934b9c320 (diff) | |
download | talos-occ-e4597ab273f7b0c2b79789c2193b3407a76a2be0.tar.gz talos-occ-e4597ab273f7b0c2b79789c2193b3407a76a2be0.zip |
Ignore IPMI_SMS_ATN during fir data collection and remove 8k buffer
Also, only retry FIFO scoms once
Change-Id: I891efee8214fa4613f955035d07e3f2422afc5b0
CQ: SW464968
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/83490
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: William A Bryan <wilbryan@us.ibm.com>
Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
Reviewed-by: Zane C Shelley <zshelle@us.ibm.com>
Reviewed-by: Christopher J Cain <cjcain@us.ibm.com>
-rwxr-xr-x | src/occ_405/occbuildname.c | 2 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/firData.c | 3 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/fsi.c | 7 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/ipmidd.C | 10 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/ipmidd.H | 8 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/lpc.c | 10 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/mboxOverIpmi.C | 10 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/pnor_mboxdd.c | 6 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/pnor_util.c | 23 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/sbe_fifo.c | 65 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/sbe_fifo.h | 8 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/scom_trgt.c | 2 | ||||
-rw-r--r-- | src/occ_gpe0/firdata/scom_util.c | 13 |
13 files changed, 121 insertions, 46 deletions
diff --git a/src/occ_405/occbuildname.c b/src/occ_405/occbuildname.c index dd3747c..2d923d8 100755 --- a/src/occ_405/occbuildname.c +++ b/src/occ_405/occbuildname.c @@ -34,6 +34,6 @@ volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) = #else -volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) = /*<BuildName>*/ "op_occ_190822a\0" /*</BuildName>*/ ; +volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) = /*<BuildName>*/ "op_occ_190910a\0" /*</BuildName>*/ ; #endif diff --git a/src/occ_gpe0/firdata/firData.c b/src/occ_gpe0/firdata/firData.c index fc827b0..84e59d2 100644 --- a/src/occ_gpe0/firdata/firData.c +++ b/src/occ_gpe0/firdata/firData.c @@ -5,7 +5,7 @@ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015,2018 */ +/* Contributors Listed Below - COPYRIGHT 2015,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -823,6 +823,7 @@ void FirData_addTrgtsToPnor( FirData_t * io_fd ) uint32_t i = 0; for ( i = 0; i < io_fd->hData->chipCount; i++ ) { + TRAC_IMP("FirData_addTrgtsToPnor: chip %d", i); // Keep a pointer of the current chip header. HOMER_Chip_t * chipHdr = (HOMER_Chip_t *) byteIdx; byteIdx += sizeof(HOMER_Chip_t); diff --git a/src/occ_gpe0/firdata/fsi.c b/src/occ_gpe0/firdata/fsi.c index 767bcf4..95021d6 100644 --- a/src/occ_gpe0/firdata/fsi.c +++ b/src/occ_gpe0/firdata/fsi.c @@ -5,7 +5,7 @@ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015,2017 */ +/* Contributors Listed Below - COPYRIGHT 2015,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -37,6 +37,7 @@ void fsi_recovery() { + TRAC_IMP(">>fsi_recovery"); int32_t rc = SUCCESS; /* Clear out OPB error */ @@ -48,8 +49,8 @@ void fsi_recovery() /* Check if we have any errors left */ rc |= xscom_read( OPB_REG_STAT, &scom_data ); - TRACFCOMP( "PIB2OPB Status after cleanup = %08X%08X (rc=%d)", - (uint32_t)(scom_data >> 32), (uint32_t)scom_data, rc ); + TRAC_IMP( "<<fsi_recovery: PIB2OPB Status after cleanup = %08X%08X (rc=%d)", + (uint32_t)(scom_data >> 32), (uint32_t)scom_data, rc ); } /** diff --git a/src/occ_gpe0/firdata/ipmidd.C b/src/occ_gpe0/firdata/ipmidd.C index 69bf429..1b2130a 100644 --- a/src/occ_gpe0/firdata/ipmidd.C +++ b/src/occ_gpe0/firdata/ipmidd.C @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/occ_405/firdata/ipmidd.C $ */ +/* $Source: src/occ_gpe0/firdata/ipmidd.C $ */ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2018 */ +/* Contributors Listed Below - COPYRIGHT 2018,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -107,7 +107,7 @@ int IpmiDD::writeLPC(const uint32_t i_addr, */ int IpmiDD::pollCtrl(void) { - IPMI_TRAC(">>pollCtrl" ); + //IPMI_TRAC(">>pollCtrl" ); int rc = 0; uint8_t ctrl = 0; @@ -237,9 +237,11 @@ int IpmiDD::send(void) break; } +#if 0 IPMI_TRAC("I> write %x:%x seq %x len %x", iv_netfun, iv_cmd, iv_seq, iv_data_len); +#endif // If all is well, alert the host we sent bits. err = writeLPC(REG_CONTROL, CTRL_H2B_ATN); @@ -374,11 +376,13 @@ int IpmiDD::receive(void) } +#if 0 IPMI_TRAC("I> read b2h %x:%x seq %x cc %x", iv_netfun, iv_cmd, iv_seq, iv_cc); +#endif return err; } diff --git a/src/occ_gpe0/firdata/ipmidd.H b/src/occ_gpe0/firdata/ipmidd.H index 18eebbf..bff9ec5 100644 --- a/src/occ_gpe0/firdata/ipmidd.H +++ b/src/occ_gpe0/firdata/ipmidd.H @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/occ_405/firdata/ipmidd.H $ */ +/* $Source: src/occ_gpe0/firdata/ipmidd.H $ */ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2018 */ +/* Contributors Listed Below - COPYRIGHT 2018,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -91,8 +91,8 @@ enum { CTRL_CLR_RD_PTR = (1 << 1), CTRL_CLR_WR_PTR = (1 << 0), - IDLE_STATE = (CTRL_B_BUSY | CTRL_B2H_ATN | - CTRL_SMS_ATN | CTRL_H2B_ATN), + // Ignore CTRL_SMS_ATN + IDLE_STATE = (CTRL_B_BUSY | CTRL_B2H_ATN | CTRL_H2B_ATN), // Bit in the INMASK register which signals to the BMC // to reset it's end of things. diff --git a/src/occ_gpe0/firdata/lpc.c b/src/occ_gpe0/firdata/lpc.c index 3f9f113..c19c7e4 100644 --- a/src/occ_gpe0/firdata/lpc.c +++ b/src/occ_gpe0/firdata/lpc.c @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/occ_405/firdata/lpc.c $ */ +/* $Source: src/occ_gpe0/firdata/lpc.c $ */ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015,2017 */ +/* Contributors Listed Below - COPYRIGHT 2015,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -241,7 +241,11 @@ errorHndl_t lpc_read( LpcTransType i_type, /* Poll for completion */ StatusReg_t lpc_status; l_err = pollComplete( &lpc_cmd, &lpc_status ); - if( l_err ) { break; } + if( l_err ) + { + TRAC_ERR("lpc_read: pollComplete failed rc=0x%08x", (uint32_t)l_err); + break; + } // Read data from the LPC_DATA_REG l_err = SCOM_getScom(l_target, LPC_DATA_REG, &l_ret); diff --git a/src/occ_gpe0/firdata/mboxOverIpmi.C b/src/occ_gpe0/firdata/mboxOverIpmi.C index c0ee243..d3bc313 100644 --- a/src/occ_gpe0/firdata/mboxOverIpmi.C +++ b/src/occ_gpe0/firdata/mboxOverIpmi.C @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/occ_405/firdata/mboxOverIpmi.C $ */ +/* $Source: src/occ_gpe0/firdata/mboxOverIpmi.C $ */ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2018 */ +/* Contributors Listed Below - COPYRIGHT 2018,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -62,11 +62,17 @@ int ipmi_sendCommand(mboxMessage_t *io_msg, int i_arg_size) do { +#if 0 + rc = l_ipmidd.pollCtrl(); + TRAC_ERR("ipmi_sendCommand: DUMMY RECEIVE returned rc=%d", rc); +#endif + for(i = 0; i < IPMI_MAX_TRIES; ++i) { rc = l_ipmidd.send(); if(rc != RC_IPMIDD_NOT_IDLE) { + // command was sent break; } busy_wait(100); // 100 us diff --git a/src/occ_gpe0/firdata/pnor_mboxdd.c b/src/occ_gpe0/firdata/pnor_mboxdd.c index 4251eda..3961f7c 100644 --- a/src/occ_gpe0/firdata/pnor_mboxdd.c +++ b/src/occ_gpe0/firdata/pnor_mboxdd.c @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/occ_405/firdata/pnor_mboxdd.c $ */ +/* $Source: src/occ_gpe0/firdata/pnor_mboxdd.c $ */ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2017 */ +/* Contributors Listed Below - COPYRIGHT 2017,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -223,7 +223,7 @@ errorHndl_t writeFlash(pnorMbox_t* i_pnorMbox, break; } - //LPC writes are done via LPC scom interface and can only handle 4 + //LPC writes are done via LPC scom interface and can only handle 4 //bytes at a time. We write 256 bytes from the previous functions, // so break up the large write into 4 byte writes uint32_t l_size_written = 0; diff --git a/src/occ_gpe0/firdata/pnor_util.c b/src/occ_gpe0/firdata/pnor_util.c index fb579e2..d5b86f0 100644 --- a/src/occ_gpe0/firdata/pnor_util.c +++ b/src/occ_gpe0/firdata/pnor_util.c @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/occ_405/firdata/pnor_util.c $ */ +/* $Source: src/occ_gpe0/firdata/pnor_util.c $ */ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015,2017 */ +/* Contributors Listed Below - COPYRIGHT 2015,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -51,6 +51,14 @@ int32_t pnor_write_8B( uint64_t i_data ) { int32_t rc = SUCCESS; + // ensure current index is within range + if (g_write_cache_index > PAGE_PROGRAM_BYTES) + { + TRAC_ERR("pnor_write_8B: ERROR - g_write_cache_index > PAGE_PROGRAM_BYTES!"); + g_write_cache_index = 0; + g_next_byte = 0xFFFFFFFF; + } + if ( (g_next_byte == 0xFFFFFFFF) || /* initialized data */ ((g_next_byte + g_pnor_size) < (g_next_byte + 9)) ) /* make sure there is room */ { @@ -92,7 +100,7 @@ int32_t pnor_write_8B( uint64_t i_data ) g_write_cache ); if ( NO_ERROR != tmp ) { - TRACFCOMP("pnor_write_8B> writeFlash failed"); + TRAC_IMP("pnor_write_8B> writeFlash failed"); /* hit an error, stop any more writes from happening */ g_next_byte = 0xFFFFFFFF; g_pnor_size = 0; @@ -171,6 +179,7 @@ int32_t PNOR_writeFirData( HOMER_PnorInfo_t i_pnorInfo, uint64_t dataChunk = 0; uint32_t sz_dataChunk = sizeof(uint64_t); + TRAC_IMP("PNOR_writeFirData: writing %d bytes (%d byte chunks)", i_bufSize, sz_dataChunk); /* Add PNOR data 8 bytes at a time. */ for ( idx = 0; idx < i_bufSize; idx += sz_dataChunk ) { @@ -180,7 +189,7 @@ int32_t PNOR_writeFirData( HOMER_PnorInfo_t i_pnorInfo, rc = pnor_write_8B( dataChunk ); if ( SUCCESS != rc ) { - TRACFCOMP( "pnor_write_8B() failed during FIR write" ); + TRAC_ERR( "pnor_write_8B() failed during FIR write" ); break; } } @@ -201,7 +210,7 @@ int32_t PNOR_writeFirData( HOMER_PnorInfo_t i_pnorInfo, rc = pnor_write_8B( dataChunk ); if ( SUCCESS != rc ) { - TRACFCOMP( "pnor_write_8B() failed during blank fill" ); + TRAC_ERR( "pnor_write_8B() failed during blank fill" ); break; } } @@ -215,14 +224,14 @@ int32_t PNOR_writeFirData( HOMER_PnorInfo_t i_pnorInfo, rc = pnor_write_8B( dataChunk ); if ( SUCCESS != rc ) { - TRACFCOMP( "pnor_write_8B() failed during ECC fill" ); + TRAC_ERR( "pnor_write_8B() failed during ECC fill" ); break; } } } while (0); - TRACFCOMP("<<PNOR_writeFirData"); + TRAC_IMP("<<PNOR_writeFirData returning %d", rc); return rc; } diff --git a/src/occ_gpe0/firdata/sbe_fifo.c b/src/occ_gpe0/firdata/sbe_fifo.c index 4f0bd2f..f3eb0bf 100644 --- a/src/occ_gpe0/firdata/sbe_fifo.c +++ b/src/occ_gpe0/firdata/sbe_fifo.c @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/occ_405/firdata/sbe_fifo.c $ */ +/* $Source: src/occ_gpe0/firdata/sbe_fifo.c $ */ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2017 */ +/* Contributors Listed Below - COPYRIGHT 2017,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -159,6 +159,7 @@ uint32_t upFifoReset(SCOM_Trgt_t* i_target) l_rc = getfsi(i_target, l_addr, &l_data); if(l_rc != SUCCESS) { + TRAC_ERR("upFifoReset:getfsi(0x%08X) failed. rc = %d", l_addr, l_rc); break; } @@ -200,7 +201,7 @@ uint32_t writeRequest(SCOM_Trgt_t* i_target, uint32_t* i_fifoRequest) l_rc = putfsi(i_target, l_addr, l_data); if(l_rc != SUCCESS) { - TRAC_ERR("writeRequest: failed to putfsi to addr 0x%08x", + TRAC_ERR("<<writeRequest: failed to putfsi to addr 0x%08x", l_addr); return l_rc; } @@ -217,6 +218,7 @@ uint32_t writeRequest(SCOM_Trgt_t* i_target, uint32_t* i_fifoRequest) l_rc = waitUpFifoReady(i_target); if(l_rc != SUCCESS) { + TRAC_ERR("<<writeRequest waitUpFifoReady[%d] rc=%d", i, l_rc); return l_rc; } @@ -224,8 +226,8 @@ uint32_t writeRequest(SCOM_Trgt_t* i_target, uint32_t* i_fifoRequest) l_rc = putfsi(i_target, l_addr, *l_sent); if(l_rc != SUCCESS) { - TRAC_ERR("writeRequest: failed to putfsi to addr 0x%08x", - l_addr); + TRAC_ERR("<<writeRequest: failed to putfsi[%d] to addr 0x%08x", + i, l_addr); return l_rc; } @@ -236,6 +238,7 @@ uint32_t writeRequest(SCOM_Trgt_t* i_target, uint32_t* i_fifoRequest) l_rc = waitUpFifoReady(i_target); if(l_rc != SUCCESS) { + TRAC_ERR("<<writeRequest waitUpFifoReady rc=%d", l_rc); return l_rc; } @@ -244,7 +247,7 @@ uint32_t writeRequest(SCOM_Trgt_t* i_target, uint32_t* i_fifoRequest) l_rc = putfsi(i_target, l_addr, l_data); if(l_rc != SUCCESS) { - TRAC_ERR("writeRequest: failed to putfsi to addr 0x%08x", l_addr); + TRAC_ERR("<<writeRequest: failed to putfsi to addr 0x%08x, rc=%d", l_addr, l_rc); } return l_rc; @@ -293,6 +296,21 @@ uint32_t readResponse( SCOM_Trgt_t* i_target, FifoCmd_t* i_fifoReqCmd, memset( o_responseData, 0, sizeof(uint64_t) ); // Just in case. + // NORMAL RESPONSE: + // + // 0: SCOM_WORD_0 + // 1: SCOM_WORD_1 + // 2: 0: RespStatus.magic + // 2: RespStatus.command.class + // 3: RespStatus.command.type + // 3: 0: RespStatus.primaryStatus + // 2: RespStatus.secondaryStatus + // 4: DISTANCE + // 5: EOT (ignored - does not need to be stored in buffer) + // + // If there is a scom error, FFDC may get returned which would be larger than + // the normal expected 5 words which would result in RC_RESP_DATA_OVERFLOW + uint32_t readBuffer[READ_BUFFER_SIZE]; uint32_t wordsReceived = 0; @@ -303,6 +321,7 @@ uint32_t readResponse( SCOM_Trgt_t* i_target, FifoCmd_t* i_fifoReqCmd, l_rc = waitDnFifoReady( i_target, &l_status ); if ( SUCCESS != l_rc ) { + TRAC_ERR("readResponse: waitDnFifoReady failed, rc=%d, status=%d", l_rc, l_status); return l_rc; } @@ -321,7 +340,7 @@ uint32_t readResponse( SCOM_Trgt_t* i_target, FifoCmd_t* i_fifoReqCmd, { TRAC_ERR( "readResponse: data overflow without EOT. " "wordsReceived=%u", wordsReceived ); - printBuffer( readBuffer, wordsReceived ); + //printBuffer( readBuffer, wordsReceived ); return RC_RESP_DATA_OVERFLOW; } @@ -354,7 +373,7 @@ uint32_t readResponse( SCOM_Trgt_t* i_target, FifoCmd_t* i_fifoReqCmd, { TRAC_ERR( "readResponse: minimum response size is invalid. " "wordsReceived=%u", wordsReceived ); - printBuffer( readBuffer, wordsReceived ); + //printBuffer( readBuffer, wordsReceived ); return RC_RESP_MIN_SIZE_INVALID; } @@ -365,7 +384,7 @@ uint32_t readResponse( SCOM_Trgt_t* i_target, FifoCmd_t* i_fifoReqCmd, { TRAC_ERR( "readResponse: invalid response distance. wordsReceived=%u " "distance=%u", wordsReceived, distance ); - printBuffer( readBuffer, wordsReceived ); + //printBuffer( readBuffer, wordsReceived ); return RC_RESP_DISTANCE_INVALID; } @@ -377,7 +396,7 @@ uint32_t readResponse( SCOM_Trgt_t* i_target, FifoCmd_t* i_fifoReqCmd, { TRAC_ERR( "readResponse: invalid magic word. magic=0x%04x", status->magic ); - printBuffer( readBuffer, wordsReceived ); + //printBuffer( readBuffer, wordsReceived ); return RC_RESP_MAGIC_WORD_INVALID; } @@ -386,7 +405,7 @@ uint32_t readResponse( SCOM_Trgt_t* i_target, FifoCmd_t* i_fifoReqCmd, { TRAC_ERR( "readResponse: unexpected response command. cmd=0x%08x", status->command.u ); - printBuffer( readBuffer, wordsReceived ); + //printBuffer( readBuffer, wordsReceived ); return RC_RESP_UNEXPECTED_CMD; } @@ -414,7 +433,7 @@ uint32_t readResponse( SCOM_Trgt_t* i_target, FifoCmd_t* i_fifoReqCmd, "primaryStatus=0x%08x secondaryStatus=0x%08x", i_fifoReqCmd->u, status->primaryStatus, status->secondaryStatus ); - printBuffer( readBuffer, wordsReceived ); + //printBuffer( readBuffer, wordsReceived ); return RC_RESP_SCOM_ERROR; } @@ -425,7 +444,7 @@ uint32_t readResponse( SCOM_Trgt_t* i_target, FifoCmd_t* i_fifoReqCmd, TRAC_ERR( "readResponse: unexpected response data size. cmd=0x%08x " "wordsReceived=%u distance=%u", i_fifoReqCmd->u, wordsReceived, distance ); - printBuffer( readBuffer, wordsReceived ); + //printBuffer( readBuffer, wordsReceived ); return RC_RESP_UNEXPECTED_DATA_SIZE; } @@ -475,6 +494,7 @@ int32_t putFifoScom(SCOM_Trgt_t* i_target, uint64_t i_addr, uint64_t i_data) int32_t getFifoScom(SCOM_Trgt_t* i_target, uint64_t i_addr, uint64_t* o_data) { uint32_t l_rc = SUCCESS; + unsigned int l_cmd_attempts = 0; struct fifoGetScomRequest l_fifoRequest; l_fifoRequest.wordCnt = GET_SCOM_REQUEST_WORD_CNT; @@ -482,6 +502,7 @@ int32_t getFifoScom(SCOM_Trgt_t* i_target, uint64_t i_addr, uint64_t* o_data) l_fifoRequest.command.s.class = SBE_FIFO_CLASS_SCOM_ACCESS; l_fifoRequest.command.s.type = SBE_FIFO_CMD_GET_SCOM; l_fifoRequest.address = i_addr; + static unsigned int L_throttle_trace = 0; do { @@ -506,8 +527,15 @@ int32_t getFifoScom(SCOM_Trgt_t* i_target, uint64_t i_addr, uint64_t* o_data) break; } + ++l_cmd_attempts; if ( l_rc != SUCCESS ) { + if (L_throttle_trace < 5) + { + TRAC_ERR("getFifoScom: readResponse(0x%08X) try #%d failed with %d... Calling upFifoReset() #%d", + i_addr, l_cmd_attempts, l_rc, L_throttle_trace); + } + // Reset the FIFO for subsequent SCOMs uint32_t resetRc = upFifoReset(i_target); if(resetRc == RC_FIFO_TIMEOUT_RESET) @@ -515,6 +543,17 @@ int32_t getFifoScom(SCOM_Trgt_t* i_target, uint64_t i_addr, uint64_t* o_data) // timeout msg already traced, Return original fail rc. break; } + + if (l_cmd_attempts >= 2) + { + if (L_throttle_trace < 5) + { + ++L_throttle_trace; + TRAC_ERR("getFifoScom: returning FIFO_TIMEOUT_DN (skipping additional retries)"); + } + l_rc = RC_FIFO_TIMEOUT_DN; + break; + } } } while ( TRUE ); diff --git a/src/occ_gpe0/firdata/sbe_fifo.h b/src/occ_gpe0/firdata/sbe_fifo.h index 7b6df51..1464700 100644 --- a/src/occ_gpe0/firdata/sbe_fifo.h +++ b/src/occ_gpe0/firdata/sbe_fifo.h @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/occ_405/firdata/sbe_fifo.h $ */ +/* $Source: src/occ_gpe0/firdata/sbe_fifo.h $ */ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2017 */ +/* Contributors Listed Below - COPYRIGHT 2017,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -51,7 +51,9 @@ #define SBE_FIFO_DNFIFO_DATA_OUT 0x00002440 #define NS_PER_MSEC (1000000ull) #define MAX_UP_FIFO_TIMEOUT_NS 10*NS_PER_MSEC -#define READ_BUFFER_SIZE 2048 +// READ_BUFFER_SIZE is number of words when reading scom via SBE +// (2 words of scom data + 3 words of header) +#define READ_BUFFER_SIZE 5 #define FIFO_STATUS_MAGIC 0xC0DE #define SBE_PRI_OPERATION_SUCCESSFUL 0x00 #define SBE_SEC_OPERATION_SUCCESSFUL 0x00 diff --git a/src/occ_gpe0/firdata/scom_trgt.c b/src/occ_gpe0/firdata/scom_trgt.c index 9eae5a7..4671581 100644 --- a/src/occ_gpe0/firdata/scom_trgt.c +++ b/src/occ_gpe0/firdata/scom_trgt.c @@ -5,7 +5,7 @@ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015,2018 */ +/* Contributors Listed Below - COPYRIGHT 2015,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ diff --git a/src/occ_gpe0/firdata/scom_util.c b/src/occ_gpe0/firdata/scom_util.c index 0102477..3fdc9de 100644 --- a/src/occ_gpe0/firdata/scom_util.c +++ b/src/occ_gpe0/firdata/scom_util.c @@ -5,7 +5,7 @@ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015,2018 */ +/* Contributors Listed Below - COPYRIGHT 2015,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -396,6 +396,11 @@ int32_t SCOM_getScom( SCOM_Trgt_t i_trgt, uint32_t i_addr, uint64_t * o_val ) } } + if (rc != SUCCESS) + { + TRAC_ERR("SCOM_getScom(0x%08X): returning %d", i_addr, rc); + } + return rc; } @@ -466,7 +471,11 @@ int32_t SCOM_getIdScom( SCOM_Trgt_t i_trgt, uint64_t i_addr, uint32_t * o_val ) { rc = getscom_abs(trans_addr, &(scomout.data64)); } - if ( SUCCESS != rc ) return rc; + if ( SUCCESS != rc ) + { + TRAC_ERR("SCOM_getIdScom(0x%08X): returning %d", i_addr, rc); + return rc; + } /* Check for PIB error. */ if ( scomout.piberr ) |