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