summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormbroyles <mbroyles@us.ibm.com>2018-08-02 12:57:53 -0500
committerMartha Broyles <mbroyles@us.ibm.com>2018-08-08 09:50:52 -0500
commit1f0ae6950bfc40c5db9703e7c2e400238ed4231c (patch)
treefaf476c7e4d7513d7770c12bc829e4d36a43888f
parent17d77ae94197cc72f11e084d68414eefca7f85d1 (diff)
downloadtalos-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>
-rwxr-xr-xsrc/occ_405/amec/amec_sensors_core.c10
-rwxr-xr-xsrc/occ_405/cmdh/cmdh_dbug_cmd.c941
-rwxr-xr-xsrc/occ_405/cmdh/cmdh_dbug_cmd.h226
-rwxr-xr-xsrc/occ_405/cmdh/cmdh_fsp_cmds.c901
-rwxr-xr-xsrc/occ_405/cmdh/cmdh_fsp_cmds.h228
-rwxr-xr-xsrc/occ_405/errl/errl.h18
-rwxr-xr-xsrc/occ_405/occbuildname.c2
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
OpenPOWER on IntegriCloud