diff options
Diffstat (limited to 'include/linux/msm_thermal.h')
-rw-r--r-- | include/linux/msm_thermal.h | 348 |
1 files changed, 348 insertions, 0 deletions
diff --git a/include/linux/msm_thermal.h b/include/linux/msm_thermal.h new file mode 100644 index 000000000000..33286c2d81fc --- /dev/null +++ b/include/linux/msm_thermal.h @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __MSM_THERMAL_H +#define __MSM_THERMAL_H + +#include <linux/thermal.h> + +#define MAX_THRESHOLD 2 +#define TSENS_NAME_MAX 20 +#define MONITOR_ALL_TSENS -1 +#define HOTPLUG_DEVICE "hotplug" +#define CPU0_DEVICE "cpu0" +#define CPU1_DEVICE "cpu1" +#define CPU2_DEVICE "cpu2" +#define CPU3_DEVICE "cpu3" +#define CPU4_DEVICE "cpu4" +#define CPU5_DEVICE "cpu5" +#define CPU6_DEVICE "cpu6" +#define CPU7_DEVICE "cpu7" +#define CPUFREQ_MAX_NO_MITIGATION UINT_MAX +#define CPUFREQ_MIN_NO_MITIGATION 0 +#define HOTPLUG_NO_MITIGATION(_mask) cpumask_clear(_mask) + +#define IS_HI_THRESHOLD_SET(_val) (_val & 1) +#define IS_LOW_THRESHOLD_SET(_val) (_val & 2) + +struct msm_thermal_data { + struct platform_device *pdev; + uint32_t sensor_id; + uint32_t poll_ms; + int32_t limit_temp_degC; + int32_t temp_hysteresis_degC; + uint32_t bootup_freq_step; + uint32_t bootup_freq_control_mask; + int32_t core_limit_temp_degC; + int32_t core_temp_hysteresis_degC; + int32_t hotplug_temp_degC; + int32_t hotplug_temp_hysteresis_degC; + uint32_t core_control_mask; + uint32_t freq_mitig_temp_degc; + uint32_t freq_mitig_temp_hysteresis_degc; + uint32_t freq_mitig_control_mask; + uint32_t freq_limit; + int32_t vdd_rstr_temp_degC; + int32_t vdd_rstr_temp_hyst_degC; + int32_t vdd_mx_min; + int32_t vdd_cx_min; + int32_t psm_temp_degC; + int32_t psm_temp_hyst_degC; + int32_t ocr_temp_degC; + int32_t ocr_temp_hyst_degC; + uint32_t ocr_sensor_id; + int32_t phase_rpm_resource_type; + int32_t phase_rpm_resource_id; + int32_t gfx_phase_warm_temp_degC; + int32_t gfx_phase_warm_temp_hyst_degC; + int32_t gfx_phase_hot_temp_degC; + int32_t gfx_phase_hot_temp_hyst_degC; + int32_t gfx_sensor; + int32_t gfx_phase_request_key; + int32_t cx_phase_hot_temp_degC; + int32_t cx_phase_hot_temp_hyst_degC; + int32_t cx_phase_request_key; + int32_t vdd_mx_temp_degC; + int32_t vdd_mx_temp_hyst_degC; + int32_t vdd_mx_sensor_id; + int32_t therm_reset_temp_degC; +}; + +enum sensor_id_type { + THERM_ZONE_ID, + THERM_TSENS_ID, + THERM_ID_MAX_NR, +}; + +struct threshold_info; +struct therm_threshold { + int32_t sensor_id; + enum sensor_id_type id_type; + struct sensor_threshold threshold[MAX_THRESHOLD]; + int32_t trip_triggered; + void (*notify)(struct therm_threshold *); + struct threshold_info *parent; + int32_t cur_state; +}; + +struct threshold_info { + uint32_t thresh_ct; + bool thresh_triggered; + struct list_head list_ptr; + struct therm_threshold *thresh_list; +}; + +enum device_req_type { + DEVICE_REQ_NONE = -1, + HOTPLUG_MITIGATION_REQ, + CPUFREQ_MITIGATION_REQ, + DEVICE_REQ_MAX, +}; + +/** + * For frequency mitigation request, if client is interested + * only in one, either max_freq or min_freq, update default + * value for other one also for mitigation request. + * Default value for request structure variables: + * max_freq = UINT_MAX; + * min_freq = 0; + * offline_mask = CPU_MASK_NONE; + */ +struct cpufreq_request { + uint32_t max_freq; + uint32_t min_freq; +}; + +union device_request { + struct cpufreq_request freq; + cpumask_t offline_mask; +}; + +struct device_clnt_data; +struct device_manager_data { + char device_name[TSENS_NAME_MAX]; + union device_request active_req; + struct list_head client_list; + struct list_head dev_ptr; + struct mutex clnt_lock; + int (*request_validate)(struct device_clnt_data *, + union device_request *, + enum device_req_type); + int (*update)(struct device_manager_data *); + void *data; +}; + +struct device_clnt_data { + struct device_manager_data *dev_mgr; + bool req_active; + union device_request request; + struct list_head clnt_ptr; + void (*callback)(struct device_clnt_data *, + union device_request *req, void *); + void *usr_data; +}; + +#ifdef CONFIG_THERMAL_MONITOR +extern int msm_thermal_ioctl_init(void); +extern void msm_thermal_ioctl_cleanup(void); +extern int msm_thermal_init(struct msm_thermal_data *pdata); +extern int msm_thermal_device_init(void); +extern int msm_thermal_set_frequency(uint32_t cpu, uint32_t freq, + bool is_max); +extern int msm_thermal_set_cluster_freq(uint32_t cluster, uint32_t freq, + bool is_max); +extern int msm_thermal_get_freq_plan_size(uint32_t cluster, + unsigned int *table_len); +extern int msm_thermal_get_cluster_freq_plan(uint32_t cluster, + unsigned int *table_ptr); +extern int msm_thermal_get_cluster_voltage_plan(uint32_t cluster, + uint32_t *table_ptr); +/** + * sensor_mgr_init_threshold - Initialize thresholds data structure for + * sensor(s) with high and low thresholds and + * threshold callback. + * + * @thresh_inp: Client threshold data structure. + * @sensor_id: Sensor h/w ID to be monitored. Use MONITOR_ALL_TSENS + * to monitor all temperature sensors. + * + * @high_temp: Trigger threshold value for sensor_id or all sensors. + * @low_temp: Clear threshold value for sensor_id or all sensors. + * @callback: Callback pointer for threshold notification. + * + * Returns which threshold is set on success, negative error number + * on failure. MACRO IS_HI_THRESHOLD_SET/IS_LOW_THRESHOLD_SET can be used + * to decipher which threshold being set. + */ +extern int sensor_mgr_init_threshold(struct threshold_info *thresh_inp, + int sensor_id, int32_t high_temp, + int32_t low_temp, + void (*callback)(struct therm_threshold *)); +/** + * sensor_mgr_convert_id_and_set_threshold - It accepts sensor h/w ID, converts + * it to sensor zone id and sets + * thermal threshold for those + * sensors listed in threshold info. + * + * @thresh_inp: Client threshold data structure. + * + * Returns zero on success, negative error number on failure. + */ +extern int sensor_mgr_convert_id_and_set_threshold( + struct threshold_info *thresh_inp); +/** + * sensor_mgr_set_threshold- It sets thermal threshold trips for a sensor. + * + * @zone_id: Thermal zone ID for the sensor. + * @threshold: threshold info for the sensor. + * + * Returns zero on success, negative error number on failure. + */ +extern int sensor_mgr_set_threshold(uint32_t zone_id, + struct sensor_threshold *threshold); +/** + * sensor_mgr_remove_threshold- It cancels threshold notification and + * removes threshold from sensor manager + * threshold list. + * + * @thresh_inp: The threshold info which needs to be removed. + */ +extern void sensor_mgr_remove_threshold(struct threshold_info *thresh_inp); +/** + * devmgr_register_mitigation_client - Register for a device and + * gets a handle for mitigation. + * @dev: Client device structure. + * @device_name: Mitgation device name which the client is interested + * to mitigate. + * @callback: Optional callback pointer for device change notification, + * otherwise pass NULL. + * + * Returns client handle structure for that device on success, or NULL + * with IS_ERR() condition containing error number. + */ +extern struct device_clnt_data *devmgr_register_mitigation_client( + struct device *dev, + const char *device_name, + void (*callback)(struct device_clnt_data *, + union device_request *, void *)); +/** + * devmgr_client_request_mitigation - Set a valid mitigation for + * registered device. + * @clnt: Client handle for device. + * @type: Type of device request populated above. + * @req: Valid mitigation request. + * + * Returns zero on successful mitigation update, or negative error number. + */ +extern int devmgr_client_request_mitigation(struct device_clnt_data *clnt, + enum device_req_type type, + union device_request *req); +/** + * devmgr_unregister_mitigation_client - Unregister mitigation device + * @dev: Client device structure. + * @clnt: Client handle for device. + */ +extern void devmgr_unregister_mitigation_client( + struct device *dev, + struct device_clnt_data *clnt); +#ifdef CONFIG_QCOM_THERMAL_LIMITS_DCVS +extern int msm_lmh_dcvsh_sw_notify(int cpu); +#else +static inline int msm_lmh_dcvsh_sw_notify(int cpu) +{ + return -ENODEV; +} +#endif + +#else +static inline int msm_thermal_init(struct msm_thermal_data *pdata) +{ + return -ENOSYS; +} +static inline int msm_thermal_device_init(void) +{ + return -ENOSYS; +} +static inline int msm_thermal_set_frequency(uint32_t cpu, uint32_t freq, + bool is_max) +{ + return -ENOSYS; +} +static inline int msm_thermal_set_cluster_freq(uint32_t cluster, uint32_t freq, + bool is_max) +{ + return -ENOSYS; +} +static inline int msm_thermal_get_freq_plan_size(uint32_t cluster, + unsigned int *table_len) +{ + return -ENOSYS; +} +static inline int msm_thermal_get_cluster_freq_plan(uint32_t cluster, + unsigned int *table_ptr) +{ + return -ENOSYS; +} +static inline int msm_thermal_get_cluster_voltage_plan(uint32_t cluster, + uint32_t *table_ptr) +{ + return -ENOSYS; +} +static inline int sensor_mgr_init_threshold(struct threshold_info *thresh_inp, + int sensor_id, int32_t high_temp, + int32_t low_temp, + void (*callback)(struct therm_threshold *)) +{ + return -ENOSYS; +} +static inline int sensor_mgr_convert_id_and_set_threshold( + struct threshold_info *thresh_inp) +{ + return -ENOSYS; +} +static inline int sensor_mgr_set_threshold(uint32_t zone_id, + struct sensor_threshold *threshold) +{ + return -ENOSYS; +} +static inline void sensor_mgr_remove_threshold( + struct threshold_info *thresh_inp) +{ +} +static inline struct device_clnt_data *devmgr_register_mitigation_client( + struct device *dev, + const char *device_name, + void (*callback)(struct device_clnt_data *, + union device_request *, void *)) +{ + return NULL; +} +static inline int devmgr_client_request_mitigation( + struct device_clnt_data *clnt, + enum device_req_type type, + union device_request *req) +{ + return -ENOSYS; +} +static inline void devmgr_unregister_mitigation_client( + struct device *dev, + struct device_clnt_data *clnt) +{ +} +static inline int msm_lmh_dcvsh_sw_notify(int cpu) +{ + return -ENODEV; +} +#endif + +#endif /*__MSM_THERMAL_H*/ |