1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_INCLUDE_HARDWARE_THERMAL_H
18 #define ANDROID_INCLUDE_HARDWARE_THERMAL_H
19 
20 #include <stdbool.h>
21 #include <stdint.h>
22 #include <float.h>
23 #include <sys/cdefs.h>
24 #include <sys/types.h>
25 
26 #include <hardware/hardware.h>
27 
28 __BEGIN_DECLS
29 
30 #define THERMAL_HARDWARE_MODULE_API_VERSION_0_1 HARDWARE_MODULE_API_VERSION(0, 1)
31 
32 #define THERMAL_HARDWARE_MODULE_ID "thermal"
33 
34 // This value is returned if a desired temperature is not available.
35 #define UNKNOWN_TEMPERATURE -FLT_MAX
36 
37 /** Device temperature types. Must be kept in sync with
38  * framework/base/core/java/android/os/HardwarePropertiesManager.java
39  */
40 enum temperature_type {
41     DEVICE_TEMPERATURE_UNKNOWN  = -1,
42     DEVICE_TEMPERATURE_CPU      = 0,
43     DEVICE_TEMPERATURE_GPU      = 1,
44     DEVICE_TEMPERATURE_BATTERY  = 2,
45     DEVICE_TEMPERATURE_SKIN     = 3
46 };
47 
48 enum cooling_type {
49     /** Fan cooling device speed in RPM. */
50     FAN_RPM                     = 0,
51 };
52 
53 typedef struct {
54   /**
55    * This temperature's type.
56    */
57   enum temperature_type type;
58 
59   /**
60    * Name of this temperature.
61    * All temperatures of the same "type" must have a different "name".
62    */
63   const char *name;
64 
65   /**
66    * Current temperature in Celsius. If not available set by HAL to
67    * UNKNOWN_TEMPERATURE.
68    * Current temperature can be in any units if
69    * type=DEVICE_TEMPERATURE_UNKNOWN.
70    */
71   float current_value;
72 
73   /**
74    * Throttling temperature constant for this temperature.
75    * If not available, set by HAL to UNKNOWN_TEMPERATURE.
76    */
77   float throttling_threshold;
78 
79   /**
80    * Shutdown temperature constant for this temperature.
81    * If not available, set by HAL to UNKNOWN_TEMPERATURE.
82    */
83   float shutdown_threshold;
84 
85   /**
86    * Threshold temperature above which the VR mode clockrate minimums cannot
87    * be maintained for this device.
88    * If not available, set by HAL to UNKNOWN_TEMPERATURE.
89    */
90   float vr_throttling_threshold;
91 } temperature_t;
92 
93 typedef struct {
94     /**
95      * This cooling device type.
96      */
97     enum cooling_type type;
98 
99     /**
100      * Name of this cooling device.
101      * All cooling devices of the same "type" must have a different "name".
102      */
103     const char *name;
104 
105     /**
106      * Current cooling device value. Units depend on cooling device "type".
107      */
108     float current_value;
109 } cooling_device_t;
110 
111 typedef struct {
112     /**
113      * Name of this CPU.
114      * All CPUs must have a different "name".
115      */
116     const char *name;
117 
118     /**
119      * Active time since the last boot in ms.
120      */
121     uint64_t active;
122 
123     /**
124      * Total time since the last boot in ms.
125      */
126     uint64_t total;
127 
128     /**
129      * Is set to true when a core is online.
130      * If the core is offline, all other members except |name| should be ignored.
131      */
132     bool is_online;
133 } cpu_usage_t;
134 
135 typedef struct thermal_module {
136     struct hw_module_t common;
137 
138     /*
139      * (*getTemperatures) is called to get temperatures in Celsius.
140      *
141      * @param list If NULL, this method only returns number of temperatures
142      *     and caller should allocate a temperature_t array with that number
143      *     of elements.
144      *     Caller is responsible for allocating temperature_t array |list| of
145      *     large enough size (not less than returned number of temperatures).
146      *     If |list| is not NULL and this method returns non-negative value,
147      *     it's filled with the current temperatures. If the resulting
148      *     temperature list is longer than |size| elements, the remaining
149      *     temperatures are discarded and not stored, but counted for the value
150      *     returned by this method.
151      *     The order of temperatures of built-in devices (such as CPUs, GPUs and
152      *     etc.) in the |list| is kept the same regardless the number of calls
153      *     to this method even if they go offline, if these devices exist on
154      *     boot. The method always returns and never removes such temperatures.
155      * @param size The capacity of |list|, in elements, if |list| is not NULL.
156      *
157      * @return number of temperatures or negative value -errno on error.
158      *
159      */
160     ssize_t (*getTemperatures)(struct thermal_module *module, temperature_t *list, size_t size);
161 
162     /*
163      * (*getCpuUsages) is called to get CPU usage information of each core:
164      *     active and total times in ms since first boot.
165      *
166      * @param list If NULL, this method only returns number of cores and caller
167      *     should allocate a cpu_usage_t array with that number of elements.
168      *     Caller is responsible for allocating cpu_usage_t array |list| of
169      *     large enough size (not less than returned number of CPUs).
170      *     If |list| is not NULL and this method returns non-negative value,
171      *     it's filled with the current CPU usages.
172      *     The order of CPUs in the |list| is kept the same regardless the
173      *     number of calls to this method.
174      *
175      * @return constant number of CPUs or negative value -errno on error.
176      *
177      */
178     ssize_t (*getCpuUsages)(struct thermal_module *module, cpu_usage_t *list);
179 
180     /*
181      * (*getCoolingDevices) is called to get the cooling devices information.
182      *
183      * @param list If NULL, this method only returns number of cooling devices
184      *     and caller should allocate a cooling_device_t array with that number
185      *     of elements.
186      *     Caller is responsible for allocating cooling_device_t array |list| of
187      *     large enough size (not less than returned number of cooling devices).
188      *     If |list| is not NULL and this method returns non-negative value,
189      *     it's filled with the current cooling device information. If the
190      *     resulting cooling device list is longer than |size| elements, the
191      *     remaining cooling device informations are discarded and not stored,
192      *     but counted for the value returned by this method.
193      *     The order of built-in coolling devices in the |list| is kept the same
194      *     regardless the number of calls to this method even if they go
195      *     offline, if these devices exist on boot. The method always returns
196      *     and never removes from the list such coolling devices.
197      * @param size The capacity of |list|, in elements, if |list| is not NULL.
198      *
199      * @return number of cooling devices or negative value -errno on error.
200      *
201      */
202     ssize_t (*getCoolingDevices)(struct thermal_module *module, cooling_device_t *list,
203                                  size_t size);
204 
205 } thermal_module_t;
206 
207 __END_DECLS
208 
209 #endif  // ANDROID_INCLUDE_HARDWARE_THERMAL_H
210