[Sound-open-firmware] [PATCH V4 1/2] ASoc: SOF: Add memory window for all platform
Xiuli Pan
xiuli.pan at linux.intel.com
Tue Mar 6 07:25:15 CET 2018
From: Pan Xiuli <xiuli.pan at linux.intel.com>
Add memory window handler for BYT, HSW and BDW.
Signed-off-by: Pan Xiuli <xiuli.pan at linux.intel.com>
---
v1: rebase and some typo fix
v2: rebase and fix window setting
v3: rebase
v4: rebase and add err handler for get_window function
Test with:
Mininow max rt5651
SOF master: e92ef97834489f52c0f20445d401a8c6e0aaed62
SOF-Tool master: 5b8dfd13019cfd29999503b56c902f56209000ed
https://github.com/plbossart/sound/tree/topic/sof-v4.14:
d919ea06b7f79c95ab4eb68baf05e9faf3a894c1
---
sound/soc/sof/hw-apl.c | 23 +++++++++---
sound/soc/sof/hw-bdw.c | 97 +++++++++++++++++++++++++++++++++++++++++++++----
sound/soc/sof/hw-byt.c | 98 +++++++++++++++++++++++++++++++++++++++++++++-----
sound/soc/sof/hw-hsw.c | 97 +++++++++++++++++++++++++++++++++++++++++++++----
4 files changed, 289 insertions(+), 26 deletions(-)
diff --git a/sound/soc/sof/hw-apl.c b/sound/soc/sof/hw-apl.c
index bfbdd915..1823153 100644
--- a/sound/soc/sof/hw-apl.c
+++ b/sound/soc/sof/hw-apl.c
@@ -1089,12 +1089,18 @@ static int apl_prepare(struct snd_sof_dev *sdev, unsigned int format,
static void apl_get_windows(struct snd_sof_dev *sdev)
{
struct sof_ipc_window_elem *elem;
+ u32 outbox_offset = 0;
+ u32 stream_offset = 0;
+ u32 inbox_offset = 0;
+ u32 outbox_size = 0;
+ u32 stream_size = 0;
+ u32 inbox_size = 0;
int i;
- u32 inbox_offset = 0, outbox_offset = 0;
- u32 inbox_size = 0, outbox_size = 0;
- if (!sdev->info_window)
+ if (!sdev->info_window) {
+ dev_err(sdev->dev, "error: have no window info\n");
return;
+ }
for (i = 0; i < sdev->info_window->num_windows; i++) {
elem = &sdev->info_window->window[i];
@@ -1135,6 +1141,9 @@ static void apl_get_windows(struct snd_sof_dev *sdev)
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[APL_DSP_BAR] +
elem->offset +
@@ -1151,10 +1160,16 @@ static void apl_get_windows(struct snd_sof_dev *sdev)
elem->size, "regs");
break;
default:
- break;
+ dev_err(sdev->dev, "error: get illegal window info\n");
+ return;
}
}
+ if (outbox_size == 0 || inbox_size == 0) {
+ dev_err(sdev->dev, "error: get illegal mailbox window\n");
+ return;
+ }
+
snd_sof_dsp_mailbox_init(sdev, inbox_offset, inbox_size,
outbox_offset, outbox_size);
diff --git a/sound/soc/sof/hw-bdw.c b/sound/soc/sof/hw-bdw.c
index b1c9508..1fe2807 100644
--- a/sound/soc/sof/hw-bdw.c
+++ b/sound/soc/sof/hw-bdw.c
@@ -66,7 +66,6 @@ static const struct snd_sof_debugfs_map bdw_debugfs[] = {
{"iram", BDW_DSP_BAR, IRAM_OFFSET, BDW_IRAM_SIZE},
{"dram", BDW_DSP_BAR, DRAM_OFFSET, BDW_DRAM_SIZE},
{"shim", BDW_DSP_BAR, SHIM_OFFSET, SHIM_SIZE},
- {"mbox", BDW_DSP_BAR, MBOX_OFFSET, MBOX_SIZE},
};
/*
@@ -389,6 +388,88 @@ static irqreturn_t bdw_irq_thread(int irq, void *context)
/*
* IPC Firmware ready.
*/
+static void bdw_get_windows(struct snd_sof_dev *sdev)
+{
+ struct sof_ipc_window_elem *elem;
+ u32 outbox_offset = 0;
+ u32 stream_offset = 0;
+ u32 inbox_offset = 0;
+ u32 outbox_size = 0;
+ u32 stream_size = 0;
+ u32 inbox_size = 0;
+ int i;
+
+ if (!sdev->info_window) {
+ dev_err(sdev->dev, "error: have no window info\n");
+ return;
+ }
+
+ for (i = 0; i < sdev->info_window->num_windows; i++) {
+ elem = &sdev->info_window->window[i];
+
+ switch (elem->type) {
+ 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");
+ 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");
+ break;
+ case SOF_IPC_REGION_TRACE:
+ snd_sof_debugfs_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");
+ 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");
+ break;
+ case SOF_IPC_REGION_REGS:
+ snd_sof_debugfs_create_item(sdev,
+ sdev->bar[BDW_DSP_BAR] +
+ elem->offset + MBOX_OFFSET,
+ elem->size, "regs");
+ break;
+ default:
+ dev_err(sdev->dev, "error: get illegal window info\n");
+ return;
+ }
+ }
+
+ if (outbox_size == 0 || inbox_size == 0) {
+ dev_err(sdev->dev, "error: get illegal mailbox window\n");
+ return;
+ }
+
+ snd_sof_dsp_mailbox_init(sdev, inbox_offset, inbox_size,
+ outbox_offset, outbox_size);
+
+ dev_dbg(sdev->dev, " mailbox upstream 0x%x - size 0x%x\n",
+ inbox_offset, inbox_size);
+ dev_dbg(sdev->dev, " mailbox downstream 0x%x - size 0x%x\n",
+ outbox_offset, outbox_size);
+}
+
static int bdw_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
{
struct sof_ipc_fw_ready *fw_ready = &sdev->fw_ready;
@@ -409,14 +490,16 @@ static int bdw_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
fw_ready->hostbox_offset,
fw_ready->hostbox_size);
- dev_dbg(sdev->dev, " mailbox DSP initiated 0x%x - size 0x%x\n",
- fw_ready->dspbox_offset, fw_ready->dspbox_size);
- dev_dbg(sdev->dev, " mailbox Host initiated 0x%x - size 0x%x\n",
- fw_ready->hostbox_offset, fw_ready->hostbox_size);
-
- dev_info(sdev->dev, " Firmware info: version %d:%d-%s build %d on %s:%s\n",
+ dev_info(sdev->dev,
+ " Firmware info: version %d:%d-%s build %d on %s:%s\n",
v->major, v->minor, v->tag, v->build, v->date, v->time);
+ /* now check for extended data */
+ snd_sof_fw_parse_ext_data(sdev, MBOX_OFFSET +
+ sizeof(struct sof_ipc_fw_ready));
+
+ bdw_get_windows(sdev);
+
return 0;
}
diff --git a/sound/soc/sof/hw-byt.c b/sound/soc/sof/hw-byt.c
index 367fab9..8d27e18 100644
--- a/sound/soc/sof/hw-byt.c
+++ b/sound/soc/sof/hw-byt.c
@@ -76,7 +76,6 @@ static const struct snd_sof_debugfs_map byt_debugfs[] = {
{"iram", BYT_DSP_BAR, IRAM_OFFSET, IRAM_SIZE},
{"dram", BYT_DSP_BAR, DRAM_OFFSET, DRAM_SIZE},
{"shim", BYT_DSP_BAR, SHIM_OFFSET, SHIM_SIZE},
- {"mbox", BYT_DSP_BAR, MBOX_OFFSET, MBOX_SIZE},
};
static const struct snd_sof_debugfs_map cht_debugfs[] = {
@@ -92,7 +91,6 @@ static const struct snd_sof_debugfs_map cht_debugfs[] = {
{"iram", BYT_DSP_BAR, IRAM_OFFSET, IRAM_SIZE},
{"dram", BYT_DSP_BAR, DRAM_OFFSET, DRAM_SIZE},
{"shim", BYT_DSP_BAR, SHIM_OFFSET, SHIM_SIZE},
- {"mbox", BYT_DSP_BAR, MBOX_OFFSET, MBOX_SIZE},
};
/*
@@ -160,6 +158,88 @@ static void byt_block_read(struct snd_sof_dev *sdev, u32 offset, void *dest,
/*
* IPC Firmware ready.
*/
+static void byt_get_windows(struct snd_sof_dev *sdev)
+{
+ struct sof_ipc_window_elem *elem;
+ u32 outbox_offset = 0;
+ u32 stream_offset = 0;
+ u32 inbox_offset = 0;
+ u32 outbox_size = 0;
+ u32 stream_size = 0;
+ u32 inbox_size = 0;
+ int i;
+
+ if (!sdev->info_window) {
+ dev_err(sdev->dev, "error: have no window info\n");
+ return;
+ }
+
+ for (i = 0; i < sdev->info_window->num_windows; i++) {
+ elem = &sdev->info_window->window[i];
+
+ switch (elem->type) {
+ 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");
+ 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");
+ break;
+ case SOF_IPC_REGION_TRACE:
+ snd_sof_debugfs_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");
+ 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");
+ break;
+ case SOF_IPC_REGION_REGS:
+ snd_sof_debugfs_create_item(sdev,
+ sdev->bar[BYT_DSP_BAR] +
+ elem->offset + MBOX_OFFSET,
+ elem->size, "regs");
+ break;
+ default:
+ dev_err(sdev->dev, "error: get illegal window info\n");
+ return;
+ }
+ }
+
+ if (outbox_size == 0 || inbox_size == 0) {
+ dev_err(sdev->dev, "error: get illegal mailbox window\n");
+ return;
+ }
+
+ snd_sof_dsp_mailbox_init(sdev, inbox_offset, inbox_size,
+ outbox_offset, outbox_size);
+
+ dev_dbg(sdev->dev, " mailbox upstream 0x%x - size 0x%x\n",
+ inbox_offset, inbox_size);
+ dev_dbg(sdev->dev, " mailbox downstream 0x%x - size 0x%x\n",
+ outbox_offset, outbox_size);
+}
+
static int byt_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
{
struct sof_ipc_fw_ready *fw_ready = &sdev->fw_ready;
@@ -180,14 +260,16 @@ static int byt_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
fw_ready->hostbox_offset,
fw_ready->hostbox_size);
- dev_dbg(sdev->dev, " mailbox DSP initiated 0x%x - size 0x%x\n",
- fw_ready->dspbox_offset, fw_ready->dspbox_size);
- dev_dbg(sdev->dev, " mailbox Host initiated 0x%x - size 0x%x\n",
- fw_ready->hostbox_offset, fw_ready->hostbox_size);
-
- dev_info(sdev->dev, " Firmware info: version %d:%d-%s build %d on %s:%s\n",
+ dev_info(sdev->dev,
+ " Firmware info: version %d:%d-%s build %d on %s:%s\n",
v->major, v->minor, v->tag, v->build, v->date, v->time);
+ /* now check for extended data */
+ snd_sof_fw_parse_ext_data(sdev, MBOX_OFFSET +
+ sizeof(struct sof_ipc_fw_ready));
+
+ byt_get_windows(sdev);
+
return 0;
}
diff --git a/sound/soc/sof/hw-hsw.c b/sound/soc/sof/hw-hsw.c
index 495009a..f636ce4 100644
--- a/sound/soc/sof/hw-hsw.c
+++ b/sound/soc/sof/hw-hsw.c
@@ -66,7 +66,6 @@ static const struct snd_sof_debugfs_map hsw_debugfs[] = {
{"iram", HSW_DSP_BAR, IRAM_OFFSET, HSW_IRAM_SIZE},
{"dram", HSW_DSP_BAR, DRAM_OFFSET, HSW_DRAM_SIZE},
{"shim", HSW_DSP_BAR, SHIM_OFFSET, SHIM_SIZE},
- {"mbox", HSW_DSP_BAR, MBOX_OFFSET, MBOX_SIZE},
};
/*
@@ -389,6 +388,88 @@ static irqreturn_t hsw_irq_thread(int irq, void *context)
/*
* IPC Firmware ready.
*/
+static void hsw_get_windows(struct snd_sof_dev *sdev)
+{
+ struct sof_ipc_window_elem *elem;
+ u32 outbox_offset = 0;
+ u32 stream_offset = 0;
+ u32 inbox_offset = 0;
+ u32 outbox_size = 0;
+ u32 stream_size = 0;
+ u32 inbox_size = 0;
+ int i;
+
+ if (!sdev->info_window) {
+ dev_err(sdev->dev, "error: have no window info\n");
+ return;
+ }
+
+ for (i = 0; i < sdev->info_window->num_windows; i++) {
+ elem = &sdev->info_window->window[i];
+
+ switch (elem->type) {
+ 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");
+ 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");
+ break;
+ case SOF_IPC_REGION_TRACE:
+ snd_sof_debugfs_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");
+ 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");
+ break;
+ case SOF_IPC_REGION_REGS:
+ snd_sof_debugfs_create_item(sdev,
+ sdev->bar[HSW_DSP_BAR] +
+ elem->offset + MBOX_OFFSET,
+ elem->size, "regs");
+ break;
+ default:
+ dev_err(sdev->dev, "error: get illegal window info\n");
+ return;
+ }
+ }
+
+ if (outbox_size == 0 || inbox_size == 0) {
+ dev_err(sdev->dev, "error: get illegal mailbox window\n");
+ return;
+ }
+
+ snd_sof_dsp_mailbox_init(sdev, inbox_offset, inbox_size,
+ outbox_offset, outbox_size);
+
+ dev_dbg(sdev->dev, " mailbox upstream 0x%x - size 0x%x\n",
+ inbox_offset, inbox_size);
+ dev_dbg(sdev->dev, " mailbox downstream 0x%x - size 0x%x\n",
+ outbox_offset, outbox_size);
+}
+
static int hsw_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
{
struct sof_ipc_fw_ready *fw_ready = &sdev->fw_ready;
@@ -409,14 +490,16 @@ static int hsw_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
fw_ready->hostbox_offset,
fw_ready->hostbox_size);
- dev_dbg(sdev->dev, " mailbox DSP initiated 0x%x - size 0x%x\n",
- fw_ready->dspbox_offset, fw_ready->dspbox_size);
- dev_dbg(sdev->dev, " mailbox Host initiated 0x%x - size 0x%x\n",
- fw_ready->hostbox_offset, fw_ready->hostbox_size);
-
- dev_info(sdev->dev, " Firmware info: version %d:%d-%s build %d on %s:%s\n",
+ dev_info(sdev->dev,
+ " Firmware info: version %d:%d-%s build %d on %s:%s\n",
v->major, v->minor, v->tag, v->build, v->date, v->time);
+ /* now check for extended data */
+ snd_sof_fw_parse_ext_data(sdev, MBOX_OFFSET +
+ sizeof(struct sof_ipc_fw_ready));
+
+ hsw_get_windows(sdev);
+
return 0;
}
--
2.7.4
More information about the Sound-open-firmware
mailing list