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