xref: /openbmc/linux/tools/thermal/tmon/tmon.h (revision f28d733c)
1cd5e85f5SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
294f69966SJacob Pan /*
394f69966SJacob Pan  * tmon.h contains data structures and constants used by TMON
494f69966SJacob Pan  *
594f69966SJacob Pan  * Copyright (C) 2012 Intel Corporation. All rights reserved.
694f69966SJacob Pan  *
794f69966SJacob Pan  * Author Name Jacob Pan <jacob.jun.pan@linux.intel.com>
894f69966SJacob Pan  */
994f69966SJacob Pan 
1094f69966SJacob Pan #ifndef TMON_H
1194f69966SJacob Pan #define TMON_H
1294f69966SJacob Pan 
1394f69966SJacob Pan #define MAX_DISP_TEMP 125
1494f69966SJacob Pan #define MAX_CTRL_TEMP 105
1594f69966SJacob Pan #define MIN_CTRL_TEMP 40
1694f69966SJacob Pan #define MAX_NR_TZONE 16
1794f69966SJacob Pan #define MAX_NR_CDEV 32
1894f69966SJacob Pan #define MAX_NR_TRIP 16
1994f69966SJacob Pan #define MAX_NR_CDEV_TRIP 12 /* number of cooling devices that can bind
2094f69966SJacob Pan 			     * to a thermal zone trip.
2194f69966SJacob Pan 			     */
2294f69966SJacob Pan #define MAX_TEMP_KC 140000
2394f69966SJacob Pan /* starting char position to draw sensor data, such as tz names
2494f69966SJacob Pan  * trip point list, etc.
2594f69966SJacob Pan  */
2694f69966SJacob Pan #define DATA_LEFT_ALIGN 10
2794f69966SJacob Pan #define NR_LINES_TZDATA 1
2894f69966SJacob Pan #define TMON_LOG_FILE "/var/tmp/tmon.log"
2994f69966SJacob Pan 
30*f28d733cSMarkus Mayer #include <sys/time.h>
31*f28d733cSMarkus Mayer #include <pthread.h>
32*f28d733cSMarkus Mayer 
3394f69966SJacob Pan extern unsigned long ticktime;
3494f69966SJacob Pan extern double time_elapsed;
3594f69966SJacob Pan extern unsigned long target_temp_user;
3694f69966SJacob Pan extern int dialogue_on;
3794f69966SJacob Pan extern char ctrl_cdev[];
3894f69966SJacob Pan extern pthread_mutex_t input_lock;
3994f69966SJacob Pan extern int tmon_exit;
4094f69966SJacob Pan extern int target_thermal_zone;
4194f69966SJacob Pan /* use fixed size record to simplify data processing and transfer
4294f69966SJacob Pan  * TBD: more info to be added, e.g. programmable trip point data.
4394f69966SJacob Pan */
4494f69966SJacob Pan struct thermal_data_record {
4594f69966SJacob Pan 	struct timeval tv;
4694f69966SJacob Pan 	unsigned long temp[MAX_NR_TZONE];
4794f69966SJacob Pan 	double pid_out_pct;
4894f69966SJacob Pan };
4994f69966SJacob Pan 
5094f69966SJacob Pan struct cdev_info {
5194f69966SJacob Pan 	char type[64];
5294f69966SJacob Pan 	int instance;
5394f69966SJacob Pan 	unsigned long max_state;
5494f69966SJacob Pan 	unsigned long cur_state;
5594f69966SJacob Pan 	unsigned long flag;
5694f69966SJacob Pan };
5794f69966SJacob Pan 
5894f69966SJacob Pan enum trip_type {
5994f69966SJacob Pan 	THERMAL_TRIP_CRITICAL,
6094f69966SJacob Pan 	THERMAL_TRIP_HOT,
6194f69966SJacob Pan 	THERMAL_TRIP_PASSIVE,
6294f69966SJacob Pan 	THERMAL_TRIP_ACTIVE,
6394f69966SJacob Pan 	NR_THERMAL_TRIP_TYPE,
6494f69966SJacob Pan };
6594f69966SJacob Pan 
6694f69966SJacob Pan struct trip_point {
6794f69966SJacob Pan 	enum trip_type type;
6894f69966SJacob Pan 	unsigned long temp;
6994f69966SJacob Pan 	unsigned long hysteresis;
7094f69966SJacob Pan 	int attribute; /* programmability etc. */
7194f69966SJacob Pan };
7294f69966SJacob Pan 
7394f69966SJacob Pan /* thermal zone configuration information, binding with cooling devices could
7494f69966SJacob Pan  * change at runtime.
7594f69966SJacob Pan  */
7694f69966SJacob Pan struct tz_info {
7794f69966SJacob Pan 	char type[256]; /* e.g. acpitz */
7894f69966SJacob Pan 	int instance;
7994f69966SJacob Pan 	int passive; /* active zone has passive node to force passive mode */
8094f69966SJacob Pan 	int nr_cdev; /* number of cooling device binded */
8194f69966SJacob Pan 	int nr_trip_pts;
8294f69966SJacob Pan 	struct trip_point tp[MAX_NR_TRIP];
8394f69966SJacob Pan 	unsigned long cdev_binding; /* bitmap for attached cdevs */
8494f69966SJacob Pan 	/* cdev bind trip points, allow one cdev bind to multiple trips */
8594f69966SJacob Pan 	unsigned long trip_binding[MAX_NR_CDEV];
8694f69966SJacob Pan };
8794f69966SJacob Pan 
8894f69966SJacob Pan struct tmon_platform_data {
8994f69966SJacob Pan 	int nr_tz_sensor;
9094f69966SJacob Pan 	int nr_cooling_dev;
9194f69966SJacob Pan 	/* keep track of instance ids since there might be gaps */
9294f69966SJacob Pan 	int max_tz_instance;
9394f69966SJacob Pan 	int max_cdev_instance;
9494f69966SJacob Pan 	struct tz_info *tzi;
9594f69966SJacob Pan 	struct cdev_info *cdi;
9694f69966SJacob Pan };
9794f69966SJacob Pan 
9894f69966SJacob Pan struct control_ops {
9994f69966SJacob Pan 	void (*set_ratio)(unsigned long ratio);
10094f69966SJacob Pan 	unsigned long (*get_ratio)(unsigned long ratio);
10194f69966SJacob Pan 
10294f69966SJacob Pan };
10394f69966SJacob Pan 
10494f69966SJacob Pan enum cdev_types {
10594f69966SJacob Pan 	CDEV_TYPE_PROC,
10694f69966SJacob Pan 	CDEV_TYPE_FAN,
10794f69966SJacob Pan 	CDEV_TYPE_MEM,
10894f69966SJacob Pan 	CDEV_TYPE_NR,
10994f69966SJacob Pan };
11094f69966SJacob Pan 
11194f69966SJacob Pan /* REVISIT: the idea is to group sensors if possible, e.g. on intel mid
11294f69966SJacob Pan  * we have "skin0", "skin1", "sys", "msicdie"
11394f69966SJacob Pan  * on DPTF enabled systems, we might have PCH, TSKN, TAMB, etc.
11494f69966SJacob Pan  */
11594f69966SJacob Pan enum tzone_types {
11694f69966SJacob Pan 	TZONE_TYPE_ACPI,
11794f69966SJacob Pan 	TZONE_TYPE_PCH,
11894f69966SJacob Pan 	TZONE_TYPE_NR,
11994f69966SJacob Pan };
12094f69966SJacob Pan 
12194f69966SJacob Pan /* limit the output of PID controller adjustment */
12294f69966SJacob Pan #define LIMIT_HIGH (95)
12394f69966SJacob Pan #define LIMIT_LOW  (2)
12494f69966SJacob Pan 
12594f69966SJacob Pan struct pid_params {
12694f69966SJacob Pan 	double kp;  /* Controller gain from Dialog Box */
12794f69966SJacob Pan 	double ki;  /* Time-constant for I action from Dialog Box */
12894f69966SJacob Pan 	double kd;  /* Time-constant for D action from Dialog Box */
12994f69966SJacob Pan 	double ts;
13094f69966SJacob Pan 	double k_lpf;
13194f69966SJacob Pan 
13294f69966SJacob Pan 	double t_target;
13394f69966SJacob Pan 	double y_k;
13494f69966SJacob Pan };
13594f69966SJacob Pan 
13694f69966SJacob Pan extern int init_thermal_controller(void);
13794f69966SJacob Pan extern void controller_handler(const double xk, double *yk);
13894f69966SJacob Pan 
13994f69966SJacob Pan extern struct tmon_platform_data ptdata;
14094f69966SJacob Pan extern struct pid_params p_param;
14194f69966SJacob Pan 
14294f69966SJacob Pan extern FILE *tmon_log;
14394f69966SJacob Pan extern int cur_thermal_record; /* index to the trec array */
14494f69966SJacob Pan extern struct thermal_data_record trec[];
14594f69966SJacob Pan extern const char *trip_type_name[];
14694f69966SJacob Pan extern unsigned long no_control;
14794f69966SJacob Pan 
14894f69966SJacob Pan extern void initialize_curses(void);
14994f69966SJacob Pan extern void show_controller_stats(char *line);
15094f69966SJacob Pan extern void show_title_bar(void);
15194f69966SJacob Pan extern void setup_windows(void);
15294f69966SJacob Pan extern void disable_tui(void);
15394f69966SJacob Pan extern void show_sensors_w(void);
15494f69966SJacob Pan extern void show_data_w(void);
15594f69966SJacob Pan extern void write_status_bar(int x, char *line);
15694f69966SJacob Pan extern void show_control_w();
15794f69966SJacob Pan 
15894f69966SJacob Pan extern void show_cooling_device(void);
15994f69966SJacob Pan extern void show_dialogue(void);
16094f69966SJacob Pan extern int update_thermal_data(void);
16194f69966SJacob Pan 
16294f69966SJacob Pan extern int probe_thermal_sysfs(void);
16394f69966SJacob Pan extern void free_thermal_data(void);
16494f69966SJacob Pan extern	void resize_handler(int sig);
16594f69966SJacob Pan extern void set_ctrl_state(unsigned long state);
16694f69966SJacob Pan extern void get_ctrl_state(unsigned long *state);
16794f69966SJacob Pan extern void *handle_tui_events(void *arg);
16894f69966SJacob Pan extern int sysfs_set_ulong(char *path, char *filename, unsigned long val);
16994f69966SJacob Pan extern int zone_instance_to_index(int zone_inst);
17094f69966SJacob Pan extern void close_windows(void);
17194f69966SJacob Pan 
17294f69966SJacob Pan #define PT_COLOR_DEFAULT    1
17394f69966SJacob Pan #define PT_COLOR_HEADER_BAR 2
17494f69966SJacob Pan #define PT_COLOR_ERROR      3
17594f69966SJacob Pan #define PT_COLOR_RED        4
17694f69966SJacob Pan #define PT_COLOR_YELLOW     5
17794f69966SJacob Pan #define PT_COLOR_GREEN      6
17894f69966SJacob Pan #define PT_COLOR_BRIGHT     7
17994f69966SJacob Pan #define PT_COLOR_BLUE	    8
18094f69966SJacob Pan 
18194f69966SJacob Pan /* each thermal zone uses 12 chars, 8 for name, 2 for instance, 2 space
18294f69966SJacob Pan  * also used to list trip points in forms of AAAC, which represents
18394f69966SJacob Pan  * A: Active
18494f69966SJacob Pan  * C: Critical
18594f69966SJacob Pan  */
18694f69966SJacob Pan #define TZONE_RECORD_SIZE 12
18794f69966SJacob Pan #define TZ_LEFT_ALIGN 32
18894f69966SJacob Pan #define CDEV_NAME_SIZE 20
18994f69966SJacob Pan #define CDEV_FLAG_IN_CONTROL (1 << 0)
19094f69966SJacob Pan 
19194f69966SJacob Pan /* dialogue box starts */
19294f69966SJacob Pan #define DIAG_X 48
19394f69966SJacob Pan #define DIAG_Y 8
19494f69966SJacob Pan #define THERMAL_SYSFS "/sys/class/thermal"
19594f69966SJacob Pan #define CDEV "cooling_device"
19694f69966SJacob Pan #define TZONE "thermal_zone"
19794f69966SJacob Pan #define TDATA_LEFT 16
19894f69966SJacob Pan #endif /* TMON_H */
199