ASoC: SOF: Intel: hda: Use generic function for fw ready / mem windows creation
We can use generic sof_fw_ready function and reduce code duplication. Careful here that we need to provide the implementation for get_mailbox_offset and get_window_offset. Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://lore.kernel.org/r/20190807150203.26359-7-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Родитель
ddf14b640b
Коммит
6eebd39075
|
@ -46,7 +46,9 @@ const struct snd_sof_dsp_ops sof_apl_ops = {
|
|||
|
||||
/* ipc */
|
||||
.send_msg = hda_dsp_ipc_send_msg,
|
||||
.fw_ready = hda_dsp_ipc_fw_ready,
|
||||
.fw_ready = sof_fw_ready,
|
||||
.get_mailbox_offset = hda_dsp_ipc_get_mailbox_offset,
|
||||
.get_window_offset = hda_dsp_ipc_get_window_offset,
|
||||
|
||||
.ipc_msg_data = hda_ipc_msg_data,
|
||||
.ipc_pcm_params = hda_ipc_pcm_params,
|
||||
|
|
|
@ -204,7 +204,9 @@ const struct snd_sof_dsp_ops sof_cnl_ops = {
|
|||
|
||||
/* ipc */
|
||||
.send_msg = cnl_ipc_send_msg,
|
||||
.fw_ready = hda_dsp_ipc_fw_ready,
|
||||
.fw_ready = sof_fw_ready,
|
||||
.get_mailbox_offset = hda_dsp_ipc_get_mailbox_offset,
|
||||
.get_window_offset = hda_dsp_ipc_get_window_offset,
|
||||
|
||||
.ipc_msg_data = hda_ipc_msg_data,
|
||||
.ipc_pcm_params = hda_ipc_pcm_params,
|
||||
|
|
|
@ -266,156 +266,14 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* IPC Firmware ready */
|
||||
|
||||
static void ipc_get_windows(struct snd_sof_dev *sdev)
|
||||
int hda_dsp_ipc_get_mailbox_offset(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 + SRAM_WINDOW_OFFSET(elem->id);
|
||||
inbox_size = elem->size;
|
||||
snd_sof_debugfs_io_item(sdev,
|
||||
sdev->bar[HDA_DSP_BAR] +
|
||||
inbox_offset,
|
||||
elem->size, "inbox",
|
||||
SOF_DEBUGFS_ACCESS_D0_ONLY);
|
||||
break;
|
||||
case SOF_IPC_REGION_DOWNBOX:
|
||||
outbox_offset =
|
||||
elem->offset + SRAM_WINDOW_OFFSET(elem->id);
|
||||
outbox_size = elem->size;
|
||||
snd_sof_debugfs_io_item(sdev,
|
||||
sdev->bar[HDA_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[HDA_DSP_BAR] +
|
||||
elem->offset +
|
||||
SRAM_WINDOW_OFFSET
|
||||
(elem->id),
|
||||
elem->size, "etrace",
|
||||
SOF_DEBUGFS_ACCESS_D0_ONLY);
|
||||
break;
|
||||
case SOF_IPC_REGION_DEBUG:
|
||||
snd_sof_debugfs_io_item(sdev,
|
||||
sdev->bar[HDA_DSP_BAR] +
|
||||
elem->offset +
|
||||
SRAM_WINDOW_OFFSET
|
||||
(elem->id),
|
||||
elem->size, "debug",
|
||||
SOF_DEBUGFS_ACCESS_D0_ONLY);
|
||||
break;
|
||||
case SOF_IPC_REGION_STREAM:
|
||||
stream_offset =
|
||||
elem->offset + SRAM_WINDOW_OFFSET(elem->id);
|
||||
stream_size = elem->size;
|
||||
snd_sof_debugfs_io_item(sdev,
|
||||
sdev->bar[HDA_DSP_BAR] +
|
||||
elem->offset +
|
||||
SRAM_WINDOW_OFFSET
|
||||
(elem->id),
|
||||
elem->size, "stream",
|
||||
SOF_DEBUGFS_ACCESS_D0_ONLY);
|
||||
break;
|
||||
case SOF_IPC_REGION_REGS:
|
||||
snd_sof_debugfs_io_item(sdev,
|
||||
sdev->bar[HDA_DSP_BAR] +
|
||||
elem->offset +
|
||||
SRAM_WINDOW_OFFSET
|
||||
(elem->id),
|
||||
elem->size, "regs",
|
||||
SOF_DEBUGFS_ACCESS_D0_ONLY);
|
||||
break;
|
||||
case SOF_IPC_REGION_EXCEPTION:
|
||||
sdev->dsp_oops_offset = elem->offset +
|
||||
SRAM_WINDOW_OFFSET(elem->id);
|
||||
snd_sof_debugfs_io_item(sdev,
|
||||
sdev->bar[HDA_DSP_BAR] +
|
||||
elem->offset +
|
||||
SRAM_WINDOW_OFFSET
|
||||
(elem->id),
|
||||
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);
|
||||
return HDA_DSP_MBOX_UPLINK_OFFSET;
|
||||
}
|
||||
|
||||
/* check for ABI compatibility and create memory windows on first boot */
|
||||
int hda_dsp_ipc_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
|
||||
int hda_dsp_ipc_get_window_offset(struct snd_sof_dev *sdev, u32 id)
|
||||
{
|
||||
struct sof_ipc_fw_ready *fw_ready = &sdev->fw_ready;
|
||||
u32 offset;
|
||||
int ret;
|
||||
|
||||
/* mailbox must be on 4k boundary */
|
||||
offset = HDA_DSP_MBOX_UPLINK_OFFSET;
|
||||
|
||||
dev_dbg(sdev->dev, "ipc: DSP is ready 0x%8.8x offset 0x%x\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,
|
||||
HDA_DSP_MBOX_UPLINK_OFFSET +
|
||||
sizeof(struct sof_ipc_fw_ready));
|
||||
|
||||
ipc_get_windows(sdev);
|
||||
|
||||
return 0;
|
||||
return SRAM_WINDOW_OFFSET(id);
|
||||
}
|
||||
|
||||
void hda_ipc_msg_data(struct snd_sof_dev *sdev,
|
||||
|
|
|
@ -519,7 +519,9 @@ int hda_ipc_pcm_params(struct snd_sof_dev *sdev,
|
|||
int hda_dsp_ipc_send_msg(struct snd_sof_dev *sdev,
|
||||
struct snd_sof_ipc_msg *msg);
|
||||
void hda_dsp_ipc_get_reply(struct snd_sof_dev *sdev);
|
||||
int hda_dsp_ipc_fw_ready(struct snd_sof_dev *sdev, u32 msg_id);
|
||||
int hda_dsp_ipc_get_mailbox_offset(struct snd_sof_dev *sdev);
|
||||
int hda_dsp_ipc_get_window_offset(struct snd_sof_dev *sdev, u32 id);
|
||||
|
||||
irqreturn_t hda_dsp_ipc_irq_handler(int irq, void *context);
|
||||
irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context);
|
||||
int hda_dsp_ipc_cmd_done(struct snd_sof_dev *sdev, int dir);
|
||||
|
|
Загрузка…
Ссылка в новой задаче