Merge "powerstats: Add NFC, PCIE, WIFI stats" into sc-dev
diff --git a/powerstats/serviceaidl.cpp b/powerstats/serviceaidl.cpp
index 3a26065..8c15775 100644
--- a/powerstats/serviceaidl.cpp
+++ b/powerstats/serviceaidl.cpp
@@ -285,8 +285,7 @@
p->addEnergyConsumer(displayConsumer);
}
-void addCPUclusters(std::shared_ptr<PowerStats> p)
-{
+void addCPUclusters(std::shared_ptr<PowerStats> p) {
p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
EnergyConsumerType::CPU_CLUSTER, "CPUCL0", {"S4M_VDD_CPUCL0"}));
p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
@@ -370,6 +369,112 @@
p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
EnergyConsumerType::GNSS, "GPS", {"L9S_GNSS_CORE"}));
}
+
+void addNFC(std::shared_ptr<PowerStats> p) {
+ const GenericStateResidencyDataProvider::StateResidencyConfig nfcStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "Cumulative count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "Cumulative duration msec:",
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "Last entry timestamp msec:",
+ };
+ const std::vector<std::pair<std::string, std::string>> nfcStateHeaders = {
+ std::make_pair("IDLE", "Idle mode:"),
+ std::make_pair("ACTIVE", "Active mode:"),
+ std::make_pair("ACTIVE-RW", "Active Reader/Writer mode:"),
+ };
+
+ std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(nfcStateConfig, nfcStateHeaders),
+ "NFC", "NFC subsystem");
+
+ auto nfcSdp = std::make_shared<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/10960000.hsi2c/i2c-3/3-0008/power_stats", cfgs);
+
+ p->addStateResidencyDataProvider(nfcSdp);
+}
+
+void addPCIe(std::shared_ptr<PowerStats> p) {
+ // Add PCIe power entities for Modem and WiFi
+ const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "Cumulative count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "Cumulative duration msec:",
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "Last entry timestamp msec:",
+ };
+ const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
+ std::make_pair("UP", "Link up:"),
+ std::make_pair("DOWN", "Link down:"),
+ };
+
+ // Add PCIe - Modem
+ const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieModemCfgs = {
+ {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "PCIe-Modem",
+ "Version: 1"}
+ };
+ auto pcieModemSdp = std::make_shared<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/11920000.pcie/power_stats", pcieModemCfgs);
+ p->addStateResidencyDataProvider(pcieModemSdp);
+
+ // Add PCIe - WiFi
+ const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieWifiCfgs = {
+ {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders),
+ "PCIe-WiFi", "Version: 1"}
+ };
+ auto pcieWifiSdp = std::make_shared<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/14520000.pcie/power_stats", pcieWifiCfgs);
+ p->addStateResidencyDataProvider(pcieWifiSdp);
+}
+
+void addWifi(std::shared_ptr<PowerStats> p) {
+ // The transform function converts microseconds to milliseconds.
+ std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; };
+ const GenericStateResidencyDataProvider::StateResidencyConfig stateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "duration_usec:",
+ .totalTimeTransform = usecToMs,
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "last_entry_timestamp_usec:",
+ .lastEntryTransform = usecToMs,
+ };
+ const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "duration_usec:",
+ .totalTimeTransform = usecToMs,
+ .lastEntrySupported = false,
+ };
+
+ const std::vector<std::pair<std::string, std::string>> stateHeaders = {
+ std::make_pair("AWAKE", "AWAKE:"),
+ std::make_pair("ASLEEP", "ASLEEP:"),
+
+ };
+ const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
+ std::make_pair("L0", "L0:"),
+ std::make_pair("L1", "L1:"),
+ std::make_pair("L1_1", "L1_1:"),
+ std::make_pair("L1_2", "L1_2:"),
+ std::make_pair("L2", "L2:"),
+ };
+
+ const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs = {
+ {generateGenericStateResidencyConfigs(stateConfig, stateHeaders), "WIFI", "WIFI"},
+ {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "WIFI-PCIE",
+ "WIFI-PCIE"}
+ };
+
+ auto wifiSdp = std::make_shared<GenericStateResidencyDataProvider>("/sys/wifi/power_stats",
+ cfgs);
+ p->addStateResidencyDataProvider(wifiSdp);
+}
+
/**
* Unlike other data providers, which source power entity state residency data from the kernel,
* this data provider acts as a general-purpose channel for state residency data providers
@@ -405,6 +510,9 @@
addGPU(p);
addMobileRadio(p);
addGNSS(p);
+ addNFC(p);
+ addPCIe(p);
+ addWifi(p);
const std::string instance = std::string() + PowerStats::descriptor + "/default";
binder_status_t status = AServiceManager_addService(p->asBinder().get(), instance.c_str());