diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2018-02-26 06:31:41 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-03-01 16:53:31 -0500 |
commit | 37a15ce818244ec11dbe002350d013cb636e0a9d (patch) | |
tree | 05f925962dd86c37d61b27f1eac026419a9ec22b /drivers/gpu/nvgpu/gv11b/fifo_gv11b.c | |
parent | df2100018db1dba730937fe76464a8edf8ebf5dc (diff) |
gpu: nvgpu: skip channel abort for deferred reset
In case deferred_reset_pending is set in gk20a_fifo_handle_mmu_fault() and in
gv11b_fifo_teardown_ch_tsg(), we skip resetting the engines and skip setting
the error notifier
Then we call gk20a_channel_abort()/gk20a_fifo_abort_tsg() which aborts the
channels, and resets the syncpoint values to release all the waiters
But since we don't set error notifier this could lead User to assume a
successful submission without any error
To fix this disable channel/TSG in case deferred_reset_pending is set and skip
calls to gk20a_channel_abort()/gk20a_fifo_abort_tsg()
Note that we finally abort the channel when channel is being closed
Bug 200363077
Change-Id: Ia48ca369701c14d1913d8f7b66ed466b7b840224
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1664319
(cherry picked from commit ac40d082e85397f100c3d8377b1f28811485def4)
Reviewed-on: https://git-master.nvidia.com/r/1666445
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-by: Seema Khowala <seemaj@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b/fifo_gv11b.c')
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/fifo_gv11b.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c index 97ab7aab..feed2002 100644 --- a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c | |||
@@ -1049,19 +1049,25 @@ void gv11b_fifo_teardown_ch_tsg(struct gk20a *g, u32 act_eng_bitmask, | |||
1049 | #endif | 1049 | #endif |
1050 | 1050 | ||
1051 | if (tsg) { | 1051 | if (tsg) { |
1052 | if (!g->fifo.deferred_reset_pending && | 1052 | if (g->fifo.deferred_reset_pending) { |
1053 | rc_type == RC_TYPE_MMU_FAULT) | 1053 | gk20a_disable_tsg(tsg); |
1054 | gk20a_fifo_set_ctx_mmu_error_tsg(g, tsg); | 1054 | } else { |
1055 | if (rc_type == RC_TYPE_MMU_FAULT) | ||
1056 | gk20a_fifo_set_ctx_mmu_error_tsg(g, tsg); | ||
1055 | 1057 | ||
1056 | gk20a_fifo_abort_tsg(g, tsg->tsgid, false); | 1058 | gk20a_fifo_abort_tsg(g, tsg->tsgid, false); |
1059 | } | ||
1057 | if (refch) | 1060 | if (refch) |
1058 | gk20a_channel_put(refch); | 1061 | gk20a_channel_put(refch); |
1059 | } else if (refch) { | 1062 | } else if (refch) { |
1060 | if (!g->fifo.deferred_reset_pending && | 1063 | if (g->fifo.deferred_reset_pending) { |
1061 | rc_type == RC_TYPE_MMU_FAULT) | 1064 | g->ops.fifo.disable_channel(refch); |
1065 | } else { | ||
1066 | if (rc_type == RC_TYPE_MMU_FAULT) | ||
1062 | gk20a_fifo_set_ctx_mmu_error_ch(g, refch); | 1067 | gk20a_fifo_set_ctx_mmu_error_ch(g, refch); |
1063 | 1068 | ||
1064 | gk20a_channel_abort(refch, false); | 1069 | gk20a_channel_abort(refch, false); |
1070 | } | ||
1065 | gk20a_channel_put(refch); | 1071 | gk20a_channel_put(refch); |
1066 | } else { | 1072 | } else { |
1067 | nvgpu_err(g, "id unknown, abort runlist"); | 1073 | nvgpu_err(g, "id unknown, abort runlist"); |