1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. */ 3 /* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. */ 4 5 #ifndef _CNSS_DEBUG_H 6 #define _CNSS_DEBUG_H 7 8 #include <linux/printk.h> 9 10 enum log_level { 11 EMERG_LOG = 0, 12 ALERT_LOG = 1, 13 CRIT_LOG = 2, 14 ERR_LOG = 3, 15 WARNING_LOG = 4, 16 NOTICE_LOG = 5, 17 INFO_LOG = 6, 18 DEBUG_LOG = 7, 19 DEBUG_HI_LOG = 8, 20 MAX_LOG = 9, 21 }; 22 23 extern enum log_level cnss_kernel_log_level; 24 25 #if IS_ENABLED(CONFIG_IPC_LOGGING) 26 #include <linux/ipc_logging.h> 27 #include <asm/current.h> 28 29 extern void *cnss_ipc_log_context; 30 extern void *cnss_ipc_log_long_context; 31 extern enum log_level cnss_ipc_log_level; 32 33 #ifdef CONFIG_CNSS2_DEBUG 34 #define CNSS_IPC_LOG_PAGES 100 35 #else 36 #define CNSS_IPC_LOG_PAGES 50 37 #endif 38 #define cnss_debug_log_print(_x...) \ 39 cnss_debug_ipc_log_print(cnss_ipc_log_context, _x) 40 41 #define cnss_debug_log_long_print(_x...) \ 42 cnss_debug_ipc_log_print(cnss_ipc_log_long_context, _x) 43 #else 44 #define cnss_debug_log_print(_x...) \ 45 cnss_debug_ipc_log_print((void *)NULL, _x) 46 #define cnss_debug_log_long_print(_x...) \ 47 cnss_debug_ipc_log_print((void *)NULL, _x) 48 #endif 49 50 #define proc_name (in_irq() ? "irq" : \ 51 (in_softirq() ? "soft_irq" : current->comm)) 52 53 #define cnss_pr_err(_fmt, ...) \ 54 cnss_debug_log_print(proc_name, __func__, \ 55 ERR_LOG, ERR_LOG, _fmt, ##__VA_ARGS__) 56 57 #define cnss_pr_warn(_fmt, ...) \ 58 cnss_debug_log_print(proc_name, __func__, \ 59 WARNING_LOG, WARNING_LOG, _fmt, ##__VA_ARGS__) 60 61 #define cnss_pr_info(_fmt, ...) \ 62 cnss_debug_log_print(proc_name, __func__, \ 63 INFO_LOG, INFO_LOG, _fmt, ##__VA_ARGS__) 64 65 #define cnss_pr_dbg(_fmt, ...) \ 66 cnss_debug_log_print(proc_name, __func__, \ 67 DEBUG_LOG, DEBUG_LOG, _fmt, ##__VA_ARGS__) 68 69 #define cnss_pr_vdbg(_fmt, ...) \ 70 cnss_debug_log_long_print(proc_name, __func__, \ 71 DEBUG_LOG, DEBUG_LOG, _fmt, ##__VA_ARGS__) 72 73 #define cnss_pr_buf(_fmt, ...) \ 74 cnss_debug_log_long_print(proc_name, __func__, \ 75 DEBUG_HI_LOG, DEBUG_LOG, _fmt, ##__VA_ARGS__) 76 #define cnss_pr_dbg_buf(_fmt, ...) \ 77 cnss_debug_log_long_print(proc_name, __func__, \ 78 DEBUG_HI_LOG, DEBUG_HI_LOG, _fmt, ##__VA_ARGS__) 79 80 #ifdef CONFIG_CNSS2_DEBUG 81 #define CNSS_ASSERT(_condition) do { \ 82 if (!(_condition)) { \ 83 cnss_pr_err("ASSERT at line %d\n", \ 84 __LINE__); \ 85 BUG(); \ 86 } \ 87 } while (0) 88 #else 89 #define CNSS_ASSERT(_condition) do { \ 90 if (!(_condition)) { \ 91 cnss_pr_err("ASSERT at line %d\n", \ 92 __LINE__); \ 93 WARN_ON(1); \ 94 } \ 95 } while (0) 96 #endif 97 98 #define cnss_fatal_err(_fmt, ...) \ 99 cnss_pr_err("fatal: " _fmt, ##__VA_ARGS__) 100 101 int cnss_debug_init(void); 102 void cnss_debug_deinit(void); 103 int cnss_debugfs_create(struct cnss_plat_data *plat_priv); 104 void cnss_debugfs_destroy(struct cnss_plat_data *plat_priv); 105 void cnss_debug_ipc_log_print(void *log_ctx, char *process, const char *fn, 106 enum log_level kern_log_level, 107 enum log_level ipc_log_level, char *fmt, ...); 108 #endif /* _CNSS_DEBUG_H */ 109