From a0e8519538ce7cab2ff3c78a66ec1f23c9e30b74 Mon Sep 17 00:00:00 2001 From: Chris Lew Date: Wed, 8 Jan 2020 11:31:21 -0800 Subject: [PATCH] mailbox: msm_qmp: Add msgram readback On 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. Change-Id: I37618f2921dc34d969a04de80badf1820a188351 Signed-off-by: Chris Lew --- drivers/mailbox/msm_qmp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/mailbox/msm_qmp.c b/drivers/mailbox/msm_qmp.c index 6172ce6aeae2..2085986fa194 100644 --- a/drivers/mailbox/msm_qmp.c +++ b/drivers/mailbox/msm_qmp.c @@ -380,6 +380,7 @@ static int qmp_send_data(struct mbox_chan *chan, void *data) struct qmp_pkt *pkt = (struct qmp_pkt *)data; void __iomem *addr; unsigned long flags; + u32 size; int i; if (!mbox || !data || mbox->local_state != CHANNEL_CONNECTED) @@ -401,13 +402,15 @@ static int qmp_send_data(struct mbox_chan *chan, void *data) memcpy32_toio(addr + sizeof(pkt->size), pkt->data, pkt->size); iowrite32(pkt->size, addr); + /* readback to ensure write reflects in msgram */ + size = ioread32(addr); mbox->tx_sent = true; for (i = 0; i < mbox->ctrl.num_chans; i++) { if (chan == &mbox->ctrl.chans[i]) mbox->idx_in_flight = i; } QMP_INFO(mdev->ilc, "Copied buffer to msgram sz:%d i:%d\n", - pkt->size, mbox->idx_in_flight); + size, mbox->idx_in_flight); send_irq(mdev); qmp_schedule_tx_timeout(mbox); spin_unlock_irqrestore(&mbox->tx_lock, flags);