soc: qcom: aoss: Read back before triggering the IRQ
authorArun Kumar Neelakantam <aneela@codeaurora.org>
Wed, 22 Jan 2020 08:24:13 +0000 (13:54 +0530)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Fri, 14 Feb 2020 05:18:16 +0000 (21:18 -0800)
In some device memory used by msm_qmp, there can be an early ack of a
write to memory succeeding. This may cause the outgoing interrupt to be
triggered before the msgram reflects the write.

Add a readback to ensure the data is flushed to device memory before
triggering the ipc interrupt.

Signed-off-by: Arun Kumar Neelakantam <aneela@codeaurora.org>
Link: https://lore.kernel.org/r/1579681454-1229-1-git-send-email-aneela@codeaurora.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/soc/qcom/qcom_aoss.c

index fe79661..f43a2e0 100644 (file)
@@ -225,6 +225,7 @@ static bool qmp_message_empty(struct qmp *qmp)
 static int qmp_send(struct qmp *qmp, const void *data, size_t len)
 {
        long time_left;
+       size_t tlen;
        int ret;
 
        if (WARN_ON(len + sizeof(u32) > qmp->size))
@@ -239,6 +240,9 @@ static int qmp_send(struct qmp *qmp, const void *data, size_t len)
        __iowrite32_copy(qmp->msgram + qmp->offset + sizeof(u32),
                         data, len / sizeof(u32));
        writel(len, qmp->msgram + qmp->offset);
+
+       /* Read back len to confirm data written in message RAM */
+       tlen = readl(qmp->msgram + qmp->offset);
        qmp_kick(qmp);
 
        time_left = wait_event_interruptible_timeout(qmp->event,