diff --git a/sound/soc/sof/debug.c b/sound/soc/sof/debug.c index 6f61a39cbb2cd1..2dbc98423d2739 100644 --- a/sound/soc/sof/debug.c +++ b/sound/soc/sof/debug.c @@ -89,9 +89,10 @@ static const struct file_operations sof_dfs_fops = { .llseek = default_llseek, }; -int snd_sof_debugfs_create_item(struct snd_sof_dev *sdev, - void __iomem *base, size_t size, - const char *name) +/* create FS entry for debug files that can expose DSP memories, registers */ +int snd_sof_debugfs_io_create_item(struct snd_sof_dev *sdev, + void __iomem *base, size_t size, + const char *name) { struct snd_sof_dfsentry_io *dfse; @@ -115,7 +116,36 @@ int snd_sof_debugfs_create_item(struct snd_sof_dev *sdev, return 0; } -EXPORT_SYMBOL(snd_sof_debugfs_create_item); +EXPORT_SYMBOL(snd_sof_debugfs_io_create_item); + +/* create FS entry for debug files to expose kernel memory */ +int snd_sof_debugfs_buf_create_item(struct snd_sof_dev *sdev, + void *base, size_t size, + const char *name) +{ + struct snd_sof_dfsentry_buf *dfse; + + if (!sdev) + return -EINVAL; + + dfse = devm_kzalloc(sdev->dev, sizeof(*dfse), GFP_KERNEL); + if (!dfse) + return -ENOMEM; + + dfse->buf = base; + dfse->size = size; + dfse->sdev = sdev; + + dfse->dfsentry = debugfs_create_file(name, 0444, sdev->debugfs_root, + dfse, &sof_dfs_fops); + if (!dfse->dfsentry) { + dev_err(sdev->dev, "cannot create debugfs entry.\n"); + return -ENODEV; + } + + return 0; +} +EXPORT_SYMBOL(snd_sof_debugfs_buf_create_item); int snd_sof_dbg_init(struct snd_sof_dev *sdev) { @@ -134,7 +164,7 @@ int snd_sof_dbg_init(struct snd_sof_dev *sdev) for (i = 0; i < ops->debug_map_count; i++) { map = &ops->debug_map[i]; - err = snd_sof_debugfs_create_item(sdev, sdev->bar[map->bar] + + err = snd_sof_debugfs_io_create_item(sdev, sdev->bar[map->bar] + map->offset, map->size, map->name); if (err < 0) diff --git a/sound/soc/sof/intel/bdw.c b/sound/soc/sof/intel/bdw.c index 46833e90ae26d1..20c89d32188a10 100644 --- a/sound/soc/sof/intel/bdw.c +++ b/sound/soc/sof/intel/bdw.c @@ -426,51 +426,55 @@ static void bdw_get_windows(struct snd_sof_dev *sdev) case SOF_IPC_REGION_UPBOX: inbox_offset = elem->offset + MBOX_OFFSET; inbox_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[BDW_DSP_BAR] + - inbox_offset, - elem->size, "inbox"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BDW_DSP_BAR] + + inbox_offset, + elem->size, "inbox"); break; case SOF_IPC_REGION_DOWNBOX: outbox_offset = elem->offset + MBOX_OFFSET; outbox_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[BDW_DSP_BAR] + - outbox_offset, - elem->size, "outbox"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BDW_DSP_BAR] + + outbox_offset, + elem->size, "outbox"); break; case SOF_IPC_REGION_TRACE: - snd_sof_debugfs_create_item(sdev, - sdev->bar[BDW_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "etrace"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BDW_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "etrace"); break; case SOF_IPC_REGION_DEBUG: - snd_sof_debugfs_create_item(sdev, - sdev->bar[BDW_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "debug"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BDW_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "debug"); break; case SOF_IPC_REGION_STREAM: stream_offset = elem->offset + MBOX_OFFSET; stream_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[BDW_DSP_BAR] + - stream_offset, - elem->size, "stream"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BDW_DSP_BAR] + + stream_offset, + elem->size, "stream"); break; case SOF_IPC_REGION_REGS: - snd_sof_debugfs_create_item(sdev, - sdev->bar[BDW_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "regs"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BDW_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "regs"); break; case SOF_IPC_REGION_EXCEPTION: sdev->dsp_oops_offset = elem->offset + MBOX_OFFSET; - snd_sof_debugfs_create_item(sdev, - sdev->bar[BDW_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "exception"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BDW_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "exception"); break; default: dev_err(sdev->dev, "error: get illegal window info\n"); diff --git a/sound/soc/sof/intel/byt.c b/sound/soc/sof/intel/byt.c index 2d360f7e7ecbb0..cfa39b2305bc0e 100644 --- a/sound/soc/sof/intel/byt.c +++ b/sound/soc/sof/intel/byt.c @@ -186,51 +186,55 @@ static void byt_get_windows(struct snd_sof_dev *sdev) case SOF_IPC_REGION_UPBOX: inbox_offset = elem->offset + MBOX_OFFSET; inbox_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[BYT_DSP_BAR] + - inbox_offset, - elem->size, "inbox"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BYT_DSP_BAR] + + inbox_offset, + elem->size, "inbox"); break; case SOF_IPC_REGION_DOWNBOX: outbox_offset = elem->offset + MBOX_OFFSET; outbox_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[BYT_DSP_BAR] + - outbox_offset, - elem->size, "outbox"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BYT_DSP_BAR] + + outbox_offset, + elem->size, "outbox"); break; case SOF_IPC_REGION_TRACE: - snd_sof_debugfs_create_item(sdev, - sdev->bar[BYT_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "etrace"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BYT_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "etrace"); break; case SOF_IPC_REGION_DEBUG: - snd_sof_debugfs_create_item(sdev, - sdev->bar[BYT_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "debug"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BYT_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "debug"); break; case SOF_IPC_REGION_STREAM: stream_offset = elem->offset + MBOX_OFFSET; stream_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[BYT_DSP_BAR] + - stream_offset, - elem->size, "stream"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BYT_DSP_BAR] + + stream_offset, + elem->size, "stream"); break; case SOF_IPC_REGION_REGS: - snd_sof_debugfs_create_item(sdev, - sdev->bar[BYT_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "regs"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BYT_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "regs"); break; case SOF_IPC_REGION_EXCEPTION: sdev->dsp_oops_offset = elem->offset + MBOX_OFFSET; - snd_sof_debugfs_create_item(sdev, - sdev->bar[BYT_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "exception"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[BYT_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "exception"); break; default: dev_err(sdev->dev, "error: get illegal window info\n"); diff --git a/sound/soc/sof/intel/hda-ipc.c b/sound/soc/sof/intel/hda-ipc.c index 94d1d7807eabef..efaf293c2c77dc 100644 --- a/sound/soc/sof/intel/hda-ipc.c +++ b/sound/soc/sof/intel/hda-ipc.c @@ -285,64 +285,64 @@ static void ipc_get_windows(struct snd_sof_dev *sdev) inbox_offset = elem->offset + SRAM_WINDOW_OFFSET(elem->id); inbox_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[HDA_DSP_BAR] + - inbox_offset, - elem->size, "inbox"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HDA_DSP_BAR] + + inbox_offset, + elem->size, "inbox"); break; case SOF_IPC_REGION_DOWNBOX: outbox_offset = elem->offset + SRAM_WINDOW_OFFSET(elem->id); outbox_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[HDA_DSP_BAR] + - outbox_offset, - elem->size, "outbox"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HDA_DSP_BAR] + + outbox_offset, + elem->size, "outbox"); break; case SOF_IPC_REGION_TRACE: - snd_sof_debugfs_create_item(sdev, - sdev->bar[HDA_DSP_BAR] + - elem->offset + - SRAM_WINDOW_OFFSET - (elem->id), - elem->size, "etrace"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HDA_DSP_BAR] + + elem->offset + + SRAM_WINDOW_OFFSET + (elem->id), + elem->size, "etrace"); break; case SOF_IPC_REGION_DEBUG: - snd_sof_debugfs_create_item(sdev, - sdev->bar[HDA_DSP_BAR] + - elem->offset + - SRAM_WINDOW_OFFSET - (elem->id), - elem->size, "debug"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HDA_DSP_BAR] + + elem->offset + + SRAM_WINDOW_OFFSET + (elem->id), + elem->size, "debug"); break; case SOF_IPC_REGION_STREAM: stream_offset = elem->offset + SRAM_WINDOW_OFFSET(elem->id); stream_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[HDA_DSP_BAR] + - elem->offset + - SRAM_WINDOW_OFFSET - (elem->id), - elem->size, "stream"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HDA_DSP_BAR] + + elem->offset + + SRAM_WINDOW_OFFSET + (elem->id), + elem->size, "stream"); break; case SOF_IPC_REGION_REGS: - snd_sof_debugfs_create_item(sdev, - sdev->bar[HDA_DSP_BAR] + - elem->offset + - SRAM_WINDOW_OFFSET - (elem->id), - elem->size, "regs"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HDA_DSP_BAR] + + elem->offset + + SRAM_WINDOW_OFFSET + (elem->id), + elem->size, "regs"); break; case SOF_IPC_REGION_EXCEPTION: sdev->dsp_oops_offset = elem->offset + SRAM_WINDOW_OFFSET(elem->id); - snd_sof_debugfs_create_item(sdev, - sdev->bar[HDA_DSP_BAR] + - elem->offset + - SRAM_WINDOW_OFFSET - (elem->id), - elem->size, "exception"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HDA_DSP_BAR] + + elem->offset + + SRAM_WINDOW_OFFSET + (elem->id), + elem->size, "exception"); break; default: dev_err(sdev->dev, "error: get illegal window info\n"); diff --git a/sound/soc/sof/intel/hsw.c b/sound/soc/sof/intel/hsw.c index 3b3f59a73a298c..0c6d04a7ca4dd4 100644 --- a/sound/soc/sof/intel/hsw.c +++ b/sound/soc/sof/intel/hsw.c @@ -427,51 +427,55 @@ static void hsw_get_windows(struct snd_sof_dev *sdev) case SOF_IPC_REGION_UPBOX: inbox_offset = elem->offset + MBOX_OFFSET; inbox_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[HSW_DSP_BAR] + - inbox_offset, - elem->size, "inbox"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HSW_DSP_BAR] + + inbox_offset, + elem->size, "inbox"); break; case SOF_IPC_REGION_DOWNBOX: outbox_offset = elem->offset + MBOX_OFFSET; outbox_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[HSW_DSP_BAR] + - outbox_offset, - elem->size, "outbox"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HSW_DSP_BAR] + + outbox_offset, + elem->size, "outbox"); break; case SOF_IPC_REGION_TRACE: - snd_sof_debugfs_create_item(sdev, - sdev->bar[HSW_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "etrace"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HSW_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "etrace"); break; case SOF_IPC_REGION_DEBUG: - snd_sof_debugfs_create_item(sdev, - sdev->bar[HSW_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "debug"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HSW_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "debug"); break; case SOF_IPC_REGION_STREAM: stream_offset = elem->offset + MBOX_OFFSET; stream_size = elem->size; - snd_sof_debugfs_create_item(sdev, - sdev->bar[HSW_DSP_BAR] + - stream_offset, - elem->size, "stream"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HSW_DSP_BAR] + + stream_offset, + elem->size, "stream"); break; case SOF_IPC_REGION_REGS: - snd_sof_debugfs_create_item(sdev, - sdev->bar[HSW_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "regs"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HSW_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "regs"); break; case SOF_IPC_REGION_EXCEPTION: sdev->dsp_oops_offset = elem->offset + MBOX_OFFSET; - snd_sof_debugfs_create_item(sdev, - sdev->bar[HSW_DSP_BAR] + - elem->offset + MBOX_OFFSET, - elem->size, "exception"); + snd_sof_debugfs_io_create_item(sdev, + sdev->bar[HSW_DSP_BAR] + + elem->offset + + MBOX_OFFSET, + elem->size, "exception"); break; default: dev_err(sdev->dev, "error: get illegal window info\n"); diff --git a/sound/soc/sof/loader.c b/sound/soc/sof/loader.c index bc36359e2b70f9..b23fa0fe6a328c 100644 --- a/sound/soc/sof/loader.c +++ b/sound/soc/sof/loader.c @@ -280,9 +280,9 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev) /* create fw_version debugfs to store boot version info */ if (sdev->first_boot) { - ret = snd_sof_debugfs_create_item(sdev, &sdev->fw_version, - sizeof(sdev->fw_version), - "fw_version"); + ret = snd_sof_debugfs_buf_create_item(sdev, &sdev->fw_version, + sizeof(sdev->fw_version), + "fw_version"); if (ret < 0) { dev_err(sdev->dev, "cannot create debugfs for fw_version\n"); diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h index 3f619f5f2691cb..3923102793778c 100644 --- a/sound/soc/sof/sof-priv.h +++ b/sound/soc/sof/sof-priv.h @@ -497,9 +497,12 @@ void snd_sof_release_trace(struct snd_sof_dev *sdev); void snd_sof_free_trace(struct snd_sof_dev *sdev); int snd_sof_dbg_init(struct snd_sof_dev *sdev); void snd_sof_free_debug(struct snd_sof_dev *sdev); -int snd_sof_debugfs_create_item(struct snd_sof_dev *sdev, - void __iomem *base, size_t size, - const char *name); +int snd_sof_debugfs_io_create_item(struct snd_sof_dev *sdev, + void __iomem *base, size_t size, + const char *name); +int snd_sof_debugfs_buf_create_item(struct snd_sof_dev *sdev, + void *base, size_t size, + const char *name); int snd_sof_trace_update_pos(struct snd_sof_dev *sdev, struct sof_ipc_dma_trace_posn *posn); void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev);