1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #undef TRACE_SYSTEM 7*4882a593Smuzhiyun #define TRACE_SYSTEM ufs 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ) 10*4882a593Smuzhiyun #define _TRACE_UFS_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/tracepoint.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define str_opcode(opcode) \ 15*4882a593Smuzhiyun __print_symbolic(opcode, \ 16*4882a593Smuzhiyun { WRITE_16, "WRITE_16" }, \ 17*4882a593Smuzhiyun { WRITE_10, "WRITE_10" }, \ 18*4882a593Smuzhiyun { READ_16, "READ_16" }, \ 19*4882a593Smuzhiyun { READ_10, "READ_10" }, \ 20*4882a593Smuzhiyun { SYNCHRONIZE_CACHE, "SYNC" }, \ 21*4882a593Smuzhiyun { UNMAP, "UNMAP" }) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define UFS_LINK_STATES \ 24*4882a593Smuzhiyun EM(UIC_LINK_OFF_STATE) \ 25*4882a593Smuzhiyun EM(UIC_LINK_ACTIVE_STATE) \ 26*4882a593Smuzhiyun EMe(UIC_LINK_HIBERN8_STATE) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define UFS_PWR_MODES \ 29*4882a593Smuzhiyun EM(UFS_ACTIVE_PWR_MODE) \ 30*4882a593Smuzhiyun EM(UFS_SLEEP_PWR_MODE) \ 31*4882a593Smuzhiyun EMe(UFS_POWERDOWN_PWR_MODE) 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #define UFSCHD_CLK_GATING_STATES \ 34*4882a593Smuzhiyun EM(CLKS_OFF) \ 35*4882a593Smuzhiyun EM(CLKS_ON) \ 36*4882a593Smuzhiyun EM(REQ_CLKS_OFF) \ 37*4882a593Smuzhiyun EMe(REQ_CLKS_ON) 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* Enums require being exported to userspace, for user tool parsing */ 40*4882a593Smuzhiyun #undef EM 41*4882a593Smuzhiyun #undef EMe 42*4882a593Smuzhiyun #define EM(a) TRACE_DEFINE_ENUM(a); 43*4882a593Smuzhiyun #define EMe(a) TRACE_DEFINE_ENUM(a); 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun UFS_LINK_STATES; 46*4882a593Smuzhiyun UFS_PWR_MODES; 47*4882a593Smuzhiyun UFSCHD_CLK_GATING_STATES; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* 50*4882a593Smuzhiyun * Now redefine the EM() and EMe() macros to map the enums to the strings 51*4882a593Smuzhiyun * that will be printed in the output. 52*4882a593Smuzhiyun */ 53*4882a593Smuzhiyun #undef EM 54*4882a593Smuzhiyun #undef EMe 55*4882a593Smuzhiyun #define EM(a) { a, #a }, 56*4882a593Smuzhiyun #define EMe(a) { a, #a } 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun TRACE_EVENT(ufshcd_clk_gating, 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun TP_PROTO(const char *dev_name, int state), 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun TP_ARGS(dev_name, state), 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun TP_STRUCT__entry( 65*4882a593Smuzhiyun __string(dev_name, dev_name) 66*4882a593Smuzhiyun __field(int, state) 67*4882a593Smuzhiyun ), 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun TP_fast_assign( 70*4882a593Smuzhiyun __assign_str(dev_name, dev_name); 71*4882a593Smuzhiyun __entry->state = state; 72*4882a593Smuzhiyun ), 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun TP_printk("%s: gating state changed to %s", 75*4882a593Smuzhiyun __get_str(dev_name), 76*4882a593Smuzhiyun __print_symbolic(__entry->state, UFSCHD_CLK_GATING_STATES)) 77*4882a593Smuzhiyun ); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun TRACE_EVENT(ufshcd_clk_scaling, 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun TP_PROTO(const char *dev_name, const char *state, const char *clk, 82*4882a593Smuzhiyun u32 prev_state, u32 curr_state), 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun TP_ARGS(dev_name, state, clk, prev_state, curr_state), 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun TP_STRUCT__entry( 87*4882a593Smuzhiyun __string(dev_name, dev_name) 88*4882a593Smuzhiyun __string(state, state) 89*4882a593Smuzhiyun __string(clk, clk) 90*4882a593Smuzhiyun __field(u32, prev_state) 91*4882a593Smuzhiyun __field(u32, curr_state) 92*4882a593Smuzhiyun ), 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun TP_fast_assign( 95*4882a593Smuzhiyun __assign_str(dev_name, dev_name); 96*4882a593Smuzhiyun __assign_str(state, state); 97*4882a593Smuzhiyun __assign_str(clk, clk); 98*4882a593Smuzhiyun __entry->prev_state = prev_state; 99*4882a593Smuzhiyun __entry->curr_state = curr_state; 100*4882a593Smuzhiyun ), 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun TP_printk("%s: %s %s from %u to %u Hz", 103*4882a593Smuzhiyun __get_str(dev_name), __get_str(state), __get_str(clk), 104*4882a593Smuzhiyun __entry->prev_state, __entry->curr_state) 105*4882a593Smuzhiyun ); 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun TRACE_EVENT(ufshcd_auto_bkops_state, 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun TP_PROTO(const char *dev_name, const char *state), 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun TP_ARGS(dev_name, state), 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun TP_STRUCT__entry( 114*4882a593Smuzhiyun __string(dev_name, dev_name) 115*4882a593Smuzhiyun __string(state, state) 116*4882a593Smuzhiyun ), 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun TP_fast_assign( 119*4882a593Smuzhiyun __assign_str(dev_name, dev_name); 120*4882a593Smuzhiyun __assign_str(state, state); 121*4882a593Smuzhiyun ), 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun TP_printk("%s: auto bkops - %s", 124*4882a593Smuzhiyun __get_str(dev_name), __get_str(state)) 125*4882a593Smuzhiyun ); 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun DECLARE_EVENT_CLASS(ufshcd_profiling_template, 128*4882a593Smuzhiyun TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, 129*4882a593Smuzhiyun int err), 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun TP_ARGS(dev_name, profile_info, time_us, err), 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun TP_STRUCT__entry( 134*4882a593Smuzhiyun __string(dev_name, dev_name) 135*4882a593Smuzhiyun __string(profile_info, profile_info) 136*4882a593Smuzhiyun __field(s64, time_us) 137*4882a593Smuzhiyun __field(int, err) 138*4882a593Smuzhiyun ), 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun TP_fast_assign( 141*4882a593Smuzhiyun __assign_str(dev_name, dev_name); 142*4882a593Smuzhiyun __assign_str(profile_info, profile_info); 143*4882a593Smuzhiyun __entry->time_us = time_us; 144*4882a593Smuzhiyun __entry->err = err; 145*4882a593Smuzhiyun ), 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun TP_printk("%s: %s: took %lld usecs, err %d", 148*4882a593Smuzhiyun __get_str(dev_name), __get_str(profile_info), 149*4882a593Smuzhiyun __entry->time_us, __entry->err) 150*4882a593Smuzhiyun ); 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_hibern8, 153*4882a593Smuzhiyun TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, 154*4882a593Smuzhiyun int err), 155*4882a593Smuzhiyun TP_ARGS(dev_name, profile_info, time_us, err)); 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_gating, 158*4882a593Smuzhiyun TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, 159*4882a593Smuzhiyun int err), 160*4882a593Smuzhiyun TP_ARGS(dev_name, profile_info, time_us, err)); 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_scaling, 163*4882a593Smuzhiyun TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, 164*4882a593Smuzhiyun int err), 165*4882a593Smuzhiyun TP_ARGS(dev_name, profile_info, time_us, err)); 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun DECLARE_EVENT_CLASS(ufshcd_template, 168*4882a593Smuzhiyun TP_PROTO(const char *dev_name, int err, s64 usecs, 169*4882a593Smuzhiyun int dev_state, int link_state), 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun TP_ARGS(dev_name, err, usecs, dev_state, link_state), 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun TP_STRUCT__entry( 174*4882a593Smuzhiyun __field(s64, usecs) 175*4882a593Smuzhiyun __field(int, err) 176*4882a593Smuzhiyun __string(dev_name, dev_name) 177*4882a593Smuzhiyun __field(int, dev_state) 178*4882a593Smuzhiyun __field(int, link_state) 179*4882a593Smuzhiyun ), 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun TP_fast_assign( 182*4882a593Smuzhiyun __entry->usecs = usecs; 183*4882a593Smuzhiyun __entry->err = err; 184*4882a593Smuzhiyun __assign_str(dev_name, dev_name); 185*4882a593Smuzhiyun __entry->dev_state = dev_state; 186*4882a593Smuzhiyun __entry->link_state = link_state; 187*4882a593Smuzhiyun ), 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun TP_printk( 190*4882a593Smuzhiyun "%s: took %lld usecs, dev_state: %s, link_state: %s, err %d", 191*4882a593Smuzhiyun __get_str(dev_name), 192*4882a593Smuzhiyun __entry->usecs, 193*4882a593Smuzhiyun __print_symbolic(__entry->dev_state, UFS_PWR_MODES), 194*4882a593Smuzhiyun __print_symbolic(__entry->link_state, UFS_LINK_STATES), 195*4882a593Smuzhiyun __entry->err 196*4882a593Smuzhiyun ) 197*4882a593Smuzhiyun ); 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun DEFINE_EVENT(ufshcd_template, ufshcd_system_suspend, 200*4882a593Smuzhiyun TP_PROTO(const char *dev_name, int err, s64 usecs, 201*4882a593Smuzhiyun int dev_state, int link_state), 202*4882a593Smuzhiyun TP_ARGS(dev_name, err, usecs, dev_state, link_state)); 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun DEFINE_EVENT(ufshcd_template, ufshcd_system_resume, 205*4882a593Smuzhiyun TP_PROTO(const char *dev_name, int err, s64 usecs, 206*4882a593Smuzhiyun int dev_state, int link_state), 207*4882a593Smuzhiyun TP_ARGS(dev_name, err, usecs, dev_state, link_state)); 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun DEFINE_EVENT(ufshcd_template, ufshcd_runtime_suspend, 210*4882a593Smuzhiyun TP_PROTO(const char *dev_name, int err, s64 usecs, 211*4882a593Smuzhiyun int dev_state, int link_state), 212*4882a593Smuzhiyun TP_ARGS(dev_name, err, usecs, dev_state, link_state)); 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun DEFINE_EVENT(ufshcd_template, ufshcd_runtime_resume, 215*4882a593Smuzhiyun TP_PROTO(const char *dev_name, int err, s64 usecs, 216*4882a593Smuzhiyun int dev_state, int link_state), 217*4882a593Smuzhiyun TP_ARGS(dev_name, err, usecs, dev_state, link_state)); 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun DEFINE_EVENT(ufshcd_template, ufshcd_init, 220*4882a593Smuzhiyun TP_PROTO(const char *dev_name, int err, s64 usecs, 221*4882a593Smuzhiyun int dev_state, int link_state), 222*4882a593Smuzhiyun TP_ARGS(dev_name, err, usecs, dev_state, link_state)); 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun TRACE_EVENT(ufshcd_command, 225*4882a593Smuzhiyun TP_PROTO(const char *dev_name, const char *str, unsigned int tag, 226*4882a593Smuzhiyun u32 doorbell, int transfer_len, u32 intr, u64 lba, 227*4882a593Smuzhiyun u8 opcode, u8 group_id), 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun TP_ARGS(dev_name, str, tag, doorbell, transfer_len, 230*4882a593Smuzhiyun intr, lba, opcode, group_id), 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun TP_STRUCT__entry( 233*4882a593Smuzhiyun __string(dev_name, dev_name) 234*4882a593Smuzhiyun __string(str, str) 235*4882a593Smuzhiyun __field(unsigned int, tag) 236*4882a593Smuzhiyun __field(u32, doorbell) 237*4882a593Smuzhiyun __field(int, transfer_len) 238*4882a593Smuzhiyun __field(u32, intr) 239*4882a593Smuzhiyun __field(u64, lba) 240*4882a593Smuzhiyun __field(u8, opcode) 241*4882a593Smuzhiyun __field(u8, group_id) 242*4882a593Smuzhiyun ), 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun TP_fast_assign( 245*4882a593Smuzhiyun __assign_str(dev_name, dev_name); 246*4882a593Smuzhiyun __assign_str(str, str); 247*4882a593Smuzhiyun __entry->tag = tag; 248*4882a593Smuzhiyun __entry->doorbell = doorbell; 249*4882a593Smuzhiyun __entry->transfer_len = transfer_len; 250*4882a593Smuzhiyun __entry->intr = intr; 251*4882a593Smuzhiyun __entry->lba = lba; 252*4882a593Smuzhiyun __entry->opcode = opcode; 253*4882a593Smuzhiyun __entry->group_id = group_id; 254*4882a593Smuzhiyun ), 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun TP_printk( 257*4882a593Smuzhiyun "%s: %s: tag: %u, DB: 0x%x, size: %d, IS: %u, LBA: %llu, opcode: 0x%x (%s), group_id: 0x%x", 258*4882a593Smuzhiyun __get_str(str), __get_str(dev_name), __entry->tag, 259*4882a593Smuzhiyun __entry->doorbell, __entry->transfer_len, 260*4882a593Smuzhiyun __entry->intr, __entry->lba, (u32)__entry->opcode, 261*4882a593Smuzhiyun str_opcode(__entry->opcode), (u32)__entry->group_id 262*4882a593Smuzhiyun ) 263*4882a593Smuzhiyun ); 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun TRACE_EVENT(ufshcd_uic_command, 266*4882a593Smuzhiyun TP_PROTO(const char *dev_name, const char *str, u32 cmd, 267*4882a593Smuzhiyun u32 arg1, u32 arg2, u32 arg3), 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun TP_ARGS(dev_name, str, cmd, arg1, arg2, arg3), 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun TP_STRUCT__entry( 272*4882a593Smuzhiyun __string(dev_name, dev_name) 273*4882a593Smuzhiyun __string(str, str) 274*4882a593Smuzhiyun __field(u32, cmd) 275*4882a593Smuzhiyun __field(u32, arg1) 276*4882a593Smuzhiyun __field(u32, arg2) 277*4882a593Smuzhiyun __field(u32, arg3) 278*4882a593Smuzhiyun ), 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun TP_fast_assign( 281*4882a593Smuzhiyun __assign_str(dev_name, dev_name); 282*4882a593Smuzhiyun __assign_str(str, str); 283*4882a593Smuzhiyun __entry->cmd = cmd; 284*4882a593Smuzhiyun __entry->arg1 = arg1; 285*4882a593Smuzhiyun __entry->arg2 = arg2; 286*4882a593Smuzhiyun __entry->arg3 = arg3; 287*4882a593Smuzhiyun ), 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun TP_printk( 290*4882a593Smuzhiyun "%s: %s: cmd: 0x%x, arg1: 0x%x, arg2: 0x%x, arg3: 0x%x", 291*4882a593Smuzhiyun __get_str(str), __get_str(dev_name), __entry->cmd, 292*4882a593Smuzhiyun __entry->arg1, __entry->arg2, __entry->arg3 293*4882a593Smuzhiyun ) 294*4882a593Smuzhiyun ); 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun TRACE_EVENT(ufshcd_upiu, 297*4882a593Smuzhiyun TP_PROTO(const char *dev_name, const char *str, void *hdr, void *tsf), 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun TP_ARGS(dev_name, str, hdr, tsf), 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun TP_STRUCT__entry( 302*4882a593Smuzhiyun __string(dev_name, dev_name) 303*4882a593Smuzhiyun __string(str, str) 304*4882a593Smuzhiyun __array(unsigned char, hdr, 12) 305*4882a593Smuzhiyun __array(unsigned char, tsf, 16) 306*4882a593Smuzhiyun ), 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun TP_fast_assign( 309*4882a593Smuzhiyun __assign_str(dev_name, dev_name); 310*4882a593Smuzhiyun __assign_str(str, str); 311*4882a593Smuzhiyun memcpy(__entry->hdr, hdr, sizeof(__entry->hdr)); 312*4882a593Smuzhiyun memcpy(__entry->tsf, tsf, sizeof(__entry->tsf)); 313*4882a593Smuzhiyun ), 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun TP_printk( 316*4882a593Smuzhiyun "%s: %s: HDR:%s, CDB:%s", 317*4882a593Smuzhiyun __get_str(str), __get_str(dev_name), 318*4882a593Smuzhiyun __print_hex(__entry->hdr, sizeof(__entry->hdr)), 319*4882a593Smuzhiyun __print_hex(__entry->tsf, sizeof(__entry->tsf)) 320*4882a593Smuzhiyun ) 321*4882a593Smuzhiyun ); 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun #endif /* if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ) */ 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun /* This part must be outside protection */ 326*4882a593Smuzhiyun #include <trace/define_trace.h> 327