Skip to content

Commit

Permalink
PRD: Axone PlatServices and Misc Updates
Browse files Browse the repository at this point in the history
Change-Id: I309daf7cd47470542c7486307cdbe576986c29b4
RTC: 206186
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/74863
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com>
Reviewed-by: Benjamen G. Tyner <ben.tyner@ibm.com>
Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com>
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/75185
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
  • Loading branch information
cnpalmer authored and zane131 committed Apr 1, 2019
1 parent 4046e66 commit 16024c9
Show file tree
Hide file tree
Showing 12 changed files with 818 additions and 25 deletions.
4 changes: 4 additions & 0 deletions src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ void addExtMemMruData( const MemoryMru & i_memMru, errlHndl_t io_errl )
{
getDimmDqAttr<TYPE_DIMM>(partList[0], extMemMru.dqMapping);
}
else if ( TYPE_MEM_PORT == getTargetType(trgt) )
{
getDimmDqAttr<TYPE_MEM_PORT>( trgt, extMemMru.dqMapping );
}
else
{
PRDF_ERR( PRDF_FUNC "Invalid target type." );
Expand Down
201 changes: 199 additions & 2 deletions src/usr/diag/prdf/common/plat/prdfPlatServices_common.C
Original file line number Diff line number Diff line change
Expand Up @@ -638,7 +638,7 @@ uint32_t __getBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank,

BitmapData data;

for ( uint32_t ps = 0; ps < MAX_MEM_PORT; ps++ )
for ( uint32_t ps = 0; ps < MAX_SUB_PORT; ps++ )
{
// Skip if the DIMM doesn't exist
if ( nullptr == getConnectedDimm(i_trgt, i_rank, ps) ) continue;
Expand Down Expand Up @@ -825,6 +825,7 @@ uint32_t clearBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank )


//------------------------------------------------------------------------------

template<>
void getDimmDqAttr<TYPE_MCA>( TargetHandle_t i_target,
uint8_t (&o_dqMapPtr)[DQS_PER_DIMM] )
Expand All @@ -849,6 +850,27 @@ void getDimmDqAttr<TYPE_MCA>( TargetHandle_t i_target,
#undef PRDF_FUNC
} // end function getDimmDqAttr

template<>
void getDimmDqAttr<TYPE_MEM_PORT>( TargetHandle_t i_target,
uint8_t (&o_dqMapPtr)[DQS_PER_DIMM] )
{
#define PRDF_FUNC "[PlatServices::getDimmDqAttr<TYPE_MEM_PORT>] "

PRDF_ASSERT( TYPE_MEM_PORT == getTargetType(i_target) );

uint8_t tmpData[DQS_PER_DIMM];

if ( !i_target->tryGetAttr<ATTR_MEM_VPD_DQ_MAP>(tmpData) )
{
PRDF_ERR( PRDF_FUNC "Failed to get ATTR_MEM_VPD_DQ_MAP" );
PRDF_ASSERT( false );
}

memcpy( &o_dqMapPtr[0], &tmpData[0], DQS_PER_DIMM );

#undef PRDF_FUNC
} // end function getDimmDqAttr

template<>
void getDimmDqAttr<TYPE_DIMM>( TargetHandle_t i_target,
uint8_t (&o_dqMapPtr)[DQS_PER_DIMM] )
Expand All @@ -872,7 +894,9 @@ void getDimmDqAttr<TYPE_DIMM>( TargetHandle_t i_target,
#undef PRDF_FUNC
} // end function getDimmDqAttr


//------------------------------------------------------------------------------

template<>
int32_t mssGetSteerMux<TYPE_MCA>( TargetHandle_t i_mca,
const MemRank & i_rank,
Expand Down Expand Up @@ -922,6 +946,46 @@ int32_t mssGetSteerMux<TYPE_MBA>( TargetHandle_t i_mba, const MemRank & i_rank,
return o_rc;
}

template<>
int32_t mssGetSteerMux<TYPE_MEM_PORT>( TargetHandle_t i_memPort,
const MemRank & i_rank,
MemSymbol & o_port0Spare,
MemSymbol & o_port1Spare,
MemSymbol & o_eccSpare )
{
int32_t o_rc = SUCCESS;

/* TODO RTC 207273 - sparing support
// called by FSP code so can't just move to hostboot side
#ifdef __HOSTBOOT_MODULE
errlHndl_t errl = NULL;
uint8_t port0Spare, port1Spare, eccSpare;
fapi2::Target<fapi2::TARGET_TYPE_MEM_PORT> fapiPort(i_memPort);
FAPI_INVOKE_HWP( errl, mss_check_steering, fapiPort,
i_rank.getMaster(), port0Spare, port1Spare, eccSpare );
if ( NULL != errl )
{
PRDF_ERR( "[PlatServices::mssGetSteerMux] mss_check_steering() "
"failed. HUID: 0x%08x rank: %d",
getHuid(i_memPort), i_rank.getMaster() );
PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
o_rc = FAIL;
}
else
{
o_port0Spare = MemSymbol::fromSymbol( i_memPort, i_rank, port0Spare );
o_port1Spare = MemSymbol::fromSymbol( i_memPort, i_rank, port1Spare );
o_eccSpare = MemSymbol::fromSymbol( i_memPort, i_rank, eccSpare );
}
#endif
*/

return o_rc;
}

//------------------------------------------------------------------------------

Expand Down Expand Up @@ -955,17 +1019,108 @@ int32_t mssSetSteerMux<TYPE_MBA>( TargetHandle_t i_mba, const MemRank & i_rank,
return o_rc;
}

template<>
int32_t mssSetSteerMux<TYPE_MEM_PORT>( TargetHandle_t i_memPort,
const MemRank & i_rank, const MemSymbol & i_symbol, bool i_x4EccSpare )
{
int32_t o_rc = SUCCESS;

/* TODO RTC 207273 - sparing support
#ifdef __HOSTBOOT_MODULE
errlHndl_t errl = NULL;
fapi2::Target<fapi2::TARGET_TYPE_MEM_PORT> fapiPort(i_memPort);
uint8_t l_dramSymbol = PARSERUTILS::dram2Symbol<TYPE_MBA>(
i_symbol.getDram(),
isDramWidthX4(i_memPort) );
FAPI_INVOKE_HWP( errl, mss_do_steering, fapiPort,
i_rank.getMaster(), l_dramSymbol,
i_x4EccSpare );
if ( NULL != errl )
{
PRDF_ERR( "[PlatServices::mssSetSteerMux] mss_do_steering "
"failed. HUID: 0x%08x rank: %d symbol: %d eccSpare: %c",
getHuid(i_memPort), i_rank.getMaster(), l_dramSymbol,
i_x4EccSpare ? 'T' : 'F' );
PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
o_rc = FAIL;
}
#endif
*/
return o_rc;
}

//------------------------------------------------------------------------------

template<>
int32_t getDimmSpareConfig<TYPE_MCA>( TargetHandle_t i_mba, MemRank i_rank,
int32_t getDimmSpareConfig<TYPE_MCA>( TargetHandle_t i_mca, MemRank i_rank,
uint8_t i_ps, uint8_t & o_spareConfig )
{
// No spares for MCAs
o_spareConfig = CEN_VPD_DIMM_SPARE_NO_SPARE;
return SUCCESS;
}

template<>
int32_t getDimmSpareConfig<TYPE_MEM_PORT>( TargetHandle_t i_memPort,
MemRank i_rank, uint8_t i_ps, uint8_t & o_spareConfig )
{
#define PRDF_FUNC "[PlatServices::getDimmSpareConfig] "
int32_t o_rc = SUCCESS;

#ifdef __HOSTBOOT_MODULE
using namespace fapi2;

ATTR_MEM_EFF_DIMM_SPARE_Type attr;
o_spareConfig = ENUM_ATTR_MEM_EFF_DIMM_SPARE_NO_SPARE;
do
{
if( TYPE_MEM_PORT != getTargetType( i_memPort ) )
{
PRDF_ERR( PRDF_FUNC "Invalid Target:0x%08X", getHuid( i_memPort ) );
o_rc = FAIL; break;
}

fapi2::Target<fapi2::TARGET_TYPE_MEM_PORT> fapiPort(i_memPort);
ReturnCode l_rc = FAPI_ATTR_GET( fapi2::ATTR_MEM_EFF_DIMM_SPARE,
fapiPort, attr );
errlHndl_t errl = fapi2::rcToErrl(l_rc);
if ( NULL != errl )
{
PRDF_ERR( PRDF_FUNC "Failed to get ATTR_MEM_EFF_DIMM_SPARE for "
"Target: 0x%08X", getHuid( i_memPort ) );
PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
o_rc = FAIL; break;
}
o_spareConfig = attr[i_rank.getDimmSlct()][i_rank.getRankSlct()];

// Check for valid values
// For X4 DRAM, we can not have full byte as spare config. Also for X8
// DRAM we can not have nibble as spare.

if( ENUM_ATTR_MEM_EFF_DIMM_SPARE_NO_SPARE == o_spareConfig) break;

bool isFullByte = ( ENUM_ATTR_MEM_EFF_DIMM_SPARE_FULL_BYTE ==
o_spareConfig );
bool isX4Dram = isDramWidthX4(i_memPort);

if ( ( isX4Dram && isFullByte ) || ( !isX4Dram && !isFullByte ) )
{
PRDF_ERR( PRDF_FUNC "Invalid Configuration: o_spareConfig:%u",
o_spareConfig );
o_rc = FAIL; break;
}

}while(0);
#endif

return o_rc;
#undef PRDF_FUNC
}

template<>
int32_t getDimmSpareConfig<TYPE_MBA>( TargetHandle_t i_mba, MemRank i_rank,
uint8_t i_ps, uint8_t & o_spareConfig )
Expand Down Expand Up @@ -1040,6 +1195,48 @@ uint32_t isDramSparingEnabled<TYPE_MCA>( TARGETING::TargetHandle_t i_trgt,
return SUCCESS;
}

template<>
uint32_t isDramSparingEnabled<TYPE_MEM_PORT>( TARGETING::TargetHandle_t i_trgt,
MemRank i_rank, uint8_t i_ps,
bool & o_spareEnable )
{
#define PRDF_FUNC "[PlatServices::isDramSparingEnabled<TYPE_MEM_PORT>] "

uint32_t o_rc = SUCCESS;
o_spareEnable = false;

do
{
const bool isX4 = isDramWidthX4( i_trgt );
if ( isX4 )
{
// Always an ECC spare in x4 mode.
o_spareEnable = true;
break;
}

// Check for any DRAM spares.
// TODO RTC 207273 - no TARGETING support for attr yet
//uint8_t cnfg = TARGETING::MEM_EFF_DIMM_SPARE_NO_SPARE;
uint8_t cnfg = 0;
o_rc = getDimmSpareConfig<TYPE_MEM_PORT>( i_trgt, i_rank, i_ps, cnfg );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC "getDimmSpareConfig(0x%08x,0x%02x,%d) "
"failed", getHuid(i_trgt), i_rank.getKey(), i_ps );
break;
}
// TODO RTC 207273 - no TARGETING support for attr yet
//o_spareEnable = (TARGETING::MEM_EFF_DIMM_SPARE_NO_SPARE; != cnfg);
o_spareEnable = (0 != cnfg);

}while(0);

return o_rc;

#undef PRDF_FUNC
}

template<>
uint32_t isDramSparingEnabled<TYPE_MBA>( TARGETING::TargetHandle_t i_trgt,
MemRank i_rank, uint8_t i_ps,
Expand Down
23 changes: 12 additions & 11 deletions src/usr/diag/prdf/common/plat/prdfPlatServices_common.H
Original file line number Diff line number Diff line change
Expand Up @@ -225,34 +225,35 @@ uint32_t clearBadDqBitmap( TARGETING::TargetHandle_t i_trgt,

/**
* @brief Invokes the get steer mux hardware procedure.
* @param i_mba Target MBA/MCA
* @param i_trgt Target MBA/MCA/MEM_PORT
* @param i_rank Target rank.
* @param o_port0Spare A symbol associated with the spare on port 0.
* @param o_port1Spare A symbol associated with the spare on port 1.
* @param o_eccSpare A symbol associated with the ECC spare (x4 mode only).
* @return Non-SUCCESS in internal function fails, SUCCESS otherwise.
*/
template<TARGETING::TYPE T>
int32_t mssGetSteerMux( TARGETING::TargetHandle_t i_mba, const MemRank & i_rank,
MemSymbol & o_port0Spare, MemSymbol & o_port1Spare,
MemSymbol & o_eccSpare );
int32_t mssGetSteerMux( TARGETING::TargetHandle_t i_trgt,
const MemRank & i_rank, MemSymbol & o_port0Spare,
MemSymbol & o_port1Spare, MemSymbol & o_eccSpare );

/**
* @brief Invokes the set steer mux hardware procedure.
* @param i_mba Target MBA.
* @param i_trgt Target MBA/MEM_PORT.
* @param i_rank Target rank.
* @param i_symbol A symbol associated with the DRAM to be spared.
* @param i_x4EccSpare If true, will set ECC spare instead (x4 mode only).
* @note The procedure will be able to derive the port from the given symbol.
* @return Non-SUCCESS in internal function fails, SUCCESS otherwise.
*/
template<TARGETING::TYPE T>
int32_t mssSetSteerMux( TARGETING::TargetHandle_t i_mba, const MemRank & i_rank,
const MemSymbol & i_symbol, bool i_x4EccSpare );
int32_t mssSetSteerMux( TARGETING::TargetHandle_t i_trgt,
const MemRank & i_rank, const MemSymbol & i_symbol,
bool i_x4EccSpare );

/**
* @brief Get spare DRAM information on a DIMM.
* @param i_mba MBA/MCA target.
* @param i_trgt MBA/MCA/MEM_PORT target.
* @param i_rank Rank.
* @param i_ps MBA port select.
* @param o_spareConfig Spare DRAM config information.
Expand All @@ -262,12 +263,12 @@ int32_t mssSetSteerMux( TARGETING::TargetHandle_t i_mba, const MemRank & i_rank,
* populate spare config information in o_spareConfig.
*/
template<TARGETING::TYPE T>
int32_t getDimmSpareConfig( TARGETING::TargetHandle_t i_mba, MemRank i_rank,
int32_t getDimmSpareConfig( TARGETING::TargetHandle_t i_trgt, MemRank i_rank,
uint8_t i_ps, uint8_t & o_spareConfig );

/**
* @brief Checks if DRAM sparing is enabled.
* @param i_trgt Target MBA
* @param i_trgt Target MBA/MEM_PORT
* @param i_rank Target rank
* @param i_ps MBA Port select
* @param o_spareEnable Whether DRAM sparing is enabled or not.
Expand All @@ -279,7 +280,7 @@ uint32_t isDramSparingEnabled( TARGETING::TargetHandle_t i_trgt, MemRank i_rank,

/**
* @brief Checks to see if the spares are available on given target and port.
* @param i_trgt Target MBA
* @param i_trgt Target MBA/MEM_PORT
* @param i_rank Target rank
* @param i_ps Port select
* @param o_spAvail If the spare on inputted port select is available
Expand Down
20 changes: 20 additions & 0 deletions src/usr/diag/prdf/common/plat/prdfTargetServices.C
Original file line number Diff line number Diff line change
Expand Up @@ -1471,6 +1471,8 @@ bool isDramWidthX4( TargetHandle_t i_trgt )
bool o_dramWidthX4 = false;

PRDF_ASSERT( nullptr != i_trgt );
//uint8_t dramWidths = 0;

switch ( getTargetType(i_trgt) )
{
case TYPE_MCA:
Expand All @@ -1482,6 +1484,15 @@ bool isDramWidthX4( TargetHandle_t i_trgt )
i_trgt->getAttr<ATTR_CEN_EFF_DRAM_WIDTH>() );
break;

case TYPE_DIMM:
// TODO RTC 207273 - attribute not in TARGETING code yet
//TargetHandle_t memPort = getConnectedParent(i_trgt, TYPE_MEM_PORT);
//dramWidths = memPort->getAttr<ATTR_MEM_EFF_DRAM_WIDTH>();
//uint8_t dimmSlct = getDimmSlct( i_trgt );
//o_dramWidthX4 =
// (fapi2::ENUM_ATTR_MEM_EFF_DRAM_WIDTH_X4 == dramWidths[dimmSlct]);
break;

default:
PRDF_ASSERT(false); // code bug
}
Expand Down Expand Up @@ -1573,6 +1584,15 @@ void getMasterRanks<TYPE_MBA>( TargetHandle_t i_trgt,
__getMasterRanks<TYPE_MBA>( i_trgt, o_ranks, 0, i_ds );
}

template<>
void getMasterRanks<TYPE_MEM_PORT>( TargetHandle_t i_trgt,
std::vector<MemRank> & o_ranks,
uint8_t i_ds )
{
// TODO RTC 207273 - no support for ATTR_EFF_DIMM_RANKS_CONFIGED attr yet
//__getMasterRanks<TYPE_MEM_PORT>( i_trgt, o_ranks, 0, i_ds );
}

//------------------------------------------------------------------------------

template<TARGETING::TYPE T>
Expand Down
2 changes: 1 addition & 1 deletion src/usr/diag/prdf/common/plat/prdfTargetServices.H
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ uint8_t getDimmSlct( TARGETING::TargetHandle_t i_trgt );

/**
* @brief checks dram width ( x4 )
* @param i_trgt MCA or MBA target
* @param i_trgt MCA, MBA, or DIMM target
* @return true if DRAM width is X4, false otherwise
*/
bool isDramWidthX4(TARGETING::TargetHandle_t i_trgt);
Expand Down
2 changes: 1 addition & 1 deletion src/usr/diag/prdf/common/plugins/prdfParserEnums.H
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ enum PositionBounds

MAX_OCMB_PER_OMI = 1,

MAX_MEM_PORT = 2,
MAX_SUB_PORT = 2,

MAX_NPU_PER_PROC = 3,

Expand Down

0 comments on commit 16024c9

Please sign in to comment.