diff options
author | mbroyles <mbroyles@us.ibm.com> | 2017-10-12 15:26:29 -0500 |
---|---|---|
committer | Martha Broyles <mbroyles@us.ibm.com> | 2017-10-16 09:52:04 -0400 |
commit | d4fb4c372702ee71440e9f7affc40bba01366c5a (patch) | |
tree | 7ec7be3ac8d4840efca515d3d581337ead3d02fa | |
parent | cff91e53cc1a8324654b52d63a2620045c2b0b32 (diff) | |
download | talos-occ-d4fb4c372702ee71440e9f7affc40bba01366c5a.tar.gz talos-occ-d4fb4c372702ee71440e9f7affc40bba01366c5a.zip |
Limit max frequency in oversubscription to prevent PS OC
Change-Id: I2c4be270347c633e5a681d460b0f744982f81bcb
RTC: 180403
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/48329
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Christopher J. Cain <cjcain@us.ibm.com>
Reviewed-by: William A. Bryan <wilbryan@us.ibm.com>
Reviewed-by: Andres A. Lugo-Reyes <aalugore@us.ibm.com>
Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
-rwxr-xr-x | src/occ_405/amec/amec_freq.c | 34 | ||||
-rwxr-xr-x | src/occ_405/amec/amec_oversub.c | 42 | ||||
-rwxr-xr-x | src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c | 329 | ||||
-rwxr-xr-x | src/occ_405/dcom/dcom.c | 6 | ||||
-rwxr-xr-x | src/occ_405/mode.h | 4 |
5 files changed, 247 insertions, 168 deletions
diff --git a/src/occ_405/amec/amec_freq.c b/src/occ_405/amec/amec_freq.c index 32d59dc..03bc22c 100755 --- a/src/occ_405/amec/amec_freq.c +++ b/src/occ_405/amec/amec_freq.c @@ -92,7 +92,8 @@ opal_mem_voting_reason_t G_amec_opal_mem_throt_reason = NO_MEM_THROTTLE; // Name: amec_set_freq_range // // Description: Set the frequency range for AMEC -// This function will run on mode changes and cnfg_data changes +// This function will run on mode changes, cnfg_data changes +// and oversubscription changes // // Thread: RealTime Loop // @@ -120,7 +121,7 @@ errlHndl_t amec_set_freq_range(const OCC_MODE i_mode) { l_freq_min = G_sysConfigData.sys_mode_freq.table[OCC_MODE_MIN_FREQUENCY]; - // Set Max frequency (ultra turbo freq if wof enabled, to turbo freq otherwise) + // Set Max frequency (turbo if wof off, otherwise max possible (ultra turbo) if( g_amec->wof.wof_disabled ) { l_freq_max = G_sysConfigData.sys_mode_freq.table[OCC_MODE_TURBO]; @@ -139,6 +140,7 @@ errlHndl_t amec_set_freq_range(const OCC_MODE i_mode) (i_mode == OCC_MODE_FMF) || (i_mode == OCC_MODE_DYN_POWER_SAVE) || (i_mode == OCC_MODE_DYN_POWER_SAVE_FP) ) { + // clip to turbo if WOF is disabled if( g_amec->wof.wof_disabled ) { l_freq_max = G_sysConfigData.sys_mode_freq.table[OCC_MODE_TURBO]; @@ -154,6 +156,29 @@ 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 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 = G_sysConfigData.sys_mode_freq.table[OCC_MODE_OVERSUB]; + } + } + if( (l_freq_min == 0) || (l_freq_max == 0) ) { // Do not update amec vars with a 0 frequency. @@ -228,11 +253,6 @@ errlHndl_t amec_set_freq_range(const OCC_MODE i_mode) // Copy the PPM frequency information into g_amec memcpy(g_amec->part_mode_freq, l_ppm_freq, sizeof(l_ppm_freq)); - TRAC_INFO("amec_set_freq_range: PPM Fmin[%u] Fnom[%u] Fmax[%u] min_speed[%u]", - l_ppm_freq[OCC_INTERNAL_MODE_NOM].fmin, - l_ppm_freq[OCC_INTERNAL_MODE_NOM].fmax, - l_ppm_freq[OCC_INTERNAL_MODE_DPS].fmax, - l_ppm_freq[OCC_INTERNAL_MODE_DPS_MP].min_speed); } return l_err; } diff --git a/src/occ_405/amec/amec_oversub.c b/src/occ_405/amec/amec_oversub.c index 6b9c991..ff9324d 100755 --- a/src/occ_405/amec/amec_oversub.c +++ b/src/occ_405/amec/amec_oversub.c @@ -35,6 +35,7 @@ #include <occ_sys_config.h> #include <amec_service_codes.h> #include <pgpe_interface.h> +#include <amec_freq.h> //*************************************************************************/ // Externs @@ -137,6 +138,7 @@ void amec_oversub_isr(void) // End Function Specification void amec_oversub_check(void) { + errlHndl_t l_errl = NULL; static BOOLEAN L_prev_ovs_state = FALSE; // oversub happened // oversubscription condition happened? @@ -147,6 +149,7 @@ void amec_oversub_check(void) L_prev_ovs_state = TRUE; TRAC_ERR("Oversubscription condition happened"); + /* @ * @errortype * @moduleid AMEC_SLAVE_CHECK_PERFORMANCE @@ -155,14 +158,14 @@ void amec_oversub_check(void) * @userdata4 ERC_AMEC_SLAVE_OVS_STATE * @devdesc Oversubscription condition happened */ - errlHndl_t l_errl = createErrl(AMEC_SLAVE_CHECK_PERFORMANCE,//modId - OVERSUB_ALERT, //reasoncode - ERC_AMEC_SLAVE_OVS_STATE, //Extended reason code - ERRL_SEV_INFORMATIONAL, //Severity - NULL, //Trace Buf - DEFAULT_TRACE_SIZE, //Trace Size - L_prev_ovs_state, //userdata1 - 0); //userdata2 + l_errl = createErrl(AMEC_SLAVE_CHECK_PERFORMANCE,//modId + OVERSUB_ALERT, //reasoncode + ERC_AMEC_SLAVE_OVS_STATE, //Extended reason code + ERRL_SEV_INFORMATIONAL, //Severity + NULL, //Trace Buf + DEFAULT_TRACE_SIZE, //Trace Size + L_prev_ovs_state, //userdata1 + 0); //userdata2 // set the mfg action flag (allows callout to be added to info error) setErrlActions(l_errl, ERRL_ACTIONS_MANUFACTURING_ERROR); @@ -175,17 +178,36 @@ void amec_oversub_check(void) // Commit Error commitErrl(&l_errl); + + // set max frequency for oversubscription + l_errl = amec_set_freq_range(CURRENT_MODE()); + if(l_errl) + { + TRAC_ERR("amec_oversub_check: committing error reported by amec_set_freq_range"); + commitErrl( &l_errl); + } } } else { - L_prev_ovs_state = FALSE; + if(L_prev_ovs_state) + { + L_prev_ovs_state = FALSE; + TRAC_IMP("Oversubscription condition cleared"); + + // re-set max frequency since no longer in oversubscription + l_errl = amec_set_freq_range(CURRENT_MODE()); + if(l_errl) + { + TRAC_ERR("amec_oversub_check: committing error reported by amec_set_freq_range"); + commitErrl( &l_errl); + } + } } // Figure out the over-subscription reason if(g_amec->oversub_status.oversubReasonLatchCount > 1) { - // TODO -- RTC 155565 -- Try to figure out why we throttled based on APSS GPIO pins if( g_amec->oversub_status.oversubReasonLatchCount == OVERSUB_REASON_COUNT_TIMEOUT) { g_amec->oversub_status.oversubReason = INDETERMINATE; diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c index 80601ea..c35f1b7 100755 --- a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c +++ b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c @@ -47,12 +47,12 @@ #include <wof.h> #include <i2c.h> -#define FREQ_FORMAT_PWR_MODE_NUM 6 #define FREQ_FORMAT_BASE_DATA_SZ (sizeof(cmdh_store_mode_freqs_t) - sizeof(cmdh_fsp_cmd_header_t)) #define FREQ_FORMAT_20_NUM_FREQS 6 - #define DATA_FREQ_VERSION_20 0x20 +#define FREQ_FORMAT_21_NUM_FREQS 7 +#define DATA_FREQ_VERSION_21 0x21 #define DATA_PCAP_VERSION_20 0x20 @@ -251,7 +251,6 @@ errlHndl_t data_store_freq_data(const cmdh_fsp_cmd_t * i_cmd_ptr, uint16_t l_data_length; uint32_t l_mode_data_sz; uint16_t l_freq = 0; - uint8_t l_count = FREQ_FORMAT_PWR_MODE_NUM; uint16_t l_table[OCC_MODE_COUNT] = {0}; do @@ -263,12 +262,12 @@ errlHndl_t data_store_freq_data(const cmdh_fsp_cmd_t * i_cmd_ptr, // If the datapacket is bigger than what we can store, OR // if the version doesn't equal what we expect, OR // if the expected data length does not agree with the actual data length - if((l_data_length < FREQ_FORMAT_BASE_DATA_SZ) || - (l_cmdp->version != DATA_FREQ_VERSION_20) || - ((DATA_FREQ_VERSION_20 == l_cmdp->version) && (l_mode_data_sz != (FREQ_FORMAT_20_NUM_FREQS * 2)))) + if( (l_data_length < FREQ_FORMAT_BASE_DATA_SZ) || + ( (DATA_FREQ_VERSION_20 == l_cmdp->version) && (l_mode_data_sz != (FREQ_FORMAT_20_NUM_FREQS * 2)) ) || + ( (DATA_FREQ_VERSION_21 == l_cmdp->version) && (l_mode_data_sz != (FREQ_FORMAT_21_NUM_FREQS * 2)) ) ) { - CMDH_TRAC_ERR("Invalid Frequency Data packet: data_length[%u] version[%u] l_count[%u] l_mode_data_sz[%u]", - l_data_length, l_cmdp->version, l_count, l_mode_data_sz); + CMDH_TRAC_ERR("Invalid Frequency Data packet: data_length[%u] version[%u] l_mode_data_sz[%u]", + l_data_length, l_cmdp->version, l_mode_data_sz); cmdh_build_errl_rsp(i_cmd_ptr, o_rsp_ptr, ERRL_RC_INVALID_DATA, &l_err); break; } @@ -280,165 +279,201 @@ errlHndl_t data_store_freq_data(const cmdh_fsp_cmd_t * i_cmd_ptr, break; } - if(DATA_FREQ_VERSION_20 == l_cmdp->version) // Version 0x20 + // store frequency data common to all versions + // 1) Nominal, 2) Turbo, 3) Minimum, + // 4) Ultra Turbo, 5) Static PS, 6) FFO + // store under the existing enums. + + // Bytes 3-4 Nominal Frequency Point + l_freq = (l_buf[0] << 8 | l_buf[1]); + + // nominal can not be 0 + if(!l_freq) { - // 1) Nominal, 2) Turbo, 3) Minimum, - // 4) Ultra Turbo, 5) Static PS, 6) FFO - // store under the existing enums. - - // Bytes 3-4 Nominal Frequency Point - l_freq = (l_buf[0] << 8 | l_buf[1]); - l_table[OCC_MODE_NOMINAL] = l_freq; - CMDH_TRAC_INFO("Nominal frequency = %d MHz", l_freq); - - // Bytes 5-6 Turbo Frequency Point: - // also store for DPS modes - l_freq = (l_buf[2] << 8 | l_buf[3]); - // Verify that turbo frequency is <= G_proc_fmax_mhz - if(l_freq > G_proc_fmax_mhz) - { - CMDH_TRAC_ERR("Turbo Frequency[%d] (MHz)) is higher than " - "G_proc_fmax_mhz[%d], clip Turbo Frequency", - l_freq, G_proc_fmax_mhz); - l_freq = G_proc_fmax_mhz; - } - l_table[OCC_MODE_TURBO] = l_freq; - CMDH_TRAC_INFO("Turbo frequency = %d MHz", l_freq); + CMDH_TRAC_ERR("Nominal Frequency is 0!!!"); + cmdh_build_errl_rsp(i_cmd_ptr, o_rsp_ptr, ERRL_RC_INVALID_DATA, &l_err); + break; + } - // Bytes 7-8 Minimum Frequency Point - l_freq = (l_buf[4] << 8 | l_buf[5]); - // Verify that minimum frequency is >= G_oppb.frequency_min_khz - if(l_freq * 1000 < G_oppb.frequency_min_khz) - { - CMDH_TRAC_ERR("Minimum Frequency[%d] (Mhz) is lower than PGPE's " - "G_oppb.frequency_min_khz[%d], clip Minimum Frequency", - l_freq, G_oppb.frequency_min_khz); - l_freq = G_oppb.frequency_min_khz / 1000; - } - l_table[OCC_MODE_MIN_FREQUENCY] = l_freq; - CMDH_TRAC_INFO("Minimum frequency = %d MHz", l_freq); + // This should never happen but verify that nominal frequency is <= G_proc_fmax_mhz + if(l_freq > G_proc_fmax_mhz) + { + CMDH_TRAC_ERR("Nominal Frequency[%d] (MHz)) is higher than " + "G_proc_fmax_mhz[%d], clipping Nominal Frequency", + l_freq, G_proc_fmax_mhz); + l_freq = G_proc_fmax_mhz; + } - // Bytes 9-10 Ultr Turbo Frequency Point - l_freq = (l_buf[6] << 8 | l_buf[7]); - // Verify that ultra turbo frequency is <= G_proc_fmax_mhz - if(l_freq > G_proc_fmax_mhz) - { - CMDH_TRAC_ERR("Ultra Turbo Frequency[%d] (MHz) is higher than PGPE's " - "Max freq (G_proc_fmax_mhz[%d]) clip Ultra Turbo Frequency", - l_freq, G_proc_fmax_mhz); - l_freq = G_proc_fmax_mhz; - } + l_table[OCC_MODE_NOMINAL] = l_freq; + CMDH_TRAC_INFO("Nominal frequency = %d MHz", l_freq); - // Check if (H)TMGT will let WOF run, else clear flags - switch( l_freq ) - { - case WOF_MISSING_ULTRA_TURBO: - CMDH_TRAC_INFO("WOF Disabled due to 0 UT value."); - set_clear_wof_disabled( SET, WOF_RC_UTURBO_IS_ZERO ); - l_freq = 0; - break; + // Bytes 5-6 Turbo Frequency Point: + // also store for DPS modes + l_freq = (l_buf[2] << 8 | l_buf[3]); + // Verify that turbo frequency is not zero, if it is set to nominal + if(!l_freq) + { + CMDH_TRAC_ERR("Turbo Frequency is 0 setting to nominal %dMHz ", + l_table[OCC_MODE_NOMINAL]); + l_freq = l_table[OCC_MODE_NOMINAL]; + } + // Verify that turbo frequency is <= G_proc_fmax_mhz + else if(l_freq > G_proc_fmax_mhz) + { + CMDH_TRAC_ERR("Turbo Frequency[%d] (MHz)) is higher than " + "G_proc_fmax_mhz[%d], clip Turbo Frequency", + l_freq, G_proc_fmax_mhz); + l_freq = G_proc_fmax_mhz; + } + l_table[OCC_MODE_TURBO] = l_freq; + CMDH_TRAC_INFO("Turbo frequency = %d MHz", l_freq); - case WOF_SYSTEM_DISABLED: - CMDH_TRAC_INFO("WOF Disabled due to SYSTEM_WOF_DISABLE"); - set_clear_wof_disabled( SET, WOF_RC_SYSTEM_WOF_DISABLE ); - l_freq = 0; - break; + // Bytes 7-8 Minimum Frequency Point + l_freq = (l_buf[4] << 8 | l_buf[5]); + // Verify that minimum frequency is >= G_oppb.frequency_min_khz + if(l_freq * 1000 < G_oppb.frequency_min_khz) + { + CMDH_TRAC_ERR("Minimum Frequency[%d] (Mhz) is lower than PGPE's " + "G_oppb.frequency_min_khz[%d], clip Minimum Frequency", + l_freq, G_oppb.frequency_min_khz); + l_freq = G_oppb.frequency_min_khz / 1000; + } + l_table[OCC_MODE_MIN_FREQUENCY] = l_freq; + CMDH_TRAC_INFO("Minimum frequency = %d MHz", l_freq); - case WOF_RESET_LIMIT_REACHED: - CMDH_TRAC_INFO("WOF Disabled due to reset limit"); - set_clear_wof_disabled( SET, WOF_RC_RESET_LIMIT_REACHED ); - l_freq = 0; - break; + // Bytes 9-10 Ultr Turbo Frequency Point + l_freq = (l_buf[6] << 8 | l_buf[7]); + // Verify that ultra turbo frequency is <= G_proc_fmax_mhz + if(l_freq > G_proc_fmax_mhz) + { + CMDH_TRAC_ERR("Ultra Turbo Frequency[%d] (MHz) is higher than PGPE's " + "Max freq (G_proc_fmax_mhz[%d]) clip Ultra Turbo Frequency", + l_freq, G_proc_fmax_mhz); + l_freq = G_proc_fmax_mhz; + } - case WOF_UNSUPPORTED_FREQ: - CMDH_TRAC_INFO("WOF Disabled due to unsupported frequency"); - set_clear_wof_disabled( SET, WOF_RC_UNSUPPORTED_FREQUENCIES ); - l_freq = 0; - break; + // Check if (H)TMGT will let WOF run, else clear flags + switch( l_freq ) + { + case WOF_MISSING_ULTRA_TURBO: + CMDH_TRAC_INFO("WOF Disabled due to 0 UT value."); + set_clear_wof_disabled( SET, WOF_RC_UTURBO_IS_ZERO ); + l_freq = 0; + break; - default: - CMDH_TRAC_INFO("WOF is Enabled! so far..."); - set_clear_wof_disabled( CLEAR, WOF_RC_UTURBO_IS_ZERO ); - set_clear_wof_disabled( CLEAR, WOF_RC_SYSTEM_WOF_DISABLE ); - set_clear_wof_disabled( CLEAR, WOF_RC_RESET_LIMIT_REACHED ); - set_clear_wof_disabled( CLEAR, WOF_RC_UNSUPPORTED_FREQUENCIES ); - set_clear_wof_disabled( CLEAR, WOF_RC_OCC_WOF_DISABLED ); - break; - } + case WOF_SYSTEM_DISABLED: + CMDH_TRAC_INFO("WOF Disabled due to SYSTEM_WOF_DISABLE"); + set_clear_wof_disabled( SET, WOF_RC_SYSTEM_WOF_DISABLE ); + l_freq = 0; + break; - l_table[OCC_MODE_UTURBO] = l_freq; - CMDH_TRAC_INFO("UT frequency = %d MHz", l_freq); + case WOF_RESET_LIMIT_REACHED: + CMDH_TRAC_INFO("WOF Disabled due to reset limit"); + set_clear_wof_disabled( SET, WOF_RC_RESET_LIMIT_REACHED ); + l_freq = 0; + break; - // clip G_proc_fmax_mhz to TMGT's MAX(turbo, ultra turbo) frequency point - if(l_table[OCC_MODE_UTURBO] > l_table[OCC_MODE_TURBO]) - { - G_proc_fmax_mhz = l_table[OCC_MODE_UTURBO]; - } - else - { - G_proc_fmax_mhz = l_table[OCC_MODE_TURBO]; - } + case WOF_UNSUPPORTED_FREQ: + CMDH_TRAC_INFO("WOF Disabled due to unsupported frequency"); + set_clear_wof_disabled( SET, WOF_RC_UNSUPPORTED_FREQUENCIES ); + l_freq = 0; + break; - // Set dynamic power save frequencies - l_table[OCC_MODE_DYN_POWER_SAVE] = G_proc_fmax_mhz; - l_table[OCC_MODE_DYN_POWER_SAVE_FP] = G_proc_fmax_mhz; + default: + CMDH_TRAC_INFO("WOF is Enabled! so far..."); + set_clear_wof_disabled( CLEAR, WOF_RC_UTURBO_IS_ZERO ); + set_clear_wof_disabled( CLEAR, WOF_RC_SYSTEM_WOF_DISABLE ); + set_clear_wof_disabled( CLEAR, WOF_RC_RESET_LIMIT_REACHED ); + set_clear_wof_disabled( CLEAR, WOF_RC_UNSUPPORTED_FREQUENCIES ); + set_clear_wof_disabled( CLEAR, WOF_RC_OCC_WOF_DISABLED ); + break; + } + + l_table[OCC_MODE_UTURBO] = l_freq; + CMDH_TRAC_INFO("UT frequency = %d MHz", l_freq); + + // clip G_proc_fmax_mhz to TMGT's MAX(turbo, ultra turbo) frequency point + if(l_table[OCC_MODE_UTURBO] > l_table[OCC_MODE_TURBO]) + { + G_proc_fmax_mhz = l_table[OCC_MODE_UTURBO]; + } + else + { + G_proc_fmax_mhz = l_table[OCC_MODE_TURBO]; + } + + // Set dynamic power save frequencies + l_table[OCC_MODE_DYN_POWER_SAVE] = G_proc_fmax_mhz; + l_table[OCC_MODE_DYN_POWER_SAVE_FP] = G_proc_fmax_mhz; - // Bytes 11-12 Static Power Save Frequency Point - l_freq = (l_buf[8] << 8 | l_buf[9]); - // in case min freq was clipped verify power save not below min - if(l_freq < l_table[OCC_MODE_MIN_FREQUENCY]) + // Bytes 11-12 Static Power Save Frequency Point + l_freq = (l_buf[8] << 8 | l_buf[9]); + // in case min freq was clipped verify power save not below min + if(l_freq < l_table[OCC_MODE_MIN_FREQUENCY]) + { + l_freq = l_table[OCC_MODE_MIN_FREQUENCY]; + } + + l_table[OCC_MODE_PWRSAVE] = l_freq; + CMDH_TRAC_INFO("Static Power Save frequency = %d MHz", l_freq); + + // Bytes 13-14 FFO Frequency Point + l_freq = (l_buf[10] << 8 | l_buf[11]); + if (l_freq != 0) + { + // Check and make sure that FFO freq is within valid range + const uint16_t l_req_freq = l_freq; + if (l_freq < l_table[OCC_MODE_MIN_FREQUENCY]) { - CMDH_TRAC_ERR("Power Save Frequency[%d] is lower than min[%d]", - l_freq, l_table[OCC_MODE_MIN_FREQUENCY]); l_freq = l_table[OCC_MODE_MIN_FREQUENCY]; } - - l_table[OCC_MODE_PWRSAVE] = l_freq; - CMDH_TRAC_INFO("Static Power Save frequency = %d MHz", l_freq); - - // Bytes 13-14 FFO Frequency Point - l_freq = (l_buf[10] << 8 | l_buf[11]); - if (l_freq != 0) + else if (l_freq > G_proc_fmax_mhz) { - // Check and make sure that FFO freq is within valid range - const uint16_t l_req_freq = l_freq; - if (l_freq < l_table[OCC_MODE_MIN_FREQUENCY]) - { - l_freq = l_table[OCC_MODE_MIN_FREQUENCY]; - } - else if (l_freq > G_proc_fmax_mhz) - { - l_freq = G_proc_fmax_mhz; - } + l_freq = G_proc_fmax_mhz; + } - // Log an error if we could not honor the requested FFO frequency, but keep going. - if (l_req_freq != l_freq) - { - TRAC_ERR("FFO Frequency out of range. requested %d MHz, but using %d MHz", - l_req_freq, l_freq); - /* @ - * @errortype - * @moduleid DATA_STORE_FREQ_DATA - * @reasoncode INVALID_INPUT_DATA - * @userdata1 requested frequency - * @userdata2 frequency used - * @userdata4 OCC_NO_EXTENDED_RC - * @devdesc OCC recieved an invalid FFO frequency - */ - l_err = createErrl(DATA_STORE_FREQ_DATA, - INVALID_INPUT_DATA, - OCC_NO_EXTENDED_RC, - ERRL_SEV_INFORMATIONAL, - NULL, - DEFAULT_TRACE_SIZE, - l_req_freq, - l_freq); - commitErrl(&l_err); - } + // Log an error if we could not honor the requested FFO frequency, but keep going. + if (l_req_freq != l_freq) + { + TRAC_ERR("FFO Frequency out of range. requested %d MHz, but using %d MHz", + l_req_freq, l_freq); + /* @ + * @errortype + * @moduleid DATA_STORE_FREQ_DATA + * @reasoncode INVALID_INPUT_DATA + * @userdata1 requested frequency + * @userdata2 frequency used + * @userdata4 OCC_NO_EXTENDED_RC + * @devdesc OCC recieved an invalid FFO frequency + */ + l_err = createErrl(DATA_STORE_FREQ_DATA, + INVALID_INPUT_DATA, + OCC_NO_EXTENDED_RC, + ERRL_SEV_INFORMATIONAL, + NULL, + DEFAULT_TRACE_SIZE, + l_req_freq, + l_freq); + commitErrl(&l_err); } } l_table[OCC_MODE_FFO] = l_freq; - CMDH_TRAC_INFO("FFO Frequency = %d Mhz", l_freq); + CMDH_TRAC_INFO("FFO Frequency = %d Mhz", l_freq); + + // Only version 0x21 has additional oversubscription freq + if(DATA_FREQ_VERSION_21 == l_cmdp->version) + { + // Bytes 15-16 Oversubscription Max Frequency + l_freq = (l_buf[12] << 8 | l_buf[13]); + l_table[OCC_MODE_OVERSUB] = l_freq; + } + else + { + // Version 0x20 limit oversubscription frequency to turbo + l_table[OCC_MODE_OVERSUB] = l_table[OCC_MODE_TURBO]; + } + + CMDH_TRAC_INFO("Oversubscription max frequency = %d MHz", l_table[OCC_MODE_OVERSUB]); // inconsistent Frequency Points? if((l_table[OCC_MODE_UTURBO] < l_table[OCC_MODE_TURBO] && l_table[OCC_MODE_UTURBO]) || diff --git a/src/occ_405/dcom/dcom.c b/src/occ_405/dcom/dcom.c index 63339e1..abd442f 100755 --- a/src/occ_405/dcom/dcom.c +++ b/src/occ_405/dcom/dcom.c @@ -513,8 +513,10 @@ void task_dcom_parse_occfwmsg(task_t *i_self) { for(l_mode =0; l_mode<OCC_MODE_COUNT; l_mode++) { - // Don't trust a frequency of 0x0000 - if( (0 != G_dcom_slv_inbox_rx.sys_mode_freq.table[l_mode]) ) + // Don't trust a frequency of 0x0000 except for oversubscription and Ultra Turbo + if( (0 != G_dcom_slv_inbox_rx.sys_mode_freq.table[l_mode]) || + (l_mode == OCC_MODE_OVERSUB) || + (l_mode == OCC_MODE_UTURBO) ) { if(G_sysConfigData.sys_mode_freq.table[l_mode] != G_dcom_slv_inbox_rx.sys_mode_freq.table[l_mode]) diff --git a/src/occ_405/mode.h b/src/occ_405/mode.h index aa0f07a..740abd8 100755 --- a/src/occ_405/mode.h +++ b/src/occ_405/mode.h @@ -40,12 +40,12 @@ // Returns the 'Requested' SMS Mode #define VALID_MODE(mode) ((mode < OCC_MODE_COUNT) ? 1 : 0) -// Typedef of the various modes that TMGT can put OCC into. +// Typedef of the various modes typedef enum { OCC_MODE_NOCHANGE = 0x00, OCC_MODE_NOMINAL = 0x01, - // reserved = 0x02, + OCC_MODE_OVERSUB = 0x02, // not a settable mode, just used to store oversubscription max freq OCC_MODE_TURBO = 0x03, OCC_MODE_SAFE = 0x04, OCC_MODE_PWRSAVE = 0x05, |