summaryrefslogtreecommitdiffstats
path: root/src/usr/fapi2
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2018-11-13 16:06:41 -0600
committerZane C. Shelley <zshelle@us.ibm.com>2018-11-30 10:27:54 -0600
commitc3edab536c20f48f9a310fe766139d8b6bc44b11 (patch)
treeaa9260a4731ae351eea17f949f96ad5b07d791c9 /src/usr/fapi2
parent27fd45b3d88a4df575af9c6e7924f603aa7242ab (diff)
downloadtalos-hostboot-c3edab536c20f48f9a310fe766139d8b6bc44b11.tar.gz
talos-hostboot-c3edab536c20f48f9a310fe766139d8b6bc44b11.zip
Dram Repairs VPD spare byte helpers improvements
Change-Id: I8fa671f93e1fa150fe8bf2b0827b9e8ecb243337 RTC: 199027 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/68749 Tested-by: Jenkins Server <pfd-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> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Diffstat (limited to 'src/usr/fapi2')
-rw-r--r--src/usr/fapi2/attribute_service.C219
1 files changed, 91 insertions, 128 deletions
diff --git a/src/usr/fapi2/attribute_service.C b/src/usr/fapi2/attribute_service.C
index 31e6cf84b..8e50da37c 100644
--- a/src/usr/fapi2/attribute_service.C
+++ b/src/usr/fapi2/attribute_service.C
@@ -735,10 +735,11 @@ fapi_try_exit:
//******************************************************************************
// fapi2::platAttrSvc::__dimmUpdateDqBitmapEccByte function
//******************************************************************************
-errlHndl_t __dimmUpdateDqBitmapEccByte(
+ReturnCode __dimmUpdateDqBitmapEccByte(
const Target<TARGET_TYPE_DIMM>& i_fapiDimm,
uint8_t (&o_data)[mss::MAX_RANK_PER_DIMM][mss::BAD_DQ_BYTE_COUNT] )
{
+ ReturnCode l_rc;
errlHndl_t l_errl = nullptr;
const uint8_t ECC_DQ_BYTE_NUMBER_INDEX = 8;
@@ -754,17 +755,17 @@ errlHndl_t __dimmUpdateDqBitmapEccByte(
{
FAPI_ERR( "__dimmUpdateDqBitmapEccByte: Error from "
"getTargetingTarget" );
+ l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl));
break;
}
- l_errl = deviceRead( l_dimm,
- l_eccBits,
- MEM_BUS_WIDTH_SIZE,
- DEVICE_SPD_ADDRESS(SPD::MODULE_MEMORY_BUS_WIDTH) );
+ l_errl = deviceRead( l_dimm, l_eccBits, MEM_BUS_WIDTH_SIZE,
+ DEVICE_SPD_ADDRESS(SPD::MODULE_MEMORY_BUS_WIDTH) );
if ( l_errl )
{
FAPI_ERR( "__dimmUpdateDqBitmapEccByte: Failed to get "
"SPD::MODULE_MEMORY_BUS_WIDTH." );
+ l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl));
break;
}
@@ -792,7 +793,7 @@ errlHndl_t __dimmUpdateDqBitmapEccByte(
l_eccBits = nullptr;
}
- return l_errl;
+ return l_rc;
}
//******************************************************************************
@@ -803,105 +804,86 @@ ReturnCode __dimmGetDqBitmapSpareByte(
uint8_t (&o_spareByte)[mss::MAX_RANK_PER_DIMM])
{
ReturnCode l_rc;
+ TARGETING::ATTR_MODEL_type procType = __getChipModel();
+ uint8_t l_ps = 0;
- do
- {
- // Spare DRAM Attribute: Returns spare DRAM availability for
- // all DIMMs associated with the target MCS.
- uint8_t l_dramSpare[mss::PORTS_PER_MCS][mss::MAX_DIMM_PER_PORT]
- [mss::MAX_RANK_PER_DIMM] = {};
-
- uint32_t l_ds = 0;
- l_rc = FAPI_ATTR_GET( fapi2::ATTR_FAPI_POS, i_fapiDimm, l_ds );
- l_ds = l_ds % mss::MAX_DIMM_PER_PORT;
+ // Spare DRAM Attribute: Returns spare DRAM availability for
+ // all DIMMs associated with the target MCS.
+ uint8_t l_dramSpare[mss::PORTS_PER_MCS][mss::MAX_DIMM_PER_PORT]
+ [mss::MAX_RANK_PER_DIMM] = {};
- uint8_t l_ps = 0;
+ uint32_t l_ds = 0;
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_FAPI_POS, i_fapiDimm, l_ds) );
+ l_ds = l_ds % mss::MAX_DIMM_PER_PORT;
- TARGETING::ATTR_MODEL_type procType = __getChipModel();
+ if ( TARGETING::MODEL_NIMBUS == procType )
+ {
+ // We need the port select from the MCS perspective here so we
+ // can just use __getTranslationPortSlct.
+ __getTranslationPortSlct( i_fapiDimm, l_ps );
- if ( TARGETING::MODEL_NIMBUS == procType )
- {
- // We need the port select from the MCS perspective here so we
- // can just use __getTranslationPortSlct.
- __getTranslationPortSlct( i_fapiDimm, l_ps );
+ Target<TARGET_TYPE_MCA> l_fapiMca =
+ i_fapiDimm.getParent<TARGET_TYPE_MCA>();
- Target<TARGET_TYPE_MCA> l_fapiMca =
- i_fapiDimm.getParent<TARGET_TYPE_MCA>();
+ // Get the MCS.
+ Target<TARGET_TYPE_MCS> l_fapiMcs;
+ l_fapiMcs = l_fapiMca.getParent<TARGET_TYPE_MCS>();
- // Get the MCS.
- Target<TARGET_TYPE_MCS> l_fapiMcs;
- l_fapiMcs = l_fapiMca.getParent<TARGET_TYPE_MCS>();
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_DIMM_SPARE, l_fapiMcs,
+ l_dramSpare) );
+ }
+ else if ( TARGETING::MODEL_CUMULUS == procType )
+ {
+ // In this case we need the port select from the MBA perspective
+ // not the centaur perspective that __getTranslationPortSlct gives
+ // us, so we can't use that function.
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_MBA_PORT, i_fapiDimm, l_ps));
+ l_ps = l_ps % MAX_PORTS_PER_MBA;
- l_rc = FAPI_ATTR_GET( fapi2::ATTR_EFF_DIMM_SPARE, l_fapiMcs,
- l_dramSpare );
- }
- else if ( TARGETING::MODEL_CUMULUS == procType )
- {
- Target<TARGET_TYPE_MBA> l_fapiMba =
- i_fapiDimm.getParent<TARGET_TYPE_MBA>();
- TARGETING::TargetHandle_t l_mbaTrgt = nullptr;
- errlHndl_t l_errl = getTargetingTarget( l_fapiMba, l_mbaTrgt );
- if ( l_errl )
- {
- FAPI_ERR( "__dimmGetDqBitmapSpareByte: Error from "
- "getTargetingTarget getting MBA." );
- l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl));
- break;
- }
- l_rc = FAPI_ATTR_GET( fapi2::ATTR_CEN_VPD_DIMM_SPARE, l_mbaTrgt,
- l_dramSpare );
+ Target<TARGET_TYPE_MBA> l_fapiMba =
+ i_fapiDimm.getParent<TARGET_TYPE_MBA>();
- // In this case we need the port select from the MBA perspective
- // not the centaur perspective that __getTranslationPortSlct gives
- // us, so we can't use that function.
- FAPI_ATTR_GET( fapi2::ATTR_CEN_MBA_PORT, i_fapiDimm, l_ps );
- l_ps = l_ps % MAX_PORTS_PER_MBA;
- }
- else
- {
- FAPI_ERR( "__dimmGetDqBitmapSpareByte: Invalid procType" );
- assert(false);
- }
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_CEN_VPD_DIMM_SPARE, l_fapiMba,
+ l_dramSpare) );
+ }
+ else
+ {
+ // TODO RTC 201603 - generic/axone case
- if ( l_rc )
- {
- FAPI_ERR( "__dimmGetDqBitmapSpareByte: Error getting DRAM Spare "
- "data." );
- break;
- }
+ FAPI_ERR( "__dimmGetDqBitmapSpareByte: Invalid procType" );
+ assert(false);
+ }
- // Iterate through each rank of this DIMM
- for ( uint8_t i = 0; i < mss::MAX_RANK_PER_DIMM; i++ )
+ // Iterate through each rank of this DIMM
+ for ( uint8_t i = 0; i < mss::MAX_RANK_PER_DIMM; i++ )
+ {
+ // Handle spare DRAM configuration cases
+ switch ( l_dramSpare[l_ps][l_ds][i] )
{
- // Handle spare DRAM configuration cases
- switch ( l_dramSpare[l_ps][l_ds][i] )
- {
- case fapi2::ENUM_ATTR_EFF_DIMM_SPARE_NO_SPARE:
- // Set DQ bits reflecting unconnected
- // spare DRAM in caller's data
- o_spareByte[i] = 0xFF;
- break;
+ case fapi2::ENUM_ATTR_EFF_DIMM_SPARE_NO_SPARE:
+ // Set DQ bits reflecting unconnected
+ // spare DRAM in caller's data
+ o_spareByte[i] = 0xFF;
+ break;
- case fapi2::ENUM_ATTR_EFF_DIMM_SPARE_LOW_NIBBLE:
- o_spareByte[i] = 0x0F;
- break;
+ case fapi2::ENUM_ATTR_EFF_DIMM_SPARE_LOW_NIBBLE:
+ o_spareByte[i] = 0x0F;
+ break;
- case fapi2::ENUM_ATTR_EFF_DIMM_SPARE_HIGH_NIBBLE:
- o_spareByte[i] = 0xF0;
- break;
+ case fapi2::ENUM_ATTR_EFF_DIMM_SPARE_HIGH_NIBBLE:
+ o_spareByte[i] = 0xF0;
+ break;
// As erroneous value will not be encountered.
- case fapi2::ENUM_ATTR_EFF_DIMM_SPARE_FULL_BYTE:
- default:
- o_spareByte[i] = 0x0;
- break;
- }
+ case fapi2::ENUM_ATTR_EFF_DIMM_SPARE_FULL_BYTE:
+ default:
+ o_spareByte[i] = 0x0;
+ break;
}
+ }
- }while(0);
-
- return l_rc;
-
+fapi_try_exit:
+ return fapi2::current_err;
}
//******************************************************************************
@@ -913,27 +895,18 @@ ReturnCode __dimmUpdateDqBitmapSpareByte(
{
ReturnCode l_rc;
- do
- {
- uint8_t spareByte[mss::MAX_RANK_PER_DIMM];
- memset( spareByte, 0, sizeof(spareByte) );
+ uint8_t spareByte[mss::MAX_RANK_PER_DIMM];
+ memset( spareByte, 0, sizeof(spareByte) );
- l_rc = __dimmGetDqBitmapSpareByte( i_fapiDimm, spareByte );
+ FAPI_TRY( __dimmGetDqBitmapSpareByte(i_fapiDimm, spareByte) );
- if ( l_rc )
- {
- FAPI_ERR("__dimmUpdateDqBitmapSpareByte: Error getting spare byte");
- break;
- }
-
- for ( uint32_t i = 0; i < mss::MAX_RANK_PER_DIMM; i++ )
- {
- o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] |= spareByte[i];
- }
-
- }while(0);
+ for ( uint32_t i = 0; i < mss::MAX_RANK_PER_DIMM; i++ )
+ {
+ o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] |= spareByte[i];
+ }
- return l_rc;
+fapi_try_exit:
+ return fapi2::current_err;
}
//******************************************************************************
@@ -960,23 +933,10 @@ ReturnCode __compareEccAndSpare(const Target<TARGET_TYPE_DIMM>& i_fapiDimm,
memset( o_eccSpareBitmap, 0, sizeof(o_eccSpareBitmap) );
// Check ECC.
- l_errl = __dimmUpdateDqBitmapEccByte(i_fapiDimm, o_eccSpareBitmap);
- if ( l_errl )
- {
- FAPI_ERR( "__compareEccAndSpare: Error getting ECC data "
- "(Mfg mode)" );
- l_rc = fapi2::FAPI2_RC_INVALID_ATTR_GET;
- break;
- }
+ FAPI_TRY( __dimmUpdateDqBitmapEccByte(i_fapiDimm, o_eccSpareBitmap) );
// Check spare DRAM.
- l_rc = __dimmUpdateDqBitmapSpareByte(i_fapiDimm, o_eccSpareBitmap);
- if ( l_rc )
- {
- FAPI_ERR( "__compareEccAndSpare: Error getting spare DRAM data "
- "(Mfg mode)" );
- break;
- }
+ FAPI_TRY( __dimmUpdateDqBitmapSpareByte(i_fapiDimm, o_eccSpareBitmap) );
// Compare o_eccSpareBitmap to i_callersData.
for ( uint8_t i = 0; i < mss::MAX_RANK_PER_DIMM; i++ )
@@ -1065,7 +1025,13 @@ ReturnCode __compareEccAndSpare(const Target<TARGET_TYPE_DIMM>& i_fapiDimm,
}
}while(0);
- return l_rc;
+ if ( l_rc )
+ {
+ return l_rc;
+ }
+
+fapi_try_exit:
+ return fapi2::current_err;
}
//******************************************************************************
@@ -1406,11 +1372,10 @@ ReturnCode fapiAttrGetBadDqBitmap(
// avoid issues in the setter when SPD DQ is not initialized.
// Set bits for any unconnected DQs.
// First, check ECC.
- l_errl = __dimmUpdateDqBitmapEccByte( l_fapiDimm, o_data );
+ l_rc = __dimmUpdateDqBitmapEccByte( l_fapiDimm, o_data );
if ( l_errl )
{
FAPI_ERR( "fapiAttrGetBadDqBitmap: Error getting ECC data" );
- l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl));
break;
}
@@ -1437,11 +1402,10 @@ ReturnCode fapiAttrGetBadDqBitmap(
// Set bits for any unconnected DQs.
// First, check ECC.
- l_errl = __dimmUpdateDqBitmapEccByte( l_fapiDimm, o_data );
+ l_rc = __dimmUpdateDqBitmapEccByte( l_fapiDimm, o_data );
if ( l_errl )
{
FAPI_ERR( "fapiAttrGetBadDqBitmap: Error getting ECC data" );
- l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl));
break;
}
@@ -1549,11 +1513,10 @@ ReturnCode fapiAttrSetBadDqBitmap(
uint8_t l_tmpData[mss::MAX_RANK_PER_DIMM][mss::BAD_DQ_BYTE_COUNT];
memcpy( &l_tmpData, &i_data, sizeof(i_data) );
- l_errl = __dimmUpdateDqBitmapEccByte( l_fapiDimm, l_tmpData );
+ l_rc = __dimmUpdateDqBitmapEccByte( l_fapiDimm, l_tmpData );
if ( l_errl )
{
FAPI_ERR( "fapiAttrSetBadDqBitmap: Error getting ECC data." );
- l_rc.setPlatDataPtr(reinterpret_cast<void *>(l_errl));
break;
}
OpenPOWER on IntegriCloud