• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (c) 2014 - 2018, The Linux Foundation. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *     * Redistributions of source code must retain the above copyright
8 *       notice, this list of conditions and the following disclaimer.
9 *     * Redistributions in binary form must reproduce the above
10 *       copyright notice, this list of conditions and the following
11 *       disclaimer in the documentation and/or other materials provided
12 *       with the distribution.
13 *     * Neither the name of The Linux Foundation nor the names of its
14 *       contributors may be used to endorse or promote products derived
15 *       from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29 
30 #include <utils/constants.h>
31 #include <cutils/properties.h>
32 #include <utils/debug.h>
33 
34 #include "hwc_debugger.h"
35 
36 namespace sdm {
37 
38 HWCDebugHandler HWCDebugHandler::debug_handler_;
39 std::bitset<32> HWCDebugHandler::debug_flags_ = 0x1;
40 int32_t HWCDebugHandler::verbose_level_ = 0x0;
41 
DebugAll(bool enable,int verbose_level)42 void HWCDebugHandler::DebugAll(bool enable, int verbose_level) {
43   if (enable) {
44     debug_flags_ = 0x7FFFFFFF;
45     if (verbose_level) {
46       // Enable verbose scalar logs only when explicitely enabled
47       debug_flags_[kTagScalar] = 0;
48     }
49     verbose_level_ = verbose_level;
50   } else {
51     debug_flags_ = 0x1;   // kTagNone should always be printed.
52     verbose_level_ = 0;
53   }
54 }
55 
DebugResources(bool enable,int verbose_level)56 void HWCDebugHandler::DebugResources(bool enable, int verbose_level) {
57   if (enable) {
58     debug_flags_[kTagResources] = 1;
59     verbose_level_ = verbose_level;
60   } else {
61     debug_flags_[kTagResources] = 0;
62     verbose_level_ = 0;
63   }
64 }
65 
DebugStrategy(bool enable,int verbose_level)66 void HWCDebugHandler::DebugStrategy(bool enable, int verbose_level) {
67   if (enable) {
68     debug_flags_[kTagStrategy] = 1;
69     verbose_level_ = verbose_level;
70   } else {
71     debug_flags_[kTagStrategy] = 0;
72     verbose_level_ = 0;
73   }
74 }
75 
DebugCompManager(bool enable,int verbose_level)76 void HWCDebugHandler::DebugCompManager(bool enable, int verbose_level) {
77   if (enable) {
78     debug_flags_[kTagCompManager] = 1;
79     verbose_level_ = verbose_level;
80   } else {
81     debug_flags_[kTagCompManager] = 0;
82     verbose_level_ = 0;
83   }
84 }
85 
DebugDriverConfig(bool enable,int verbose_level)86 void HWCDebugHandler::DebugDriverConfig(bool enable, int verbose_level) {
87   if (enable) {
88     debug_flags_[kTagDriverConfig] = 1;
89     verbose_level_ = verbose_level;
90   } else {
91     debug_flags_[kTagDriverConfig] = 0;
92     verbose_level_ = 0;
93   }
94 }
95 
DebugRotator(bool enable,int verbose_level)96 void HWCDebugHandler::DebugRotator(bool enable, int verbose_level) {
97   if (enable) {
98     debug_flags_[kTagRotator] = 1;
99     verbose_level_ = verbose_level;
100   } else {
101     debug_flags_[kTagRotator] = 0;
102     verbose_level_ = 0;
103   }
104 }
105 
DebugScalar(bool enable,int verbose_level)106 void HWCDebugHandler::DebugScalar(bool enable, int verbose_level) {
107   if (enable) {
108     debug_flags_[kTagScalar] = 1;
109     verbose_level_ = verbose_level;
110   } else {
111     debug_flags_[kTagScalar] = 0;
112     verbose_level_ = 0;
113   }
114 }
115 
DebugQdcm(bool enable,int verbose_level)116 void HWCDebugHandler::DebugQdcm(bool enable, int verbose_level) {
117   if (enable) {
118     debug_flags_[kTagQDCM] = 1;
119     verbose_level_ = verbose_level;
120   } else {
121     debug_flags_[kTagQDCM] = 0;
122     verbose_level_ = 0;
123   }
124 }
125 
DebugClient(bool enable,int verbose_level)126 void HWCDebugHandler::DebugClient(bool enable, int verbose_level) {
127   if (enable) {
128     debug_flags_[kTagClient] = 1;
129     verbose_level_ = verbose_level;
130   } else {
131     debug_flags_[kTagClient] = 0;
132     verbose_level_ = 0;
133   }
134 }
135 
DebugDisplay(bool enable,int verbose_level)136 void HWCDebugHandler::DebugDisplay(bool enable, int verbose_level) {
137   if (enable) {
138     debug_flags_[kTagDisplay] = 1;
139     verbose_level_ = verbose_level;
140   } else {
141     debug_flags_[kTagDisplay] = 0;
142     verbose_level_ = 0;
143   }
144 }
145 
Error(DebugTag tag,const char * format,...)146 void HWCDebugHandler::Error(DebugTag tag, const char *format, ...) {
147   if (debug_flags_[tag]) {
148     va_list list;
149     va_start(list, format);
150     __android_log_vprint(ANDROID_LOG_ERROR, LOG_TAG, format, list);
151   }
152 }
153 
Warning(DebugTag tag,const char * format,...)154 void HWCDebugHandler::Warning(DebugTag tag, const char *format, ...) {
155   if (debug_flags_[tag]) {
156     va_list list;
157     va_start(list, format);
158     __android_log_vprint(ANDROID_LOG_WARN, LOG_TAG, format, list);
159   }
160 }
161 
Info(DebugTag tag,const char * format,...)162 void HWCDebugHandler::Info(DebugTag tag, const char *format, ...) {
163   if (debug_flags_[tag]) {
164     va_list list;
165     va_start(list, format);
166     __android_log_vprint(ANDROID_LOG_INFO, LOG_TAG, format, list);
167   }
168 }
169 
Debug(DebugTag tag,const char * format,...)170 void HWCDebugHandler::Debug(DebugTag tag, const char *format, ...) {
171   if (debug_flags_[tag]) {
172     va_list list;
173     va_start(list, format);
174     __android_log_vprint(ANDROID_LOG_DEBUG, LOG_TAG, format, list);
175   }
176 }
177 
Verbose(DebugTag tag,const char * format,...)178 void HWCDebugHandler::Verbose(DebugTag tag, const char *format, ...) {
179   if (debug_flags_[tag] && verbose_level_) {
180     va_list list;
181     va_start(list, format);
182     __android_log_vprint(ANDROID_LOG_VERBOSE, LOG_TAG, format, list);
183   }
184 }
185 
BeginTrace(const char * class_name,const char * function_name,const char * custom_string)186 void HWCDebugHandler::BeginTrace(const char *class_name, const char *function_name,
187                                  const char *custom_string) {
188   char name[PATH_MAX] = {0};
189   snprintf(name, sizeof(name), "%s::%s::%s", class_name, function_name, custom_string);
190   atrace_begin(ATRACE_TAG, name);
191 }
192 
EndTrace()193 void HWCDebugHandler::EndTrace() {
194   atrace_end(ATRACE_TAG);
195 }
196 
GetIdleTimeoutMs()197 int  HWCDebugHandler::GetIdleTimeoutMs() {
198   int value = IDLE_TIMEOUT_DEFAULT_MS;
199   debug_handler_.GetProperty(IDLE_TIME_PROP, &value);
200 
201   return value;
202 }
203 
GetProperty(const char * property_name,int * value)204 DisplayError HWCDebugHandler::GetProperty(const char *property_name, int *value) {
205   char property[PROPERTY_VALUE_MAX];
206 
207   if (property_get(property_name, property, NULL) > 0) {
208     *value = atoi(property);
209     return kErrorNone;
210   }
211 
212   return kErrorNotSupported;
213 }
214 
GetProperty(const char * property_name,char * value)215 DisplayError HWCDebugHandler::GetProperty(const char *property_name, char *value) {
216   if (property_get(property_name, value, NULL) > 0) {
217     return kErrorNone;
218   }
219 
220   return kErrorNotSupported;
221 }
222 
SetProperty(const char * property_name,const char * value)223 DisplayError HWCDebugHandler::SetProperty(const char *property_name, const char *value) {
224   if (property_set(property_name, value) == 0) {
225     return kErrorNone;
226   }
227 
228   return kErrorNotSupported;
229 }
230 
231 }  // namespace sdm
232 
233