From 6d585840ad5887407512dd292698100df50e5eed Mon Sep 17 00:00:00 2001 From: Mahantesh Kumbar Date: Fri, 26 Feb 2016 15:27:44 +0530 Subject: gpu: nvgpu: Enable ELPG when disabled due to reset Enable ELPG back whenever ELPG disable is done due to reset or recovery. Otherwise elpg_refcnt mismatch doesn't engage ELPG correctly Bug 200156347 Bug 1716764 Change-Id: I9284bb52b32fe911bb8eb260f138b616f4a564be Signed-off-by: Mahantesh Kumbar Reviewed-on: http://git-master/r/1020617 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom Reviewed-by: Seshendra Gadagottu Tested-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 5 ++++- drivers/gpu/nvgpu/gk20a/gr_gk20a.h | 10 +++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) (limited to 'drivers') diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index 337a9584..769960af 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c @@ -793,6 +793,8 @@ void gk20a_fifo_reset_engine(struct gk20a *g, u32 engine_id) /* resetting engine using mc_enable_r() is not enough, we do full init sequence */ gk20a_gr_reset(g); + if (support_gk20a_pmu(g->dev) && g->elpg_enabled) + gk20a_pmu_enable_elpg(g); } if (engine_id == top_device_info_type_enum_copy0_v()) gk20a_reset(g, mc_enable_ce2_m()); @@ -1099,7 +1101,7 @@ static bool gk20a_fifo_handle_mmu_fault( " deferring channel recovery to channel free"); /* clear interrupt */ gk20a_writel(g, fifo_intr_mmu_fault_id_r(), fault_id); - return verbose; + goto exit_enable; } /* clear interrupt */ @@ -1114,6 +1116,7 @@ static bool gk20a_fifo_handle_mmu_fault( gr_gpfifo_ctl_access_enabled_f() | gr_gpfifo_ctl_semaphore_access_enabled_f()); +exit_enable: /* It is safe to enable ELPG again. */ if (support_gk20a_pmu(g->dev) && g->elpg_enabled) gk20a_pmu_enable_elpg(g); diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.h b/drivers/gpu/nvgpu/gk20a/gr_gk20a.h index 9c37fd02..326b4f96 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.h @@ -458,11 +458,15 @@ void gk20a_gr_clear_sm_hww(struct gk20a *g, #define gr_gk20a_elpg_protected_call(g, func) \ ({ \ int err = 0; \ - if (support_gk20a_pmu(g->dev)) \ + if (support_gk20a_pmu(g->dev) && g->elpg_enabled) {\ err = gk20a_pmu_disable_elpg(g); \ - if (err) return err; \ + if (err) { \ + gk20a_pmu_enable_elpg(g); \ + return err; \ + } \ + } \ err = func; \ - if (support_gk20a_pmu(g->dev)) \ + if (support_gk20a_pmu(g->dev) && g->elpg_enabled) \ gk20a_pmu_enable_elpg(g); \ err; \ }) -- cgit v1.2.2