MALI: rockchip: tidy 'platform specific code'.
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / arm / midgard / platform / rk / custom_log.h
1 /*  ----------------------------------------------------------------------------
2  *  File:   custom_log.h
3  *
4  *  Desc:   ChenZhen 偏好的 log 输出的定制实现.
5  *
6  *          --------------------------------------------------------------------
7  *          < 习语 和 缩略语 > :
8  *
9  *          --------------------------------------------------------------------
10  *  Usage:
11  *
12  *  Note:
13  *
14  *  Author: ChenZhen
15  *
16  *  ----------------------------------------------------------------------------
17  *  Version:
18  *          v1.0
19  *  ----------------------------------------------------------------------------
20  *  Log:
21         ----Fri Nov 19 15:20:28 2010            v1.0
22  *
23  *  ----------------------------------------------------------------------------
24  */
25
26 #ifndef __CUSTOM_LOG_H__
27 #define __CUSTOM_LOG_H__
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 /* -----------------------------------------------------------------------------
34  *  Include Files
35  * -----------------------------------------------------------------------------
36  */
37 #include <linux/kernel.h>
38 #include <linux/printk.h>
39
40 /* -----------------------------------------------------------------------------
41  *  Macros Definition
42  * -----------------------------------------------------------------------------
43  */
44
45 /** 若下列 macro 有被定义, 才 使能 log 输出. */
46 /* #define ENABLE_DEBUG_LOG */
47
48 /*----------------------------------------------------------------------------*/
49
50 #ifdef ENABLE_VERBOSE_LOG
51 /** Verbose log. */
52 #define V(fmt, args...) \
53         pr_debug("V : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
54                         "\n",   \
55                 __FILE__,       \
56                 __LINE__,       \
57                 __func__,       \
58                 ## args)
59 #else
60 #define  V(...)  ((void)0)
61 #endif
62
63 #ifdef ENABLE_DEBUG_LOG
64 /** Debug log. */
65 #define D(fmt, args...) \
66         pr_debug("D : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
67                         "\n",   \
68                 __FILE__,       \
69                 __LINE__,       \
70                 __func__,       \
71                 ## args)
72 #else
73 #define  D(...)  ((void)0)
74 #endif
75
76 #define I(fmt, args...) \
77         pr_info("I : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
78                         "\n", \
79                 __FILE__, \
80                 __LINE__, \
81                 __func__, \
82                 ## args)
83
84 #define W(fmt, args...) \
85         pr_warn("W : [File] : %s; [Line] : %d; [Func] : %s(); " \
86                         fmt "\n", \
87                 __FILE__, \
88                 __LINE__, \
89                 __func__, \
90                 ## args)
91
92 #define E(fmt, args...) \
93         pr_err("E : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
94                         "\n", \
95                 __FILE__, \
96                 __LINE__, \
97                 __func__, \
98                 ## args)
99
100 /*-------------------------------------------------------*/
101
102 /** 使用 D(), 以十进制的形式打印变量 'var' 的 value. */
103 #define D_DEC(var)  D(#var " = %d.", var)
104
105 #define E_DEC(var)  E(#var " = %d.", var)
106
107 /** 使用 D(), 以十六进制的形式打印变量 'var' 的 value. */
108 #define D_HEX(var)  D(#var " = 0x%x.", var)
109
110 #define E_HEX(var)  E(#var " = 0x%x.", var)
111
112 /**
113  * 使用 D(), 以十六进制的形式,
114  * 打印指针类型变量 'ptr' 的 value.
115  */
116 #define D_PTR(ptr)  D(#ptr " = %p.", ptr)
117
118 #define E_PTR(ptr)  E(#ptr " = %p.", ptr)
119
120 /** 使用 D(), 打印 char 字串. */
121 #define D_STR(p_str) \
122 do { \
123         if (!p_str) { \
124                 D(#p_str" = NULL."); \
125         else \
126                 D(#p_str" = '%s'.", p_str); \
127 } while (0)
128
129 #define E_STR(p_str) \
130 do { \
131         if (!p_str) \
132                 E(#p_str" = NULL."); \
133         else \
134                 E(#p_str" = '%s'.", p_str); \
135 } while (0)
136
137 #ifdef ENABLE_DEBUG_LOG
138 /**
139  * log 从 'p_start' 地址开始的 'len' 个字节的数据.
140  */
141 #define D_MEM(p_start, len) \
142 do { \
143         int i = 0; \
144         char *p = (char *)(p_start); \
145         D("dump memory from addr of '" #p_start "', from %p, length %d' : ", \
146                 (p_start), \
147                 (len)); \
148         pr_debug("\t\t"); \
149         for (i = 0; i < (len); i++) \
150                 pr_debug("0x%02x, ", p[i]); \
151         pr_debug("\n"); \
152 } while (0)
153 #else
154 #define  D_MEM(...)  ((void)0)
155 #endif
156
157 /*-------------------------------------------------------*/
158
159 /**
160  * 在特定条件下, 判定 error 发生,
161  * 将变量 'ret_var' 设置 'err_code',
162  * log 输出对应的 Error Caution,
163  * 然后跳转 'label' 指定的代码处执行.
164  * @param msg
165  *      纯字串形式的提示信息.
166  * @param ret_var
167  *      标识函数执行状态或者结果的变量,
168  *      将被设置具体的 Error Code.
169  *      通常是 'ret' or 'result'.
170  * @param err_code
171  *      表征特定 error 的常数标识,
172  *      通常是 宏的形态.
173  * @param label
174  *      程序将要跳转到的错误处理代码的标号,
175  *      通常就是 'EXIT'.
176  * @param args...
177  *      对应 'msg_fmt' 实参中,
178  *      '%s', '%d', ... 等转换说明符的具体可变长实参.
179  */
180 #define SET_ERROR_AND_JUMP(msg_fmt, ret_var, err_code, label, args...) \
181 do { \
182         E("To set '" #ret_var "' to %d('" #err_code "'), because : " msg_fmt, \
183                 (err_code), \
184                 ## args); \
185         (ret_var) = (err_code); \
186         goto label; \
187 } while (0)
188
189 /* -----------------------------------------------------------------------------
190  *  Types and Structures Definition
191  * -----------------------------------------------------------------------------
192  */
193
194 /* -----------------------------------------------------------------------------
195  *  Global Functions' Prototype
196  * -----------------------------------------------------------------------------
197  */
198
199 /* -----------------------------------------------------------------------------
200  *  Inline Functions Implementation
201  * -----------------------------------------------------------------------------
202  */
203
204 #ifdef __cplusplus
205 }
206 #endif
207
208 #endif /* __CUSTOM_LOG_H__ */