From 4f49f6351fa3908703b91e0dea9f3680c77a47a6 Mon Sep 17 00:00:00 2001 From: mbroyles Date: Fri, 13 Apr 2018 09:18:24 -0500 Subject: 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 Reviewed-by: Andres A. Lugo-Reyes Reviewed-by: Christopher J. Cain Reviewed-by: Martha Broyles --- src/occ_405/amec/amec_data.c | 5 - src/occ_405/amec/amec_freq.c | 17 -- src/occ_405/amec/amec_freq.h | 2 +- src/occ_405/amec/amec_init.c | 5 - src/occ_405/amec/amec_sensors_power.c | 149 ++++++++------ src/occ_405/amec/amec_sys.h | 3 - src/occ_405/cmdh/cmdh_fsp_cmds.c | 16 +- src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c | 57 +++--- src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.h | 18 +- src/occ_405/common.h | 1 + src/occ_405/errl/errl.h | 5 +- src/occ_405/occ_service_codes.h | 4 - src/occ_405/occ_sys_config.c | 2 + src/occ_405/occ_sys_config.h | 2 + src/occ_405/occbuildname.c | 2 +- src/occ_405/pss/avsbus.c | 318 +++++++++--------------------- src/occ_405/pss/avsbus.h | 15 +- src/occ_405/sensor/sensor_enum.h | 1 - src/occ_405/sensor/sensor_info.c | 17 +- src/occ_405/sensor/sensor_table.c | 2 - 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; kthermalcent.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"))) = /**/ "op_occ_180411a\0" /**/ ; +volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) = /**/ "op_occ_180416a\0" /**/ ; #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), // ------------------------------------------------------ -- cgit v1.2.1