summaryrefslogtreecommitdiffstats
path: root/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c
diff options
context:
space:
mode:
authorWael El-Essawy <welessa@us.ibm.com>2016-12-09 18:28:26 -0600
committerWael El-Essawy <welessa@us.ibm.com>2017-01-27 12:00:02 -0500
commit360934dea9355e488206267d7f9fd9b1c753cf16 (patch)
treed5fb9e4ae46b9b9afe9adca7b1e0ac72e5d7219a /src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c
parentc35e73bb81af40e6cca73b35ea8db61a8f17f5a8 (diff)
downloadtalos-occ-360934dea9355e488206267d7f9fd9b1c753cf16.tar.gz
talos-occ-360934dea9355e488206267d7f9fd9b1c753cf16.zip
Pstates Support in OCC
1. Initialize Pstates global parameters (G_proc_fmax, G_proc_fmin, G_khz_per_pstate and G_proc_pmin from the OCC Pstate Parameter Block) 2. When frequency config data packet is received and OCC is NOT already in Active state: Send IPC command to PGPE to set pState clips to be wide open from min frequency to turbo First verify min/max frequency from TMGT is within what PGPE allows saved in G_proc_fmax and G_proc_fmin if not within bounds trace and clip to G_proc_fmax/fmin) 3. Transition to active state: Send IPC command to PGPE to start pState protocol (give correct data for OCC vs OPAL in control of Pstates) and if OPAL system update OPAL shared memory with Pstate information. 4. amec_slv_freq_smh(): Send IPC command to PGPE to set requested pState (PowerVM) or set clips (OPAL). 5. Address all the TODO/TEMP/#if 0 in amec_freq.c either remove or add RTC# for when it will be addressed Change-Id: Ic323321b8c66945732a6b7345ad85d6f41a62edd RTC: 130201 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/33704 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Martha Broyles <mbroyles@us.ibm.com> Reviewed-by: Andres A. Lugo-Reyes <aalugore@us.ibm.com> Reviewed-by: Wael El-Essawy <welessa@us.ibm.com>
Diffstat (limited to 'src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c')
-rwxr-xr-xsrc/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c73
1 files changed, 47 insertions, 26 deletions
diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c
index d3e9a3f..30e2ea9 100755
--- a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c
+++ b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c
@@ -42,6 +42,7 @@
#include <centaur_data.h>
#include "dimm.h"
#include <avsbus.h>
+#include "p9_pstates_occ.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))
@@ -67,12 +68,8 @@
extern uint8_t G_occ_interrupt_type;
-extern uint32_t G_proc_fmin;
-extern uint32_t G_proc_fmax;
-extern uint32_t G_khz_per_pstate;
-
-extern uint8_t G_proc_pmin;
-extern uint8_t G_proc_pmax;
+extern uint16_t G_proc_fmax_mhz; // Maximum frequency (uturbo if WOF enabled, otherwise turbo)
+extern OCCPstateParmBlock G_oppb; // OCC Pstate Parameters Block Structure
typedef struct data_req_table
{
@@ -284,39 +281,64 @@ errlHndl_t data_store_freq_data(const cmdh_fsp_cmd_t * i_cmd_ptr,
// 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", 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;
l_table[OCC_MODE_DYN_POWER_SAVE] = l_freq;
l_table[OCC_MODE_DYN_POWER_SAVE_FP] = l_freq;
- CMDH_TRAC_INFO("Turbo frequency = %d", l_freq);
+ CMDH_TRAC_INFO("Turbo frequency = %d MHz", l_freq);
// 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;
- G_proc_fmin = l_freq;
- CMDH_TRAC_INFO("Minimum frequency = %d", l_freq);
+ CMDH_TRAC_INFO("Minimum frequency = %d MHz", l_freq);
// Bytes 9-10 Ultr Turbo Frequency Point
l_freq = (l_buf[6] << 8 | l_buf[7]);
- if(l_freq)
+ // 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_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 = l_freq;
+ G_proc_fmax_mhz = l_table[OCC_MODE_UTURBO];
}
- else // If Ultra Turbo Frequency Point = 0, Fmax = Turbo Frequency
+ else
{
- G_proc_fmax = l_table[OCC_MODE_TURBO];
+ G_proc_fmax_mhz = l_table[OCC_MODE_TURBO];
}
- l_table[OCC_MODE_UTURBO] = l_freq;
- CMDH_TRAC_INFO("UT frequency = %d", l_freq);
// Bytes 11-12 Static Power Save Frequency Point
l_freq = (l_buf[8] << 8 | l_buf[9]);
l_table[OCC_MODE_PWRSAVE] = l_freq;
- CMDH_TRAC_INFO("Static Power Save frequency = %d", 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]);
@@ -324,19 +346,19 @@ errlHndl_t data_store_freq_data(const cmdh_fsp_cmd_t * i_cmd_ptr,
{
// Check and make sure that FFO freq is within valid range
const uint16_t l_req_freq = l_freq;
- if (l_freq < G_proc_fmin)
+ if (l_freq < l_table[OCC_MODE_MIN_FREQUENCY])
{
- l_freq = G_proc_fmin;
+ l_freq = l_table[OCC_MODE_MIN_FREQUENCY];
}
- else if (l_freq > G_proc_fmax)
+ else if (l_freq > G_proc_fmax_mhz)
{
- l_freq = G_proc_fmax;
+ 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, but using %d",
+ TRAC_ERR("FFO Frequency out of range. requested %d MHz, but using %d MHz",
l_req_freq, l_freq);
/* @
* @errortype
@@ -360,10 +382,7 @@ errlHndl_t data_store_freq_data(const cmdh_fsp_cmd_t * i_cmd_ptr,
}
}
l_table[OCC_MODE_FFO] = l_freq;
- CMDH_TRAC_INFO("FFO Frequency = %d", l_freq);
-
- // Calculate minimum Pstate:
- G_proc_pmin = G_proc_pmax + ((G_proc_fmax - G_proc_fmin)/G_khz_per_pstate);
+ CMDH_TRAC_INFO("FFO Frequency = %d Mhz", l_freq);
// inconsistent Frequency Points?
if((l_table[OCC_MODE_UTURBO] < l_table[OCC_MODE_TURBO] && l_table[OCC_MODE_UTURBO]) ||
@@ -2091,6 +2110,8 @@ errlHndl_t DATA_store_cnfgdata (const cmdh_fsp_cmd_t * i_cmd_ptr,
l_errlHndl = data_store_freq_data(i_cmd_ptr , o_rsp_ptr);
if(NULL == l_errlHndl)
{
+ // New Frequency config data packet received with no error logs: set the
+ // DATA_MASK_FREQ_PRESENT to flag that we received the frequency from TMGT
l_new_data = DATA_MASK_FREQ_PRESENT;
}
break;
OpenPOWER on IntegriCloud