Commit | Line | Data |
---|---|---|
42248979 PO |
1 | /* |
2 | * Tracepoint header for the s390 Common I/O layer (CIO) | |
3 | * | |
4 | * Copyright IBM Corp. 2015 | |
5 | * Author(s): Peter Oberparleiter <oberpar@linux.vnet.ibm.com> | |
6 | */ | |
7 | ||
8 | #include <linux/kernel.h> | |
9 | #include <asm/crw.h> | |
10 | #include <uapi/asm/chpid.h> | |
11 | #include <uapi/asm/schid.h> | |
12 | #include "cio.h" | |
13 | #include "orb.h" | |
14 | ||
15 | #undef TRACE_SYSTEM | |
16 | #define TRACE_SYSTEM s390 | |
17 | ||
18 | #if !defined(_TRACE_S390_CIO_H) || defined(TRACE_HEADER_MULTI_READ) | |
19 | #define _TRACE_S390_CIO_H | |
20 | ||
21 | #include <linux/tracepoint.h> | |
22 | ||
23 | DECLARE_EVENT_CLASS(s390_class_schib, | |
24 | TP_PROTO(struct subchannel_id schid, struct schib *schib, int cc), | |
25 | TP_ARGS(schid, schib, cc), | |
26 | TP_STRUCT__entry( | |
27 | __field(u8, cssid) | |
28 | __field(u8, ssid) | |
29 | __field(u16, schno) | |
30 | __field(u16, devno) | |
31 | __field_struct(struct schib, schib) | |
32 | __field(int, cc) | |
33 | ), | |
34 | TP_fast_assign( | |
35 | __entry->cssid = schid.cssid; | |
36 | __entry->ssid = schid.ssid; | |
37 | __entry->schno = schid.sch_no; | |
38 | __entry->devno = schib->pmcw.dev; | |
39 | __entry->schib = *schib; | |
40 | __entry->cc = cc; | |
41 | ), | |
42 | TP_printk("schid=%x.%x.%04x cc=%d ena=%d st=%d dnv=%d dev=%04x " | |
43 | "lpm=0x%02x pnom=0x%02x lpum=0x%02x pim=0x%02x pam=0x%02x " | |
44 | "pom=0x%02x chpids=%016llx", | |
45 | __entry->cssid, __entry->ssid, __entry->schno, __entry->cc, | |
46 | __entry->schib.pmcw.ena, __entry->schib.pmcw.st, | |
47 | __entry->schib.pmcw.dnv, __entry->schib.pmcw.dev, | |
48 | __entry->schib.pmcw.lpm, __entry->schib.pmcw.pnom, | |
49 | __entry->schib.pmcw.lpum, __entry->schib.pmcw.pim, | |
50 | __entry->schib.pmcw.pam, __entry->schib.pmcw.pom, | |
51 | *((u64 *) __entry->schib.pmcw.chpid) | |
52 | ) | |
53 | ); | |
54 | ||
55 | /** | |
56 | * s390_cio_stsch - Store Subchannel instruction (STSCH) was performed | |
57 | * @schid: Subchannel ID | |
58 | * @schib: Subchannel-Information block | |
59 | * @cc: Condition code | |
60 | */ | |
61 | DEFINE_EVENT(s390_class_schib, s390_cio_stsch, | |
62 | TP_PROTO(struct subchannel_id schid, struct schib *schib, int cc), | |
63 | TP_ARGS(schid, schib, cc) | |
64 | ); | |
65 | ||
66 | /** | |
67 | * s390_cio_msch - Modify Subchannel instruction (MSCH) was performed | |
68 | * @schid: Subchannel ID | |
69 | * @schib: Subchannel-Information block | |
70 | * @cc: Condition code | |
71 | */ | |
72 | DEFINE_EVENT(s390_class_schib, s390_cio_msch, | |
73 | TP_PROTO(struct subchannel_id schid, struct schib *schib, int cc), | |
74 | TP_ARGS(schid, schib, cc) | |
75 | ); | |
76 | ||
77 | /** | |
78 | * s390_cio_tsch - Test Subchannel instruction (TSCH) was performed | |
79 | * @schid: Subchannel ID | |
80 | * @irb: Interruption-Response Block | |
81 | * @cc: Condition code | |
82 | */ | |
83 | TRACE_EVENT(s390_cio_tsch, | |
84 | TP_PROTO(struct subchannel_id schid, struct irb *irb, int cc), | |
85 | TP_ARGS(schid, irb, cc), | |
86 | TP_STRUCT__entry( | |
87 | __field(u8, cssid) | |
88 | __field(u8, ssid) | |
89 | __field(u16, schno) | |
90 | __field_struct(struct irb, irb) | |
91 | __field(int, cc) | |
92 | ), | |
93 | TP_fast_assign( | |
94 | __entry->cssid = schid.cssid; | |
95 | __entry->ssid = schid.ssid; | |
96 | __entry->schno = schid.sch_no; | |
97 | __entry->irb = *irb; | |
98 | __entry->cc = cc; | |
99 | ), | |
100 | TP_printk("schid=%x.%x.%04x cc=%d dcc=%d pno=%d fctl=0x%x actl=0x%x " | |
101 | "stctl=0x%x dstat=0x%x cstat=0x%x", | |
102 | __entry->cssid, __entry->ssid, __entry->schno, __entry->cc, | |
103 | scsw_cc(&__entry->irb.scsw), scsw_pno(&__entry->irb.scsw), | |
104 | scsw_fctl(&__entry->irb.scsw), scsw_actl(&__entry->irb.scsw), | |
105 | scsw_stctl(&__entry->irb.scsw), | |
106 | scsw_dstat(&__entry->irb.scsw), scsw_cstat(&__entry->irb.scsw) | |
107 | ) | |
108 | ); | |
109 | ||
110 | /** | |
111 | * s390_cio_tpi - Test Pending Interruption instruction (TPI) was performed | |
112 | * @addr: Address of the I/O interruption code or %NULL | |
113 | * @cc: Condition code | |
114 | */ | |
115 | TRACE_EVENT(s390_cio_tpi, | |
116 | TP_PROTO(struct tpi_info *addr, int cc), | |
117 | TP_ARGS(addr, cc), | |
118 | TP_STRUCT__entry( | |
119 | __field(int, cc) | |
120 | __field_struct(struct tpi_info, tpi_info) | |
121 | __field(u8, cssid) | |
122 | __field(u8, ssid) | |
123 | __field(u16, schno) | |
124 | ), | |
125 | TP_fast_assign( | |
126 | __entry->cc = cc; | |
127 | if (cc != 0) | |
128 | memset(&__entry->tpi_info, 0, sizeof(struct tpi_info)); | |
129 | else if (addr) | |
130 | __entry->tpi_info = *addr; | |
131 | else { | |
132 | memcpy(&__entry->tpi_info, &S390_lowcore.subchannel_id, | |
133 | sizeof(struct tpi_info)); | |
134 | } | |
135 | __entry->cssid = __entry->tpi_info.schid.cssid; | |
136 | __entry->ssid = __entry->tpi_info.schid.ssid; | |
137 | __entry->schno = __entry->tpi_info.schid.sch_no; | |
138 | ), | |
139 | TP_printk("schid=%x.%x.%04x cc=%d a=%d isc=%d type=%d", | |
140 | __entry->cssid, __entry->ssid, __entry->schno, __entry->cc, | |
141 | __entry->tpi_info.adapter_IO, __entry->tpi_info.isc, | |
142 | __entry->tpi_info.type | |
143 | ) | |
144 | ); | |
145 | ||
146 | /** | |
147 | * s390_cio_ssch - Start Subchannel instruction (SSCH) was performed | |
148 | * @schid: Subchannel ID | |
149 | * @orb: Operation-Request Block | |
150 | * @cc: Condition code | |
151 | */ | |
152 | TRACE_EVENT(s390_cio_ssch, | |
153 | TP_PROTO(struct subchannel_id schid, union orb *orb, int cc), | |
154 | TP_ARGS(schid, orb, cc), | |
155 | TP_STRUCT__entry( | |
156 | __field(u8, cssid) | |
157 | __field(u8, ssid) | |
158 | __field(u16, schno) | |
159 | __field_struct(union orb, orb) | |
160 | __field(int, cc) | |
161 | ), | |
162 | TP_fast_assign( | |
163 | __entry->cssid = schid.cssid; | |
164 | __entry->ssid = schid.ssid; | |
165 | __entry->schno = schid.sch_no; | |
166 | __entry->orb = *orb; | |
167 | __entry->cc = cc; | |
168 | ), | |
169 | TP_printk("schid=%x.%x.%04x cc=%d", __entry->cssid, __entry->ssid, | |
170 | __entry->schno, __entry->cc | |
171 | ) | |
172 | ); | |
173 | ||
174 | DECLARE_EVENT_CLASS(s390_class_schid, | |
175 | TP_PROTO(struct subchannel_id schid, int cc), | |
176 | TP_ARGS(schid, cc), | |
177 | TP_STRUCT__entry( | |
178 | __field(u8, cssid) | |
179 | __field(u8, ssid) | |
180 | __field(u16, schno) | |
181 | __field(int, cc) | |
182 | ), | |
183 | TP_fast_assign( | |
184 | __entry->cssid = schid.cssid; | |
185 | __entry->ssid = schid.ssid; | |
186 | __entry->schno = schid.sch_no; | |
187 | __entry->cc = cc; | |
188 | ), | |
189 | TP_printk("schid=%x.%x.%04x cc=%d", __entry->cssid, __entry->ssid, | |
190 | __entry->schno, __entry->cc | |
191 | ) | |
192 | ); | |
193 | ||
194 | /** | |
195 | * s390_cio_csch - Clear Subchannel instruction (CSCH) was performed | |
196 | * @schid: Subchannel ID | |
197 | * @cc: Condition code | |
198 | */ | |
199 | DEFINE_EVENT(s390_class_schid, s390_cio_csch, | |
200 | TP_PROTO(struct subchannel_id schid, int cc), | |
201 | TP_ARGS(schid, cc) | |
202 | ); | |
203 | ||
204 | /** | |
205 | * s390_cio_hsch - Halt Subchannel instruction (HSCH) was performed | |
206 | * @schid: Subchannel ID | |
207 | * @cc: Condition code | |
208 | */ | |
209 | DEFINE_EVENT(s390_class_schid, s390_cio_hsch, | |
210 | TP_PROTO(struct subchannel_id schid, int cc), | |
211 | TP_ARGS(schid, cc) | |
212 | ); | |
213 | ||
214 | /** | |
215 | * s390_cio_xsch - Cancel Subchannel instruction (XSCH) was performed | |
216 | * @schid: Subchannel ID | |
217 | * @cc: Condition code | |
218 | */ | |
219 | DEFINE_EVENT(s390_class_schid, s390_cio_xsch, | |
220 | TP_PROTO(struct subchannel_id schid, int cc), | |
221 | TP_ARGS(schid, cc) | |
222 | ); | |
223 | ||
224 | /** | |
225 | * s390_cio_rsch - Resume Subchannel instruction (RSCH) was performed | |
226 | * @schid: Subchannel ID | |
227 | * @cc: Condition code | |
228 | */ | |
229 | DEFINE_EVENT(s390_class_schid, s390_cio_rsch, | |
230 | TP_PROTO(struct subchannel_id schid, int cc), | |
231 | TP_ARGS(schid, cc) | |
232 | ); | |
233 | ||
234 | /** | |
235 | * s390_cio_rchp - Reset Channel Path (RCHP) instruction was performed | |
236 | * @chpid: Channel-Path Identifier | |
237 | * @cc: Condition code | |
238 | */ | |
239 | TRACE_EVENT(s390_cio_rchp, | |
240 | TP_PROTO(struct chp_id chpid, int cc), | |
241 | TP_ARGS(chpid, cc), | |
242 | TP_STRUCT__entry( | |
243 | __field(u8, cssid) | |
244 | __field(u8, id) | |
245 | __field(int, cc) | |
246 | ), | |
247 | TP_fast_assign( | |
248 | __entry->cssid = chpid.cssid; | |
249 | __entry->id = chpid.id; | |
250 | __entry->cc = cc; | |
251 | ), | |
252 | TP_printk("chpid=%x.%02x cc=%d", __entry->cssid, __entry->id, | |
253 | __entry->cc | |
254 | ) | |
255 | ); | |
256 | ||
257 | #define CHSC_MAX_REQUEST_LEN 64 | |
258 | #define CHSC_MAX_RESPONSE_LEN 64 | |
259 | ||
260 | /** | |
261 | * s390_cio_chsc - Channel Subsystem Call (CHSC) instruction was performed | |
262 | * @chsc: CHSC block | |
263 | * @cc: Condition code | |
264 | */ | |
265 | TRACE_EVENT(s390_cio_chsc, | |
266 | TP_PROTO(struct chsc_header *chsc, int cc), | |
267 | TP_ARGS(chsc, cc), | |
268 | TP_STRUCT__entry( | |
269 | __field(int, cc) | |
270 | __field(u16, code) | |
271 | __field(u16, rcode) | |
272 | __array(u8, request, CHSC_MAX_REQUEST_LEN) | |
273 | __array(u8, response, CHSC_MAX_RESPONSE_LEN) | |
274 | ), | |
275 | TP_fast_assign( | |
276 | __entry->cc = cc; | |
277 | __entry->code = chsc->code; | |
278 | memcpy(&entry->request, chsc, | |
279 | min_t(u16, chsc->length, CHSC_MAX_REQUEST_LEN)); | |
280 | chsc = (struct chsc_header *) ((char *) chsc + chsc->length); | |
281 | __entry->rcode = chsc->code; | |
282 | memcpy(&entry->response, chsc, | |
283 | min_t(u16, chsc->length, CHSC_MAX_RESPONSE_LEN)); | |
284 | ), | |
285 | TP_printk("code=0x%04x cc=%d rcode=0x%04x", __entry->code, | |
286 | __entry->cc, __entry->rcode) | |
287 | ); | |
288 | ||
289 | /** | |
290 | * s390_cio_interrupt - An I/O interrupt occurred | |
291 | * @tpi_info: Address of the I/O interruption code | |
292 | */ | |
293 | TRACE_EVENT(s390_cio_interrupt, | |
294 | TP_PROTO(struct tpi_info *tpi_info), | |
295 | TP_ARGS(tpi_info), | |
296 | TP_STRUCT__entry( | |
297 | __field_struct(struct tpi_info, tpi_info) | |
298 | __field(u8, cssid) | |
299 | __field(u8, ssid) | |
300 | __field(u16, schno) | |
301 | ), | |
302 | TP_fast_assign( | |
303 | __entry->tpi_info = *tpi_info; | |
304 | __entry->cssid = __entry->tpi_info.schid.cssid; | |
305 | __entry->ssid = __entry->tpi_info.schid.ssid; | |
306 | __entry->schno = __entry->tpi_info.schid.sch_no; | |
307 | ), | |
308 | TP_printk("schid=%x.%x.%04x isc=%d type=%d", | |
309 | __entry->cssid, __entry->ssid, __entry->schno, | |
310 | __entry->tpi_info.isc, __entry->tpi_info.type | |
311 | ) | |
312 | ); | |
313 | ||
314 | /** | |
315 | * s390_cio_adapter_int - An adapter interrupt occurred | |
316 | * @tpi_info: Address of the I/O interruption code | |
317 | */ | |
318 | TRACE_EVENT(s390_cio_adapter_int, | |
319 | TP_PROTO(struct tpi_info *tpi_info), | |
320 | TP_ARGS(tpi_info), | |
321 | TP_STRUCT__entry( | |
322 | __field_struct(struct tpi_info, tpi_info) | |
323 | ), | |
324 | TP_fast_assign( | |
325 | __entry->tpi_info = *tpi_info; | |
326 | ), | |
327 | TP_printk("isc=%d", __entry->tpi_info.isc) | |
328 | ); | |
329 | ||
330 | /** | |
331 | * s390_cio_stcrw - Store Channel Report Word (STCRW) was performed | |
332 | * @crw: Channel Report Word | |
333 | * @cc: Condition code | |
334 | */ | |
335 | TRACE_EVENT(s390_cio_stcrw, | |
336 | TP_PROTO(struct crw *crw, int cc), | |
337 | TP_ARGS(crw, cc), | |
338 | TP_STRUCT__entry( | |
339 | __field_struct(struct crw, crw) | |
340 | __field(int, cc) | |
341 | ), | |
342 | TP_fast_assign( | |
343 | __entry->crw = *crw; | |
344 | __entry->cc = cc; | |
345 | ), | |
346 | TP_printk("cc=%d slct=%d oflw=%d chn=%d rsc=%d anc=%d erc=0x%x " | |
347 | "rsid=0x%x", | |
348 | __entry->cc, __entry->crw.slct, __entry->crw.oflw, | |
349 | __entry->crw.chn, __entry->crw.rsc, __entry->crw.anc, | |
350 | __entry->crw.erc, __entry->crw.rsid | |
351 | ) | |
352 | ); | |
353 | ||
354 | #endif /* _TRACE_S390_CIO_H */ | |
355 | ||
356 | /* This part must be outside protection */ | |
357 | #undef TRACE_INCLUDE_PATH | |
358 | #define TRACE_INCLUDE_PATH . | |
359 | ||
360 | #undef TRACE_INCLUDE_FILE | |
361 | #define TRACE_INCLUDE_FILE trace | |
362 | ||
363 | #include <trace/define_trace.h> |