diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index d52e3f7e..344223ae 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |||
@@ -659,11 +659,6 @@ void gk20a_free_channel(struct channel_gk20a *ch, bool finish) | |||
659 | 659 | ||
660 | channel_gk20a_free_priv_cmdbuf(ch); | 660 | channel_gk20a_free_priv_cmdbuf(ch); |
661 | 661 | ||
662 | if (ch->sync) { | ||
663 | ch->sync->destroy(ch->sync); | ||
664 | ch->sync = NULL; | ||
665 | } | ||
666 | |||
667 | /* release channel binding to the as_share */ | 662 | /* release channel binding to the as_share */ |
668 | gk20a_as_release_share(ch_vm->as_share); | 663 | gk20a_as_release_share(ch_vm->as_share); |
669 | 664 | ||
@@ -673,6 +668,11 @@ unbind: | |||
673 | 668 | ||
674 | ch->vpr = false; | 669 | ch->vpr = false; |
675 | ch->vm = NULL; | 670 | ch->vm = NULL; |
671 | |||
672 | if (ch->sync) { | ||
673 | ch->sync->destroy(ch->sync); | ||
674 | ch->sync = NULL; | ||
675 | } | ||
676 | WARN_ON(ch->sync); | 676 | WARN_ON(ch->sync); |
677 | 677 | ||
678 | /* unlink all debug sessions */ | 678 | /* unlink all debug sessions */ |
@@ -1697,12 +1697,15 @@ int gk20a_channel_finish(struct channel_gk20a *ch, unsigned long timeout) | |||
1697 | gk20a_dbg_fn("waiting for channel to finish thresh:%d", | 1697 | gk20a_dbg_fn("waiting for channel to finish thresh:%d", |
1698 | ch->last_submit_fence.thresh); | 1698 | ch->last_submit_fence.thresh); |
1699 | 1699 | ||
1700 | err = ch->sync->wait_cpu(ch->sync, &ch->last_submit_fence, timeout); | 1700 | if (ch->sync) { |
1701 | if (WARN_ON(err)) | 1701 | err = ch->sync->wait_cpu(ch->sync, &ch->last_submit_fence, |
1702 | dev_warn(dev_from_gk20a(ch->g), | 1702 | timeout); |
1703 | "timed out waiting for gk20a channel to finish"); | 1703 | if (WARN_ON(err)) |
1704 | else | 1704 | dev_warn(dev_from_gk20a(ch->g), |
1705 | ch->cmds_pending = false; | 1705 | "timed out waiting for gk20a channel to finish"); |
1706 | else | ||
1707 | ch->cmds_pending = false; | ||
1708 | } | ||
1706 | 1709 | ||
1707 | return err; | 1710 | return err; |
1708 | } | 1711 | } |
@@ -1903,8 +1906,9 @@ int gk20a_channel_suspend(struct gk20a *g) | |||
1903 | return err; | 1906 | return err; |
1904 | } | 1907 | } |
1905 | 1908 | ||
1906 | c->sync->wait_cpu(c->sync, &c->last_submit_fence, | 1909 | if (c->sync) |
1907 | 500000); | 1910 | c->sync->wait_cpu(c->sync, |
1911 | &c->last_submit_fence, 500000); | ||
1908 | break; | 1912 | break; |
1909 | } | 1913 | } |
1910 | } | 1914 | } |