void mali_gp_update_performance_counters(struct mali_gp_core *core, struct mali_gp_job *job) { u32 val0 = 0; u32 val1 = 0; u32 counter_src0 = mali_gp_job_get_perf_counter_src0(job); u32 counter_src1 = mali_gp_job_get_perf_counter_src1(job); if (MALI_HW_CORE_NO_COUNTER != counter_src0) { val0 = mali_hw_core_register_read(&core->hw_core, MALIGP2_REG_ADDR_MGMT_PERF_CNT_0_VALUE); mali_gp_job_set_perf_counter_value0(job, val0); #if defined(CONFIG_MALI400_PROFILING) _mali_osk_profiling_report_hw_counter(COUNTER_VP_0_C0, val0); #endif } if (MALI_HW_CORE_NO_COUNTER != counter_src1) { val1 = mali_hw_core_register_read(&core->hw_core, MALIGP2_REG_ADDR_MGMT_PERF_CNT_1_VALUE); mali_gp_job_set_perf_counter_value1(job, val1); #if defined(CONFIG_MALI400_PROFILING) _mali_osk_profiling_report_hw_counter(COUNTER_VP_0_C1, val1); #endif } }
static void mali_gp_post_process_job(struct mali_gp_core *core, mali_bool suspend) { MALI_ASSERT_GROUP_LOCKED(core->group); if (NULL != core->running_job) { u32 val0 = 0; u32 val1 = 0; #if MALI_TIMELINE_PROFILING_ENABLED u32 event_id; #endif #if PROFILING_PRINT_L2_HITRATE_ON_GP_FINISH { u32 src0, value0, src1, value1, sum, per_thousand, per_thousand_now, diff0, diff1; static u32 print_nr=0; static u32 prev0=0; static u32 prev1=0; if ( !(++print_nr&511) ) { mali_l2_cache_core_get_counter_values(mali_l2_cache_core_get_glob_l2_core(0), &src0, &value0, &src1, &value1); MALI_DEBUG_ASSERT( src0==20 ); MALI_DEBUG_ASSERT( src1==21 ); sum = value0+value1; if ( sum > 1000000 ) { per_thousand = value0 / (sum/1000); } else { per_thousand = (value0*1000) / (sum); } diff0 = value0-prev0; diff1 = value1-prev1; sum = diff0 + diff1 ; if ( sum > 1000000 ) { per_thousand_now = diff0 / (sum/1000); } else { per_thousand_now = (diff0*1000) / (sum); } prev0=value0; prev1=value1; if (per_thousand_now<=1000) { MALI_DEBUG_PRINT(2, ("Mali L2: Read hits/misses: %d/%d = %d thousand_parts total, since previous: %d\n", value0, value1, per_thousand, per_thousand_now)); } } } #endif if (MALI_HW_CORE_NO_COUNTER != core->counter_src0_used) { val0 = mali_hw_core_register_read(&core->hw_core, MALIGP2_REG_ADDR_MGMT_PERF_CNT_0_VALUE); if (mali_gp_job_get_perf_counter_flag(core->running_job) && _MALI_PERFORMANCE_COUNTER_FLAG_SRC0_ENABLE && mali_gp_job_get_perf_counter_src0(core->running_job) == core->counter_src0_used) { mali_gp_job_set_perf_counter_value0(core->running_job, val0); } else { mali_gp_job_set_perf_counter_value0(core->running_job, MALI_HW_CORE_INVALID_VALUE); } #if MALI_TIMELINE_PROFILING_ENABLED _mali_osk_profiling_report_hw_counter(COUNTER_VP_C0, val0); #endif } if (MALI_HW_CORE_NO_COUNTER != core->counter_src1_used) { val1 = mali_hw_core_register_read(&core->hw_core, MALIGP2_REG_ADDR_MGMT_PERF_CNT_1_VALUE); if (mali_gp_job_get_perf_counter_flag(core->running_job) && _MALI_PERFORMANCE_COUNTER_FLAG_SRC1_ENABLE && mali_gp_job_get_perf_counter_src1(core->running_job) == core->counter_src1_used) { mali_gp_job_set_perf_counter_value1(core->running_job, val1); } else { mali_gp_job_set_perf_counter_value1(core->running_job, MALI_HW_CORE_INVALID_VALUE); } #if MALI_TIMELINE_PROFILING_ENABLED _mali_osk_profiling_report_hw_counter(COUNTER_VP_C1, val1); #endif } #if MALI_TIMELINE_PROFILING_ENABLED if (MALI_TRUE == suspend) { event_id = MALI_PROFILING_EVENT_TYPE_SUSPEND|MALI_PROFILING_MAKE_EVENT_CHANNEL_GP(0); } else { event_id = MALI_PROFILING_EVENT_TYPE_STOP|MALI_PROFILING_MAKE_EVENT_CHANNEL_GP(0); } _mali_osk_profiling_add_event(event_id, val0, val1, core->counter_src0_used | (core->counter_src1_used << 8), 0, 0); #endif mali_gp_job_set_current_heap_addr(core->running_job, mali_hw_core_register_read(&core->hw_core, MALIGP2_REG_ADDR_MGMT_PLBU_ALLOC_START_ADDR)); if (MALI_TRUE != suspend) { core->running_job = NULL; _mali_osk_timer_del(core->timeout_timer); } } }
static void mali_gp_post_process_job(struct mali_gp_core *core, mali_bool suspend) { MALI_ASSERT_GROUP_LOCKED(core->group); if (NULL != core->running_job) { u32 val0 = 0; u32 val1 = 0; #if MALI_TIMELINE_PROFILING_ENABLED u32 event_id; #endif if (MALI_HW_CORE_NO_COUNTER != core->counter_src0_used) { val0 = mali_hw_core_register_read(&core->hw_core, MALIGP2_REG_ADDR_MGMT_PERF_CNT_0_VALUE); if (mali_gp_job_get_perf_counter_flag(core->running_job) && _MALI_PERFORMANCE_COUNTER_FLAG_SRC0_ENABLE && mali_gp_job_get_perf_counter_src0(core->running_job) == core->counter_src0_used) { /* We retrieved the counter that user space asked for, so return the value through the job object */ mali_gp_job_set_perf_counter_value0(core->running_job, val0); } else { /* User space asked for a counter, but this is not what we retrived (overridden by counter src set on core) */ mali_gp_job_set_perf_counter_value0(core->running_job, MALI_HW_CORE_INVALID_VALUE); } #if MALI_TIMELINE_PROFILING_ENABLED _mali_osk_profiling_report_hw_counter(COUNTER_VP_C0, val0); #endif } if (MALI_HW_CORE_NO_COUNTER != core->counter_src1_used) { val1 = mali_hw_core_register_read(&core->hw_core, MALIGP2_REG_ADDR_MGMT_PERF_CNT_1_VALUE); if (mali_gp_job_get_perf_counter_flag(core->running_job) && _MALI_PERFORMANCE_COUNTER_FLAG_SRC1_ENABLE && mali_gp_job_get_perf_counter_src1(core->running_job) == core->counter_src1_used) { /* We retrieved the counter that user space asked for, so return the value through the job object */ mali_gp_job_set_perf_counter_value1(core->running_job, val1); } else { /* User space asked for a counter, but this is not what we retrieved (overridden by counter src set on core) */ mali_gp_job_set_perf_counter_value1(core->running_job, MALI_HW_CORE_INVALID_VALUE); } #if MALI_TIMELINE_PROFILING_ENABLED _mali_osk_profiling_report_hw_counter(COUNTER_VP_C1, val1); #endif } #if MALI_TIMELINE_PROFILING_ENABLED if (MALI_TRUE == suspend) { event_id = MALI_PROFILING_EVENT_TYPE_SUSPEND|MALI_PROFILING_MAKE_EVENT_CHANNEL_GP(0); } else { event_id = MALI_PROFILING_EVENT_TYPE_STOP|MALI_PROFILING_MAKE_EVENT_CHANNEL_GP(0); } _mali_osk_profiling_add_event(event_id, val0, val1, core->counter_src0_used | (core->counter_src1_used << 8), 0, 0); #endif mali_gp_job_set_current_heap_addr(core->running_job, mali_hw_core_register_read(&core->hw_core, MALIGP2_REG_ADDR_MGMT_PLBU_ALLOC_START_ADDR)); if (MALI_TRUE != suspend) { /* We are no longer running a job... */ core->running_job = NULL; _mali_osk_timer_del(core->timeout_timer); } } }