162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * tmon.h contains data structures and constants used by TMON 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2012 Intel Corporation. All rights reserved. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Author Name Jacob Pan <jacob.jun.pan@linux.intel.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef TMON_H 1162306a36Sopenharmony_ci#define TMON_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define MAX_DISP_TEMP 125 1462306a36Sopenharmony_ci#define MAX_CTRL_TEMP 105 1562306a36Sopenharmony_ci#define MIN_CTRL_TEMP 40 1662306a36Sopenharmony_ci#define MAX_NR_TZONE 16 1762306a36Sopenharmony_ci#define MAX_NR_CDEV 32 1862306a36Sopenharmony_ci#define MAX_NR_TRIP 16 1962306a36Sopenharmony_ci#define MAX_NR_CDEV_TRIP 12 /* number of cooling devices that can bind 2062306a36Sopenharmony_ci * to a thermal zone trip. 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci#define MAX_TEMP_KC 140000 2362306a36Sopenharmony_ci/* starting char position to draw sensor data, such as tz names 2462306a36Sopenharmony_ci * trip point list, etc. 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_ci#define DATA_LEFT_ALIGN 10 2762306a36Sopenharmony_ci#define NR_LINES_TZDATA 1 2862306a36Sopenharmony_ci#define TMON_LOG_FILE "/var/tmp/tmon.log" 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#include <sys/time.h> 3162306a36Sopenharmony_ci#include <pthread.h> 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciextern unsigned long ticktime; 3462306a36Sopenharmony_ciextern double time_elapsed; 3562306a36Sopenharmony_ciextern unsigned long target_temp_user; 3662306a36Sopenharmony_ciextern int dialogue_on; 3762306a36Sopenharmony_ciextern char ctrl_cdev[]; 3862306a36Sopenharmony_ciextern pthread_mutex_t input_lock; 3962306a36Sopenharmony_ciextern int tmon_exit; 4062306a36Sopenharmony_ciextern int target_thermal_zone; 4162306a36Sopenharmony_ci/* use fixed size record to simplify data processing and transfer 4262306a36Sopenharmony_ci * TBD: more info to be added, e.g. programmable trip point data. 4362306a36Sopenharmony_ci*/ 4462306a36Sopenharmony_cistruct thermal_data_record { 4562306a36Sopenharmony_ci struct timeval tv; 4662306a36Sopenharmony_ci unsigned long temp[MAX_NR_TZONE]; 4762306a36Sopenharmony_ci double pid_out_pct; 4862306a36Sopenharmony_ci}; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistruct cdev_info { 5162306a36Sopenharmony_ci char type[64]; 5262306a36Sopenharmony_ci int instance; 5362306a36Sopenharmony_ci unsigned long max_state; 5462306a36Sopenharmony_ci unsigned long cur_state; 5562306a36Sopenharmony_ci unsigned long flag; 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cienum trip_type { 5962306a36Sopenharmony_ci THERMAL_TRIP_CRITICAL, 6062306a36Sopenharmony_ci THERMAL_TRIP_HOT, 6162306a36Sopenharmony_ci THERMAL_TRIP_PASSIVE, 6262306a36Sopenharmony_ci THERMAL_TRIP_ACTIVE, 6362306a36Sopenharmony_ci NR_THERMAL_TRIP_TYPE, 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistruct trip_point { 6762306a36Sopenharmony_ci enum trip_type type; 6862306a36Sopenharmony_ci unsigned long temp; 6962306a36Sopenharmony_ci unsigned long hysteresis; 7062306a36Sopenharmony_ci int attribute; /* programmability etc. */ 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/* thermal zone configuration information, binding with cooling devices could 7462306a36Sopenharmony_ci * change at runtime. 7562306a36Sopenharmony_ci */ 7662306a36Sopenharmony_cistruct tz_info { 7762306a36Sopenharmony_ci char type[256]; /* e.g. acpitz */ 7862306a36Sopenharmony_ci int instance; 7962306a36Sopenharmony_ci int passive; /* active zone has passive node to force passive mode */ 8062306a36Sopenharmony_ci int nr_cdev; /* number of cooling device binded */ 8162306a36Sopenharmony_ci int nr_trip_pts; 8262306a36Sopenharmony_ci struct trip_point tp[MAX_NR_TRIP]; 8362306a36Sopenharmony_ci unsigned long cdev_binding; /* bitmap for attached cdevs */ 8462306a36Sopenharmony_ci /* cdev bind trip points, allow one cdev bind to multiple trips */ 8562306a36Sopenharmony_ci unsigned long trip_binding[MAX_NR_CDEV]; 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistruct tmon_platform_data { 8962306a36Sopenharmony_ci int nr_tz_sensor; 9062306a36Sopenharmony_ci int nr_cooling_dev; 9162306a36Sopenharmony_ci /* keep track of instance ids since there might be gaps */ 9262306a36Sopenharmony_ci int max_tz_instance; 9362306a36Sopenharmony_ci int max_cdev_instance; 9462306a36Sopenharmony_ci struct tz_info *tzi; 9562306a36Sopenharmony_ci struct cdev_info *cdi; 9662306a36Sopenharmony_ci}; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistruct control_ops { 9962306a36Sopenharmony_ci void (*set_ratio)(unsigned long ratio); 10062306a36Sopenharmony_ci unsigned long (*get_ratio)(unsigned long ratio); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci}; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cienum cdev_types { 10562306a36Sopenharmony_ci CDEV_TYPE_PROC, 10662306a36Sopenharmony_ci CDEV_TYPE_FAN, 10762306a36Sopenharmony_ci CDEV_TYPE_MEM, 10862306a36Sopenharmony_ci CDEV_TYPE_NR, 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci/* REVISIT: the idea is to group sensors if possible, e.g. on intel mid 11262306a36Sopenharmony_ci * we have "skin0", "skin1", "sys", "msicdie" 11362306a36Sopenharmony_ci * on DPTF enabled systems, we might have PCH, TSKN, TAMB, etc. 11462306a36Sopenharmony_ci */ 11562306a36Sopenharmony_cienum tzone_types { 11662306a36Sopenharmony_ci TZONE_TYPE_ACPI, 11762306a36Sopenharmony_ci TZONE_TYPE_PCH, 11862306a36Sopenharmony_ci TZONE_TYPE_NR, 11962306a36Sopenharmony_ci}; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci/* limit the output of PID controller adjustment */ 12262306a36Sopenharmony_ci#define LIMIT_HIGH (95) 12362306a36Sopenharmony_ci#define LIMIT_LOW (2) 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_cistruct pid_params { 12662306a36Sopenharmony_ci double kp; /* Controller gain from Dialog Box */ 12762306a36Sopenharmony_ci double ki; /* Time-constant for I action from Dialog Box */ 12862306a36Sopenharmony_ci double kd; /* Time-constant for D action from Dialog Box */ 12962306a36Sopenharmony_ci double ts; 13062306a36Sopenharmony_ci double k_lpf; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci double t_target; 13362306a36Sopenharmony_ci double y_k; 13462306a36Sopenharmony_ci}; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ciextern int init_thermal_controller(void); 13762306a36Sopenharmony_ciextern void controller_handler(const double xk, double *yk); 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ciextern struct tmon_platform_data ptdata; 14062306a36Sopenharmony_ciextern struct pid_params p_param; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ciextern FILE *tmon_log; 14362306a36Sopenharmony_ciextern int cur_thermal_record; /* index to the trec array */ 14462306a36Sopenharmony_ciextern struct thermal_data_record trec[]; 14562306a36Sopenharmony_ciextern const char *trip_type_name[]; 14662306a36Sopenharmony_ciextern unsigned long no_control; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ciextern void initialize_curses(void); 14962306a36Sopenharmony_ciextern void show_controller_stats(char *line); 15062306a36Sopenharmony_ciextern void show_title_bar(void); 15162306a36Sopenharmony_ciextern void setup_windows(void); 15262306a36Sopenharmony_ciextern void disable_tui(void); 15362306a36Sopenharmony_ciextern void show_sensors_w(void); 15462306a36Sopenharmony_ciextern void show_data_w(void); 15562306a36Sopenharmony_ciextern void write_status_bar(int x, char *line); 15662306a36Sopenharmony_ciextern void show_control_w(); 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ciextern void show_cooling_device(void); 15962306a36Sopenharmony_ciextern void show_dialogue(void); 16062306a36Sopenharmony_ciextern int update_thermal_data(void); 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ciextern int probe_thermal_sysfs(void); 16362306a36Sopenharmony_ciextern void free_thermal_data(void); 16462306a36Sopenharmony_ciextern void resize_handler(int sig); 16562306a36Sopenharmony_ciextern void set_ctrl_state(unsigned long state); 16662306a36Sopenharmony_ciextern void get_ctrl_state(unsigned long *state); 16762306a36Sopenharmony_ciextern void *handle_tui_events(void *arg); 16862306a36Sopenharmony_ciextern int sysfs_set_ulong(char *path, char *filename, unsigned long val); 16962306a36Sopenharmony_ciextern int zone_instance_to_index(int zone_inst); 17062306a36Sopenharmony_ciextern void close_windows(void); 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci#define PT_COLOR_DEFAULT 1 17362306a36Sopenharmony_ci#define PT_COLOR_HEADER_BAR 2 17462306a36Sopenharmony_ci#define PT_COLOR_ERROR 3 17562306a36Sopenharmony_ci#define PT_COLOR_RED 4 17662306a36Sopenharmony_ci#define PT_COLOR_YELLOW 5 17762306a36Sopenharmony_ci#define PT_COLOR_GREEN 6 17862306a36Sopenharmony_ci#define PT_COLOR_BRIGHT 7 17962306a36Sopenharmony_ci#define PT_COLOR_BLUE 8 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci/* each thermal zone uses 12 chars, 8 for name, 2 for instance, 2 space 18262306a36Sopenharmony_ci * also used to list trip points in forms of AAAC, which represents 18362306a36Sopenharmony_ci * A: Active 18462306a36Sopenharmony_ci * C: Critical 18562306a36Sopenharmony_ci */ 18662306a36Sopenharmony_ci#define TZONE_RECORD_SIZE 12 18762306a36Sopenharmony_ci#define TZ_LEFT_ALIGN 32 18862306a36Sopenharmony_ci#define CDEV_NAME_SIZE 20 18962306a36Sopenharmony_ci#define CDEV_FLAG_IN_CONTROL (1 << 0) 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci/* dialogue box starts */ 19262306a36Sopenharmony_ci#define DIAG_X 48 19362306a36Sopenharmony_ci#define DIAG_Y 8 19462306a36Sopenharmony_ci#define THERMAL_SYSFS "/sys/class/thermal" 19562306a36Sopenharmony_ci#define CDEV "cooling_device" 19662306a36Sopenharmony_ci#define TZONE "thermal_zone" 19762306a36Sopenharmony_ci#define TDATA_LEFT 16 19862306a36Sopenharmony_ci#endif /* TMON_H */ 199