/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * QLogic iSCSI Offload Driver
 * Copyright (c) 2016 Cavium Inc.
 */

#ifndef _QEDI_DBG_H_
#define _QEDI_DBG_H_

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/compiler.h>
#include <linux/string.h>
#include <linux/version.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <scsi/scsi_transport.h>
#include <scsi/scsi_transport_iscsi.h>
#include <linux/fs.h>

#define __PREVENT_QED_HSI__
#include <linux/qed/common_hsi.h>
#include <linux/qed/qed_if.h>

extern uint qedi_dbg_log;

/* Debug print level definitions */
#define QEDI_LOG_DEFAULT	0x1		/* Set default logging mask */
#define QEDI_LOG_INFO		0x2		/* Informational logs,
						 * MAC address, WWPN, WWNN
						 */
#define QEDI_LOG_DISC		0x4		/* Init, discovery, rport */
#define QEDI_LOG_LL2		0x8		/* LL2, VLAN logs */
#define QEDI_LOG_CONN		0x10		/* Connection setup, cleanup */
#define QEDI_LOG_EVT		0x20		/* Events, link, mtu */
#define QEDI_LOG_TIMER		0x40		/* Timer events */
#define QEDI_LOG_MP_REQ		0x80		/* Middle Path (MP) logs */
#define QEDI_LOG_SCSI_TM	0x100		/* SCSI Aborts, Task Mgmt */
#define QEDI_LOG_UNSOL		0x200		/* unsolicited event logs */
#define QEDI_LOG_IO		0x400		/* scsi cmd, completion */
#define QEDI_LOG_MQ		0x800		/* Multi Queue logs */
#define QEDI_LOG_BSG		0x1000		/* BSG logs */
#define QEDI_LOG_DEBUGFS	0x2000		/* debugFS logs */
#define QEDI_LOG_LPORT		0x4000		/* lport logs */
#define QEDI_LOG_ELS		0x8000		/* ELS logs */
#define QEDI_LOG_NPIV		0x10000		/* NPIV logs */
#define QEDI_LOG_SESS		0x20000		/* Connection setup, cleanup */
#define QEDI_LOG_UIO		0x40000		/* iSCSI UIO logs */
#define QEDI_LOG_TID		0x80000         /* FW TID context acquire,
						 * free
						 */
#define QEDI_TRACK_TID		0x100000        /* Track TID state. To be
						 * enabled only at module load
						 * and not run-time.
						 */
#define QEDI_TRACK_CMD_LIST    0x300000        /* Track active cmd list nodes,
						* done with reference to TID,
						* hence TRACK_TID also enabled.
						*/
#define QEDI_LOG_NOTICE		0x40000000	/* Notice logs */
#define QEDI_LOG_WARN		0x80000000	/* Warning logs */

/* Debug context structure */
struct qedi_dbg_ctx {
	unsigned int host_no;
	struct pci_dev *pdev;
#ifdef CONFIG_DEBUG_FS
	struct dentry *bdf_dentry;
#endif
};

#define QEDI_ERR(pdev, fmt, ...)	\
		qedi_dbg_err(pdev, __func__, __LINE__, fmt, ## __VA_ARGS__)
#define QEDI_WARN(pdev, fmt, ...)	\
		qedi_dbg_warn(pdev, __func__, __LINE__, fmt, ## __VA_ARGS__)
#define QEDI_NOTICE(pdev, fmt, ...)	\
		qedi_dbg_notice(pdev, __func__, __LINE__, fmt, ## __VA_ARGS__)
#define QEDI_INFO(pdev, level, fmt, ...)	\
		qedi_dbg_info(pdev, __func__, __LINE__, level, fmt,	\
			      ## __VA_ARGS__)

void qedi_dbg_err(struct qedi_dbg_ctx *qedi, const char *func, u32 line,
		  const char *fmt, ...);
void qedi_dbg_warn(struct qedi_dbg_ctx *qedi, const char *func, u32 line,
		   const char *fmt, ...);
void qedi_dbg_notice(struct qedi_dbg_ctx *qedi, const char *func, u32 line,
		     const char *fmt, ...);
void qedi_dbg_info(struct qedi_dbg_ctx *qedi, const char *func, u32 line,
		   u32 info, const char *fmt, ...);

struct Scsi_Host;

struct sysfs_bin_attrs {
	char *name;
	struct bin_attribute *attr;
};

int qedi_create_sysfs_attr(struct Scsi_Host *shost,
			   struct sysfs_bin_attrs *iter);
void qedi_remove_sysfs_attr(struct Scsi_Host *shost,
			    struct sysfs_bin_attrs *iter);

/* DebugFS related code */
struct qedi_list_of_funcs {
	char *oper_str;
	ssize_t (*oper_func)(struct qedi_dbg_ctx *qedi);
};

struct qedi_debugfs_ops {
	char *name;
	struct qedi_list_of_funcs *qedi_funcs;
};

#define qedi_dbg_fileops(drv, ops) \
{ \
	.owner  = THIS_MODULE, \
	.open   = simple_open, \
	.read   = drv##_dbg_##ops##_cmd_read, \
	.write  = drv##_dbg_##ops##_cmd_write \
}

/* Used for debugfs sequential files */
#define qedi_dbg_fileops_seq(drv, ops) \
{ \
	.owner = THIS_MODULE, \
	.open = drv##_dbg_##ops##_open, \
	.read = seq_read, \
	.llseek = seq_lseek, \
	.release = single_release, \
}

void qedi_dbg_host_init(struct qedi_dbg_ctx *qedi,
			const struct qedi_debugfs_ops *dops,
			const struct file_operations *fops);
void qedi_dbg_host_exit(struct qedi_dbg_ctx *qedi);
void qedi_dbg_init(char *drv_name);
void qedi_dbg_exit(void);

#endif /* _QEDI_DBG_H_ */
