1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * tmon.h contains data structures and constants used by TMON 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2012 Intel Corporation. All rights reserved. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Author Name Jacob Pan <jacob.jun.pan@linux.intel.com> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef TMON_H 11*4882a593Smuzhiyun #define TMON_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define MAX_DISP_TEMP 125 14*4882a593Smuzhiyun #define MAX_CTRL_TEMP 105 15*4882a593Smuzhiyun #define MIN_CTRL_TEMP 40 16*4882a593Smuzhiyun #define MAX_NR_TZONE 16 17*4882a593Smuzhiyun #define MAX_NR_CDEV 32 18*4882a593Smuzhiyun #define MAX_NR_TRIP 16 19*4882a593Smuzhiyun #define MAX_NR_CDEV_TRIP 12 /* number of cooling devices that can bind 20*4882a593Smuzhiyun * to a thermal zone trip. 21*4882a593Smuzhiyun */ 22*4882a593Smuzhiyun #define MAX_TEMP_KC 140000 23*4882a593Smuzhiyun /* starting char position to draw sensor data, such as tz names 24*4882a593Smuzhiyun * trip point list, etc. 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun #define DATA_LEFT_ALIGN 10 27*4882a593Smuzhiyun #define NR_LINES_TZDATA 1 28*4882a593Smuzhiyun #define TMON_LOG_FILE "/var/tmp/tmon.log" 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #include <sys/time.h> 31*4882a593Smuzhiyun #include <pthread.h> 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun extern unsigned long ticktime; 34*4882a593Smuzhiyun extern double time_elapsed; 35*4882a593Smuzhiyun extern unsigned long target_temp_user; 36*4882a593Smuzhiyun extern int dialogue_on; 37*4882a593Smuzhiyun extern char ctrl_cdev[]; 38*4882a593Smuzhiyun extern pthread_mutex_t input_lock; 39*4882a593Smuzhiyun extern int tmon_exit; 40*4882a593Smuzhiyun extern int target_thermal_zone; 41*4882a593Smuzhiyun /* use fixed size record to simplify data processing and transfer 42*4882a593Smuzhiyun * TBD: more info to be added, e.g. programmable trip point data. 43*4882a593Smuzhiyun */ 44*4882a593Smuzhiyun struct thermal_data_record { 45*4882a593Smuzhiyun struct timeval tv; 46*4882a593Smuzhiyun unsigned long temp[MAX_NR_TZONE]; 47*4882a593Smuzhiyun double pid_out_pct; 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun struct cdev_info { 51*4882a593Smuzhiyun char type[64]; 52*4882a593Smuzhiyun int instance; 53*4882a593Smuzhiyun unsigned long max_state; 54*4882a593Smuzhiyun unsigned long cur_state; 55*4882a593Smuzhiyun unsigned long flag; 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun enum trip_type { 59*4882a593Smuzhiyun THERMAL_TRIP_CRITICAL, 60*4882a593Smuzhiyun THERMAL_TRIP_HOT, 61*4882a593Smuzhiyun THERMAL_TRIP_PASSIVE, 62*4882a593Smuzhiyun THERMAL_TRIP_ACTIVE, 63*4882a593Smuzhiyun NR_THERMAL_TRIP_TYPE, 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun struct trip_point { 67*4882a593Smuzhiyun enum trip_type type; 68*4882a593Smuzhiyun unsigned long temp; 69*4882a593Smuzhiyun unsigned long hysteresis; 70*4882a593Smuzhiyun int attribute; /* programmability etc. */ 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* thermal zone configuration information, binding with cooling devices could 74*4882a593Smuzhiyun * change at runtime. 75*4882a593Smuzhiyun */ 76*4882a593Smuzhiyun struct tz_info { 77*4882a593Smuzhiyun char type[256]; /* e.g. acpitz */ 78*4882a593Smuzhiyun int instance; 79*4882a593Smuzhiyun int passive; /* active zone has passive node to force passive mode */ 80*4882a593Smuzhiyun int nr_cdev; /* number of cooling device binded */ 81*4882a593Smuzhiyun int nr_trip_pts; 82*4882a593Smuzhiyun struct trip_point tp[MAX_NR_TRIP]; 83*4882a593Smuzhiyun unsigned long cdev_binding; /* bitmap for attached cdevs */ 84*4882a593Smuzhiyun /* cdev bind trip points, allow one cdev bind to multiple trips */ 85*4882a593Smuzhiyun unsigned long trip_binding[MAX_NR_CDEV]; 86*4882a593Smuzhiyun }; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun struct tmon_platform_data { 89*4882a593Smuzhiyun int nr_tz_sensor; 90*4882a593Smuzhiyun int nr_cooling_dev; 91*4882a593Smuzhiyun /* keep track of instance ids since there might be gaps */ 92*4882a593Smuzhiyun int max_tz_instance; 93*4882a593Smuzhiyun int max_cdev_instance; 94*4882a593Smuzhiyun struct tz_info *tzi; 95*4882a593Smuzhiyun struct cdev_info *cdi; 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun struct control_ops { 99*4882a593Smuzhiyun void (*set_ratio)(unsigned long ratio); 100*4882a593Smuzhiyun unsigned long (*get_ratio)(unsigned long ratio); 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun enum cdev_types { 105*4882a593Smuzhiyun CDEV_TYPE_PROC, 106*4882a593Smuzhiyun CDEV_TYPE_FAN, 107*4882a593Smuzhiyun CDEV_TYPE_MEM, 108*4882a593Smuzhiyun CDEV_TYPE_NR, 109*4882a593Smuzhiyun }; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /* REVISIT: the idea is to group sensors if possible, e.g. on intel mid 112*4882a593Smuzhiyun * we have "skin0", "skin1", "sys", "msicdie" 113*4882a593Smuzhiyun * on DPTF enabled systems, we might have PCH, TSKN, TAMB, etc. 114*4882a593Smuzhiyun */ 115*4882a593Smuzhiyun enum tzone_types { 116*4882a593Smuzhiyun TZONE_TYPE_ACPI, 117*4882a593Smuzhiyun TZONE_TYPE_PCH, 118*4882a593Smuzhiyun TZONE_TYPE_NR, 119*4882a593Smuzhiyun }; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* limit the output of PID controller adjustment */ 122*4882a593Smuzhiyun #define LIMIT_HIGH (95) 123*4882a593Smuzhiyun #define LIMIT_LOW (2) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun struct pid_params { 126*4882a593Smuzhiyun double kp; /* Controller gain from Dialog Box */ 127*4882a593Smuzhiyun double ki; /* Time-constant for I action from Dialog Box */ 128*4882a593Smuzhiyun double kd; /* Time-constant for D action from Dialog Box */ 129*4882a593Smuzhiyun double ts; 130*4882a593Smuzhiyun double k_lpf; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun double t_target; 133*4882a593Smuzhiyun double y_k; 134*4882a593Smuzhiyun }; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun extern int init_thermal_controller(void); 137*4882a593Smuzhiyun extern void controller_handler(const double xk, double *yk); 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun extern struct tmon_platform_data ptdata; 140*4882a593Smuzhiyun extern struct pid_params p_param; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun extern FILE *tmon_log; 143*4882a593Smuzhiyun extern int cur_thermal_record; /* index to the trec array */ 144*4882a593Smuzhiyun extern struct thermal_data_record trec[]; 145*4882a593Smuzhiyun extern const char *trip_type_name[]; 146*4882a593Smuzhiyun extern unsigned long no_control; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun extern void initialize_curses(void); 149*4882a593Smuzhiyun extern void show_controller_stats(char *line); 150*4882a593Smuzhiyun extern void show_title_bar(void); 151*4882a593Smuzhiyun extern void setup_windows(void); 152*4882a593Smuzhiyun extern void disable_tui(void); 153*4882a593Smuzhiyun extern void show_sensors_w(void); 154*4882a593Smuzhiyun extern void show_data_w(void); 155*4882a593Smuzhiyun extern void write_status_bar(int x, char *line); 156*4882a593Smuzhiyun extern void show_control_w(); 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun extern void show_cooling_device(void); 159*4882a593Smuzhiyun extern void show_dialogue(void); 160*4882a593Smuzhiyun extern int update_thermal_data(void); 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun extern int probe_thermal_sysfs(void); 163*4882a593Smuzhiyun extern void free_thermal_data(void); 164*4882a593Smuzhiyun extern void resize_handler(int sig); 165*4882a593Smuzhiyun extern void set_ctrl_state(unsigned long state); 166*4882a593Smuzhiyun extern void get_ctrl_state(unsigned long *state); 167*4882a593Smuzhiyun extern void *handle_tui_events(void *arg); 168*4882a593Smuzhiyun extern int sysfs_set_ulong(char *path, char *filename, unsigned long val); 169*4882a593Smuzhiyun extern int zone_instance_to_index(int zone_inst); 170*4882a593Smuzhiyun extern void close_windows(void); 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #define PT_COLOR_DEFAULT 1 173*4882a593Smuzhiyun #define PT_COLOR_HEADER_BAR 2 174*4882a593Smuzhiyun #define PT_COLOR_ERROR 3 175*4882a593Smuzhiyun #define PT_COLOR_RED 4 176*4882a593Smuzhiyun #define PT_COLOR_YELLOW 5 177*4882a593Smuzhiyun #define PT_COLOR_GREEN 6 178*4882a593Smuzhiyun #define PT_COLOR_BRIGHT 7 179*4882a593Smuzhiyun #define PT_COLOR_BLUE 8 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* each thermal zone uses 12 chars, 8 for name, 2 for instance, 2 space 182*4882a593Smuzhiyun * also used to list trip points in forms of AAAC, which represents 183*4882a593Smuzhiyun * A: Active 184*4882a593Smuzhiyun * C: Critical 185*4882a593Smuzhiyun */ 186*4882a593Smuzhiyun #define TZONE_RECORD_SIZE 12 187*4882a593Smuzhiyun #define TZ_LEFT_ALIGN 32 188*4882a593Smuzhiyun #define CDEV_NAME_SIZE 20 189*4882a593Smuzhiyun #define CDEV_FLAG_IN_CONTROL (1 << 0) 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* dialogue box starts */ 192*4882a593Smuzhiyun #define DIAG_X 48 193*4882a593Smuzhiyun #define DIAG_Y 8 194*4882a593Smuzhiyun #define THERMAL_SYSFS "/sys/class/thermal" 195*4882a593Smuzhiyun #define CDEV "cooling_device" 196*4882a593Smuzhiyun #define TZONE "thermal_zone" 197*4882a593Smuzhiyun #define TDATA_LEFT 16 198*4882a593Smuzhiyun #endif /* TMON_H */ 199