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
avs_log_buffer_status_locked(struct avs_dev * adev,union avs_notify_msg * msg)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
avs_register_probe_component(struct avs_dev * adev,const char * name)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
avs_logging_fw(struct avs_dev * adev)73 static inline bool avs_logging_fw(struct avs_dev *adev)
74 {
75 return false;
76 }
77
avs_dump_fw_log(struct avs_dev * adev,const void __iomem * src,unsigned int len)78 static inline void avs_dump_fw_log(struct avs_dev *adev, const void __iomem *src, unsigned int len)
79 {
80 }
81
avs_dump_fw_log_wakeup(struct avs_dev * adev,const void __iomem * src,unsigned int len)82 static inline void avs_dump_fw_log_wakeup(struct avs_dev *adev, const void __iomem *src,
83 unsigned int len)
84 {
85 }
86
avs_debugfs_init(struct avs_dev * adev)87 static inline void avs_debugfs_init(struct avs_dev *adev) { }
avs_debugfs_exit(struct avs_dev * adev)88 static inline void avs_debugfs_exit(struct avs_dev *adev) { }
89 #endif
90
91 #endif
92