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