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