diff --git a/drivers/gpu/nvgpu/common/mm/mm.c b/drivers/gpu/nvgpu/common/mm/mm.c index 2663ab430..42d708eee 100644 --- a/drivers/gpu/nvgpu/common/mm/mm.c +++ b/drivers/gpu/nvgpu/common/mm/mm.c @@ -117,6 +117,10 @@ int nvgpu_mm_suspend(struct gk20a *g) g->ops.fb.disable_hub_intr(g); } + if (g->ops.mm.mmu_fault_disable_hw != NULL) { + g->ops.mm.mmu_fault_disable_hw(g); + } + nvgpu_log_info(g, "MM suspend done!"); return 0; diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index e69036d73..948d8e60f 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -961,6 +961,7 @@ struct gpu_ops { struct vm_gk20a *vm, u32 big_page_size); bool (*mmu_fault_pending)(struct gk20a *g); void (*fault_info_mem_destroy)(struct gk20a *g); + void (*mmu_fault_disable_hw)(struct gk20a *g); u32 (*get_kind_invalid)(void); u32 (*get_kind_pitch)(void); u32 (*get_flush_retries)(struct gk20a *g, diff --git a/drivers/gpu/nvgpu/gv100/hal_gv100.c b/drivers/gpu/nvgpu/gv100/hal_gv100.c index 6134dedc8..09a96d40d 100644 --- a/drivers/gpu/nvgpu/gv100/hal_gv100.c +++ b/drivers/gpu/nvgpu/gv100/hal_gv100.c @@ -689,6 +689,7 @@ static const struct gpu_ops gv100_ops = { .init_bar2_vm = gp10b_init_bar2_vm, .remove_bar2_vm = gp10b_remove_bar2_vm, .fault_info_mem_destroy = gv11b_mm_fault_info_mem_destroy, + .mmu_fault_disable_hw = gv11b_mm_mmu_fault_disable_hw, .get_flush_retries = gv100_mm_get_flush_retries, }, .pramin = { diff --git a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c index efac772c8..d479fef83 100644 --- a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c @@ -656,6 +656,7 @@ static const struct gpu_ops gv11b_ops = { .init_bar2_vm = gp10b_init_bar2_vm, .remove_bar2_vm = gp10b_remove_bar2_vm, .fault_info_mem_destroy = gv11b_mm_fault_info_mem_destroy, + .mmu_fault_disable_hw = gv11b_mm_mmu_fault_disable_hw, }, .therm = { .init_therm_setup_hw = gv11b_init_therm_setup_hw, diff --git a/drivers/gpu/nvgpu/gv11b/mm_gv11b.c b/drivers/gpu/nvgpu/gv11b/mm_gv11b.c index 9373ee196..39c79bba6 100644 --- a/drivers/gpu/nvgpu/gv11b/mm_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/mm_gv11b.c @@ -67,15 +67,10 @@ bool gv11b_mm_mmu_fault_pending(struct gk20a *g) return g->ops.fb.mmu_fault_pending(g); } -void gv11b_mm_fault_info_mem_destroy(struct gk20a *g) +void gv11b_mm_mmu_fault_disable_hw(struct gk20a *g) { - struct vm_gk20a *vm = g->mm.bar2.vm; - - nvgpu_log_fn(g, " "); - nvgpu_mutex_acquire(&g->mm.hub_isr_mutex); - if ((g->ops.fb.is_fault_buf_enabled(g, NVGPU_FB_MMU_FAULT_NONREPLAY_REG_INDEX))) { g->ops.fb.fault_buf_set_state_hw(g, @@ -90,6 +85,17 @@ void gv11b_mm_fault_info_mem_destroy(struct gk20a *g) NVGPU_FB_MMU_FAULT_BUF_DISABLED); } + nvgpu_mutex_release(&g->mm.hub_isr_mutex); +} + +void gv11b_mm_fault_info_mem_destroy(struct gk20a *g) +{ + struct vm_gk20a *vm = g->mm.bar2.vm; + + nvgpu_log_fn(g, " "); + + nvgpu_mutex_acquire(&g->mm.hub_isr_mutex); + if (nvgpu_mem_is_valid( &g->mm.hw_fault_buf[NVGPU_MM_MMU_FAULT_TYPE_OTHER_AND_NONREPLAY])) nvgpu_dma_unmap_free(vm, diff --git a/drivers/gpu/nvgpu/gv11b/mm_gv11b.h b/drivers/gpu/nvgpu/gv11b/mm_gv11b.h index 6ad4a91a2..ba2470888 100644 --- a/drivers/gpu/nvgpu/gv11b/mm_gv11b.h +++ b/drivers/gpu/nvgpu/gv11b/mm_gv11b.h @@ -37,5 +37,6 @@ void gv11b_mm_l2_flush(struct gk20a *g, bool invalidate); u64 gv11b_gpu_phys_addr(struct gk20a *g, struct nvgpu_gmmu_attrs *attrs, u64 phys); void gv11b_mm_fault_info_mem_destroy(struct gk20a *g); +void gv11b_mm_mmu_fault_disable_hw(struct gk20a *g); #endif