xref: /linux/drivers/s390/cio/trace.h (revision e5c86679d5e864947a52fb31e45a425dea3e7fa9)
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>
364