/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2020 MediaTek Inc. */ #undef TRACE_SYSTEM #define TRACE_SYSTEM mtk_thermal #if !defined(_TRACE_MTK_THERMAL_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_MTK_THERMAL_H #include #if IS_ENABLED(CONFIG_MTK_MD_THERMAL) #include "md_cooling.h" #endif #include "thermal_interface.h" #include "thermal_trace_local.h" #if IS_ENABLED(CONFIG_MTK_MD_THERMAL) TRACE_DEFINE_ENUM(MD_LV_THROTTLE_DISABLED); TRACE_DEFINE_ENUM(MD_SCG_OFF); TRACE_DEFINE_ENUM(MD_LV_THROTTLE_ENABLED); TRACE_DEFINE_ENUM(MD_IMS_ONLY); TRACE_DEFINE_ENUM(MD_NO_IMS); TRACE_DEFINE_ENUM(MD_OFF); #define show_md_status(status) \ __print_symbolic(status, \ { MD_LV_THROTTLE_DISABLED, "LV_THROTTLE_DISABLED"}, \ { MD_SCG_OFF, "SCG_OFF"}, \ { MD_LV_THROTTLE_ENABLED, "LV_THROTTLE_ENABLED"}, \ { MD_IMS_ONLY, "IMS_ONLY"}, \ { MD_NO_IMS, "NO_IMS"}, \ { MD_OFF, "MD_OFF"}) TRACE_EVENT(md_mutt_limit, TP_PROTO(struct md_cooling_device *md_cdev, enum md_cooling_status status), TP_ARGS(md_cdev, status), TP_STRUCT__entry( __field(unsigned long, state) __field(unsigned int, id) __field(enum md_cooling_status, status) ), TP_fast_assign( __entry->state = md_cdev->target_state; __entry->id = md_cdev->pa_id; __entry->status = status; ), TP_printk("mutt_lv=%ld pa_id=%d status=%s", __entry->state, __entry->id, show_md_status(__entry->status)) ); TRACE_EVENT(md_tx_pwr_limit, TP_PROTO(struct md_cooling_device *md_cdev, enum md_cooling_status status), TP_ARGS(md_cdev, status), TP_STRUCT__entry( __field(unsigned long, state) __field(unsigned int, pwr) __field(unsigned int, id) __field(enum md_cooling_status, status) ), TP_fast_assign( __entry->state = md_cdev->target_state; __entry->pwr = md_cdev->throttle_tx_power[md_cdev->target_state]; __entry->id = md_cdev->pa_id; __entry->status = status; ), TP_printk("tx_pwr_lv=%lu tx_pwr=%d pa_id=%d status=%s", __entry->state, __entry->pwr, __entry->id, show_md_status(__entry->status)) ); TRACE_EVENT(md_scg_off, TP_PROTO(struct md_cooling_device *md_cdev, enum md_cooling_status status), TP_ARGS(md_cdev, status), TP_STRUCT__entry( __field(unsigned long, off) __field(unsigned int, id) __field(enum md_cooling_status, status) ), TP_fast_assign( __entry->off = md_cdev->target_state; __entry->id = md_cdev->pa_id; __entry->status = status; ), TP_printk("scg_off=%ld pa_id=%d status=%s", __entry->off, __entry->id, show_md_status(__entry->status)) ); #endif /* CONFIG_MTK_MD_THERMAL */ TRACE_EVENT(network_tput, TP_PROTO(unsigned int md_tput, unsigned int wifi_tput), TP_ARGS(md_tput, wifi_tput), TP_STRUCT__entry( __field(unsigned int, md_tput) __field(unsigned int, wifi_tput) ), TP_fast_assign( __entry->md_tput = md_tput; __entry->wifi_tput = wifi_tput; ), TP_printk("MD_Tput=%d Wifi_Tput=%d (Kb/s)", __entry->md_tput, __entry->wifi_tput) ); TRACE_EVENT(thermal_cpu, TP_PROTO(struct thermal_cpu_info *cpu), TP_ARGS(cpu), TP_STRUCT__entry( __field(int, ttj) __field(int, limit_powerbudget) __field(int, LL_min_opp_hint) __field(unsigned int, LL_cur_freq) __field(unsigned int, LL_limit_freq) __field(int, LL_limit_opp) __field(int, LL_max_temp) __field(int, BL_min_opp_hint) __field(unsigned int, BL_cur_freq) __field(unsigned int, BL_limit_freq) __field(int, BL_limit_opp) __field(int, BL_max_temp) __field(int, B_min_opp_hint) __field(unsigned int, B_cur_freq) __field(unsigned int, B_limit_freq) __field(int, B_limit_opp) __field(int, B_max_temp) ), TP_fast_assign( __entry->ttj = cpu->ttj; __entry->limit_powerbudget = cpu->limit_powerbudget; __entry->LL_min_opp_hint = cpu->LL_min_opp_hint; __entry->LL_cur_freq = cpu->LL_cur_freq; __entry->LL_limit_freq = cpu->LL_limit_freq; __entry->LL_limit_opp = cpu->LL_limit_opp; __entry->LL_max_temp = cpu->LL_max_temp; __entry->BL_min_opp_hint = cpu->BL_min_opp_hint; __entry->BL_cur_freq = cpu->BL_cur_freq; __entry->BL_limit_freq = cpu->BL_limit_freq; __entry->BL_limit_opp = cpu->BL_limit_opp; __entry->BL_max_temp = cpu->BL_max_temp; __entry->B_min_opp_hint = cpu->B_min_opp_hint; __entry->B_cur_freq = cpu->B_cur_freq; __entry->B_limit_freq = cpu->B_limit_freq; __entry->B_limit_opp = cpu->B_limit_opp; __entry->B_max_temp = cpu->B_max_temp; ), TP_printk("ttj=%d limit_pb=%d LL_min_opp_h=%d LL_cur_freq=%d LL_limit_freq=%d LL_limit_opp=%d LL_max_t=%d BL_min_opp_h=%d BL_cur_freq=%d BL_limit_freq=%d BL_limit_opp=%d BL_max_t=%d B_min_opp_h=%d B_cur_freq=%d B_limit_freq=%d B_limit_opp=%d B_max_t=%d", __entry->ttj, __entry->limit_powerbudget, __entry->LL_min_opp_hint, __entry->LL_cur_freq, __entry->LL_limit_freq, __entry->LL_limit_opp, __entry->LL_max_temp, __entry->BL_min_opp_hint, __entry->BL_cur_freq, __entry->BL_limit_freq, __entry->BL_limit_opp, __entry->BL_max_temp, __entry->B_min_opp_hint, __entry->B_cur_freq, __entry->B_limit_freq, __entry->B_limit_opp, __entry->B_max_temp) ); TRACE_EVENT(thermal_gpu, TP_PROTO(struct thermal_gpu_info *gpu), TP_ARGS(gpu), TP_STRUCT__entry( __field(int, ttj) __field(int, limit_powerbudget) __field(int, temp) __field(int, temp_noinvalid) __field(int, vtskin) __field(unsigned int, ppm_limiter) __field(unsigned int, limit_freq) __field(unsigned int, cur_freq) __field(unsigned int, ppm_limit_freq) ), TP_fast_assign( __entry->ttj = gpu->ttj; __entry->limit_powerbudget = gpu->limit_powerbudget; __entry->temp = gpu->temp; __entry->temp_noinvalid = gpu->temp_noinvalid; __entry->vtskin = gpu->vtskin; __entry->limit_freq = gpu->limit_freq; __entry->cur_freq = gpu->cur_freq; __entry->ppm_limiter = gpu->ppm_limiter; __entry->ppm_limit_freq = gpu->ppm_limit_freq; ), TP_printk("ttj=%d limit_pb=%d t=%d t2=%d limit_freq=%d cur_freq=%d ppm_limiter=%d ppm_limit_freq=%d vtskin=%d", __entry->ttj, __entry->limit_powerbudget, __entry->temp, __entry->temp_noinvalid, __entry->limit_freq, __entry->cur_freq, __entry->ppm_limiter, __entry->ppm_limit_freq, __entry->vtskin) ); TRACE_EVENT(thermal_apu, TP_PROTO(struct thermal_apu_info *apu), TP_ARGS(apu), TP_STRUCT__entry( __field(int, ttj) __field(int, limit_powerbudget) __field(int, temp) __field(int, limit_opp) __field(int, cur_opp) ), TP_fast_assign( __entry->ttj = apu->ttj; __entry->limit_powerbudget = apu->limit_powerbudget; __entry->temp = apu->temp; __entry->limit_opp = apu->limit_opp; __entry->cur_opp = apu->cur_opp; ), TP_printk("ttj=%d limit_pb=%d t=%d limit_opp=%d cur_opp=%d", __entry->ttj, __entry->limit_powerbudget, __entry->temp, __entry->limit_opp, __entry->cur_opp) ); TRACE_EVENT(cpu_hr_info_0, TP_PROTO(struct headroom_info *c0, struct headroom_info *c1, struct headroom_info *c2, struct headroom_info *c3), TP_ARGS(c0, c1, c2, c3), TP_STRUCT__entry( __field(int, cpu0_temp) __field(int, cpu0_pdt_temp) __field(int, cpu0_headroom) __field(int, cpu0_ratio) __field(int, cpu1_temp) __field(int, cpu1_pdt_temp) __field(int, cpu1_headroom) __field(int, cpu1_ratio) __field(int, cpu2_temp) __field(int, cpu2_pdt_temp) __field(int, cpu2_headroom) __field(int, cpu2_ratio) __field(int, cpu3_temp) __field(int, cpu3_pdt_temp) __field(int, cpu3_headroom) __field(int, cpu3_ratio) ), TP_fast_assign( __entry->cpu0_temp = c0->temp; __entry->cpu0_pdt_temp = c0->predict_temp; __entry->cpu0_headroom = c0->headroom; __entry->cpu0_ratio = c0->ratio; __entry->cpu1_temp = c1->temp; __entry->cpu1_pdt_temp = c1->predict_temp; __entry->cpu1_headroom = c1->headroom; __entry->cpu1_ratio = c1->ratio; __entry->cpu2_temp = c2->temp; __entry->cpu2_pdt_temp = c2->predict_temp; __entry->cpu2_headroom = c2->headroom; __entry->cpu2_ratio = c2->ratio; __entry->cpu3_temp = c3->temp; __entry->cpu3_pdt_temp = c3->predict_temp; __entry->cpu3_headroom = c3->headroom; __entry->cpu3_ratio = c3->ratio; ), TP_printk("0t=%d 0p=%d 0h=%d 0r=%d 1t=%d 1p=%d 1h=%d 1r=%d 2t=%d 2p=%d 2h=%d 2r=%d 3t=%d 3p=%d 3h=%d 3r=%d", __entry->cpu0_temp, __entry->cpu0_pdt_temp, __entry->cpu0_headroom, __entry->cpu0_ratio, __entry->cpu1_temp, __entry->cpu1_pdt_temp, __entry->cpu1_headroom, __entry->cpu1_ratio, __entry->cpu2_temp, __entry->cpu2_pdt_temp, __entry->cpu2_headroom, __entry->cpu2_ratio, __entry->cpu3_temp, __entry->cpu3_pdt_temp, __entry->cpu3_headroom, __entry->cpu3_ratio) ); TRACE_EVENT(cpu_hr_info_1, TP_PROTO(struct headroom_info *c0, struct headroom_info *c1, struct headroom_info *c2, struct headroom_info *c3), TP_ARGS(c0, c1, c2, c3), TP_STRUCT__entry( __field(int, cpu0_temp) __field(int, cpu0_pdt_temp) __field(int, cpu0_headroom) __field(int, cpu0_ratio) __field(int, cpu1_temp) __field(int, cpu1_pdt_temp) __field(int, cpu1_headroom) __field(int, cpu1_ratio) __field(int, cpu2_temp) __field(int, cpu2_pdt_temp) __field(int, cpu2_headroom) __field(int, cpu2_ratio) __field(int, cpu3_temp) __field(int, cpu3_pdt_temp) __field(int, cpu3_headroom) __field(int, cpu3_ratio) ), TP_fast_assign( __entry->cpu0_temp = c0->temp; __entry->cpu0_pdt_temp = c0->predict_temp; __entry->cpu0_headroom = c0->headroom; __entry->cpu0_ratio = c0->ratio; __entry->cpu1_temp = c1->temp; __entry->cpu1_pdt_temp = c1->predict_temp; __entry->cpu1_headroom = c1->headroom; __entry->cpu1_ratio = c1->ratio; __entry->cpu2_temp = c2->temp; __entry->cpu2_pdt_temp = c2->predict_temp; __entry->cpu2_headroom = c2->headroom; __entry->cpu2_ratio = c2->ratio; __entry->cpu3_temp = c3->temp; __entry->cpu3_pdt_temp = c3->predict_temp; __entry->cpu3_headroom = c3->headroom; __entry->cpu3_ratio = c3->ratio; ), TP_printk("4t=%d 4p=%d 4h=%d 4r=%d 5t=%d 5p=%d 5h=%d 5r=%d 6t=%d 6p=%d 6h=%d 6r=%d 7t=%d 7p=%d 7h=%d 7r=%d", __entry->cpu0_temp, __entry->cpu0_pdt_temp, __entry->cpu0_headroom, __entry->cpu0_ratio, __entry->cpu1_temp, __entry->cpu1_pdt_temp, __entry->cpu1_headroom, __entry->cpu1_ratio, __entry->cpu2_temp, __entry->cpu2_pdt_temp, __entry->cpu2_headroom, __entry->cpu2_ratio, __entry->cpu3_temp, __entry->cpu3_pdt_temp, __entry->cpu3_headroom, __entry->cpu3_ratio) ); TRACE_EVENT(frs, TP_PROTO(struct frs_info *frs), TP_ARGS(frs), TP_STRUCT__entry( __field(int, pid) __field(int, target_fps) __field(int, diff) __field(int, tpcb) __field(int, tpcb_slope) __field(int, ap_headroom) __field(int, n_sec_to_ttpcb) ), TP_fast_assign( __entry->pid = frs->pid; __entry->target_fps = frs->target_fps; __entry->diff = frs->diff; __entry->tpcb = frs->tpcb; __entry->tpcb_slope = frs->tpcb_slope; __entry->ap_headroom = frs->ap_headroom; __entry->n_sec_to_ttpcb = frs->n_sec_to_ttpcb; ), TP_printk("pid=%d target_fps=%d diff=%d tpcb=%d tpcb_slope=%d ap_headroom=%d target_n=%d", __entry->pid, __entry->target_fps, __entry->diff, __entry->tpcb, __entry->tpcb_slope, __entry->ap_headroom, __entry->n_sec_to_ttpcb) ); #if IS_ENABLED(CONFIG_MTK_THERMAL_JATM) TRACE_EVENT(jatm_enable, TP_PROTO(int jatm_budget), TP_ARGS(jatm_budget), TP_STRUCT__entry( __field(int, jatm_budget) ), TP_fast_assign( __entry->jatm_budget = jatm_budget; ), TP_printk("jatm enabled and remaining budget=%d", __entry->jatm_budget) ); TRACE_EVENT(jatm_disable, TP_PROTO(int reason, int frame_length, int real_usage, int jatm_budget), TP_ARGS(reason, frame_length, real_usage, jatm_budget), TP_STRUCT__entry( __field(int, reason) __field(int, frame_length) __field(int, real_usage) __field(int, jatm_budget) ), TP_fast_assign( __entry->reason = reason; __entry->frame_length = frame_length; __entry->real_usage = real_usage; __entry->jatm_budget = jatm_budget; ), TP_printk("stop reason=%d, frame_length=%d, real_usage=%d, remaining=%d", __entry->reason, __entry->frame_length, __entry->real_usage, __entry->jatm_budget) ); TRACE_EVENT(not_start_reason, TP_PROTO(int reason), TP_ARGS(reason), TP_STRUCT__entry( __field(int, reason) ), TP_fast_assign( __entry->reason = reason; ), TP_printk("jatm not start reason=%d", __entry->reason) ); TRACE_EVENT(try_enable_jatm, TP_PROTO(int elapsed, int delay), TP_ARGS(elapsed, delay), TP_STRUCT__entry( __field(int, elapsed) __field(int, delay) ), TP_fast_assign( __entry->elapsed = elapsed; __entry->delay = delay; ), TP_printk("Try to enable JATM after %d ms and delay start %d ms", __entry->elapsed, __entry->delay) ); #endif #endif /* _TRACE_MTK_THERMAL_H */ /* This part must be outside protection */ #undef TRACE_INCLUDE_PATH #undef TRACE_INCLUDE_FILE #define TRACE_INCLUDE_PATH . #define TRACE_INCLUDE_FILE thermal_trace #include