summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/fifo/channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/common/fifo/channel.c')
-rw-r--r--drivers/gpu/nvgpu/common/fifo/channel.c33
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) {