bcl: Support thismeal binary

Add command for dump_power to create thismeal.txt
from thismeal.bin.

Support BatteryMitigationService to monitor
brownout event and generate thismeal.bin.

Test: /vendor/bin/hw/battery_mitigation -d
Bug: 293899466
Change-Id: I3fcbd62af25204a7469dd3952a91cd6d281bccd7
Signed-off-by: samou <samou@google.com>
This commit is contained in:
samou 2023-10-31 16:39:26 +00:00
parent c5d1c75378
commit e153fc34ad

View File

@ -18,15 +18,18 @@
#include <android/binder_process.h>
#include <battery_mitigation/BatteryMitigation.h>
#include <battery_mitigation/BatteryMitigationService.h>
#include <sys/resource.h>
#include <system/thread_defs.h>
#define COUNT_LIMIT 10
using android::hardware::google::pixel::BatteryMitigation;
using android::hardware::google::pixel::BatteryMitigationService;
using android::hardware::google::pixel::MitigationConfig;
android::sp<BatteryMitigation> bmSp;
android::sp<BatteryMitigationService> batteryMitigationService;
const struct MitigationConfig::Config cfg = {
.SystemPath = {
@ -86,10 +89,52 @@ const struct MitigationConfig::EventThreadConfig eventThreadCfg = {
.TriggeredIdxPath = "/sys/devices/virtual/pmic/mitigation/br_stats/triggered_idx",
.BrownoutStatsPath = "/sys/devices/virtual/pmic/mitigation/br_stats/stats",
.StoringPath = "/data/vendor/mitigation/thismeal.bin",
.BackupPath = "/data/vendor/mitigation/lastmeal.bin",
.ParsedThismealPath = "/data/vendor/mitigation/thismeal.txt",
.ParsedLastmealPath = "/data/vendor/mitigation/lastmeal.txt",
.FvpStatsPath = "/sys/devices/platform/acpm_stats/fvp_stats",
.PcieModemPath = "/sys/devices/platform/12100000.pcie/power_stats",
.PcieWifiPath = "/sys/devices/platform/13120000.pcie/power_stats",
.PmicCommon = {
/* Main Pmic */
{
.OdpmDir = "/sys/bus/iio/devices/iio:device0",
.OdpmEnabledRailsPath = "/sys/bus/iio/devices/iio:device0/enabled_rails",
.PmicNamePath = "/sys/bus/iio/devices/iio:device0/name",
},
/* Sub Pmic */
{
.OdpmDir = "/sys/bus/iio/devices/iio:device1",
.OdpmEnabledRailsPath = "/sys/bus/iio/devices/iio:device1/enabled_rails",
.PmicNamePath = "/sys/bus/iio/devices/iio:device1/name",
},
},
.PlatformSpecific = {
/* MIN_SUPPORTED_PLATFORM */
{
.MainPmicName = "s2mpg10-odpm\n",
.SubPmicName = "s2mpg11-odpm\n",
.PcieModemPath = "/sys/devices/platform/11920000.pcie/power_stats",
.PcieWifiPath = "/sys/devices/platform/14520000.pcie/power_stats",
},
{
.MainPmicName = "s2mpg12-odpm\n",
.SubPmicName = "s2mpg13-odpm\n",
.PcieModemPath = "/sys/devices/platform/11920000.pcie/power_stats",
.PcieWifiPath = "/sys/devices/platform/14520000.pcie/power_stats",
},
{
.MainPmicName = "s2mpg14-odpm\n",
.SubPmicName = "s2mpg15-odpm\n",
.PcieModemPath = "/sys/devices/platform/12100000.pcie/power_stats",
.PcieWifiPath = "/sys/devices/platform/13120000.pcie/power_stats",
},
/* MAX_SUPPORTED_PLATFORM */
{
.MainPmicName = "s2mpg14-odpm\n",
.SubPmicName = "s2mpg15-odpm\n",
.PcieModemPath = "/sys/devices/platform/12100000.pcie/power_stats",
.PcieWifiPath = "/sys/devices/platform/13120000.pcie/power_stats",
},
},
};
const char kReadyFilePath[] = "/sys/devices/virtual/pmic/mitigation/instruction/ready";
@ -106,31 +151,60 @@ std::string GetSystemProperty(std::string property) {
return std::string(value);
}
int main(int /*argc*/, char ** /*argv*/) {
int main(int argc, char **argv) {
std::string cdt = GetSystemProperty(kCDTProperty);
int platformNum = atoi(cdt.substr(5, 1).c_str());
batteryMitigationService = new BatteryMitigationService(eventThreadCfg,
platformNum);
if (!batteryMitigationService) {
return 0;
}
bool platformSupported = batteryMitigationService->isPlatformSupported();
bool brownoutStatsBinarySupported = batteryMitigationService->isBrownoutStatsBinarySupported();
if (argc == 2) {
if(strcmp(argv[1], "-d") == 0 &&
brownoutStatsBinarySupported &&
platformSupported) {
/* Create thismeal.txt from thismeal.bin */
batteryMitigationService->genParsedMeal(eventThreadCfg.ParsedThismealPath);
}
return 0;
}
setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO);
auto batteryMitigationStartTime = std::chrono::system_clock::now();
ABinderProcess_setThreadPoolMaxThreadCount(1);
ABinderProcess_startThreadPool();
bmSp = new BatteryMitigation(cfg, eventThreadCfg);
if (!bmSp) {
return 0;
}
std::string cdt = GetSystemProperty(kCDTProperty);
int platform_num = atoi(cdt.substr(5, 1).c_str());
if (platform_num >= MIN_SUPPORTED_PLATFORM) {
bmSp->startBrownoutEventThread();
}
bool mitigationLogTimeValid = bmSp->isMitigationLogTimeValid(batteryMitigationStartTime,
cfg.LogFilePath,
cfg.TimestampFormat,
kTimestampRegex);
bool mitigationLogTimeValid;
std::string reason = android::base::GetProperty(kBRRequestedProperty, "");
if (!reason.empty() && mitigationLogTimeValid) {
std::ifstream src(cfg.LogFilePath, std::ios::in);
std::ofstream dst(kLastMealPath, std::ios::out);
dst << src.rdbuf();
android::base::SetProperty(kLastMealProperty, "1");
if (brownoutStatsBinarySupported) {
/* Create lastmeal.txt if the dump time in thismeal.bin are valid */
mitigationLogTimeValid = batteryMitigationService->isTimeValid(eventThreadCfg.StoringPath,
batteryMitigationStartTime);
if (!reason.empty() && mitigationLogTimeValid &&
batteryMitigationService->genParsedMeal(eventThreadCfg.ParsedLastmealPath)) {
android::base::SetProperty(kLastMealProperty, "1");
}
/* Start BrownoutEventThread to poll brownout event from kernel */
batteryMitigationService->startBrownoutEventThread();
} else{
bmSp = new BatteryMitigation(cfg);
if (!bmSp) {
return 0;
}
mitigationLogTimeValid = bmSp->isMitigationLogTimeValid(batteryMitigationStartTime,
cfg.LogFilePath,
cfg.TimestampFormat,
kTimestampRegex);
if (!reason.empty() && mitigationLogTimeValid) {
std::ifstream src(cfg.LogFilePath, std::ios::in);
std::ofstream dst(kLastMealPath, std::ios::out);
dst << src.rdbuf();
android::base::SetProperty(kLastMealProperty, "1");
}
}
bool isBatteryMitigationReady = false;
std::string ready_str;
int val = 0;