summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2018-04-02 09:40:42 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-04-04 14:49:46 -0400
commit89e0745fa024891b988508c3baa20c453230a80b (patch)
treeb59efd3831570c624c9f8b611abb81489346862d /drivers/gpu/nvgpu/gk20a/gr_gk20a.c
parenta108d3f0368c72f2d553cac1470531677b5a7b88 (diff)
gpu: nvgpu: handle misaligned_addr SM exception
We right now do not handle misaligned_addr SM exception explicitly and hence we incorrectly initiate CILP on this exception Handle this exception explicitly in this sequence - - set error notifier first - clear the interrupt - return error from gr_gv11b_handle_warp_esr_error_misaligned_addr() so that RC recovery is triggered by gk20a_gr_isr() Ensure that the error value is propagated back to gk20a_gr_isr() correctly Use nvgpu_set_error_notifier_if_empty() to set error notifier since this will prevent overwriting of error notifier value in case gk20a_gr_isr() also tries to write to some error notifier value Bug 200388475 Jira NVGPU-554 Change-Id: I84c4d202a8068e738567ccd344e05d9d5f6ad2f0 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1686781 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/gr_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index c6a58fec..680b1637 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -5740,7 +5740,7 @@ static int gk20a_gr_handle_tpc_exception(struct gk20a *g, u32 gpc, u32 tpc,
5740 "GPC%d TPC%d: SM%d exception pending", 5740 "GPC%d TPC%d: SM%d exception pending",
5741 gpc, tpc, sm); 5741 gpc, tpc, sm);
5742 5742
5743 ret = g->ops.gr.handle_sm_exception(g, 5743 ret |= g->ops.gr.handle_sm_exception(g,
5744 gpc, tpc, sm, post_event, fault_ch, 5744 gpc, tpc, sm, post_event, fault_ch,
5745 hww_global_esr); 5745 hww_global_esr);
5746 /* clear the hwws, also causes tpc and gpc 5746 /* clear the hwws, also causes tpc and gpc
@@ -5759,11 +5759,11 @@ static int gk20a_gr_handle_tpc_exception(struct gk20a *g, u32 gpc, u32 tpc,
5759 gr_gpc0_tpc0_tpccs_tpc_exception_tex_pending_v()) { 5759 gr_gpc0_tpc0_tpccs_tpc_exception_tex_pending_v()) {
5760 gk20a_dbg(gpu_dbg_intr | gpu_dbg_gpu_dbg, 5760 gk20a_dbg(gpu_dbg_intr | gpu_dbg_gpu_dbg,
5761 "GPC%d TPC%d: TEX exception pending", gpc, tpc); 5761 "GPC%d TPC%d: TEX exception pending", gpc, tpc);
5762 ret = g->ops.gr.handle_tex_exception(g, gpc, tpc, post_event); 5762 ret |= g->ops.gr.handle_tex_exception(g, gpc, tpc, post_event);
5763 } 5763 }
5764 5764
5765 if (g->ops.gr.handle_tpc_mpc_exception) 5765 if (g->ops.gr.handle_tpc_mpc_exception)
5766 ret = g->ops.gr.handle_tpc_mpc_exception(g, 5766 ret |= g->ops.gr.handle_tpc_mpc_exception(g,
5767 gpc, tpc, post_event); 5767 gpc, tpc, post_event);
5768 5768
5769 return ret; 5769 return ret;
@@ -5801,7 +5801,7 @@ static int gk20a_gr_handle_gpc_exception(struct gk20a *g, bool *post_event,
5801 gk20a_dbg(gpu_dbg_intr | gpu_dbg_gpu_dbg, 5801 gk20a_dbg(gpu_dbg_intr | gpu_dbg_gpu_dbg,
5802 "GPC%d: TPC%d exception pending", gpc, tpc); 5802 "GPC%d: TPC%d exception pending", gpc, tpc);
5803 5803
5804 ret = gk20a_gr_handle_tpc_exception(g, gpc, tpc, 5804 ret |= gk20a_gr_handle_tpc_exception(g, gpc, tpc,
5805 post_event, fault_ch, hww_global_esr); 5805 post_event, fault_ch, hww_global_esr);
5806 5806
5807 } 5807 }
@@ -5812,7 +5812,7 @@ static int gk20a_gr_handle_gpc_exception(struct gk20a *g, bool *post_event,
5812 int gcc_ret = 0; 5812 int gcc_ret = 0;
5813 gcc_ret = g->ops.gr.handle_gcc_exception(g, gpc, tpc, 5813 gcc_ret = g->ops.gr.handle_gcc_exception(g, gpc, tpc,
5814 post_event, fault_ch, hww_global_esr); 5814 post_event, fault_ch, hww_global_esr);
5815 ret = ret ? ret : gcc_ret; 5815 ret |= ret ? ret : gcc_ret;
5816 } 5816 }
5817 5817
5818 /* Handle GPCCS exceptions */ 5818 /* Handle GPCCS exceptions */
@@ -5820,7 +5820,7 @@ static int gk20a_gr_handle_gpc_exception(struct gk20a *g, bool *post_event,
5820 int ret_ecc = 0; 5820 int ret_ecc = 0;
5821 ret_ecc = g->ops.gr.handle_gpc_gpccs_exception(g, gpc, 5821 ret_ecc = g->ops.gr.handle_gpc_gpccs_exception(g, gpc,
5822 gpc_exception); 5822 gpc_exception);
5823 ret = ret ? ret : ret_ecc; 5823 ret |= ret ? ret : ret_ecc;
5824 } 5824 }
5825 5825
5826 /* Handle GPCMMU exceptions */ 5826 /* Handle GPCMMU exceptions */
@@ -5829,7 +5829,7 @@ static int gk20a_gr_handle_gpc_exception(struct gk20a *g, bool *post_event,
5829 5829
5830 ret_mmu = g->ops.gr.handle_gpc_gpcmmu_exception(g, gpc, 5830 ret_mmu = g->ops.gr.handle_gpc_gpcmmu_exception(g, gpc,
5831 gpc_exception); 5831 gpc_exception);
5832 ret = ret ? ret : ret_mmu; 5832 ret |= ret ? ret : ret_mmu;
5833 } 5833 }
5834 5834
5835 } 5835 }