summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/pm
diff options
context:
space:
mode:
authorPrem Shanker Jha <premjha2@in.ibm.com>2019-03-28 04:40:12 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2019-05-08 14:55:40 -0500
commit58df73fd107419526422d2075e5085253a5202d2 (patch)
treec2901f959914684411ab59d295fbfa72521dc1d2 /src/import/chips/p9/procedures/hwp/pm
parentc5e2251b0c17916310b54cbf96540ffca1f4b1f7 (diff)
downloadtalos-hostboot-58df73fd107419526422d2075e5085253a5202d2.tar.gz
talos-hostboot-58df73fd107419526422d2075e5085253a5202d2.zip
VDM(Part 3): Image build changes for quad level VDM
Commit accomplishes following: - enables CME booting using new CPMR layout - copies new definition of poundw to LPSPB - enables quad level LPSPB - implements new CPMR layout that supports customized LPSPB. - for old VPD version, retains old CPMR layout Change-Id: I66a13579e0edbc046226db259a736416e1e5c268 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/75272 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Tested-by: PPE CI <ppe-ci+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: RANGANATHPRASAD G. BRAHMASAMUDRA <prasadbgr@in.ibm.com> Reviewed-by: Gregory S. Still <stillgs@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/75278 Reviewed-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Tested-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/pm')
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C304
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.C40
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.H4
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket_attr.C8
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket_attr.H18
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C696
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H83
7 files changed, 717 insertions, 436 deletions
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C b/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C
index 347bd3545..50c752f5d 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C
@@ -97,10 +97,10 @@ extern "C"
*/
#define ROUND_OFF_32B( ROUND_SIZE) \
{ \
- uint32_t tempSize = ROUND_SIZE; \
- if( tempSize ) \
+ uint32_t temp = ROUND_SIZE; \
+ if( temp ) \
{ \
- ROUND_SIZE = (( ( tempSize + 31 )/32 ) * 32 ); \
+ ROUND_SIZE = (( ( temp + 31 )/32 ) * 32 ); \
} \
}
namespace p9_hcodeImageBuild
@@ -146,6 +146,7 @@ enum
SMF_BIT_CHECK = 0x0001000000000000ull,
INST_VALUE_SC2 = 0x44000042,
SRESET_WORD_POS = 0x40,
+ CPMR_VDM_PER_QUAD = 0x43504d525f322e30ull, //supports VDM per quad
};
/**
@@ -894,6 +895,8 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
uint16_t qmFlags = 0;
const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+ cpmrHeader_t* pCpmrHdr =
+ (cpmrHeader_t*) & (i_pChipHomer->cpmrRegion.selfRestoreRegion.CPMR_SR.elements.CPMRHeader);
cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE];
sgpeHeader_t* pSgpeHdr = (sgpeHeader_t*)& i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE];
PgpeHeader_t* pPgpeHdr = (PgpeHeader_t*)& i_pChipHomer->ppmrRegion.pgpeSramImage[PGPE_INT_VECTOR_SIZE];
@@ -1295,7 +1298,12 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
FAPI_DBG("WOF Enabled : %s", attrVal ? "TRUE" : "FALSE" );
+ if( SWIZZLE_8_BYTE(pCpmrHdr->magic_number) >= CPMR_VDM_PER_QUAD )
+ {
+ qmFlags |= CME_QM_FLAG_PER_QUAD_VDM_ENABLE;
+ }
+ FAPI_DBG("Quad VDM Enable : Yes" );
// Updating flag fields in the headers
pCmeHdr->g_cme_mode_flags = SWIZZLE_4_BYTE(cmeFlag);
@@ -1304,7 +1312,7 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
pPgpeHdr->g_pgpe_flags = SWIZZLE_2_BYTE(pgpeFlag);
FAPI_INF("CME Flag Value : 0x%08x", SWIZZLE_4_BYTE(pCmeHdr->g_cme_mode_flags));
- FAPI_INF("CME QM Flag Value : 0x%08x", SWIZZLE_2_BYTE(pCmeHdr->g_cme_qm_mode_flags));
+ FAPI_INF("CME QM Flag Value : 0x%04x", SWIZZLE_2_BYTE(pCmeHdr->g_cme_qm_mode_flags));
FAPI_INF("SGPE Flag Value : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_reserve_flags));
FAPI_INF("SGPE Chtm Config : 0x%016llx", SWIZZLE_8_BYTE(pSgpeHdr->g_sgpe_chtm_mem_cfg));
FAPI_INF("PGPE Flag Value : 0x%08x", SWIZZLE_2_BYTE(pPgpeHdr->g_pgpe_flags));
@@ -1321,12 +1329,18 @@ fapi_try_exit:
* @brief updates various CPMR fields which are associated with scan rings.
* @param[in] i_pChipHomer points to start of P9 HOMER.
*/
-void updateCpmrCmeRegion( Homerlayout_t* i_pChipHomer )
+fapi2::ReturnCode updateCpmrCmeRegion( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PROC& i_procTgt )
{
FAPI_INF(">> updateCpmrCmeRegion");
- cpmrHeader_t* pCpmrHdr =
+ cpmrHeader_t* pCpmrHdr =
(cpmrHeader_t*) & (i_pChipHomer->cpmrRegion.selfRestoreRegion.CPMR_SR.elements.CPMRHeader);
- cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE];
+ cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE];
+ uint32_t l_pstateSize = sizeof(LocalPstateParmBlock);
+ ROUND_OFF_32B(l_pstateSize);
+ uint8_t l_cmePos = 0;
+ auto cmeList = i_procTgt.getChildren<fapi2::TARGET_TYPE_EX>(fapi2::TARGET_STATE_FUNCTIONAL);
+ uint32_t l_cmeCustSize = SWIZZLE_4_BYTE(pCmeHdr->g_cme_custom_length);
+ uint64_t l_cpmrMagic = SWIZZLE_8_BYTE(pCpmrHdr->magic_number);
//Updating CPMR Header using info from CME Header
pCpmrHdr->cmeImgOffset = SWIZZLE_4_BYTE((CME_IMAGE_CPMR_OFFSET >> CME_BLK_SIZE_SHIFT));
@@ -1338,6 +1352,7 @@ void updateCpmrCmeRegion( Homerlayout_t* i_pChipHomer )
pCpmrHdr->coreScomLength = SWIZZLE_4_BYTE(CORE_SCOM_RESTORE_SIZE_TOTAL);
pCpmrHdr->coreMaxScomEntry = SWIZZLE_4_BYTE(MAX_CORE_SCOM_ENTRIES);
+
if( pCmeHdr->g_cme_common_ring_length )
{
pCpmrHdr->cmeCommonRingOffset = CME_IMAGE_CPMR_OFFSET + SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset);
@@ -1356,21 +1371,54 @@ void updateCpmrCmeRegion( Homerlayout_t* i_pChipHomer )
pCpmrHdr->coreSpecRingLength = pCmeHdr->g_cme_max_spec_ring_length; // already swizzled
}
+ FAPI_INF( "Custom Len 0x%08x", l_cmeCustSize );
+ for( auto cme : cmeList )
+ {
+ uint32_t *pPstateOffset = (uint32_t *)&pCpmrHdr->quad0PstateOffset;
+ FAPI_TRY(FAPI_ATTR_GET( fapi2::ATTR_CHIP_UNIT_POS, cme, l_cmePos),
+ "fapiGetAttribute of ATTR_CHIP_UNIT_POS");
+
+ //Populating CPMR fields for CME PState field
+
+ pPstateOffset = pPstateOffset + (l_cmePos >> 1);
+
+ if( l_cpmrMagic >= CPMR_VDM_PER_QUAD )
+ {
+ *pPstateOffset = SWIZZLE_4_BYTE(pCpmrHdr->coreSpecRingOffset) +
+ SWIZZLE_4_BYTE(pCpmrHdr->coreSpecRingLength) + ( (l_cmePos) * l_cmeCustSize );
+ *pPstateOffset = SWIZZLE_4_BYTE(*pPstateOffset);
+ }
+ else
+ {
+ *pPstateOffset = 0; //ensures compatibility with quad common LPSPB
+ }
+ }
+
//Updating CME Image header
- pCmeHdr->g_cme_scom_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_length) +
- SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length) +
- SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length);
- pCmeHdr->g_cme_scom_offset =
- ((pCmeHdr->g_cme_scom_offset + CME_BLOCK_READ_LEN - 1 ) >> CME_BLK_SIZE_SHIFT);
+ if( l_cpmrMagic >= CPMR_VDM_PER_QUAD )
+ {
+ pCmeHdr->g_cme_scom_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_offset) +
+ (l_pstateSize >> CME_BLK_SIZE_SHIFT);
+ }
+ else //ensures compatibility with quad common LPSPB
+ {
+ pCmeHdr->g_cme_scom_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_length) +
+ SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length) +
+ SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length);
+ pCmeHdr->g_cme_scom_offset =
+ ((pCmeHdr->g_cme_scom_offset + CME_BLOCK_READ_LEN - 1 ) >> CME_BLK_SIZE_SHIFT);
+ //Adding to it instance ring length which is already a multiple of 32B
+ pCmeHdr->g_cme_scom_offset += SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length);
+ }
+
+ pCmeHdr->g_cme_scom_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_offset);
//Adding to it instance ring length which is already a multiple of 32B
- pCmeHdr->g_cme_scom_offset += SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length);
- pCmeHdr->g_cme_scom_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_offset);
- pCmeHdr->g_cme_scom_length = SWIZZLE_4_BYTE(CORE_SCOM_RESTORE_SIZE_PER_CME);
+ pCmeHdr->g_cme_scom_length = SWIZZLE_4_BYTE(CORE_SCOM_RESTORE_SIZE_PER_CME);
// Timebase frequency
uint32_t l_ppe_timebase_hz;
calcPPETimebase(&l_ppe_timebase_hz);
- pCmeHdr->g_cme_timebase_hz = SWIZZLE_4_BYTE(l_ppe_timebase_hz);
+ pCmeHdr->g_cme_timebase_hz = SWIZZLE_4_BYTE(l_ppe_timebase_hz);
FAPI_INF("========================= CME Header Start ==================================");
FAPI_INF(" HC Offset : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_offset));
@@ -1382,6 +1430,7 @@ void updateCpmrCmeRegion( Homerlayout_t* i_pChipHomer )
FAPI_INF(" CR Size : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length));
FAPI_INF(" CSR Offset : 0x%08X (Real offset / 32) ", SWIZZLE_4_BYTE(pCmeHdr->g_cme_core_spec_ring_offset));
FAPI_INF(" CSR Length : 0x%08X (Real length / 32)", SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length) );
+ FAPI_INF(" CME PS Offset : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_offset));
FAPI_INF(" SCOM Offset : 0x%08X (Real offset / 32)", SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_offset));
FAPI_INF(" SCOM Area Len : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_length));
FAPI_INF(" CPMR Phy Add : 0x%016lx", SWIZZLE_8_BYTE(pCmeHdr->g_cme_cpmr_PhyAddr));
@@ -1391,6 +1440,7 @@ void updateCpmrCmeRegion( Homerlayout_t* i_pChipHomer )
FAPI_INF("========================= CME Header End ==================================");
FAPI_INF("==========================CPMR Header===========================================");
+ FAPI_INF(" CPMR Ver : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cpmrVersion));
FAPI_INF(" CME HC Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeImgOffset));
FAPI_INF(" CME HC Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeImgLength));
FAPI_INF(" PS Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmePstateOffset));
@@ -1402,9 +1452,18 @@ void updateCpmrCmeRegion( Homerlayout_t* i_pChipHomer )
FAPI_INF(" Core SCOM Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->coreScomOffset));
FAPI_INF(" Core SCOM Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->coreScomLength ));
FAPI_INF(" Max SCOM Entries : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->coreMaxScomEntry));
+ FAPI_INF(" Quad0 P-State : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->quad0PstateOffset));
+ FAPI_INF(" Quad1 P-State : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->quad1PstateOffset));
+ FAPI_INF(" Quad2 P-State : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->quad2PstateOffset));
+ FAPI_INF(" Quad3 P-State : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->quad3PstateOffset));
+ FAPI_INF(" Quad4 P-State : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->quad4PstateOffset));
+ FAPI_INF(" Quad5 P-State : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->quad5PstateOffset));
+
FAPI_INF("==================================CPMR Ends=====================================");
FAPI_INF("<< updateCpmrCmeRegion");
+fapi_try_exit:
+ return fapi2::current_err;
}
//------------------------------------------------------------------------------
@@ -1839,6 +1898,7 @@ fapi2::ReturnCode buildCoreRestoreImage( void* const i_pImageIn,
FAPI_TRY( initSmfDisabledSelfRestore( i_pChipHomer ),
"Failed To Initialize Self-Restore Region In Non SMF Mode" );
}
+
}
updateCpmrHeaderSR( i_pChipHomer, i_fusedState, i_procFuncModel.isSmfEnabled(), l_pSmfSignature );
@@ -1915,14 +1975,18 @@ fapi2::ReturnCode buildCmeImage( void* const i_pImageIn, Homerlayout_t* i_pChipH
// Names have g_ prefix as these global variables for CME Hcode
// Note: Only the *memory* addresses are updated
cmeHeader_t* pImgHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE];
- pImgHdr->g_cme_hcode_offset = CME_SRAM_HCODE_OFFSET;
- pImgHdr->g_cme_hcode_length = ppeSection.iv_size;
+ pImgHdr->g_cme_hcode_offset = CME_SRAM_HCODE_OFFSET;
+ pImgHdr->g_cme_hcode_length = ppeSection.iv_size;
//Populating common ring offset here. So, that other scan ring related field can be updated.
- pImgHdr->g_cme_cpmr_PhyAddr = (i_cpmrPhyAdd | CPMR_HOMER_OFFSET);
- pImgHdr->g_cme_pstate_region_offset = pImgHdr->g_cme_hcode_offset + pImgHdr->g_cme_hcode_length;
pImgHdr->g_cme_pstate_region_length = 0;
- pImgHdr->g_cme_common_ring_offset = pImgHdr->g_cme_pstate_region_offset + pImgHdr->g_cme_pstate_region_length;
+ pImgHdr->g_cme_pstate_region_offset = 0;
+ pImgHdr->g_cme_cpmr_PhyAddr = (i_cpmrPhyAdd | CPMR_HOMER_OFFSET);
+
+
+ pImgHdr->g_cme_common_ring_offset = pImgHdr->g_cme_hcode_offset +
+ pImgHdr->g_cme_hcode_length;
+
pImgHdr->g_cme_common_ring_length = 0;
pImgHdr->g_cme_scom_offset = 0;
pImgHdr->g_cme_scom_length = CORE_SCOM_RESTORE_SIZE_PER_CME;
@@ -1931,7 +1995,6 @@ fapi2::ReturnCode buildCmeImage( void* const i_pImageIn, Homerlayout_t* i_pChipH
//Let us handle the endianess at the end
pImgHdr->g_cme_pstate_region_offset = SWIZZLE_4_BYTE(pImgHdr->g_cme_pstate_region_offset);
- pImgHdr->g_cme_common_ring_offset = SWIZZLE_4_BYTE(pImgHdr->g_cme_common_ring_offset);
pImgHdr->g_cme_hcode_offset = SWIZZLE_4_BYTE(pImgHdr->g_cme_hcode_offset);
pImgHdr->g_cme_hcode_length = SWIZZLE_4_BYTE(pImgHdr->g_cme_hcode_length);
pImgHdr->g_cme_scom_length = SWIZZLE_4_BYTE(pImgHdr->g_cme_scom_length);
@@ -2526,6 +2589,46 @@ fapi_try_exit:
//---------------------------------------------------------------------------
+fapi2::ReturnCode buildCmePstateInfo( Homerlayout_t * i_pHomer, CONST_FAPI2_PROC& i_procTgt,
+ ImageType_t i_imgType, PstateSuperStructure * i_pSuperStruct )
+{
+ FAPI_DBG(">> buildCmePstateInfo");
+ uint8_t l_cmePos = 0;
+ cmeHeader_t* pCmeHdr = (cmeHeader_t*) &i_pHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE];
+ auto cmeList = i_procTgt.getChildren<fapi2::TARGET_TYPE_EX>(fapi2::TARGET_STATE_FUNCTIONAL);
+ uint8_t * l_pCmePstate = NULL;
+ uint32_t l_pstateSize = sizeof(LocalPstateParmBlock);
+ ROUND_OFF_32B(l_pstateSize);
+ uint32_t l_ringSize = (SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length) << CME_BLK_SIZE_SHIFT );
+ uint32_t l_cmeCustSize = l_ringSize + l_pstateSize;
+
+ uint32_t l_cmeCurIndex = ( SWIZZLE_4_BYTE(pCmeHdr->g_cme_core_spec_ring_offset) << CME_BLK_SIZE_SHIFT );
+ l_cmeCurIndex += l_ringSize;
+
+ for( auto cme : cmeList )
+ {
+ FAPI_TRY(FAPI_ATTR_GET( fapi2::ATTR_CHIP_UNIT_POS, cme, l_cmePos),
+ "fapiGetAttribute of ATTR_CHIP_UNIT_POS");
+ //copying CME specific LPSPB info into HOMER
+ l_pCmePstate =
+ (uint8_t *) &i_pHomer->cpmrRegion.cmeSramRegion[ (l_cmeCustSize * l_cmePos ) + l_cmeCurIndex ];
+ memcpy( l_pCmePstate, &i_pSuperStruct->localppb[(l_cmePos >> 1)], sizeof(LocalPstateParmBlock) );
+
+ //Populating CPMR fields for CME PState field
+ }
+
+ pCmeHdr->g_cme_pstate_offset = ( l_cmeCurIndex >> CME_BLK_SIZE_SHIFT );
+ pCmeHdr->g_cme_pstate_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_offset);
+ pCmeHdr->g_cme_custom_length = SWIZZLE_4_BYTE(l_cmeCustSize >> CME_BLK_SIZE_SHIFT);
+
+ FAPI_INF( "CME PS Offset 0x%08x x32= 0x%08x", SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_offset), l_cmeCurIndex );
+
+fapi_try_exit:
+ FAPI_DBG("<< buildCmePstateInfo");
+ return fapi2::current_err;
+}
+//---------------------------------------------------------------------------
+
/**
* @brief updates the PState parameter block info in CPMR and PPMR region
* @param[in] i_pHomer points to start of of chip's HOMER
@@ -2542,32 +2645,31 @@ fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i
{
FAPI_INF(">> buildParameterBlock");
- fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ PstateSuperStructure stateSupStruct;
+
+ FAPI_IMP("Size of sup-struct 0x%08x", sizeof(PstateSuperStructure));
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ uint32_t pgpeRunningOffset = 0;
+ uint32_t sizePStateBlock = 0;
+ uint32_t wofTableSize = i_sizeBuf1;
+ uint32_t localPStateBlock = 0;
+ uint32_t sizeAligned = 0;
+ fapi2::ReturnCode retCode;
if( i_imgType.pgpePstateParmBlockBuild )
{
-
- fapi2::ReturnCode retCode;
Homerlayout_t* pHomerLayout = (Homerlayout_t*)i_pHomer;
PPMRLayout_t* pPpmr = (PPMRLayout_t*) &pHomerLayout->ppmrRegion;
cmeHeader_t* pCmeHdr = (cmeHeader_t*) &pHomerLayout->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE];
+ cpmrHeader_t* pCpmrHdr =
+ (cpmrHeader_t*) & (pHomerLayout->cpmrRegion.selfRestoreRegion.CPMR_SR.elements.CPMRHeader);
+ uint32_t localPspbStartIndex = SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_length);
+
fapi2::ATTR_WOF_ENABLED_Type l_wof_enabled;
uint32_t ppmrRunningOffset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_offset) +
SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_length);
- FAPI_DBG("Hcode ppmrRunningOffset 0x%08x", ppmrRunningOffset );
-
- uint32_t pgpeRunningOffset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_length);
-
- FAPI_DBG(" PGPE Hcode End 0x%08x", pgpeRunningOffset );
-
- uint32_t sizeAligned = 0;
- uint32_t sizePStateBlock = 0;
- uint32_t wofTableSize = i_sizeBuf1;
-
- // Allocate struct onto stack
- PstateSuperStructure stateSupStruct;
// Clearing i_pBuf1
memset(i_pBuf1,0x00,i_sizeBuf1);
@@ -2580,39 +2682,45 @@ fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i
//Check if WOF Table is copied properly even if WOF is disabled.
//As this is memory range check, we don't want memory corruption
//issues to go unnoticed as this should not EVER happen.
+
FAPI_ASSERT( ( wofTableSize <= OCC_WOF_TABLES_SIZE ),
fapi2::PARAM_WOF_TABLE_SIZE_ERR()
.set_ACTUAL_WOF_TABLE_SIZE(wofTableSize)
.set_MAX_SIZE_ALLOCATED(OCC_WOF_TABLES_SIZE),
"Size of WOF Table Exceeds Max Size Allowed" );
-
//-------------------------- Local P-State Parameter Block ------------------------------
- uint32_t localPspbStartIndex = SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_length);
- uint8_t* pLocalPState = &pHomerLayout->cpmrRegion.cmeSramRegion[localPspbStartIndex];
-
- sizePStateBlock = sizeof(LocalPstateParmBlock);
-
- //Note: Not checking size here. Once entire CME Image layout is complete, there is a
- //size check at last. WE are safe as long as everthing put together doesn't exceed
- //maximum SRAM image size allowed(32KB). No need to check size of Local P-State
- //parameter block individually.
-
- FAPI_DBG("Copying Local P-State Parameter Block into CPMR" );
- memcpy( pLocalPState, &(stateSupStruct.localppb), sizePStateBlock );
-
- ALIGN_DBWORD( sizeAligned, sizePStateBlock )
- uint32_t localPStateBlock = sizeAligned;
- FAPI_DBG("LPSPB Actual size 0x%08x After Alignment 0x%08x", sizePStateBlock, sizeAligned );
-
- pCmeHdr->g_cme_pstate_region_length = localPStateBlock;
- pCmeHdr->g_cme_common_ring_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset) + localPStateBlock;
+ FAPI_INF( "Magic Word 0x%016lx Copy Start Index 0x%08x", SWIZZLE_8_BYTE(pCpmrHdr->magic_number), localPspbStartIndex );
+ if( SWIZZLE_8_BYTE(pCpmrHdr->magic_number) >= CPMR_VDM_PER_QUAD )
+ {
+ FAPI_TRY( buildCmePstateInfo( pHomerLayout, i_procTgt, i_imgType, &stateSupStruct ),
+ "Failed to copy quad P-State info in CME SRAM image region" );
+ }
+ else
+ {
+ uint8_t* pLocalPState = &pHomerLayout->cpmrRegion.cmeSramRegion[localPspbStartIndex];
+ sizePStateBlock = sizeof(LocalPstateParmBlock);
+ //Note: Not checking size here. Once entire CME Image layout is complete, there is a
+ //size check at last. WE are safe as long as everthing put together doesn't exceed
+ //maximum SRAM image size allowed(32KB). No need to check size of Local P-State
+ //parameter block individually.
+
+ FAPI_DBG("Copying Local P-State Parameter Block into CPMR" );
+ memcpy( pLocalPState, &(stateSupStruct.localppb), sizePStateBlock );
+ ALIGN_DBWORD( sizeAligned, sizePStateBlock )
+ localPStateBlock = sizeAligned;
+ FAPI_DBG("LPSPB Actual size 0x%08x After Alignment 0x%08x", sizePStateBlock, sizeAligned );
+ pCmeHdr->g_cme_pstate_region_length = localPStateBlock;
+ pCmeHdr->g_cme_pstate_region_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_offset) +
+ SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_length);
+ pCmeHdr->g_cme_common_ring_offset = pCmeHdr->g_cme_pstate_region_offset + localPStateBlock;
+ }
//-------------------------- Local P-State Parameter Block Ends --------------------------
//-------------------------- Global P-State Parameter Block ------------------------------
- FAPI_DBG("Copying Global P-State Parameter Block" );
+ pgpeRunningOffset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_length);
sizePStateBlock = sizeof(GlobalPstateParmBlock);
FAPI_ASSERT( ( sizePStateBlock <= PGPE_GLOBAL_PSTATE_PARAM_BLOCK_SIZE),
@@ -2622,7 +2730,7 @@ fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i
.set_ACTUAL_SIZE( sizePStateBlock ),
"Size of Global Parameter Block Exceeds Max Size Allowed" );
- FAPI_DBG("GPPBB pgpeRunningOffset 0x%08x", pgpeRunningOffset );
+ FAPI_DBG("Copying Global P-State Parameter Block" );
memcpy( &pPpmr->pgpeSramImage[pgpeRunningOffset],
&(stateSupStruct.globalppb), sizePStateBlock );
@@ -2666,10 +2774,18 @@ fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i
sizePStateBlock );
//-------------------------- OCC P-State Parameter Block Ends ------------------------------
+ //Not relevant any longer. Kept for legacy reason. Now we have field per quad.
- io_ppmrHdr.g_ppmr_lppb_offset = CPMR_HOMER_OFFSET + CME_IMAGE_CPMR_OFFSET + localPspbStartIndex;
- io_ppmrHdr.g_ppmr_lppb_length = localPStateBlock;
-
+ if( SWIZZLE_8_BYTE(pCpmrHdr->magic_number) >= CPMR_VDM_PER_QUAD )
+ {
+ io_ppmrHdr.g_ppmr_lppb_offset = 0;
+ io_ppmrHdr.g_ppmr_lppb_length = 0;
+ }
+ else
+ {
+ io_ppmrHdr.g_ppmr_lppb_offset = CPMR_HOMER_OFFSET + CME_IMAGE_CPMR_OFFSET + localPspbStartIndex;
+ io_ppmrHdr.g_ppmr_lppb_length = localPStateBlock;
+ }
//------------------------------ OCC P-State Table Allocation ------------------------------
// The PPMR offset is from the begining --- which is the ppmrHeader
@@ -2683,6 +2799,7 @@ fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i
io_ppmrHdr.g_ppmr_wof_table_length = OCC_WOF_TABLES_SIZE;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_WOF_ENABLED, i_procTgt, l_wof_enabled));
+
if (l_wof_enabled)
{
memcpy( &pPpmr->wofTableSize, i_pBuf1, wofTableSize );
@@ -2697,10 +2814,11 @@ fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i
FAPI_DBG("OPPB pgpeRunningOffset 0x%08x io_ppmrHdr.g_ppmr_pgpe_sram_img_size 0x%08x",
pgpeRunningOffset, io_ppmrHdr.g_ppmr_pgpe_sram_img_size );
- //Finally let us handle endianess
+ //let us handle endianess
//CME Header
pCmeHdr->g_cme_pstate_region_length = SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length);
pCmeHdr->g_cme_common_ring_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset);
+ pCmeHdr->g_cme_pstate_region_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset);
//PPMR Header
io_ppmrHdr.g_ppmr_gppb_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_gppb_offset);
@@ -2860,13 +2978,22 @@ fapi2::ReturnCode layoutInstRingsForCme( Homerlayout_t* i_pHomer,
{
FAPI_DBG( ">> layoutInstRingsForCme");
uint32_t rc = IMG_BUILD_SUCCESS;
- fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ cpmrHeader_t* pCpmrHdr =
+ (cpmrHeader_t*) & (i_pHomer->cpmrRegion.selfRestoreRegion.CPMR_SR.elements.CPMRHeader);
// Let us find out ring-pair which is biggest in list of 12 ring pairs
- uint32_t maxCoreSpecRingLength = 0;
- uint32_t ringLength = 0;
- uint32_t tempSize = 0;
- uint32_t tempRepairLength = 0;
- uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == tor_version() ) ? RING_START_TO_RS4_OFFSET : 0;
+ uint32_t maxCoreSpecRingLength = 0;
+ uint32_t ringLength = 0;
+ uint32_t tempSize = 0;
+ uint32_t tempRepairLength = 0;
+ uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == tor_version() ) ? RING_START_TO_RS4_OFFSET : 0;
+ uint32_t cmePstateSize = 0;
+
+ if( SWIZZLE_8_BYTE(pCpmrHdr->magic_number) >= CPMR_VDM_PER_QUAD )
+ {
+ cmePstateSize = sizeof(LocalPstateParmBlock);
+ ROUND_OFF_32B(cmePstateSize);
+ }
if( i_imgType.cmeHcodeBuild )
{
@@ -2926,7 +3053,7 @@ fapi2::ReturnCode layoutInstRingsForCme( Homerlayout_t* i_pHomer,
ROUND_OFF_32B(maxCoreSpecRingLength);
}
- FAPI_DBG("Max Instance Spec Ring 0x%08X", maxCoreSpecRingLength);
+ FAPI_DBG("Max Instance Spec Ring 0x%08X Pstate Size Considered 0x%08x", maxCoreSpecRingLength, cmePstateSize );
// Let us copy the rings now.
uint8_t* pRingStart = NULL;
@@ -2935,7 +3062,8 @@ fapi2::ReturnCode layoutInstRingsForCme( Homerlayout_t* i_pHomer,
for( uint32_t exId = 0; exId < MAX_CMES_PER_CHIP; exId++ )
{
- pRingStart = (uint8_t*)&i_pHomer->cpmrRegion.cmeSramRegion[io_ringLength + ( exId * maxCoreSpecRingLength ) ];
+ pRingStart = (uint8_t*)&i_pHomer->cpmrRegion.cmeSramRegion[io_ringLength +
+ ( exId * ( maxCoreSpecRingLength + cmePstateSize ) ) ];
pRingPayload = pRingStart + sizeof(CoreSpecRingList_t);
pScanRingIndex = (uint16_t*)pRingStart;
@@ -3151,6 +3279,8 @@ fapi2::ReturnCode layoutRingsForCME( Homerlayout_t* i_pHomer,
uint32_t ringLength = 0;
uint32_t tempLength = 0;
RingVariant_t l_ringVariant = RV_BASE;
+ cpmrHeader_t* pCpmrHdr =
+ (cpmrHeader_t*) & (i_pHomer->cpmrRegion.selfRestoreRegion.CPMR_SR.elements.CPMRHeader);
cmeHeader_t* pCmeHdr = (cmeHeader_t*) &i_pHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE];
RingBucket cmeRings( PLAT_CME,
(uint8_t*)&i_pHomer->cpmrRegion,
@@ -3179,10 +3309,16 @@ fapi2::ReturnCode layoutRingsForCME( Homerlayout_t* i_pHomer,
break;
}
- ringLength = SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset) + SWIZZLE_4_BYTE(
- pCmeHdr->g_cme_pstate_region_length);
+ ringLength = SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_offset) + SWIZZLE_4_BYTE(
+ pCmeHdr->g_cme_hcode_length);
+
+ if( SWIZZLE_8_BYTE(pCpmrHdr->magic_number) < CPMR_VDM_PER_QUAD )
+ {
+ ringLength += sizeof(LocalPstateParmBlock);
+ }
+
//save the length where hcode ends
- tempLength = ringLength;
+ tempLength = ringLength;
FAPI_TRY( layoutCmnRingsForCme( i_pHomer, i_chipState, i_ringData,
i_debugMode, l_ringVariant,
@@ -3383,7 +3519,6 @@ fapi2::ReturnCode layoutCmnRingsForSgpe( Homerlayout_t* i_pHomer,
RingBucket& io_sgpeRings )
{
FAPI_INF(">> layoutCmnRingsForSgpe");
-
uint32_t rc = IMG_BUILD_SUCCESS;
uint32_t sgpeHcodeSize = SWIZZLE_4_BYTE(io_qpmrHdr.sgpeImgLength);
uint8_t* pCmnRingPayload = &i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[sgpeHcodeSize +
@@ -3462,7 +3597,7 @@ fapi2::ReturnCode layoutCmnRingsForSgpe( Homerlayout_t* i_pHomer,
.set_RING_ID( torRingId )
.set_EC_LEVEL( i_chipState.getChipLevel() )
.set_CHIP_TYPE( i_chipState.getChipName() ),
- "Failed To Complete Quad Common Ring Layout" );
+ "Failed To Complete Quad Common Ring Layout 0x%08x ring id 0x%08x variant %d", rc, torRingId, l_ringVariant );
memcpy( pCmnRingPayload, i_ringData.iv_pWorkBuf1, tempBufSize);
io_sgpeRings.setRingOffset( pCmnRingPayload, io_sgpeRings.getCommonRingId( ringIndex ) );
@@ -3663,12 +3798,10 @@ fapi2::ReturnCode layoutRingsForSGPE( Homerlayout_t* i_pHomer,
}
//Manage the Quad Common rings in HOMER
-
FAPI_TRY( layoutCmnRingsForSgpe( i_pHomer, i_chipState, i_ringData,
i_debugMode, l_ringVariant, io_qpmrHdr,
i_imgType, sgpeRings),
"Quad Common Ring Layout Failed");
-
//Manage the Quad Override rings in HOMER
FAPI_TRY( layoutSgpeScanOverride( i_pHomer, i_pOverride, i_chipState,
@@ -4822,12 +4955,10 @@ fapi2::ReturnCode populateUnsecureHomerAddress( CONST_FAPI2_PROC& i_procTgt, Hom
pCmeHdr->g_cme_unsec_cpmr_PhyAddr = pCmeHdr->g_cme_cpmr_PhyAddr;
goto fapi_try_exit;
}
-
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_UNSECURE_HOMER_ADDRESS,
i_procTgt,
l_unsecureHomerAdd),
"Error from FAPI_ATTR_GET for attribute ATTR_UNSECURE_HOMER_ADDRESS");
-
FAPI_INF( "Atrribute ATTR_UNSECURE_HOMER_ADDRESS 0x%016lx", l_unsecureHomerAdd );
if( l_unsecureHomerAdd & 0x1fffff )
@@ -4902,7 +5033,6 @@ fapi2::ReturnCode initUnsecureHomer( void* const i_pBuf2, const uint32_t i_s
}
//--------------------------------------------------------------------------------------------------------
-
fapi2::ReturnCode p9_hcode_image_build( CONST_FAPI2_PROC& i_procTgt,
void* const i_pImageIn,
void* i_pHomerImage,
@@ -5018,10 +5148,6 @@ fapi2::ReturnCode p9_hcode_image_build( CONST_FAPI2_PROC& i_procTgt,
FAPI_TRY( buildPgpeAux( pChipHomer ),
"Failed to build auxiliary function in PPMR" );
- //Update P State parameter block info in HOMER
- FAPI_TRY( buildParameterBlock( pChipHomer, i_procTgt, l_ppmrHdr, i_imgType, i_pBuf1, i_sizeBuf1 ),
- "Failed to Add Parameter Block" );
-
FAPI_INF("PGPE built");
//Let us add Scan Rings to the image.
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_RING_DBG_MODE,
@@ -5082,8 +5208,13 @@ fapi2::ReturnCode p9_hcode_image_build( CONST_FAPI2_PROC& i_procTgt,
FAPI_TRY( populateUnsecureHomerAddress( i_procTgt, pChipHomer, l_chipFuncModel.isSmfEnabled() ),
"Failed To Populate Unsecure HOMER Region with sc2 instruction" );
+ //Update P State parameter block info in HOMER
+ FAPI_TRY( buildParameterBlock( pChipHomer, i_procTgt, l_ppmrHdr, i_imgType, i_pBuf1, i_sizeBuf1 ),
+ "Failed to Add Parameter Block" );
+
//Update CPMR Header with Scan Ring details
- updateCpmrCmeRegion( pChipHomer );
+ FAPI_TRY( updateCpmrCmeRegion( pChipHomer, i_procTgt ),
+ "Failed to update CPMR CME region" );
//Update QPMR Header area in HOMER
@@ -5139,7 +5270,6 @@ fapi2::ReturnCode p9_hcode_image_build( CONST_FAPI2_PROC& i_procTgt,
FAPI_TRY( initUnsecureHomer( i_pBuf2, i_sizeBuf2 ),
"Failed to initialize unsecure HOMER" );
-
fapi_try_exit:
FAPI_IMP("<< p9_hcode_image_build" );
return fapi2::current_err;
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.C b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.C
index 9a13c51a2..7e31dbf78 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.C
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2017 */
+/* Contributors Listed Below - COPYRIGHT 2017,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -44,6 +44,34 @@
#include <p9_pm_get_poundw_bucket.H>
#include <attribute_ids.H>
+#ifdef __VDM_TEST
+
+uint8_t dummy_attr[] =
+{
+ 0x30, 0x05,
+ 0x2F, 0x6A, 0x04, 0x68, 0x05, 0xC0, 0x23, 0x12, 0x41, 0x42,
+ 0x42, 0x42, 0x42, 0x43, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73,
+ 0x02, 0x53, 0xA1, 0x04, 0x6A, 0x00, 0x00,
+
+ 0x1B, 0xF0, 0x07, 0x95, 0x07, 0x40, 0x23, 0x12, 0x23, 0x24,
+ 0x24, 0x24, 0x24, 0x25, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73,
+ 0x02, 0x53, 0xA1, 0x04, 0x6A, 0x00, 0x00,
+
+ 0x40, 0x42, 0x04, 0x2C, 0x04, 0xD0, 0x23, 0x12, 0x5A, 0x5A,
+ 0x5A, 0x5B, 0x5B, 0x5B, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73,
+ 0x02, 0x53, 0xA1, 0x04, 0x6A, 0x00, 0x00,
+
+ 0x60, 0x85, 0x0E, 0xD1, 0x0C, 0xF0, 0x23, 0x12, 0x80, 0x80,
+ 0x80, 0x80, 0x81, 0x81, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73,
+ 0x02, 0x53, 0xA1, 0x04, 0x6A, 0x00, 0x00,
+
+ 0x9C, 0x40, 0x14, 0xEE, 0x09, 0x98, 0x4E, 0x20, 0x27, 0x10,
+ 0x01, 0x02, 0x03, 0xFF, 0x03, 0x7F, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+#endif
+
// See doxygen in header file
fapi2::ReturnCode p9_pm_get_poundw_bucket(
const fapi2::Target<fapi2::TARGET_TYPE_EQ>& i_target,
@@ -59,7 +87,15 @@ fapi2::ReturnCode p9_pm_get_poundw_bucket(
i_target,
l_bucketAttr));
- memcpy(&o_data, l_bucketAttr, sizeof(o_data));
+ memcpy(&o_data, l_bucketAttr, sizeof(o_data));
+
+#ifdef __VDM_TEST
+
+ memcpy( &o_data, dummy_attr, sizeof(o_data) );
+
+#endif
+
+ FAPI_INF( "COPYING from ATTR_POUNDW_BUCKET_DATA" );
fapi_try_exit:
FAPI_DBG("Exiting p9_pm_get_poundw_bucket ....");
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.H b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.H
index 47f72c091..1ca6b36f9 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.H
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2017 */
+/* Contributors Listed Below - COPYRIGHT 2017,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -59,7 +59,7 @@ typedef struct __attribute__((__packed__)) vdmData
// bucket Id
uint8_t bucketId;
// VDM data
- uint8_t vdmData[PW_VER_2_VDMDATA_SIZE];
+ uint8_t vdmData[PW_VER_30_VDMDATA_SIZE];
} vdmData_t;
}
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket_attr.C b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket_attr.C
index 40a2b03de..331c4c22f 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket_attr.C
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket_attr.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2017 */
+/* Contributors Listed Below - COPYRIGHT 2017,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -51,7 +51,7 @@ fapi2::ReturnCode p9_pm_get_poundw_bucket_attr(
uint8_t* l_fullVpdData = nullptr;
uint32_t l_vpdSize = 0;
uint8_t l_bucketId;
- uint8_t l_bucketSize = 0;
+ uint8_t l_bucketSize = PW_VER_30_VDMDATA_SIZE;
//To read MVPD we will need the proc parent of the inputted EQ target
fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> l_procParent =
@@ -116,6 +116,10 @@ fapi2::ReturnCode p9_pm_get_poundw_bucket_attr(
//Set the size of the bucket
l_bucketSize = POUNDW_BUCKETID_SIZE + PW_VER_2_VDMDATA_SIZE;
}
+ else if ( ( *l_fullVpdData ) >= POUNDW_VERSION_30 )
+ {
+ l_bucketSize = POUNDW_BUCKETID_SIZE + PW_VER_30_VDMDATA_SIZE;
+ }
else
{
FAPI_ASSERT( false,
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket_attr.H b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket_attr.H
index 6e425ba3b..edf2eb011 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket_attr.H
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundw_bucket_attr.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2017 */
+/* Contributors Listed Below - COPYRIGHT 2017,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -44,13 +44,15 @@
enum poundwBucketParms
{
- POUNDW_VERSION_1 = 0x01,
- POUNDW_VERSION_2 = 0x02,
- POUNDW_VERSION_F = 0x0F,
- POUNDW_VERSION_SIZE = 0x01, // version is uint8_t
- POUNDW_BUCKETID_SIZE = 0x01, // bucket ID is uint8_t
- PW_VER_1_VDMDATA_SIZE = 0x28,
- PW_VER_2_VDMDATA_SIZE = 0x3C,
+ POUNDW_VERSION_1 = 0x01,
+ POUNDW_VERSION_2 = 0x02,
+ POUNDW_VERSION_F = 0x0F,
+ POUNDW_VERSION_30 = 0x30,
+ POUNDW_VERSION_SIZE = 0x01, // version is uint8_t
+ POUNDW_BUCKETID_SIZE = 0x01, // bucket ID is uint8_t
+ PW_VER_1_VDMDATA_SIZE = 0x28,
+ PW_VER_2_VDMDATA_SIZE = 0x3C,
+ PW_VER_30_VDMDATA_SIZE = 0x87,
};
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C b/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
index 87f78debf..0609ddc8f 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
@@ -198,19 +198,19 @@ const uint8_t g_sysvfrtData[] =
VDN_PERCENT_KEY, // vdn percentage(1B),
0x05, // vdd percentage(1B)
QID_KEY, // quad id(1B)
- 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
- 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
- 0xA8, 0xA5, 0xA5, 0xA1, 0x9D, 0x9A, 0xA8, 0xA8, 0xA8,
- 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
- 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA5, 0xA5,
- 0xA1, 0x9D, 0x9A, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
- 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
+ 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
+ 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
+ 0xA8, 0xA5, 0xA5, 0xA1, 0x9D, 0x9A, 0xA8, 0xA8, 0xA8,
+ 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
+ 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA5, 0xA5,
+ 0xA1, 0x9D, 0x9A, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
+ 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
0xA8, 0xA8, 0xA8, 0xA8, 0xA5, 0xA5, 0xA1, 0x9D, 0x9A,
- 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
- 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
- 0xA8, 0xA5, 0xA5, 0xA1, 0x9D, 0x9A, 0xA8, 0xA8, 0xA8,
- 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
- 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA5, 0xA5,
+ 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
+ 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
+ 0xA8, 0xA5, 0xA5, 0xA1, 0x9D, 0x9A, 0xA8, 0xA8, 0xA8,
+ 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,
+ 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA5, 0xA5,
0xA1, 0x9D, 0x9A
};
@@ -223,6 +223,8 @@ char const* region_names[] = { "REGION_POWERSAVE_NOMINAL",
};
char const* prt_region_names[] = VPD_OP_SLOPES_REGION_ORDER_STR;
+const uint32_t LEGACY_RESISTANCE_ENTRY_SIZE = 10;
+
//the value in this table are in Index format
uint8_t g_GreyCodeIndexMapping [] =
{
@@ -254,7 +256,7 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
uint8_t* o_buf,
uint32_t& io_size)
{
- FAPI_DBG("> p9_pstate_parameter_block");
+ FAPI_IMP("> p9_pstate_parameter_block");
const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
fapi2::ReturnCode l_rc = 0;
io_size = 0;
@@ -278,8 +280,8 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
memset (&l_globalppb, 0, sizeof(GlobalPstateParmBlock));
// CME content
- LocalPstateParmBlock l_localppb;
- memset (&l_localppb, 0, sizeof(LocalPstateParmBlock));
+ LocalPstateParmBlock l_localppb[MAX_QUADS_PER_CHIP];
+ memset ( &l_localppb, 0, ( MAX_QUADS_PER_CHIP * sizeof(LocalPstateParmBlock) ) );
// OCC content
OCCPstateParmBlock l_occppb;
@@ -333,7 +335,7 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// ----------------
// Initialize VDM data
// ----------------
- l_pmPPB.vdm_init();
+ FAPI_TRY(l_pmPPB.vdm_init());
// ----------------
// get Resonant clocking attributes
@@ -348,7 +350,7 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// ----------------
// Initialize LPPB structure
// ----------------
- FAPI_TRY(l_pmPPB.lppb_init(&l_localppb));
+ FAPI_TRY(l_pmPPB.lppb_init(&l_localppb[0]));
// ----------------
// WOF initialization
@@ -371,25 +373,26 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// Put out the Parmater Blocks to the trace
- gppb_print(&(l_globalppb));
+ FAPI_TRY(gppb_print(&(l_globalppb), i_target));
oppb_print(&(l_occppb));
// Populate Global,local and OCC parameter blocks into Pstate super structure
- (*io_pss).globalppb = l_globalppb;
- (*io_pss).localppb = l_localppb;
- (*io_pss).occppb = l_occppb;
+ (*io_pss).globalppb = l_globalppb;
+ (*io_pss).occppb = l_occppb;
+
+ memcpy( &((*io_pss).localppb), &l_localppb, ( MAX_QUADS_PER_CHIP * sizeof(LocalPstateParmBlock) ) );
}
while(0);
fapi_try_exit:
- FAPI_DBG("< p9_pstate_parameter_block");
+ FAPI_IMP("< p9_pstate_parameter_block");
return fapi2::current_err;
}
// END OF PSTATE PARAMETER BLOCK function
///////////////////////////////////////////////////////////
-//////// freq2pState
+//////// freq2pState
///////////////////////////////////////////////////////////
int PlatPmPPB::freq2pState (const uint32_t i_freq_khz,
Pstate* o_pstate,
@@ -546,7 +549,7 @@ fapi_try_exit:
} //end of set_global_feature_attributes
///////////////////////////////////////////////////////////
-//////// oppb_init
+//////// oppb_init
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::oppb_init(
OCCPstateParmBlock *i_occppb )
@@ -620,7 +623,7 @@ fapi2::ReturnCode PlatPmPPB::oppb_init(
revle16(iv_poundW_data.poundw[TURBO].ivdd_tdp_ac_current_10ma);
i_occppb->lac_tdp_vdd_nominal_10ma =
revle16(iv_poundW_data.poundw[NOMINAL].ivdd_tdp_ac_current_10ma);
- FAPI_INF("l_occppb.lac_tdp_vdd_turbo_10ma 0x%x (%d)",
+ FAPI_INF("l_occppb.lac_tdp_vdd_turbo_10ma 0x%x (%d)",
i_occppb->lac_tdp_vdd_turbo_10ma, i_occppb->lac_tdp_vdd_turbo_10ma);
FAPI_INF("l_occppb.lac_tdp_vdd_nominal_10ma 0x%x (%d)",
i_occppb->lac_tdp_vdd_nominal_10ma, i_occppb->lac_tdp_vdd_nominal_10ma);
@@ -676,7 +679,7 @@ fapi2::ReturnCode PlatPmPPB::oppb_init(
///////////////////////////////////////////////////////////
-//////// lppb_init
+//////// lppb_init
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::lppb_init(
LocalPstateParmBlock *i_localppb)
@@ -684,79 +687,91 @@ fapi2::ReturnCode PlatPmPPB::lppb_init(
FAPI_INF(">>>>>>>> lppb_init");
do
{
- // -----------------------------------------------
- // Local parameter block
- // -----------------------------------------------
- i_localppb->magic = revle64(LOCAL_PARMSBLOCK_MAGIC);
+ uint8_t l_eqPos = 0;
+ auto l_eqChiplets = iv_procChip.getChildren<fapi2::TARGET_TYPE_EQ>(fapi2::TARGET_STATE_FUNCTIONAL);
+ LocalPstateParmBlock *l_pLocalPspbTemp = NULL;
- // VpdBias External and Internal Biases for Global and Local parameter
- // block
- for (uint8_t i = 0; i < NUM_OP_POINTS; i++)
+ for( auto eq : l_eqChiplets )
{
- i_localppb->ext_biases[i] = iv_bias[i];
- i_localppb->int_biases[i] = iv_bias[i];
- }
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_UNIT_POS, eq, l_eqPos ));
+ l_pLocalPspbTemp = i_localppb + l_eqPos;
- //load vpd operating points
- for (uint32_t i = 0; i < NUM_OP_POINTS; i++)
- {
- i_localppb->operating_points[i].frequency_mhz = revle32(iv_biased_vpd_pts[i].frequency_mhz);
- i_localppb->operating_points[i].vdd_mv = revle32(iv_biased_vpd_pts[i].vdd_mv);
- i_localppb->operating_points[i].idd_100ma = revle32(iv_biased_vpd_pts[i].idd_100ma);
- i_localppb->operating_points[i].vcs_mv = revle32(iv_biased_vpd_pts[i].vcs_mv);
- i_localppb->operating_points[i].ics_100ma = revle32(iv_biased_vpd_pts[i].ics_100ma);
- i_localppb->operating_points[i].pstate = iv_biased_vpd_pts[i].pstate;
- }
+ // -----------------------------------------------
+ // Local parameter block
+ // -----------------------------------------------
+ l_pLocalPspbTemp->magic = revle64(LOCAL_PARMSBLOCK_MAGIC);
+
+ // VpdBias External and Internal Biases for Global and Local parameter
+ // block
+ for (uint8_t i = 0; i < NUM_OP_POINTS; i++)
+ {
+ l_pLocalPspbTemp->ext_biases[i] = iv_bias[i];
+ l_pLocalPspbTemp->int_biases[i] = iv_bias[i];
+ }
- i_localppb->vdd_sysparm = iv_vdd_sysparam;
+ //load vpd operating points
+ for (uint32_t i = 0; i < NUM_OP_POINTS; i++)
+ {
+ l_pLocalPspbTemp->operating_points[i].frequency_mhz = revle32(iv_biased_vpd_pts[i].frequency_mhz);
+ l_pLocalPspbTemp->operating_points[i].vdd_mv = revle32(iv_biased_vpd_pts[i].vdd_mv);
+ l_pLocalPspbTemp->operating_points[i].idd_100ma = revle32(iv_biased_vpd_pts[i].idd_100ma);
+ l_pLocalPspbTemp->operating_points[i].vcs_mv = revle32(iv_biased_vpd_pts[i].vcs_mv);
+ l_pLocalPspbTemp->operating_points[i].ics_100ma = revle32(iv_biased_vpd_pts[i].ics_100ma);
+ l_pLocalPspbTemp->operating_points[i].pstate = iv_biased_vpd_pts[i].pstate;
+ }
- // IvrmParmBlock
- i_localppb->ivrm = iv_ivrmpb;
+ l_pLocalPspbTemp->vdd_sysparm = iv_vdd_sysparam;
- // VDMParmBlock
- memset (&(i_localppb->vdm),0,sizeof(i_localppb->vdm));
+ // IvrmParmBlock
+ l_pLocalPspbTemp->ivrm = iv_ivrmpb;
- i_localppb->dpll_pstate0_value =
- ((iv_reference_frequency_khz) /
- (iv_frequency_step_khz));
- i_localppb->dpll_pstate0_value = revle32(i_localppb->dpll_pstate0_value);
+ // VDMParmBlock
+ memset (&(l_pLocalPspbTemp->vdm), 0, sizeof(l_pLocalPspbTemp->vdm));
- FAPI_INF("l_localppb.dpll_pstate0_value %X (%d)",
- revle32(i_localppb->dpll_pstate0_value),
- revle32(i_localppb->dpll_pstate0_value));
+ l_pLocalPspbTemp->dpll_pstate0_value =
+ ((iv_reference_frequency_khz) /
+ (iv_frequency_step_khz));
+ l_pLocalPspbTemp->dpll_pstate0_value = revle32(l_pLocalPspbTemp->dpll_pstate0_value);
- i_localppb->resclk = iv_resclk_setup;
+ FAPI_INF("l_localppb.dpll_pstate0_value %X (%d)",
+ revle32(l_pLocalPspbTemp->dpll_pstate0_value),
+ revle32(l_pLocalPspbTemp->dpll_pstate0_value));
- if (iv_attrs.attr_system_vdm_disable == fapi2::ENUM_ATTR_SYSTEM_VDM_DISABLE_OFF)
- {
+ l_pLocalPspbTemp->resclk = iv_resclk_setup;
+
+ if (iv_attrs.attr_system_vdm_disable == fapi2::ENUM_ATTR_SYSTEM_VDM_DISABLE_OFF)
+ {
- //Initializing threshold and jump values for LPPB
- memcpy ( i_localppb->vid_point_set,
- iv_vid_point_set,
- sizeof(i_localppb->vid_point_set));
+ //Initializing threshold and jump values for LPPB
+ memcpy ( l_pLocalPspbTemp->vid_point_set,
+ iv_vid_point_set,
+ sizeof(l_pLocalPspbTemp->vid_point_set));
- memcpy ( i_localppb->threshold_set,
- iv_threshold_set,
- sizeof(i_localppb->threshold_set));
+ memcpy ( l_pLocalPspbTemp->threshold_set,
+ iv_threshold_set,
+ sizeof(l_pLocalPspbTemp->threshold_set));
- memcpy ( i_localppb->jump_value_set,
- iv_jump_value_set,
- sizeof(i_localppb->jump_value_set));
+ memcpy ( l_pLocalPspbTemp->jump_value_set,
+ iv_jump_value_set,
+ sizeof(l_pLocalPspbTemp->jump_value_set));
- memcpy ( i_localppb->PsVIDCompSlopes,
- iv_PsVIDCompSlopes,
- sizeof(i_localppb->PsVIDCompSlopes));
+ memcpy ( l_pLocalPspbTemp->PsVIDCompSlopes,
+ iv_PsVIDCompSlopes,
+ sizeof(l_pLocalPspbTemp->PsVIDCompSlopes));
- memcpy ( i_localppb->PsVDMThreshSlopes,
- iv_PsVDMThreshSlopes,
- sizeof(i_localppb->PsVDMThreshSlopes));
+ memcpy ( l_pLocalPspbTemp->PsVDMThreshSlopes,
+ iv_PsVDMThreshSlopes,
+ sizeof(l_pLocalPspbTemp->PsVDMThreshSlopes));
- memcpy ( i_localppb->PsVDMJumpSlopes,
- iv_PsVDMJumpSlopes,
- sizeof(i_localppb->PsVDMJumpSlopes));
- }
+ memcpy ( l_pLocalPspbTemp->PsVDMJumpSlopes,
+ iv_PsVDMJumpSlopes,
+ sizeof(l_pLocalPspbTemp->PsVDMJumpSlopes));
+ }
+
+ }// for eq
}while(0);
+fapi_try_exit:
FAPI_INF("<<<<<<<< lppb_init");
return fapi2::current_err;
@@ -764,7 +779,7 @@ fapi2::ReturnCode PlatPmPPB::lppb_init(
///////////////////////////////////////////////////////////
-//////// gppb_init
+//////// gppb_init
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::gppb_init(
GlobalPstateParmBlock *io_globalppb)
@@ -878,8 +893,8 @@ fapi2::ReturnCode PlatPmPPB::gppb_init(
if (iv_attrs.attr_system_vdm_disable == fapi2::ENUM_ATTR_SYSTEM_VDM_DISABLE_OFF)
{
//Initializing threshold and jump values for GPPB
- memcpy ( io_globalppb->vid_point_set,
- iv_vid_point_set,
+ memset ( io_globalppb->vid_point_set,
+ 0,
sizeof(io_globalppb->vid_point_set));
memcpy ( io_globalppb->threshold_set,
@@ -890,8 +905,8 @@ fapi2::ReturnCode PlatPmPPB::gppb_init(
iv_jump_value_set,
sizeof(io_globalppb->jump_value_set));
- memcpy ( io_globalppb->PsVIDCompSlopes,
- iv_PsVIDCompSlopes,
+ memset ( io_globalppb->PsVIDCompSlopes,
+ 0,
sizeof(io_globalppb->PsVIDCompSlopes));
memcpy ( io_globalppb->PsVDMThreshSlopes,
@@ -960,7 +975,7 @@ fapi2::ReturnCode PlatPmPPB::gppb_init(
// Inflection Point 0 is POWERSAVE
//
///////////////////////////////////////////////////////////
-//////// compute_PStateV_slope
+//////// compute_PStateV_slope
///////////////////////////////////////////////////////////
void PlatPmPPB::compute_PStateV_slope(
GlobalPstateParmBlock* o_gppb)
@@ -1018,7 +1033,7 @@ void PlatPmPPB::compute_PStateV_slope(
///////////////////////////////////////////////////////////
-//////// wof_init
+//////// wof_init
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::wof_init(
uint8_t* o_buf,
@@ -1220,7 +1235,7 @@ fapi_try_exit:
///////////////////////////////////////////////////////////
-//////// update_vfrt
+//////// update_vfrt
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::update_vfrt(
uint8_t* i_pBuffer,
@@ -1422,14 +1437,14 @@ fapi_try_exit:
///////////////////////////////////////////////////////////
-//////// safe_mode_init
+//////// safe_mode_init
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::safe_mode_init( void )
{
FAPI_INF(">>>>>>>>>> safe_mode_init");
uint8_t l_ps_pstate = 0;
Safe_mode_parameters l_safe_mode_values;
- uint32_t l_ps_freq_khz =
+ uint32_t l_ps_freq_khz =
iv_operating_points[VPD_PT_SET_BIASED][POWERSAVE].frequency_mhz * 1000;
do
@@ -1462,18 +1477,18 @@ fapi_try_exit:
///////////////////////////////////////////////////////////
//////// vdm_init
///////////////////////////////////////////////////////////
-void PlatPmPPB::vdm_init( void )
+fapi2::ReturnCode PlatPmPPB::vdm_init( void )
{
FAPI_INF(">>>>>>>> vdm_init");
do
{
uint8_t l_biased_pstate[NUM_OP_POINTS];
- memset(&iv_vid_point_set,0, sizeof(iv_vid_point_set));
- memset(iv_threshold_set,0,sizeof(iv_threshold_set));
- memset(&iv_PsVIDCompSlopes,0,sizeof(iv_PsVIDCompSlopes));
- memset(iv_PsVDMThreshSlopes,0,sizeof(iv_PsVDMThreshSlopes));
- memset(iv_jump_value_set,0,sizeof(iv_jump_value_set));
- memset(iv_PsVDMJumpSlopes,0,sizeof(iv_PsVDMJumpSlopes));
+ memset( &iv_vid_point_set[0], 0, sizeof(iv_vid_point_set) );
+ memset(iv_threshold_set, 0, sizeof(iv_threshold_set));
+ memset( &iv_PsVIDCompSlopes[0], 0, sizeof(iv_PsVIDCompSlopes) );
+ memset(iv_PsVDMThreshSlopes, 0, sizeof(iv_PsVDMThreshSlopes));
+ memset(iv_jump_value_set, 0, sizeof(iv_jump_value_set));
+ memset(iv_PsVDMJumpSlopes, 0, sizeof(iv_PsVDMJumpSlopes));
for (uint8_t i = 0; i < NUM_OP_POINTS; ++i)
{
@@ -1483,27 +1498,29 @@ void PlatPmPPB::vdm_init( void )
if (iv_attrs.attr_system_vdm_disable == fapi2::ENUM_ATTR_SYSTEM_VDM_DISABLE_OFF)
{
- compute_vdm_threshold_pts();
+ //loop thru the quad list
+ FAPI_TRY(compute_vdm_threshold_pts());
// VID slope calculation
- compute_PsVIDCompSlopes_slopes(l_biased_pstate);
+ FAPI_TRY(compute_PsVIDCompSlopes_slopes(l_biased_pstate));
// VDM threshold slope calculation
compute_PsVDMThreshSlopes(l_biased_pstate);
// VDM Jump slope calculation
compute_PsVDMJumpSlopes (l_biased_pstate);
-
}
}while(0);
FAPI_INF("<<<<<<<< vdm_init");
+fapi_try_exit:
+ return fapi2::current_err;
} //end of vdm_init
///////////////////////////////////////////////////////////
-//////// compute_PsVDMJumpSlopes
+//////// compute_PsVDMJumpSlopes
///////////////////////////////////////////////////////////
void PlatPmPPB::compute_PsVDMJumpSlopes(
uint8_t* i_pstate)
@@ -1528,10 +1545,10 @@ void PlatPmPPB::compute_PsVDMJumpSlopes(
{
iv_PsVDMJumpSlopes[region][i] =
revle16(
- compute_slope_thresh(iv_jump_value_set[region+1][i],
+ compute_slope_thresh(iv_jump_value_set[region + 1][i],
iv_jump_value_set[region][i],
i_pstate[region],
- i_pstate[region+1])
+ i_pstate[region + 1])
);
FAPI_INF("PsVDMJumpSlopes %s %x N_S %d N_L %d L_S %d S_N %d",
@@ -1549,7 +1566,7 @@ void PlatPmPPB::compute_PsVDMJumpSlopes(
///////////////////////////////////////////////////////////
-//////// compute_PsVDMThreshSlopes
+//////// compute_PsVDMThreshSlopes
///////////////////////////////////////////////////////////
void PlatPmPPB::compute_PsVDMThreshSlopes(
uint8_t* i_pstate)
@@ -1572,7 +1589,7 @@ void PlatPmPPB::compute_PsVDMThreshSlopes(
{
iv_PsVDMThreshSlopes[region][i] =
revle16(
- compute_slope_thresh(iv_threshold_set[region+1][i],
+ compute_slope_thresh(iv_threshold_set[region + 1][i],
iv_threshold_set[region][i],
i_pstate[region],
i_pstate[region+1])
@@ -1593,9 +1610,9 @@ void PlatPmPPB::compute_PsVDMThreshSlopes(
///////////////////////////////////////////////////////////
-//////// compute_PsVIDCompSlopes_slopes
+//////// compute_PsVIDCompSlopes_slopes
///////////////////////////////////////////////////////////
-void PlatPmPPB::compute_PsVIDCompSlopes_slopes(
+fapi2::ReturnCode PlatPmPPB::compute_PsVIDCompSlopes_slopes(
uint8_t* i_pstate)
{
do
@@ -1604,6 +1621,8 @@ void PlatPmPPB::compute_PsVIDCompSlopes_slopes(
"REGION_NOMINAL_TURBO",
"REGION_TURBO_ULTRA"
};
+ uint8_t l_eqPos = 0;
+ auto l_eqChiplets = iv_procChip.getChildren<fapi2::TARGET_TYPE_EQ>(fapi2::TARGET_STATE_FUNCTIONAL);
// ULTRA TURBO pstate check is not required..because its pstate will be
// 0
@@ -1615,37 +1634,53 @@ void PlatPmPPB::compute_PsVIDCompSlopes_slopes(
break;
}
- for(auto region(REGION_POWERSAVE_NOMINAL); region <= REGION_TURBO_ULTRA; ++region)
+ for( auto eq : l_eqChiplets )
{
- iv_PsVIDCompSlopes[region] =
- revle16(
- compute_slope_4_12( iv_vid_point_set[region + 1],
- iv_vid_point_set[region],
- i_pstate[region],
- i_pstate[region + 1])
- );
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_UNIT_POS, eq, l_eqPos ));
- FAPI_DBG("PsVIDCompSlopes[%s] 0x%04x %d", region_names[region],
- revle16(iv_PsVIDCompSlopes[region]),
- revle16(iv_PsVIDCompSlopes[region]));
+ for(auto region(REGION_POWERSAVE_NOMINAL); region <= REGION_TURBO_ULTRA; ++region)
+ {
+ iv_PsVIDCompSlopes[l_eqPos][region] =
+ revle16(
+ compute_slope_4_12( iv_vid_point_set[l_eqPos][region + 1],
+ iv_vid_point_set[l_eqPos][region],
+ i_pstate[region],
+ i_pstate[region + 1])
+ );
+
+ FAPI_DBG( "PsVIDCompSlopes[%s] 0x%04x %d", region_names[region],
+ revle16(iv_PsVIDCompSlopes[l_eqPos][region]),
+ revle16(iv_PsVIDCompSlopes[l_eqPos][region]) );
+ }
}
}
while(0);
-} // end of compute_PsVIDCompSlopes_slopes
+
+fapi_try_exit:
+return fapi2::current_err;
+
+} // end of compute_PsVIDCompSlopes_slopes
///////////////////////////////////////////////////////////
//////// compute_vdm_threshold_pts
///////////////////////////////////////////////////////////
-void PlatPmPPB::compute_vdm_threshold_pts()
+fapi2::ReturnCode PlatPmPPB::compute_vdm_threshold_pts()
{
int p = 0;
+ uint8_t l_eqPos = 0;
+ auto l_eqChiplets = iv_procChip.getChildren<fapi2::TARGET_TYPE_EQ>(fapi2::TARGET_STATE_FUNCTIONAL);
- //VID POINTS
- for (p = 0; p < NUM_OP_POINTS; p++)
+ for( auto eq : l_eqChiplets )
{
- iv_vid_point_set[p] = iv_poundW_data.poundw[p].vdm_vid_compare_ivid;
- FAPI_INF("Bi:VID=%x", iv_vid_point_set[p]);
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_UNIT_POS, eq, l_eqPos ));
+
+ //VID POINTS
+ for (p = 0; p < NUM_OP_POINTS; p++)
+ {
+ iv_vid_point_set[l_eqPos][p] = iv_poundW_data.poundw[p].vdm_vid_compare_per_quad[l_eqPos];
+ FAPI_INF("Bi:VID=%x", iv_vid_point_set[l_eqPos][p]);
+ }
}
// Threshold points
@@ -1689,10 +1724,13 @@ void PlatPmPPB::compute_vdm_threshold_pts()
FAPI_INF("Bi: S_L =%d", iv_jump_value_set[p][3]);
}
+
+fapi_try_exit:
+return fapi2::current_err;
} //end of compute_vdm_threshold_pts
///////////////////////////////////////////////////////////
-//////// ps2v_mv
+//////// ps2v_mv
///////////////////////////////////////////////////////////
uint32_t PlatPmPPB::ps2v_mv(const Pstate i_pstate)
{
@@ -1813,11 +1851,11 @@ fapi2::ReturnCode PlatPmPPB::safe_mode_computation(
"Core floor freqency is greater than UltraTurbo frequency");
}
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SAFE_MODE_FREQUENCY_MHZ,
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SAFE_MODE_FREQUENCY_MHZ,
iv_procChip, l_safe_mode_freq_mhz));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SAFE_MODE_VOLTAGE_MV,
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SAFE_MODE_VOLTAGE_MV,
iv_procChip, l_safe_mode_mv));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDD_BOOT_VOLTAGE,
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDD_BOOT_VOLTAGE,
iv_procChip, l_boot_mv));
FAPI_DBG ("l_safe_mode_freq_mhz 0%08x (%d)",
@@ -1862,7 +1900,7 @@ fapi2::ReturnCode PlatPmPPB::safe_mode_computation(
(float)(l_safe_mode_values.safe_op_freq_mhz * 1000)) /
(float)iv_frequency_step_khz;
- l_safe_mode_op_ps2freq_mhz = (iv_reference_frequency_khz -
+ l_safe_mode_op_ps2freq_mhz = (iv_reference_frequency_khz -
(l_safe_mode_values.safe_op_ps * iv_frequency_step_khz)) / 1000;
while (l_safe_mode_op_ps2freq_mhz < l_safe_mode_values.safe_op_freq_mhz)
@@ -1976,7 +2014,7 @@ fapi_try_exit:
///////////////////////////////////////////////////////////
-//////// attr_init
+//////// attr_init
///////////////////////////////////////////////////////////
void PlatPmPPB::attr_init( void )
{
@@ -2070,13 +2108,13 @@ FAPI_INF("%-60s = 0x%08x %d", #attr_name, iv_attrs.attr_assign, iv_attrs.attr_as
DATABLOCK_GET_ATTR(ATTR_TDP_RDP_CURRENT_FACTOR, iv_procChip, attr_tdp_rdp_current_factor);
- DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_TRANSITION_START_NS,
+ DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_TRANSITION_START_NS,
FAPI_SYSTEM, attr_ext_vrm_transition_start_ns);
- DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_TRANSITION_RATE_INC_UV_PER_US,
+ DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_TRANSITION_RATE_INC_UV_PER_US,
FAPI_SYSTEM, attr_ext_vrm_transition_rate_inc_uv_per_us);
- DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_TRANSITION_RATE_DEC_UV_PER_US,
+ DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_TRANSITION_RATE_DEC_UV_PER_US,
FAPI_SYSTEM, attr_ext_vrm_transition_rate_dec_uv_per_us);
- DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_TRANSITION_STABILIZATION_TIME_NS,
+ DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_TRANSITION_STABILIZATION_TIME_NS,
FAPI_SYSTEM, attr_ext_vrm_stabilization_time_us);
DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_STEPSIZE, FAPI_SYSTEM, attr_ext_vrm_step_size_mv);
DATABLOCK_GET_ATTR(ATTR_NEST_LEAKAGE_PERCENT, FAPI_SYSTEM, attr_nest_leakage_percent);
@@ -2453,7 +2491,7 @@ void PlatPmPPB::compute_vpd_pts()
///////////////////////////////////////////////////////////
-//////// resclk_init
+//////// resclk_init
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::resclk_init( void )
{
@@ -2481,7 +2519,7 @@ fapi_try_exit:
///////////////////////////////////////////////////////////
-//////// res_clock_setup
+//////// res_clock_setup
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::res_clock_setup (void)
{
@@ -2692,7 +2730,7 @@ fapi_try_exit:
///////////////////////////////////////////////////////////
-//////// get_ivrm_parms
+//////// get_ivrm_parms
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::get_ivrm_parms ()
{
@@ -2748,7 +2786,7 @@ fapi_try_exit:
///////////////////////////////////////////////////////////
-//////// chk_valid_poundv
+//////// chk_valid_poundv
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::chk_valid_poundv(
const bool i_biased_state)
@@ -2801,7 +2839,7 @@ fapi2::ReturnCode PlatPmPPB::chk_valid_poundv(
(l_attr_mvpd_data[pv_op_order[i]].vcs_mv),
(l_attr_mvpd_data[pv_op_order[i]].ics_100ma));
- if (is_wof_enabled() &&
+ if (is_wof_enabled() &&
(strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))
{
if (l_attr_mvpd_data[pv_op_order[i]].frequency_mhz == 0 ||
@@ -2975,25 +3013,25 @@ fapi2::ReturnCode PlatPmPPB::chk_valid_poundv(
// Only skip checkinug for WOF not enabled and UltraTurbo.
if ( is_wof_enabled() ||
- (!( !is_wof_enabled() &&
+ (!( !is_wof_enabled() &&
(strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))))
{
- if (l_attr_mvpd_data[pv_op_order[i - 1]].frequency_mhz >
+ if (l_attr_mvpd_data[pv_op_order[i - 1]].frequency_mhz >
l_attr_mvpd_data[pv_op_order[i]].frequency_mhz ||
- l_attr_mvpd_data[pv_op_order[i - 1]].vdd_mv >
+ l_attr_mvpd_data[pv_op_order[i - 1]].vdd_mv >
l_attr_mvpd_data[pv_op_order[i]].vdd_mv ||
- l_attr_mvpd_data[pv_op_order[i - 1]].idd_100ma >
+ l_attr_mvpd_data[pv_op_order[i - 1]].idd_100ma >
l_attr_mvpd_data[pv_op_order[i]].idd_100ma ||
- l_attr_mvpd_data[pv_op_order[i - 1]].vcs_mv >
+ l_attr_mvpd_data[pv_op_order[i - 1]].vcs_mv >
l_attr_mvpd_data[pv_op_order[i]].vcs_mv ||
- l_attr_mvpd_data[pv_op_order[i - 1]].ics_100ma >
+ l_attr_mvpd_data[pv_op_order[i - 1]].ics_100ma >
l_attr_mvpd_data[pv_op_order[i]].ics_100ma )
{
iv_pstates_enabled = false;
if (attr_poundv_validity_halt_disable)
{
- FAPI_IMP("**** WARNING : halt on #V validity checking has been "
+ FAPI_IMP("**** WARNING : halt on #V validity checking has been "
"disabled and relationship errors were found");
FAPI_IMP("**** WARNING : Relationship error between #V operating point "
"(%s > %s)(power save <= nominal <= turbo <= ultraturbo) (chiplet = %u bucket id = %u op point = %u)",
@@ -3010,7 +3048,7 @@ fapi2::ReturnCode PlatPmPPB::chk_valid_poundv(
FAPI_INF("%s Frequency value %u is %s %s Frequency value %u",
pv_op_str[pv_op_order[i - 1]], l_attr_mvpd_data[pv_op_order[i - 1]].frequency_mhz,
- POUNDV_SLOPE_CHECK(l_attr_mvpd_data[pv_op_order[i - 1]].frequency_mhz,
+ POUNDV_SLOPE_CHECK(l_attr_mvpd_data[pv_op_order[i - 1]].frequency_mhz,
l_attr_mvpd_data[pv_op_order[i]].frequency_mhz),pv_op_str[pv_op_order[i]], l_attr_mvpd_data[pv_op_order[i]].frequency_mhz);
FAPI_INF("%s VDD voltage value %u is %s %s Frequency value %u",
@@ -3139,7 +3177,7 @@ fapi_try_exit:
///////////////////////////////////////////////////////////
-//////// get_mvpd_poundV
+//////// get_mvpd_poundV
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::get_mvpd_poundV()
{
@@ -3149,7 +3187,7 @@ fapi2::ReturnCode PlatPmPPB::get_mvpd_poundV()
uint8_t j = 0;
uint8_t first_chplt = 1;
uint8_t bucket_id = 0;
- uint8_t* l_buffer =
+ uint8_t* l_buffer =
reinterpret_cast<uint8_t*>(malloc(sizeof(voltageBucketData_t)) );
uint8_t* l_buffer_inc = NULL;
@@ -3417,11 +3455,11 @@ fapi_try_exit:
FAPI_INF("<<<<<<<<<<<< apply_biased_values");
return fapi2::current_err;
-} // end of apply_biased_values
+} // end of apply_biased_values
///////////////////////////////////////////////////////////
-//////// large_jump_defaults
+//////// large_jump_defaults
///////////////////////////////////////////////////////////
void PlatPmPPB::large_jump_defaults()
{
@@ -3448,7 +3486,7 @@ void PlatPmPPB::large_jump_defaults()
///////////////////////////////////////////////////////////
-//////// get_mvpd_poundW
+//////// get_mvpd_poundW
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::get_mvpd_poundW (void)
{
@@ -3457,11 +3495,6 @@ fapi2::ReturnCode PlatPmPPB::get_mvpd_poundW (void)
uint8_t selected_eq = 0;
uint8_t bucket_id = 0;
uint8_t version_id = 0;
- const uint16_t VDM_VOLTAGE_IN_MV = 512;
- const uint16_t MIN_VDM_VOLTAGE_IN_MV = 576;
- const uint16_t VDM_GRANULARITY = 4;
- uint32_t l_vdm_compare_raw_mv[NUM_OP_POINTS];
- uint32_t l_vdm_compare_biased_mv[NUM_OP_POINTS];
const char* pv_op_str[NUM_OP_POINTS] = PV_OP_ORDER_STR;
@@ -3508,10 +3541,41 @@ fapi2::ReturnCode PlatPmPPB::get_mvpd_poundW (void)
FAPI_TRY(p9_pm_get_poundw_bucket(l_eqChiplets[selected_eq], l_vdmBuf));
- bucket_id = l_vdmBuf.bucketId;
- version_id = l_vdmBuf.version;
+ bucket_id = l_vdmBuf.bucketId;
+ version_id = l_vdmBuf.version;
+
+ FAPI_INF( "#W chiplet = %u bucket id = %u", l_chipletNum, bucket_id );
+
+ if( version_id < POUNDW_VERSION_30 )
+ {
+ PoundW_data_per_quad l_poundwPerQuad;
+ PoundW_data l_poundw;
+ memcpy( &l_poundw, l_vdmBuf.vdmData, sizeof( PoundW_data ) );
+ memset( &l_poundwPerQuad, 0, sizeof(PoundW_data_per_quad) );
+
+ for( size_t op = 0; op <= ULTRA; op++ )
+ {
+ //structure mapping
+ l_poundwPerQuad.poundw[op].ivdd_tdp_ac_current_10ma = l_poundw.poundw[op].ivdd_tdp_ac_current_10ma;
+
+ l_poundwPerQuad.poundw[op].ivdd_tdp_dc_current_10ma = l_poundw.poundw[op].ivdd_tdp_dc_current_10ma;
+ l_poundwPerQuad.poundw[op].vdm_overvolt_small_thresholds = l_poundw.poundw[op].vdm_overvolt_small_thresholds;
+ l_poundwPerQuad.poundw[op].vdm_large_extreme_thresholds = l_poundw.poundw[op].vdm_large_extreme_thresholds;
+ l_poundwPerQuad.poundw[op].vdm_normal_freq_drop = l_poundw.poundw[op].vdm_normal_freq_drop;
+ l_poundwPerQuad.poundw[op].vdm_normal_freq_return = l_poundw.poundw[op].vdm_normal_freq_return;
+ l_poundwPerQuad.poundw[op].vdm_vid_compare_per_quad[0] = l_poundw.poundw[op].vdm_vid_compare_ivid;
+ l_poundwPerQuad.poundw[op].vdm_vid_compare_per_quad[1] = l_poundw.poundw[op].vdm_vid_compare_ivid;
+ l_poundwPerQuad.poundw[op].vdm_vid_compare_per_quad[2] = l_poundw.poundw[op].vdm_vid_compare_ivid;
+ l_poundwPerQuad.poundw[op].vdm_vid_compare_per_quad[3] = l_poundw.poundw[op].vdm_vid_compare_ivid;
+ l_poundwPerQuad.poundw[op].vdm_vid_compare_per_quad[4] = l_poundw.poundw[op].vdm_vid_compare_ivid;
+ l_poundwPerQuad.poundw[op].vdm_vid_compare_per_quad[5] = l_poundw.poundw[op].vdm_vid_compare_ivid;
+ }
- FAPI_INF("#W chiplet = %u bucket id = %u", l_chipletNum, bucket_id, version_id);
+ memcpy( &l_poundwPerQuad.resistance_data, &l_poundw.resistance_data , LEGACY_RESISTANCE_ENTRY_SIZE );
+ l_poundwPerQuad.resistance_data.r_undervolt_allowed = l_poundw.undervolt_tested;
+ memset(&l_vdmBuf.vdmData, 0, sizeof(l_vdmBuf));
+ memcpy(&l_vdmBuf.vdmData, &l_poundwPerQuad, sizeof( PoundW_data_per_quad ) );
+ }
//if we match with the bucket id, then we don't need to continue
if (iv_poundV_bucket_id == bucket_id)
@@ -3544,18 +3608,19 @@ fapi2::ReturnCode PlatPmPPB::get_mvpd_poundW (void)
// When we read the data from VPD image the order will be N,PS,T,UT.
// But we need the order PS,N,T,UT.. hence we are swapping the data
// between PS and Nominal.
- poundw_entry_t l_tmp_data;
+ poundw_entry_per_quad_t l_tmp_data;
+ memset( &l_tmp_data ,0, sizeof(poundw_entry_per_quad_t));
memcpy (&l_tmp_data,
&(iv_poundW_data.poundw[VPD_PV_NOMINAL]),
- sizeof (poundw_entry_t));
+ sizeof (poundw_entry_per_quad_t));
memcpy (&(iv_poundW_data.poundw[VPD_PV_NOMINAL]),
&(iv_poundW_data.poundw[VPD_PV_POWERSAVE]),
- sizeof(poundw_entry_t));
+ sizeof(poundw_entry_per_quad_t));
memcpy (&(iv_poundW_data.poundw[VPD_PV_POWERSAVE]),
&l_tmp_data,
- sizeof(poundw_entry_t));
+ sizeof(poundw_entry_per_quad_t));
// If the #W version is less than 3, validate Turbo VDM large threshold
// not larger than -32mV. This filters out parts that have bad VPD. If
@@ -3657,83 +3722,16 @@ fapi2::ReturnCode PlatPmPPB::get_mvpd_poundW (void)
// within #W. If VDMs are not enabled (or supported), skip all of it
if (!is_vdm_enabled())
{
- FAPI_INF(" get_mvpd_poundW: VDM is disabled. Skipping remaining checks");
- iv_vdm_enabled = false;
- break;
- }
-
- for (int i = 0; i < NUM_OP_POINTS; ++i)
- {
- l_vdm_compare_raw_mv[i] = VDM_VOLTAGE_IN_MV + (iv_poundW_data.poundw[i].vdm_vid_compare_ivid << 2);
- FAPI_INF("%10s vdm_vid_compare_ivid %3d => %d mv",
- pv_op_str[i],
- iv_poundW_data.poundw[i].vdm_vid_compare_ivid,
- l_vdm_compare_raw_mv[i]);
- }
-
- //Validation of VPD Data
- //If all VID compares are zero then use #V VDD voltage to populate local
- //data structure..So that we make progress in lab with early hardware
- if ( !(iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_ivid) &&
- !(iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_ivid) &&
- !(iv_poundW_data.poundw[TURBO].vdm_vid_compare_ivid) &&
- !(iv_poundW_data.poundw[ULTRA].vdm_vid_compare_ivid))
- {
- //vdm_vid_compare_ivid will be in ivid units (eg HEX((Compare
- //Voltage (mv) - 512mV)/4mV).
- iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_ivid =
- (iv_poundV_raw_data.VddNomVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
- iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_ivid =
- (iv_poundV_raw_data.VddPSVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
- iv_poundW_data.poundw[TURBO].vdm_vid_compare_ivid =
- (iv_poundV_raw_data.VddTurboVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
- iv_poundW_data.poundw[ULTRA].vdm_vid_compare_ivid =
- (iv_poundV_raw_data.VddUTurboVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
- }//if any one of the VID compares are zero, then need to fail because of BAD VPD image.
- else if ( !(iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_ivid) ||
- !(iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_ivid) ||
- !(iv_poundW_data.poundw[TURBO].vdm_vid_compare_ivid) ||
- !(iv_poundW_data.poundw[ULTRA].vdm_vid_compare_ivid))
- {
- iv_vdm_enabled = false;
- FAPI_ASSERT_NOEXIT(false,
- fapi2::PSTATE_PB_POUND_W_INVALID_VID_VALUE(fapi2::FAPI2_ERRL_SEV_RECOVERED)
- .set_CHIP_TARGET(iv_procChip)
- .set_EQ_TARGET(l_eqChiplets[selected_eq])
- .set_NOMINAL_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_ivid)
- .set_POWERSAVE_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_ivid)
- .set_TURBO_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[TURBO].vdm_vid_compare_ivid)
- .set_ULTRA_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[ULTRA].vdm_vid_compare_ivid),
- "Pstate Parameter Block #W : one of the VID compare value is zero");
- break;
- }
-
- // validate vid values
- bool l_compare_vid_value_state = 1;
- VALIDATE_VID_VALUES (iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_ivid,
- iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_ivid,
- iv_poundW_data.poundw[TURBO].vdm_vid_compare_ivid,
- iv_poundW_data.poundw[ULTRA].vdm_vid_compare_ivid,
- l_compare_vid_value_state);
-
- if (!l_compare_vid_value_state)
- {
+ FAPI_INF( "get_mvpd_poundW: VDM is disabled. Skipping remaining checks" );
iv_vdm_enabled = false;
- FAPI_ASSERT_NOEXIT(false,
- fapi2::PSTATE_PB_POUND_W_INVALID_VID_ORDER(fapi2::FAPI2_ERRL_SEV_RECOVERED)
- .set_CHIP_TARGET(iv_procChip)
- .set_EQ_TARGET(l_eqChiplets[selected_eq])
- .set_NOMINAL_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_ivid)
- .set_POWERSAVE_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_ivid)
- .set_TURBO_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[TURBO].vdm_vid_compare_ivid)
- .set_ULTRA_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[ULTRA].vdm_vid_compare_ivid),
- "Pstate Parameter Block #W VID compare data are not in increasing order");
break;
}
// validate threshold values
bool l_threshold_value_state = 1;
+ validate_quad_spec_data( );
+
for (uint8_t p = 0; p < NUM_OP_POINTS; ++p)
{
FAPI_INF("iv_poundW_data.poundw[%d].vdm_overvolt_thresholds 0x%X",
@@ -3745,9 +3743,9 @@ fapi2::ReturnCode PlatPmPPB::get_mvpd_poundW (void)
FAPI_INF("iv_poundW_data.poundw[%d].vdm_extreme_thresholds 0x%X",
p,(iv_poundW_data.poundw[p].vdm_large_extreme_thresholds) & 0x0F);
VALIDATE_THRESHOLD_VALUES(((iv_poundW_data.poundw[p].vdm_overvolt_small_thresholds >> 4) & 0x0F), // overvolt
- ((iv_poundW_data.poundw[p].vdm_overvolt_small_thresholds) & 0x0F), //small
- ((iv_poundW_data.poundw[p].vdm_large_extreme_thresholds >> 4) & 0x0F), //large
- ((iv_poundW_data.poundw[p].vdm_large_extreme_thresholds) & 0x0F), //extreme
+ ((iv_poundW_data.poundw[p].vdm_overvolt_small_thresholds) & 0x0F), // small
+ ((iv_poundW_data.poundw[p].vdm_large_extreme_thresholds >> 4) & 0x0F), // large
+ ((iv_poundW_data.poundw[p].vdm_large_extreme_thresholds) & 0x0F), // extreme
l_threshold_value_state);
if (!l_threshold_value_state)
@@ -3773,7 +3771,7 @@ fapi2::ReturnCode PlatPmPPB::get_mvpd_poundW (void)
{
// These fields are 4 bits wide, and stored in a uint8, hence the shifting
// N_S, N_L, L_S, S_N
- FAPI_INF("iv_poundW_data.poundw[%d] VDM_FREQ_DROP N_S = %d",
+ FAPI_INF("iv_poundW_data.poundw[%d] VDM_FREQ_DROP N_S = %d",
p, ((iv_poundW_data.poundw[p].vdm_normal_freq_drop >> 4) & 0x0F));
FAPI_INF("iv_poundW_data.poundw[%d] VDM_FREQ_DROP N_L = %d",
p, ((iv_poundW_data.poundw[p].vdm_normal_freq_drop) & 0x0F));
@@ -3805,42 +3803,17 @@ fapi2::ReturnCode PlatPmPPB::get_mvpd_poundW (void)
}
}
- //Biased compare vid data
- fapi2::ATTR_VDM_VID_COMPARE_BIAS_0P5PCT_Type l_bias_value;
-
-
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDM_VID_COMPARE_BIAS_0P5PCT,
- iv_procChip,
- l_bias_value),
- "Error from FAPI_ATTR_GET for attribute ATTR_VDM_VID_COMPARE_BIAS_0P5PCT");
-
- float l_pound_w_points[NUM_OP_POINTS];
-
- for (uint8_t i = 0; i < NUM_OP_POINTS; i++)
- {
- l_pound_w_points[i] = calc_bias(l_bias_value[i]);
- l_vdm_compare_biased_mv[i] = internal_ceil( (l_vdm_compare_raw_mv[i] * l_pound_w_points[i]));
-
- if (l_vdm_compare_biased_mv[i] < MIN_VDM_VOLTAGE_IN_MV)
- {
- l_vdm_compare_biased_mv[i] = MIN_VDM_VOLTAGE_IN_MV;
- }
-
- iv_poundW_data.poundw[i].vdm_vid_compare_ivid =
- (l_vdm_compare_biased_mv[i] - VDM_VOLTAGE_IN_MV) >> 2;
-
- FAPI_INF("vdm_vid_compare_ivid %x %x, %x",
- iv_poundW_data.poundw[i].vdm_vid_compare_ivid,
- iv_poundW_data.poundw[i].vdm_vid_compare_ivid,
- l_pound_w_points[i]);
- }
//If we have reached this point, that means VDM is ok to be enabled. Only then we try to
//enable wov undervolting
- if ( ((iv_poundW_data.undervolt_tested == 1) || (iv_attrs.attr_wov_underv_force == 1)) &&
- is_wov_underv_enabled() == 1) {
+ if ( ((iv_poundW_data.resistance_data.r_undervolt_allowed == 1) || (iv_attrs.attr_wov_underv_force == 1)) &&
+ is_wov_underv_enabled() == 1 )
+ {
iv_wov_underv_enabled = true;
FAPI_INF("UNDERV_TESTED or UNDERV_FORCE set to 1");
- } else{
+ }
+
+ else
+ {
iv_wov_underv_enabled = false;
FAPI_INF("UNDERV_TESTED and UNDERV_FORCE set to 0");
}
@@ -3875,10 +3848,129 @@ fapi_try_exit:
} // end of get_mvpd_poundW
+fapi2::ReturnCode PlatPmPPB::validate_quad_spec_data( )
+{
+ auto l_eqChiplets = iv_procChip.getChildren<fapi2::TARGET_TYPE_EQ>(fapi2::TARGET_STATE_FUNCTIONAL);
+ uint8_t eqNum = 0;
+ const uint16_t VDM_VOLTAGE_IN_MV = 512;
+ const uint16_t VDM_GRANULARITY = 4;
+ const uint16_t MIN_VDM_VOLTAGE_IN_MV = 576;
+ const char* pv_op_str[NUM_OP_POINTS] = VPD_PV_ORDER_STR;
+ uint32_t l_vdm_compare_raw_mv[NUM_OP_POINTS];
+ uint32_t l_vdm_compare_biased_mv[NUM_OP_POINTS];
+
+ for( auto eq : l_eqChiplets )
+ {
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_UNIT_POS, eq, eqNum ));
+
+ for (int i = 0; i < NUM_OP_POINTS; ++i)
+ {
+ l_vdm_compare_raw_mv[i] = VDM_VOLTAGE_IN_MV + (iv_poundW_data.poundw[i].vdm_vid_compare_per_quad[eqNum] << 2);
+
+ FAPI_INF( "%10s Op Point [%d] vdm_vid_compare_per_quad[%d] %3d => %d mv",
+ pv_op_str[i], i, eqNum, iv_poundW_data.poundw[i].vdm_vid_compare_per_quad[eqNum],
+ l_vdm_compare_raw_mv[i] );
+ }
+
+ //Validation of VPD Data
+ //If all VID compares are zero then use #V VDD voltage to populate local
+ //data structure..So that we make progress in lab with early hardware
+ if ( !(iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_per_quad[eqNum]) &&
+ !(iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_per_quad[eqNum]) &&
+ !(iv_poundW_data.poundw[TURBO].vdm_vid_compare_per_quad[eqNum]) &&
+ !(iv_poundW_data.poundw[ULTRA].vdm_vid_compare_per_quad[eqNum]))
+ {
+ //vdm_vid_compare_per_quad[eqNum] will be in ivid units (eg HEX((Compare
+ //Voltage (mv) - 512mV)/4mV).
+ iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_per_quad[eqNum] =
+ (iv_poundV_raw_data.VddNomVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
+ iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_per_quad[eqNum] =
+ (iv_poundV_raw_data.VddPSVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
+ iv_poundW_data.poundw[TURBO].vdm_vid_compare_per_quad[eqNum] =
+ (iv_poundV_raw_data.VddTurboVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
+ iv_poundW_data.poundw[ULTRA].vdm_vid_compare_per_quad[eqNum] =
+ (iv_poundV_raw_data.VddUTurboVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
+ }//if any one of the VID compares are zero, then need to fail because of BAD VPD image.
+ else if ( !(iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_per_quad[eqNum]) ||
+ !(iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_per_quad[eqNum]) ||
+ !(iv_poundW_data.poundw[TURBO].vdm_vid_compare_per_quad[eqNum]) ||
+ !(iv_poundW_data.poundw[ULTRA].vdm_vid_compare_per_quad[eqNum]))
+ {
+ iv_vdm_enabled = false;
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_POUND_W_INVALID_VID_VALUE(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(iv_procChip)
+ .set_EQ_TARGET(eq)
+ .set_NOMINAL_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_per_quad[eqNum])
+ .set_POWERSAVE_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_per_quad[eqNum])
+ .set_TURBO_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[TURBO].vdm_vid_compare_per_quad[eqNum])
+ .set_ULTRA_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[ULTRA].vdm_vid_compare_per_quad[eqNum]),
+ "Pstate Parameter Block #W : one of the VID compare value is zero");
+ break;
+ }
+
+ // validate vid values
+ bool l_compare_vid_value_state = 1;
+ VALIDATE_VID_VALUES (iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_per_quad[eqNum],
+ iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_per_quad[eqNum],
+ iv_poundW_data.poundw[TURBO].vdm_vid_compare_per_quad[eqNum],
+ iv_poundW_data.poundw[ULTRA].vdm_vid_compare_per_quad[eqNum],
+ l_compare_vid_value_state);
+
+ if (!l_compare_vid_value_state)
+ {
+ iv_vdm_enabled = false;
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_POUND_W_INVALID_VID_ORDER(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(iv_procChip)
+ .set_EQ_TARGET(eq)
+ .set_NOMINAL_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[NOMINAL].vdm_vid_compare_per_quad[eqNum])
+ .set_POWERSAVE_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[POWERSAVE].vdm_vid_compare_per_quad[eqNum])
+ .set_TURBO_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[TURBO].vdm_vid_compare_per_quad[eqNum])
+ .set_ULTRA_VID_COMPARE_IVID_VALUE(iv_poundW_data.poundw[ULTRA].vdm_vid_compare_per_quad[eqNum]),
+ "Pstate Parameter Block #W VID compare data are not in increasing order");
+ break;
+ }
+
+ //Biased compare vid data
+ fapi2::ATTR_VDM_VID_COMPARE_BIAS_0P5PCT_Type l_bias_value;
+
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDM_VID_COMPARE_BIAS_0P5PCT,
+ iv_procChip,
+ l_bias_value),
+ "Error from FAPI_ATTR_GET for attribute ATTR_VDM_VID_COMPARE_BIAS_0P5PCT");
+
+ float l_pound_w_points[NUM_OP_POINTS];
+
+ for (uint8_t i = 0; i < NUM_OP_POINTS; i++)
+ {
+ l_pound_w_points[i] = calc_bias(l_bias_value[i]);
+ l_vdm_compare_biased_mv[i] = internal_ceil( (l_vdm_compare_raw_mv[i] * l_pound_w_points[i]));
+
+ if (l_vdm_compare_biased_mv[i] < MIN_VDM_VOLTAGE_IN_MV)
+ {
+ l_vdm_compare_biased_mv[i] = MIN_VDM_VOLTAGE_IN_MV;
+ }
+
+ iv_poundW_data.poundw[i].vdm_vid_compare_per_quad[eqNum] =
+ (l_vdm_compare_biased_mv[i] - VDM_VOLTAGE_IN_MV) >> 2;
+
+ FAPI_INF("vdm_vid_compare_per_quad[eqNum] %x %x, %x",
+ iv_poundW_data.poundw[i].vdm_vid_compare_per_quad[eqNum],
+ iv_poundW_data.poundw[i].vdm_vid_compare_per_quad[eqNum],
+ l_pound_w_points[i]);
+ }
+ }//for eq
+
+fapi_try_exit:
+ return fapi2::current_err;
+
+}
///////////////////////////////////////////////////////////
-//////// iddq_print
+//////// iddq_print
///////////////////////////////////////////////////////////
void iddq_print(IddqTable* i_iddqt)
{
@@ -4188,7 +4280,7 @@ void PlatPmPPB::load_mvpd_operating_point (vpd_type i_type)
iv_raw_vpd_pts[i].idd_100ma = (iv_attr_mvpd_poundV_raw[pv_op_order[i]].idd_100ma);
iv_raw_vpd_pts[i].vcs_mv = (iv_attr_mvpd_poundV_raw[pv_op_order[i]].vcs_mv);
iv_raw_vpd_pts[i].ics_100ma = (iv_attr_mvpd_poundV_raw[pv_op_order[i]].ics_100ma);
- iv_raw_vpd_pts[i].pstate = (iv_attr_mvpd_poundV_raw[ULTRA].frequency_mhz -
+ iv_raw_vpd_pts[i].pstate = (iv_attr_mvpd_poundV_raw[ULTRA].frequency_mhz -
iv_attr_mvpd_poundV_raw[pv_op_order[i]].frequency_mhz) * 1000 / (iv_frequency_step_khz);
FAPI_INF("PSTATE %x %x %d",iv_attr_mvpd_poundV_raw[ULTRA].frequency_mhz,iv_attr_mvpd_poundV_raw[pv_op_order[i]].frequency_mhz,iv_raw_vpd_pts[i].pstate);
}
@@ -4202,7 +4294,7 @@ void PlatPmPPB::load_mvpd_operating_point (vpd_type i_type)
iv_biased_vpd_pts[i].idd_100ma = (iv_attr_mvpd_poundV_biased[pv_op_order[i]].idd_100ma);
iv_biased_vpd_pts[i].vcs_mv = (iv_attr_mvpd_poundV_biased[pv_op_order[i]].vcs_mv);
iv_biased_vpd_pts[i].ics_100ma = (iv_attr_mvpd_poundV_biased[pv_op_order[i]].ics_100ma);
- iv_biased_vpd_pts[i].pstate = (iv_attr_mvpd_poundV_biased[ULTRA].frequency_mhz -
+ iv_biased_vpd_pts[i].pstate = (iv_attr_mvpd_poundV_biased[ULTRA].frequency_mhz -
iv_attr_mvpd_poundV_biased[pv_op_order[i]].frequency_mhz) * 1000 / (iv_frequency_step_khz);
}
}
@@ -4212,7 +4304,7 @@ void PlatPmPPB::load_mvpd_operating_point (vpd_type i_type)
///////////////////////////////////////////////////////////
-//////// vpd_init
+//////// vpd_init
///////////////////////////////////////////////////////////
fapi2::ReturnCode PlatPmPPB::vpd_init( void )
{
@@ -4304,7 +4396,7 @@ fapi_try_exit:
} // end of vpd_init
///////////////////////////////////////////////////////////
-//////// is_wov_underv_enabled
+//////// is_wov_underv_enabled
///////////////////////////////////////////////////////////
bool PlatPmPPB::is_wov_underv_enabled()
{
@@ -4315,7 +4407,7 @@ bool PlatPmPPB::is_wov_underv_enabled()
///--------------------------------------
///////////////////////////////////////////////////////////
-//////// is_wov_overv_enabled
+//////// is_wov_overv_enabled
///////////////////////////////////////////////////////////
bool PlatPmPPB::is_wov_overv_enabled()
{
@@ -4363,7 +4455,7 @@ bool PlatPmPPB::is_vdm_enabled()
///////////////////////////////////////////////////////////
-//////// isPstateModeEnabled
+//////// isPstateModeEnabled
///////////////////////////////////////////////////////////
bool PlatPmPPB::isPstateModeEnabled()
{
@@ -4373,7 +4465,7 @@ bool PlatPmPPB::isPstateModeEnabled()
///////////////////////////////////////////////////////////
-//////// isEqChipletPresent
+//////// isEqChipletPresent
///////////////////////////////////////////////////////////
bool PlatPmPPB::isEqChipletPresent ()
{
@@ -4382,7 +4474,7 @@ bool PlatPmPPB::isEqChipletPresent ()
///////////////////////////////////////////////////////////
-//////// large_jump_interpolate
+//////// large_jump_interpolate
///////////////////////////////////////////////////////////
uint32_t PlatPmPPB::large_jump_interpolate(const Pstate i_pstate,
const Pstate i_ps_pstate)
@@ -4603,15 +4695,18 @@ fapi_try_exit:
///////////////////////////////////////////////////////////
//////// gppb_print
///////////////////////////////////////////////////////////
-void gppb_print(GlobalPstateParmBlock* i_gppb)
+fapi2::ReturnCode gppb_print(GlobalPstateParmBlock* i_gppb, const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target )
{
- static const uint32_t BUFFSIZE = 256;
+ static const uint32_t BUFFSIZE = 512;
char l_buffer[BUFFSIZE];
char l_temp_buffer[BUFFSIZE];
char l_temp_buffer1[BUFFSIZE];
const char* pv_op_str[NUM_OP_POINTS] = PV_OP_ORDER_STR;
const char* thresh_op_str[NUM_THRESHOLD_POINTS] = VPD_THRESHOLD_ORDER_STR;
const char* slope_region_str[VPD_NUM_SLOPES_REGION] = VPD_OP_SLOPES_REGION_ORDER_STR;
+ auto l_eqChiplets = i_target.getChildren<fapi2::TARGET_TYPE_EQ>(fapi2::TARGET_STATE_FUNCTIONAL);
+ uint8_t eqPos = 0;
+ int l_len = strlen(l_buffer);
// Put out the endian-corrected scalars
FAPI_INF("---------------------------------------------------------------------------------------");
FAPI_INF("Global Pstate Parameter Block @ %p", i_gppb);
@@ -4799,10 +4894,29 @@ void gppb_print(GlobalPstateParmBlock* i_gppb)
}
FAPI_INF ("VID Operating Points");
- for (auto i = 0; i < NUM_OP_POINTS; ++i)
+ for( auto eq : l_eqChiplets )
{
- sprintf (l_buffer, " %-16s : %02X ",pv_op_str[i], i_gppb->vid_point_set[i]);
- FAPI_INF("%s", l_buffer);
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_UNIT_POS, eq, eqPos ));
+ strcpy(l_buffer,"");
+ strcpy(l_temp_buffer, "");
+
+ //FIXME avoiding changes in GPSPB to address compatibility issues between
+ //hardware image and HWP
+ for (auto i = 0; i < NUM_OP_POINTS; ++i)
+ {
+ //sprintf (l_buffer, "Q[%d] %-16s : %02X ", eqPos, pv_op_str[i], i_gppb->vid_point_set[eqPos][i]);
+ //FAPI_INF("%s", l_buffer);
+ }
+
+ for (auto j = 0; j < VPD_NUM_SLOPES_REGION; ++j)
+ {
+ //sprintf(l_temp_buffer1, "%04X",
+ // revle16(i_gppb->PsVIDCompSlopes[eqPos][j]));
+ //CENTER_STR(l_temp_buffer, l_temp_buffer1, 8);
+ //strcat(l_buffer, l_temp_buffer);
+ }
+
+ //FAPI_INF("%s", l_buffer);
}
sprintf(l_buffer, "%-25s", "Thrshod Op Points: ");
@@ -4828,7 +4942,6 @@ void gppb_print(GlobalPstateParmBlock* i_gppb)
}
sprintf(l_buffer, "VID Compare Slopes:");
- int l_len = strlen(l_buffer);
for (auto j = 0; j < VPD_NUM_SLOPES_REGION; ++j)
{
sprintf(l_temp_buffer1, "%s", prt_region_names[j]);
@@ -4838,14 +4951,6 @@ void gppb_print(GlobalPstateParmBlock* i_gppb)
FAPI_INF("%s", l_buffer);
sprintf( l_buffer, "%*s", l_len+6," ");
- for (auto j = 0; j < VPD_NUM_SLOPES_REGION; ++j)
- {
- sprintf(l_temp_buffer1, "%04X",
- revle16(i_gppb->PsVIDCompSlopes[j]));
- CENTER_STR(l_temp_buffer, l_temp_buffer1, 8);
- strcat(l_buffer, l_temp_buffer);
- }
- FAPI_INF("%s", l_buffer);
sprintf(l_buffer, "%-18s", "VDM Thrshld Slopes:");
for (auto j = 0; j < VPD_NUM_SLOPES_REGION; ++j)
@@ -4932,6 +5037,8 @@ void gppb_print(GlobalPstateParmBlock* i_gppb)
}
FAPI_INF("---------------------------------------------------------------------------------------");
+fapi_try_exit:
+ return fapi2::current_err;
} // end of gppb_print
@@ -5091,5 +5198,4 @@ void oppb_print(OCCPstateParmBlock* i_oppb)
FAPI_INF("---------------------------------------------------------------------------------------");
} // end of oppb_print
-
// *INDENT-ON*
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H b/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H
index 971a7be99..339c47810 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H
@@ -42,7 +42,7 @@
#include <p9_pstates_occ.h>
#include "p9_pm_get_poundv_bucket.H"
#include "p9_pm_get_poundw_bucket.H"
-
+#include <p9_hcd_memmap_base.H>
//Pstate SuperStructure
typedef struct
@@ -54,7 +54,7 @@ typedef struct
GlobalPstateParmBlock globalppb;
// CME content
- LocalPstateParmBlock localppb;
+ LocalPstateParmBlock localppb[MAX_QUADS_PER_CHIP];
// OCC content
OCCPstateParmBlock occppb;
@@ -247,21 +247,21 @@ class PlatPmPPB
/// -----------------------------------------------------------------------
/// @brief Initialize VPD data
- // @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ // @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode vpd_init();
/// -----------------------------------------------------------------------
/// @brief Initialize resclk data
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode resclk_init();
/// -----------------------------------------------------------------------
/// @brief Initialize WOF data
/// @param[out] o_buf points to WOF data
- /// @param[inout] io_size size of the wof table
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @param[inout] io_size size of the wof table
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode wof_init(
uint8_t* o_buf,
@@ -269,19 +269,19 @@ class PlatPmPPB
/// -----------------------------------------------------------------------
/// @brief Initialize global pstate parameter block
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode gppb_init( GlobalPstateParmBlock* i_globalppb);
/// -----------------------------------------------------------------------
/// @brief Initialize local pstate parameter block
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode lppb_init(LocalPstateParmBlock* i_localppb);
/// -----------------------------------------------------------------------
/// @brief Initialize occ pstate parameter block
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode oppb_init(OCCPstateParmBlock* i_occppb);
@@ -289,11 +289,11 @@ class PlatPmPPB
/// @brief VDM initializtion based on #W data
/// @return none
/// -----------------------------------------------------------------------
- void vdm_init( void );
+ fapi2::ReturnCode vdm_init( void );
/// -----------------------------------------------------------------------
/// @brief Safe mode frquency and voltage init
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode safe_mode_init( void );
@@ -301,7 +301,7 @@ class PlatPmPPB
/// @brief VFRT data initialization from WOF data
/// @param[in] i_pBuffer WOF data buffer
/// @param[inout] o_vfrt_data vfrt data
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode update_vfrt(
uint8_t* i_pBuffer,
@@ -309,43 +309,43 @@ class PlatPmPPB
/// -----------------------------------------------------------------------
/// @brief Compute and apply biased values
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode get_extint_bias();
/// -----------------------------------------------------------------------
/// @brief apply biased values for #V data
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode apply_biased_values();
/// -----------------------------------------------------------------------
/// @brief Read IQ vpd data
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode get_mvpd_iddq( void );
/// -----------------------------------------------------------------------
/// @brief Read #W(VDM) vpd data
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode get_mvpd_poundW (void);
/// -----------------------------------------------------------------------
/// @brief Read IVRM data from attributes
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode get_ivrm_parms ();
/// -----------------------------------------------------------------------
/// @brief Set resclk attribute values
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode set_resclk_table_attrs();
/// -----------------------------------------------------------------------
/// @brief Compute and setup resclk values
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode res_clock_setup (void);
@@ -358,7 +358,7 @@ class PlatPmPPB
/// -----------------------------------------------------------------------
/// @brief Compute safe mode values
/// @param[in] i_action voltage config action (Compute/set)
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode compute_boot_safe(
const VoltageConfigActions_t i_action);
@@ -373,7 +373,7 @@ class PlatPmPPB
/// -----------------------------------------------------------------------
/// @brief This will set the pstate feature attrbutes(VDM,RESCLK,VRM,WOF)
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode set_global_feature_attributes();
@@ -410,14 +410,14 @@ class PlatPmPPB
/// -----------------------------------------------------------------------
/// @brief Read #V data form module vpd
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode get_mvpd_poundV();
/// -----------------------------------------------------------------------
/// @brief Validate #V data
/// @param[in] i_biased_state present/nonpresent
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode chk_valid_poundv(
const bool i_biased_state);
@@ -431,8 +431,9 @@ class PlatPmPPB
/// -----------------------------------------------------------------------
/// @brief Converts frequency value to pstate number
/// @param[in] i_freq_khz input frequency
- /// @param[out] o_pstate pstate output for a given inut frequency
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @param[out] pstate pstate output for a given inut frequency
+ /// @param[in] i_round p-state rounding strategy
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
int freq2pState (const uint32_t freq_khz,
Pstate* pstate,
@@ -440,9 +441,9 @@ class PlatPmPPB
/// -----------------------------------------------------------------------
/// @brief Compute safe mode values
- /// @param[in] i_pstate pstate value
+ /// @param[in] i_ps_state pstate value
/// @param[out] o_safe_mode_values safe mode freq/voltage values
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
fapi2::ReturnCode safe_mode_computation(
const Pstate i_ps_pstate,
@@ -451,7 +452,7 @@ class PlatPmPPB
/// -----------------------------------------------------------------------
/// @brief Convert pstate to voltage
/// @param[in] i_pstate pstate value that needs to be converted
- /// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
uint32_t ps2v_mv(const Pstate i_pstate);
@@ -474,16 +475,16 @@ class PlatPmPPB
/// -----------------------------------------------------------------------
/// @brief Compute VID compare slope values for a given pstate
/// @param[in] i_pstate pstate value
- /// @return none
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
- void compute_PsVIDCompSlopes_slopes(
+ fapi2::ReturnCode compute_PsVIDCompSlopes_slopes(
uint8_t* i_pstate);
/// -----------------------------------------------------------------------
/// @brief Compute VDM threshold points for different regions
- /// @return none
+ /// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
- void compute_vdm_threshold_pts();
+ fapi2::ReturnCode compute_vdm_threshold_pts();
/// -----------------------------------------------------------------------
/// @brief Compute bias value for pre-defined percentage unit
@@ -685,8 +686,10 @@ class PlatPmPPB
}
#endif
+ private: //function
+ fapi2::ReturnCode validate_quad_spec_data( );
- private:
+ private: //data
fapi2::Target< fapi2::TARGET_TYPE_PROC_CHIP > iv_procChip; // processor chip target
AttributeList iv_attrs; // Pstate attributes list
VpdOperatingPoint iv_raw_vpd_pts[NUM_OP_POINTS]; // Raw vpd operating points
@@ -718,14 +721,14 @@ class PlatPmPPB
VpdPoint iv_attr_mvpd_poundV_raw[5];
VpdPoint iv_attr_mvpd_poundV_biased[5];
- PoundW_data iv_poundW_data;
+ PoundW_data_per_quad iv_poundW_data;
IddqTable iv_iddqt;
GP_VDMParmBlock iv_vdmpb;
IvrmParmBlock iv_ivrmpb;
ResonantClockingSetup iv_resclk_setup;
- CompareVIDPoints iv_vid_point_set[NUM_OP_POINTS];
+ CompareVIDPoints iv_vid_point_set[MAX_QUADS_PER_CHIP][NUM_OP_POINTS];
uint8_t iv_threshold_set[NUM_OP_POINTS][NUM_THRESHOLD_POINTS];
- int16_t iv_PsVIDCompSlopes[VPD_NUM_SLOPES_REGION];
+ int16_t iv_PsVIDCompSlopes[MAX_QUADS_PER_CHIP][VPD_NUM_SLOPES_REGION];
int16_t iv_PsVDMThreshSlopes[VPD_NUM_SLOPES_REGION][NUM_THRESHOLD_POINTS];
uint8_t iv_jump_value_set[NUM_OP_POINTS][NUM_JUMP_VALUES];
int16_t iv_PsVDMJumpSlopes[VPD_NUM_SLOPES_REGION][NUM_JUMP_VALUES];
@@ -747,10 +750,10 @@ extern "C"
/// -------------------------------------------------------------------
/// @brief Print a GlobalPstateParameterBlock structure on a given stream
/// @param[in] i_gppb The Global Pstate Parameter Block to print
-/// @return void
+/// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -------------------------------------------------------------------
- void
- gppb_print(GlobalPstateParmBlock* i_gppb);
+ fapi2::ReturnCode gppb_print(GlobalPstateParmBlock* i_gppb,
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target );
/// -------------------------------------------------------------------
@@ -778,7 +781,7 @@ extern "C"
/// @param[inout] *io_pss => pointer to pstate superstructure
/// @param[out] *o_buf => wof table data
/// @param[inout] &io_size => wof table data size
-/// @return FAPI2::SUCCESS
+/// @return fapi2::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -------------------------------------------------------------------
fapi2::ReturnCode
p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
OpenPOWER on IntegriCloud