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