2 * skl-debug.c - Debugfs for skl driver
4 * Copyright (C) 2016-17 Intel Corp
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
16 #include <linux/pci.h>
17 #include <linux/debugfs.h>
19 #include "skl-sst-dsp.h"
20 #include "skl-sst-ipc.h"
21 #include "skl-tplg-interface.h"
22 #include "skl-topology.h"
23 #include "../common/sst-dsp.h"
24 #include "../common/sst-dsp-priv.h"
26 #define MOD_BUF PAGE_SIZE
27 #define FW_REG_BUF PAGE_SIZE
28 #define FW_REG_SIZE 0x60
35 struct dentry
*modules
;
36 u8 fw_read_buff
[FW_REG_BUF
];
39 static ssize_t
skl_print_pins(struct skl_module_pin
*m_pin
, char *buf
,
40 int max_pin
, ssize_t size
, bool direction
)
45 for (i
= 0; i
< max_pin
; i
++)
46 ret
+= snprintf(buf
+ size
, MOD_BUF
- size
,
47 "%s %d\n\tModule %d\n\tInstance %d\n\t"
48 "In-used %s\n\tType %s\n"
49 "\tState %d\n\tIndex %d\n",
50 direction
? "Input Pin:" : "Output Pin:",
51 i
, m_pin
[i
].id
.module_id
,
52 m_pin
[i
].id
.instance_id
,
53 m_pin
[i
].in_use
? "Used" : "Unused",
54 m_pin
[i
].is_dynamic
? "Dynamic" : "Static",
55 m_pin
[i
].pin_state
, i
);
59 static ssize_t
skl_print_fmt(struct skl_module_fmt
*fmt
, char *buf
,
60 ssize_t size
, bool direction
)
62 return snprintf(buf
+ size
, MOD_BUF
- size
,
63 "%s\n\tCh %d\n\tFreq %d\n\tBit depth %d\n\t"
64 "Valid bit depth %d\n\tCh config %#x\n\tInterleaving %d\n\t"
65 "Sample Type %d\n\tCh Map %#x\n",
66 direction
? "Input Format:" : "Output Format:",
67 fmt
->channels
, fmt
->s_freq
, fmt
->bit_depth
,
68 fmt
->valid_bit_depth
, fmt
->ch_cfg
,
69 fmt
->interleaving_style
, fmt
->sample_type
,
73 static ssize_t
module_read(struct file
*file
, char __user
*user_buf
,
74 size_t count
, loff_t
*ppos
)
76 struct skl_module_cfg
*mconfig
= file
->private_data
;
80 buf
= kzalloc(MOD_BUF
, GFP_KERNEL
);
84 ret
= snprintf(buf
, MOD_BUF
, "Module:\n\tUUID %pUL\n\tModule id %d\n"
85 "\tInstance id %d\n\tPvt_id %d\n", mconfig
->guid
,
86 mconfig
->id
.module_id
, mconfig
->id
.instance_id
,
89 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
90 "Resources:\n\tMCPS %#x\n\tIBS %#x\n\tOBS %#x\t\n",
91 mconfig
->mcps
, mconfig
->ibs
, mconfig
->obs
);
93 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
94 "Module data:\n\tCore %d\n\tIn queue %d\n\t"
95 "Out queue %d\n\tType %s\n",
96 mconfig
->core_id
, mconfig
->max_in_queue
,
97 mconfig
->max_out_queue
,
98 mconfig
->is_loadable
? "loadable" : "inbuilt");
100 ret
+= skl_print_fmt(mconfig
->in_fmt
, buf
, ret
, true);
101 ret
+= skl_print_fmt(mconfig
->out_fmt
, buf
, ret
, false);
103 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
104 "Fixup:\n\tParams %#x\n\tConverter %#x\n",
105 mconfig
->params_fixup
, mconfig
->converter
);
107 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
108 "Module Gateway:\n\tType %#x\n\tVbus %#x\n\tHW conn %#x\n\tSlot %#x\n",
109 mconfig
->dev_type
, mconfig
->vbus_id
,
110 mconfig
->hw_conn_type
, mconfig
->time_slot
);
112 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
113 "Pipeline:\n\tID %d\n\tPriority %d\n\tConn Type %d\n\t"
114 "Pages %#x\n", mconfig
->pipe
->ppl_id
,
115 mconfig
->pipe
->pipe_priority
, mconfig
->pipe
->conn_type
,
116 mconfig
->pipe
->memory_pages
);
118 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
119 "\tParams:\n\t\tHost DMA %d\n\t\tLink DMA %d\n",
120 mconfig
->pipe
->p_params
->host_dma_id
,
121 mconfig
->pipe
->p_params
->link_dma_id
);
123 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
124 "\tPCM params:\n\t\tCh %d\n\t\tFreq %d\n\t\tFormat %d\n",
125 mconfig
->pipe
->p_params
->ch
,
126 mconfig
->pipe
->p_params
->s_freq
,
127 mconfig
->pipe
->p_params
->s_fmt
);
129 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
130 "\tLink %#x\n\tStream %#x\n",
131 mconfig
->pipe
->p_params
->linktype
,
132 mconfig
->pipe
->p_params
->stream
);
134 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
135 "\tState %d\n\tPassthru %s\n",
136 mconfig
->pipe
->state
,
137 mconfig
->pipe
->passthru
? "true" : "false");
139 ret
+= skl_print_pins(mconfig
->m_in_pin
, buf
,
140 mconfig
->max_in_queue
, ret
, true);
141 ret
+= skl_print_pins(mconfig
->m_out_pin
, buf
,
142 mconfig
->max_out_queue
, ret
, false);
144 ret
+= snprintf(buf
+ ret
, MOD_BUF
- ret
,
145 "Other:\n\tDomain %d\n\tHomogenous Input %s\n\t"
146 "Homogenous Output %s\n\tIn Queue Mask %d\n\t"
147 "Out Queue Mask %d\n\tDMA ID %d\n\tMem Pages %d\n\t"
148 "Module Type %d\n\tModule State %d\n",
150 mconfig
->homogenous_inputs
? "true" : "false",
151 mconfig
->homogenous_outputs
? "true" : "false",
152 mconfig
->in_queue_mask
, mconfig
->out_queue_mask
,
153 mconfig
->dma_id
, mconfig
->mem_pages
, mconfig
->m_state
,
156 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, ret
);
162 static const struct file_operations mcfg_fops
= {
165 .llseek
= default_llseek
,
169 void skl_debug_init_module(struct skl_debug
*d
,
170 struct snd_soc_dapm_widget
*w
,
171 struct skl_module_cfg
*mconfig
)
173 if (!debugfs_create_file(w
->name
, 0444,
176 dev_err(d
->dev
, "%s: module debugfs init failed\n", w
->name
);
179 static ssize_t
fw_softreg_read(struct file
*file
, char __user
*user_buf
,
180 size_t count
, loff_t
*ppos
)
182 struct skl_debug
*d
= file
->private_data
;
183 struct sst_dsp
*sst
= d
->skl
->skl_sst
->dsp
;
184 size_t w0_stat_sz
= sst
->addr
.w0_stat_sz
;
185 void __iomem
*in_base
= sst
->mailbox
.in_base
;
186 void __iomem
*fw_reg_addr
;
191 tmp
= kzalloc(FW_REG_BUF
, GFP_KERNEL
);
195 fw_reg_addr
= in_base
- w0_stat_sz
;
196 memset(d
->fw_read_buff
, 0, FW_REG_BUF
);
199 __iowrite32_copy(d
->fw_read_buff
, fw_reg_addr
, w0_stat_sz
>> 2);
201 for (offset
= 0; offset
< FW_REG_SIZE
; offset
+= 16) {
202 ret
+= snprintf(tmp
+ ret
, FW_REG_BUF
- ret
, "%#.4x: ", offset
);
203 hex_dump_to_buffer(d
->fw_read_buff
+ offset
, 16, 16, 4,
204 tmp
+ ret
, FW_REG_BUF
- ret
, 0);
205 ret
+= strlen(tmp
+ ret
);
207 /* print newline for each offset */
208 if (FW_REG_BUF
- ret
> 0)
212 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, tmp
, ret
);
218 static const struct file_operations soft_regs_ctrl_fops
= {
220 .read
= fw_softreg_read
,
221 .llseek
= default_llseek
,
224 struct skl_debug
*skl_debugfs_init(struct skl
*skl
)
228 d
= devm_kzalloc(&skl
->pci
->dev
, sizeof(*d
), GFP_KERNEL
);
232 /* create the debugfs dir with platform component's debugfs as parent */
233 d
->fs
= debugfs_create_dir("dsp",
234 skl
->platform
->component
.debugfs_root
);
235 if (IS_ERR(d
->fs
) || !d
->fs
) {
236 dev_err(&skl
->pci
->dev
, "debugfs root creation failed\n");
241 d
->dev
= &skl
->pci
->dev
;
243 /* now create the module dir */
244 d
->modules
= debugfs_create_dir("modules", d
->fs
);
245 if (IS_ERR(d
->modules
) || !d
->modules
) {
246 dev_err(&skl
->pci
->dev
, "modules debugfs create failed\n");
250 if (!debugfs_create_file("fw_soft_regs_rd", 0444, d
->fs
, d
,
251 &soft_regs_ctrl_fops
)) {
252 dev_err(d
->dev
, "fw soft regs control debugfs init failed\n");
259 debugfs_remove_recursive(d
->fs
);