xref: /linux/drivers/thermal/thermal_core.h (revision d22300518d875f78203e9afacb5aa0b0316da523)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *  thermal_core.h
4  *
5  *  Copyright (C) 2012  Intel Corp
6  *  Author: Durgadoss R <durgadoss.r@intel.com>
7  */
8 
9 #ifndef __THERMAL_CORE_H__
10 #define __THERMAL_CORE_H__
11 
12 #include <linux/device.h>
13 #include <linux/thermal.h>
14 
15 #include "thermal_netlink.h"
16 #include "thermal_debugfs.h"
17 
18 struct thermal_attr {
19 	struct device_attribute attr;
20 	char name[THERMAL_NAME_LENGTH];
21 };
22 
23 struct thermal_trip_attrs {
24 	struct thermal_attr type;
25 	struct thermal_attr temp;
26 	struct thermal_attr hyst;
27 };
28 
29 struct thermal_trip_desc {
30 	struct thermal_trip trip;
31 	struct thermal_trip_attrs trip_attrs;
32 	struct list_head notify_list_node;
33 	int notify_temp;
34 	int threshold;
35 };
36 
37 /**
38  * struct thermal_governor - structure that holds thermal governor information
39  * @name:	name of the governor
40  * @bind_to_tz: callback called when binding to a thermal zone.  If it
41  *		returns 0, the governor is bound to the thermal zone,
42  *		otherwise it fails.
43  * @unbind_from_tz:	callback called when a governor is unbound from a
44  *			thermal zone.
45  * @trip_crossed:	called for trip points that have just been crossed
46  * @manage:	called on thermal zone temperature updates
47  * @update_tz:	callback called when thermal zone internals have changed, e.g.
48  *		thermal cooling instance was added/removed
49  * @governor_list:	node in thermal_governor_list (in thermal_core.c)
50  */
51 struct thermal_governor {
52 	const char *name;
53 	int (*bind_to_tz)(struct thermal_zone_device *tz);
54 	void (*unbind_from_tz)(struct thermal_zone_device *tz);
55 	void (*trip_crossed)(struct thermal_zone_device *tz,
56 			     const struct thermal_trip *trip,
57 			     bool crossed_up);
58 	void (*manage)(struct thermal_zone_device *tz);
59 	void (*update_tz)(struct thermal_zone_device *tz,
60 			  enum thermal_notify_event reason);
61 	struct list_head	governor_list;
62 };
63 
64 /**
65  * struct thermal_zone_device - structure for a thermal zone
66  * @id:		unique id number for each thermal zone
67  * @type:	the thermal zone device type
68  * @device:	&struct device for this thermal zone
69  * @removal:	removal completion
70  * @resume:	resume completion
71  * @mode:		current mode of this thermal zone
72  * @devdata:	private pointer for device private data
73  * @num_trips:	number of trip points the thermal zone supports
74  * @passive_delay_jiffies: number of jiffies to wait between polls when
75  *			performing passive cooling.
76  * @polling_delay_jiffies: number of jiffies to wait between polls when
77  *			checking whether trip points have been crossed (0 for
78  *			interrupt driven systems)
79  * @recheck_delay_jiffies: delay after a failed attempt to determine the zone
80  * 			temperature before trying again
81  * @temperature:	current temperature.  This is only for core code,
82  *			drivers should use thermal_zone_get_temp() to get the
83  *			current temperature
84  * @last_temperature:	previous temperature read
85  * @emul_temperature:	emulated temperature when using CONFIG_THERMAL_EMULATION
86  * @passive:		1 if you've crossed a passive trip point, 0 otherwise.
87  * @prev_low_trip:	the low current temperature if you've crossed a passive
88 			trip point.
89  * @prev_high_trip:	the above current temperature if you've crossed a
90 			passive trip point.
91  * @need_update:	if equals 1, thermal_zone_device_update needs to be invoked.
92  * @ops:	operations this &thermal_zone_device supports
93  * @tzp:	thermal zone parameters
94  * @governor:	pointer to the governor for this thermal zone
95  * @governor_data:	private pointer for governor data
96  * @thermal_instances:	list of &struct thermal_instance of this thermal zone
97  * @ida:	&struct ida to generate unique id for this zone's cooling
98  *		devices
99  * @lock:	lock to protect thermal_instances list
100  * @node:	node in thermal_tz_list (in thermal_core.c)
101  * @poll_queue:	delayed work for polling
102  * @notify_event: Last notification event
103  * @suspended: thermal zone suspend indicator
104  * @resuming:	indicates whether or not thermal zone resume is in progress
105  * @trips:	array of struct thermal_trip objects
106  */
107 struct thermal_zone_device {
108 	int id;
109 	char type[THERMAL_NAME_LENGTH];
110 	struct device device;
111 	struct completion removal;
112 	struct completion resume;
113 	struct attribute_group trips_attribute_group;
114 	enum thermal_device_mode mode;
115 	void *devdata;
116 	int num_trips;
117 	unsigned long passive_delay_jiffies;
118 	unsigned long polling_delay_jiffies;
119 	unsigned long recheck_delay_jiffies;
120 	int temperature;
121 	int last_temperature;
122 	int emul_temperature;
123 	int passive;
124 	int prev_low_trip;
125 	int prev_high_trip;
126 	atomic_t need_update;
127 	struct thermal_zone_device_ops ops;
128 	struct thermal_zone_params *tzp;
129 	struct thermal_governor *governor;
130 	void *governor_data;
131 	struct list_head thermal_instances;
132 	struct ida ida;
133 	struct mutex lock;
134 	struct list_head node;
135 	struct delayed_work poll_queue;
136 	enum thermal_notify_event notify_event;
137 	bool suspended;
138 	bool resuming;
139 #ifdef CONFIG_THERMAL_DEBUGFS
140 	struct thermal_debugfs *debugfs;
141 #endif
142 	struct thermal_trip_desc trips[] __counted_by(num_trips);
143 };
144 
145 /* Initial thermal zone temperature. */
146 #define THERMAL_TEMP_INIT	INT_MIN
147 
148 /*
149  * Default and maximum delay after a failed thermal zone temperature check
150  * before attempting to check it again (in jiffies).
151  */
152 #define THERMAL_RECHECK_DELAY		msecs_to_jiffies(250)
153 #define THERMAL_MAX_RECHECK_DELAY	(120 * HZ)
154 
155 /* Default Thermal Governor */
156 #if defined(CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE)
157 #define DEFAULT_THERMAL_GOVERNOR       "step_wise"
158 #elif defined(CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE)
159 #define DEFAULT_THERMAL_GOVERNOR       "fair_share"
160 #elif defined(CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE)
161 #define DEFAULT_THERMAL_GOVERNOR       "user_space"
162 #elif defined(CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR)
163 #define DEFAULT_THERMAL_GOVERNOR       "power_allocator"
164 #elif defined(CONFIG_THERMAL_DEFAULT_GOV_BANG_BANG)
165 #define DEFAULT_THERMAL_GOVERNOR       "bang_bang"
166 #endif
167 
168 /* Initial state of a cooling device during binding */
169 #define THERMAL_NO_TARGET -1UL
170 
171 /* Init section thermal table */
172 extern struct thermal_governor *__governor_thermal_table[];
173 extern struct thermal_governor *__governor_thermal_table_end[];
174 
175 #define THERMAL_TABLE_ENTRY(table, name)			\
176 	static typeof(name) *__thermal_table_entry_##name	\
177 	__used __section("__" #table "_thermal_table") = &name
178 
179 #define THERMAL_GOVERNOR_DECLARE(name)	THERMAL_TABLE_ENTRY(governor, name)
180 
181 #define for_each_governor_table(__governor)		\
182 	for (__governor = __governor_thermal_table;	\
183 	     __governor < __governor_thermal_table_end;	\
184 	     __governor++)
185 
186 int for_each_thermal_zone(int (*cb)(struct thermal_zone_device *, void *),
187 			  void *);
188 
189 int for_each_thermal_cooling_device(int (*cb)(struct thermal_cooling_device *,
190 					      void *), void *);
191 
192 int for_each_thermal_governor(int (*cb)(struct thermal_governor *, void *),
193 			      void *thermal_governor);
194 
195 struct thermal_zone_device *thermal_zone_get_by_id(int id);
196 
cdev_is_power_actor(struct thermal_cooling_device * cdev)197 static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
198 {
199 	return cdev->ops->get_requested_power && cdev->ops->state2power &&
200 		cdev->ops->power2state;
201 }
202 
203 void thermal_cdev_update(struct thermal_cooling_device *);
204 void __thermal_cdev_update(struct thermal_cooling_device *cdev);
205 
206 int get_tz_trend(struct thermal_zone_device *tz, const struct thermal_trip *trip);
207 
208 /*
209  * This structure is used to describe the behavior of
210  * a certain cooling device on a certain trip point
211  * in a certain thermal zone
212  */
213 struct thermal_instance {
214 	int id;
215 	char name[THERMAL_NAME_LENGTH];
216 	struct thermal_cooling_device *cdev;
217 	const struct thermal_trip *trip;
218 	bool initialized;
219 	unsigned long upper;	/* Highest cooling state for this trip point */
220 	unsigned long lower;	/* Lowest cooling state for this trip point */
221 	unsigned long target;	/* expected cooling state */
222 	char attr_name[THERMAL_NAME_LENGTH];
223 	struct device_attribute attr;
224 	char weight_attr_name[THERMAL_NAME_LENGTH];
225 	struct device_attribute weight_attr;
226 	struct list_head tz_node; /* node in tz->thermal_instances */
227 	struct list_head cdev_node; /* node in cdev->thermal_instances */
228 	unsigned int weight; /* The weight of the cooling device */
229 	bool upper_no_limit;
230 };
231 
232 #define to_thermal_zone(_dev) \
233 	container_of(_dev, struct thermal_zone_device, device)
234 
235 #define to_cooling_device(_dev)	\
236 	container_of(_dev, struct thermal_cooling_device, device)
237 
238 int thermal_register_governor(struct thermal_governor *);
239 void thermal_unregister_governor(struct thermal_governor *);
240 int thermal_zone_device_set_policy(struct thermal_zone_device *, char *);
241 int thermal_build_list_of_policies(char *buf);
242 void __thermal_zone_device_update(struct thermal_zone_device *tz,
243 				  enum thermal_notify_event event);
244 void thermal_zone_device_critical_reboot(struct thermal_zone_device *tz);
245 void thermal_governor_update_tz(struct thermal_zone_device *tz,
246 				enum thermal_notify_event reason);
247 
248 /* Helpers */
249 #define for_each_trip_desc(__tz, __td)	\
250 	for (__td = __tz->trips; __td - __tz->trips < __tz->num_trips; __td++)
251 
252 #define trip_to_trip_desc(__trip)	\
253 	container_of(__trip, struct thermal_trip_desc, trip)
254 
255 const char *thermal_trip_type_name(enum thermal_trip_type trip_type);
256 
257 void thermal_zone_set_trips(struct thermal_zone_device *tz, int low, int high);
258 int thermal_zone_trip_id(const struct thermal_zone_device *tz,
259 			 const struct thermal_trip *trip);
260 int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
261 void thermal_zone_trip_down(struct thermal_zone_device *tz,
262 			    const struct thermal_trip *trip);
263 void thermal_zone_set_trip_hyst(struct thermal_zone_device *tz,
264 				struct thermal_trip *trip, int hyst);
265 
266 /* sysfs I/F */
267 int thermal_zone_create_device_groups(struct thermal_zone_device *tz);
268 void thermal_zone_destroy_device_groups(struct thermal_zone_device *);
269 void thermal_cooling_device_setup_sysfs(struct thermal_cooling_device *);
270 void thermal_cooling_device_destroy_sysfs(struct thermal_cooling_device *cdev);
271 void thermal_cooling_device_stats_reinit(struct thermal_cooling_device *cdev);
272 /* used only at binding time */
273 ssize_t trip_point_show(struct device *, struct device_attribute *, char *);
274 ssize_t weight_show(struct device *, struct device_attribute *, char *);
275 ssize_t weight_store(struct device *, struct device_attribute *, const char *,
276 		     size_t);
277 
278 #ifdef CONFIG_THERMAL_STATISTICS
279 void thermal_cooling_device_stats_update(struct thermal_cooling_device *cdev,
280 					 unsigned long new_state);
281 #else
282 static inline void
thermal_cooling_device_stats_update(struct thermal_cooling_device * cdev,unsigned long new_state)283 thermal_cooling_device_stats_update(struct thermal_cooling_device *cdev,
284 				    unsigned long new_state) {}
285 #endif /* CONFIG_THERMAL_STATISTICS */
286 
287 #endif /* __THERMAL_CORE_H__ */
288