// Function Specification // // Name: dbug_proc_data_dump // // Description: Dumps the processor core data // // End Function Specification void dbug_proc_data_dump(const cmdh_fsp_cmd_t * i_cmd_ptr, cmdh_fsp_rsp_t * i_rsp_ptr) { /* TEMP -- NOT SUPPORTED (Don't have CoreData structure anymore) */ #if 0 uint16_t l_datalen = 0; uint8_t l_jj=0; // Determine the size of the data we are returning l_datalen = (sizeof(CoreData) * MAX_NUM_CORES); // Fill out the response with the data we are returning for(l_jj=0; l_jj < MAX_NUM_CORES; l_jj++) { CoreData * l_core_data_ptr = proc_get_bulk_core_data_ptr(l_jj); memcpy((void *) &(i_rsp_ptr->data[l_jj*sizeof(CoreData)]), (void *) l_core_data_ptr, sizeof(CoreData)); } // Fill out the rest of the response data i_rsp_ptr->data_length[0] = CONVERT_UINT16_UINT8_HIGH(l_datalen); i_rsp_ptr->data_length[1] = CONVERT_UINT16_UINT8_LOW(l_datalen); G_rsp_status = ERRL_RC_SUCCESS; #endif return; }
// Function Specification // // Name: amec_update_proc_core_sensors // // Description: Update all the sensors for a given proc // // Thread: RealTime Loop // // End Function Specification void amec_update_proc_core_sensors(uint8_t i_core) { gpe_bulk_core_data_t * l_core_data_ptr; int i; uint16_t l_temp16 = 0; uint32_t l_temp32 = 0; // Make sure the core is present, and that it has updated data. if(CORE_PRESENT(i_core) && CORE_UPDATED(i_core)) { // Clear flag indicating core was updated by proc task CLEAR_CORE_UPDATED(i_core); // Get pointer to core data l_core_data_ptr = proc_get_bulk_core_data_ptr(i_core); //------------------------------------------------------- // Thermal Sensors & Calc //------------------------------------------------------- amec_calc_dts_sensors(l_core_data_ptr, i_core); //------------------------------------------------------- //CPM - Commented out as requested by Malcolm // ------------------------------------------------------ // amec_calc_cpm_sensors(l_core_data_ptr, i_core); //------------------------------------------------------- // Util / Freq //------------------------------------------------------- // Skip this update if there was an empath collection error if (!CORE_EMPATH_ERROR(i_core)) { amec_calc_freq_and_util_sensors(l_core_data_ptr,i_core); } //------------------------------------------------------- // Performance counter - This function should be called // after amec_calc_freq_and_util_sensors(). //------------------------------------------------------- amec_calc_dps_util_counters(i_core); //------------------------------------------------------- // IPS //------------------------------------------------------- // Skip this update if there was an empath collection error if (!CORE_EMPATH_ERROR(i_core)) { amec_calc_ips_sensors(l_core_data_ptr,i_core); } //------------------------------------------------------- // SPURR //------------------------------------------------------- amec_calc_spurr(i_core); // ------------------------------------------------------ // Update PREVIOUS values for next time // ------------------------------------------------------ g_amec->proc[0].core[i_core].prev_PC_RAW_Th_CYCLES = l_core_data_ptr->per_thread[0].raw_cycles; // Skip empath updates if there was an empath collection error on this core if (!CORE_EMPATH_ERROR(i_core)) { g_amec->proc[0].core[i_core].prev_PC_RAW_CYCLES = l_core_data_ptr->empath.raw_cycles; g_amec->proc[0].core[i_core].prev_PC_RUN_CYCLES = l_core_data_ptr->empath.run_cycles; g_amec->proc[0].core[i_core].prev_PC_COMPLETED = l_core_data_ptr->empath.completion; g_amec->proc[0].core[i_core].prev_PC_DISPATCH = l_core_data_ptr->empath.dispatch; g_amec->proc[0].core[i_core].prev_tod_2mhz = l_core_data_ptr->empath.tod_2mhz; g_amec->proc[0].core[i_core].prev_FREQ_SENS_BUSY = l_core_data_ptr->empath.freq_sens_busy; g_amec->proc[0].core[i_core].prev_FREQ_SENS_FINISH = l_core_data_ptr->empath.freq_sens_finish; } for(i=0; i<MAX_THREADS_PER_CORE; i++) { g_amec->proc[0].core[i_core].thread[i].prev_PC_RUN_Th_CYCLES = l_core_data_ptr->per_thread[i].run_cycles; } // Final step is to update TOD sensors // Extract 32 bits with 16usec resolution l_temp32 = (uint32_t)(G_dcom_slv_inbox_doorbell_rx.tod>>13); l_temp16 = (uint16_t)(l_temp32); // low 16 bits is 16usec resolution with 512MHz TOD clock sensor_update( AMECSENSOR_PTR(TODclock0), l_temp16); l_temp16 = (uint16_t)(l_temp32>>16); // mid 16 bits is 1.05sec resolution with 512MHz TOD clock sensor_update( AMECSENSOR_PTR(TODclock1), l_temp16); l_temp16 = (uint16_t)(G_dcom_slv_inbox_doorbell_rx.tod>>45); // hi 3 bits in 0.796 day resolution with 512MHz TOD clock sensor_update( AMECSENSOR_PTR(TODclock2), l_temp16); }
// Verifies that each core is at the correct frequency after they have had // time to stabilize void amec_verify_pstate() { uint8_t l_core = 0; int8_t l_pstate_from_fmax = 0; gpe_bulk_core_data_t * l_core_data_ptr; pmc_pmsr_ffcdc_data_t l_pmc_pmsr_ffdc; errlHndl_t l_err = NULL; if ( (G_time_until_freq_check == 0) && ( CURRENT_MODE() != OCC_MODE_DYN_POWER_SAVE ) && ( CURRENT_MODE() != OCC_MODE_DYN_POWER_SAVE_FP ) && (!G_sysConfigData.system_type.kvm)) { // Reset the counter G_time_until_freq_check = FREQ_CHG_CHECK_TIME; // Convert fmax to the corresponding pstate l_pstate_from_fmax = proc_freq2pstate(g_amec->sys.fmax); for( l_core = 0; l_core < MAX_NUM_CORES; l_core++ ) { // If the core isn't present, skip it if(!CORE_PRESENT(l_core)) { l_pmc_pmsr_ffdc.pmsr_ffdc_data.data[l_core].value = 0; continue; } // Get pointer to core data l_core_data_ptr = proc_get_bulk_core_data_ptr(l_core); // Get the core's pmsr data l_pmc_pmsr_ffdc.pmsr_ffdc_data.data[l_core] = l_core_data_ptr->pcb_slave.pmsr; // Verify that the core is running at the correct frequency // If not, log an error if( (l_pstate_from_fmax != l_pmc_pmsr_ffdc.pmsr_ffdc_data.data[l_core].fields.local_pstate_actual) && (l_pstate_from_fmax > l_pmc_pmsr_ffdc.pmsr_ffdc_data.data[l_core].fields.pv_min) && (l_err == NULL) ) { TRAC_ERR("Frequency mismatch in core %d: actual_ps[%d] req_ps[%d] fmax[%d] mode[%d].", l_core, l_pmc_pmsr_ffdc.pmsr_ffdc_data.data[l_core].fields.local_pstate_actual, l_pstate_from_fmax, g_amec->sys.fmax, CURRENT_MODE()); fill_pmc_ffdc_buffer(&l_pmc_pmsr_ffdc.pmc_ffcdc_data); /* @ * @moduleid AMEC_VERIFY_FREQ_MID * @reasonCode TARGET_FREQ_FAILURE * @severity ERRL_SEV_PREDICTIVE * @userdata1 0 * @userdata2 0 * @userdata4 OCC_NO_EXTENDED_RC * @devdesc A core is not running at the expected frequency */ l_err = createErrl( AMEC_VERIFY_FREQ_MID, // i_modId, TARGET_FREQ_FAILURE, // i_reasonCode, OCC_NO_EXTENDED_RC, ERRL_SEV_UNRECOVERABLE, NULL, // i_trace, DEFAULT_TRACE_SIZE, // i_traceSz, 0, // i_userData1, 0); // i_userData2 //Add firmware callout addCalloutToErrl(l_err, ERRL_CALLOUT_TYPE_COMPONENT_ID, ERRL_COMPONENT_ID_FIRMWARE, ERRL_CALLOUT_PRIORITY_HIGH); //Add processor callout addCalloutToErrl(l_err, ERRL_CALLOUT_TYPE_HUID, G_sysConfigData.proc_huid, ERRL_CALLOUT_PRIORITY_MED); } } if( l_err != NULL) { //Add our register dump to the error log addUsrDtlsToErrl(l_err, (uint8_t*) &l_pmc_pmsr_ffdc, sizeof(l_pmc_pmsr_ffdc), ERRL_USR_DTL_STRUCT_VERSION_1, ERRL_USR_DTL_BINARY_DATA); REQUEST_RESET(l_err); } } }