diff options
author | mbroyles <mbroyles@us.ibm.com> | 2018-08-02 12:57:53 -0500 |
---|---|---|
committer | Martha Broyles <mbroyles@us.ibm.com> | 2018-08-08 09:50:52 -0500 |
commit | 1f0ae6950bfc40c5db9703e7c2e400238ed4231c (patch) | |
tree | faf476c7e4d7513d7770c12bc829e4d36a43888f /src | |
parent | 17d77ae94197cc72f11e084d68414eefca7f85d1 (diff) | |
download | talos-occ-1f0ae6950bfc40c5db9703e7c2e400238ed4231c.tar.gz talos-occ-1f0ae6950bfc40c5db9703e7c2e400238ed4231c.zip |
Debug command updates
Add voltage droop history counters for call home
Change-Id: Ia859388b49386dc132c9d0407ce831a9fa9ef592
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/63807
Reviewed-by: Christopher J. Cain <cjcain@us.ibm.com>
Reviewed-by: William A. Bryan <wilbryan@us.ibm.com>
Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
Tested-by: Martha Broyles <mbroyles@us.ibm.com>
Diffstat (limited to 'src')
-rwxr-xr-x | src/occ_405/amec/amec_sensors_core.c | 10 | ||||
-rwxr-xr-x | src/occ_405/cmdh/cmdh_dbug_cmd.c | 941 | ||||
-rwxr-xr-x | src/occ_405/cmdh/cmdh_dbug_cmd.h | 226 | ||||
-rwxr-xr-x | src/occ_405/cmdh/cmdh_fsp_cmds.c | 901 | ||||
-rwxr-xr-x | src/occ_405/cmdh/cmdh_fsp_cmds.h | 228 | ||||
-rwxr-xr-x | src/occ_405/errl/errl.h | 18 | ||||
-rwxr-xr-x | src/occ_405/occbuildname.c | 2 |
7 files changed, 1151 insertions, 1175 deletions
diff --git a/src/occ_405/amec/amec_sensors_core.c b/src/occ_405/amec/amec_sensors_core.c index 2dbeb15..bab908a 100755 --- a/src/occ_405/amec/amec_sensors_core.c +++ b/src/occ_405/amec/amec_sensors_core.c @@ -876,6 +876,16 @@ void amec_calc_droop_sensors(CoreData * i_core_data_ptr, uint8_t i_core) sensor_update( l_core_sensor, l_core_droops); sensor_update( l_quad_sensor, l_quad_droops); + + // Update ERRH counters so it is known voltage droops are happening in call home data + if(l_core_droops) + { + INCREMENT_ERR_HISTORY(ERRH_CORE_SMALL_DROOP); + } + if(l_quad_droops) + { + INCREMENT_ERR_HISTORY(ERRH_CACHE_LARGE_DROOP); + } } /*----------------------------------------------------------------------------*/ diff --git a/src/occ_405/cmdh/cmdh_dbug_cmd.c b/src/occ_405/cmdh/cmdh_dbug_cmd.c index ac030ae..ac5aa91 100755 --- a/src/occ_405/cmdh/cmdh_dbug_cmd.c +++ b/src/occ_405/cmdh/cmdh_dbug_cmd.c @@ -38,11 +38,20 @@ #include <centaur_data.h> #include <proc_data.h> #include <apss.h> +#include <gpe_export.h> +#include "sensor_query_list.h" +#include "amec_sys.h" #include "centaur_mem_data.h" +#include "dcom.h" +#include "chom.h" +#include "wof.h" +#include "gpu.h" //*************************************************************************/ // Externs //*************************************************************************/ +extern uint64_t G_inject_dimm; +extern gpe_shared_data_t G_shared_gpe_data; //*************************************************************************/ // Macros @@ -59,6 +68,12 @@ //*************************************************************************/ // Globals //*************************************************************************/ +uint16_t G_allow_trace_flags = 0x0000; +uint32_t G_internal_flags = 0x00000000; + +// SSX Block Copy Request for copying data from HOMER to SRAM +BceRequest G_debug_pba_request; +DMA_BUFFER(uint8_t G_debug_dma_buffer[CMDH_DEBUG_DMA_READ_SIZE]) = {0}; //*************************************************************************/ // Function Prototypes @@ -70,6 +85,788 @@ // 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->address; + int l_ssxrc = SSX_OK; + +#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 address is 128 byte aligned required for block copy + if(l_addr % 128) + { + TRAC_ERR("cmdh_dbug_peek: Address 0x%08X is not 128 byte aligned", l_addr); + // no error handling for debug just respond with 0 bytes + l_len = 0; + } + else + { + // only 1 length is supported by the OCC + // ignore input length and set length to CMDH_DEBUG_DMA_READ_SIZE + l_len = CMDH_DEBUG_DMA_READ_SIZE; + + // Copy data from main memory to SRAM + // Set up a copy request + l_ssxrc = bce_request_create(&G_debug_pba_request, // block copy object + &G_pba_bcde_queue, // mainstore to sram copy engine + l_addr, // mainstore address + (uint32_t)&G_debug_dma_buffer, // sram starting address + l_len, // size of copy + SSX_SECONDS(1), // timeout + NULL, // no call back + NULL, // no call back arguments + ASYNC_REQUEST_BLOCKING); // blocking request + + if(l_ssxrc != SSX_OK) + { + TRAC_ERR("cmdh_dbug_peek: BCDE request create failure rc=[%08X]", -l_ssxrc); + // no error handling for debug just respond with 0 bytes + l_len = 0; + } + else + { + // Do actual copying + l_ssxrc = bce_request_schedule(&G_debug_pba_request); + + if(l_ssxrc != SSX_OK) + { + TRAC_ERR("cmdh_dbug_peek: BCE request schedule failure rc=[%08X]", -l_ssxrc); + // no error handling for debug just respond with 0 bytes + l_len = 0; + } + else + { + // Copy to response buffer + memcpy((void *) &o_rsp_ptr->data[0], + &G_debug_dma_buffer, + l_len); + } + } + } // else address is 128 byte aligned + + 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_err_inject // // Description: Injects an error @@ -237,68 +1034,128 @@ void dbug_proc_data_dump(const cmdh_fsp_cmd_t * i_cmd_ptr, // Function Specification // -// Name: cmdhDbugCmd +// Name: dbug_parse_cmd // -// Description: Entry-point for CMDH Debug Commands +// Description: Process debug commands +// Error logs are not generated for debug commands // // End Function Specification -errlHndl_t cmdhDbugCmd(void * i_arg) +void cmdh_dbug_cmd (const cmdh_fsp_cmd_t * i_cmd_ptr, + cmdh_fsp_rsp_t * o_rsp_ptr) { - errlHndl_t l_errl = NULL; - cmdhDbugCmdArg_t * l_arg = (cmdhDbugCmdArg_t *) i_arg; - cmdh_fsp_cmd_t * l_cmd_ptr = l_arg->i_cmd_ptr; - cmdh_fsp_rsp_t * l_rsp_ptr = l_arg->io_rsp_ptr; - uint8_t l_sub_cmd = 0; - // Sub Command for debug is always first byte of data - l_sub_cmd = l_cmd_ptr->data[0]; + uint8_t l_sub_cmd = i_cmd_ptr->data[0]; - // Trace that a debug command was run - TRAC_INFO("Debug Command: Sub:0x%02x\n", l_sub_cmd); + /// 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; - // Build up a successful default response - G_rsp_status = ERRL_RC_SUCCESS; - l_rsp_ptr->data_length[0] = 0; - l_rsp_ptr->data_length[1] = 0; + default: + // Trace the rest of the debug commands. + TRAC_INFO("Debug Command: Sub:0x%02x\n", l_sub_cmd); - switch (l_sub_cmd) + break; + } + + // Act on Debug Sub-Command + switch ( l_sub_cmd ) { - case DBUG_INJECT_ERRL: - dbug_err_inject(l_cmd_ptr, l_rsp_ptr); + case DBUG_DUMP_WOF_DATA: + cmdh_dbug_dump_wof_data(i_cmd_ptr, o_rsp_ptr); break; - case DBUG_CENTAUR_SENSOR_CACHE: - dbug_centaur_dump(l_cmd_ptr, l_rsp_ptr); - break; + case DBUG_FORCE_WOF_RESET: + cmdh_dbug_force_wof_reset(i_cmd_ptr, o_rsp_ptr); + 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(); + break; + + case DBUG_ALLOW_TRACE: + cmdh_dbug_allow_trace( i_cmd_ptr, o_rsp_ptr ); + break; + + case DBUG_GET_AME_SENSOR: + cmdh_dbug_get_ame_sensor(i_cmd_ptr, o_rsp_ptr); + break; + + case DBUG_DUMP_GPU_TIMINGS: + cmdh_dump_gpu_timings(); + break; + + case DBUG_PEEK: + cmdh_dbug_peek(i_cmd_ptr, o_rsp_ptr); + break; case DBUG_DUMP_RAW_AD: - dbug_apss_dump(l_cmd_ptr, l_rsp_ptr); + dbug_apss_dump(i_cmd_ptr, o_rsp_ptr); + break; + + case DBUG_INJECT_ERRL: + dbug_err_inject(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_FLUSH_DCACHE: + dcache_flush_all(); + break; + + case DBUG_CENTAUR_SENSOR_CACHE: + dbug_centaur_dump(i_cmd_ptr, o_rsp_ptr); break; case DBUG_DUMP_PROC_DATA: - dbug_proc_data_dump(l_cmd_ptr, l_rsp_ptr); + dbug_proc_data_dump(i_cmd_ptr, o_rsp_ptr); break; - case DBUG_POKE: // Can't allow in trusted - case DBUG_GET_TRACE: - case DBUG_CLEAR_TRACE: - case DBUG_SET_PEXE_EVENT: - case DBUG_DUMP_THEMAL: - case DBUG_DUMP_POWER: - case DBUG_MEM_PWR_CTL: - case DBUG_PERFCOUNT: - case DBUG_TEST_INTF: - 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_GEN_CHOM_LOG: + chom_force_gen_log(); + 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; + + case DBUG_WOF_CONTROL: + cmdh_dbug_wof_control(i_cmd_ptr, o_rsp_ptr); + break; + default: + TRAC_ERR("cmdh_dbug_cmd: Debug sub command 0x%02X not valid", l_sub_cmd); G_rsp_status = ERRL_RC_INVALID_DATA; break; - } + } //end switch - return l_errl; + return; } diff --git a/src/occ_405/cmdh/cmdh_dbug_cmd.h b/src/occ_405/cmdh/cmdh_dbug_cmd.h index fa5074d..198ffe7 100755 --- a/src/occ_405/cmdh/cmdh_dbug_cmd.h +++ b/src/occ_405/cmdh/cmdh_dbug_cmd.h @@ -44,18 +44,103 @@ //*************************************************************************/ // Defines/Enums //*************************************************************************/ +///Max string length of trace component name +#define OCC_TRACE_NAME_SIZE 4 + +// Size of data returned for debug DMA read +#define CMDH_DEBUG_DMA_READ_SIZE 1024 + +// Enum of the various Debug commands that may be sent to OCC +// over the TMGT<->OCC interface. This is the first byte of data in the debug command +typedef enum +{ + DBUG_DUMP_WOF_DATA = 0x01, + DBUG_FORCE_WOF_RESET = 0x02, + DBUG_GET_TRACE = 0x03, + DBUG_CLEAR_TRACE = 0x04, + DBUG_ALLOW_TRACE = 0x05, +// free = 0x06, + DBUG_GET_AME_SENSOR = 0x07, + DBUG_DUMP_GPU_TIMINGS = 0x08, + DBUG_PEEK = 0x09, +// free = 0x0A, +// free = 0x0B, +// free = 0x0C, + DBUG_DUMP_RAW_AD = 0x0D, +// free = 0x0E, +// free = 0x0F, +// free = 0x10, +// free = 0x11, +// free = 0x12 +// free = 0x13 + DBUG_INJECT_ERRL = 0x14, + DBUG_DIMM_INJECT = 0x15, +// free = 0x16 +// free = 0x17, +// free = 0x18, +// free = 0x19, +// free = 0x1A, +// free = 0x1B, +// free = 0x1C, +// free = 0x1D, +// free = 0x1E, + DBUG_INTERNAL_FLAGS = 0x1F, + DBUG_FLUSH_DCACHE = 0x20, +// free = 0x21, + DBUG_CENTAUR_SENSOR_CACHE = 0x22, + DBUG_DUMP_PROC_DATA = 0x23, + DBUG_GEN_CHOM_LOG = 0x24, + DBUG_DUMP_APSS_DATA = 0x25, + DBUG_DUMP_AME_SENSOR = 0x26, + DBUG_CLEAR_AME_SENSOR = 0x27, + DBUG_WOF_CONTROL = 0x28 +} DBUG_CMD; //*************************************************************************/ // Structures //*************************************************************************/ -// Structure that is passed into cmdhDbugcmd function -// when it is called -typedef struct + +// Used by OCC tool to get trace, version 0. +typedef struct __attribute__ ((packed)) { - cmdh_fsp_cmd_t * i_cmd_ptr; - cmdh_fsp_rsp_t * io_rsp_ptr; -} cmdhDbugCmdArg_t; + struct cmdh_fsp_cmd_header; + int8_t sub_cmd; + int16_t size_request; + int8_t comp[OCC_TRACE_NAME_SIZE]; +}cmdh_dbug_get_trace_query_t; +// Used by OCC to response "get trace" cmd, version 0. +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_rsp_header; + uint8_t data[0]; +}cmdh_dbug_get_trace_resp_t; + +#define CMDH_DBUG_GET_TRACE_RESP_LEN 6 // size_request(2) and occ_comp_sram_offset(4) + +// Used by occtool to get AME sensor data +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_cmd_header; + uint8_t sub_cmd; + uint16_t type; + uint16_t location; +}cmdh_dbug_get_sensor_query_t; + +// Max number of sensors that can be returned with cmdh_dbug_get_ame_sensor command +#define CMDH_DBUG_MAX_NUM_SENSORS 50 +// Size of standard response header (5 bytes) plus checksum (2 bytes) +#define CMDH_DBUG_FSP_RESP_LEN 7 + +// Used by OCC firmware to respond "cmdh_dbug_get_ame_sensor" debug command +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_rsp_header; + uint16_t num_sensors; + cmdh_dbug_sensor_list_t sensor[CMDH_DBUG_MAX_NUM_SENSORS]; + uint8_t filler; + uint16_t checksum; +}cmdh_dbug_get_sensor_resp_t; /** * struct cmdh_dbug_inject_errl_query_t; @@ -68,6 +153,134 @@ typedef struct __attribute__ ((packed)) char comp[OCC_TRACE_NAME_SIZE]; }cmdh_dbug_inject_errl_query_t; +// Used by OCC to debug on real hardware +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_cmd_header; + uint8_t sub_cmd; + uint8_t type; + uint16_t size; + uint32_t address; +}cmdh_dbug_peek_t; + +typedef struct __attribute__ ((packed)) +{ + uint8_t func; + uint16_t raw; + uint16_t calculated; + uint32_t ipmi_sid; + uint32_t offset; + uint32_t gain; +}cmdh_dbug_apss_data_t; + +// Used to get the APSS raw values +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_rsp_header; + cmdh_dbug_apss_data_t ApssCh[MAX_APSS_ADC_CHANNELS]; + uint8_t checksum[2]; +} cmdh_dbug_apss_data_resp_t; + +// DBUG_DUMP_AME_SENSOR command struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_cmd_header; // Standard command header + uint8_t sub_cmd; // Debug sub-command + uint16_t gsid; // Global Sensor ID +} cmdh_dbug_dump_ame_sensor_cmd_t; + +// DBUG_DUMP_AME_SENSOR response struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_rsp_header; // Standard response header + sensor_info_t sensor_info; // Static sensor fields + sensor_t sensor; // Dynamic sensor fields + uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; // Checksum +} cmdh_dbug_dump_ame_sensor_rsp_t; + +// DBUG_CLEAR_AME_SENSOR command struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_cmd_header; // Standard command header + uint8_t sub_cmd; // Debug sub-command + uint16_t gsid; // Global Sensor ID + uint16_t clear_type; // Fields to clear (AMEC_SENSOR_CLEAR_TYPE) +} cmdh_dbug_clear_ame_sensor_cmd_t; + +// DBUG_CLEAR_AME_SENSOR response struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_rsp_header; // Standard response header + sensor_t sensor; // Dynamic sensor fields + uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; // Checksum +} cmdh_dbug_clear_ame_sensor_rsp_t; + +// DBUG_WOF_CONTROL command struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_cmd_header; // Standard command header + uint8_t sub_cmd; // Debug sub-command + uint8_t action; // CLEAR(0) or SET(1) + uint32_t wof_rc; // Bit to set +} cmdh_dbug_wof_control_cmd_t; + +// DBUG_WOF_CONTROL response struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_rsp_header; + uint32_t wof_disabled; + uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; +} cmdh_dbug_wof_control_rsp_t; + +// DBUG_ALLOW_TRACE command struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_cmd_header; + uint8_t sub_cmd; + uint8_t action; + uint16_t trace_flags; +}cmdh_dbug_allow_trace_cmd_t; + +// DBUG_ALLOW_TRACE response struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_rsp_header; + uint16_t trace_flags; + uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; +}cmdh_dbug_allow_trace_rsp_t; + +// DBUG_DIMM_INJECT command struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_cmd_header; + uint8_t sub_cmd; + uint64_t inject_mask; +}cmdh_dbug_dimm_inject_cmd_t; + +// DBUG_DIMM_INJECT response struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_rsp_header; + uint64_t inject_mask; + uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; +}cmdh_dbug_dimm_inject_rsp_t; + +// DBUG_INTERNAL_FLAGS command struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_cmd_header; + uint8_t sub_cmd; + uint32_t flags; +}cmdh_dbug_internal_flags_cmd_t; + +// DBUG_INTERNAL_FLAGS response struct +typedef struct __attribute__ ((packed)) +{ + struct cmdh_fsp_rsp_header; + uint32_t flags; + uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; +}cmdh_dbug_internal_flags_rsp_t; + //************************************************************************* // Globals //************************************************************************* @@ -75,7 +288,6 @@ typedef struct __attribute__ ((packed)) //************************************************************************* // Function Prototypes //************************************************************************* -errlHndl_t cmdhDbugCmd(void * i_arg); //************************************************************************* // Functions 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 diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds.h b/src/occ_405/cmdh/cmdh_fsp_cmds.h index 1f1caa9..23d1355 100755 --- a/src/occ_405/cmdh/cmdh_fsp_cmds.h +++ b/src/occ_405/cmdh/cmdh_fsp_cmds.h @@ -365,84 +365,13 @@ typedef struct __attribute__ ((packed)) cmdh_reset_prep }cmdh_reset_prep_t; //--------------------------------------------------------- -// Debug Command +// Get Field Debug Data //--------------------------------------------------------- -///Max string length of trace component name -#define OCC_TRACE_NAME_SIZE 4 - -// Enum of the various Debug commands that may be sent to OCC -// over the TMGT<->OCC interface. -typedef enum -{ - DBUG_DUMP_WOF_DATA = 0x01, - DBUG_FORCE_WOF_RESET = 0x02, - DBUG_GET_TRACE = 0x03, - DBUG_CLEAR_TRACE = 0x04, - DBUG_ALLOW_TRACE = 0x05, - DBUG_SET_PEXE_EVENT = 0x06, - DBUG_GET_AME_SENSOR = 0x07, - DBUG_DUMP_GPU_TIMINGS = 0x08, - DBUG_PEEK = 0x09, - DBUG_POKE = 0x0A, - DBUG_DUMP_THEMAL = 0x0B, - DBUG_DUMP_POWER = 0x0C, - DBUG_DUMP_RAW_AD = 0x0D, - DBUG_DVFS_SLEW = 0x0E, - DBUG_MEM_PWR_CTL = 0x0F, - DBUG_PERFCOUNT = 0x10, - DBUG_TEST_INTF = 0x11, - // free = 0x12 - // free = 0x13 - DBUG_INJECT_ERRL = 0x14, - DBUG_DIMM_INJECT = 0x15, - // free = 0x16 - DBUG_GPIO_READ = 0x17, - DBUG_FSP_ATTN = 0x18, - DBUG_CALCULATE_MAX_DIFF = 0x19, - DBUG_FORCE_ELOG = 0x1A, - DBUG_SWITCH_PHASE = 0x1B, - DBUG_INJECT_ERR = 0x1C, - DBUG_VERIFY_V_F = 0x1D, - DBUG_DUMP_PPM_DATA = 0x1E, - DBUG_INTERNAL_FLAGS = 0x1F, - DBUG_FLUSH_DCACHE = 0x20, - DBUG_INVALIDATE_DCACHE = 0x21, - DBUG_CENTAUR_SENSOR_CACHE = 0x22, - DBUG_DUMP_PROC_DATA = 0x23, - DBUG_GEN_CHOM_LOG = 0x24, - DBUG_DUMP_APSS_DATA = 0x25, - DBUG_DUMP_AME_SENSOR = 0x26, - DBUG_CLEAR_AME_SENSOR = 0x27, - DBUG_WOF_CONTROL = 0x28 -} DBUG_CMD; - -// Used by OCC tool to get trace, version 0. -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_cmd_header; - int8_t sub_cmd; - int16_t size_request; - int8_t comp[OCC_TRACE_NAME_SIZE]; -}cmdh_dbug_get_trace_query_t; - -// Used by OCC to response "get trace" cmd, version 0. -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_rsp_header; - uint8_t data[0]; -}cmdh_dbug_get_trace_resp_t; - -#define CMDH_DBUG_GET_TRACE_RESP_LEN 6 // size_request(2) and occ_comp_sram_offset(4) - -// Used by occtool to get AME sensor data -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_cmd_header; - uint8_t sub_cmd; - uint16_t type; - uint16_t location; -}cmdh_dbug_get_sensor_query_t; +// Size of trace data for a trace buffer +#define CMDH_FIELD_TRACE_DATA_SIZE 1024 +// Max number of sensors for field debug data +#define CMDH_FIELD_MAX_NUM_SENSORS 50 typedef struct cmdh_dbug_sensor_list { @@ -454,26 +383,6 @@ typedef struct cmdh_dbug_sensor_list uint32_t ipmi_sid; }cmdh_dbug_sensor_list_t; -// Max number of sensors that can be returned with cmdh_dbug_get_ame_sensor command -#define CMDH_DBUG_MAX_NUM_SENSORS 50 -// Size of standard response header (5 bytes) plus checksum (2 bytes) -#define CMDH_DBUG_FSP_RESP_LEN 7 - -// Used by OCC firmware to respond "cmdh_dbug_get_ame_sensor" debug command -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_rsp_header; - uint16_t num_sensors; - cmdh_dbug_sensor_list_t sensor[CMDH_DBUG_MAX_NUM_SENSORS]; - uint8_t filler; - uint16_t checksum; -}cmdh_dbug_get_sensor_resp_t; - -// Size of trace data for a trace buffer -#define CMDH_FIELD_TRACE_DATA_SIZE 1024 -// Max number of sensors for field debug data -#define CMDH_FIELD_MAX_NUM_SENSORS 50 - // Used by OCC to response "GET_FIELD_DEBUG_DATA" cmd typedef struct __attribute__ ((packed)) { @@ -503,133 +412,6 @@ typedef struct __attribute__ ((packed)) uint8_t version; }cmdh_get_field_debug_data_query_t; -// Used by OCC to debug on real hardware -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_cmd_header; - uint8_t sub_cmd; - uint8_t type; - uint16_t size; - uint32_t oci_address; -}cmdh_dbug_peek_t; - -typedef struct __attribute__ ((packed)) -{ - uint8_t func; - uint16_t raw; - uint16_t calculated; - uint32_t ipmi_sid; - uint32_t offset; - uint32_t gain; -}cmdh_dbug_apss_data_t; - -// Used to get the APSS raw values -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_rsp_header; - cmdh_dbug_apss_data_t ApssCh[MAX_APSS_ADC_CHANNELS]; - uint8_t checksum[2]; -} cmdh_dbug_apss_data_resp_t; - -// DBUG_DUMP_AME_SENSOR command struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_cmd_header; // Standard command header - uint8_t sub_cmd; // Debug sub-command - uint16_t gsid; // Global Sensor ID -} cmdh_dbug_dump_ame_sensor_cmd_t; - -// DBUG_DUMP_AME_SENSOR response struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_rsp_header; // Standard response header - sensor_info_t sensor_info; // Static sensor fields - sensor_t sensor; // Dynamic sensor fields - uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; // Checksum -} cmdh_dbug_dump_ame_sensor_rsp_t; - -// DBUG_CLEAR_AME_SENSOR command struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_cmd_header; // Standard command header - uint8_t sub_cmd; // Debug sub-command - uint16_t gsid; // Global Sensor ID - uint16_t clear_type; // Fields to clear (AMEC_SENSOR_CLEAR_TYPE) -} cmdh_dbug_clear_ame_sensor_cmd_t; - -// DBUG_CLEAR_AME_SENSOR response struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_rsp_header; // Standard response header - sensor_t sensor; // Dynamic sensor fields - uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; // Checksum -} cmdh_dbug_clear_ame_sensor_rsp_t; - -// DBUG_WOF_CONTROL command struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_cmd_header; // Standard command header - uint8_t sub_cmd; // Debug sub-command - uint8_t action; // CLEAR(0) or SET(1) - uint32_t wof_rc; // Bit to set -} cmdh_dbug_wof_control_cmd_t; - -// DBUG_WOF_CONTROL response struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_rsp_header; - uint32_t wof_disabled; - uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; -} cmdh_dbug_wof_control_rsp_t; - -// DBUG_ALLOW_TRACE command struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_cmd_header; - uint8_t sub_cmd; - uint8_t action; - uint16_t trace_flags; -}cmdh_dbug_allow_trace_cmd_t; - -// DBUG_ALLOW_TRACE response struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_rsp_header; - uint16_t trace_flags; - uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; -}cmdh_dbug_allow_trace_rsp_t; - -// DBUG_DIMM_INJECT command struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_cmd_header; - uint8_t sub_cmd; - uint64_t inject_mask; -}cmdh_dbug_dimm_inject_cmd_t; - -// DBUG_DIMM_INJECT response struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_rsp_header; - uint64_t inject_mask; - uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; -}cmdh_dbug_dimm_inject_rsp_t; - -// DBUG_INTERNAL_FLAGS command struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_cmd_header; - uint8_t sub_cmd; - uint32_t flags; -}cmdh_dbug_internal_flags_cmd_t; - -// DBUG_INTERNAL_FLAGS response struct -typedef struct __attribute__ ((packed)) -{ - struct cmdh_fsp_rsp_header; - uint32_t flags; - uint8_t checksum[CMDH_FSP_CHECKSUM_SIZE]; -}cmdh_dbug_internal_flags_rsp_t; //--------------------------------------------------------- // Tunable Parameter Command diff --git a/src/occ_405/errl/errl.h b/src/occ_405/errl/errl.h index cd6e3bb..9a5b178 100755 --- a/src/occ_405/errl/errl.h +++ b/src/occ_405/errl/errl.h @@ -301,7 +301,23 @@ typedef enum { ERRH_WOF_CONTROL_TIMEOUT_IGNORED = 0x1D, ERRH_PSTATE_CHANGE_IGNORED = 0x1E, ERRH_VDD_CURRENT_ROLLOVER_MAX = 0x1F, - ERR_HISTORY_SIZE = 0x20 + ERRH_CORE_SMALL_DROOP = 0x20, + ERRH_CACHE_LARGE_DROOP = 0x21, + ERRH_RESERVED22 = 0x22, + ERRH_RESERVED23 = 0x23, + ERRH_RESERVED24 = 0x24, + ERRH_RESERVED25 = 0x25, + ERRH_RESERVED26 = 0x26, + ERRH_RESERVED27 = 0x27, + ERRH_RESERVED28 = 0x28, + ERRH_RESERVED29 = 0x29, + ERRH_RESERVED2A = 0x2A, + ERRH_RESERVED2B = 0x2B, + ERRH_RESERVED2C = 0x2C, + ERRH_RESERVED2D = 0x2D, + ERRH_RESERVED2E = 0x2E, + ERRH_RESERVED2F = 0x2F, + ERR_HISTORY_SIZE = 0x30 } ERR_HISTORY_INDEX; // Array of error counters that are only cleared on OCC reset diff --git a/src/occ_405/occbuildname.c b/src/occ_405/occbuildname.c index 376e72b..0dd172a 100755 --- a/src/occ_405/occbuildname.c +++ b/src/occ_405/occbuildname.c @@ -34,6 +34,6 @@ volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) = #else -volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) = /*<BuildName>*/ "op_occ_180802a\0" /*</BuildName>*/ ; +volatile const char G_occ_buildname[16] __attribute__((section(".buildname"))) = /*<BuildName>*/ "op_occ_180807a\0" /*</BuildName>*/ ; #endif |