Lines Matching +full:trace +full:- +full:buffer +full:- +full:extension
1 // SPDX-License-Identifier: GPL-2.0-only
8 #include "sof-priv.h"
9 #include "ipc4-priv.h"
14 * ------------------------
15 * | Page0 - descriptors |
16 * ------------------------
17 * | Page1 - slot0 |
18 * ------------------------
19 * | Page2 - slot1 |
20 * ------------------------
22 * ------------------------
23 * | Page14 - slot13 |
24 * ------------------------
25 * | Page15 - slot14 |
26 * ------------------------
36 * Log buffer slots have the following layout:
39 * u8 buffer[];
41 * The two pointers are offsets within the buffer.
117 struct sof_mtrace_core_data *core_data = inode->i_private; in sof_ipc4_mtrace_dfs_open()
120 mutex_lock(&core_data->buffer_lock); in sof_ipc4_mtrace_dfs_open()
122 if (core_data->log_buffer) { in sof_ipc4_mtrace_dfs_open()
123 ret = -EBUSY; in sof_ipc4_mtrace_dfs_open()
127 ret = debugfs_file_get(file->f_path.dentry); in sof_ipc4_mtrace_dfs_open()
131 core_data->log_buffer = kmalloc(SOF_IPC4_DEBUG_SLOT_SIZE, GFP_KERNEL); in sof_ipc4_mtrace_dfs_open()
132 if (!core_data->log_buffer) { in sof_ipc4_mtrace_dfs_open()
133 debugfs_file_put(file->f_path.dentry); in sof_ipc4_mtrace_dfs_open()
134 ret = -ENOMEM; in sof_ipc4_mtrace_dfs_open()
140 kfree(core_data->log_buffer); in sof_ipc4_mtrace_dfs_open()
141 debugfs_file_put(file->f_path.dentry); in sof_ipc4_mtrace_dfs_open()
145 mutex_unlock(&core_data->buffer_lock); in sof_ipc4_mtrace_dfs_open()
155 if (core_data->host_read_ptr != core_data->dsp_write_ptr) in sof_wait_mtrace_avail()
158 /* wait for available trace data from FW */ in sof_wait_mtrace_avail()
161 add_wait_queue(&core_data->trace_sleep, &wait); in sof_wait_mtrace_avail()
167 remove_wait_queue(&core_data->trace_sleep, &wait); in sof_wait_mtrace_avail()
169 if (core_data->host_read_ptr != core_data->dsp_write_ptr) in sof_wait_mtrace_avail()
175 static ssize_t sof_ipc4_mtrace_dfs_read(struct file *file, char __user *buffer, in sof_ipc4_mtrace_dfs_read() argument
178 struct sof_mtrace_core_data *core_data = file->private_data; in sof_ipc4_mtrace_dfs_read()
180 struct snd_sof_dev *sdev = core_data->sdev; in sof_ipc4_mtrace_dfs_read()
181 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in sof_ipc4_mtrace_dfs_read()
182 void *log_buffer = core_data->log_buffer; in sof_ipc4_mtrace_dfs_read()
189 return -EINVAL; in sof_ipc4_mtrace_dfs_read()
197 if (copy_to_user(buffer, &avail, sizeof(avail))) in sof_ipc4_mtrace_dfs_read()
198 return -EFAULT; in sof_ipc4_mtrace_dfs_read()
203 if (core_data->slot_offset == SOF_IPC4_INVALID_SLOT_OFFSET) in sof_ipc4_mtrace_dfs_read()
206 /* The log data buffer starts after the two pointer in the slot */ in sof_ipc4_mtrace_dfs_read()
207 log_buffer_offset = core_data->slot_offset + (sizeof(u32) * 2); in sof_ipc4_mtrace_dfs_read()
209 log_buffer_size = SOF_IPC4_DEBUG_SLOT_SIZE - (sizeof(u32) * 2); in sof_ipc4_mtrace_dfs_read()
211 read_ptr = core_data->host_read_ptr; in sof_ipc4_mtrace_dfs_read()
212 write_ptr = core_data->dsp_write_ptr; in sof_ipc4_mtrace_dfs_read()
215 avail = write_ptr - read_ptr; in sof_ipc4_mtrace_dfs_read()
217 avail = log_buffer_size - read_ptr + write_ptr; in sof_ipc4_mtrace_dfs_read()
226 if (avail > count - sizeof(avail)) in sof_ipc4_mtrace_dfs_read()
227 avail = count - sizeof(avail); in sof_ipc4_mtrace_dfs_read()
230 dev_dbg(sdev->dev, in sof_ipc4_mtrace_dfs_read()
232 core_data->id, read_ptr, write_ptr, avail); in sof_ipc4_mtrace_dfs_read()
240 avail - write_ptr); in sof_ipc4_mtrace_dfs_read()
244 (u8 *)(log_buffer) + avail - write_ptr, in sof_ipc4_mtrace_dfs_read()
249 ret = copy_to_user(buffer, &avail, sizeof(avail)); in sof_ipc4_mtrace_dfs_read()
251 return -EFAULT; in sof_ipc4_mtrace_dfs_read()
254 ret = copy_to_user(buffer + sizeof(avail), log_buffer, avail); in sof_ipc4_mtrace_dfs_read()
256 return -EFAULT; in sof_ipc4_mtrace_dfs_read()
261 read_ptr -= log_buffer_size; in sof_ipc4_mtrace_dfs_read()
262 sof_mailbox_write(sdev, core_data->slot_offset, &read_ptr, sizeof(read_ptr)); in sof_ipc4_mtrace_dfs_read()
265 if (priv->mtrace_state != SOF_MTRACE_DISABLED) in sof_ipc4_mtrace_dfs_read()
266 core_data->host_read_ptr = read_ptr; in sof_ipc4_mtrace_dfs_read()
269 * Ask for a new buffer from user space for the next chunk, not in sof_ipc4_mtrace_dfs_read()
279 struct sof_mtrace_core_data *core_data = inode->i_private; in sof_ipc4_mtrace_dfs_release()
281 debugfs_file_put(file->f_path.dentry); in sof_ipc4_mtrace_dfs_release()
283 mutex_lock(&core_data->buffer_lock); in sof_ipc4_mtrace_dfs_release()
284 kfree(core_data->log_buffer); in sof_ipc4_mtrace_dfs_release()
285 core_data->log_buffer = NULL; in sof_ipc4_mtrace_dfs_release()
286 mutex_unlock(&core_data->buffer_lock); in sof_ipc4_mtrace_dfs_release()
303 struct sof_mtrace_priv *priv = file->private_data; in sof_ipc4_priority_mask_dfs_read()
315 return -ENOMEM; in sof_ipc4_priority_mask_dfs_read()
319 remaining = 241 - offset; in sof_ipc4_priority_mask_dfs_read()
321 priv->state_info.logs_priorities_mask[i]); in sof_ipc4_priority_mask_dfs_read()
334 struct sof_mtrace_priv *priv = file->private_data; in sof_ipc4_priority_mask_dfs_write()
353 ret = -EINVAL; in sof_ipc4_priority_mask_dfs_write()
359 ret = -EINVAL; in sof_ipc4_priority_mask_dfs_write()
363 priv->state_info.logs_priorities_mask[id] = mask; in sof_ipc4_priority_mask_dfs_write()
382 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in mtrace_debugfs_create()
387 dfs_root = debugfs_create_dir("mtrace", sdev->debugfs_root); in mtrace_debugfs_create()
393 &priv->state_info.aging_timer_period); in mtrace_debugfs_create()
395 &priv->state_info.fifo_full_timer_period); in mtrace_debugfs_create()
400 for (i = 0; i < sdev->num_cores; i++) { in mtrace_debugfs_create()
402 debugfs_create_file(dfs_name, 0444, dfs_root, &priv->cores[i], in mtrace_debugfs_create()
411 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in ipc4_mtrace_enable()
412 const struct sof_ipc_ops *iops = sdev->ipc->ops; in ipc4_mtrace_enable()
418 if (priv->mtrace_state != SOF_MTRACE_DISABLED) in ipc4_mtrace_enable()
425 msg.extension = SOF_IPC4_MOD_EXT_MSG_PARAM_ID(SOF_IPC4_FW_PARAM_SYSTEM_TIME); in ipc4_mtrace_enable()
427 /* The system time is in usec, UTC, epoch is 1601-01-01 00:00:00 */ in ipc4_mtrace_enable()
432 ret = iops->set_get_data(sdev, &msg, msg.data_size, true); in ipc4_mtrace_enable()
436 msg.extension = SOF_IPC4_MOD_EXT_MSG_PARAM_ID(SOF_IPC4_FW_PARAM_ENABLE_LOGS); in ipc4_mtrace_enable()
438 priv->state_info.enable = 1; in ipc4_mtrace_enable()
440 msg.data_size = sizeof(priv->state_info); in ipc4_mtrace_enable()
441 msg.data_ptr = &priv->state_info; in ipc4_mtrace_enable()
443 priv->mtrace_state = SOF_MTRACE_INITIALIZING; in ipc4_mtrace_enable()
444 ret = iops->set_get_data(sdev, &msg, msg.data_size, true); in ipc4_mtrace_enable()
446 priv->mtrace_state = SOF_MTRACE_DISABLED; in ipc4_mtrace_enable()
450 priv->mtrace_state = SOF_MTRACE_ENABLED; in ipc4_mtrace_enable()
457 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in ipc4_mtrace_disable()
458 const struct sof_ipc_ops *iops = sdev->ipc->ops; in ipc4_mtrace_disable()
462 if (priv->mtrace_state == SOF_MTRACE_DISABLED) in ipc4_mtrace_disable()
469 msg.extension = SOF_IPC4_MOD_EXT_MSG_PARAM_ID(SOF_IPC4_FW_PARAM_ENABLE_LOGS); in ipc4_mtrace_disable()
471 priv->state_info.enable = 0; in ipc4_mtrace_disable()
473 msg.data_size = sizeof(priv->state_info); in ipc4_mtrace_disable()
474 msg.data_ptr = &priv->state_info; in ipc4_mtrace_disable()
475 iops->set_get_data(sdev, &msg, msg.data_size, true); in ipc4_mtrace_disable()
477 priv->mtrace_state = SOF_MTRACE_DISABLED; in ipc4_mtrace_disable()
479 for (i = 0; i < sdev->num_cores; i++) { in ipc4_mtrace_disable()
480 struct sof_mtrace_core_data *core_data = &priv->cores[i]; in ipc4_mtrace_disable()
482 core_data->host_read_ptr = 0; in ipc4_mtrace_disable()
483 core_data->dsp_write_ptr = 0; in ipc4_mtrace_disable()
484 wake_up(&core_data->trace_sleep); in ipc4_mtrace_disable()
496 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in sof_mtrace_find_core_slots()
503 slot_desc_type_offset = sdev->debug_box.offset; in sof_mtrace_find_core_slots()
510 if (core >= sdev->num_cores) { in sof_mtrace_find_core_slots()
511 dev_dbg(sdev->dev, "core%u is invalid for slot%d\n", in sof_mtrace_find_core_slots()
516 core_data = &priv->cores[core]; in sof_mtrace_find_core_slots()
523 core_data->slot_offset = sdev->debug_box.offset; in sof_mtrace_find_core_slots()
524 core_data->slot_offset += SOF_IPC4_DEBUG_SLOT_SIZE * (i + 1); in sof_mtrace_find_core_slots()
525 dev_dbg(sdev->dev, "slot%d is used for core%u\n", i, core); in sof_mtrace_find_core_slots()
526 if (core_data->delayed_pos_update) { in sof_mtrace_find_core_slots()
528 core_data->delayed_pos_update = false; in sof_mtrace_find_core_slots()
531 dev_dbg(sdev->dev, "slot%d is not a log slot (%#x)\n", i, type); in sof_mtrace_find_core_slots()
538 struct sof_ipc4_fw_data *ipc4_data = sdev->private; in ipc4_mtrace_init()
542 if (sdev->fw_trace_data) { in ipc4_mtrace_init()
543 dev_err(sdev->dev, "fw_trace_data has been already allocated\n"); in ipc4_mtrace_init()
544 return -EBUSY; in ipc4_mtrace_init()
547 if (!ipc4_data->mtrace_log_bytes || in ipc4_mtrace_init()
548 ipc4_data->mtrace_type != SOF_IPC4_MTRACE_INTEL_CAVS_2) { in ipc4_mtrace_init()
549 sdev->fw_trace_is_supported = false; in ipc4_mtrace_init()
553 priv = devm_kzalloc(sdev->dev, struct_size(priv, cores, sdev->num_cores), in ipc4_mtrace_init()
556 return -ENOMEM; in ipc4_mtrace_init()
558 sdev->fw_trace_data = priv; in ipc4_mtrace_init()
561 priv->state_info.aging_timer_period = DEFAULT_AGING_TIMER_PERIOD_MS; in ipc4_mtrace_init()
562 priv->state_info.fifo_full_timer_period = DEFAULT_FIFO_FULL_TIMER_PERIOD_MS; in ipc4_mtrace_init()
564 priv->state_info.logs_priorities_mask[0] = DEFAULT_LOGS_PRIORITIES_MASK; in ipc4_mtrace_init()
566 for (i = 0; i < sdev->num_cores; i++) { in ipc4_mtrace_init()
567 struct sof_mtrace_core_data *core_data = &priv->cores[i]; in ipc4_mtrace_init()
569 init_waitqueue_head(&core_data->trace_sleep); in ipc4_mtrace_init()
570 mutex_init(&core_data->buffer_lock); in ipc4_mtrace_init()
571 core_data->sdev = sdev; in ipc4_mtrace_init()
572 core_data->id = i; in ipc4_mtrace_init()
581 sdev->fw_trace_is_supported = false; in ipc4_mtrace_init()
582 dev_dbg(sdev->dev, "initialization failed, fw tracing is disabled\n"); in ipc4_mtrace_init()
604 for (i = 0; i < sdev->num_cores; i++) in sof_ipc4_mtrace_update_pos_all_cores()
612 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in sof_ipc4_mtrace_update_pos()
615 if (!sdev->fw_trace_is_supported || in sof_ipc4_mtrace_update_pos()
616 priv->mtrace_state == SOF_MTRACE_DISABLED) in sof_ipc4_mtrace_update_pos()
619 if (core >= sdev->num_cores) in sof_ipc4_mtrace_update_pos()
620 return -EINVAL; in sof_ipc4_mtrace_update_pos()
622 core_data = &priv->cores[core]; in sof_ipc4_mtrace_update_pos()
624 if (core_data->slot_offset == SOF_IPC4_INVALID_SLOT_OFFSET) { in sof_ipc4_mtrace_update_pos()
625 core_data->delayed_pos_update = true; in sof_ipc4_mtrace_update_pos()
630 sof_mailbox_read(sdev, core_data->slot_offset + sizeof(u32), in sof_ipc4_mtrace_update_pos()
631 &core_data->dsp_write_ptr, 4); in sof_ipc4_mtrace_update_pos()
632 core_data->dsp_write_ptr -= core_data->dsp_write_ptr % 4; in sof_ipc4_mtrace_update_pos()
635 dev_dbg(sdev->dev, "core%d, host read: %#x, dsp write: %#x", in sof_ipc4_mtrace_update_pos()
636 core, core_data->host_read_ptr, core_data->dsp_write_ptr); in sof_ipc4_mtrace_update_pos()
638 wake_up(&core_data->trace_sleep); in sof_ipc4_mtrace_update_pos()
647 * messages anymore, so check the log buffer status on all in ipc4_mtrace_fw_crashed()