summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormbroyles <mbroyles@us.ibm.com>2017-10-12 15:26:29 -0500
committerMartha Broyles <mbroyles@us.ibm.com>2017-10-16 09:52:04 -0400
commitd4fb4c372702ee71440e9f7affc40bba01366c5a (patch)
tree7ec7be3ac8d4840efca515d3d581337ead3d02fa
parentcff91e53cc1a8324654b52d63a2620045c2b0b32 (diff)
downloadtalos-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-xsrc/occ_405/amec/amec_freq.c34
-rwxr-xr-xsrc/occ_405/amec/amec_oversub.c42
-rwxr-xr-xsrc/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c329
-rwxr-xr-xsrc/occ_405/dcom/dcom.c6
-rwxr-xr-xsrc/occ_405/mode.h4
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,
OpenPOWER on IntegriCloud