162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Driver for Broadcom MPI3 Storage Controllers
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2017-2023 Broadcom Inc.
662306a36Sopenharmony_ci *  (mailto: mpi3mr-linuxdrv.pdl@broadcom.com)
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef MPI3SAS_DEBUG_H_INCLUDED
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define MPI3SAS_DEBUG_H_INCLUDED
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/*
1562306a36Sopenharmony_ci * debug levels
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define MPI3_DEBUG_EVENT		0x00000001
1962306a36Sopenharmony_ci#define MPI3_DEBUG_EVENT_WORK_TASK	0x00000002
2062306a36Sopenharmony_ci#define MPI3_DEBUG_INIT		0x00000004
2162306a36Sopenharmony_ci#define MPI3_DEBUG_EXIT		0x00000008
2262306a36Sopenharmony_ci#define MPI3_DEBUG_TM			0x00000010
2362306a36Sopenharmony_ci#define MPI3_DEBUG_RESET		0x00000020
2462306a36Sopenharmony_ci#define MPI3_DEBUG_SCSI_ERROR		0x00000040
2562306a36Sopenharmony_ci#define MPI3_DEBUG_REPLY		0x00000080
2662306a36Sopenharmony_ci#define MPI3_DEBUG_CFG_ERROR		0x00000100
2762306a36Sopenharmony_ci#define MPI3_DEBUG_TRANSPORT_ERROR	0x00000200
2862306a36Sopenharmony_ci#define MPI3_DEBUG_BSG_ERROR		0x00008000
2962306a36Sopenharmony_ci#define MPI3_DEBUG_BSG_INFO		0x00010000
3062306a36Sopenharmony_ci#define MPI3_DEBUG_SCSI_INFO		0x00020000
3162306a36Sopenharmony_ci#define MPI3_DEBUG_CFG_INFO		0x00040000
3262306a36Sopenharmony_ci#define MPI3_DEBUG_TRANSPORT_INFO	0x00080000
3362306a36Sopenharmony_ci#define MPI3_DEBUG			0x01000000
3462306a36Sopenharmony_ci#define MPI3_DEBUG_SG			0x02000000
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/*
3862306a36Sopenharmony_ci * debug macros
3962306a36Sopenharmony_ci */
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define ioc_err(ioc, fmt, ...) \
4262306a36Sopenharmony_ci	pr_err("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
4362306a36Sopenharmony_ci#define ioc_notice(ioc, fmt, ...) \
4462306a36Sopenharmony_ci	pr_notice("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
4562306a36Sopenharmony_ci#define ioc_warn(ioc, fmt, ...) \
4662306a36Sopenharmony_ci	pr_warn("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
4762306a36Sopenharmony_ci#define ioc_info(ioc, fmt, ...) \
4862306a36Sopenharmony_ci	pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define dprint(ioc, fmt, ...) \
5162306a36Sopenharmony_ci	do { \
5262306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG) \
5362306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
5462306a36Sopenharmony_ci	} while (0)
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define dprint_event_th(ioc, fmt, ...) \
5762306a36Sopenharmony_ci	do { \
5862306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_EVENT) \
5962306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
6062306a36Sopenharmony_ci	} while (0)
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#define dprint_event_bh(ioc, fmt, ...) \
6362306a36Sopenharmony_ci	do { \
6462306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_EVENT_WORK_TASK) \
6562306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
6662306a36Sopenharmony_ci	} while (0)
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#define dprint_init(ioc, fmt, ...) \
6962306a36Sopenharmony_ci	do { \
7062306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_INIT) \
7162306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
7262306a36Sopenharmony_ci	} while (0)
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#define dprint_exit(ioc, fmt, ...) \
7562306a36Sopenharmony_ci	do { \
7662306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_EXIT) \
7762306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
7862306a36Sopenharmony_ci	} while (0)
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci#define dprint_tm(ioc, fmt, ...) \
8162306a36Sopenharmony_ci	do { \
8262306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_TM) \
8362306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
8462306a36Sopenharmony_ci	} while (0)
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci#define dprint_reply(ioc, fmt, ...) \
8762306a36Sopenharmony_ci	do { \
8862306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_REPLY) \
8962306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
9062306a36Sopenharmony_ci	} while (0)
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#define dprint_reset(ioc, fmt, ...) \
9362306a36Sopenharmony_ci	do { \
9462306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_RESET) \
9562306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
9662306a36Sopenharmony_ci	} while (0)
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci#define dprint_scsi_info(ioc, fmt, ...) \
9962306a36Sopenharmony_ci	do { \
10062306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_SCSI_INFO) \
10162306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
10262306a36Sopenharmony_ci	} while (0)
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci#define dprint_scsi_err(ioc, fmt, ...) \
10562306a36Sopenharmony_ci	do { \
10662306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_SCSI_ERROR) \
10762306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
10862306a36Sopenharmony_ci	} while (0)
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci#define dprint_scsi_command(ioc, SCMD, LOG_LEVEL) \
11162306a36Sopenharmony_ci	do { \
11262306a36Sopenharmony_ci		if (ioc->logging_level & LOG_LEVEL) \
11362306a36Sopenharmony_ci			scsi_print_command(SCMD); \
11462306a36Sopenharmony_ci	} while (0)
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci#define dprint_bsg_info(ioc, fmt, ...) \
11862306a36Sopenharmony_ci	do { \
11962306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_BSG_INFO) \
12062306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
12162306a36Sopenharmony_ci	} while (0)
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci#define dprint_bsg_err(ioc, fmt, ...) \
12462306a36Sopenharmony_ci	do { \
12562306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_BSG_ERROR) \
12662306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
12762306a36Sopenharmony_ci	} while (0)
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci#define dprint_cfg_info(ioc, fmt, ...) \
13062306a36Sopenharmony_ci	do { \
13162306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_CFG_INFO) \
13262306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
13362306a36Sopenharmony_ci	} while (0)
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci#define dprint_cfg_err(ioc, fmt, ...) \
13662306a36Sopenharmony_ci	do { \
13762306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_CFG_ERROR) \
13862306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
13962306a36Sopenharmony_ci	} while (0)
14062306a36Sopenharmony_ci#define dprint_transport_info(ioc, fmt, ...) \
14162306a36Sopenharmony_ci	do { \
14262306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO) \
14362306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
14462306a36Sopenharmony_ci	} while (0)
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci#define dprint_transport_err(ioc, fmt, ...) \
14762306a36Sopenharmony_ci	do { \
14862306a36Sopenharmony_ci		if (ioc->logging_level & MPI3_DEBUG_TRANSPORT_ERROR) \
14962306a36Sopenharmony_ci			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
15062306a36Sopenharmony_ci	} while (0)
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci#endif /* MPT3SAS_DEBUG_H_INCLUDED */
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci/**
15562306a36Sopenharmony_ci * dprint_dump - print contents of a memory buffer
15662306a36Sopenharmony_ci * @req: Pointer to a memory buffer
15762306a36Sopenharmony_ci * @sz: Memory buffer size
15862306a36Sopenharmony_ci * @namestr: Name String to identify the buffer type
15962306a36Sopenharmony_ci */
16062306a36Sopenharmony_cistatic inline void
16162306a36Sopenharmony_cidprint_dump(void *req, int sz, const char *name_string)
16262306a36Sopenharmony_ci{
16362306a36Sopenharmony_ci	int i;
16462306a36Sopenharmony_ci	__le32 *mfp = (__le32 *)req;
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci	sz = sz/4;
16762306a36Sopenharmony_ci	if (name_string)
16862306a36Sopenharmony_ci		pr_info("%s:\n\t", name_string);
16962306a36Sopenharmony_ci	else
17062306a36Sopenharmony_ci		pr_info("request:\n\t");
17162306a36Sopenharmony_ci	for (i = 0; i < sz; i++) {
17262306a36Sopenharmony_ci		if (i && ((i % 8) == 0))
17362306a36Sopenharmony_ci			pr_info("\n\t");
17462306a36Sopenharmony_ci		pr_info("%08x ", le32_to_cpu(mfp[i]));
17562306a36Sopenharmony_ci	}
17662306a36Sopenharmony_ci	pr_info("\n");
17762306a36Sopenharmony_ci}
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci/**
18062306a36Sopenharmony_ci * dprint_dump_req - print message frame contents
18162306a36Sopenharmony_ci * @req: pointer to message frame
18262306a36Sopenharmony_ci * @sz: number of dwords
18362306a36Sopenharmony_ci */
18462306a36Sopenharmony_cistatic inline void
18562306a36Sopenharmony_cidprint_dump_req(void *req, int sz)
18662306a36Sopenharmony_ci{
18762306a36Sopenharmony_ci	int i;
18862306a36Sopenharmony_ci	__le32 *mfp = (__le32 *)req;
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	pr_info("request:\n\t");
19162306a36Sopenharmony_ci	for (i = 0; i < sz; i++) {
19262306a36Sopenharmony_ci		if (i && ((i % 8) == 0))
19362306a36Sopenharmony_ci			pr_info("\n\t");
19462306a36Sopenharmony_ci		pr_info("%08x ", le32_to_cpu(mfp[i]));
19562306a36Sopenharmony_ci	}
19662306a36Sopenharmony_ci	pr_info("\n");
19762306a36Sopenharmony_ci}
198