From 58df73fd107419526422d2075e5085253a5202d2 Mon Sep 17 00:00:00 2001 From: Prem Shanker Jha Date: Thu, 28 Mar 2019 04:40:12 -0500 Subject: 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 Tested-by: Jenkins Server Tested-by: HWSV CI Tested-by: PPE CI Tested-by: Hostboot CI Reviewed-by: RANGANATHPRASAD G. BRAHMASAMUDRA Reviewed-by: Gregory S. Still Reviewed-by: Jennifer A. Stofer Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/75278 Reviewed-by: Jenkins Server Reviewed-by: Daniel M. Crowell Tested-by: Daniel M. Crowell --- .../p9/procedures/hwp/pm/p9_hcode_image_build.C | 304 ++++++--- .../p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.C | 40 +- .../p9/procedures/hwp/pm/p9_pm_get_poundw_bucket.H | 4 +- .../hwp/pm/p9_pm_get_poundw_bucket_attr.C | 8 +- .../hwp/pm/p9_pm_get_poundw_bucket_attr.H | 18 +- .../procedures/hwp/pm/p9_pstate_parameter_block.C | 696 ++++++++++++--------- .../procedures/hwp/pm/p9_pstate_parameter_block.H | 83 +-- 7 files changed, 717 insertions(+), 436 deletions(-) (limited to 'src/import/chips/p9/procedures/hwp/pm') 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 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_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_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 #include +#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& 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 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& i_ uint8_t* o_buf, uint32_t& io_size) { - FAPI_DBG("> p9_pstate_parameter_block"); + FAPI_IMP("> p9_pstate_parameter_block"); const fapi2::Target FAPI_SYSTEM; fapi2::ReturnCode l_rc = 0; io_size = 0; @@ -278,8 +280,8 @@ p9_pstate_parameter_block( const fapi2::Target& 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& 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& 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& 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_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_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_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(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_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& 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_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 #include "p9_pm_get_poundv_bucket.H" #include "p9_pm_get_poundw_bucket.H" - +#include //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& 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& i_target, -- cgit v1.2.1