Home | History | Annotate | Download | only in hwc
      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 
     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 
     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 
     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 
     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 
     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 
     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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    193 void HWCDebugHandler::EndTrace() {
    194   atrace_end(ATRACE_TAG);
    195 }
    196 
    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 
    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 
    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 
    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