1*6edb685aSTomi Valkeinen /* SPDX-License-Identifier: GPL-2.0 */ 2*6edb685aSTomi Valkeinen /* 3*6edb685aSTomi Valkeinen * Copyright (c) 2024 Raspberry Pi Ltd. 4*6edb685aSTomi Valkeinen * Copyright (c) 2024 Ideas on Board Oy 5*6edb685aSTomi Valkeinen */ 6*6edb685aSTomi Valkeinen 7*6edb685aSTomi Valkeinen #undef TRACE_SYSTEM 8*6edb685aSTomi Valkeinen #define TRACE_SYSTEM cfe 9*6edb685aSTomi Valkeinen 10*6edb685aSTomi Valkeinen #if !defined(_CFE_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 11*6edb685aSTomi Valkeinen #define _CFE_TRACE_H 12*6edb685aSTomi Valkeinen 13*6edb685aSTomi Valkeinen #include <linux/tracepoint.h> 14*6edb685aSTomi Valkeinen #include <media/videobuf2-v4l2.h> 15*6edb685aSTomi Valkeinen 16*6edb685aSTomi Valkeinen TRACE_EVENT(cfe_return_buffer, 17*6edb685aSTomi Valkeinen TP_PROTO(u32 node_id, u32 buf_idx, u32 queue_id), 18*6edb685aSTomi Valkeinen TP_ARGS(node_id, buf_idx, queue_id), 19*6edb685aSTomi Valkeinen TP_STRUCT__entry( 20*6edb685aSTomi Valkeinen __field(u32, node_id) 21*6edb685aSTomi Valkeinen __field(u32, buf_idx) 22*6edb685aSTomi Valkeinen __field(u32, queue_id) 23*6edb685aSTomi Valkeinen ), 24*6edb685aSTomi Valkeinen TP_fast_assign( 25*6edb685aSTomi Valkeinen __entry->node_id = node_id; 26*6edb685aSTomi Valkeinen __entry->buf_idx = buf_idx; 27*6edb685aSTomi Valkeinen __entry->queue_id = queue_id; 28*6edb685aSTomi Valkeinen ), 29*6edb685aSTomi Valkeinen TP_printk("node=%u buf=%u, queue=%u", __entry->node_id, 30*6edb685aSTomi Valkeinen __entry->buf_idx, __entry->queue_id) 31*6edb685aSTomi Valkeinen ); 32*6edb685aSTomi Valkeinen 33*6edb685aSTomi Valkeinen DECLARE_EVENT_CLASS(cfe_buffer_template, 34*6edb685aSTomi Valkeinen TP_PROTO(u32 node_id, struct vb2_buffer *buf), 35*6edb685aSTomi Valkeinen TP_ARGS(node_id, buf), 36*6edb685aSTomi Valkeinen TP_STRUCT__entry( 37*6edb685aSTomi Valkeinen __field(u32, node_id) 38*6edb685aSTomi Valkeinen __field(u32, buf_idx) 39*6edb685aSTomi Valkeinen ), 40*6edb685aSTomi Valkeinen TP_fast_assign( 41*6edb685aSTomi Valkeinen __entry->node_id = node_id; 42*6edb685aSTomi Valkeinen __entry->buf_idx = buf->index; 43*6edb685aSTomi Valkeinen ), 44*6edb685aSTomi Valkeinen TP_printk("node=%u buf=%u", __entry->node_id, __entry->buf_idx) 45*6edb685aSTomi Valkeinen ); 46*6edb685aSTomi Valkeinen 47*6edb685aSTomi Valkeinen DEFINE_EVENT(cfe_buffer_template, cfe_buffer_prepare, 48*6edb685aSTomi Valkeinen TP_PROTO(u32 node_id, struct vb2_buffer *buf), 49*6edb685aSTomi Valkeinen TP_ARGS(node_id, buf)); 50*6edb685aSTomi Valkeinen 51*6edb685aSTomi Valkeinen TRACE_EVENT(cfe_buffer_queue, 52*6edb685aSTomi Valkeinen TP_PROTO(u32 node_id, struct vb2_buffer *buf, bool schedule_now), 53*6edb685aSTomi Valkeinen TP_ARGS(node_id, buf, schedule_now), 54*6edb685aSTomi Valkeinen TP_STRUCT__entry( 55*6edb685aSTomi Valkeinen __field(u32, node_id) 56*6edb685aSTomi Valkeinen __field(u32, buf_idx) 57*6edb685aSTomi Valkeinen __field(bool, schedule_now) 58*6edb685aSTomi Valkeinen ), 59*6edb685aSTomi Valkeinen TP_fast_assign( 60*6edb685aSTomi Valkeinen __entry->node_id = node_id; 61*6edb685aSTomi Valkeinen __entry->buf_idx = buf->index; 62*6edb685aSTomi Valkeinen __entry->schedule_now = schedule_now; 63*6edb685aSTomi Valkeinen ), 64*6edb685aSTomi Valkeinen TP_printk("node=%u buf=%u%s", __entry->node_id, __entry->buf_idx, 65*6edb685aSTomi Valkeinen __entry->schedule_now ? " schedule immediately" : "") 66*6edb685aSTomi Valkeinen ); 67*6edb685aSTomi Valkeinen 68*6edb685aSTomi Valkeinen DEFINE_EVENT(cfe_buffer_template, cfe_csi2_schedule, 69*6edb685aSTomi Valkeinen TP_PROTO(u32 node_id, struct vb2_buffer *buf), 70*6edb685aSTomi Valkeinen TP_ARGS(node_id, buf)); 71*6edb685aSTomi Valkeinen 72*6edb685aSTomi Valkeinen DEFINE_EVENT(cfe_buffer_template, cfe_fe_schedule, 73*6edb685aSTomi Valkeinen TP_PROTO(u32 node_id, struct vb2_buffer *buf), 74*6edb685aSTomi Valkeinen TP_ARGS(node_id, buf)); 75*6edb685aSTomi Valkeinen 76*6edb685aSTomi Valkeinen TRACE_EVENT(cfe_buffer_complete, 77*6edb685aSTomi Valkeinen TP_PROTO(u32 node_id, struct vb2_v4l2_buffer *buf), 78*6edb685aSTomi Valkeinen TP_ARGS(node_id, buf), 79*6edb685aSTomi Valkeinen TP_STRUCT__entry( 80*6edb685aSTomi Valkeinen __field(u32, node_id) 81*6edb685aSTomi Valkeinen __field(u32, buf_idx) 82*6edb685aSTomi Valkeinen __field(u32, seq) 83*6edb685aSTomi Valkeinen __field(u64, ts) 84*6edb685aSTomi Valkeinen ), 85*6edb685aSTomi Valkeinen TP_fast_assign( 86*6edb685aSTomi Valkeinen __entry->node_id = node_id; 87*6edb685aSTomi Valkeinen __entry->buf_idx = buf->vb2_buf.index; 88*6edb685aSTomi Valkeinen __entry->seq = buf->sequence; 89*6edb685aSTomi Valkeinen __entry->ts = buf->vb2_buf.timestamp; 90*6edb685aSTomi Valkeinen ), 91*6edb685aSTomi Valkeinen TP_printk("node=%u buf=%u seq=%u ts=%llu", __entry->node_id, 92*6edb685aSTomi Valkeinen __entry->buf_idx, __entry->seq, __entry->ts) 93*6edb685aSTomi Valkeinen ); 94*6edb685aSTomi Valkeinen 95*6edb685aSTomi Valkeinen TRACE_EVENT(cfe_frame_start, 96*6edb685aSTomi Valkeinen TP_PROTO(u32 node_id, u32 fs_count), 97*6edb685aSTomi Valkeinen TP_ARGS(node_id, fs_count), 98*6edb685aSTomi Valkeinen TP_STRUCT__entry( 99*6edb685aSTomi Valkeinen __field(u32, node_id) 100*6edb685aSTomi Valkeinen __field(u32, fs_count) 101*6edb685aSTomi Valkeinen ), 102*6edb685aSTomi Valkeinen TP_fast_assign( 103*6edb685aSTomi Valkeinen __entry->node_id = node_id; 104*6edb685aSTomi Valkeinen __entry->fs_count = fs_count; 105*6edb685aSTomi Valkeinen ), 106*6edb685aSTomi Valkeinen TP_printk("node=%u fs_count=%u", __entry->node_id, __entry->fs_count) 107*6edb685aSTomi Valkeinen ); 108*6edb685aSTomi Valkeinen 109*6edb685aSTomi Valkeinen TRACE_EVENT(cfe_frame_end, 110*6edb685aSTomi Valkeinen TP_PROTO(u32 node_id, u32 fs_count), 111*6edb685aSTomi Valkeinen TP_ARGS(node_id, fs_count), 112*6edb685aSTomi Valkeinen TP_STRUCT__entry( 113*6edb685aSTomi Valkeinen __field(u32, node_id) 114*6edb685aSTomi Valkeinen __field(u32, fs_count) 115*6edb685aSTomi Valkeinen ), 116*6edb685aSTomi Valkeinen TP_fast_assign( 117*6edb685aSTomi Valkeinen __entry->node_id = node_id; 118*6edb685aSTomi Valkeinen __entry->fs_count = fs_count; 119*6edb685aSTomi Valkeinen ), 120*6edb685aSTomi Valkeinen TP_printk("node=%u fs_count=%u", __entry->node_id, __entry->fs_count) 121*6edb685aSTomi Valkeinen ); 122*6edb685aSTomi Valkeinen 123*6edb685aSTomi Valkeinen TRACE_EVENT(cfe_prepare_next_job, 124*6edb685aSTomi Valkeinen TP_PROTO(bool fe_enabled), 125*6edb685aSTomi Valkeinen TP_ARGS(fe_enabled), 126*6edb685aSTomi Valkeinen TP_STRUCT__entry( 127*6edb685aSTomi Valkeinen __field(bool, fe_enabled) 128*6edb685aSTomi Valkeinen ), 129*6edb685aSTomi Valkeinen TP_fast_assign( 130*6edb685aSTomi Valkeinen __entry->fe_enabled = fe_enabled; 131*6edb685aSTomi Valkeinen ), 132*6edb685aSTomi Valkeinen TP_printk("fe_enabled=%u", __entry->fe_enabled) 133*6edb685aSTomi Valkeinen ); 134*6edb685aSTomi Valkeinen 135*6edb685aSTomi Valkeinen /* These are copied from csi2.c */ 136*6edb685aSTomi Valkeinen #define CSI2_STATUS_IRQ_FS(x) (BIT(0) << (x)) 137*6edb685aSTomi Valkeinen #define CSI2_STATUS_IRQ_FE(x) (BIT(4) << (x)) 138*6edb685aSTomi Valkeinen #define CSI2_STATUS_IRQ_FE_ACK(x) (BIT(8) << (x)) 139*6edb685aSTomi Valkeinen #define CSI2_STATUS_IRQ_LE(x) (BIT(12) << (x)) 140*6edb685aSTomi Valkeinen #define CSI2_STATUS_IRQ_LE_ACK(x) (BIT(16) << (x)) 141*6edb685aSTomi Valkeinen 142*6edb685aSTomi Valkeinen TRACE_EVENT(csi2_irq, 143*6edb685aSTomi Valkeinen TP_PROTO(u32 channel, u32 status, u32 dbg), 144*6edb685aSTomi Valkeinen TP_ARGS(channel, status, dbg), 145*6edb685aSTomi Valkeinen TP_STRUCT__entry( 146*6edb685aSTomi Valkeinen __field(u32, channel) 147*6edb685aSTomi Valkeinen __field(u32, status) 148*6edb685aSTomi Valkeinen __field(u32, dbg) 149*6edb685aSTomi Valkeinen ), 150*6edb685aSTomi Valkeinen TP_fast_assign( 151*6edb685aSTomi Valkeinen __entry->channel = channel; 152*6edb685aSTomi Valkeinen __entry->status = status; 153*6edb685aSTomi Valkeinen __entry->dbg = dbg; 154*6edb685aSTomi Valkeinen ), 155*6edb685aSTomi Valkeinen TP_printk("ch=%u flags=[ %s%s%s%s%s] frame=%u line=%u\n", 156*6edb685aSTomi Valkeinen __entry->channel, 157*6edb685aSTomi Valkeinen (__entry->status & CSI2_STATUS_IRQ_FS(__entry->channel)) ? 158*6edb685aSTomi Valkeinen "FS " : "", 159*6edb685aSTomi Valkeinen (__entry->status & CSI2_STATUS_IRQ_FE(__entry->channel)) ? 160*6edb685aSTomi Valkeinen "FE " : "", 161*6edb685aSTomi Valkeinen (__entry->status & CSI2_STATUS_IRQ_FE_ACK(__entry->channel)) ? 162*6edb685aSTomi Valkeinen "FE_ACK " : "", 163*6edb685aSTomi Valkeinen (__entry->status & CSI2_STATUS_IRQ_LE(__entry->channel)) ? 164*6edb685aSTomi Valkeinen "LE " : "", 165*6edb685aSTomi Valkeinen (__entry->status & CSI2_STATUS_IRQ_LE_ACK(__entry->channel)) ? 166*6edb685aSTomi Valkeinen "LE_ACK " : "", 167*6edb685aSTomi Valkeinen __entry->dbg >> 16, __entry->dbg & 0xffff) 168*6edb685aSTomi Valkeinen ); 169*6edb685aSTomi Valkeinen 170*6edb685aSTomi Valkeinen TRACE_EVENT(fe_irq, 171*6edb685aSTomi Valkeinen TP_PROTO(u32 status, u32 output_status, u32 frame_status, 172*6edb685aSTomi Valkeinen u32 error_status, u32 int_status), 173*6edb685aSTomi Valkeinen TP_ARGS(status, output_status, frame_status, error_status, int_status), 174*6edb685aSTomi Valkeinen TP_STRUCT__entry( 175*6edb685aSTomi Valkeinen __field(u32, status) 176*6edb685aSTomi Valkeinen __field(u32, output_status) 177*6edb685aSTomi Valkeinen __field(u32, frame_status) 178*6edb685aSTomi Valkeinen __field(u32, error_status) 179*6edb685aSTomi Valkeinen __field(u32, int_status) 180*6edb685aSTomi Valkeinen ), 181*6edb685aSTomi Valkeinen TP_fast_assign( 182*6edb685aSTomi Valkeinen __entry->status = status; 183*6edb685aSTomi Valkeinen __entry->output_status = output_status; 184*6edb685aSTomi Valkeinen __entry->frame_status = frame_status; 185*6edb685aSTomi Valkeinen __entry->error_status = error_status; 186*6edb685aSTomi Valkeinen __entry->int_status = int_status; 187*6edb685aSTomi Valkeinen ), 188*6edb685aSTomi Valkeinen TP_printk("status 0x%x out_status 0x%x frame_status 0x%x error_status 0x%x int_status 0x%x", 189*6edb685aSTomi Valkeinen __entry->status, 190*6edb685aSTomi Valkeinen __entry->output_status, 191*6edb685aSTomi Valkeinen __entry->frame_status, 192*6edb685aSTomi Valkeinen __entry->error_status, 193*6edb685aSTomi Valkeinen __entry->int_status) 194*6edb685aSTomi Valkeinen ); 195*6edb685aSTomi Valkeinen 196*6edb685aSTomi Valkeinen #endif /* _CFE_TRACE_H */ 197*6edb685aSTomi Valkeinen 198*6edb685aSTomi Valkeinen /* This part must be outside protection */ 199*6edb685aSTomi Valkeinen #undef TRACE_INCLUDE_PATH 200*6edb685aSTomi Valkeinen #define TRACE_INCLUDE_PATH . 201*6edb685aSTomi Valkeinen #define TRACE_INCLUDE_FILE ../../drivers/media/platform/raspberrypi/rp1-cfe/cfe-trace 202*6edb685aSTomi Valkeinen #include <trace/define_trace.h> 203