diff options
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 |