diff mbox series

[RFC,v2,18/96] cl8k: add debug.h

Message ID 20220524113502.1094459-19-viktor.barna@celeno.com
State New
Headers show
Series wireless: cl8k driver for Celeno IEEE 802.11ax devices | expand

Commit Message

Viktor Barna May 24, 2022, 11:33 a.m. UTC
From: Viktor Barna <viktor.barna@celeno.com>

(Part of the split. Please, take a look at the cover letter for more
details).

Signed-off-by: Viktor Barna <viktor.barna@celeno.com>
---
 drivers/net/wireless/celeno/cl8k/debug.h | 160 +++++++++++++++++++++++
 1 file changed, 160 insertions(+)
 create mode 100644 drivers/net/wireless/celeno/cl8k/debug.h
diff mbox series

Patch

diff --git a/drivers/net/wireless/celeno/cl8k/debug.h b/drivers/net/wireless/celeno/cl8k/debug.h
new file mode 100644
index 000000000000..dffee2125903
--- /dev/null
+++ b/drivers/net/wireless/celeno/cl8k/debug.h
@@ -0,0 +1,160 @@ 
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
+/* Copyright(c) 2019-2022, Celeno Communications Ltd. */
+
+#ifndef CL_DEBUG_H
+#define CL_DEBUG_H
+
+#include <linux/string.h>
+
+enum cl_dbg_level {
+	DBG_LVL_VERBOSE,
+	DBG_LVL_ERROR,
+	DBG_LVL_WARNING,
+	DBG_LVL_TRACE,
+	DBG_LVL_INFO,
+
+	DBG_LVL_MAX,
+};
+
+#define CL_DBG(cl_hw, lvl, fmt, ...) \
+do { \
+	if ((lvl) <= (cl_hw)->conf->ce_debug_level) \
+		pr_debug("[tcv%u][%s][%d] " fmt, (cl_hw)->idx, __func__, __LINE__, ##__VA_ARGS__); \
+} while (0)
+
+#define CL_DBG_CHIP(chip, lvl, fmt, ...) \
+do { \
+	if ((lvl) <= (chip)->conf->ce_debug_level) \
+		pr_debug("[chip%u][%s][%d] " fmt, (chip)->idx, __func__, __LINE__, ##__VA_ARGS__); \
+} while (0)
+
+#define cl_dbg_verbose(cl_hw, ...) CL_DBG((cl_hw), DBG_LVL_VERBOSE, ##__VA_ARGS__)
+#define cl_dbg_err(cl_hw, ...)     CL_DBG((cl_hw), DBG_LVL_ERROR, ##__VA_ARGS__)
+#define cl_dbg_warn(cl_hw, ...)    CL_DBG((cl_hw), DBG_LVL_WARNING, ##__VA_ARGS__)
+#define cl_dbg_trace(cl_hw, ...)   CL_DBG((cl_hw), DBG_LVL_TRACE, ##__VA_ARGS__)
+#define cl_dbg_info(cl_hw, ...)    CL_DBG((cl_hw), DBG_LVL_INFO, ##__VA_ARGS__)
+
+#define cl_dbg_chip_verbose(chip, ...) CL_DBG_CHIP((chip), DBG_LVL_VERBOSE, ##__VA_ARGS__)
+#define cl_dbg_chip_err(chip, ...)     CL_DBG_CHIP((chip), DBG_LVL_ERROR, ##__VA_ARGS__)
+#define cl_dbg_chip_warn(chip, ...)    CL_DBG_CHIP((chip), DBG_LVL_WARNING, ##__VA_ARGS__)
+#define cl_dbg_chip_trace(chip, ...)   CL_DBG_CHIP((chip), DBG_LVL_TRACE, ##__VA_ARGS__)
+#define cl_dbg_chip_info(chip, ...)    CL_DBG_CHIP((chip), DBG_LVL_INFO, ##__VA_ARGS__)
+
+static inline char *cl_code_basename(const char *filename)
+{
+	char *p = strrchr(filename, '/');
+
+	return p ? p + 1 : (char *)filename;
+}
+
+#define TXT_ERROR \
+	do { \
+		pr_debug("\n"); \
+		pr_debug("#######  #####    #####     #####   #####\n"); \
+		pr_debug("#        #    #   #    #   #     #  #    #\n"); \
+		pr_debug("#        #    #   #    #   #     #  #    #\n"); \
+		pr_debug("#######  #####    #####    #     #  #####\n"); \
+		pr_debug("#        #    #   #    #   #     #  #    #\n"); \
+		pr_debug("#        #     #  #     #  #     #  #     #\n"); \
+		pr_debug("#######  #     #  #     #   #####   #     #\n"); \
+	} while (0)
+
+#define TXT_WARNING \
+	do { \
+		pr_debug("\n"); \
+		pr_debug("#       #   #####   #####    #     #  ###  #     #   #####\n"); \
+		pr_debug("#       #  #     #  #    #   ##    #   #   ##    #  #     #\n"); \
+		pr_debug("#       #  #     #  #    #   # #   #   #   # #   #  #\n"); \
+		pr_debug("#   #   #  #######  #####    #  #  #   #   #  #  #  #    ###\n"); \
+		pr_debug("#  # #  #  #     #  #    #   #   # #   #   #   # #  #     #\n"); \
+		pr_debug("# #   # #  #     #  #     #  #    ##   #   #    ##  #     #\n"); \
+		pr_debug(" #     #   #     #  #     #  #     #  ###  #     #   #####\n"); \
+	} while (0)
+
+#define INFO_CL_HW(cl_hw, ...) \
+	do { \
+		pr_debug("\n"); \
+		pr_debug("CHIP:        %u\n", (cl_hw)->chip->idx); \
+		pr_debug("TCV:         %u\n", (cl_hw)->idx); \
+		pr_debug("FILE:        %s\n", cl_code_basename(__FILE__)); \
+		pr_debug("FUNCTION:    %s\n", __func__); \
+		pr_debug("LINE:        %u\n", __LINE__); \
+		pr_debug("DESCRIPTION: " __VA_ARGS__); \
+		pr_debug("\n"); \
+	} while (0)
+
+#define INFO_CHIP(chip, ...) \
+	do { \
+		pr_debug("\n"); \
+		pr_debug("CHIP:        %u\n", (chip)->idx); \
+		pr_debug("FILE:        %s\n", cl_code_basename(__FILE__)); \
+		pr_debug("FUNCTION:    %s\n", __func__); \
+		pr_debug("LINE:        %u\n", __LINE__); \
+		pr_debug("DESCRIPTION: " __VA_ARGS__); \
+		pr_debug("\n"); \
+	} while (0)
+
+#define CL_DBG_ERROR(cl_hw, ...) \
+	do { \
+		TXT_ERROR; \
+		INFO_CL_HW(cl_hw, __VA_ARGS__); \
+	} while (0)
+
+#define CL_DBG_ERROR_CHIP(chip, ...) \
+	do { \
+		TXT_ERROR; \
+		INFO_CHIP(chip, __VA_ARGS__); \
+	} while (0)
+
+#define CL_DBG_WARNING(cl_hw, ...) \
+	do { \
+		TXT_WARNING; \
+		INFO_CL_HW(cl_hw, __VA_ARGS__); \
+	} while (0)
+
+#define CL_DBG_WARNING_CHIP(chip, ...) \
+	do { \
+		TXT_WARNING; \
+		INFO_CHIP(chip, __VA_ARGS__); \
+	} while (0)
+
+/* Min HW assert before testing asserts time-stamp */
+#define CL_MIN_ASSERT_CNT 10
+
+/* Define max time between hw asserts in msec */
+#define CL_HW_ASSERT_TIME_MAX 5000
+
+struct cl_dbg_data {
+	char *str; /* Pointer to debug strings start address */
+	int size; /* Size of debug strings pool */
+};
+
+/* String offloading to minimize FW size */
+struct cl_str_offload_env {
+	char *block1;
+	u32 size1;
+	u32 base1;
+	char *block2;
+	u32 size2;
+	u32 base2;
+	char *block3;
+	u32 size3;
+	u32 base3;
+	bool enabled;
+	char buf[512];
+};
+
+struct cl_hw;
+struct cl_chip;
+
+void cl_dbgfile_parse(struct cl_hw *cl_hw, void *edata, u32 esize);
+void cl_dbgfile_release_mem(struct cl_dbg_data *dbg_data,
+			    struct cl_str_offload_env *str_offload_env);
+void cl_dbgfile_print_fw_str(struct cl_hw *cl_hw, u8 *str, int max_size);
+int cl_dbgfile_store_offload_data(struct cl_chip *chip, struct cl_hw *cl_hw,
+				  void *data1, u32 size1, u32 base1,
+				  void *data2, u32 size2, u32 base2,
+				  void *data3, u32 size3, u32 base3);
+const char *cl_dbgfile_get_msg_txt(struct cl_dbg_data *dbg_data, u16 file_id, u16 line);
+
+#endif /* CL_DEBUG_H */