1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. 4 */ 5 6 #ifndef _ICNSS_DEBUG_H 7 #define _ICNSS_DEBUG_H 8 9 #include <linux/ipc_logging.h> 10 #include <linux/printk.h> 11 12 #define NUM_LOG_PAGES 10 13 #define NUM_LOG_LONG_PAGES 4 14 15 extern void *icnss_ipc_log_context; 16 extern void *icnss_ipc_log_long_context; 17 extern void *icnss_ipc_log_smp2p_context; 18 extern void *icnss_ipc_soc_wake_context; 19 20 #if IS_ENABLED(CONFIG_IPC_LOGGING) 21 #define icnss_ipc_log_string(_x...) \ 22 ipc_log_string(icnss_ipc_log_context, _x) 23 24 #define icnss_ipc_log_long_string(_x...) \ 25 ipc_log_string(icnss_ipc_log_long_context, _x) 26 27 #define icnss_ipc_log_smp2p_string(_x...) \ 28 ipc_log_string(icnss_ipc_log_smp2p_context, _x) 29 30 #define icnss_ipc_soc_wake_string(_x...) \ 31 ipc_log_string(icnss_ipc_soc_wake_context, _x) 32 #else 33 #define icnss_ipc_log_string(_x...) 34 35 #define icnss_ipc_log_long_string(_x...) 36 37 #define icnss_ipc_log_smp2p_string(_x...) 38 39 #define icnss_ipc_soc_wake_string(_x...) 40 #endif 41 42 #define icnss_pr_err(_fmt, ...) do { \ 43 printk("%s" pr_fmt(_fmt), KERN_ERR, ##__VA_ARGS__); \ 44 icnss_ipc_log_string("%s" pr_fmt(_fmt), "", \ 45 ##__VA_ARGS__); \ 46 } while (0) 47 48 #define icnss_pr_warn(_fmt, ...) do { \ 49 printk("%s" pr_fmt(_fmt), KERN_WARNING, ##__VA_ARGS__); \ 50 icnss_ipc_log_string("%s" pr_fmt(_fmt), "", \ 51 ##__VA_ARGS__); \ 52 } while (0) 53 54 #define icnss_pr_info(_fmt, ...) do { \ 55 printk("%s" pr_fmt(_fmt), KERN_INFO, ##__VA_ARGS__); \ 56 icnss_ipc_log_string("%s" pr_fmt(_fmt), "", \ 57 ##__VA_ARGS__); \ 58 } while (0) 59 60 #define icnss_pr_dbg(_fmt, ...) do { \ 61 pr_debug(_fmt, ##__VA_ARGS__); \ 62 icnss_ipc_log_string(pr_fmt(_fmt), ##__VA_ARGS__); \ 63 } while (0) 64 65 #define icnss_pr_vdbg(_fmt, ...) do { \ 66 pr_debug(_fmt, ##__VA_ARGS__); \ 67 icnss_ipc_log_long_string(pr_fmt(_fmt), ##__VA_ARGS__); \ 68 } while (0) 69 70 #define icnss_pr_smp2p(_fmt, ...) do { \ 71 pr_debug(_fmt, ##__VA_ARGS__); \ 72 icnss_ipc_log_smp2p_string(pr_fmt(_fmt), ##__VA_ARGS__); \ 73 } while (0) 74 75 #define icnss_pr_soc_wake(_fmt, ...) do { \ 76 pr_debug(_fmt, ##__VA_ARGS__); \ 77 icnss_ipc_soc_wake_string(pr_fmt(_fmt), ##__VA_ARGS__); \ 78 } while (0) 79 80 #ifdef CONFIG_ICNSS2_DEBUG 81 #define ICNSS_ASSERT(_condition) do { \ 82 if (!(_condition)) { \ 83 icnss_pr_err("ASSERT at line %d\n", __LINE__); \ 84 BUG(); \ 85 } \ 86 } while (0) 87 #else 88 #define ICNSS_ASSERT(_condition) do { } while (0) 89 #endif 90 91 #define icnss_fatal_err(_fmt, ...) \ 92 icnss_pr_err("fatal: "_fmt, ##__VA_ARGS__) 93 94 enum icnss_debug_quirks { 95 HW_ALWAYS_ON, 96 HW_DEBUG_ENABLE, 97 SKIP_QMI, 98 RECOVERY_DISABLE, 99 SSR_ONLY, 100 PDR_ONLY, 101 FW_REJUVENATE_ENABLE, 102 }; 103 104 void icnss_debug_init(void); 105 void icnss_debug_deinit(void); 106 int icnss_debugfs_create(struct icnss_priv *priv); 107 void icnss_debugfs_destroy(struct icnss_priv *priv); 108 #endif /* _ICNSS_DEBUG_H */ 109