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