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