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