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