summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c15
-rw-r--r--drivers/gpu/nvgpu/gk20a/hw_fifo_gk20a.h4
-rw-r--r--drivers/gpu/nvgpu/gm206/hw_fifo_gm206.h4
-rw-r--r--drivers/gpu/nvgpu/gm20b/hw_fifo_gm20b.h4
4 files changed, 24 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 1a93d546..fc1978ed 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -330,6 +330,8 @@ int gr_gk20a_wait_idle(struct gk20a *g, unsigned long end_jiffies,
330 bool ctxsw_active; 330 bool ctxsw_active;
331 bool gr_busy; 331 bool gr_busy;
332 u32 gr_engine_id; 332 u32 gr_engine_id;
333 u32 engine_status;
334 bool ctx_status_invalid;
333 335
334 gk20a_dbg_fn(""); 336 gk20a_dbg_fn("");
335 337
@@ -343,14 +345,21 @@ int gr_gk20a_wait_idle(struct gk20a *g, unsigned long end_jiffies,
343 gr_enabled = gk20a_readl(g, mc_enable_r()) & 345 gr_enabled = gk20a_readl(g, mc_enable_r()) &
344 mc_enable_pgraph_enabled_f(); 346 mc_enable_pgraph_enabled_f();
345 347
346 ctxsw_active = gk20a_readl(g, 348 engine_status = gk20a_readl(g,
347 fifo_engine_status_r(gr_engine_id)) & 349 fifo_engine_status_r(gr_engine_id));
350
351 ctxsw_active = engine_status &
348 fifo_engine_status_ctxsw_in_progress_f(); 352 fifo_engine_status_ctxsw_in_progress_f();
349 353
354 ctx_status_invalid =
355 (fifo_engine_status_ctx_status_v(engine_status) ==
356 fifo_engine_status_ctx_status_invalid_v());
357
350 gr_busy = gk20a_readl(g, gr_engine_status_r()) & 358 gr_busy = gk20a_readl(g, gr_engine_status_r()) &
351 gr_engine_status_value_busy_f(); 359 gr_engine_status_value_busy_f();
352 360
353 if (!gr_enabled || (!gr_busy && !ctxsw_active)) { 361 if (!gr_enabled || ctx_status_invalid
362 || (!gr_busy && !ctxsw_active)) {
354 gk20a_dbg_fn("done"); 363 gk20a_dbg_fn("done");
355 return 0; 364 return 0;
356 } 365 }
diff --git a/drivers/gpu/nvgpu/gk20a/hw_fifo_gk20a.h b/drivers/gpu/nvgpu/gk20a/hw_fifo_gk20a.h
index c5c95cdf..4d54c89f 100644
--- a/drivers/gpu/nvgpu/gk20a/hw_fifo_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/hw_fifo_gk20a.h
@@ -478,6 +478,10 @@ static inline u32 fifo_engine_status_ctx_status_v(u32 r)
478{ 478{
479 return (r >> 13) & 0x7; 479 return (r >> 13) & 0x7;
480} 480}
481static inline u32 fifo_engine_status_ctx_status_invalid_v(void)
482{
483 return 0x00000000;
484}
481static inline u32 fifo_engine_status_ctx_status_valid_v(void) 485static inline u32 fifo_engine_status_ctx_status_valid_v(void)
482{ 486{
483 return 0x00000001; 487 return 0x00000001;
diff --git a/drivers/gpu/nvgpu/gm206/hw_fifo_gm206.h b/drivers/gpu/nvgpu/gm206/hw_fifo_gm206.h
index 56654124..19148b03 100644
--- a/drivers/gpu/nvgpu/gm206/hw_fifo_gm206.h
+++ b/drivers/gpu/nvgpu/gm206/hw_fifo_gm206.h
@@ -426,6 +426,10 @@ static inline u32 fifo_engine_status_ctx_status_v(u32 r)
426{ 426{
427 return (r >> 13) & 0x7; 427 return (r >> 13) & 0x7;
428} 428}
429static inline u32 fifo_engine_status_ctx_status_invalid_v(void)
430{
431 return 0x00000000;
432}
429static inline u32 fifo_engine_status_ctx_status_valid_v(void) 433static inline u32 fifo_engine_status_ctx_status_valid_v(void)
430{ 434{
431 return 0x00000001; 435 return 0x00000001;
diff --git a/drivers/gpu/nvgpu/gm20b/hw_fifo_gm20b.h b/drivers/gpu/nvgpu/gm20b/hw_fifo_gm20b.h
index 01e01695..964f4bf9 100644
--- a/drivers/gpu/nvgpu/gm20b/hw_fifo_gm20b.h
+++ b/drivers/gpu/nvgpu/gm20b/hw_fifo_gm20b.h
@@ -430,6 +430,10 @@ static inline u32 fifo_engine_status_ctx_status_v(u32 r)
430{ 430{
431 return (r >> 13) & 0x7; 431 return (r >> 13) & 0x7;
432} 432}
433static inline u32 fifo_engine_status_ctx_status_invalid_v(void)
434{
435 return 0x00000000;
436}
433static inline u32 fifo_engine_status_ctx_status_valid_v(void) 437static inline u32 fifo_engine_status_ctx_status_valid_v(void)
434{ 438{
435 return 0x00000001; 439 return 0x00000001;