1 /* 2 * Copyright (C) 2022 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 17 #ifndef HARDWARE_GOOGLE_PIXEL_PIXELSTATS_BROWNOUTDETECTEDREPORTER_H 18 #define HARDWARE_GOOGLE_PIXEL_PIXELSTATS_BROWNOUTDETECTEDREPORTER_H 19 20 #include <aidl/android/frameworks/stats/IStats.h> 21 #include <hardware/google/pixel/pixelstats/pixelatoms.pb.h> 22 23 #include <map> 24 #include <regex> 25 #include <string> 26 27 namespace android { 28 namespace hardware { 29 namespace google { 30 namespace pixel { 31 32 using aidl::android::frameworks::stats::IStats; 33 using aidl::android::frameworks::stats::VendorAtomValue; 34 35 #define ODPM_MAX_IDX 24 36 #define DVFS_MAX_IDX 6 37 38 /* 39 * CsvIdx dictates the indexing of how data aligns with lastmeal.csv. 40 * lastmeal.csv is generated by battery_mitigation upon brownout detection. 41 * The new data added here are the additional data captured by 42 * battery_mitigation during the generation of lastmeal.csv. 43 * filed b/335498252 to make this portion be passed from gs-common. 44 */ 45 enum CsvIdx { 46 TIMESTAMP_IDX, 47 IRQ_IDX, 48 SOC_IDX, 49 TEMP_IDX, 50 CYCLE_IDX, 51 VOLTAGE_IDX, 52 CURRENT_IDX, 53 DVFS_CHANNEL_0 = 7, 54 ODPM_CHANNEL_0 = DVFS_CHANNEL_0 + DVFS_MAX_IDX, /* 13 */ 55 MITIGATION_METHOD_0 = ODPM_CHANNEL_0 + ODPM_MAX_IDX, /* 37 */ 56 MITIGATION_METHOD_0_COUNT, 57 MITIGATION_METHOD_0_TIME, 58 EVT_CNT_IDX_OILO1, 59 EVT_CNT_IDX_OILO2, 60 EVT_CNT_IDX_UVLO1, 61 EVT_CNT_IDX_UVLO2, 62 MAX_CURR, 63 IDX_VIMON_V, 64 IDX_VIMON_I, 65 PRE_OCP_CPU1_BCKUP_IDX, 66 PRE_OCP_CPU2_BCKUP_IDX, 67 PRE_OCP_TPU_BCKUP_IDX, 68 PRE_OCP_GPU_BCKUP_IDX, 69 PRE_UVLO_HIT_CNT_M_IDX, 70 PRE_UVLO_HIT_CNT_S_IDX, 71 UVLO_DUR_IDX, 72 ODPM_IRQ_STAT_0_SYS_EVT_MAIN_BCKUP_IDX, 73 ODPM_IRQ_STAT_1_SYS_EVT_MAIN_BCKUP_IDX, 74 ODPM_IRQ_STAT_2_SYS_EVT_MAIN_BCKUP_IDX, 75 ODPM_IRQ_STAT_3_SYS_EVT_MAIN_BCKUP_IDX, 76 ODPM_IRQ_STAT_4_SYS_EVT_MAIN_BCKUP_IDX, 77 ODPM_IRQ_STAT_5_SYS_EVT_MAIN_BCKUP_IDX, 78 ODPM_IRQ_STAT_6_SYS_EVT_MAIN_BCKUP_IDX, 79 ODPM_IRQ_STAT_7_SYS_EVT_MAIN_BCKUP_IDX, 80 ODPM_IRQ_STAT_8_SYS_EVT_MAIN_BCKUP_IDX, 81 ODPM_IRQ_STAT_9_SYS_EVT_MAIN_BCKUP_IDX, 82 ODPM_IRQ_STAT_10_SYS_EVT_MAIN_BCKUP_IDX, 83 ODPM_IRQ_STAT_11_SYS_EVT_MAIN_BCKUP_IDX, 84 ODPM_IRQ_STAT_0_SYS_EVT_SUB_BCKUP_IDX, 85 ODPM_IRQ_STAT_1_SYS_EVT_SUB_BCKUP_IDX, 86 ODPM_IRQ_STAT_2_SYS_EVT_SUB_BCKUP_IDX, 87 ODPM_IRQ_STAT_3_SYS_EVT_SUB_BCKUP_IDX, 88 ODPM_IRQ_STAT_4_SYS_EVT_SUB_BCKUP_IDX, 89 ODPM_IRQ_STAT_5_SYS_EVT_SUB_BCKUP_IDX, 90 ODPM_IRQ_STAT_6_SYS_EVT_SUB_BCKUP_IDX, 91 ODPM_IRQ_STAT_7_SYS_EVT_SUB_BCKUP_IDX, 92 ODPM_IRQ_STAT_8_SYS_EVT_SUB_BCKUP_IDX, 93 ODPM_IRQ_STAT_9_SYS_EVT_SUB_BCKUP_IDX, 94 ODPM_IRQ_STAT_10_SYS_EVT_SUB_BCKUP_IDX, 95 ODPM_IRQ_STAT_11_SYS_EVT_SUB_BCKUP_IDX, 96 ODPM_IRQ_STAT_EXT_0_SYS_EVT_MAIN_BCKUP_IDX, 97 ODPM_IRQ_STAT_EXT_1_SYS_EVT_MAIN_BCKUP_IDX, 98 ODPM_IRQ_STAT_EXT_2_SYS_EVT_MAIN_BCKUP_IDX, 99 ODPM_IRQ_STAT_EXT_3_SYS_EVT_MAIN_BCKUP_IDX, 100 ODPM_IRQ_STAT_EXT_0_SYS_EVT_SUB_BCKUP_IDX, 101 ODPM_IRQ_STAT_EXT_1_SYS_EVT_SUB_BCKUP_IDX, 102 ODPM_IRQ_STAT_EXT_2_SYS_EVT_SUB_BCKUP_IDX, 103 ODPM_IRQ_STAT_EXT_3_SYS_EVT_SUB_BCKUP_IDX, 104 ODPM_IRQ_STAT_GPU_BCKUP_IDX, 105 ODPM_IRQ_STAT_TPU_BCKUP_IDX, 106 ODPM_IRQ_STAT_CPU1_BCKUP_IDX, 107 ODPM_IRQ_STAT_CPU2_BCKUP_IDX, 108 }; 109 110 enum Irq { 111 SMPL_WARN, 112 OCP_WARN_CPUCL1, 113 OCP_WARN_CPUCL2, 114 SOFT_OCP_WARN_CPUCL1, 115 SOFT_OCP_WARN_CPUCL2, 116 OCP_WARN_TPU, 117 SOFT_OCP_WARN_TPU, 118 OCP_WARN_GPU, 119 SOFT_OCP_WARN_GPU, 120 PMIC_SOC, 121 UVLO1, 122 UVLO2, 123 BATOILO, 124 BATOILO2, 125 PMIC_120C, 126 PMIC_140C, 127 PMIC_OVERHEAT, 128 }; 129 130 enum Update { kUpdateMax, kUpdateMin }; 131 132 /** 133 * A class to upload Pixel Brownout metrics 134 */ 135 class BrownoutDetectedReporter { 136 public: 137 void logBrownout(const std::shared_ptr<IStats> &stats_client, const std::string &logFilePath, 138 const std::string &brownoutReasonProp); 139 void logBrownoutCsv(const std::shared_ptr<IStats> &stats_client, const std::string &logFilePath, 140 const std::string &brownoutReasonProp); 141 int brownoutReasonCheck(const std::string &brownoutReasonProp); 142 143 private: 144 struct BrownoutDetectedInfo { 145 int triggered_irq_; 146 long triggered_timestamp_; 147 int battery_temp_; 148 int battery_cycle_; 149 int battery_soc_; 150 int voltage_now_; 151 int odpm_value_[ODPM_MAX_IDX]; 152 int dvfs_value_[DVFS_MAX_IDX]; 153 int brownout_reason_; 154 int mitigation_method_0_; 155 int mitigation_method_0_count_; 156 unsigned long long mitigation_method_0_time_us_; 157 int max_curr_; 158 int evt_cnt_uvlo1_; 159 int evt_cnt_uvlo2_; 160 int evt_cnt_oilo1_; 161 int evt_cnt_oilo2_; 162 int vimon_vbatt_; 163 int vimon_ibatt_; 164 int pre_ocp_cpu1_bckup_; 165 int pre_ocp_cpu2_bckup_; 166 int pre_ocp_tpu_bckup_; 167 int pre_ocp_gpu_bckup_; 168 int pre_uvlo_hit_cnt_m_; 169 int pre_uvlo_hit_cnt_s_; 170 int uvlo_dur_; 171 int odpm_irq_stat_0_sys_evt_main_bckup_; 172 int odpm_irq_stat_1_sys_evt_main_bckup_; 173 int odpm_irq_stat_2_sys_evt_main_bckup_; 174 int odpm_irq_stat_3_sys_evt_main_bckup_; 175 int odpm_irq_stat_4_sys_evt_main_bckup_; 176 int odpm_irq_stat_5_sys_evt_main_bckup_; 177 int odpm_irq_stat_6_sys_evt_main_bckup_; 178 int odpm_irq_stat_7_sys_evt_main_bckup_; 179 int odpm_irq_stat_8_sys_evt_main_bckup_; 180 int odpm_irq_stat_9_sys_evt_main_bckup_; 181 int odpm_irq_stat_10_sys_evt_main_bckup_; 182 int odpm_irq_stat_11_sys_evt_main_bckup_; 183 int odpm_irq_stat_0_sys_evt_sub_bckup_; 184 int odpm_irq_stat_1_sys_evt_sub_bckup_; 185 int odpm_irq_stat_2_sys_evt_sub_bckup_; 186 int odpm_irq_stat_3_sys_evt_sub_bckup_; 187 int odpm_irq_stat_4_sys_evt_sub_bckup_; 188 int odpm_irq_stat_5_sys_evt_sub_bckup_; 189 int odpm_irq_stat_6_sys_evt_sub_bckup_; 190 int odpm_irq_stat_7_sys_evt_sub_bckup_; 191 int odpm_irq_stat_8_sys_evt_sub_bckup_; 192 int odpm_irq_stat_9_sys_evt_sub_bckup_; 193 int odpm_irq_stat_10_sys_evt_sub_bckup_; 194 int odpm_irq_stat_11_sys_evt_sub_bckup_; 195 int odpm_irq_stat_ext_0_sys_evt_main_bckup_; 196 int odpm_irq_stat_ext_1_sys_evt_main_bckup_; 197 int odpm_irq_stat_ext_2_sys_evt_main_bckup_; 198 int odpm_irq_stat_ext_3_sys_evt_main_bckup_; 199 int odpm_irq_stat_ext_0_sys_evt_sub_bckup_; 200 int odpm_irq_stat_ext_1_sys_evt_sub_bckup_; 201 int odpm_irq_stat_ext_2_sys_evt_sub_bckup_; 202 int odpm_irq_stat_ext_3_sys_evt_sub_bckup_; 203 int odpm_irq_stat_gpu_bckup_; 204 int odpm_irq_stat_tpu_bckup_; 205 int odpm_irq_stat_cpu1_bckup_; 206 int odpm_irq_stat_cpu2_bckup_; 207 }; 208 209 void setAtomFieldValue(std::vector<VendorAtomValue> &values, int offset, int content); 210 long parseTimestamp(std::string timestamp); 211 bool updateIfFound(std::string line, std::regex pattern, int *current_value, Update flag); 212 void uploadData(const std::shared_ptr<IStats> &stats_client, 213 const struct BrownoutDetectedInfo max_value); 214 // Proto messages are 1-indexed and VendorAtom field numbers start at 2, so 215 // store everything in the values array at the index of the field number 216 // -2. 217 const int kVendorAtomOffset = 2; 218 }; 219 220 } // namespace pixel 221 } // namespace google 222 } // namespace hardware 223 } // namespace android 224 225 #endif // HARDWARE_GOOGLE_PIXEL_PIXELSTATS_BROWNOUTDETECTEDREPORTER_H 226