diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 5 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.h | 10 |
2 files changed, 11 insertions, 4 deletions
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) | |||
793 | /* resetting engine using mc_enable_r() is not | 793 | /* resetting engine using mc_enable_r() is not |
794 | enough, we do full init sequence */ | 794 | enough, we do full init sequence */ |
795 | gk20a_gr_reset(g); | 795 | gk20a_gr_reset(g); |
796 | if (support_gk20a_pmu(g->dev) && g->elpg_enabled) | ||
797 | gk20a_pmu_enable_elpg(g); | ||
796 | } | 798 | } |
797 | if (engine_id == top_device_info_type_enum_copy0_v()) | 799 | if (engine_id == top_device_info_type_enum_copy0_v()) |
798 | gk20a_reset(g, mc_enable_ce2_m()); | 800 | gk20a_reset(g, mc_enable_ce2_m()); |
@@ -1099,7 +1101,7 @@ static bool gk20a_fifo_handle_mmu_fault( | |||
1099 | " deferring channel recovery to channel free"); | 1101 | " deferring channel recovery to channel free"); |
1100 | /* clear interrupt */ | 1102 | /* clear interrupt */ |
1101 | gk20a_writel(g, fifo_intr_mmu_fault_id_r(), fault_id); | 1103 | gk20a_writel(g, fifo_intr_mmu_fault_id_r(), fault_id); |
1102 | return verbose; | 1104 | goto exit_enable; |
1103 | } | 1105 | } |
1104 | 1106 | ||
1105 | /* clear interrupt */ | 1107 | /* clear interrupt */ |
@@ -1114,6 +1116,7 @@ static bool gk20a_fifo_handle_mmu_fault( | |||
1114 | gr_gpfifo_ctl_access_enabled_f() | | 1116 | gr_gpfifo_ctl_access_enabled_f() | |
1115 | gr_gpfifo_ctl_semaphore_access_enabled_f()); | 1117 | gr_gpfifo_ctl_semaphore_access_enabled_f()); |
1116 | 1118 | ||
1119 | exit_enable: | ||
1117 | /* It is safe to enable ELPG again. */ | 1120 | /* It is safe to enable ELPG again. */ |
1118 | if (support_gk20a_pmu(g->dev) && g->elpg_enabled) | 1121 | if (support_gk20a_pmu(g->dev) && g->elpg_enabled) |
1119 | gk20a_pmu_enable_elpg(g); | 1122 | 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, | |||
458 | #define gr_gk20a_elpg_protected_call(g, func) \ | 458 | #define gr_gk20a_elpg_protected_call(g, func) \ |
459 | ({ \ | 459 | ({ \ |
460 | int err = 0; \ | 460 | int err = 0; \ |
461 | if (support_gk20a_pmu(g->dev)) \ | 461 | if (support_gk20a_pmu(g->dev) && g->elpg_enabled) {\ |
462 | err = gk20a_pmu_disable_elpg(g); \ | 462 | err = gk20a_pmu_disable_elpg(g); \ |
463 | if (err) return err; \ | 463 | if (err) { \ |
464 | gk20a_pmu_enable_elpg(g); \ | ||
465 | return err; \ | ||
466 | } \ | ||
467 | } \ | ||
464 | err = func; \ | 468 | err = func; \ |
465 | if (support_gk20a_pmu(g->dev)) \ | 469 | if (support_gk20a_pmu(g->dev) && g->elpg_enabled) \ |
466 | gk20a_pmu_enable_elpg(g); \ | 470 | gk20a_pmu_enable_elpg(g); \ |
467 | err; \ | 471 | err; \ |
468 | }) | 472 | }) |