Commit 89e7edde authored by Arun Kumar Neelakantam's avatar Arun Kumar Neelakantam Committed by Bjorn Andersson

soc: qcom: aoss: Read back before triggering the IRQ

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: default avatarArun Kumar Neelakantam <aneela@codeaurora.org>
Link: https://lore.kernel.org/r/1579681454-1229-1-git-send-email-aneela@codeaurora.orgSigned-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
parent df636eea
...@@ -225,6 +225,7 @@ static bool qmp_message_empty(struct qmp *qmp) ...@@ -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) static int qmp_send(struct qmp *qmp, const void *data, size_t len)
{ {
long time_left; long time_left;
size_t tlen;
int ret; int ret;
if (WARN_ON(len + sizeof(u32) > qmp->size)) 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) ...@@ -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), __iowrite32_copy(qmp->msgram + qmp->offset + sizeof(u32),
data, len / sizeof(u32)); data, len / sizeof(u32));
writel(len, qmp->msgram + qmp->offset); 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); qmp_kick(qmp);
time_left = wait_event_interruptible_timeout(qmp->event, time_left = wait_event_interruptible_timeout(qmp->event,
......
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