blob: 5b807a09f21b277e16f7308f5a8c1e061ac98756 [file] [log] [blame]
Peter Oberparleiter42248972015-12-18 12:59:36 +01001/*
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
23DECLARE_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 */
61DEFINE_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 */
72DEFINE_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 */
83TRACE_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 */
115TRACE_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 */
152TRACE_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
174DECLARE_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 */
199DEFINE_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 */
209DEFINE_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 */
219DEFINE_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 */
229DEFINE_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 */
239TRACE_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 */
265TRACE_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 */
293TRACE_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 */
318TRACE_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 */
335TRACE_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>