xref: /openbmc/linux/drivers/misc/cxl/trace.h (revision bc5aa3a0)
1 /*
2  * Copyright 2015 IBM Corp.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version
7  * 2 of the License, or (at your option) any later version.
8  */
9 
10 #undef TRACE_SYSTEM
11 #define TRACE_SYSTEM cxl
12 
13 #if !defined(_CXL_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
14 #define _CXL_TRACE_H
15 
16 #include <linux/tracepoint.h>
17 
18 #include "cxl.h"
19 
20 #define DSISR_FLAGS \
21 	{ CXL_PSL_DSISR_An_DS,	"DS" }, \
22 	{ CXL_PSL_DSISR_An_DM,	"DM" }, \
23 	{ CXL_PSL_DSISR_An_ST,	"ST" }, \
24 	{ CXL_PSL_DSISR_An_UR,	"UR" }, \
25 	{ CXL_PSL_DSISR_An_PE,	"PE" }, \
26 	{ CXL_PSL_DSISR_An_AE,	"AE" }, \
27 	{ CXL_PSL_DSISR_An_OC,	"OC" }, \
28 	{ CXL_PSL_DSISR_An_M,	"M" }, \
29 	{ CXL_PSL_DSISR_An_P,	"P" }, \
30 	{ CXL_PSL_DSISR_An_A,	"A" }, \
31 	{ CXL_PSL_DSISR_An_S,	"S" }, \
32 	{ CXL_PSL_DSISR_An_K,	"K" }
33 
34 #define TFC_FLAGS \
35 	{ CXL_PSL_TFC_An_A,	"A" }, \
36 	{ CXL_PSL_TFC_An_C,	"C" }, \
37 	{ CXL_PSL_TFC_An_AE,	"AE" }, \
38 	{ CXL_PSL_TFC_An_R,	"R" }
39 
40 #define LLCMD_NAMES \
41 	{ CXL_SPA_SW_CMD_TERMINATE,	"TERMINATE" }, \
42 	{ CXL_SPA_SW_CMD_REMOVE,	"REMOVE" }, \
43 	{ CXL_SPA_SW_CMD_SUSPEND,	"SUSPEND" }, \
44 	{ CXL_SPA_SW_CMD_RESUME,	"RESUME" }, \
45 	{ CXL_SPA_SW_CMD_ADD,		"ADD" }, \
46 	{ CXL_SPA_SW_CMD_UPDATE,	"UPDATE" }
47 
48 #define AFU_COMMANDS \
49 	{ 0,			"DISABLE" }, \
50 	{ CXL_AFU_Cntl_An_E,	"ENABLE" }, \
51 	{ CXL_AFU_Cntl_An_RA,	"RESET" }
52 
53 #define PSL_COMMANDS \
54 	{ CXL_PSL_SCNTL_An_Pc,	"PURGE" }, \
55 	{ CXL_PSL_SCNTL_An_Sc,	"SUSPEND" }
56 
57 
58 DECLARE_EVENT_CLASS(cxl_pe_class,
59 	TP_PROTO(struct cxl_context *ctx),
60 
61 	TP_ARGS(ctx),
62 
63 	TP_STRUCT__entry(
64 		__field(u8, card)
65 		__field(u8, afu)
66 		__field(u16, pe)
67 	),
68 
69 	TP_fast_assign(
70 		__entry->card = ctx->afu->adapter->adapter_num;
71 		__entry->afu = ctx->afu->slice;
72 		__entry->pe = ctx->pe;
73 	),
74 
75 	TP_printk("afu%i.%i pe=%i",
76 		__entry->card,
77 		__entry->afu,
78 		__entry->pe
79 	)
80 );
81 
82 
83 TRACE_EVENT(cxl_attach,
84 	TP_PROTO(struct cxl_context *ctx, u64 wed, s16 num_interrupts, u64 amr),
85 
86 	TP_ARGS(ctx, wed, num_interrupts, amr),
87 
88 	TP_STRUCT__entry(
89 		__field(u8, card)
90 		__field(u8, afu)
91 		__field(u16, pe)
92 		__field(pid_t, pid)
93 		__field(u64, wed)
94 		__field(u64, amr)
95 		__field(s16, num_interrupts)
96 	),
97 
98 	TP_fast_assign(
99 		__entry->card = ctx->afu->adapter->adapter_num;
100 		__entry->afu = ctx->afu->slice;
101 		__entry->pe = ctx->pe;
102 		__entry->pid = pid_nr(ctx->pid);
103 		__entry->wed = wed;
104 		__entry->amr = amr;
105 		__entry->num_interrupts = num_interrupts;
106 	),
107 
108 	TP_printk("afu%i.%i pid=%i pe=%i wed=0x%016llx irqs=%i amr=0x%llx",
109 		__entry->card,
110 		__entry->afu,
111 		__entry->pid,
112 		__entry->pe,
113 		__entry->wed,
114 		__entry->num_interrupts,
115 		__entry->amr
116 	)
117 );
118 
119 DEFINE_EVENT(cxl_pe_class, cxl_detach,
120 	TP_PROTO(struct cxl_context *ctx),
121 	TP_ARGS(ctx)
122 );
123 
124 TRACE_EVENT(cxl_afu_irq,
125 	TP_PROTO(struct cxl_context *ctx, int afu_irq, int virq, irq_hw_number_t hwirq),
126 
127 	TP_ARGS(ctx, afu_irq, virq, hwirq),
128 
129 	TP_STRUCT__entry(
130 		__field(u8, card)
131 		__field(u8, afu)
132 		__field(u16, pe)
133 		__field(u16, afu_irq)
134 		__field(int, virq)
135 		__field(irq_hw_number_t, hwirq)
136 	),
137 
138 	TP_fast_assign(
139 		__entry->card = ctx->afu->adapter->adapter_num;
140 		__entry->afu = ctx->afu->slice;
141 		__entry->pe = ctx->pe;
142 		__entry->afu_irq = afu_irq;
143 		__entry->virq = virq;
144 		__entry->hwirq = hwirq;
145 	),
146 
147 	TP_printk("afu%i.%i pe=%i afu_irq=%i virq=%i hwirq=0x%lx",
148 		__entry->card,
149 		__entry->afu,
150 		__entry->pe,
151 		__entry->afu_irq,
152 		__entry->virq,
153 		__entry->hwirq
154 	)
155 );
156 
157 TRACE_EVENT(cxl_psl_irq,
158 	TP_PROTO(struct cxl_context *ctx, int irq, u64 dsisr, u64 dar),
159 
160 	TP_ARGS(ctx, irq, dsisr, dar),
161 
162 	TP_STRUCT__entry(
163 		__field(u8, card)
164 		__field(u8, afu)
165 		__field(u16, pe)
166 		__field(int, irq)
167 		__field(u64, dsisr)
168 		__field(u64, dar)
169 	),
170 
171 	TP_fast_assign(
172 		__entry->card = ctx->afu->adapter->adapter_num;
173 		__entry->afu = ctx->afu->slice;
174 		__entry->pe = ctx->pe;
175 		__entry->irq = irq;
176 		__entry->dsisr = dsisr;
177 		__entry->dar = dar;
178 	),
179 
180 	TP_printk("afu%i.%i pe=%i irq=%i dsisr=%s dar=0x%016llx",
181 		__entry->card,
182 		__entry->afu,
183 		__entry->pe,
184 		__entry->irq,
185 		__print_flags(__entry->dsisr, "|", DSISR_FLAGS),
186 		__entry->dar
187 	)
188 );
189 
190 TRACE_EVENT(cxl_psl_irq_ack,
191 	TP_PROTO(struct cxl_context *ctx, u64 tfc),
192 
193 	TP_ARGS(ctx, tfc),
194 
195 	TP_STRUCT__entry(
196 		__field(u8, card)
197 		__field(u8, afu)
198 		__field(u16, pe)
199 		__field(u64, tfc)
200 	),
201 
202 	TP_fast_assign(
203 		__entry->card = ctx->afu->adapter->adapter_num;
204 		__entry->afu = ctx->afu->slice;
205 		__entry->pe = ctx->pe;
206 		__entry->tfc = tfc;
207 	),
208 
209 	TP_printk("afu%i.%i pe=%i tfc=%s",
210 		__entry->card,
211 		__entry->afu,
212 		__entry->pe,
213 		__print_flags(__entry->tfc, "|", TFC_FLAGS)
214 	)
215 );
216 
217 TRACE_EVENT(cxl_ste_miss,
218 	TP_PROTO(struct cxl_context *ctx, u64 dar),
219 
220 	TP_ARGS(ctx, dar),
221 
222 	TP_STRUCT__entry(
223 		__field(u8, card)
224 		__field(u8, afu)
225 		__field(u16, pe)
226 		__field(u64, dar)
227 	),
228 
229 	TP_fast_assign(
230 		__entry->card = ctx->afu->adapter->adapter_num;
231 		__entry->afu = ctx->afu->slice;
232 		__entry->pe = ctx->pe;
233 		__entry->dar = dar;
234 	),
235 
236 	TP_printk("afu%i.%i pe=%i dar=0x%016llx",
237 		__entry->card,
238 		__entry->afu,
239 		__entry->pe,
240 		__entry->dar
241 	)
242 );
243 
244 TRACE_EVENT(cxl_ste_write,
245 	TP_PROTO(struct cxl_context *ctx, unsigned int idx, u64 e, u64 v),
246 
247 	TP_ARGS(ctx, idx, e, v),
248 
249 	TP_STRUCT__entry(
250 		__field(u8, card)
251 		__field(u8, afu)
252 		__field(u16, pe)
253 		__field(unsigned int, idx)
254 		__field(u64, e)
255 		__field(u64, v)
256 	),
257 
258 	TP_fast_assign(
259 		__entry->card = ctx->afu->adapter->adapter_num;
260 		__entry->afu = ctx->afu->slice;
261 		__entry->pe = ctx->pe;
262 		__entry->idx = idx;
263 		__entry->e = e;
264 		__entry->v = v;
265 	),
266 
267 	TP_printk("afu%i.%i pe=%i SSTE[%i] E=0x%016llx V=0x%016llx",
268 		__entry->card,
269 		__entry->afu,
270 		__entry->pe,
271 		__entry->idx,
272 		__entry->e,
273 		__entry->v
274 	)
275 );
276 
277 TRACE_EVENT(cxl_pte_miss,
278 	TP_PROTO(struct cxl_context *ctx, u64 dsisr, u64 dar),
279 
280 	TP_ARGS(ctx, dsisr, dar),
281 
282 	TP_STRUCT__entry(
283 		__field(u8, card)
284 		__field(u8, afu)
285 		__field(u16, pe)
286 		__field(u64, dsisr)
287 		__field(u64, dar)
288 	),
289 
290 	TP_fast_assign(
291 		__entry->card = ctx->afu->adapter->adapter_num;
292 		__entry->afu = ctx->afu->slice;
293 		__entry->pe = ctx->pe;
294 		__entry->dsisr = dsisr;
295 		__entry->dar = dar;
296 	),
297 
298 	TP_printk("afu%i.%i pe=%i dsisr=%s dar=0x%016llx",
299 		__entry->card,
300 		__entry->afu,
301 		__entry->pe,
302 		__print_flags(__entry->dsisr, "|", DSISR_FLAGS),
303 		__entry->dar
304 	)
305 );
306 
307 TRACE_EVENT(cxl_llcmd,
308 	TP_PROTO(struct cxl_context *ctx, u64 cmd),
309 
310 	TP_ARGS(ctx, cmd),
311 
312 	TP_STRUCT__entry(
313 		__field(u8, card)
314 		__field(u8, afu)
315 		__field(u16, pe)
316 		__field(u64, cmd)
317 	),
318 
319 	TP_fast_assign(
320 		__entry->card = ctx->afu->adapter->adapter_num;
321 		__entry->afu = ctx->afu->slice;
322 		__entry->pe = ctx->pe;
323 		__entry->cmd = cmd;
324 	),
325 
326 	TP_printk("afu%i.%i pe=%i cmd=%s",
327 		__entry->card,
328 		__entry->afu,
329 		__entry->pe,
330 		__print_symbolic_u64(__entry->cmd, LLCMD_NAMES)
331 	)
332 );
333 
334 TRACE_EVENT(cxl_llcmd_done,
335 	TP_PROTO(struct cxl_context *ctx, u64 cmd, int rc),
336 
337 	TP_ARGS(ctx, cmd, rc),
338 
339 	TP_STRUCT__entry(
340 		__field(u8, card)
341 		__field(u8, afu)
342 		__field(u16, pe)
343 		__field(u64, cmd)
344 		__field(int, rc)
345 	),
346 
347 	TP_fast_assign(
348 		__entry->card = ctx->afu->adapter->adapter_num;
349 		__entry->afu = ctx->afu->slice;
350 		__entry->pe = ctx->pe;
351 		__entry->rc = rc;
352 		__entry->cmd = cmd;
353 	),
354 
355 	TP_printk("afu%i.%i pe=%i cmd=%s rc=%i",
356 		__entry->card,
357 		__entry->afu,
358 		__entry->pe,
359 		__print_symbolic_u64(__entry->cmd, LLCMD_NAMES),
360 		__entry->rc
361 	)
362 );
363 
364 DECLARE_EVENT_CLASS(cxl_afu_psl_ctrl,
365 	TP_PROTO(struct cxl_afu *afu, u64 cmd),
366 
367 	TP_ARGS(afu, cmd),
368 
369 	TP_STRUCT__entry(
370 		__field(u8, card)
371 		__field(u8, afu)
372 		__field(u64, cmd)
373 	),
374 
375 	TP_fast_assign(
376 		__entry->card = afu->adapter->adapter_num;
377 		__entry->afu = afu->slice;
378 		__entry->cmd = cmd;
379 	),
380 
381 	TP_printk("afu%i.%i cmd=%s",
382 		__entry->card,
383 		__entry->afu,
384 		__print_symbolic_u64(__entry->cmd, AFU_COMMANDS)
385 	)
386 );
387 
388 DECLARE_EVENT_CLASS(cxl_afu_psl_ctrl_done,
389 	TP_PROTO(struct cxl_afu *afu, u64 cmd, int rc),
390 
391 	TP_ARGS(afu, cmd, rc),
392 
393 	TP_STRUCT__entry(
394 		__field(u8, card)
395 		__field(u8, afu)
396 		__field(u64, cmd)
397 		__field(int, rc)
398 	),
399 
400 	TP_fast_assign(
401 		__entry->card = afu->adapter->adapter_num;
402 		__entry->afu = afu->slice;
403 		__entry->rc = rc;
404 		__entry->cmd = cmd;
405 	),
406 
407 	TP_printk("afu%i.%i cmd=%s rc=%i",
408 		__entry->card,
409 		__entry->afu,
410 		__print_symbolic_u64(__entry->cmd, AFU_COMMANDS),
411 		__entry->rc
412 	)
413 );
414 
415 DEFINE_EVENT(cxl_afu_psl_ctrl, cxl_afu_ctrl,
416 	TP_PROTO(struct cxl_afu *afu, u64 cmd),
417 	TP_ARGS(afu, cmd)
418 );
419 
420 DEFINE_EVENT(cxl_afu_psl_ctrl_done, cxl_afu_ctrl_done,
421 	TP_PROTO(struct cxl_afu *afu, u64 cmd, int rc),
422 	TP_ARGS(afu, cmd, rc)
423 );
424 
425 DEFINE_EVENT_PRINT(cxl_afu_psl_ctrl, cxl_psl_ctrl,
426 	TP_PROTO(struct cxl_afu *afu, u64 cmd),
427 	TP_ARGS(afu, cmd),
428 
429 	TP_printk("psl%i.%i cmd=%s",
430 		__entry->card,
431 		__entry->afu,
432 		__print_symbolic_u64(__entry->cmd, PSL_COMMANDS)
433 	)
434 );
435 
436 DEFINE_EVENT_PRINT(cxl_afu_psl_ctrl_done, cxl_psl_ctrl_done,
437 	TP_PROTO(struct cxl_afu *afu, u64 cmd, int rc),
438 	TP_ARGS(afu, cmd, rc),
439 
440 	TP_printk("psl%i.%i cmd=%s rc=%i",
441 		__entry->card,
442 		__entry->afu,
443 		__print_symbolic_u64(__entry->cmd, PSL_COMMANDS),
444 		__entry->rc
445 	)
446 );
447 
448 DEFINE_EVENT(cxl_pe_class, cxl_slbia,
449 	TP_PROTO(struct cxl_context *ctx),
450 	TP_ARGS(ctx)
451 );
452 
453 TRACE_EVENT(cxl_hcall,
454 	TP_PROTO(u64 unit_address, u64 process_token, long rc),
455 
456 	TP_ARGS(unit_address, process_token, rc),
457 
458 	TP_STRUCT__entry(
459 		__field(u64, unit_address)
460 		__field(u64, process_token)
461 		__field(long, rc)
462 	),
463 
464 	TP_fast_assign(
465 		__entry->unit_address = unit_address;
466 		__entry->process_token = process_token;
467 		__entry->rc = rc;
468 	),
469 
470 	TP_printk("unit_address=0x%016llx process_token=0x%016llx rc=%li",
471 		__entry->unit_address,
472 		__entry->process_token,
473 		__entry->rc
474 	)
475 );
476 
477 TRACE_EVENT(cxl_hcall_control,
478 	TP_PROTO(u64 unit_address, char *fct, u64 p1, u64 p2, u64 p3,
479 	u64 p4, unsigned long r4, long rc),
480 
481 	TP_ARGS(unit_address, fct, p1, p2, p3, p4, r4, rc),
482 
483 	TP_STRUCT__entry(
484 		__field(u64, unit_address)
485 		__field(char *, fct)
486 		__field(u64, p1)
487 		__field(u64, p2)
488 		__field(u64, p3)
489 		__field(u64, p4)
490 		__field(unsigned long, r4)
491 		__field(long, rc)
492 	),
493 
494 	TP_fast_assign(
495 		__entry->unit_address = unit_address;
496 		__entry->fct = fct;
497 		__entry->p1 = p1;
498 		__entry->p2 = p2;
499 		__entry->p3 = p3;
500 		__entry->p4 = p4;
501 		__entry->r4 = r4;
502 		__entry->rc = rc;
503 	),
504 
505 	TP_printk("unit_address=%#.16llx %s(%#llx, %#llx, %#llx, %#llx, R4: %#lx)): %li",
506 		__entry->unit_address,
507 		__entry->fct,
508 		__entry->p1,
509 		__entry->p2,
510 		__entry->p3,
511 		__entry->p4,
512 		__entry->r4,
513 		__entry->rc
514 	)
515 );
516 
517 TRACE_EVENT(cxl_hcall_attach,
518 	TP_PROTO(u64 unit_address, u64 phys_addr, unsigned long process_token,
519 		unsigned long mmio_addr, unsigned long mmio_size, long rc),
520 
521 	TP_ARGS(unit_address, phys_addr, process_token,
522 		mmio_addr, mmio_size, rc),
523 
524 	TP_STRUCT__entry(
525 		__field(u64, unit_address)
526 		__field(u64, phys_addr)
527 		__field(unsigned long, process_token)
528 		__field(unsigned long, mmio_addr)
529 		__field(unsigned long, mmio_size)
530 		__field(long, rc)
531 	),
532 
533 	TP_fast_assign(
534 		__entry->unit_address = unit_address;
535 		__entry->phys_addr = phys_addr;
536 		__entry->process_token = process_token;
537 		__entry->mmio_addr = mmio_addr;
538 		__entry->mmio_size = mmio_size;
539 		__entry->rc = rc;
540 	),
541 
542 	TP_printk("unit_address=0x%016llx phys_addr=0x%016llx "
543 		"token=0x%.8lx mmio_addr=0x%lx mmio_size=0x%lx rc=%li",
544 		__entry->unit_address,
545 		__entry->phys_addr,
546 		__entry->process_token,
547 		__entry->mmio_addr,
548 		__entry->mmio_size,
549 		__entry->rc
550 	)
551 );
552 
553 DEFINE_EVENT(cxl_hcall, cxl_hcall_detach,
554 	TP_PROTO(u64 unit_address, u64 process_token, long rc),
555 	TP_ARGS(unit_address, process_token, rc)
556 );
557 
558 DEFINE_EVENT(cxl_hcall_control, cxl_hcall_control_function,
559 	TP_PROTO(u64 unit_address, char *fct, u64 p1, u64 p2, u64 p3,
560 	u64 p4, unsigned long r4, long rc),
561 	TP_ARGS(unit_address, fct, p1, p2, p3, p4, r4, rc)
562 );
563 
564 DEFINE_EVENT(cxl_hcall, cxl_hcall_collect_int_info,
565 	TP_PROTO(u64 unit_address, u64 process_token, long rc),
566 	TP_ARGS(unit_address, process_token, rc)
567 );
568 
569 TRACE_EVENT(cxl_hcall_control_faults,
570 	TP_PROTO(u64 unit_address, u64 process_token,
571 		u64 control_mask, u64 reset_mask, unsigned long r4,
572 		long rc),
573 
574 	TP_ARGS(unit_address, process_token,
575 		control_mask, reset_mask, r4, rc),
576 
577 	TP_STRUCT__entry(
578 		__field(u64, unit_address)
579 		__field(u64, process_token)
580 		__field(u64, control_mask)
581 		__field(u64, reset_mask)
582 		__field(unsigned long, r4)
583 		__field(long, rc)
584 	),
585 
586 	TP_fast_assign(
587 		__entry->unit_address = unit_address;
588 		__entry->process_token = process_token;
589 		__entry->control_mask = control_mask;
590 		__entry->reset_mask = reset_mask;
591 		__entry->r4 = r4;
592 		__entry->rc = rc;
593 	),
594 
595 	TP_printk("unit_address=0x%016llx process_token=0x%llx "
596 		"control_mask=%#llx reset_mask=%#llx r4=%#lx rc=%li",
597 		__entry->unit_address,
598 		__entry->process_token,
599 		__entry->control_mask,
600 		__entry->reset_mask,
601 		__entry->r4,
602 		__entry->rc
603 	)
604 );
605 
606 DEFINE_EVENT(cxl_hcall_control, cxl_hcall_control_facility,
607 	TP_PROTO(u64 unit_address, char *fct, u64 p1, u64 p2, u64 p3,
608 	u64 p4, unsigned long r4, long rc),
609 	TP_ARGS(unit_address, fct, p1, p2, p3, p4, r4, rc)
610 );
611 
612 TRACE_EVENT(cxl_hcall_download_facility,
613 	TP_PROTO(u64 unit_address, char *fct, u64 list_address, u64 num,
614 	unsigned long r4, long rc),
615 
616 	TP_ARGS(unit_address, fct, list_address, num, r4, rc),
617 
618 	TP_STRUCT__entry(
619 		__field(u64, unit_address)
620 		__field(char *, fct)
621 		__field(u64, list_address)
622 		__field(u64, num)
623 		__field(unsigned long, r4)
624 		__field(long, rc)
625 	),
626 
627 	TP_fast_assign(
628 		__entry->unit_address = unit_address;
629 		__entry->fct = fct;
630 		__entry->list_address = list_address;
631 		__entry->num = num;
632 		__entry->r4 = r4;
633 		__entry->rc = rc;
634 	),
635 
636 	TP_printk("%#.16llx, %s(%#llx, %#llx), %#lx): %li",
637 		__entry->unit_address,
638 		__entry->fct,
639 		__entry->list_address,
640 		__entry->num,
641 		__entry->r4,
642 		__entry->rc
643 	)
644 );
645 
646 #endif /* _CXL_TRACE_H */
647 
648 /* This part must be outside protection */
649 #undef TRACE_INCLUDE_PATH
650 #define TRACE_INCLUDE_PATH .
651 #define TRACE_INCLUDE_FILE trace
652 #include <trace/define_trace.h>
653