Add length to write command packet token so that we can track exactly
how many bytes are consumed by DSP in the command reply.

This is useful in some use-cases where the end of the file/stream
is not aligned with period size.

Signed-off-by: Srinivas Kandagatla <srinivas.kandaga...@linaro.org>
---
 sound/soc/qcom/qdsp6/q6asm-dai.c | 4 +++-
 sound/soc/qcom/qdsp6/q6asm.c     | 7 ++++---
 sound/soc/qcom/qdsp6/q6asm.h     | 3 +++
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/sound/soc/qcom/qdsp6/q6asm-dai.c b/sound/soc/qcom/qdsp6/q6asm-dai.c
index fb0488e7beb9..6b9ceac2ceb2 100644
--- a/sound/soc/qcom/qdsp6/q6asm-dai.c
+++ b/sound/soc/qcom/qdsp6/q6asm-dai.c
@@ -510,6 +510,7 @@ static void compress_event_handler(uint32_t opcode, 
uint32_t token,
        struct snd_compr_stream *substream = prtd->cstream;
        unsigned long flags;
        uint64_t avail;
+       uint32_t bytes_written;
 
        switch (opcode) {
        case ASM_CLIENT_EVENT_CMD_RUN_DONE:
@@ -530,7 +531,8 @@ static void compress_event_handler(uint32_t opcode, 
uint32_t token,
        case ASM_CLIENT_EVENT_DATA_WRITE_DONE:
                spin_lock_irqsave(&prtd->lock, flags);
 
-               prtd->copied_total += prtd->pcm_count;
+               bytes_written = token >> ASM_WRITE_TOKEN_LEN_SHIFT;
+               prtd->copied_total += bytes_written;
                snd_compr_fragment_elapsed(substream);
 
                if (prtd->state != Q6ASM_STREAM_RUNNING) {
diff --git a/sound/soc/qcom/qdsp6/q6asm.c b/sound/soc/qcom/qdsp6/q6asm.c
index d6728304ce6a..205453d1c1fc 100644
--- a/sound/soc/qcom/qdsp6/q6asm.c
+++ b/sound/soc/qcom/qdsp6/q6asm.c
@@ -670,6 +670,7 @@ static int32_t q6asm_stream_callback(struct apr_device 
*adev,
                if (ac->io_mode & ASM_SYNC_IO_MODE) {
                        phys_addr_t phys;
                        unsigned long flags;
+                       int token = hdr->token & ASM_WRITE_TOKEN_MASK;
 
                        spin_lock_irqsave(&ac->lock, flags);
 
@@ -681,12 +682,12 @@ static int32_t q6asm_stream_callback(struct apr_device 
*adev,
                                goto done;
                        }
 
-                       phys = port->buf[hdr->token].phys;
+                       phys = port->buf[token].phys;
 
                        if (lower_32_bits(phys) != result->opcode ||
                            upper_32_bits(phys) != result->status) {
                                dev_err(ac->dev, "Expected addr %pa\n",
-                                       &port->buf[hdr->token].phys);
+                                       &port->buf[token].phys);
                                spin_unlock_irqrestore(&ac->lock, flags);
                                ret = -EINVAL;
                                goto done;
@@ -1535,7 +1536,7 @@ int q6asm_write_async(struct audio_client *ac, uint32_t 
stream_id, uint32_t len,
        q6asm_add_hdr(ac, &pkt->hdr, pkt_size, false, stream_id);
 
        ab = &port->buf[port->dsp_buf];
-       pkt->hdr.token = port->dsp_buf;
+       pkt->hdr.token = port->dsp_buf | (len << ASM_WRITE_TOKEN_LEN_SHIFT);
        pkt->hdr.opcode = ASM_DATA_CMD_WRITE_V2;
        write->buf_addr_lsw = lower_32_bits(ab->phys);
        write->buf_addr_msw = upper_32_bits(ab->phys);
diff --git a/sound/soc/qcom/qdsp6/q6asm.h b/sound/soc/qcom/qdsp6/q6asm.h
index ceece124dd3d..0379580f0742 100644
--- a/sound/soc/qcom/qdsp6/q6asm.h
+++ b/sound/soc/qcom/qdsp6/q6asm.h
@@ -20,6 +20,9 @@
 #define ASM_CLIENT_EVENT_CMD_RUN_DONE          0x1008
 #define ASM_CLIENT_EVENT_DATA_WRITE_DONE       0x1009
 #define ASM_CLIENT_EVENT_DATA_READ_DONE                0x100a
+#define ASM_WRITE_TOKEN_MASK                   GENMASK(15, 0)
+#define ASM_WRITE_TOKEN_LEN_MASK               GENMASK(31, 16)
+#define ASM_WRITE_TOKEN_LEN_SHIFT              16
 
 enum {
        LEGACY_PCM_MODE = 0,
-- 
2.21.0

Reply via email to