diff options
author | Thi Tran <thi@us.ibm.com> | 2013-11-16 10:18:52 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2013-11-17 07:01:36 -0600 |
commit | c06963091b4d2a4939ad188c46cf318e410a05c2 (patch) | |
tree | 73c093c929101a83c3b7904aad4b5ef2dcab489b | |
parent | 0aa07166a88d364770410dce63437b23217ef978 (diff) | |
download | talos-hostboot-c06963091b4d2a4939ad188c46cf318e410a05c2.tar.gz talos-hostboot-c06963091b4d2a4939ad188c46cf318e410a05c2.zip |
INITPROC: Hostboot - SW233072 p8_build_pstate_datablock
Change-Id: I3d6a3485070b715a236d08fefd8595db4830d6d5
CMVC-Coreq:906819
CQ:SW233072
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/7282
Reviewed-by: Thi N. Tran <thi@us.ibm.com>
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
-rw-r--r-- | src/usr/hwpf/hwp/proc_chip_ec_feature.xml | 98 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/pstates/makefile | 2 | ||||
-rwxr-xr-x | src/usr/hwpf/hwp/pstates/pstates/p8_build_pstate_datablock.C | 181 | ||||
-rwxr-xr-x | src/usr/hwpf/hwp/pstates/pstates/p8_build_pstate_datablock.H | 3 |
4 files changed, 226 insertions, 58 deletions
diff --git a/src/usr/hwpf/hwp/proc_chip_ec_feature.xml b/src/usr/hwpf/hwp/proc_chip_ec_feature.xml index 73290df8f..1e8f68c2f 100644 --- a/src/usr/hwpf/hwp/proc_chip_ec_feature.xml +++ b/src/usr/hwpf/hwp/proc_chip_ec_feature.xml @@ -20,7 +20,7 @@ <!-- Origin: 30 --> <!-- --> <!-- IBM_PROLOG_END_TAG --> -<!-- $Id: proc_chip_ec_feature.xml,v 1.37 2013/10/31 16:02:44 jmcgill Exp $ --> +<!-- $Id: proc_chip_ec_feature.xml,v 1.42 2013/11/14 17:02:12 stillgs Exp $ --> <!-- Defines the attributes that are based on EC level --> <attributes> <attribute> @@ -833,4 +833,100 @@ </chip> </chipEcFeature> </attribute> + <attribute> + <id>ATTR_CHIP_EC_FEATURE_ZCAL_OVERRIDE</id> + <targetType>TARGET_TYPE_PROC_CHIP</targetType> + <description> + True if: + Murano EC less than 0x20 + </description> + <chipEcFeature> + <chip> + <name>ENUM_ATTR_NAME_MURANO</name> + <ec> + <value>0x20</value> + <test>LESS_THAN</test> + </ec> + </chip> + </chipEcFeature> + </attribute> + <attribute> + <id>ATTR_CHIP_EC_FEATURE_IVRM_WINKLE_BUG</id> + <targetType>TARGET_TYPE_PROC_CHIP</targetType> + <description> + True if: + Murano EC greater than 0x20 + Venice EC greater than or equal to 0x20 + </description> + <chipEcFeature> + <chip> + <name>ENUM_ATTR_NAME_MURANO</name> + <ec> + <value>0x20</value> + <test>GREATER_THAN</test> + </ec> + </chip> + <chip> + <name>ENUM_ATTR_NAME_VENICE</name> + <ec> + <value>0x20</value> + <test>GREATER_THAN_OR_EQUAL</test> + </ec> + </chip> + </chipEcFeature> + </attribute> + <attribute> + <id>ATTR_PROC_EC_MSS_RECONFIG_POSSIBLE</id> + <targetType>TARGET_TYPE_PROC_CHIP</targetType> + <description> + </description> + <chipEcFeature> + <chip> + <name>ENUM_ATTR_NAME_MURANO</name> + <ec> + <value>0x20</value> + <test>GREATER_THAN_OR_EQUAL</test> + </ec> + </chip> + <chip> + <name>ENUM_ATTR_NAME_VENICE</name> + <ec> + <value>0x20</value> + <test>GREATER_THAN_OR_EQUAL</test> + </ec> + </chip> + </chipEcFeature> + </attribute> + <attribute> + <id>ATTR_PROC_EC_THROTTLE_SYNC_POSSIBLE</id> + <targetType>TARGET_TYPE_PROC_CHIP</targetType> + <description> + </description> + <chipEcFeature> + <chip> + <name>ENUM_ATTR_NAME_CENTAUR</name> + <ec> + <value>0x20</value> + <test>GREATER_THAN_OR_EQUAL</test> + </ec> + </chip> + </chipEcFeature> + </attribute> + <attribute> + <id>ATTR_PROC_EC_CORE_HANG_PULSE_BUG</id> + <targetType>TARGET_TYPE_PROC_CHIP</targetType> + <description> + True if chip has the core hang pulse bug (HW235625) + Murano EC less than 0x20 + </description> + <chipEcFeature> + <chip> + <name>ENUM_ATTR_NAME_MURANO</name> + <ec> + <value>0x20</value> + <test>LESS_THAN</test> + </ec> + </chip> + </chipEcFeature> + </attribute> </attributes> diff --git a/src/usr/hwpf/hwp/pstates/makefile b/src/usr/hwpf/hwp/pstates/makefile index 529f366a6..80e3d6caf 100644 --- a/src/usr/hwpf/hwp/pstates/makefile +++ b/src/usr/hwpf/hwp/pstates/makefile @@ -41,6 +41,8 @@ EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/pstates ## NOTE: add a new EXTRAINCDIR when you add a new HWP ##@ EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/??? EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/pstates/pstates +EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/build_winkle_images/p8_set_pore_bar/ + ## NOTE: add new object files when you add a new HWP OBJS = gpstCheckByte.o \ diff --git a/src/usr/hwpf/hwp/pstates/pstates/p8_build_pstate_datablock.C b/src/usr/hwpf/hwp/pstates/pstates/p8_build_pstate_datablock.C index 677f12b72..28711de88 100755 --- a/src/usr/hwpf/hwp/pstates/pstates/p8_build_pstate_datablock.C +++ b/src/usr/hwpf/hwp/pstates/pstates/p8_build_pstate_datablock.C @@ -20,7 +20,7 @@ /* Origin: 30 */ /* */ /* IBM_PROLOG_END_TAG */ -// $Id: p8_build_pstate_datablock.C,v 1.24 2013/10/30 17:35:53 jimyac Exp $ +// $Id: p8_build_pstate_datablock.C,v 1.27 2013/11/14 20:45:55 jimyac Exp $ // $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/p8_build_pstate_datablock.C,v $ //------------------------------------------------------------------------------ // *! (C) Copyright International Business Machines Corp. 2012 @@ -50,7 +50,7 @@ #include "pstate_tables.h" #include "lab_pstates.h" #include "pstates.h" - +#include "p8_pm.H" #include "p8_build_pstate_datablock.H" extern "C" { @@ -60,7 +60,7 @@ using namespace fapi; // ---------------------------------------------------------------------- // Function prototypes // ---------------------------------------------------------------------- -ReturnCode proc_get_mvpd_data (const Target& i_target, uint32_t attr_mvpd_data[PV_D][PV_W], ivrm_mvpd_t *ivrm_mvpd, uint8_t *present_chiplets, uint8_t *functional_chiplets); +ReturnCode proc_get_mvpd_data (const Target& i_target, uint32_t attr_mvpd_data[PV_D][PV_W], ivrm_mvpd_t *ivrm_mvpd, uint8_t *present_chiplets, uint8_t *functional_chiplets, uint8_t *poundm_valid); ReturnCode proc_get_attributes (const Target& i_target, AttributeList *attr_list); ReturnCode proc_get_extint_bias (uint32_t attr_mvpd_data[PV_D][PV_W], const AttributeList *attr, double *volt_int_vdd_bias, double *volt_int_vcs_bias); ReturnCode proc_boost_gpst (PstateSuperStructure *pss, uint32_t attr_boost_percent); @@ -85,9 +85,12 @@ p8_build_pstate_datablock(const Target& i_target, AttributeList attr; ChipCharacterization* characterization; - uint8_t i = 0; - uint8_t present_chiplets = 0; - uint8_t functional_chiplets = 0; + uint8_t i = 0; + uint8_t present_chiplets = 0; + uint8_t functional_chiplets = 0; + uint8_t poundm_valid = 1; // assume valid until code determines invalid + uint8_t lpst_valid = 1; // assume valid until code determines invalid + uint8_t attr_pm_ivrms_enabled = 0; const uint8_t pv_op_order[S132A_POINTS] = PV_OP_ORDER; @@ -100,10 +103,9 @@ p8_build_pstate_datablock(const Target& i_target, ivrm_mvpd_t ivrm_mvpd; FAPI_INF("Executing p8_build_pstate_datablock ...."); - + do { - // ----------------------------------------------------------- // Clear the PstateSuperStructure and install the magic number // ----------------------------------------------------------- @@ -121,6 +123,23 @@ p8_build_pstate_datablock(const Target& i_target, // calculate pstate frequency step in Khz frequency_step_khz = (attr.attr_freq_proc_refclock * 1000)/attr.attr_proc_dpll_divider; + // -------------------------------- + // check chip ec feature attributes + // -------------------------------- + if (attr.attr_proc_ec_core_hang_pulse_bug) { + FAPI_INF("ATTR_PROC_EC_CORE_HANG_PULSE_BUG is set so disable iVRMs - setting PSTATE_NO_INSTALL_LPSA"); + (*io_pss).gpst.options.options = revle32(revle32((*io_pss).gpst.options.options) | + PSTATE_NO_INSTALL_LPSA); + poundm_valid = 0; + lpst_valid = 0; + } + + if (! attr.attr_chip_ec_feature_resonant_clk_valid) { + FAPI_INF("ATTR_CHIP_EC_FEATURE_RESONANT_CLK_VALID is not set so disable resonant clocking - setting PSTATE_NO_INSTALL_RESCLK"); + (*io_pss).gpst.options.options = revle32(revle32((*io_pss).gpst.options.options) | + PSTATE_NO_INSTALL_RESCLK ); + } + // ---------------- // get #V & #M data // ---------------- @@ -130,18 +149,28 @@ p8_build_pstate_datablock(const Target& i_target, memset(attr_mvpd_voltage_control, 0, sizeof(attr_mvpd_voltage_control)); memset(&ivrm_mvpd, 0, sizeof(ivrm_mvpd)); - l_rc = proc_get_mvpd_data(i_target, attr_mvpd_voltage_control, &ivrm_mvpd, &present_chiplets, &functional_chiplets); + l_rc = proc_get_mvpd_data(i_target, attr_mvpd_voltage_control, &ivrm_mvpd, &present_chiplets, &functional_chiplets, £m_valid); if (l_rc) { break; } - else if (present_chiplets == 0) { + else if (!present_chiplets) { FAPI_ERR("**** ERROR : There are no cores present"); FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_NO_CORES_PRESENT_ERROR); break; } - else if (functional_chiplets == 0) { - FAPI_IMP("No FUNCTIONAL chiplets found - local pstate data is not valid"); - // indicate not LPST installed in PSS + + if (!functional_chiplets || !poundm_valid) { + + if (!functional_chiplets) + { + FAPI_IMP("No FUNCTIONAL chiplets found - set PSTATE_NO_INSTALL_LPSA"); + } + else + { + FAPI_IMP("Invalid #M found - set PSTATE_NO_INSTALL_LPSA"); + } + + // indicate no LPST installed in PSS (*io_pss).gpst.options.options = revle32(revle32((*io_pss).gpst.options.options) | PSTATE_NO_INSTALL_LPSA); } @@ -295,34 +324,38 @@ p8_build_pstate_datablock(const Target& i_target, // ----------------------------- // Create the Local Pstate table // ----------------------------- - FAPI_IMP("Creating Local Pstate Table"); - - rc = lpst_create( &((*io_pss).gpst), &((*io_pss).lpsa), DEAD_ZONE_5MV, volt_int_vdd_bias, volt_int_vcs_bias); - - int & LPST_RETURN_CODE = rc; - if (rc == -LPST_INVALID_OBJECT) { - FAPI_ERR("**** ERROR : lpst_create was passed null pointer to gpst or lpsa"); - FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_LPST_CREATE_OBJECT_ERROR); - break; - } - else if (rc == -IVID_INVALID_VOLTAGE) { - FAPI_ERR("**** ERROR : lpst_create attempted to convert an invalid voltage value to ivid format (GT 1.39375V or LT 0.6V"); - FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_LPST_CREATE_IVID_ERROR); - break; - } - else if (rc == -LPST_GPST_WARNING) { - FAPI_IMP("No Local Pstate Generated - Global Pstate Table is completely within Deadzone" ); + + if (! attr.attr_proc_ec_core_hang_pulse_bug) { + FAPI_IMP("Creating Local Pstate Table"); + + rc = lpst_create( &((*io_pss).gpst), &((*io_pss).lpsa), DEAD_ZONE_5MV, volt_int_vdd_bias, volt_int_vcs_bias); + + int & LPST_RETURN_CODE = rc; + if (rc == -LPST_INVALID_OBJECT) { + FAPI_ERR("**** ERROR : lpst_create was passed null pointer to gpst or lpsa"); + FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_LPST_CREATE_OBJECT_ERROR); + break; + } + else if (rc == -IVID_INVALID_VOLTAGE) { + FAPI_ERR("**** ERROR : lpst_create attempted to convert an invalid voltage value to ivid format (GT 1.39375V or LT 0.6V"); + FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_LPST_CREATE_IVID_ERROR); + break; + } + else if (rc == -LPST_GPST_WARNING) { + FAPI_IMP("No Local Pstate Generated - Global Pstate Table is completely within Deadzone" ); - // indicate not LPST installed in PSS - (*io_pss).gpst.options.options = revle32(revle32((*io_pss).gpst.options.options) | - PSTATE_NO_INSTALL_LPSA); - } - else if (rc) { - FAPI_ERR("**** ERROR : lpst_create returned error rc = %d", rc ); - FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_LPST_CREATE_ERROR); - break; + // indicate no LPST installed in PSS + (*io_pss).gpst.options.options = revle32(revle32((*io_pss).gpst.options.options) | + PSTATE_NO_INSTALL_LPSA); + lpst_valid = 0; + } + else if (rc) { + FAPI_ERR("**** ERROR : lpst_create returned error rc = %d", rc ); + FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_LPST_CREATE_ERROR); + break; + } } - + // ----------------------- // Create VDS & VIN tables // ----------------------- @@ -388,21 +421,43 @@ p8_build_pstate_datablock(const Target& i_target, l_rc = proc_res_clock (io_pss, &attr); if (l_rc) break; } - else { - (*io_pss).gpst.options.options = revle32(revle32((*io_pss).gpst.options.options) | - PSTATE_NO_INSTALL_RESCLK ); - - } // ------------------------ // Force optional overrides // ------------------------ (*io_pss).gpst.options.options = revle32(revle32((*io_pss).gpst.options.options) | PSTATE_FORCE_INITIAL_PMIN); - + + // ------------------- // Attributes to write // ------------------- // uint32_t ATTR_PM_PSTATE0_FREQUENCY // Binary in Khz + FAPI_IMP("Writing Attribute Values"); + + // check to see if IVRMs should be enabled based on VPD findings + if (poundm_valid && lpst_valid) + attr_pm_ivrms_enabled = 1; + else + attr_pm_ivrms_enabled = 0; + + SETATTR(l_rc, ATTR_PM_IVRMS_ENABLED, "ATTR_PM_IVRMS_ENABLED", &i_target, attr_pm_ivrms_enabled); + + // Read back attribute to see if overridden + GETATTR (l_rc, ATTR_PM_IVRMS_ENABLED, "ATTR_PM_IVRMS_ENABLED", &i_target, attr_pm_ivrms_enabled); + + if (attr_pm_ivrms_enabled && (!poundm_valid || !lpst_valid)) { + FAPI_INF("WARNING : Attribute ATTR_PM_IVRMS_ENABLED was overridden to 1, but #V or #M data is not valid for IVRMs"); + // indicate no LPST installed in PSS + (*io_pss).gpst.options.options = revle32(revle32((*io_pss).gpst.options.options) | + PSTATE_NO_INSTALL_LPSA); + } + else if (!attr_pm_ivrms_enabled && poundm_valid && lpst_valid) { + FAPI_INF("WARNING : ATTR_PM_IVRMS_ENABLED was overriden to 0, but #V or #M data are valid - set PSTATE_NO_INSTALL_LPSA"); + // indicate no LPST installed in PSS + (*io_pss).gpst.options.options = revle32(revle32((*io_pss).gpst.options.options) | + PSTATE_NO_INSTALL_LPSA); + } + } while(0); return l_rc; @@ -486,6 +541,7 @@ ReturnCode proc_get_attributes(const Target& i_target, // Read chip ec feature DATABLOCK_GET_ATTR(ATTR_CHIP_EC_FEATURE_RESONANT_CLK_VALID, &i_target, attr_chip_ec_feature_resonant_clk_valid); + DATABLOCK_GET_ATTR(ATTR_PROC_EC_CORE_HANG_PULSE_BUG , &i_target, attr_proc_ec_core_hang_pulse_bug); // -------------------------------------------------------------- // do basic attribute value checking and generate error if needed @@ -618,7 +674,8 @@ ReturnCode proc_get_mvpd_data(const Target& i_target, uint32_t attr_mvpd_data[PV_D][PV_W], ivrm_mvpd_t *ivrm_mvpd, uint8_t *present_chiplets, - uint8_t *functional_chiplets) + uint8_t *functional_chiplets, + uint8_t *poundm_valid) { ReturnCode l_rc; std::vector<fapi::Target> l_exChiplets; @@ -673,7 +730,10 @@ ReturnCode proc_get_mvpd_data(const Target& i_target, // set l_record to appropriate lprx record (add core number to lrp0) l_record = (uint32_t)fapi::MVPD_RECORD_LRP0 + l_chipNum; - + + // clear out buffer to known value before calling fapiGetMvpdField + memset(l_buffer, 0, 512); + // Get Chiplet MVPD data and put in chiplet_mvpd_data using accessor function l_rc = fapiGetMvpdField((fapi::MvpdRecord)l_record, fapi::MVPD_KEYWORD_PDV, @@ -771,6 +831,9 @@ ReturnCode proc_get_mvpd_data(const Target& i_target, if ( l_functional ) { *functional_chiplets = 1; + // clear out buffer to known value before calling fapiGetMvpdField + memset(l_buffer_pdm, 0, 512); + // Get Chiplet #M MVPD data l_rc = fapiGetMvpdField((fapi::MvpdRecord)l_record, fapi::MVPD_KEYWORD_PDM, @@ -778,8 +841,8 @@ ReturnCode proc_get_mvpd_data(const Target& i_target, l_buffer_pdm, l_bufferSize_pdm); if (!l_rc.ok()) { - FAPI_ERR("**** ERROR : Unexpected error encountered in fapiGetMvpdField"); - break; + FAPI_INF("**** Warning : Unexpected error encountered in fapiGetMvpdField - IVRMs will not be enabled"); + *poundm_valid = 0; } // check buffer size @@ -818,6 +881,15 @@ ReturnCode proc_get_mvpd_data(const Target& i_target, ivrm_mvpd->data.ex[j].point[i].drain_current = cal_data[3]; FAPI_INF("#M data (hex & dec) = 0x%04x 0x%04x 0x%04x 0x%04x %5u %5u %5u %5u", cal_data[0], cal_data[1], cal_data[2], cal_data[3], cal_data[0], cal_data[1], cal_data[2], cal_data[3]); + + // #M validity check - not valid if any measurements are 0 + if (cal_data[0] == 0 || cal_data[1] == 0 || + cal_data[2] == 0 || cal_data[3] == 0 ) + { + FAPI_INF("**** Warning : #M has zero valued measurements - IVRMs will not be enabled"); + *poundm_valid = 0; + } + } // set number of samples to 13 @@ -1084,13 +1156,10 @@ ReturnCode proc_chk_valid_poundv(const uint32_t poundv_data[PV_D][PV_W], // check valid operating points' values have this relationship (power save <= nominal <= turbo) for (i = 1; i <= S132A_POINTS-1; i++) { - FAPI_INF("Checking for relationship between #V operating point(%s <= %s) f=%u <= f=%u v=%u <= v=%u i=%u <= i=%u v=%u <= v=%u i=%u <= i=%u", - pv_op_str[pv_op_order[i-1]], pv_op_str[pv_op_order[i]], - poundv_data[pv_op_order[i-1]][0], poundv_data[pv_op_order[i]][0], - poundv_data[pv_op_order[i-1]][1], poundv_data[pv_op_order[i]][1], - poundv_data[pv_op_order[i-1]][2], poundv_data[pv_op_order[i]][2], - poundv_data[pv_op_order[i-1]][3], poundv_data[pv_op_order[i]][3], - poundv_data[pv_op_order[i-1]][4], poundv_data[pv_op_order[i]][4]); + FAPI_INF("Checking for relationship between #V operating point (%s <= %s)", pv_op_str[pv_op_order[i-1]], pv_op_str[pv_op_order[i]]); + FAPI_INF(" f=%u <= f=%u", poundv_data[pv_op_order[i-1]][0], poundv_data[pv_op_order[i]][0]); + FAPI_INF(" v=%u <= v=%u i=%u <= i=%u", poundv_data[pv_op_order[i-1]][1], poundv_data[pv_op_order[i]][1], poundv_data[pv_op_order[i-1]][2], poundv_data[pv_op_order[i]][2]); + FAPI_INF(" v=%u <= v=%u i=%u <= i=%u", poundv_data[pv_op_order[i-1]][3], poundv_data[pv_op_order[i]][3], poundv_data[pv_op_order[i-1]][4], poundv_data[pv_op_order[i]][4]); if (poundv_data[pv_op_order[i-1]][0] > poundv_data[pv_op_order[i]][0] || poundv_data[pv_op_order[i-1]][1] > poundv_data[pv_op_order[i]][1] || diff --git a/src/usr/hwpf/hwp/pstates/pstates/p8_build_pstate_datablock.H b/src/usr/hwpf/hwp/pstates/pstates/p8_build_pstate_datablock.H index 28d1a170e..e2c305fff 100755 --- a/src/usr/hwpf/hwp/pstates/pstates/p8_build_pstate_datablock.H +++ b/src/usr/hwpf/hwp/pstates/pstates/p8_build_pstate_datablock.H @@ -20,7 +20,7 @@ /* Origin: 30 */ /* */ /* IBM_PROLOG_END_TAG */ -// $Id: p8_build_pstate_datablock.H,v 1.11 2013/10/30 17:35:55 jimyac Exp $ +// $Id: p8_build_pstate_datablock.H,v 1.12 2013/11/14 20:45:59 jimyac Exp $ #ifndef _P8_BUILD_PSTATE_DATABLOCK_H_ #define _P8_BUILD_PSTATE_DATABLOCK_H_ @@ -101,6 +101,7 @@ typedef struct { uint32_t attr_pm_resonant_clock_high_band_upper_frequency; uint8_t attr_chip_ec_feature_resonant_clk_valid; + uint8_t attr_proc_ec_core_hang_pulse_bug; } AttributeList; |