diff options
author | Alex Waterman <alexw@nvidia.com> | 2016-11-08 14:40:10 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-01-04 18:53:55 -0500 |
commit | 91d977ced46f5db02da077df8703e958c5e2af4e (patch) | |
tree | 195b96e91f34933dd56b8aa5206295a093fbff11 /drivers/gpu/nvgpu/gk20a/mm_gk20a.c | |
parent | a0242464f5f12d9f10fbf0d05614bfadde84386c (diff) |
gpu: nvgpu: Misc fixes for crashes on shutdown
Fix miscellaneous issues seen during driver shutdown.
o Make sure pointers are valid before accessing them.
o Busy the GPU during channel timeout.
o Cancel delayed work on channels.
o Avoid access to channels that may have been freed.
Bug 1816516
Bug 1807277
Change-Id: I62df40373fdfb1c4a011364e8c435176a08a7a96
Signed-off-by: Alex Waterman <alexw@nvidia.com>
Reviewed-on: http://git-master/r/1250026
(cherry picked from commit 64a95fc96c8ef7c5af9c53c4bb3402626e0d2f60)
Reviewed-on: http://git-master/r/1274474
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index 792fa098..2e338fef 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c | |||
@@ -219,6 +219,11 @@ static inline void pramin_access_batch_rd_n(struct gk20a *g, u32 start, | |||
219 | { | 219 | { |
220 | u32 r = start, *dest_u32 = *arg; | 220 | u32 r = start, *dest_u32 = *arg; |
221 | 221 | ||
222 | if (!g->regs) { | ||
223 | __gk20a_warn_on_no_regs(); | ||
224 | return; | ||
225 | } | ||
226 | |||
222 | while (words--) { | 227 | while (words--) { |
223 | *dest_u32++ = gk20a_readl(g, r); | 228 | *dest_u32++ = gk20a_readl(g, r); |
224 | r += sizeof(u32); | 229 | r += sizeof(u32); |
@@ -232,6 +237,11 @@ static inline void pramin_access_batch_wr_n(struct gk20a *g, u32 start, | |||
232 | { | 237 | { |
233 | u32 r = start, *src_u32 = *arg; | 238 | u32 r = start, *src_u32 = *arg; |
234 | 239 | ||
240 | if (!g->regs) { | ||
241 | __gk20a_warn_on_no_regs(); | ||
242 | return; | ||
243 | } | ||
244 | |||
235 | while (words--) { | 245 | while (words--) { |
236 | writel_relaxed(*src_u32++, g->regs + r); | 246 | writel_relaxed(*src_u32++, g->regs + r); |
237 | r += sizeof(u32); | 247 | r += sizeof(u32); |
@@ -245,6 +255,11 @@ static inline void pramin_access_batch_set(struct gk20a *g, u32 start, | |||
245 | { | 255 | { |
246 | u32 r = start, repeat = **arg; | 256 | u32 r = start, repeat = **arg; |
247 | 257 | ||
258 | if (!g->regs) { | ||
259 | __gk20a_warn_on_no_regs(); | ||
260 | return; | ||
261 | } | ||
262 | |||
248 | while (words--) { | 263 | while (words--) { |
249 | writel_relaxed(repeat, g->regs + r); | 264 | writel_relaxed(repeat, g->regs + r); |
250 | r += sizeof(u32); | 265 | r += sizeof(u32); |