blob: 85bbbc450d9908644cbb4356b47a9d6b3c531121 [file] [log] [blame]
Robin Pengc2b5ca92021-02-23 20:00:28 +08001/*
2 * Copyright (C) 2020 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
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080017#include <PowerStatsAidl.h>
Benjamin Schwartz3c712492021-03-18 17:57:13 -070018#include <Gs101CommonDataProviders.h>
Robin Pengc2b5ca92021-02-23 20:00:28 +080019#include "AocStateResidencyDataProvider.h"
Benjamin Schwartz6899dcc2021-04-15 10:39:00 -070020#include "DevfreqStateResidencyDataProvider.h"
Darren Hsu9f8d6812024-01-29 11:26:08 +080021#include <DisplayMrrStateResidencyDataProvider.h>
Robin Pengc2b5ca92021-02-23 20:00:28 +080022#include "DvfsStateResidencyDataProvider.h"
Benjamin Schwartz10e6ca82021-03-15 17:31:52 -070023#include "UfsStateResidencyDataProvider.h"
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080024#include <dataproviders/GenericStateResidencyDataProvider.h>
25#include <dataproviders/IioEnergyMeterDataProvider.h>
26#include <dataproviders/PowerStatsEnergyConsumer.h>
27#include <dataproviders/PowerStatsEnergyAttribution.h>
28#include <dataproviders/PixelStateResidencyDataProvider.h>
Robin Pengc2b5ca92021-02-23 20:00:28 +080029
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080030#include <android-base/logging.h>
31#include <android-base/properties.h>
32#include <android/binder_manager.h>
33#include <android/binder_process.h>
34#include <log/log.h>
Robin Pengc2b5ca92021-02-23 20:00:28 +080035
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080036using aidl::android::hardware::power::stats::AocStateResidencyDataProvider;
Benjamin Schwartz6899dcc2021-04-15 10:39:00 -070037using aidl::android::hardware::power::stats::DevfreqStateResidencyDataProvider;
Darren Hsu9f8d6812024-01-29 11:26:08 +080038using aidl::android::hardware::power::stats::DisplayMrrStateResidencyDataProvider;
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080039using aidl::android::hardware::power::stats::DvfsStateResidencyDataProvider;
Benjamin Schwartz10e6ca82021-03-15 17:31:52 -070040using aidl::android::hardware::power::stats::UfsStateResidencyDataProvider;
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080041using aidl::android::hardware::power::stats::EnergyConsumerType;
42using aidl::android::hardware::power::stats::GenericStateResidencyDataProvider;
43using aidl::android::hardware::power::stats::IioEnergyMeterDataProvider;
44using aidl::android::hardware::power::stats::PixelStateResidencyDataProvider;
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080045using aidl::android::hardware::power::stats::PowerStatsEnergyConsumer;
Robin Pengc2b5ca92021-02-23 20:00:28 +080046
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080047constexpr char kBootHwSoCRev[] = "ro.boot.hw.soc.rev";
Robin Pengc2b5ca92021-02-23 20:00:28 +080048
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080049void addAoC(std::shared_ptr<PowerStats> p) {
Darren Hsu3698b062022-06-17 20:30:18 +080050 // AoC clock is synced from "libaoc.c"
51 static const uint64_t AOC_CLOCK = 4096;
Robin Pengc2b5ca92021-02-23 20:00:28 +080052 std::string prefix = "/sys/devices/platform/19000000.aoc/control/";
53
54 // Add AoC cores (a32, ff1, hf0, and hf1)
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080055 std::vector<std::pair<std::string, std::string>> coreIds = {
56 {"AoC-A32", prefix + "a32_"},
57 {"AoC-FF1", prefix + "ff1_"},
58 {"AoC-HF1", prefix + "hf1_"},
59 {"AoC-HF0", prefix + "hf0_"},
Robin Pengc2b5ca92021-02-23 20:00:28 +080060 };
61 std::vector<std::pair<std::string, std::string>> coreStates = {
62 {"DWN", "off"}, {"RET", "retention"}, {"WFI", "wfi"}};
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -070063 p->addStateResidencyDataProvider(std::make_unique<AocStateResidencyDataProvider>(coreIds,
Darren Hsu3698b062022-06-17 20:30:18 +080064 coreStates, AOC_CLOCK));
Robin Pengc2b5ca92021-02-23 20:00:28 +080065
66 // Add AoC voltage stats
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080067 std::vector<std::pair<std::string, std::string>> voltageIds = {
68 {"AoC-Voltage", prefix + "voltage_"},
Robin Pengc2b5ca92021-02-23 20:00:28 +080069 };
70 std::vector<std::pair<std::string, std::string>> voltageStates = {{"NOM", "nominal"},
71 {"SUD", "super_underdrive"},
72 {"UUD", "ultra_underdrive"},
73 {"UD", "underdrive"}};
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080074 p->addStateResidencyDataProvider(
Darren Hsu3698b062022-06-17 20:30:18 +080075 std::make_unique<AocStateResidencyDataProvider>(voltageIds, voltageStates, AOC_CLOCK));
Robin Pengc2b5ca92021-02-23 20:00:28 +080076
77 // Add AoC monitor mode
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080078 std::vector<std::pair<std::string, std::string>> monitorIds = {
79 {"AoC", prefix + "monitor_"},
Robin Pengc2b5ca92021-02-23 20:00:28 +080080 };
81 std::vector<std::pair<std::string, std::string>> monitorStates = {
82 {"MON", "mode"},
83 };
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -080084 p->addStateResidencyDataProvider(
Darren Hsu3698b062022-06-17 20:30:18 +080085 std::make_unique<AocStateResidencyDataProvider>(monitorIds, monitorStates, AOC_CLOCK));
Darren Hsucce5e9f2022-03-24 07:56:43 +080086
87 // Add AoC restart count
88 const GenericStateResidencyDataProvider::StateResidencyConfig restartCountConfig = {
89 .entryCountSupported = true,
90 .entryCountPrefix = "",
91 .totalTimeSupported = false,
92 .lastEntrySupported = false,
93 };
94 const std::vector<std::pair<std::string, std::string>> restartCountHeaders = {
95 std::make_pair("RESTART", ""),
96 };
97 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
98 cfgs.emplace_back(
99 generateGenericStateResidencyConfigs(restartCountConfig, restartCountHeaders),
100 "AoC-Count", "");
101 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
102 "/sys/devices/platform/19000000.aoc/restart_count", cfgs));
Robin Pengc2b5ca92021-02-23 20:00:28 +0800103}
104
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800105void addDvfsStats(std::shared_ptr<PowerStats> p) {
106 // A constant to represent the number of nanoseconds in one millisecond
107 const int NS_TO_MS = 1000000;
Robin Pengc2b5ca92021-02-23 20:00:28 +0800108
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800109 std::vector<DvfsStateResidencyDataProvider::Config> cfgs;
110
111 cfgs.push_back({"MIF", {
samoub14db4c2021-07-14 04:22:48 +0000112 std::make_pair("3172MHz", "3172000"),
113 std::make_pair("2730MHz", "2730000"),
114 std::make_pair("2535MHz", "2535000"),
115 std::make_pair("2288MHz", "2288000"),
116 std::make_pair("2028MHz", "2028000"),
117 std::make_pair("1716MHz", "1716000"),
118 std::make_pair("1539MHz", "1539000"),
119 std::make_pair("1352MHz", "1352000"),
120 std::make_pair("1014MHz", "1014000"),
121 std::make_pair("845MHz", "845000"),
122 std::make_pair("676MHz", "676000"),
123 std::make_pair("546MHz", "546000"),
124 std::make_pair("421MHz", "421000"),
125 std::make_pair("0MHz", "0"),
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800126 }});
127
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800128 cfgs.push_back({"CL1", {
samoub14db4c2021-07-14 04:22:48 +0000129 std::make_pair("2466MHz", "2466000"),
130 std::make_pair("2393MHz", "2393000"),
131 std::make_pair("2348MHz", "2348000"),
132 std::make_pair("2253MHz", "2253000"),
133 std::make_pair("2130MHz", "2130000"),
134 std::make_pair("1999MHz", "1999000"),
135 std::make_pair("1836MHz", "1836000"),
136 std::make_pair("1663MHz", "1663000"),
137 std::make_pair("1491MHz", "1491000"),
138 std::make_pair("1328MHz", "1328000"),
139 std::make_pair("1197MHz", "1197000"),
140 std::make_pair("1024MHz", "1024000"),
141 std::make_pair("910MHz", "910000"),
142 std::make_pair("799MHz", "799000"),
143 std::make_pair("696MHz", "696000"),
144 std::make_pair("533MHz", "533000"),
145 std::make_pair("400MHz", "400000"),
146 std::make_pair("0MHz", "0"),
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800147 }});
148
Benjamin Schwartzd9e76562021-04-13 14:05:51 -0700149 // B0/B1 chips have different DVFS operating points than A0/A1 SoC
150 const int socRev = android::base::GetIntProperty(kBootHwSoCRev, 0);
151 if (socRev >= 2) {
152 cfgs.push_back({"CL0", {
samoub14db4c2021-07-14 04:22:48 +0000153 std::make_pair("2196MHz", "2196000"),
154 std::make_pair("2098MHz", "2098000"),
155 std::make_pair("2024MHz", "2024000"),
156 std::make_pair("1950MHz", "1950000"),
157 std::make_pair("1803MHz", "1803000"),
158 std::make_pair("1704MHz", "1704000"),
159 std::make_pair("1598MHz", "1598000"),
160 std::make_pair("1401MHz", "1401000"),
161 std::make_pair("1328MHz", "1328000"),
162 std::make_pair("1197MHz", "1197000"),
163 std::make_pair("1098MHz", "1098000"),
164 std::make_pair("930MHz", "930000"),
165 std::make_pair("738MHz", "738000"),
166 std::make_pair("574MHz", "574000"),
167 std::make_pair("300MHz", "300000"),
168 std::make_pair("0MHz", "0"),
Benjamin Schwartzd9e76562021-04-13 14:05:51 -0700169 }});
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800170
Benjamin Schwartzd9e76562021-04-13 14:05:51 -0700171 cfgs.push_back({"CL2", {
samoub14db4c2021-07-14 04:22:48 +0000172 std::make_pair("3195MHz", "3195000"),
173 std::make_pair("3097MHz", "3097000"),
174 std::make_pair("2950MHz", "2950000"),
175 std::make_pair("2850MHz", "2850000"),
176 std::make_pair("2802MHz", "2802000"),
177 std::make_pair("2704MHz", "2704000"),
178 std::make_pair("2630MHz", "2630000"),
179 std::make_pair("2507MHz", "2507000"),
180 std::make_pair("2401MHz", "2401000"),
181 std::make_pair("2252MHz", "2252000"),
182 std::make_pair("2188MHz", "2188000"),
183 std::make_pair("2048MHz", "2048000"),
184 std::make_pair("1826MHz", "1826000"),
185 std::make_pair("1745MHz", "1745000"),
186 std::make_pair("1582MHz", "1582000"),
187 std::make_pair("1426MHz", "1426000"),
188 std::make_pair("1277MHz", "1277000"),
189 std::make_pair("1106MHz", "1106000"),
190 std::make_pair("984MHz", "984000"),
191 std::make_pair("851MHz", "851000"),
192 std::make_pair("500MHz", "500000"),
193 std::make_pair("0MHz", "0"),
Benjamin Schwartzd9e76562021-04-13 14:05:51 -0700194 }});
195
196 cfgs.push_back({"TPU", {
samoued31b732021-08-11 06:17:19 +0000197 std::make_pair("1230MHz", "1230000"),
198 std::make_pair("1066MHz", "1066000"),
199 std::make_pair("800MHz", "800000"),
200 std::make_pair("500MHz", "500000"),
samoub14db4c2021-07-14 04:22:48 +0000201 std::make_pair("226MHz", "226000"),
Benjamin Schwartzd9e76562021-04-13 14:05:51 -0700202 std::make_pair("RET_SLOW", "6"),
203 std::make_pair("S_OFF", "5"),
204 std::make_pair("S_SLOW", "4"),
205 std::make_pair("DS_FAST", "3"),
206 std::make_pair("DS_SLOW", "2"),
207 std::make_pair("DS_OFF", "1"),
208 std::make_pair("OFF", "0"),
209 }});
210 } else {
211 cfgs.push_back({"CL0", {
samoub14db4c2021-07-14 04:22:48 +0000212 std::make_pair("2196MHz", "2196000"),
213 std::make_pair("2098MHz", "2098000"),
214 std::make_pair("2024MHz", "2024000"),
215 std::make_pair("1950MHz", "1950000"),
216 std::make_pair("1868MHz", "1868000"),
217 std::make_pair("1745MHz", "1745000"),
218 std::make_pair("1598MHz", "1598000"),
219 std::make_pair("1459MHz", "1459000"),
220 std::make_pair("1328MHz", "1328000"),
221 std::make_pair("1197MHz", "1197000"),
222 std::make_pair("1098MHz", "1098000"),
223 std::make_pair("889MHz", "889000"),
224 std::make_pair("738MHz", "738000"),
225 std::make_pair("574MHz", "574000"),
226 std::make_pair("300MHz", "300000"),
227 std::make_pair("0MHz", "0"),
Benjamin Schwartzd9e76562021-04-13 14:05:51 -0700228 }});
229
230 cfgs.push_back({"CL2", {
samoub14db4c2021-07-14 04:22:48 +0000231 std::make_pair("3195MHz", "3195000"),
232 std::make_pair("3097MHz", "3097000"),
233 std::make_pair("2999MHz", "2999000"),
234 std::make_pair("2900MHz", "2900000"),
235 std::make_pair("2802MHz", "2802000"),
236 std::make_pair("2704MHz", "2704000"),
237 std::make_pair("2630MHz", "2630000"),
238 std::make_pair("2507MHz", "2507000"),
239 std::make_pair("2302MHz", "2302000"),
240 std::make_pair("2188MHz", "2188000"),
241 std::make_pair("2048MHz", "2048000"),
242 std::make_pair("1901MHz", "1901000"),
243 std::make_pair("1745MHz", "1745000"),
244 std::make_pair("1582MHz", "1582000"),
245 std::make_pair("1426MHz", "1426000"),
246 std::make_pair("1237MHz", "1237000"),
247 std::make_pair("1106MHz", "1106000"),
248 std::make_pair("984MHz", "984000"),
249 std::make_pair("848MHz", "848000"),
250 std::make_pair("500MHz", "500000"),
251 std::make_pair("0MHz", "0"),
Benjamin Schwartzd9e76562021-04-13 14:05:51 -0700252 }});
253
254 cfgs.push_back({"TPU", {
samoub14db4c2021-07-14 04:22:48 +0000255 std::make_pair("1393MHz", "1393000"),
256 std::make_pair("1180MHz", "1180000"),
257 std::make_pair("1049MHz", "1049000"),
258 std::make_pair("967MHz", "967000"),
259 std::make_pair("721MHz", "721000"),
260 std::make_pair("648MHz", "648000"),
261 std::make_pair("455MHz", "455000"),
262 std::make_pair("250MHz", "250000"),
Benjamin Schwartzd9e76562021-04-13 14:05:51 -0700263 std::make_pair("RET_SLOW", "6"),
264 std::make_pair("S_OFF", "5"),
265 std::make_pair("S_SLOW", "4"),
266 std::make_pair("DS_FAST", "3"),
267 std::make_pair("DS_SLOW", "2"),
268 std::make_pair("DS_OFF", "1"),
269 std::make_pair("OFF", "0"),
270 }});
271 }
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800272
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700273 p->addStateResidencyDataProvider(std::make_unique<DvfsStateResidencyDataProvider>(
Benjamin Schwartz82a0c522021-03-09 11:20:04 -0800274 "/sys/devices/platform/acpm_stats/fvp_stats", NS_TO_MS, cfgs));
Robin Pengc2b5ca92021-02-23 20:00:28 +0800275}
276
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800277void addSoC(std::shared_ptr<PowerStats> p) {
278 // A constant to represent the number of nanoseconds in one millisecond.
279 const int NS_TO_MS = 1000000;
Robin Pengc2b5ca92021-02-23 20:00:28 +0800280
Robin Pengc2b5ca92021-02-23 20:00:28 +0800281 // ACPM stats are reported in nanoseconds. The transform function
282 // converts nanoseconds to milliseconds.
283 std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800284 const GenericStateResidencyDataProvider::StateResidencyConfig lpmStateConfig = {
Robin Pengc2b5ca92021-02-23 20:00:28 +0800285 .entryCountSupported = true,
286 .entryCountPrefix = "success_count:",
287 .totalTimeSupported = true,
288 .totalTimePrefix = "total_time_ns:",
289 .totalTimeTransform = acpmNsToMs,
290 .lastEntrySupported = true,
291 .lastEntryPrefix = "last_entry_time_ns:",
292 .lastEntryTransform = acpmNsToMs,
293 };
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800294 const GenericStateResidencyDataProvider::StateResidencyConfig downStateConfig = {
Robin Pengc2b5ca92021-02-23 20:00:28 +0800295 .entryCountSupported = true,
296 .entryCountPrefix = "down_count:",
297 .totalTimeSupported = true,
298 .totalTimePrefix = "total_down_time_ns:",
299 .totalTimeTransform = acpmNsToMs,
300 .lastEntrySupported = true,
301 .lastEntryPrefix = "last_down_time_ns:",
302 .lastEntryTransform = acpmNsToMs,
303 };
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800304 const GenericStateResidencyDataProvider::StateResidencyConfig reqStateConfig = {
Robin Pengc2b5ca92021-02-23 20:00:28 +0800305 .entryCountSupported = true,
306 .entryCountPrefix = "req_up_count:",
307 .totalTimeSupported = true,
308 .totalTimePrefix = "total_req_up_time_ns:",
309 .totalTimeTransform = acpmNsToMs,
310 .lastEntrySupported = true,
311 .lastEntryPrefix = "last_req_up_time_ns:",
312 .lastEntryTransform = acpmNsToMs,
313
314 };
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800315 const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
Robin Pengc2b5ca92021-02-23 20:00:28 +0800316 std::make_pair("SICD", "SICD"),
317 std::make_pair("SLEEP", "SLEEP"),
318 std::make_pair("SLEEP_SLCMON", "SLEEP_SLCMON"),
319 std::make_pair("STOP", "STOP"),
320 };
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800321 const std::vector<std::pair<std::string, std::string>> mifReqStateHeaders = {
Robin Pengc2b5ca92021-02-23 20:00:28 +0800322 std::make_pair("AOC", "AOC"),
323 std::make_pair("GSA", "GSA"),
324 };
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800325 const std::vector<std::pair<std::string, std::string>> slcReqStateHeaders = {
Robin Pengc2b5ca92021-02-23 20:00:28 +0800326 std::make_pair("AOC", "AOC"),
327 };
328
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800329 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
330 cfgs.emplace_back(generateGenericStateResidencyConfigs(lpmStateConfig, powerStateHeaders),
331 "LPM", "LPM:");
332 cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
333 "MIF", "MIF:");
334 cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, mifReqStateHeaders),
335 "MIF-REQ", "MIF_REQ:");
336 cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
337 "SLC", "SLC:");
338 cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, slcReqStateHeaders),
339 "SLC-REQ", "SLC_REQ:");
Robin Pengc2b5ca92021-02-23 20:00:28 +0800340
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700341 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
342 "/sys/devices/platform/acpm_stats/soc_stats", cfgs));
Robin Pengc2b5ca92021-02-23 20:00:28 +0800343}
344
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800345void setEnergyMeter(std::shared_ptr<PowerStats> p) {
Ryan Prichardcbb28ea2024-09-12 13:15:56 -0700346 std::vector<std::string> deviceNames { "s2mpg10-odpm", "s2mpg11-odpm" };
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800347 p->setEnergyMeterDataProvider(std::make_unique<IioEnergyMeterDataProvider>(deviceNames, true));
Robin Pengc2b5ca92021-02-23 20:00:28 +0800348}
349
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800350void addCPUclusters(std::shared_ptr<PowerStats> p) {
Benjamin Schwartzda983cb2021-03-09 15:52:55 -0800351 // A constant to represent the number of nanoseconds in one millisecond.
352 const int NS_TO_MS = 1000000;
353
354 std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
355 const GenericStateResidencyDataProvider::StateResidencyConfig cpuStateConfig = {
356 .entryCountSupported = true,
357 .entryCountPrefix = "down_count:",
358 .totalTimeSupported = true,
359 .totalTimePrefix = "total_down_time_ns:",
360 .totalTimeTransform = acpmNsToMs,
361 .lastEntrySupported = true,
362 .lastEntryPrefix = "last_down_time_ns:",
363 .lastEntryTransform = acpmNsToMs,
364 };
365
366 const std::vector<std::pair<std::string, std::string>> cpuStateHeaders = {
367 std::make_pair("DOWN", ""),
368 };
369
370 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
371 for (std::string name : {"CORE00", "CORE01", "CORE02", "CORE03", "CORE10", "CORE11",
372 "CORE20", "CORE21", "CLUSTER0", "CLUSTER1", "CLUSTER2"}) {
373 cfgs.emplace_back(generateGenericStateResidencyConfigs(cpuStateConfig, cpuStateHeaders),
374 name, name);
375 }
376
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700377 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
378 "/sys/devices/platform/acpm_stats/core_stats", cfgs));
Benjamin Schwartzda983cb2021-03-09 15:52:55 -0800379
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800380 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
381 EnergyConsumerType::CPU_CLUSTER, "CPUCL0", {"S4M_VDD_CPUCL0"}));
382 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
383 EnergyConsumerType::CPU_CLUSTER, "CPUCL1", {"S3M_VDD_CPUCL1"}));
384 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
385 EnergyConsumerType::CPU_CLUSTER, "CPUCL2", {"S2M_VDD_CPUCL2"}));
386}
387
388void addGPU(std::shared_ptr<PowerStats> p) {
389 // Add gpu energy consumer
390 std::map<std::string, int32_t> stateCoeffs;
391 const int socRev = android::base::GetIntProperty(kBootHwSoCRev, 0);
392
393 // B0/B1 chips have different GPU DVFS operating points than A0/A1 SoC
394 if (socRev >= 2) {
395 stateCoeffs = {
samou9db455e2021-03-30 15:58:10 +0000396 {"151000", 642},
397 {"202000", 890},
398 {"251000", 1102},
399 {"302000", 1308},
400 {"351000", 1522},
401 {"400000", 1772},
402 {"471000", 2105},
403 {"510000", 2292},
404 {"572000", 2528},
405 {"701000", 3127},
406 {"762000", 3452},
407 {"848000", 4044}};
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800408 } else {
409 stateCoeffs = {
samou9db455e2021-03-30 15:58:10 +0000410 {"151000", 843},
411 {"302000", 1529},
412 {"455000", 2298},
413 {"572000", 2866},
414 {"670000", 3191}};
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800415 }
416
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700417 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800418 EnergyConsumerType::OTHER, "GPU", {"S2S_VDD_G3D"},
419 {{UID_TIME_IN_STATE, "/sys/devices/platform/1c500000.mali/uid_time_in_state"}},
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700420 stateCoeffs));
samouaeae45a2021-07-14 04:33:53 +0000421
422 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("GPU",
423 "/sys/bus/platform/devices/1c500000.mali"));
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800424}
425
426void addMobileRadio(std::shared_ptr<PowerStats> p)
427{
428 // A constant to represent the number of microseconds in one millisecond.
429 const int US_TO_MS = 1000;
430
431 // modem power_stats are reported in microseconds. The transform function
432 // converts microseconds to milliseconds.
433 std::function<uint64_t(uint64_t)> modemUsToMs = [](uint64_t a) { return a / US_TO_MS; };
434 const GenericStateResidencyDataProvider::StateResidencyConfig powerStateConfig = {
Robin Pengc2b5ca92021-02-23 20:00:28 +0800435 .entryCountSupported = true,
436 .entryCountPrefix = "count:",
437 .totalTimeSupported = true,
438 .totalTimePrefix = "duration_usec:",
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800439 .totalTimeTransform = modemUsToMs,
Robin Pengc2b5ca92021-02-23 20:00:28 +0800440 .lastEntrySupported = true,
441 .lastEntryPrefix = "last_entry_timestamp_usec:",
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800442 .lastEntryTransform = modemUsToMs,
Robin Pengc2b5ca92021-02-23 20:00:28 +0800443 };
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800444 const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
445 std::make_pair("SLEEP", "SLEEP:"),
Robin Pengc2b5ca92021-02-23 20:00:28 +0800446 };
447
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800448 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
449 cfgs.emplace_back(generateGenericStateResidencyConfigs(powerStateConfig, powerStateHeaders),
450 "MODEM", "");
Robin Pengc2b5ca92021-02-23 20:00:28 +0800451
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700452 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800453 "/sys/devices/platform/cpif/modem/power_stats", cfgs));
Robin Pengc2b5ca92021-02-23 20:00:28 +0800454
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800455 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
456 EnergyConsumerType::MOBILE_RADIO, "MODEM", {"VSYS_PWR_MODEM", "VSYS_PWR_RFFE"}));
Robin Pengc2b5ca92021-02-23 20:00:28 +0800457}
458
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800459void addGNSS(std::shared_ptr<PowerStats> p)
460{
Benjamin Schwartz3cc93712021-04-06 16:00:58 -0700461 // A constant to represent the number of microseconds in one millisecond.
462 const int US_TO_MS = 1000;
463
464 // gnss power_stats are reported in microseconds. The transform function
465 // converts microseconds to milliseconds.
466 std::function<uint64_t(uint64_t)> gnssUsToMs = [](uint64_t a) { return a / US_TO_MS; };
467
468 const GenericStateResidencyDataProvider::StateResidencyConfig gnssStateConfig = {
469 .entryCountSupported = true,
470 .entryCountPrefix = "count:",
471 .totalTimeSupported = true,
472 .totalTimePrefix = "duration_usec:",
473 .totalTimeTransform = gnssUsToMs,
474 .lastEntrySupported = true,
475 .lastEntryPrefix = "last_entry_timestamp_usec:",
476 .lastEntryTransform = gnssUsToMs,
477 };
478
479 const std::vector<std::pair<std::string, std::string>> gnssStateHeaders = {
480 std::make_pair("ON", "GPS_ON:"),
481 std::make_pair("OFF", "GPS_OFF:"),
482 };
483
484 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
485 cfgs.emplace_back(generateGenericStateResidencyConfigs(gnssStateConfig, gnssStateHeaders),
486 "GPS", "");
487
488 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
489 "/dev/bbd_pwrstat", cfgs));
490
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800491 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
492 EnergyConsumerType::GNSS, "GPS", {"L9S_GNSS_CORE"}));
493}
Robin Pengc2b5ca92021-02-23 20:00:28 +0800494
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800495void addPCIe(std::shared_ptr<PowerStats> p) {
496 // Add PCIe power entities for Modem and WiFi
497 const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
498 .entryCountSupported = true,
499 .entryCountPrefix = "Cumulative count:",
500 .totalTimeSupported = true,
501 .totalTimePrefix = "Cumulative duration msec:",
502 .lastEntrySupported = true,
503 .lastEntryPrefix = "Last entry timestamp msec:",
504 };
505 const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
506 std::make_pair("UP", "Link up:"),
507 std::make_pair("DOWN", "Link down:"),
508 };
Robin Pengc2b5ca92021-02-23 20:00:28 +0800509
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800510 // Add PCIe - Modem
511 const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieModemCfgs = {
512 {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "PCIe-Modem",
513 "Version: 1"}
514 };
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700515
516 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
517 "/sys/devices/platform/11920000.pcie/power_stats", pcieModemCfgs));
Robin Pengc2b5ca92021-02-23 20:00:28 +0800518
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800519 // Add PCIe - WiFi
520 const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieWifiCfgs = {
521 {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders),
522 "PCIe-WiFi", "Version: 1"}
523 };
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700524
525 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
526 "/sys/devices/platform/14520000.pcie/power_stats", pcieWifiCfgs));
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800527}
Robin Pengc2b5ca92021-02-23 20:00:28 +0800528
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800529void addWifi(std::shared_ptr<PowerStats> p) {
530 // The transform function converts microseconds to milliseconds.
531 std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; };
532 const GenericStateResidencyDataProvider::StateResidencyConfig stateConfig = {
533 .entryCountSupported = true,
534 .entryCountPrefix = "count:",
535 .totalTimeSupported = true,
536 .totalTimePrefix = "duration_usec:",
537 .totalTimeTransform = usecToMs,
538 .lastEntrySupported = true,
539 .lastEntryPrefix = "last_entry_timestamp_usec:",
540 .lastEntryTransform = usecToMs,
541 };
542 const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
543 .entryCountSupported = true,
544 .entryCountPrefix = "count:",
545 .totalTimeSupported = true,
546 .totalTimePrefix = "duration_usec:",
547 .totalTimeTransform = usecToMs,
548 .lastEntrySupported = false,
549 };
Robin Pengc2b5ca92021-02-23 20:00:28 +0800550
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800551 const std::vector<std::pair<std::string, std::string>> stateHeaders = {
552 std::make_pair("AWAKE", "AWAKE:"),
553 std::make_pair("ASLEEP", "ASLEEP:"),
Robin Pengc2b5ca92021-02-23 20:00:28 +0800554
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800555 };
556 const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
557 std::make_pair("L0", "L0:"),
558 std::make_pair("L1", "L1:"),
559 std::make_pair("L1_1", "L1_1:"),
560 std::make_pair("L1_2", "L1_2:"),
561 std::make_pair("L2", "L2:"),
562 };
563
564 const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs = {
565 {generateGenericStateResidencyConfigs(stateConfig, stateHeaders), "WIFI", "WIFI"},
566 {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "WIFI-PCIE",
567 "WIFI-PCIE"}
568 };
569
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700570 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>("/sys/wifi/power_stats",
571 cfgs));
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800572}
573
Benjamin Schwartz10e6ca82021-03-15 17:31:52 -0700574void addUfs(std::shared_ptr<PowerStats> p) {
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700575 p->addStateResidencyDataProvider(std::make_unique<UfsStateResidencyDataProvider>("/sys/bus/platform/devices/14700000.ufs/ufs_stats/"));
Benjamin Schwartz10e6ca82021-03-15 17:31:52 -0700576}
577
Benjamin Schwartz2219a992021-04-13 15:43:41 -0700578void addPowerDomains(std::shared_ptr<PowerStats> p) {
579 // A constant to represent the number of nanoseconds in one millisecond.
580 const int NS_TO_MS = 1000000;
581
582 std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
583 const GenericStateResidencyDataProvider::StateResidencyConfig cpuStateConfig = {
584 .entryCountSupported = true,
585 .entryCountPrefix = "on_count:",
586 .totalTimeSupported = true,
587 .totalTimePrefix = "total_on_time_ns:",
588 .totalTimeTransform = acpmNsToMs,
589 .lastEntrySupported = true,
590 .lastEntryPrefix = "last_on_time_ns:",
591 .lastEntryTransform = acpmNsToMs,
592 };
593
594 const std::vector<std::pair<std::string, std::string>> cpuStateHeaders = {
595 std::make_pair("ON", ""),
596 };
597
598 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
599 for (std::string name : {"pd-tpu", "pd-bo", "pd-tnr", "pd-gdc", "pd-mcsc", "pd-ipp",
600 "pd-g3aa", "pd-dns", "pd-itp", "pd-pdp", "pd-csis",
601 "pd-mfc", "pd-g2d", "pd-dpu", "pd-disp", "pd-hsi0",
602 "pd-embedded_g3d", "pd-g3d", "pd-eh"}) {
603 cfgs.emplace_back(generateGenericStateResidencyConfigs(cpuStateConfig, cpuStateHeaders),
604 name, name + ":");
605 }
606
607 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
608 "/sys/devices/platform/acpm_stats/pd_stats", cfgs));
609}
610
Benjamin Schwartz6899dcc2021-04-15 10:39:00 -0700611void addDevfreq(std::shared_ptr<PowerStats> p) {
Darren Hsu29832dc2022-02-10 12:54:58 +0800612 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
613 "INT",
Benjamin Schwartz630f4712021-05-05 11:42:52 -0700614 "/sys/devices/platform/17000020.devfreq_int/devfreq/17000020.devfreq_int"));
615
Darren Hsu29832dc2022-02-10 12:54:58 +0800616 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
617 "INTCAM",
Benjamin Schwartz630f4712021-05-05 11:42:52 -0700618 "/sys/devices/platform/17000030.devfreq_intcam/devfreq/17000030.devfreq_intcam"));
619
Darren Hsu29832dc2022-02-10 12:54:58 +0800620 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
621 "DISP",
622 "/sys/devices/platform/17000040.devfreq_disp/devfreq/17000040.devfreq_disp"));
623
624 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
625 "CAM",
Benjamin Schwartz630f4712021-05-05 11:42:52 -0700626 "/sys/devices/platform/17000050.devfreq_cam/devfreq/17000050.devfreq_cam"));
627
Darren Hsu29832dc2022-02-10 12:54:58 +0800628 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
629 "TNR",
Benjamin Schwartz630f4712021-05-05 11:42:52 -0700630 "/sys/devices/platform/17000060.devfreq_tnr/devfreq/17000060.devfreq_tnr"));
Darren Hsu29832dc2022-02-10 12:54:58 +0800631
632 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
633 "MFC",
634 "/sys/devices/platform/17000070.devfreq_mfc/devfreq/17000070.devfreq_mfc"));
Darren Hsu916a8282022-03-16 17:22:35 +0800635
636 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
637 "BO",
638 "/sys/devices/platform/17000080.devfreq_bo/devfreq/17000080.devfreq_bo"));
Benjamin Schwartz6899dcc2021-04-15 10:39:00 -0700639}
640
samou513c4af2021-04-16 11:17:18 +0000641void addTPU(std::shared_ptr<PowerStats> p) {
642 std::map<std::string, int32_t> stateCoeffs;
643
644 stateCoeffs = {
samouc1cf9f82021-05-25 21:03:38 +0000645 {"226000", 49.25},
646 {"500000", 73.80},
647 {"800000", 86.99},
648 {"1066000", 103.93},
649 {"1230000", 108.10}};
samou513c4af2021-04-16 11:17:18 +0000650
651 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
652 EnergyConsumerType::OTHER, "TPU", {"S10M_VDD_TPU"},
Richard Hsu82a677c2021-08-10 17:10:49 -0700653 {{UID_TIME_IN_STATE, "/sys/class/edgetpu/edgetpu-soc/device/tpu_usage"}},
samou513c4af2021-04-16 11:17:18 +0000654 stateCoeffs));
655}
656
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800657/**
658 * Unlike other data providers, which source power entity state residency data from the kernel,
659 * this data provider acts as a general-purpose channel for state residency data providers
660 * that live in user space. Entities are defined here and user space clients of this provider's
661 * vendor service register callbacks to provide state residency data for their given pwoer entity.
662 */
663void addPixelStateResidencyDataProvider(std::shared_ptr<PowerStats> p) {
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700664
665 auto pixelSdp = std::make_unique<PixelStateResidencyDataProvider>();
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800666
667 pixelSdp->addEntity("Bluetooth", {{0, "Idle"}, {1, "Active"}, {2, "Tx"}, {3, "Rx"}});
668
669 pixelSdp->start();
Benjamin Schwartz6b4c8b42021-03-17 16:53:22 -0700670
671 p->addStateResidencyDataProvider(std::move(pixelSdp));
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800672}
673
Darren Hsu9f8d6812024-01-29 11:26:08 +0800674void addDisplayMrr(std::shared_ptr<PowerStats> p) {
675 p->addStateResidencyDataProvider(std::make_unique<DisplayMrrStateResidencyDataProvider>(
676 "Display", "/sys/class/drm/card0/device/primary-panel/"));
677}
678
Benjamin Schwartz3c712492021-03-18 17:57:13 -0700679void addGs101CommonDataProviders(std::shared_ptr<PowerStats> p) {
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800680 setEnergyMeter(p);
681
682 addPixelStateResidencyDataProvider(p);
683 addAoC(p);
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800684 addDvfsStats(p);
685 addSoC(p);
686 addCPUclusters(p);
687 addGPU(p);
688 addMobileRadio(p);
689 addGNSS(p);
Benjamin Schwartz0d6392e2021-03-09 09:02:06 -0800690 addPCIe(p);
691 addWifi(p);
Benjamin Schwartz10e6ca82021-03-15 17:31:52 -0700692 addUfs(p);
Benjamin Schwartz2219a992021-04-13 15:43:41 -0700693 addPowerDomains(p);
Benjamin Schwartz6899dcc2021-04-15 10:39:00 -0700694 addDevfreq(p);
samou513c4af2021-04-16 11:17:18 +0000695 addTPU(p);
Robin Pengc2b5ca92021-02-23 20:00:28 +0800696}
Benjamin Schwartze171ad02021-04-21 11:35:16 -0700697
698void addNFC(std::shared_ptr<PowerStats> p, const std::string& path) {
699 const GenericStateResidencyDataProvider::StateResidencyConfig nfcStateConfig = {
700 .entryCountSupported = true,
701 .entryCountPrefix = "Cumulative count:",
702 .totalTimeSupported = true,
703 .totalTimePrefix = "Cumulative duration msec:",
704 .lastEntrySupported = true,
705 .lastEntryPrefix = "Last entry timestamp msec:",
706 };
707 const std::vector<std::pair<std::string, std::string>> nfcStateHeaders = {
708 std::make_pair("IDLE", "Idle mode:"),
709 std::make_pair("ACTIVE", "Active mode:"),
710 std::make_pair("ACTIVE-RW", "Active Reader/Writer mode:"),
711 };
712
713 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
714 cfgs.emplace_back(generateGenericStateResidencyConfigs(nfcStateConfig, nfcStateHeaders),
715 "NFC", "NFC subsystem");
716
717 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
718 path, cfgs));
719}