Commit | Line | Data |
---|---|---|
57614c28 TS |
1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | // Copyright (c) 2024 Takashi Sakamoto | |
3 | ||
4 | #define TRACE_SYSTEM firewire | |
5 | ||
6 | #if !defined(_FIREWIRE_TRACE_EVENT_H) || defined(TRACE_HEADER_MULTI_READ) | |
7 | #define _FIREWIRE_TRACE_EVENT_H | |
8 | ||
9 | #include <linux/tracepoint.h> | |
944b0684 | 10 | #include <linux/firewire.h> |
57614c28 | 11 | |
944b0684 TS |
12 | #include <linux/firewire-constants.h> |
13 | ||
14 | #include "../../../drivers/firewire/packet-header-definitions.h" | |
15 | ||
16 | // The content of TP_printk field is preprocessed, then put to the module binary. | |
17 | #define ASYNC_HEADER_GET_DESTINATION(header) \ | |
18 | (((header)[0] & ASYNC_HEADER_Q0_DESTINATION_MASK) >> ASYNC_HEADER_Q0_DESTINATION_SHIFT) | |
19 | ||
20 | #define ASYNC_HEADER_GET_TLABEL(header) \ | |
21 | (((header)[0] & ASYNC_HEADER_Q0_TLABEL_MASK) >> ASYNC_HEADER_Q0_TLABEL_SHIFT) | |
22 | ||
23 | #define ASYNC_HEADER_GET_TCODE(header) \ | |
24 | (((header)[0] & ASYNC_HEADER_Q0_TCODE_MASK) >> ASYNC_HEADER_Q0_TCODE_SHIFT) | |
25 | ||
26 | #define ASYNC_HEADER_GET_SOURCE(header) \ | |
27 | (((header)[1] & ASYNC_HEADER_Q1_SOURCE_MASK) >> ASYNC_HEADER_Q1_SOURCE_SHIFT) | |
28 | ||
29 | #define ASYNC_HEADER_GET_OFFSET(header) \ | |
30 | ((((unsigned long long)((header)[1] & ASYNC_HEADER_Q1_OFFSET_HIGH_MASK)) >> ASYNC_HEADER_Q1_OFFSET_HIGH_SHIFT) << 32)| \ | |
31 | (header)[2] | |
32 | ||
06cc078c TS |
33 | #define ASYNC_HEADER_GET_RCODE(header) \ |
34 | (((header)[1] & ASYNC_HEADER_Q1_RCODE_MASK) >> ASYNC_HEADER_Q1_RCODE_SHIFT) | |
35 | ||
944b0684 TS |
36 | #define QUADLET_SIZE 4 |
37 | ||
38 | DECLARE_EVENT_CLASS(async_outbound_initiate_template, | |
39 | TP_PROTO(u64 transaction, unsigned int generation, unsigned int scode, const u32 *header, const u32 *data, unsigned int data_count), | |
40 | TP_ARGS(transaction, generation, scode, header, data, data_count), | |
41 | TP_STRUCT__entry( | |
42 | __field(u64, transaction) | |
43 | __field(u8, generation) | |
44 | __field(u8, scode) | |
45 | __array(u32, header, ASYNC_HEADER_QUADLET_COUNT) | |
46 | __dynamic_array(u32, data, data_count) | |
47 | ), | |
48 | TP_fast_assign( | |
49 | __entry->transaction = transaction; | |
50 | __entry->generation = generation; | |
51 | __entry->scode = scode; | |
52 | memcpy(__entry->header, header, QUADLET_SIZE * ASYNC_HEADER_QUADLET_COUNT); | |
53 | memcpy(__get_dynamic_array(data), data, __get_dynamic_array_len(data)); | |
54 | ), | |
55 | // This format is for the request subaction. | |
56 | TP_printk( | |
57 | "transaction=0x%llx generation=%u scode=%u dst_id=0x%04x tlabel=%u tcode=%u src_id=0x%04x offset=0x%012llx header=%s data=%s", | |
58 | __entry->transaction, | |
59 | __entry->generation, | |
60 | __entry->scode, | |
61 | ASYNC_HEADER_GET_DESTINATION(__entry->header), | |
62 | ASYNC_HEADER_GET_TLABEL(__entry->header), | |
63 | ASYNC_HEADER_GET_TCODE(__entry->header), | |
64 | ASYNC_HEADER_GET_SOURCE(__entry->header), | |
65 | ASYNC_HEADER_GET_OFFSET(__entry->header), | |
66 | __print_array(__entry->header, ASYNC_HEADER_QUADLET_COUNT, QUADLET_SIZE), | |
67 | __print_array(__get_dynamic_array(data), | |
68 | __get_dynamic_array_len(data) / QUADLET_SIZE, QUADLET_SIZE) | |
69 | ) | |
70 | ); | |
71 | ||
72 | // The value of status is one of ack codes and rcodes specific to Linux FireWire subsystem. | |
73 | DECLARE_EVENT_CLASS(async_outbound_complete_template, | |
74 | TP_PROTO(u64 transaction, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp), | |
75 | TP_ARGS(transaction, generation, scode, status, timestamp), | |
76 | TP_STRUCT__entry( | |
77 | __field(u64, transaction) | |
78 | __field(u8, generation) | |
79 | __field(u8, scode) | |
80 | __field(u8, status) | |
81 | __field(u16, timestamp) | |
82 | ), | |
83 | TP_fast_assign( | |
84 | __entry->transaction = transaction; | |
85 | __entry->generation = generation; | |
86 | __entry->scode = scode; | |
87 | __entry->status = status; | |
88 | __entry->timestamp = timestamp; | |
89 | ), | |
90 | TP_printk( | |
91 | "transaction=0x%llx generation=%u scode=%u status=%u timestamp=0x%04x", | |
92 | __entry->transaction, | |
93 | __entry->generation, | |
94 | __entry->scode, | |
95 | __entry->status, | |
96 | __entry->timestamp | |
97 | ) | |
98 | ); | |
99 | ||
06cc078c TS |
100 | // The value of status is one of ack codes and rcodes specific to Linux FireWire subsystem. |
101 | DECLARE_EVENT_CLASS(async_inbound_template, | |
102 | TP_PROTO(u64 transaction, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp, const u32 *header, const u32 *data, unsigned int data_count), | |
103 | TP_ARGS(transaction, generation, scode, status, timestamp, header, data, data_count), | |
104 | TP_STRUCT__entry( | |
105 | __field(u64, transaction) | |
106 | __field(u8, generation) | |
107 | __field(u8, scode) | |
108 | __field(u8, status) | |
109 | __field(u8, timestamp) | |
110 | __array(u32, header, ASYNC_HEADER_QUADLET_COUNT) | |
111 | __dynamic_array(u32, data, data_count) | |
112 | ), | |
113 | TP_fast_assign( | |
114 | __entry->transaction = transaction; | |
115 | __entry->generation = generation; | |
116 | __entry->scode = scode; | |
117 | __entry->status = status; | |
118 | __entry->timestamp = timestamp; | |
119 | memcpy(__entry->header, header, QUADLET_SIZE * ASYNC_HEADER_QUADLET_COUNT); | |
120 | memcpy(__get_dynamic_array(data), data, __get_dynamic_array_len(data)); | |
121 | ), | |
122 | // This format is for the response subaction. | |
123 | TP_printk( | |
124 | "transaction=0x%llx generation=%u scode=%u status=%u timestamp=0x%04x dst_id=0x%04x tlabel=%u tcode=%u src_id=0x%04x rcode=%u header=%s data=%s", | |
125 | __entry->transaction, | |
126 | __entry->generation, | |
127 | __entry->scode, | |
128 | __entry->status, | |
129 | __entry->timestamp, | |
130 | ASYNC_HEADER_GET_DESTINATION(__entry->header), | |
131 | ASYNC_HEADER_GET_TLABEL(__entry->header), | |
132 | ASYNC_HEADER_GET_TCODE(__entry->header), | |
133 | ASYNC_HEADER_GET_SOURCE(__entry->header), | |
134 | ASYNC_HEADER_GET_RCODE(__entry->header), | |
135 | __print_array(__entry->header, ASYNC_HEADER_QUADLET_COUNT, QUADLET_SIZE), | |
136 | __print_array(__get_dynamic_array(data), | |
137 | __get_dynamic_array_len(data) / QUADLET_SIZE, QUADLET_SIZE) | |
138 | ) | |
139 | ); | |
140 | ||
944b0684 TS |
141 | DEFINE_EVENT(async_outbound_initiate_template, async_request_outbound_initiate, |
142 | TP_PROTO(u64 transaction, unsigned int generation, unsigned int scode, const u32 *header, const u32 *data, unsigned int data_count), | |
143 | TP_ARGS(transaction, generation, scode, header, data, data_count) | |
144 | ); | |
145 | ||
146 | DEFINE_EVENT(async_outbound_complete_template, async_request_outbound_complete, | |
147 | TP_PROTO(u64 transaction, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp), | |
148 | TP_ARGS(transaction, generation, scode, status, timestamp) | |
149 | ); | |
150 | ||
06cc078c TS |
151 | DEFINE_EVENT(async_inbound_template, async_response_inbound, |
152 | TP_PROTO(u64 transaction, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp, const u32 *header, const u32 *data, unsigned int data_count), | |
153 | TP_ARGS(transaction, generation, scode, status, timestamp, header, data, data_count) | |
154 | ); | |
155 | ||
2c945b10 TS |
156 | DEFINE_EVENT_PRINT(async_inbound_template, async_request_inbound, |
157 | TP_PROTO(u64 transaction, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp, const u32 *header, const u32 *data, unsigned int data_count), | |
158 | TP_ARGS(transaction, generation, scode, status, timestamp, header, data, data_count), | |
159 | TP_printk( | |
160 | "transaction=0x%llx generation=%u scode=%u status=%u timestamp=0x%04x dst_id=0x%04x tlabel=%u tcode=%u src_id=0x%04x offset=0x%012llx header=%s data=%s", | |
161 | __entry->transaction, | |
162 | __entry->generation, | |
163 | __entry->scode, | |
164 | __entry->status, | |
165 | __entry->timestamp, | |
166 | ASYNC_HEADER_GET_DESTINATION(__entry->header), | |
167 | ASYNC_HEADER_GET_TLABEL(__entry->header), | |
168 | ASYNC_HEADER_GET_TCODE(__entry->header), | |
169 | ASYNC_HEADER_GET_SOURCE(__entry->header), | |
170 | ASYNC_HEADER_GET_OFFSET(__entry->header), | |
171 | __print_array(__entry->header, ASYNC_HEADER_QUADLET_COUNT, QUADLET_SIZE), | |
172 | __print_array(__get_dynamic_array(data), | |
173 | __get_dynamic_array_len(data) / QUADLET_SIZE, QUADLET_SIZE) | |
174 | ) | |
175 | ); | |
176 | ||
624a8535 TS |
177 | DEFINE_EVENT_PRINT(async_outbound_initiate_template, async_response_outbound_initiate, |
178 | TP_PROTO(u64 transaction, unsigned int generation, unsigned int scode, const u32 *header, const u32 *data, unsigned int data_count), | |
179 | TP_ARGS(transaction, generation, scode, header, data, data_count), | |
180 | TP_printk( | |
181 | "transaction=0x%llx generation=%u scode=%u dst_id=0x%04x tlabel=%u tcode=%u src_id=0x%04x rcode=%u header=%s data=%s", | |
182 | __entry->transaction, | |
183 | __entry->generation, | |
184 | __entry->scode, | |
185 | ASYNC_HEADER_GET_DESTINATION(__entry->header), | |
186 | ASYNC_HEADER_GET_TLABEL(__entry->header), | |
187 | ASYNC_HEADER_GET_TCODE(__entry->header), | |
188 | ASYNC_HEADER_GET_SOURCE(__entry->header), | |
189 | ASYNC_HEADER_GET_RCODE(__entry->header), | |
190 | __print_array(__entry->header, ASYNC_HEADER_QUADLET_COUNT, QUADLET_SIZE), | |
191 | __print_array(__get_dynamic_array(data), | |
192 | __get_dynamic_array_len(data) / QUADLET_SIZE, QUADLET_SIZE) | |
193 | ) | |
194 | ); | |
195 | ||
196 | DEFINE_EVENT(async_outbound_complete_template, async_response_outbound_complete, | |
197 | TP_PROTO(u64 transaction, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp), | |
198 | TP_ARGS(transaction, generation, scode, status, timestamp) | |
199 | ); | |
200 | ||
944b0684 TS |
201 | #undef ASYNC_HEADER_GET_DESTINATION |
202 | #undef ASYNC_HEADER_GET_TLABEL | |
203 | #undef ASYNC_HEADER_GET_TCODE | |
204 | #undef ASYNC_HEADER_GET_SOURCE | |
205 | #undef ASYNC_HEADER_GET_OFFSET | |
06cc078c | 206 | #undef ASYNC_HEADER_GET_RCODE |
944b0684 | 207 | #undef QUADLET_SIZE |
57614c28 | 208 | |
1a4c53cf TS |
209 | TRACE_EVENT(async_phy_outbound_initiate, |
210 | TP_PROTO(u64 packet, unsigned int generation, u32 first_quadlet, u32 second_quadlet), | |
211 | TP_ARGS(packet, generation, first_quadlet, second_quadlet), | |
212 | TP_STRUCT__entry( | |
213 | __field(u64, packet) | |
214 | __field(u8, generation) | |
215 | __field(u32, first_quadlet) | |
216 | __field(u32, second_quadlet) | |
217 | ), | |
218 | TP_fast_assign( | |
219 | __entry->packet = packet; | |
220 | __entry->generation = generation; | |
221 | __entry->first_quadlet = first_quadlet; | |
222 | __entry->second_quadlet = second_quadlet | |
223 | ), | |
224 | TP_printk( | |
225 | "packet=0x%016llx generation=%u first_quadlet=0x%08x second_quadlet=0x%08x", | |
226 | __entry->packet, | |
227 | __entry->generation, | |
228 | __entry->first_quadlet, | |
229 | __entry->second_quadlet | |
230 | ) | |
231 | ); | |
232 | ||
233 | TRACE_EVENT(async_phy_outbound_complete, | |
234 | TP_PROTO(u64 packet, unsigned int generation, unsigned int status, unsigned int timestamp), | |
235 | TP_ARGS(packet, generation, status, timestamp), | |
236 | TP_STRUCT__entry( | |
237 | __field(u64, packet) | |
238 | __field(u8, generation) | |
239 | __field(u8, status) | |
240 | __field(u16, timestamp) | |
241 | ), | |
242 | TP_fast_assign( | |
243 | __entry->packet = packet; | |
244 | __entry->generation = generation; | |
245 | __entry->status = status; | |
246 | __entry->timestamp = timestamp; | |
247 | ), | |
248 | TP_printk( | |
249 | "packet=0x%016llx generation=%u status=%u timestamp=0x%04x", | |
250 | __entry->packet, | |
251 | __entry->generation, | |
252 | __entry->status, | |
253 | __entry->timestamp | |
254 | ) | |
255 | ); | |
256 | ||
57614c28 TS |
257 | #endif // _FIREWIRE_TRACE_EVENT_H |
258 | ||
259 | #include <trace/define_trace.h> |