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 <ufs/ufs.h> 13 #include <linux/tracepoint.h> 14 15 #define str_opcode(opcode) \ 16 __print_symbolic(opcode, \ 17 { WRITE_16, "WRITE_16" }, \ 18 { WRITE_10, "WRITE_10" }, \ 19 { READ_16, "READ_16" }, \ 20 { READ_10, "READ_10" }, \ 21 { SYNCHRONIZE_CACHE, "SYNC" }, \ 22 { UNMAP, "UNMAP" }, \ 23 { ZBC_IN, "ZBC_IN" }, \ 24 { ZBC_OUT, "ZBC_OUT" }) 25 26 #define UFS_LINK_STATES \ 27 EM(UIC_LINK_OFF_STATE, "UIC_LINK_OFF_STATE") \ 28 EM(UIC_LINK_ACTIVE_STATE, "UIC_LINK_ACTIVE_STATE") \ 29 EMe(UIC_LINK_HIBERN8_STATE, "UIC_LINK_HIBERN8_STATE") 30 31 #define UFS_PWR_MODES \ 32 EM(UFS_ACTIVE_PWR_MODE, "UFS_ACTIVE_PWR_MODE") \ 33 EM(UFS_SLEEP_PWR_MODE, "UFS_SLEEP_PWR_MODE") \ 34 EM(UFS_POWERDOWN_PWR_MODE, "UFS_POWERDOWN_PWR_MODE") \ 35 EMe(UFS_DEEPSLEEP_PWR_MODE, "UFS_DEEPSLEEP_PWR_MODE") 36 37 #define UFSCHD_CLK_GATING_STATES \ 38 EM(CLKS_OFF, "CLKS_OFF") \ 39 EM(CLKS_ON, "CLKS_ON") \ 40 EM(REQ_CLKS_OFF, "REQ_CLKS_OFF") \ 41 EMe(REQ_CLKS_ON, "REQ_CLKS_ON") 42 43 #define UFS_CMD_TRACE_STRINGS \ 44 EM(UFS_CMD_SEND, "send_req") \ 45 EM(UFS_CMD_COMP, "complete_rsp") \ 46 EM(UFS_DEV_COMP, "dev_complete") \ 47 EM(UFS_QUERY_SEND, "query_send") \ 48 EM(UFS_QUERY_COMP, "query_complete") \ 49 EM(UFS_QUERY_ERR, "query_complete_err") \ 50 EM(UFS_TM_SEND, "tm_send") \ 51 EM(UFS_TM_COMP, "tm_complete") \ 52 EMe(UFS_TM_ERR, "tm_complete_err") 53 54 #define UFS_CMD_TRACE_TSF_TYPES \ 55 EM(UFS_TSF_CDB, "CDB") \ 56 EM(UFS_TSF_OSF, "OSF") \ 57 EM(UFS_TSF_TM_INPUT, "TM_INPUT") \ 58 EMe(UFS_TSF_TM_OUTPUT, "TM_OUTPUT") 59 60 /* Enums require being exported to userspace, for user tool parsing */ 61 #undef EM 62 #undef EMe 63 #define EM(a, b) TRACE_DEFINE_ENUM(a); 64 #define EMe(a, b) TRACE_DEFINE_ENUM(a); 65 66 UFS_LINK_STATES; 67 UFS_PWR_MODES; 68 UFSCHD_CLK_GATING_STATES; 69 UFS_CMD_TRACE_STRINGS 70 UFS_CMD_TRACE_TSF_TYPES 71 72 /* 73 * Now redefine the EM() and EMe() macros to map the enums to the strings 74 * that will be printed in the output. 75 */ 76 #undef EM 77 #undef EMe 78 #define EM(a, b) {a, b}, 79 #define EMe(a, b) {a, b} 80 81 #define show_ufs_cmd_trace_str(str_t) \ 82 __print_symbolic(str_t, UFS_CMD_TRACE_STRINGS) 83 #define show_ufs_cmd_trace_tsf(tsf) \ 84 __print_symbolic(tsf, UFS_CMD_TRACE_TSF_TYPES) 85 86 TRACE_EVENT(ufshcd_clk_gating, 87 88 TP_PROTO(struct ufs_hba *hba, int state), 89 90 TP_ARGS(hba, state), 91 92 TP_STRUCT__entry( 93 __field(struct ufs_hba *, hba) 94 __field(int, state) 95 ), 96 97 TP_fast_assign( 98 __entry->hba = hba; 99 __entry->state = state; 100 ), 101 102 TP_printk("%s: gating state changed to %s", 103 dev_name(__entry->hba->dev), 104 __print_symbolic(__entry->state, UFSCHD_CLK_GATING_STATES)) 105 ); 106 107 TRACE_EVENT(ufshcd_clk_scaling, 108 109 TP_PROTO(struct ufs_hba *hba, const char *state, const char *clk, 110 u32 prev_state, u32 curr_state), 111 112 TP_ARGS(hba, state, clk, prev_state, curr_state), 113 114 TP_STRUCT__entry( 115 __field(struct ufs_hba *, hba) 116 __string(state, state) 117 __string(clk, clk) 118 __field(u32, prev_state) 119 __field(u32, curr_state) 120 ), 121 122 TP_fast_assign( 123 __entry->hba = hba; 124 __assign_str(state); 125 __assign_str(clk); 126 __entry->prev_state = prev_state; 127 __entry->curr_state = curr_state; 128 ), 129 130 TP_printk("%s: %s %s from %u to %u Hz", 131 dev_name(__entry->hba->dev), __get_str(state), __get_str(clk), 132 __entry->prev_state, __entry->curr_state) 133 ); 134 135 TRACE_EVENT(ufshcd_auto_bkops_state, 136 137 TP_PROTO(struct ufs_hba *hba, const char *state), 138 139 TP_ARGS(hba, state), 140 141 TP_STRUCT__entry( 142 __field(struct ufs_hba *, hba) 143 __string(state, state) 144 ), 145 146 TP_fast_assign( 147 __entry->hba = hba; 148 __assign_str(state); 149 ), 150 151 TP_printk("%s: auto bkops - %s", 152 dev_name(__entry->hba->dev), __get_str(state)) 153 ); 154 155 DECLARE_EVENT_CLASS(ufshcd_profiling_template, 156 TP_PROTO(struct ufs_hba *hba, const char *profile_info, s64 time_us, 157 int err), 158 159 TP_ARGS(hba, profile_info, time_us, err), 160 161 TP_STRUCT__entry( 162 __field(struct ufs_hba *, hba) 163 __string(profile_info, profile_info) 164 __field(s64, time_us) 165 __field(int, err) 166 ), 167 168 TP_fast_assign( 169 __entry->hba = hba; 170 __assign_str(profile_info); 171 __entry->time_us = time_us; 172 __entry->err = err; 173 ), 174 175 TP_printk("%s: %s: took %lld usecs, err %d", 176 dev_name(__entry->hba->dev), __get_str(profile_info), 177 __entry->time_us, __entry->err) 178 ); 179 180 DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_hibern8, 181 TP_PROTO(struct ufs_hba *hba, const char *profile_info, s64 time_us, 182 int err), 183 TP_ARGS(hba, profile_info, time_us, err)); 184 185 DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_gating, 186 TP_PROTO(struct ufs_hba *hba, const char *profile_info, s64 time_us, 187 int err), 188 TP_ARGS(hba, profile_info, time_us, err)); 189 190 DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_scaling, 191 TP_PROTO(struct ufs_hba *hba, const char *profile_info, s64 time_us, 192 int err), 193 TP_ARGS(hba, profile_info, time_us, err)); 194 195 DECLARE_EVENT_CLASS(ufshcd_template, 196 TP_PROTO(struct ufs_hba *hba, int err, s64 usecs, 197 int dev_state, int link_state), 198 199 TP_ARGS(hba, err, usecs, dev_state, link_state), 200 201 TP_STRUCT__entry( 202 __field(s64, usecs) 203 __field(int, err) 204 __field(struct ufs_hba *, hba) 205 __field(int, dev_state) 206 __field(int, link_state) 207 ), 208 209 TP_fast_assign( 210 __entry->usecs = usecs; 211 __entry->err = err; 212 __entry->hba = hba; 213 __entry->dev_state = dev_state; 214 __entry->link_state = link_state; 215 ), 216 217 TP_printk( 218 "%s: took %lld usecs, dev_state: %s, link_state: %s, err %d", 219 dev_name(__entry->hba->dev), 220 __entry->usecs, 221 __print_symbolic(__entry->dev_state, UFS_PWR_MODES), 222 __print_symbolic(__entry->link_state, UFS_LINK_STATES), 223 __entry->err 224 ) 225 ); 226 227 DEFINE_EVENT(ufshcd_template, ufshcd_system_suspend, 228 TP_PROTO(struct ufs_hba *hba, int err, s64 usecs, 229 int dev_state, int link_state), 230 TP_ARGS(hba, err, usecs, dev_state, link_state)); 231 232 DEFINE_EVENT(ufshcd_template, ufshcd_system_resume, 233 TP_PROTO(struct ufs_hba *hba, int err, s64 usecs, 234 int dev_state, int link_state), 235 TP_ARGS(hba, err, usecs, dev_state, link_state)); 236 237 DEFINE_EVENT(ufshcd_template, ufshcd_runtime_suspend, 238 TP_PROTO(struct ufs_hba *hba, int err, s64 usecs, 239 int dev_state, int link_state), 240 TP_ARGS(hba, err, usecs, dev_state, link_state)); 241 242 DEFINE_EVENT(ufshcd_template, ufshcd_runtime_resume, 243 TP_PROTO(struct ufs_hba *hba, int err, s64 usecs, 244 int dev_state, int link_state), 245 TP_ARGS(hba, err, usecs, dev_state, link_state)); 246 247 DEFINE_EVENT(ufshcd_template, ufshcd_init, 248 TP_PROTO(struct ufs_hba *hba, int err, s64 usecs, 249 int dev_state, int link_state), 250 TP_ARGS(hba, err, usecs, dev_state, link_state)); 251 252 DEFINE_EVENT(ufshcd_template, ufshcd_wl_suspend, 253 TP_PROTO(struct ufs_hba *hba, int err, s64 usecs, 254 int dev_state, int link_state), 255 TP_ARGS(hba, err, usecs, dev_state, link_state)); 256 257 DEFINE_EVENT(ufshcd_template, ufshcd_wl_resume, 258 TP_PROTO(struct ufs_hba *hba, int err, s64 usecs, 259 int dev_state, int link_state), 260 TP_ARGS(hba, err, usecs, dev_state, link_state)); 261 262 DEFINE_EVENT(ufshcd_template, ufshcd_wl_runtime_suspend, 263 TP_PROTO(struct ufs_hba *hba, int err, s64 usecs, 264 int dev_state, int link_state), 265 TP_ARGS(hba, err, usecs, dev_state, link_state)); 266 267 DEFINE_EVENT(ufshcd_template, ufshcd_wl_runtime_resume, 268 TP_PROTO(struct ufs_hba *hba, int err, s64 usecs, 269 int dev_state, int link_state), 270 TP_ARGS(hba, err, usecs, dev_state, link_state)); 271 272 TRACE_EVENT(ufshcd_command, 273 TP_PROTO(struct scsi_device *sdev, struct ufs_hba *hba, 274 enum ufs_trace_str_t str_t, 275 unsigned int tag, u32 doorbell, u32 hwq_id, int transfer_len, 276 u32 intr, u64 lba, u8 opcode, u8 group_id), 277 278 TP_ARGS(sdev, hba, str_t, tag, doorbell, hwq_id, transfer_len, intr, lba, 279 opcode, group_id), 280 281 TP_STRUCT__entry( 282 __field(struct scsi_device *, sdev) 283 __field(struct ufs_hba *, hba) 284 __field(enum ufs_trace_str_t, str_t) 285 __field(unsigned int, tag) 286 __field(u32, doorbell) 287 __field(u32, hwq_id) 288 __field(u32, intr) 289 __field(u64, lba) 290 __field(int, transfer_len) 291 __field(u8, opcode) 292 __field(u8, group_id) 293 ), 294 295 TP_fast_assign( 296 __entry->sdev = sdev; 297 __entry->hba = hba; 298 __entry->str_t = str_t; 299 __entry->tag = tag; 300 __entry->doorbell = doorbell; 301 __entry->hwq_id = hwq_id; 302 __entry->intr = intr; 303 __entry->lba = lba; 304 __entry->transfer_len = transfer_len; 305 __entry->opcode = opcode; 306 __entry->group_id = group_id; 307 ), 308 309 TP_printk( 310 "%s: %s: tag: %u, DB: 0x%x, size: %d, IS: %u, LBA: %llu, opcode: 0x%x (%s), group_id: 0x%x, hwq_id: %d", 311 show_ufs_cmd_trace_str(__entry->str_t), 312 dev_name(&__entry->sdev->sdev_dev), __entry->tag, 313 __entry->doorbell, __entry->transfer_len, __entry->intr, 314 __entry->lba, (u32)__entry->opcode, str_opcode(__entry->opcode), 315 (u32)__entry->group_id, __entry->hwq_id 316 ) 317 ); 318 319 TRACE_EVENT(ufshcd_uic_command, 320 TP_PROTO(struct ufs_hba *hba, enum ufs_trace_str_t str_t, u32 cmd, 321 u32 arg1, u32 arg2, u32 arg3), 322 323 TP_ARGS(hba, str_t, cmd, arg1, arg2, arg3), 324 325 TP_STRUCT__entry( 326 __field(struct ufs_hba *, hba) 327 __field(enum ufs_trace_str_t, str_t) 328 __field(u32, cmd) 329 __field(u32, arg1) 330 __field(u32, arg2) 331 __field(u32, arg3) 332 ), 333 334 TP_fast_assign( 335 __entry->hba = hba; 336 __entry->str_t = str_t; 337 __entry->cmd = cmd; 338 __entry->arg1 = arg1; 339 __entry->arg2 = arg2; 340 __entry->arg3 = arg3; 341 ), 342 343 TP_printk( 344 "%s: %s: cmd: 0x%x, arg1: 0x%x, arg2: 0x%x, arg3: 0x%x", 345 show_ufs_cmd_trace_str(__entry->str_t), dev_name(__entry->hba->dev), 346 __entry->cmd, __entry->arg1, __entry->arg2, __entry->arg3 347 ) 348 ); 349 350 TRACE_EVENT(ufshcd_upiu, 351 TP_PROTO(struct ufs_hba *hba, enum ufs_trace_str_t str_t, void *hdr, 352 void *tsf, enum ufs_trace_tsf_t tsf_t), 353 354 TP_ARGS(hba, str_t, hdr, tsf, tsf_t), 355 356 TP_STRUCT__entry( 357 __field(struct ufs_hba *, hba) 358 __field(enum ufs_trace_str_t, str_t) 359 __array(unsigned char, hdr, 12) 360 __array(unsigned char, tsf, 16) 361 __field(enum ufs_trace_tsf_t, tsf_t) 362 ), 363 364 TP_fast_assign( 365 __entry->hba = hba; 366 __entry->str_t = str_t; 367 memcpy(__entry->hdr, hdr, sizeof(__entry->hdr)); 368 memcpy(__entry->tsf, tsf, sizeof(__entry->tsf)); 369 __entry->tsf_t = tsf_t; 370 ), 371 372 TP_printk( 373 "%s: %s: HDR:%s, %s:%s", 374 show_ufs_cmd_trace_str(__entry->str_t), dev_name(__entry->hba->dev), 375 __print_hex(__entry->hdr, sizeof(__entry->hdr)), 376 show_ufs_cmd_trace_tsf(__entry->tsf_t), 377 __print_hex(__entry->tsf, sizeof(__entry->tsf)) 378 ) 379 ); 380 381 TRACE_EVENT(ufshcd_exception_event, 382 383 TP_PROTO(struct ufs_hba *hba, u16 status), 384 385 TP_ARGS(hba, status), 386 387 TP_STRUCT__entry( 388 __field(struct ufs_hba *, hba) 389 __field(u16, status) 390 ), 391 392 TP_fast_assign( 393 __entry->hba = hba; 394 __entry->status = status; 395 ), 396 397 TP_printk("%s: status 0x%x", 398 dev_name(__entry->hba->dev), __entry->status 399 ) 400 ); 401 402 #endif /* if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ) */ 403 404 #undef TRACE_INCLUDE_PATH 405 #define TRACE_INCLUDE_PATH ../../drivers/ufs/core 406 #undef TRACE_INCLUDE_FILE 407 #define TRACE_INCLUDE_FILE ufs_trace 408 409 /* This part must be outside protection */ 410 #include <trace/define_trace.h> 411