diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2014-06-27 06:45:02 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:10:20 -0400 |
commit | e2638d73fd56f9a93c44839ebd61d6ba58c40dd8 (patch) | |
tree | 00dae636bb2d2db72066f9af4b741670095f4e35 /drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |
parent | 2c15c3265bbcd88baf119f33f16c5a54d3d3f5a7 (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.c | 23 |
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) { |