• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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