diff options
author | mbroyles <mbroyles@us.ibm.com> | 2017-07-12 08:49:44 -0500 |
---|---|---|
committer | Christopher J. Cain <cjcain@us.ibm.com> | 2017-07-25 14:49:58 -0400 |
commit | a84955963839b3a035dd339d3ba13e0acb88547a (patch) | |
tree | db8c5891abf3d1ea7b0ea839d8ce7b6c6b75f9cb /src | |
parent | ca84830b6d1811a78c538f51bde34c269806f00a (diff) | |
download | talos-occ-a84955963839b3a035dd339d3ba13e0acb88547a.tar.gz talos-occ-a84955963839b3a035dd339d3ba13e0acb88547a.zip |
Increase RTL to 500us
Stop waiting for APSS data when detected complete but failed
Add history counts for GPEs not idle and APSS collection errors
Change-Id: I2bfaf36ee0b736a958fd41c1c2145f537fc883c5
RTC: 172963
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43052
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Andres A. Lugo-Reyes <aalugore@us.ibm.com>
Reviewed-by: William A. Bryan <wilbryan@us.ibm.com>
Reviewed-by: Christopher J. Cain <cjcain@us.ibm.com>
Diffstat (limited to 'src')
25 files changed, 466 insertions, 394 deletions
diff --git a/src/occ_405/amec/amec_amester.c b/src/occ_405/amec/amec_amester.c index 1ac5def..23def82 100755 --- a/src/occ_405/amec/amec_amester.c +++ b/src/occ_405/amec/amec_amester.c @@ -58,6 +58,9 @@ extern uint32_t G_present_hw_cores; //*************************************************************************/ ///Maximum size of trace buffer +// NOTE: Any names in this file using timescale will NOT be kept in sync +// with RTL tick time changes since this is just for AMESTER, names +// used outside of the file by the main OCC code will be kept in sync #define AMEC_TB_2MS_SIZE_BYTES 8192 #define AMEC_TB_250US_SIZE_BYTES 8192 #define AMEC_TB_SIZE_BYTES (AMEC_TB_250US_SIZE_BYTES + AMEC_TB_2MS_SIZE_BYTES) @@ -85,8 +88,8 @@ DMA_BUFFER(UINT8 g_amec_tb_bytes[AMEC_TB_SIZE_BYTES]); // Array that maintains a list of all trace buffers built. // NOTE: Must be in same order as AMEC_TB_ENUM DMA_BUFFER(amec_tb_t g_amec_tb_list[AMEC_MAX_NUM_TB]) = { - //trace 2ms - [AMEC_TB_2MS] = { + //trace every 8th tick + [AMEC_TB_EVERY_8TH_TICK] = { "trace2ms", // name AMEFP(500,0), // freq (UINT8*)(UINT32)g_amec_tb_bytes, // bytes @@ -101,8 +104,8 @@ DMA_BUFFER(amec_tb_t g_amec_tb_list[AMEC_MAX_NUM_TB]) = { {0}, // sensors_num[] {0} // parms_num[] }, - // trace 250us - [AMEC_TB_250US] = { + // trace every tick + [AMEC_TB_EVERY_TICK] = { "trace250us", // name AMEFP(4000,0), // freq (UINT8*)(UINT32)g_amec_tb_bytes+AMEC_TB_2MS_SIZE_BYTES, // bytes @@ -1051,7 +1054,6 @@ void amec_tb_record(const AMEC_TB_GUID i_guid) /* Code */ /*------------------------------------------------------------------------*/ - // Record OCA from last 32 ms if(G_dcom_slv_inbox_rx.tb_record) { // Check for valid tb write entry index diff --git a/src/occ_405/amec/amec_amester.h b/src/occ_405/amec/amec_amester.h index c279712..b71782a 100644 --- a/src/occ_405/amec/amec_amester.h +++ b/src/occ_405/amec/amec_amester.h @@ -214,8 +214,8 @@ typedef UINT16 AMEC_SENSOR_GUID; typedef enum { - AMEC_TB_2MS, // GUID for 2ms trace - AMEC_TB_250US, // GUID for 250us trace + AMEC_TB_EVERY_8TH_TICK, // GUID for traces every 8th tick + AMEC_TB_EVERY_TICK, // GUID for traces every tick AMEC_TB_NUMBER_OF_TRACES // Number of trace buffers supported } AMEC_TB_ENUM; diff --git a/src/occ_405/amec/amec_sensors_core.c b/src/occ_405/amec/amec_sensors_core.c index 6dd6dfb..df5fb09 100755 --- a/src/occ_405/amec/amec_sensors_core.c +++ b/src/occ_405/amec/amec_sensors_core.c @@ -164,7 +164,7 @@ void amec_update_proc_core_sensors(uint8_t i_core) // Name: amec_calc_dts_sensors // // Description: Compute core temperature. This function is called every -// 4ms/core. +// CORE_DATA_COLLECTION_US/core. // // PreCondition: The core is present. // @@ -324,7 +324,7 @@ void amec_calc_dts_sensors(CoreData * i_core_data_ptr, uint8_t i_core) // Name: amec_calc_freq_and_util_sensors // // Description: Compute the frequency and utilization sensors for a given core. -// This function is called every 4ms/core. +// This function is called CORE_DATA_COLLECTION_US per core. // // Thread: RealTime Loop // @@ -359,14 +359,14 @@ void amec_calc_freq_and_util_sensors(CoreData * i_core_data_ptr, uint8_t i_core) // <amec_formula> // Result: Calculated Core Frequency // Sensor: FREQAC0 - // Timescale: 4ms + // Timescale: CORE_DATA_COLLECTION_US // Units: MHz // Min/Max: 0/6000 (UPPER_LIMIT_PROC_FREQ_MHZ=6000) - // Formula: cyc_delta(cycles) = (RAW_CYCLES[t=now] - RAW_CYCLES[t=-4ms]) - // time_delta(TOD ticks) = (TOD[t=now] - TOD[t=-4ms]) + // Formula: cyc_delta(cycles) = (RAW_CYCLES[t=now] - RAW_CYCLES[t=-CORE_DATA_COLLECTION_US]) + // time_delta(TOD ticks) = (TOD[t=now] - TOD[t=-CORE_DATA_COLLECTION_US]) // frequency(MHz) = (cyc_delta / time_delta) * (2M TOD ticks / 1 second) // = (2 * cyc_delta) / time_delta - // NOTE: cyc_delta is the total number of cycles in 4ms time for the core + // NOTE: cyc_delta is the total number of cycles in CORE_DATA_COLLECTION_US time for the core // NOTE: In the HWP where we aquire the TOD count, we shift the counter by 8 // which causes each TOD tick here to equate to 0.5us. This is why we // are multiplying by 2 in the above equation. @@ -402,15 +402,15 @@ void amec_calc_freq_and_util_sensors(CoreData * i_core_data_ptr, uint8_t i_core) // <amec_formula> // Result: Calculated Core Utilization // Sensor: UTILC0 - // Timescale: 4ms + // Timescale: CORE_DATA_COLLECTION_US // Units: 0.01 % // Min/Max: 0/10000 (0/100%) - // Formula: cyc_delta = (RAW_CYCLES[t=now] - RAW_CYCLES[t=-4ms]) - // run_delta = (RUN_CYCLES[t=now] - RUN_CYCLES[t=-4ms]) + // Formula: cyc_delta = (RAW_CYCLES[t=now] - RAW_CYCLES[t=-CORE_DATA_COLLECTION_US]) + // run_delta = (RUN_CYCLES[t=now] - RUN_CYCLES[t=-CORE_DATA_COLLECTION_US]) // UTIL(in %) = run_delta / cyc_delta // - // NOTE: cyc_delta is the total number of cycles in 4ms time for the core - // NOTE: run_delta is the total number of cycles utilized by a specific core in 4ms + // NOTE: cyc_delta is the total number of cycles in CORE_DATA_COLLECTION_US time for the core + // NOTE: run_delta is the total number of cycles utilized by a specific core in CORE_DATA_COLLECTION_US // </amec_formula> // Compute Delta in PC_RUN_CYCLES @@ -447,15 +447,15 @@ void amec_calc_freq_and_util_sensors(CoreData * i_core_data_ptr, uint8_t i_core) // <amec_formula> // Result: Calculated Core Utilization // Sensor: None - // Timescale: 4ms + // Timescale: CORE_DATA_COLLECTION_US // Units: 0.01 % // Min/Max: 0/10000 (0/100%) - // Formula: cyc_delta = (RAW_CYCLES[t=now] - RAW_CYCLES[t=-4ms]) - // run_delta = (RUN_CYCLES[t=now] - RUN_CYCLES[t=-4ms]) + // Formula: cyc_delta = (RAW_CYCLES[t=now] - RAW_CYCLES[t=-CORE_DATA_COLLECTION_US]) + // run_delta = (RUN_CYCLES[t=now] - RUN_CYCLES[t=-CORE_DATA_COLLECTION_US]) // UTIL(in %) = run_delta / cyc_delta // - // NOTE: cyc_delta is the total number of cycles run by the core in 4ms - // NOTE: run_delta is the total number of cycles run by a specific thread in 4ms + // NOTE: cyc_delta is the total number of cycles run by the core in CORE_DATA_COLLECTION_US + // NOTE: run_delta is the total number of cycles run by a specific thread in CORE_DATA_COLLECTION_US // </amec_formula> // Get RAW CYCLES for Thread @@ -551,7 +551,7 @@ void amec_calc_freq_and_util_sensors(CoreData * i_core_data_ptr, uint8_t i_core) // <amec_formula> // Result: Calculated Normalized Average Core Utilization // Sensor: NUTILC0 - // Timescale: 4ms (3s rolling average) + // Timescale: CORE_DATA_COLLECTION_US (3s rolling average) // Units: 0.01 % // Min/Max: 0/10000 (0/100%) // </amec_formula> @@ -680,11 +680,11 @@ void amec_calc_ips_sensors(CoreData * i_core_data_ptr, uint8_t i_core) // <amec_formula> // Result: Calculated Instructions per Cycle // Sensor: None - // Timescale: 4ms + // Timescale: CORE_DATA_COLLECTION_US // Units: 0.01 IPC // Min/Max: ? - // Formula: ipc_delta = (INST_COMPLETE[t=now] - INST_COMPLETE[t=-4ms]) - // run_cycles = (RUN_CYCLES[t=now] - RUN_CYCLES[t=-4ms]) + // Formula: ipc_delta = (INST_COMPLETE[t=now] - INST_COMPLETE[t=-CORE_DATA_COLLECTION_US]) + // run_cycles = (RUN_CYCLES[t=now] - RUN_CYCLES[t=-CORE_DATA_COLLECTION_US]) // 100 = Convert 0.01 IPC // // IPC(in 0.01 IPC) = (ipc_delta * 100) / run_cycles @@ -701,11 +701,11 @@ void amec_calc_ips_sensors(CoreData * i_core_data_ptr, uint8_t i_core) // <amec_formula> // Result: Calculated dispatched Instructions per Cycle // Sensor: None - // Timescale: 4ms + // Timescale: CORE_DATA_COLLECTION_US // Units: 0.01 DPC // Min/Max: ? - // Formula: dpc_delta = (INST_DISPATCH[t=now] - INST_DISPATCH[t=-4ms]) - // run_cycles = (RUN_CYCLES[t=now] - RUN_CYCLES[t=-4ms]) + // Formula: dpc_delta = (INST_DISPATCH[t=now] - INST_DISPATCH[t=-CORE_DATA_COLLECTION_US]) + // run_cycles = (RUN_CYCLES[t=now] - RUN_CYCLES[t=-CORE_DATA_COLLECTION_US]) // 100 = Convert 0.01 DPC // // DPC(in 0.01DPC) = (dpc_delta * 100) / run_cycles @@ -721,11 +721,11 @@ void amec_calc_ips_sensors(CoreData * i_core_data_ptr, uint8_t i_core) // <amec_formula> // Result: Calculated dispatched Instructions per Second // Sensor: None - // Timescale: 4ms + // Timescale: CORE_DATA_COLLECTION_US // Units: 0.2Mips // Min/Max: ? - // Formula: dps_delta = (INST_DISPATCH[t=now] - INST_DISPATCH[t=-4ms]) - // 250 = # of 4ms periods in 1 second + // Formula: dps_delta = (INST_DISPATCH[t=now] - INST_DISPATCH[t=-CORE_DATA_COLLECTION_US]) + // 250 = # of CORE_DATA_COLLECTION_US periods in 1 second // 50,000 = Convert IPS to 0.2MIPS // // DPS(in 0.2Mips) = (dps_delta * 250) / 50,000 @@ -741,12 +741,12 @@ void amec_calc_ips_sensors(CoreData * i_core_data_ptr, uint8_t i_core) // <amec_formula> // Result: Calculated Instructions per Second // Sensor: IPSC0 - // Timescale: 4ms + // Timescale: CORE_DATA_COLLECTION_US // Units: 0.2Mips // Min/Max: ? // Formula: - // comp_delta = (INST_COMPLETE[t=now] - INST_COMPLETE[t=-4ms]) - // ticks_delta = (TOD[t=now] - TOD[t=-4ms]) + // comp_delta = (INST_COMPLETE[t=now] - INST_COMPLETE[t=-CORE_DATA_COLLECTION_US]) + // ticks_delta = (TOD[t=now] - TOD[t=-CORE_DATA_COLLECTION_US]) // MIPS = comp_delta (insns/interval) * (1 interval per ticks_delta 2mhz ticks) * (2M 2mhz ticks / s) / 1M // = (2* fin2) / ticks_2mhz // diff --git a/src/occ_405/amec/amec_sensors_fw.c b/src/occ_405/amec/amec_sensors_fw.c index 426df3d..525890a 100644 --- a/src/occ_405/amec/amec_sensors_fw.c +++ b/src/occ_405/amec/amec_sensors_fw.c @@ -100,7 +100,7 @@ void amec_update_fw_sensors(void) int rc2 = 0; static bool l_first_call = TRUE; bool l_gpe0_idle, l_gpe1_idle; - static int L_consec_trace_count = 0; + static uint8_t L_consec_trace_count[2] = {0}; // ------------------------------------------------------ // Update OCC Firmware Sensors from last tick @@ -136,8 +136,9 @@ void amec_update_fw_sensors(void) if(l_gpe0_idle && l_gpe1_idle) { - //reset the consecutive trace count - L_consec_trace_count = 0; + //reset the consecutive trace counts + L_consec_trace_count[0] = 0; + L_consec_trace_count[1] = 0; //Both GPE engines finished on time. Now check if they were //successful too. @@ -198,7 +199,7 @@ void amec_update_fw_sensors(void) commitErrl( &l_err ); } } - else if(L_consec_trace_count < MAX_CONSEC_TRACE) + else { gpe_gpenxiramdbg_t xsr_sprg0 = {0}; gpe_gpenxiramedr_t ir_edr = {0}; @@ -209,29 +210,49 @@ void amec_update_fw_sensors(void) // will tell us what GPE job is currently executing. if(!l_gpe0_idle) { - xsr_sprg0.fields.xsr = in32(GPE_GPE0XIXSR); - xsr_sprg0.fields.sprg0 = in32(GPE_GPE0XISPRG0); - ir_edr.fields.edr = in32(GPE_GPE0XIEDR); - ir_edr.fields.ir = in32(GPE_GPE0XIIR); - iar_xsr.fields.iar = in32(GPE_GPE0XIIAR); - TRAC_ERR("GPE0 programs did not complete within one tick. " - "XSR[0x%08x] IAR[0x%08x] IR[0x%08x] EDR[0x%08x] SPRG0[0x%08X]", - xsr_sprg0.fields.xsr, iar_xsr.fields.iar, - ir_edr.fields.ir, ir_edr.fields.edr, xsr_sprg0.fields.sprg0); + INCREMENT_ERR_HISTORY(ERRH_GPE0_NOT_IDLE); + + if(L_consec_trace_count[0] < MAX_CONSEC_TRACE) + { + xsr_sprg0.fields.xsr = in32(GPE_GPE0XIXSR); + xsr_sprg0.fields.sprg0 = in32(GPE_GPE0XISPRG0); + ir_edr.fields.edr = in32(GPE_GPE0XIEDR); + ir_edr.fields.ir = in32(GPE_GPE0XIIR); + iar_xsr.fields.iar = in32(GPE_GPE0XIIAR); + TRAC_ERR("GPE0 programs did not complete within one tick. " + "XSR[0x%08x] IAR[0x%08x] IR[0x%08x] EDR[0x%08x] SPRG0[0x%08X]", + xsr_sprg0.fields.xsr, iar_xsr.fields.iar, + ir_edr.fields.ir, ir_edr.fields.edr, xsr_sprg0.fields.sprg0); + L_consec_trace_count[0]++; + } } + else + { + L_consec_trace_count[0] = 0; + } + if(!l_gpe1_idle) { - xsr_sprg0.fields.xsr = in32(GPE_GPE1XIXSR); - xsr_sprg0.fields.sprg0 = in32(GPE_GPE1XISPRG0); - ir_edr.fields.edr = in32(GPE_GPE1XIEDR); - ir_edr.fields.ir = in32(GPE_GPE1XIIR); - iar_xsr.fields.iar = in32(GPE_GPE1XIIAR); - TRAC_ERR("GPE1 programs did not complete within one tick. " - "XSR[0x%08x] IAR[0x%08x] IR[0x%08x] EDR[0x%08x] SPRG0[0x%08X]", - xsr_sprg0.fields.xsr, iar_xsr.fields.iar, - ir_edr.fields.ir, ir_edr.fields.edr, xsr_sprg0.fields.sprg0); + INCREMENT_ERR_HISTORY(ERRH_GPE1_NOT_IDLE); + + if(L_consec_trace_count[1] < MAX_CONSEC_TRACE) + { + xsr_sprg0.fields.xsr = in32(GPE_GPE1XIXSR); + xsr_sprg0.fields.sprg0 = in32(GPE_GPE1XISPRG0); + ir_edr.fields.edr = in32(GPE_GPE1XIEDR); + ir_edr.fields.ir = in32(GPE_GPE1XIIR); + iar_xsr.fields.iar = in32(GPE_GPE1XIIAR); + TRAC_ERR("GPE1 programs did not complete within one tick. " + "XSR[0x%08x] IAR[0x%08x] IR[0x%08x] EDR[0x%08x] SPRG0[0x%08X]", + xsr_sprg0.fields.xsr, iar_xsr.fields.iar, + ir_edr.fields.ir, ir_edr.fields.edr, xsr_sprg0.fields.sprg0); + L_consec_trace_count[1]++; + } + } + else + { + L_consec_trace_count[1] = 0; } - L_consec_trace_count++; } } } diff --git a/src/occ_405/amec/amec_slave_smh.c b/src/occ_405/amec/amec_slave_smh.c index cb349f8..9142caa 100755 --- a/src/occ_405/amec/amec_slave_smh.c +++ b/src/occ_405/amec/amec_slave_smh.c @@ -83,9 +83,6 @@ smh_state_t G_amec_slv_state = {AMEC_INITIAL_STATE, AMEC_INITIAL_STATE, AMEC_INITIAL_STATE}; -// Number of ticks for periodically updating VRM-related data -#define AMEC_UPDATE_VRM_TICKS 4000 - // This table presents the core data sensors collection pattern. // This pattern is not completely rbitrary, and it must always // follow track the GPE request pattern for the data collection. @@ -108,7 +105,7 @@ const uint8_t G_sensor_update_pattern[AMEC_SMH_STATES_PER_LVL][CORES_PER_STATE] // -------------------------------------------------------- // AMEC Slave State 1 Substate Table // -------------------------------------------------------- -// Each function inside this state table runs once every 16ms. +// Each substate runs every 64th tick time = 64 * MICS_PER_TICK // // No Substates // @@ -127,26 +124,26 @@ const smh_tbl_t amec_slv_state_1_substate_table[AMEC_SMH_STATES_PER_LVL] = // -------------------------------------------------------- // AMEC Slave State 2 Substate Table // -------------------------------------------------------- -// Each function inside this state table runs once every 16ms. +// Each substate runs every 64th tick time = 64 * MICS_PER_TICK // // No Substates // const smh_tbl_t amec_slv_state_2_substate_table[AMEC_SMH_STATES_PER_LVL] = { - {amec_slv_substate_2_0, NULL}, // Substate 2.0 - {NULL, NULL}, // Substate 2.1 (not used) - {NULL, NULL}, // Substate 2.2 (not used) - {NULL, NULL}, // Substate 2.3 (not used) - {amec_slv_substate_2_4, NULL}, // Substate 2.4 - {NULL, NULL}, // Substate 2.5 (not used) - {NULL, NULL}, // Substate 2.6 (not used) - {NULL, NULL}, // Substate 2.7 (not used) + {amec_slv_substate_2_even, NULL}, // Substate 2.0 + {NULL, NULL}, // Substate 2.1 (not used) + {amec_slv_substate_2_even, NULL}, // Substate 2.2 + {NULL, NULL}, // Substate 2.3 (not used) + {amec_slv_substate_2_even, NULL}, // Substate 2.4 + {NULL, NULL}, // Substate 2.5 (not used) + {amec_slv_substate_2_even, NULL}, // Substate 2.6 + {NULL, NULL}, // Substate 2.7 (not used) }; // -------------------------------------------------------- // AMEC Slave State 3 Substate Table // -------------------------------------------------------- -// Each function inside this state table runs once every 16ms. +// Each substate runs every 64th tick time = 64 * MICS_PER_TICK // // No Substates // @@ -165,7 +162,7 @@ const smh_tbl_t amec_slv_state_3_substate_table[AMEC_SMH_STATES_PER_LVL] = // -------------------------------------------------------- // AMEC Slave State 5 Substate Table // -------------------------------------------------------- -// Each function inside this state table runs once every 16ms. +// Each substate runs every 64th tick time = 64 * MICS_PER_TICK // // No Substates // @@ -184,26 +181,26 @@ const smh_tbl_t amec_slv_state_5_substate_table[AMEC_SMH_STATES_PER_LVL] = // -------------------------------------------------------- // AMEC Slave State 6 Substate Table // -------------------------------------------------------- -// Each function inside this state table runs once every 16ms. +// Each substate runs every 64th tick time = 64 * MICS_PER_TICK // // No Substates // const smh_tbl_t amec_slv_state_6_substate_table[AMEC_SMH_STATES_PER_LVL] = { - {NULL, NULL}, // Substate 6.0 (not used) - {amec_slv_substate_6_1, NULL}, // Substate 6.1 - {NULL, NULL}, // Substate 6.2 (not used) - {amec_slv_substate_6_3, NULL}, // Substate 6.3 - {NULL, NULL}, // Substate 6.4 (not used) - {amec_slv_substate_6_5, NULL}, // Substate 6.5 - {NULL, NULL}, // Substate 6.6 (not used) - {amec_slv_substate_6_7, NULL}, // Substate 6.7 + {amec_slv_substate_6_all, NULL}, // Substate 6.0 + {amec_slv_substate_6_all, NULL}, // Substate 6.1 + {amec_slv_substate_6_all, NULL}, // Substate 6.2 + {amec_slv_substate_6_all, NULL}, // Substate 6.3 + {amec_slv_substate_6_all, NULL}, // Substate 6.4 + {amec_slv_substate_6_all, NULL}, // Substate 6.5 + {amec_slv_substate_6_all, NULL}, // Substate 6.6 + {amec_slv_substate_6_all, NULL}, // Substate 6.7 }; // -------------------------------------------------------- // AMEC Slave State 7 Substate Table // -------------------------------------------------------- -// Each function inside this state table runs once every 16ms. +// Each substate runs every 64th tick time = 64 * MICS_PER_TICK // // No Substates // @@ -223,7 +220,7 @@ const smh_tbl_t amec_slv_state_7_substate_table[AMEC_SMH_STATES_PER_LVL] = // -------------------------------------------------------- // Main AMEC Slave State Table // -------------------------------------------------------- -// Each function inside this state table runs once every 2ms. +// Each function inside this state table runs once every 8th tick // const smh_tbl_t amec_slv_state_table[AMEC_SMH_STATES_PER_LVL] = { @@ -447,10 +444,9 @@ void amec_slv_common_tasks_post(void) // Call the OCC slave's performance check amec_slv_check_perf(); - // Call the 250us trace recording if it has been configured via Amester. + // Call the every tick trace recording if it has been configured via Amester. // If not configured, this call will return immediately. - amec_tb_record(AMEC_TB_250US); - + amec_tb_record(AMEC_TB_EVERY_TICK); } else L_active_1tick = TRUE; @@ -467,8 +463,8 @@ void amec_slv_common_tasks_post(void) if(G_inband_occ_cmd_state != INBAND_OCC_CMD_NONE) { // call inband command handler if in active, char or obs state - if ( (IS_OCC_STATE_ACTIVE() && L_active_1tick) || IS_OCC_STATE_OBSERVATION() || - IS_OCC_STATE_CHARACTERIZATION() ) + if ( IS_OCC_STATE_ACTIVE() || IS_OCC_STATE_OBSERVATION() || + IS_OCC_STATE_CHARACTERIZATION() ) { inband_command_handler(); } @@ -501,9 +497,9 @@ void amec_slv_state_0(void) sensor_vector_update(AMECSENSOR_PTR(IPS), 1); sensor_vector_update(AMECSENSOR_PTR(UTIL), 1); - // Call the trace function for 2ms tracing if it has been configured via + // Call the trace function for every 8th tick tracing if it has been configured via // Amester. If not configured, this call will return immediately. - amec_tb_record(AMEC_TB_2MS); + amec_tb_record(AMEC_TB_EVERY_8TH_TICK); } @@ -631,7 +627,7 @@ void amec_slv_state_5(void) //------------------------------------------------------- // Update partition sensors for DPS algorithms (for this tick) //------------------------------------------------------- -// amec_dps_main(); + amec_dps_main(); } @@ -865,27 +861,20 @@ void amec_slv_substate_1_7(void) // Function Specification // -// Name: amec_slv_substate_2_0 -// amec_slv_substate_2_4 +// Name: amec_slv_substate_2_even // -// Description: slave substate amec_slv_substate_2_0 -// slave substate amec_slv_substate_2_4 -// other substates of state 2 are not currently used +// Description: even numbered slave substates +// gives state 2 substate function to be called every 16th tick +// Time = 16 * MICS_PER_TICK +// odd substates of state 2 are not currently used // // End Function Specification -void amec_slv_substate_2_0(void) -{ - AMEC_DBG("\tAMEC Slave State 2.0\n"); - amec_slv_update_main_mem_sensors(); -} - -void amec_slv_substate_2_4(void) +void amec_slv_substate_2_even(void) { - AMEC_DBG("\tAMEC Slave State 2.4\n"); + AMEC_DBG("\tAMEC Slave State 2 even substate\n"); amec_slv_update_main_mem_sensors(); } - // Function Specification // // Name: amec_slv_substate_3_0 @@ -1259,39 +1248,16 @@ void amec_slv_substate_5_7(void) // Function Specification // -// Name: amec_slv_substate_6_1 -// amec_slv_substate_6_3 -// amec_slv_substate_6_5 -// amec_slv_substate_6_7 +// Name: amec_slv_substate_6_all // -// Description: slave substate amec_slv_substate_6_1 -// slave substate amec_slv_substate_6_3 -// slave substate amec_slv_substate_6_5 -// slave substate amec_slv_substate_6_7 -// other substates of state 6 are not currently used +// Description: Called for every substate of state 6 +// gives state 6 substate function to be called every 8th tick +// Time = 8 * MICS_PER_TICK // // End Function Specification -void amec_slv_substate_6_1(void) -{ - AMEC_DBG("\tAMEC Slave State 6.1\n"); - inband_command_check(); -} - -void amec_slv_substate_6_3(void) -{ - AMEC_DBG("\tAMEC Slave State 6.3\n"); - inband_command_check(); -} - -void amec_slv_substate_6_5(void) -{ - AMEC_DBG("\tAMEC Slave State 6.5\n"); - inband_command_check(); -} - -void amec_slv_substate_6_7(void) +void amec_slv_substate_6_all(void) { - AMEC_DBG("\tAMEC Slave State 6.7\n"); + AMEC_DBG("\tAMEC Slave State 6 substate\n"); inband_command_check(); } diff --git a/src/occ_405/amec/amec_slave_smh.h b/src/occ_405/amec/amec_slave_smh.h index 6cca955..f761c72 100755 --- a/src/occ_405/amec/amec_slave_smh.h +++ b/src/occ_405/amec/amec_slave_smh.h @@ -100,9 +100,8 @@ void amec_slv_substate_1_5(void); void amec_slv_substate_1_6(void); void amec_slv_substate_1_7(void); -// Slave SubState 2 (6 SubStates unused) -void amec_slv_substate_2_0(void); -void amec_slv_substate_2_4(void); +// Slave SubState 2 (odd SubStates currently unused) +void amec_slv_substate_2_even(void); // Slave SubState 3 void amec_slv_substate_3_0(void); @@ -124,11 +123,8 @@ void amec_slv_substate_5_5(void); void amec_slv_substate_5_6(void); void amec_slv_substate_5_7(void); -// Slave SubState 6 (4 SubStates unused) check for inband cmd every 4ms -void amec_slv_substate_6_1(void); -void amec_slv_substate_6_3(void); -void amec_slv_substate_6_5(void); -void amec_slv_substate_6_7(void); +// Slave SubState 6 called every SubState - check for inband cmd every 4ms +void amec_slv_substate_6_all(void); // Slave SubState 7 void amec_slv_substate_7_0(void); diff --git a/src/occ_405/amec/amec_tasks.c b/src/occ_405/amec/amec_tasks.c index 0fe6041..452532e 100755 --- a/src/occ_405/amec/amec_tasks.c +++ b/src/occ_405/amec/amec_tasks.c @@ -76,10 +76,10 @@ uint8_t _rotl8(uint8_t val, uint8_t shift) // // Description: Generic State Machine that allows for 8 states per level, // with 3 levels. -// If State Machine gets called/incremented every 250us, -// - Each function entry in Level 0 table runs every 2ms, -// - Each function entry in Level 1 table will run every 16ms, -// - Each function entry in Level 2 table will run every 128ms. +// If State Machine gets called/incremented every 500us, +// - Each function entry in Level 0 table runs every 4ms, +// - Each function entry in Level 1 table will run every 32ms, +// - Each function entry in Level 2 table will run every 256ms. // // Anything longer than that will need to be taken care of // inside of the states themselves. diff --git a/src/occ_405/dcom/dcomMasterRx.c b/src/occ_405/dcom/dcomMasterRx.c index 2e26986..faa4dca 100644 --- a/src/occ_405/dcom/dcomMasterRx.c +++ b/src/occ_405/dcom/dcomMasterRx.c @@ -298,7 +298,7 @@ void task_dcom_rx_slv_outboxes( task_t *i_self) else { L_bce_not_ready_count++; - INCREMENT_ERR_HISTORY(ERR_DCOM_RX_SLV_OUTBOX); + INCREMENT_ERR_HISTORY(ERRH_DCOM_RX_SLV_OUTBOX); } } else @@ -383,7 +383,7 @@ uint32_t dcom_rx_slv_outbox_doorbell( void ) if (l_pbarc != 0) { - INCREMENT_ERR_HISTORY(ERR_DCOM_MASTER_PBAX_READ_FAIL); + INCREMENT_ERR_HISTORY(ERRH_DCOM_MASTER_PBAX_READ_FAIL); TRAC_ERR("Master PBAX Read Failure in receiving unicast slave doorbells - RC[%08X]", l_pbarc); diff --git a/src/occ_405/dcom/dcomMasterTx.c b/src/occ_405/dcom/dcomMasterTx.c index e1a46bc..a65dc31 100644 --- a/src/occ_405/dcom/dcomMasterTx.c +++ b/src/occ_405/dcom/dcomMasterTx.c @@ -89,7 +89,7 @@ uint32_t dcom_build_slv_inbox(void) // interrupt context. if(G_pbax_rc) { - INCREMENT_ERR_HISTORY(ERR_DCOM_MASTER_PBAX_SEND_FAIL); + INCREMENT_ERR_HISTORY(ERRH_DCOM_MASTER_PBAX_SEND_FAIL); if (!L_traced) { @@ -232,6 +232,7 @@ void task_dcom_tx_slv_inbox( task_t *i_self) uint32_t l_orc_ext = OCC_NO_EXTENDED_RC; uint64_t l_start = ssx_timebase_get(); bool l_pwr_meas = FALSE; + bool l_pwr_meas_complete_invalid = FALSE; bool l_request_reset = FALSE; bool l_ssx_failure = FALSE; // Use a static local bool to track whether the BCE request used @@ -250,8 +251,9 @@ void task_dcom_tx_slv_inbox( task_t *i_self) } l_pwr_meas = G_ApssPwrMeasCompleted; + l_pwr_meas_complete_invalid = G_ApssPwrMeasDoneInvalid; - // Did APSS power complete? + // Did APSS power complete AND valid? if( l_pwr_meas == TRUE ) { #if !defined(DEBUG_APSS_SEQ) && defined(DCOM_DEBUG) @@ -405,13 +407,42 @@ void task_dcom_tx_slv_inbox( task_t *i_self) else { L_bce_not_ready_count++; - INCREMENT_ERR_HISTORY(ERR_DCOM_TX_SLV_INBOX); + INCREMENT_ERR_HISTORY(ERRH_DCOM_TX_SLV_INBOX); } // Moved the break statement here in case we decide not to // schedule the BCE request. break; } + // Is APSS power collection done but failed? Stop waiting since no valid data will be coming + else if(l_pwr_meas_complete_invalid == TRUE) + { + //Failure occurred, step up the FAIL_COUNT + APSS_FAIL(); + + if (G_apss_fail_updown_count >= APSS_DATA_FAIL_MAX) + { + if (FALSE == isSafeStateRequested()) + { + /* @ + * @errortype + * @moduleid DCOM_MID_TASK_TX_SLV_INBOX + * @reasoncode APSS_HARD_FAILURE + * @userdata1 N/A + * @userdata4 ERC_APSS_NO_VALID_DATA + * @devdesc No valid APSS data (hard time-out) + */ + TRAC_ERR("No valid apss data: #complete errors = %i #invalid = %i", + G_error_history[ERRH_APSS_COMPLETE_ERROR], + G_error_history[ERRH_INVALID_APSS_DATA]); + l_orc = APSS_HARD_FAILURE; + l_orc_ext = ERC_APSS_NO_VALID_DATA; + l_request_reset = TRUE; + } + } + + break; + } else { // check time and break out if we reached limit @@ -421,7 +452,7 @@ void task_dcom_tx_slv_inbox( task_t *i_self) } else { - INCREMENT_ERR_HISTORY(ERR_DCOM_APSS_COMPLETE_TIMEOUT); + INCREMENT_ERR_HISTORY(ERRH_APSS_COMPLETE_TIMEOUT); //Failure occurred, step up the FAIL_COUNT APSS_FAIL(); @@ -430,9 +461,6 @@ void task_dcom_tx_slv_inbox( task_t *i_self) { if (FALSE == isSafeStateRequested()) { - TRAC_ERR("task_dcom_tx_slv_inbox: APSS data collection failure exceeded threshold. fail_count=%i, threshold:%i", - G_apss_fail_updown_count, APSS_DATA_FAIL_MAX); - /* @ * @errortype * @moduleid DCOM_MID_TASK_TX_SLV_INBOX @@ -450,6 +478,7 @@ void task_dcom_tx_slv_inbox( task_t *i_self) l_request_reset = TRUE; } } + break; } } diff --git a/src/occ_405/dcom/dcomSlaveRx.c b/src/occ_405/dcom/dcomSlaveRx.c index a4b6e2d..7b103ab 100644 --- a/src/occ_405/dcom/dcomSlaveRx.c +++ b/src/occ_405/dcom/dcomSlaveRx.c @@ -278,7 +278,7 @@ void task_dcom_rx_slv_inbox( task_t *i_self) else { L_bce_not_ready_count++; - INCREMENT_ERR_HISTORY(ERR_DCOM_RX_SLV_INBOX); + INCREMENT_ERR_HISTORY(ERRH_DCOM_RX_SLV_INBOX); } } else @@ -372,7 +372,7 @@ uint32_t dcom_rx_slv_inbox_doorbell( void ) // We got an error reading from the PBAX, return to caller if ( l_pbarc != 0 ) { - INCREMENT_ERR_HISTORY(ERR_DCOM_SLAVE_PBAX_READ_FAIL); + INCREMENT_ERR_HISTORY(ERRH_DCOM_SLAVE_PBAX_READ_FAIL); G_dcomTime.slave.doorbellErrorFlags |= DCOM_DOORBELL_HW_ERR; // Failure occurred TRAC_ERR("Slave PBAX Read Failure in receiving multicast doorbell from master - RC[%08X]", l_pbarc); @@ -515,8 +515,8 @@ void task_dcom_wait_for_master( task_t *i_self) if (L_no_master_doorbell_cnt == APSS_DATA_FAIL_PMAX_RAIL) { - // Now only trace every 50th occurrence - L_trace_every_count = 50; + // Now only trace every 1000th occurrence + L_trace_every_count = 1000; // Inform AMEC that Pmax_rail needs to change G_apss_lower_pmax_rail = TRUE; diff --git a/src/occ_405/dcom/dcomSlaveTx.c b/src/occ_405/dcom/dcomSlaveTx.c index 33ef166..837608d 100755 --- a/src/occ_405/dcom/dcomSlaveTx.c +++ b/src/occ_405/dcom/dcomSlaveTx.c @@ -163,7 +163,7 @@ void task_dcom_tx_slv_outbox( task_t *i_self) if(G_slave_pbax_rc) { TRAC_ERR("task_dcom_tx_slv_outbox: PBAX Send Failure in transimitting doorbell - RC[%08X]", G_slave_pbax_rc); - INCREMENT_ERR_HISTORY(ERR_DCOM_SLAVE_PBAX_SEND_FAIL); + INCREMENT_ERR_HISTORY(ERRH_DCOM_SLAVE_PBAX_SEND_FAIL); } // Build/setup outbox @@ -304,7 +304,7 @@ void task_dcom_tx_slv_outbox( task_t *i_self) else { L_bce_not_ready_count++; - INCREMENT_ERR_HISTORY(ERR_DCOM_TX_SLV_OUTBOX); + INCREMENT_ERR_HISTORY(ERRH_DCOM_TX_SLV_OUTBOX); } } while (0); diff --git a/src/occ_405/errl/errl.h b/src/occ_405/errl/errl.h index 5518369..cd3c0ad 100755 --- a/src/occ_405/errl/errl.h +++ b/src/occ_405/errl/errl.h @@ -270,26 +270,29 @@ extern errlHndl_t G_occErrSlots[ERRL_MAX_SLOTS]; #define ERR_HISTORY_SIZE 32 extern uint8_t G_error_history[ERR_HISTORY_SIZE]; typedef enum { - ERR_AVSBUS_VDD_CURRENT = 1, - ERR_AVSBUS_VDD_VOLTAGE = 2, - ERR_AVSBUS_VDN_CURRENT = 3, - ERR_AVSBUS_VDN_VOLTAGE = 4, - ERR_DIMM_I2C_PORT0 = 5, - ERR_DIMM_I2C_PORT1 = 6, - ERR_AVSBUS_VDD_OVER_TEMPERATURE = 7, - ERR_AVSBUS_VDN_OVER_TEMPERATURE = 8, - ERR_AVSBUS_VDD_OVER_CURRENT = 9, - ERR_AVSBUS_VDN_OVER_CURRENT = 10, - ERR_INVALID_APSS_DATA = 11, - ERR_DCOM_APSS_COMPLETE_TIMEOUT = 12, - ERR_DCOM_TX_SLV_INBOX = 13, - ERR_DCOM_RX_SLV_INBOX = 14, - ERR_DCOM_TX_SLV_OUTBOX = 15, - ERR_DCOM_RX_SLV_OUTBOX = 16, - ERR_DCOM_MASTER_PBAX_SEND_FAIL = 17, - ERR_DCOM_SLAVE_PBAX_SEND_FAIL = 18, - ERR_DCOM_MASTER_PBAX_READ_FAIL = 19, - ERR_DCOM_SLAVE_PBAX_READ_FAIL = 20, + ERR_AVSBUS_VDD_CURRENT = 0x01, + ERR_AVSBUS_VDD_VOLTAGE = 0x02, + ERR_AVSBUS_VDN_CURRENT = 0x03, + ERR_AVSBUS_VDN_VOLTAGE = 0x04, + ERR_DIMM_I2C_PORT0 = 0x05, + ERR_DIMM_I2C_PORT1 = 0x06, + ERR_AVSBUS_VDD_OVER_TEMPERATURE = 0x07, + ERR_AVSBUS_VDN_OVER_TEMPERATURE = 0x08, + ERR_AVSBUS_VDD_OVER_CURRENT = 0x09, + ERR_AVSBUS_VDN_OVER_CURRENT = 0x0A, + ERRH_INVALID_APSS_DATA = 0x0B, + ERRH_APSS_COMPLETE_ERROR = 0x0C, + ERRH_APSS_COMPLETE_TIMEOUT = 0x0D, + ERRH_DCOM_TX_SLV_INBOX = 0x0E, + ERRH_DCOM_RX_SLV_INBOX = 0x0F, + ERRH_DCOM_TX_SLV_OUTBOX = 0x10, + ERRH_DCOM_RX_SLV_OUTBOX = 0x11, + ERRH_DCOM_MASTER_PBAX_SEND_FAIL = 0x12, + ERRH_DCOM_SLAVE_PBAX_SEND_FAIL = 0x13, + ERRH_DCOM_MASTER_PBAX_READ_FAIL = 0x14, + ERRH_DCOM_SLAVE_PBAX_READ_FAIL = 0x15, + ERRH_GPE0_NOT_IDLE = 0x16, + ERRH_GPE1_NOT_IDLE = 0x17, } ERR_HISTORY_INDEX; #define INCREMENT_ERR_HISTORY(errorIndex) { \ if ((errorIndex < ERR_HISTORY_SIZE) && (G_error_history[errorIndex] < 255)) { \ diff --git a/src/occ_405/main.c b/src/occ_405/main.c index da0819d..307db17 100755 --- a/src/occ_405/main.c +++ b/src/occ_405/main.c @@ -178,7 +178,7 @@ void check_runtime_environment(void) { // slow down RTL for Simics G_mics_per_tick = SIMICS_MICS_PER_TICK; - G_dcom_tx_apss_wait_time = SIMICS_MICS_PER_TICK * 6 / 10; + G_dcom_tx_apss_wait_time = SIMICS_MICS_PER_TICK * 4 / 10; // Same comment as above about lower 32-bits. Bit 62 can be toggled // on or off (in Simics) to indicate for which APSS specification the diff --git a/src/occ_405/occLinkInputFile b/src/occ_405/occLinkInputFile index 52f176e..9f3725d 100644 --- a/src/occ_405/occLinkInputFile +++ b/src/occ_405/occLinkInputFile @@ -1,6 +1,7 @@ INPUT ( amec_amester.o amec_controller.o amec_data.o + amec_dps.o amec_freq.o amec_health.o amec_init.o diff --git a/src/occ_405/occ_service_codes.h b/src/occ_405/occ_service_codes.h index efdb838..6fb0178 100644 --- a/src/occ_405/occ_service_codes.h +++ b/src/occ_405/occ_service_codes.h @@ -139,9 +139,7 @@ enum occReasonCode // OCC errors. (H)TMGT will be looking for 0xEy ERRL_RC in cmd response RC // and create an OCC error log with OCC component ID and 0xEy RC if found - /// Error copying sensors to main memory - SENSOR_MAIN_MEM_ERROR = 0xF0, - + SENSOR_MAIN_MEM_ERROR = 0xF0, // Error copying sensors to main memory INBAND_CMD_ERROR = 0xF1, OPAL_TABLE_UPDATE_ERROR = 0xF2, @@ -192,6 +190,7 @@ enum occExtReasonCode ERC_APSS_GPIO_DUPLICATED_FAILURE = 0x0025, ERC_APSS_ADC_OUT_OF_RANGE_FAILURE = 0x0026, ERC_APSS_ADC_DUPLICATED_FAILURE = 0x0027, + ERC_APSS_NO_VALID_DATA = 0x0028, ERC_AMEC_PCAPS_MISMATCH_FAILURE = 0x002A, ERC_AMEC_UNDER_PCAP_FAILURE = 0x002B, @@ -283,6 +282,7 @@ enum occExtReasonCode ERC_STATE_FROM_STB_TO_OBS_FAILURE = 0x0129, ERC_STATE_HEARTBEAT_CFG_FAILURE = 0x0180, + ERC_RTL_TIME_EXCEEDED = 0x0190, }; // Error log Module Ids diff --git a/src/occ_405/occbuildname.c b/src/occ_405/occbuildname.c index 2681683..752d939 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_170721a\0" /*</BuildName>*/ ; +volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) = /*<BuildName>*/ "op_occ_170724a\0" /*</BuildName>*/ ; #endif diff --git a/src/occ_405/pgpe/pgpe_interface.c b/src/occ_405/pgpe/pgpe_interface.c index 26abab1..a276ccc 100644 --- a/src/occ_405/pgpe/pgpe_interface.c +++ b/src/occ_405/pgpe/pgpe_interface.c @@ -757,6 +757,7 @@ int pgpe_start_suspend(uint8_t action, PMCR_OWNER owner) { int rc = 0; // return code errlHndl_t err = NULL; // Error handler + pstateStatus l_current_pstate_status = G_proc_pstate_status; // set the IPC parameters G_start_suspend_parms.action = action; @@ -764,6 +765,9 @@ int pgpe_start_suspend(uint8_t action, PMCR_OWNER owner) if (!G_simics_environment) { + // set the G_proc_pstate_status to indicate transition + G_proc_pstate_status = PSTATES_IN_TRANSITION; + if (action == PGPE_ACTION_PSTATE_START) { TRAC_IMP("pgpe_start_suspend: scheduling enable of pstates (owner=0x%02X)", owner); @@ -779,6 +783,9 @@ int pgpe_start_suspend(uint8_t action, PMCR_OWNER owner) // couldn't schedule the IPC task? if(rc != 0) { + // restore pState status since it isn't going to change + G_proc_pstate_status = l_current_pstate_status; + //Error in scheduling pgpe start suspend task TRAC_ERR("pgpe_start_suspend: Failed to schedule pgpe start_suspend task rc=%x", rc); @@ -804,11 +811,6 @@ int pgpe_start_suspend(uint8_t action, PMCR_OWNER owner) rc = GPE_REQUEST_SCHEDULE_FAILURE; REQUEST_RESET(err); //This will add a firmware callout for us } - // successfully scheduled, set the G_proc_pstate_status to indicate transition - else - { - G_proc_pstate_status = PSTATES_IN_TRANSITION; - } if (G_simics_environment) { diff --git a/src/occ_405/pss/apss.c b/src/occ_405/pss/apss.c index a4c00e0..6e50313 100755 --- a/src/occ_405/pss/apss.c +++ b/src/occ_405/pss/apss.c @@ -79,9 +79,12 @@ uint32_t G_sequence_complete = 0; volatile uint32_t G_savedCompleteSeq = 0; #endif -// Used to tell slave inbox that pwr meas is complete +// Used to tell slave inbox that pwr meas is complete AND valid volatile bool G_ApssPwrMeasCompleted = FALSE; +// Used to tell slave inbox that pwr meas is complete but is invalid +volatile bool G_ApssPwrMeasDoneInvalid = FALSE; + // Function Specification // // Name: dumpHexString @@ -141,8 +144,6 @@ void dumpHexString(const void *i_data, const unsigned int len, const char *strin // End Function Specification void do_apss_recovery(void) { - INCREMENT_ERR_HISTORY(ERR_INVALID_APSS_DATA); - if (!G_apss_data_traced) { INTR_TRAC_ERR("detected invalid power data[%08x%08x]", @@ -373,6 +374,7 @@ void task_apss_start_pwr_meas(struct task *i_self) APSS_DBG("GPE_start_pwr_meas_read finished w/rc=0x%08X", G_gpe_start_pwr_meas_read_args.error.rc); APSS_DBG_HEXDUMP(&G_gpe_start_pwr_meas_read_args, sizeof(G_gpe_start_pwr_meas_read_args), "G_gpe_start_pwr_meas_read_args"); G_ApssPwrMeasCompleted = FALSE; // Will complete when 3rd task is complete. + G_ApssPwrMeasDoneInvalid = FALSE; // validity checked when 3rd task completes G_gpe_apss_time_start = ssx_timebase_get(); @@ -557,6 +559,9 @@ void reformat_meas_data() // Make sure complete was successful if (G_gpe_complete_pwr_meas_read_args.error.error) { + INCREMENT_ERR_HISTORY(ERRH_APSS_COMPLETE_ERROR); + // Indicate that collection completed but is invalid so tx_slv_inbox will stop waiting for valid data + G_ApssPwrMeasDoneInvalid = TRUE; break; } @@ -565,6 +570,9 @@ void reformat_meas_data() !(G_gpe_continue_pwr_meas_read_args.meas_data[0] & ~APSS_ADC_SEQ_MASK)) { // Recovery will begin on the next tick + INCREMENT_ERR_HISTORY(ERRH_INVALID_APSS_DATA); + // Indicate that collection completed but is invalid so tx_slv_inbox will stop waiting for valid data + G_ApssPwrMeasDoneInvalid = TRUE; G_apss_recovery_requested = TRUE; break; } diff --git a/src/occ_405/pss/apss.h b/src/occ_405/pss/apss.h index 6808f48..ba0b775 100644 --- a/src/occ_405/pss/apss.h +++ b/src/occ_405/pss/apss.h @@ -67,12 +67,15 @@ struct apssPwrMeasStruct } __attribute__ ((__packed__)); typedef struct apssPwrMeasStruct apssPwrMeasStruct_t; -// G_apss_pwr_meas: power, temp and GPIO readings that OCC gathers from APSS every tick +// G_apss_pwr_meas: power and GPIO readings that OCC gathers from APSS every tick extern apssPwrMeasStruct_t G_apss_pwr_meas; -// Used to tell slave inbox that pwr meas is complete +// Used to tell slave inbox that pwr meas is complete AND valid extern volatile bool G_ApssPwrMeasCompleted; +// Used to tell slave inbox that pwr meas is complete but NOT valid +extern volatile bool G_ApssPwrMeasDoneInvalid; + extern initGpioArgs_t G_gpe_apss_initialize_gpio_args; extern setApssModeArgs_t G_gpe_apss_set_mode_args; diff --git a/src/occ_405/rtls/rtls.c b/src/occ_405/rtls/rtls.c index 6e6c02b..c2168d3 100755 --- a/src/occ_405/rtls/rtls.c +++ b/src/occ_405/rtls/rtls.c @@ -32,6 +32,7 @@ #include <errl.h> // Error logging #include "amec_external.h" #include <trac.h> // Traces +#include <sensor.h> //Macro creates a 'bridge' handler that converts the initial fast-mode to full //mode interrupt handler @@ -54,7 +55,7 @@ uint32_t G_current_tick = 0xFFFFFFFF; uint32_t G_mics_per_tick = HW_MICS_PER_TICK; // Number of micro-seconds to wait for APSS data collection to complete -uint32_t G_dcom_tx_apss_wait_time = HW_MICS_PER_TICK * 0.6; +uint32_t G_dcom_tx_apss_wait_time = HW_MICS_PER_TICK * 5 / 10; // The durations measured within the current tick fw_timing_t G_fw_timing; @@ -288,8 +289,8 @@ void rtl_do_tick( void *private, SsxIrqId irq, int priority ) task_t *l_task_ptr = NULL; // Pointer to the currently executing task errlHndl_t l_err = NULL; // Error handler const trace_descriptor_array_t* l_trace = NULL; // Temporary trace descriptor (replace this when tracing is implemented) - bool l_bad_id_reported = FALSE; // Has an invalid task ID already been reported? - + static bool L_bad_id_reported = FALSE; // Has an invalid task ID already been reported? + static bool L_error_logged = FALSE; // has an error for exceeding time time been logged? SsxMachineContext ctx; // Enter the protected context @@ -312,7 +313,8 @@ void rtl_do_tick( void *private, SsxIrqId irq, int priority ) // Index into the tick table to get a pointer to the tick sequence for the current tick. - l_taskid_ptr = G_tick_table[ (MAX_NUM_TICKS - 1) & CURRENT_TICK ]; + uint8_t l_tick = (MAX_NUM_TICKS - 1) & CURRENT_TICK; + l_taskid_ptr = G_tick_table[l_tick]; do { @@ -325,10 +327,10 @@ void rtl_do_tick( void *private, SsxIrqId irq, int priority ) if ( *l_taskid_ptr > TASK_END ) { // Invalid task ID - if ( ! l_bad_id_reported ) + if ( ! L_bad_id_reported ) { // First bad task ID we've seen this tick. Log an unrecoverable error. - RTLS_DBG("rtl_do_tick() - Invalid task ID" + TRAC_ERR("rtl_do_tick() - Invalid task ID" "taskId = 0x%x", *l_taskid_ptr ); /* @@ -360,7 +362,7 @@ void rtl_do_tick( void *private, SsxIrqId irq, int priority ) commitErrl( &l_err ); // Set our "bad ID reported" flag - l_bad_id_reported = TRUE; + L_bad_id_reported = TRUE; } // Under all conditions, move on to the next task ID. @@ -384,6 +386,43 @@ void rtl_do_tick( void *private, SsxIrqId irq, int priority ) // Save timing of RTL tick G_fw_timing.rtl_dur = DURATION_IN_US_UNTIL_NOW_FROM(l_start); + if(G_fw_timing.rtl_dur > MICS_PER_TICK) + { + // exceeded tick time!!! + TRAC_ERR("rtl_do_tick: tick seq %d took %dus AMEC slv/mst tasks took total of %dus", + l_tick, G_fw_timing.rtl_dur, G_fw_timing.ameint_dur); + sensor_t *l_gpe0_sensor = getSensorByGsid(GPEtickdur0); + sensor_t *l_gpe1_sensor = getSensorByGsid(GPEtickdur1); + + TRAC_ERR("GPE TIMES: GPE0 = %dus, max %dus GPE1 = %dus, max %dus", + l_gpe0_sensor->sample, l_gpe0_sensor->sample_max, l_gpe1_sensor->sample, l_gpe1_sensor->sample_max); + + if(!L_error_logged) + { + /* + * @errortype + * @moduleid RTLS_DO_TICK_MOD + * @reasoncode INTERNAL_FAILURE + * @userdata1 Tick time in us + * @userdata4 ERC_RTL_TIME_EXCEEDED + * @devdesc Exceeded RTL tick time + */ + l_err = createErrl( + RTLS_DO_TICK_MOD, //ModId + INTERNAL_FAILURE, //Reasoncode + ERC_RTL_TIME_EXCEEDED, //Extended reasoncode + ERRL_SEV_PREDICTIVE, //Severity + l_trace, //Trace Buf + DEFAULT_TRACE_SIZE, //Trace Size + G_fw_timing.rtl_dur, //Userdata1 + 0 //Userdata2 + ); + + // Commit error log + commitErrl( &l_err ); + L_error_logged = TRUE; + } + } RTLS_DBG("RTL Tick Duration: %d us\n",(int)G_fw_timing.rtl_dur); diff --git a/src/occ_405/rtls/rtls.h b/src/occ_405/rtls/rtls.h index ad2b5fa..6e248ec 100755 --- a/src/occ_405/rtls/rtls.h +++ b/src/occ_405/rtls/rtls.h @@ -111,7 +111,7 @@ typedef struct #define MICS_PER_TICK G_mics_per_tick // Number of micro-seconds per tick #define MAX_NUM_TICKS 16 // Number of entries in the global tick table (power of 2) // MICS_PER_TICK must be lower than 62ms to guarantee the tick table completes in < 1s (for health monitor) -#define HW_MICS_PER_TICK 250 +#define HW_MICS_PER_TICK 500 #define SIMICS_MICS_PER_TICK 20000 // slow down RTL to 20ms for Simics #define DCOM_TX_APSS_WAIT_TIME G_dcom_tx_apss_wait_time diff --git a/src/occ_405/rtls/rtls_tables.c b/src/occ_405/rtls/rtls_tables.c index b25eea6..aca6b88 100755 --- a/src/occ_405/rtls/rtls_tables.c +++ b/src/occ_405/rtls/rtls_tables.c @@ -155,10 +155,10 @@ const uint8_t G_tick1_seq[] = { TASK_ID_MEMORY_CONTROL, TASK_ID_CORE_DATA_CONTROL, TASK_ID_24X7, + TASK_ID_POKE_WDT, TASK_ID_DCOM_WAIT_4_MSTR, TASK_ID_DCOM_RX_INBX, TASK_ID_DCOM_RX_OUTBX, - TASK_ID_POKE_WDT, TASK_ID_DCOM_TX_OUTBX, TASK_ID_DCOM_TX_INBX, TASK_ID_AMEC_SLAVE, @@ -239,6 +239,7 @@ const uint8_t G_tick5_seq[] = { TASK_ID_MEMORY_CONTROL, TASK_ID_CORE_DATA_CONTROL, TASK_ID_24X7, + TASK_ID_POKE_WDT, TASK_ID_DCOM_WAIT_4_MSTR, TASK_ID_DCOM_RX_INBX, TASK_ID_DCOM_RX_OUTBX, @@ -321,10 +322,10 @@ const uint8_t G_tick9_seq[] = { TASK_ID_MEMORY_CONTROL, TASK_ID_CORE_DATA_CONTROL, TASK_ID_24X7, + TASK_ID_POKE_WDT, TASK_ID_DCOM_WAIT_4_MSTR, TASK_ID_DCOM_RX_INBX, TASK_ID_DCOM_RX_OUTBX, - TASK_ID_POKE_WDT, TASK_ID_DCOM_TX_OUTBX, TASK_ID_DCOM_TX_INBX, TASK_ID_AMEC_SLAVE, @@ -404,6 +405,7 @@ const uint8_t G_tick13_seq[] = { TASK_ID_MEMORY_CONTROL, TASK_ID_CORE_DATA_CONTROL, TASK_ID_24X7, + TASK_ID_POKE_WDT, TASK_ID_DCOM_WAIT_4_MSTR, TASK_ID_DCOM_RX_INBX, TASK_ID_DCOM_RX_OUTBX, diff --git a/src/occ_405/sensor/sensor_info.c b/src/occ_405/sensor/sensor_info.c index 91e4557..93fab2e 100755 --- a/src/occ_405/sensor/sensor_info.c +++ b/src/occ_405/sensor/sensor_info.c @@ -26,16 +26,28 @@ #include <occ_common.h> // STATIC_ASSERT macro #include <sensor.h> // For Sensor defines -#define AMEEFP_250US_IN_HZ AMEFP(4,3) // 4000 Hz -#define AMEEFP_500US_IN_HZ AMEFP(2,3) // 2000 Hz -#define AMEEFP_1MS_IN_HZ AMEFP(1,3) // 1000 Hz -#define AMEEFP_2MS_IN_HZ AMEFP(5,2) // 500 Hz -#define AMEEFP_4MS_IN_HZ AMEFP(25,1) // 250 Hz -#define AMEEFP_16MS_IN_HZ AMEFP(625,-1) // 62.5 Hz -#define AMEEFP_32MS_IN_HZ AMEFP(3125,-2) // 31.25 Hz -#define AMEEFP_3S_IN_HZ AMEFP(333,-3) // 0.333 Hz +#define AMEEFP_250US_IN_HZ AMEFP(4,3) // 4000 Hz +#define AMEEFP_500US_IN_HZ AMEFP(2,3) // 2000 Hz +#define AMEEFP_1MS_IN_HZ AMEFP(1,3) // 1000 Hz +#define AMEEFP_2MS_IN_HZ AMEFP(5,2) // 500 Hz +#define AMEEFP_4MS_IN_HZ AMEFP(25,1) // 250 Hz +#define AMEEFP_8MS_IN_HZ AMEFP(125,0) // 125 Hz +#define AMEEFP_16MS_IN_HZ AMEFP(625,-1) // 62.5 Hz +#define AMEEFP_32MS_IN_HZ AMEFP(3125,-2) // 31.25 Hz +#define AMEEFP_64MS_IN_HZ AMEFP(15625,-3) // 15.625 Hz +#define AMEEFP_3S_IN_HZ AMEFP(333,-3) // 0.333 Hz #define AMEFP_SCALE_0_16384 AMEFP(610352,-8) // scalar so that digital 16384=100% +// 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_4TH_TICK_HZ AMEEFP_2MS_IN_HZ // 2ms +#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 +#define AMEEFP_EVERY_64TH_TICK_HZ AMEEFP_32MS_IN_HZ // 32ms +#define AMEEFP_EVERY_128TH_TICK_HZ AMEEFP_64MS_IN_HZ // 64ms + // This will get the string when given the GSID #define SENSOR_GSID_TO_STRING(gsid) G_sensor_list[gsid].name; @@ -246,142 +258,142 @@ // const sensor_info_t G_sensor_info[] = { - /* ==FirmwareSensors== NameString Units Type Location Number Freq ScaleFactor */ - SENSOR_INFO_T_ENTRY( AMEintdur, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( AMESSdur0, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( AMESSdur1, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( AMESSdur2, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( AMESSdur3, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( AMESSdur4, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( AMESSdur5, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( AMESSdur6, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( AMESSdur7, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PROBE250US0, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PROBE250US1, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PROBE250US2, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PROBE250US3, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PROBE250US4, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PROBE250US5, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PROBE250US6, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PROBE250US7, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( GPEtickdur0, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( GPEtickdur1, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( RTLtickdur, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - - /* ==SystemSensors== NameString Units Type Location Number Freq ScaleFactor */ - SENSOR_INFO_T_ENTRY( PWRSYS, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRFAN, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRIO, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRSTORE, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRGPU, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH0, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH1, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH2, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH3, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH4, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH5, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH6, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH7, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH8, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH9, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH10, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH11, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH12, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH13, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH14, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRAPSSCH15, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( CUR12VSTBY, "A\0", AMEC_SENSOR_TYPE_CURRENT, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1,-2) ), - SENSOR_INFO_T_ENTRY( VRHOTMEMPRCCNT, "#\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - - /* ==ChipSensors== NameString Units Type Location Number Freq ScaleFactor */ - SENSOR_INFO_T_ENTRY( TODclock0, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_ALL, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 16, 0) ), - SENSOR_INFO_T_ENTRY( TODclock1, "sec\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_ALL, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1048576,-6) ), - SENSOR_INFO_T_ENTRY( TODclock2, "day\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_ALL, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 795364,-6) ), - - /* ==ProcSensors== NameString Units Type Location Number Freq ScaleFactor */ - SENSOR_INFO_T_ENTRY( FREQA, "MHz\0", AMEC_SENSOR_TYPE_FREQ, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( IPS, "MIP\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRPROC, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRMEM, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( TEMPPROCAVG, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( TEMPPROCTHRM, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( UTIL, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1,-2) ), - SENSOR_INFO_T_ENTRY( TEMPNEST, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( VOLTVDDSENSE, "mV\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_500US_IN_HZ, AMEFP( 1, -1) ), - SENSOR_INFO_T_ENTRY( VOLTVDNSENSE, "mV\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_500US_IN_HZ, AMEFP( 1, -1) ), - SENSOR_INFO_T_ENTRY( PWRVDD, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_500US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PWRVDN, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_500US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PROCPWRTHROT, "#\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( PROCOTTHROT, "#\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_16MS_IN_HZ, AMEFP( 1, 0) ), - - SENS_QUAD_ENTRY_SET( TEMPQ, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_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_500US_IN_HZ, AMEFP( 1, -1) ), - SENSOR_INFO_T_ENTRY( VOLTVDN, "mV\0", AMEC_SENSOR_TYPE_VOLTAGE, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_500US_IN_HZ, AMEFP( 1, -1) ), - SENSOR_INFO_T_ENTRY( CURVDD, "A\0", AMEC_SENSOR_TYPE_CURRENT, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_500US_IN_HZ, AMEFP( 1,-2) ), - SENSOR_INFO_T_ENTRY( CURVDN, "A\0", AMEC_SENSOR_TYPE_CURRENT, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_500US_IN_HZ, AMEFP( 1,-2) ), - SENSOR_INFO_T_ENTRY( VRMPROCOT, "#\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_VRM, AMEC_SENSOR_NONUM, AMEEFP_1MS_IN_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_250US_IN_HZ, AMEFP( 1, 0) ), - SENS_CORE_ENTRY_SET( FREQAC, "MHz\0", AMEC_SENSOR_TYPE_FREQ, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENS_CORE_ENTRY_SET( IPSC, "MIP\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENS_CORE_ENTRY_SET( NOTBZEC, "cyc\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENS_CORE_ENTRY_SET( NOTFINC, "cyc\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENS_CORE_ENTRY_SET( TEMPPROCTHRMC, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENS_CORE_ENTRY_SET( UTILC, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1,-2) ), - SENS_CORE_ENTRY_SET( NUTILC, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_3S_IN_HZ, AMEFP( 1,-2) ), - SENS_CORE_ENTRY_SET( MSTLC, "cpi\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENS_CORE_ENTRY_SET( TEMPC, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENS_CORE_ENTRY_SET( STOPDEEPREQC, "ss\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - SENS_CORE_ENTRY_SET( STOPDEEPACTC, "ss\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_4MS_IN_HZ, AMEFP( 1, 0) ), - - /* ==MemSensors== NameString Units Type Location Number Freq ScaleFactor */ - SENS_MEMC_ENTRY_SET( MRDM, "GBs\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 128, -5) ), - SENS_MEMC_ENTRY_SET( MWRM, "GBs\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 128, -5) ), - SENS_MEMC_ENTRY_SET( MIRCM, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENS_MEMC_ENTRY_SET( MLP2M, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENS_DIMM_ENTRY_SET( TEMPDIMM, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_32MS_IN_HZ, AMEFP( 1, 0) ), - SENS_MEMC_ENTRY_SET( TEMPDIMMAXM, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENS_MEMC_ENTRY_SET( LOCDIMMAXM, "loc\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( MEMPWRTHROT, "#\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_250US_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( MEMOTTHROT, "#\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_16MS_IN_HZ, AMEFP( 1, 0) ), - - /* ==CentaurSensors== NameString Units Type Location Number Freq ScaleFactor */ - SEN_CENTR_ENTRY_SET( MACM, "rps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SEN_CENTR_ENTRY_SET( MPUM, "rps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SEN_CENTR_ENTRY_SET( MIRBM, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SEN_CENTR_ENTRY_SET( MIRLM, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SEN_CENTR_ENTRY_SET( MIRMM, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SEN_CENTR_ENTRY_SET( MIRHM, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SEN_CENTR_ENTRY_SET( MTSM, "cnt\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SEN_CENTR_ENTRY_SET( M4RDM, "GBs\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 128, -5) ), - SEN_CENTR_ENTRY_SET( M4WRM, "GBs\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 128, -5) ), - - - /* ==MemSummarySensors== NameString Units Type Location Number Freq ScaleFactor */ - SENSOR_INFO_T_ENTRY( TEMPCENT, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( TEMPDIMMTHRM, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_32MS_IN_HZ, AMEFP( 1, 0) ), - - /* ==GPUSensors== NameString Units Type Location Number Freq ScaleFactor */ - SENSOR_INFO_T_ENTRY( TEMPGPU0, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_GPU, AMEC_SENSOR_NONUM, AMEEFP_32MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( TEMPGPU1, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_GPU, AMEC_SENSOR_NONUM, AMEEFP_32MS_IN_HZ, AMEFP( 1, 0) ), - SENSOR_INFO_T_ENTRY( TEMPGPU2, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_GPU, AMEC_SENSOR_NONUM, AMEEFP_32MS_IN_HZ, AMEFP( 1, 0) ), - - /* ==PartSummarySensors== NameString Units Type Location Number Freq ScaleFactor */ - SENSOR_INFO_T_ENTRY( UTILSLCG000, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), - SENSOR_INFO_T_ENTRY( UTILSLCG001, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), - SENSOR_INFO_T_ENTRY( UTILSLCG002, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), - SENSOR_INFO_T_ENTRY( UTILSLCG003, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), - SENSOR_INFO_T_ENTRY( UTILSLCG004, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), - SENSOR_INFO_T_ENTRY( UTILSLCG005, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), - SENSOR_INFO_T_ENTRY( UTILSLCG006, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), - SENSOR_INFO_T_ENTRY( UTILSLCG007, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), - SENSOR_INFO_T_ENTRY( UTILSLCG008, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), - SENSOR_INFO_T_ENTRY( UTILSLCG009, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), - SENSOR_INFO_T_ENTRY( UTILSLCG010, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), - SENSOR_INFO_T_ENTRY( UTILSLCG011, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_2MS_IN_HZ, AMEFP_SCALE_0_16384), + /* ==FirmwareSensors== NameString Units Type Location Number Freq ScaleFactor */ + SENSOR_INFO_T_ENTRY( AMEintdur, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( AMESSdur0, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( AMESSdur1, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( AMESSdur2, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( AMESSdur3, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( AMESSdur4, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( AMESSdur5, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( AMESSdur6, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( AMESSdur7, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PROBE250US0, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PROBE250US1, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PROBE250US2, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PROBE250US3, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PROBE250US4, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PROBE250US5, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PROBE250US6, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PROBE250US7, "n/a\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( GPEtickdur0, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( GPEtickdur1, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( RTLtickdur, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_OCC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + + /* ==SystemSensors== NameString Units Type Location Number Freq ScaleFactor */ + SENSOR_INFO_T_ENTRY( PWRSYS, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRFAN, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRIO, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRSTORE, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRGPU, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH0, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH1, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH2, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH3, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH4, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH5, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH6, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH7, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH8, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH9, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH10, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH11, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH12, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH13, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH14, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRAPSSCH15, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( CUR12VSTBY, "A\0", AMEC_SENSOR_TYPE_CURRENT, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1,-2) ), + SENSOR_INFO_T_ENTRY( VRHOTMEMPRCCNT, "#\0", AMEC_SENSOR_TYPE_GENERIC, AMEC_SENSOR_LOC_SYS, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + + /* ==ChipSensors== NameString Units Type Location Number Freq ScaleFactor */ + SENSOR_INFO_T_ENTRY( TODclock0, "us\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_ALL, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 16, 0) ), + SENSOR_INFO_T_ENTRY( TODclock1, "sec\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_ALL, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1048576,-6) ), + SENSOR_INFO_T_ENTRY( TODclock2, "day\0", AMEC_SENSOR_TYPE_TIME, AMEC_SENSOR_LOC_ALL, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 795364,-6) ), + + /* ==ProcSensors== NameString Units Type Location Number Freq ScaleFactor */ + SENSOR_INFO_T_ENTRY( FREQA, "MHz\0", AMEC_SENSOR_TYPE_FREQ, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( IPS, "MIP\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRPROC, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( PWRMEM, "W\0", AMEC_SENSOR_TYPE_POWER, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( TEMPPROCAVG, "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( 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_2ND_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_2ND_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) ), + SENSOR_INFO_T_ENTRY( PROCOTTHROT, "#\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_PROC, AMEC_SENSOR_NONUM, AMEEFP_EVERY_64TH_TICK_HZ, AMEFP( 1, 0) ), + + SENS_QUAD_ENTRY_SET( TEMPQ, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_PROC, 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_2ND_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_2ND_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_2ND_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_2ND_TICK_HZ, AMEFP( 1,-2) ), + SENSOR_INFO_T_ENTRY( VRMPROCOT, "#\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) ), + SENS_CORE_ENTRY_SET( FREQAC, "MHz\0", AMEC_SENSOR_TYPE_FREQ, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_CORE_ENTRY_SET( IPSC, "MIP\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_CORE_ENTRY_SET( NOTBZEC, "cyc\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_CORE_ENTRY_SET( NOTFINC, "cyc\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_CORE_ENTRY_SET( TEMPPROCTHRMC, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_CORE_ENTRY_SET( UTILC, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1,-2) ), + SENS_CORE_ENTRY_SET( NUTILC, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_3S_IN_HZ, AMEFP( 1,-2) ), + SENS_CORE_ENTRY_SET( MSTLC, "cpi\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_CORE_ENTRY_SET( TEMPC, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_CORE_ENTRY_SET( STOPDEEPREQC, "ss\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_CORE_ENTRY_SET( STOPDEEPACTC, "ss\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_CORE, AMEC_SENSOR_NONUM, AMEEFP_EVERY_16TH_TICK_HZ, AMEFP( 1, 0) ), + + /* ==MemSensors== NameString Units Type Location Number Freq ScaleFactor */ + SENS_MEMC_ENTRY_SET( MRDM, "GBs\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 128, -5) ), + SENS_MEMC_ENTRY_SET( MWRM, "GBs\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 128, -5) ), + SENS_MEMC_ENTRY_SET( MIRCM, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_MEMC_ENTRY_SET( MLP2M, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_DIMM_ENTRY_SET( TEMPDIMM, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_128TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_MEMC_ENTRY_SET( TEMPDIMMAXM, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENS_MEMC_ENTRY_SET( LOCDIMMAXM, "loc\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( MEMPWRTHROT, "#\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( MEMOTTHROT, "#\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_64TH_TICK_HZ, AMEFP( 1, 0) ), + + /* ==CentaurSensors== NameString Units Type Location Number Freq ScaleFactor */ + SEN_CENTR_ENTRY_SET( MACM, "rps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SEN_CENTR_ENTRY_SET( MPUM, "rps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SEN_CENTR_ENTRY_SET( MIRBM, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SEN_CENTR_ENTRY_SET( MIRLM, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SEN_CENTR_ENTRY_SET( MIRMM, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SEN_CENTR_ENTRY_SET( MIRHM, "eps\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SEN_CENTR_ENTRY_SET( MTSM, "cnt\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SEN_CENTR_ENTRY_SET( M4RDM, "GBs\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 128, -5) ), + SEN_CENTR_ENTRY_SET( M4WRM, "GBs\0", AMEC_SENSOR_TYPE_PERF, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 128, -5) ), + + + /* ==MemSummarySensors== NameString Units Type Location Number Freq ScaleFactor */ + SENSOR_INFO_T_ENTRY( TEMPCENT, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( TEMPDIMMTHRM, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_MEM, AMEC_SENSOR_NONUM, AMEEFP_EVERY_128TH_TICK_HZ, AMEFP( 1, 0) ), + + /* ==GPUSensors== NameString Units Type Location Number Freq ScaleFactor */ + SENSOR_INFO_T_ENTRY( TEMPGPU0, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_GPU, AMEC_SENSOR_NONUM, AMEEFP_EVERY_128TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( TEMPGPU1, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_GPU, AMEC_SENSOR_NONUM, AMEEFP_EVERY_128TH_TICK_HZ, AMEFP( 1, 0) ), + SENSOR_INFO_T_ENTRY( TEMPGPU2, "C\0", AMEC_SENSOR_TYPE_TEMP, AMEC_SENSOR_LOC_GPU, AMEC_SENSOR_NONUM, AMEEFP_EVERY_128TH_TICK_HZ, AMEFP( 1, 0) ), + + /* ==PartSummarySensors== NameString Units Type Location Number Freq ScaleFactor */ + SENSOR_INFO_T_ENTRY( UTILSLCG000, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), + SENSOR_INFO_T_ENTRY( UTILSLCG001, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), + SENSOR_INFO_T_ENTRY( UTILSLCG002, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), + SENSOR_INFO_T_ENTRY( UTILSLCG003, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), + SENSOR_INFO_T_ENTRY( UTILSLCG004, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), + SENSOR_INFO_T_ENTRY( UTILSLCG005, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), + SENSOR_INFO_T_ENTRY( UTILSLCG006, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), + SENSOR_INFO_T_ENTRY( UTILSLCG007, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), + SENSOR_INFO_T_ENTRY( UTILSLCG008, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), + SENSOR_INFO_T_ENTRY( UTILSLCG009, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), + SENSOR_INFO_T_ENTRY( UTILSLCG010, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), + SENSOR_INFO_T_ENTRY( UTILSLCG011, "%\0", AMEC_SENSOR_TYPE_UTIL, AMEC_SENSOR_LOC_LPAR, AMEC_SENSOR_NONUM, AMEEFP_EVERY_8TH_TICK_HZ, AMEFP_SCALE_0_16384), }; // Cause a compile error if we don't have all the sensors in the enum in the initialization list. diff --git a/src/occ_405/topfiles.mk b/src/occ_405/topfiles.mk index 9bb35e7..f3b85ad 100644 --- a/src/occ_405/topfiles.mk +++ b/src/occ_405/topfiles.mk @@ -25,6 +25,7 @@ TOP-C-SOURCES = amec/amec_analytics.c \ amec/amec_controller.c \ amec/amec_data.c \ + amec/amec_dps.c \ amec/amec_freq.c \ amec/amec_health.c \ amec/amec_init.c \ diff --git a/src/occ_405/wof/wof.c b/src/occ_405/wof/wof.c index 8bffd1c..3114480 100644 --- a/src/occ_405/wof/wof.c +++ b/src/occ_405/wof/wof.c @@ -115,20 +115,15 @@ int16_t G_wof_iddq_mult_table[][2] = { * such that the WOF algorithm can run. This includes making * sure the PGPE is ready to perform WOF calculations and enforcing * when WOF should wait a tick to perform a calc or disable wof - * entirely. Called from amec_slave_smh.c::amec_slv_state_4. Called - * every 2ms, but calls the wof_main algorithm every other invocation - * resulting in 4ms intervals + * entirely. Called from amec_slave_smh.c::amec_slv_state_4. + * This should run every 4ms, if HW_MICS_PER_TICK changes adjust calls + * to this function (use amec substates) to keep this called every 4ms * Param: None * * Return: None */ void call_wof_main( void ) { - // Variable to control toggling between invocations - // Init to false to ensure init asynchronous operations have - // the extra 2ms to finish. - static bool L_run_wof = false; - // Variable to ensure we do not keep trying to send vfrt GpeRequest // more than 1 extra time. static bool L_vfrt_last_chance = false; @@ -272,42 +267,36 @@ void call_wof_main( void ) if( (g_wof->wof_init_state >= PGPE_WOF_ENABLED_NO_PREV_DATA) && !g_wof->wof_disabled ) { - // Make sure we run algo on appropriate tick - if( !L_run_wof ) + // Only check if req active quads changed if we are + // in the fully enabled wof state + if(g_wof->wof_init_state == WOF_ENABLED) { - // Only check if req active quads changed if we are - // in the fully enabled wof state - if(g_wof->wof_init_state == WOF_ENABLED) - { - // Read active quads from sram - read_req_active_quads(); + // Read active quads from sram + read_req_active_quads(); - // If the requested active quads changed last loop - // Send vfrt with new req active quads - if( g_wof->req_active_quad_update != - g_wof->prev_req_active_quads ) + // If the requested active quads changed last loop + // Send vfrt with new req active quads + if( g_wof->req_active_quad_update != + g_wof->prev_req_active_quads ) + { + // Calculate new quad step + g_wof->quad_step_from_start = + calc_quad_step_from_start(); + // Compute new VFRT Main Memory address using new quads + g_wof->next_vfrt_main_mem_addr = + calc_vfrt_mainstore_addr(); + // Send new VFRT + send_vfrt_to_pgpe( g_wof->next_vfrt_main_mem_addr ); + if(async_request_is_idle(&G_wof_vfrt_req.request)) { - // Calculate new quad step - g_wof->quad_step_from_start = - calc_quad_step_from_start(); - // Compute new VFRT Main Memory address using new quads - g_wof->next_vfrt_main_mem_addr = - calc_vfrt_mainstore_addr(); - // Send new VFRT - send_vfrt_to_pgpe( g_wof->next_vfrt_main_mem_addr ); - if(async_request_is_idle(&G_wof_vfrt_req.request)) - { - g_wof->gpe_req_rc = gpe_request_schedule(&G_wof_vfrt_req); - } - else - { - INTR_TRAC_INFO("VFRT Request is not idle when" - "requested active quads changed"); - } + g_wof->gpe_req_rc = gpe_request_schedule(&G_wof_vfrt_req); + } + else + { + INTR_TRAC_INFO("VFRT Request is not idle when" + "requested active quads changed"); } } - // Toggle for next tick - L_run_wof = true; } else { @@ -330,8 +319,6 @@ void call_wof_main( void ) // Request is idle. Run wof algorithm wof_main(); - // Set control variables for next tick - L_run_wof = false; L_vfrt_last_chance = false; // Finally make sure we are in the fully enabled state if( g_wof->wof_init_state == PGPE_WOF_ENABLED_NO_PREV_DATA ) @@ -339,7 +326,7 @@ void call_wof_main( void ) g_wof->wof_init_state = WOF_ENABLED; } } - } // L_run_wof + } } // >= PGPE_WOF_ENABLED_NO_PREV_DATA } // IS_OCC_STATE_ACTIVE } while( 0 ); |