diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2016-06-07 03:50:05 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-06-08 14:22:59 -0400 |
commit | 2219f38727ffa17291e15c1898bd3e65f43d09fd (patch) | |
tree | be00266779b0632a5727c2d58f2b297c6cc4ebfd /drivers/gpu/nvgpu/gk20a/gk20a.h | |
parent | 6299b00beb9dabdd53c211b02658d022827b3232 (diff) |
gpu: nvgpu: take power refcount in ISR
We sometimes see race conditions where power refcount
is zero during ISR or bottom half.
If bottom half calls gk20a_busy(), it will lead to
boot up of GPU, but it is also possible that we are
already trying to poweroff GPU since power refcount
is zero
Fix this by taking a power refcount with gk20a_busy_noresume()
in ISR and then dropping this refcount at the end of
bottom half
Add new API gk20a_idle_nosuspend() to drop a refcount
without initiating suspend
Bug 200198908
Bug 1770522
Change-Id: Iec3d4dc8d468f49b71919d2bbc327da48b97bcab
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/1160035
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/gk20a.h')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index b7f3f6f1..c7d12f86 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h | |||
@@ -1060,6 +1060,7 @@ void gk20a_remove_sysfs(struct device *dev); | |||
1060 | 1060 | ||
1061 | void gk20a_busy_noresume(struct device *dev); | 1061 | void gk20a_busy_noresume(struct device *dev); |
1062 | int __must_check gk20a_busy(struct device *dev); | 1062 | int __must_check gk20a_busy(struct device *dev); |
1063 | void gk20a_idle_nosuspend(struct device *dev); | ||
1063 | void gk20a_idle(struct device *dev); | 1064 | void gk20a_idle(struct device *dev); |
1064 | void gk20a_disable(struct gk20a *g, u32 units); | 1065 | void gk20a_disable(struct gk20a *g, u32 units); |
1065 | void gk20a_enable(struct gk20a *g, u32 units); | 1066 | void gk20a_enable(struct gk20a *g, u32 units); |