Skip to content

Commit

Permalink
FIRDATA: isolation issues due to SCOM errors from 0x50040018
Browse files Browse the repository at this point in the history
The first change is to reset the SBE FIFO after SCOM failures on
slave processors. This ensures the FIFO is realigned for subsequent
SCOMs.

The second change is to ignore chiplet offline SCOM errors from
0x50040018 on master processors. These are expected if a core is
asleep at the time of the checkstop. The data returned from the
SCOM will still show active attentions from chiplets that are online.

This commit does not fix chiplet offline SCOM errors from 0x50040018
on slave processors. That will come later in another commit.

Change-Id: Ie60329efed169c9f4afa94154fd86fe466384609
CQ: SW404945
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/48666
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Prachi Gupta <pragupta@us.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Reviewed-by: William A. Bryan <wilbryan@us.ibm.com>
Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com>
Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
  • Loading branch information
zane131 authored and marthabroyles committed Oct 24, 2017
1 parent 6404302 commit 20879cb
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 9 deletions.
16 changes: 8 additions & 8 deletions src/occ_gpe0/firdata/firData.c
Expand Up @@ -83,7 +83,7 @@ typedef struct


/* Uncomment for additional debug traces */
#if 0
#if 0
#define DEBUG_PRD_CHKSTOP_ANALYSIS
#endif

Expand Down Expand Up @@ -152,10 +152,10 @@ bool FirData_addRegToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
rc = SCOM_getScom( i_sTrgt, i_addr, &(reg.val) );
if ( SUCCESS != rc )
{
TRAC_ERR( "[FirData_addRegToPnor] t=%d p=%d u=%d rc=%d ",
i_sTrgt.type, i_sTrgt.procPos, i_sTrgt.procUnitPos, rc);
TRAC_ERR( "addr=0x%08x val=0x%08x%08x",i_addr,
(uint32_t)(reg.val >> 32), (uint32_t)reg.val );
TRAC_ERR( "SCOM ERROR: rc=%d t=%u p=%u u=%u",
rc, i_sTrgt.type, i_sTrgt.procPos, i_sTrgt.procUnitPos );
TRAC_ERR( " addr=0x%08x val=0x%08x%08x",
i_addr, (uint32_t)(reg.val >> 32), (uint32_t)reg.val );

if ( io_pTrgt->scomErrs < PNOR_Trgt_MAX_SCOM_ERRORS )
io_pTrgt->scomErrs++;
Expand All @@ -175,7 +175,7 @@ bool FirData_addRegToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
TRAC_IMP("addRegToPnor: got scom value, addr=0x%08X value=0x%08X %08X",
i_addr, (uint32_t)(reg.val>>32), reg.val);
#endif

full = FirData_addDataToPnor( io_fd, &reg, sizeof(reg) );
if ( full ) break;

Expand Down Expand Up @@ -768,7 +768,7 @@ bool FirData_addTrgtToPnor( FirData_t * io_fd, SCOM_Trgt_t i_sTrgt,
/* had some issue with local var return in diff function so take out */
/* init to zero */
PNOR_Trgt_t tmp_pTrgt; memset( &tmp_pTrgt, 0x00, sizeof(tmp_pTrgt) );

tmp_pTrgt.trgtType = i_sTrgt.type;
tmp_pTrgt.chipPos = i_sTrgt.procPos,
tmp_pTrgt.unitPos = i_sTrgt.procUnitPos;
Expand Down Expand Up @@ -947,7 +947,7 @@ void FirData_addTrgtsToPnor( FirData_t * io_fd )
TRAC_IMP(" Masks XBUS:%X OBUS:%X ",
l_existBits.xbusMask, l_existBits.obusMask);
TRAC_IMP(" Masks EC:%X EQ:%X EX:%X",
l_existBits.ecMask, l_existBits.eqMask, l_existBits.exMask);
l_existBits.ecMask, l_existBits.eqMask, l_existBits.exMask);
TRAC_IMP(" Masks CAPP:%X PEC:%X PHB:%X",l_existBits.cappMask,
l_existBits.pecMask, l_existBits.phbMask );
TRAC_IMP(" Masks MCBIST:%X MCS:%X MCA:%X",
Expand Down
14 changes: 14 additions & 0 deletions src/occ_gpe0/firdata/sbe_fifo.c
Expand Up @@ -386,6 +386,13 @@ int32_t putFifoScom(SCOM_Trgt_t* i_target, uint64_t i_addr, uint64_t i_data)
(uint32_t*)&l_fifoResponse,
sizeof(struct fifoPutScomResponse));

if ( l_rc != SUCCESS )
{
// Reset the FIFO for subsequent SCOMs
uint32_t l_data = 0xDEAD;
putfsi( i_target, 0x2450, l_data );
}

return l_rc;
}

Expand Down Expand Up @@ -413,6 +420,13 @@ int32_t getFifoScom(SCOM_Trgt_t* i_target, uint64_t i_addr, uint64_t* o_data)
(uint32_t*)&l_fifoResponse,
sizeof(struct fifoGetScomResponse));

if ( l_rc != SUCCESS )
{
// Reset the FIFO for subsequent SCOMs
uint32_t l_data = 0xDEAD;
putfsi( i_target, 0x2450, l_data );
}

//Always return data even if there is an error
*o_data = l_fifoResponse.data;

Expand Down
12 changes: 11 additions & 1 deletion src/occ_gpe0/firdata/scom_util.c
Expand Up @@ -361,11 +361,21 @@ int32_t SCOM_getScom( SCOM_Trgt_t i_trgt, uint32_t i_addr, uint64_t * o_val )
//Use SBE FIFO if it's a slave proc
if(!chip_targ.isMaster)
{
return getFifoScom(&chip_targ, trans_addr, o_val);
rc = getFifoScom(&chip_targ, trans_addr, o_val);
}
else
{
rc = getscom_abs(trans_addr, o_val);

// Add exception for chiplet offline errors on the UNIT_CS or
// HOST_ATTN broadcast registers. The value returned will still be
// valid. Even though one or more of the chiplets may have been
// offline.
if ( 2 == rc &&
(0x50040018 == i_addr || 0x50040009 == i_addr) )
{
rc = SUCCESS;
}
}
}

Expand Down

0 comments on commit 20879cb

Please sign in to comment.