Lines Matching refs:sdev
16 static size_t sof_trace_avail(struct snd_sof_dev *sdev, in sof_trace_avail() argument
19 loff_t host_offset = READ_ONCE(sdev->host_offset); in sof_trace_avail()
36 static size_t sof_wait_trace_avail(struct snd_sof_dev *sdev, in sof_wait_trace_avail() argument
40 size_t ret = sof_trace_avail(sdev, pos, buffer_size); in sof_wait_trace_avail()
46 if (!sdev->dtrace_is_enabled && sdev->dtrace_draining) { in sof_wait_trace_avail()
51 sdev->dtrace_draining = false; in sof_wait_trace_avail()
58 add_wait_queue(&sdev->trace_sleep, &wait); in sof_wait_trace_avail()
64 remove_wait_queue(&sdev->trace_sleep, &wait); in sof_wait_trace_avail()
66 return sof_trace_avail(sdev, pos, buffer_size); in sof_wait_trace_avail()
73 struct snd_sof_dev *sdev = dfse->sdev; in sof_dfsentry_trace_read() local
80 sdev->dtrace_error = false; in sof_dfsentry_trace_read()
96 avail = sof_wait_trace_avail(sdev, lpos, buffer_size); in sof_dfsentry_trace_read()
97 if (sdev->dtrace_error) { in sof_dfsentry_trace_read()
98 dev_err(sdev->dev, "error: trace IO error\n"); in sof_dfsentry_trace_read()
119 struct snd_sof_dev *sdev = dfse->sdev; in sof_dfsentry_trace_release() local
122 if (!sdev->dtrace_is_enabled) in sof_dfsentry_trace_release()
123 sdev->host_offset = 0; in sof_dfsentry_trace_release()
135 static int trace_debugfs_create(struct snd_sof_dev *sdev) in trace_debugfs_create() argument
139 if (!sdev) in trace_debugfs_create()
142 dfse = devm_kzalloc(sdev->dev, sizeof(*dfse), GFP_KERNEL); in trace_debugfs_create()
147 dfse->buf = sdev->dmatb.area; in trace_debugfs_create()
148 dfse->size = sdev->dmatb.bytes; in trace_debugfs_create()
149 dfse->sdev = sdev; in trace_debugfs_create()
151 debugfs_create_file("trace", 0444, sdev->debugfs_root, dfse, in trace_debugfs_create()
157 int snd_sof_init_trace_ipc(struct snd_sof_dev *sdev) in snd_sof_init_trace_ipc() argument
159 struct sof_ipc_fw_ready *ready = &sdev->fw_ready; in snd_sof_init_trace_ipc()
165 if (sdev->dtrace_is_enabled || !sdev->dma_trace_pages) in snd_sof_init_trace_ipc()
179 params.buffer.phy_addr = sdev->dmatp.addr; in snd_sof_init_trace_ipc()
180 params.buffer.size = sdev->dmatb.bytes; in snd_sof_init_trace_ipc()
181 params.buffer.pages = sdev->dma_trace_pages; in snd_sof_init_trace_ipc()
184 sdev->host_offset = 0; in snd_sof_init_trace_ipc()
185 sdev->dtrace_draining = false; in snd_sof_init_trace_ipc()
187 ret = snd_sof_dma_trace_init(sdev, ¶ms.stream_tag); in snd_sof_init_trace_ipc()
189 dev_err(sdev->dev, in snd_sof_init_trace_ipc()
193 dev_dbg(sdev->dev, "stream_tag: %d\n", params.stream_tag); in snd_sof_init_trace_ipc()
196 ret = sof_ipc_tx_message(sdev->ipc, in snd_sof_init_trace_ipc()
200 dev_err(sdev->dev, in snd_sof_init_trace_ipc()
205 ret = snd_sof_dma_trace_trigger(sdev, SNDRV_PCM_TRIGGER_START); in snd_sof_init_trace_ipc()
207 dev_err(sdev->dev, in snd_sof_init_trace_ipc()
212 sdev->dtrace_is_enabled = true; in snd_sof_init_trace_ipc()
217 snd_sof_dma_trace_release(sdev); in snd_sof_init_trace_ipc()
221 int snd_sof_init_trace(struct snd_sof_dev *sdev) in snd_sof_init_trace() argument
226 sdev->dtrace_is_enabled = false; in snd_sof_init_trace()
229 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, sdev->dev, in snd_sof_init_trace()
230 PAGE_SIZE, &sdev->dmatp); in snd_sof_init_trace()
232 dev_err(sdev->dev, in snd_sof_init_trace()
238 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG, sdev->dev, in snd_sof_init_trace()
239 DMA_BUF_SIZE_FOR_TRACE, &sdev->dmatb); in snd_sof_init_trace()
241 dev_err(sdev->dev, in snd_sof_init_trace()
247 ret = snd_sof_create_page_table(sdev, &sdev->dmatb, sdev->dmatp.area, in snd_sof_init_trace()
248 sdev->dmatb.bytes); in snd_sof_init_trace()
252 sdev->dma_trace_pages = ret; in snd_sof_init_trace()
253 dev_dbg(sdev->dev, "dma_trace_pages: %d\n", sdev->dma_trace_pages); in snd_sof_init_trace()
255 if (sdev->first_boot) { in snd_sof_init_trace()
256 ret = trace_debugfs_create(sdev); in snd_sof_init_trace()
261 init_waitqueue_head(&sdev->trace_sleep); in snd_sof_init_trace()
263 ret = snd_sof_init_trace_ipc(sdev); in snd_sof_init_trace()
269 sdev->dma_trace_pages = 0; in snd_sof_init_trace()
270 snd_dma_free_pages(&sdev->dmatb); in snd_sof_init_trace()
272 snd_dma_free_pages(&sdev->dmatp); in snd_sof_init_trace()
277 int snd_sof_trace_update_pos(struct snd_sof_dev *sdev, in snd_sof_trace_update_pos() argument
280 if (sdev->dtrace_is_enabled && sdev->host_offset != posn->host_offset) { in snd_sof_trace_update_pos()
281 sdev->host_offset = posn->host_offset; in snd_sof_trace_update_pos()
282 wake_up(&sdev->trace_sleep); in snd_sof_trace_update_pos()
286 dev_err(sdev->dev, in snd_sof_trace_update_pos()
294 void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev) in snd_sof_trace_notify_for_error() argument
296 if (sdev->dtrace_is_enabled) { in snd_sof_trace_notify_for_error()
297 dev_err(sdev->dev, "error: waking up any trace sleepers\n"); in snd_sof_trace_notify_for_error()
298 sdev->dtrace_error = true; in snd_sof_trace_notify_for_error()
299 wake_up(&sdev->trace_sleep); in snd_sof_trace_notify_for_error()
304 void snd_sof_release_trace(struct snd_sof_dev *sdev) in snd_sof_release_trace() argument
308 if (!sdev->dtrace_is_enabled) in snd_sof_release_trace()
311 ret = snd_sof_dma_trace_trigger(sdev, SNDRV_PCM_TRIGGER_STOP); in snd_sof_release_trace()
313 dev_err(sdev->dev, in snd_sof_release_trace()
316 ret = snd_sof_dma_trace_release(sdev); in snd_sof_release_trace()
318 dev_err(sdev->dev, in snd_sof_release_trace()
321 sdev->dtrace_is_enabled = false; in snd_sof_release_trace()
322 sdev->dtrace_draining = true; in snd_sof_release_trace()
323 wake_up(&sdev->trace_sleep); in snd_sof_release_trace()
327 void snd_sof_free_trace(struct snd_sof_dev *sdev) in snd_sof_free_trace() argument
329 snd_sof_release_trace(sdev); in snd_sof_free_trace()
331 snd_dma_free_pages(&sdev->dmatb); in snd_sof_free_trace()
332 snd_dma_free_pages(&sdev->dmatp); in snd_sof_free_trace()