Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2)  * Copyright 2014 Cisco Systems, Inc.  All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * This program is free software; you may redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * it under the terms of the GNU General Public License as published by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * the Free Software Foundation; version 2 of the License.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  * SOFTWARE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #ifndef __SNIC_TRC_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define __SNIC_TRC_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #ifdef CONFIG_SCSI_SNIC_DEBUG_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) extern ssize_t simple_read_from_buffer(void __user *to,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 					size_t count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 					loff_t *ppos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 					const void *from,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 					size_t available);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) extern unsigned int snic_trace_max_pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) /* Global Data structure for trace to manage trace functionality */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) struct snic_trc_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	u64	ts;		/* Time Stamp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	char	*fn;		/* Ptr to Function Name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	u32	hno;		/* SCSI Host ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	u32	tag;		/* Command Tag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	u64 data[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) } __attribute__((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) #define SNIC_TRC_ENTRY_SZ  64	/* in Bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) struct snic_trc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	struct snic_trc_data *buf;	/* Trace Buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	u32	max_idx;		/* Max Index into trace buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	u32	rd_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	u32	wr_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	bool	enable;			/* Control Variable for Tracing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	struct dentry *trc_enable;	/* debugfs file object */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	struct dentry *trc_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) int snic_trc_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) void snic_trc_free(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) void snic_trc_debugfs_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) void snic_trc_debugfs_term(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) struct snic_trc_data *snic_get_trc_buf(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) int snic_get_trc_data(char *buf, int buf_sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) void snic_debugfs_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) void snic_debugfs_term(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) snic_trace(char *fn, u16 hno, u32 tag, u64 d1, u64 d2, u64 d3, u64 d4, u64 d5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	struct snic_trc_data *tr_rec = snic_get_trc_buf();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	if (!tr_rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	tr_rec->fn = (char *)fn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	tr_rec->hno = hno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	tr_rec->tag = tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	tr_rec->data[0] = d1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	tr_rec->data[1] = d2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	tr_rec->data[2] = d3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	tr_rec->data[3] = d4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	tr_rec->data[4] = d5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	tr_rec->ts = jiffies; /* Update time stamp at last */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) #define SNIC_TRC(_hno, _tag, d1, d2, d3, d4, d5)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	do {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 		if (unlikely(snic_glob->trc.enable))			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 			snic_trace((char *)__func__,			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 				   (u16)(_hno),				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 				   (u32)(_tag),				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 				   (u64)(d1),				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 				   (u64)(d2),				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 				   (u64)(d3),				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 				   (u64)(d4),				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 				   (u64)(d5));				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) #define SNIC_TRC(_hno, _tag, d1, d2, d3, d4, d5)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	do {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 		if (unlikely(snic_log_level & 0x2))	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 			SNIC_DBG("SnicTrace: %s %2u %2u %llx %llx %llx %llx %llx", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 				 (char *)__func__,	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 				 (u16)(_hno),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 				 (u32)(_tag),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 				 (u64)(d1),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 				 (u64)(d2),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 				 (u64)(d3),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 				 (u64)(d4),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 				 (u64)(d5));		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #endif /* end of CONFIG_SCSI_SNIC_DEBUG_FS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define SNIC_TRC_CMD(sc)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	((u64)sc->cmnd[0] << 56 | (u64)sc->cmnd[7] << 40 |	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	 (u64)sc->cmnd[8] << 32 | (u64)sc->cmnd[2] << 24 |	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	 (u64)sc->cmnd[3] << 16 | (u64)sc->cmnd[4] << 8 |	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	 (u64)sc->cmnd[5])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define SNIC_TRC_CMD_STATE_FLAGS(sc)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	((u64) CMD_FLAGS(sc) << 32 | CMD_STATE(sc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #endif /* end of __SNIC_TRC_H */