From 9d8b6ff21bd89a5d6fca2e311b0ccfda32de43c9 Mon Sep 17 00:00:00 2001 From: Ashok Vuyyuru Date: Wed, 28 Apr 2021 01:23:57 +0530 Subject: [PATCH] msm: ipa3: Adding chnages to update event RP from DDR In suspend scenario while checking channel empty scenario updating the event ring RP pointer from direct register, it may cause mismatch in reading in polling context. To avoid discrepancy reading RP pointer DDR location. Change-Id: Ie198ea9ace033e31463acd974f10dccdcac45c55 Signed-off-by: Ashok Vuyyuru --- drivers/platform/msm/gsi/gsi.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c index 2c55c0711c75..79617afbd9be 100644 --- a/drivers/platform/msm/gsi/gsi.c +++ b/drivers/platform/msm/gsi/gsi.c @@ -3652,6 +3652,7 @@ EXPORT_SYMBOL(gsi_query_channel_info); int gsi_is_channel_empty(unsigned long chan_hdl, bool *is_empty) { struct gsi_chan_ctx *ctx; + struct gsi_evt_ctx *ev_ctx; spinlock_t *slock; unsigned long flags; uint64_t rp; @@ -3687,8 +3688,11 @@ int gsi_is_channel_empty(unsigned long chan_hdl, bool *is_empty) spin_lock_irqsave(slock, flags); if (ctx->props.dir == GSI_CHAN_DIR_FROM_GSI && ctx->evtr) { - rp = gsi_readl(gsi_ctx->base + - GSI_EE_n_EV_CH_k_CNTXT_4_OFFS(ctx->evtr->id, ee)); + ev_ctx = &gsi_ctx->evtr[ctx->evtr->id]; + /* Read the event ring rp from DDR to avoid mismatch */ + rp = ev_ctx->props.gsi_read_event_ring_rp(&ev_ctx->props, + ev_ctx->id, ee); + rp |= ctx->evtr->ring.rp & 0xFFFFFFFF00000000; ctx->evtr->ring.rp = rp;