diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/occ_405/amec/amec_freq.c | 37 | ||||
-rw-r--r-- | src/occ_405/amec/amec_init.c | 4 | ||||
-rwxr-xr-x | src/occ_405/amec/amec_pcap.c | 84 | ||||
-rwxr-xr-x | src/occ_405/cmdh/cmdh_fsp_cmds.c | 21 | ||||
-rwxr-xr-x | src/occ_405/gpu/gpu.c | 8 | ||||
-rwxr-xr-x | src/occ_405/occ_sys_config.h | 3 | ||||
-rwxr-xr-x | src/occ_405/occbuildname.c | 2 | ||||
-rw-r--r-- | src/tools/ffdcparser/ffdcparser.c | 25 |
8 files changed, 98 insertions, 86 deletions
diff --git a/src/occ_405/amec/amec_freq.c b/src/occ_405/amec/amec_freq.c index 7b02ba7..d1e8aad 100755 --- a/src/occ_405/amec/amec_freq.c +++ b/src/occ_405/amec/amec_freq.c @@ -156,26 +156,31 @@ errlHndl_t amec_set_freq_range(const OCC_MODE i_mode) } } - // check if need to lower max frequency due to being in oversubscription. 0 oversub freq means no freq limitation - if( AMEC_INTF_GET_OVERSUBSCRIPTION() && (G_sysConfigData.sys_mode_freq.table[OCC_MODE_OVERSUB]) && - (G_sysConfigData.sys_mode_freq.table[OCC_MODE_OVERSUB] < l_freq_max) ) + // if (redundant ps policy is being enforced) + if (G_sysConfigData.system_type.non_redund_ps == false) { - // If oversub is lower than system minimum then set to min - if(G_sysConfigData.sys_mode_freq.table[OCC_MODE_OVERSUB] < l_freq_min) + // OVERSUB is actually TURBO + // check if need to lower max frequency due to being in oversubscription. 0 oversub freq means no freq limitation + if( AMEC_INTF_GET_OVERSUBSCRIPTION() && (G_sysConfigData.sys_mode_freq.table[OCC_MODE_OVERSUB]) && + (G_sysConfigData.sys_mode_freq.table[OCC_MODE_OVERSUB] < l_freq_max) ) { - TRAC_IMP("amec_set_freq_range: max frequency lowered from %u to system min %u due to oversubscription", - l_freq_max, - l_freq_min); + // If oversub is lower than system minimum then set to min + if(G_sysConfigData.sys_mode_freq.table[OCC_MODE_OVERSUB] < l_freq_min) + { + TRAC_IMP("amec_set_freq_range: max frequency lowered from %u to system min %u due to oversubscription", + l_freq_max, + l_freq_min); - l_freq_max = l_freq_min; - } - else - { - TRAC_IMP("amec_set_freq_range: max frequency lowered from %u to %u due to Oversubscription", - l_freq_max, - G_sysConfigData.sys_mode_freq.table[OCC_MODE_OVERSUB]); + l_freq_max = l_freq_min; + } + else + { + TRAC_IMP("amec_set_freq_range: max frequency lowered from %u to %u due to Oversubscription", + l_freq_max, + G_sysConfigData.sys_mode_freq.table[OCC_MODE_OVERSUB]); - l_freq_max = G_sysConfigData.sys_mode_freq.table[OCC_MODE_OVERSUB]; + l_freq_max = G_sysConfigData.sys_mode_freq.table[OCC_MODE_OVERSUB]; + } } } diff --git a/src/occ_405/amec/amec_init.c b/src/occ_405/amec/amec_init.c index 4ba89fc..e6c40f2 100644 --- a/src/occ_405/amec/amec_init.c +++ b/src/occ_405/amec/amec_init.c @@ -291,6 +291,10 @@ void amec_init_gamec_struct(void) //Initialize processor power votes g_amec->proc[0].pwr_votes.pmax_clip_freq = 0xFFFF; g_amec->proc[0].pwr_votes.apss_pmax_clip_freq = 0xFFFF; + g_amec->proc[0].pwr_votes.proc_pcap_nom_vote = 0xFFFF; + g_amec->proc[0].pwr_votes.proc_pcap_vote = 0xFFFF; + g_amec->proc[0].pwr_votes.ppb_fmax = 0xFFFF; + g_amec->proc[0].pwr_votes.nom_pcap_fmin = 0; //Initialize stream buffer recording parameters g_amec->recordflag=0; // Never enable recording until requested via Amester API call diff --git a/src/occ_405/amec/amec_pcap.c b/src/occ_405/amec/amec_pcap.c index 531c738..caf8419 100755 --- a/src/occ_405/amec/amec_pcap.c +++ b/src/occ_405/amec/amec_pcap.c @@ -327,12 +327,8 @@ void amec_gpu_pcap(bool i_oversubscription, bool i_active_pcap_changed, int32_t // Thread: Real Time Loop // // End Function Specification -void amec_pcap_calc(void) +void amec_pcap_calc(const bool i_oversub_state) { - /*------------------------------------------------------------------------*/ - /* Local Variables */ - /*------------------------------------------------------------------------*/ - bool l_oversub_state = 0; bool l_active_pcap_changed = FALSE; uint16_t l_node_pwr = AMECSENSOR_PTR(PWRSYS)->sample; uint16_t l_p0_pwr = AMECSENSOR_PTR(PWRPROC)->sample; @@ -342,17 +338,11 @@ void amec_pcap_calc(void) static uint32_t L_prev_node_pcap = 0; static bool L_apss_error_traced = FALSE; - /*------------------------------------------------------------------------*/ - /* Code */ - /*------------------------------------------------------------------------*/ - - l_oversub_state = AMEC_INTF_GET_OVERSUBSCRIPTION(); - // Determine the active power cap. norm_node_pcap is set as lowest // between sys (N+1 mode) and user in amec_data_write_pcap() // when in oversub (N mode) only use oversub pcap if lower than norm_node_pcap // to handle user set power cap lower than the oversub power cap - if( (TRUE == l_oversub_state) && + if( (TRUE == i_oversub_state) && (g_amec->pcap.ovs_node_pcap < g_amec->pcap.norm_node_pcap) ) { g_amec->pcap.active_node_pcap = g_amec->pcap.ovs_node_pcap; @@ -379,7 +369,7 @@ void amec_pcap_calc(void) // Determine GPU power cap if there are GPUs present if(G_first_proc_gpu_config) { - amec_gpu_pcap(l_oversub_state, l_active_pcap_changed, l_avail_power); + amec_gpu_pcap(i_oversub_state, l_active_pcap_changed, l_avail_power); } if(l_node_pwr != 0) @@ -617,39 +607,47 @@ void amec_power_control(void) if(G_pwr_reading_type == PWR_READING_TYPE_APSS) { - // Calculate the pcap for the proc, memory and the power capping limit - // for nominal cores. - amec_pcap_calc(); + const bool l_oversub_state = AMEC_INTF_GET_OVERSUBSCRIPTION(); - // skip processor changes until memory is un-capped - if(!g_amec->pcap.active_mem_level) - { - // Calculate voting box input freq for staying with the current pcap - amec_pcap_controller(); + // if (power supply policy == redundant) or (not in oversubscription) + if ((G_sysConfigData.system_type.non_redund_ps == FALSE) || + (l_oversub_state == FALSE)) + { + // Calculate the pcap for the proc, memory and the power capping limit + // for nominal cores. + amec_pcap_calc(l_oversub_state); - // Calculate the performance preserving bounds voting box input freq - amec_ppb_fmax_calc(); - } + // skip processor changes until memory is un-capped + if(!g_amec->pcap.active_mem_level) + { + // Calculate voting box input freq for staying with the current pcap + amec_pcap_controller(); - // Update the Processor and Memory Throttle due to power sensors - if(g_amec->proc[0].pwr_votes.proc_pcap_vote < G_proc_fmax_mhz) - { - // Frequency is being throttled due to power cap - sensor_update(AMECSENSOR_PTR(PROCPWRTHROT), 1); - } - else // not currently throttled due to power - { - sensor_update(AMECSENSOR_PTR(PROCPWRTHROT), 0); - } - if(g_amec->pcap.active_mem_level != 0) - { - // Memory is being throttled due to power cap - sensor_update(AMECSENSOR_PTR(MEMPWRTHROT), 1); - } - else // not currently throttled due to power - { - sensor_update(AMECSENSOR_PTR(MEMPWRTHROT), 0); - } + // Calculate the performance preserving bounds voting box input freq + amec_ppb_fmax_calc(); + } + + // Update the Processor and Memory Throttle due to power sensors + if(g_amec->proc[0].pwr_votes.proc_pcap_vote < G_proc_fmax_mhz) + { + // Frequency is being throttled due to power cap + sensor_update(AMECSENSOR_PTR(PROCPWRTHROT), 1); + } + else // not currently throttled due to power + { + sensor_update(AMECSENSOR_PTR(PROCPWRTHROT), 0); + } + if(g_amec->pcap.active_mem_level != 0) + { + // Memory is being throttled due to power cap + sensor_update(AMECSENSOR_PTR(MEMPWRTHROT), 1); + } + else // not currently throttled due to power + { + sensor_update(AMECSENSOR_PTR(MEMPWRTHROT), 0); + } + } + // else, dont run pcap algorithm while: oversubscription AND non-redundant ps } else { diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds.c b/src/occ_405/cmdh/cmdh_fsp_cmds.c index f253375..90c6d3b 100755 --- a/src/occ_405/cmdh/cmdh_fsp_cmds.c +++ b/src/occ_405/cmdh/cmdh_fsp_cmds.c @@ -611,14 +611,19 @@ ERRL_RC cmdh_poll_v20(cmdh_fsp_rsp_t * o_rsp_ptr) // OCC can't support power capping without knowing the system power if(G_pwr_reading_type != PWR_READING_TYPE_NONE) { - l_pcapData.current = g_amec->pcap.active_node_pcap; - l_pcapData.system = G_amec_sensor_list[PWRSYS]->sample; - l_pcapData.n = G_sysConfigData.pcap.oversub_pcap; - l_pcapData.max = G_sysConfigData.pcap.max_pcap; - l_pcapData.hard_min = G_sysConfigData.pcap.hard_min_pcap; - l_pcapData.soft_min = G_sysConfigData.pcap.soft_min_pcap; - l_pcapData.user = G_sysConfigData.pcap.current_pcap; - l_pcapData.source = G_sysConfigData.pcap.source; + if ((G_sysConfigData.system_type.non_redund_ps == false) || + (! AMEC_INTF_GET_OVERSUBSCRIPTION())) + { + l_pcapData.current = g_amec->pcap.active_node_pcap; + } + // else OCC is not running pcap algorithim so leave current cap as 0 + l_pcapData.system = G_amec_sensor_list[PWRSYS]->sample; + l_pcapData.n = G_sysConfigData.pcap.oversub_pcap; + l_pcapData.max = G_sysConfigData.pcap.max_pcap; + l_pcapData.hard_min = G_sysConfigData.pcap.hard_min_pcap; + l_pcapData.soft_min = G_sysConfigData.pcap.soft_min_pcap; + l_pcapData.user = G_sysConfigData.pcap.current_pcap; + l_pcapData.source = G_sysConfigData.pcap.source; } // Copy header to response buffer. diff --git a/src/occ_405/gpu/gpu.c b/src/occ_405/gpu/gpu.c index 9c473b9..72697eb 100755 --- a/src/occ_405/gpu/gpu.c +++ b/src/occ_405/gpu/gpu.c @@ -646,8 +646,12 @@ void gpu_ipc_init() } else { - // gpe gpu init only needs to be done once, so do it here. - schedule_gpe_gpu_init_req(); + // if (redundant ps policy is set) + if (G_sysConfigData.system_type.non_redund_ps == false) + { + // gpe gpu init only needs to be done once, so do it here. + schedule_gpe_gpu_init_req(); + } } } diff --git a/src/occ_405/occ_sys_config.h b/src/occ_405/occ_sys_config.h index 6cfe2b1..a00157e 100755 --- a/src/occ_405/occ_sys_config.h +++ b/src/occ_405/occ_sys_config.h @@ -77,7 +77,8 @@ typedef union uint8_t kvm: 1; uint8_t reserved: 3; uint8_t report_dvfs_nom: 1; - uint8_t reserved_2: 2; + uint8_t reserved_2: 1; + uint8_t non_redund_ps: 1; uint8_t single: 1; }; uint8_t byte; diff --git a/src/occ_405/occbuildname.c b/src/occ_405/occbuildname.c index bb0c9f9..c163980 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_171115a\0" /*</BuildName>*/ ; +volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) = /*<BuildName>*/ "op_occ_171129a\0" /*</BuildName>*/ ; #endif diff --git a/src/tools/ffdcparser/ffdcparser.c b/src/tools/ffdcparser/ffdcparser.c index e1bcb59..5fcaaa6 100644 --- a/src/tools/ffdcparser/ffdcparser.c +++ b/src/tools/ffdcparser/ffdcparser.c @@ -24,6 +24,7 @@ /* IBM_PROLOG_END_TAG */ #include <stdio.h> #include <stdint.h> +#include <sys/stat.h> // NOTE: This tool is to be used when FFDC is dumped by the OCC, and currently // only accepts input files in binary format. @@ -162,18 +163,6 @@ uint16_t get_uint16(FILE* i_fhndl) return ret; } -int file_length_valid(FILE* i_fhndl, uint16_t i_exp_size) -{ - uint32_t len = 0; - - while(EOF != fgetc(i_fhndl)) - { - len++; - } - - return (len < i_exp_size) ? 0 : 1; -} - void get_thread_data(FILE* i_fhndl, thread_dump_t * i_thrd) { uint32_t i = 0; @@ -297,16 +286,22 @@ int main(int argc, char** argv) } } + // Get file size + fseek(ffdc_file, 0, SEEK_END); + const unsigned int file_size = ftell(ffdc_file); + fseek(ffdc_file, 0, SEEK_SET); + // Binary file is open, parse it data.seq = fgetc(ffdc_file); data.cmd = fgetc(ffdc_file); data.excp = fgetc(ffdc_file); data.len = get_uint16(ffdc_file); - if( (!file_length_valid(ffdc_file, data.len)) ) + if (file_size < data.len) { - fprintf(stderr, "ERROR: FFDC file not valid size\n"); - return -1; + fprintf(stderr, "WARNING: FFDC file size (%d) is less than what was expected (%d)\n", + file_size, data.len); + // fgetc will continue to return 0xFF once the end of file is reached } if(fseek(ffdc_file, 5, SEEK_SET)) |