summaryrefslogtreecommitdiff
path: root/powerstats/service.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'powerstats/service.cpp')
-rw-r--r--powerstats/service.cpp792
1 files changed, 412 insertions, 380 deletions
diff --git a/powerstats/service.cpp b/powerstats/service.cpp
index 4cf1f357..632de322 100644
--- a/powerstats/service.cpp
+++ b/powerstats/service.cpp
@@ -14,313 +14,174 @@
* limitations under the License.
*/
-#define LOG_TAG "android.hardware.power.stats@1.0-service.gs101"
-
-#include <android/log.h>
-#include <binder/IPCThreadState.h>
-#include <binder/IServiceManager.h>
-#include <binder/ProcessState.h>
-#include <hidl/HidlTransportSupport.h>
-#include <pixelpowerstats/AidlStateResidencyDataProvider.h>
-#include <pixelpowerstats/GenericStateResidencyDataProvider.h>
-#include <pixelpowerstats/PowerStats.h>
+#define LOG_TAG "android.hardware.power.stats-service.pixel"
+#include <PowerStatsAidl.h>
#include "AocStateResidencyDataProvider.h"
#include "DvfsStateResidencyDataProvider.h"
-#include "RailDataProvider.h"
-#include "UfsStateResidencyDataProvider.h"
-
-using android::OK;
-using android::sp;
-using android::status_t;
-
-// libhwbinder:
-using android::hardware::configureRpcThreadpool;
-using android::hardware::joinRpcThreadpool;
-
-// Generated HIDL files
-using android::hardware::power::stats::V1_0::IPowerStats;
-using android::hardware::power::stats::V1_0::PowerEntityType;
-using android::hardware::power::stats::V1_0::implementation::PowerStats;
-
-// Pixel specific
-using android::hardware::google::pixel::powerstats::AidlStateResidencyDataProvider;
-using android::hardware::google::pixel::powerstats::AocStateResidencyDataProvider;
-using android::hardware::google::pixel::powerstats::DvfsStateResidencyDataProvider;
-using android::hardware::google::pixel::powerstats::generateGenericStateResidencyConfigs;
-using android::hardware::google::pixel::powerstats::GenericStateResidencyDataProvider;
-using android::hardware::google::pixel::powerstats::PowerEntityConfig;
-using android::hardware::google::pixel::powerstats::RailDataProvider;
-using android::hardware::google::pixel::powerstats::StateResidencyConfig;
-using android::hardware::google::pixel::powerstats::UfsStateResidencyDataProvider;
-
-// A constant to represnt the number of nanoseconds in one millisecond.
-static const int NS_TO_MS = 1000000;
-
-void addAoCStats(PowerStats *const service) {
+#include <dataproviders/DisplayStateResidencyDataProvider.h>
+#include <dataproviders/GenericStateResidencyDataProvider.h>
+#include <dataproviders/IioEnergyMeterDataProvider.h>
+#include <dataproviders/PowerStatsEnergyConsumer.h>
+#include <dataproviders/PowerStatsEnergyAttribution.h>
+#include <dataproviders/PixelStateResidencyDataProvider.h>
+
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <log/log.h>
+
+using aidl::android::hardware::power::stats::AocStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::DisplayStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::DvfsStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::EnergyConsumerType;
+using aidl::android::hardware::power::stats::GenericStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::IioEnergyMeterDataProvider;
+using aidl::android::hardware::power::stats::PixelStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::PowerStats;
+using aidl::android::hardware::power::stats::PowerStatsEnergyConsumer;
+
+constexpr char kBootHwSoCRev[] = "ro.boot.hw.soc.rev";
+
+void addAoC(std::shared_ptr<PowerStats> p) {
std::string prefix = "/sys/devices/platform/19000000.aoc/control/";
// Add AoC cores (a32, ff1, hf0, and hf1)
- std::vector<std::pair<uint32_t, std::string>> coreIds = {
- {service->addPowerEntity("AoC-A32", PowerEntityType::SUBSYSTEM), prefix + "a32_"},
- {service->addPowerEntity("AoC-FF1", PowerEntityType::SUBSYSTEM), prefix + "ff1_"},
- {service->addPowerEntity("AoC-HF1", PowerEntityType::SUBSYSTEM), prefix + "hf1_"},
- {service->addPowerEntity("AoC-HF0", PowerEntityType::SUBSYSTEM), prefix + "hf0_"},
+ std::vector<std::pair<std::string, std::string>> coreIds = {
+ {"AoC-A32", prefix + "a32_"},
+ {"AoC-FF1", prefix + "ff1_"},
+ {"AoC-HF1", prefix + "hf1_"},
+ {"AoC-HF0", prefix + "hf0_"},
};
std::vector<std::pair<std::string, std::string>> coreStates = {
{"DWN", "off"}, {"RET", "retention"}, {"WFI", "wfi"}};
- service->addStateResidencyDataProvider(new AocStateResidencyDataProvider(coreIds, coreStates));
+ p->addStateResidencyDataProvider(std::make_shared<AocStateResidencyDataProvider>(coreIds,
+ coreStates));
// Add AoC voltage stats
- std::vector<std::pair<uint32_t, std::string>> voltageIds = {
- {service->addPowerEntity("AoC-Voltage", PowerEntityType::SUBSYSTEM),
- prefix + "voltage_"},
+ std::vector<std::pair<std::string, std::string>> voltageIds = {
+ {"AoC-Voltage", prefix + "voltage_"},
};
std::vector<std::pair<std::string, std::string>> voltageStates = {{"NOM", "nominal"},
{"SUD", "super_underdrive"},
{"UUD", "ultra_underdrive"},
{"UD", "underdrive"}};
- service->addStateResidencyDataProvider(
- new AocStateResidencyDataProvider(voltageIds, voltageStates));
+ p->addStateResidencyDataProvider(
+ std::make_shared<AocStateResidencyDataProvider>(voltageIds, voltageStates));
// Add AoC monitor mode
- std::vector<std::pair<uint32_t, std::string>> monitorIds = {
- {service->addPowerEntity("AoC", PowerEntityType::SUBSYSTEM), prefix + "monitor_"},
+ std::vector<std::pair<std::string, std::string>> monitorIds = {
+ {"AoC", prefix + "monitor_"},
};
std::vector<std::pair<std::string, std::string>> monitorStates = {
{"MON", "mode"},
};
- service->addStateResidencyDataProvider(
- new AocStateResidencyDataProvider(monitorIds, monitorStates));
-}
-
-void addCpuCStateStats(PowerStats *const service) {
- // CPU stats are reported in nanoseconds. The transform function
- // converts nanoseconds to milliseconds.
- std::function<uint64_t(uint64_t)> cpuNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
- StateResidencyConfig cStateConfig = {
- .entryCountSupported = true,
- .entryCountPrefix = "down_count:",
- .totalTimeSupported = true,
- .totalTimePrefix = "total_down_time_ns:",
- .totalTimeTransform = cpuNsToMs,
- .lastEntrySupported = true,
- .lastEntryPrefix = "last_down_time_ns:",
- .lastEntryTransform = cpuNsToMs,
- };
-
- sp<GenericStateResidencyDataProvider> cStateSdp = new GenericStateResidencyDataProvider(
- "/sys/devices/platform/1742048c.acpm_stats/core_stats");
- for (std::string state :
- {"CORE00", "CORE01", "CORE02", "CORE03", "CORE10", "CORE11", "CORE20", "CORE21"}) {
- cStateSdp->addEntity(service->addPowerEntity(state, PowerEntityType::SUBSYSTEM),
- PowerEntityConfig("CORES:", generateGenericStateResidencyConfigs(
- cStateConfig,
- {std::make_pair("DOWN", state)})));
- }
- for (std::string state : {"CLUSTER0", "CLUSTER1", "CLUSTER2"}) {
- cStateSdp->addEntity(
- service->addPowerEntity(state, PowerEntityType::SUBSYSTEM),
- PowerEntityConfig("CLUSTERS:",
- generateGenericStateResidencyConfigs(
- cStateConfig, {std::make_pair("DOWN", state)})));
- }
- service->addStateResidencyDataProvider(cStateSdp);
+ p->addStateResidencyDataProvider(
+ std::make_shared<AocStateResidencyDataProvider>(monitorIds, monitorStates));
}
-void addDvfsStats(PowerStats *const service) {
- sp<DvfsStateResidencyDataProvider> dvfsSdp = new DvfsStateResidencyDataProvider(
- "/sys/devices/platform/1742048c.acpm_stats/fvp_stats", NS_TO_MS);
-
- dvfsSdp->addEntity(service->addPowerEntity("MIF-DVFS", PowerEntityType::SUBSYSTEM), "MIF",
- {
- std::make_pair("3172KHz", "3172000"),
- std::make_pair("2730KHz", "2730000"),
- std::make_pair("2535KHz", "2535000"),
- std::make_pair("2288KHz", "2288000"),
- std::make_pair("2028KHz", "2028000"),
- std::make_pair("1716KHz", "1716000"),
- std::make_pair("1539KHz", "1539000"),
- std::make_pair("1352KHz", "1352000"),
- std::make_pair("1014KHz", "1014000"),
- std::make_pair("845KHz", "845000"),
- std::make_pair("676KHz", "676000"),
- std::make_pair("546KHz", "546000"),
- std::make_pair("421KHz", "421000"),
- std::make_pair("0KHz", "0"),
- });
-
- dvfsSdp->addEntity(service->addPowerEntity("CL0-DVFS", PowerEntityType::SUBSYSTEM), "CL0",
- {
- std::make_pair("2196KHz", "2196000"),
- std::make_pair("2098KHz", "2098000"),
- std::make_pair("2024KHz", "2024000"),
- std::make_pair("1950KHz", "1950000"),
- std::make_pair("1868KHz", "1868000"),
- std::make_pair("1745KHz", "1745000"),
- std::make_pair("1598KHz", "1598000"),
- std::make_pair("1459KHz", "1459000"),
- std::make_pair("1328KHz", "1328000"),
- std::make_pair("1197KHz", "1197000"),
- std::make_pair("1098KHz", "1098000"),
- std::make_pair("889KHz", "889000"),
- std::make_pair("738KHz", "738000"),
- std::make_pair("574KHz", "574000"),
- std::make_pair("300KHz", "300000"),
- std::make_pair("0KHz", "0"),
- });
-
- dvfsSdp->addEntity(service->addPowerEntity("CL1-DVFS", PowerEntityType::SUBSYSTEM), "CL1",
- {
- std::make_pair("2466KHz", "2466000"),
- std::make_pair("2393KHz", "2393000"),
- std::make_pair("2348KHz", "2348000"),
- std::make_pair("2253KHz", "2253000"),
- std::make_pair("2130KHz", "2130000"),
- std::make_pair("1999KHz", "1999000"),
- std::make_pair("1836KHz", "1836000"),
- std::make_pair("1663KHz", "1663000"),
- std::make_pair("1491KHz", "1491000"),
- std::make_pair("1328KHz", "1328000"),
- std::make_pair("1197KHz", "1197000"),
- std::make_pair("1024KHz", "1024000"),
- std::make_pair("910KHz", "910000"),
- std::make_pair("799KHz", "799000"),
- std::make_pair("696KHz", "696000"),
- std::make_pair("533KHz", "533000"),
- std::make_pair("400KHz", "400000"),
- std::make_pair("0KHz", "0"),
- });
-
- dvfsSdp->addEntity(service->addPowerEntity("CL2-DVFS", PowerEntityType::SUBSYSTEM), "CL2",
- {
- std::make_pair("3195KHz", "3195000"),
- std::make_pair("3097KHz", "3097000"),
- std::make_pair("2999KHz", "2999000"),
- std::make_pair("2900KHz", "2900000"),
- std::make_pair("2802KHz", "2802000"),
- std::make_pair("2704KHz", "2704000"),
- std::make_pair("2630KHz", "2630000"),
- std::make_pair("2507KHz", "2507000"),
- std::make_pair("2401KHz", "2401000"),
- std::make_pair("2302KHz", "2302000"),
- std::make_pair("2188KHz", "2188000"),
- std::make_pair("2048KHz", "2048000"),
- std::make_pair("1901KHz", "1901000"),
- std::make_pair("1745KHz", "1745000"),
- std::make_pair("1582KHz", "1582000"),
- std::make_pair("1426KHz", "1426000"),
- std::make_pair("1237KHz", "1237000"),
- std::make_pair("1106KHz", "1106000"),
- std::make_pair("984KHz", "984000"),
- std::make_pair("848KHz", "848000"),
- std::make_pair("500KHz", "500000"),
- std::make_pair("0KHz", "0"),
- });
-
- // TODO(sujee): Complete frequency table for TPU.
- dvfsSdp->addEntity(service->addPowerEntity("TPU-DVFS", PowerEntityType::SUBSYSTEM), "TPU",
- {
- std::make_pair("1066MHz", "1066000000"),
- });
-
- service->addStateResidencyDataProvider(dvfsSdp);
+void addDvfsStats(std::shared_ptr<PowerStats> p) {
+ // A constant to represent the number of nanoseconds in one millisecond
+ const int NS_TO_MS = 1000000;
+
+ std::vector<DvfsStateResidencyDataProvider::Config> cfgs;
+
+ cfgs.push_back({"MIF", {
+ std::make_pair("3172KHz", "3172000"),
+ std::make_pair("2730KHz", "2730000"),
+ std::make_pair("2535KHz", "2535000"),
+ std::make_pair("2288KHz", "2288000"),
+ std::make_pair("2028KHz", "2028000"),
+ std::make_pair("1716KHz", "1716000"),
+ std::make_pair("1539KHz", "1539000"),
+ std::make_pair("1352KHz", "1352000"),
+ std::make_pair("1014KHz", "1014000"),
+ std::make_pair("845KHz", "845000"),
+ std::make_pair("676KHz", "676000"),
+ std::make_pair("546KHz", "546000"),
+ std::make_pair("421KHz", "421000"),
+ std::make_pair("0KHz", "0"),
+ }});
+
+ cfgs.push_back({"CL0", {
+ std::make_pair("2024KHz", "2024000"),
+ std::make_pair("1950KHz", "1950000"),
+ std::make_pair("1868KHz", "1868000"),
+ std::make_pair("1803KHz", "1803000"),
+ std::make_pair("1745KHz", "1745000"),
+ std::make_pair("1704KHz", "1704000"),
+ std::make_pair("1598KHz", "1598000"),
+ std::make_pair("1459KHz", "1459000"),
+ std::make_pair("1401KHz", "1401000"),
+ std::make_pair("1328KHz", "1328000"),
+ std::make_pair("1197KHz", "1197000"),
+ std::make_pair("1098KHz", "1098000"),
+ std::make_pair("930KHz", "930000"),
+ std::make_pair("889KHz", "889000"),
+ std::make_pair("738KHz", "738000"),
+ std::make_pair("574KHz", "574000"),
+ std::make_pair("300KHz", "300000"),
+ std::make_pair("0KHz", "0"),
+ }});
+
+ cfgs.push_back({"CL1", {
+ std::make_pair("2253KHz", "2253000"),
+ std::make_pair("2130KHz", "2130000"),
+ std::make_pair("1999KHz", "1999000"),
+ std::make_pair("1836KHz", "1836000"),
+ std::make_pair("1663KHz", "1663000"),
+ std::make_pair("1491KHz", "1491000"),
+ std::make_pair("1328KHz", "1328000"),
+ std::make_pair("1197KHz", "1197000"),
+ std::make_pair("1024KHz", "1024000"),
+ std::make_pair("910KHz", "910000"),
+ std::make_pair("799KHz", "799000"),
+ std::make_pair("696KHz", "696000"),
+ std::make_pair("533KHz", "533000"),
+ std::make_pair("400KHz", "400000"),
+ std::make_pair("0KHz", "0"),
+ }});
+
+ cfgs.push_back({"CL2", {
+ std::make_pair("2630KHz", "2630000"),
+ std::make_pair("2507KHz", "2507000"),
+ std::make_pair("2401KHz", "2401000"),
+ std::make_pair("2302KHz", "2302000"),
+ std::make_pair("2252KHz", "2252000"),
+ std::make_pair("2188KHz", "2188000"),
+ std::make_pair("2048KHz", "2048000"),
+ std::make_pair("1901KHz", "1901000"),
+ std::make_pair("1826KHz", "1826000"),
+ std::make_pair("1745KHz", "1745000"),
+ std::make_pair("1582KHz", "1582000"),
+ std::make_pair("1426KHz", "1426000"),
+ std::make_pair("1277KHz", "1277000"),
+ std::make_pair("1237KHz", "1237000"),
+ std::make_pair("1106KHz", "1106000"),
+ std::make_pair("984KHz", "984000"),
+ std::make_pair("851KHz", "851000"),
+ std::make_pair("848KHz", "848000"),
+ std::make_pair("500KHz", "500000"),
+ std::make_pair("0KHz", "0"),
+ }});
+
+ cfgs.push_back({"TPU", {
+ std::make_pair("1066MHz", "1066000000"),
+ }});
+
+ p->addStateResidencyDataProvider(std::make_shared<DvfsStateResidencyDataProvider>(
+ "/sys/devices/platform/1742048c.acpm_stats/fvp_stats", NS_TO_MS, cfgs));
}
-void addGPUStats(PowerStats *const service) {
- StateResidencyConfig gpuStateConfig = {
- .entryCountSupported = true,
- .entryCountPrefix = "count = ",
- .totalTimeSupported = true,
- .totalTimePrefix = "total_time = ",
- .lastEntrySupported = true,
- .lastEntryPrefix = "last_entry_time = ",
- };
-
- sp<GenericStateResidencyDataProvider> gpu = new GenericStateResidencyDataProvider(
- "/sys/devices/platform/1c500000.mali/power_stats");
-
- PowerEntityConfig onOffConfig("Summary stats: (times in ms)",
- generateGenericStateResidencyConfigs(
- gpuStateConfig, {{"DOWN", "OFF:"}, {"UP", "ON:"}}));
- gpu->addEntity(service->addPowerEntity("GPU", PowerEntityType::SUBSYSTEM), onOffConfig);
-
- PowerEntityConfig DVFSConfig(
- "DVFS stats: (times in ms)",
- generateGenericStateResidencyConfigs(gpuStateConfig, {{"996MHz", "996000:"},
- {"885MHz", "885000:"},
- {"750MHz", "750000:"},
- {"434MHz", "434000:"},
- {"302MHz", "302000:"},
- {"151MHz", "151000:"}}));
- gpu->addEntity(service->addPowerEntity("GPU-DVFS", PowerEntityType::SUBSYSTEM), DVFSConfig);
- service->addStateResidencyDataProvider(gpu);
-}
+void addSoC(std::shared_ptr<PowerStats> p) {
+ // A constant to represent the number of nanoseconds in one millisecond.
+ const int NS_TO_MS = 1000000;
-void addNFCStats(PowerStats *const service) {
- StateResidencyConfig nfcStateConfig = {
- .entryCountSupported = true,
- .entryCountPrefix = "Cumulative count:",
- .totalTimeSupported = true,
- .totalTimePrefix = "Cumulative duration msec:",
- .lastEntrySupported = true,
- .lastEntryPrefix = "Last entry timestamp msec:",
- };
- 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:"),
- };
-
- sp<GenericStateResidencyDataProvider> nfcSdp = new GenericStateResidencyDataProvider(
- "/sys/devices/platform/10960000.hsi2c/i2c-4/4-0008/power_stats");
- nfcSdp->addEntity(service->addPowerEntity("NFC", PowerEntityType::SUBSYSTEM),
- PowerEntityConfig("NFC subsystem", generateGenericStateResidencyConfigs(
- nfcStateConfig, nfcStateHeaders)));
- service->addStateResidencyDataProvider(nfcSdp);
-}
-
-void addPCIeStats(PowerStats *const service) {
- // Add PCIe power entities for Modem and WiFi
- StateResidencyConfig pcieStateConfig = {
- .entryCountSupported = true,
- .entryCountPrefix = "Cumulative count:",
- .totalTimeSupported = true,
- .totalTimePrefix = "Cumulative duration msec:",
- .lastEntrySupported = true,
- .lastEntryPrefix = "Last entry timestamp msec:",
- };
- std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
- std::make_pair("UP", "Link up:"),
- std::make_pair("DOWN", "Link down:"),
- };
-
- // Add PCIe - Modem
- sp<GenericStateResidencyDataProvider> pcieModemSdp = new GenericStateResidencyDataProvider(
- "/sys/devices/platform/11920000.pcie/power_stats");
- uint32_t pcieModemId = service->addPowerEntity("PCIe-Modem", PowerEntityType::SUBSYSTEM);
- pcieModemSdp->addEntity(
- pcieModemId,
- PowerEntityConfig("Version: 1", generateGenericStateResidencyConfigs(
- pcieStateConfig, pcieStateHeaders)));
- service->addStateResidencyDataProvider(pcieModemSdp);
-
- // Add PCIe - WiFi
- sp<GenericStateResidencyDataProvider> pcieWifiSdp = new GenericStateResidencyDataProvider(
- "/sys/devices/platform/14520000.pcie/power_stats");
- uint32_t pcieWifiId = service->addPowerEntity("PCIe-WiFi", PowerEntityType::SUBSYSTEM);
- pcieWifiSdp->addEntity(
- pcieWifiId,
- PowerEntityConfig("Version: 1", generateGenericStateResidencyConfigs(
- pcieStateConfig, pcieStateHeaders)));
- service->addStateResidencyDataProvider(pcieWifiSdp);
-}
-
-void addSocStats(PowerStats *const service) {
// ACPM stats are reported in nanoseconds. The transform function
// converts nanoseconds to milliseconds.
std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
- StateResidencyConfig lpmStateConfig = {
+ const GenericStateResidencyDataProvider::StateResidencyConfig lpmStateConfig = {
.entryCountSupported = true,
.entryCountPrefix = "success_count:",
.totalTimeSupported = true,
@@ -330,7 +191,7 @@ void addSocStats(PowerStats *const service) {
.lastEntryPrefix = "last_entry_time_ns:",
.lastEntryTransform = acpmNsToMs,
};
- StateResidencyConfig downStateConfig = {
+ const GenericStateResidencyDataProvider::StateResidencyConfig downStateConfig = {
.entryCountSupported = true,
.entryCountPrefix = "down_count:",
.totalTimeSupported = true,
@@ -340,7 +201,7 @@ void addSocStats(PowerStats *const service) {
.lastEntryPrefix = "last_down_time_ns:",
.lastEntryTransform = acpmNsToMs,
};
- StateResidencyConfig reqStateConfig = {
+ const GenericStateResidencyDataProvider::StateResidencyConfig reqStateConfig = {
.entryCountSupported = true,
.entryCountPrefix = "req_up_count:",
.totalTimeSupported = true,
@@ -351,141 +212,312 @@ void addSocStats(PowerStats *const service) {
.lastEntryTransform = acpmNsToMs,
};
- std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
+ const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
std::make_pair("SICD", "SICD"),
std::make_pair("SLEEP", "SLEEP"),
std::make_pair("SLEEP_SLCMON", "SLEEP_SLCMON"),
std::make_pair("STOP", "STOP"),
};
- std::vector<std::pair<std::string, std::string>> mifReqStateHeaders = {
+ const std::vector<std::pair<std::string, std::string>> mifReqStateHeaders = {
std::make_pair("AOC", "AOC"),
std::make_pair("GSA", "GSA"),
};
- std::vector<std::pair<std::string, std::string>> slcReqStateHeaders = {
+ const std::vector<std::pair<std::string, std::string>> slcReqStateHeaders = {
std::make_pair("AOC", "AOC"),
};
- sp<GenericStateResidencyDataProvider> socSdp = new GenericStateResidencyDataProvider(
- "/sys/devices/platform/1742048c.acpm_stats/soc_stats");
-
- socSdp->addEntity(service->addPowerEntity("LPM", PowerEntityType::SUBSYSTEM),
- PowerEntityConfig("LPM:", generateGenericStateResidencyConfigs(
- lpmStateConfig, powerStateHeaders)));
- socSdp->addEntity(service->addPowerEntity("MIF", PowerEntityType::SUBSYSTEM),
- PowerEntityConfig("MIF:", generateGenericStateResidencyConfigs(
- downStateConfig, powerStateHeaders)));
- socSdp->addEntity(service->addPowerEntity("MIF-REQ", PowerEntityType::SUBSYSTEM),
- PowerEntityConfig("MIF_REQ:", generateGenericStateResidencyConfigs(
- reqStateConfig, mifReqStateHeaders)));
- socSdp->addEntity(service->addPowerEntity("SLC", PowerEntityType::SUBSYSTEM),
- PowerEntityConfig("SLC:", generateGenericStateResidencyConfigs(
- downStateConfig, powerStateHeaders)));
- socSdp->addEntity(service->addPowerEntity("SLC-REQ", PowerEntityType::SUBSYSTEM),
- PowerEntityConfig("SLC_REQ:", generateGenericStateResidencyConfigs(
- reqStateConfig, slcReqStateHeaders)));
-
- service->addStateResidencyDataProvider(socSdp);
+ std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(lpmStateConfig, powerStateHeaders),
+ "LPM", "LPM:");
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
+ "MIF", "MIF:");
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, mifReqStateHeaders),
+ "MIF-REQ", "MIF_REQ:");
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
+ "SLC", "SLC:");
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, slcReqStateHeaders),
+ "SLC-REQ", "SLC_REQ:");
+
+ auto socSdp = std::make_shared<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/1742048c.acpm_stats/soc_stats", cfgs);
+
+ p->addStateResidencyDataProvider(socSdp);
}
-void addUfsStats(PowerStats *const service) {
- sp<UfsStateResidencyDataProvider> ufsSdp = new UfsStateResidencyDataProvider(
- service->addPowerEntity("UFS", PowerEntityType::SUBSYSTEM));
- service->addStateResidencyDataProvider(ufsSdp);
+void setEnergyMeter(std::shared_ptr<PowerStats> p) {
+ std::vector<const std::string> deviceNames { "s2mpg10-odpm", "s2mpg11-odpm" };
+ p->setEnergyMeterDataProvider(std::make_unique<IioEnergyMeterDataProvider>(deviceNames, true));
}
-void addWifiStats(PowerStats *const service) {
- sp<GenericStateResidencyDataProvider> wifiSdp =
- new GenericStateResidencyDataProvider("/sys/wifi/power_stats");
+void addDisplay(std::shared_ptr<PowerStats> p) {
+ // Add display residency stats
+
+ /*
+ * TODO(b/167216667): Add complete set of display states here. Must account
+ * for ALL devices built using this source
+ */
+ std::vector<std::string> states = {
+ "Off",
+ "LP: 1440x3040@30",
+ "On: 1440x3040@60",
+ "On: 1440x3040@90",
+ "HBM: 1440x3040@60",
+ "HBM: 1440x3040@90"};
+
+ auto displaySdp =
+ std::make_shared<DisplayStateResidencyDataProvider>("Display",
+ "/sys/class/backlight/panel0-backlight/state",
+ states);
+ p->addStateResidencyDataProvider(displaySdp);
+
+ // Add display energy consumer
+ /*
+ * TODO(b/167216667): Add correct display power model here. Must read from display rail
+ * and include proper coefficients for display states. Must account for ALL devices built
+ * using this source.
+ */
+ auto displayConsumer = PowerStatsEnergyConsumer::createMeterAndEntityConsumer(p,
+ EnergyConsumerType::DISPLAY, "display", {"PPVAR_VSYS_PWR_DISP"}, "Display",
+ {{"LP: 1440x3040@30", 1},
+ {"On: 1440x3040@60", 2},
+ {"On: 1440x3040@90", 3}});
+
+ p->addEnergyConsumer(displayConsumer);
+}
- // The transform function converts microseconds to milliseconds.
- std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; };
- StateResidencyConfig stateConfig = {
+void addCPUclusters(std::shared_ptr<PowerStats> p) {
+ p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+ EnergyConsumerType::CPU_CLUSTER, "CPUCL0", {"S4M_VDD_CPUCL0"}));
+ p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+ EnergyConsumerType::CPU_CLUSTER, "CPUCL1", {"S3M_VDD_CPUCL1"}));
+ p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+ EnergyConsumerType::CPU_CLUSTER, "CPUCL2", {"S2M_VDD_CPUCL2"}));
+}
+
+void addGPU(std::shared_ptr<PowerStats> p) {
+ // Add gpu energy consumer
+ std::map<std::string, int32_t> stateCoeffs;
+ const int socRev = android::base::GetIntProperty(kBootHwSoCRev, 0);
+
+ // B0/B1 chips have different GPU DVFS operating points than A0/A1 SoC
+ if (socRev >= 2) {
+ stateCoeffs = {
+ {"151000", 10},
+ {"202000", 20},
+ {"251000", 30},
+ {"302000", 40},
+ {"351000", 50},
+ {"400000", 60},
+ {"471000", 70},
+ {"510000", 80},
+ {"572000", 90},
+ {"701000", 100},
+ {"762000", 110},
+ {"848000", 120}};
+ } else {
+ stateCoeffs = {
+ {"151000", 10},
+ {"302000", 20},
+ {"455000", 30},
+ {"572000", 40},
+ {"670000", 50}};
+ }
+
+ auto gpuConsumer = PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
+ EnergyConsumerType::OTHER, "GPU", {"S2S_VDD_G3D"},
+ {{UID_TIME_IN_STATE, "/sys/devices/platform/1c500000.mali/uid_time_in_state"}},
+ stateCoeffs);
+
+ p->addEnergyConsumer(gpuConsumer);
+}
+
+void addMobileRadio(std::shared_ptr<PowerStats> p)
+{
+ // A constant to represent the number of microseconds in one millisecond.
+ const int US_TO_MS = 1000;
+
+ // modem power_stats are reported in microseconds. The transform function
+ // converts microseconds to milliseconds.
+ std::function<uint64_t(uint64_t)> modemUsToMs = [](uint64_t a) { return a / US_TO_MS; };
+ const GenericStateResidencyDataProvider::StateResidencyConfig powerStateConfig = {
.entryCountSupported = true,
.entryCountPrefix = "count:",
.totalTimeSupported = true,
.totalTimePrefix = "duration_usec:",
- .totalTimeTransform = usecToMs,
+ .totalTimeTransform = modemUsToMs,
.lastEntrySupported = true,
.lastEntryPrefix = "last_entry_timestamp_usec:",
- .lastEntryTransform = usecToMs,
+ .lastEntryTransform = modemUsToMs,
};
- StateResidencyConfig pcieStateConfig = {
- .entryCountSupported = true,
- .entryCountPrefix = "count:",
- .totalTimeSupported = true,
- .totalTimePrefix = "duration_usec:",
- .totalTimeTransform = usecToMs,
+ const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
+ std::make_pair("SLEEP", "SLEEP:"),
};
- std::vector<std::pair<std::string, std::string>> stateHeaders = {
- std::make_pair("AWAKE", "AWAKE:"),
- std::make_pair("ASLEEP", "ASLEEP:"),
+ std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(powerStateConfig, powerStateHeaders),
+ "MODEM", "");
+
+ p->addStateResidencyDataProvider(std::make_shared<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/cpif/modem/power_stats", cfgs));
+
+ p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+ EnergyConsumerType::MOBILE_RADIO, "MODEM", {"VSYS_PWR_MODEM", "VSYS_PWR_RFFE"}));
+}
+
+void addGNSS(std::shared_ptr<PowerStats> p)
+{
+ 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:",
};
- 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<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:"),
};
- wifiSdp->addEntity(
- service->addPowerEntity("WIFI", PowerEntityType::SUBSYSTEM),
- PowerEntityConfig(generateGenericStateResidencyConfigs(stateConfig, stateHeaders)));
- wifiSdp->addEntity(service->addPowerEntity("WIFI-PCIE", PowerEntityType::SUBSYSTEM),
- PowerEntityConfig(generateGenericStateResidencyConfigs(pcieStateConfig,
- pcieStateHeaders)));
+ 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);
- service->addStateResidencyDataProvider(wifiSdp);
+ p->addStateResidencyDataProvider(nfcSdp);
}
-int main(int /* argc */, char ** /* argv */) {
- ALOGI("power.stats service 1.0 is starting.");
-
- PowerStats *service = new PowerStats();
-
- // Add rail data provider
- service->setRailDataProvider(std::make_unique<RailDataProvider>());
-
- addAoCStats(service);
- addCpuCStateStats(service);
- addDvfsStats(service);
- addGPUStats(service);
- addNFCStats(service);
- addPCIeStats(service);
- addSocStats(service);
- addUfsStats(service);
- addWifiStats(service);
-
- // Add Power Entities that require the Aidl data provider
- sp<AidlStateResidencyDataProvider> aidlSdp = new AidlStateResidencyDataProvider();
- uint32_t bluetoothId = service->addPowerEntity("Bluetooth", PowerEntityType::SUBSYSTEM);
- aidlSdp->addEntity(bluetoothId, "Bluetooth", {"Idle", "Active", "Tx", "Rx"});
- uint32_t citadelId = service->addPowerEntity("Citadel", PowerEntityType::SUBSYSTEM);
- aidlSdp->addEntity(citadelId, "Citadel", {"Last-Reset", "Active", "Deep-Sleep"});
- service->addStateResidencyDataProvider(aidlSdp);
-
- auto serviceStatus = android::defaultServiceManager()->addService(
- android::String16("power.stats-vendor"), aidlSdp);
- if (serviceStatus != android::OK) {
- ALOGE("Unable to register power.stats-vendor service %d", serviceStatus);
- return 1;
- }
+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:"),
+ };
- sp<android::ProcessState> ps{android::ProcessState::self()}; // Create non-HW binder threadpool
- ps->startThreadPool();
+ // 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);
- // Configure the threadpool
- configureRpcThreadpool(1, true /*callerWillJoin*/);
+ // 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);
+}
- status_t status = service->registerAsService();
- if (status != OK) {
- ALOGE("Could not register service for power.stats HAL Iface (%d), exiting.", status);
- return 1;
- }
+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
+ * that live in user space. Entities are defined here and user space clients of this provider's
+ * vendor service register callbacks to provide state residency data for their given pwoer entity.
+ */
+void addPixelStateResidencyDataProvider(std::shared_ptr<PowerStats> p) {
+ std::shared_ptr<PixelStateResidencyDataProvider> pixelSdp =
+ ndk::SharedRefBase::make<PixelStateResidencyDataProvider>();
+
+ pixelSdp->addEntity("Bluetooth", {{0, "Idle"}, {1, "Active"}, {2, "Tx"}, {3, "Rx"}});
+
+ pixelSdp->start();
+ p->addStateResidencyDataProvider(pixelSdp);
+}
+
+int main() {
+ LOG(INFO) << "Pixel PowerStats HAL AIDL Service is starting.";
+
+ // single thread
+ ABinderProcess_setThreadPoolMaxThreadCount(0);
+
+ std::shared_ptr<PowerStats> p = ndk::SharedRefBase::make<PowerStats>();
+
+ setEnergyMeter(p);
+
+ addPixelStateResidencyDataProvider(p);
+ addAoC(p);
+ addDisplay(p);
+ addDvfsStats(p);
+ addSoC(p);
+ addCPUclusters(p);
+ addGPU(p);
+ addMobileRadio(p);
+ addGNSS(p);
+ addNFC(p);
+ addPCIe(p);
+ addWifi(p);
- ALOGI("power.stats service is ready");
- joinRpcThreadpool();
+ const std::string instance = std::string() + PowerStats::descriptor + "/default";
+ binder_status_t status = AServiceManager_addService(p->asBinder().get(), instance.c_str());
+ LOG_ALWAYS_FATAL_IF(status != STATUS_OK);
- // In normal operation, we don't expect the thread pool to exit
- ALOGE("power.stats service is shutting down");
- return 1;
+ ABinderProcess_joinThreadPool();
+ return EXIT_FAILURE; // should not reach
}