summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Still <stillgs@us.ibm.com>2017-05-19 16:59:08 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-06-30 15:35:55 -0400
commitf0e3f6dfcbec36f0fdf631172f973209ff645bc1 (patch)
tree212d119c2a3170427215abeb7694927c5d347697
parent52ab376b96e517ce8c4aec160370488504bf9054 (diff)
downloadtalos-hostboot-f0e3f6dfcbec36f0fdf631172f973209ff645bc1.tar.gz
talos-hostboot-f0e3f6dfcbec36f0fdf631172f973209ff645bc1.zip
WOF: HWP support for advanced function enablement
- Moved to "system disabled" paradigm (eg functions are ON but default) - Moved p9_hcode_image_build to using HWP attributes from p9_pstate_parameter_block - Added Pstate Auto Start to p9_pm_pstate_gpe_init to support advanced functions in Cronus - Add p9_pstate_parameter_block_errors - Added error points for #V validity. One creates an information error log and disables WOF. Others disable Pstates. - Add error points for resonant clocking errors in p9_pstate_parameter_block - Refactoring - Subfunction API change for p9_setup_evid - Added wof header verification and tested the code - Corrected Jump value verification - Removed the check for 0 values of N_S and N_L - Address Gerrit comments on validation - Added verification for VFRT header and fixed vfrt header members - Rebase with VFRT fix (after merge) - Added some checks in iac vdn calculation part - IDDQ output formating updates - Fixed VDM and WOF disable checks Change-Id: I3e62e04c7873bb6bb7c8d96e1e91d72fb044d81e RTC: 173672 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/40954 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: BRIAN D. VICTOR <brian.d.victor1@ibm.com> Reviewed-by: RANGANATHPRASAD G. BRAHMASAMUDRA <prasadbgr@in.ibm.com> Reviewed-by: Gregory S. Still <stillgs@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/41096 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
-rw-r--r--src/import/chips/p9/procedures/hwp/lib/p9_pm_hcd_flags.h135
-rw-r--r--src/import/chips/p9/procedures/hwp/lib/p9_pstates_common.h11
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C107
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pm_pstate_gpe_init.C168
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C1683
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H107
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_setup_evid.C15
-rw-r--r--src/import/chips/p9/procedures/xml/error_info/p9_pm_pstate_gpe_init_errors.xml18
-rw-r--r--src/import/chips/p9/procedures/xml/error_info/p9_pstate_parameter_block_errors.xml240
-rw-r--r--src/usr/isteps/istep06/call_host_voltage_config.C4
-rw-r--r--src/usr/isteps/istep10/call_host_set_voltages.C4
11 files changed, 1620 insertions, 872 deletions
diff --git a/src/import/chips/p9/procedures/hwp/lib/p9_pm_hcd_flags.h b/src/import/chips/p9/procedures/hwp/lib/p9_pm_hcd_flags.h
index 29a3333d6..8674d2d52 100644
--- a/src/import/chips/p9/procedures/hwp/lib/p9_pm_hcd_flags.h
+++ b/src/import/chips/p9/procedures/hwp/lib/p9_pm_hcd_flags.h
@@ -55,45 +55,45 @@ typedef union occ_flags
struct
{
#ifdef _BIG_ENDIAN
- uint32_t pgpe_StartNonStop : 1;
- uint32_t pgpe_PStateProtocolActivate : 1;
- uint32_t pgpe_PStateSafeMode : 1;
- uint32_t pm_ComplexSuspend : 1;
- uint32_t reserved1 : 4;
- uint32_t sgpe_Active : 1;
- uint32_t sgpe_IgnoreStopExits : 1;
- uint32_t sgpe_IgnoreStopEntry : 1;
- uint32_t sgpe_StopExitsIgnored : 1;
- uint32_t sgpe_StopEntryIgnored : 1;
- uint32_t reserved2 : 1;
- uint32_t sgpe_Aux_Activate : 1;
- uint32_t sgpe_Aux_Active : 1;
- uint32_t pib_I2CMasterEngine1Lock : 2;
- uint32_t pib_I2CMasterEngine2Lock : 2;
- uint32_t pib_I2CMasterEngine3Lock : 2;
- uint32_t undefined : 8;
- uint32_t requested_ActiveQuadUpdate : 1;
- uint32_t requested_OccSafeState : 1;
+ uint32_t pgpe_StartNonStop : 1;
+ uint32_t pgpe_PStateProtocolAutoActivate : 1;
+ uint32_t pgpe_PStateSafeMode : 1;
+ uint32_t pm_ComplexSuspend : 1;
+ uint32_t reserved1 : 4;
+ uint32_t sgpe_Active : 1;
+ uint32_t sgpe_IgnoreStopExits : 1;
+ uint32_t sgpe_IgnoreStopEntry : 1;
+ uint32_t sgpe_StopExitsIgnored : 1;
+ uint32_t sgpe_StopEntryIgnored : 1;
+ uint32_t reserved2 : 1;
+ uint32_t sgpe_Aux_Activate : 1;
+ uint32_t sgpe_Aux_Active : 1;
+ uint32_t pib_I2CMasterEngine1Lock : 2;
+ uint32_t pib_I2CMasterEngine2Lock : 2;
+ uint32_t pib_I2CMasterEngine3Lock : 2;
+ uint32_t undefined : 8;
+ uint32_t requested_ActiveQuadUpdate : 1;
+ uint32_t requested_OccSafeState : 1;
#else
- uint32_t requested_OccSafeState : 1;
- uint32_t requested_ActiveQuadUpdate : 1;
- uint32_t undefined : 8;
- uint32_t pib_I2CMasterEngine3Lock : 2;
- uint32_t pib_I2CMasterEngine2Lock : 2;
- uint32_t pib_I2CMasterEngine1Lock : 2;
- uint32_t sgpe_Aux_Active : 1;
- uint32_t sgpe_Aux_Activate : 1;
- uint32_t reserved2 : 1;
- uint32_t sgpe_StopEntryIgnored : 1;
- uint32_t sgpe_StopExitsIgnored : 1;
- uint32_t sgpe_IgnoreStopEntry : 1;
- uint32_t sgpe_IgnoreStopExits : 1;
- uint32_t sgpe_Active : 1;
- uint32_t reserved1 : 4;
- uint32_t pm_ComplexSuspend : 1;
- uint32_t pgpe_PStateSafeMode : 1;
- uint32_t pgpe_PStateProtocolActivate : 1;
- uint32_t pgpe_StartNonStop : 1;
+ uint32_t requested_OccSafeState : 1;
+ uint32_t requested_ActiveQuadUpdate : 1;
+ uint32_t undefined : 8;
+ uint32_t pib_I2CMasterEngine3Lock : 2;
+ uint32_t pib_I2CMasterEngine2Lock : 2;
+ uint32_t pib_I2CMasterEngine1Lock : 2;
+ uint32_t sgpe_Aux_Active : 1;
+ uint32_t sgpe_Aux_Activate : 1;
+ uint32_t reserved2 : 1;
+ uint32_t sgpe_StopEntryIgnored : 1;
+ uint32_t sgpe_StopExitsIgnored : 1;
+ uint32_t sgpe_IgnoreStopEntry : 1;
+ uint32_t sgpe_IgnoreStopExits : 1;
+ uint32_t sgpe_Active : 1;
+ uint32_t reserved1 : 4;
+ uint32_t pm_ComplexSuspend : 1;
+ uint32_t pgpe_PStateSafeMode : 1;
+ uint32_t pgpe_PStateProtocolAutoActivate : 1;
+ uint32_t pgpe_StartNonStop : 1;
#endif // _BIG_ENDIAN
} fields;
} occ_flags_t;
@@ -104,35 +104,35 @@ typedef union pgpe_flags
struct
{
#ifdef _BIG_ENDIAN
- uint16_t resclk_enable : 1;
- uint16_t ivrm_enable : 1;
- uint16_t vdm_enable : 1;
- uint16_t wof_enable : 1;
- uint16_t dpll_dynamic_fmax_enable : 1;
- uint16_t dpll_dynamic_fmin_enable : 1;
- uint16_t dpll_droop_protect_enable : 1;
- uint16_t reserved7 : 1;
- uint16_t occ_ipc_immed_response : 1;
- uint16_t wof_ipc_immed_response : 1;
- uint16_t enable_fratio : 1;
- uint16_t enable_vratio : 1;
- uint16_t vratio_modifier : 1;
- uint16_t reserved_13_15 : 7;
+ uint16_t resclk_enable : 1;
+ uint16_t ivrm_enable : 1;
+ uint16_t vdm_enable : 1;
+ uint16_t wof_enable : 1;
+ uint16_t dpll_dynamic_fmax_enable : 1;
+ uint16_t dpll_dynamic_fmin_enable : 1;
+ uint16_t dpll_droop_protect_enable : 1;
+ uint16_t reserved7 : 1;
+ uint16_t occ_ipc_immed_response : 1;
+ uint16_t wof_ipc_immed_response : 1;
+ uint16_t enable_fratio : 1;
+ uint16_t enable_vratio : 1;
+ uint16_t vratio_modifier : 1;
+ uint16_t reserved_13_15 : 7;
#else
- uint16_t reserved_13_15 : 7;
- uint16_t vratio_modifier : 1;
- uint16_t enable_vratio : 1;
- uint16_t enable_fratio : 1;
- uint16_t wof_ipc_immed_response : 1;
- uint16_t occ_ipc_immed_response : 1;
- uint16_t reserved7 : 1;
- uint16_t dpll_droop_protect_enable : 1;
- uint16_t dpll_dynamic_fmin_enable : 1;
- uint16_t dpll_dynamic_fmax_enable : 1;
- uint16_t wof_enable : 1;
- uint16_t vdm_enable : 1;
- uint16_t ivrm_enable : 1;
- uint16_t resclk_enable : 1;
+ uint16_t reserved_13_15 : 7;
+ uint16_t vratio_modifier : 1;
+ uint16_t enable_vratio : 1;
+ uint16_t enable_fratio : 1;
+ uint16_t wof_ipc_immed_response : 1;
+ uint16_t occ_ipc_immed_response : 1;
+ uint16_t reserved7 : 1;
+ uint16_t dpll_droop_protect_enable : 1;
+ uint16_t dpll_dynamic_fmin_enable : 1;
+ uint16_t dpll_dynamic_fmax_enable : 1;
+ uint16_t wof_enable : 1;
+ uint16_t vdm_enable : 1;
+ uint16_t ivrm_enable : 1;
+ uint16_t resclk_enable : 1;
#endif
} fields;
} pgpe_flags_t;
@@ -147,7 +147,8 @@ namespace p9hcd
enum PM_GPE_OCCFLG_DEFS
{
PGPE_START_NOT_STOP = 0,
- PGPE_PSTATE_PROTOCOL_ACTIVATE = 1,
+ PGPE_PSTATE_PROTOCOL_AUTO_ACTIVATE = 1,
+ PGPE_PSTATE_PROTOCOL_ACTIVATE = 1, // @todo PGPE Hcode dependencies
PGPE_SAFE_MODE = 2,
PM_COMPLEX_SUSPEND = 3,
SGPE_ACTIVE = 8,
diff --git a/src/import/chips/p9/procedures/hwp/lib/p9_pstates_common.h b/src/import/chips/p9/procedures/hwp/lib/p9_pstates_common.h
index b7efeb8cf..a806274ec 100644
--- a/src/import/chips/p9/procedures/hwp/lib/p9_pstates_common.h
+++ b/src/import/chips/p9/procedures/hwp/lib/p9_pstates_common.h
@@ -295,19 +295,18 @@ typedef struct __attribute__((packed)) VFRTHeaderLayout
// VFRT Magic code "VT"
uint16_t magic_number;
- uint16_t reserved_1;
+ uint16_t reserved;
// 0:System type, 1:Homer type (0:3)
// if version 1: VFRT size is 12 row(voltage) X 11 column(freq) of size uint8_t
// (4:7)
// if version 2: VFRT size is 24 row(Voltage) X 5 column (Freq) of size uint8_t
uint8_t type_version;
- //Reserved
- uint8_t reserved_2;
- //Identifies the Vdn assumptions tht went in this VFRT (4:7)
+ //Identifies the Vdn assumptions tht went in this VFRT (0:7)
uint8_t res_vdnId;
- //Identifies the Vdd assumptions tht went in this VFRT (0:4)
- //Identifies the Quad Active assumptions tht went in this VFRT (5:7)
+ //Identifies the Vdd assumptions tht went in this VFRT (0:7)
uint8_t VddId_QAId;
+ //Identifies the Quad Active assumptions tht went in this VFRT (5:7)
+ uint8_t rsvd_QAId;
} VFRTHeaderLayout_t;// WOF Tables Header
typedef struct __attribute__((packed, aligned(128))) WofTablesHeader
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 89572953a..c930d486d 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
@@ -736,40 +736,34 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
FAPI_SYSTEM,
attrVal),
"Error from FAPI_ATTR_GET for attribute ATTR_STOP4_DISABLE");
-
if( attrVal )
{
cmeFlag |= CME_STOP_4_TO_2_BIT_POS;
sgpeFlag |= SGPE_STOP_4_TO_2_BIT_POS;
}
-
- FAPI_DBG("STOP_4_to_2 : %s", attrVal ? "TRUE" : "FALSE" );
+ FAPI_DBG("STOP_4_to_2 : %s", attrVal ? "TRUE" : "FALSE" );
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_STOP5_DISABLE,
FAPI_SYSTEM,
attrVal),
"Error from FAPI_ATTR_GET for attribute ATTR_STOP5_DISABLE");
-
if( attrVal )
{
cmeFlag |= CME_STOP_5_TO_4_BIT_POS;
sgpeFlag |= SGPE_STOP_5_TO_4_BIT_POS;
}
-
- FAPI_DBG("STOP_5_to_4 : %s", attrVal ? "TRUE" : "FALSE");
+ FAPI_DBG("STOP_5_to_4 : %s", attrVal ? "TRUE" : "FALSE");
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_STOP8_DISABLE,
FAPI_SYSTEM,
attrVal),
"Error from FAPI_ATTR_GET for attribute ATTR_STOP8_DISABLE");
-
if( attrVal )
{
cmeFlag |= CME_STOP_8_TO_5_BIT_POS;
sgpeFlag |= SGPE_STOP_8_TO_5_BIT_POS;
}
-
- FAPI_DBG("STOP_8_to_5 : %s", attrVal ? "TRUE" : "FALSE" );
+ FAPI_DBG("STOP_8_to_5 : %s", attrVal ? "TRUE" : "FALSE" );
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_STOP11_DISABLE,
FAPI_SYSTEM,
@@ -806,7 +800,7 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
sgpeFlag |= SGPE_ENABLE_CHTM_TRACE_CME_BIT_POS;
}
- FAPI_DBG("CME CHTM Trace Enabled : %s", attrVal ? "TRUE" : "FALSE" );
+ FAPI_DBG("CME CHTM Trace Enabled : %s", attrVal ? "TRUE" : "FALSE" );
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CME_CHTM_TRACE_MEMORY_CONFIG,
i_procTgt,
@@ -818,12 +812,12 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
pSgpeHdr->g_sgpe_chtm_mem_cfg = SWIZZLE_8_BYTE(chtmVal);
}
- FAPI_DBG("CME CHTM Memory Config : %016llx", chtmVal);
+ FAPI_DBG("CME CHTM Memory Config : %016llx", chtmVal);
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_RESCLK_ENABLE,
- FAPI_SYSTEM,
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_RESCLK_ENABLED,
+ i_procTgt,
attrVal),
- "Error from FAPI_ATTR_GET for attribute ATTR_SYSTEM_RESCLK_ENABLE" );
+ "Error from FAPI_ATTR_GET for attribute ATTR_RESCLK_ENABLED" );
if( attrVal )
{
@@ -831,12 +825,12 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
pgpeFlags.fields.resclk_enable = 1;
}
- FAPI_DBG("Resonant Clock Enable : %s", attrVal ? "TRUE" : "FALSE" );
+ FAPI_DBG("Resonant Clock Enabled : %s", attrVal ? "TRUE" : "FALSE" );
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_IVRMS_ENABLED,
- FAPI_SYSTEM,
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRMS_ENABLED,
+ i_procTgt,
attrVal),
- "Error from FAPI_ATTR_GET for attribute ATTR_SYSTEM_IVRMS_ENABLED" );
+ "Error from FAPI_ATTR_GET for attribute ATTR_IVRMS_ENABLED" );
if( attrVal )
{
@@ -844,12 +838,12 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
pgpeFlags.fields.ivrm_enable = 1;
}
- FAPI_DBG("System IVRM Enable : %s", attrVal ? "TRUE" : "FALSE" );
+ FAPI_DBG("IVRM Enabled : %s", attrVal ? "TRUE" : "FALSE" );
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDM_ENABLE,
- FAPI_SYSTEM,
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDM_ENABLED,
+ i_procTgt,
attrVal),
- "Error from FAPI_ATTR_GET for attribute ATTR_VDM_ENABLE" );
+ "Error from FAPI_ATTR_GET for attribute ATTR_VDM_ENABLED" );
if( attrVal )
{
@@ -858,33 +852,34 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
pgpeFlags.fields.vdm_enable = 1;
}
- FAPI_DBG("System VDM Enable : %s", attrVal ? "TRUE" : "FALSE" );
+ FAPI_DBG("VDM Enabled : %s", attrVal ? "TRUE" : "FALSE" );
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_PUMP_MODE,
- FAPI_SYSTEM,
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_WOF_ENABLED,
+ i_procTgt,
attrVal),
- "Error from FAPI_ATTR_GET for attribute ATTR_PROC_FABRIC_PUMP_MODE_MODE");
+ "Error from FAPI_ATTR_GET for attribute ATTR_WOF_ENABLED" );
- //Attribute set to 0x01 for CHIP_IS_NODE, 0x02 for CHIP_IS_GROUP
- if( attrVal == fapi2::ENUM_ATTR_PROC_FABRIC_PUMP_MODE_CHIP_IS_NODE )
+ if( attrVal )
{
- sgpeFlag |= SGPE_PROC_FAB_PUMP_MODE_BIT_POS;
+ qmFlags |= CME_QM_FLAG_SYS_WOF_ENABLE;
+ pgpeFlags.fields.wof_enable = 1;
}
- FAPI_DBG("FAB_PUMP_MODE : %s", (attrVal == fapi2::ENUM_ATTR_PROC_FABRIC_PUMP_MODE_CHIP_IS_NODE) ? "TRUE" : "FALSE" );
+ FAPI_DBG("WOF Enabled : %s", attrVal ? "TRUE" : "FALSE" );
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_WOF_ENABLED,
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_PUMP_MODE,
FAPI_SYSTEM,
attrVal),
- "Error from FAPI_ATTR_GET for attribute ATTR_SYSTEM_WOF_ENABLED" );
-
- if( attrVal )
+ "Error from FAPI_ATTR_GET for attribute ATTR_PROC_FABRIC_PUMP_MODE_MODE");
+ FAPI_DBG("Fabric Pump Attr Value : %d", attrVal );
+ //Attribute set to 0x01 for CHIP_IS_NODE
+ if( attrVal == fapi2::ENUM_ATTR_PROC_FABRIC_PUMP_MODE_CHIP_IS_NODE )
{
- qmFlags |= CME_QM_FLAG_SYS_WOF_ENABLE;
- pgpeFlags.fields.wof_enable = 1;
+ sgpeFlag |= SGPE_PROC_FAB_PUMP_MODE_BIT_POS;
}
- FAPI_DBG("System WOF Enable : %s", attrVal ? "TRUE" : "FALSE" );
+ FAPI_DBG("Fabric Pump Mode : %s", (
+ attrVal == fapi2::ENUM_ATTR_PROC_FABRIC_PUMP_MODE_CHIP_IS_NODE) ? "TRUE" : "FALSE" );
// Set PGPE Header Flags from Attributes
FAPI_DBG(" -------------------- PGPE Flags -----------------");
@@ -899,7 +894,7 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
pgpeFlags.fields.occ_ipc_immed_response = 1;
}
- FAPI_DBG("PGPE Hcode Mode : %s", attrVal ? "PSTATES Enabled" : "OCC IPC Immediate Response Mode" );
+ FAPI_DBG("PGPE Hcode Mode : %s", attrVal ? "PSTATES Enabled" : "OCC IPC Immediate Response Mode" );
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_WOF_ENABLE_FRATIO,
FAPI_SYSTEM,
@@ -911,7 +906,7 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
pgpeFlags.fields.enable_fratio = 1;
}
- FAPI_DBG("System FRATIO ENABLE : %s", attrVal ? "TRUE" : "FALSE" );
+ FAPI_DBG("System Frequency Ratio Enable : %s", attrVal ? "TRUE" : "FALSE" );
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_WOF_ENABLE_VRATIO,
FAPI_SYSTEM,
@@ -923,7 +918,7 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
pgpeFlags.fields.enable_vratio = 1;
}
- FAPI_DBG("System VRATIO ENABLE : %s", attrVal ? "TRUE" : "FALSE" );
+ FAPI_DBG("System Voltage Ratio Enable : %s", attrVal ? "TRUE" : "FALSE" );
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_WOF_VRATIO_SELECT,
FAPI_SYSTEM,
@@ -935,7 +930,7 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
pgpeFlags.fields.vratio_modifier = 1;
}
- FAPI_DBG("System VRATIO SELECT: %s", attrVal ? "TRUE" : "FALSE" );
+ FAPI_DBG("System Voltage Ratio Select : %s", attrVal ? "FULL" : "ACTIVE CORES" );
@@ -945,12 +940,12 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
pSgpeHdr->g_sgpe_reserve_flags = SWIZZLE_4_BYTE(sgpeFlag);
pPgpeHdr->g_pgpe_flags = SWIZZLE_2_BYTE(pgpeFlags.value);
- 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("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));
- FAPI_DBG(" -------------------- CME/SGPE Flags Ends ---------------==");
+ 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("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));
+ FAPI_DBG(" -------------------- CME/SGPE Flags Ends -----------------");
fapi_try_exit:
return fapi2::current_err;
@@ -1855,8 +1850,8 @@ void updatePgpeHeader( void* const i_pHomer )
pPgpeHdr->g_quad_status_addr = 0;
pPgpeHdr->g_pgpe_wof_state_address = 0;
pPgpeHdr->g_pgpe_req_active_quad_address = 0;
- pPgpeHdr->g_wof_table_addr = 0;
- pPgpeHdr->g_wof_table_length = 0;
+ pPgpeHdr->g_wof_table_addr = SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_wof_table_offset);
+ pPgpeHdr->g_wof_table_length = SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_wof_table_length);
//Finally handling the endianess
pPgpeHdr->g_pgpe_gppb_sram_addr = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_sram_addr);
@@ -1949,6 +1944,7 @@ fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i
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];
+ 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);
@@ -1972,7 +1968,9 @@ fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i
&pStateSupStruct, (uint8_t*)i_pBuf1, wofTableSize );
FAPI_TRY(retCode);
- //Check if WOF Table is copied properly
+ //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)
@@ -2073,8 +2071,11 @@ fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i
io_ppmrHdr.g_ppmr_wof_table_offset = OCC_WOF_TABLES_PPMR_OFFSET;
io_ppmrHdr.g_ppmr_wof_table_length = OCC_WOF_TABLES_SIZE;
- memcpy( &pPpmr->wofTableSize, i_pBuf1, wofTableSize );
-
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_WOF_ENABLED, i_procTgt, l_wof_enabled));
+ if (l_wof_enabled)
+ {
+ memcpy( &pPpmr->wofTableSize, i_pBuf1, wofTableSize );
+ }
//------------------------------ Copying WOF Table ----------------------------------------------
//------------------------------ Calculating total PGPE Image Size in SRAM ----------------------
@@ -2088,7 +2089,7 @@ fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i
//Finally 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_common_ring_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset);
//PPMR Header
io_ppmrHdr.g_ppmr_gppb_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_gppb_offset);
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pm_pstate_gpe_init.C b/src/import/chips/p9/procedures/hwp/pm/p9_pm_pstate_gpe_init.C
index bdf8f7413..f307d4b60 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_pm_pstate_gpe_init.C
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_pm_pstate_gpe_init.C
@@ -37,6 +37,7 @@
// Includes
// -----------------------------------------------------------------------------
#include <p9_pm_pstate_gpe_init.H>
+#include <p9_pm_hcd_flags.h>
// -----------------------------------------------------------------------------
// Constants
@@ -71,11 +72,15 @@ fapi2::ReturnCode pstate_gpe_init(
fapi2::buffer<uint64_t> l_xcr;
fapi2::buffer<uint64_t> l_xsr;
fapi2::buffer<uint64_t> l_ivpr;
- uint32_t l_ivpr_offset = 0;
uint32_t l_xsr_halt_condition = 0;
uint32_t l_timeout_counter = TIMEOUT_COUNT;
- uint8_t l_avsbus_number = 0;
- uint8_t l_avsbus_rail = 0;
+
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+ fapi2::ATTR_PSTATEGPE_BOOT_COPIER_IVPR_OFFSET_Type l_ivpr_offset = 0;
+ fapi2::ATTR_VDD_AVSBUS_BUSNUM_Type l_avsbus_number = 0;
+ fapi2::ATTR_VDD_AVSBUS_RAIL_Type l_avsbus_rail = 0;
+ fapi2::ATTR_SYSTEM_PSTATES_MODE_Type l_pstates_mode = 0;
+
FAPI_IMP(">> pstate_gpe_init......");
@@ -87,13 +92,13 @@ fapi2::ReturnCode pstate_gpe_init(
// Program PGPE IVPR
l_ivpr.flush<0>().insertFromRight<0, 32>(l_ivpr_offset);
- FAPI_INF(" Writing IVPR with 0x%16llX", l_ivpr);
+ FAPI_INF(" Writing IVPR with 0x%16llX", l_ivpr);
FAPI_TRY(putScom(i_target, PU_GPE2_GPEIVPR_SCOM, l_ivpr));
// Set up the OCC Scratch 2 register before PGPE boot
FAPI_TRY(getScom(i_target, PU_OCB_OCI_OCCS2_SCOM, l_occ_scratch2));
- FAPI_INF(" Clear PGPE_ACTIVE in OCC Scratch 2 Register...");
+ FAPI_INF(" Clear PGPE_ACTIVE in OCC Scratch 2 Register...");
l_occ_scratch2.clearBit<p9hcd::PGPE_ACTIVE>();
FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_VDD_AVSBUS_BUSNUM,
@@ -108,70 +113,115 @@ fapi2::ReturnCode pstate_gpe_init(
l_occ_scratch2.insertFromRight<27, 1>(l_avsbus_number)
.insertFromRight<28, 4>(l_avsbus_rail);
- FAPI_INF(" AVSBus VDD topology set in OCC Scratch 2 Register: Bus = %d, Rail = %d ...",
+ FAPI_INF(" AVSBus VDD topology set in OCC Scratch 2 Register: Bus = %d, Rail = %d ...",
l_avsbus_number, l_avsbus_rail);
FAPI_TRY(putScom(i_target, PU_OCB_OCI_OCCS2_SCOM, l_occ_scratch2));
- // Program XCR to ACTIVATE PGPE
- // @todo RTC 146665 Operations to PPEs should use a p9ppe namespace
- FAPI_INF(" Starting the PGPE...");
- l_xcr.flush<0>().insertFromRight(p9hcd::HARD_RESET, 1, 3);
- FAPI_TRY(putScom(i_target, PU_GPE2_PPE_XIXCR, l_xcr));
- l_xcr.flush<0>().insertFromRight(p9hcd::TOGGLE_XSR_TRH, 1 , 3);
- FAPI_TRY(putScom(i_target, PU_GPE2_PPE_XIXCR, l_xcr));
- l_xcr.flush<0>().insertFromRight(p9hcd::RESUME, 1, 3);
- FAPI_TRY(putScom(i_target, PU_GPE2_PPE_XIXCR, l_xcr));
-
- // Now wait for PGPE to boot
- FAPI_DBG(" Poll for PGPE Active for %d ms", PGPE_TIMEOUT_MS);
- l_occ_scratch2.flush<0>();
- l_xsr.flush<0>();
- do
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_PSTATES_MODE,
+ FAPI_SYSTEM,
+ l_pstates_mode),
+ "Error getting ATTR_SYSTEM_PSTATES_MODE");
+
+ // Boot if not OFF
+ if (l_pstates_mode != fapi2::ENUM_ATTR_SYSTEM_PSTATES_MODE_OFF)
{
- FAPI_TRY(getScom(i_target, PU_OCB_OCI_OCCS2_SCOM, l_occ_scratch2));
- FAPI_TRY(getScom(i_target, PU_GPE2_GPEXIXSR_SCOM, l_xsr));
- FAPI_DBG("OCC Scratch2: 0x%016lx; XSR: 0x%016lx Timeout: %d",
- l_occ_scratch2, l_xsr, l_timeout_counter);
- // fapi2::delay takes ns as the arg
- fapi2::delay(PGPE_POLLTIME_MS * 1000 * 1000, PGPE_POLLTIME_MCYCLES * 1000 * 1000);
+ // Set auto mode if needed
+ if (l_pstates_mode == fapi2::ENUM_ATTR_SYSTEM_PSTATES_MODE_AUTO)
+ {
+ FAPI_INF(" Pstate Auto Start Mode Enabled...");
+ FAPI_TRY(putScom(i_target, PU_OCB_OCI_OCCFLG_SCOM2, BIT(p9hcd::PGPE_PSTATE_PROTOCOL_AUTO_ACTIVATE)));
+ }
+
+ // Program XCR to ACTIVATE PGPE
+ // @todo RTC 146665 Operations to PPEs should use a p9ppe namespace
+ FAPI_INF(" Starting the PGPE...");
+ l_xcr.flush<0>().insertFromRight(p9hcd::HARD_RESET, 1, 3);
+ FAPI_TRY(putScom(i_target, PU_GPE2_PPE_XIXCR, l_xcr));
+ l_xcr.flush<0>().insertFromRight(p9hcd::TOGGLE_XSR_TRH, 1 , 3);
+ FAPI_TRY(putScom(i_target, PU_GPE2_PPE_XIXCR, l_xcr));
+ l_xcr.flush<0>().insertFromRight(p9hcd::RESUME, 1, 3);
+ FAPI_TRY(putScom(i_target, PU_GPE2_PPE_XIXCR, l_xcr));
+
+ // Now wait for PGPE to boot
+ FAPI_DBG(" Poll for PGPE Active for %d ms", PGPE_TIMEOUT_MS);
+ l_occ_scratch2.flush<0>();
+ l_xsr.flush<0>();
+
+ do
+ {
+ FAPI_TRY(getScom(i_target, PU_OCB_OCI_OCCS2_SCOM, l_occ_scratch2));
+ FAPI_TRY(getScom(i_target, PU_GPE2_GPEXIXSR_SCOM, l_xsr));
+ FAPI_DBG("OCC Scratch2: 0x%016lx; XSR: 0x%016lx Timeout: %d",
+ l_occ_scratch2, l_xsr, l_timeout_counter);
+ // fapi2::delay takes ns as the arg
+ fapi2::delay(PGPE_POLLTIME_MS * 1000 * 1000, PGPE_POLLTIME_MCYCLES * 1000 * 1000);
+ }
+ while((l_occ_scratch2.getBit<p9hcd::PGPE_ACTIVE>() != 1) &&
+ (l_xsr.getBit<p9hcd::HALTED_STATE>() != 1) &&
+ (--l_timeout_counter != 0));
+
+ // Extract the halt condition
+ l_xsr.extractToRight<uint32_t>(l_xsr_halt_condition,
+ p9hcd::HALT_CONDITION_START,
+ p9hcd::HALT_CONDITION_LEN);
+ FAPI_DBG("halt state: XSR: 0x%016lx condition: %d",
+ l_xsr, l_xsr_halt_condition);
+
+ // Check for a debug halt condition
+ FAPI_ASSERT(!((l_xsr.getBit<p9hcd::HALTED_STATE>() == 1) &&
+ ((l_xsr_halt_condition == p9hcd::DEBUG_HALT ||
+ l_xsr_halt_condition == p9hcd::DBCR_HALT) )),
+ fapi2::PSTATE_GPE_INIT_DEBUG_HALT()
+ .set_CHIP(i_target),
+ "Pstate GPE Debug Halt detected");
+
+ // @todo 146665 Need to collect PGPE state. Operations to PPEs should
+ // use a p9ppe namespace class when created
+
+ // When PGPE fails to boot, assert out
+ FAPI_ASSERT((l_timeout_counter != 0 &&
+ l_occ_scratch2.getBit<p9hcd::PGPE_ACTIVE>() == 1 &&
+ l_xsr.getBit<p9hcd::HALTED_STATE>() != 1),
+ fapi2::PSTATE_GPE_INIT_TIMEOUT()
+ .set_CHIP(i_target),
+ "Pstate GPE Init timeout");
+
+ if(l_occ_scratch2.getBit<p9hcd::PGPE_ACTIVE>())
+ {
+ FAPI_INF(" PGPE was activated successfully!!!!");
+ }
+
+ if (l_pstates_mode == fapi2::ENUM_ATTR_SYSTEM_PSTATES_MODE_AUTO)
+ {
+ do
+ {
+ FAPI_TRY(getScom(i_target, PU_OCB_OCI_OCCS2_SCOM, l_occ_scratch2));
+ // fapi2::delay takes ns as the arg
+ fapi2::delay(PGPE_POLLTIME_MS * 1000 * 1000, PGPE_POLLTIME_MCYCLES * 1000 * 1000);
+ }
+ while((l_occ_scratch2.getBit<p9hcd::PGPE_PSTATE_PROTOCOL_ACTIVE>() != 1) &&
+ (l_xsr.getBit<p9hcd::HALTED_STATE>() != 1) &&
+ (--l_timeout_counter != 0));
+
+ // When Pstate protocol fails to start, assert out
+ FAPI_ASSERT((l_timeout_counter != 0 &&
+ l_occ_scratch2.getBit<p9hcd::PGPE_PSTATE_PROTOCOL_ACTIVE>() == 1 &&
+ l_xsr.getBit<p9hcd::HALTED_STATE>() != 1),
+ fapi2::PSTATE_GPE_INIT_PSTATE_AUTOSTART_TIMEOUT()
+ .set_CHIP(i_target),
+ "Pstate GPE Protocol Auto Start timeout");
+
+ FAPI_INF(" Pstate Auto Start Mode Complete!!!!");
+ }
}
- while((l_occ_scratch2.getBit<p9hcd::PGPE_ACTIVE>() != 1) &&
- (l_xsr.getBit<p9hcd::HALTED_STATE>() != 1) &&
- (--l_timeout_counter != 0));
-
- // Extract the halt condition
- l_xsr.extractToRight<uint32_t>(l_xsr_halt_condition,
- p9hcd::HALT_CONDITION_START,
- p9hcd::HALT_CONDITION_LEN);
- FAPI_DBG("halt state: XSR: 0x%016lx condition: %d",
- l_xsr, l_xsr_halt_condition);
-
- // Check for a debug halt condition
- FAPI_ASSERT(!((l_xsr.getBit<p9hcd::HALTED_STATE>() == 1) &&
- ((l_xsr_halt_condition == p9hcd::DEBUG_HALT ||
- l_xsr_halt_condition == p9hcd::DBCR_HALT) )),
- fapi2::PSTATE_GPE_INIT_DEBUG_HALT()
- .set_CHIP(i_target),
- "Pstate GPE Debug Halt detected");
-
- // @todo 146665 Need to collect PGPE state. Operations to PPEs should
- // use a p9ppe namespace class when created
-
- // When PGPE fails to boot, assert out
- FAPI_ASSERT((l_timeout_counter != 0 &&
- l_occ_scratch2.getBit<p9hcd::PGPE_ACTIVE>() == 1 &&
- l_xsr.getBit<p9hcd::HALTED_STATE>() != 1),
- fapi2::PSTATE_GPE_INIT_TIMEOUT()
- .set_CHIP(i_target),
- "Pstate GPE Init timeout");
-
- if(( 1 == l_occ_scratch2.getBit<p9hcd::PGPE_ACTIVE>() ))
+ else
{
- FAPI_INF(" PGPE was activated successfully!!!!");
+ FAPI_INF(" PGPE booting is disabled and is NOT running!!!!");
}
+
fapi_try_exit:
FAPI_IMP("<< pstate_gpe_init......");
return fapi2::current_err;
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 5f20b4988..f45348307 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
@@ -39,6 +39,8 @@
/// - Read VPD and attributes to create the Pstate Parameter Block(s) (one each for PGPE,OCC and CMEs).
/// @endverbatim
+// *INDENT-OFF*
+//
// ----------------------------------------------------------------------
// Includes
// ----------------------------------------------------------------------
@@ -112,6 +114,35 @@ uint8_t g_sysvfrtData[] = {0x56, 0x54, 0x00, 0x00, 0x02, 0x01, 0x01, 0x06, /// V
0xB1, 0xB1, 0xB0, 0xAF, 0xA9, 0xA1, 0x97, 0x8E, 0x86, 0x7F, 0x78, 0x73, 0x6D, 0x68, 0x63, 0x5F, 0x5B, 0x57, 0x53, 0x4E, 0x4D, 0x4D, 0x4D, 0x4D
};
+#define VALIDATE_VID_VALUES(w,x,y,z,state) \
+ if (!((w < x) && (x < y) && (y < z))) \
+ {state = 0;}
+
+#define VALIDATE_THRESHOLD_VALUES(w,x,y,z,state) \
+ if ((w > 0x7 && w != 0xC) || /* overvolt */ \
+ (x == 8) || (x == 9) || (x > 0xF) || \
+ (y == 8) || (y == 9) || (y > 0xF) || \
+ (z == 8) || (z == 9) || (z > 0xF) ) \
+ {state = 0;}
+
+//w => N_L (w > 7 is invalid)
+//x => N_S (x > N_L is invalid)
+//y => L_S (y > (N_L - S_N) is invalid)
+//z => S_N (z > N_S is invalid
+#define VALIDATE_FREQUENCY_DROP_VALUES(w,x,y,z,state) \
+ if ((w > 7) || \
+ (x > w) || \
+ (y > (w - z)) || \
+ (z > x) || \
+ ((w | x | y | z) == 0)) \
+ {state = 0; }
+
+#define VALIDATE_WOF_HEADER_DATA(a,b,c,d,e,f,g,state) \
+ if ((!a) || (!b) || (!c) || (!d) || (!e) || (!f) || (!g)) \
+ {state = 0; }
+
+// Struct Variable for all attributes
+AttributeList attr;
// START OF PSTATE PARAMETER BLOCK function
@@ -128,13 +159,13 @@ fapi2::ReturnCode
p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
PstateSuperStructure* io_pss, uint8_t* o_buf, uint32_t& io_size)
{
- int rc;
FAPI_INF("> p9_pstate_parameter_block");
-
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+ fapi2::ReturnCode l_rc = 0;
do
{
- FAPI_TRY(proc_set_resclk_table_attrs(i_target), "proc_set_resclk_table_attrs failed");
+
// -----------------------------------------------------------
// Clear the PstateSuperStructure and install the magic number
//----------------------------------------------------------
@@ -151,15 +182,21 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// OCC content
OCCPstateParmBlock l_occppb;
+ PSTATE_attribute_state l_state;
+ l_state.iv_pstates_enabled = true;
+ l_state.iv_resclk_enabled = true;
+ l_state.iv_vdm_enabled = true;
+ l_state.iv_ivrm_enabled = true;
+ l_state.iv_wof_enabled = true;
+
memset (&l_globalppb, 0, sizeof(GlobalPstateParmBlock));
memset (&l_localppb, 0, sizeof(LocalPstateParmBlock));
memset (&l_occppb , 0, sizeof (OCCPstateParmBlock));
PoundW_data l_poundw_data;
+ memset (&l_poundw_data,0,sizeof(l_poundw_data));
- // Struct Variable for all attributes
- AttributeList attr;
//ChipCharacterization* characterization;
// MVPD #V variables
@@ -193,9 +230,6 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// VPD voltage and frequency biases
VpdBias l_vpdbias[NUM_OP_POINTS];
- // Quad Manager Flags
- QuadManagerFlags l_qm_flags;
- fapi2::buffer<uint16_t> l_data16;
// -------------------------
// Get all attributes needed
@@ -204,6 +238,15 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
FAPI_TRY(proc_get_attributes(i_target, &attr), "Get attributes function failed");
+ //if PSTATES_MODE is off then we dont need to execute further to collect
+ //the data.
+ if (attr.attr_pstate_mode == fapi2::ENUM_ATTR_SYSTEM_PSTATES_MODE_OFF)
+ {
+ FAPI_INF("Requested for not to boot the PGPE, So PPB won't be initialized");
+ break;
+ }
+
+
// ----------------
// get #V data
// ----------------
@@ -215,16 +258,27 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
fapi2::voltageBucketData_t l_poundv_data;
- FAPI_TRY(proc_get_mvpd_data( i_target, attr_mvpd_voltage_control, &valid_pdv_points, &present_chiplets,
- l_poundv_bucketId, &l_poundv_data),
- "Get MVPD #V data failed");
+ l_rc = proc_get_mvpd_data( i_target, attr_mvpd_voltage_control, &valid_pdv_points, &present_chiplets,
+ l_poundv_bucketId, &l_poundv_data, &l_state);
+
+ if(l_rc)
+ {
+ FAPI_ASSERT(false,
+ fapi2::PSTATE_PB_GET_MVPD_FOR_POUND_V_FAILED()
+ .set_CHIP_TARGET(i_target)
+ .set_PRESENT_CHIPLETS(present_chiplets),
+ "proc_get_mvpd_data function failed to retrieve porund V data");
+ }
if (!present_chiplets)
{
- FAPI_ERR("**** ERROR : There are no cores present");
- break;
- //const uint8_t& PRESENT_CHIPLETS = present_chiplets; //const Target& CHIP_TARGET = i_target;
- //FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_NO_CORES_PRESENT_ERROR); //break;
+ FAPI_ERR("**** ERROR : There are eq chiplets present");
+
+ FAPI_ASSERT(false,
+ fapi2::PSTATE_PB_NO_PRESENT_CHIPLETS_ERROR()
+ .set_CHIP_TARGET(i_target)
+ .set_PRESENT_CHIPLETS(present_chiplets),
+ "No eq chiplets are present for a give proc target");
}
// ---------------------------------------------
@@ -253,36 +307,63 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
l_vdn_sysparm.distloss_uohm = revle32(attr.attr_proc_r_distloss_vdn_uohm);
l_vdn_sysparm.distoffset_uv = revle32(attr.attr_proc_vrm_voffset_vdn_uv);
- // ----------------
- // get IQ (IDDQ) data
- // ----------------
- FAPI_INF("Getting IQ (IDDQ) Data");
- FAPI_TRY(proc_get_mvpd_iddq(i_target, &l_iddqt));
+ //if wof is disabled.. don't call IQ function
+ if (attr.attr_system_wof_disable == fapi2::ENUM_ATTR_SYSTEM_WOF_DISABLE_OFF)
+ {
+ // ----------------
+ // get IQ (IDDQ) data
+ // ----------------
+ FAPI_INF("Getting IQ (IDDQ) Data");
+ l_rc = proc_get_mvpd_iddq(i_target, &l_iddqt, &l_state);
+
+ if (l_rc)
+ {
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_FUNCTION_FAIL(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_FAPI_RC(l_rc),
+ "Pstate Parameter Block proc_get_mvpd_iddq funciton failed");
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ }
+ }
+ else
+ {
+ l_state.iv_wof_enabled = false;
+ }
// ----------------
// get VDM Parameters data
// ----------------
FAPI_INF("Getting VDM Parameters Data");
- FAPI_TRY(proc_get_vdm_parms(i_target, &l_gp_vdmpb));
+ FAPI_TRY(proc_get_vdm_parms(i_target, &attr, &l_gp_vdmpb));
+
+ // if vdm is disabled.. don't call pound w funcion
+ if (attr.attr_system_vdm_disable == fapi2::ENUM_ATTR_SYSTEM_VDM_DISABLE_OFF)
+ {
+ FAPI_INF("Getting WOF data and VDM points (#W) Data");
+ l_rc = proc_get_mvpd_poundw(i_target, l_poundv_bucketId, &l_lp_vdmpb, &l_poundw_data, l_poundv_data, &l_state);
- FAPI_INF("Getting VDM points (#W) Data");
- FAPI_TRY(proc_get_mvpd_poundw(i_target, l_poundv_bucketId, &l_lp_vdmpb, &l_poundw_data, l_poundv_data));
+ if (l_rc)
+ {
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_FUNCTION_FAIL(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_FAPI_RC(l_rc),
+ "Pstate Parameter Block proc_get_mvpd_poundw function failed");
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ }
+ }
+ else
+ {
+ l_state.iv_wof_enabled = false;
+ l_state.iv_vdm_enabled = false;
+ }
// ----------------
// get IVRM Parameters data
// ----------------
FAPI_INF("Getting IVRM Parameters Data");
- FAPI_TRY(proc_get_ivrm_parms(i_target, &l_ivrmpb));
-
- l_data16.flush<0>();
- l_data16.insertFromRight<0, 1>(attr.attr_resclk_enable);
- l_data16.insertFromRight<1, 1>(attr.attr_system_ivrms_enabled);
- l_data16.insertFromRight<2, 1>(attr.attr_system_wof_enabled);
- l_data16.insertFromRight<3, 1>(attr.attr_dpll_dynamic_fmax_enable);
- l_data16.insertFromRight<4, 1>(attr.attr_dpll_dynamic_fmin_enable);
- l_data16.insertFromRight<5, 1>(attr.attr_dpll_droop_protect_enable);
-
- l_qm_flags.value = revle16(l_data16);
+ FAPI_TRY(proc_get_ivrm_parms(i_target, &attr, &l_ivrmpb, &l_state));
// -----------------------------------------------
// Global parameter block
@@ -343,18 +424,31 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// safe_frequency_khz
l_globalppb.safe_frequency_khz = revle32(attr.attr_pm_safe_frequency_mhz / 1000);
-
- // @todo RTC 161279
- l_globalppb.ext_vrm_transition_start_ns = revle32(8000);
- l_globalppb.ext_vrm_transition_rate_inc_uv_per_us = revle32(10);
- l_globalppb.ext_vrm_transition_rate_dec_uv_per_us = revle32(10);
- l_globalppb.ext_vrm_stabilization_time_us = revle32(5);
- l_globalppb.ext_vrm_step_size_mv = revle32(50);
-
// vrm_stepdelay_range -@todo RTC 161279 potential attributes to be defined
// vrm_stepdelay_value -@todo RTC 161279 potential attributes to be defined
+ // ----------------
+ // get Resonant clocking attributes
+ // ----------------
+ {
+ if (attr.attr_resclk_disable == fapi2::ENUM_ATTR_SYSTEM_RESCLK_DISABLE_OFF)
+ {
+ FAPI_TRY(proc_set_resclk_table_attrs(i_target), "proc_set_resclk_table_attrs failed");
+ FAPI_TRY(proc_res_clock_setup(i_target, &l_resclk_setup, &l_globalppb));
+ l_localppb.resclk = l_resclk_setup;
+ l_globalppb.resclk = l_resclk_setup;
+ l_state.iv_resclk_enabled = true;
+
+ FAPI_INF("Resonant Clocks are enabled");
+ }
+ else
+ {
+ l_state.iv_resclk_enabled = false;
+ FAPI_INF("Resonant Clocks are disabled. Skipping setup.");
+ }
+ }
+
// VDMParmBlock vdm
l_globalppb.vdm = l_gp_vdmpb;
@@ -382,16 +476,11 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
FAPI_INF("l_globalppb.dpll_pstate0_value %X", revle32(l_globalppb.dpll_pstate0_value));
-
-
// -----------------------------------------------
// Local parameter block
// -----------------------------------------------
l_localppb.magic = revle64(LOCAL_PARMSBLOCK_MAGIC);
- // QuadManagerFlags
- l_localppb.qmflags = l_qm_flags;
-
// VPD operating point
FAPI_TRY(load_mvpd_operating_point(attr_mvpd_voltage_control, l_localppb.operating_points, l_frequency_step_khz),
"Loading MVPD operating point failed");
@@ -441,7 +530,7 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
l_occppb.iddq = l_iddqt;
//WOFElements - @todo RTC 161279 (VID Modification table not populated)
- l_occppb.wof.wof_enabled = attr.attr_system_wof_enabled;
+
l_occppb.wof.tdp_rdp_factor = revle32(attr.attr_tdp_rdp_current_factor);
// frequency_min_khz - Value from Power save operating point after biases
@@ -479,22 +568,34 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
uint8_t l_nest_leakage_for_occ = 75;
- uint16_t l_iac_tdp_vdn = get_iac_vdn_value (l_vpd_vdn_mv, l_iddqt, l_nest_leakage_for_occ,
- l_vpd_idn_100ma);
-
- FAPI_INF("l_iac_tdp_vdn %x", l_iac_tdp_vdn);
-
- l_occppb.ceff_tdp_vdn = revle16(pstate_calculate_effective_capacitance(l_iac_tdp_vdn,
- l_vpd_vdn_mv * 1000,
- l_pbus_nest_freq));
+ if (attr.attr_system_wof_disable == fapi2::ENUM_ATTR_SYSTEM_WOF_DISABLE_OFF)
+ {
+ uint16_t l_iac_tdp_vdn = get_iac_vdn_value (l_vpd_vdn_mv, l_iddqt, l_nest_leakage_for_occ,
+ l_vpd_idn_100ma);
- FAPI_INF("l_occppb.ceff_tdp_vdn %x", revle16(l_occppb.ceff_tdp_vdn));
+ if (!l_iac_tdp_vdn)
+ {
+ l_state.iv_wof_enabled = false;
+ }
+ else
+ {
+ l_occppb.ceff_tdp_vdn = revle16(pstate_calculate_effective_capacitance(l_iac_tdp_vdn,
+ l_vpd_vdn_mv * 1000,
+ l_pbus_nest_freq));
+ }
+ FAPI_INF("l_iac_tdp_vdn %x", l_iac_tdp_vdn);
+ FAPI_INF("l_occppb.ceff_tdp_vdn %x", revle16(l_occppb.ceff_tdp_vdn));
+ }
+ else
+ {
+ l_state.iv_wof_enabled = false;
+ }
// @todo RTC 161279 - Need Pstate 0 definition and freq2pstate function to be coded
Pstate pstate_min;
- rc = freq2pState(&l_globalppb, revle32(l_occppb.frequency_min_khz), &pstate_min);
+ int rc = freq2pState(&l_globalppb, revle32(l_occppb.frequency_min_khz), &pstate_min);
switch (rc)
{
@@ -516,97 +617,165 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// pstate_max
- // ----------------
- // get Resonant clocking attributes
- // ----------------
- FAPI_INF("Getting Resonant Clocking Parameters Data");
- FAPI_TRY(proc_res_clock_setup(i_target, &l_resclk_setup, &l_globalppb));
- // Resonant Clock Grid Management Setup
- l_localppb.resclk = l_resclk_setup;
- l_globalppb.resclk = l_resclk_setup;
-
gppb_print(&(l_globalppb));
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;
- const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
- fapi2::ATTR_SYSTEM_WOF_ENABLED_Type l_wof_state;
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_WOF_ENABLED, FAPI_SYSTEM,
- l_wof_state), "fapiGetAttribute of ATTR_SYSTEM_WOF_ENABLED failed");
//Check WOF is enabled or not
- if (!l_wof_state)
+ io_size = 0;
+
+ if (!attr.attr_system_wof_disable && l_state.iv_wof_enabled)
+ {
+ p9_pstate_wof_initialization(&l_globalppb,
+ o_buf,
+ io_size,
+ &l_state,
+ attr_mvpd_voltage_control[VPD_PV_ULTRA][0]);
+ }
+ else
{
FAPI_INF("WOF is not enabled");
- io_size = 0;
- break;
+ l_state.iv_wof_enabled = false;
}
- //If this attribute is set then read the VFRT data from static table.
- uint8_t l_sys_vfrt_static_data = 0;
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYS_VFRT_STATIC_DATA_ENABLE,
- FAPI_SYSTEM,
- l_sys_vfrt_static_data),
- "Error from FAPI_ATTR_GET for attribute ATTR_SYS_VFRT_STATIC_DATA_ENABLE");
+ l_occppb.wof.wof_enabled = l_state.iv_wof_enabled;
+ // QuadManagerFlags
+ QuadManagerFlags l_qm_flags;
+ FAPI_TRY(p9_pstate_set_global_feature_attributes(i_target,
+ l_state,
+ &l_qm_flags));
+ l_localppb.qmflags = l_qm_flags;
+ // -----------------------------------------------
+ // 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;
+ }
+ while(0);
- //this structure has VFRT header + data
- HomerVFRTLayout_t l_vfrt;
- memset (&l_vfrt, 0, sizeof(l_vfrt));
- uint32_t l_base_state_frequency = attr_mvpd_voltage_control[VPD_PV_ULTRA][0];
- FAPI_INF("Entering WOF initialization part");
+fapi_try_exit:
+ FAPI_INF("< p9_pstate_parameter_block");
- if (l_sys_vfrt_static_data)
- {
- FAPI_DBG("ATTR_SYS_VFRT_STATIC_DATA_ENABLE is SET");
- // Copy WOF header data
- FAPI_INF("WFTH struct size = %d", sizeof(g_wofData));
- memcpy (o_buf, g_wofData, sizeof(g_wofData));
- uint32_t l_index = sizeof(g_wofData);
+ return fapi2::current_err;
+}
+// END OF PSTATE PARAMETER BLOCK function
- WofTablesHeader_t* p_wfth;
- p_wfth = reinterpret_cast<WofTablesHeader_t*>(o_buf);
- FAPI_INF("WFTH: %X", revle32(p_wfth->magic_number));
- for (uint32_t vfrt_index = 0; vfrt_index < (CEF_VDN_INDEX * CEF_VDD_INDEX * ACTIVE_QUADS); ++vfrt_index)
- {
- p9_pstate_update_vfrt (&l_globalppb, g_sysvfrtData, &l_vfrt, l_base_state_frequency);
+void p9_pstate_wof_initialization (const GlobalPstateParmBlock* i_gppb,
+ uint8_t* o_buf,
+ uint32_t& io_size,
+ PSTATE_attribute_state* o_state,
+ const uint32_t i_base_state_frequency)
+{
+ fapi2::ReturnCode l_rc = 0;
+ //If this attribute is set then read the VFRT data from static table.
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+ uint8_t l_sys_vfrt_static_data = 0;
+ FAPI_ATTR_GET(fapi2::ATTR_SYS_VFRT_STATIC_DATA_ENABLE,
+ FAPI_SYSTEM,
+ l_sys_vfrt_static_data);
+
+ //this structure has VFRT header + data
+ HomerVFRTLayout_t l_vfrt;
+ memset (&l_vfrt, 0, sizeof(l_vfrt));
+ FAPI_INF("Entering WOF initialization part");
+
+ if (l_sys_vfrt_static_data)
+ {
+ FAPI_DBG("ATTR_SYS_VFRT_STATIC_DATA_ENABLE is SET");
+ // Copy WOF header data
+ FAPI_INF("WFTH struct size = %d", sizeof(g_wofData));
+ memcpy (o_buf, g_wofData, sizeof(g_wofData));
+ uint32_t l_index = sizeof(g_wofData);
- memcpy(o_buf + l_index, &l_vfrt, sizeof (l_vfrt));
- l_index += sizeof (l_vfrt);
- }
+ WofTablesHeader_t* p_wfth;
+ p_wfth = reinterpret_cast<WofTablesHeader_t*>(o_buf);
+ FAPI_INF("WFTH: %X", revle32(p_wfth->magic_number));
- io_size = l_index;
+ for (uint32_t vfrt_index = 0; vfrt_index < (CEF_VDN_INDEX * CEF_VDD_INDEX * ACTIVE_QUADS); ++vfrt_index)
+ {
+ p9_pstate_update_vfrt (i_gppb,
+ g_sysvfrtData,
+ &l_vfrt,
+ i_base_state_frequency);
+
+ memcpy(o_buf + l_index, &l_vfrt, sizeof (l_vfrt));
+ l_index += sizeof (l_vfrt);
}
- else
+ io_size = l_index;
+ }
+ else
+ {
+ FAPI_DBG("ATTR_SYS_VFRT_STATIC_DATA_ENABLE is not SET");
+
+ do
{
// Read System VFRT data
// Use new to avoid over-running the stack
fapi2::ATTR_WOF_TABLE_DATA_Type* l_wof_table_data =
(fapi2::ATTR_WOF_TABLE_DATA_Type*)new fapi2::ATTR_WOF_TABLE_DATA_Type;
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_WOF_TABLE_DATA, FAPI_SYSTEM,
- (*l_wof_table_data)), "fapiGetAttribute of ATTR_WOF_TABLE_DATA failed");
+ l_rc = FAPI_ATTR_GET(fapi2::ATTR_WOF_TABLE_DATA,
+ FAPI_SYSTEM,
+ (*l_wof_table_data));
+ if (l_rc)
+ {
+ o_state->iv_wof_enabled = false;
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_FUNCTION_FAIL(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(FAPI_SYSTEM)
+ .set_FAPI_RC(l_rc),
+ "Pstate Parameter Block ATTR_WOF_TABLE_DATA attribute failed");
+ break;
+ }
- FAPI_DBG("ATTR_SYS_VFRT_STATIC_DATA_ENABLE is not SET");
// Copy WOF header data
FAPI_INF("WFTH struct size = %d", sizeof(g_wofData));
memcpy (o_buf, (*l_wof_table_data), sizeof(WofTablesHeader_t));
uint32_t l_wof_table_index = sizeof(WofTablesHeader_t);
uint32_t l_index = sizeof(WofTablesHeader_t);
+ //Validate WOF header part
WofTablesHeader_t* p_wfth;
p_wfth = reinterpret_cast<WofTablesHeader_t*>(o_buf);
FAPI_INF("WFTH: %X", revle32(p_wfth->magic_number));
+ bool l_wof_header_data_state = 1;
+ VALIDATE_WOF_HEADER_DATA(p_wfth->magic_number,
+ p_wfth->reserved_version,
+ p_wfth->vfrt_block_size,
+ p_wfth->vfrt_block_header_size,
+ p_wfth->vfrt_data_size,
+ p_wfth->quads_active_size,
+ p_wfth->core_count,
+ l_wof_header_data_state);
+
+ if (!l_wof_header_data_state)
+ {
+ o_state->iv_wof_enabled = false;
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_WOF_HEADER_DATA_INVALID(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(FAPI_SYSTEM)
+ .set_MAGIC_NUMBER(p_wfth->magic_number)
+ .set_VERSION(p_wfth->reserved_version)
+ .set_VFRT_BLOCK_SIZE(p_wfth->vfrt_block_size)
+ .set_VFRT_HEADER_SIZE(p_wfth->vfrt_block_header_size)
+ .set_VFRT_DATA_SIZE(p_wfth->vfrt_data_size)
+ .set_QUADS_ACTIVE_SIZE(p_wfth->quads_active_size)
+ .set_CORE_COUNT(p_wfth->core_count),
+ "Pstate Parameter Block ATTR_WOF_TABLE_DATA attribute failed");
+ break;
+
+ }
+
// Convert system vfrt to homer vfrt
for (uint32_t vfrt_index = 0; vfrt_index < (CEF_VDN_INDEX * CEF_VDD_INDEX * ACTIVE_QUADS); ++vfrt_index)
{
- p9_pstate_update_vfrt (&l_globalppb, ((*l_wof_table_data) + l_wof_table_index), &l_vfrt, l_base_state_frequency);
+ p9_pstate_update_vfrt (i_gppb,
+ ((*l_wof_table_data) + l_wof_table_index),
+ &l_vfrt,
+ i_base_state_frequency);
l_wof_table_index += 128; //System vFRT size is 128B..hence need to jump after each VFRT entry
memcpy(o_buf + l_index, &l_vfrt, sizeof (l_vfrt));
@@ -616,17 +785,12 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
io_size = l_index;
delete l_wof_table_data;
- }
- }
- while(0);
+ } while(0);
-fapi_try_exit:
- FAPI_INF("< p9_pstate_parameter_block");
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
- return fapi2::current_err;
+ }
}
-// END OF PSTATE PARAMETER BLOCK function
-
// START OF GET ATTRIBUTES function
fapi2::ReturnCode
@@ -638,6 +802,9 @@ proc_get_attributes ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
const uint32_t EXT_VRM_TRANSITION_RATE_DEC_UV_PER_US = 10000;
const uint32_t EXT_VRM_STABILIZATION_TIME_NS = 5;
const uint32_t EXT_VRM_STEPSIZE_MV = 50;
+
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+
// --------------------------
// attributes not yet defined
// --------------------------
@@ -666,8 +833,8 @@ proc_get_attributes ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
// attributes currently defined
// ----------------------------
#define DATABLOCK_GET_ATTR(attr_name, target, attr_assign) \
- FAPI_TRY(FAPI_ATTR_GET(fapi2::attr_name, target, io_attr->attr_assign),"Attribute read failed"); \
- FAPI_INF("%-60s = 0x%08x %u", #attr_name, io_attr->attr_assign, io_attr->attr_assign);
+FAPI_TRY(FAPI_ATTR_GET(fapi2::attr_name, target, io_attr->attr_assign),"Attribute read failed"); \
+FAPI_INF("%-60s = 0x%08x %u", #attr_name, io_attr->attr_assign, io_attr->attr_assign);
// Frequency Bias attributes
DATABLOCK_GET_ATTR(ATTR_FREQ_BIAS_ULTRATURBO, i_target, attr_freq_bias_ultraturbo);
@@ -689,15 +856,13 @@ proc_get_attributes ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
DATABLOCK_GET_ATTR(ATTR_VOLTAGE_INT_VDD_BIAS_POWERSAVE, i_target, attr_voltage_int_vdd_bias_powersave);
// Frequency attributes
- DATABLOCK_GET_ATTR(ATTR_FREQ_PROC_REFCLOCK_KHZ, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- attr_freq_proc_refclock_khz);
- DATABLOCK_GET_ATTR(ATTR_FREQ_PB_MHZ, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- attr_nest_frequency_mhz);
- DATABLOCK_GET_ATTR(ATTR_FREQ_CORE_CEILING_MHZ, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), attr_freq_core_ceiling_mhz);
+ DATABLOCK_GET_ATTR(ATTR_FREQ_PROC_REFCLOCK_KHZ, FAPI_SYSTEM, attr_freq_proc_refclock_khz);
+ DATABLOCK_GET_ATTR(ATTR_FREQ_PB_MHZ, FAPI_SYSTEM, attr_nest_frequency_mhz);
+ DATABLOCK_GET_ATTR(ATTR_FREQ_CORE_CEILING_MHZ, FAPI_SYSTEM, attr_freq_core_ceiling_mhz);
// @todo RTC 169768 Safe mode and use of boot mode
-// DATABLOCK_GET_ATTR(ATTR_PM_SAFE_FREQUENCY_MHZ, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), attr_pm_safe_frequency_mhz);
-// DATABLOCK_GET_ATTR(ATTR_PM_SAFE_VOLTAGE_MV, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), attr_pm_safe_voltage_mv);
- DATABLOCK_GET_ATTR(ATTR_FREQ_CORE_FLOOR_MHZ, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), attr_freq_core_floor_mhz);
+// DATABLOCK_GET_ATTR(ATTR_PM_SAFE_FREQUENCY_MHZ, FAPI_SYSTEM, attr_pm_safe_frequency_mhz);
+// DATABLOCK_GET_ATTR(ATTR_PM_SAFE_VOLTAGE_MV, FAPI_SYSTEM, attr_pm_safe_voltage_mv);
+ DATABLOCK_GET_ATTR(ATTR_FREQ_CORE_FLOOR_MHZ, FAPI_SYSTEM, attr_freq_core_floor_mhz);
// Loadline, Distribution loss and Distribution offset attributes
DATABLOCK_GET_ATTR(ATTR_PROC_R_LOADLINE_VDD_UOHM, i_target, attr_proc_r_loadline_vdd_uohm);
@@ -711,16 +876,15 @@ proc_get_attributes ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
DATABLOCK_GET_ATTR(ATTR_PROC_VRM_VOFFSET_VCS_UV, i_target, attr_proc_vrm_voffset_vcs_uv);
// Read IVRM,WOF and DPLL attributes
- DATABLOCK_GET_ATTR(ATTR_SYSTEM_IVRMS_ENABLED, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), attr_system_ivrms_enabled);
- DATABLOCK_GET_ATTR(ATTR_SYSTEM_WOF_ENABLED, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), attr_system_wof_enabled);
- DATABLOCK_GET_ATTR(ATTR_DPLL_DYNAMIC_FMAX_ENABLE, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- attr_dpll_dynamic_fmax_enable);
- DATABLOCK_GET_ATTR(ATTR_DPLL_DYNAMIC_FMIN_ENABLE, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- attr_dpll_dynamic_fmin_enable);
- DATABLOCK_GET_ATTR(ATTR_DPLL_DROOP_PROTECT_ENABLE, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- attr_dpll_droop_protect_enable);
- DATABLOCK_GET_ATTR(ATTR_SYSTEM_RESCLK_ENABLE, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- attr_resclk_enable);
+ DATABLOCK_GET_ATTR(ATTR_SYSTEM_IVRM_DISABLE, FAPI_SYSTEM, attr_system_ivrm_disable);
+ DATABLOCK_GET_ATTR(ATTR_SYSTEM_WOF_DISABLE, FAPI_SYSTEM, attr_system_wof_disable);
+ DATABLOCK_GET_ATTR(ATTR_SYSTEM_VDM_DISABLE, FAPI_SYSTEM, attr_system_vdm_disable);
+ DATABLOCK_GET_ATTR(ATTR_DPLL_DYNAMIC_FMAX_ENABLE, FAPI_SYSTEM, attr_dpll_dynamic_fmax_enable);
+ DATABLOCK_GET_ATTR(ATTR_DPLL_DYNAMIC_FMIN_ENABLE, FAPI_SYSTEM, attr_dpll_dynamic_fmin_enable);
+ DATABLOCK_GET_ATTR(ATTR_DPLL_DROOP_PROTECT_ENABLE, FAPI_SYSTEM, attr_dpll_droop_protect_enable);
+ DATABLOCK_GET_ATTR(ATTR_SYSTEM_RESCLK_DISABLE, FAPI_SYSTEM, attr_resclk_disable);
+ DATABLOCK_GET_ATTR(ATTR_CHIP_EC_FEATURE_WOF_NOT_SUPPORTED, i_target, attr_dd_wof_not_supported);
+ DATABLOCK_GET_ATTR(ATTR_SYSTEM_PSTATES_MODE, FAPI_SYSTEM, attr_pstate_mode);
DATABLOCK_GET_ATTR(ATTR_TDP_RDP_CURRENT_FACTOR, i_target, attr_tdp_rdp_current_factor);
@@ -731,19 +895,17 @@ proc_get_attributes ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
io_attr->attr_pm_safe_frequency_mhz = io_attr->attr_freq_core_floor_mhz;
- DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_TRANSITION_START_NS, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
+ 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, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
+ 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, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
+ 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, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
+ 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, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- attr_ext_vrm_step_size_mv);
+ DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_STEPSIZE, FAPI_SYSTEM, attr_ext_vrm_step_size_mv);
- DATABLOCK_GET_ATTR(ATTR_NEST_LEAKAGE_PERCENT, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- attr_nest_leakage_percent);
+ DATABLOCK_GET_ATTR(ATTR_NEST_LEAKAGE_PERCENT, FAPI_SYSTEM, attr_nest_leakage_percent);
io_attr->attr_ext_vrm_transition_start_ns =
(io_attr->attr_ext_vrm_transition_start_ns) ? io_attr->attr_ext_vrm_transition_start_ns : EXT_VRM_TRANSITION_START_NS;
@@ -773,15 +935,17 @@ fapi_try_exit:
fapi2::ReturnCode
proc_get_mvpd_data(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
- uint32_t o_attr_mvpd_data[PV_D][PV_W],
- uint32_t* o_valid_pdv_points,
- uint8_t* o_present_chiplets,
- uint8_t& o_bucketId,
- fapi2::voltageBucketData_t* o_poundv_data)
+ uint32_t o_attr_mvpd_data[PV_D][PV_W],
+ uint32_t* o_valid_pdv_points,
+ uint8_t* o_present_chiplets,
+ uint8_t& o_bucketId,
+ fapi2::voltageBucketData_t* o_poundv_data,
+ PSTATE_attribute_state* o_state)
{
std::vector<fapi2::Target<fapi2::TARGET_TYPE_EQ>> l_eqChiplets;
fapi2::voltageBucketData_t l_poundv_data;
+ fapi2::Target<fapi2::TARGET_TYPE_EQ> l_firstEqChiplet;
uint8_t* l_buffer = reinterpret_cast<uint8_t*>(malloc(sizeof(l_poundv_data)) );
uint8_t* l_buffer_inc;
uint32_t chiplet_mvpd_data[PV_D][PV_W];
@@ -855,22 +1019,13 @@ proc_get_mvpd_data(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
chiplet_mvpd_data,
o_valid_pdv_points,
l_chipNum,
- bucket_id));
-
- //@todo-L3 - Error handling from check routine
- // if (l_rc == RC_PROCPM_PSTATE_DATABLOCK_PDV_ZERO_DATA_UT_ERROR)
- // {
- // // Disable WOF
- // i_attr->attr_system_wof_enabled = 0;
- // }
- // else if (l_rc)
- // {
- // break;
- // }
+ bucket_id,
+ o_state));
// on first chiplet put each bucket's data into attr_mvpd_voltage_control
if (first_chplt)
{
+ l_firstEqChiplet = l_eqChiplets[j];
o_bucketId = bucket_id;
for (i = 0; i <= 4; i++)
@@ -892,16 +1047,16 @@ proc_get_mvpd_data(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
(o_attr_mvpd_data[3][0] != chiplet_mvpd_data[3][0]) ||
(o_attr_mvpd_data[4][0] != chiplet_mvpd_data[4][0]) )
{
- //@todo-L3
- //const uint32_t &ATTR_MVPD_DATA_0 = o_attr_mvpd_data[0][0];
- //const uint32_t &ATTR_MVPD_DATA_1 = o_attr_mvpd_data[1][0];
- //const uint32_t &ATTR_MVPD_DATA_2 = o_attr_mvpd_data[2][0];
- //const uint32_t &ATTR_MVPD_DATA_3 = o_attr_mvpd_data[3][0];
- //const uint32_t &ATTR_MVPD_DATA_4 = o_attr_mvpd_data[4][0];
- FAPI_ERR("**** ERROR : frequencies are not the same for each operating point for each chiplet");
- //const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& CHIP_TARGET= i_target;
- //FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_MVPD_CHIPLET_VOLTAGE_NOT_EQUAL);
- break;
+ o_state->iv_pstates_enabled = false;
+ // Error out has Pstate and all dependent functions are suspious.
+ FAPI_ASSERT(false,
+ fapi2::PSTATE_MVPD_CHIPLET_VOLTAGE_NOT_EQUAL()
+ .set_CHIP_TARGET(i_target)
+ .set_CURRENT_EQ_CHIPLET_TARGET(l_eqChiplets[j])
+ .set_FIRST_EQ_CHIPLET_TARGET(l_firstEqChiplet)
+ .set_BUCKET(bucket_id),
+ "frequencies are not the same for each operating point for each chiplet");
+
}
}
@@ -925,6 +1080,12 @@ proc_get_mvpd_data(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
free (l_buffer);
fapi_try_exit:
+
+ if (fapi2::current_err != fapi2::FAPI2_RC_SUCCESS)
+ {
+ o_state->iv_pstates_enabled = false;
+ }
+
return fapi2::current_err;
} // end proc_get_mvpd_data
@@ -934,336 +1095,269 @@ fapi_try_exit:
fapi2::ReturnCode
proc_get_mvpd_iddq( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
- IddqTable* io_iddqt)
+ IddqTable* io_iddqt,
+ PSTATE_attribute_state* o_state)
{
uint8_t* l_buffer_iq_c = reinterpret_cast<uint8_t*>(malloc(IQ_BUFFER_ALLOC));
uint32_t l_record = 0;
- uint8_t* l_buffer_iq_inc;
uint32_t l_bufferSize_iq = IQ_BUFFER_ALLOC;
uint8_t i, j;
- uint8_t l_buffer_data;
- iddq_entry_t l_iddq_data;
- avgtemp_entry_t l_avgtemp_data;
const char* idd_meas_str[IDDQ_MEASUREMENTS] = IDDQ_ARRAY_VOLTAGES_STR;
- char l_buffer_str[128]; // Temporary formatting string buffer
- char l_line_str[128]; // Formatted output line string
-
-// --------------------------------------------
-// Process IQ Keyword (IDDQ) Data
-// --------------------------------------------
+ char l_buffer_str[256]; // Temporary formatting string buffer
+ char l_line_str[256]; // Formatted output line string
- do
+ static const uint32_t IDDQ_DESC_SIZE = 56;
+ static const uint32_t IDDQ_QUAD_SIZE = IDDQ_DESC_SIZE -
+ strlen("Quad X:");
+
+ // --------------------------------------------
+ // Process IQ Keyword (IDDQ) Data
+ // --------------------------------------------
+
+ // clear out buffer to known value before calling fapiGetMvpdField
+ memset(l_buffer_iq_c, 0, IQ_BUFFER_ALLOC);
+
+ // set l_record to appropriate cprx record
+ l_record = (uint32_t)fapi2::MVPD_RECORD_CRP0;
+ l_bufferSize_iq = IQ_BUFFER_ALLOC;
+
+ //First read is to get size of vpd record, note the o_buffer is NULL
+ FAPI_TRY( getMvpdField((fapi2::MvpdRecord)l_record,
+ fapi2::MVPD_KEYWORD_IQ,
+ i_target,
+ NULL,
+ l_bufferSize_iq) );
+
+ //Allocate memory for vpd data
+ l_buffer_iq_c = reinterpret_cast<uint8_t*>(malloc(l_bufferSize_iq));
+
+ // Get Chip IQ MVPD data from the CRPx records
+ FAPI_TRY(getMvpdField((fapi2::MvpdRecord)l_record,
+ fapi2::MVPD_KEYWORD_IQ,
+ i_target,
+ l_buffer_iq_c,
+ l_bufferSize_iq));
+
+ //copy VPD data to IQ structure table
+ memcpy(io_iddqt, l_buffer_iq_c, l_bufferSize_iq);
+
+ //Verify Payload header data.
+ if ( !(io_iddqt->iddq_version) ||
+ !(io_iddqt->good_quads_per_sort) ||
+ !(io_iddqt->good_normal_cores_per_sort) ||
+ !(io_iddqt->good_caches_per_sort))
{
- // clear out buffer to known value before calling fapiGetMvpdField
- memset(l_buffer_iq_c, 0, IQ_BUFFER_ALLOC);
-
- // set l_record to appropriate cprx record
- l_record = (uint32_t)fapi2::MVPD_RECORD_CRP0;
- l_bufferSize_iq = IQ_BUFFER_ALLOC;
+ o_state->iv_wof_enabled = false;
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_IQ_VPD_ERROR(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_VERSION(io_iddqt->iddq_version)
+ .set_GOOD_QUADS_PER_SORT(io_iddqt->good_quads_per_sort)
+ .set_GOOD_NORMAL_CORES_PER_SORT(io_iddqt->good_normal_cores_per_sort)
+ .set_GOOD_CACHES_PER_SORT(io_iddqt->good_caches_per_sort),
+ "Pstate Parameter Block IQ Payload data error being logged");
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ }
- FAPI_DBG("getMvpdField(record %X, keyword %X, iq %p, size %d)", l_record,
- (uint32_t)fapi2::MVPD_KEYWORD_IQ,
- l_buffer_iq_c,
- l_bufferSize_iq);
+ // get IQ version and advance pointer 1-byte
+ FAPI_INF(" IDDQ Version Number = %u", io_iddqt->iddq_version);
+ FAPI_INF(" Sort Info: Good Quads = %02d Good Cores = %02d Good Caches = %02d",
+ io_iddqt->good_quads_per_sort,
+ io_iddqt->good_normal_cores_per_sort,
+ io_iddqt->good_caches_per_sort);
- // Get Chip IQ MVPD data from the CRPx records
- FAPI_TRY(getMvpdField((fapi2::MvpdRecord)l_record,
- fapi2::MVPD_KEYWORD_IQ,
- i_target,
- l_buffer_iq_c,
- l_bufferSize_iq));
+ // get number of good normal cores in each quad
+ strcpy(l_line_str, " Good normal cores:");
+ strcpy(l_buffer_str, "");
- // check buffer size, ssrivath, @TODO L3
- if (l_bufferSize_iq < IQ_BUFFER_SIZE)
- {
- FAPI_ERR("**** ERROR : Wrong size buffer returned from getMvpdField for IQ => %d", l_bufferSize_iq );
- //const uint32_t& BUFFER_SIZE = l_bufferSize_iq;
- //const Target& CHIP_TARGET = i_target;
- //FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_IQ_BUFFER_SIZE_ERROR);
- break;
- }
-
- // use copy of allocated buffer pointer to increment through buffer
- l_buffer_iq_inc = l_buffer_iq_c;
-
- // get IQ version and advance pointer 1-byte
- uint8_t l_iddq_version = *l_buffer_iq_inc;
- io_iddqt->iddq_version = l_iddq_version ;
- FAPI_INF(" IDDQ Version Number = %u", l_iddq_version);
- l_buffer_iq_inc++;
-
- // get number of good quads per sort
- uint8_t l_good_quads_per_sort = *l_buffer_iq_inc;
- io_iddqt->good_quads_per_sort = l_good_quads_per_sort ;
- l_buffer_iq_inc++;
-
- // get number of normal cores per sort
- uint8_t l_good_normal_cores_per_sort = *l_buffer_iq_inc;
- io_iddqt->good_normal_cores_per_sort = l_good_normal_cores_per_sort ;
- l_buffer_iq_inc++;
-
- // get number of good caches per sort
- uint8_t l_good_caches_per_sort = *l_buffer_iq_inc;
- io_iddqt->good_caches_per_sort = l_good_caches_per_sort ;
- l_buffer_iq_inc++;
- FAPI_INF(" Sort Info: Good Quads = %02d Good Caches = %02d Good Cores = %02d",
- l_good_quads_per_sort,
- l_good_caches_per_sort,
- l_good_normal_cores_per_sort);
-
- // get number of good normal cores in each quad
- strcpy(l_line_str, " Good normal cores:");
- strcpy(l_buffer_str, "");
+ for (i = 0; i < MAXIMUM_QUADS; i++)
+ {
+ sprintf(l_buffer_str, " Quad %d = %u ", i, io_iddqt->good_normal_cores[i]);
+ strcat(l_line_str, l_buffer_str);
+ }
- for (i = 0; i < MAXIMUM_QUADS; i++)
- {
- l_buffer_data = *l_buffer_iq_inc;
- io_iddqt->good_normal_cores[i] = l_buffer_data;
- sprintf(l_buffer_str, " Quad %d = %u ", i, l_buffer_data);
- strcat(l_line_str, l_buffer_str);
- l_buffer_iq_inc++;
- }
+ FAPI_INF("%s", l_line_str);
- FAPI_INF("%s", l_line_str);
+ // get number of good caches in each quad
+ strcpy(l_line_str, " Good caches: ");
+ strcpy(l_buffer_str, "");
+ for (i = 0; i < MAXIMUM_QUADS; i++)
+ {
+ sprintf(l_buffer_str, " Quad %d = %u ", i, io_iddqt->good_caches[i]);
+ strcat(l_line_str, l_buffer_str);
+ }
- // get number of good caches in each quad
- strcpy(l_line_str, " Good caches: ");
- strcpy(l_buffer_str, "");
+ FAPI_INF("%s", l_line_str);
- for (i = 0; i < MAXIMUM_QUADS; i++)
- {
- l_buffer_data = *l_buffer_iq_inc;
- io_iddqt->good_caches[i] = l_buffer_data;
- sprintf(l_buffer_str, " Quad %d = %u ", i, l_buffer_data);
- strcat(l_line_str, l_buffer_str);
- l_buffer_iq_inc++;
- }
+ // get RDP TO TDP scalling factor
+ FAPI_INF(" RDP TO TDP scalling factor = %u", revle16(io_iddqt->rdp_to_tdp_scale_factor));
- FAPI_INF("%s", l_line_str);
+ // get WOF IDDQ margin factor
+ FAPI_INF(" WOF IDDQ margin factor = %u", revle16(io_iddqt->wof_iddq_margin_factor));
- // get RDP TO TDP scalling factor
- uint16_t l_rdp_to_tdp_scale_factor = *(reinterpret_cast<uint16_t*>(l_buffer_iq_inc));
- io_iddqt->rdp_to_tdp_scale_factor = revle16(l_rdp_to_tdp_scale_factor);
- FAPI_INF(" RDP TO TDP scalling factor = %u", io_iddqt->rdp_to_tdp_scale_factor);
- l_buffer_iq_inc += 2;
-
- // get WOF IDDQ margin factor
- uint16_t l_wof_iddq_margin_factor = *(reinterpret_cast<uint16_t*>(l_buffer_iq_inc));
- io_iddqt->wof_iddq_margin_factor = revle16(l_wof_iddq_margin_factor);
- FAPI_INF(" WOF IDDQ margin factor = %u", io_iddqt->wof_iddq_margin_factor);
- l_buffer_iq_inc += 2;
-
- // get VDD Temperature scaling factor
- uint16_t l_temperature_scale_factor = *(reinterpret_cast<uint16_t*>(l_buffer_iq_inc));
- io_iddqt->vdd_temperature_scale_factor = revle16(l_temperature_scale_factor);
- FAPI_INF(" VDD Temperature scaling factor = %u", io_iddqt->vdd_temperature_scale_factor);
- l_buffer_iq_inc += 2;
-
- // get VDN Temperature scaling factor
- l_temperature_scale_factor = *(reinterpret_cast<uint16_t*>(l_buffer_iq_inc));
- io_iddqt->vdn_temperature_scale_factor = revle16(l_temperature_scale_factor);
- FAPI_INF(" VDN Temperature scaling factor = %u", io_iddqt->vdn_temperature_scale_factor);
- l_buffer_iq_inc += 2;
-
- // get spare data - 8B
- for (i = 0; i < 8; i++)
- {
- l_buffer_data = *l_buffer_iq_inc;
- io_iddqt->spare[i] = l_buffer_data;
- l_buffer_iq_inc++;
- }
+ // get VDD Temperature scaling factor
+ FAPI_INF(" VDD Temperature scaling factor = %u", revle16(io_iddqt->vdd_temperature_scale_factor));
- // Put out the measurement voltages to the trace.
- strcpy(l_line_str, " Measurment voltages: ");
- strcpy(l_buffer_str, "");
+ // get VDN Temperature scaling factor
+ FAPI_INF(" VDN Temperature scaling factor = %u", revle16(io_iddqt->vdn_temperature_scale_factor));
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- sprintf(l_buffer_str, " %sV", idd_meas_str[i]);
- strcat(l_line_str, l_buffer_str);
- }
+ // All IQ IDDQ measurements are at 5mA resolution. The OCC wants to
+ // consume these at 1mA values. thus, all values are multiplied by
+ // 5 upon installation into the paramater block.
+ static const uint32_t CONST_5MA_1MA = 5;
+ FAPI_INF(" IDDQ data is converted 5mA units to 1mA units");
- FAPI_INF("%s", l_line_str);
+ // Put out the measurement voltages to the trace.
+ strcpy(l_line_str, " Measurement voltages:");
+ sprintf(l_buffer_str, "%-*s", IDDQ_DESC_SIZE, l_line_str);
+ strcpy(l_line_str, l_buffer_str);
+ strcpy(l_buffer_str, "");
- // All IQ IDDQ measurements are at 5mA resolution. The OCC wants to
- // consume these at 1mA values. thus, all values are multiplied by
- // 5 upon installation into the paramater block.
- static const uint32_t CONST_5MA_1MA = 5;
- FAPI_INF("IDDQ data is converted 5mA units to 1mA units");
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ sprintf(l_buffer_str, " %sV", idd_meas_str[i]);
+ strcat(l_line_str, l_buffer_str);
+ }
+ FAPI_INF("%s", l_line_str);
- // get IVDDQ measurements with all good cores ON
- strcpy(l_line_str, " IDDQ all good cores ON: ");
- strcpy(l_buffer_str, "");
+#define IDDQ_CURRENT_EXTRACT(_member) \
+ io_iddqt->_member = revle16(io_iddqt->_member) * CONST_5MA_1MA; \
+ sprintf(l_buffer_str, " %04u ", io_iddqt->_member); \
+ strcat(l_line_str, l_buffer_str);
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- l_iddq_data = *(reinterpret_cast<iddq_entry_t*>(l_buffer_iq_inc));
- io_iddqt->ivdd_all_good_cores_on_caches_on[i] = revle16(l_iddq_data) * CONST_5MA_1MA;
- l_buffer_iq_inc += sizeof(iddq_entry_t);
- sprintf(l_buffer_str, " %04u ", io_iddqt->ivdd_all_good_cores_on_caches_on[i]);
- strcat(l_line_str, l_buffer_str);
- }
+#define IDDQ_TEMP_EXTRACT(_member) \
+ sprintf(l_buffer_str, " %04u ", io_iddqt->_member); \
+ strcat(l_line_str, l_buffer_str);
- FAPI_INF("%s", l_line_str);
+#define IDDQ_TRACE(string, size) \
+ strcpy(l_line_str, string); \
+ sprintf(l_buffer_str, "%-*s", size, l_line_str);\
+ strcpy(l_line_str, l_buffer_str); \
+ strcpy(l_buffer_str, "");
- // get IVDDQ measurements with all cores and caches OFF
- strcpy(l_line_str, " IVDDQ all cores and caches OFF: ");
- strcpy(l_buffer_str, "");
+ // get IVDDQ measurements with all good cores ON
+ IDDQ_TRACE (" IDDQ all good cores ON:", IDDQ_DESC_SIZE);
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- l_iddq_data = *(reinterpret_cast<iddq_entry_t*>(l_buffer_iq_inc));
- io_iddqt->ivdd_all_cores_off_caches_off[i] = revle16(l_iddq_data) * CONST_5MA_1MA;
- l_buffer_iq_inc += sizeof(iddq_entry_t);
- sprintf(l_buffer_str, " %04u ", io_iddqt->ivdd_all_cores_off_caches_off[i]);
- strcat(l_line_str, l_buffer_str);
- }
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_CURRENT_EXTRACT(ivdd_all_good_cores_on_caches_on[i]);
+ }
- FAPI_INF("%s", l_line_str);;
+ FAPI_INF("%s", l_line_str);
- // get IVDDQ measurements with all good cores OFF and caches ON
- strcpy(l_line_str, " IVDDQ all good cores OFF and caches ON: ");
- strcpy(l_buffer_str, "");
+ // get IVDDQ measurements with all cores and caches OFF
+ IDDQ_TRACE (" IVDDQ all cores and caches OFF:", IDDQ_DESC_SIZE);
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- l_iddq_data = *(reinterpret_cast<iddq_entry_t*>(l_buffer_iq_inc));
- io_iddqt->ivdd_all_good_cores_off_good_caches_on[i] =
- revle16(l_iddq_data) * CONST_5MA_1MA;
- l_buffer_iq_inc += sizeof(iddq_entry_t);
- sprintf(l_buffer_str, " %04u ", io_iddqt->ivdd_all_good_cores_off_good_caches_on[i]);
- strcat(l_line_str, l_buffer_str);
- }
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_CURRENT_EXTRACT(ivdd_all_cores_off_caches_off[i]);
+ }
- FAPI_INF("%s", l_line_str);
+ FAPI_INF("%s", l_line_str);;
- // get IVDDQ measurements with all good cores in each quad
- for (i = 0; i < MAXIMUM_QUADS; i++)
- {
- strcpy(l_line_str, " IVDDQ all good cores ON and caches ON: ");
- strcpy(l_buffer_str, "");
- sprintf(l_buffer_str, "Quad %d:", i);
- strcat(l_line_str, l_buffer_str);
+ // get IVDDQ measurements with all good cores OFF and caches ON
+ IDDQ_TRACE (" IVDDQ all good cores OFF and caches ON:", IDDQ_DESC_SIZE);
- for (j = 0; j < IDDQ_MEASUREMENTS; j++)
- {
- l_iddq_data = *(reinterpret_cast<iddq_entry_t*>(l_buffer_iq_inc));
- io_iddqt->ivdd_quad_good_cores_on_good_caches_on[i][j] =
- revle16(l_iddq_data) * CONST_5MA_1MA;
- l_buffer_iq_inc += sizeof(iddq_entry_t);
- sprintf(l_buffer_str, " %04u ", io_iddqt->ivdd_quad_good_cores_on_good_caches_on[i][j]);
- strcat(l_line_str, l_buffer_str);
- }
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_CURRENT_EXTRACT(ivdd_all_good_cores_off_good_caches_on[i]);
+ }
- FAPI_INF("%s", l_line_str);
- }
+ FAPI_INF("%s", l_line_str);
- // get IVDN data
- strcpy(l_line_str, " IVDN ");
- strcpy(l_buffer_str, "");
+ // get IVDDQ measurements with all good cores in each quad
+ for (i = 0; i < MAXIMUM_QUADS; i++)
+ {
+ IDDQ_TRACE (" IVDDQ all good cores ON and caches ON ", IDDQ_QUAD_SIZE);
+ sprintf(l_buffer_str, "Quad %d:", i);
+ strcat(l_line_str, l_buffer_str);
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ for (j = 0; j < IDDQ_MEASUREMENTS; j++)
{
- l_iddq_data = *(reinterpret_cast<iddq_entry_t*>(l_buffer_iq_inc));
- io_iddqt->ivdn[i] = revle16(l_iddq_data) * CONST_5MA_1MA;
- l_buffer_iq_inc += sizeof(iddq_entry_t);
- sprintf(l_buffer_str, " %04u ", io_iddqt->ivdn[i]);
- strcat(l_line_str, l_buffer_str);
+ IDDQ_CURRENT_EXTRACT(ivdd_quad_good_cores_on_good_caches_on[i][j]);
}
FAPI_INF("%s", l_line_str);
+ }
- // get average temperature measurements with all good cores ON
- strcpy(l_line_str, " Measurment voltages: ");
- strcpy(l_line_str, " Average temp all good cores ON: ");
- strcpy(l_buffer_str, "");
+ // get IVDN data
+ IDDQ_TRACE (" IVDN", IDDQ_DESC_SIZE);
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- l_avgtemp_data = *(reinterpret_cast<avgtemp_entry_t*>(l_buffer_iq_inc));
- io_iddqt->avgtemp_all_good_cores_on[i] = l_avgtemp_data;
- sprintf(l_buffer_str, " %02u ", io_iddqt->avgtemp_all_good_cores_on[i]);
- strcat(l_line_str, l_buffer_str);
- l_buffer_iq_inc += sizeof(l_avgtemp_data);
- }
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_CURRENT_EXTRACT(ivdn[i]);
+ }
- FAPI_INF("%s", l_line_str);
+ FAPI_INF("%s", l_line_str);
- // get average temperature measurements with all cores and caches OFF
- strcpy(l_line_str, " Average temp all cores OFF, caches OFF: ");
- strcpy(l_buffer_str, "");
+ // get average temperature measurements with all good cores ON
+ IDDQ_TRACE (" Average temp all good cores ON:",IDDQ_DESC_SIZE);
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- l_avgtemp_data = *(reinterpret_cast<avgtemp_entry_t*>(l_buffer_iq_inc));
- io_iddqt->avgtemp_all_cores_off_caches_off[i] = l_avgtemp_data;
- l_buffer_iq_inc += sizeof(l_avgtemp_data);
- sprintf(l_buffer_str, " %02u ", io_iddqt->avgtemp_all_cores_off_caches_off[i]);
- strcat(l_line_str, l_buffer_str);
- }
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_TEMP_EXTRACT(avgtemp_all_good_cores_on[i]);
+ }
- FAPI_INF("%s", l_line_str);
+ FAPI_INF("%s", l_line_str);
- // get average temperature measurements with all good cores OFF and caches ON
- strcpy(l_line_str, " Average temp all good cores OFF, caches ON: ");
- strcpy(l_buffer_str, "");
+ // get average temperature measurements with all cores and caches OFF
+ IDDQ_TRACE (" Average temp all cores OFF, caches OFF:", IDDQ_DESC_SIZE);
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- l_avgtemp_data = *(reinterpret_cast<avgtemp_entry_t*>(l_buffer_iq_inc));
- io_iddqt->avgtemp_all_good_cores_off[i] = l_avgtemp_data;
- l_buffer_iq_inc += sizeof(l_avgtemp_data);
- sprintf(l_buffer_str, " %02u ", io_iddqt->avgtemp_all_good_cores_off[i]);
- strcat(l_line_str, l_buffer_str);
- }
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_TEMP_EXTRACT(avgtemp_all_cores_off_caches_off[i]);
+ }
- FAPI_INF("%s", l_line_str);
+ FAPI_INF("%s", l_line_str);
- // get average temperature measurements with all good cores in each quad
- for (i = 0; i < MAXIMUM_QUADS; i++)
- {
- strcpy(l_line_str, " Average temp all good cores ON: ");
- strcpy(l_buffer_str, "");
- sprintf(l_buffer_str, "Quad %d: ", i);
- strcat(l_line_str, l_buffer_str);
+ // get average temperature measurements with all good cores OFF and caches ON
+ IDDQ_TRACE (" Average temp all good cores OFF, caches ON:",IDDQ_DESC_SIZE);
- for (j = 0; j < IDDQ_MEASUREMENTS; j++)
- {
- l_avgtemp_data = *(reinterpret_cast<avgtemp_entry_t*>(l_buffer_iq_inc));
- io_iddqt->avgtemp_quad_good_cores_on[i][j] = l_avgtemp_data;
- l_buffer_iq_inc += sizeof(l_avgtemp_data);
- sprintf(l_buffer_str, " %02u ", io_iddqt->avgtemp_quad_good_cores_on[i][j]);
- strcat(l_line_str, l_buffer_str);
- }
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_TEMP_EXTRACT(avgtemp_all_good_cores_off[i]);
+ }
- FAPI_INF("%s", l_line_str);
- }
+ FAPI_INF("%s", l_line_str);
- // get average nest temperature nest
- strcpy(l_line_str, " Average temp Nest: ");
- strcpy(l_buffer_str, "");
+ // get average temperature measurements with all good cores in each quad
+ for (i = 0; i < MAXIMUM_QUADS; i++)
+ {
+ IDDQ_TRACE (" Average temp all good cores ON, good caches ON ",IDDQ_QUAD_SIZE);
+ sprintf(l_buffer_str, "Quad %d:", i);
+ strcat(l_line_str, l_buffer_str);
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ for (j = 0; j < IDDQ_MEASUREMENTS; j++)
{
- l_avgtemp_data = *(reinterpret_cast<avgtemp_entry_t*>(l_buffer_iq_inc));
- io_iddqt->avgtemp_vdn[i] = l_avgtemp_data;
- l_buffer_iq_inc += sizeof(l_avgtemp_data);
- sprintf(l_buffer_str, " %02u ", io_iddqt->avgtemp_vdn[i]);
- strcat(l_line_str, l_buffer_str);
+ IDDQ_TEMP_EXTRACT(avgtemp_quad_good_cores_on[i][j]);
}
FAPI_INF("%s", l_line_str);
+ }
+ // get average nest temperature nest
+ IDDQ_TRACE (" Average temp Nest:",IDDQ_DESC_SIZE);
+
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_TEMP_EXTRACT(avgtemp_vdn[i]);
}
- while(0);
+
+ FAPI_INF("%s", l_line_str);
+
+fapi_try_exit:
// Free up memory buffer
free(l_buffer_iq_c);
-fapi_try_exit:
+ if (fapi2::current_err != fapi2::FAPI2_RC_SUCCESS)
+ {
+ o_state->iv_wof_enabled = false;
+ }
+
return fapi2::current_err;
} // proc_get_mvdp_iddq
@@ -1394,150 +1488,178 @@ proc_get_extint_bias( uint32_t io_attr_mvpd_data[PV_D][PV_W],
/// ssrivath END OF BIAS APPLICATION FUNCTION
+bool
+is_wof_enabled()
+{
+ return (!(attr.attr_system_wof_disable) && !(attr.attr_dd_wof_not_supported)) ? true : false;
+}
+
+
fapi2::ReturnCode
proc_chk_valid_poundv(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
const uint32_t i_chiplet_mvpd_data[PV_D][PV_W],
uint32_t* o_valid_pdv_points,
const uint8_t i_chiplet_num,
- const uint8_t i_bucket_id)
+ const uint8_t i_bucket_id,
+ PSTATE_attribute_state* o_state)
{
-
const uint8_t pv_op_order[NUM_OP_POINTS] = VPD_PV_ORDER;
- const char* pv_op_str[NUM_OP_POINTS] = VPD_PV_ORDER_STR;
- uint8_t i = 0;
- bool suspend_ut_check = false;
- uint8_t l_attr_system_wof_enabled;
+ const char* pv_op_str[NUM_OP_POINTS] = VPD_PV_ORDER_STR;
+ uint8_t i = 0;
+ bool suspend_ut_check = false;
- do
- {
+ FAPI_INF(">> proc_chk_valid_poundv");
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_WOF_ENABLED, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- l_attr_system_wof_enabled));
-
- // check for non-zero freq, voltage, or current in valid operating points
- for (i = 0; i <= NUM_OP_POINTS - 1; i++)
+ // check for non-zero freq, voltage, or current in valid operating points
+ for (i = 0; i <= NUM_OP_POINTS - 1; i++)
+ {
+ FAPI_INF("Checking for Zero valued data in each #V operating point (%s) f=%u v=%u i=%u v=%u i=%u",
+ pv_op_str[pv_op_order[i]],
+ i_chiplet_mvpd_data[pv_op_order[i]][0],
+ i_chiplet_mvpd_data[pv_op_order[i]][1],
+ i_chiplet_mvpd_data[pv_op_order[i]][2],
+ i_chiplet_mvpd_data[pv_op_order[i]][3],
+ i_chiplet_mvpd_data[pv_op_order[i]][4]);
+
+ if (is_wof_enabled() && (strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))
{
- FAPI_INF("Checking for Zero valued data in each #V operating point (%s) f=%u v=%u i=%u v=%u i=%u",
- pv_op_str[pv_op_order[i]],
- i_chiplet_mvpd_data[pv_op_order[i]][0],
- i_chiplet_mvpd_data[pv_op_order[i]][1],
- i_chiplet_mvpd_data[pv_op_order[i]][2],
- i_chiplet_mvpd_data[pv_op_order[i]][3],
- i_chiplet_mvpd_data[pv_op_order[i]][4]);
-
- if (l_attr_system_wof_enabled && (strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))
+
+ if (i_chiplet_mvpd_data[pv_op_order[i]][0] == 0 ||
+ i_chiplet_mvpd_data[pv_op_order[i]][1] == 0 ||
+ i_chiplet_mvpd_data[pv_op_order[i]][2] == 0 ||
+ i_chiplet_mvpd_data[pv_op_order[i]][3] == 0 ||
+ i_chiplet_mvpd_data[pv_op_order[i]][4] == 0 )
{
- if (i_chiplet_mvpd_data[pv_op_order[i]][0] == 0 ||
- i_chiplet_mvpd_data[pv_op_order[i]][1] == 0 ||
- i_chiplet_mvpd_data[pv_op_order[i]][2] == 0 ||
- i_chiplet_mvpd_data[pv_op_order[i]][3] == 0 ||
- i_chiplet_mvpd_data[pv_op_order[i]][4] == 0 )
- {
+ FAPI_INF("**** WARNING: WOF is enabled but zero valued data found in #V (chiplet = %u bucket id = %u op point = %s)",
+ i_chiplet_num, i_bucket_id, pv_op_str[pv_op_order[i]]);
+ FAPI_INF("**** WARNING: Disabling WOF and continuing");
+ suspend_ut_check = true;
- FAPI_INF("**** WARNING: WOF is enabled but zero valued data found in #V (chiplet = %u bucket id = %u op point = %s)",
- i_chiplet_num, i_bucket_id, pv_op_str[pv_op_order[i]]);
- FAPI_INF("**** WARNING: Disabling WOF and continuing");
- //@todo-L3
- //const uint8_t& OP_POINT = pv_op_order[i];
- //const uint8_t& CHIPLET_NUM = i_chiplet_num;
- //const uint8_t& BUCKET_ID = i_bucket_id;
- //const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& CHIP_TARGET= i_target;
- //FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_PDV_ZERO_DATA_UT_ERROR);
- suspend_ut_check = true;
+ // Set ATTR_WOF_ENABLED so the caller can set header flags
+ {
+ o_state->iv_wof_enabled = false;
}
+
+ // Take out an informational error log and then keep going.
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_POUNDV_WOF_UT_ERROR(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_CHIPLET_NUMBER(i_chiplet_num)
+ .set_BUCKET(i_bucket_id)
+ .set_FREQUENCY(i_chiplet_mvpd_data[pv_op_order[i]][0])
+ .set_VDD(i_chiplet_mvpd_data[pv_op_order[i]][1])
+ .set_IDD(i_chiplet_mvpd_data[pv_op_order[i]][2])
+ .set_VCS(i_chiplet_mvpd_data[pv_op_order[i]][3])
+ .set_ICS(i_chiplet_mvpd_data[pv_op_order[i]][4]),
+ "Pstate Parameter Block WOF #V UT error being logged");
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
}
- else if ((!l_attr_system_wof_enabled) && (strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))
- {
- FAPI_INF("**** NOTE: WOF is disabled so the UltraTurbo VPD is not being checked");
- suspend_ut_check = true;
- }
- else
+ }
+ else if ((!is_wof_enabled()) && (strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))
+ {
+ FAPI_INF("**** NOTE: WOF is disabled so the UltraTurbo VPD is not being checked");
+ suspend_ut_check = true;
+ }
+ else
+ {
+
+ if (i_chiplet_mvpd_data[pv_op_order[i]][0] == 0 ||
+ i_chiplet_mvpd_data[pv_op_order[i]][1] == 0 ||
+ i_chiplet_mvpd_data[pv_op_order[i]][2] == 0 ||
+ i_chiplet_mvpd_data[pv_op_order[i]][3] == 0 ||
+ i_chiplet_mvpd_data[pv_op_order[i]][4] == 0 )
{
- if (i_chiplet_mvpd_data[pv_op_order[i]][0] == 0 ||
- i_chiplet_mvpd_data[pv_op_order[i]][1] == 0 ||
- i_chiplet_mvpd_data[pv_op_order[i]][2] == 0 ||
- i_chiplet_mvpd_data[pv_op_order[i]][3] == 0 ||
- i_chiplet_mvpd_data[pv_op_order[i]][4] == 0 )
- {
+ FAPI_ERR("**** ERROR : Zero valued data found in #V (chiplet = %u bucket id = %u op point = %s)",
+ i_chiplet_num, i_bucket_id, pv_op_str[pv_op_order[i]]);
- FAPI_ERR("**** ERROR : Zero valued data found in #V (chiplet = %u bucket id = %u op point = %s)",
- i_chiplet_num, i_bucket_id, pv_op_str[pv_op_order[i]]);
- //@todo-L3
- //const uint8_t& OP_POINT = pv_op_order[i];
- //const uint8_t& CHIPLET_NUM = i_chiplet_num;
- //const uint8_t& BUCKET_ID = i_bucket_id;
- //const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& CHIP_TARGET= i_target;
- //FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_PDV_ZERO_DATA_ERROR);
- break;
+ {
+ o_state->iv_pstates_enabled = false;
}
+
+ // Error out has Pstate and all dependent functions are suspious.
+ FAPI_ASSERT(false,
+ fapi2::PSTATE_PB_POUNDV_ZERO_ERROR()
+ .set_CHIP_TARGET(i_target)
+ .set_CHIPLET_NUMBER(i_chiplet_num)
+ .set_BUCKET(i_bucket_id)
+ .set_POINT(i)
+ .set_FREQUENCY(i_chiplet_mvpd_data[pv_op_order[i]][0])
+ .set_VDD(i_chiplet_mvpd_data[pv_op_order[i]][1])
+ .set_IDD(i_chiplet_mvpd_data[pv_op_order[i]][2])
+ .set_VCS(i_chiplet_mvpd_data[pv_op_order[i]][3])
+ .set_ICS(i_chiplet_mvpd_data[pv_op_order[i]][4]),
+ "Pstate Parameter Block #V Zero contents error being logged");
}
}
+ }
- //@todo - L3
- // if (l_rc)
- // {
- // // If an error was found where suspension was flagged, keep going.
- // // If not, break to exit point.
- // if (!suspend_ut_check)
- // break;
- // }
-
+ // Adjust the valid operating point based on UltraTurbo presence
+ // and WOF enablement
+ *o_valid_pdv_points = NUM_OP_POINTS;
- // Adjust the valid operating point based on UltraTurbo presence
- // and WOF enablement
- *o_valid_pdv_points = NUM_OP_POINTS;
+ if (suspend_ut_check)
+ {
+ (*o_valid_pdv_points)--;
+ }
- if (suspend_ut_check)
- {
- (*o_valid_pdv_points)--;
- }
+ FAPI_DBG("o_valid_pdv_points = %d", *o_valid_pdv_points);
- FAPI_DBG("o_valid_pdv_points = %d", *o_valid_pdv_points);
+ // check valid operating points' values have this relationship (power save <= nominal <= turbo <= ultraturbo)
+ for (i = 1; i <= (*o_valid_pdv_points) - 1; i++)
+ {
- // check valid operating points' values have this relationship (power save <= nominal <= turbo <= ultraturbo)
- for (i = 1; i <= (*o_valid_pdv_points) - 1; i++)
+ 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", i_chiplet_mvpd_data[pv_op_order[i - 1]][0],
+ i_chiplet_mvpd_data[pv_op_order[i]][0]);
+ FAPI_INF(" v=%u <= v=%u i=%u <= i=%u", i_chiplet_mvpd_data[pv_op_order[i - 1]][1],
+ i_chiplet_mvpd_data[pv_op_order[i]][1], i_chiplet_mvpd_data[pv_op_order[i - 1]][2],
+ i_chiplet_mvpd_data[pv_op_order[i]][2]);
+ FAPI_INF(" v=%u <= v=%u i=%u <= i=%u", i_chiplet_mvpd_data[pv_op_order[i - 1]][3],
+ i_chiplet_mvpd_data[pv_op_order[i]][3], i_chiplet_mvpd_data[pv_op_order[i - 1]][4],
+ i_chiplet_mvpd_data[pv_op_order[i]][4]);
+
+ // Only skip checkinug for WOF not enabled and UltraTurbo.
+ if (is_wof_enabled() || (!( !is_wof_enabled() && (strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))))
{
-
- 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", i_chiplet_mvpd_data[pv_op_order[i - 1]][0],
- i_chiplet_mvpd_data[pv_op_order[i]][0]);
- FAPI_INF(" v=%u <= v=%u i=%u <= i=%u", i_chiplet_mvpd_data[pv_op_order[i - 1]][1],
- i_chiplet_mvpd_data[pv_op_order[i]][1], i_chiplet_mvpd_data[pv_op_order[i - 1]][2],
- i_chiplet_mvpd_data[pv_op_order[i]][2]);
- FAPI_INF(" v=%u <= v=%u i=%u <= i=%u", i_chiplet_mvpd_data[pv_op_order[i - 1]][3],
- i_chiplet_mvpd_data[pv_op_order[i]][3], i_chiplet_mvpd_data[pv_op_order[i - 1]][4],
- i_chiplet_mvpd_data[pv_op_order[i]][4]);
-
- if (l_attr_system_wof_enabled && strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") && !suspend_ut_check )
+ if (i_chiplet_mvpd_data[pv_op_order[i - 1]][0] > i_chiplet_mvpd_data[pv_op_order[i]][0] ||
+ i_chiplet_mvpd_data[pv_op_order[i - 1]][1] > i_chiplet_mvpd_data[pv_op_order[i]][1] ||
+ i_chiplet_mvpd_data[pv_op_order[i - 1]][2] > i_chiplet_mvpd_data[pv_op_order[i]][2] ||
+ i_chiplet_mvpd_data[pv_op_order[i - 1]][3] > i_chiplet_mvpd_data[pv_op_order[i]][3] ||
+ i_chiplet_mvpd_data[pv_op_order[i - 1]][4] > i_chiplet_mvpd_data[pv_op_order[i]][4] )
{
- if (i_chiplet_mvpd_data[pv_op_order[i - 1]][0] > i_chiplet_mvpd_data[pv_op_order[i]][0] ||
- i_chiplet_mvpd_data[pv_op_order[i - 1]][1] > i_chiplet_mvpd_data[pv_op_order[i]][1] ||
- i_chiplet_mvpd_data[pv_op_order[i - 1]][2] > i_chiplet_mvpd_data[pv_op_order[i]][2] ||
- i_chiplet_mvpd_data[pv_op_order[i - 1]][3] > i_chiplet_mvpd_data[pv_op_order[i]][3] ||
- i_chiplet_mvpd_data[pv_op_order[i - 1]][4] > i_chiplet_mvpd_data[pv_op_order[i]][4] )
- {
- FAPI_ERR("**** ERROR : Relationship error between #V operating point (%s <= %s)(power save <= nominal <= turbo <= ultraturbo) (chiplet = %u bucket id = %u op point = %u)",
- pv_op_str[pv_op_order[i - 1]], pv_op_str[pv_op_order[i]], i_chiplet_num, i_bucket_id,
- pv_op_order[i]);
- //@todo-L3
- //const uint8_t& OP_POINT = pv_op_order[i];
- //const uint8_t& CHIPLET_NUM = i_chiplet_num;
- //const uint8_t& BUCKET_ID = i_bucket_id;
- //const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& CHIP_TARGET= i_target;
- //FAPI_SET_HWP_ERROR(l_rc, RC_PROCPM_PSTATE_DATABLOCK_PDV_OPPOINT_ORDER_ERROR);
- break;
- }
+ FAPI_ERR("**** ERROR : Relationship error between #V operating point (%s <= %s)(power save <= nominal <= turbo <= ultraturbo) (chiplet = %u bucket id = %u op point = %u)",
+ pv_op_str[pv_op_order[i - 1]], pv_op_str[pv_op_order[i]], i_chiplet_num, i_bucket_id,
+ pv_op_order[i]);
+
+
+ // Error out has Pstate and all dependent functions are suspious.
+ FAPI_ASSERT(false,
+ fapi2::PSTATE_PB_POUNDV_SLOPE_ERROR()
+ .set_CHIP_TARGET(i_target)
+ .set_CHIPLET_NUMBER(i_chiplet_num)
+ .set_BUCKET(i_bucket_id)
+ .set_POINT(i)
+ .set_FREQUENCY_A(i_chiplet_mvpd_data[pv_op_order[i]][0])
+ .set_VDD_A(i_chiplet_mvpd_data[pv_op_order[i]][1])
+ .set_IDD_A(i_chiplet_mvpd_data[pv_op_order[i]][2])
+ .set_VCS_A(i_chiplet_mvpd_data[pv_op_order[i]][3])
+ .set_ICS_A(i_chiplet_mvpd_data[pv_op_order[i]][4])
+ .set_FREQUENCY_B(i_chiplet_mvpd_data[pv_op_order[i]][0])
+ .set_VDD_B(i_chiplet_mvpd_data[pv_op_order[i]][1])
+ .set_IDD_B(i_chiplet_mvpd_data[pv_op_order[i]][2])
+ .set_VCS_B(i_chiplet_mvpd_data[pv_op_order[i]][3])
+ .set_ICS_B(i_chiplet_mvpd_data[pv_op_order[i]][4]),
+ "Pstate Parameter Block #V Zero contents error being logged");
}
}
-
}
- while(0);
fapi_try_exit:
+ FAPI_INF("<< proc_chk_valid_poundv");
return fapi2::current_err;
}
@@ -1562,9 +1684,9 @@ load_mvpd_operating_point ( const uint32_t i_src[PV_D][PV_W],
for (uint32_t i = 0; i < NUM_OP_POINTS; i++)
{
o_dest[i].frequency_mhz = revle32(i_src[pv_op_order[i]][0]);
- o_dest[i].vdd_mv = revle32(i_src[pv_op_order[i]][1]);
+ o_dest[i].vdd_mv = revle32(i_src[pv_op_order[i]][1]);
o_dest[i].idd_100ma = revle32(i_src[pv_op_order[i]][2]);
- o_dest[i].vcs_mv = revle32(i_src[pv_op_order[i]][3]);
+ o_dest[i].vcs_mv = revle32(i_src[pv_op_order[i]][3]);
o_dest[i].ics_100ma = revle32(i_src[pv_op_order[i]][4]);
o_dest[i].pstate = (i_src[ULTRA][0] - i_src[pv_op_order[i]][0]) * 1000 / i_frequency_step_khz;
}
@@ -1574,28 +1696,47 @@ load_mvpd_operating_point ( const uint32_t i_src[PV_D][PV_W],
} // end load_mvpd_operating_point
fapi2::ReturnCode
-proc_get_vdm_parms ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
- GP_VDMParmBlock* o_vdmpb)
+proc_get_vdm_parms (const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const AttributeList* i_attr,
+ GP_VDMParmBlock* o_vdmpb)
{
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDM_DROOP_SMALL_OVERRIDE, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_vdmpb->droop_small_override));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDM_DROOP_LARGE_OVERRIDE, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_vdmpb->droop_large_override));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDM_DROOP_EXTREME_OVERRIDE, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_vdmpb->droop_extreme_override));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDM_OVERVOLT_OVERRIDE, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_vdmpb->overvolt_override));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDM_FMIN_OVERRIDE_KHZ, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_vdmpb->fmin_override_khz));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDM_FMAX_OVERRIDE_KHZ, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_vdmpb->fmax_override_khz));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_VDM_VID_COMPARE_OVERRIDE_MV, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_vdmpb->vid_compare_override_mv));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_DPLL_VDM_RESPONSE, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_vdmpb->vdm_response));
+ FAPI_INF(">> proc_get_vdm_parms");
+ if (i_attr->attr_system_vdm_disable == fapi2::ENUM_ATTR_SYSTEM_VDM_DISABLE_OFF)
+ {
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+ FAPI_TRY(FAPI_ATTR_GET( fapi2::ATTR_VDM_DROOP_SMALL_OVERRIDE,
+ FAPI_SYSTEM,
+ o_vdmpb->droop_small_override));
+ FAPI_TRY(FAPI_ATTR_GET( fapi2::ATTR_VDM_DROOP_LARGE_OVERRIDE,
+ FAPI_SYSTEM,
+ o_vdmpb->droop_large_override));
+ FAPI_TRY(FAPI_ATTR_GET( fapi2::ATTR_VDM_DROOP_EXTREME_OVERRIDE,
+ FAPI_SYSTEM,
+ o_vdmpb->droop_extreme_override));
+ FAPI_TRY(FAPI_ATTR_GET( fapi2::ATTR_VDM_OVERVOLT_OVERRIDE,
+ FAPI_SYSTEM,
+ o_vdmpb->overvolt_override));
+ FAPI_TRY(FAPI_ATTR_GET( fapi2::ATTR_VDM_FMIN_OVERRIDE_KHZ,
+ FAPI_SYSTEM,
+ o_vdmpb->fmin_override_khz));
+ FAPI_TRY(FAPI_ATTR_GET( fapi2::ATTR_VDM_FMAX_OVERRIDE_KHZ,
+ FAPI_SYSTEM,
+ o_vdmpb->fmax_override_khz));
+ FAPI_TRY(FAPI_ATTR_GET( fapi2::ATTR_VDM_VID_COMPARE_OVERRIDE_MV,
+ FAPI_SYSTEM,
+ o_vdmpb->vid_compare_override_mv));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_DPLL_VDM_RESPONSE,
+ FAPI_SYSTEM,
+ o_vdmpb->vdm_response));
+ }
+ else
+ {
+ FAPI_DBG(" VDM is diabled. Skipping VDM attribute accesses");
+ }
fapi_try_exit:
+ FAPI_INF("<< proc_get_vdm_parms");
return fapi2::current_err;
}
@@ -1614,8 +1755,11 @@ proc_res_clock_setup ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targ
uint16_t l_resclk_freq_regions[RESCLK_FREQ_REGIONS];
uint32_t l_ultra_turbo_freq_khz = revle32(i_gppb->reference_frequency_khz);
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_RESCLK_STEP_DELAY, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- l_step_delay_ns));
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+
+ FAPI_TRY(FAPI_ATTR_GET( fapi2::ATTR_SYSTEM_RESCLK_STEP_DELAY,
+ FAPI_SYSTEM,
+ l_step_delay_ns));
o_resclk_setup->step_delay_ns = revle16(l_step_delay_ns);
// Resonant Clocking Frequency and Index arrays
@@ -1672,6 +1816,8 @@ proc_res_clock_setup ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targ
o_resclk_setup->resclk_freq[i] = pstate;
o_resclk_setup->resclk_index[i] = idx;
+
+ FAPI_DBG("Resclk: pstate = %d; idx = %d", pstate, idx);
}
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_RESCLK_L3_VALUE, i_target,
@@ -1697,26 +1843,53 @@ fapi_try_exit:
fapi2::ReturnCode
proc_get_ivrm_parms ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
- IvrmParmBlock* o_ivrmpb)
+ const AttributeList* i_attr,
+ IvrmParmBlock* o_ivrmpb,
+ PSTATE_attribute_state* o_state)
{
FAPI_INF(">> proc_get_ivrm_parms");
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_STRENGTH_LOOKUP, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_ivrmpb->strength_lookup));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_VIN_MULTIPLIER, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_ivrmpb->vin_multiplier));
+ if (i_attr->attr_system_ivrm_disable == fapi2::ENUM_ATTR_SYSTEM_IVRM_DISABLE_OFF)
+ {
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+
+ FAPI_INF(">> proc_get_ivrm_parms");
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_STRENGTH_LOOKUP, FAPI_SYSTEM,
+ o_ivrmpb->strength_lookup));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_VIN_MAX_MV, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_ivrmpb->vin_max_mv));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_VIN_MULTIPLIER, FAPI_SYSTEM,
+ o_ivrmpb->vin_multiplier));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_STEP_DELAY_NS, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_ivrmpb->step_delay_ns));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_VIN_MAX_MV, FAPI_SYSTEM,
+ o_ivrmpb->vin_max_mv));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_STABILIZATION_DELAY_NS, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_ivrmpb->stablization_delay_ns));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_STEP_DELAY_NS, FAPI_SYSTEM,
+ o_ivrmpb->step_delay_ns));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_DEADZONE_MV, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
- o_ivrmpb->deadzone_mv));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_STABILIZATION_DELAY_NS, FAPI_SYSTEM,
+ o_ivrmpb->stablization_delay_ns));
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IVRM_DEADZONE_MV, FAPI_SYSTEM,
+ o_ivrmpb->deadzone_mv));
+
+
+ // @todo this is presently hardcoded to FALSE until validation code is in
+ // place to ensure turning IVRM on is a good thing. This attribute write is
+ // needed to allocate the HWP attribute in Cronus.
+
+ // Indicate that IVRM is good to be enabled (or not)
+ FAPI_INF(" NOTE: This level of code is forcing the iVRM to OFF");
+ {
+ fapi2::ATTR_IVRMS_ENABLED_Type l_ivrm_enabled =
+ (fapi2::ATTR_IVRMS_ENABLED_Type)fapi2::ENUM_ATTR_IVRMS_ENABLED_FALSE;
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_IVRMS_ENABLED, i_target, l_ivrm_enabled));
+ }
+ }
+ else
+ {
+ FAPI_DBG(" IVRM is diabled. Skipping IVRM attribute accesses");
+ o_state->iv_ivrm_enabled = false;
+ }
fapi_try_exit:
FAPI_INF("<< proc_get_ivrm_parms");
@@ -2455,9 +2628,10 @@ oppb_print(OCCPstateParmBlock* i_oppb)
///
/// \param stream The output stream
-int freq2pState (const GlobalPstateParmBlock* gppb,
- const uint32_t freq_khz,
- Pstate* pstate)
+int
+freq2pState (const GlobalPstateParmBlock* gppb,
+ const uint32_t freq_khz,
+ Pstate* pstate)
{
int rc = 0;
float pstate32 = 0;
@@ -2486,12 +2660,15 @@ int freq2pState (const GlobalPstateParmBlock* gppb,
return rc;
}
+
+
fapi2::ReturnCode
proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
uint8_t i_poundv_bucketId,
LP_VDMParmBlock* o_vdmpb,
PoundW_data* o_data,
- fapi2::voltageBucketData_t i_poundv_data)
+ fapi2::voltageBucketData_t i_poundv_data,
+ PSTATE_attribute_state* o_state)
{
std::vector<fapi2::Target<fapi2::TARGET_TYPE_EQ>> l_eqChiplets;
fapi2::vdmData_t l_vdmBuf;
@@ -2568,6 +2745,10 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
memcpy (&(o_data->poundw[VPD_PV_POWERSAVE]), &l_tmp_data, sizeof(poundw_entry_t));
+ FAPI_INF("POWERSAVE.vdm_vid_compare_ivid %d",o_data->poundw[POWERSAVE].vdm_vid_compare_ivid);
+ FAPI_INF("NOMINAL.vdm_vid_compare_ivid %d",o_data->poundw[NOMINAL].vdm_vid_compare_ivid);
+ FAPI_INF("TURBO.vdm_vid_compare_ivid %d",o_data->poundw[TURBO].vdm_vid_compare_ivid);
+ FAPI_INF("ULTRA_TURBO.vdm_vid_compare_ivid %d",o_data->poundw[ULTRA].vdm_vid_compare_ivid);
//Validation of VPD Data
//
//If all VID compares are zero then use #V VDD voltage to populate local
@@ -2593,10 +2774,102 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
!(o_data->poundw[TURBO].vdm_vid_compare_ivid) ||
!(o_data->poundw[ULTRA].vdm_vid_compare_ivid))
{
+ o_state->iv_vdm_enabled = false;
FAPI_ERR("Pound W data contains invalid values");
- break;
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_POUND_W_INVALID_VID_VALUE(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_NOMINAL_VID_COMPARE_IVID_VALUE(o_data->poundw[NOMINAL].vdm_vid_compare_ivid)
+ .set_POWERSAVE_VID_COMPARE_IVID_VALUE(o_data->poundw[POWERSAVE].vdm_vid_compare_ivid)
+ .set_TURBO_VID_COMPARE_IVID_VALUE(o_data->poundw[TURBO].vdm_vid_compare_ivid)
+ .set_ULTRA_VID_COMPARE_IVID_VALUE(o_data->poundw[ULTRA].vdm_vid_compare_ivid),
+ "Pstate Parameter Block #W : one of the VID compare value is zero");
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
}
+ FAPI_INF("POWERSAVE.vdm_vid_compare_ivid %d",o_data->poundw[POWERSAVE].vdm_vid_compare_ivid);
+ FAPI_INF("NOMINAL.vdm_vid_compare_ivid %d",o_data->poundw[NOMINAL].vdm_vid_compare_ivid);
+ FAPI_INF("TURBO.vdm_vid_compare_ivid %d",o_data->poundw[TURBO].vdm_vid_compare_ivid);
+ FAPI_INF("ULTRA_TURBO.vdm_vid_compare_ivid %d",o_data->poundw[ULTRA].vdm_vid_compare_ivid);
+
+ // validate vid values
+ bool l_compare_vid_value_state = 1;
+ VALIDATE_VID_VALUES (o_data->poundw[POWERSAVE].vdm_vid_compare_ivid,
+ o_data->poundw[NOMINAL].vdm_vid_compare_ivid,
+ o_data->poundw[TURBO].vdm_vid_compare_ivid,
+ o_data->poundw[ULTRA].vdm_vid_compare_ivid,
+ l_compare_vid_value_state);
+
+ if (!l_compare_vid_value_state)
+ {
+ o_state->iv_vdm_enabled = false;
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_POUND_W_INVALID_VID_VALUE(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_NOMINAL_VID_COMPARE_IVID_VALUE(o_data->poundw[NOMINAL].vdm_vid_compare_ivid)
+ .set_POWERSAVE_VID_COMPARE_IVID_VALUE(o_data->poundw[POWERSAVE].vdm_vid_compare_ivid)
+ .set_TURBO_VID_COMPARE_IVID_VALUE(o_data->poundw[TURBO].vdm_vid_compare_ivid)
+ .set_ULTRA_VID_COMPARE_IVID_VALUE(o_data->poundw[ULTRA].vdm_vid_compare_ivid),
+ "Pstate Parameter Block #W VID compare data are not in increasing order");
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ }
+
+ // validate threshold values
+ bool l_threshold_value_state = 1;
+
+ for (uint8_t p = 0; p < NUM_OP_POINTS; ++p)
+ {
+ FAPI_INF("o_data->poundw[%d].vdm_overvolt_thresholds %d",p,(o_data->poundw[p].vdm_overvolt_small_thresholds >> 4) & 0x0F);
+ FAPI_INF("o_data->poundw[%d].vdm_small_thresholds %d",p,(o_data->poundw[p].vdm_overvolt_small_thresholds ) & 0x0F);
+ FAPI_INF("o_data->poundw[%d].vdm_large_thresholds %d",p,(o_data->poundw[p].vdm_large_extreme_thresholds >> 4) & 0x0F);
+ FAPI_INF("o_data->poundw[%d].vdm_extreme_thresholds %d",p,(o_data->poundw[p].vdm_large_extreme_thresholds) & 0x0F);
+ VALIDATE_THRESHOLD_VALUES(((o_data->poundw[p].vdm_overvolt_small_thresholds >> 4) & 0x0F), // overvolt
+ ((o_data->poundw[p].vdm_overvolt_small_thresholds) & 0x0F), //small
+ ((o_data->poundw[p].vdm_large_extreme_thresholds >> 4) & 0x0F), //large
+ ((o_data->poundw[p].vdm_large_extreme_thresholds) & 0x0F), //extreme
+ l_threshold_value_state);
+
+ if (!l_threshold_value_state)
+ {
+ o_state->iv_vdm_enabled = false;
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_POUND_W_INVALID_THRESHOLD_VALUE(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_OP_POINT_TYPE(p)
+ .set_VDM_OVERVOLT((o_data->poundw[p].vdm_overvolt_small_thresholds >> 4) & 0x0F)
+ .set_VDM_SMALL(o_data->poundw[p].vdm_overvolt_small_thresholds & 0x0F)
+ .set_VDM_EXTREME((o_data->poundw[p].vdm_large_extreme_thresholds >> 4) & 0x0F)
+ .set_VDM_LARGE((o_data->poundw[p].vdm_large_extreme_thresholds) & 0x0F),
+ "Pstate Parameter Block #W VDM threshold data are invalid");
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ }
+ }
+
+ bool l_frequency_value_state = 1;
+
+ for (uint8_t p = 0; p < NUM_OP_POINTS; ++p)
+ {
+ VALIDATE_FREQUENCY_DROP_VALUES(((o_data->poundw[p].vdm_small_large_normal_freq >> 4) & 0x0F), // N_L
+ ((o_data->poundw[p].vdm_small_large_normal_freq) & 0x0F), //N_S
+ ((o_data->poundw[p].vdm_large_small_normal_freq >> 4) & 0x0F), //L_S
+ ((o_data->poundw[p].vdm_large_small_normal_freq) & 0x0F), //S_N
+ l_frequency_value_state);
+
+ if (!l_frequency_value_state)
+ {
+ o_state->iv_vdm_enabled = false;
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_POUND_W_INVALID_FREQ_DROP_VALUE(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_OP_POINT_TYPE(p)
+ .set_VDM_NORMAL_SMALL((o_data->poundw[p].vdm_small_large_normal_freq >> 4) & 0x0F)
+ .set_VDM_NORMAL_LARGE(o_data->poundw[p].vdm_small_large_normal_freq & 0x0F)
+ .set_VDM_LARGE_SMALL((o_data->poundw[p].vdm_large_small_normal_freq >> 4) & 0x0F)
+ .set_VDM_SMALL_NORMAL((o_data->poundw[p].vdm_large_small_normal_freq) & 0x0F),
+ "Pstate Parameter Block #W VDM frequency drop data are invalid");
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ }
+ }
//Biased compare vid data
fapi2::ATTR_VDM_VID_COMPARE_BIAS_0P5PCT_Type l_bias_value;
@@ -2625,6 +2898,12 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
fapi_try_exit:
+
+ if (fapi2::current_err != fapi2::FAPI2_RC_SUCCESS)
+ {
+ o_state->iv_vdm_enabled = false;
+ }
+
return fapi2::current_err;
}
@@ -2639,23 +2918,25 @@ proc_set_resclk_table_attrs(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i
uint16_t l_resclk_value[RESCLK_STEPS];
uint16_t l_l3_threshold_mv;
- // Perform some basic sanity checks on the header datastructures (since
+ // Perform some basic sanity checks on the header data structures (since
// the header values are provided by another team)
- if (p9_resclk_defines::RESCLK_INDEX_VEC.size() != RESCLK_FREQ_REGIONS)
- {
- FAPI_ERR("p9_resclk_defines.h RESCLK_INDEX_VEC.size()=%d != p9_pstates.h RESCLK_FREQ_REGIONS=%d",
- p9_resclk_defines::RESCLK_INDEX_VEC.size(), RESCLK_FREQ_REGIONS);
- }
- else if (p9_resclk_defines::RESCLK_TABLE_VEC.size() != RESCLK_STEPS)
- {
- FAPI_ERR("p9_resclk_defines.h RESCLK_TABLE_VEC.size()=%d != p9_pstates.h RESCLK_STEPS=%d",
- p9_resclk_defines::RESCLK_TABLE_VEC.size(), RESCLK_STEPS);
- }
- else if (p9_resclk_defines::L3CLK_TABLE_VEC.size() != RESCLK_L3_STEPS)
- {
- FAPI_ERR("p9_resclk_defines.h L3CLK_TABLE_VEC.size()=%d != p9_pstates.h RESCLK_L3_STEPS=%d",
- p9_resclk_defines::L3CLK_TABLE_VEC.size(), RESCLK_L3_STEPS);
- }
+ FAPI_ASSERT((p9_resclk_defines::RESCLK_INDEX_VEC.size() == RESCLK_FREQ_REGIONS),
+ fapi2::PSTATE_PB_RESCLK_INDEX_ERROR()
+ .set_FREQ_REGIONS(RESCLK_FREQ_REGIONS)
+ .set_INDEX_VEC_SIZE(p9_resclk_defines::RESCLK_INDEX_VEC.size()),
+ "p9_resclk_defines.h RESCLK_INDEX_VEC.size() mismatch");
+
+ FAPI_ASSERT((p9_resclk_defines::RESCLK_TABLE_VEC.size() == RESCLK_STEPS),
+ fapi2::PSTATE_PB_RESCLK_TABLE_ERROR()
+ .set_STEPS(RESCLK_STEPS)
+ .set_TABLE_VEC_SIZE(p9_resclk_defines::RESCLK_TABLE_VEC.size()),
+ "p9_resclk_defines.h RESCLK_TABLE_VEC.size() mismatch");
+
+ FAPI_ASSERT((p9_resclk_defines::L3CLK_TABLE_VEC.size() == RESCLK_L3_STEPS),
+ fapi2::PSTATE_PB_RESCLK_L3_TABLE_ERROR()
+ .set_L3_STEPS(RESCLK_L3_STEPS)
+ .set_L3_VEC_SIZE(p9_resclk_defines::L3CLK_TABLE_VEC.size()),
+ "p9_resclk_defines.h L3CLK_TABLE_VEC.size() mismatch");
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_RESCLK_L3_VALUE, i_target,
l_l3_steparray));
@@ -2735,17 +3016,18 @@ void p9_pstate_update_vfrt(const GlobalPstateParmBlock* i_gppb,
//Initialize VFRT header
o_vfrt_data->vfrtHeader.magic_number = revle16(UINT16_GET(i_pBuffer));
i_pBuffer += 2;
- o_vfrt_data->vfrtHeader.reserved_1 = revle16(UINT16_GET(i_pBuffer));
+ o_vfrt_data->vfrtHeader.reserved = revle16(UINT16_GET(i_pBuffer));
i_pBuffer += 2;
o_vfrt_data->vfrtHeader.type_version = *i_pBuffer;
i_pBuffer++;
- o_vfrt_data->vfrtHeader.reserved_2 = *i_pBuffer;
+ o_vfrt_data->vfrtHeader.res_vdnId = *i_pBuffer; // @todo this name is not accurate
i_pBuffer++;
- o_vfrt_data->vfrtHeader.res_vdnId = *i_pBuffer;
+ o_vfrt_data->vfrtHeader.VddId_QAId = *i_pBuffer; // @todo this name is not accurate
i_pBuffer++;
- o_vfrt_data->vfrtHeader.VddId_QAId = *i_pBuffer;
+ o_vfrt_data->vfrtHeader.rsvd_QAId = *i_pBuffer;
i_pBuffer++;
+
//find type
l_type = (o_vfrt_data->vfrtHeader.type_version) >> 4;
@@ -2754,16 +3036,16 @@ void p9_pstate_update_vfrt(const GlobalPstateParmBlock* i_gppb,
// This function should exit if the input type is not "SYSTEM"
// Correct in Level 3 update.
- char l_buffer_str[256]; // Temporary formatting string buffer
- char l_line_str[256]; // Formatted output line string
+ char l_buffer_str[512]; // Temporary formatting string buffer
+ char l_line_str[512]; // Formatted output line string
strcpy(l_line_str, "VFRT:");
sprintf(l_buffer_str, " %X Ver/Type %X B5 %X B6 %X B7 %X",
revle16(o_vfrt_data->vfrtHeader.magic_number),
revle16(o_vfrt_data->vfrtHeader.type_version),
- o_vfrt_data->vfrtHeader.reserved_2, /// BUG: this should be VDN!!!
- o_vfrt_data->vfrtHeader.res_vdnId, /// BUG: this should be VDD!!!
- o_vfrt_data->vfrtHeader.VddId_QAId); /// BUG: this should be resvQID!!!
+ o_vfrt_data->vfrtHeader.res_vdnId, /// BUG: this should be VDN!!!
+ o_vfrt_data->vfrtHeader.VddId_QAId, /// BUG: this should be VDD!!!
+ o_vfrt_data->vfrtHeader.rsvd_QAId); /// BUG: this should be resvQID!!!
strcat(l_line_str, l_buffer_str);
FAPI_INF("%s", l_line_str);
@@ -2841,49 +3123,79 @@ uint16_t get_iac_vdn_value (uint16_t i_vpd_vdn_mv,
uint16_t l_iq_mv[2] = {0};
l_iq_mv[0] = IDDQ_MIN_VOLT_LEVEL + (100 * i);
l_iq_mv[1] = IDDQ_MIN_VOLT_LEVEL + (100 * (i + 1));
-
- if (!l_bounding_value)
+ uint8_t l_diff_value = 0;
+ do
{
+ if (!l_bounding_value)
+ {
+ //Read measured temp
+ l_measured_temp_C[0] = i_iddq.avgtemp_vdn[i];
- //Read measured temp
- l_measured_temp_C[0] = i_iddq.avgtemp_vdn[i];
+ if ((l_measured_temp_C[0] == 0))
+ {
+ FAPI_INF("Non Bounded measured temp value is 0");
+ break;
+ }
+ else if (l_measured_temp_C[0] < nest_leakage_percent)
+ {
+ l_diff_value = nest_leakage_percent - l_measured_temp_C[0];
+ }
+ else
+ {
+ l_diff_value = l_measured_temp_C[0] - nest_leakage_percent;
+ }
- //Read ivdnq_5ma
- l_Ivdnq_5ma[0] = i_iddq.ivdn[i];
+ //Read ivdnq_5ma
+ l_Ivdnq_5ma[0] = i_iddq.ivdn[i];
- //Scale each bounding Ivdnq_5ma value to 75C in mA
+ //Scale each bounding Ivdnq_5ma value to 75C in mA
- l_scaled_leakage_ma[0] = l_Ivdnq_5ma[0] * 5 * pow (1.3, (l_measured_temp_C[0] - nest_leakage_percent) / 10);
+ l_scaled_leakage_ma[0] = l_Ivdnq_5ma[0] * 5 * pow (1.3, (l_diff_value / 10));
- l_Ivdnq_vpd_ma = l_scaled_leakage_ma[0];
+ l_Ivdnq_vpd_ma = l_scaled_leakage_ma[0];
- l_ac_vdn_value = (i_vpd_idn_100ma * 10) - (l_Ivdnq_vpd_ma * 10);
- }
- else
- {
- //Read measured temp
- l_measured_temp_C[0] = i_iddq.avgtemp_vdn[i];
- l_measured_temp_C[1] = i_iddq.avgtemp_vdn[i + 1];
+ l_ac_vdn_value = (i_vpd_idn_100ma * 10) - (l_Ivdnq_vpd_ma * 10);
+ }
+ else
+ {
+ //Read measured temp
+ l_measured_temp_C[0] = i_iddq.avgtemp_vdn[i];
+ l_measured_temp_C[1] = i_iddq.avgtemp_vdn[i + 1];
- //Read ivdnq_5ma
- l_Ivdnq_5ma[0] = i_iddq.ivdn[i];
- l_Ivdnq_5ma[1] = i_iddq.ivdn[i + 1];
+ //Read ivdnq_5ma
+ l_Ivdnq_5ma[0] = i_iddq.ivdn[i];
+ l_Ivdnq_5ma[1] = i_iddq.ivdn[i + 1];
- //Scale each bounding Ivdnq_5ma value to 75C in mA
+ //Scale each bounding Ivdnq_5ma value to 75C in mA
- for (j = 0; j < 2; j++)
- {
- l_scaled_leakage_ma[j] = l_Ivdnq_5ma[j] * 5 * pow (1.3, (l_measured_temp_C[j] - nest_leakage_percent) / 10);
- }
+ for (j = 0; j < 2; j++)
+ {
+ if ((l_measured_temp_C[j] == 0))
+ {
+ FAPI_INF("Bounded measured temp value is 0");
+ break;
+ }
+ else if (l_measured_temp_C[j] < nest_leakage_percent)
+ {
+ l_diff_value = nest_leakage_percent - l_measured_temp_C[j];
+ }
+ else
+ {
+ l_diff_value = l_measured_temp_C[j] - nest_leakage_percent;
+ }
- //Interpolate between scaled_leakage_ma[i] and scaled_leakage_ma[i+1]
- //using the same ratio as the VPD voltage is to the bounding volages) to
- //arrive at Ivdnq_vpd_ma
- l_Ivdnq_vpd_ma = l_scaled_leakage_ma[i] + roundUp((i_vpd_vdn_mv - 600 + (100 * i)) / ((l_iq_mv[1] - l_iq_mv[0]) *
- (l_scaled_leakage_ma[1] - l_scaled_leakage_ma[0])));
+ l_scaled_leakage_ma[j] = l_Ivdnq_5ma[j] * 5 * pow (1.3, (l_diff_value / 10));
+ }
- l_ac_vdn_value = (i_vpd_idn_100ma * 10) - (l_Ivdnq_vpd_ma * 10);
- }
+ //Interpolate between scaled_leakage_ma[i] and scaled_leakage_ma[i+1]
+ //using the same ratio as the VPD voltage is to the bounding volages) to
+ //arrive at Ivdnq_vpd_ma
+ l_Ivdnq_vpd_ma = l_scaled_leakage_ma[i] + roundUp((i_vpd_vdn_mv - 600 + (100 * i)) / ((l_iq_mv[1] - l_iq_mv[0]) *
+ (l_scaled_leakage_ma[1] - l_scaled_leakage_ma[0])));
+
+ l_ac_vdn_value = (i_vpd_idn_100ma * 10) - (l_Ivdnq_vpd_ma * 10);
+ }
+ }while(0);
return l_ac_vdn_value;
}
@@ -2989,6 +3301,7 @@ void p9_pstate_compute_PsVIDCompSlopes_slopes(PoundW_data i_data,
do
{
+
//
//BIASED VPD PTS SLOPES
//
@@ -3095,3 +3408,81 @@ void p9_pstate_compute_PsVDMThreshSlopes(
}
while(0);
}
+
+
+
+// p9_pstate_set_global_feature_attributes
+fapi2::ReturnCode
+p9_pstate_set_global_feature_attributes(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ PSTATE_attribute_state i_state,
+ QuadManagerFlags* o_qm_flags)
+{
+ // Quad Manager Flags
+ fapi2::buffer<uint16_t> l_data16;
+
+ fapi2::ATTR_PSTATES_ENABLED_Type l_ps_enabled =
+ (fapi2::ATTR_PSTATES_ENABLED_Type)fapi2::ENUM_ATTR_PSTATES_ENABLED_FALSE;
+
+ fapi2::ATTR_RESCLK_ENABLED_Type l_resclk_enabled =
+ (fapi2::ATTR_RESCLK_ENABLED_Type)fapi2::ENUM_ATTR_RESCLK_ENABLED_FALSE;
+
+ fapi2::ATTR_VDM_ENABLED_Type l_vdm_enabled =
+ (fapi2::ATTR_VDM_ENABLED_Type)fapi2::ENUM_ATTR_VDM_ENABLED_FALSE;
+
+ fapi2::ATTR_IVRM_ENABLED_Type l_ivrm_enabled =
+ (fapi2::ATTR_IVRMS_ENABLED_Type)fapi2::ENUM_ATTR_IVRMS_ENABLED_FALSE;
+
+ fapi2::ATTR_WOF_ENABLED_Type l_wof_enabled =
+ (fapi2::ATTR_WOF_ENABLED_Type)fapi2::ENUM_ATTR_WOF_ENABLED_FALSE;
+
+ if (i_state.iv_pstates_enabled)
+ {
+ l_ps_enabled = (fapi2::ATTR_PSTATES_ENABLED_Type)fapi2::ENUM_ATTR_PSTATES_ENABLED_TRUE;
+ }
+
+ if (i_state.iv_resclk_enabled)
+ {
+ l_resclk_enabled = (fapi2::ATTR_RESCLK_ENABLED_Type)fapi2::ENUM_ATTR_RESCLK_ENABLED_TRUE;
+ }
+
+ if (i_state.iv_vdm_enabled)
+ {
+ l_vdm_enabled = (fapi2::ATTR_VDM_ENABLED_Type)fapi2::ENUM_ATTR_VDM_ENABLED_TRUE;
+ }
+
+ if (i_state.iv_ivrm_enabled)
+ {
+ l_ivrm_enabled = (fapi2::ATTR_IVRMS_ENABLED_Type)fapi2::ENUM_ATTR_IVRMS_ENABLED_TRUE;
+ }
+
+ if (i_state.iv_wof_enabled)
+ {
+ l_wof_enabled = (fapi2::ATTR_WOF_ENABLED_Type)fapi2::ENUM_ATTR_WOF_ENABLED_TRUE;
+ }
+
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PSTATES_ENABLED, i_target, l_ps_enabled));
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_RESCLK_ENABLED, i_target, l_resclk_enabled));
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_VDM_ENABLED, i_target, l_vdm_enabled));
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_IVRMS_ENABLED, i_target, l_ivrm_enabled));
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_WOF_ENABLED, i_target, l_wof_enabled));
+
+
+ // ----------------
+ // set CME QM flags
+ // ----------------
+ l_data16.flush<0>();
+
+ l_data16.insertFromRight<0, 1>(l_resclk_enabled);
+ l_data16.insertFromRight<1, 1>(l_ivrm_enabled);
+ l_data16.insertFromRight<2, 1>(l_wof_enabled);
+
+ l_data16.insertFromRight<3, 1>(attr.attr_dpll_dynamic_fmax_enable);
+ l_data16.insertFromRight<4, 1>(attr.attr_dpll_dynamic_fmin_enable);
+ l_data16.insertFromRight<5, 1>(attr.attr_dpll_droop_protect_enable);
+
+ o_qm_flags->value = revle16(l_data16);
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+// *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 0c16132ff..e8bf21e80 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
@@ -82,6 +82,15 @@ typedef struct
} OperatingPoint;
+typedef struct
+{
+ bool iv_pstates_enabled;
+ bool iv_resclk_enabled;
+ bool iv_vdm_enabled;
+ bool iv_ivrm_enabled;
+ bool iv_wof_enabled;
+} PSTATE_attribute_state;
+
/// Constants required to compute and interpolate operating points
///
@@ -157,7 +166,6 @@ typedef struct
// IQ Keyword Sizes
#define IQ_BUFFER_SIZE 9
-//#define IQ_BUFFER_ALLOC 64
#define IQ_BUFFER_ALLOC 255
// END OF PARMS REQUIRED VPD parsing procedures
@@ -166,7 +174,6 @@ typedef struct
typedef struct
{
- //uint32_t attr_freq_core_max; - P8 attribute
uint32_t attr_freq_core_ceiling_mhz;
// Loadline, Distribution loss and Distribution offset attributes
@@ -221,24 +228,30 @@ typedef struct
uint32_t attr_boot_freq_mhz;
uint32_t attr_nest_freq_mhz;
-// Resonant clock frequency attrmbutes
+// Resonant clock frequency attributes
uint32_t attr_pm_resonant_clock_full_clock_sector_buffer_frequency_khz;
uint32_t attr_pm_resonant_clock_low_band_lower_frequency_khz;
uint32_t attr_pm_resonant_clock_low_band_upper_frequency_khz;
uint32_t attr_pm_resonant_clock_high_band_lower_frequency_khz;
uint32_t attr_pm_resonant_clock_high_band_upper_frequency_khz;
- uint8_t attr_system_wof_enabled;
- uint8_t attr_system_ivrms_enabled;
uint32_t attr_tdp_rdp_current_factor;
- uint8_t attr_resclk_enable;
+ uint8_t attr_resclk_disable;
uint8_t attr_dpll_dynamic_fmax_enable;
uint8_t attr_dpll_dynamic_fmin_enable;
uint8_t attr_dpll_droop_protect_enable;
uint8_t attr_nest_leakage_percent;
+// Control attributes
+ uint8_t attr_system_ivrm_disable;
+ uint8_t attr_systemp_resclk_disable;
+ uint8_t attr_system_wof_disable;
+ uint8_t attr_system_vdm_disable;
+
+ uint8_t attr_dd_wof_not_supported;
+ uint8_t attr_pstate_mode;
} AttributeList;
@@ -287,7 +300,8 @@ proc_get_mvpd_data ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
uint32_t* o_valid_pdv_points,
uint8_t* o_present_chiplets,
uint8_t& o_bucketId,
- fapi2::voltageBucketData_t* o_poundv_data);
+ fapi2::voltageBucketData_t* o_poundv_data,
+ PSTATE_attribute_state* o_state);
/// -------------------------------------------------------------------
/// @brief Perform data validity check on #V data
@@ -303,7 +317,8 @@ proc_chk_valid_poundv ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_tar
const uint32_t i_chiplet_mvpd_data[PV_D][PV_W],
uint32_t* o_valid_pdv_points,
const uint8_t i_chiplet_num,
- const uint8_t i_bucket_id);
+ const uint8_t i_bucket_id,
+ PSTATE_attribute_state* o_state);
/// ----------------------------------------------------------------
@@ -315,7 +330,8 @@ proc_chk_valid_poundv ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_tar
fapi2::ReturnCode
proc_get_mvpd_iddq ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
- IddqTable* io_iddqt);
+ IddqTable* io_iddqt,
+ PSTATE_attribute_state* o_state);
/// ----------------------------------------------------------------
/// @brief Get #W data and put into array
/// @param[in] i_target => Chip Target
@@ -330,7 +346,8 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
uint8_t i_poundv_bucketId,
LP_VDMParmBlock* o_vdmpb,
PoundW_data* o_poundw_data,
- fapi2::voltageBucketData_t i_poundv_data
+ fapi2::voltageBucketData_t i_poundv_data,
+ PSTATE_attribute_state* o_state
);
/// -----------------------------------------------------------------------
/// @brief Get needed attributes
@@ -426,15 +443,16 @@ load_mvpd_operating_point ( const uint32_t i_src[PV_D][PV_W],
/// ----------------------------------------------------------------
/// @brief Get VDM parameters from attributes
/// @param[in] i_target => Chip Target
+/// @param[in] *i_attr => pointer to attribute list structure
/// @param[out] o_vdmpb => VDM parameter block
/// @return FAPI2::SUCCESS
/// ----------------------------------------------------------------
fapi2::ReturnCode
proc_get_vdm_parms ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const AttributeList* i_attr,
GP_VDMParmBlock* o_vdmpb);
-
/// ----------------------------------------------------------------
/// @brief Get resonant clocking parameters from attributes
/// @param[in] i_target => Chip Target
@@ -450,14 +468,17 @@ proc_res_clock_setup ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targ
/// ----------------------------------------------------------------
/// @brief Get IVRM parameters from attributes
-/// @param[in] i_target => Chip Target
-/// @param[out] o_ivrmpb => IVRM parameter block
+/// @param[in] i_target => Chip Target
+/// @param[in] *i_attr => pointer to attribute list structure
+/// @param[out] o_ivrmpb => IVRM parameter block
/// @return FAPI2::SUCCESS
/// ----------------------------------------------------------------
fapi2::ReturnCode
proc_get_ivrm_parms ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
- IvrmParmBlock* o_ivrmpb);
+ const AttributeList* i_attr,
+ IvrmParmBlock* o_ivrmpb,
+ PSTATE_attribute_state* o_state);
/// -------------------------------------------------------------------
/// @brief Set Resonant Clocking "array"/"table" attributes using p9_resclk_defines.h
@@ -531,25 +552,25 @@ void p9_pstate_update_vfrt(const GlobalPstateParmBlock* i_gppb,
uint32_t i_reference_freq);
/**
- * calculate_effective_capacitance
- *
- * Description: Generic function to perform the effective capacitance
- * calculations.
- * C_eff = I / (V^1.3 * F)
- *
- * I is the AC component of Idd in 0.01 Amps (or10 mA)
- * V is the silicon voltage in 100 uV
- * F is the frequency in MHz
- *
- * Note: Caller must ensure they check for a 0 return value
- * and disable wof if that is the case
- *
- * Param[in]: i_iAC - the AC component
- * Param[in]: i_voltage - the voltage component in 100uV
- * Param[in]: i_frequency - the frequency component
- *
- * Return: The calculated effective capacitance
- */
+* calculate_effective_capacitance
+*
+* Description: Generic function to perform the effective capacitance
+* calculations.
+* C_eff = I / (V^1.3 * F)
+*
+* I is the AC component of Idd in 0.01 Amps (or10 mA)
+* V is the silicon voltage in 100 uV
+* F is the frequency in MHz
+*
+* Note: Caller must ensure they check for a 0 return value
+* and disable wof if that is the case
+*
+* Param[in]: i_iAC - the AC component
+* Param[in]: i_voltage - the voltage component in 100uV
+* Param[in]: i_frequency - the frequency component
+*
+* Return: The calculated effective capacitance
+*/
uint16_t pstate_calculate_effective_capacitance( uint16_t i_iAC,
uint16_t i_voltage,
uint16_t i_frequency );
@@ -580,9 +601,22 @@ void p9_pstate_compute_PsVIDCompSlopes_slopes(PoundW_data i_data,
// p9_pstate_compute_PsVDMThreshSlopes
//
-void p9_pstate_compute_PsVDMThreshSlopes(
- LocalPstateParmBlock* io_lppb,
- uint8_t* i_pstate);
+void p9_pstate_compute_PsVDMThreshSlopes(LocalPstateParmBlock* io_lppb,
+ uint8_t* i_pstate);
+
+// p9_pstate_wof_initialization
+void p9_pstate_wof_initialization (const GlobalPstateParmBlock* i_gppb,
+ uint8_t* o_buf,
+ uint32_t& io_size,
+ PSTATE_attribute_state* o_state,
+ const uint32_t i_base_state_frequency);
+
+// p9_pstate_set_global_feature_attributes
+fapi2::ReturnCode
+p9_pstate_set_global_feature_attributes(
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ PSTATE_attribute_state i_state,
+ QuadManagerFlags* o_qm_flags);
/// @typedef p9_pstate_parameter_block_FP_t
/// function pointer typedef definition for HWP call support
@@ -616,3 +650,4 @@ extern "C"
#endif
#endif // __P9_PSTATE_PARAMETER_BLOCK_H__
+
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_setup_evid.C b/src/import/chips/p9/procedures/hwp/pm/p9_setup_evid.C
index 3690261c3..fe046ef53 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_setup_evid.C
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_setup_evid.C
@@ -183,6 +183,12 @@ avsInitAttributes(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
uint32_t attr_mvpd_data[PV_D][PV_W];
uint32_t valid_pdv_points;
uint8_t present_chiplets;
+ PSTATE_attribute_state l_state;
+ l_state.iv_pstates_enabled = true;
+ l_state.iv_resclk_enabled = true;
+ l_state.iv_vdm_enabled = true;
+ l_state.iv_ivrm_enabled = true;
+ l_state.iv_wof_enabled = true;
#define DATABLOCK_GET_ATTR(_attr_name, _target, _attr_assign) \
FAPI_TRY(FAPI_ATTR_GET(fapi2::_attr_name, _target, _attr_assign),"Attribute read failed"); \
@@ -220,8 +226,13 @@ avsInitAttributes(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
uint8_t l_poundv_bucketId = 0;
fapi2::voltageBucketData_t l_poundv_data;
// Get #V data from MVPD for VDD/VDN and VCS voltage values
- FAPI_TRY(proc_get_mvpd_data(i_target, attr_mvpd_data, &valid_pdv_points, &present_chiplets, l_poundv_bucketId,
- &l_poundv_data));
+ FAPI_TRY(proc_get_mvpd_data(i_target,
+ attr_mvpd_data,
+ &valid_pdv_points,
+ &present_chiplets,
+ l_poundv_bucketId,
+ &l_poundv_data,
+ &l_state ));
// set VDD voltage to PowerSave Voltage from MVPD data (if no override)
if (attrs->vdd_voltage_mv)
diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_pm_pstate_gpe_init_errors.xml b/src/import/chips/p9/procedures/xml/error_info/p9_pm_pstate_gpe_init_errors.xml
index d3ec0dae7..0e4600a43 100644
--- a/src/import/chips/p9/procedures/xml/error_info/p9_pm_pstate_gpe_init_errors.xml
+++ b/src/import/chips/p9/procedures/xml/error_info/p9_pm_pstate_gpe_init_errors.xml
@@ -58,6 +58,22 @@
</hwpError>
<!-- ******************************************************************** -->
<hwpError>
+ <rc>RC_PSTATE_GPE_INIT_PSTATE_AUTOSTART_TIMEOUT</rc>
+ <description> Pstate GPE Protocol Auto Start timeout. This is only
+ used in lab test modes.
+ </description>
+ <collectRegisterFfdc>
+ <id>PGPE_FFDC_REGISTERS</id>
+ <target>CHIP</target>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ </collectRegisterFfdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
<rc>RC_PSTATE_GPE_INIT_DEBUG_HALT</rc>
<description> Pstate GPE init detected a Debug Halt condition. This should only
assert in a development debug environment.
@@ -74,7 +90,7 @@
<callout>
<procedure>CODE</procedure>
<priority>HIGH</priority>
- </callout>
+ </callout>
</hwpError>
<!-- ******************************************************************** -->
<hwpError>
diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_pstate_parameter_block_errors.xml b/src/import/chips/p9/procedures/xml/error_info/p9_pstate_parameter_block_errors.xml
index 514065e9b..53fba0765 100644
--- a/src/import/chips/p9/procedures/xml/error_info/p9_pstate_parameter_block_errors.xml
+++ b/src/import/chips/p9/procedures/xml/error_info/p9_pstate_parameter_block_errors.xml
@@ -25,4 +25,244 @@
<!-- Error definitions for p9_pstate_parameter_block procedure -->
<hwpErrors>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_GET_MVPD_FOR_POUND_V_FAILED</rc>
+ <description>MVPD function failed to read #V VPD</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>PRESENT_CHIPLETS</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_NO_PRESENT_CHIPLETS_ERROR</rc>
+ <description>No cores are present from which to read #V VPD</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>PRESENT_CHIPLETS</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_POUNDV_WOF_UT_ERROR</rc>
+ <description>WOF was intending to be enable but could not due to #V validity
+ checking issue of the UltraTurbo content. The machine continues as
+ functional but with WOF disabled.
+ </description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>CHIPLET_NUMBER</ffdc>
+ <ffdc>BUCKET</ffdc>
+ <ffdc>FREQUENCY</ffdc>
+ <ffdc>VDD</ffdc>
+ <ffdc>IDD</ffdc>
+ <ffdc>VCS</ffdc>
+ <ffdc>ICS</ffdc>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_WOF_HEADER_DATA_INVALID</rc>
+ <description>WOF Header data is invalid</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>MAGIC_NUMBER</ffdc>
+ <ffdc>VERSION</ffdc>
+ <ffdc>VFRT_BLOCK_SIZE</ffdc>
+ <ffdc>VFRT_HEADER_SIZE</ffdc>
+ <ffdc>VFRT_DATA_SIZE</ffdc>
+ <ffdc>QUADS_ACTIVE_SIZE</ffdc>
+ <ffdc>CORE_COUNT</ffdc>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_VFRT_HEADER_DATA_INVALID</rc>
+ <description>VFRT Header data is invalid</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>MAGIC_NUMBER</ffdc>
+ <ffdc>TYPE_VERSION</ffdc>
+ <ffdc>VDN_ID</ffdc>
+ <ffdc>VDD_ID</ffdc>
+ <ffdc>QUAD_ID</ffdc>
+ <ffdc>WOF_TABLE_INDEX</ffdc>
+ <ffdc>VFRT_TABLE_INDEX</ffdc>
+ </hwpError>
+
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_FUNCTION_FAIL</rc>
+ <description>pstate parameter sub function failed
+ </description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>FAPI_RC</ffdc>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_MVPD_CHIPLET_VOLTAGE_NOT_EQUAL</rc>
+ <description>#V data is not same across EQ chiplets</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>CURRENT_EQ_CHIPLET_TARGET</ffdc>
+ <ffdc>FIRST_EQ_CHIPLET_TARGET</ffdc>
+ <ffdc>BUCKET</ffdc>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_IQ_VPD_ERROR</rc>
+ <description>#IQ data payload header is invalid</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>VERSION</ffdc>
+ <ffdc>GOOD_QUADS_PER_SORT</ffdc>
+ <ffdc>GOOD_NORMAL_CORES_PER_SORT</ffdc>
+ <ffdc>GOOD_CACHES_PER_SORT</ffdc>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_POUND_W_INVALID_VID_VALUE</rc>
+ <description>#W vid compare ivid value is zero</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>NOMINAL_VID_COMPARE_IVID_VALUE</ffdc>
+ <ffdc>POWERSAVE_VID_COMPARE_IVID_VALUE</ffdc>
+ <ffdc>TURBO_VID_COMPARE_IVID_VALUE</ffdc>
+ <ffdc>ULTRA_VID_COMPARE_IVID_VALUE</ffdc>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_POUND_W_INVALID_THRESHOLD_VALUE</rc>
+ <description>#W threshold values are invalid</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>OP_POINT_TYPE</ffdc>
+ <ffdc>VDM_OVERVOLT</ffdc>
+ <ffdc>VDM_SMALL</ffdc>
+ <ffdc>VDM_EXTREME</ffdc>
+ <ffdc>VDM_LARGE</ffdc>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_POUND_W_INVALID_FREQ_DROP_VALUE</rc>
+ <description>#W freq drop values are invalid</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>OP_POINT_TYPE</ffdc>
+ <ffdc>VDM_NORMAL_SMALL</ffdc>
+ <ffdc>VDM_NORMAL_LARGE</ffdc>
+ <ffdc>VDM_LARGE_SMALL</ffdc>
+ <ffdc>VDM_SMALL_NORMAL</ffdc>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_POUNDV_ZERO_ERROR</rc>
+ <description>During #V validity checking, one or more required fields
+ were found to contain zero contents. Pstates are being disabled.
+ </description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>CHIPLET_NUMBER</ffdc>
+ <ffdc>BUCKET</ffdc>
+ <ffdc>POINT</ffdc>
+ <ffdc>FREQUENCY</ffdc>
+ <ffdc>VDD</ffdc>
+ <ffdc>IDD</ffdc>
+ <ffdc>VCS</ffdc>
+ <ffdc>ICS</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_POUNDV_SLOPE_ERROR</rc>
+ <description>During #V validity checking, the data did not have at or
+ increasing slopes (eg Power Save LE Nominal LE Turbo LE UltraTurbo).
+ Pstates are being disabled.
+ </description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>CHIPLET_NUMBER</ffdc>
+ <ffdc>BUCKET</ffdc>
+ <ffdc>POINT</ffdc>
+ <ffdc>FREQUENCY_A</ffdc>
+ <ffdc>VDD_A</ffdc>
+ <ffdc>IDD_A</ffdc>
+ <ffdc>VCS_A</ffdc>
+ <ffdc>ICS_A</ffdc>
+ <ffdc>FREQUENCY_B</ffdc>
+ <ffdc>VDD_B</ffdc>
+ <ffdc>IDD_B</ffdc>
+ <ffdc>VCS_B</ffdc>
+ <ffdc>ICS_B</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_WOF_VFRT_ERROR</rc>
+ <description>The WOF VFRT
+ </description>
+ <ffdc>CHIP_TARGET</ffdc>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_RESCLK_INDEX_ERROR</rc>
+ <description>The resonant clock index vector size is not expected.
+ </description>
+ <ffdc>FREQ_REGIONS</ffdc>
+ <ffdc>INDEX_VEC_SIZE</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_RESCLK_TABLE_ERROR</rc>
+ <description>The resonant clock table vector size is not expected.
+ </description>
+ <ffdc>STEPS</ffdc>
+ <ffdc>TABLE_VEC_SIZE</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_RESCLK_L3_TABLE_ERROR</rc>
+ <description>The resonant clock L3 table vector size is not expected.
+ </description>
+ <ffdc>L3_STEPS</ffdc>
+ <ffdc>L3_VEC_SIZE</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_FREQ2PS_LT_PSTATE_MIN_ERROR</rc>
+ <description>The calculated Pstate is less than the allowed minimum..
+ </description>
+ <ffdc>FREQ</ffdc>
+ <ffdc>PSTATE32</ffdc>
+ <ffdc>PSTATE</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_FREQ2PS_GT_PSTATE_MAX_ERROR</rc>
+ <description>The calculated Pstate is greater than the allowed maximum.
+ </description>
+ <ffdc>FREQ</ffdc>
+ <ffdc>PSTATE32</ffdc>
+ <ffdc>PSTATE</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
</hwpErrors>
diff --git a/src/usr/isteps/istep06/call_host_voltage_config.C b/src/usr/isteps/istep06/call_host_voltage_config.C
index a939eee85..2567d4bdc 100644
--- a/src/usr/isteps/istep06/call_host_voltage_config.C
+++ b/src/usr/isteps/istep06/call_host_voltage_config.C
@@ -396,7 +396,9 @@ void* call_host_voltage_config( void *io_pArgs )
"Error in call_host_voltage_config::p9_setup_evid");
// Create IStep error log and cross reference occurred error
- l_stepError.addErrorDetails( l_err );
+ //@fixme-RTC:176741-Ignore these logs until HWPs are fixed
+ //l_stepError.addErrorDetails( l_err );
+ l_err->setSev(ERRORLOG::ERRL_SEV_INFORMATIONAL);
// Commit Error
errlCommit( l_err, ISTEP_COMP_ID );
diff --git a/src/usr/isteps/istep10/call_host_set_voltages.C b/src/usr/isteps/istep10/call_host_set_voltages.C
index 2bca1cff9..d0a8dbd8c 100644
--- a/src/usr/isteps/istep10/call_host_set_voltages.C
+++ b/src/usr/isteps/istep10/call_host_set_voltages.C
@@ -112,7 +112,9 @@ void* call_host_set_voltages(void *io_pArgs)
"Error in call_host_set_voltages::platform_set_nest_voltages()")
// Create IStep error log and cross reference occurred error
- l_stepError.addErrorDetails( l_err );
+ //@fixme-RTC:176741-Ignore these logs until HWPs are fixed
+ //l_stepError.addErrorDetails( l_err );
+ l_err->setSev(ERRORLOG::ERRL_SEV_INFORMATIONAL);
//Commit Error
errlCommit( l_err, ISTEP_COMP_ID );
OpenPOWER on IntegriCloud