Commit ddf14b64 authored by Daniel Baluta's avatar Daniel Baluta Committed by Mark Brown

ASoC: SOF: Intel: bdw: Use generic function for fw ready / mem windows creation

bdw_get_windows / bdw_fw_ready is identical with the generic
implementation introduced in a previous patch.

So remove bdw_get_windows / bdw_fw_ready and use the generic
sof_get_windows version.

Do not forget to implement get_mailbox_offset/get_window_offset
so that we export the correct mailbox/memory window offset to
the outside world.
Signed-off-by: default avatarDaniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20190807150203.26359-6-pierre-louis.bossart@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 0b76f512
...@@ -327,148 +327,6 @@ static irqreturn_t bdw_irq_thread(int irq, void *context) ...@@ -327,148 +327,6 @@ static irqreturn_t bdw_irq_thread(int irq, void *context)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
/*
* 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_io_item(sdev,
sdev->bar[BDW_DSP_BAR] +
inbox_offset,
elem->size, "inbox",
SOF_DEBUGFS_ACCESS_D0_ONLY);
break;
case SOF_IPC_REGION_DOWNBOX:
outbox_offset = elem->offset + MBOX_OFFSET;
outbox_size = elem->size;
snd_sof_debugfs_io_item(sdev,
sdev->bar[BDW_DSP_BAR] +
outbox_offset,
elem->size, "outbox",
SOF_DEBUGFS_ACCESS_D0_ONLY);
break;
case SOF_IPC_REGION_TRACE:
snd_sof_debugfs_io_item(sdev,
sdev->bar[BDW_DSP_BAR] +
elem->offset +
MBOX_OFFSET,
elem->size, "etrace",
SOF_DEBUGFS_ACCESS_D0_ONLY);
break;
case SOF_IPC_REGION_DEBUG:
snd_sof_debugfs_io_item(sdev,
sdev->bar[BDW_DSP_BAR] +
elem->offset +
MBOX_OFFSET,
elem->size, "debug",
SOF_DEBUGFS_ACCESS_D0_ONLY);
break;
case SOF_IPC_REGION_STREAM:
stream_offset = elem->offset + MBOX_OFFSET;
stream_size = elem->size;
snd_sof_debugfs_io_item(sdev,
sdev->bar[BDW_DSP_BAR] +
stream_offset,
elem->size, "stream",
SOF_DEBUGFS_ACCESS_D0_ONLY);
break;
case SOF_IPC_REGION_REGS:
snd_sof_debugfs_io_item(sdev,
sdev->bar[BDW_DSP_BAR] +
elem->offset +
MBOX_OFFSET,
elem->size, "regs",
SOF_DEBUGFS_ACCESS_D0_ONLY);
break;
case SOF_IPC_REGION_EXCEPTION:
sdev->dsp_oops_offset = elem->offset + MBOX_OFFSET;
snd_sof_debugfs_io_item(sdev,
sdev->bar[BDW_DSP_BAR] +
elem->offset +
MBOX_OFFSET,
elem->size, "exception",
SOF_DEBUGFS_ACCESS_D0_ONLY);
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);
sdev->stream_box.offset = stream_offset;
sdev->stream_box.size = stream_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);
dev_dbg(sdev->dev, " stream region 0x%x - size 0x%x\n",
stream_offset, stream_size);
}
/* check for ABI compatibility and create memory windows on first boot */
static int bdw_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
{
struct sof_ipc_fw_ready *fw_ready = &sdev->fw_ready;
u32 offset;
int ret;
/* mailbox must be on 4k boundary */
offset = MBOX_OFFSET;
dev_dbg(sdev->dev, "ipc: DSP is ready 0x%8.8x offset %d\n",
msg_id, offset);
/* no need to re-check version/ABI for subsequent boots */
if (!sdev->first_boot)
return 0;
/* copy data from the DSP FW ready offset */
sof_block_read(sdev, sdev->mmio_bar, offset, fw_ready,
sizeof(*fw_ready));
/* make sure ABI version is compatible */
ret = snd_sof_ipc_valid(sdev);
if (ret < 0)
return ret;
/* now check for extended data */
snd_sof_fw_parse_ext_data(sdev, sdev->mmio_bar, MBOX_OFFSET +
sizeof(struct sof_ipc_fw_ready));
bdw_get_windows(sdev);
return 0;
}
/* /*
* IPC Mailbox IO * IPC Mailbox IO
*/ */
...@@ -522,6 +380,16 @@ static void bdw_get_reply(struct snd_sof_dev *sdev) ...@@ -522,6 +380,16 @@ static void bdw_get_reply(struct snd_sof_dev *sdev)
msg->reply_error = ret; msg->reply_error = ret;
} }
static int bdw_get_mailbox_offset(struct snd_sof_dev *sdev)
{
return MBOX_OFFSET;
}
static int bdw_get_window_offset(struct snd_sof_dev *sdev, u32 id)
{
return MBOX_OFFSET;
}
static void bdw_host_done(struct snd_sof_dev *sdev) static void bdw_host_done(struct snd_sof_dev *sdev)
{ {
/* clear BUSY bit and set DONE bit - accept new messages */ /* clear BUSY bit and set DONE bit - accept new messages */
...@@ -672,7 +540,9 @@ const struct snd_sof_dsp_ops sof_bdw_ops = { ...@@ -672,7 +540,9 @@ const struct snd_sof_dsp_ops sof_bdw_ops = {
/* ipc */ /* ipc */
.send_msg = bdw_send_msg, .send_msg = bdw_send_msg,
.fw_ready = bdw_fw_ready, .fw_ready = sof_fw_ready,
.get_mailbox_offset = bdw_get_mailbox_offset,
.get_window_offset = bdw_get_window_offset,
.ipc_msg_data = intel_ipc_msg_data, .ipc_msg_data = intel_ipc_msg_data,
.ipc_pcm_params = intel_ipc_pcm_params, .ipc_pcm_params = intel_ipc_pcm_params,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment