xref: /linux/sound/soc/intel/avs/debug.h (revision 2a55135201d5e24b80b7624880ff42eafd8e320c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright(c) 2024-2025 Intel Corporation
4  *
5  * Authors: Cezary Rojewski <cezary.rojewski@intel.com>
6  *          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
7  */
8 
9 #ifndef __SOUND_SOC_INTEL_AVS_DEBUG_H
10 #define __SOUND_SOC_INTEL_AVS_DEBUG_H
11 
12 #include "messages.h"
13 #include "registers.h"
14 
15 struct avs_dev;
16 
17 #define avs_log_buffer_size(adev) \
18 	((adev)->fw_cfg.trace_log_bytes / (adev)->hw_cfg.dsp_cores)
19 
20 #define avs_log_buffer_addr(adev, core) \
21 ({										\
22 	s32 __offset = avs_dsp_op(adev, log_buffer_offset, core);		\
23 	(__offset < 0) ? NULL :							\
24 			 (avs_sram_addr(adev, AVS_DEBUG_WINDOW) + __offset);	\
25 })
26 
27 static inline int avs_log_buffer_status_locked(struct avs_dev *adev, union avs_notify_msg *msg)
28 {
29 	unsigned long flags;
30 	int ret;
31 
32 	spin_lock_irqsave(&adev->trace_lock, flags);
33 	ret = avs_dsp_op(adev, log_buffer_status, msg);
34 	spin_unlock_irqrestore(&adev->trace_lock, flags);
35 
36 	return ret;
37 }
38 
39 struct avs_apl_log_buffer_layout {
40 	u32 read_ptr;
41 	u32 write_ptr;
42 	u8 buffer[];
43 } __packed;
44 static_assert(sizeof(struct avs_apl_log_buffer_layout) == 8);
45 
46 #define avs_apl_log_payload_size(adev) \
47 	(avs_log_buffer_size(adev) - sizeof(struct avs_apl_log_buffer_layout))
48 
49 #define avs_apl_log_payload_addr(addr) \
50 	(addr + sizeof(struct avs_apl_log_buffer_layout))
51 
52 #ifdef CONFIG_DEBUG_FS
53 int avs_register_probe_component(struct avs_dev *adev, const char *name);
54 
55 #define AVS_SET_ENABLE_LOGS_OP(name) \
56 	.enable_logs = avs_##name##_enable_logs
57 
58 bool avs_logging_fw(struct avs_dev *adev);
59 void avs_dump_fw_log(struct avs_dev *adev, const void __iomem *src, unsigned int len);
60 void avs_dump_fw_log_wakeup(struct avs_dev *adev, const void __iomem *src, unsigned int len);
61 
62 void avs_debugfs_init(struct avs_dev *adev);
63 void avs_debugfs_exit(struct avs_dev *adev);
64 
65 #else
66 static inline int avs_register_probe_component(struct avs_dev *adev, const char *name)
67 {
68 	return -EOPNOTSUPP;
69 }
70 
71 #define AVS_SET_ENABLE_LOGS_OP(name)
72 
73 static inline bool avs_logging_fw(struct avs_dev *adev)
74 {
75 	return false;
76 }
77 
78 static inline void avs_dump_fw_log(struct avs_dev *adev, const void __iomem *src, unsigned int len)
79 {
80 }
81 
82 static inline void avs_dump_fw_log_wakeup(struct avs_dev *adev, const void __iomem *src,
83 					  unsigned int len)
84 {
85 }
86 
87 static inline void avs_debugfs_init(struct avs_dev *adev) { }
88 static inline void avs_debugfs_exit(struct avs_dev *adev) { }
89 #endif
90 
91 #endif
92