xref: /linux/drivers/scsi/snic/snic_trc.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1*dfb99b05SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2*dfb99b05SThomas Gleixner /* Copyright 2014 Cisco Systems, Inc.  All rights reserved. */
3c8806b6cSNarsimhulu Musini 
4c8806b6cSNarsimhulu Musini #ifndef __SNIC_TRC_H
5c8806b6cSNarsimhulu Musini #define __SNIC_TRC_H
6c8806b6cSNarsimhulu Musini 
7c8806b6cSNarsimhulu Musini #ifdef CONFIG_SCSI_SNIC_DEBUG_FS
8c8806b6cSNarsimhulu Musini 
9c8806b6cSNarsimhulu Musini extern ssize_t simple_read_from_buffer(void __user *to,
10c8806b6cSNarsimhulu Musini 					size_t count,
11c8806b6cSNarsimhulu Musini 					loff_t *ppos,
12c8806b6cSNarsimhulu Musini 					const void *from,
13c8806b6cSNarsimhulu Musini 					size_t available);
14c8806b6cSNarsimhulu Musini 
15c8806b6cSNarsimhulu Musini extern unsigned int snic_trace_max_pages;
16c8806b6cSNarsimhulu Musini 
17c8806b6cSNarsimhulu Musini /* Global Data structure for trace to manage trace functionality */
18c8806b6cSNarsimhulu Musini struct snic_trc_data {
19c8806b6cSNarsimhulu Musini 	u64	ts;		/* Time Stamp */
20c8806b6cSNarsimhulu Musini 	char	*fn;		/* Ptr to Function Name */
21c8806b6cSNarsimhulu Musini 	u32	hno;		/* SCSI Host ID */
22c8806b6cSNarsimhulu Musini 	u32	tag;		/* Command Tag */
23c8806b6cSNarsimhulu Musini 	u64 data[5];
24c8806b6cSNarsimhulu Musini } __attribute__((__packed__));
25c8806b6cSNarsimhulu Musini 
26c8806b6cSNarsimhulu Musini #define SNIC_TRC_ENTRY_SZ  64	/* in Bytes */
27c8806b6cSNarsimhulu Musini 
28c8806b6cSNarsimhulu Musini struct snic_trc {
29c8806b6cSNarsimhulu Musini 	spinlock_t lock;
30c8806b6cSNarsimhulu Musini 	struct snic_trc_data *buf;	/* Trace Buffer */
31c8806b6cSNarsimhulu Musini 	u32	max_idx;		/* Max Index into trace buffer */
32c8806b6cSNarsimhulu Musini 	u32	rd_idx;
33c8806b6cSNarsimhulu Musini 	u32	wr_idx;
34621a5f7aSViresh Kumar 	bool	enable;			/* Control Variable for Tracing */
35c8806b6cSNarsimhulu Musini };
36c8806b6cSNarsimhulu Musini 
37c8806b6cSNarsimhulu Musini int snic_trc_init(void);
38c8806b6cSNarsimhulu Musini void snic_trc_free(void);
39fd84ec20SGreg Kroah-Hartman void snic_trc_debugfs_init(void);
40c8806b6cSNarsimhulu Musini void snic_trc_debugfs_term(void);
41c8806b6cSNarsimhulu Musini struct snic_trc_data *snic_get_trc_buf(void);
42c8806b6cSNarsimhulu Musini int snic_get_trc_data(char *buf, int buf_sz);
43c8806b6cSNarsimhulu Musini 
44fd84ec20SGreg Kroah-Hartman void snic_debugfs_init(void);
45c8806b6cSNarsimhulu Musini void snic_debugfs_term(void);
46c8806b6cSNarsimhulu Musini 
47c8806b6cSNarsimhulu Musini static inline void
snic_trace(char * fn,u16 hno,u32 tag,u64 d1,u64 d2,u64 d3,u64 d4,u64 d5)48c8806b6cSNarsimhulu Musini snic_trace(char *fn, u16 hno, u32 tag, u64 d1, u64 d2, u64 d3, u64 d4, u64 d5)
49c8806b6cSNarsimhulu Musini {
50c8806b6cSNarsimhulu Musini 	struct snic_trc_data *tr_rec = snic_get_trc_buf();
51c8806b6cSNarsimhulu Musini 
52c8806b6cSNarsimhulu Musini 	if (!tr_rec)
53c8806b6cSNarsimhulu Musini 		return;
54c8806b6cSNarsimhulu Musini 
55c8806b6cSNarsimhulu Musini 	tr_rec->fn = (char *)fn;
56c8806b6cSNarsimhulu Musini 	tr_rec->hno = hno;
57c8806b6cSNarsimhulu Musini 	tr_rec->tag = tag;
58c8806b6cSNarsimhulu Musini 	tr_rec->data[0] = d1;
59c8806b6cSNarsimhulu Musini 	tr_rec->data[1] = d2;
60c8806b6cSNarsimhulu Musini 	tr_rec->data[2] = d3;
61c8806b6cSNarsimhulu Musini 	tr_rec->data[3] = d4;
62c8806b6cSNarsimhulu Musini 	tr_rec->data[4] = d5;
63c8806b6cSNarsimhulu Musini 	tr_rec->ts = jiffies; /* Update time stamp at last */
64c8806b6cSNarsimhulu Musini }
65c8806b6cSNarsimhulu Musini 
66c8806b6cSNarsimhulu Musini #define SNIC_TRC(_hno, _tag, d1, d2, d3, d4, d5)			\
67c8806b6cSNarsimhulu Musini 	do {								\
68c8806b6cSNarsimhulu Musini 		if (unlikely(snic_glob->trc.enable))			\
69c8806b6cSNarsimhulu Musini 			snic_trace((char *)__func__,			\
70c8806b6cSNarsimhulu Musini 				   (u16)(_hno),				\
71c8806b6cSNarsimhulu Musini 				   (u32)(_tag),				\
72c8806b6cSNarsimhulu Musini 				   (u64)(d1),				\
73c8806b6cSNarsimhulu Musini 				   (u64)(d2),				\
74c8806b6cSNarsimhulu Musini 				   (u64)(d3),				\
75c8806b6cSNarsimhulu Musini 				   (u64)(d4),				\
76c8806b6cSNarsimhulu Musini 				   (u64)(d5));				\
77c8806b6cSNarsimhulu Musini 	} while (0)
78c8806b6cSNarsimhulu Musini #else
79c8806b6cSNarsimhulu Musini 
80c8806b6cSNarsimhulu Musini #define SNIC_TRC(_hno, _tag, d1, d2, d3, d4, d5)	\
81c8806b6cSNarsimhulu Musini 	do {						\
82c8806b6cSNarsimhulu Musini 		if (unlikely(snic_log_level & 0x2))	\
83c8806b6cSNarsimhulu Musini 			SNIC_DBG("SnicTrace: %s %2u %2u %llx %llx %llx %llx %llx", \
84c8806b6cSNarsimhulu Musini 				 (char *)__func__,	\
85c8806b6cSNarsimhulu Musini 				 (u16)(_hno),		\
86c8806b6cSNarsimhulu Musini 				 (u32)(_tag),		\
87c8806b6cSNarsimhulu Musini 				 (u64)(d1),		\
88c8806b6cSNarsimhulu Musini 				 (u64)(d2),		\
89c8806b6cSNarsimhulu Musini 				 (u64)(d3),		\
90c8806b6cSNarsimhulu Musini 				 (u64)(d4),		\
91c8806b6cSNarsimhulu Musini 				 (u64)(d5));		\
92c8806b6cSNarsimhulu Musini 	} while (0)
93c8806b6cSNarsimhulu Musini #endif /* end of CONFIG_SCSI_SNIC_DEBUG_FS */
94c8806b6cSNarsimhulu Musini 
95c8806b6cSNarsimhulu Musini #define SNIC_TRC_CMD(sc)	\
96c8806b6cSNarsimhulu Musini 	((u64)sc->cmnd[0] << 56 | (u64)sc->cmnd[7] << 40 |	\
97c8806b6cSNarsimhulu Musini 	 (u64)sc->cmnd[8] << 32 | (u64)sc->cmnd[2] << 24 |	\
98c8806b6cSNarsimhulu Musini 	 (u64)sc->cmnd[3] << 16 | (u64)sc->cmnd[4] << 8 |	\
99c8806b6cSNarsimhulu Musini 	 (u64)sc->cmnd[5])
100c8806b6cSNarsimhulu Musini 
101c8806b6cSNarsimhulu Musini #define SNIC_TRC_CMD_STATE_FLAGS(sc)	\
102c8806b6cSNarsimhulu Musini 	((u64) CMD_FLAGS(sc) << 32 | CMD_STATE(sc))
103c8806b6cSNarsimhulu Musini 
104c8806b6cSNarsimhulu Musini #endif /* end of __SNIC_TRC_H */
105