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
58DECLARE_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
83TRACE_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
119DEFINE_EVENT(cxl_pe_class, cxl_detach,
120	TP_PROTO(struct cxl_context *ctx),
121	TP_ARGS(ctx)
122);
123
124TRACE_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
157TRACE_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
190TRACE_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
217TRACE_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
244TRACE_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
277TRACE_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
307TRACE_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
334TRACE_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
364DECLARE_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
388DECLARE_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
415DEFINE_EVENT(cxl_afu_psl_ctrl, cxl_afu_ctrl,
416	TP_PROTO(struct cxl_afu *afu, u64 cmd),
417	TP_ARGS(afu, cmd)
418);
419
420DEFINE_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
425DEFINE_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
436DEFINE_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
448DEFINE_EVENT(cxl_pe_class, cxl_slbia,
449	TP_PROTO(struct cxl_context *ctx),
450	TP_ARGS(ctx)
451);
452
453#endif /* _CXL_TRACE_H */
454
455/* This part must be outside protection */
456#undef TRACE_INCLUDE_PATH
457#define TRACE_INCLUDE_PATH .
458#define TRACE_INCLUDE_FILE trace
459#include <trace/define_trace.h>
460