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