ASoC: SOF: amd: Fix for reading position updates from stream box.
authorV sujith kumar Reddy <Vsujithkumar.Reddy@amd.com>
Wed, 23 Nov 2022 12:19:08 +0000 (17:49 +0530)
committerMark Brown <broonie@kernel.org>
Mon, 28 Nov 2022 13:04:20 +0000 (13:04 +0000)
By default the position updates are read from dsp box when streambox
size is not defined.if the streambox size is defined to some value
then position updates can be read from the streambox.

Signed-off-by: V sujith kumar Reddy <Vsujithkumar.Reddy@amd.com>
Link: https://lore.kernel.org/r/20221123121911.3446224-2-vsujithkumar.reddy@amd.corp-partner.google.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/amd/acp-common.c
sound/soc/sof/amd/acp-ipc.c
sound/soc/sof/amd/acp.h

index 27b95187356e5f1d6c1ea90fc3cb2b4536ea9d96..150e042e40392c1c1fd68914c535a5e5ac7b882e 100644 (file)
@@ -76,6 +76,7 @@ struct snd_sof_dsp_ops sof_acp_common_ops = {
        /*IPC */
        .send_msg               = acp_sof_ipc_send_msg,
        .ipc_msg_data           = acp_sof_ipc_msg_data,
+       .set_stream_data_offset = acp_set_stream_data_offset,
        .get_mailbox_offset     = acp_sof_ipc_get_mailbox_offset,
        .get_window_offset      = acp_sof_ipc_get_window_offset,
        .irq_thread             = acp_sof_ipc_irq_thread,
index dd030566e37259912cc4b8815753fd2f2819d5a8..dd6e53c63407f800d2572086f6f4eb3618d8d2c4 100644 (file)
@@ -192,13 +192,41 @@ int acp_sof_ipc_msg_data(struct snd_sof_dev *sdev, struct snd_pcm_substream *sub
 {
        unsigned int offset = sdev->dsp_box.offset;
 
-       if (!substream || !sdev->stream_box.size)
+       if (!substream || !sdev->stream_box.size) {
                acp_mailbox_read(sdev, offset, p, sz);
+       } else {
+               struct acp_dsp_stream *stream = substream->runtime->private_data;
+
+               if (!stream)
+                       return -ESTRPIPE;
+
+               acp_mailbox_read(sdev, stream->posn_offset, p, sz);
+       }
 
        return 0;
 }
 EXPORT_SYMBOL_NS(acp_sof_ipc_msg_data, SND_SOC_SOF_AMD_COMMON);
 
+int acp_set_stream_data_offset(struct snd_sof_dev *sdev,
+                              struct snd_pcm_substream *substream,
+                              size_t posn_offset)
+{
+       struct acp_dsp_stream *stream = substream->runtime->private_data;
+
+       /* check for unaligned offset or overflow */
+       if (posn_offset > sdev->stream_box.size ||
+           posn_offset % sizeof(struct sof_ipc_stream_posn) != 0)
+               return -EINVAL;
+
+       stream->posn_offset = sdev->stream_box.offset + posn_offset;
+
+       dev_dbg(sdev->dev, "pcm: stream dir %d, posn mailbox offset is %zu",
+               substream->stream, stream->posn_offset);
+
+       return 0;
+}
+EXPORT_SYMBOL_NS(acp_set_stream_data_offset, SND_SOC_SOF_AMD_COMMON);
+
 int acp_sof_ipc_get_mailbox_offset(struct snd_sof_dev *sdev)
 {
        const struct sof_amd_acp_desc *desc = get_chip_info(sdev->pdata);
index dd3c072d01721737bc67190eeccf1cb3fdb29e93..1529c6d9bf9b96503f4a31f93354247781d5ffb3 100644 (file)
@@ -138,6 +138,7 @@ struct acp_dsp_stream {
        int stream_tag;
        int active;
        unsigned int reg_offset;
+       size_t posn_offset;
 };
 
 struct sof_amd_acp_desc {
@@ -199,6 +200,9 @@ int acp_dsp_block_read(struct snd_sof_dev *sdev, enum snd_sof_fw_blk_type blk_ty
 irqreturn_t acp_sof_ipc_irq_thread(int irq, void *context);
 int acp_sof_ipc_msg_data(struct snd_sof_dev *sdev, struct snd_pcm_substream *substream,
                         void *p, size_t sz);
+int acp_set_stream_data_offset(struct snd_sof_dev *sdev,
+                              struct snd_pcm_substream *substream,
+                              size_t posn_offset);
 int acp_sof_ipc_send_msg(struct snd_sof_dev *sdev,
                         struct snd_sof_ipc_msg *msg);
 int acp_sof_ipc_get_mailbox_offset(struct snd_sof_dev *sdev);