diff options
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/nvgpu/common/fifo/channel.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/drivers/gpu/nvgpu/common/fifo/channel.c b/drivers/gpu/nvgpu/common/fifo/channel.c index b5ae42d4..2ada3911 100644 --- a/drivers/gpu/nvgpu/common/fifo/channel.c +++ b/drivers/gpu/nvgpu/common/fifo/channel.c | |||
@@ -2291,7 +2291,13 @@ int gk20a_channel_suspend(struct gk20a *g) | |||
2291 | for (chid = 0; chid < f->num_channels; chid++) { | 2291 | for (chid = 0; chid < f->num_channels; chid++) { |
2292 | struct channel_gk20a *ch = gk20a_channel_from_id(g, chid); | 2292 | struct channel_gk20a *ch = gk20a_channel_from_id(g, chid); |
2293 | 2293 | ||
2294 | if (ch != NULL) { | 2294 | if (ch == NULL) { |
2295 | continue; | ||
2296 | } | ||
2297 | if (gk20a_channel_check_timedout(ch)) { | ||
2298 | nvgpu_log_info(g, "do not suspend recovered " | ||
2299 | "channel %d", chid); | ||
2300 | } else { | ||
2295 | nvgpu_log_info(g, "suspend channel %d", chid); | 2301 | nvgpu_log_info(g, "suspend channel %d", chid); |
2296 | /* disable channel */ | 2302 | /* disable channel */ |
2297 | gk20a_disable_channel_tsg(g, ch); | 2303 | gk20a_disable_channel_tsg(g, ch); |
@@ -2304,10 +2310,9 @@ int gk20a_channel_suspend(struct gk20a *g) | |||
2304 | 2310 | ||
2305 | channels_in_use = true; | 2311 | channels_in_use = true; |
2306 | 2312 | ||
2307 | active_runlist_ids |= BIT(ch->runlist_id); | 2313 | active_runlist_ids |= (u32) BIT64(ch->runlist_id); |
2308 | |||
2309 | gk20a_channel_put(ch); | ||
2310 | } | 2314 | } |
2315 | gk20a_channel_put(ch); | ||
2311 | } | 2316 | } |
2312 | 2317 | ||
2313 | if (channels_in_use) { | 2318 | if (channels_in_use) { |
@@ -2317,7 +2322,13 @@ int gk20a_channel_suspend(struct gk20a *g) | |||
2317 | struct channel_gk20a *ch = gk20a_channel_from_id(g, chid); | 2322 | struct channel_gk20a *ch = gk20a_channel_from_id(g, chid); |
2318 | 2323 | ||
2319 | if (ch != NULL) { | 2324 | if (ch != NULL) { |
2320 | g->ops.fifo.unbind_channel(ch); | 2325 | if (gk20a_channel_check_timedout(ch)) { |
2326 | nvgpu_log_info(g, "do not unbind " | ||
2327 | "recovered channel %d", | ||
2328 | chid); | ||
2329 | } else { | ||
2330 | g->ops.fifo.unbind_channel(ch); | ||
2331 | } | ||
2321 | gk20a_channel_put(ch); | 2332 | gk20a_channel_put(ch); |
2322 | } | 2333 | } |
2323 | } | 2334 | } |
@@ -2339,13 +2350,19 @@ int gk20a_channel_resume(struct gk20a *g) | |||
2339 | for (chid = 0; chid < f->num_channels; chid++) { | 2350 | for (chid = 0; chid < f->num_channels; chid++) { |
2340 | struct channel_gk20a *ch = gk20a_channel_from_id(g, chid); | 2351 | struct channel_gk20a *ch = gk20a_channel_from_id(g, chid); |
2341 | 2352 | ||
2342 | if (ch != NULL) { | 2353 | if (ch == NULL) { |
2354 | continue; | ||
2355 | } | ||
2356 | if (gk20a_channel_check_timedout(ch)) { | ||
2357 | nvgpu_log_info(g, "do not resume recovered " | ||
2358 | "channel %d", chid); | ||
2359 | } else { | ||
2343 | nvgpu_log_info(g, "resume channel %d", chid); | 2360 | nvgpu_log_info(g, "resume channel %d", chid); |
2344 | g->ops.fifo.bind_channel(ch); | 2361 | g->ops.fifo.bind_channel(ch); |
2345 | channels_in_use = true; | 2362 | channels_in_use = true; |
2346 | active_runlist_ids |= BIT(f->channel[chid].runlist_id); | 2363 | active_runlist_ids |= (u32) BIT64(ch->runlist_id); |
2347 | gk20a_channel_put(ch); | ||
2348 | } | 2364 | } |
2365 | gk20a_channel_put(ch); | ||
2349 | } | 2366 | } |
2350 | 2367 | ||
2351 | if (channels_in_use) { | 2368 | if (channels_in_use) { |