diff options
author | Claus Michael Olsen <cmolsen@us.ibm.com> | 2016-09-29 02:44:19 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2016-09-29 23:25:39 -0400 |
commit | 6eabda34fa0adfe714f1e11090383e59ef7516ce (patch) | |
tree | c19935bccad6d55e81be456792f5a8f215ac8683 /src/import/chips/p9/procedures | |
parent | 74a70a51b6f1a14ca45aa89a8639e741de23a948 (diff) | |
download | talos-hostboot-6eabda34fa0adfe714f1e11090383e59ef7516ce.tar.gz talos-hostboot-6eabda34fa0adfe714f1e11090383e59ef7516ce.zip |
Support for EX VPD instance rings.
Change-Id: I43090f95b6ee2729549d962c1af6827d59b4277c
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/30458
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: PPE CI <ppe-ci+hostboot@us.ibm.com>
Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com>
Dev-Ready: Matt K. Light <mklight@us.ibm.com>
Reviewed-by: RANGANATHPRASAD G. BRAHMASAMUDRA <prasadbgr@in.ibm.com>
Reviewed-by: Martin Gloff <mgloff@us.ibm.com>
Reviewed-by: Benjamin Gass <bgass@us.ibm.com>
Reviewed-by: Joseph J. McGill <jmcgill@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/30461
Reviewed-by: Hostboot Team <hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures')
5 files changed, 402 insertions, 352 deletions
diff --git a/src/import/chips/p9/procedures/hwp/accessors/p9_get_mvpd_ring.C b/src/import/chips/p9/procedures/hwp/accessors/p9_get_mvpd_ring.C index b7b77ec8a..72f63f030 100644 --- a/src/import/chips/p9/procedures/hwp/accessors/p9_get_mvpd_ring.C +++ b/src/import/chips/p9/procedures/hwp/accessors/p9_get_mvpd_ring.C @@ -42,32 +42,35 @@ extern "C" { using namespace fapi2; -// getMvpdRing: Wrapper to call common function mvpdRingFunc + // getMvpdRing: Wrapper to call common function mvpdRingFunc fapi2::ReturnCode getMvpdRing( fapi2::MvpdRecord i_record, fapi2::MvpdKeyword i_keyword, const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> & i_fapiTarget, const uint8_t i_chipletId, + const uint64_t i_evenOddMask, const uint8_t i_ringId, - uint8_t* i_pRingBuf, - uint32_t& io_rRingBufsize) + uint8_t* i_pRingBuf, + uint32_t& io_rRingBufsize ) { fapi2::ReturnCode l_fapirc; - FAPI_DBG("getMvpdRing: entry ringId=0x%x, chipletId=0x%x, size=0x%x ", + FAPI_DBG("getMvpdRing: Called w/ringId=0x%x, chipletId=0x%x, evenOddMask=0x%016llx, size=0x%x", i_ringId, i_chipletId, + i_evenOddMask, io_rRingBufsize ); // common get and set processing - l_fapirc = mvpdRingFunc(MVPD_RING_GET, - i_record, - i_keyword, - i_fapiTarget, - i_chipletId, - i_ringId, - i_pRingBuf, - io_rRingBufsize); + l_fapirc = mvpdRingFunc( MVPD_RING_GET, + i_record, + i_keyword, + i_fapiTarget, + i_chipletId, + i_evenOddMask, + i_ringId, + i_pRingBuf, + io_rRingBufsize ); FAPI_DBG("getMvpdRing: exit rc=0x%x", diff --git a/src/import/chips/p9/procedures/hwp/accessors/p9_get_mvpd_ring.H b/src/import/chips/p9/procedures/hwp/accessors/p9_get_mvpd_ring.H index c0ad0ab9a..622c11687 100644 --- a/src/import/chips/p9/procedures/hwp/accessors/p9_get_mvpd_ring.H +++ b/src/import/chips/p9/procedures/hwp/accessors/p9_get_mvpd_ring.H @@ -39,10 +39,15 @@ namespace fapi2 { // function pointer typedef definition for HWP call support -typedef ReturnCode (*getMvpdRing_FP_t) -(MvpdRecord, MvpdKeyword, - const Target<TARGET_TYPE_PROC_CHIP>&, - const uint8_t, const uint8_t, uint8_t*, uint32_t&); +typedef ReturnCode (*getMvpdRing_FP_t) ( + MvpdRecord, + MvpdKeyword, + const Target<TARGET_TYPE_PROC_CHIP>&, + const uint8_t, + const uint64_t, + const uint8_t, + uint8_t*, + uint32_t& ); extern "C" { @@ -60,6 +65,7 @@ extern "C" * MVPD_RECORD_CP00 - MVPD_KEYWORD_PDG * @param i_fapiTarget - cpu target * @param i_chipletId - Chiplet ID + * @param i_evenOddMask - Mask to choose even or odd EX. O for all other chiplets * @param i_ringId - Ring ID * @param i_pRingBuf - pointer to a buffer allocated by the caller * to receive the ring header and data. @@ -91,6 +97,7 @@ extern "C" const Target<TARGET_TYPE_PROC_CHIP>& i_fapiTarget, const uint8_t i_chipletId, + const uint64_t i_evenOddMask, const uint8_t i_ringId, uint8_t* io_pRingBuf, uint32_t& io_rRingBufsize ); diff --git a/src/import/chips/p9/procedures/hwp/accessors/p9_mvpd_ring_funcs.C b/src/import/chips/p9/procedures/hwp/accessors/p9_mvpd_ring_funcs.C index db02498ec..939ce2619 100644 --- a/src/import/chips/p9/procedures/hwp/accessors/p9_mvpd_ring_funcs.C +++ b/src/import/chips/p9/procedures/hwp/accessors/p9_mvpd_ring_funcs.C @@ -59,6 +59,7 @@ extern "C" fapi2::MvpdRecord i_record, fapi2::MvpdKeyword i_keyword, const uint8_t i_chipletId, + const uint64_t i_evenOddMask, const uint8_t i_ringId, uint8_t* i_pRecordBuf, uint32_t i_recordBufLenfapi, @@ -163,6 +164,9 @@ extern "C" * @param[in] i_chipletId * Chiplet ID for the op * + * @param[in] i_evenOddMask + * Mask to choose even or odd EX. O for all other chiplets + * * @param[in] i_ringId * Ring ID for the op * @@ -176,15 +180,16 @@ extern "C" * * @return fapi2::ReturnCode */ - fapi2::ReturnCode mvpdRingFunc(const mvpdRingFuncOp i_mvpdRingFuncOp, - fapi2::MvpdRecord i_record, - fapi2::MvpdKeyword i_keyword, - const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> - & i_fapiTarget, - const uint8_t i_chipletId, - const uint8_t i_ringId, - uint8_t* i_pRingBuf, - uint32_t& io_rRingBufsize) + fapi2::ReturnCode mvpdRingFunc( const mvpdRingFuncOp i_mvpdRingFuncOp, + fapi2::MvpdRecord i_record, + fapi2::MvpdKeyword i_keyword, + const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> + & i_fapiTarget, + const uint8_t i_chipletId, + const uint64_t i_evenOddMask, + const uint8_t i_ringId, + uint8_t* i_pRingBuf, + uint32_t& io_rRingBufsize ) { fapi2::ReturnCode l_fapirc = fapi2::FAPI2_RC_SUCCESS; uint32_t l_recordLen = 0; @@ -192,11 +197,12 @@ extern "C" uint8_t* l_pRing = NULL; uint32_t l_ringLen = 0; - FAPI_DBG("mvpdRingFunc:entry op=0x%x ringId=0x%x chipletId=0x%x " - "size=0x%x", + FAPI_DBG("mvpdRingFunc: Called w/op=0x%x, ringId=0x%x, chipletId=0x%x, " + "evenOddMask=0x%016llx, size=0x%x", i_mvpdRingFuncOp, i_ringId, i_chipletId, + i_evenOddMask, io_rRingBufsize ); // do common get and set input parameter error checks @@ -256,8 +262,9 @@ extern "C" l_recordBuf, l_recordLen ), "mvpdRingFunc: getMvpdField failed " - "chipletId=0x%x, ringId=0x%x", + "chipletId=0x%x, evenOddMask=0x%016llx, ringId=0x%x", i_chipletId, + i_evenOddMask, i_ringId); // find ring in the record. It is an error if not there for a "get". @@ -267,14 +274,16 @@ extern "C" i_record, i_keyword, i_chipletId, + i_evenOddMask, i_ringId, l_recordBuf, l_recordLen, l_pRing, l_ringLen), "mvpdRingFunc: mvpdRingFuncFind failed " - "chipletId=0x%x, ringId=0x%x", + "chipletId=0x%x, evenOddMask=0x%016llx, ringId=0x%x", i_chipletId, + i_evenOddMask, i_ringId); // do the get or set specific operations @@ -306,8 +315,9 @@ extern "C" i_pRingBuf, io_rRingBufsize), "mvpdRingFunc: mvpdRingFuncGet failed " - "chipletId=0x%x, ringId=0x%x", + "chipletId=0x%x, evenOddMask=0x%016llx, ringId=0x%x", i_chipletId, + i_evenOddMask, i_ringId); } else // set operation @@ -371,6 +381,9 @@ extern "C" * @param[in] i_chipletId * Chiplet ID for the op * + * @param[in] i_evenOddMask + * Mask to choose even or odd EX. O for all other chiplets + * * @param[in] i_ringId * Ring ID for the op * @@ -391,16 +404,17 @@ extern "C" * * @return fapi2::ReturnCode */ - fapi2::ReturnCode mvpdRingFuncFind(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> - & i_fapiTarget, - fapi2::MvpdRecord i_record, - fapi2::MvpdKeyword i_keyword, - const uint8_t i_chipletId, - const uint8_t i_ringId, - uint8_t* i_pRecordBuf, - uint32_t i_recordBufLen, - uint8_t*& o_rpRing, - uint32_t& o_rRingLen) + fapi2::ReturnCode mvpdRingFuncFind( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> + & i_fapiTarget, + fapi2::MvpdRecord i_record, + fapi2::MvpdKeyword i_keyword, + const uint8_t i_chipletId, + const uint64_t i_evenOddMask, + const uint8_t i_ringId, + uint8_t* i_pRecordBuf, + uint32_t i_recordBufLen, + uint8_t*& o_rpRing, + uint32_t& o_rRingLen ) { fapi2::ReturnCode l_fapirc; uint8_t* l_pRing = NULL; @@ -412,9 +426,10 @@ extern "C" o_rpRing = NULL; o_rRingLen = 0; - FAPI_DBG("mvpdRingFuncFind: entry chipletId=0x%x, ringId=0x%x ", + FAPI_DBG("mvpdRingFuncFind: Called w/chipletId=0x%x, evenOddMask=0x%016llx, ringId=0x%x ", i_chipletId, - i_ringId ); + i_evenOddMask, + i_ringId); do { @@ -483,13 +498,15 @@ extern "C" be32toh(l_pScanData->iv_size) ); - if ( (l_pScanData->iv_ringId == i_ringId) - && (l_pScanData->iv_chipletId == i_chipletId) ) + if ( l_pScanData->iv_ringId == i_ringId && + l_pScanData->iv_chipletId == i_chipletId && + ( i_evenOddMask == 0 || (be64toh(l_pScanData->iv_scanSelect) & i_evenOddMask) ) ) { FAPI_DBG( "mvpdRingFuncFind: Found it: ringId=0x%x, " - "chiplet=0x%x, ringlen=0x%x", + "chipletId=0x%x, evenOddMask=0x%016llx, ringlen=0x%x", i_ringId, i_chipletId, + i_evenOddMask, be32toh(l_pScanData->iv_length) ); // shouldn't happen, but does not all fit @@ -759,6 +776,7 @@ extern "C" i_keyword, 0x00, 0x00, + 0x00, i_pRecordBuf, i_recordLen, l_pRingEnd, // find start of padding diff --git a/src/import/chips/p9/procedures/hwp/accessors/p9_mvpd_ring_funcs.H b/src/import/chips/p9/procedures/hwp/accessors/p9_mvpd_ring_funcs.H index 636c65140..6965d4b1b 100644 --- a/src/import/chips/p9/procedures/hwp/accessors/p9_mvpd_ring_funcs.H +++ b/src/import/chips/p9/procedures/hwp/accessors/p9_mvpd_ring_funcs.H @@ -46,10 +46,16 @@ enum mvpdRingFuncOp MVPD_RING_SET, }; -typedef ReturnCode (*mvpdRingFuncs_FP_t) -(mvpdRingFuncOp, MvpdRecord, MvpdKeyword, - const Target<TARGET_TYPE_PROC_CHIP>&, - const uint8_t, const uint8_t, uint8_t*, uint32_t&); +typedef ReturnCode (*mvpdRingFuncs_FP_t) ( + mvpdRingFuncOp, + MvpdRecord, + MvpdKeyword, + const Target<TARGET_TYPE_PROC_CHIP>&, + const uint8_t, + const uint64_t, + const uint8_t, + uint8_t*, + uint32_t& ); extern "C" { @@ -66,6 +72,7 @@ extern "C" * @param i_keyword - Keyword enumerator * @param i_fapiTarget - cpu target * @param i_chipletId - Chiplet ID + * @param i_evenOddMask - Mask to choose even or odd EX. O for all other chiplets * @param i_ringId - Ring ID * @param i_pRingBuf - The buffer to receive or send the ring * @param io_rRingBufsize - Size of ring / ring buffer @@ -73,15 +80,16 @@ extern "C" * @return fapi2::ReturnCode - FAPI_RC_SUCCESS if success, * relevant error code for failure. */ - ReturnCode mvpdRingFunc(mvpdRingFuncOp i_mvpdRingFuncOp, - MvpdRecord i_record, - MvpdKeyword i_keyword, - const Target<TARGET_TYPE_PROC_CHIP>& - i_fapiTarget, - const uint8_t i_chipletId, - const uint8_t i_ringId, - uint8_t* i_pRingBuf, - uint32_t& io_rRingBufsize); + ReturnCode mvpdRingFunc( mvpdRingFuncOp i_mvpdRingFuncOp, + MvpdRecord i_record, + MvpdKeyword i_keyword, + const Target<TARGET_TYPE_PROC_CHIP>& + i_fapiTarget, + const uint8_t i_chipletId, + const uint64_t i_evenOddMask, + const uint8_t i_ringId, + uint8_t* i_pRingBuf, + uint32_t& io_rRingBufsize ); } // extern "C" } // namespace fapi diff --git a/src/import/chips/p9/procedures/hwp/customize/p9_xip_customize.C b/src/import/chips/p9/procedures/hwp/customize/p9_xip_customize.C index a28476393..97ba4c63b 100644 --- a/src/import/chips/p9/procedures/hwp/customize/p9_xip_customize.C +++ b/src/import/chips/p9/procedures/hwp/customize/p9_xip_customize.C @@ -155,9 +155,13 @@ fapi2::ReturnCode _fetch_and_insert_vpd_rings( ReturnCode l_fapiRc = fapi2::FAPI2_RC_SUCCESS; int l_rc = 0; - uint8_t iRingsPerChipletId, l_ringsPerChipletId = 0; - uint16_t l_instanceIdMax; - uint8_t bSkipRing = 0; + uint8_t l_chipletId; + uint8_t l_ringsPerChipletId = 0; + uint8_t l_instanceIdMax; + uint8_t l_evenOdd; + uint64_t l_evenOddMaskStart; + uint64_t l_evenOddMask; + uint8_t bSkipRing = 0; FAPI_DBG("Entering _fetch_and_insert_vpd_rings"); @@ -170,19 +174,20 @@ fapi2::ReturnCode _fetch_and_insert_vpd_rings( goto fapi_try_exit; } - // For EX rings, there's two [identical] rings listed in Mvpd per [EQ] chipletId - // listed in ring_identification.C: One for each of the two cores, even and odd. + // For EX rings, there's two rings listed in the Mvpd per [EQ] chipletId + // listed in ring_identification.C: One for each of the two EX, even and odd. // Each of these two rings have the same [EQ] chipletId encoded in their // iv_chipletId (current RS4 header) or iv_scanAddress (next gen RS4 header). - // So for each chipletId listed in ring_identification.C we need to fetch and - // append two Mvpd rings. - if (i_ring.vpdRingClass == VPD_RING_CLASS_EX) + // They are distinguished by their even-odd bits 12-13 in iv_scanSelect. + if (i_ring.vpdRingClass == VPD_RING_CLASS_EX_INS) { - l_ringsPerChipletId = 1; // Will be =2 when we start RS4v2 header support. + l_ringsPerChipletId = 2; + l_evenOddMaskStart = ((uint64_t)0x00080000) << 32; } else { l_ringsPerChipletId = 1; + l_evenOddMaskStart = 0; } @@ -199,106 +204,140 @@ fapi2::ReturnCode _fetch_and_insert_vpd_rings( l_instanceIdMax = i_ring.instanceIdMax; } - for (auto l_chipletId = i_ring.instanceIdMin; l_chipletId <= l_instanceIdMax; l_chipletId++) + for (l_chipletId = i_ring.instanceIdMin; l_chipletId <= l_instanceIdMax; l_chipletId++) { - FAPI_INF("_fetch_and_insert_vpd_rings: (ringId,chipletId) = (0x%02X,0x%02x)", - i_ring.ringId, l_chipletId); + for (l_evenOdd = 0; l_evenOdd < l_ringsPerChipletId; l_evenOdd++) + { - auto l_vpdRingSize = i_vpdRingSize; - MvpdKeyword l_mvpdKeyword; + l_evenOddMask = l_evenOddMaskStart >> l_evenOdd; - switch (i_ring.vpdKeyword) - { - case VPD_KEYWORD_PDG: // #G Time rings - l_mvpdKeyword = fapi2::MVPD_KEYWORD_PDG; - break; - case VPD_KEYWORD_PDR: // #R Repair rings - l_mvpdKeyword = fapi2::MVPD_KEYWORD_PDR; - break; + FAPI_INF("_fetch_and_insert_vpd_rings: (ringId,chipletId) = (0x%02X,0x%02x)", + i_ring.ringId, l_chipletId); - default: - FAPI_ASSERT( false, - fapi2::XIPC_INVALID_VPD_KEYWORD(). - set_CHIP_TARGET(i_proc_target). - set_VPD_KEYWORD(i_ring.vpdKeyword), - "Code bug: Unsupported value of vpdKeyword (=%d)", - i_ring.vpdKeyword ); - break; - } + auto l_vpdRingSize = i_vpdRingSize; + MvpdKeyword l_mvpdKeyword; + switch (i_ring.vpdKeyword) + { + case VPD_KEYWORD_PDG: // #G Time rings + l_mvpdKeyword = fapi2::MVPD_KEYWORD_PDG; + break; + + case VPD_KEYWORD_PDR: // #R Repair rings + l_mvpdKeyword = fapi2::MVPD_KEYWORD_PDR; + break; + + default: + FAPI_ASSERT( false, + fapi2::XIPC_INVALID_VPD_KEYWORD(). + set_CHIP_TARGET(i_proc_target). + set_VPD_KEYWORD(i_ring.vpdKeyword), + "Code bug: Unsupported value of vpdKeyword (=%d)", + i_ring.vpdKeyword ); + break; + } - ///////////////////////////////////////////////////////////////////// - // Fetch rings from the MVPD: - ///////////////////////////////////////////////////////////////////// - // If an EC ring is an instance ring, then check if EC chipletId is represented in bootCoreMask, - // and only fetch if it is. - // If an EX/EQ ring is an instance ring, then check if the associated EC chipletId range in - // in bootCoreMask is represented by at least one EC chipletId, and fetch it if it is. - // Otherwise the ring is a common ring which we always must fetch. + ///////////////////////////////////////////////////////////////////// + // Fetch rings from the MVPD: + ///////////////////////////////////////////////////////////////////// - bSkipRing = 0; + // If an EC ring is an instance ring, then check if EC chipletId is represented in bootCoreMask, + // and only fetch if it is. + // If an EX/EQ ring is an instance ring, then check if the associated EC chipletId range in + // in bootCoreMask is represented by at least one EC chipletId, and fetch it if it is. + // Otherwise the ring is a common ring which we always must fetch. - if ( i_ring.vpdRingClass == VPD_RING_CLASS_EQ_INS && - (i_sysPhase == SYSPHASE_HB_SBE || i_sysPhase == SYSPHASE_RT_SGPE) ) - { - // Fetch EQ instance ring - // - Fetch for SBE and SGPE only. + bSkipRing = 0; - if ( ((0x0000000F << ((NUM_OF_QUADS - 1)*CORES_PER_QUAD)) >> ((l_chipletId - i_ring.instanceIdMin)*CORES_PER_QUAD)) & - io_bootCoreMask ) + if ( i_ring.vpdRingClass == VPD_RING_CLASS_EQ_INS && + (i_sysPhase == SYSPHASE_HB_SBE || i_sysPhase == SYSPHASE_RT_SGPE) ) { - l_fapiRc = getMvpdRing( MVPD_RECORD_CP00, - l_mvpdKeyword, - i_proc_target, - l_chipletId, - i_ring.ringId, - (uint8_t*)i_vpdRing, - l_vpdRingSize ); + // Fetch EQ instance ring + // - Fetch for SBE and SGPE only. + + if ( ((0x0000000F << ((NUM_OF_QUADS - 1)*CORES_PER_QUAD)) >> ((l_chipletId - i_ring.instanceIdMin)*CORES_PER_QUAD)) & + io_bootCoreMask ) + { + l_fapiRc = getMvpdRing( MVPD_RECORD_CP00, + l_mvpdKeyword, + i_proc_target, + l_chipletId, + l_evenOddMask, + i_ring.ringId, + (uint8_t*)i_vpdRing, + l_vpdRingSize ); + } + else + { + bSkipRing = 1; + } + } - else + else if ( i_ring.vpdRingClass == VPD_RING_CLASS_EX_INS && + (i_sysPhase == SYSPHASE_HB_SBE || i_sysPhase == SYSPHASE_RT_SGPE) ) { - bSkipRing = 1; - } + // Fetch EX instance ring + // - Fetch for SBE and SGPE only. - } - else if ( i_ring.vpdRingClass == VPD_RING_CLASS_EX_INS && - (i_sysPhase == SYSPHASE_HB_SBE || i_sysPhase == SYSPHASE_RT_SGPE) ) - { - // Fetch EX instance ring - // - Fetch for SBE and SGPE only. + if ( ((0x0000000F << ((NUM_OF_QUADS - 1)*CORES_PER_QUAD)) >> ((l_chipletId - i_ring.instanceIdMin)*CORES_PER_QUAD)) & + io_bootCoreMask ) + { + l_fapiRc = getMvpdRing( MVPD_RECORD_CP00, + l_mvpdKeyword, + i_proc_target, + l_chipletId, + l_evenOddMask, + i_ring.ringId, + (uint8_t*)i_vpdRing, + l_vpdRingSize ); + } + else + { + bSkipRing = 1; + } - if ( ((0x0000000F << ((NUM_OF_QUADS - 1)*CORES_PER_QUAD)) >> ((l_chipletId - i_ring.instanceIdMin)*CORES_PER_QUAD)) & - io_bootCoreMask ) - { - l_fapiRc = getMvpdRing( MVPD_RECORD_CP00, - l_mvpdKeyword, - i_proc_target, - l_chipletId, - i_ring.ringId, - (uint8_t*)i_vpdRing, - l_vpdRingSize ); } - else + else if ( i_ring.vpdRingClass == VPD_RING_CLASS_EC_INS && + (i_sysPhase == SYSPHASE_HB_SBE || i_sysPhase == SYSPHASE_RT_CME) ) { - bSkipRing = 1; - } + // Fetch EC instance ring + // - Fetch for SBE and CME only. - } - else if ( i_ring.vpdRingClass == VPD_RING_CLASS_EC_INS && - (i_sysPhase == SYSPHASE_HB_SBE || i_sysPhase == SYSPHASE_RT_CME) ) - { - // Fetch EC instance ring - // - Fetch for SBE and CME only. + if ( ((0x00000001 << (NUM_OF_CORES - 1)) >> (l_chipletId - i_ring.instanceIdMin)) & io_bootCoreMask ) + { + l_fapiRc = getMvpdRing( MVPD_RECORD_CP00, + l_mvpdKeyword, + i_proc_target, + l_chipletId, + l_evenOddMask, + i_ring.ringId, + (uint8_t*)i_vpdRing, + l_vpdRingSize ); + } + else + { + bSkipRing = 1; + } - if ( ((0x00000001 << (NUM_OF_CORES - 1)) >> (l_chipletId - i_ring.instanceIdMin)) & io_bootCoreMask ) + } + else if ( i_sysPhase == SYSPHASE_HB_SBE || + (i_sysPhase == SYSPHASE_RT_CME && i_ring.vpdRingClass == VPD_RING_CLASS_EC) || + (i_sysPhase == SYSPHASE_RT_SGPE && (i_ring.vpdRingClass == VPD_RING_CLASS_EX || + i_ring.vpdRingClass == VPD_RING_CLASS_EQ)) ) { + // Fetch common ring + // - Fetch all VPD rings for SBE. + // - Fetch only EC VPD rings for CME. + // - Fetch only EX+EQ VPD rings for SGPE. + l_fapiRc = getMvpdRing( MVPD_RECORD_CP00, l_mvpdKeyword, i_proc_target, l_chipletId, + l_evenOddMask, i_ring.ringId, (uint8_t*)i_vpdRing, l_vpdRingSize ); @@ -308,149 +347,129 @@ fapi2::ReturnCode _fetch_and_insert_vpd_rings( bSkipRing = 1; } - } - else if ( i_sysPhase == SYSPHASE_HB_SBE || - (i_sysPhase == SYSPHASE_RT_CME && i_ring.vpdRingClass == VPD_RING_CLASS_EC) || - (i_sysPhase == SYSPHASE_RT_SGPE && (i_ring.vpdRingClass == VPD_RING_CLASS_EX || - i_ring.vpdRingClass == VPD_RING_CLASS_EQ)) ) - { - // Fetch common ring - // - Fetch all VPD rings for SBE. - // - Fetch only EC VPD rings for CME. - // - Fetch only EX+EQ VPD rings for SGPE. - - l_fapiRc = getMvpdRing( MVPD_RECORD_CP00, - l_mvpdKeyword, - i_proc_target, - l_chipletId, - i_ring.ringId, - (uint8_t*)i_vpdRing, - l_vpdRingSize ); - } - else - { - bSkipRing = 1; - } - - - /////////////////////////////////////////////////////////////////////// - //Append VPD ring to the ring section - /////////////////////////////////////////////////////////////////////// - - if (bSkipRing) - { - continue; - } - else if (l_fapiRc == fapi2::FAPI2_RC_SUCCESS) - { - - auto l_vpdChipletId = ((CompressedScanData*)i_vpdRing)->iv_chipletId; - // Even though success, checking that chipletId didn't somehow get - // messed up (code bug). - //@TODO: Modify this when chipletId becomes part of iv_scanAddress - // as part of RS4 shrinkage (RTC158101). - FAPI_ASSERT( l_vpdChipletId == l_chipletId, - fapi2::XIPC_MVPD_CHIPLET_ID_MESS(). - set_CHIP_TARGET(i_proc_target). - set_CHIPLET_ID(l_chipletId). - set_MVPD_CHIPLET_ID(l_vpdChipletId). - set_RING_ID(i_ring.ringId), - "_fetch_and_insert_vpd_rings: Code bug: VPD ring's chipletId" - " in scan container (=0x%X) doesn't match the requested" - " chipletId (=0x%X)", - l_vpdChipletId, l_chipletId ); - - // Even though success, checking for accidental buffer overflow (code bug). - FAPI_ASSERT( l_vpdRingSize <= i_vpdRingSize, - fapi2::XIPC_MVPD_RING_SIZE_MESS(). - set_CHIP_TARGET(i_proc_target). - set_RING_ID(i_ring.ringId). - set_CHIPLET_ID(l_chipletId). - set_RING_BUFFER_SIZE(i_vpdRingSize). - set_MVPD_RING_SIZE(l_vpdRingSize), - "_fetch_and_insert_vpd_rings: Code bug: VPD ring size (=0x%X) exceeds" - " allowed ring buffer size (=0x%X)", - l_vpdRingSize, i_vpdRingSize ); - - //@TODO: Remove following line asap. Temporary fix until Sgro starts using - // latest p9_scan_compression.H. - // Also fix p9_mvpd_ring_funcs.C to look for entire RS4_MAGIC string. - // Actually, do all the above in connection with RS4 header - // shrinkage (RTC158101 and RTC159801). - ((CompressedScanData*)i_vpdRing)->iv_magic = htobe32(RS4_MAGIC); - - // Check if ring is a flush ring, i.e. if it is redundant, meaning that it will - // result in no change. - int redundant = 0; - l_rc = rs4_redundant((CompressedScanData*)i_vpdRing, &redundant); - FAPI_ASSERT( l_rc == 0, - fapi2::XIPC_RS4_REDUNDANT_ERROR(). - set_CHIP_TARGET(i_proc_target). - set_RING_ID(i_ring.ringId). - set_CHIPLET_ID(l_chipletId), - "rs4_redundant: Failed w/rc=%i for " - "ringId=0x%02X, chipletId=0x%02X ", - l_rc, i_ring.ringId, l_chipletId ); + /////////////////////////////////////////////////////////////////////// + //Append VPD ring to the ring section + /////////////////////////////////////////////////////////////////////// - if (redundant) + if (bSkipRing) { - FAPI_DBG("Skipping redundant VPD ring: ringId=0x%02X, chipletId=0x%02X ", i_ring.ringId, l_chipletId); - fapi2::current_err = fapi2::FAPI2_RC_SUCCESS; - // Note that we do not want to exit here. There could be content in the next - // instance. We're just not appending the current redundant one. + continue; } - else + else if (l_fapiRc == fapi2::FAPI2_RC_SUCCESS) { - //@TODO: Temporary fix to convert VPD RS4 container format to - // to RingLayout format. Remove/replace in connection - // with RS4 header shrinkage (RTC158101) - uint32_t i; + auto l_vpdChipletId = ((CompressedScanData*)i_vpdRing)->iv_chipletId; - for (i = 0; i < l_vpdRingSize; i++) + // Even though success, checking that chipletId didn't somehow get + // messed up (code bug). + //@TODO: Modify this when chipletId becomes part of iv_scanAddress + // as part of RS4 shrinkage (RTC158101). + FAPI_ASSERT( l_vpdChipletId == l_chipletId, + fapi2::XIPC_MVPD_CHIPLET_ID_MESS(). + set_CHIP_TARGET(i_proc_target). + set_CHIPLET_ID(l_chipletId). + set_MVPD_CHIPLET_ID(l_vpdChipletId). + set_RING_ID(i_ring.ringId), + "_fetch_and_insert_vpd_rings: Code bug: VPD ring's chipletId" + " in scan container (=0x%X) doesn't match the requested" + " chipletId (=0x%X)", + l_vpdChipletId, l_chipletId ); + + // Even though success, checking for accidental buffer overflow (code bug). + FAPI_ASSERT( l_vpdRingSize <= i_vpdRingSize, + fapi2::XIPC_MVPD_RING_SIZE_MESS(). + set_CHIP_TARGET(i_proc_target). + set_RING_ID(i_ring.ringId). + set_CHIPLET_ID(l_chipletId). + set_RING_BUFFER_SIZE(i_vpdRingSize). + set_MVPD_RING_SIZE(l_vpdRingSize), + "_fetch_and_insert_vpd_rings: Code bug: VPD ring size (=0x%X) exceeds" + " allowed ring buffer size (=0x%X)", + l_vpdRingSize, i_vpdRingSize ); + + //@TODO: Remove following line asap. Temporary fix until Sgro starts using + // latest p9_scan_compression.H. + // Also fix p9_mvpd_ring_funcs.C to look for entire RS4_MAGIC string. + // Actually, do all the above in connection with RS4 header + // shrinkage (RTC158101 and RTC159801). + ((CompressedScanData*)i_vpdRing)->iv_magic = htobe32(RS4_MAGIC); + + // Check if ring is a flush ring, i.e. if it is redundant, meaning that it will + // result in no change. + int redundant = 0; + l_rc = rs4_redundant((CompressedScanData*)i_vpdRing, &redundant); + FAPI_ASSERT( l_rc == 0, + fapi2::XIPC_RS4_REDUNDANT_ERROR(). + set_CHIP_TARGET(i_proc_target). + set_RING_ID(i_ring.ringId). + set_CHIPLET_ID(l_chipletId), + "rs4_redundant: Failed w/rc=%i for " + "ringId=0x%02X, chipletId=0x%02X ", + l_rc, i_ring.ringId, l_chipletId ); + + if (redundant) { - *(((uint8_t*)i_vpdRing) + l_vpdRingSize - 1 + sizeof(P9_TOR::RingLayout_t) - i) = - *(((uint8_t*)i_vpdRing) + l_vpdRingSize - 1 - i); + FAPI_DBG("Skipping redundant VPD ring: ringId=0x%02X, chipletId=0x%02X ", i_ring.ringId, l_chipletId); + fapi2::current_err = fapi2::FAPI2_RC_SUCCESS; + // Note that we do not want to exit here. There could be content in the next + // instance. We're just not appending the current redundant one. } + else + { - uint32_t l_sizeOfThisRing = l_vpdRingSize + sizeof(P9_TOR::RingLayout_t); - ((P9_TOR::RingLayout_t*)i_vpdRing)->sizeOfThis = htobe32(l_sizeOfThisRing); - ((P9_TOR::RingLayout_t*)i_vpdRing)->sizeOfCmsk = 0; - ((P9_TOR::RingLayout_t*)i_vpdRing)->sizeOfMeta = 0; + //@TODO: Temporary fix to convert VPD RS4 container format to + // to RingLayout format. Remove/replace in connection + // with RS4 header shrinkage (RTC158101) + uint32_t i; - // Checking for potential image overflow BEFORE appending the ring. - if ( (io_ringSectionSize + l_sizeOfThisRing) > i_maxRingSectionSize ) - { - //@TODO: We can't update bootCoreMask until RTC158106. So for now - // we're simply returning the requested bootCoreMask. Thus, - // should there be an overflow condition before RTC158106 - // gets implemented (i.e., inserting VPD rings in EC order), - // we would manually have to scale back on the requested - // cores in the initialled supplied io_bootCoreMask arg to - // xip_customize. - FAPI_ASSERT( false, - fapi2::XIPC_IMAGE_WOULD_OVERFLOW(). - set_CHIP_TARGET(i_proc_target). - set_CURRENT_RING_SECTION_SIZE(io_ringSectionSize). - set_SIZE_OF_THIS_RING(l_sizeOfThisRing). - set_MAX_RING_SECTION_SIZE(i_maxRingSectionSize). - set_RING_ID(i_ring.ringId). - set_CHIPLET_ID(l_chipletId). - set_CURRENT_BOOT_CORE_MASK(io_bootCoreMask), - "Ran out of image buffer space trying to append a ring" - " to the .rings section" ); - } + for (i = 0; i < l_vpdRingSize; i++) + { + *(((uint8_t*)i_vpdRing) + l_vpdRingSize - 1 + sizeof(P9_TOR::RingLayout_t) - i) = + *(((uint8_t*)i_vpdRing) + l_vpdRingSize - 1 - i); + } - //------------------------------------------ - // Now, append the ring to the ring section - //------------------------------------------ - switch (i_sysPhase) - { + uint32_t l_sizeOfThisRing = l_vpdRingSize + sizeof(P9_TOR::RingLayout_t); + ((P9_TOR::RingLayout_t*)i_vpdRing)->sizeOfThis = htobe32(l_sizeOfThisRing); + ((P9_TOR::RingLayout_t*)i_vpdRing)->sizeOfCmsk = 0; + ((P9_TOR::RingLayout_t*)i_vpdRing)->sizeOfMeta = 0; - case SYSPHASE_HB_SBE: - for (iRingsPerChipletId = 0; iRingsPerChipletId < l_ringsPerChipletId; iRingsPerChipletId++) - { + // Checking for potential image overflow BEFORE appending the ring. + if ( (io_ringSectionSize + l_sizeOfThisRing) > i_maxRingSectionSize ) + { + //@TODO: We can't update bootCoreMask until RTC158106. So for now + // we're simply returning the requested bootCoreMask. Thus, + // should there be an overflow condition before RTC158106 + // gets implemented (i.e., inserting VPD rings in EC order), + // we would manually have to scale back on the requested + // cores in the initialled supplied io_bootCoreMask arg to + // xip_customize. + FAPI_ASSERT( false, + fapi2::XIPC_IMAGE_WOULD_OVERFLOW(). + set_CHIP_TARGET(i_proc_target). + set_CURRENT_RING_SECTION_SIZE(io_ringSectionSize). + set_SIZE_OF_THIS_RING(l_sizeOfThisRing). + set_MAX_RING_SECTION_SIZE(i_maxRingSectionSize). + set_RING_ID(i_ring.ringId). + set_CHIPLET_ID(l_chipletId). + set_CURRENT_BOOT_CORE_MASK(io_bootCoreMask), + "Ran out of image buffer space trying to append a ring" + " to the .rings section" ); + } + + //------------------------------------------ + // Now, append the ring to the ring section + //------------------------------------------ + + // Calculate the chiplet TOR index + uint8_t l_chipletTorId = l_chipletId + + (l_chipletId - i_ring.instanceIdMin ) * (l_ringsPerChipletId - 1) + + l_evenOdd; + + switch (i_sysPhase) + { + + case SYSPHASE_HB_SBE: l_rc = tor_append_ring( i_ringSection, io_ringSectionSize, // In: Exact size. Out: Updated size. @@ -460,13 +479,13 @@ fapi2::ReturnCode _fetch_and_insert_vpd_rings( P9_TOR::SBE, // We're working on the SBE image P9_TOR::ALLRING, // No-care BASE, // All VPD rings are Base ringVariant - l_chipletId, // Chiplet instance ID + l_chipletTorId, // Chiplet instance TOR Index i_vpdRing ); // The VPD RS4 ring container if (l_rc == IMGBUILD_TGR_TOR_PUT_RING_DONE) { - FAPI_INF("Successfully added VPD ring: (ringId,chipletId)=(0x%02X,0x%02X)", - i_ring.ringId, l_chipletId); + FAPI_INF("Successfully added VPD ring: (ringId,evenOdd,chipletId)=(0x%02X,0x%X,0x%02X)", + i_ring.ringId, l_evenOdd, l_chipletId); } else { @@ -477,13 +496,10 @@ fapi2::ReturnCode _fetch_and_insert_vpd_rings( "tor_append_ring() failed w/l_rc=%d", l_rc ); } - } - break; + break; - case SYSPHASE_RT_CME: - for (iRingsPerChipletId = 0; iRingsPerChipletId < l_ringsPerChipletId; iRingsPerChipletId++) - { + case SYSPHASE_RT_CME: l_rc = tor_append_ring( i_ringSection, io_ringSectionSize, // In: Exact size. Out: Updated size. @@ -493,13 +509,13 @@ fapi2::ReturnCode _fetch_and_insert_vpd_rings( P9_TOR::CME, // We're working on the SBE image P9_TOR::ALLRING, // No-care BASE, // All VPD rings are Base ringVariant - l_chipletId, // Chiplet instance ID + l_chipletTorId, // Chiplet instance ID i_vpdRing ); // The VPD RS4 ring container if (l_rc == IMGBUILD_TGR_TOR_PUT_RING_DONE) { - FAPI_INF("Successfully added VPD ring: (ringId,chipletId)=(0x%02X,0x%02X)", - i_ring.ringId, l_chipletId); + FAPI_INF("Successfully added VPD ring: (ringId,evenOdd,chipletId)=(0x%02X,0x%X,0x%02X)", + i_ring.ringId, l_evenOdd, l_chipletId); } else { @@ -512,13 +528,10 @@ fapi2::ReturnCode _fetch_and_insert_vpd_rings( } FAPI_DBG("(After tor_append) io_ringSectionSize = %d", io_ringSectionSize); - } - break; + break; - case SYSPHASE_RT_SGPE: - for (iRingsPerChipletId = 0; iRingsPerChipletId < l_ringsPerChipletId; iRingsPerChipletId++) - { + case SYSPHASE_RT_SGPE: l_rc = tor_append_ring( i_ringSection, io_ringSectionSize, // In: Exact size. Out: Updated size. @@ -528,13 +541,13 @@ fapi2::ReturnCode _fetch_and_insert_vpd_rings( P9_TOR::SGPE, // We're working on the SGPE image P9_TOR::ALLRING, // No-care BASE, // All VPD rings are Base ringVariant - l_chipletId, // Chiplet instance ID + l_chipletTorId, // Chiplet instance ID i_vpdRing ); // The VPD RS4 ring container if (l_rc == IMGBUILD_TGR_TOR_PUT_RING_DONE) { - FAPI_INF("Successfully added VPD ring: (ringId,chipletId)=(0x%02X,0x%02X)", - i_ring.ringId, l_chipletId); + FAPI_INF("Successfully added VPD ring: (ringId,evenOdd,chipletId)=(0x%02X,0x%X,0x%02X)", + i_ring.ringId, l_evenOdd, l_chipletId); } else { @@ -547,77 +560,78 @@ fapi2::ReturnCode _fetch_and_insert_vpd_rings( } FAPI_DBG("(After tor_append) io_ringSectionSize = %d", io_ringSectionSize); - } - break; + break; - default: - FAPI_ASSERT( false, - fapi2::XIPC_INVALID_SYSPHASE_PARM(). - set_CHIP_TARGET(i_proc_target). - set_SYSPHASE(i_sysPhase). - set_OCCURRENCE(2), - "Code bug: Unsupported value of sysPhase (=%d)", - i_sysPhase ); - break; - } // End switch(sysPhase) + default: + FAPI_ASSERT( false, + fapi2::XIPC_INVALID_SYSPHASE_PARM(). + set_CHIP_TARGET(i_proc_target). + set_SYSPHASE(i_sysPhase). + set_OCCURRENCE(2), + "Code bug: Unsupported value of sysPhase (=%d)", + i_sysPhase ); + break; + } // End switch(sysPhase) - } // End if(redundant) - - } - else if (l_fapiRc.isRC(RC_MVPD_RING_NOT_FOUND)) - { + } // End if(redundant) - // No match, do nothing. Next chipletId. - //@TODO: Uncomment the following after PowerOn. Also, need to come - // to agreement whether this should be fatal error or not. - // For now, for PO, it's considered benigh and noise and is - // being commented out. - //FAPI_INF("_fetch_and_insert_vpd_rings():" - // "(ringId,chipletId)=(0x%X,0x%X) not found.", - // i_ring.ringId, l_chipletId); + } + else if (l_fapiRc.isRC(RC_MVPD_RING_NOT_FOUND)) + { - fapi2::current_err = fapi2::FAPI2_RC_SUCCESS; + // No match, do nothing. Next chipletId. + //@TODO: Uncomment the following after PowerOn. Also, need to come + // to agreement whether this should be fatal error or not. + // For now, for PO, it's considered benigh and noise and is + // being commented out. + //FAPI_INF("_fetch_and_insert_vpd_rings():" + // "(ringId,chipletId)=(0x%X,0x%X) not found.", + // i_ring.ringId, l_chipletId); - } - else - { - //-------------------------- - // Handle other error cases - //-------------------------- - - // getMvpdRing failed due to insufficient ring buffer space. - // Assumption here is that getMvpdRing returns required buffer size - // in l_vpdRingSize (and which it does!). - FAPI_ASSERT( !l_fapiRc.isRC(RC_MVPD_RING_BUFFER_TOO_SMALL), - fapi2::XIPC_MVPD_RING_SIZE_TOO_BIG(). - set_CHIP_TARGET(i_proc_target). - set_RING_ID(i_ring.ringId). - set_CHIPLET_ID(l_chipletId). - set_RING_BUFFER_SIZE(i_vpdRingSize). - set_MVPD_RING_SIZE(l_vpdRingSize), - "_fetch_and_insert_vpd_rings(): VPD ring size (=0x%X) exceeds" - " allowed ring buffer size (=0x%X)", - l_vpdRingSize, i_vpdRingSize ); - - // getMvpdRing failed due to invalid record data magic word. - FAPI_ASSERT( !l_fapiRc.isRC(RC_MVPD_INVALID_RS4_HEADER), - fapi2::XIPC_MVPD_INVALID_RECORD_DATA(). - set_CHIP_TARGET(i_proc_target). - set_RING_ID(i_ring.ringId). - set_CHIPLET_ID(l_chipletId), - "_fetch_and_insert_vpd_rings(): MVPD has invalid record data" ); + fapi2::current_err = fapi2::FAPI2_RC_SUCCESS; - // getMvpdRing failed for some other reason aside from above handled cases. - if (l_fapiRc != fapi2::FAPI2_RC_SUCCESS) - { - FAPI_ERR("_fetch_and_insert_vpd_rings(): getMvpdRing failed " - " w/rc=0x%08X", (uint64_t)l_fapiRc); - fapi2::current_err = l_fapiRc; - goto fapi_try_exit; } + else + { + //-------------------------- + // Handle other error cases + //-------------------------- + + // getMvpdRing failed due to insufficient ring buffer space. + // Assumption here is that getMvpdRing returns required buffer size + // in l_vpdRingSize (and which it does!). + FAPI_ASSERT( !l_fapiRc.isRC(RC_MVPD_RING_BUFFER_TOO_SMALL), + fapi2::XIPC_MVPD_RING_SIZE_TOO_BIG(). + set_CHIP_TARGET(i_proc_target). + set_RING_ID(i_ring.ringId). + set_CHIPLET_ID(l_chipletId). + set_RING_BUFFER_SIZE(i_vpdRingSize). + set_MVPD_RING_SIZE(l_vpdRingSize), + "_fetch_and_insert_vpd_rings(): VPD ring size (=0x%X) exceeds" + " allowed ring buffer size (=0x%X)", + l_vpdRingSize, i_vpdRingSize ); + + // getMvpdRing failed due to invalid record data magic word. + FAPI_ASSERT( !l_fapiRc.isRC(RC_MVPD_INVALID_RS4_HEADER), + fapi2::XIPC_MVPD_INVALID_RECORD_DATA(). + set_CHIP_TARGET(i_proc_target). + set_RING_ID(i_ring.ringId). + set_CHIPLET_ID(l_chipletId), + "_fetch_and_insert_vpd_rings(): MVPD has invalid record data" ); + + // getMvpdRing failed for some other reason aside from above handled cases. + if (l_fapiRc != fapi2::FAPI2_RC_SUCCESS) + { + FAPI_ERR("_fetch_and_insert_vpd_rings(): getMvpdRing failed " + " w/rc=0x%08X", (uint64_t)l_fapiRc); + fapi2::current_err = l_fapiRc; + goto fapi_try_exit; + } + + } // End if(bSkipRing) - } // End if(bSkipRing) + } // Loop on evenOdd } //Loop on chipletId |