xref: /openbmc/linux/drivers/nvme/host/trace.h (revision ca5554a6)
13d030e41SJohannes Thumshirn /*
23d030e41SJohannes Thumshirn  * NVM Express device driver tracepoints
33d030e41SJohannes Thumshirn  * Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
43d030e41SJohannes Thumshirn  *
53d030e41SJohannes Thumshirn  * This program is free software; you can redistribute it and/or modify it
63d030e41SJohannes Thumshirn  * under the terms and conditions of the GNU General Public License,
73d030e41SJohannes Thumshirn  * version 2, as published by the Free Software Foundation.
83d030e41SJohannes Thumshirn  *
93d030e41SJohannes Thumshirn  * This program is distributed in the hope it will be useful, but WITHOUT
103d030e41SJohannes Thumshirn  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
113d030e41SJohannes Thumshirn  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
123d030e41SJohannes Thumshirn  * more details.
133d030e41SJohannes Thumshirn  */
143d030e41SJohannes Thumshirn 
153d030e41SJohannes Thumshirn #undef TRACE_SYSTEM
163d030e41SJohannes Thumshirn #define TRACE_SYSTEM nvme
173d030e41SJohannes Thumshirn 
183d030e41SJohannes Thumshirn #if !defined(_TRACE_NVME_H) || defined(TRACE_HEADER_MULTI_READ)
193d030e41SJohannes Thumshirn #define _TRACE_NVME_H
203d030e41SJohannes Thumshirn 
213d030e41SJohannes Thumshirn #include <linux/nvme.h>
223d030e41SJohannes Thumshirn #include <linux/tracepoint.h>
233d030e41SJohannes Thumshirn #include <linux/trace_seq.h>
243d030e41SJohannes Thumshirn 
253d030e41SJohannes Thumshirn #include "nvme.h"
263d030e41SJohannes Thumshirn 
273d030e41SJohannes Thumshirn #define nvme_admin_opcode_name(opcode)	{ opcode, #opcode }
283d030e41SJohannes Thumshirn #define show_admin_opcode_name(val)					\
293d030e41SJohannes Thumshirn 	__print_symbolic(val,						\
303d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_delete_sq),		\
313d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_create_sq),		\
323d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_get_log_page),	\
333d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_delete_cq),		\
343d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_create_cq),		\
353d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_identify),		\
363d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_abort_cmd),		\
373d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_set_features),	\
383d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_get_features),	\
393d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_async_event),		\
403d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_ns_mgmt),		\
413d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_activate_fw),		\
423d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_download_fw),		\
433d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_ns_attach),		\
443d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_keep_alive),		\
453d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_directive_send),	\
463d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_directive_recv),	\
473d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_dbbuf),		\
483d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_format_nvm),		\
493d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_security_send),	\
503d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_security_recv),	\
513d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_sanitize_nvm))
523d030e41SJohannes Thumshirn 
533d030e41SJohannes Thumshirn const char *nvme_trace_parse_admin_cmd(struct trace_seq *p, u8 opcode,
543d030e41SJohannes Thumshirn 				       u8 *cdw10);
553d030e41SJohannes Thumshirn #define __parse_nvme_admin_cmd(opcode, cdw10) \
563d030e41SJohannes Thumshirn 	nvme_trace_parse_admin_cmd(p, opcode, cdw10)
573d030e41SJohannes Thumshirn 
583d030e41SJohannes Thumshirn #define nvme_opcode_name(opcode)	{ opcode, #opcode }
593d030e41SJohannes Thumshirn #define show_opcode_name(val)					\
603d030e41SJohannes Thumshirn 	__print_symbolic(val,					\
613d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_flush),		\
623d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_write),		\
633d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_read),		\
643d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_write_uncor),		\
653d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_compare),		\
663d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_write_zeroes),	\
673d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_dsm),			\
683d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_resv_register),	\
693d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_resv_report),		\
703d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_resv_acquire),	\
713d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_resv_release))
723d030e41SJohannes Thumshirn 
733d030e41SJohannes Thumshirn const char *nvme_trace_parse_nvm_cmd(struct trace_seq *p, u8 opcode,
743d030e41SJohannes Thumshirn 				     u8 *cdw10);
753d030e41SJohannes Thumshirn #define __parse_nvme_cmd(opcode, cdw10) \
763d030e41SJohannes Thumshirn 	nvme_trace_parse_nvm_cmd(p, opcode, cdw10)
773d030e41SJohannes Thumshirn 
783d030e41SJohannes Thumshirn TRACE_EVENT(nvme_setup_admin_cmd,
793d030e41SJohannes Thumshirn 	    TP_PROTO(struct nvme_command *cmd),
803d030e41SJohannes Thumshirn 	    TP_ARGS(cmd),
813d030e41SJohannes Thumshirn 	    TP_STRUCT__entry(
823d030e41SJohannes Thumshirn 		    __field(u8, opcode)
833d030e41SJohannes Thumshirn 		    __field(u8, flags)
843d030e41SJohannes Thumshirn 		    __field(u16, cid)
853d030e41SJohannes Thumshirn 		    __field(u64, metadata)
863d030e41SJohannes Thumshirn 		    __array(u8, cdw10, 24)
873d030e41SJohannes Thumshirn 	    ),
883d030e41SJohannes Thumshirn 	    TP_fast_assign(
893d030e41SJohannes Thumshirn 		    __entry->opcode = cmd->common.opcode;
903d030e41SJohannes Thumshirn 		    __entry->flags = cmd->common.flags;
913d030e41SJohannes Thumshirn 		    __entry->cid = cmd->common.command_id;
923d030e41SJohannes Thumshirn 		    __entry->metadata = le64_to_cpu(cmd->common.metadata);
933d030e41SJohannes Thumshirn 		    memcpy(__entry->cdw10, cmd->common.cdw10,
943d030e41SJohannes Thumshirn 			   sizeof(__entry->cdw10));
953d030e41SJohannes Thumshirn 	    ),
963d030e41SJohannes Thumshirn 	    TP_printk(" cmdid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)",
973d030e41SJohannes Thumshirn 		      __entry->cid, __entry->flags, __entry->metadata,
983d030e41SJohannes Thumshirn 		      show_admin_opcode_name(__entry->opcode),
993d030e41SJohannes Thumshirn 		      __parse_nvme_admin_cmd(__entry->opcode, __entry->cdw10))
1003d030e41SJohannes Thumshirn );
1013d030e41SJohannes Thumshirn 
1023d030e41SJohannes Thumshirn 
1033d030e41SJohannes Thumshirn TRACE_EVENT(nvme_setup_nvm_cmd,
1043d030e41SJohannes Thumshirn 	    TP_PROTO(int qid, struct nvme_command *cmd),
1053d030e41SJohannes Thumshirn 	    TP_ARGS(qid, cmd),
1063d030e41SJohannes Thumshirn 	    TP_STRUCT__entry(
1073d030e41SJohannes Thumshirn 		    __field(int, qid)
1083d030e41SJohannes Thumshirn 		    __field(u8, opcode)
1093d030e41SJohannes Thumshirn 		    __field(u8, flags)
1103d030e41SJohannes Thumshirn 		    __field(u16, cid)
1113d030e41SJohannes Thumshirn 		    __field(u32, nsid)
1123d030e41SJohannes Thumshirn 		    __field(u64, metadata)
1133d030e41SJohannes Thumshirn 		    __array(u8, cdw10, 24)
1143d030e41SJohannes Thumshirn 	    ),
1153d030e41SJohannes Thumshirn 	    TP_fast_assign(
1163d030e41SJohannes Thumshirn 		    __entry->qid = qid;
1173d030e41SJohannes Thumshirn 		    __entry->opcode = cmd->common.opcode;
1183d030e41SJohannes Thumshirn 		    __entry->flags = cmd->common.flags;
1193d030e41SJohannes Thumshirn 		    __entry->cid = cmd->common.command_id;
1203d030e41SJohannes Thumshirn 		    __entry->nsid = le32_to_cpu(cmd->common.nsid);
1213d030e41SJohannes Thumshirn 		    __entry->metadata = le64_to_cpu(cmd->common.metadata);
1223d030e41SJohannes Thumshirn 		    memcpy(__entry->cdw10, cmd->common.cdw10,
1233d030e41SJohannes Thumshirn 			   sizeof(__entry->cdw10));
1243d030e41SJohannes Thumshirn 	    ),
1253d030e41SJohannes Thumshirn 	    TP_printk("qid=%d, nsid=%u, cmdid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)",
1263d030e41SJohannes Thumshirn 		      __entry->qid, __entry->nsid, __entry->cid,
1273d030e41SJohannes Thumshirn 		      __entry->flags, __entry->metadata,
1283d030e41SJohannes Thumshirn 		      show_opcode_name(__entry->opcode),
1293d030e41SJohannes Thumshirn 		      __parse_nvme_cmd(__entry->opcode, __entry->cdw10))
1303d030e41SJohannes Thumshirn );
1313d030e41SJohannes Thumshirn 
132ca5554a6SJohannes Thumshirn TRACE_EVENT(nvme_complete_rq,
133ca5554a6SJohannes Thumshirn 	    TP_PROTO(struct request *req),
134ca5554a6SJohannes Thumshirn 	    TP_ARGS(req),
135ca5554a6SJohannes Thumshirn 	    TP_STRUCT__entry(
136ca5554a6SJohannes Thumshirn 		    __field(int, qid)
137ca5554a6SJohannes Thumshirn 		    __field(int, cid)
138ca5554a6SJohannes Thumshirn 		    __field(u64, result)
139ca5554a6SJohannes Thumshirn 		    __field(u8, retries)
140ca5554a6SJohannes Thumshirn 		    __field(u8, flags)
141ca5554a6SJohannes Thumshirn 		    __field(u16, status)
142ca5554a6SJohannes Thumshirn 	    ),
143ca5554a6SJohannes Thumshirn 	    TP_fast_assign(
144ca5554a6SJohannes Thumshirn 		    __entry->qid = req->q->id;
145ca5554a6SJohannes Thumshirn 		    __entry->cid = req->tag;
146ca5554a6SJohannes Thumshirn 		    __entry->result = le64_to_cpu(nvme_req(req)->result.u64);
147ca5554a6SJohannes Thumshirn 		    __entry->retries = nvme_req(req)->retries;
148ca5554a6SJohannes Thumshirn 		    __entry->flags = nvme_req(req)->flags;
149ca5554a6SJohannes Thumshirn 		    __entry->status = nvme_req(req)->status;
150ca5554a6SJohannes Thumshirn 	    ),
151ca5554a6SJohannes Thumshirn 	    TP_printk("cmdid=%u, qid=%d, res=%llu, retries=%u, flags=0x%x, status=%u",
152ca5554a6SJohannes Thumshirn 		      __entry->cid, __entry->qid, __entry->result,
153ca5554a6SJohannes Thumshirn 		      __entry->retries, __entry->flags, __entry->status)
154ca5554a6SJohannes Thumshirn 
155ca5554a6SJohannes Thumshirn );
156ca5554a6SJohannes Thumshirn 
1573d030e41SJohannes Thumshirn #endif /* _TRACE_NVME_H */
1583d030e41SJohannes Thumshirn 
1593d030e41SJohannes Thumshirn #undef TRACE_INCLUDE_PATH
1603d030e41SJohannes Thumshirn #define TRACE_INCLUDE_PATH .
1613d030e41SJohannes Thumshirn #undef TRACE_INCLUDE_FILE
1623d030e41SJohannes Thumshirn #define TRACE_INCLUDE_FILE trace
1633d030e41SJohannes Thumshirn 
1643d030e41SJohannes Thumshirn /* This part must be outside protection */
1653d030e41SJohannes Thumshirn #include <trace/define_trace.h>
166