diff options
Diffstat (limited to 'src/occ_405/cmdh/cmdh_fsp_cmds.c')
-rwxr-xr-x | src/occ_405/cmdh/cmdh_fsp_cmds.c | 901 |
1 files changed, 0 insertions, 901 deletions
diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds.c b/src/occ_405/cmdh/cmdh_fsp_cmds.c index d61874d..d98beae 100755 --- a/src/occ_405/cmdh/cmdh_fsp_cmds.c +++ b/src/occ_405/cmdh/cmdh_fsp_cmds.c @@ -32,7 +32,6 @@ #include "occ_common.h" #include "state.h" #include "cmdh_fsp_cmds.h" -#include "cmdh_dbug_cmd.h" #include "proc_pstate.h" #include "centaur_data.h" #include <amec_data.h> @@ -42,7 +41,6 @@ #include "amec_sys.h" #include "sensor.h" #include "sensor_query_list.h" -#include "chom.h" #include "amec_master_smh.h" #include <proc_data.h> #include "homer.h" @@ -60,8 +58,6 @@ extern bool G_reset_prep; extern uint16_t G_amester_max_data_length; extern uint8_t G_occ_interrupt_type; -#include <gpe_export.h> -extern gpe_shared_data_t G_shared_gpe_data; extern opal_proc_voting_reason_t G_amec_opal_proc_throt_reason; // This table contains tunable parameter information that can be exposed to @@ -103,10 +99,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}; -uint16_t G_allow_trace_flags = 0x0000; -uint32_t G_internal_flags = 0x00000000; -extern uint64_t G_inject_dimm; - ERRL_RC cmdh_poll_v20 (cmdh_fsp_rsp_t * i_rsp_ptr); @@ -1021,899 +1013,6 @@ errlHndl_t cmdh_clear_elog (const cmdh_fsp_cmd_t * i_cmd_ptr, // Function Specification // -// Name: cmdh_dbug_get_trace -// -// Description: Process get trace command -// -// End Function Specification -void cmdh_dbug_get_trace (const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr) -{ - UINT l_rc = 0; - UINT l_trace_buffer_size = CMDH_FSP_RSP_SIZE-CMDH_DBUG_FSP_RESP_LEN-8; // tmgt reserved 8 bytes - UINT16 l_trace_size = 0; - cmdh_dbug_get_trace_query_t *l_get_trace_query_ptr = (cmdh_dbug_get_trace_query_t*) i_cmd_ptr; - cmdh_dbug_get_trace_resp_t *l_get_trace_resp_ptr = (cmdh_dbug_get_trace_resp_t*) o_rsp_ptr; - - if (memcmp((char *)l_get_trace_query_ptr->comp, "GP", 2) == 0) - { - // Return a GPE0/GPE1 trace buffer - if (l_get_trace_query_ptr->comp[2] == '0') - { - if (G_shared_gpe_data.gpe0_tb_ptr != 0) - { - l_trace_size = G_shared_gpe_data.gpe0_tb_sz; - memcpy(l_get_trace_resp_ptr->data, (uint8_t*)G_shared_gpe_data.gpe0_tb_ptr, (size_t)l_trace_size); - } - } - else if (l_get_trace_query_ptr->comp[2] == '1') - { - if (G_shared_gpe_data.gpe0_tb_ptr != 0) - { - l_trace_size = G_shared_gpe_data.gpe1_tb_sz; - memcpy(l_get_trace_resp_ptr->data, (uint8_t*)G_shared_gpe_data.gpe1_tb_ptr, (size_t)l_trace_size); - } - } - else l_rc = 255; - } - else - { - // Return a 405 trace buffer - const trace_descriptor_array_t* l_trace_ptr = TRAC_get_td((char *)l_get_trace_query_ptr->comp); - l_rc = TRAC_get_buffer_partial(l_trace_ptr, l_get_trace_resp_ptr->data,&l_trace_buffer_size); - l_trace_size = l_trace_buffer_size; - } - if(l_rc==0) - { - G_rsp_status = ERRL_RC_SUCCESS; - o_rsp_ptr->data_length[0] = CONVERT_UINT16_UINT8_HIGH(l_trace_size); - o_rsp_ptr->data_length[1] = CONVERT_UINT16_UINT8_LOW(l_trace_size); - } - else - { - G_rsp_status = ERRL_RC_INTERNAL_FAIL; - o_rsp_ptr->data_length[0] = 0; - o_rsp_ptr->data_length[1] = 0; - } -} - -// Function Specification -// -// Name: cmdh_dbug_get_ame_sensor -// -// Description: Process get sensor data command -// -// End Function Specification -void cmdh_dbug_get_ame_sensor (const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr) -{ - int l_rc = ERRL_RC_SUCCESS; - uint16_t l_type = 0; - uint16_t l_location = 0; - uint16_t i = 0; - uint16_t l_resp_data_length = 0; - uint16_t l_num_of_sensors = CMDH_DBUG_MAX_NUM_SENSORS; - cmdh_dbug_get_sensor_query_t *l_cmd_ptr = (cmdh_dbug_get_sensor_query_t*) i_cmd_ptr; - cmdh_dbug_get_sensor_resp_t *l_resp_ptr = (cmdh_dbug_get_sensor_resp_t*) o_rsp_ptr; - sensorQueryList_t l_sensor_list[CMDH_DBUG_MAX_NUM_SENSORS]; - sensor_t *l_sensor_ptr = NULL; - errlHndl_t l_err = NULL; - - do - { - // Do sanity check on the function inputs - if ((NULL == i_cmd_ptr) || (NULL == o_rsp_ptr)) - { - l_rc = ERRL_RC_INTERNAL_FAIL; - break; - } - - // Capture user inputs - l_type = l_cmd_ptr->type; - l_location = l_cmd_ptr->location; - TRAC_INFO("dbug_get_ame_sensor: Type[0x%04x] Location[0x%04x]", - l_type, - l_location); - - // Initialize the arguments to query sensor list - querySensorListArg_t l_qsl_arg = { - 0, // i_startGsid - start with sensor 0x0000 - 0, // i_present - l_type, // i_type - passed by the caller - l_location, // i_loc - passed by the caller - &l_num_of_sensors, // io_numOfSensors - l_sensor_list, // o_sensors - NULL // o_sensorInfoPtr - }; - - // Get the sensors - l_err = querySensorList(&l_qsl_arg); - - if (NULL != l_err) - { - // Query failure, this should not happen - TRAC_ERR("dbug_get_ame_sensor: Failed to query sensors. Error status is: 0x%x", - l_err->iv_reasonCode); - - // Commit error log - commitErrl(&l_err); - l_rc = ERRL_RC_INTERNAL_FAIL; - break; - } - else - { - TRAC_INFO("dbug_get_ame_sensor: Numbers of sensors found[%u]", - l_num_of_sensors); - - if (l_num_of_sensors > CMDH_DBUG_MAX_NUM_SENSORS) - { - // Got too many sensors back, need to truncate the list - TRAC_INFO("dbug_get_ame_sensor: Got too many sensors back[%u]. Truncating number of sensors to %u", - l_num_of_sensors, - CMDH_DBUG_MAX_NUM_SENSORS); - - l_num_of_sensors = CMDH_DBUG_MAX_NUM_SENSORS; - } - - // Populate the response data packet - l_resp_ptr->num_sensors = l_num_of_sensors; - for (i=0; i<l_num_of_sensors; i++) - { - l_resp_ptr->sensor[i].gsid = l_sensor_list[i].gsid; - l_resp_ptr->sensor[i].sample = l_sensor_list[i].sample; - strcpy(l_resp_ptr->sensor[i].name, l_sensor_list[i].name); - - // Capture the min and max value for this sensor - l_sensor_ptr = getSensorByGsid(l_sensor_list[i].gsid); - if (l_sensor_ptr == NULL) - { - TRAC_INFO("dbug_get_ame_sensor: Didn't find sensor with gsid[0x%.4X]. Min/Max values won't be accurate.", - l_sensor_list[i].gsid); - - // Didn't find this sensor, just continue - continue; - } - l_resp_ptr->sensor[i].sample_min = l_sensor_ptr->sample_min; - l_resp_ptr->sensor[i].sample_max = l_sensor_ptr->sample_max; - l_resp_ptr->sensor[i].ipmi_sid = l_sensor_ptr->ipmi_sid; - } - } - - }while(0); - - // Populate the response data header - l_resp_data_length = sizeof(cmdh_dbug_get_sensor_resp_t) - - CMDH_DBUG_FSP_RESP_LEN; - G_rsp_status = l_rc; - o_rsp_ptr->data_length[0] = ((uint8_t *)&l_resp_data_length)[0]; - o_rsp_ptr->data_length[1] = ((uint8_t *)&l_resp_data_length)[1]; -} // end cmdh_dbug_get_ame_sensor() - - -// Function Specification -// -// Name: cmdh_dbug_peek -// -// Description: Process peek debug command -// -// End Function Specification -void cmdh_dbug_peek (const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr) -{ - cmdh_dbug_peek_t * l_cmd_ptr = (cmdh_dbug_peek_t*) i_cmd_ptr; - uint32_t l_len = l_cmd_ptr->size; - uint8_t l_type = l_cmd_ptr->type; - uint32_t l_addr = l_cmd_ptr->oci_address; - -#if PPC405_MMU_SUPPORT - static Ppc405MmuMap L_mmuMapHomer; - static Ppc405MmuMap L_mmuMapCommon; -#endif - - switch(l_type) - { - case 0x01: // OCI Direct Read - // Make sure we don't overflow our response buffer - l_len = (l_len > CMDH_FSP_RSP_DATA_SIZE ) ? CMDH_FSP_RSP_DATA_SIZE : l_len; - - // Read the data - memcpy( (void *) &o_rsp_ptr->data[0], - (void *) l_addr, - (size_t) l_len ); - break; - - case 0x02: // DMA Read - // Make sure we don't overflow our response buffer - l_len = (l_len > CMDH_FSP_RSP_DATA_SIZE ) ? CMDH_FSP_RSP_DATA_SIZE : l_len; - - // didn't do anything, respond with zero bytes - l_len = 0; - break; - - case 0x03: // Invalidate Cache - //dcache_invalidate( (void *) l_addr, l_len ); - l_len = 0; - break; - - case 0x04: // Flush Cache - dcache_flush( (void *) l_addr, l_len ); - l_len = 0; - break; -#if PPC405_MMU_SUPPORT - case 0x05: // MMU Map Mainstore - // Map mainstore to oci space so that we can peek at it - - // HOMER Image - ppc405_mmu_map(HOMER_BASE_ADDRESS, // Mainstore address (BAR0, offset 0) - HOMER_BASE_ADDRESS, // OCI address 0x0 (BAR0) - HOMER_SPACE_SIZE, // Size - 0, // TLB hi flags - 0, // TLB lo flags - &L_mmuMapHomer); // map pointer - - // COMMON Image = Communal OCC Memory Map On Node - ppc405_mmu_map(COMMON_BASE_ADDRESS, // Mainstore address (BAR2, offset 0) - COMMON_BASE_ADDRESS, // OCI address 0xA0000000 - COMMON_SPACE_SIZE, // Size - 0, // TLB hi flags - 0, // TLB lo flags - &L_mmuMapCommon); // map pointer - l_len = 0; - break; - case 0x06: // MMU UnMap Mainstore - // HOMER Image - ppc405_mmu_unmap(&L_mmuMapHomer); - - // COMMON Image = Communal OCC Memory Map On Node - ppc405_mmu_unmap(&L_mmuMapCommon); - - l_len = 0; - break; -#endif - default: - // Didn't do anything, respond with zero bytes - l_len = 0; - break; - } - - G_rsp_status = ERRL_RC_SUCCESS; - o_rsp_ptr->data_length[0] = CONVERT_UINT16_UINT8_HIGH(l_len); - o_rsp_ptr->data_length[1] = CONVERT_UINT16_UINT8_LOW(l_len); -} - - -// Function Specification -// -// Name: cmdh_dbug_get_apss_data -// -// Description: Process APSS data request -// -// End Function Specification -void cmdh_dbug_get_apss_data (const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr) -{ - uint8_t l_rc = ERRL_RC_SUCCESS; - uint16_t i = 0; - uint16_t l_resp_data_length = 0; - cmdh_dbug_apss_data_resp_t *l_resp_ptr = (cmdh_dbug_apss_data_resp_t*) o_rsp_ptr; - - do - { - // Do sanity check on the function inputs - if ((NULL == i_cmd_ptr) || (NULL == o_rsp_ptr)) - { - l_rc = ERRL_RC_INTERNAL_FAIL; - break; - } - - //Get the data for each channel individually and write it to - for (i = 0; i < MAX_APSS_ADC_CHANNELS; i++) - { - l_resp_ptr->ApssCh[i].gain = G_sysConfigData.apss_cal[i].gain; - l_resp_ptr->ApssCh[i].offset = G_sysConfigData.apss_cal[i].offset; - l_resp_ptr->ApssCh[i].raw = G_dcom_slv_inbox_rx.adc[i]; - l_resp_ptr->ApssCh[i].calculated = AMECSENSOR_PTR(PWRAPSSCH0 + i)->sample; - l_resp_ptr->ApssCh[i].func = G_apss_ch_to_function[i]; - l_resp_ptr->ApssCh[i].ipmi_sid = AMECSENSOR_PTR(PWRAPSSCH0 + i)->ipmi_sid; - - TRAC_IMP("DBG__APSS Ch[%02d]: Raw[0x%04x], Offset[0x%08x], Gain[0x%08x],", - i, l_resp_ptr->ApssCh[i].raw, l_resp_ptr->ApssCh[i].offset, l_resp_ptr->ApssCh[i].gain); - TRAC_IMP(" Pwr[0x%04x], FuncID[0x%02x], IPMI_sensorID[0x%X]", - l_resp_ptr->ApssCh[i].calculated, l_resp_ptr->ApssCh[i].func, l_resp_ptr->ApssCh[i].ipmi_sid); - } - - }while(0); - - // Populate the response data header - l_resp_data_length = sizeof(cmdh_dbug_apss_data_resp_t) - CMDH_DBUG_FSP_RESP_LEN; - G_rsp_status = l_rc; - o_rsp_ptr->data_length[0] = ((uint8_t *)&l_resp_data_length)[0]; - o_rsp_ptr->data_length[1] = ((uint8_t *)&l_resp_data_length)[1]; -} - - -// Function Specification -// -// Name: cmdh_dbug_dump_ame_sensor -// -// Description: Returns all fields (static and dynamic) for one sensor -// -// End Function Specification -void cmdh_dbug_dump_ame_sensor(const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr) -{ - const cmdh_dbug_dump_ame_sensor_cmd_t * l_cmd_ptr = (cmdh_dbug_dump_ame_sensor_cmd_t*) i_cmd_ptr; - cmdh_dbug_dump_ame_sensor_rsp_t * l_rsp_ptr = (cmdh_dbug_dump_ame_sensor_rsp_t*) o_rsp_ptr; - uint8_t l_rc = ERRL_RC_SUCCESS; // Assume succeeds - uint16_t l_resp_data_length = 0; - - // Make sure command and response pointer are valid - if ((l_cmd_ptr == NULL) || (l_rsp_ptr == NULL)) - { - l_rc = ERRL_RC_INTERNAL_FAIL; - } - else - { - // Make sure sensor gsid is valid - uint16_t l_gsid = l_cmd_ptr->gsid; - if (l_gsid >= G_amec_sensor_count) - { - l_rc = ERRL_RC_INVALID_DATA; - } - else - { - // Copy static sensor fields into response struct - memcpy(&(l_rsp_ptr->sensor_info), &(G_sensor_info[l_gsid]), sizeof(sensor_info_t)); - l_resp_data_length += sizeof(sensor_info_t); - - // Copy dynamic sensor fields into response struct - memcpy(&(l_rsp_ptr->sensor), G_amec_sensor_list[l_gsid], sizeof(sensor_t)); - l_resp_data_length += sizeof(sensor_t); - } - } - - // Populate the response data header - if (l_rsp_ptr != NULL) - { - l_rsp_ptr->data_length[0] = CONVERT_UINT16_UINT8_HIGH(l_resp_data_length); - l_rsp_ptr->data_length[1] = CONVERT_UINT16_UINT8_LOW(l_resp_data_length); - } - G_rsp_status = l_rc; -} - -// Function Specification -// -// Name: cmdh_dbug_wof_control -// -// Description: Sets the specified bit or clears all of them of wof_disabled -// -// End Function Specification -void cmdh_dbug_wof_control( const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr ) -{ - const cmdh_dbug_wof_control_cmd_t * l_cmd_ptr = (cmdh_dbug_wof_control_cmd_t*) i_cmd_ptr; - cmdh_dbug_wof_control_rsp_t * l_rsp_ptr = (cmdh_dbug_wof_control_rsp_t*) o_rsp_ptr; - uint8_t l_rc = ERRL_RC_SUCCESS; - uint16_t l_resp_data_length = sizeof(g_amec->wof.wof_disabled); - - // Do sanity check on the function inputs - if ((NULL == l_cmd_ptr) || (NULL == l_rsp_ptr)) - { - l_rc = ERRL_RC_INTERNAL_FAIL; - } - else - { - // Process action - if( l_cmd_ptr->action == SET ) - { - g_amec->wof.wof_disabled |= l_cmd_ptr->wof_rc; - } - else if( l_cmd_ptr->action == CLEAR ) - { - if(g_amec->wof.wof_disabled & WOF_RC_NO_WOF_HEADER_MASK) - { - TRAC_INFO("DEBUG - No WOF header present in memory." - " Cannot enable WOF!"); - g_amec->wof.wof_disabled = WOF_RC_NO_WOF_HEADER_MASK; - } - else - { - g_amec->wof.wof_disabled = 0x00000000; - } - } - // Fill in response data - l_rsp_ptr->wof_disabled = g_amec->wof.wof_disabled; - } - - TRAC_INFO("DEBUG - wof_disabled: 0x%08x", g_amec->wof.wof_disabled); - - // Fill in response data length - if( l_rsp_ptr != NULL ) - { - l_rsp_ptr->data_length[0] = CONVERT_UINT16_UINT8_HIGH(l_resp_data_length); - l_rsp_ptr->data_length[1] = CONVERT_UINT16_UINT8_LOW(l_resp_data_length); - } - G_rsp_status = l_rc; - return; -} - -// Function Specification -// -// Name: cmdh_dbug_dump_wof_data -// -// Description: Dumps out the contents of g_amec_sys.wof -// -// End Function Specification -void cmdh_dbug_dump_wof_data( const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr) -{ - uint16_t l_datalen = sizeof(amec_wof_t); - - // Fill in response data - memcpy((void*)&(o_rsp_ptr->data[0]), - (void*)&(g_amec->wof), - l_datalen); - - // Fill in response data length - o_rsp_ptr->data_length[0] = CONVERT_UINT16_UINT8_HIGH(l_datalen); - o_rsp_ptr->data_length[1] = CONVERT_UINT16_UINT8_LOW(l_datalen); - G_rsp_status = ERRL_RC_SUCCESS; - return; -} - -void cmdh_dbug_force_wof_reset( const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr) -{ - TRAC_INFO("DEBUG - Forcing WOF Reset"); - set_clear_wof_disabled( SET, - WOF_RC_RESET_DEBUG_CMD, - ERC_WOF_RESET_DEBUG_CMD ); - G_rsp_status = ERRL_RC_SUCCESS; -} - - - -// Function Specification -// -// Name: cmdh_dbug_allow_trace -// -// Description: Set/Clear flags that allow/prevent certain traces to appear -// -// End Function Specification -void cmdh_dbug_allow_trace( const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr ) -{ - const cmdh_dbug_allow_trace_cmd_t * l_cmd_ptr = - (cmdh_dbug_allow_trace_cmd_t*)i_cmd_ptr; - cmdh_dbug_allow_trace_rsp_t * l_rsp_ptr = - (cmdh_dbug_allow_trace_rsp_t*)o_rsp_ptr; - - uint8_t l_rc = ERRL_RC_SUCCESS; - uint16_t l_resp_data_length = sizeof(G_allow_trace_flags); - - if((NULL == l_cmd_ptr) || (NULL == l_rsp_ptr)) - { - l_rc = ERRL_RC_INTERNAL_FAIL; - } - else - { - if( l_cmd_ptr->action == SET ) - { - G_allow_trace_flags |= l_cmd_ptr->trace_flags; - } - else - { - G_allow_trace_flags = 0x0000; - } - } - - TRAC_INFO("DEBUG - allow_trace FLAGS 0x%04x Action: %d", - G_allow_trace_flags, - l_cmd_ptr->action); - - // fill in response data length - if( l_rsp_ptr != NULL ) - { - l_rsp_ptr->data_length[0] = CONVERT_UINT16_UINT8_HIGH(l_resp_data_length); - l_rsp_ptr->data_length[1] = CONVERT_UINT16_UINT8_LOW(l_resp_data_length); - } - G_rsp_status = l_rc; - return; -} - - - -// Function Specification -// -// Name: cmdh_dbug_dimm_inject -// -// Description: Set/Clear internal debug flags -// -// End Function Specification -void cmdh_dbug_dimm_inject( const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr ) -{ - const cmdh_dbug_dimm_inject_cmd_t * l_cmd_ptr = - (cmdh_dbug_dimm_inject_cmd_t*)i_cmd_ptr; - cmdh_dbug_dimm_inject_rsp_t * l_rsp_ptr = - (cmdh_dbug_dimm_inject_rsp_t*)o_rsp_ptr; - - uint8_t l_rc = ERRL_RC_SUCCESS; - // confirm inject data length (ignore sub_command byte) - const uint16_t inject_length = CMDH_DATALEN_FIELD_UINT16(l_cmd_ptr) - 1; - - if((NULL == l_cmd_ptr) || (NULL == l_rsp_ptr)) - { - l_rc = ERRL_RC_INTERNAL_FAIL; - } - // Command Length Check - else if ((inject_length != 0) && (inject_length != MAX_NUM_CENTAURS)) - { - TRAC_ERR("cmdh_dbug_dimm_inject: Invalid inject data length %u (expected %u)", - inject_length, MAX_NUM_CENTAURS); - l_rc = ERRL_RC_INVALID_CMD_LEN; - } - else - { - if (inject_length == MAX_NUM_CENTAURS) - { - TRAC_INFO("cmdh_dbug_dimm_inject: updating DIMM inject mask from 0x%08X.%08X to 0x%08X.%08X", - G_inject_dimm >> 32, G_inject_dimm & 0xFFFFFFFF, - l_cmd_ptr->inject_mask >> 32, l_cmd_ptr->inject_mask & 0xFFFFFFFF); - G_inject_dimm = l_cmd_ptr->inject_mask; - - unsigned int l_cent; - for(l_cent = 0; l_cent < MAX_NUM_CENTAURS; l_cent++) - { - uint8_t dimms = (G_inject_dimm >> (l_cent*8)) & 0xFF; - if (dimms != 0) - { - unsigned int k; - for(k=0; k < NUM_DIMMS_PER_CENTAUR; k++) - { - if (dimms & (1 << k)) - { - if(!CENTAUR_SENSOR_ENABLED(l_cent, k)) - { - TRAC_ERR("cmdh_dbug_dimm_inject: centaur%d DIMM%d is not enabled", l_cent, k); - } - } - } - } - } - } - // else just return current values - - // Return the current DIMM inject mask - if( l_rsp_ptr != NULL ) - { - l_rsp_ptr->data_length[0] = 0x00; - l_rsp_ptr->data_length[1] = MAX_NUM_CENTAURS; - memcpy(&o_rsp_ptr->data[0], &G_inject_dimm, MAX_NUM_CENTAURS); - } - } - G_rsp_status = l_rc; - return; -} - - - -// Function Specification -// -// Name: cmdh_dbug_internal_flags -// -// Description: Set/Clear internal debug flags -// -// End Function Specification -void cmdh_dbug_internal_flags( const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr ) -{ - const cmdh_dbug_internal_flags_cmd_t * l_cmd_ptr = - (cmdh_dbug_internal_flags_cmd_t*)i_cmd_ptr; - cmdh_dbug_internal_flags_rsp_t * l_rsp_ptr = - (cmdh_dbug_internal_flags_rsp_t*)o_rsp_ptr; - - uint8_t l_rc = ERRL_RC_SUCCESS; - const unsigned int flag_size = sizeof(G_internal_flags); - // data length (ignore sub_command byte) - const uint16_t data_length = CMDH_DATALEN_FIELD_UINT16(l_cmd_ptr) - 1; - - if ((NULL == l_cmd_ptr) || (NULL == l_rsp_ptr)) - { - l_rc = ERRL_RC_INTERNAL_FAIL; - } - else if ((data_length != 0) && (data_length != flag_size)) - { - TRAC_ERR("cmdh_dbug_dimm_inject: Invalid internal flags length %u (expected %u)", - data_length, flag_size); - l_rc = ERRL_RC_INVALID_CMD_LEN; - } - else - { - if (data_length == flag_size) - { - TRAC_INFO("DEBUG - updating internal flags from 0x%08X to 0x%08X", - G_internal_flags, l_cmd_ptr->flags); - - G_internal_flags = l_cmd_ptr->flags; - } - - // always respond with the current flag value - if( l_rsp_ptr != NULL ) - { - l_rsp_ptr->data_length[0] = 0x00; - l_rsp_ptr->data_length[1] = flag_size; - // Fill in response data - memcpy(&o_rsp_ptr->data[0], &G_internal_flags, flag_size); - } - } - - G_rsp_status = l_rc; - return; -} - - - -// Function Specification -// -// Name: cmdh_dbug_clear_ame_sensor -// -// Description: Clears minimum and maximum fields in one sensor. -// Returns all dynamic sensor fields after the clear. -// -// End Function Specification -void cmdh_dbug_clear_ame_sensor(const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr) -{ - const cmdh_dbug_clear_ame_sensor_cmd_t * l_cmd_ptr = (cmdh_dbug_clear_ame_sensor_cmd_t*) i_cmd_ptr; - cmdh_dbug_clear_ame_sensor_rsp_t * l_rsp_ptr = (cmdh_dbug_clear_ame_sensor_rsp_t*) o_rsp_ptr; - uint8_t l_rc = ERRL_RC_SUCCESS; // Assume succeeds - uint16_t l_resp_data_length = 0; - - // Make sure command and response pointer are valid - if ((l_cmd_ptr == NULL) || (l_rsp_ptr == NULL)) - { - l_rc = ERRL_RC_INTERNAL_FAIL; - } - else - { - // Make sure sensor gsid is valid - uint16_t l_gsid = l_cmd_ptr->gsid; - if (l_gsid >= G_amec_sensor_count) - { - l_rc = ERRL_RC_INVALID_DATA; - } - else - { - // Clear specified min/max fields in sensor - AMEC_SENSOR_CLEAR_TYPE l_clear_type = (AMEC_SENSOR_CLEAR_TYPE) l_cmd_ptr->clear_type; - sensor_clear_minmax(G_amec_sensor_list[l_gsid], l_clear_type); - - // Copy dynamic sensor fields (after clear) into response struct - memcpy(&(l_rsp_ptr->sensor), G_amec_sensor_list[l_gsid], sizeof(sensor_t)); - l_resp_data_length += sizeof(sensor_t); - } - } - - // Populate the response data header - if (l_rsp_ptr != NULL) - { - l_rsp_ptr->data_length[0] = CONVERT_UINT16_UINT8_HIGH(l_resp_data_length); - l_rsp_ptr->data_length[1] = CONVERT_UINT16_UINT8_LOW(l_resp_data_length); - } - G_rsp_status = l_rc; -} - -void cmdh_dump_gpu_timings(void) -{ - extern gpuTimingTable_t G_gpu_tick_times; - int i = 0; - - for( ; i < MAX_NUM_GPU_PER_DOMAIN; i++) - { - TRAC_INFO("=======================================GPU%d===================================================", i); - TRAC_INFO("| Max Avg 1s count 100ms count <100ms count|"); - TRAC_INFO("| Core Temperatures %-5d msecs %-5d msecs %-5d %-5d %-5d", - G_gpu_tick_times.coretemp[i].max, - G_gpu_tick_times.coretemp[i].avg, - G_gpu_tick_times.coretemp[i].count_1s, - G_gpu_tick_times.coretemp[i].count_100ms, - G_gpu_tick_times.coretemp[i].count_lt100ms); - TRAC_INFO("| Mem Temperatures %-5d msecs %-5d msecs %-5d %-5d %-5d", - G_gpu_tick_times.memtemp[i].max, - G_gpu_tick_times.memtemp[i].avg, - G_gpu_tick_times.memtemp[i].count_1s, - G_gpu_tick_times.memtemp[i].count_100ms, - G_gpu_tick_times.memtemp[i].count_lt100ms); - TRAC_INFO("| Check Driver Loaded %-5d msecs %-5d msecs %-5d %-5d %-5d", - G_gpu_tick_times.checkdriver[i].max, - G_gpu_tick_times.checkdriver[i].avg, - G_gpu_tick_times.checkdriver[i].count_1s, - G_gpu_tick_times.checkdriver[i].count_100ms, - G_gpu_tick_times.checkdriver[i].count_lt100ms); - TRAC_INFO("| Mem Capabilities %-5d msecs %-5d msecs %-5d %-5d %-5d", - G_gpu_tick_times.capabilities[i].max, - G_gpu_tick_times.capabilities[i].avg, - G_gpu_tick_times.capabilities[i].count_1s, - G_gpu_tick_times.capabilities[i].count_100ms, - G_gpu_tick_times.capabilities[i].count_lt100ms); - TRAC_INFO("| Read Power Policy %-5d msecs %-5d msecs %-5d %-5d %-5d", - G_gpu_tick_times.getpcap[i].max, - G_gpu_tick_times.getpcap[i].avg, - G_gpu_tick_times.getpcap[i].count_1s, - G_gpu_tick_times.getpcap[i].count_100ms, - G_gpu_tick_times.getpcap[i].count_lt100ms); - TRAC_INFO("| Set Power Cap %-5d msecs %-5d msecs %-5d %-5d %-5d", - G_gpu_tick_times.setpcap[i].max, - G_gpu_tick_times.setpcap[i].avg, - G_gpu_tick_times.setpcap[i].count_1s, - G_gpu_tick_times.setpcap[i].count_100ms, - G_gpu_tick_times.setpcap[i].count_lt100ms); - TRAC_INFO("==============================================================================================", i); - } -} - -// Function Specification -// -// Name: dbug_parse_cmd -// -// Description: Process debug commands -// -// End Function Specification -void cmdh_dbug_cmd (const cmdh_fsp_cmd_t * i_cmd_ptr, - cmdh_fsp_rsp_t * o_rsp_ptr) -{ - uint8_t l_rc = 0; - uint8_t l_sub_cmd = 0; - errl_generic_resp_t * l_err_rsp_ptr = (errl_generic_resp_t *) o_rsp_ptr; - errlHndl_t l_errl = NULL; - cmdhDbugCmdArg_t l_cmdh_dbug_args; - - // Sub Command for debug is always first byte of data - l_sub_cmd = i_cmd_ptr->data[0]; - - /// Tracing based on Debug Sub-Command - switch (l_sub_cmd) - { - // ---------------------------------------------------- - // NOTE: This for for TRACING only, any actual command - // handling goes in the switch statement below. - // ---------------------------------------------------- - case DBUG_GET_TRACE: - case DBUG_GET_AME_SENSOR: - // Don't trace that we got these debug commands, they happen too - // often, or are not destructive when they do occur. - break; - - default: - // Trace the rest of the debug commands. - TRAC_INFO("Debug Command: Sub:0x%02x\n", l_sub_cmd); - - break; - } - - // Act on Debug Sub-Command - switch ( l_sub_cmd ) - { - case DBUG_DUMP_GPU_TIMINGS: - cmdh_dump_gpu_timings(); - break; - - case DBUG_GET_AME_SENSOR: - cmdh_dbug_get_ame_sensor(i_cmd_ptr, o_rsp_ptr); - break; - - case DBUG_FSP_ATTN: - break; - - case DBUG_GET_TRACE: - // Get trace buffer SRAM address - cmdh_dbug_get_trace(i_cmd_ptr, o_rsp_ptr); - break; - - case DBUG_CLEAR_TRACE: - // Call clear trace function - TRAC_reset_buf(); - G_rsp_status = ERRL_RC_SUCCESS; - break; - - case DBUG_PEEK: - cmdh_dbug_peek(i_cmd_ptr, o_rsp_ptr); - break; - - case DBUG_FLUSH_DCACHE: - dcache_flush_all(); - break; - - case DBUG_GEN_CHOM_LOG: - chom_force_gen_log(); - break; - - case DBUG_WOF_CONTROL: - cmdh_dbug_wof_control(i_cmd_ptr, o_rsp_ptr); - break; - - case DBUG_DUMP_WOF_DATA: - cmdh_dbug_dump_wof_data(i_cmd_ptr, o_rsp_ptr); - break; - - case DBUG_FORCE_WOF_RESET: - cmdh_dbug_force_wof_reset(i_cmd_ptr, o_rsp_ptr); - break; - - case DBUG_ALLOW_TRACE: - cmdh_dbug_allow_trace( i_cmd_ptr, o_rsp_ptr ); - break; - - case DBUG_DIMM_INJECT: - cmdh_dbug_dimm_inject( i_cmd_ptr, o_rsp_ptr ); - break; - - case DBUG_INTERNAL_FLAGS: - cmdh_dbug_internal_flags( i_cmd_ptr, o_rsp_ptr ); - break; - - case DBUG_POKE: - case DBUG_SET_PEXE_EVENT: - case DBUG_DUMP_THEMAL: - case DBUG_DUMP_POWER: - case DBUG_DUMP_RAW_AD: - case DBUG_MEM_PWR_CTL: - case DBUG_PERFCOUNT: - case DBUG_TEST_INTF: - case DBUG_INJECT_ERRL: - case DBUG_GPIO_READ: - case DBUG_CALCULATE_MAX_DIFF: - case DBUG_FORCE_ELOG: - case DBUG_SWITCH_PHASE: - case DBUG_INJECT_ERR: - case DBUG_VERIFY_V_F: - case DBUG_DUMP_PPM_DATA: - case DBUG_CENTAUR_SENSOR_CACHE: - case DBUG_DUMP_PROC_DATA: - - l_cmdh_dbug_args.i_cmd_ptr = (cmdh_fsp_cmd_t *) i_cmd_ptr; - l_cmdh_dbug_args.io_rsp_ptr = o_rsp_ptr; - - l_errl = cmdhDbugCmd(&l_cmdh_dbug_args); - - if(NULL != l_errl) - { - TRAC_ERR("Debug command returned error: RC: 0x%x", l_errl->iv_reasonCode); - commitErrl( &l_errl ); - } - break; - - case DBUG_DUMP_APSS_DATA: - cmdh_dbug_get_apss_data(i_cmd_ptr, o_rsp_ptr); - break; - - case DBUG_DUMP_AME_SENSOR: - cmdh_dbug_dump_ame_sensor(i_cmd_ptr, o_rsp_ptr); - break; - - case DBUG_CLEAR_AME_SENSOR: - cmdh_dbug_clear_ame_sensor(i_cmd_ptr, o_rsp_ptr); - break; - - default: - l_rc = ERRL_RC_INVALID_DATA; //should NEVER get here... - break; - } //end switch - - // We don't do errors in DBUG, as a safety check make sure the response is valid. - if ( l_rc ) - { - G_rsp_status = l_rc; - l_err_rsp_ptr->data_length[0] = 0; - l_err_rsp_ptr->data_length[1] = 1; - } - - return; -} - -// Function Specification -// // Name: SMGR_base_setmodestate_cmdh // // Description: Process set mode and state command |