xref: /OK3568_Linux_fs/kernel/tools/thermal/tmon/tmon.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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