Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

cxl: Add tracepoints

This patch adds tracepoints throughout the cxl driver, which can provide
insight into:

- Context lifetimes
- Commands sent to the PSL and AFU and their completion status
- Segment and page table misses and their resolution
- PSL and AFU interrupts
- slbia calls from the powerpc copro_fault code

These tracepoints are mostly intended to aid in debugging (particularly
for new AFU designs), and may be useful standalone or in conjunction
with hardware traces collected by the PSL (read out via the trace
interface in debugfs) and AFUs.

Signed-off-by: Ian Munsie <imunsie@au1.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

authored by

Ian Munsie and committed by
Michael Ellerman
9bcf28cd d3383aaa

+520 -9
+4 -1
drivers/misc/cxl/Makefile
··· 1 - cxl-y += main.o file.o irq.o fault.o native.o context.o sysfs.o debugfs.o pci.o 1 + cxl-y += main.o file.o irq.o fault.o native.o context.o sysfs.o debugfs.o pci.o trace.o 2 2 obj-$(CONFIG_CXL) += cxl.o 3 3 obj-$(CONFIG_CXL_BASE) += base.o 4 + 5 + # For tracepoints to include our trace.h from tracepoint infrastructure: 6 + CFLAGS_trace.o := -I$(src)
+5
drivers/misc/cxl/fault.c
··· 20 20 #include <asm/mmu.h> 21 21 22 22 #include "cxl.h" 23 + #include "trace.h" 23 24 24 25 static bool sste_matches(struct cxl_sste *sste, struct copro_slb *slb) 25 26 { ··· 76 75 77 76 pr_devel("CXL Populating SST[%li]: %#llx %#llx\n", 78 77 sste - ctx->sstp, slb->vsid, slb->esid); 78 + trace_cxl_ste_write(ctx, sste - ctx->sstp, slb->esid, slb->vsid); 79 79 80 80 sste->vsid_data = cpu_to_be64(slb->vsid); 81 81 sste->esid_data = cpu_to_be64(slb->esid); ··· 118 116 int rc; 119 117 120 118 pr_devel("CXL interrupt: Segment fault pe: %i ea: %#llx\n", ctx->pe, ea); 119 + trace_cxl_ste_miss(ctx, ea); 121 120 122 121 if ((rc = cxl_fault_segment(ctx, mm, ea))) 123 122 cxl_ack_ae(ctx); ··· 137 134 unsigned flt = 0; 138 135 int result; 139 136 unsigned long access, flags, inv_flags = 0; 137 + 138 + trace_cxl_pte_miss(ctx, dsisr, dar); 140 139 141 140 if ((result = copro_handle_mm_fault(mm, dar, dsisr, &flt))) { 142 141 pr_devel("copro_handle_mm_fault failed: %#x\n", result);
+3
drivers/misc/cxl/file.c
··· 23 23 #include <asm/copro.h> 24 24 25 25 #include "cxl.h" 26 + #include "trace.h" 26 27 27 28 #define CXL_NUM_MINORS 256 /* Total to reserve */ 28 29 #define CXL_DEV_MINORS 13 /* 1 control + 4 AFUs * 3 (dedicated/master/shared) */ ··· 184 183 * that performs this ioctl and not the process that opened the file. 185 184 */ 186 185 ctx->pid = get_pid(get_task_pid(current, PIDTYPE_PID)); 186 + 187 + trace_cxl_attach(ctx, work.work_element_descriptor, work.num_interrupts, amr); 187 188 188 189 if ((rc = cxl_attach_process(ctx, false, work.work_element_descriptor, 189 190 amr))) {
+4
drivers/misc/cxl/irq.c
··· 17 17 #include <misc/cxl.h> 18 18 19 19 #include "cxl.h" 20 + #include "trace.h" 20 21 21 22 /* XXX: This is implementation specific */ 22 23 static irqreturn_t handle_psl_slice_error(struct cxl_context *ctx, u64 dsisr, u64 errstat) ··· 100 99 101 100 dsisr = irq_info->dsisr; 102 101 dar = irq_info->dar; 102 + 103 + trace_cxl_psl_irq(ctx, irq, dsisr, dar); 103 104 104 105 pr_devel("CXL interrupt %i for afu pe: %i DSISR: %#llx DAR: %#llx\n", irq, ctx->pe, dsisr, dar); 105 106 ··· 240 237 return IRQ_HANDLED; 241 238 } 242 239 240 + trace_cxl_afu_irq(ctx, afu_irq, irq, hwirq); 243 241 pr_devel("Received AFU interrupt %i for pe: %i (virq %i hwirq %lx)\n", 244 242 afu_irq, ctx->pe, irq, hwirq); 245 243
+2
drivers/misc/cxl/main.c
··· 23 23 #include <misc/cxl.h> 24 24 25 25 #include "cxl.h" 26 + #include "trace.h" 26 27 27 28 static DEFINE_SPINLOCK(adapter_idr_lock); 28 29 static DEFINE_IDR(cxl_adapter_idr); ··· 49 48 ctx->afu->adapter->adapter_num, ctx->afu->slice, ctx->pe); 50 49 51 50 spin_lock_irqsave(&ctx->sste_lock, flags); 51 + trace_cxl_slbia(ctx); 52 52 memset(ctx->sstp, 0, ctx->sst_size); 53 53 spin_unlock_irqrestore(&ctx->sste_lock, flags); 54 54 mb();
+30 -8
drivers/misc/cxl/native.c
··· 18 18 #include <misc/cxl.h> 19 19 20 20 #include "cxl.h" 21 + #include "trace.h" 21 22 22 23 static int afu_control(struct cxl_afu *afu, u64 command, 23 24 u64 result, u64 mask, bool enabled) 24 25 { 25 26 u64 AFU_Cntl = cxl_p2n_read(afu, CXL_AFU_Cntl_An); 26 27 unsigned long timeout = jiffies + (HZ * CXL_TIMEOUT); 28 + int rc = 0; 27 29 28 30 spin_lock(&afu->afu_cntl_lock); 29 31 pr_devel("AFU command starting: %llx\n", command); 32 + 33 + trace_cxl_afu_ctrl(afu, command); 30 34 31 35 cxl_p2n_write(afu, CXL_AFU_Cntl_An, AFU_Cntl | command); 32 36 ··· 38 34 while ((AFU_Cntl & mask) != result) { 39 35 if (time_after_eq(jiffies, timeout)) { 40 36 dev_warn(&afu->dev, "WARNING: AFU control timed out!\n"); 41 - spin_unlock(&afu->afu_cntl_lock); 42 - return -EBUSY; 37 + rc = -EBUSY; 38 + goto out; 43 39 } 44 40 pr_devel_ratelimited("AFU control... (0x%.16llx)\n", 45 41 AFU_Cntl | command); ··· 48 44 }; 49 45 pr_devel("AFU command complete: %llx\n", command); 50 46 afu->enabled = enabled; 47 + out: 48 + trace_cxl_afu_ctrl_done(afu, command, rc); 51 49 spin_unlock(&afu->afu_cntl_lock); 52 50 53 - return 0; 51 + return rc; 54 52 } 55 53 56 54 static int afu_enable(struct cxl_afu *afu) ··· 97 91 u64 dsisr, dar; 98 92 u64 start, end; 99 93 unsigned long timeout = jiffies + (HZ * CXL_TIMEOUT); 94 + int rc = 0; 95 + 96 + trace_cxl_psl_ctrl(afu, CXL_PSL_SCNTL_An_Pc); 100 97 101 98 pr_devel("PSL purge request\n"); 102 99 ··· 116 107 == CXL_PSL_SCNTL_An_Ps_Pending) { 117 108 if (time_after_eq(jiffies, timeout)) { 118 109 dev_warn(&afu->dev, "WARNING: PSL Purge timed out!\n"); 119 - return -EBUSY; 110 + rc = -EBUSY; 111 + goto out; 120 112 } 121 113 dsisr = cxl_p2n_read(afu, CXL_PSL_DSISR_An); 122 114 pr_devel_ratelimited("PSL purging... PSL_CNTL: 0x%.16llx PSL_DSISR: 0x%.16llx\n", PSL_CNTL, dsisr); ··· 138 128 139 129 cxl_p1n_write(afu, CXL_PSL_SCNTL_An, 140 130 PSL_CNTL & ~CXL_PSL_SCNTL_An_Pc); 141 - return 0; 131 + out: 132 + trace_cxl_psl_ctrl_done(afu, CXL_PSL_SCNTL_An_Pc, rc); 133 + return rc; 142 134 } 143 135 144 136 static int spa_max_procs(int spa_size) ··· 291 279 { 292 280 u64 state; 293 281 unsigned long timeout = jiffies + (HZ * CXL_TIMEOUT); 282 + int rc = 0; 283 + 284 + trace_cxl_llcmd(ctx, cmd); 294 285 295 286 WARN_ON(!ctx->afu->enabled); 296 287 ··· 305 290 while (1) { 306 291 if (time_after_eq(jiffies, timeout)) { 307 292 dev_warn(&ctx->afu->dev, "WARNING: Process Element Command timed out!\n"); 308 - return -EBUSY; 293 + rc = -EBUSY; 294 + goto out; 309 295 } 310 296 state = be64_to_cpup(ctx->afu->sw_command_status); 311 297 if (state == ~0ULL) { 312 298 pr_err("cxl: Error adding process element to AFU\n"); 313 - return -1; 299 + rc = -1; 300 + goto out; 314 301 } 315 302 if ((state & (CXL_SPA_SW_CMD_MASK | CXL_SPA_SW_STATE_MASK | CXL_SPA_SW_LINK_MASK)) == 316 303 (cmd | (cmd >> 16) | ctx->pe)) ··· 327 310 schedule(); 328 311 329 312 } 330 - return 0; 313 + out: 314 + trace_cxl_llcmd_done(ctx, cmd, rc); 315 + return rc; 331 316 } 332 317 333 318 static int add_process_element(struct cxl_context *ctx) ··· 649 630 650 631 int cxl_detach_process(struct cxl_context *ctx) 651 632 { 633 + trace_cxl_detach(ctx); 634 + 652 635 if (ctx->afu->current_mode == CXL_MODE_DEDICATED) 653 636 return detach_process_native_dedicated(ctx); 654 637 ··· 689 668 690 669 int cxl_ack_irq(struct cxl_context *ctx, u64 tfc, u64 psl_reset_mask) 691 670 { 671 + trace_cxl_psl_irq_ack(ctx, tfc); 692 672 if (tfc) 693 673 cxl_p2n_write(ctx->afu, CXL_PSL_TFC_An, tfc); 694 674 if (psl_reset_mask)
+13
drivers/misc/cxl/trace.c
··· 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 + #ifndef __CHECKER__ 11 + #define CREATE_TRACE_POINTS 12 + #include "trace.h" 13 + #endif
+459
drivers/misc/cxl/trace.h
··· 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%.16llx 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%.16llx", 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%.16llx", 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%.16llx V=0x%.16llx", 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%.16llx", 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 + #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>