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