blob: c416cc01cf808f112ac350e7fab099f4c67a210a [file] [log] [blame]
Steve Muckle0a9c0872022-02-16 05:58:07 +00001/*******************************************************************************
2* Copyright (C) 2018 Cadence Design Systems, Inc.
3*
4* Permission is hereby granted, free of charge, to any person obtaining
5* a copy of this software and associated documentation files (the
6* "Software"), to use this Software with Cadence processor cores only and
7* not with any other processors and platforms, subject to
8* the following conditions:
9*
10* The above copyright notice and this permission notice shall be included
11* in all copies or substantial portions of the Software.
12*
13* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
17* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
18* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
19* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
21******************************************************************************/
22
23/*******************************************************************************
24 * xf-debug.h
25 *
26 * Debugging interface for Xtensa Audio DSP codec server
27 *
28 *******************************************************************************/
29
30#ifndef __XF_H
31#error "xf-debug.h mustn't be included directly"
32#endif
33
34#include "dsp_debug.h"
35
36/*******************************************************************************
37 * Auxiliary macros (put into "xf-types.h"?)
38 ******************************************************************************/
39
40#ifndef offset_of
41#define offset_of(type, member) \
42 ((int)&(((const type *)(0))->member))
43#endif
44
45#ifndef container_of
46#define container_of(ptr, type, member) \
47 ((type *)((void *)(ptr) - offset_of(type, member)))
48#endif
49
50/* ...next power-of-two calculation */
51#define xf_next_power_of_two(v) __xf_power_of_two_1((v) - 1)
52#define __xf_power_of_two_1(v) __xf_power_of_two_2((v) | ((v) >> 1))
53#define __xf_power_of_two_2(v) __xf_power_of_two_3((v) | ((v) >> 2))
54#define __xf_power_of_two_3(v) __xf_power_of_two_4((v) | ((v) >> 4))
55#define __xf_power_of_two_4(v) __xf_power_of_two_5((v) | ((v) >> 8))
56#define __xf_power_of_two_5(v) __xf_power_of_two_6((v) | ((v) >> 16))
57#define __xf_power_of_two_6(v) ((v) + 1)
58
59/* ...check if non-zero value is a power-of-two */
60#define xf_is_power_of_two(v) (((v) & ((v) - 1)) == 0)
61
62/*******************************************************************************
63 * Bug check for constant conditions (file scope)
64 ******************************************************************************/
65
66#define __C_BUG(n) __C_BUG2(n)
67#define __C_BUG2(n) __c_bug_##n
68#define C_BUG(expr) typedef char __C_BUG(__LINE__)[(expr) ? -1 : 1]
69
70/*******************************************************************************
71 * Compilation-time types control
72 ******************************************************************************/
73
74#if XF_DEBUG
75#define __C_TYPE_CONTROL(d, type) ((void) ((d) != (type*) 0))
76#else
77#define __C_TYPE_CONTROL(d, type) ((void) 0)
78#endif
79
80/*******************************************************************************
81 * Unused variable
82 ******************************************************************************/
83
84#define C_UNUSED(v) (void)(0 ? (v) = (v), 1 : 0)
85
86/*******************************************************************************
87 * Auxiliary macros
88 ******************************************************************************/
89
90/* ...define a stub for unused declarator */
91#define __xf_stub(tag, line) __xf_stub2(tag, line)
92#define __xf_stub2(tag, line) typedef int __xf_##tag##_##line
93
94/* ...convert anything into string */
95#define __xf_string(x) __xf_string2(x)
96#define __xf_string2(x) #x
97
98/*******************************************************************************
99 * Tracing facility
100 ******************************************************************************/
101
102#if XF_TRACE
103
104/* ...tracing to communication processor */
105extern int xf_trace(const char *format, ...) __attribute__((format (printf, 1, 2)));
106
107/* ...tracing facility initialization */
108extern void xf_trace_init(const char *banner);
109
110/* ...initialize tracing facility */
111//#define TRACE_INIT(banner) (xf_trace_init(banner))
112#define TRACE_INIT(banner) ({ dsp_debug_init(); DSP_TRACE("\n"banner); })
113
114/* ...trace tag definition */
115#define TRACE_TAG(tag, on) enum { __xf_trace_##tag = on }
116
117/* ...check if the trace tag is enabled */
118#define TRACE_CFG(tag) (__xf_trace_##tag)
119
120/* ...tagged tracing primitive */
121#define TRACE(tag, fmt, ...) (void)(__xf_trace_##tag ? __xf_trace(tag, __xf_format##fmt, ## __VA_ARGS__), 1 : 0)
122
123/*******************************************************************************
124 * Tagged tracing formats
125 ******************************************************************************/
126
127/* ...tracing primitive */
128#define __xf_trace(tag, fmt, ...) \
129 ({ __attribute__((unused)) const char *__xf_tag = #tag; DSP_TRACE(fmt, ## __VA_ARGS__); })
130
131/* ...just a format string */
132#define __xf_format_n(fmt) fmt
133
134/* ...module tag and trace tag shown */
135#define __xf_format_b(fmt) "[%s.%s] " fmt, __xf_string(MODULE_TAG), __xf_tag
136
137/* ...module tag, trace tag, file name and line shown */
138#define __xf_format_x(fmt) "[%s.%s] - %s@%d - " fmt, __xf_string(MODULE_TAG), __xf_tag, __FILE__, __LINE__
139
140/*******************************************************************************
141 * Globally defined tags
142 ******************************************************************************/
143
144/* ...unconditionally OFF */
145TRACE_TAG(0, 0);
146
147/* ...unconditionally ON */
148TRACE_TAG(1, 1);
149
150/* ...error output - on by default */
151TRACE_TAG(ERROR, 1);
152
153#else
154
155#define TRACE_INIT(banner) (void)0
156#define TRACE_TAG(tag, on) __xf_stub(trace_##tag, __LINE__)
157#define TRACE_CFG(tag) 0
158#define TRACE(tag, fmt, ...) (void)0
159#define __xf_trace(tag, fmt, ...) (void)0
160
161#endif /* XF_TRACE */
162
163/*******************************************************************************
164 * Bugchecks
165 ******************************************************************************/
166
167#if XF_DEBUG
168
169/* ...run-time bugcheck */
170#define BUG(cond, fmt, ...) \
171do \
172{ \
173 if (cond) \
174 { \
175 /* ...output message */ \
176 __xf_trace(BUG, __xf_format##fmt, ## __VA_ARGS__); \
177 \
178 /* ...and die (tbd) */ \
179 __xf_abort(); \
180 } \
181} \
182while (0)
183
184#else
185#define BUG(cond, fmt, ...) (void)0
186#endif /* XF_DEBUG */
187
188/*******************************************************************************
189 * Run-time error processing
190 ******************************************************************************/
191
192/* ...check the API call succeeds */
193#define XF_CHK_API(cond) \
194({ \
195 int __ret; \
196 \
197 if ((__ret = (int)(cond)) < 0) \
198 { \
199 TRACE(ERROR, _x("API error: %d"), __ret); \
200 return __ret; \
201 } \
202 __ret; \
203})
204
205/* ...check the condition is true */
206#define XF_CHK_ERR(cond, error) \
207({ \
208 int __ret; \
209 \
210 if (!(__ret = (int)(cond))) \
211 { \
212 TRACE(ERROR, _x("check failed: %d"), __ret); \
213 return (error); \
214 } \
215 __ret; \
216})