From 7bcbb2c5ee285304d0ff172f08c2e401e8ef5764 Mon Sep 17 00:00:00 2001 From: Benjamin Schwartz Date: Wed, 13 Feb 2019 14:26:59 -0800 Subject: [PATCH] power.stats: Add AidlStateResidencyDataProvider Some drivers that we want to collect power stats from are pass-through and would require significant changes in order to provide a sysfs node that the current power stats framework can pull stats from. These pass-through drivers typically have a userspace daemon that is capable of keeping track of the power stats and providing them to the power.stats HAL service, but currently have no way to do that. The AidlStateResidencyDataProvider will provide a vendor binder service that will allow the userspace daemon to push updates or the power statistics to power.stats HAL. Bug: 117585786 Test: Created a PTS test to update some mock power entities that were created using the AidlStateResidencyDataProvider. Further testing is planned when real power entities start using this. Change-Id: I4506ce7db84bbce2a8b271a870267040a7fa448f --- powerstats/Android.bp | 2 ++ powerstats/service.cpp | 46 ++++++++++++++++++++++++++++++++---------- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/powerstats/Android.bp b/powerstats/Android.bp index fd3d3050..491498dd 100644 --- a/powerstats/Android.bp +++ b/powerstats/Android.bp @@ -33,6 +33,8 @@ cc_binary { "liblog", "libutils", "android.hardware.power.stats@1.0", + "pixelpowerstats_provider_aidl_interface-cpp", + "libbinder", ], vendor: true, } diff --git a/powerstats/service.cpp b/powerstats/service.cpp index 022f41af..b2d3fd05 100644 --- a/powerstats/service.cpp +++ b/powerstats/service.cpp @@ -17,8 +17,12 @@ #define LOG_TAG "android.hardware.power.stats@1.0-service.pixel" #include +#include +#include +#include #include +#include #include #include #include @@ -40,6 +44,7 @@ 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::GenericStateResidencyDataProvider; using android::hardware::google::pixel::powerstats::PowerEntityConfig; using android::hardware::google::pixel::powerstats::StateResidencyConfig; @@ -65,8 +70,8 @@ int main(int /* argc */, char ** /* argv */) { .totalTimeTransform = rpmConvertToMs, .lastEntrySupported = false}}; - auto rpmSdp = - std::make_shared("/d/system_stats"); + sp rpmSdp = + new GenericStateResidencyDataProvider("/d/system_stats"); uint32_t apssId = service->addPowerEntity("APSS", PowerEntityType::SUBSYSTEM); rpmSdp->addEntity(apssId, PowerEntityConfig("APSS", rpmStateResidencyConfigs)); @@ -80,7 +85,7 @@ int main(int /* argc */, char ** /* argv */) { uint32_t slpiId = service->addPowerEntity("SLPI", PowerEntityType::SUBSYSTEM); rpmSdp->addEntity(slpiId, PowerEntityConfig("SLPI", rpmStateResidencyConfigs)); - service->addStateResidencyDataProvider(std::move(rpmSdp)); + service->addStateResidencyDataProvider(rpmSdp); // Add SoC power entity std::vector socStateResidencyConfigs = { @@ -99,24 +104,43 @@ int main(int /* argc */, char ** /* argv */) { .totalTimePrefix = "actual last sleep(msec):", .lastEntrySupported = false}}; - auto socSdp = - std::make_shared("/d/system_stats"); + sp socSdp = + new GenericStateResidencyDataProvider("/d/system_stats"); uint32_t socId = service->addPowerEntity("SoC", PowerEntityType::POWER_DOMAIN); socSdp->addEntity(socId, PowerEntityConfig(socStateResidencyConfigs)); - service->addStateResidencyDataProvider(std::move(socSdp)); + service->addStateResidencyDataProvider(socSdp); // Add WLAN power entity uint32_t wlanId = service->addPowerEntity("WLAN", PowerEntityType::SUBSYSTEM); - auto wlanSdp = - std::make_shared(wlanId, "/d/wlan0/power_stats"); - service->addStateResidencyDataProvider(std::move(wlanSdp)); + sp wlanSdp = + new WlanStateResidencyDataProvider(wlanId, "/d/wlan0/power_stats"); + service->addStateResidencyDataProvider(wlanSdp); // Add Easel power entity uint32_t easelId = service->addPowerEntity("Easel", PowerEntityType::SUBSYSTEM); - auto easelSdp = std::make_shared(easelId); - service->addStateResidencyDataProvider(std::move(easelSdp)); + sp easelSdp = new EaselStateResidencyDataProvider(easelId); + service->addStateResidencyDataProvider(easelSdp); + + // Add Power Entities that require the Aidl data provider + sp aidlSdp = new AidlStateResidencyDataProvider(); + // TODO(117585786): Add real power entities here + // uint32_t mock1Id = service->addPowerEntity("Mock1", PowerEntityType::SUBSYSTEM); + // aidlSdp->addEntity(mock1Id, "Mock1", {"state_a", "state_b"}); + // uint32_t mock2Id = service->addPowerEntity("Mock2", PowerEntityType::SUBSYSTEM); + // aidlSdp->addEntity(mock2Id, "Mock2", {"state_c", "state_d"}); + + 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; + } + sp ps{android::ProcessState::self()}; // Create non-HW binder threadpool + ps->startThreadPool(); + + service->addStateResidencyDataProvider(aidlSdp); // Configure the threadpool configureRpcThreadpool(1, true /*callerWillJoin*/);