summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormbroyles <mbroyles@us.ibm.com>2018-04-13 09:18:24 -0500
committerMartha Broyles <mbroyles@us.ibm.com>2018-04-16 15:53:40 -0400
commit4f49f6351fa3908703b91e0dea9f3680c77a47a6 (patch)
tree2e89e9071422a7257f5ef53911e4471d2b104233
parentbee2601c92b376dfd1a3ebb1337b1087704f270e (diff)
downloadtalos-occ-4f49f6351fa3908703b91e0dea9f3680c77a47a6.tar.gz
talos-occ-4f49f6351fa3908703b91e0dea9f3680c77a47a6.zip
AVSBus Vdd Current roll over workaround
Change-Id: I795683430112a11e81aae70b5c0704408cc92635 CQ: SW424766 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/57161 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Andres A. Lugo-Reyes <aalugore@us.ibm.com> Reviewed-by: Christopher J. Cain <cjcain@us.ibm.com> Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
-rwxr-xr-xsrc/occ_405/amec/amec_data.c5
-rwxr-xr-xsrc/occ_405/amec/amec_freq.c17
-rw-r--r--src/occ_405/amec/amec_freq.h2
-rw-r--r--src/occ_405/amec/amec_init.c5
-rwxr-xr-xsrc/occ_405/amec/amec_sensors_power.c149
-rwxr-xr-xsrc/occ_405/amec/amec_sys.h3
-rwxr-xr-xsrc/occ_405/cmdh/cmdh_fsp_cmds.c16
-rwxr-xr-xsrc/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c57
-rwxr-xr-xsrc/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.h18
-rw-r--r--src/occ_405/common.h1
-rwxr-xr-xsrc/occ_405/errl/errl.h5
-rw-r--r--src/occ_405/occ_service_codes.h4
-rwxr-xr-xsrc/occ_405/occ_sys_config.c2
-rwxr-xr-xsrc/occ_405/occ_sys_config.h2
-rwxr-xr-xsrc/occ_405/occbuildname.c2
-rw-r--r--src/occ_405/pss/avsbus.c318
-rwxr-xr-xsrc/occ_405/pss/avsbus.h15
-rwxr-xr-xsrc/occ_405/sensor/sensor_enum.h1
-rwxr-xr-xsrc/occ_405/sensor/sensor_info.c17
-rwxr-xr-xsrc/occ_405/sensor/sensor_table.c2
20 files changed, 251 insertions, 390 deletions
diff --git a/src/occ_405/amec/amec_data.c b/src/occ_405/amec/amec_data.c
index 6a51503..43ff5b3 100755
--- a/src/occ_405/amec/amec_data.c
+++ b/src/occ_405/amec/amec_data.c
@@ -268,11 +268,6 @@ errlHndl_t AMEC_data_write_thrm_thresholds(const OCC_MODE i_mode)
TRAC_INFO("AMEC_data_write_thrm_thresholds: DIMM setpoints - DVFS: %u, Error: %u",
l_dvfs_temp, l_error);
- g_amec->vrhotproc.setpoint = l_frudata[DATA_FRU_VRM_OT_STATUS].error_count;
-
- TRAC_INFO("AMEC_data_write_thrm_thresholds: Setting %u as DVFS setpoint for VRHOT",
- g_amec->vrhotproc.setpoint);
-
// Store the VRM Vdd thermal data
if (!l_pm_limits)
{
diff --git a/src/occ_405/amec/amec_freq.c b/src/occ_405/amec/amec_freq.c
index 66ea8de..f44c120 100755
--- a/src/occ_405/amec/amec_freq.c
+++ b/src/occ_405/amec/amec_freq.c
@@ -383,22 +383,6 @@ void amec_slv_proc_voting_box(void)
}
}
- // Controller request based on VRHOT signal from processor regulator
- if(g_amec->vrhotproc.freq_request < l_chip_fmax)
- {
- l_chip_fmax = g_amec->vrhotproc.freq_request;
- l_chip_reason = AMEC_VOTING_REASON_VRHOT_THRM;
-
- if(l_report_throttle_freq <= l_chip_fmax)
- {
- l_kvm_throt_reason = PROC_OVERTEMP_EXCEED_REPORT;
- }
- else
- {
- l_kvm_throt_reason = CPU_OVERTEMP;
- }
- }
-
for (k=0; k<MAX_NUM_CORES; k++)
{
if( CORE_PRESENT(k) && !CORE_OFFLINE(k) )
@@ -427,7 +411,6 @@ void amec_slv_proc_voting_box(void)
// have a thermal or power emergency
if(!(l_chip_reason & (AMEC_VOTING_REASON_PROC_THRM |
AMEC_VOTING_REASON_VDD_THRM |
- AMEC_VOTING_REASON_VRHOT_THRM |
AMEC_VOTING_REASON_PPB |
AMEC_VOTING_REASON_PMAX |
AMEC_VOTING_REASON_CONN_OC)))
diff --git a/src/occ_405/amec/amec_freq.h b/src/occ_405/amec/amec_freq.h
index 6d183c8..c2db3c6 100644
--- a/src/occ_405/amec/amec_freq.h
+++ b/src/occ_405/amec/amec_freq.h
@@ -69,7 +69,7 @@ typedef enum
AMEC_VOTING_REASON_CORE_CAP = 0x00000020,
AMEC_VOTING_REASON_PROC_THRM = 0x00000040,
AMEC_VOTING_REASON_GXHB_THRM = 0x00000080,
- AMEC_VOTING_REASON_VRHOT_THRM = 0x00000100,
+ AMEC_VOTING_REASON_RESERVED = 0x00000100, // was VRHOT, no longer used
AMEC_VOTING_REASON_OVER_CURRENT = 0x00000200,
AMEC_VOTING_REASON_OVERRIDE = 0x00000400,
AMEC_VOTING_REASON_CORE_GRP_MIN = 0x00000800,
diff --git a/src/occ_405/amec/amec_init.c b/src/occ_405/amec/amec_init.c
index 3d82ac0..242c36f 100644
--- a/src/occ_405/amec/amec_init.c
+++ b/src/occ_405/amec/amec_init.c
@@ -267,11 +267,6 @@ void amec_init_gamec_struct(void)
g_amec->thermalcent.Pgain = 30000;
g_amec->thermalcent.speed_request = AMEC_MEMORY_MAX_STEP;
- // Initialize controler based on VRHOT signal from processor regulator
- g_amec->vrhotproc.setpoint = 100;
- g_amec->vrhotproc.freq_request = -1;
- g_amec->vrhotproc.speed_request = 1000;
-
// Initialize component power caps
g_amec->pcap.active_proc_pcap = 0;
g_amec->pcap.active_mem_level = 0;
diff --git a/src/occ_405/amec/amec_sensors_power.c b/src/occ_405/amec/amec_sensors_power.c
index 77e727b..bcd22c9 100755
--- a/src/occ_405/amec/amec_sensors_power.c
+++ b/src/occ_405/amec/amec_sensors_power.c
@@ -71,7 +71,6 @@ uint32_t G_curr_num_gpus_sys = 0;
extern bool G_gpu_monitoring_allowed;
extern uint8_t G_occ_interrupt_type;
-extern bool G_vrm_thermal_monitoring;
extern PWR_READING_TYPE G_pwr_reading_type;
extern bool G_apss_present;
extern OCCPstateParmBlock G_oppb;
@@ -439,8 +438,22 @@ void process_avsbus_current()
uint32_t current = avsbus_read(AVSBUS_VDD, AVSBUS_CURRENT);
if (current != 0)
{
- // Current value stored in the sensor should be in 10mA (A scale -2)
- sensor_update(AMECSENSOR_PTR(CURVDD), (uint16_t)current);
+ // If Vdd Current rolls over prior to 0xFFFF that we need to check if
+ // this reading rolled over from the status reg before updating the sensor
+ if (G_sysConfigData.vdd_current_rollover_10mA != 0xFFFF)
+ {
+ G_check_vdd_current_10mA_for_rollover = current;
+ }
+ else
+ {
+ // don't need to check if this reading rolled over
+ G_check_vdd_current_10mA_for_rollover = 0;
+ // Update sensor Current value stored in the sensor should be in 10mA (A scale -2)
+ sensor_update(AMECSENSOR_PTR(CURVDD), (uint16_t)current);
+
+ // Update the chip voltage and power sensors after every current reading
+ update_avsbus_power_sensors(AVSBUS_VDD);
+ }
}
}
if (G_avsbus_vdn_monitoring)
@@ -451,6 +464,9 @@ void process_avsbus_current()
{
// Current value stored in the sensor should be in 10mA (A scale -2)
sensor_update(AMECSENSOR_PTR(CURVDN), (uint16_t)current);
+
+ // Update the chip voltage and power sensors after every current reading
+ update_avsbus_power_sensors(AVSBUS_VDN);
}
}
}
@@ -604,84 +620,107 @@ void update_avsbus_power_sensors(const avsbus_type_e i_type)
// End Function Specification
void amec_update_avsbus_sensors(void)
{
+ // general order Vdd temp, voltage, current, status, Vdd temp, voltage....
+ // status must happen immediately after current to handle if current overflow is enabled
static enum {
AVSBUS_STATE_DISABLED = 0,
AVSBUS_STATE_INITIATE_READ = 1,
- AVSBUS_STATE_PROCESS_CURRENT = 2,
+ AVSBUS_STATE_PROCESS_TEMPERATURE= 2,
AVSBUS_STATE_PROCESS_VOLTAGE = 3,
- AVSBUS_STATE_PROCESS_STATUS = 4,
- AVSBUS_STATE_PROCESS_TEMPERATURE= 5
+ AVSBUS_STATE_PROCESS_CURRENT = 4,
+ AVSBUS_STATE_PROCESS_STATUS = 5
} L_avsbus_state = AVSBUS_STATE_INITIATE_READ;
- // Flag to select either temperature or status to read on 3rd tick
- static bool L_read_temp = true;
-
if (isSafeStateRequested())
{
L_avsbus_state = AVSBUS_STATE_DISABLED;
G_avsbus_vdd_monitoring = FALSE;
G_avsbus_vdn_monitoring = FALSE;
- G_vrm_thermal_monitoring = FALSE;
}
switch (L_avsbus_state)
{
case AVSBUS_STATE_INITIATE_READ:
- // Start first AVS Bus read of current
- initiate_avsbus_reads(AVSBUS_CURRENT);
- L_avsbus_state = AVSBUS_STATE_PROCESS_CURRENT;
- break;
+ // Start reading from AVS bus, what we start with depends on the amec slave state
+ // with goal of processing status on the same tick that WOF runs (amec slave state 4)
+ // Want processing of Temperature on state 1, voltage on 2, current on 3, to give status on 4
+ // can only start with temperature or voltage, since the status must be last and requires
+ // voltage and current to have been read in order to update the power sensor
+ switch ( G_amec_slv_state.state )
+ {
+ case 0:
+ case 4:
+ // Initiate AVS Bus read for Vdd temperature
+ // temperature will be processed on next tick (state 1/5)
+ TRAC_IMP("amec_update_avsbus_sensors: Starting with temperature in slave state %d", G_amec_slv_state.state);
+ avsbus_read_start(AVSBUS_VDD, AVSBUS_TEMPERATURE);
+ L_avsbus_state = AVSBUS_STATE_PROCESS_TEMPERATURE;
+ break;
+ case 1:
+ case 5:
+ // Initiate read of voltages
+ // voltages will be processed on next tick (state 2/6)
+ TRAC_IMP("amec_update_avsbus_sensors: Starting with voltage in slave state %d", G_amec_slv_state.state);
+ initiate_avsbus_reads(AVSBUS_VOLTAGE);
+ L_avsbus_state = AVSBUS_STATE_PROCESS_VOLTAGE;
+ break;
+ case 2:
+ case 3:
+ case 6:
+ case 7:
+ // Need to wait another tick, can only start with temperature or voltage readings
+ break;
+ default:
+ // this should never happen, this would mean the whole state machine is broken!
+ // just start reading with temperature
+ TRAC_ERR("amec_update_avsbus_sensors: INVALID AMEC SLAVE STATE 0x%02X", G_amec_slv_state.state);
+ avsbus_read_start(AVSBUS_VDD, AVSBUS_TEMPERATURE);
+ L_avsbus_state = AVSBUS_STATE_PROCESS_TEMPERATURE;
+ break;
+ }
- case AVSBUS_STATE_PROCESS_CURRENT:
- // Process the current readings
- process_avsbus_current();
- // Initiate read of voltages
- initiate_avsbus_reads(AVSBUS_VOLTAGE);
- L_avsbus_state = AVSBUS_STATE_PROCESS_VOLTAGE;
+ break; // case AVSBUS_STATE_INITIATE_READ
+
+ case AVSBUS_STATE_PROCESS_TEMPERATURE:
+ // Read and process Vdd temperature
+ avsbus_read(AVSBUS_VDD, AVSBUS_TEMPERATURE);
+
+ // Initiate read of voltages
+ initiate_avsbus_reads(AVSBUS_VOLTAGE);
+ L_avsbus_state = AVSBUS_STATE_PROCESS_VOLTAGE;
break;
case AVSBUS_STATE_PROCESS_VOLTAGE:
// Process the voltage readings
process_avsbus_voltage();
- // Initiate read of temperature or error status (OT/OC)
- if (L_read_temp)
- {
- // Initiate AVS Bus read for Vdd temperature
- avsbus_read_start(AVSBUS_VDD, AVSBUS_TEMPERATURE);
- L_avsbus_state = AVSBUS_STATE_PROCESS_TEMPERATURE;
- }
- else
+ // Initiate read of currents
+ // Before starting the Current read clear the Vdd OCW bit if it is being used for rollover detection
+ if (G_sysConfigData.vdd_current_rollover_10mA != 0xFFFF)
{
- initiate_avsbus_read_status();
- L_avsbus_state = AVSBUS_STATE_PROCESS_STATUS;
+ clear_status_errors(G_sysConfigData.avsbus_vdd.bus, AVSBUS_STATUS_OVER_CURRENT_MASK);
}
- // Toggle between reading temperature and status
- L_read_temp = !L_read_temp;
+ initiate_avsbus_reads(AVSBUS_CURRENT);
+ L_avsbus_state = AVSBUS_STATE_PROCESS_CURRENT;
+ break;
+
+ case AVSBUS_STATE_PROCESS_CURRENT:
+ // Process the current readings
+ process_avsbus_current();
+
+ // Initiate read of status
+ initiate_avsbus_read_status();
+ L_avsbus_state = AVSBUS_STATE_PROCESS_STATUS;
break;
case AVSBUS_STATE_PROCESS_STATUS:
{
// Process the status
- uint16_t otStatus = process_avsbus_status();
- if (G_vrm_thermal_monitoring)
- {
- // Update sensor with the OT status (0 / 1)
- sensor_update(AMECSENSOR_PTR(VRMPROCOT), otStatus);
- }
- // Back to reading currents
- initiate_avsbus_reads(AVSBUS_CURRENT);
- L_avsbus_state = AVSBUS_STATE_PROCESS_CURRENT;
- }
- break;
+ process_avsbus_status();
- case AVSBUS_STATE_PROCESS_TEMPERATURE:
- {
- // Read and process Vdd temperature
- avsbus_read(AVSBUS_VDD, AVSBUS_TEMPERATURE);
- // Back to reading currents
- initiate_avsbus_reads(AVSBUS_CURRENT);
- L_avsbus_state = AVSBUS_STATE_PROCESS_CURRENT;
+ // Initiate read of Vdd temperature
+ avsbus_read_start(AVSBUS_VDD, AVSBUS_TEMPERATURE);
+ L_avsbus_state = AVSBUS_STATE_PROCESS_TEMPERATURE;
}
break;
@@ -694,16 +733,6 @@ void amec_update_avsbus_sensors(void)
break;
}
- // Update the chip voltage and power sensors after every reading
- if (G_avsbus_vdd_monitoring)
- {
- update_avsbus_power_sensors(AVSBUS_VDD);
- }
- if (G_avsbus_vdn_monitoring)
- {
- update_avsbus_power_sensors(AVSBUS_VDN);
- }
-
} // end amec_update_avsbus_sensors()
// Function Specification
diff --git a/src/occ_405/amec/amec_sys.h b/src/occ_405/amec/amec_sys.h
index 95260d6..fcb988a 100755
--- a/src/occ_405/amec/amec_sys.h
+++ b/src/occ_405/amec/amec_sys.h
@@ -363,7 +363,6 @@ typedef struct
sensor_t cur12Vstby;
sensor_t vrhot_mem_proc;
- sensor_t vrfan;
sensor_t tempvdd;
// Chip Sensors
@@ -697,8 +696,6 @@ typedef struct
amec_controller_t thermalcent;
// Thermal Controller based on DIMM temperatures
amec_controller_t thermaldimm;
- // Thermal Controller based on VRHOT signal from processor VRM
- amec_controller_t vrhotproc;
// Thermal Controller based on VRM Vdd temperatures
amec_controller_t thermalvdd;
diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds.c b/src/occ_405/cmdh/cmdh_fsp_cmds.c
index 3249962..70e4fcb 100755
--- a/src/occ_405/cmdh/cmdh_fsp_cmds.c
+++ b/src/occ_405/cmdh/cmdh_fsp_cmds.c
@@ -53,7 +53,6 @@
#include "gpu.h"
extern dimm_sensor_flags_t G_dimm_temp_expired_bitmap;
-extern bool G_vrm_thermal_monitoring;
extern uint32_t G_first_proc_gpu_config;
extern bool G_vrm_vdd_temp_expired;
extern bool G_reset_prep;
@@ -174,7 +173,7 @@ ERRL_RC cmdh_poll_v20(cmdh_fsp_rsp_t * o_rsp_ptr)
for ( k = 0; k < MAX_NUM_CORES; k++ )
{
uint32_t l_freq_reason = g_amec->proc[0].core[k].f_reason;
- if ( l_freq_reason & (AMEC_VOTING_REASON_PROC_THRM | AMEC_VOTING_REASON_VRHOT_THRM) )
+ if ( l_freq_reason & AMEC_VOTING_REASON_PROC_THRM )
{
// only set DVFS bit if throttling below frequency to report throttling
if(G_amec_opal_proc_throt_reason == CPU_OVERTEMP)
@@ -377,19 +376,6 @@ ERRL_RC cmdh_poll_v20(cmdh_fsp_rsp_t * o_rsp_ptr)
}
}
- if (G_vrm_thermal_monitoring)
- {
- // Add VRFAN
- const sensor_t *vrfan = getSensorByGsid(VRMPROCOT);
- if (vrfan != NULL)
- {
- l_tempSensorList[l_sensorHeader.count].id = 0;
- l_tempSensorList[l_sensorHeader.count].fru_type = DATA_FRU_VRM_OT_STATUS;
- l_tempSensorList[l_sensorHeader.count].value = vrfan->sample & 0xFF;
- l_sensorHeader.count++;
- }
- }
-
if (G_avsbus_vdd_monitoring)
{
// Add Vdd temp
diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c
index 542b5bc..9b75703 100755
--- a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c
+++ b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c
@@ -113,9 +113,6 @@ cmdh_ips_config_data_t G_ips_config_data = {0};
bool G_mem_monitoring_allowed = FALSE;
-// Flag will get enabled when OCC receives Thermal Threshold data
-bool G_vrm_thermal_monitoring = FALSE;
-
// Will get set when receiving APSS config data
PWR_READING_TYPE G_pwr_reading_type = PWR_READING_TYPE_NONE;
@@ -1146,15 +1143,19 @@ errlHndl_t data_store_avsbus_config(const cmdh_fsp_cmd_t * i_cmd_ptr,
cmdh_fsp_rsp_t * o_rsp_ptr)
{
errlHndl_t l_err = NULL;
- const uint8_t AVSBUS_VERSION = 0x01;
- const uint16_t AVSBUS_LENGTH = sizeof(cmdh_avsbus_config_t) - sizeof(cmdh_fsp_cmd_header_t);
+ const uint8_t AVSBUS_VERSION_1 = 0x01;
+ const uint8_t AVSBUS_VERSION_2 = 0x02;
+ const uint16_t AVSBUS_V1_LENGTH = sizeof(cmdh_avsbus_config_t) - sizeof(cmdh_fsp_cmd_header_t);
+ const uint16_t AVSBUS_V2_LENGTH = sizeof(cmdh_avsbus_v2_config_t) - sizeof(cmdh_fsp_cmd_header_t);
bool l_invalid_data = FALSE;
cmdh_avsbus_config_t *l_cmd_ptr = (cmdh_avsbus_config_t *)i_cmd_ptr;
uint16_t l_data_length = CMDH_DATALEN_FIELD_UINT16(l_cmd_ptr);
- if ((AVSBUS_VERSION == l_cmd_ptr->version) && (AVSBUS_LENGTH == l_data_length))
+ if ( ((AVSBUS_VERSION_1 == l_cmd_ptr->version) && (AVSBUS_V1_LENGTH == l_data_length)) ||
+ ((AVSBUS_VERSION_2 == l_cmd_ptr->version) && (AVSBUS_V2_LENGTH == l_data_length)) )
{
+ // common code for all versions
// Validate Vdd
if ((l_cmd_ptr->vdd_bus == 0) || (l_cmd_ptr->vdd_bus == 1))
{
@@ -1215,10 +1216,10 @@ errlHndl_t data_store_avsbus_config(const cmdh_fsp_cmd_t * i_cmd_ptr,
}
else
{
- if (l_cmd_ptr->vdd_bus != 0xFF)
+ if (l_cmd_ptr->vdn_bus != 0xFF)
{
CMDH_TRAC_ERR("data_store_avsbus_config: Invalid Vdn data (%d / %d)",
- l_cmd_ptr->vdd_bus, l_cmd_ptr->vdd_rail);
+ l_cmd_ptr->vdn_bus, l_cmd_ptr->vdn_rail);
l_invalid_data = TRUE;
}
else
@@ -1250,6 +1251,23 @@ errlHndl_t data_store_avsbus_config(const cmdh_fsp_cmd_t * i_cmd_ptr,
{
G_sysConfigData.proc_power_adder = l_cmd_ptr->proc_power_adder;
+ // Vdd Current roll over workaround is enabled if we received Version 2
+ if(AVSBUS_VERSION_2 == l_cmd_ptr->version)
+ {
+ cmdh_avsbus_v2_config_t *l_cmd_ptr_v2 = (cmdh_avsbus_v2_config_t *)i_cmd_ptr;
+ G_sysConfigData.vdd_current_rollover_10mA = (uint32_t)l_cmd_ptr_v2->vdd_current_rollover;
+ G_sysConfigData.vdd_max_current_10mA = (uint32_t)l_cmd_ptr_v2->vdd_max_current;
+ }
+ else
+ {
+ // Vdd Current roll over workaround is disabled
+ G_sysConfigData.vdd_current_rollover_10mA = 0xFFFF; // no rollover
+ G_sysConfigData.vdd_max_current_10mA = 0xFFFF;
+ }
+
+ CMDH_TRAC_INFO("data_store_avsbus_config: Vdd Current roll over at 0x%08X max 0x%08X",
+ G_sysConfigData.vdd_current_rollover_10mA, G_sysConfigData.vdd_max_current_10mA);
+
// We can use vdd/vdn. Clear NO_VDD_VDN_READ mask
set_clear_wof_disabled( CLEAR, WOF_RC_INVALID_VDD_VDN );
avsbus_init();
@@ -1829,7 +1847,6 @@ errlHndl_t data_store_thrm_thresholds(const cmdh_fsp_cmd_t * i_cmd_ptr,
cmdh_thrm_thresholds_v20_t* l_cmd_ptr = (cmdh_thrm_thresholds_v20_t*)i_cmd_ptr;
uint8_t l_num_data_sets = 0;
bool l_invalid_input = TRUE; //Assume bad input
- bool l_vrm_frutype = FALSE;
do
{
@@ -1898,10 +1915,11 @@ errlHndl_t data_store_thrm_thresholds(const cmdh_fsp_cmd_t * i_cmd_ptr,
G_data_cnfg->thrm_thresh.data[l_frutype].max_read_timeout =
l_cmd_ptr->data[i].max_read_timeout;
- // Set a local flag if we get data for VRM OT status FRU type
+ // VRM OT status is no longer supported since the OCC supports reading Vdd temperature
+ // Trace if VRM OT status FRU type is received and just ignore it
if(l_frutype == DATA_FRU_VRM_OT_STATUS)
{
- l_vrm_frutype = TRUE;
+ CMDH_TRAC_IMP("data_store_thrm_thresholds: Received deprecated VRM OT STATUS type will be ignored");
}
// Useful trace for debugging
@@ -1922,23 +1940,6 @@ errlHndl_t data_store_thrm_thresholds(const cmdh_fsp_cmd_t * i_cmd_ptr,
}
}
- // Did we get data for VRM FRU type?
- if(l_vrm_frutype)
- {
- // Then, set a global variable so that OCC attempts to talk to
- // the VRMs
- G_vrm_thermal_monitoring = TRUE;
- }
- else
- {
- // No VRM data was received, so do not read AVS Bus status from VRMs
- // Also, make the error count very high so that the health
- // monitor doesn't complain about VRHOT being asserted.
- G_vrm_thermal_monitoring = FALSE;
- G_data_cnfg->thrm_thresh.data[DATA_FRU_VRM_OT_STATUS].error_count = 0xFF;
- CMDH_TRAC_IMP("data_store_thrm_thresholds: No VRM limits received. OCC will not monitor AVS bus status");
- }
-
} while(0);
if(!l_err)
diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.h b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.h
index 8c2f103..fc843aa 100755
--- a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.h
+++ b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.h
@@ -79,7 +79,7 @@ typedef enum
DATA_FRU_PROC = 0x00,
DATA_FRU_CENTAUR = 0x01,
DATA_FRU_DIMM = 0x02,
- DATA_FRU_VRM_OT_STATUS = 0x03, // this is just a bit indicating OT or not
+ DATA_FRU_VRM_OT_STATUS = 0x03, // this is just for the bit and is no longer being supported
DATA_FRU_GPU = 0x04,
DATA_FRU_GPU_MEM = 0x05,
DATA_FRU_VRM_VDD = 0x06, // this is an actual temperature reading for VRM Vdd
@@ -167,6 +167,22 @@ typedef struct __attribute__ ((packed))
uint16_t proc_power_adder;
}cmdh_avsbus_config_t;
+// Version 2 AVS Bus config data.
+typedef struct __attribute__ ((packed))
+{
+ struct cmdh_fsp_cmd_header;
+ uint8_t format;
+ uint8_t version;
+ uint8_t vdd_bus;
+ uint8_t vdd_rail;
+ uint16_t reserved1;
+ uint8_t vdn_bus;
+ uint8_t vdn_rail;
+ uint16_t proc_power_adder;
+ uint16_t vdd_current_rollover;
+ uint16_t vdd_max_current;
+}cmdh_avsbus_v2_config_t;
+
// Used by TMGT to send OCC GPU data.
// Header data for GPU version 2 cfg packet
typedef struct __attribute__ ((packed))
diff --git a/src/occ_405/common.h b/src/occ_405/common.h
index 261cf33..cabaadb 100644
--- a/src/occ_405/common.h
+++ b/src/occ_405/common.h
@@ -33,6 +33,7 @@
#define ALLOW_VFRT_TRACE 0x0004
#define ALLOW_OPAL_TRACE 0x0008
#define ALLOW_MEM_TRACE 0x0010
+#define ALLOW_AVSBUS_TRACE 0x0020
// Start of SRAM memory
#define SRAM_START_ADDRESS_405 0xFFF40000
diff --git a/src/occ_405/errl/errl.h b/src/occ_405/errl/errl.h
index 18bc791..ab1397e 100755
--- a/src/occ_405/errl/errl.h
+++ b/src/occ_405/errl/errl.h
@@ -275,8 +275,8 @@ typedef enum {
ERRH_AVSBUS_VDN_VOLTAGE = 0x04,
ERRH_DIMM_I2C_PORT0 = 0x05,
ERRH_DIMM_I2C_PORT1 = 0x06,
- ERRH_AVSBUS_VDD_OVER_TEMPERATURE = 0x07,
- ERRH_AVSBUS_VDN_OVER_TEMPERATURE = 0x08,
+ ERRH_AVSBUS_VDD_STATUS_READ_FAIL = 0x07,
+ ERRH_AVSBUS_VDN_STATUS_READ_FAIL = 0x08,
ERRH_AVSBUS_VDD_OVER_CURRENT = 0x09,
ERRH_AVSBUS_VDN_OVER_CURRENT = 0x0A,
ERRH_INVALID_APSS_DATA = 0x0B,
@@ -299,6 +299,7 @@ typedef enum {
ERRH_VFRT_TIMEOUT_IGNORED = 0x1C,
ERRH_WOF_CONTROL_TIMEOUT_IGNORED = 0x1D,
ERRH_PSTATE_CHANGE_IGNORED = 0x1E,
+ ERRH_VDD_CURRENT_ROLLOVER_MAX = 0x1F,
ERR_HISTORY_SIZE = 0x20
} ERR_HISTORY_INDEX;
diff --git a/src/occ_405/occ_service_codes.h b/src/occ_405/occ_service_codes.h
index 202b1b8..d995114 100644
--- a/src/occ_405/occ_service_codes.h
+++ b/src/occ_405/occ_service_codes.h
@@ -59,8 +59,6 @@ enum occReasonCode
EXTERNAL_INTERFACE_FAILURE = 0x18,
/// VRM Vdd reached error temperature threshold
VRM_VDD_ERROR_TEMP = 0x20,
- /// VR_FAN - AVS Bus over-temperature reported
- VRM_VRFAN_WARNING = 0x22,
/// GPIO_VR_HOT_MEM_PROC signal from APSS asserted
VR_HOT_MEM_PROC_ASSERTED = 0x23,
/// DIMM reached error threshold
@@ -104,8 +102,6 @@ enum occReasonCode
PBAX_QUEUE_RESET = 0xBA,
/// Request to read APSS data failed.
APSS_GPE_FAILURE = 0xC0,
- /// AVS Bus output over-current reported
- VRM_OVER_CURRENT_WARNING = 0xC1,
/// Slave OCC failed to receive new APSS data over a short time interval
APSS_SLV_SHORT_TIMEOUT = 0xC3,
/// Slave OCC failed to receive new APSS data over a long time interval
diff --git a/src/occ_405/occ_sys_config.c b/src/occ_405/occ_sys_config.c
index c3b5839..7255246 100755
--- a/src/occ_405/occ_sys_config.c
+++ b/src/occ_405/occ_sys_config.c
@@ -166,6 +166,8 @@ occSysConfigData_t G_sysConfigData =
},
.proc_power_adder = 0,
+ .vdd_current_rollover_10mA = 0xffff,
+ .vdd_max_current_10mA = 0xffff,
// -----------------------------------------------------------
// Power Cap Initializations
diff --git a/src/occ_405/occ_sys_config.h b/src/occ_405/occ_sys_config.h
index 1aea0fd..0b16aa5 100755
--- a/src/occ_405/occ_sys_config.h
+++ b/src/occ_405/occ_sys_config.h
@@ -377,6 +377,8 @@ typedef struct
avsbusData_t avsbus_vdd;
avsbusData_t avsbus_vdn;
uint16_t proc_power_adder;
+ uint32_t vdd_current_rollover_10mA;
+ uint32_t vdd_max_current_10mA;
// ------------------------------------
// Power Cap Configuration Data updated by Slaves
diff --git a/src/occ_405/occbuildname.c b/src/occ_405/occbuildname.c
index 394d019..f30609e 100755
--- a/src/occ_405/occbuildname.c
+++ b/src/occ_405/occbuildname.c
@@ -34,6 +34,6 @@ volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) =
#else
-volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) = /*<BuildName>*/ "op_occ_180411a\0" /*</BuildName>*/ ;
+volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) = /*<BuildName>*/ "op_occ_180416a\0" /*</BuildName>*/ ;
#endif
diff --git a/src/occ_405/pss/avsbus.c b/src/occ_405/pss/avsbus.c
index 620d376..f25f86e 100644
--- a/src/occ_405/pss/avsbus.c
+++ b/src/occ_405/pss/avsbus.c
@@ -35,6 +35,7 @@
#include "ssx.h"
#include "occ_util.h"
#include "cmdh_fsp_cmds_datacnfg.h"
+#include "common.h"
//#define AVSDEBUG
@@ -62,9 +63,12 @@ static bool G_trace_scoms = TRUE;
bool G_avsbus_vdd_monitoring = FALSE;
bool G_avsbus_vdn_monitoring = FALSE;
+// Vdd Current reading to check if it rolled over (0 when no roll over checking required)
+uint32_t G_check_vdd_current_10mA_for_rollover = 0;
+
+extern uint16_t G_allow_trace_flags;
extern uint32_t G_nest_frequency_mhz;
#define AVSBUS_FREQUENCY_MHZ 10
-extern bool G_vrm_thermal_monitoring;
extern bool G_vrm_vdd_temp_expired;
void amec_health_check_vrm_vdd_temp(const sensor_t *i_sensor);
@@ -114,8 +118,8 @@ uint32_t wait_for_complete(const uint8_t i_bus)
}
-// Clear OT/OC bit in status reg for both busses
-uint32_t deglitch_status_errors(const uint8_t i_bus, const uint32_t i_status_mask)
+// Clear bits i_status_mask in status reg for i_bus
+uint32_t clear_status_errors(const uint8_t i_bus, const uint32_t i_status_mask)
{
// Write O2SCMD[a][n]
// o2s_clear_sticky_bits = 1
@@ -123,12 +127,8 @@ uint32_t deglitch_status_errors(const uint8_t i_bus, const uint32_t i_status_mas
DEBUG_OUT32(OCB_O2SCMDxB[i_bus], value, "OCB_O2SCMDxB");
out32(OCB_O2SCMDxB[i_bus], value);
- // To deglitch the status bits, set the status bits you wish to clear with a 1. (in CmdData)
- // After the write completes, if the status is still active, then the
- // signal must be solid failure.
-
- TRAC_INFO("deglitch_status_errors(AVSBUS %d,0x%08X)", i_bus, i_status_mask);
- // AVS Bus command (write staus):
+ // To clear status bits write the status bits you wish to clear with a 1. (in CmdData)
+ // AVS Bus command (write status):
// 0:1 StartCode = 0b01
// 2:3 Cmd = 0b00 (write+commit)
// 4 CmdGroup = 0b0 (AVSBus)
@@ -138,7 +138,7 @@ uint32_t deglitch_status_errors(const uint8_t i_bus, const uint32_t i_status_mas
// 29:31 CRC
// 01000DDD DRRRRXXX XXXXXXXX XXXXXCCC
// 01000111 01111--- -------- -----CCC
- uint32_t cmd_data = AVSBUS_STATUS_OVER_CURRENT_MASK | AVSBUS_STATUS_OVER_TEMPERATURE_MASK;
+ uint32_t cmd_data = i_status_mask;
value = 0x47780000 | (cmd_data << 3);
// Calculate/add CRC
value |= avs_crc_calculate(value);
@@ -151,7 +151,7 @@ uint32_t deglitch_status_errors(const uint8_t i_bus, const uint32_t i_status_mas
// return the last read status
return l_status;
-} // end deglitch_status_errors()
+} // end clear_status_errors()
// Re-sync AVS bus to try to recover from errors
@@ -290,18 +290,17 @@ void avsbus_init()
out32(OCB_O2SCTRL21B, value);
}
- // Re-sync AVS bus and clear OC/OT masks in status regs and
- // De-glitch: clear OC/OT masks in the status reg
- const uint32_t error_mask = AVSBUS_STATUS_OVER_CURRENT_MASK | AVSBUS_STATUS_OVER_TEMPERATURE_MASK;
+ // Re-sync AVS bus and clear OC bits in status regs and
+ const uint32_t error_mask = AVSBUS_STATUS_OVER_CURRENT_MASK;
if (bus0_monitoring)
{
avsbus_resync(0);
- deglitch_status_errors(0, error_mask);
+ clear_status_errors(0, error_mask);
}
if (bus1_monitoring)
{
avsbus_resync(1);
- deglitch_status_errors(1, error_mask);
+ clear_status_errors(1, error_mask);
}
@@ -676,7 +675,6 @@ uint16_t avsbus_read(const avsbus_type_e i_type,
*l_error_count, l_trace_type, l_trace_cmd);
G_avsbus_vdd_monitoring = FALSE;
G_avsbus_vdn_monitoring = FALSE;
- G_vrm_thermal_monitoring = FALSE;
errlHndl_t l_err = createErrl(PSS_MID_AVSBUS_READ,
rc,
exrc,
@@ -728,7 +726,7 @@ void initiate_avsbus_reads(avsbus_cmdtype_e i_cmdType)
} // end initiate_avsbus_reads()
-// Initiate read for error status bits (over-temperature, over-current)
+// Initiate read for error status bits (over-current)
void initiate_avsbus_read_status()
{
if (isSafeStateRequested())
@@ -805,12 +803,10 @@ void initiate_avsbus_read_status()
// Process AVS Bus read status results (or errors)
-// Predictive error will be logged after "VRMs: max_read_timeout" failures
-// and a mfg error will be committed.
// Returns the status data or AVSBUS_STATUS_READ_ERROR on error
uint16_t avsbus_read_status(const avsbus_type_e i_type)
{
- if (isSafeStateRequested() || (G_vrm_thermal_monitoring == FALSE))
+ if (isSafeStateRequested())
{
// No need to process data if OCC will be reset
return 0;
@@ -977,243 +973,105 @@ uint16_t avsbus_read_status(const avsbus_type_e i_type)
} // end avsbus_read_status()
-// Read the status from AVS Bus and return 1 if over-temperature was found for either bus
-// or 0 if no OT was found. 0xFF will be returned if there was an error reading status.
-// Error history counters will be incremented for any over-temp/over-current condition.
-// Mfg error will be logged for the first OT or first OC condition.
-uint8_t process_avsbus_status()
+// Read the status from AVS Bus and apply Vdd current roll over workaround if needed
+// Error history counters will be incremented for any over-current condition.
+void process_avsbus_status()
{
- uint8_t foundOT = 0;
- uint8_t foundOC = 0;
uint16_t vdd_status = 0;
uint16_t vdn_status = 0;
- static bool L_vdd_ot_found = FALSE;
static bool L_vdd_oc_found = FALSE;
- static bool L_vdn_ot_found = FALSE;
static bool L_vdn_oc_found = FALSE;
- static bool L_vdd_ot_counted = FALSE;
- static bool L_vdd_oc_counted = FALSE;
- static bool L_vdn_ot_counted = FALSE;
- static bool L_vdn_oc_counted = FALSE;
- if (G_vrm_thermal_monitoring)
+ if (G_avsbus_vdd_monitoring)
{
- if (G_avsbus_vdd_monitoring)
+ vdd_status = avsbus_read_status(AVSBUS_VDD);
+ if (vdd_status != AVSBUS_STATUS_READ_ERROR)
{
- vdd_status = avsbus_read_status(AVSBUS_VDD);
- if (vdd_status != AVSBUS_STATUS_READ_ERROR)
+ if ((vdd_status & AVSBUS_STATUS_OVER_CURRENT_MASK) == 0)
{
- if ((vdd_status & (AVSBUS_STATUS_OVER_TEMPERATURE_MASK|AVSBUS_STATUS_OVER_CURRENT_MASK)) == 0)
+ // No OC errors found
+ if (L_vdd_oc_found)
{
- // No OT/OC errors found
- if (L_vdd_ot_found) TRAC_INFO("process_avsbus_status: Vdd OT cleared");
- L_vdd_ot_found = FALSE;
- L_vdd_ot_counted = FALSE;
- if (L_vdd_oc_found) TRAC_INFO("process_avsbus_status: Vdd OC cleared");
L_vdd_oc_found = FALSE;
- L_vdd_oc_counted = FALSE;
- }
- else
- {
- // Deglitch error if needed
- uint32_t deglitch_mask = 0;
- if ((vdd_status & AVSBUS_STATUS_OVER_TEMPERATURE_MASK) && (!L_vdd_ot_found))
- {
- deglitch_mask |= AVSBUS_STATUS_OVER_TEMPERATURE_MASK;
- L_vdd_ot_found = TRUE;
- }
- if ((vdd_status & AVSBUS_STATUS_OVER_CURRENT_MASK) && (!L_vdd_oc_found))
- {
- deglitch_mask |= AVSBUS_STATUS_OVER_CURRENT_MASK;
- L_vdd_oc_found = TRUE;
- }
- if (deglitch_mask)
- {
- // Deglitch error bit(s)
- deglitch_status_errors(G_sysConfigData.avsbus_vdd.bus, deglitch_mask);
-
- // Clear error bit(s) since could be false reading
- vdd_status &= (~deglitch_mask);
- }
-
- // Process error (if already deglitched)
- if (vdd_status & AVSBUS_STATUS_OVER_TEMPERATURE_MASK)
- {
- foundOT = 1;
- if (!L_vdd_ot_counted)
- {
- INCREMENT_ERR_HISTORY(ERRH_AVSBUS_VDD_OVER_TEMPERATURE);
- L_vdd_ot_counted = TRUE;
- }
- }
- else
- {
- L_vdd_ot_counted = FALSE;
- }
-
- if (vdd_status & AVSBUS_STATUS_OVER_CURRENT_MASK)
- {
- foundOC = 1;
- if (!L_vdd_oc_counted)
- {
- INCREMENT_ERR_HISTORY(ERRH_AVSBUS_VDD_OVER_CURRENT);
- L_vdd_oc_counted = TRUE;
- }
- }
- else
- {
- L_vdd_oc_counted = FALSE;
- }
+
+ if(G_allow_trace_flags & ALLOW_AVSBUS_TRACE)
+ TRAC_INFO("process_avsbus_status: Vdd OC cleared");
}
}
- else
+ else // Over current warning bit is set
{
- // 0xFF indicates error reading status
- foundOT = 0xFF;
+ INCREMENT_ERR_HISTORY(ERRH_AVSBUS_VDD_OVER_CURRENT);
+ L_vdd_oc_found = TRUE;
}
- }
- if (G_avsbus_vdn_monitoring)
- {
- vdn_status = avsbus_read_status(AVSBUS_VDN);
- if (vdn_status != AVSBUS_STATUS_READ_ERROR)
+
+ // Was updating Vdd Current sensor on hold to check if the reading rolled over?
+ if (G_check_vdd_current_10mA_for_rollover)
{
- if ((vdn_status & (AVSBUS_STATUS_OVER_TEMPERATURE_MASK|AVSBUS_STATUS_OVER_CURRENT_MASK)) == 0)
- {
- // No OT/OC errors found
- if (L_vdn_ot_found) TRAC_INFO("process_avsbus_status: Vdn OT cleared");
- L_vdn_ot_found = FALSE;
- L_vdn_ot_counted = FALSE;
- if (L_vdn_oc_found) TRAC_INFO("process_avsbus_status: Vdn OC cleared");
- L_vdn_oc_found = FALSE;
- L_vdn_oc_counted = FALSE;
- }
- else
+ uint32_t l_current = G_check_vdd_current_10mA_for_rollover;
+
+ // over current bit gets set when there is a roll over
+ if (L_vdd_oc_found)
{
- // Deglitch error if needed
- uint32_t deglitch_mask = 0;
- if ((vdn_status & AVSBUS_STATUS_OVER_TEMPERATURE_MASK) && (!L_vdn_ot_found))
- {
- deglitch_mask |= AVSBUS_STATUS_OVER_TEMPERATURE_MASK;
- L_vdn_ot_found = TRUE;
- }
- if ((vdn_status & AVSBUS_STATUS_OVER_CURRENT_MASK) && (!L_vdn_oc_found))
- {
- deglitch_mask |= AVSBUS_STATUS_OVER_CURRENT_MASK;
- L_vdn_oc_found = TRUE;
- }
- if (deglitch_mask)
- {
- // Deglitch error bit(s)
- deglitch_status_errors(G_sysConfigData.avsbus_vdn.bus, deglitch_mask);
-
- // Clear error bit(s) since could be false reading
- vdn_status &= (~deglitch_mask);
- }
-
- // Process error (if already deglitched)
- if (vdn_status & AVSBUS_STATUS_OVER_TEMPERATURE_MASK)
- {
- // if no Vdd error, update OT result
- if (foundOT != 0xFF)
+ // add the rollover point (from AVSbus config data) to the Current reading
+ l_current += G_sysConfigData.vdd_current_rollover_10mA;
+ // sanity check for valid rollover, make sure it isn't over the theoretical max (from AVSbus config data)
+ if(l_current > G_sysConfigData.vdd_max_current_10mA)
+ {
+ // went over the theoretical max don't apply the roll over
+ INCREMENT_ERR_HISTORY(ERRH_VDD_CURRENT_ROLLOVER_MAX);
+
+ if(G_allow_trace_flags & ALLOW_AVSBUS_TRACE)
{
- foundOT = 1;
+ TRAC_INFO("process_avsbus_status: Current with rollover %d > %d max",
+ l_current, G_sysConfigData.vdd_max_current_10mA);
}
- if (!L_vdn_ot_counted)
- {
- INCREMENT_ERR_HISTORY(ERRH_AVSBUS_VDN_OVER_TEMPERATURE);
- L_vdn_ot_counted = TRUE;
- }
- }
- else
- {
- L_vdn_ot_counted = FALSE;
- }
-
- if (vdn_status & AVSBUS_STATUS_OVER_CURRENT_MASK)
- {
- foundOC = 1;
- if (!L_vdn_oc_counted)
- {
- INCREMENT_ERR_HISTORY(ERRH_AVSBUS_VDN_OVER_CURRENT);
- L_vdn_oc_counted = TRUE;
- }
- }
- else
- {
- L_vdn_oc_counted = FALSE;
- }
+ l_current = G_check_vdd_current_10mA_for_rollover;
+ }
}
- }
- else
- {
- // 0xFF indicates error reading status
- foundOT = 0xFF;
+
+ // Now it is ok to update the sensor with Current value in unit 10mA
+ sensor_update(AMECSENSOR_PTR(CURVDD), (uint16_t)l_current);
+
+ // Update the chip voltage and power sensors after every current reading
+ update_avsbus_power_sensors(AVSBUS_VDD);
+
+ // clear so we know we have a new reading next time
+ G_check_vdd_current_10mA_for_rollover = 0;
}
}
-
- // Log an error the first time either condition is asserted
- static bool loggedOT = FALSE;
- static bool loggedOC = FALSE;
- errlHndl_t l_err;
- if ((foundOT == 1) && !loggedOT && G_vrm_thermal_monitoring)
+ else
{
- loggedOT = TRUE;
- TRAC_ERR("process_avsbus_status: AVSBUS Over Temperature Warning (Vdd: 0x%08X, Vdn: 0x%08X)",
- vdd_status, vdn_status);
- /* @
- * @errortype
- * @moduleid PSS_MID_AVSBUS_READ
- * @reasoncode VRM_VRFAN_WARNING
- * @userdata1 Vdd Status
- * @userdata2 Vdn Status
- * @devdesc VRFAN / over-temperature asserted
- */
- l_err = createErrl(PSS_MID_AVSBUS_READ,
- VRM_VRFAN_WARNING,
- OCC_NO_EXTENDED_RC,
- ERRL_SEV_INFORMATIONAL,
- NULL,
- DEFAULT_TRACE_SIZE,
- vdd_status, vdn_status);
- setErrlActions(l_err, ERRL_ACTIONS_MANUFACTURING_ERROR);
- // add processor callout
- addCalloutToErrl(l_err,
- ERRL_CALLOUT_TYPE_HUID,
- G_sysConfigData.proc_huid,
- ERRL_CALLOUT_PRIORITY_MED);
- commitErrl(&l_err);
+ // error reading status
+ INCREMENT_ERR_HISTORY(ERRH_AVSBUS_VDD_STATUS_READ_FAIL);
}
- if ((foundOC == 1) && !loggedOC)
+ }
+ if (G_avsbus_vdn_monitoring)
+ {
+ vdn_status = avsbus_read_status(AVSBUS_VDN);
+ if (vdn_status != AVSBUS_STATUS_READ_ERROR)
{
- loggedOC = TRUE;
- TRAC_ERR("process_avsbus_status: AVSBUS Over Current Warning (Vdd: 0x%08X, Vdn: 0x%08X)",
- vdd_status, vdn_status);
- /* @
- * @errortype
- * @moduleid PSS_MID_AVSBUS_READ
- * @reasoncode VRM_OVER_CURRENT_WARNING
- * @userdata1 Vdd Status
- * @userdata2 Vdn Status
- * @devdesc Output over-current asserted
- */
- l_err = createErrl(PSS_MID_AVSBUS_READ,
- VRM_OVER_CURRENT_WARNING,
- OCC_NO_EXTENDED_RC,
- ERRL_SEV_INFORMATIONAL,
- NULL,
- DEFAULT_TRACE_SIZE,
- vdd_status, vdn_status);
- setErrlActions(l_err, ERRL_ACTIONS_MANUFACTURING_ERROR);
- // add processor callout
- addCalloutToErrl(l_err,
- ERRL_CALLOUT_TYPE_HUID,
- G_sysConfigData.proc_huid,
- ERRL_CALLOUT_PRIORITY_MED);
- commitErrl(&l_err);
+ if ((vdn_status & AVSBUS_STATUS_OVER_CURRENT_MASK) == 0)
+ {
+ // No OC errors found
+ if (L_vdn_oc_found) TRAC_INFO("process_avsbus_status: Vdn OC cleared");
+ L_vdn_oc_found = FALSE;
+ }
+ else // Over current warning bit is set
+ {
+ INCREMENT_ERR_HISTORY(ERRH_AVSBUS_VDN_OVER_CURRENT);
+ L_vdn_oc_found = TRUE;
+ // Clear the over current error bit so we get a new read next time
+ clear_status_errors(G_sysConfigData.avsbus_vdn.bus, AVSBUS_STATUS_OVER_CURRENT_MASK);
+ }
+ }
+ else
+ {
+ // error reading status
+ INCREMENT_ERR_HISTORY(ERRH_AVSBUS_VDN_STATUS_READ_FAIL);
}
}
- return foundOT;
+ return;
} // end process_avsbus_status()
diff --git a/src/occ_405/pss/avsbus.h b/src/occ_405/pss/avsbus.h
index 071ba0c..d0b04ef 100755
--- a/src/occ_405/pss/avsbus.h
+++ b/src/occ_405/pss/avsbus.h
@@ -31,6 +31,8 @@
extern bool G_avsbus_vdd_monitoring;
extern bool G_avsbus_vdn_monitoring;
+extern uint32_t G_check_vdd_current_10mA_for_rollover;
+
#define AVSBUS_STATUS_OVER_CURRENT_MASK 0x4000
#define AVSBUS_STATUS_UNDER_VOLTAGE_MASK 0x2000
#define AVSBUS_STATUS_OVER_TEMPERATURE_MASK 0x1000
@@ -78,10 +80,13 @@ uint16_t avsbus_read(const avsbus_type_e i_type,
// (results can then be read on the next tick)
void initiate_avsbus_read_status();
-// Read the status from AVS Bus and return 1 if over-temperature was found for either bus
-// or 0 if no OT was found. 0xFF will be returned if there was an error reading status
-// on either bus. Mfg error will be logged for the first OT or first OC condition.
-// Error history counters will be incremented for any over-temp/over-current condition.
-uint8_t process_avsbus_status();
+// Read the status from AVS Bus
+// Error history counters will be incremented for any over-current condition.
+void process_avsbus_status();
+
+// Calculate chip voltage and power from AVSbus readings and update sensors
+void update_avsbus_power_sensors(const avsbus_type_e i_type);
+// Error history counters will be incremented for any over-current condition.
+uint32_t clear_status_errors(const uint8_t i_bus, const uint32_t i_status_mask);
#endif //_AVSBUS_H
diff --git a/src/occ_405/sensor/sensor_enum.h b/src/occ_405/sensor/sensor_enum.h
index 4cf6a43..4abda7b 100755
--- a/src/occ_405/sensor/sensor_enum.h
+++ b/src/occ_405/sensor/sensor_enum.h
@@ -144,7 +144,6 @@ enum e_gsid
VOLTVDN,
CURVDD,
CURVDN,
- VRMPROCOT,
TEMPVDD,
// ------------------------------------------------------
diff --git a/src/occ_405/sensor/sensor_info.c b/src/occ_405/sensor/sensor_info.c
index 98d6b1a..a7fc7df 100755
--- a/src/occ_405/sensor/sensor_info.c
+++ b/src/occ_405/sensor/sensor_info.c
@@ -44,9 +44,7 @@
// constants to allow fewer changes if tick time changes
#define AMEEFP_EVERY_TICK_HZ AMEEFP_500US_IN_HZ // tick time 500us
#define AMEEFP_EVERY_2ND_TICK_HZ AMEEFP_1MS_IN_HZ // 1ms
-#define AMEEFP_EVERY_3RD_TICK_HZ AMEEFP_1500US_IN_HZ // 1.5ms
#define AMEEFP_EVERY_4TH_TICK_HZ AMEEFP_2MS_IN_HZ // 2ms
-#define AMEEFP_EVERY_6TH_TICK_HZ AMEEFP_3MS_IN_HZ // 3ms
#define AMEEFP_EVERY_8TH_TICK_HZ AMEEFP_4MS_IN_HZ // 4ms
#define AMEEFP_EVERY_16TH_TICK_HZ AMEEFP_8MS_IN_HZ // 8ms
#define AMEEFP_EVERY_32ND_TICK_HZ AMEEFP_16MS_IN_HZ // 16ms
@@ -319,8 +317,8 @@ const sensor_info_t G_sensor_info[] =
SENSOR_INFO_T_ENTRY( TEMPPROCTHRM, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ),
SENSOR_INFO_T_ENTRY( UTIL, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1,-2) ),
SENSOR_INFO_T_ENTRY( TEMPNEST, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ),
- SENSOR_INFO_T_ENTRY( VOLTVDDSENSE, "mV\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_3RD_TICK_HZ, AMEFP( 1, -1) ),
- SENSOR_INFO_T_ENTRY( VOLTVDNSENSE, "mV\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_3RD_TICK_HZ, AMEFP( 1, -1) ),
+ SENSOR_INFO_T_ENTRY( VOLTVDDSENSE, "mV\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_4TH_TICK_HZ, AMEFP( 1, -1) ),
+ SENSOR_INFO_T_ENTRY( VOLTVDNSENSE, "mV\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_4TH_TICK_HZ, AMEFP( 1, -1) ),
SENSOR_INFO_T_ENTRY( PWRVDD, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_2ND_TICK_HZ, AMEFP( 1, 0) ),
SENSOR_INFO_T_ENTRY( PWRVDN, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_2ND_TICK_HZ, AMEFP( 1, 0) ),
SENSOR_INFO_T_ENTRY( PROCPWRTHROT, "#\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ),
@@ -330,12 +328,11 @@ const sensor_info_t G_sensor_info[] =
SENS_QUAD_ENTRY_SET( VOLTDROOPCNTQ, "#\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_QUAD, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ),
/* ==ReguSensors== NameString Units Type Location Number Freq ScaleFactor */
- SENSOR_INFO_T_ENTRY( VOLTVDD, "mV\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_3RD_TICK_HZ, AMEFP( 1, -1) ),
- SENSOR_INFO_T_ENTRY( VOLTVDN, "mV\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_3RD_TICK_HZ, AMEFP( 1, -1) ),
- SENSOR_INFO_T_ENTRY( CURVDD, "A\0", AMEC_SENSOR_TYPE_CURRENT, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_3RD_TICK_HZ, AMEFP( 1,-2) ),
- SENSOR_INFO_T_ENTRY( CURVDN, "A\0", AMEC_SENSOR_TYPE_CURRENT, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_3RD_TICK_HZ, AMEFP( 1,-2) ),
- SENSOR_INFO_T_ENTRY( VRMPROCOT, "#\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_6TH_TICK_HZ, AMEFP( 1, 0) ),
- SENSOR_INFO_T_ENTRY( TEMPVDD, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_6TH_TICK_HZ, AMEFP( 1, 0) ),
+ SENSOR_INFO_T_ENTRY( VOLTVDD, "mV\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_4TH_TICK_HZ, AMEFP( 1, -1) ),
+ SENSOR_INFO_T_ENTRY( VOLTVDN, "mV\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_4TH_TICK_HZ, AMEFP( 1, -1) ),
+ SENSOR_INFO_T_ENTRY( CURVDD, "A\0", AMEC_SENSOR_TYPE_CURRENT, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_4TH_TICK_HZ, AMEFP( 1,-2) ),
+ SENSOR_INFO_T_ENTRY( CURVDN, "A\0", AMEC_SENSOR_TYPE_CURRENT, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_4TH_TICK_HZ, AMEFP( 1,-2) ),
+ SENSOR_INFO_T_ENTRY( TEMPVDD, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_4TH_TICK_HZ, AMEFP( 1, 0) ),
/* ==CoreSensors== NameString Units Type Location Number Freq ScaleFactor */
SENS_CORE_ENTRY_SET( FREQREQC, "MHz\0", AMEC_SENSOR_TYPE_FREQ, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ),
diff --git a/src/occ_405/sensor/sensor_table.c b/src/occ_405/sensor/sensor_table.c
index ed21237..295ef36 100755
--- a/src/occ_405/sensor/sensor_table.c
+++ b/src/occ_405/sensor/sensor_table.c
@@ -375,7 +375,6 @@ const sensor_ptr_t G_amec_sensor_list[] =
SENSOR_PTR( VOLTVDN, &g_amec_sys.proc[0].vrm[1].volt250us),
SENSOR_PTR( CURVDD, &g_amec_sys.proc[0].curvdd),
SENSOR_PTR( CURVDN, &g_amec_sys.proc[0].curvdn),
- SENSOR_PTR( VRMPROCOT, &g_amec_sys.sys.vrfan),
SENSOR_PTR( TEMPVDD, &g_amec_sys.sys.tempvdd),
@@ -558,7 +557,6 @@ const minisensor_ptr_t G_amec_mini_sensor_list[] INIT_SECTION =
MINI_SENSOR_PTR( VOLTVDN, NULL),
MINI_SENSOR_PTR( CURVDD, NULL),
MINI_SENSOR_PTR( CURVDN, NULL),
- MINI_SENSOR_PTR( VRMPROCOT, NULL),
MINI_SENSOR_PTR( TEMPVDD, &G_dcom_slv_outbox_tx.tempvdd),
// ------------------------------------------------------
OpenPOWER on IntegriCloud