1*69b23b39SCezary Rojewski /* SPDX-License-Identifier: GPL-2.0 */ 2*69b23b39SCezary Rojewski #undef TRACE_SYSTEM 3*69b23b39SCezary Rojewski #define TRACE_SYSTEM intel_avs 4*69b23b39SCezary Rojewski 5*69b23b39SCezary Rojewski #if !defined(_TRACE_INTEL_AVS_H) || defined(TRACE_HEADER_MULTI_READ) 6*69b23b39SCezary Rojewski #define _TRACE_INTEL_AVS_H 7*69b23b39SCezary Rojewski 8*69b23b39SCezary Rojewski #include <linux/types.h> 9*69b23b39SCezary Rojewski #include <linux/tracepoint.h> 10*69b23b39SCezary Rojewski 11*69b23b39SCezary Rojewski TRACE_EVENT(avs_dsp_core_op, 12*69b23b39SCezary Rojewski 13*69b23b39SCezary Rojewski TP_PROTO(unsigned int reg, unsigned int mask, const char *op, bool flag), 14*69b23b39SCezary Rojewski 15*69b23b39SCezary Rojewski TP_ARGS(reg, mask, op, flag), 16*69b23b39SCezary Rojewski 17*69b23b39SCezary Rojewski TP_STRUCT__entry( 18*69b23b39SCezary Rojewski __field(unsigned int, reg ) 19*69b23b39SCezary Rojewski __field(unsigned int, mask ) 20*69b23b39SCezary Rojewski __string(op, op ) 21*69b23b39SCezary Rojewski __field(bool, flag ) 22*69b23b39SCezary Rojewski ), 23*69b23b39SCezary Rojewski 24*69b23b39SCezary Rojewski TP_fast_assign( 25*69b23b39SCezary Rojewski __entry->reg = reg; 26*69b23b39SCezary Rojewski __entry->mask = mask; 27*69b23b39SCezary Rojewski __assign_str(op, op); 28*69b23b39SCezary Rojewski __entry->flag = flag; 29*69b23b39SCezary Rojewski ), 30*69b23b39SCezary Rojewski 31*69b23b39SCezary Rojewski TP_printk("%s: %d, core mask: 0x%X, prev state: 0x%08X", 32*69b23b39SCezary Rojewski __get_str(op), __entry->flag, __entry->mask, __entry->reg) 33*69b23b39SCezary Rojewski ); 34*69b23b39SCezary Rojewski 35*69b23b39SCezary Rojewski #ifndef __TRACE_INTEL_AVS_TRACE_HELPER 36*69b23b39SCezary Rojewski #define __TRACE_INTEL_AVS_TRACE_HELPER 37*69b23b39SCezary Rojewski 38*69b23b39SCezary Rojewski void trace_avs_msg_payload(const void *data, size_t size); 39*69b23b39SCezary Rojewski 40*69b23b39SCezary Rojewski #define trace_avs_request(msg, fwregs) \ 41*69b23b39SCezary Rojewski ({ \ 42*69b23b39SCezary Rojewski trace_avs_ipc_request_msg((msg)->header, fwregs); \ 43*69b23b39SCezary Rojewski trace_avs_msg_payload((msg)->data, (msg)->size); \ 44*69b23b39SCezary Rojewski }) 45*69b23b39SCezary Rojewski 46*69b23b39SCezary Rojewski #define trace_avs_reply(msg, fwregs) \ 47*69b23b39SCezary Rojewski ({ \ 48*69b23b39SCezary Rojewski trace_avs_ipc_reply_msg((msg)->header, fwregs); \ 49*69b23b39SCezary Rojewski trace_avs_msg_payload((msg)->data, (msg)->size); \ 50*69b23b39SCezary Rojewski }) 51*69b23b39SCezary Rojewski 52*69b23b39SCezary Rojewski #define trace_avs_notify(msg, fwregs) \ 53*69b23b39SCezary Rojewski ({ \ 54*69b23b39SCezary Rojewski trace_avs_ipc_notify_msg((msg)->header, fwregs); \ 55*69b23b39SCezary Rojewski trace_avs_msg_payload((msg)->data, (msg)->size); \ 56*69b23b39SCezary Rojewski }) 57*69b23b39SCezary Rojewski #endif 58*69b23b39SCezary Rojewski 59*69b23b39SCezary Rojewski DECLARE_EVENT_CLASS(avs_ipc_msg_hdr, 60*69b23b39SCezary Rojewski 61*69b23b39SCezary Rojewski TP_PROTO(u64 header, u64 fwregs), 62*69b23b39SCezary Rojewski 63*69b23b39SCezary Rojewski TP_ARGS(header, fwregs), 64*69b23b39SCezary Rojewski 65*69b23b39SCezary Rojewski TP_STRUCT__entry( 66*69b23b39SCezary Rojewski __field(u64, header) 67*69b23b39SCezary Rojewski __field(u64, fwregs) 68*69b23b39SCezary Rojewski ), 69*69b23b39SCezary Rojewski 70*69b23b39SCezary Rojewski TP_fast_assign( 71*69b23b39SCezary Rojewski __entry->header = header; 72*69b23b39SCezary Rojewski __entry->fwregs = fwregs; 73*69b23b39SCezary Rojewski ), 74*69b23b39SCezary Rojewski 75*69b23b39SCezary Rojewski TP_printk("primary: 0x%08X, extension: 0x%08X,\n" 76*69b23b39SCezary Rojewski "fwstatus: 0x%08X, fwerror: 0x%08X", 77*69b23b39SCezary Rojewski lower_32_bits(__entry->header), upper_32_bits(__entry->header), 78*69b23b39SCezary Rojewski lower_32_bits(__entry->fwregs), upper_32_bits(__entry->fwregs)) 79*69b23b39SCezary Rojewski ); 80*69b23b39SCezary Rojewski 81*69b23b39SCezary Rojewski DEFINE_EVENT(avs_ipc_msg_hdr, avs_ipc_request_msg, 82*69b23b39SCezary Rojewski TP_PROTO(u64 header, u64 fwregs), 83*69b23b39SCezary Rojewski TP_ARGS(header, fwregs) 84*69b23b39SCezary Rojewski ); 85*69b23b39SCezary Rojewski 86*69b23b39SCezary Rojewski DEFINE_EVENT(avs_ipc_msg_hdr, avs_ipc_reply_msg, 87*69b23b39SCezary Rojewski TP_PROTO(u64 header, u64 fwregs), 88*69b23b39SCezary Rojewski TP_ARGS(header, fwregs) 89*69b23b39SCezary Rojewski ); 90*69b23b39SCezary Rojewski 91*69b23b39SCezary Rojewski DEFINE_EVENT(avs_ipc_msg_hdr, avs_ipc_notify_msg, 92*69b23b39SCezary Rojewski TP_PROTO(u64 header, u64 fwregs), 93*69b23b39SCezary Rojewski TP_ARGS(header, fwregs) 94*69b23b39SCezary Rojewski ); 95*69b23b39SCezary Rojewski 96*69b23b39SCezary Rojewski TRACE_EVENT_CONDITION(avs_ipc_msg_payload, 97*69b23b39SCezary Rojewski 98*69b23b39SCezary Rojewski TP_PROTO(const u8 *data, size_t size, size_t offset, size_t total), 99*69b23b39SCezary Rojewski 100*69b23b39SCezary Rojewski TP_ARGS(data, size, offset, total), 101*69b23b39SCezary Rojewski 102*69b23b39SCezary Rojewski TP_CONDITION(data && size), 103*69b23b39SCezary Rojewski 104*69b23b39SCezary Rojewski TP_STRUCT__entry( 105*69b23b39SCezary Rojewski __dynamic_array(u8, buf, size ) 106*69b23b39SCezary Rojewski __field(size_t, offset ) 107*69b23b39SCezary Rojewski __field(size_t, pos ) 108*69b23b39SCezary Rojewski __field(size_t, total ) 109*69b23b39SCezary Rojewski ), 110*69b23b39SCezary Rojewski 111*69b23b39SCezary Rojewski TP_fast_assign( 112*69b23b39SCezary Rojewski memcpy(__get_dynamic_array(buf), data + offset, size); 113*69b23b39SCezary Rojewski __entry->offset = offset; 114*69b23b39SCezary Rojewski __entry->pos = offset + size; 115*69b23b39SCezary Rojewski __entry->total = total; 116*69b23b39SCezary Rojewski ), 117*69b23b39SCezary Rojewski 118*69b23b39SCezary Rojewski TP_printk("range %zu-%zu out of %zu bytes%s", 119*69b23b39SCezary Rojewski __entry->offset, __entry->pos, __entry->total, 120*69b23b39SCezary Rojewski __print_hex_dump("", DUMP_PREFIX_NONE, 16, 4, 121*69b23b39SCezary Rojewski __get_dynamic_array(buf), 122*69b23b39SCezary Rojewski __get_dynamic_array_len(buf), false)) 123*69b23b39SCezary Rojewski ); 124*69b23b39SCezary Rojewski 125*69b23b39SCezary Rojewski TRACE_EVENT(avs_d0ix, 126*69b23b39SCezary Rojewski 127*69b23b39SCezary Rojewski TP_PROTO(const char *op, bool proceed, u64 header), 128*69b23b39SCezary Rojewski 129*69b23b39SCezary Rojewski TP_ARGS(op, proceed, header), 130*69b23b39SCezary Rojewski 131*69b23b39SCezary Rojewski TP_STRUCT__entry( 132*69b23b39SCezary Rojewski __string(op, op ) 133*69b23b39SCezary Rojewski __field(bool, proceed ) 134*69b23b39SCezary Rojewski __field(u64, header ) 135*69b23b39SCezary Rojewski ), 136*69b23b39SCezary Rojewski 137*69b23b39SCezary Rojewski TP_fast_assign( 138*69b23b39SCezary Rojewski __assign_str(op, op); 139*69b23b39SCezary Rojewski __entry->proceed = proceed; 140*69b23b39SCezary Rojewski __entry->header = header; 141*69b23b39SCezary Rojewski ), 142*69b23b39SCezary Rojewski 143*69b23b39SCezary Rojewski TP_printk("%s%s for request: 0x%08X 0x%08X", 144*69b23b39SCezary Rojewski __entry->proceed ? "" : "ignore ", __get_str(op), 145*69b23b39SCezary Rojewski lower_32_bits(__entry->header), upper_32_bits(__entry->header)) 146*69b23b39SCezary Rojewski ); 147*69b23b39SCezary Rojewski 148*69b23b39SCezary Rojewski #endif /* _TRACE_INTEL_AVS_H */ 149*69b23b39SCezary Rojewski 150*69b23b39SCezary Rojewski /* This part must be outside protection */ 151*69b23b39SCezary Rojewski #undef TRACE_INCLUDE_PATH 152*69b23b39SCezary Rojewski #define TRACE_INCLUDE_PATH . 153*69b23b39SCezary Rojewski #define TRACE_INCLUDE_FILE trace 154*69b23b39SCezary Rojewski #include <trace/define_trace.h> 155