From e2638d73fd56f9a93c44839ebd61d6ba58c40dd8 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Fri, 27 Jun 2014 13:45:02 +0300 Subject: gpu: nvgpu: Wait for idle via FIFO registers Wait for engine idle via FIFO's engine status instead of submitting WFI to channel. Submitting WFI and waiting is not robust, and wait might invoke debug dump which cannot be done while powering down. Bug 1499214 Change-Id: I4d52e8558e1a862ad4292036594d81ebfbd5f36b Signed-off-by: Terje Bergstrom Reviewed-on: http://git-master/r/432151 Reviewed-by: Sachin Nikam Tested-by: Sachin Nikam --- drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index 33681c2a..b4d9c785 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c @@ -1948,29 +1948,14 @@ int gk20a_channel_suspend(struct gk20a *g) struct fifo_gk20a *f = &g->fifo; u32 chid; bool channels_in_use = false; - struct device *d = dev_from_gk20a(g); int err; gk20a_dbg_fn(""); - /* idle the engine by submitting WFI on non-KEPLER_C channel */ - for (chid = 0; chid < f->num_channels; chid++) { - struct channel_gk20a *c = &f->channel[chid]; - if (c->in_use && c->obj_class != KEPLER_C && !c->has_timedout) { - err = gk20a_channel_submit_wfi(c); - if (err) { - gk20a_err(d, "cannot idle channel %d\n", - chid); - return err; - } - - if (c->sync) - c->sync->wait_cpu(c->sync, - &c->last_submit.post_fence, - 500000); - break; - } - } + /* wait for engine idle */ + err = gk20a_fifo_wait_engine_idle(g); + if (err) + return err; for (chid = 0; chid < f->num_channels; chid++) { if (f->channel[chid].in_use) { -- cgit v1.2.2