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