Lines Matching refs:sdev
16 static size_t sof_trace_avail(struct snd_sof_dev *sdev,
19 loff_t host_offset = READ_ONCE(sdev->host_offset);
36 static size_t sof_wait_trace_avail(struct snd_sof_dev *sdev,
40 size_t ret = sof_trace_avail(sdev, pos, buffer_size);
46 if (!sdev->dtrace_is_enabled && sdev->dtrace_draining) {
51 sdev->dtrace_draining = false;
58 add_wait_queue(&sdev->trace_sleep, &wait);
64 remove_wait_queue(&sdev->trace_sleep, &wait);
66 return sof_trace_avail(sdev, pos, buffer_size);
73 struct snd_sof_dev *sdev = dfse->sdev;
80 sdev->dtrace_error = false;
96 avail = sof_wait_trace_avail(sdev, lpos, buffer_size);
97 if (sdev->dtrace_error) {
98 dev_err(sdev->dev, "error: trace IO error\n");
119 struct snd_sof_dev *sdev = dfse->sdev;
122 if (!sdev->dtrace_is_enabled)
123 sdev->host_offset = 0;
135 static int trace_debugfs_create(struct snd_sof_dev *sdev)
139 if (!sdev)
142 dfse = devm_kzalloc(sdev->dev, sizeof(*dfse), GFP_KERNEL);
147 dfse->buf = sdev->dmatb.area;
148 dfse->size = sdev->dmatb.bytes;
149 dfse->sdev = sdev;
151 debugfs_create_file("trace", 0444, sdev->debugfs_root, dfse,
157 int snd_sof_init_trace_ipc(struct snd_sof_dev *sdev)
159 struct sof_ipc_fw_ready *ready = &sdev->fw_ready;
165 if (!sdev->dtrace_is_supported)
168 if (sdev->dtrace_is_enabled || !sdev->dma_trace_pages)
182 params.buffer.phy_addr = sdev->dmatp.addr;
183 params.buffer.size = sdev->dmatb.bytes;
184 params.buffer.pages = sdev->dma_trace_pages;
187 sdev->host_offset = 0;
188 sdev->dtrace_draining = false;
190 ret = snd_sof_dma_trace_init(sdev, ¶ms.stream_tag);
192 dev_err(sdev->dev,
196 dev_dbg(sdev->dev, "stream_tag: %d\n", params.stream_tag);
199 ret = sof_ipc_tx_message(sdev->ipc,
203 dev_err(sdev->dev,
208 ret = snd_sof_dma_trace_trigger(sdev, SNDRV_PCM_TRIGGER_START);
210 dev_err(sdev->dev,
215 sdev->dtrace_is_enabled = true;
220 snd_sof_dma_trace_release(sdev);
224 int snd_sof_init_trace(struct snd_sof_dev *sdev)
228 if (!sdev->dtrace_is_supported)
232 sdev->dtrace_is_enabled = false;
235 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, sdev->dev,
236 PAGE_SIZE, &sdev->dmatp);
238 dev_err(sdev->dev,
244 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG, sdev->dev,
245 DMA_BUF_SIZE_FOR_TRACE, &sdev->dmatb);
247 dev_err(sdev->dev,
253 ret = snd_sof_create_page_table(sdev->dev, &sdev->dmatb,
254 sdev->dmatp.area, sdev->dmatb.bytes);
258 sdev->dma_trace_pages = ret;
259 dev_dbg(sdev->dev, "dma_trace_pages: %d\n", sdev->dma_trace_pages);
261 if (sdev->first_boot) {
262 ret = trace_debugfs_create(sdev);
267 init_waitqueue_head(&sdev->trace_sleep);
269 ret = snd_sof_init_trace_ipc(sdev);
275 sdev->dma_trace_pages = 0;
276 snd_dma_free_pages(&sdev->dmatb);
278 snd_dma_free_pages(&sdev->dmatp);
283 int snd_sof_trace_update_pos(struct snd_sof_dev *sdev,
286 if (!sdev->dtrace_is_supported)
289 if (sdev->dtrace_is_enabled && sdev->host_offset != posn->host_offset) {
290 sdev->host_offset = posn->host_offset;
291 wake_up(&sdev->trace_sleep);
295 dev_err(sdev->dev,
303 void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev)
305 if (!sdev->dtrace_is_supported)
308 if (sdev->dtrace_is_enabled) {
309 dev_err(sdev->dev, "error: waking up any trace sleepers\n");
310 sdev->dtrace_error = true;
311 wake_up(&sdev->trace_sleep);
316 void snd_sof_release_trace(struct snd_sof_dev *sdev)
320 if (!sdev->dtrace_is_supported || !sdev->dtrace_is_enabled)
323 ret = snd_sof_dma_trace_trigger(sdev, SNDRV_PCM_TRIGGER_STOP);
325 dev_err(sdev->dev,
328 ret = snd_sof_dma_trace_release(sdev);
330 dev_err(sdev->dev,
333 sdev->dtrace_is_enabled = false;
334 sdev->dtrace_draining = true;
335 wake_up(&sdev->trace_sleep);
339 void snd_sof_free_trace(struct snd_sof_dev *sdev)
341 if (!sdev->dtrace_is_supported)
344 snd_sof_release_trace(sdev);
346 if (sdev->dma_trace_pages) {
347 snd_dma_free_pages(&sdev->dmatb);
348 snd_dma_free_pages(&sdev->dmatp);
349 sdev->dma_trace_pages = 0;