diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index f588d1120..0d68464df 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -2950,9 +2950,13 @@ static void gk20a_mm_l2_invalidate_locked(struct gk20a *g) void gk20a_mm_l2_invalidate(struct gk20a *g) { struct mm_gk20a *mm = &g->mm; - mutex_lock(&mm->l2_op_lock); - gk20a_mm_l2_invalidate_locked(g); - mutex_unlock(&mm->l2_op_lock); + gk20a_busy_noresume(g->dev); + if (g->power_on) { + mutex_lock(&mm->l2_op_lock); + gk20a_mm_l2_invalidate_locked(g); + mutex_unlock(&mm->l2_op_lock); + } + pm_runtime_put_noidle(&g->dev->dev); } void gk20a_mm_l2_flush(struct gk20a *g, bool invalidate) @@ -2963,6 +2967,10 @@ void gk20a_mm_l2_flush(struct gk20a *g, bool invalidate) gk20a_dbg_fn(""); + gk20a_busy_noresume(g->dev); + if (!g->power_on) + goto hw_was_off; + mutex_lock(&mm->l2_op_lock); /* Flush all dirty lines from the L2 to DRAM. Lines are left in the L2 @@ -2992,6 +3000,9 @@ void gk20a_mm_l2_flush(struct gk20a *g, bool invalidate) gk20a_mm_l2_invalidate_locked(g); mutex_unlock(&mm->l2_op_lock); + +hw_was_off: + pm_runtime_put_noidle(&g->dev->dev); }