diff options
author | Wael El-Essawy <welessa@us.ibm.com> | 2015-12-07 15:07:09 -0600 |
---|---|---|
committer | Wael Elessawy <welessa@us.ibm.com> | 2015-12-11 13:29:24 -0600 |
commit | 99ef891b7853232a80d5c1914f201c81e8a725c3 (patch) | |
tree | 7335da0a2c06a918f27fd0475b1dcb1a368e2ff5 /src/occ_405/cmdh | |
parent | ca9e4420760a191828d259c1e425486fa1f658a7 (diff) | |
download | talos-occ-99ef891b7853232a80d5c1914f201c81e8a725c3.tar.gz talos-occ-99ef891b7853232a80d5c1914f201c81e8a725c3.zip |
CC: Support Thermal Control Threshold Config Data format 0x13
Support thermal control thresholds format 0x13 config data command
with new version 0x20 defined in P9 interface spec.
All older P8 versions of format 0x13 deleted.
Tested in simics.
remove thermal thread.
fix a dts calculation bug.
add a firmware failure error log.
Change-Id: I4a9979929292833a5e6f4f7f4e162ea20983b96a
RTC: 141647
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/22516
Tested-by: FSP CI Jenkins
Reviewed-by: William A. Bryan <wilbryan@us.ibm.com>
Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
Reviewed-by: Wael Elessawy <welessa@us.ibm.com>
Diffstat (limited to 'src/occ_405/cmdh')
-rwxr-xr-x | src/occ_405/cmdh/cmdh_fsp.c | 4 | ||||
-rwxr-xr-x | src/occ_405/cmdh/cmdh_fsp_cmds.c | 77 | ||||
-rwxr-xr-x | src/occ_405/cmdh/cmdh_fsp_cmds.h | 37 | ||||
-rwxr-xr-x | src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c | 175 | ||||
-rwxr-xr-x | src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.h | 48 |
5 files changed, 83 insertions, 258 deletions
diff --git a/src/occ_405/cmdh/cmdh_fsp.c b/src/occ_405/cmdh/cmdh_fsp.c index 76b777f..2944f61 100755 --- a/src/occ_405/cmdh/cmdh_fsp.c +++ b/src/occ_405/cmdh/cmdh_fsp.c @@ -1304,10 +1304,6 @@ errlHndl_t cmdh_processTmgtRequest (const cmdh_fsp_cmd_t * i_cmd_ptr, l_err = cmdh_reset_prep(i_cmd_ptr,i_rsp_ptr); break; - case CMDH_GET_COOLING_REQUEST: - l_err = cmdh_get_cooling_request(i_cmd_ptr,i_rsp_ptr); - break; - case CMDH_MFG_TEST_CMD: cmdh_mnfg_test_parse(i_cmd_ptr,i_rsp_ptr); break; diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds.c b/src/occ_405/cmdh/cmdh_fsp_cmds.c index 03dae96..e34b86c 100755 --- a/src/occ_405/cmdh/cmdh_fsp_cmds.c +++ b/src/occ_405/cmdh/cmdh_fsp_cmds.c @@ -47,7 +47,6 @@ #include "sensor_query_list.h" #include "chom.h" #include "amec_master_smh.h" -#include "thrm_thread.h" #include <proc_data.h> // This table contains tunable parameter information that can be exposed to @@ -87,8 +86,6 @@ uint8_t G_mst_tunable_parameter_overwrite = 0; //Reverse association of channel to function. uint8_t G_apss_ch_to_function[MAX_APSS_ADC_CHANNELS] = {0}; -extern thrm_fru_data_t G_thrm_fru_data[DATA_FRU_MAX]; - // Function Specification // // Name: cmdh_tmgt_poll @@ -115,7 +112,6 @@ errlHndl_t cmdh_tmgt_poll (const cmdh_fsp_cmd_t * i_cmd_ptr, l_poll_rsp->status.word = SMGR_validate_get_valid_states(); l_poll_rsp->ext_status.word = 0; - l_poll_rsp->ext_status.cooling_request = THRM_thread_get_cooling_request(); l_poll_rsp->occ_pres_mask = G_sysConfigData.is_occ_present; l_poll_rsp->config_data = DATA_request_cnfgdata(); @@ -1585,79 +1581,6 @@ errlHndl_t cmdh_tmgt_get_field_debug_data(const cmdh_fsp_cmd_t * i_cmd_ptr, // Function Specification // -// Name: cmdh_get_cooling_request -// -// Description: TODO Add description -// -// End Function Specification -errlHndl_t cmdh_get_cooling_request(const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr) -{ - errlHndl_t l_errlHndl = NULL; - cmdh_get_cooling_resp_t *l_resp_ptr = (cmdh_get_cooling_resp_t*) o_rsp_ptr; - ERRL_RC l_rc = ERRL_RC_SUCCESS; - uint16_t l_rsp_data_length = 0; - uint16_t l_max_increment = 0; - uint8_t l_fru_winner = DATA_FRU_MAX; - uint8_t i = 0; - uint8_t j = 0; - - do - { - // Command Length Check - make sure we at least have a version number - if( CMDH_DATALEN_FIELD_UINT16(i_cmd_ptr) < CMDH_GET_COOLING_MIN_DATALEN) - { - l_rc = ERRL_RC_INVALID_CMD_LEN; - break; - } - - // Version Number Check - if(i_cmd_ptr->data[0] != CMDH_GET_COOLING_VERSION) - { - l_rc = ERRL_RC_INVALID_DATA; - break; - } - - // Loop through all Zones - for (i=0; i<THRM_MAX_NUM_ZONES; i++) - { - // For each Zone, determine which FRU is requesting the maximum - // increment value - l_max_increment = 0; - l_fru_winner = DATA_FRU_MAX; - for (j=0; j<DATA_FRU_MAX; j++) - { - if (G_thrm_fru_data[j].FanIncZone[i] > l_max_increment) - { - l_max_increment = G_thrm_fru_data[j].FanIncZone[i]; - l_fru_winner = j; - } - } - l_resp_ptr->zone_data[i].increment_value = l_max_increment; - l_resp_ptr->zone_data[i].comp_type = l_fru_winner; - l_resp_ptr->zone_data[i].reason = 0x00; // Always hardcoded to 0x00 - } - - // Populate the response data header - l_rsp_data_length = (sizeof(cmdh_get_cooling_resp_t) - CMDH_DBUG_FSP_RESP_LEN); - l_resp_ptr->data_length[0] = ((uint8_t *)&l_rsp_data_length)[0]; - l_resp_ptr->data_length[1] = ((uint8_t *)&l_rsp_data_length)[1]; - l_resp_ptr->rc = l_rc; - - }while(0); - - if(ERRL_RC_SUCCESS != l_rc) - { - // Build Error Response packet - cmdh_build_errl_rsp(i_cmd_ptr, o_rsp_ptr, l_rc, &l_errlHndl); - } - - return l_errlHndl; -} - - -// Function Specification -// // Name: cmdh_set_user_pcap // // Description: Implements the Set Use Power Cap command. diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds.h b/src/occ_405/cmdh/cmdh_fsp_cmds.h index f31b210..cb3593b 100755 --- a/src/occ_405/cmdh/cmdh_fsp_cmds.h +++ b/src/occ_405/cmdh/cmdh_fsp_cmds.h @@ -38,7 +38,6 @@ //#include "pstates.h" #include "cmdh_fsp_cmds_datacnfg.h" #include "sensor.h" -#include "thrm_thread.h" #include "apss.h" // Enum of the various commands that TMGT may send to OCC @@ -57,7 +56,6 @@ typedef enum CMDH_READ_STATUS_REG = 0x31, CMDH_GET_THROTTLE_VALUE = 0x32, CMDH_GET_CPU_TEMPS = 0x33, - CMDH_GET_COOLING_REQUEST = 0x34, CMDH_GET_SNAPSHOT_BUFFER = 0x35, CMDH_DEBUGPT = 0x40, CMDH_AME_PASS_THROUGH = 0x41, @@ -125,7 +123,7 @@ typedef struct __attribute__ ((packed)) cmdh_poll_resp_v0 uint8_t _reserved_3 : 1; uint8_t sync_request : 1; // In TMGT to TPMF interface spec, but not needed yet uint8_t _reserved_1 : 1; - uint8_t cooling_request : 1; // 1:new fan speed, 0:no new fan speed + uint8_t _reserved_0 : 1; }; uint8_t word; } ext_status; @@ -385,36 +383,6 @@ typedef struct __attribute__ ((packed)) cmdh_reset_prep }cmdh_reset_prep_t; //--------------------------------------------------------- -// Get Cooling Request -//--------------------------------------------------------- - -// Minimum Data Length for Get Cooling Request Command -#define CMDH_GET_COOLING_MIN_DATALEN 1 - -// Version 0 -#define CMDH_GET_COOLING_VERSION 0 - -typedef struct cmdh_get_cooling_data -{ - // Maximum increment value for this zone - uint16_t increment_value; - // Component type that is driving the increment for this zone - uint8_t comp_type; - // Currently not used, hardcode to 0x00 (see TMGT-OCC Interface Spec v2.0) - uint8_t reason; -}cmdh_get_cooling_data_t; - -// Used by OCC to respond to "GET_COOLING_REQUEST" cmd -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_rsp_header; - // Zone data array - cmdh_get_cooling_data_t zone_data[THRM_MAX_NUM_ZONES]; - // Checksum - uint8_t checksum[2]; -}cmdh_get_cooling_resp_t; - -//--------------------------------------------------------- // Debug Command //--------------------------------------------------------- @@ -643,9 +611,6 @@ errlHndl_t cmdh_reset_prep(const cmdh_fsp_cmd_t * i_cmd_ptr, errlHndl_t cmdh_tmgt_get_field_debug_data(const cmdh_fsp_cmd_t * i_cmd_ptr, cmdh_fsp_rsp_t * i_rsp_ptr); -errlHndl_t cmdh_get_cooling_request(const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr); - errlHndl_t cmdh_set_user_pcap(const cmdh_fsp_cmd_t * i_cmd_ptr, cmdh_fsp_rsp_t * o_rsp_ptr); diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c index b492a41..2abebc0 100755 --- a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c +++ b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.c @@ -59,10 +59,8 @@ #define DATA_APSS_VERSION20 0x20 -#define DATA_THRM_THRES_VERSION_1 1 -#define DATA_THRM_THRES_VERSION_10 0x10 -#define THRM_THRES_BASE_DATA_SZ_1 4 -#define THRM_THRES_BASE_DATA_SZ_10 3 +#define DATA_THRM_THRES_VERSION_20 0x20 +#define THRM_THRES_BASE_DATA_SZ_20 5 #define DATA_IPS_VERSION 0 @@ -1345,12 +1343,11 @@ errlHndl_t data_store_thrm_thresholds(const cmdh_fsp_cmd_t * i_cmd_ptr, cmdh_fsp_rsp_t * o_rsp_ptr) { errlHndl_t l_err = NULL; - cmdh_thrm_thresholds_t* l_cmd_ptr = (cmdh_thrm_thresholds_t*)i_cmd_ptr; uint16_t i = 0; uint16_t l_data_length = 0; uint16_t l_exp_data_length = 0; uint8_t l_frutype = 0; - cmdh_thrm_thresholds_v10_t* l_cmd2_ptr = (cmdh_thrm_thresholds_v10_t*)i_cmd_ptr; + cmdh_thrm_thresholds_v20_t* l_cmd_ptr = (cmdh_thrm_thresholds_v20_t*)i_cmd_ptr; uint8_t l_num_data_sets = 0; bool l_invalid_input = TRUE; //Assume bad input bool l_vrm_frutype = FALSE; @@ -1362,27 +1359,17 @@ errlHndl_t data_store_thrm_thresholds(const cmdh_fsp_cmd_t * i_cmd_ptr, // Sanity checks on input data, break if: // * data packet is smaller than the base size, OR // * the version doesn't match what we expect, OR - // * the actual data length does not match the expected data length. - if(l_cmd_ptr->version == DATA_THRM_THRES_VERSION_1) + // * the actual data length does not match the expected data length, OR + // * the core and quad weights are both zero. + if(l_cmd_ptr->version == DATA_THRM_THRES_VERSION_20) { l_num_data_sets = l_cmd_ptr->num_data_sets; - l_exp_data_length = THRM_THRES_BASE_DATA_SZ_1 + - (l_num_data_sets * sizeof(cmdh_thrm_thresholds_set_t)); + l_exp_data_length = THRM_THRES_BASE_DATA_SZ_20 + + (l_num_data_sets * sizeof(cmdh_thrm_thresholds_set_v20_t)); if((l_exp_data_length == l_data_length) && - (l_data_length >= THRM_THRES_BASE_DATA_SZ_1)) - { - l_invalid_input = FALSE; - } - } - else if(l_cmd_ptr->version == DATA_THRM_THRES_VERSION_10) - { - l_num_data_sets = l_cmd2_ptr->num_data_sets; - l_exp_data_length = THRM_THRES_BASE_DATA_SZ_10 + - (l_num_data_sets * sizeof(cmdh_thrm_thresholds_set_v10_t)); - - if((l_exp_data_length == l_data_length) && - (l_data_length >= THRM_THRES_BASE_DATA_SZ_10)) + (l_data_length >= THRM_THRES_BASE_DATA_SZ_20) && + (l_cmd_ptr->proc_core_weight || l_cmd_ptr->proc_quad_weight)) { l_invalid_input = FALSE; } @@ -1398,109 +1385,70 @@ errlHndl_t data_store_thrm_thresholds(const cmdh_fsp_cmd_t * i_cmd_ptr, break; } - if(l_cmd_ptr->version == DATA_THRM_THRES_VERSION_1) + // Store the base data + G_data_cnfg->thrm_thresh.version = l_cmd_ptr->version; + G_data_cnfg->thrm_thresh.proc_core_weight = l_cmd_ptr->proc_core_weight; + G_data_cnfg->thrm_thresh.proc_quad_weight = l_cmd_ptr->proc_quad_weight; + G_data_cnfg->thrm_thresh.num_data_sets = l_cmd_ptr->num_data_sets; + + // Store the FRU related data + for(i=0; i<l_cmd_ptr->num_data_sets; i++) { - // Store the base data - G_data_cnfg->thrm_thresh.version = l_cmd_ptr->version; - G_data_cnfg->thrm_thresh.fan_control_loop_time = l_cmd_ptr->fan_control_loop_time; - G_data_cnfg->thrm_thresh.num_data_sets = l_cmd_ptr->num_data_sets; + // Get the FRU type + l_frutype = l_cmd_ptr->data[i].fru_type; - // Store the FRU related data - for(i=0; i<l_cmd_ptr->num_data_sets; i++) + if((l_frutype >= 0) && (l_frutype < DATA_FRU_MAX)) { - // Get the FRU type - l_frutype = l_cmd_ptr->data[i].fru_type; - - if((l_frutype >= 0) && (l_frutype < DATA_FRU_MAX)) + // Copy FRU data + G_data_cnfg->thrm_thresh.data[l_frutype].fru_type = l_frutype; + G_data_cnfg->thrm_thresh.data[l_frutype].dvfs = l_cmd_ptr->data[i].dvfs; + G_data_cnfg->thrm_thresh.data[l_frutype].error = l_cmd_ptr->data[i].error; + G_data_cnfg->thrm_thresh.data[l_frutype].pm_dvfs = l_cmd_ptr->data[i].pm_dvfs; + G_data_cnfg->thrm_thresh.data[l_frutype].pm_error = l_cmd_ptr->data[i].pm_error; + G_data_cnfg->thrm_thresh.data[l_frutype].max_read_timeout = + l_cmd_ptr->data[i].max_read_timeout; + + // Set a local flag if we get data for VRM FRU type + if(l_frutype == DATA_FRU_VRM) { - // Copy FRU data - memcpy((void *)&G_data_cnfg->thrm_thresh.data[l_frutype], - (void *)&l_cmd_ptr->data[i], - sizeof(cmdh_thrm_thresholds_set_t)); + l_vrm_frutype = TRUE; + } // Useful trace for debugging - //CMDH_TRAC_INFO("data_store_thrm_thresholds: FRU_type[0x%.2X] T_control[%u] DVFS[%u]", + //CMDH_TRAC_INFO("data_store_thrm_thresholds: FRU_type[0x%.2X] T_control[%u] DVFS[%u] Error[%u]", // G_data_cnfg->thrm_thresh.data[l_frutype].fru_type, // G_data_cnfg->thrm_thresh.data[l_frutype].t_control, - // G_data_cnfg->thrm_thresh.data[l_frutype].dvfs); - } - else - { - // We got an invalid FRU type - CMDH_TRAC_ERR("data_store_thrm_thresholds: Received an invalid FRU type[0x%.2X] max_FRU_number[0x%.2X]", - l_frutype, - DATA_FRU_MAX); - cmdh_build_errl_rsp(i_cmd_ptr, o_rsp_ptr, ERRL_RC_INVALID_DATA, &l_err); - break; - } - } - } - else if(l_cmd_ptr->version == DATA_THRM_THRES_VERSION_10) - { - // Store the base data - G_data_cnfg->thrm_thresh.version = l_cmd2_ptr->version; - G_data_cnfg->thrm_thresh.fan_control_loop_time = 0; //Indicates not to run fan control loop - G_data_cnfg->thrm_thresh.num_data_sets = l_cmd2_ptr->num_data_sets; - - // Store the FRU related data - for(i=0; i<l_cmd2_ptr->num_data_sets; i++) - { - // Get the FRU type - l_frutype = l_cmd2_ptr->data[i].fru_type; - - if((l_frutype >= 0) && (l_frutype < DATA_FRU_MAX)) - { - // Copy FRU data - G_data_cnfg->thrm_thresh.data[l_frutype].fru_type = l_frutype; - G_data_cnfg->thrm_thresh.data[l_frutype].dvfs = l_cmd2_ptr->data[i].dvfs; - G_data_cnfg->thrm_thresh.data[l_frutype].error = l_cmd2_ptr->data[i].error; - G_data_cnfg->thrm_thresh.data[l_frutype].pm_dvfs = l_cmd2_ptr->data[i].dvfs; - G_data_cnfg->thrm_thresh.data[l_frutype].pm_error = l_cmd2_ptr->data[i].error; - G_data_cnfg->thrm_thresh.data[l_frutype].max_read_timeout = l_cmd2_ptr->data[i].max_read_timeout; - - // Set a local flag if we get data for VRM FRU type - if(l_frutype == DATA_FRU_VRM) - { - l_vrm_frutype = TRUE; - } - - // Useful trace for debugging - //CMDH_TRAC_INFO("data_store_thrm_thresholds: FRU_type[0x%.2X] T_control[%u] DVFS[%u] Error[%u]", - // G_data_cnfg->thrm_thresh.data[l_frutype].fru_type, - // G_data_cnfg->thrm_thresh.data[l_frutype].t_control, - // G_data_cnfg->thrm_thresh.data[l_frutype].dvfs, - // G_data_cnfg->thrm_thresh.data[l_frutype].error); - } - else - { - // We got an invalid FRU type - CMDH_TRAC_ERR("data_store_thrm_thresholds: Received an invalid FRU type[0x%.2X] max_FRU_number[0x%.2X]", - l_frutype, - DATA_FRU_MAX); - cmdh_build_errl_rsp(i_cmd_ptr, o_rsp_ptr, ERRL_RC_INVALID_DATA, &l_err); - break; - } - } - - // Did we get data for VRM FRU type? - if(l_vrm_frutype) - { - // Then, set a global variable so that OCC attempts to talk to - // the VRMs - G_vrm_present = 1; + // G_data_cnfg->thrm_thresh.data[l_frutype].dvfs, + // G_data_cnfg->thrm_thresh.data[l_frutype].error); } else { - // No VRM data was received, so do not attempt to talk to the VRMs. - // Also, make the error count very high so that the health - // monitor doesn't complain about VRHOT being asserted. - G_vrm_present = 0; - G_data_cnfg->thrm_thresh.data[DATA_FRU_VRM].error_count = 0xFF; - - CMDH_TRAC_IMP("data_store_thrm_thresholds: No VRM data was received! OCC won't attempt to talk to VRMs."); + // We got an invalid FRU type + CMDH_TRAC_ERR("data_store_thrm_thresholds: Received an invalid FRU type[0x%.2X] max_FRU_number[0x%.2X]", + l_frutype, + DATA_FRU_MAX); + cmdh_build_errl_rsp(i_cmd_ptr, o_rsp_ptr, ERRL_RC_INVALID_DATA, &l_err); + break; } } + // Did we get data for VRM FRU type? + if(l_vrm_frutype) + { + // Then, set a global variable so that OCC attempts to talk to + // the VRMs + G_vrm_present = 1; + } + else + { + // No VRM data was received, so do not attempt to talk to the VRMs. + // Also, make the error count very high so that the health + // monitor doesn't complain about VRHOT being asserted. + G_vrm_present = 0; + G_data_cnfg->thrm_thresh.data[DATA_FRU_VRM].error_count = 0xFF; + CMDH_TRAC_IMP("data_store_thrm_thresholds: No VRM data was received! OCC won't attempt to talk to VRMs."); + } + } while(0); if(!l_err) @@ -1508,9 +1456,6 @@ errlHndl_t data_store_thrm_thresholds(const cmdh_fsp_cmd_t * i_cmd_ptr, // If there were no errors, indicate that we got this data G_data_cnfg->data_mask |= DATA_MASK_THRM_THRESHOLDS; CMDH_TRAC_IMP("data_store_thrm_thresholds: Got valid Thermal Control Threshold data packet"); - - // Notify thermal thread to update its local copy of the thermal thresholds - THRM_thread_update_thresholds(); } return l_err; diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.h b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.h index 661eeb1..06b3ef4 100755 --- a/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.h +++ b/src/occ_405/cmdh/cmdh_fsp_cmds_datacnfg.h @@ -222,29 +222,12 @@ extern cmdh_ips_config_data_t G_ips_config_data; typedef struct __attribute__ ((packed)) { uint8_t fru_type; - uint8_t t_control; uint8_t dvfs; uint8_t error; - uint8_t pm_t_control; uint8_t pm_dvfs; uint8_t pm_error; - uint8_t acoustic_t_control; - uint8_t acoustic_dvfs; - uint8_t acoustic_error; - uint8_t warning; - uint8_t warning_reset; uint8_t error_count; - uint8_t sample_time; - uint8_t sample_error_count; uint8_t max_read_timeout; - uint16_t t_inc_zone1; - uint16_t t_inc_zone2; - uint16_t t_inc_zone3; - uint16_t t_inc_zone4; - uint16_t t_inc_zone5; - uint16_t t_inc_zone6; - uint16_t t_inc_zone7; - uint16_t t_inc_zone8; }cmdh_thrm_thresholds_set_t; // Used by TMGT to send OCC thermal control thresholds @@ -253,27 +236,40 @@ typedef struct __attribute__ ((packed)) struct cmdh_fsp_cmd_header; uint8_t format; uint8_t version; - uint8_t fan_control_loop_time; + + // Weight factor for core DTS used to calculate a core temp + uint8_t proc_core_weight; + uint8_t proc_quad_weight; + uint8_t num_data_sets; cmdh_thrm_thresholds_set_t data[DATA_FRU_MAX]; }cmdh_thrm_thresholds_t; + typedef struct __attribute__ ((packed)) { - uint8_t fru_type; - uint8_t dvfs; - uint8_t error; + uint8_t fru_type; // 0: proc, 1: centaur, 2: dimm, 3: vrm +// dvfs/pm_dvfs and error/pm_error fields define the temperature trigger +// points for DVFS/Throttling and error/FRU callouts, respectively. +// a 0xFF entry indicates that the coresponding temperature trigger +// point is undefined. + uint8_t dvfs; // OS Controlled sys/PowerVM nominal + uint8_t error; // OS Controlled sys/PowerVM nominal + uint8_t pm_dvfs; // powerVM sys + uint8_t pm_error; // powerVM sys uint8_t max_read_timeout; -}cmdh_thrm_thresholds_set_v10_t; +}cmdh_thrm_thresholds_set_v20_t; typedef struct __attribute__ ((packed)) { struct cmdh_fsp_cmd_header; uint8_t format; uint8_t version; + uint8_t proc_core_weight; + uint8_t proc_quad_weight; uint8_t num_data_sets; - cmdh_thrm_thresholds_set_v10_t data[DATA_FRU_MAX]; -}cmdh_thrm_thresholds_v10_t; + cmdh_thrm_thresholds_set_v20_t data[DATA_FRU_MAX]; +}cmdh_thrm_thresholds_v20_t; // Header data for mem cfg packet @@ -357,8 +353,8 @@ typedef struct __attribute__ ((packed)) // Used to mark present the config data TMGT has sent us. typedef struct data_cnfg { - uint32_t data_mask; - cmdh_thrm_thresholds_t thrm_thresh; + uint32_t data_mask; + cmdh_thrm_thresholds_t thrm_thresh; } data_cnfg_t; // Used by TMGT to send OCC the Vdd and Vcs uplift values |