162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* Copyright 2014 Cisco Systems, Inc. All rights reserved. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef __SNIC_TRC_H 562306a36Sopenharmony_ci#define __SNIC_TRC_H 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifdef CONFIG_SCSI_SNIC_DEBUG_FS 862306a36Sopenharmony_ci 962306a36Sopenharmony_ciextern ssize_t simple_read_from_buffer(void __user *to, 1062306a36Sopenharmony_ci size_t count, 1162306a36Sopenharmony_ci loff_t *ppos, 1262306a36Sopenharmony_ci const void *from, 1362306a36Sopenharmony_ci size_t available); 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciextern unsigned int snic_trace_max_pages; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* Global Data structure for trace to manage trace functionality */ 1862306a36Sopenharmony_cistruct snic_trc_data { 1962306a36Sopenharmony_ci u64 ts; /* Time Stamp */ 2062306a36Sopenharmony_ci char *fn; /* Ptr to Function Name */ 2162306a36Sopenharmony_ci u32 hno; /* SCSI Host ID */ 2262306a36Sopenharmony_ci u32 tag; /* Command Tag */ 2362306a36Sopenharmony_ci u64 data[5]; 2462306a36Sopenharmony_ci} __attribute__((__packed__)); 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define SNIC_TRC_ENTRY_SZ 64 /* in Bytes */ 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistruct snic_trc { 2962306a36Sopenharmony_ci spinlock_t lock; 3062306a36Sopenharmony_ci struct snic_trc_data *buf; /* Trace Buffer */ 3162306a36Sopenharmony_ci u32 max_idx; /* Max Index into trace buffer */ 3262306a36Sopenharmony_ci u32 rd_idx; 3362306a36Sopenharmony_ci u32 wr_idx; 3462306a36Sopenharmony_ci bool enable; /* Control Variable for Tracing */ 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ciint snic_trc_init(void); 3862306a36Sopenharmony_civoid snic_trc_free(void); 3962306a36Sopenharmony_civoid snic_trc_debugfs_init(void); 4062306a36Sopenharmony_civoid snic_trc_debugfs_term(void); 4162306a36Sopenharmony_cistruct snic_trc_data *snic_get_trc_buf(void); 4262306a36Sopenharmony_ciint snic_get_trc_data(char *buf, int buf_sz); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_civoid snic_debugfs_init(void); 4562306a36Sopenharmony_civoid snic_debugfs_term(void); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic inline void 4862306a36Sopenharmony_cisnic_trace(char *fn, u16 hno, u32 tag, u64 d1, u64 d2, u64 d3, u64 d4, u64 d5) 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci struct snic_trc_data *tr_rec = snic_get_trc_buf(); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci if (!tr_rec) 5362306a36Sopenharmony_ci return; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci tr_rec->fn = (char *)fn; 5662306a36Sopenharmony_ci tr_rec->hno = hno; 5762306a36Sopenharmony_ci tr_rec->tag = tag; 5862306a36Sopenharmony_ci tr_rec->data[0] = d1; 5962306a36Sopenharmony_ci tr_rec->data[1] = d2; 6062306a36Sopenharmony_ci tr_rec->data[2] = d3; 6162306a36Sopenharmony_ci tr_rec->data[3] = d4; 6262306a36Sopenharmony_ci tr_rec->data[4] = d5; 6362306a36Sopenharmony_ci tr_rec->ts = jiffies; /* Update time stamp at last */ 6462306a36Sopenharmony_ci} 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#define SNIC_TRC(_hno, _tag, d1, d2, d3, d4, d5) \ 6762306a36Sopenharmony_ci do { \ 6862306a36Sopenharmony_ci if (unlikely(snic_glob->trc.enable)) \ 6962306a36Sopenharmony_ci snic_trace((char *)__func__, \ 7062306a36Sopenharmony_ci (u16)(_hno), \ 7162306a36Sopenharmony_ci (u32)(_tag), \ 7262306a36Sopenharmony_ci (u64)(d1), \ 7362306a36Sopenharmony_ci (u64)(d2), \ 7462306a36Sopenharmony_ci (u64)(d3), \ 7562306a36Sopenharmony_ci (u64)(d4), \ 7662306a36Sopenharmony_ci (u64)(d5)); \ 7762306a36Sopenharmony_ci } while (0) 7862306a36Sopenharmony_ci#else 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#define SNIC_TRC(_hno, _tag, d1, d2, d3, d4, d5) \ 8162306a36Sopenharmony_ci do { \ 8262306a36Sopenharmony_ci if (unlikely(snic_log_level & 0x2)) \ 8362306a36Sopenharmony_ci SNIC_DBG("SnicTrace: %s %2u %2u %llx %llx %llx %llx %llx", \ 8462306a36Sopenharmony_ci (char *)__func__, \ 8562306a36Sopenharmony_ci (u16)(_hno), \ 8662306a36Sopenharmony_ci (u32)(_tag), \ 8762306a36Sopenharmony_ci (u64)(d1), \ 8862306a36Sopenharmony_ci (u64)(d2), \ 8962306a36Sopenharmony_ci (u64)(d3), \ 9062306a36Sopenharmony_ci (u64)(d4), \ 9162306a36Sopenharmony_ci (u64)(d5)); \ 9262306a36Sopenharmony_ci } while (0) 9362306a36Sopenharmony_ci#endif /* end of CONFIG_SCSI_SNIC_DEBUG_FS */ 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#define SNIC_TRC_CMD(sc) \ 9662306a36Sopenharmony_ci ((u64)sc->cmnd[0] << 56 | (u64)sc->cmnd[7] << 40 | \ 9762306a36Sopenharmony_ci (u64)sc->cmnd[8] << 32 | (u64)sc->cmnd[2] << 24 | \ 9862306a36Sopenharmony_ci (u64)sc->cmnd[3] << 16 | (u64)sc->cmnd[4] << 8 | \ 9962306a36Sopenharmony_ci (u64)sc->cmnd[5]) 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci#define SNIC_TRC_CMD_STATE_FLAGS(sc) \ 10262306a36Sopenharmony_ci ((u64) CMD_FLAGS(sc) << 32 | CMD_STATE(sc)) 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci#endif /* end of __SNIC_TRC_H */ 105