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 | |
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>
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 14 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/fifo_gv11b.c | 20 |
2 files changed, 22 insertions, 12 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index fea46a0e..e12576d2 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * GK20A Graphics FIFO (gr host) | 2 | * GK20A Graphics FIFO (gr host) |
3 | * | 3 | * |
4 | * Copyright (c) 2011-2017, NVIDIA CORPORATION. All rights reserved. | 4 | * Copyright (c) 2011-2018, NVIDIA CORPORATION. All rights reserved. |
5 | * | 5 | * |
6 | * Permission is hereby granted, free of charge, to any person obtaining a | 6 | * Permission is hereby granted, free of charge, to any person obtaining a |
7 | * copy of this software and associated documentation files (the "Software"), | 7 | * copy of this software and associated documentation files (the "Software"), |
@@ -1647,28 +1647,32 @@ static bool gk20a_fifo_handle_mmu_fault( | |||
1647 | * Disable the channel/TSG from hw and increment syncpoints. | 1647 | * Disable the channel/TSG from hw and increment syncpoints. |
1648 | */ | 1648 | */ |
1649 | if (tsg) { | 1649 | if (tsg) { |
1650 | if (!g->fifo.deferred_reset_pending) { | 1650 | if (g->fifo.deferred_reset_pending) { |
1651 | gk20a_disable_tsg(tsg); | ||
1652 | } else { | ||
1651 | if (!fake_fault) | 1653 | if (!fake_fault) |
1652 | gk20a_fifo_set_ctx_mmu_error_tsg(g, | 1654 | gk20a_fifo_set_ctx_mmu_error_tsg(g, |
1653 | tsg); | 1655 | tsg); |
1654 | verbose = gk20a_fifo_error_tsg(g, tsg); | 1656 | verbose = gk20a_fifo_error_tsg(g, tsg); |
1657 | gk20a_fifo_abort_tsg(g, tsg->tsgid, false); | ||
1655 | } | 1658 | } |
1656 | gk20a_fifo_abort_tsg(g, tsg->tsgid, false); | ||
1657 | 1659 | ||
1658 | /* put back the ref taken early above */ | 1660 | /* put back the ref taken early above */ |
1659 | if (refch) | 1661 | if (refch) |
1660 | gk20a_channel_put(ch); | 1662 | gk20a_channel_put(ch); |
1661 | } else if (ch) { | 1663 | } else if (ch) { |
1662 | if (refch) { | 1664 | if (refch) { |
1663 | if (!g->fifo.deferred_reset_pending) { | 1665 | if (g->fifo.deferred_reset_pending) { |
1666 | g->ops.fifo.disable_channel(ch); | ||
1667 | } else { | ||
1664 | if (!fake_fault) | 1668 | if (!fake_fault) |
1665 | gk20a_fifo_set_ctx_mmu_error_ch( | 1669 | gk20a_fifo_set_ctx_mmu_error_ch( |
1666 | g, refch); | 1670 | g, refch); |
1667 | 1671 | ||
1668 | verbose = gk20a_fifo_error_ch(g, | 1672 | verbose = gk20a_fifo_error_ch(g, |
1669 | refch); | 1673 | refch); |
1674 | gk20a_channel_abort(ch, false); | ||
1670 | } | 1675 | } |
1671 | gk20a_channel_abort(ch, false); | ||
1672 | gk20a_channel_put(ch); | 1676 | gk20a_channel_put(ch); |
1673 | } else { | 1677 | } else { |
1674 | nvgpu_err(g, | 1678 | nvgpu_err(g, |
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"); |