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#ifndef __DEBUG_H__
31#define __DEBUG_H__
32
33#include <stdint.h>
34#include <core/sdm_types.h>
35#include <core/debug_interface.h>
36#include <core/display_interface.h>
37#include <display_properties.h>
38
39#define DLOG(tag, method, format, ...) Debug::Get()->method(tag, __CLASS__ "::%s: " format, \
40                                                            __FUNCTION__, ##__VA_ARGS__)
41
42#define DLOGE_IF(tag, format, ...) DLOG(tag, Error, format, ##__VA_ARGS__)
43#define DLOGW_IF(tag, format, ...) DLOG(tag, Warning, format, ##__VA_ARGS__)
44#define DLOGI_IF(tag, format, ...) DLOG(tag, Info, format, ##__VA_ARGS__)
45#define DLOGD_IF(tag, format, ...) DLOG(tag, Debug, format, ##__VA_ARGS__)
46#define DLOGV_IF(tag, format, ...) DLOG(tag, Verbose, format, ##__VA_ARGS__)
47
48#define DLOGE(format, ...) DLOGE_IF(kTagNone, format, ##__VA_ARGS__)
49#define DLOGD(format, ...) DLOGD_IF(kTagNone, format, ##__VA_ARGS__)
50#define DLOGW(format, ...) DLOGW_IF(kTagNone, format, ##__VA_ARGS__)
51#define DLOGI(format, ...) DLOGI_IF(kTagNone, format, ##__VA_ARGS__)
52#define DLOGV(format, ...) DLOGV_IF(kTagNone, format, ##__VA_ARGS__)
53
54#define DTRACE_BEGIN(custom_string) Debug::Get()->BeginTrace(__CLASS__, __FUNCTION__, custom_string)
55#define DTRACE_END() Debug::Get()->EndTrace()
56#define DTRACE_SCOPED() ScopeTracer <Debug> scope_tracer(__CLASS__, __FUNCTION__)
57
58namespace sdm {
59
60class Debug {
61 public:
62  static inline void SetDebugHandler(DebugHandler *debug_handler) {
63    debug_.debug_handler_ = debug_handler;
64  }
65  static inline DebugHandler* Get() { return debug_.debug_handler_; }
66  static int GetSimulationFlag();
67  static int GetHDMIResolution();
68  static void GetIdleTimeoutMs(uint32_t *active_ms, uint32_t *inactive_ms);
69  static int GetBootAnimLayerCount();
70  static bool IsRotatorDownScaleDisabled();
71  static bool IsDecimationDisabled();
72  static int GetMaxPipesPerMixer(DisplayType display_type);
73  static int GetMaxUpscale();
74  static bool IsVideoModeEnabled();
75  static bool IsRotatorUbwcDisabled();
76  static bool IsRotatorSplitDisabled();
77  static bool IsScalarDisabled();
78  static bool IsUbwcTiledFrameBuffer();
79  static bool IsAVRDisabled();
80  static bool IsExtAnimDisabled();
81  static bool IsPartialSplitDisabled();
82  static DisplayError GetMixerResolution(uint32_t *width, uint32_t *height);
83  static int GetExtMaxlayers();
84  static bool GetProperty(const char *property_name, char *value);
85  static bool SetProperty(const char *property_name, const char *value);
86
87 private:
88  Debug();
89
90  // By default, drop any log messages/traces coming from Display manager. It will be overriden by
91  // Display manager client when core is successfully initialized.
92  class DefaultDebugHandler : public DebugHandler {
93   public:
94    virtual void Error(DebugTag /*tag*/, const char */*format*/, ...) { }
95    virtual void Warning(DebugTag /*tag*/, const char */*format*/, ...) { }
96    virtual void Info(DebugTag /*tag*/, const char */*format*/, ...) { }
97    virtual void Debug(DebugTag /*tag*/, const char */*format*/, ...) { }
98    virtual void Verbose(DebugTag /*tag*/, const char */*format*/, ...) { }
99    virtual void BeginTrace(const char */*class_name*/, const char */*function_name*/,
100                            const char */*custom_string*/) { }
101    virtual void EndTrace() { }
102    virtual DisplayError GetProperty(const char */*property_name*/, int */*value*/) {
103      return kErrorNotSupported;
104    }
105    virtual DisplayError GetProperty(const char */*property_name*/, char */*value*/) {
106      return kErrorNotSupported;
107    }
108    virtual DisplayError SetProperty(const char */*property_name*/, const char */*value*/) {
109      return kErrorNotSupported;
110    }
111  };
112
113  DefaultDebugHandler default_debug_handler_;
114  DebugHandler *debug_handler_;
115  static Debug debug_;
116};
117
118}  // namespace sdm
119
120#endif  // __DEBUG_H__
121
122