diff --git a/drivers/gpu/nvgpu/gk20a/cde_gk20a.c b/drivers/gpu/nvgpu/gk20a/cde_gk20a.c index 9067aae55..47ea8052f 100644 --- a/drivers/gpu/nvgpu/gk20a/cde_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/cde_gk20a.c @@ -144,6 +144,26 @@ void gk20a_cde_destroy(struct gk20a *g) mutex_unlock(&cde_app->mutex); } +void gk20a_cde_suspend(struct gk20a *g) +{ + + struct gk20a_cde_app *cde_app = &g->cde_app; + struct gk20a_cde_ctx *cde_ctx, *cde_ctx_save; + + if (!cde_app->initialised) + return; + + list_for_each_entry_safe(cde_ctx, cde_ctx_save, + &cde_app->cde_ctx_lru, list) { + if (cde_ctx->is_temporary) { + mutex_lock(&cde_app->mutex); + cancel_delayed_work(&cde_ctx->ctx_deleter_work); + mutex_unlock(&cde_app->mutex); + } + } + +} + static int gk20a_cde_allocate_contexts(struct gk20a *g) { struct gk20a_cde_app *cde_app = &g->cde_app; diff --git a/drivers/gpu/nvgpu/gk20a/cde_gk20a.h b/drivers/gpu/nvgpu/gk20a/cde_gk20a.h index 4120dc941..9d7dbba65 100644 --- a/drivers/gpu/nvgpu/gk20a/cde_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/cde_gk20a.h @@ -262,6 +262,7 @@ struct gk20a_cde_app { }; void gk20a_cde_destroy(struct gk20a *g); +void gk20a_cde_suspend(struct gk20a *g); int gk20a_init_cde_support(struct gk20a *g); int gk20a_cde_reload(struct gk20a *g); int gk20a_cde_convert(struct gk20a *g, struct dma_buf *dst, diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index c7d40fcd5..ad1a940d9 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a.c @@ -679,6 +679,9 @@ static int gk20a_pm_prepare_poweroff(struct device *dev) if (ret) return ret; + /* cancel any pending cde work */ + gk20a_cde_suspend(g); + /* * After this point, gk20a interrupts should not get * serviced.