summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/nvgpu/gv11b/fb_gv11b.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/fb_gv11b.c b/drivers/gpu/nvgpu/gv11b/fb_gv11b.c
index 6d1fbca9..f9532d66 100644
--- a/drivers/gpu/nvgpu/gv11b/fb_gv11b.c
+++ b/drivers/gpu/nvgpu/gv11b/fb_gv11b.c
@@ -966,6 +966,9 @@ static void gv11b_fb_copy_from_hw_fault_buf(struct gk20a *g,
966static void gv11b_fb_handle_mmu_fault_common(struct gk20a *g, 966static void gv11b_fb_handle_mmu_fault_common(struct gk20a *g,
967 struct mmu_fault_info *mmfault) 967 struct mmu_fault_info *mmfault)
968{ 968{
969 unsigned int id_type;
970 u32 act_eng_bitmask = 0;
971
969 if (!mmfault->valid) 972 if (!mmfault->valid)
970 return; 973 return;
971 974
@@ -977,13 +980,23 @@ static void gv11b_fb_handle_mmu_fault_common(struct gk20a *g,
977 * instance block, the fault cannot be isolated to a 980 * instance block, the fault cannot be isolated to a
978 * single context so we need to reset the entire runlist 981 * single context so we need to reset the entire runlist
979 */ 982 */
980 nvgpu_log(g, gpu_dbg_intr, "UNBOUND INST"); 983 id_type = ID_TYPE_UNKNOWN;
984 nvgpu_log(g, gpu_dbg_intr, "UNBOUND INST BLOCK MMU FAULT");
985
986 } else if (mmfault->refch) {
987 if (gk20a_is_channel_marked_as_tsg(mmfault->refch))
988 id_type = ID_TYPE_TSG;
989 else
990 id_type = ID_TYPE_CHANNEL;
991 } else {
992 id_type = ID_TYPE_UNKNOWN;
981 } 993 }
982 994
983 if (mmfault->refch) { 995 if (mmfault->faulted_engine != FIFO_INVAL_ENGINE_ID)
984 gk20a_channel_put(mmfault->refch); 996 act_eng_bitmask = BIT(mmfault->faulted_engine);
985 mmfault->refch = NULL; 997
986 } 998 g->ops.fifo.teardown_ch_tsg(g, act_eng_bitmask, mmfault->chid,
999 id_type, RC_TYPE_MMU_FAULT, mmfault);
987} 1000}
988 1001
989static void gv11b_fb_handle_mmu_nonreplay_replay_fault(struct gk20a *g, 1002static void gv11b_fb_handle_mmu_nonreplay_replay_fault(struct gk20a *g,