From 5f32222576cbfa1c44abd827fc38ef9c32afdb99 Mon Sep 17 00:00:00 2001 From: Darren Hsu Date: Mon, 13 Mar 2023 11:11:55 +0800 Subject: [PATCH] powerstats: introduce AdaptiveDvfsStateResidency data provider This is a new data provider to get state residency from fvp_stats, which is similar with DVFS data provider. But the difference is that CPU frequency table is read from cpufreq sysfs and not predefined in the config. Bug: 272642210 Bug: 267638537 Test: dumpsys android.hardware.power.stats.IPowerStats/default Change-Id: I22451b55dee5dfb0a1b36497533c2063984d5483 Signed-off-by: Darren Hsu --- ...AdaptiveDvfsStateResidencyDataProvider.cpp | 80 +++++++++++++++++++ powerstats/DvfsStateResidencyDataProvider.cpp | 2 +- .../AdaptiveDvfsStateResidencyDataProvider.h | 57 +++++++++++++ .../include/DvfsStateResidencyDataProvider.h | 4 +- 4 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp create mode 100644 powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h diff --git a/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp b/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp new file mode 100644 index 0000000..28b076c --- /dev/null +++ b/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "AdaptiveDvfsStateResidencyDataProvider.h" + +#include +#include +#include + +#include +#include + +using android::base::Split; +using android::base::Trim; + +namespace aidl { +namespace android { +namespace hardware { +namespace power { +namespace stats { + +AdaptiveDvfsStateResidencyDataProvider::AdaptiveDvfsStateResidencyDataProvider( + std::string path, + uint64_t clockRate, + std::string powerEntityName, + std::string freqPath) + : DvfsStateResidencyDataProvider(path, clockRate, {}) { + std::unique_ptr fp(fopen(freqPath.c_str(), "r"), fclose); + if (!fp) { + PLOG(ERROR) << __func__ << ":Failed to open file " << freqPath; + return; + } + + size_t len = 0; + char *line = nullptr; + std::string suffix = "MHz"; + std::vector> states = {}; + std::vector parts; + std::string freqStr; + + while (getline(&line, &len, fp.get()) != -1) { + parts = Split(line, " "); + if (parts.size() > 0) { + freqStr = Trim(parts[0]); + states.push_back(std::make_pair( + freqStr.substr(0, freqStr.length() - 3) + suffix, + freqStr)); + } + } + + mPowerEntities.push_back({powerEntityName, std::move(states)}); +} + +bool AdaptiveDvfsStateResidencyDataProvider::getStateResidencies( + std::unordered_map> *residencies) { + return DvfsStateResidencyDataProvider::getStateResidencies(residencies); +} + +std::unordered_map> + AdaptiveDvfsStateResidencyDataProvider::getInfo() { + return DvfsStateResidencyDataProvider::getInfo(); +} + +} // namespace stats +} // namespace power +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/powerstats/DvfsStateResidencyDataProvider.cpp b/powerstats/DvfsStateResidencyDataProvider.cpp index 511159e..c7561d6 100644 --- a/powerstats/DvfsStateResidencyDataProvider.cpp +++ b/powerstats/DvfsStateResidencyDataProvider.cpp @@ -37,7 +37,7 @@ namespace stats { DvfsStateResidencyDataProvider::DvfsStateResidencyDataProvider(std::string path, uint64_t clockRate, std::vector cfgs) - : mPath(std::move(path)), mClockRate(clockRate), mPowerEntities(std::move(cfgs)) {} + : mPowerEntities(std::move(cfgs)), mPath(std::move(path)), mClockRate(clockRate) {} int32_t DvfsStateResidencyDataProvider::matchEntity(char const *line) { for (int32_t i = 0; i < mPowerEntities.size(); i++) { diff --git a/powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h b/powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h new file mode 100644 index 0000000..661b940 --- /dev/null +++ b/powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include "DvfsStateResidencyDataProvider.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace power { +namespace stats { + +class AdaptiveDvfsStateResidencyDataProvider : public DvfsStateResidencyDataProvider { + public: + /* + * path - path to dvfs sysfs node. + * clockRate - clock rate in KHz. + * powerEntityName - power entity name to parse. + * freqPath - path to frequency table. + */ + AdaptiveDvfsStateResidencyDataProvider( + std::string path, + uint64_t clockRate, + std::string powerEntityName, + std::string freqPath); + ~AdaptiveDvfsStateResidencyDataProvider() = default; + + /* + * See IStateResidencyDataProvider::getStateResidencies + */ + bool getStateResidencies( + std::unordered_map> *residencies) override; + + /* + * See IStateResidencyDataProvider::getInfo + */ + std::unordered_map> getInfo() override; +}; + +} // namespace stats +} // namespace power +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/powerstats/include/DvfsStateResidencyDataProvider.h b/powerstats/include/DvfsStateResidencyDataProvider.h index ca8ab22..0aeafb7 100644 --- a/powerstats/include/DvfsStateResidencyDataProvider.h +++ b/powerstats/include/DvfsStateResidencyDataProvider.h @@ -51,6 +51,9 @@ class DvfsStateResidencyDataProvider : public PowerStats::IStateResidencyDataPro */ std::unordered_map> getInfo() override; + protected: + std::vector mPowerEntities; + private: int32_t matchEntity(char const *line); int32_t matchState(char const *line, const Config& powerEntity); @@ -58,7 +61,6 @@ class DvfsStateResidencyDataProvider : public PowerStats::IStateResidencyDataPro const std::string mPath; const uint64_t mClockRate; - std::vector mPowerEntities; }; } // namespace stats