summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2014-06-27 06:45:02 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:10:20 -0400
commite2638d73fd56f9a93c44839ebd61d6ba58c40dd8 (patch)
tree00dae636bb2d2db72066f9af4b741670095f4e35 /drivers/gpu/nvgpu/gk20a/channel_gk20a.c
parent2c15c3265bbcd88baf119f33f16c5a54d3d3f5a7 (diff)
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 <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/432151 Reviewed-by: Sachin Nikam <snikam@nvidia.com> Tested-by: Sachin Nikam <snikam@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/channel_gk20a.c23
1 files changed, 4 insertions, 19 deletions
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)
1948 struct fifo_gk20a *f = &g->fifo; 1948 struct fifo_gk20a *f = &g->fifo;
1949 u32 chid; 1949 u32 chid;
1950 bool channels_in_use = false; 1950 bool channels_in_use = false;
1951 struct device *d = dev_from_gk20a(g);
1952 int err; 1951 int err;
1953 1952
1954 gk20a_dbg_fn(""); 1953 gk20a_dbg_fn("");
1955 1954
1956 /* idle the engine by submitting WFI on non-KEPLER_C channel */ 1955 /* wait for engine idle */
1957 for (chid = 0; chid < f->num_channels; chid++) { 1956 err = gk20a_fifo_wait_engine_idle(g);
1958 struct channel_gk20a *c = &f->channel[chid]; 1957 if (err)
1959 if (c->in_use && c->obj_class != KEPLER_C && !c->has_timedout) { 1958 return err;
1960 err = gk20a_channel_submit_wfi(c);
1961 if (err) {
1962 gk20a_err(d, "cannot idle channel %d\n",
1963 chid);
1964 return err;
1965 }
1966
1967 if (c->sync)
1968 c->sync->wait_cpu(c->sync,
1969 &c->last_submit.post_fence,
1970 500000);
1971 break;
1972 }
1973 }
1974 1959
1975 for (chid = 0; chid < f->num_channels; chid++) { 1960 for (chid = 0; chid < f->num_channels; chid++) {
1976 if (f->channel[chid].in_use) { 1961 if (f->channel[chid].in_use) {