1 /*
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
17 #include <PowerStatsAidl.h>
18 #include <Gs201CommonDataProviders.h>
19 #include <AocTimedStateResidencyDataProvider.h>
20 #include <DevfreqStateResidencyDataProvider.h>
21 #include <DvfsStateResidencyDataProvider.h>
22 #include <UfsStateResidencyDataProvider.h>
23 #include <dataproviders/GenericStateResidencyDataProvider.h>
24 #include <dataproviders/IioEnergyMeterDataProvider.h>
25 #include <dataproviders/PowerStatsEnergyConsumer.h>
26 #include <dataproviders/PowerStatsEnergyAttribution.h>
27 #include <dataproviders/PixelStateResidencyDataProvider.h>
28 #include <dataproviders/WlanStateResidencyDataProvider.h>
29
30 #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>
35
36 using aidl::android::hardware::power::stats::AocTimedStateResidencyDataProvider;
37 using aidl::android::hardware::power::stats::DevfreqStateResidencyDataProvider;
38 using aidl::android::hardware::power::stats::DvfsStateResidencyDataProvider;
39 using aidl::android::hardware::power::stats::UfsStateResidencyDataProvider;
40 using aidl::android::hardware::power::stats::EnergyConsumerType;
41 using aidl::android::hardware::power::stats::GenericStateResidencyDataProvider;
42 using aidl::android::hardware::power::stats::IioEnergyMeterDataProvider;
43 using aidl::android::hardware::power::stats::PixelStateResidencyDataProvider;
44 using aidl::android::hardware::power::stats::PowerStatsEnergyConsumer;
45 using aidl::android::hardware::power::stats::WlanStateResidencyDataProvider;
46
47 // TODO (b/181070764) (b/182941084):
48 // Remove this when Wifi/BT energy consumption models are available or revert before ship
49 using aidl::android::hardware::power::stats::EnergyConsumerResult;
50 using aidl::android::hardware::power::stats::Channel;
51 using aidl::android::hardware::power::stats::EnergyMeasurement;
52 class PlaceholderEnergyConsumer : public PowerStats::IEnergyConsumer {
53 public:
PlaceholderEnergyConsumer(std::shared_ptr<PowerStats> p,EnergyConsumerType type,std::string name)54 PlaceholderEnergyConsumer(std::shared_ptr<PowerStats> p, EnergyConsumerType type,
55 std::string name) : kType(type), kName(name), mPowerStats(p), mChannelId(-1) {
56 std::vector<Channel> channels;
57 mPowerStats->getEnergyMeterInfo(&channels);
58
59 for (const auto &c : channels) {
60 if (c.name == "VSYS_PWR_WLAN_BT") {
61 mChannelId = c.id;
62 break;
63 }
64 }
65 }
getInfo()66 std::pair<EnergyConsumerType, std::string> getInfo() override { return {kType, kName}; }
67
getEnergyConsumed()68 std::optional<EnergyConsumerResult> getEnergyConsumed() override {
69 int64_t totalEnergyUWs = 0;
70 int64_t timestampMs = 0;
71 if (mChannelId != -1) {
72 std::vector<EnergyMeasurement> measurements;
73 if (mPowerStats->readEnergyMeter({mChannelId}, &measurements).isOk()) {
74 for (const auto &m : measurements) {
75 totalEnergyUWs += m.energyUWs;
76 timestampMs = m.timestampMs;
77 }
78 } else {
79 LOG(ERROR) << "Failed to read energy meter";
80 return {};
81 }
82 }
83
84 return EnergyConsumerResult{.timestampMs = timestampMs,
85 .energyUWs = totalEnergyUWs>>1};
86 }
87
getConsumerName()88 std::string getConsumerName() override {
89 return kName;
90 };
91
92 private:
93 const EnergyConsumerType kType;
94 const std::string kName;
95 std::shared_ptr<PowerStats> mPowerStats;
96 int32_t mChannelId;
97 };
98
addPlaceholderEnergyConsumers(std::shared_ptr<PowerStats> p)99 void addPlaceholderEnergyConsumers(std::shared_ptr<PowerStats> p) {
100 p->addEnergyConsumer(
101 std::make_unique<PlaceholderEnergyConsumer>(p, EnergyConsumerType::WIFI, "Wifi"));
102 p->addEnergyConsumer(
103 std::make_unique<PlaceholderEnergyConsumer>(p, EnergyConsumerType::BLUETOOTH, "BT"));
104 }
105
addAoC(std::shared_ptr<PowerStats> p)106 void addAoC(std::shared_ptr<PowerStats> p) {
107 // When the given timeout is 0, the timeout will be replaced with "120ms * statesCount".
108 static const uint64_t TIMEOUT_MILLIS = 0;
109 // AoC clock is synced from "libaoc.c"
110 static const uint64_t AOC_CLOCK = 24576;
111 std::string prefix = "/sys/devices/platform/19000000.aoc/control/";
112
113 // Add AoC cores (a32, ff1, hf0, and hf1)
114 std::vector<std::pair<std::string, std::string>> coreIds = {
115 {"AoC-A32", prefix + "a32_"},
116 {"AoC-FF1", prefix + "ff1_"},
117 {"AoC-HF1", prefix + "hf1_"},
118 {"AoC-HF0", prefix + "hf0_"},
119 };
120 std::vector<std::pair<std::string, std::string>> coreStates = {
121 {"DWN", "off"}, {"RET", "retention"}, {"WFI", "wfi"}};
122 p->addStateResidencyDataProvider(std::make_unique<AocTimedStateResidencyDataProvider>(coreIds,
123 coreStates, TIMEOUT_MILLIS, AOC_CLOCK));
124
125 // Add AoC voltage stats
126 std::vector<std::pair<std::string, std::string>> voltageIds = {
127 {"AoC-Voltage", prefix + "voltage_"},
128 };
129 std::vector<std::pair<std::string, std::string>> voltageStates = {{"NOM", "nominal"},
130 {"SUD", "super_underdrive"},
131 {"UUD", "ultra_underdrive"},
132 {"UD", "underdrive"}};
133 p->addStateResidencyDataProvider(
134 std::make_unique<AocTimedStateResidencyDataProvider>(voltageIds, voltageStates,
135 TIMEOUT_MILLIS, AOC_CLOCK));
136
137 // Add AoC monitor mode
138 std::vector<std::pair<std::string, std::string>> monitorIds = {
139 {"AoC", prefix + "monitor_"},
140 };
141 std::vector<std::pair<std::string, std::string>> monitorStates = {
142 {"MON", "mode"},
143 };
144 p->addStateResidencyDataProvider(
145 std::make_unique<AocTimedStateResidencyDataProvider>(monitorIds, monitorStates,
146 TIMEOUT_MILLIS, AOC_CLOCK));
147
148 // Add AoC restart count
149 const GenericStateResidencyDataProvider::StateResidencyConfig restartCountConfig = {
150 .entryCountSupported = true,
151 .entryCountPrefix = "",
152 .totalTimeSupported = false,
153 .lastEntrySupported = false,
154 };
155 const std::vector<std::pair<std::string, std::string>> restartCountHeaders = {
156 std::make_pair("RESTART", ""),
157 };
158 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
159 cfgs.emplace_back(
160 generateGenericStateResidencyConfigs(restartCountConfig, restartCountHeaders),
161 "AoC-Count", "");
162 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
163 "/sys/devices/platform/19000000.aoc/restart_count", cfgs));
164 }
165
addDvfsStats(std::shared_ptr<PowerStats> p)166 void addDvfsStats(std::shared_ptr<PowerStats> p) {
167 // A constant to represent the number of nanoseconds in one millisecond
168 const int NS_TO_MS = 1000000;
169
170 std::vector<DvfsStateResidencyDataProvider::Config> cfgs;
171
172 cfgs.push_back({"TPU", {
173 std::make_pair("1066MHz", "1066000"),
174 std::make_pair("845MHz", "845000"),
175 std::make_pair("627MHz", "627000"),
176 std::make_pair("401MHz", "401000"),
177 std::make_pair("226MHz", "226000"),
178 std::make_pair("0MHz", "0"),
179 }});
180
181 cfgs.push_back({"AUR", {
182 std::make_pair("1160MHz", "1160000"),
183 std::make_pair("750MHz", "750000"),
184 std::make_pair("373MHz", "373000"),
185 std::make_pair("178MHz", "178000"),
186 std::make_pair("0MHz", "0"),
187 }});
188
189 p->addStateResidencyDataProvider(std::make_unique<DvfsStateResidencyDataProvider>(
190 "/sys/devices/platform/acpm_stats/fvp_stats", NS_TO_MS, cfgs));
191 }
192
addSoC(std::shared_ptr<PowerStats> p)193 void addSoC(std::shared_ptr<PowerStats> p) {
194 // A constant to represent the number of nanoseconds in one millisecond.
195 const int NS_TO_MS = 1000000;
196
197 // ACPM stats are reported in nanoseconds. The transform function
198 // converts nanoseconds to milliseconds.
199 std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
200 const GenericStateResidencyDataProvider::StateResidencyConfig lpmStateConfig = {
201 .entryCountSupported = true,
202 .entryCountPrefix = "success_count:",
203 .totalTimeSupported = true,
204 .totalTimePrefix = "total_time_ns:",
205 .totalTimeTransform = acpmNsToMs,
206 .lastEntrySupported = true,
207 .lastEntryPrefix = "last_entry_time_ns:",
208 .lastEntryTransform = acpmNsToMs,
209 };
210 const GenericStateResidencyDataProvider::StateResidencyConfig downStateConfig = {
211 .entryCountSupported = true,
212 .entryCountPrefix = "down_count:",
213 .totalTimeSupported = true,
214 .totalTimePrefix = "total_down_time_ns:",
215 .totalTimeTransform = acpmNsToMs,
216 .lastEntrySupported = true,
217 .lastEntryPrefix = "last_down_time_ns:",
218 .lastEntryTransform = acpmNsToMs,
219 };
220 const GenericStateResidencyDataProvider::StateResidencyConfig reqStateConfig = {
221 .entryCountSupported = true,
222 .entryCountPrefix = "req_up_count:",
223 .totalTimeSupported = true,
224 .totalTimePrefix = "total_req_up_time_ns:",
225 .totalTimeTransform = acpmNsToMs,
226 .lastEntrySupported = true,
227 .lastEntryPrefix = "last_req_up_time_ns:",
228 .lastEntryTransform = acpmNsToMs,
229
230 };
231 const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
232 std::make_pair("SICD", "SICD"),
233 std::make_pair("SLEEP", "SLEEP"),
234 std::make_pair("SLEEP_SLCMON", "SLEEP_SLCMON"),
235 std::make_pair("SLEEP_HSI1ON", "SLEEP_HSI1ON"),
236 std::make_pair("STOP", "STOP"),
237 };
238 const std::vector<std::pair<std::string, std::string>> mifReqStateHeaders = {
239 std::make_pair("AOC", "AOC"),
240 std::make_pair("GSA", "GSA"),
241 std::make_pair("TPU", "TPU"),
242 };
243 const std::vector<std::pair<std::string, std::string>> slcReqStateHeaders = {
244 std::make_pair("AOC", "AOC"),
245 };
246
247 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
248 cfgs.emplace_back(generateGenericStateResidencyConfigs(lpmStateConfig, powerStateHeaders),
249 "LPM", "LPM:");
250 cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
251 "MIF", "MIF:");
252 cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, mifReqStateHeaders),
253 "MIF-REQ", "MIF_REQ:");
254 cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
255 "SLC", "SLC:");
256 cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, slcReqStateHeaders),
257 "SLC-REQ", "SLC_REQ:");
258
259 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
260 "/sys/devices/platform/acpm_stats/soc_stats", cfgs));
261 }
262
setEnergyMeter(std::shared_ptr<PowerStats> p)263 void setEnergyMeter(std::shared_ptr<PowerStats> p) {
264 std::vector<const std::string> deviceNames { "s2mpg12-odpm", "s2mpg13-odpm" };
265 p->setEnergyMeterDataProvider(std::make_unique<IioEnergyMeterDataProvider>(deviceNames, true));
266 }
267
addCPUclusters(std::shared_ptr<PowerStats> p)268 void addCPUclusters(std::shared_ptr<PowerStats> p) {
269 // A constant to represent the number of nanoseconds in one millisecond.
270 const int NS_TO_MS = 1000000;
271
272 std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
273 const GenericStateResidencyDataProvider::StateResidencyConfig cpuStateConfig = {
274 .entryCountSupported = true,
275 .entryCountPrefix = "down_count:",
276 .totalTimeSupported = true,
277 .totalTimePrefix = "total_down_time_ns:",
278 .totalTimeTransform = acpmNsToMs,
279 .lastEntrySupported = true,
280 .lastEntryPrefix = "last_down_time_ns:",
281 .lastEntryTransform = acpmNsToMs,
282 };
283
284 const std::vector<std::pair<std::string, std::string>> cpuStateHeaders = {
285 std::make_pair("DOWN", ""),
286 };
287
288 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
289 for (std::string name : {"CORE00", "CORE01", "CORE02", "CORE03", "CORE10", "CORE11",
290 "CORE20", "CORE21", "CLUSTER0", "CLUSTER1", "CLUSTER2"}) {
291 cfgs.emplace_back(generateGenericStateResidencyConfigs(cpuStateConfig, cpuStateHeaders),
292 name, name);
293 }
294
295 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
296 "/sys/devices/platform/acpm_stats/core_stats", cfgs));
297
298 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
299 EnergyConsumerType::CPU_CLUSTER, "CPUCL0", {"S4M_VDD_CPUCL0"}));
300 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
301 EnergyConsumerType::CPU_CLUSTER, "CPUCL1", {"S3M_VDD_CPUCL1"}));
302 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
303 EnergyConsumerType::CPU_CLUSTER, "CPUCL2", {"S2M_VDD_CPUCL2"}));
304 }
305
addGPU(std::shared_ptr<PowerStats> p)306 void addGPU(std::shared_ptr<PowerStats> p) {
307 // Add gpu energy consumer
308 std::map<std::string, int32_t> stateCoeffs;
309
310 // TODO (b/197721618): Measuring the GPU power numbers
311 stateCoeffs = {
312 {"202000", 890},
313 {"251000", 1102},
314 {"302000", 1308},
315 {"351000", 1522},
316 {"400000", 1772},
317 {"471000", 2105},
318 {"510000", 2292},
319 {"572000", 2528},
320 {"701000", 3127},
321 {"762000", 3452},
322 {"848000", 4044}};
323
324 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
325 EnergyConsumerType::OTHER, "GPU", {"S8S_VDD_G3D_L2", "S2S_VDD_G3D"},
326 {{UID_TIME_IN_STATE, "/sys/devices/platform/28000000.mali/uid_time_in_state"}},
327 stateCoeffs));
328
329 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("GPU",
330 "/sys/devices/platform/28000000.mali"));
331 }
332
addMobileRadio(std::shared_ptr<PowerStats> p)333 void addMobileRadio(std::shared_ptr<PowerStats> p)
334 {
335 // A constant to represent the number of microseconds in one millisecond.
336 const int US_TO_MS = 1000;
337
338 // modem power_stats are reported in microseconds. The transform function
339 // converts microseconds to milliseconds.
340 std::function<uint64_t(uint64_t)> modemUsToMs = [](uint64_t a) { return a / US_TO_MS; };
341 const GenericStateResidencyDataProvider::StateResidencyConfig powerStateConfig = {
342 .entryCountSupported = true,
343 .entryCountPrefix = "count:",
344 .totalTimeSupported = true,
345 .totalTimePrefix = "duration_usec:",
346 .totalTimeTransform = modemUsToMs,
347 .lastEntrySupported = true,
348 .lastEntryPrefix = "last_entry_timestamp_usec:",
349 .lastEntryTransform = modemUsToMs,
350 };
351 const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
352 std::make_pair("SLEEP", "SLEEP:"),
353 };
354
355 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
356 cfgs.emplace_back(generateGenericStateResidencyConfigs(powerStateConfig, powerStateHeaders),
357 "MODEM", "");
358
359 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
360 "/sys/devices/platform/cpif/modem/power_stats", cfgs));
361
362 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
363 EnergyConsumerType::MOBILE_RADIO, "MODEM",
364 {"VSYS_PWR_MODEM", "VSYS_PWR_RFFE", "VSYS_PWR_MMWAVE"}));
365 }
366
addGNSS(std::shared_ptr<PowerStats> p)367 void addGNSS(std::shared_ptr<PowerStats> p)
368 {
369 // A constant to represent the number of microseconds in one millisecond.
370 const int US_TO_MS = 1000;
371
372 // gnss power_stats are reported in microseconds. The transform function
373 // converts microseconds to milliseconds.
374 std::function<uint64_t(uint64_t)> gnssUsToMs = [](uint64_t a) { return a / US_TO_MS; };
375
376 const GenericStateResidencyDataProvider::StateResidencyConfig gnssStateConfig = {
377 .entryCountSupported = true,
378 .entryCountPrefix = "count:",
379 .totalTimeSupported = true,
380 .totalTimePrefix = "duration_usec:",
381 .totalTimeTransform = gnssUsToMs,
382 .lastEntrySupported = true,
383 .lastEntryPrefix = "last_entry_timestamp_usec:",
384 .lastEntryTransform = gnssUsToMs,
385 };
386
387 const std::vector<std::pair<std::string, std::string>> gnssStateHeaders = {
388 std::make_pair("ON", "GPS_ON:"),
389 std::make_pair("OFF", "GPS_OFF:"),
390 };
391
392 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
393 cfgs.emplace_back(generateGenericStateResidencyConfigs(gnssStateConfig, gnssStateHeaders),
394 "GPS", "");
395
396 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
397 "/dev/bbd_pwrstat", cfgs));
398
399 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
400 EnergyConsumerType::GNSS, "GPS", {"L9S_GNSS_CORE"}));
401 }
402
addPCIe(std::shared_ptr<PowerStats> p)403 void addPCIe(std::shared_ptr<PowerStats> p) {
404 // Add PCIe power entities for Modem and WiFi
405 const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
406 .entryCountSupported = true,
407 .entryCountPrefix = "Cumulative count:",
408 .totalTimeSupported = true,
409 .totalTimePrefix = "Cumulative duration msec:",
410 .lastEntrySupported = true,
411 .lastEntryPrefix = "Last entry timestamp msec:",
412 };
413 const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
414 std::make_pair("UP", "Link up:"),
415 std::make_pair("DOWN", "Link down:"),
416 };
417
418 // Add PCIe - Modem
419 const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieModemCfgs = {
420 {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "PCIe-Modem",
421 "Version: 1"}
422 };
423
424 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
425 "/sys/devices/platform/11920000.pcie/power_stats", pcieModemCfgs));
426
427 // Add PCIe - WiFi
428 const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieWifiCfgs = {
429 {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders),
430 "PCIe-WiFi", "Version: 1"}
431 };
432
433 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
434 "/sys/devices/platform/14520000.pcie/power_stats", pcieWifiCfgs));
435 }
436
addWifi(std::shared_ptr<PowerStats> p)437 void addWifi(std::shared_ptr<PowerStats> p) {
438 // The transform function converts microseconds to milliseconds.
439 std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; };
440 const GenericStateResidencyDataProvider::StateResidencyConfig stateConfig = {
441 .entryCountSupported = true,
442 .entryCountPrefix = "count:",
443 .totalTimeSupported = true,
444 .totalTimePrefix = "duration_usec:",
445 .totalTimeTransform = usecToMs,
446 .lastEntrySupported = true,
447 .lastEntryPrefix = "last_entry_timestamp_usec:",
448 .lastEntryTransform = usecToMs,
449 };
450 const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
451 .entryCountSupported = true,
452 .entryCountPrefix = "count:",
453 .totalTimeSupported = true,
454 .totalTimePrefix = "duration_usec:",
455 .totalTimeTransform = usecToMs,
456 .lastEntrySupported = false,
457 };
458
459 const std::vector<std::pair<std::string, std::string>> stateHeaders = {
460 std::make_pair("AWAKE", "AWAKE:"),
461 std::make_pair("ASLEEP", "ASLEEP:"),
462
463 };
464 const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
465 std::make_pair("L0", "L0:"),
466 std::make_pair("L1", "L1:"),
467 std::make_pair("L1_1", "L1_1:"),
468 std::make_pair("L1_2", "L1_2:"),
469 std::make_pair("L2", "L2:"),
470 };
471
472 const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs = {
473 {generateGenericStateResidencyConfigs(stateConfig, stateHeaders), "WIFI", "WIFI"},
474 {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "WIFI-PCIE",
475 "WIFI-PCIE"}
476 };
477
478 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>("/sys/wifi/power_stats",
479 cfgs));
480 }
481
addWlan(std::shared_ptr<PowerStats> p)482 void addWlan(std::shared_ptr<PowerStats> p) {
483 p->addStateResidencyDataProvider(std::make_unique<WlanStateResidencyDataProvider>(
484 "WLAN",
485 "/sys/kernel/wifi/power_stats"));
486 }
487
addUfs(std::shared_ptr<PowerStats> p)488 void addUfs(std::shared_ptr<PowerStats> p) {
489 p->addStateResidencyDataProvider(std::make_unique<UfsStateResidencyDataProvider>("/sys/bus/platform/devices/14700000.ufs/ufs_stats/"));
490 }
491
addPowerDomains(std::shared_ptr<PowerStats> p)492 void addPowerDomains(std::shared_ptr<PowerStats> p) {
493 // A constant to represent the number of nanoseconds in one millisecond.
494 const int NS_TO_MS = 1000000;
495
496 std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
497 const GenericStateResidencyDataProvider::StateResidencyConfig cpuStateConfig = {
498 .entryCountSupported = true,
499 .entryCountPrefix = "on_count:",
500 .totalTimeSupported = true,
501 .totalTimePrefix = "total_on_time_ns:",
502 .totalTimeTransform = acpmNsToMs,
503 .lastEntrySupported = true,
504 .lastEntryPrefix = "last_on_time_ns:",
505 .lastEntryTransform = acpmNsToMs,
506 };
507
508 const std::vector<std::pair<std::string, std::string>> cpuStateHeaders = {
509 std::make_pair("ON", ""),
510 };
511
512 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
513 for (std::string name : {"pd-aur", "pd-tpu", "pd-bo", "pd-tnr", "pd-gdc", "pd-mcsc", "pd-itp",
514 "pd-ipp", "pd-g3aa", "pd-dns", "pd-pdp", "pd-csis",
515 "pd-mfc", "pd-g2d", "pd-disp", "pd-dpu", "pd-hsi0",
516 "pd-g3d", "pd-embedded_g3d", "pd-eh"}) {
517 cfgs.emplace_back(generateGenericStateResidencyConfigs(cpuStateConfig, cpuStateHeaders),
518 name, name + ":");
519 }
520
521 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
522 "/sys/devices/platform/acpm_stats/pd_stats", cfgs));
523 }
524
addDevfreq(std::shared_ptr<PowerStats> p)525 void addDevfreq(std::shared_ptr<PowerStats> p) {
526 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
527 "CL0",
528 "/sys/devices/system/cpu/cpufreq/policy0/stats"));
529
530 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
531 "CL1",
532 "/sys/devices/system/cpu/cpufreq/policy4/stats"));
533
534 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
535 "CL2",
536 "/sys/devices/system/cpu/cpufreq/policy6/stats"));
537
538 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
539 "MIF",
540 "/sys/devices/platform/17000010.devfreq_mif/devfreq/17000010.devfreq_mif"));
541
542 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
543 "INT",
544 "/sys/devices/platform/17000020.devfreq_int/devfreq/17000020.devfreq_int"));
545
546 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
547 "INTCAM",
548 "/sys/devices/platform/17000030.devfreq_intcam/devfreq/17000030.devfreq_intcam"));
549
550 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
551 "DISP",
552 "/sys/devices/platform/17000040.devfreq_disp/devfreq/17000040.devfreq_disp"));
553
554 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
555 "CAM",
556 "/sys/devices/platform/17000050.devfreq_cam/devfreq/17000050.devfreq_cam"));
557
558 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
559 "TNR",
560 "/sys/devices/platform/17000060.devfreq_tnr/devfreq/17000060.devfreq_tnr"));
561
562 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
563 "MFC",
564 "/sys/devices/platform/17000070.devfreq_mfc/devfreq/17000070.devfreq_mfc"));
565
566 p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
567 "BO",
568 "/sys/devices/platform/17000080.devfreq_bo/devfreq/17000080.devfreq_bo"));
569 }
570
addTPU(std::shared_ptr<PowerStats> p)571 void addTPU(std::shared_ptr<PowerStats> p) {
572 std::map<std::string, int32_t> stateCoeffs;
573
574 stateCoeffs = {
575 // TODO (b/197721618): Measuring the TPU power numbers
576 {"226000", 10},
577 {"627000", 20},
578 {"845000", 30},
579 {"1066000", 40}};
580
581 p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
582 EnergyConsumerType::OTHER, "TPU", {"S10M_VDD_TPU"},
583 {{UID_TIME_IN_STATE, "/sys/class/edgetpu/edgetpu-soc/device/tpu_usage"}},
584 stateCoeffs));
585 }
586
587 /**
588 * Unlike other data providers, which source power entity state residency data from the kernel,
589 * this data provider acts as a general-purpose channel for state residency data providers
590 * that live in user space. Entities are defined here and user space clients of this provider's
591 * vendor service register callbacks to provide state residency data for their given pwoer entity.
592 */
addPixelStateResidencyDataProvider(std::shared_ptr<PowerStats> p)593 void addPixelStateResidencyDataProvider(std::shared_ptr<PowerStats> p) {
594
595 auto pixelSdp = std::make_unique<PixelStateResidencyDataProvider>();
596
597 pixelSdp->addEntity("Bluetooth", {{0, "Idle"}, {1, "Active"}, {2, "Tx"}, {3, "Rx"}});
598
599 pixelSdp->start();
600
601 p->addStateResidencyDataProvider(std::move(pixelSdp));
602 }
603
addGs201CommonDataProviders(std::shared_ptr<PowerStats> p)604 void addGs201CommonDataProviders(std::shared_ptr<PowerStats> p) {
605 setEnergyMeter(p);
606
607 addPixelStateResidencyDataProvider(p);
608 addAoC(p);
609 addDvfsStats(p);
610 addSoC(p);
611 addCPUclusters(p);
612 addGPU(p);
613 addMobileRadio(p);
614 addGNSS(p);
615 addPCIe(p);
616 addWifi(p);
617 addUfs(p);
618 addPowerDomains(p);
619 addDevfreq(p);
620 addTPU(p);
621 }
622
addNFC(std::shared_ptr<PowerStats> p,const std::string & path)623 void addNFC(std::shared_ptr<PowerStats> p, const std::string& path) {
624 const GenericStateResidencyDataProvider::StateResidencyConfig nfcStateConfig = {
625 .entryCountSupported = true,
626 .entryCountPrefix = "Cumulative count:",
627 .totalTimeSupported = true,
628 .totalTimePrefix = "Cumulative duration msec:",
629 .lastEntrySupported = true,
630 .lastEntryPrefix = "Last entry timestamp msec:",
631 };
632 const std::vector<std::pair<std::string, std::string>> nfcStateHeaders = {
633 std::make_pair("IDLE", "Idle mode:"),
634 std::make_pair("ACTIVE", "Active mode:"),
635 std::make_pair("ACTIVE-RW", "Active Reader/Writer mode:"),
636 };
637
638 std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
639 cfgs.emplace_back(generateGenericStateResidencyConfigs(nfcStateConfig, nfcStateHeaders),
640 "NFC", "NFC subsystem");
641
642 p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
643 path, cfgs));
644 }
645