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.
129 struct sof_mtrace_core_data *core_data = inode->i_private; in sof_ipc4_mtrace_dfs_open()
132 mutex_lock(&core_data->buffer_lock); in sof_ipc4_mtrace_dfs_open()
134 if (core_data->log_buffer) { in sof_ipc4_mtrace_dfs_open()
135 ret = -EBUSY; in sof_ipc4_mtrace_dfs_open()
139 ret = debugfs_file_get(file->f_path.dentry); in sof_ipc4_mtrace_dfs_open()
143 core_data->log_buffer = kmalloc(SOF_MTRACE_SLOT_SIZE, GFP_KERNEL); in sof_ipc4_mtrace_dfs_open()
144 if (!core_data->log_buffer) { in sof_ipc4_mtrace_dfs_open()
145 debugfs_file_put(file->f_path.dentry); in sof_ipc4_mtrace_dfs_open()
146 ret = -ENOMEM; in sof_ipc4_mtrace_dfs_open()
152 kfree(core_data->log_buffer); in sof_ipc4_mtrace_dfs_open()
153 debugfs_file_put(file->f_path.dentry); in sof_ipc4_mtrace_dfs_open()
157 mutex_unlock(&core_data->buffer_lock); in sof_ipc4_mtrace_dfs_open()
167 if (core_data->host_read_ptr != core_data->dsp_write_ptr) in sof_wait_mtrace_avail()
170 /* wait for available trace data from FW */ in sof_wait_mtrace_avail()
173 add_wait_queue(&core_data->trace_sleep, &wait); in sof_wait_mtrace_avail()
179 remove_wait_queue(&core_data->trace_sleep, &wait); in sof_wait_mtrace_avail()
181 if (core_data->host_read_ptr != core_data->dsp_write_ptr) in sof_wait_mtrace_avail()
187 static ssize_t sof_ipc4_mtrace_dfs_read(struct file *file, char __user *buffer, in sof_ipc4_mtrace_dfs_read() argument
190 struct sof_mtrace_core_data *core_data = file->private_data; in sof_ipc4_mtrace_dfs_read()
192 struct snd_sof_dev *sdev = core_data->sdev; in sof_ipc4_mtrace_dfs_read()
193 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in sof_ipc4_mtrace_dfs_read()
194 void *log_buffer = core_data->log_buffer; in sof_ipc4_mtrace_dfs_read()
201 return -EINVAL; in sof_ipc4_mtrace_dfs_read()
209 if (copy_to_user(buffer, &avail, sizeof(avail))) in sof_ipc4_mtrace_dfs_read()
210 return -EFAULT; in sof_ipc4_mtrace_dfs_read()
215 if (core_data->slot_offset == INVALID_SLOT_OFFSET) in sof_ipc4_mtrace_dfs_read()
218 /* The log data buffer starts after the two pointer in the slot */ in sof_ipc4_mtrace_dfs_read()
219 log_buffer_offset = core_data->slot_offset + (sizeof(u32) * 2); in sof_ipc4_mtrace_dfs_read()
221 log_buffer_size = SOF_MTRACE_SLOT_SIZE - (sizeof(u32) * 2); in sof_ipc4_mtrace_dfs_read()
223 read_ptr = core_data->host_read_ptr; in sof_ipc4_mtrace_dfs_read()
224 write_ptr = core_data->dsp_write_ptr; in sof_ipc4_mtrace_dfs_read()
227 avail = write_ptr - read_ptr; in sof_ipc4_mtrace_dfs_read()
229 avail = log_buffer_size - read_ptr + write_ptr; in sof_ipc4_mtrace_dfs_read()
238 if (avail > count - sizeof(avail)) in sof_ipc4_mtrace_dfs_read()
239 avail = count - sizeof(avail); in sof_ipc4_mtrace_dfs_read()
242 dev_dbg(sdev->dev, in sof_ipc4_mtrace_dfs_read()
244 core_data->id, read_ptr, write_ptr, avail); in sof_ipc4_mtrace_dfs_read()
252 avail - write_ptr); in sof_ipc4_mtrace_dfs_read()
256 (u8 *)(log_buffer) + avail - write_ptr, in sof_ipc4_mtrace_dfs_read()
261 ret = copy_to_user(buffer, &avail, sizeof(avail)); in sof_ipc4_mtrace_dfs_read()
263 return -EFAULT; in sof_ipc4_mtrace_dfs_read()
266 ret = copy_to_user(buffer + sizeof(avail), log_buffer, avail); in sof_ipc4_mtrace_dfs_read()
268 return -EFAULT; in sof_ipc4_mtrace_dfs_read()
273 read_ptr -= log_buffer_size; in sof_ipc4_mtrace_dfs_read()
274 sof_mailbox_write(sdev, core_data->slot_offset, &read_ptr, sizeof(read_ptr)); in sof_ipc4_mtrace_dfs_read()
277 if (priv->mtrace_state != SOF_MTRACE_DISABLED) in sof_ipc4_mtrace_dfs_read()
278 core_data->host_read_ptr = read_ptr; in sof_ipc4_mtrace_dfs_read()
281 * Ask for a new buffer from user space for the next chunk, not in sof_ipc4_mtrace_dfs_read()
291 struct sof_mtrace_core_data *core_data = inode->i_private; in sof_ipc4_mtrace_dfs_release()
293 debugfs_file_put(file->f_path.dentry); in sof_ipc4_mtrace_dfs_release()
295 mutex_lock(&core_data->buffer_lock); in sof_ipc4_mtrace_dfs_release()
296 kfree(core_data->log_buffer); in sof_ipc4_mtrace_dfs_release()
297 core_data->log_buffer = NULL; in sof_ipc4_mtrace_dfs_release()
298 mutex_unlock(&core_data->buffer_lock); in sof_ipc4_mtrace_dfs_release()
315 struct sof_mtrace_priv *priv = file->private_data; in sof_ipc4_priority_mask_dfs_read()
327 return -ENOMEM; in sof_ipc4_priority_mask_dfs_read()
331 remaining = 241 - offset; in sof_ipc4_priority_mask_dfs_read()
333 priv->state_info.logs_priorities_mask[i]); in sof_ipc4_priority_mask_dfs_read()
346 struct sof_mtrace_priv *priv = file->private_data; in sof_ipc4_priority_mask_dfs_write()
365 ret = -EINVAL; in sof_ipc4_priority_mask_dfs_write()
371 ret = -EINVAL; in sof_ipc4_priority_mask_dfs_write()
375 priv->state_info.logs_priorities_mask[id] = mask; in sof_ipc4_priority_mask_dfs_write()
394 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in mtrace_debugfs_create()
399 dfs_root = debugfs_create_dir("mtrace", sdev->debugfs_root); in mtrace_debugfs_create()
405 &priv->state_info.aging_timer_period); in mtrace_debugfs_create()
407 &priv->state_info.fifo_full_timer_period); in mtrace_debugfs_create()
412 for (i = 0; i < sdev->num_cores; i++) { in mtrace_debugfs_create()
414 debugfs_create_file(dfs_name, 0444, dfs_root, &priv->cores[i], in mtrace_debugfs_create()
423 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in ipc4_mtrace_enable()
424 const struct sof_ipc_ops *iops = sdev->ipc->ops; in ipc4_mtrace_enable()
430 if (priv->mtrace_state != SOF_MTRACE_DISABLED) in ipc4_mtrace_enable()
437 msg.extension = SOF_IPC4_MOD_EXT_MSG_PARAM_ID(SOF_IPC4_FW_PARAM_SYSTEM_TIME); in ipc4_mtrace_enable()
439 /* The system time is in usec, UTC, epoch is 1601-01-01 00:00:00 */ in ipc4_mtrace_enable()
444 ret = iops->set_get_data(sdev, &msg, msg.data_size, true); in ipc4_mtrace_enable()
448 msg.extension = SOF_IPC4_MOD_EXT_MSG_PARAM_ID(SOF_IPC4_FW_PARAM_ENABLE_LOGS); in ipc4_mtrace_enable()
450 priv->state_info.enable = 1; in ipc4_mtrace_enable()
452 msg.data_size = sizeof(priv->state_info); in ipc4_mtrace_enable()
453 msg.data_ptr = &priv->state_info; in ipc4_mtrace_enable()
455 priv->mtrace_state = SOF_MTRACE_INITIALIZING; in ipc4_mtrace_enable()
456 ret = iops->set_get_data(sdev, &msg, msg.data_size, true); in ipc4_mtrace_enable()
458 priv->mtrace_state = SOF_MTRACE_DISABLED; in ipc4_mtrace_enable()
462 priv->mtrace_state = SOF_MTRACE_ENABLED; in ipc4_mtrace_enable()
469 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in ipc4_mtrace_disable()
470 const struct sof_ipc_ops *iops = sdev->ipc->ops; in ipc4_mtrace_disable()
474 if (priv->mtrace_state == SOF_MTRACE_DISABLED) in ipc4_mtrace_disable()
481 msg.extension = SOF_IPC4_MOD_EXT_MSG_PARAM_ID(SOF_IPC4_FW_PARAM_ENABLE_LOGS); in ipc4_mtrace_disable()
483 priv->state_info.enable = 0; in ipc4_mtrace_disable()
485 msg.data_size = sizeof(priv->state_info); in ipc4_mtrace_disable()
486 msg.data_ptr = &priv->state_info; in ipc4_mtrace_disable()
487 iops->set_get_data(sdev, &msg, msg.data_size, true); in ipc4_mtrace_disable()
489 priv->mtrace_state = SOF_MTRACE_DISABLED; in ipc4_mtrace_disable()
491 for (i = 0; i < sdev->num_cores; i++) { in ipc4_mtrace_disable()
492 struct sof_mtrace_core_data *core_data = &priv->cores[i]; in ipc4_mtrace_disable()
494 core_data->host_read_ptr = 0; in ipc4_mtrace_disable()
495 core_data->dsp_write_ptr = 0; in ipc4_mtrace_disable()
496 wake_up(&core_data->trace_sleep); in ipc4_mtrace_disable()
508 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in sof_mtrace_find_core_slots()
515 slot_desc_type_offset = sdev->debug_box.offset; in sof_mtrace_find_core_slots()
522 if (core >= sdev->num_cores) { in sof_mtrace_find_core_slots()
523 dev_dbg(sdev->dev, "core%u is invalid for slot%d\n", in sof_mtrace_find_core_slots()
528 core_data = &priv->cores[core]; in sof_mtrace_find_core_slots()
535 core_data->slot_offset = sdev->debug_box.offset; in sof_mtrace_find_core_slots()
536 core_data->slot_offset += SOF_MTRACE_SLOT_SIZE * (i + 1); in sof_mtrace_find_core_slots()
537 dev_dbg(sdev->dev, "slot%d is used for core%u\n", i, core); in sof_mtrace_find_core_slots()
538 if (core_data->delayed_pos_update) { in sof_mtrace_find_core_slots()
540 core_data->delayed_pos_update = false; in sof_mtrace_find_core_slots()
543 dev_dbg(sdev->dev, "slot%d is not a log slot (%#x)\n", i, type); in sof_mtrace_find_core_slots()
550 struct sof_ipc4_fw_data *ipc4_data = sdev->private; in ipc4_mtrace_init()
554 if (sdev->fw_trace_data) { in ipc4_mtrace_init()
555 dev_err(sdev->dev, "fw_trace_data has been already allocated\n"); in ipc4_mtrace_init()
556 return -EBUSY; in ipc4_mtrace_init()
559 if (!ipc4_data->mtrace_log_bytes || in ipc4_mtrace_init()
560 ipc4_data->mtrace_type != SOF_IPC4_MTRACE_INTEL_CAVS_2) { in ipc4_mtrace_init()
561 sdev->fw_trace_is_supported = false; in ipc4_mtrace_init()
565 priv = devm_kzalloc(sdev->dev, struct_size(priv, cores, sdev->num_cores), in ipc4_mtrace_init()
568 return -ENOMEM; in ipc4_mtrace_init()
570 sdev->fw_trace_data = priv; in ipc4_mtrace_init()
573 priv->state_info.aging_timer_period = DEFAULT_AGING_TIMER_PERIOD_MS; in ipc4_mtrace_init()
574 priv->state_info.fifo_full_timer_period = DEFAULT_FIFO_FULL_TIMER_PERIOD_MS; in ipc4_mtrace_init()
576 priv->state_info.logs_priorities_mask[0] = DEFAULT_LOGS_PRIORITIES_MASK; in ipc4_mtrace_init()
578 for (i = 0; i < sdev->num_cores; i++) { in ipc4_mtrace_init()
579 struct sof_mtrace_core_data *core_data = &priv->cores[i]; in ipc4_mtrace_init()
581 init_waitqueue_head(&core_data->trace_sleep); in ipc4_mtrace_init()
582 mutex_init(&core_data->buffer_lock); in ipc4_mtrace_init()
583 core_data->sdev = sdev; in ipc4_mtrace_init()
584 core_data->id = i; in ipc4_mtrace_init()
593 sdev->fw_trace_is_supported = false; in ipc4_mtrace_init()
594 dev_dbg(sdev->dev, "initialization failed, fw tracing is disabled\n"); in ipc4_mtrace_init()
616 for (i = 0; i < sdev->num_cores; i++) in sof_ipc4_mtrace_update_pos_all_cores()
624 struct sof_mtrace_priv *priv = sdev->fw_trace_data; in sof_ipc4_mtrace_update_pos()
627 if (!sdev->fw_trace_is_supported || in sof_ipc4_mtrace_update_pos()
628 priv->mtrace_state == SOF_MTRACE_DISABLED) in sof_ipc4_mtrace_update_pos()
631 if (core >= sdev->num_cores) in sof_ipc4_mtrace_update_pos()
632 return -EINVAL; in sof_ipc4_mtrace_update_pos()
634 core_data = &priv->cores[core]; in sof_ipc4_mtrace_update_pos()
636 if (core_data->slot_offset == INVALID_SLOT_OFFSET) { in sof_ipc4_mtrace_update_pos()
637 core_data->delayed_pos_update = true; in sof_ipc4_mtrace_update_pos()
642 sof_mailbox_read(sdev, core_data->slot_offset + sizeof(u32), in sof_ipc4_mtrace_update_pos()
643 &core_data->dsp_write_ptr, 4); in sof_ipc4_mtrace_update_pos()
644 core_data->dsp_write_ptr -= core_data->dsp_write_ptr % 4; in sof_ipc4_mtrace_update_pos()
647 dev_dbg(sdev->dev, "core%d, host read: %#x, dsp write: %#x", in sof_ipc4_mtrace_update_pos()
648 core, core_data->host_read_ptr, core_data->dsp_write_ptr); in sof_ipc4_mtrace_update_pos()
650 wake_up(&core_data->trace_sleep); in sof_ipc4_mtrace_update_pos()
659 * messages anymore, so check the log buffer status on all in ipc4_mtrace_fw_crashed()