Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2020 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 17 | #include <PowerStatsAidl.h> |
Benjamin Schwartz | 3c71249 | 2021-03-18 17:57:13 -0700 | [diff] [blame] | 18 | #include <Gs101CommonDataProviders.h> |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 19 | #include "AocStateResidencyDataProvider.h" |
Benjamin Schwartz | 6899dcc | 2021-04-15 10:39:00 -0700 | [diff] [blame] | 20 | #include "DevfreqStateResidencyDataProvider.h" |
Darren Hsu | 9f8d681 | 2024-01-29 11:26:08 +0800 | [diff] [blame] | 21 | #include <DisplayMrrStateResidencyDataProvider.h> |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 22 | #include "DvfsStateResidencyDataProvider.h" |
Benjamin Schwartz | 10e6ca8 | 2021-03-15 17:31:52 -0700 | [diff] [blame] | 23 | #include "UfsStateResidencyDataProvider.h" |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 24 | #include <dataproviders/GenericStateResidencyDataProvider.h> |
| 25 | #include <dataproviders/IioEnergyMeterDataProvider.h> |
| 26 | #include <dataproviders/PowerStatsEnergyConsumer.h> |
| 27 | #include <dataproviders/PowerStatsEnergyAttribution.h> |
| 28 | #include <dataproviders/PixelStateResidencyDataProvider.h> |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 29 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 30 | #include <android-base/logging.h> |
| 31 | #include <android-base/properties.h> |
| 32 | #include <android/binder_manager.h> |
| 33 | #include <android/binder_process.h> |
| 34 | #include <log/log.h> |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 35 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 36 | using aidl::android::hardware::power::stats::AocStateResidencyDataProvider; |
Benjamin Schwartz | 6899dcc | 2021-04-15 10:39:00 -0700 | [diff] [blame] | 37 | using aidl::android::hardware::power::stats::DevfreqStateResidencyDataProvider; |
Darren Hsu | 9f8d681 | 2024-01-29 11:26:08 +0800 | [diff] [blame] | 38 | using aidl::android::hardware::power::stats::DisplayMrrStateResidencyDataProvider; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 39 | using aidl::android::hardware::power::stats::DvfsStateResidencyDataProvider; |
Benjamin Schwartz | 10e6ca8 | 2021-03-15 17:31:52 -0700 | [diff] [blame] | 40 | using aidl::android::hardware::power::stats::UfsStateResidencyDataProvider; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 41 | using aidl::android::hardware::power::stats::EnergyConsumerType; |
| 42 | using aidl::android::hardware::power::stats::GenericStateResidencyDataProvider; |
| 43 | using aidl::android::hardware::power::stats::IioEnergyMeterDataProvider; |
| 44 | using aidl::android::hardware::power::stats::PixelStateResidencyDataProvider; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 45 | using aidl::android::hardware::power::stats::PowerStatsEnergyConsumer; |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 46 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 47 | constexpr char kBootHwSoCRev[] = "ro.boot.hw.soc.rev"; |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 48 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 49 | void addAoC(std::shared_ptr<PowerStats> p) { |
Darren Hsu | 3698b06 | 2022-06-17 20:30:18 +0800 | [diff] [blame] | 50 | // AoC clock is synced from "libaoc.c" |
| 51 | static const uint64_t AOC_CLOCK = 4096; |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 52 | std::string prefix = "/sys/devices/platform/19000000.aoc/control/"; |
| 53 | |
| 54 | // Add AoC cores (a32, ff1, hf0, and hf1) |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 55 | std::vector<std::pair<std::string, std::string>> coreIds = { |
| 56 | {"AoC-A32", prefix + "a32_"}, |
| 57 | {"AoC-FF1", prefix + "ff1_"}, |
| 58 | {"AoC-HF1", prefix + "hf1_"}, |
| 59 | {"AoC-HF0", prefix + "hf0_"}, |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 60 | }; |
| 61 | std::vector<std::pair<std::string, std::string>> coreStates = { |
| 62 | {"DWN", "off"}, {"RET", "retention"}, {"WFI", "wfi"}}; |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 63 | p->addStateResidencyDataProvider(std::make_unique<AocStateResidencyDataProvider>(coreIds, |
Darren Hsu | 3698b06 | 2022-06-17 20:30:18 +0800 | [diff] [blame] | 64 | coreStates, AOC_CLOCK)); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 65 | |
| 66 | // Add AoC voltage stats |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 67 | std::vector<std::pair<std::string, std::string>> voltageIds = { |
| 68 | {"AoC-Voltage", prefix + "voltage_"}, |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 69 | }; |
| 70 | std::vector<std::pair<std::string, std::string>> voltageStates = {{"NOM", "nominal"}, |
| 71 | {"SUD", "super_underdrive"}, |
| 72 | {"UUD", "ultra_underdrive"}, |
| 73 | {"UD", "underdrive"}}; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 74 | p->addStateResidencyDataProvider( |
Darren Hsu | 3698b06 | 2022-06-17 20:30:18 +0800 | [diff] [blame] | 75 | std::make_unique<AocStateResidencyDataProvider>(voltageIds, voltageStates, AOC_CLOCK)); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 76 | |
| 77 | // Add AoC monitor mode |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 78 | std::vector<std::pair<std::string, std::string>> monitorIds = { |
| 79 | {"AoC", prefix + "monitor_"}, |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 80 | }; |
| 81 | std::vector<std::pair<std::string, std::string>> monitorStates = { |
| 82 | {"MON", "mode"}, |
| 83 | }; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 84 | p->addStateResidencyDataProvider( |
Darren Hsu | 3698b06 | 2022-06-17 20:30:18 +0800 | [diff] [blame] | 85 | std::make_unique<AocStateResidencyDataProvider>(monitorIds, monitorStates, AOC_CLOCK)); |
Darren Hsu | cce5e9f | 2022-03-24 07:56:43 +0800 | [diff] [blame] | 86 | |
| 87 | // Add AoC restart count |
| 88 | const GenericStateResidencyDataProvider::StateResidencyConfig restartCountConfig = { |
| 89 | .entryCountSupported = true, |
| 90 | .entryCountPrefix = "", |
| 91 | .totalTimeSupported = false, |
| 92 | .lastEntrySupported = false, |
| 93 | }; |
| 94 | const std::vector<std::pair<std::string, std::string>> restartCountHeaders = { |
| 95 | std::make_pair("RESTART", ""), |
| 96 | }; |
| 97 | std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs; |
| 98 | cfgs.emplace_back( |
| 99 | generateGenericStateResidencyConfigs(restartCountConfig, restartCountHeaders), |
| 100 | "AoC-Count", ""); |
| 101 | p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>( |
| 102 | "/sys/devices/platform/19000000.aoc/restart_count", cfgs)); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 103 | } |
| 104 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 105 | void addDvfsStats(std::shared_ptr<PowerStats> p) { |
| 106 | // A constant to represent the number of nanoseconds in one millisecond |
| 107 | const int NS_TO_MS = 1000000; |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 108 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 109 | std::vector<DvfsStateResidencyDataProvider::Config> cfgs; |
| 110 | |
| 111 | cfgs.push_back({"MIF", { |
samou | b14db4c | 2021-07-14 04:22:48 +0000 | [diff] [blame] | 112 | std::make_pair("3172MHz", "3172000"), |
| 113 | std::make_pair("2730MHz", "2730000"), |
| 114 | std::make_pair("2535MHz", "2535000"), |
| 115 | std::make_pair("2288MHz", "2288000"), |
| 116 | std::make_pair("2028MHz", "2028000"), |
| 117 | std::make_pair("1716MHz", "1716000"), |
| 118 | std::make_pair("1539MHz", "1539000"), |
| 119 | std::make_pair("1352MHz", "1352000"), |
| 120 | std::make_pair("1014MHz", "1014000"), |
| 121 | std::make_pair("845MHz", "845000"), |
| 122 | std::make_pair("676MHz", "676000"), |
| 123 | std::make_pair("546MHz", "546000"), |
| 124 | std::make_pair("421MHz", "421000"), |
| 125 | std::make_pair("0MHz", "0"), |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 126 | }}); |
| 127 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 128 | cfgs.push_back({"CL1", { |
samou | b14db4c | 2021-07-14 04:22:48 +0000 | [diff] [blame] | 129 | std::make_pair("2466MHz", "2466000"), |
| 130 | std::make_pair("2393MHz", "2393000"), |
| 131 | std::make_pair("2348MHz", "2348000"), |
| 132 | std::make_pair("2253MHz", "2253000"), |
| 133 | std::make_pair("2130MHz", "2130000"), |
| 134 | std::make_pair("1999MHz", "1999000"), |
| 135 | std::make_pair("1836MHz", "1836000"), |
| 136 | std::make_pair("1663MHz", "1663000"), |
| 137 | std::make_pair("1491MHz", "1491000"), |
| 138 | std::make_pair("1328MHz", "1328000"), |
| 139 | std::make_pair("1197MHz", "1197000"), |
| 140 | std::make_pair("1024MHz", "1024000"), |
| 141 | std::make_pair("910MHz", "910000"), |
| 142 | std::make_pair("799MHz", "799000"), |
| 143 | std::make_pair("696MHz", "696000"), |
| 144 | std::make_pair("533MHz", "533000"), |
| 145 | std::make_pair("400MHz", "400000"), |
| 146 | std::make_pair("0MHz", "0"), |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 147 | }}); |
| 148 | |
Benjamin Schwartz | d9e7656 | 2021-04-13 14:05:51 -0700 | [diff] [blame] | 149 | // B0/B1 chips have different DVFS operating points than A0/A1 SoC |
| 150 | const int socRev = android::base::GetIntProperty(kBootHwSoCRev, 0); |
| 151 | if (socRev >= 2) { |
| 152 | cfgs.push_back({"CL0", { |
samou | b14db4c | 2021-07-14 04:22:48 +0000 | [diff] [blame] | 153 | std::make_pair("2196MHz", "2196000"), |
| 154 | std::make_pair("2098MHz", "2098000"), |
| 155 | std::make_pair("2024MHz", "2024000"), |
| 156 | std::make_pair("1950MHz", "1950000"), |
| 157 | std::make_pair("1803MHz", "1803000"), |
| 158 | std::make_pair("1704MHz", "1704000"), |
| 159 | std::make_pair("1598MHz", "1598000"), |
| 160 | std::make_pair("1401MHz", "1401000"), |
| 161 | std::make_pair("1328MHz", "1328000"), |
| 162 | std::make_pair("1197MHz", "1197000"), |
| 163 | std::make_pair("1098MHz", "1098000"), |
| 164 | std::make_pair("930MHz", "930000"), |
| 165 | std::make_pair("738MHz", "738000"), |
| 166 | std::make_pair("574MHz", "574000"), |
| 167 | std::make_pair("300MHz", "300000"), |
| 168 | std::make_pair("0MHz", "0"), |
Benjamin Schwartz | d9e7656 | 2021-04-13 14:05:51 -0700 | [diff] [blame] | 169 | }}); |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 170 | |
Benjamin Schwartz | d9e7656 | 2021-04-13 14:05:51 -0700 | [diff] [blame] | 171 | cfgs.push_back({"CL2", { |
samou | b14db4c | 2021-07-14 04:22:48 +0000 | [diff] [blame] | 172 | std::make_pair("3195MHz", "3195000"), |
| 173 | std::make_pair("3097MHz", "3097000"), |
| 174 | std::make_pair("2950MHz", "2950000"), |
| 175 | std::make_pair("2850MHz", "2850000"), |
| 176 | std::make_pair("2802MHz", "2802000"), |
| 177 | std::make_pair("2704MHz", "2704000"), |
| 178 | std::make_pair("2630MHz", "2630000"), |
| 179 | std::make_pair("2507MHz", "2507000"), |
| 180 | std::make_pair("2401MHz", "2401000"), |
| 181 | std::make_pair("2252MHz", "2252000"), |
| 182 | std::make_pair("2188MHz", "2188000"), |
| 183 | std::make_pair("2048MHz", "2048000"), |
| 184 | std::make_pair("1826MHz", "1826000"), |
| 185 | std::make_pair("1745MHz", "1745000"), |
| 186 | std::make_pair("1582MHz", "1582000"), |
| 187 | std::make_pair("1426MHz", "1426000"), |
| 188 | std::make_pair("1277MHz", "1277000"), |
| 189 | std::make_pair("1106MHz", "1106000"), |
| 190 | std::make_pair("984MHz", "984000"), |
| 191 | std::make_pair("851MHz", "851000"), |
| 192 | std::make_pair("500MHz", "500000"), |
| 193 | std::make_pair("0MHz", "0"), |
Benjamin Schwartz | d9e7656 | 2021-04-13 14:05:51 -0700 | [diff] [blame] | 194 | }}); |
| 195 | |
| 196 | cfgs.push_back({"TPU", { |
samou | ed31b73 | 2021-08-11 06:17:19 +0000 | [diff] [blame] | 197 | std::make_pair("1230MHz", "1230000"), |
| 198 | std::make_pair("1066MHz", "1066000"), |
| 199 | std::make_pair("800MHz", "800000"), |
| 200 | std::make_pair("500MHz", "500000"), |
samou | b14db4c | 2021-07-14 04:22:48 +0000 | [diff] [blame] | 201 | std::make_pair("226MHz", "226000"), |
Benjamin Schwartz | d9e7656 | 2021-04-13 14:05:51 -0700 | [diff] [blame] | 202 | std::make_pair("RET_SLOW", "6"), |
| 203 | std::make_pair("S_OFF", "5"), |
| 204 | std::make_pair("S_SLOW", "4"), |
| 205 | std::make_pair("DS_FAST", "3"), |
| 206 | std::make_pair("DS_SLOW", "2"), |
| 207 | std::make_pair("DS_OFF", "1"), |
| 208 | std::make_pair("OFF", "0"), |
| 209 | }}); |
| 210 | } else { |
| 211 | cfgs.push_back({"CL0", { |
samou | b14db4c | 2021-07-14 04:22:48 +0000 | [diff] [blame] | 212 | std::make_pair("2196MHz", "2196000"), |
| 213 | std::make_pair("2098MHz", "2098000"), |
| 214 | std::make_pair("2024MHz", "2024000"), |
| 215 | std::make_pair("1950MHz", "1950000"), |
| 216 | std::make_pair("1868MHz", "1868000"), |
| 217 | std::make_pair("1745MHz", "1745000"), |
| 218 | std::make_pair("1598MHz", "1598000"), |
| 219 | std::make_pair("1459MHz", "1459000"), |
| 220 | std::make_pair("1328MHz", "1328000"), |
| 221 | std::make_pair("1197MHz", "1197000"), |
| 222 | std::make_pair("1098MHz", "1098000"), |
| 223 | std::make_pair("889MHz", "889000"), |
| 224 | std::make_pair("738MHz", "738000"), |
| 225 | std::make_pair("574MHz", "574000"), |
| 226 | std::make_pair("300MHz", "300000"), |
| 227 | std::make_pair("0MHz", "0"), |
Benjamin Schwartz | d9e7656 | 2021-04-13 14:05:51 -0700 | [diff] [blame] | 228 | }}); |
| 229 | |
| 230 | cfgs.push_back({"CL2", { |
samou | b14db4c | 2021-07-14 04:22:48 +0000 | [diff] [blame] | 231 | std::make_pair("3195MHz", "3195000"), |
| 232 | std::make_pair("3097MHz", "3097000"), |
| 233 | std::make_pair("2999MHz", "2999000"), |
| 234 | std::make_pair("2900MHz", "2900000"), |
| 235 | std::make_pair("2802MHz", "2802000"), |
| 236 | std::make_pair("2704MHz", "2704000"), |
| 237 | std::make_pair("2630MHz", "2630000"), |
| 238 | std::make_pair("2507MHz", "2507000"), |
| 239 | std::make_pair("2302MHz", "2302000"), |
| 240 | std::make_pair("2188MHz", "2188000"), |
| 241 | std::make_pair("2048MHz", "2048000"), |
| 242 | std::make_pair("1901MHz", "1901000"), |
| 243 | std::make_pair("1745MHz", "1745000"), |
| 244 | std::make_pair("1582MHz", "1582000"), |
| 245 | std::make_pair("1426MHz", "1426000"), |
| 246 | std::make_pair("1237MHz", "1237000"), |
| 247 | std::make_pair("1106MHz", "1106000"), |
| 248 | std::make_pair("984MHz", "984000"), |
| 249 | std::make_pair("848MHz", "848000"), |
| 250 | std::make_pair("500MHz", "500000"), |
| 251 | std::make_pair("0MHz", "0"), |
Benjamin Schwartz | d9e7656 | 2021-04-13 14:05:51 -0700 | [diff] [blame] | 252 | }}); |
| 253 | |
| 254 | cfgs.push_back({"TPU", { |
samou | b14db4c | 2021-07-14 04:22:48 +0000 | [diff] [blame] | 255 | std::make_pair("1393MHz", "1393000"), |
| 256 | std::make_pair("1180MHz", "1180000"), |
| 257 | std::make_pair("1049MHz", "1049000"), |
| 258 | std::make_pair("967MHz", "967000"), |
| 259 | std::make_pair("721MHz", "721000"), |
| 260 | std::make_pair("648MHz", "648000"), |
| 261 | std::make_pair("455MHz", "455000"), |
| 262 | std::make_pair("250MHz", "250000"), |
Benjamin Schwartz | d9e7656 | 2021-04-13 14:05:51 -0700 | [diff] [blame] | 263 | std::make_pair("RET_SLOW", "6"), |
| 264 | std::make_pair("S_OFF", "5"), |
| 265 | std::make_pair("S_SLOW", "4"), |
| 266 | std::make_pair("DS_FAST", "3"), |
| 267 | std::make_pair("DS_SLOW", "2"), |
| 268 | std::make_pair("DS_OFF", "1"), |
| 269 | std::make_pair("OFF", "0"), |
| 270 | }}); |
| 271 | } |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 272 | |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 273 | p->addStateResidencyDataProvider(std::make_unique<DvfsStateResidencyDataProvider>( |
Benjamin Schwartz | 82a0c52 | 2021-03-09 11:20:04 -0800 | [diff] [blame] | 274 | "/sys/devices/platform/acpm_stats/fvp_stats", NS_TO_MS, cfgs)); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 275 | } |
| 276 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 277 | void addSoC(std::shared_ptr<PowerStats> p) { |
| 278 | // A constant to represent the number of nanoseconds in one millisecond. |
| 279 | const int NS_TO_MS = 1000000; |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 280 | |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 281 | // ACPM stats are reported in nanoseconds. The transform function |
| 282 | // converts nanoseconds to milliseconds. |
| 283 | std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; }; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 284 | const GenericStateResidencyDataProvider::StateResidencyConfig lpmStateConfig = { |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 285 | .entryCountSupported = true, |
| 286 | .entryCountPrefix = "success_count:", |
| 287 | .totalTimeSupported = true, |
| 288 | .totalTimePrefix = "total_time_ns:", |
| 289 | .totalTimeTransform = acpmNsToMs, |
| 290 | .lastEntrySupported = true, |
| 291 | .lastEntryPrefix = "last_entry_time_ns:", |
| 292 | .lastEntryTransform = acpmNsToMs, |
| 293 | }; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 294 | const GenericStateResidencyDataProvider::StateResidencyConfig downStateConfig = { |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 295 | .entryCountSupported = true, |
| 296 | .entryCountPrefix = "down_count:", |
| 297 | .totalTimeSupported = true, |
| 298 | .totalTimePrefix = "total_down_time_ns:", |
| 299 | .totalTimeTransform = acpmNsToMs, |
| 300 | .lastEntrySupported = true, |
| 301 | .lastEntryPrefix = "last_down_time_ns:", |
| 302 | .lastEntryTransform = acpmNsToMs, |
| 303 | }; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 304 | const GenericStateResidencyDataProvider::StateResidencyConfig reqStateConfig = { |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 305 | .entryCountSupported = true, |
| 306 | .entryCountPrefix = "req_up_count:", |
| 307 | .totalTimeSupported = true, |
| 308 | .totalTimePrefix = "total_req_up_time_ns:", |
| 309 | .totalTimeTransform = acpmNsToMs, |
| 310 | .lastEntrySupported = true, |
| 311 | .lastEntryPrefix = "last_req_up_time_ns:", |
| 312 | .lastEntryTransform = acpmNsToMs, |
| 313 | |
| 314 | }; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 315 | const std::vector<std::pair<std::string, std::string>> powerStateHeaders = { |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 316 | std::make_pair("SICD", "SICD"), |
| 317 | std::make_pair("SLEEP", "SLEEP"), |
| 318 | std::make_pair("SLEEP_SLCMON", "SLEEP_SLCMON"), |
| 319 | std::make_pair("STOP", "STOP"), |
| 320 | }; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 321 | const std::vector<std::pair<std::string, std::string>> mifReqStateHeaders = { |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 322 | std::make_pair("AOC", "AOC"), |
| 323 | std::make_pair("GSA", "GSA"), |
| 324 | }; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 325 | const std::vector<std::pair<std::string, std::string>> slcReqStateHeaders = { |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 326 | std::make_pair("AOC", "AOC"), |
| 327 | }; |
| 328 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 329 | std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs; |
| 330 | cfgs.emplace_back(generateGenericStateResidencyConfigs(lpmStateConfig, powerStateHeaders), |
| 331 | "LPM", "LPM:"); |
| 332 | cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders), |
| 333 | "MIF", "MIF:"); |
| 334 | cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, mifReqStateHeaders), |
| 335 | "MIF-REQ", "MIF_REQ:"); |
| 336 | cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders), |
| 337 | "SLC", "SLC:"); |
| 338 | cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, slcReqStateHeaders), |
| 339 | "SLC-REQ", "SLC_REQ:"); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 340 | |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 341 | p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>( |
| 342 | "/sys/devices/platform/acpm_stats/soc_stats", cfgs)); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 343 | } |
| 344 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 345 | void setEnergyMeter(std::shared_ptr<PowerStats> p) { |
Ryan Prichard | cbb28ea | 2024-09-12 13:15:56 -0700 | [diff] [blame] | 346 | std::vector<std::string> deviceNames { "s2mpg10-odpm", "s2mpg11-odpm" }; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 347 | p->setEnergyMeterDataProvider(std::make_unique<IioEnergyMeterDataProvider>(deviceNames, true)); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 348 | } |
| 349 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 350 | void addCPUclusters(std::shared_ptr<PowerStats> p) { |
Benjamin Schwartz | da983cb | 2021-03-09 15:52:55 -0800 | [diff] [blame] | 351 | // A constant to represent the number of nanoseconds in one millisecond. |
| 352 | const int NS_TO_MS = 1000000; |
| 353 | |
| 354 | std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; }; |
| 355 | const GenericStateResidencyDataProvider::StateResidencyConfig cpuStateConfig = { |
| 356 | .entryCountSupported = true, |
| 357 | .entryCountPrefix = "down_count:", |
| 358 | .totalTimeSupported = true, |
| 359 | .totalTimePrefix = "total_down_time_ns:", |
| 360 | .totalTimeTransform = acpmNsToMs, |
| 361 | .lastEntrySupported = true, |
| 362 | .lastEntryPrefix = "last_down_time_ns:", |
| 363 | .lastEntryTransform = acpmNsToMs, |
| 364 | }; |
| 365 | |
| 366 | const std::vector<std::pair<std::string, std::string>> cpuStateHeaders = { |
| 367 | std::make_pair("DOWN", ""), |
| 368 | }; |
| 369 | |
| 370 | std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs; |
| 371 | for (std::string name : {"CORE00", "CORE01", "CORE02", "CORE03", "CORE10", "CORE11", |
| 372 | "CORE20", "CORE21", "CLUSTER0", "CLUSTER1", "CLUSTER2"}) { |
| 373 | cfgs.emplace_back(generateGenericStateResidencyConfigs(cpuStateConfig, cpuStateHeaders), |
| 374 | name, name); |
| 375 | } |
| 376 | |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 377 | p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>( |
| 378 | "/sys/devices/platform/acpm_stats/core_stats", cfgs)); |
Benjamin Schwartz | da983cb | 2021-03-09 15:52:55 -0800 | [diff] [blame] | 379 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 380 | p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p, |
| 381 | EnergyConsumerType::CPU_CLUSTER, "CPUCL0", {"S4M_VDD_CPUCL0"})); |
| 382 | p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p, |
| 383 | EnergyConsumerType::CPU_CLUSTER, "CPUCL1", {"S3M_VDD_CPUCL1"})); |
| 384 | p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p, |
| 385 | EnergyConsumerType::CPU_CLUSTER, "CPUCL2", {"S2M_VDD_CPUCL2"})); |
| 386 | } |
| 387 | |
| 388 | void addGPU(std::shared_ptr<PowerStats> p) { |
| 389 | // Add gpu energy consumer |
| 390 | std::map<std::string, int32_t> stateCoeffs; |
| 391 | const int socRev = android::base::GetIntProperty(kBootHwSoCRev, 0); |
| 392 | |
| 393 | // B0/B1 chips have different GPU DVFS operating points than A0/A1 SoC |
| 394 | if (socRev >= 2) { |
| 395 | stateCoeffs = { |
samou | 9db455e | 2021-03-30 15:58:10 +0000 | [diff] [blame] | 396 | {"151000", 642}, |
| 397 | {"202000", 890}, |
| 398 | {"251000", 1102}, |
| 399 | {"302000", 1308}, |
| 400 | {"351000", 1522}, |
| 401 | {"400000", 1772}, |
| 402 | {"471000", 2105}, |
| 403 | {"510000", 2292}, |
| 404 | {"572000", 2528}, |
| 405 | {"701000", 3127}, |
| 406 | {"762000", 3452}, |
| 407 | {"848000", 4044}}; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 408 | } else { |
| 409 | stateCoeffs = { |
samou | 9db455e | 2021-03-30 15:58:10 +0000 | [diff] [blame] | 410 | {"151000", 843}, |
| 411 | {"302000", 1529}, |
| 412 | {"455000", 2298}, |
| 413 | {"572000", 2866}, |
| 414 | {"670000", 3191}}; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 415 | } |
| 416 | |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 417 | p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p, |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 418 | EnergyConsumerType::OTHER, "GPU", {"S2S_VDD_G3D"}, |
| 419 | {{UID_TIME_IN_STATE, "/sys/devices/platform/1c500000.mali/uid_time_in_state"}}, |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 420 | stateCoeffs)); |
samou | aeae45a | 2021-07-14 04:33:53 +0000 | [diff] [blame] | 421 | |
| 422 | p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("GPU", |
| 423 | "/sys/bus/platform/devices/1c500000.mali")); |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 424 | } |
| 425 | |
| 426 | void addMobileRadio(std::shared_ptr<PowerStats> p) |
| 427 | { |
| 428 | // A constant to represent the number of microseconds in one millisecond. |
| 429 | const int US_TO_MS = 1000; |
| 430 | |
| 431 | // modem power_stats are reported in microseconds. The transform function |
| 432 | // converts microseconds to milliseconds. |
| 433 | std::function<uint64_t(uint64_t)> modemUsToMs = [](uint64_t a) { return a / US_TO_MS; }; |
| 434 | const GenericStateResidencyDataProvider::StateResidencyConfig powerStateConfig = { |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 435 | .entryCountSupported = true, |
| 436 | .entryCountPrefix = "count:", |
| 437 | .totalTimeSupported = true, |
| 438 | .totalTimePrefix = "duration_usec:", |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 439 | .totalTimeTransform = modemUsToMs, |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 440 | .lastEntrySupported = true, |
| 441 | .lastEntryPrefix = "last_entry_timestamp_usec:", |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 442 | .lastEntryTransform = modemUsToMs, |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 443 | }; |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 444 | const std::vector<std::pair<std::string, std::string>> powerStateHeaders = { |
| 445 | std::make_pair("SLEEP", "SLEEP:"), |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 446 | }; |
| 447 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 448 | std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs; |
| 449 | cfgs.emplace_back(generateGenericStateResidencyConfigs(powerStateConfig, powerStateHeaders), |
| 450 | "MODEM", ""); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 451 | |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 452 | p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>( |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 453 | "/sys/devices/platform/cpif/modem/power_stats", cfgs)); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 454 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 455 | p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p, |
| 456 | EnergyConsumerType::MOBILE_RADIO, "MODEM", {"VSYS_PWR_MODEM", "VSYS_PWR_RFFE"})); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 457 | } |
| 458 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 459 | void addGNSS(std::shared_ptr<PowerStats> p) |
| 460 | { |
Benjamin Schwartz | 3cc9371 | 2021-04-06 16:00:58 -0700 | [diff] [blame] | 461 | // A constant to represent the number of microseconds in one millisecond. |
| 462 | const int US_TO_MS = 1000; |
| 463 | |
| 464 | // gnss power_stats are reported in microseconds. The transform function |
| 465 | // converts microseconds to milliseconds. |
| 466 | std::function<uint64_t(uint64_t)> gnssUsToMs = [](uint64_t a) { return a / US_TO_MS; }; |
| 467 | |
| 468 | const GenericStateResidencyDataProvider::StateResidencyConfig gnssStateConfig = { |
| 469 | .entryCountSupported = true, |
| 470 | .entryCountPrefix = "count:", |
| 471 | .totalTimeSupported = true, |
| 472 | .totalTimePrefix = "duration_usec:", |
| 473 | .totalTimeTransform = gnssUsToMs, |
| 474 | .lastEntrySupported = true, |
| 475 | .lastEntryPrefix = "last_entry_timestamp_usec:", |
| 476 | .lastEntryTransform = gnssUsToMs, |
| 477 | }; |
| 478 | |
| 479 | const std::vector<std::pair<std::string, std::string>> gnssStateHeaders = { |
| 480 | std::make_pair("ON", "GPS_ON:"), |
| 481 | std::make_pair("OFF", "GPS_OFF:"), |
| 482 | }; |
| 483 | |
| 484 | std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs; |
| 485 | cfgs.emplace_back(generateGenericStateResidencyConfigs(gnssStateConfig, gnssStateHeaders), |
| 486 | "GPS", ""); |
| 487 | |
| 488 | p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>( |
| 489 | "/dev/bbd_pwrstat", cfgs)); |
| 490 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 491 | p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p, |
| 492 | EnergyConsumerType::GNSS, "GPS", {"L9S_GNSS_CORE"})); |
| 493 | } |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 494 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 495 | void addPCIe(std::shared_ptr<PowerStats> p) { |
| 496 | // Add PCIe power entities for Modem and WiFi |
| 497 | const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = { |
| 498 | .entryCountSupported = true, |
| 499 | .entryCountPrefix = "Cumulative count:", |
| 500 | .totalTimeSupported = true, |
| 501 | .totalTimePrefix = "Cumulative duration msec:", |
| 502 | .lastEntrySupported = true, |
| 503 | .lastEntryPrefix = "Last entry timestamp msec:", |
| 504 | }; |
| 505 | const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = { |
| 506 | std::make_pair("UP", "Link up:"), |
| 507 | std::make_pair("DOWN", "Link down:"), |
| 508 | }; |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 509 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 510 | // Add PCIe - Modem |
| 511 | const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieModemCfgs = { |
| 512 | {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "PCIe-Modem", |
| 513 | "Version: 1"} |
| 514 | }; |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 515 | |
| 516 | p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>( |
| 517 | "/sys/devices/platform/11920000.pcie/power_stats", pcieModemCfgs)); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 518 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 519 | // Add PCIe - WiFi |
| 520 | const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieWifiCfgs = { |
| 521 | {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), |
| 522 | "PCIe-WiFi", "Version: 1"} |
| 523 | }; |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 524 | |
| 525 | p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>( |
| 526 | "/sys/devices/platform/14520000.pcie/power_stats", pcieWifiCfgs)); |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 527 | } |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 528 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 529 | void addWifi(std::shared_ptr<PowerStats> p) { |
| 530 | // The transform function converts microseconds to milliseconds. |
| 531 | std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; }; |
| 532 | const GenericStateResidencyDataProvider::StateResidencyConfig stateConfig = { |
| 533 | .entryCountSupported = true, |
| 534 | .entryCountPrefix = "count:", |
| 535 | .totalTimeSupported = true, |
| 536 | .totalTimePrefix = "duration_usec:", |
| 537 | .totalTimeTransform = usecToMs, |
| 538 | .lastEntrySupported = true, |
| 539 | .lastEntryPrefix = "last_entry_timestamp_usec:", |
| 540 | .lastEntryTransform = usecToMs, |
| 541 | }; |
| 542 | const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = { |
| 543 | .entryCountSupported = true, |
| 544 | .entryCountPrefix = "count:", |
| 545 | .totalTimeSupported = true, |
| 546 | .totalTimePrefix = "duration_usec:", |
| 547 | .totalTimeTransform = usecToMs, |
| 548 | .lastEntrySupported = false, |
| 549 | }; |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 550 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 551 | const std::vector<std::pair<std::string, std::string>> stateHeaders = { |
| 552 | std::make_pair("AWAKE", "AWAKE:"), |
| 553 | std::make_pair("ASLEEP", "ASLEEP:"), |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 554 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 555 | }; |
| 556 | const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = { |
| 557 | std::make_pair("L0", "L0:"), |
| 558 | std::make_pair("L1", "L1:"), |
| 559 | std::make_pair("L1_1", "L1_1:"), |
| 560 | std::make_pair("L1_2", "L1_2:"), |
| 561 | std::make_pair("L2", "L2:"), |
| 562 | }; |
| 563 | |
| 564 | const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs = { |
| 565 | {generateGenericStateResidencyConfigs(stateConfig, stateHeaders), "WIFI", "WIFI"}, |
| 566 | {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "WIFI-PCIE", |
| 567 | "WIFI-PCIE"} |
| 568 | }; |
| 569 | |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 570 | p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>("/sys/wifi/power_stats", |
| 571 | cfgs)); |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 572 | } |
| 573 | |
Benjamin Schwartz | 10e6ca8 | 2021-03-15 17:31:52 -0700 | [diff] [blame] | 574 | void addUfs(std::shared_ptr<PowerStats> p) { |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 575 | p->addStateResidencyDataProvider(std::make_unique<UfsStateResidencyDataProvider>("/sys/bus/platform/devices/14700000.ufs/ufs_stats/")); |
Benjamin Schwartz | 10e6ca8 | 2021-03-15 17:31:52 -0700 | [diff] [blame] | 576 | } |
| 577 | |
Benjamin Schwartz | 2219a99 | 2021-04-13 15:43:41 -0700 | [diff] [blame] | 578 | void addPowerDomains(std::shared_ptr<PowerStats> p) { |
| 579 | // A constant to represent the number of nanoseconds in one millisecond. |
| 580 | const int NS_TO_MS = 1000000; |
| 581 | |
| 582 | std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; }; |
| 583 | const GenericStateResidencyDataProvider::StateResidencyConfig cpuStateConfig = { |
| 584 | .entryCountSupported = true, |
| 585 | .entryCountPrefix = "on_count:", |
| 586 | .totalTimeSupported = true, |
| 587 | .totalTimePrefix = "total_on_time_ns:", |
| 588 | .totalTimeTransform = acpmNsToMs, |
| 589 | .lastEntrySupported = true, |
| 590 | .lastEntryPrefix = "last_on_time_ns:", |
| 591 | .lastEntryTransform = acpmNsToMs, |
| 592 | }; |
| 593 | |
| 594 | const std::vector<std::pair<std::string, std::string>> cpuStateHeaders = { |
| 595 | std::make_pair("ON", ""), |
| 596 | }; |
| 597 | |
| 598 | std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs; |
| 599 | for (std::string name : {"pd-tpu", "pd-bo", "pd-tnr", "pd-gdc", "pd-mcsc", "pd-ipp", |
| 600 | "pd-g3aa", "pd-dns", "pd-itp", "pd-pdp", "pd-csis", |
| 601 | "pd-mfc", "pd-g2d", "pd-dpu", "pd-disp", "pd-hsi0", |
| 602 | "pd-embedded_g3d", "pd-g3d", "pd-eh"}) { |
| 603 | cfgs.emplace_back(generateGenericStateResidencyConfigs(cpuStateConfig, cpuStateHeaders), |
| 604 | name, name + ":"); |
| 605 | } |
| 606 | |
| 607 | p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>( |
| 608 | "/sys/devices/platform/acpm_stats/pd_stats", cfgs)); |
| 609 | } |
| 610 | |
Benjamin Schwartz | 6899dcc | 2021-04-15 10:39:00 -0700 | [diff] [blame] | 611 | void addDevfreq(std::shared_ptr<PowerStats> p) { |
Darren Hsu | 29832dc | 2022-02-10 12:54:58 +0800 | [diff] [blame] | 612 | p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>( |
| 613 | "INT", |
Benjamin Schwartz | 630f471 | 2021-05-05 11:42:52 -0700 | [diff] [blame] | 614 | "/sys/devices/platform/17000020.devfreq_int/devfreq/17000020.devfreq_int")); |
| 615 | |
Darren Hsu | 29832dc | 2022-02-10 12:54:58 +0800 | [diff] [blame] | 616 | p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>( |
| 617 | "INTCAM", |
Benjamin Schwartz | 630f471 | 2021-05-05 11:42:52 -0700 | [diff] [blame] | 618 | "/sys/devices/platform/17000030.devfreq_intcam/devfreq/17000030.devfreq_intcam")); |
| 619 | |
Darren Hsu | 29832dc | 2022-02-10 12:54:58 +0800 | [diff] [blame] | 620 | p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>( |
| 621 | "DISP", |
| 622 | "/sys/devices/platform/17000040.devfreq_disp/devfreq/17000040.devfreq_disp")); |
| 623 | |
| 624 | p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>( |
| 625 | "CAM", |
Benjamin Schwartz | 630f471 | 2021-05-05 11:42:52 -0700 | [diff] [blame] | 626 | "/sys/devices/platform/17000050.devfreq_cam/devfreq/17000050.devfreq_cam")); |
| 627 | |
Darren Hsu | 29832dc | 2022-02-10 12:54:58 +0800 | [diff] [blame] | 628 | p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>( |
| 629 | "TNR", |
Benjamin Schwartz | 630f471 | 2021-05-05 11:42:52 -0700 | [diff] [blame] | 630 | "/sys/devices/platform/17000060.devfreq_tnr/devfreq/17000060.devfreq_tnr")); |
Darren Hsu | 29832dc | 2022-02-10 12:54:58 +0800 | [diff] [blame] | 631 | |
| 632 | p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>( |
| 633 | "MFC", |
| 634 | "/sys/devices/platform/17000070.devfreq_mfc/devfreq/17000070.devfreq_mfc")); |
Darren Hsu | 916a828 | 2022-03-16 17:22:35 +0800 | [diff] [blame] | 635 | |
| 636 | p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>( |
| 637 | "BO", |
| 638 | "/sys/devices/platform/17000080.devfreq_bo/devfreq/17000080.devfreq_bo")); |
Benjamin Schwartz | 6899dcc | 2021-04-15 10:39:00 -0700 | [diff] [blame] | 639 | } |
| 640 | |
samou | 513c4af | 2021-04-16 11:17:18 +0000 | [diff] [blame] | 641 | void addTPU(std::shared_ptr<PowerStats> p) { |
| 642 | std::map<std::string, int32_t> stateCoeffs; |
| 643 | |
| 644 | stateCoeffs = { |
samou | c1cf9f8 | 2021-05-25 21:03:38 +0000 | [diff] [blame] | 645 | {"226000", 49.25}, |
| 646 | {"500000", 73.80}, |
| 647 | {"800000", 86.99}, |
| 648 | {"1066000", 103.93}, |
| 649 | {"1230000", 108.10}}; |
samou | 513c4af | 2021-04-16 11:17:18 +0000 | [diff] [blame] | 650 | |
| 651 | p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p, |
| 652 | EnergyConsumerType::OTHER, "TPU", {"S10M_VDD_TPU"}, |
Richard Hsu | 82a677c | 2021-08-10 17:10:49 -0700 | [diff] [blame] | 653 | {{UID_TIME_IN_STATE, "/sys/class/edgetpu/edgetpu-soc/device/tpu_usage"}}, |
samou | 513c4af | 2021-04-16 11:17:18 +0000 | [diff] [blame] | 654 | stateCoeffs)); |
| 655 | } |
| 656 | |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 657 | /** |
| 658 | * Unlike other data providers, which source power entity state residency data from the kernel, |
| 659 | * this data provider acts as a general-purpose channel for state residency data providers |
| 660 | * that live in user space. Entities are defined here and user space clients of this provider's |
| 661 | * vendor service register callbacks to provide state residency data for their given pwoer entity. |
| 662 | */ |
| 663 | void addPixelStateResidencyDataProvider(std::shared_ptr<PowerStats> p) { |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 664 | |
| 665 | auto pixelSdp = std::make_unique<PixelStateResidencyDataProvider>(); |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 666 | |
| 667 | pixelSdp->addEntity("Bluetooth", {{0, "Idle"}, {1, "Active"}, {2, "Tx"}, {3, "Rx"}}); |
| 668 | |
| 669 | pixelSdp->start(); |
Benjamin Schwartz | 6b4c8b4 | 2021-03-17 16:53:22 -0700 | [diff] [blame] | 670 | |
| 671 | p->addStateResidencyDataProvider(std::move(pixelSdp)); |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 672 | } |
| 673 | |
Darren Hsu | 9f8d681 | 2024-01-29 11:26:08 +0800 | [diff] [blame] | 674 | void addDisplayMrr(std::shared_ptr<PowerStats> p) { |
| 675 | p->addStateResidencyDataProvider(std::make_unique<DisplayMrrStateResidencyDataProvider>( |
| 676 | "Display", "/sys/class/drm/card0/device/primary-panel/")); |
| 677 | } |
| 678 | |
Benjamin Schwartz | 3c71249 | 2021-03-18 17:57:13 -0700 | [diff] [blame] | 679 | void addGs101CommonDataProviders(std::shared_ptr<PowerStats> p) { |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 680 | setEnergyMeter(p); |
| 681 | |
| 682 | addPixelStateResidencyDataProvider(p); |
| 683 | addAoC(p); |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 684 | addDvfsStats(p); |
| 685 | addSoC(p); |
| 686 | addCPUclusters(p); |
| 687 | addGPU(p); |
| 688 | addMobileRadio(p); |
| 689 | addGNSS(p); |
Benjamin Schwartz | 0d6392e | 2021-03-09 09:02:06 -0800 | [diff] [blame] | 690 | addPCIe(p); |
| 691 | addWifi(p); |
Benjamin Schwartz | 10e6ca8 | 2021-03-15 17:31:52 -0700 | [diff] [blame] | 692 | addUfs(p); |
Benjamin Schwartz | 2219a99 | 2021-04-13 15:43:41 -0700 | [diff] [blame] | 693 | addPowerDomains(p); |
Benjamin Schwartz | 6899dcc | 2021-04-15 10:39:00 -0700 | [diff] [blame] | 694 | addDevfreq(p); |
samou | 513c4af | 2021-04-16 11:17:18 +0000 | [diff] [blame] | 695 | addTPU(p); |
Robin Peng | c2b5ca9 | 2021-02-23 20:00:28 +0800 | [diff] [blame] | 696 | } |
Benjamin Schwartz | e171ad0 | 2021-04-21 11:35:16 -0700 | [diff] [blame] | 697 | |
| 698 | void addNFC(std::shared_ptr<PowerStats> p, const std::string& path) { |
| 699 | const GenericStateResidencyDataProvider::StateResidencyConfig nfcStateConfig = { |
| 700 | .entryCountSupported = true, |
| 701 | .entryCountPrefix = "Cumulative count:", |
| 702 | .totalTimeSupported = true, |
| 703 | .totalTimePrefix = "Cumulative duration msec:", |
| 704 | .lastEntrySupported = true, |
| 705 | .lastEntryPrefix = "Last entry timestamp msec:", |
| 706 | }; |
| 707 | const std::vector<std::pair<std::string, std::string>> nfcStateHeaders = { |
| 708 | std::make_pair("IDLE", "Idle mode:"), |
| 709 | std::make_pair("ACTIVE", "Active mode:"), |
| 710 | std::make_pair("ACTIVE-RW", "Active Reader/Writer mode:"), |
| 711 | }; |
| 712 | |
| 713 | std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs; |
| 714 | cfgs.emplace_back(generateGenericStateResidencyConfigs(nfcStateConfig, nfcStateHeaders), |
| 715 | "NFC", "NFC subsystem"); |
| 716 | |
| 717 | p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>( |
| 718 | path, cfgs)); |
| 719 | } |