1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM thermal 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_THERMAL_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_THERMAL_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/devfreq.h> 9*4882a593Smuzhiyun #include <linux/thermal.h> 10*4882a593Smuzhiyun #include <linux/tracepoint.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun TRACE_DEFINE_ENUM(THERMAL_TRIP_CRITICAL); 13*4882a593Smuzhiyun TRACE_DEFINE_ENUM(THERMAL_TRIP_HOT); 14*4882a593Smuzhiyun TRACE_DEFINE_ENUM(THERMAL_TRIP_PASSIVE); 15*4882a593Smuzhiyun TRACE_DEFINE_ENUM(THERMAL_TRIP_ACTIVE); 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define show_tzt_type(type) \ 18*4882a593Smuzhiyun __print_symbolic(type, \ 19*4882a593Smuzhiyun { THERMAL_TRIP_CRITICAL, "CRITICAL"}, \ 20*4882a593Smuzhiyun { THERMAL_TRIP_HOT, "HOT"}, \ 21*4882a593Smuzhiyun { THERMAL_TRIP_PASSIVE, "PASSIVE"}, \ 22*4882a593Smuzhiyun { THERMAL_TRIP_ACTIVE, "ACTIVE"}) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun TRACE_EVENT(thermal_temperature, 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun TP_PROTO(struct thermal_zone_device *tz), 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun TP_ARGS(tz), 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun TP_STRUCT__entry( 31*4882a593Smuzhiyun __string(thermal_zone, tz->type) 32*4882a593Smuzhiyun __field(int, id) 33*4882a593Smuzhiyun __field(int, temp_prev) 34*4882a593Smuzhiyun __field(int, temp) 35*4882a593Smuzhiyun ), 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun TP_fast_assign( 38*4882a593Smuzhiyun __assign_str(thermal_zone, tz->type); 39*4882a593Smuzhiyun __entry->id = tz->id; 40*4882a593Smuzhiyun __entry->temp_prev = tz->last_temperature; 41*4882a593Smuzhiyun __entry->temp = tz->temperature; 42*4882a593Smuzhiyun ), 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun TP_printk("thermal_zone=%s id=%d temp_prev=%d temp=%d", 45*4882a593Smuzhiyun __get_str(thermal_zone), __entry->id, __entry->temp_prev, 46*4882a593Smuzhiyun __entry->temp) 47*4882a593Smuzhiyun ); 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun TRACE_EVENT(cdev_update, 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun TP_PROTO(struct thermal_cooling_device *cdev, unsigned long target), 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun TP_ARGS(cdev, target), 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun TP_STRUCT__entry( 56*4882a593Smuzhiyun __string(type, cdev->type) 57*4882a593Smuzhiyun __field(unsigned long, target) 58*4882a593Smuzhiyun ), 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun TP_fast_assign( 61*4882a593Smuzhiyun __assign_str(type, cdev->type); 62*4882a593Smuzhiyun __entry->target = target; 63*4882a593Smuzhiyun ), 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun TP_printk("type=%s target=%lu", __get_str(type), __entry->target) 66*4882a593Smuzhiyun ); 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun TRACE_EVENT(thermal_zone_trip, 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun TP_PROTO(struct thermal_zone_device *tz, int trip, 71*4882a593Smuzhiyun enum thermal_trip_type trip_type), 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun TP_ARGS(tz, trip, trip_type), 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun TP_STRUCT__entry( 76*4882a593Smuzhiyun __string(thermal_zone, tz->type) 77*4882a593Smuzhiyun __field(int, id) 78*4882a593Smuzhiyun __field(int, trip) 79*4882a593Smuzhiyun __field(enum thermal_trip_type, trip_type) 80*4882a593Smuzhiyun ), 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun TP_fast_assign( 83*4882a593Smuzhiyun __assign_str(thermal_zone, tz->type); 84*4882a593Smuzhiyun __entry->id = tz->id; 85*4882a593Smuzhiyun __entry->trip = trip; 86*4882a593Smuzhiyun __entry->trip_type = trip_type; 87*4882a593Smuzhiyun ), 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun TP_printk("thermal_zone=%s id=%d trip=%d trip_type=%s", 90*4882a593Smuzhiyun __get_str(thermal_zone), __entry->id, __entry->trip, 91*4882a593Smuzhiyun show_tzt_type(__entry->trip_type)) 92*4882a593Smuzhiyun ); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #ifdef CONFIG_CPU_THERMAL 95*4882a593Smuzhiyun TRACE_EVENT(thermal_power_cpu_get_power, 96*4882a593Smuzhiyun TP_PROTO(const struct cpumask *cpus, unsigned long freq, u32 *load, 97*4882a593Smuzhiyun size_t load_len, u32 dynamic_power), 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun TP_ARGS(cpus, freq, load, load_len, dynamic_power), 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun TP_STRUCT__entry( 102*4882a593Smuzhiyun __bitmask(cpumask, num_possible_cpus()) 103*4882a593Smuzhiyun __field(unsigned long, freq ) 104*4882a593Smuzhiyun __dynamic_array(u32, load, load_len) 105*4882a593Smuzhiyun __field(size_t, load_len ) 106*4882a593Smuzhiyun __field(u32, dynamic_power ) 107*4882a593Smuzhiyun ), 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun TP_fast_assign( 110*4882a593Smuzhiyun __assign_bitmask(cpumask, cpumask_bits(cpus), 111*4882a593Smuzhiyun num_possible_cpus()); 112*4882a593Smuzhiyun __entry->freq = freq; 113*4882a593Smuzhiyun memcpy(__get_dynamic_array(load), load, 114*4882a593Smuzhiyun load_len * sizeof(*load)); 115*4882a593Smuzhiyun __entry->load_len = load_len; 116*4882a593Smuzhiyun __entry->dynamic_power = dynamic_power; 117*4882a593Smuzhiyun ), 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun TP_printk("cpus=%s freq=%lu load={%s} dynamic_power=%d", 120*4882a593Smuzhiyun __get_bitmask(cpumask), __entry->freq, 121*4882a593Smuzhiyun __print_array(__get_dynamic_array(load), __entry->load_len, 4), 122*4882a593Smuzhiyun __entry->dynamic_power) 123*4882a593Smuzhiyun ); 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun TRACE_EVENT(thermal_power_cpu_limit, 126*4882a593Smuzhiyun TP_PROTO(const struct cpumask *cpus, unsigned int freq, 127*4882a593Smuzhiyun unsigned long cdev_state, u32 power), 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun TP_ARGS(cpus, freq, cdev_state, power), 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun TP_STRUCT__entry( 132*4882a593Smuzhiyun __bitmask(cpumask, num_possible_cpus()) 133*4882a593Smuzhiyun __field(unsigned int, freq ) 134*4882a593Smuzhiyun __field(unsigned long, cdev_state) 135*4882a593Smuzhiyun __field(u32, power ) 136*4882a593Smuzhiyun ), 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun TP_fast_assign( 139*4882a593Smuzhiyun __assign_bitmask(cpumask, cpumask_bits(cpus), 140*4882a593Smuzhiyun num_possible_cpus()); 141*4882a593Smuzhiyun __entry->freq = freq; 142*4882a593Smuzhiyun __entry->cdev_state = cdev_state; 143*4882a593Smuzhiyun __entry->power = power; 144*4882a593Smuzhiyun ), 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun TP_printk("cpus=%s freq=%u cdev_state=%lu power=%u", 147*4882a593Smuzhiyun __get_bitmask(cpumask), __entry->freq, __entry->cdev_state, 148*4882a593Smuzhiyun __entry->power) 149*4882a593Smuzhiyun ); 150*4882a593Smuzhiyun #endif /* CONFIG_CPU_THERMAL */ 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun #ifdef CONFIG_DEVFREQ_THERMAL 153*4882a593Smuzhiyun TRACE_EVENT(thermal_power_devfreq_get_power, 154*4882a593Smuzhiyun TP_PROTO(struct thermal_cooling_device *cdev, 155*4882a593Smuzhiyun struct devfreq_dev_status *status, unsigned long freq, 156*4882a593Smuzhiyun u32 dynamic_power, u32 static_power, u32 power), 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun TP_ARGS(cdev, status, freq, dynamic_power, static_power, power), 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun TP_STRUCT__entry( 161*4882a593Smuzhiyun __string(type, cdev->type ) 162*4882a593Smuzhiyun __field(unsigned long, freq ) 163*4882a593Smuzhiyun __field(u32, load ) 164*4882a593Smuzhiyun __field(u32, dynamic_power ) 165*4882a593Smuzhiyun __field(u32, static_power ) 166*4882a593Smuzhiyun __field(u32, power) 167*4882a593Smuzhiyun ), 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun TP_fast_assign( 170*4882a593Smuzhiyun __assign_str(type, cdev->type); 171*4882a593Smuzhiyun __entry->freq = freq; 172*4882a593Smuzhiyun __entry->load = (100 * status->busy_time) / status->total_time; 173*4882a593Smuzhiyun __entry->dynamic_power = dynamic_power; 174*4882a593Smuzhiyun __entry->static_power = static_power; 175*4882a593Smuzhiyun __entry->power = power; 176*4882a593Smuzhiyun ), 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun TP_printk("type=%s freq=%lu load=%u dynamic_power=%u static_power=%u power=%u", 179*4882a593Smuzhiyun __get_str(type), __entry->freq, 180*4882a593Smuzhiyun __entry->load, __entry->dynamic_power, __entry->static_power, 181*4882a593Smuzhiyun __entry->power) 182*4882a593Smuzhiyun ); 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun TRACE_EVENT(thermal_power_devfreq_limit, 185*4882a593Smuzhiyun TP_PROTO(struct thermal_cooling_device *cdev, unsigned long freq, 186*4882a593Smuzhiyun unsigned long cdev_state, u32 power), 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun TP_ARGS(cdev, freq, cdev_state, power), 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun TP_STRUCT__entry( 191*4882a593Smuzhiyun __string(type, cdev->type) 192*4882a593Smuzhiyun __field(unsigned int, freq ) 193*4882a593Smuzhiyun __field(unsigned long, cdev_state) 194*4882a593Smuzhiyun __field(u32, power ) 195*4882a593Smuzhiyun ), 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun TP_fast_assign( 198*4882a593Smuzhiyun __assign_str(type, cdev->type); 199*4882a593Smuzhiyun __entry->freq = freq; 200*4882a593Smuzhiyun __entry->cdev_state = cdev_state; 201*4882a593Smuzhiyun __entry->power = power; 202*4882a593Smuzhiyun ), 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun TP_printk("type=%s freq=%u cdev_state=%lu power=%u", 205*4882a593Smuzhiyun __get_str(type), __entry->freq, __entry->cdev_state, 206*4882a593Smuzhiyun __entry->power) 207*4882a593Smuzhiyun ); 208*4882a593Smuzhiyun #endif /* CONFIG_DEVFREQ_THERMAL */ 209*4882a593Smuzhiyun #endif /* _TRACE_THERMAL_H */ 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun /* This part must be outside protection */ 212*4882a593Smuzhiyun #include <trace/define_trace.h> 213