1 // SPDX-License-Identifier: GPL-2.0-only
3 * skl-debug.c - Debugfs for skl driver
5 * Copyright (C) 2016-17 Intel Corp
9 #include <linux/debugfs.h>
10 #include <uapi/sound/skl-tplg-interface.h>
12 #include "skl-sst-dsp.h"
13 #include "skl-sst-ipc.h"
14 #include "skl-topology.h"
15 #include "../common/sst-dsp.h"
16 #include "../common/sst-dsp-priv.h"
18 #define MOD_BUF PAGE_SIZE
19 #define FW_REG_BUF PAGE_SIZE
20 #define FW_REG_SIZE 0x60
27 struct dentry
*modules
;
28 u8 fw_read_buff
[FW_REG_BUF
];
31 static ssize_t
skl_print_pins(struct skl_module_pin
*m_pin
, char *buf
,
32 int max_pin
, ssize_t size
, bool direction
)
37 for (i
= 0; i
< max_pin
; i
++)
38 ret
+= snprintf(buf
+ size
, MOD_BUF
- size
,
39 "%s %d\n\tModule %d\n\tInstance %d\n\t"
40 "In-used %s\n\tType %s\n"
41 "\tState %d\n\tIndex %d\n",
42 direction
? "Input Pin:" : "Output Pin:",
43 i
, m_pin
[i
].id
.module_id
,
44 m_pin
[i
].id
.instance_id
,
45 m_pin
[i
].in_use
? "Used" : "Unused",
46 m_pin
[i
].is_dynamic
? "Dynamic" : "Static",
47 m_pin
[i
].pin_state
, i
);
51 static ssize_t
skl_print_fmt(struct skl_module_fmt
*fmt
, char *buf
,
52 ssize_t size
, bool direction
)
54 return snprintf(buf
+ size
, MOD_BUF
- size
,
55 "%s\n\tCh %d\n\tFreq %d\n\tBit depth %d\n\t"
56 "Valid bit depth %d\n\tCh config %#x\n\tInterleaving %d\n\t"
57 "Sample Type %d\n\tCh Map %#x\n",
58 direction
? "Input Format:" : "Output Format:",
59 fmt
->channels
, fmt
->s_freq
, fmt
->bit_depth
,
60 fmt
->valid_bit_depth
, fmt
->ch_cfg
,
61 fmt
->interleaving_style
, fmt
->sample_type
,
65 static ssize_t
module_read(struct file
*file
, char __user
*user_buf
,
66 size_t count
, loff_t
*ppos
)
68 struct skl_module_cfg
*mconfig
= file
->private_data
;
69 struct skl_module
*module
= mconfig
->module
;
70 struct skl_module_res
*res
= &module
->resources
[mconfig
->res_idx
];
74 buf
= kzalloc(MOD_BUF
, GFP_KERNEL
);
78 ret
= snprintf(buf
, MOD_BUF
, "Module:\n\tUUID %pUL\n\tModule id %d\n"
79 "\tInstance id %d\n\tPvt_id %d\n", mconfig
->guid
,
80 mconfig
->id
.module_id
, mconfig
->id
.instance_id
,
83 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
84 "Resources:\n\tCPC %#x\n\tIBS %#x\n\tOBS %#x\t\n",
85 res
->cpc
, res
->ibs
, res
->obs
);
87 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
88 "Module data:\n\tCore %d\n\tIn queue %d\n\t"
89 "Out queue %d\n\tType %s\n",
90 mconfig
->core_id
, mconfig
->max_in_queue
,
91 mconfig
->max_out_queue
,
92 mconfig
->is_loadable
? "loadable" : "inbuilt");
94 ret
+= skl_print_fmt(mconfig
->in_fmt
, buf
, ret
, true);
95 ret
+= skl_print_fmt(mconfig
->out_fmt
, buf
, ret
, false);
97 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
98 "Fixup:\n\tParams %#x\n\tConverter %#x\n",
99 mconfig
->params_fixup
, mconfig
->converter
);
101 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
102 "Module Gateway:\n\tType %#x\n\tVbus %#x\n\tHW conn %#x\n\tSlot %#x\n",
103 mconfig
->dev_type
, mconfig
->vbus_id
,
104 mconfig
->hw_conn_type
, mconfig
->time_slot
);
106 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
107 "Pipeline:\n\tID %d\n\tPriority %d\n\tConn Type %d\n\t"
108 "Pages %#x\n", mconfig
->pipe
->ppl_id
,
109 mconfig
->pipe
->pipe_priority
, mconfig
->pipe
->conn_type
,
110 mconfig
->pipe
->memory_pages
);
112 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
113 "\tParams:\n\t\tHost DMA %d\n\t\tLink DMA %d\n",
114 mconfig
->pipe
->p_params
->host_dma_id
,
115 mconfig
->pipe
->p_params
->link_dma_id
);
117 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
118 "\tPCM params:\n\t\tCh %d\n\t\tFreq %d\n\t\tFormat %d\n",
119 mconfig
->pipe
->p_params
->ch
,
120 mconfig
->pipe
->p_params
->s_freq
,
121 mconfig
->pipe
->p_params
->s_fmt
);
123 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
124 "\tLink %#x\n\tStream %#x\n",
125 mconfig
->pipe
->p_params
->linktype
,
126 mconfig
->pipe
->p_params
->stream
);
128 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
129 "\tState %d\n\tPassthru %s\n",
130 mconfig
->pipe
->state
,
131 mconfig
->pipe
->passthru
? "true" : "false");
133 ret
+= skl_print_pins(mconfig
->m_in_pin
, buf
,
134 mconfig
->max_in_queue
, ret
, true);
135 ret
+= skl_print_pins(mconfig
->m_out_pin
, buf
,
136 mconfig
->max_out_queue
, ret
, false);
138 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
139 "Other:\n\tDomain %d\n\tHomogeneous Input %s\n\t"
140 "Homogeneous Output %s\n\tIn Queue Mask %d\n\t"
141 "Out Queue Mask %d\n\tDMA ID %d\n\tMem Pages %d\n\t"
142 "Module Type %d\n\tModule State %d\n",
144 mconfig
->homogenous_inputs
? "true" : "false",
145 mconfig
->homogenous_outputs
? "true" : "false",
146 mconfig
->in_queue_mask
, mconfig
->out_queue_mask
,
147 mconfig
->dma_id
, mconfig
->mem_pages
, mconfig
->m_state
,
150 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, ret
);
156 static const struct file_operations mcfg_fops
= {
159 .llseek
= default_llseek
,
163 void skl_debug_init_module(struct skl_debug
*d
,
164 struct snd_soc_dapm_widget
*w
,
165 struct skl_module_cfg
*mconfig
)
167 debugfs_create_file(w
->name
, 0444, d
->modules
, mconfig
,
171 static ssize_t
fw_softreg_read(struct file
*file
, char __user
*user_buf
,
172 size_t count
, loff_t
*ppos
)
174 struct skl_debug
*d
= file
->private_data
;
175 struct sst_dsp
*sst
= d
->skl
->dsp
;
176 size_t w0_stat_sz
= sst
->addr
.w0_stat_sz
;
177 void __iomem
*in_base
= sst
->mailbox
.in_base
;
178 void __iomem
*fw_reg_addr
;
183 tmp
= kzalloc(FW_REG_BUF
, GFP_KERNEL
);
187 fw_reg_addr
= in_base
- w0_stat_sz
;
188 memset(d
->fw_read_buff
, 0, FW_REG_BUF
);
191 __ioread32_copy(d
->fw_read_buff
, fw_reg_addr
, w0_stat_sz
>> 2);
193 for (offset
= 0; offset
< FW_REG_SIZE
; offset
+= 16) {
194 ret
+= snprintf(tmp
+ ret
, FW_REG_BUF
- ret
, "%#.4x: ", offset
);
195 hex_dump_to_buffer(d
->fw_read_buff
+ offset
, 16, 16, 4,
196 tmp
+ ret
, FW_REG_BUF
- ret
, 0);
197 ret
+= strlen(tmp
+ ret
);
199 /* print newline for each offset */
200 if (FW_REG_BUF
- ret
> 0)
204 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, tmp
, ret
);
210 static const struct file_operations soft_regs_ctrl_fops
= {
212 .read
= fw_softreg_read
,
213 .llseek
= default_llseek
,
216 struct skl_debug
*skl_debugfs_init(struct skl_dev
*skl
)
220 d
= devm_kzalloc(&skl
->pci
->dev
, sizeof(*d
), GFP_KERNEL
);
224 /* create the debugfs dir with platform component's debugfs as parent */
225 d
->fs
= debugfs_create_dir("dsp", skl
->component
->debugfs_root
);
228 d
->dev
= &skl
->pci
->dev
;
230 /* now create the module dir */
231 d
->modules
= debugfs_create_dir("modules", d
->fs
);
233 debugfs_create_file("fw_soft_regs_rd", 0444, d
->fs
, d
,
234 &soft_regs_ctrl_fops
);
239 void skl_debugfs_exit(struct skl_dev
*skl
)
241 struct skl_debug
*d
= skl
->debugfs
;
243 debugfs_remove_recursive(d
->fs
);