• Home
  • History
  • Annotate
  • 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