From c4ac1ed369cb5737de10924908d97be9f11ec875 Mon Sep 17 00:00:00 2001 From: Deepak Nibade Date: Thu, 10 Dec 2015 14:28:32 +0530 Subject: gpu: nvgpu: preempt before adjusting fences Current sequence in gk20a_disable_channel() is - disable channel in gk20a_channel_abort() - adjust pending fence in gk20a_channel_abort() - preempt channel But this leads to scenarios where syncpoint has min > max value Hence to fix this, make sequence in gk20a_disable_channel() - disable channel in gk20a_channel_abort() - preempt channel in gk20a_channel_abort() - adjust pending fence in gk20a_channel_abort() If gk20a_channel_abort() is called from other API where preemption is not needed, then use channel_preempt flag and do not preempt channel in those cases Bug 1683059 Change-Id: I4d46d4294cf8597ae5f05f79dfe1b95c4187f2e3 Signed-off-by: Deepak Nibade Reviewed-on: http://git-master/r/921290 Reviewed-by: Terje Bergstrom Tested-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index 11fcc805..1727cf1d 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c @@ -894,7 +894,7 @@ void gk20a_fifo_abort_tsg(struct gk20a *g, u32 tsgid) mutex_lock(&tsg->ch_list_lock); list_for_each_entry(ch, &tsg->ch_list, ch_entry) { if (gk20a_channel_get(ch)) { - gk20a_channel_abort(ch); + gk20a_channel_abort(ch, false); gk20a_channel_put(ch); } } @@ -1064,7 +1064,7 @@ static bool gk20a_fifo_handle_mmu_fault( if (referenced_channel) { if (!g->fifo.deferred_reset_pending) verbose = gk20a_fifo_set_ctx_mmu_error_ch(g, ch); - gk20a_channel_abort(ch); + gk20a_channel_abort(ch, false); gk20a_channel_put(ch); } else { gk20a_err(dev_from_gk20a(g), @@ -1217,7 +1217,7 @@ void gk20a_fifo_recover_ch(struct gk20a *g, u32 hw_chid, bool verbose) struct channel_gk20a *ch = &g->fifo.channel[hw_chid]; if (gk20a_channel_get(ch)) { - gk20a_channel_abort(ch); + gk20a_channel_abort(ch, false); if (gk20a_fifo_set_ctx_mmu_error_ch(g, ch)) gk20a_debug_dump(g->dev); -- cgit v1.2.2