xref: /openbmc/linux/sound/soc/intel/avs/trace.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1*69b23b39SCezary Rojewski /* SPDX-License-Identifier: GPL-2.0 */
2*69b23b39SCezary Rojewski #undef TRACE_SYSTEM
3*69b23b39SCezary Rojewski #define TRACE_SYSTEM intel_avs
4*69b23b39SCezary Rojewski 
5*69b23b39SCezary Rojewski #if !defined(_TRACE_INTEL_AVS_H) || defined(TRACE_HEADER_MULTI_READ)
6*69b23b39SCezary Rojewski #define _TRACE_INTEL_AVS_H
7*69b23b39SCezary Rojewski 
8*69b23b39SCezary Rojewski #include <linux/types.h>
9*69b23b39SCezary Rojewski #include <linux/tracepoint.h>
10*69b23b39SCezary Rojewski 
11*69b23b39SCezary Rojewski TRACE_EVENT(avs_dsp_core_op,
12*69b23b39SCezary Rojewski 
13*69b23b39SCezary Rojewski 	TP_PROTO(unsigned int reg, unsigned int mask, const char *op, bool flag),
14*69b23b39SCezary Rojewski 
15*69b23b39SCezary Rojewski 	TP_ARGS(reg, mask, op, flag),
16*69b23b39SCezary Rojewski 
17*69b23b39SCezary Rojewski 	TP_STRUCT__entry(
18*69b23b39SCezary Rojewski 		__field(unsigned int,	reg	)
19*69b23b39SCezary Rojewski 		__field(unsigned int,	mask	)
20*69b23b39SCezary Rojewski 		__string(op,		op	)
21*69b23b39SCezary Rojewski 		__field(bool,		flag	)
22*69b23b39SCezary Rojewski 	),
23*69b23b39SCezary Rojewski 
24*69b23b39SCezary Rojewski 	TP_fast_assign(
25*69b23b39SCezary Rojewski 		__entry->reg = reg;
26*69b23b39SCezary Rojewski 		__entry->mask = mask;
27*69b23b39SCezary Rojewski 		__assign_str(op, op);
28*69b23b39SCezary Rojewski 		__entry->flag = flag;
29*69b23b39SCezary Rojewski 	),
30*69b23b39SCezary Rojewski 
31*69b23b39SCezary Rojewski 	TP_printk("%s: %d, core mask: 0x%X, prev state: 0x%08X",
32*69b23b39SCezary Rojewski 		  __get_str(op), __entry->flag, __entry->mask, __entry->reg)
33*69b23b39SCezary Rojewski );
34*69b23b39SCezary Rojewski 
35*69b23b39SCezary Rojewski #ifndef __TRACE_INTEL_AVS_TRACE_HELPER
36*69b23b39SCezary Rojewski #define __TRACE_INTEL_AVS_TRACE_HELPER
37*69b23b39SCezary Rojewski 
38*69b23b39SCezary Rojewski void trace_avs_msg_payload(const void *data, size_t size);
39*69b23b39SCezary Rojewski 
40*69b23b39SCezary Rojewski #define trace_avs_request(msg, fwregs) \
41*69b23b39SCezary Rojewski ({ \
42*69b23b39SCezary Rojewski 	trace_avs_ipc_request_msg((msg)->header, fwregs); \
43*69b23b39SCezary Rojewski 	trace_avs_msg_payload((msg)->data, (msg)->size); \
44*69b23b39SCezary Rojewski })
45*69b23b39SCezary Rojewski 
46*69b23b39SCezary Rojewski #define trace_avs_reply(msg, fwregs) \
47*69b23b39SCezary Rojewski ({ \
48*69b23b39SCezary Rojewski 	trace_avs_ipc_reply_msg((msg)->header, fwregs); \
49*69b23b39SCezary Rojewski 	trace_avs_msg_payload((msg)->data, (msg)->size); \
50*69b23b39SCezary Rojewski })
51*69b23b39SCezary Rojewski 
52*69b23b39SCezary Rojewski #define trace_avs_notify(msg, fwregs) \
53*69b23b39SCezary Rojewski ({ \
54*69b23b39SCezary Rojewski 	trace_avs_ipc_notify_msg((msg)->header, fwregs); \
55*69b23b39SCezary Rojewski 	trace_avs_msg_payload((msg)->data, (msg)->size); \
56*69b23b39SCezary Rojewski })
57*69b23b39SCezary Rojewski #endif
58*69b23b39SCezary Rojewski 
59*69b23b39SCezary Rojewski DECLARE_EVENT_CLASS(avs_ipc_msg_hdr,
60*69b23b39SCezary Rojewski 
61*69b23b39SCezary Rojewski 	TP_PROTO(u64 header, u64 fwregs),
62*69b23b39SCezary Rojewski 
63*69b23b39SCezary Rojewski 	TP_ARGS(header, fwregs),
64*69b23b39SCezary Rojewski 
65*69b23b39SCezary Rojewski 	TP_STRUCT__entry(
66*69b23b39SCezary Rojewski 		__field(u64,	header)
67*69b23b39SCezary Rojewski 		__field(u64,	fwregs)
68*69b23b39SCezary Rojewski 	),
69*69b23b39SCezary Rojewski 
70*69b23b39SCezary Rojewski 	TP_fast_assign(
71*69b23b39SCezary Rojewski 		__entry->header = header;
72*69b23b39SCezary Rojewski 		__entry->fwregs = fwregs;
73*69b23b39SCezary Rojewski 	),
74*69b23b39SCezary Rojewski 
75*69b23b39SCezary Rojewski 	TP_printk("primary: 0x%08X, extension: 0x%08X,\n"
76*69b23b39SCezary Rojewski 		  "fwstatus: 0x%08X, fwerror: 0x%08X",
77*69b23b39SCezary Rojewski 		  lower_32_bits(__entry->header), upper_32_bits(__entry->header),
78*69b23b39SCezary Rojewski 		  lower_32_bits(__entry->fwregs), upper_32_bits(__entry->fwregs))
79*69b23b39SCezary Rojewski );
80*69b23b39SCezary Rojewski 
81*69b23b39SCezary Rojewski DEFINE_EVENT(avs_ipc_msg_hdr, avs_ipc_request_msg,
82*69b23b39SCezary Rojewski 	TP_PROTO(u64 header, u64 fwregs),
83*69b23b39SCezary Rojewski 	TP_ARGS(header, fwregs)
84*69b23b39SCezary Rojewski );
85*69b23b39SCezary Rojewski 
86*69b23b39SCezary Rojewski DEFINE_EVENT(avs_ipc_msg_hdr, avs_ipc_reply_msg,
87*69b23b39SCezary Rojewski 	TP_PROTO(u64 header, u64 fwregs),
88*69b23b39SCezary Rojewski 	TP_ARGS(header, fwregs)
89*69b23b39SCezary Rojewski );
90*69b23b39SCezary Rojewski 
91*69b23b39SCezary Rojewski DEFINE_EVENT(avs_ipc_msg_hdr, avs_ipc_notify_msg,
92*69b23b39SCezary Rojewski 	TP_PROTO(u64 header, u64 fwregs),
93*69b23b39SCezary Rojewski 	TP_ARGS(header, fwregs)
94*69b23b39SCezary Rojewski );
95*69b23b39SCezary Rojewski 
96*69b23b39SCezary Rojewski TRACE_EVENT_CONDITION(avs_ipc_msg_payload,
97*69b23b39SCezary Rojewski 
98*69b23b39SCezary Rojewski 	TP_PROTO(const u8 *data, size_t size, size_t offset, size_t total),
99*69b23b39SCezary Rojewski 
100*69b23b39SCezary Rojewski 	TP_ARGS(data, size, offset, total),
101*69b23b39SCezary Rojewski 
102*69b23b39SCezary Rojewski 	TP_CONDITION(data && size),
103*69b23b39SCezary Rojewski 
104*69b23b39SCezary Rojewski 	TP_STRUCT__entry(
105*69b23b39SCezary Rojewski 		__dynamic_array(u8,	buf,	size	)
106*69b23b39SCezary Rojewski 		__field(size_t,		offset		)
107*69b23b39SCezary Rojewski 		__field(size_t,		pos		)
108*69b23b39SCezary Rojewski 		__field(size_t,		total		)
109*69b23b39SCezary Rojewski 	),
110*69b23b39SCezary Rojewski 
111*69b23b39SCezary Rojewski 	TP_fast_assign(
112*69b23b39SCezary Rojewski 		memcpy(__get_dynamic_array(buf), data + offset, size);
113*69b23b39SCezary Rojewski 		__entry->offset = offset;
114*69b23b39SCezary Rojewski 		__entry->pos = offset + size;
115*69b23b39SCezary Rojewski 		__entry->total = total;
116*69b23b39SCezary Rojewski 	),
117*69b23b39SCezary Rojewski 
118*69b23b39SCezary Rojewski 	TP_printk("range %zu-%zu out of %zu bytes%s",
119*69b23b39SCezary Rojewski 		  __entry->offset, __entry->pos, __entry->total,
120*69b23b39SCezary Rojewski 		  __print_hex_dump("", DUMP_PREFIX_NONE, 16, 4,
121*69b23b39SCezary Rojewski 				   __get_dynamic_array(buf),
122*69b23b39SCezary Rojewski 				   __get_dynamic_array_len(buf), false))
123*69b23b39SCezary Rojewski );
124*69b23b39SCezary Rojewski 
125*69b23b39SCezary Rojewski TRACE_EVENT(avs_d0ix,
126*69b23b39SCezary Rojewski 
127*69b23b39SCezary Rojewski 	TP_PROTO(const char *op, bool proceed, u64 header),
128*69b23b39SCezary Rojewski 
129*69b23b39SCezary Rojewski 	TP_ARGS(op, proceed, header),
130*69b23b39SCezary Rojewski 
131*69b23b39SCezary Rojewski 	TP_STRUCT__entry(
132*69b23b39SCezary Rojewski 		__string(op,	op	)
133*69b23b39SCezary Rojewski 		__field(bool,	proceed	)
134*69b23b39SCezary Rojewski 		__field(u64,	header	)
135*69b23b39SCezary Rojewski 	),
136*69b23b39SCezary Rojewski 
137*69b23b39SCezary Rojewski 	TP_fast_assign(
138*69b23b39SCezary Rojewski 		__assign_str(op, op);
139*69b23b39SCezary Rojewski 		__entry->proceed = proceed;
140*69b23b39SCezary Rojewski 		__entry->header = header;
141*69b23b39SCezary Rojewski 	),
142*69b23b39SCezary Rojewski 
143*69b23b39SCezary Rojewski 	TP_printk("%s%s for request: 0x%08X 0x%08X",
144*69b23b39SCezary Rojewski 		  __entry->proceed ? "" : "ignore ", __get_str(op),
145*69b23b39SCezary Rojewski 		  lower_32_bits(__entry->header), upper_32_bits(__entry->header))
146*69b23b39SCezary Rojewski );
147*69b23b39SCezary Rojewski 
148*69b23b39SCezary Rojewski #endif /* _TRACE_INTEL_AVS_H */
149*69b23b39SCezary Rojewski 
150*69b23b39SCezary Rojewski /* This part must be outside protection */
151*69b23b39SCezary Rojewski #undef TRACE_INCLUDE_PATH
152*69b23b39SCezary Rojewski #define TRACE_INCLUDE_PATH .
153*69b23b39SCezary Rojewski #define TRACE_INCLUDE_FILE trace
154*69b23b39SCezary Rojewski #include <trace/define_trace.h>
155