summaryrefslogtreecommitdiffstats
path: root/src/occ_405/amec/amec_sensors_power.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/occ_405/amec/amec_sensors_power.c')
-rwxr-xr-xsrc/occ_405/amec/amec_sensors_power.c149
1 files changed, 89 insertions, 60 deletions
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
OpenPOWER on IntegriCloud