From 268e772e807460cee64e354c025d43d8e24574b8 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Tue, 8 Nov 2016 13:36:17 -0800 Subject: gpu: nvgpu: Deal with invalid MMU id If gk20a_engine_id_to_mmu_id() fails, it returns ~0. Deal with this by checking the results in each call to it. Change-Id: I6fb9f7151f21a6c4694bfb2ea3c960d344fe629f Signed-off-by: Terje Bergstrom Reviewed-on: http://git-master/r/1249965 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index b4850ee3..9887b68f 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c @@ -1557,15 +1557,18 @@ static void gk20a_fifo_trigger_mmu_fault(struct gk20a *g, /* trigger faults for all bad engines */ for_each_set_bit(engine_id, &engine_ids, 32) { + u32 mmu_id; + if (!gk20a_fifo_is_valid_engine_id(g, engine_id)) { WARN_ON(true); break; } - gk20a_writel(g, fifo_trigger_mmu_fault_r(engine_id), - fifo_trigger_mmu_fault_id_f( - gk20a_engine_id_to_mmu_id(g, engine_id)) | - fifo_trigger_mmu_fault_enable_f(1)); + mmu_id = gk20a_engine_id_to_mmu_id(g, engine_id); + if (mmu_id != ~0) + gk20a_writel(g, fifo_trigger_mmu_fault_r(engine_id), + fifo_trigger_mmu_fault_id_f(mmu_id) | + fifo_trigger_mmu_fault_enable_f(1)); } /* Wait for MMU fault to trigger */ @@ -1707,8 +1710,10 @@ void gk20a_fifo_recover(struct gk20a *g, u32 __engine_ids, /* atleast one engine will get passed during sched err*/ engine_ids |= __engine_ids; for_each_set_bit(engine_id, &engine_ids, 32) { - mmu_fault_engines |= - BIT(gk20a_engine_id_to_mmu_id(g, engine_id)); + u32 mmu_id = gk20a_engine_id_to_mmu_id(g, engine_id); + + if (mmu_id != ~0) + mmu_fault_engines |= BIT(mmu_id); } } else { /* store faulted engines in advance */ @@ -1728,9 +1733,11 @@ void gk20a_fifo_recover(struct gk20a *g, u32 __engine_ids, gk20a_fifo_get_faulty_id_type(g, active_engine_id, &id, &type); if (ref_type == type && ref_id == id) { + u32 mmu_id = gk20a_engine_id_to_mmu_id(g, active_engine_id); + engine_ids |= BIT(active_engine_id); - mmu_fault_engines |= - BIT(gk20a_engine_id_to_mmu_id(g, active_engine_id)); + if (mmu_id != ~0) + mmu_fault_engines |= BIT(mmu_id); } } } -- cgit v1.2.2