Lines Matching refs:sdev

19 static int trace_filter_append_elem(struct snd_sof_dev *sdev, uint32_t key, uint32_t value,  in trace_filter_append_elem()  argument
33 static int trace_filter_parse_entry(struct snd_sof_dev *sdev, const char *line, in trace_filter_parse_entry() argument
53 dev_err(sdev->dev, "error: invalid trace filter entry '%s'\n", line); in trace_filter_parse_entry()
58 ret = trace_filter_append_elem(sdev, SOF_IPC_TRACE_FILTER_ELEM_BY_UUID, in trace_filter_parse_entry()
64 ret = trace_filter_append_elem(sdev, SOF_IPC_TRACE_FILTER_ELEM_BY_PIPE, in trace_filter_parse_entry()
70 ret = trace_filter_append_elem(sdev, SOF_IPC_TRACE_FILTER_ELEM_BY_COMP, in trace_filter_parse_entry()
76 ret = trace_filter_append_elem(sdev, SOF_IPC_TRACE_FILTER_ELEM_SET_LEVEL | in trace_filter_parse_entry()
88 static int trace_filter_parse(struct snd_sof_dev *sdev, char *string, in trace_filter_parse() argument
113 entry_len = trace_filter_parse_entry(sdev, entry, *out, capacity, &cnt); in trace_filter_parse()
115 dev_err(sdev->dev, "error: %s failed for '%s', %d\n", __func__, entry, in trace_filter_parse()
126 static int sof_ipc_trace_update_filter(struct snd_sof_dev *sdev, int num_elems, in sof_ipc_trace_update_filter() argument
147 ret = pm_runtime_get_sync(sdev->dev); in sof_ipc_trace_update_filter()
149 pm_runtime_put_noidle(sdev->dev); in sof_ipc_trace_update_filter()
150 dev_err(sdev->dev, "error: enabling device failed: %d\n", ret); in sof_ipc_trace_update_filter()
153 ret = sof_ipc_tx_message(sdev->ipc, msg->hdr.cmd, msg, msg->hdr.size, in sof_ipc_trace_update_filter()
155 pm_runtime_mark_last_busy(sdev->dev); in sof_ipc_trace_update_filter()
156 pm_runtime_put_autosuspend(sdev->dev); in sof_ipc_trace_update_filter()
168 struct snd_sof_dev *sdev = dfse->sdev; in sof_dfsentry_trace_filter_write() local
175 dev_err(sdev->dev, "%s too long input, %zu > %d\n", __func__, count, in sof_dfsentry_trace_filter_write()
190 ret = trace_filter_parse(sdev, string, &num_elems, &elems); in sof_dfsentry_trace_filter_write()
192 dev_err(sdev->dev, "error: fail in trace_filter_parse, %d\n", ret); in sof_dfsentry_trace_filter_write()
197 ret = sof_ipc_trace_update_filter(sdev, num_elems, elems); in sof_dfsentry_trace_filter_write()
199 dev_err(sdev->dev, "error: fail in sof_ipc_trace_update_filter %d\n", ret); in sof_dfsentry_trace_filter_write()
216 static int trace_debugfs_filter_create(struct snd_sof_dev *sdev) in trace_debugfs_filter_create() argument
220 dfse = devm_kzalloc(sdev->dev, sizeof(*dfse), GFP_KERNEL); in trace_debugfs_filter_create()
224 dfse->sdev = sdev; in trace_debugfs_filter_create()
227 debugfs_create_file("filter", 0200, sdev->debugfs_root, dfse, in trace_debugfs_filter_create()
230 list_add(&dfse->list, &sdev->dfsentry_list); in trace_debugfs_filter_create()
235 static size_t sof_trace_avail(struct snd_sof_dev *sdev, in sof_trace_avail() argument
238 loff_t host_offset = READ_ONCE(sdev->host_offset); in sof_trace_avail()
255 static size_t sof_wait_trace_avail(struct snd_sof_dev *sdev, in sof_wait_trace_avail() argument
259 size_t ret = sof_trace_avail(sdev, pos, buffer_size); in sof_wait_trace_avail()
265 if (!sdev->dtrace_is_enabled && sdev->dtrace_draining) { in sof_wait_trace_avail()
270 sdev->dtrace_draining = false; in sof_wait_trace_avail()
277 add_wait_queue(&sdev->trace_sleep, &wait); in sof_wait_trace_avail()
283 remove_wait_queue(&sdev->trace_sleep, &wait); in sof_wait_trace_avail()
285 return sof_trace_avail(sdev, pos, buffer_size); in sof_wait_trace_avail()
292 struct snd_sof_dev *sdev = dfse->sdev; in sof_dfsentry_trace_read() local
299 sdev->dtrace_error = false; in sof_dfsentry_trace_read()
315 avail = sof_wait_trace_avail(sdev, lpos, buffer_size); in sof_dfsentry_trace_read()
316 if (sdev->dtrace_error) { in sof_dfsentry_trace_read()
317 dev_err(sdev->dev, "error: trace IO error\n"); in sof_dfsentry_trace_read()
338 struct snd_sof_dev *sdev = dfse->sdev; in sof_dfsentry_trace_release() local
341 if (!sdev->dtrace_is_enabled) in sof_dfsentry_trace_release()
342 sdev->host_offset = 0; in sof_dfsentry_trace_release()
354 static int trace_debugfs_create(struct snd_sof_dev *sdev) in trace_debugfs_create() argument
359 if (!sdev) in trace_debugfs_create()
362 ret = trace_debugfs_filter_create(sdev); in trace_debugfs_create()
364 dev_err(sdev->dev, "error: fail in %s, %d", __func__, ret); in trace_debugfs_create()
366 dfse = devm_kzalloc(sdev->dev, sizeof(*dfse), GFP_KERNEL); in trace_debugfs_create()
371 dfse->buf = sdev->dmatb.area; in trace_debugfs_create()
372 dfse->size = sdev->dmatb.bytes; in trace_debugfs_create()
373 dfse->sdev = sdev; in trace_debugfs_create()
375 debugfs_create_file("trace", 0444, sdev->debugfs_root, dfse, in trace_debugfs_create()
381 int snd_sof_init_trace_ipc(struct snd_sof_dev *sdev) in snd_sof_init_trace_ipc() argument
383 struct sof_ipc_fw_ready *ready = &sdev->fw_ready; in snd_sof_init_trace_ipc()
389 if (!sdev->dtrace_is_supported) in snd_sof_init_trace_ipc()
392 if (sdev->dtrace_is_enabled || !sdev->dma_trace_pages) in snd_sof_init_trace_ipc()
406 params.buffer.phy_addr = sdev->dmatp.addr; in snd_sof_init_trace_ipc()
407 params.buffer.size = sdev->dmatb.bytes; in snd_sof_init_trace_ipc()
408 params.buffer.pages = sdev->dma_trace_pages; in snd_sof_init_trace_ipc()
411 sdev->host_offset = 0; in snd_sof_init_trace_ipc()
412 sdev->dtrace_draining = false; in snd_sof_init_trace_ipc()
414 ret = snd_sof_dma_trace_init(sdev, &params.stream_tag); in snd_sof_init_trace_ipc()
416 dev_err(sdev->dev, in snd_sof_init_trace_ipc()
420 dev_dbg(sdev->dev, "%s: stream_tag: %d\n", __func__, params.stream_tag); in snd_sof_init_trace_ipc()
423 ret = sof_ipc_tx_message(sdev->ipc, in snd_sof_init_trace_ipc()
427 dev_err(sdev->dev, in snd_sof_init_trace_ipc()
432 ret = snd_sof_dma_trace_trigger(sdev, SNDRV_PCM_TRIGGER_START); in snd_sof_init_trace_ipc()
434 dev_err(sdev->dev, in snd_sof_init_trace_ipc()
439 sdev->dtrace_is_enabled = true; in snd_sof_init_trace_ipc()
444 snd_sof_dma_trace_release(sdev); in snd_sof_init_trace_ipc()
448 int snd_sof_init_trace(struct snd_sof_dev *sdev) in snd_sof_init_trace() argument
452 if (!sdev->dtrace_is_supported) in snd_sof_init_trace()
456 sdev->dtrace_is_enabled = false; in snd_sof_init_trace()
459 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, sdev->dev, in snd_sof_init_trace()
460 PAGE_SIZE, &sdev->dmatp); in snd_sof_init_trace()
462 dev_err(sdev->dev, in snd_sof_init_trace()
468 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG, sdev->dev, in snd_sof_init_trace()
469 DMA_BUF_SIZE_FOR_TRACE, &sdev->dmatb); in snd_sof_init_trace()
471 dev_err(sdev->dev, in snd_sof_init_trace()
477 ret = snd_sof_create_page_table(sdev->dev, &sdev->dmatb, in snd_sof_init_trace()
478 sdev->dmatp.area, sdev->dmatb.bytes); in snd_sof_init_trace()
482 sdev->dma_trace_pages = ret; in snd_sof_init_trace()
483 dev_dbg(sdev->dev, "%s: dma_trace_pages: %d\n", in snd_sof_init_trace()
484 __func__, sdev->dma_trace_pages); in snd_sof_init_trace()
486 if (sdev->first_boot) { in snd_sof_init_trace()
487 ret = trace_debugfs_create(sdev); in snd_sof_init_trace()
492 init_waitqueue_head(&sdev->trace_sleep); in snd_sof_init_trace()
494 ret = snd_sof_init_trace_ipc(sdev); in snd_sof_init_trace()
500 sdev->dma_trace_pages = 0; in snd_sof_init_trace()
501 snd_dma_free_pages(&sdev->dmatb); in snd_sof_init_trace()
503 snd_dma_free_pages(&sdev->dmatp); in snd_sof_init_trace()
508 int snd_sof_trace_update_pos(struct snd_sof_dev *sdev, in snd_sof_trace_update_pos() argument
511 if (!sdev->dtrace_is_supported) in snd_sof_trace_update_pos()
514 if (sdev->dtrace_is_enabled && sdev->host_offset != posn->host_offset) { in snd_sof_trace_update_pos()
515 sdev->host_offset = posn->host_offset; in snd_sof_trace_update_pos()
516 wake_up(&sdev->trace_sleep); in snd_sof_trace_update_pos()
520 dev_err(sdev->dev, in snd_sof_trace_update_pos()
528 void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev) in snd_sof_trace_notify_for_error() argument
530 if (!sdev->dtrace_is_supported) in snd_sof_trace_notify_for_error()
533 if (sdev->dtrace_is_enabled) { in snd_sof_trace_notify_for_error()
534 sdev->dtrace_error = true; in snd_sof_trace_notify_for_error()
535 wake_up(&sdev->trace_sleep); in snd_sof_trace_notify_for_error()
540 void snd_sof_release_trace(struct snd_sof_dev *sdev) in snd_sof_release_trace() argument
544 if (!sdev->dtrace_is_supported || !sdev->dtrace_is_enabled) in snd_sof_release_trace()
547 ret = snd_sof_dma_trace_trigger(sdev, SNDRV_PCM_TRIGGER_STOP); in snd_sof_release_trace()
549 dev_err(sdev->dev, in snd_sof_release_trace()
552 ret = snd_sof_dma_trace_release(sdev); in snd_sof_release_trace()
554 dev_err(sdev->dev, in snd_sof_release_trace()
557 sdev->dtrace_is_enabled = false; in snd_sof_release_trace()
558 sdev->dtrace_draining = true; in snd_sof_release_trace()
559 wake_up(&sdev->trace_sleep); in snd_sof_release_trace()
563 void snd_sof_free_trace(struct snd_sof_dev *sdev) in snd_sof_free_trace() argument
565 if (!sdev->dtrace_is_supported) in snd_sof_free_trace()
568 snd_sof_release_trace(sdev); in snd_sof_free_trace()
570 if (sdev->dma_trace_pages) { in snd_sof_free_trace()
571 snd_dma_free_pages(&sdev->dmatb); in snd_sof_free_trace()
572 snd_dma_free_pages(&sdev->dmatp); in snd_sof_free_trace()
573 sdev->dma_trace_pages = 0; in snd_sof_free_trace()