diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index b1d9fa55..3159f026 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |||
@@ -443,21 +443,11 @@ int gk20a_disable_channel_tsg(struct gk20a *g, struct channel_gk20a *ch) | |||
443 | return 0; | 443 | return 0; |
444 | } | 444 | } |
445 | 445 | ||
446 | void gk20a_channel_abort(struct channel_gk20a *ch, bool channel_preempt) | 446 | void gk20a_channel_abort_clean_up(struct channel_gk20a *ch) |
447 | { | 447 | { |
448 | struct channel_gk20a_job *job, *n; | 448 | struct channel_gk20a_job *job, *n; |
449 | bool released_job_semaphore = false; | 449 | bool released_job_semaphore = false; |
450 | 450 | ||
451 | gk20a_dbg_fn(""); | ||
452 | |||
453 | /* make sure new kickoffs are prevented */ | ||
454 | ch->has_timedout = true; | ||
455 | |||
456 | ch->g->ops.fifo.disable_channel(ch); | ||
457 | |||
458 | if (channel_preempt) | ||
459 | gk20a_fifo_preempt(ch->g, ch); | ||
460 | |||
461 | /* ensure no fences are pending */ | 451 | /* ensure no fences are pending */ |
462 | mutex_lock(&ch->sync_lock); | 452 | mutex_lock(&ch->sync_lock); |
463 | if (ch->sync) | 453 | if (ch->sync) |
@@ -481,6 +471,24 @@ void gk20a_channel_abort(struct channel_gk20a *ch, bool channel_preempt) | |||
481 | gk20a_channel_update(ch, 0); | 471 | gk20a_channel_update(ch, 0); |
482 | } | 472 | } |
483 | 473 | ||
474 | void gk20a_channel_abort(struct channel_gk20a *ch, bool channel_preempt) | ||
475 | { | ||
476 | gk20a_dbg_fn(""); | ||
477 | |||
478 | if (gk20a_is_channel_marked_as_tsg(ch)) | ||
479 | return gk20a_fifo_abort_tsg(ch->g, ch->tsgid, channel_preempt); | ||
480 | |||
481 | /* make sure new kickoffs are prevented */ | ||
482 | ch->has_timedout = true; | ||
483 | |||
484 | ch->g->ops.fifo.disable_channel(ch); | ||
485 | |||
486 | if (channel_preempt) | ||
487 | ch->g->ops.fifo.preempt_channel(ch->g, ch->hw_chid); | ||
488 | |||
489 | gk20a_channel_abort_clean_up(ch); | ||
490 | } | ||
491 | |||
484 | int gk20a_wait_channel_idle(struct channel_gk20a *ch) | 492 | int gk20a_wait_channel_idle(struct channel_gk20a *ch) |
485 | { | 493 | { |
486 | bool channel_idle = false; | 494 | bool channel_idle = false; |
@@ -1714,7 +1722,7 @@ static void gk20a_channel_timeout_handler(struct work_struct *work) | |||
1714 | struct tsg_gk20a *tsg = &g->fifo.tsg[ch->tsgid]; | 1722 | struct tsg_gk20a *tsg = &g->fifo.tsg[ch->tsgid]; |
1715 | 1723 | ||
1716 | gk20a_fifo_set_ctx_mmu_error_tsg(g, tsg); | 1724 | gk20a_fifo_set_ctx_mmu_error_tsg(g, tsg); |
1717 | gk20a_fifo_abort_tsg(g, ch->tsgid); | 1725 | gk20a_fifo_abort_tsg(g, ch->tsgid, false); |
1718 | } else { | 1726 | } else { |
1719 | gk20a_fifo_set_ctx_mmu_error_ch(g, ch); | 1727 | gk20a_fifo_set_ctx_mmu_error_ch(g, ch); |
1720 | gk20a_channel_abort(ch, false); | 1728 | gk20a_channel_abort(ch, false); |