summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gv11b/gr_gv11b.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b/gr_gv11b.c')
-rw-r--r--drivers/gpu/nvgpu/gv11b/gr_gv11b.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/gr_gv11b.c b/drivers/gpu/nvgpu/gv11b/gr_gv11b.c
index 288bd583..bb76178e 100644
--- a/drivers/gpu/nvgpu/gv11b/gr_gv11b.c
+++ b/drivers/gpu/nvgpu/gv11b/gr_gv11b.c
@@ -5010,3 +5010,56 @@ int gr_gv11b_create_priv_addr_table(struct gk20a *g,
5010 *num_registers = t; 5010 *num_registers = t;
5011 return 0; 5011 return 0;
5012} 5012}
5013
5014int gv11b_gr_clear_sm_error_state(struct gk20a *g,
5015 struct channel_gk20a *ch, u32 sm_id)
5016{
5017 u32 gpc, tpc, sm, offset;
5018 u32 val;
5019 struct tsg_gk20a *tsg;
5020
5021 int err = 0;
5022
5023 tsg = tsg_gk20a_from_ch(ch);
5024 if (tsg == NULL) {
5025 return -EINVAL;
5026 }
5027
5028 nvgpu_mutex_acquire(&g->dbg_sessions_lock);
5029
5030 (void)memset(&tsg->sm_error_states[sm_id], 0, sizeof(*tsg->sm_error_states));
5031
5032 err = gr_gk20a_disable_ctxsw(g);
5033 if (err != 0) {
5034 nvgpu_err(g, "unable to stop gr ctxsw");
5035 goto fail;
5036 }
5037
5038 if (gk20a_is_channel_ctx_resident(ch)) {
5039 gpc = g->gr.sm_to_cluster[sm_id].gpc_index;
5040 if (g->ops.gr.get_nonpes_aware_tpc != NULL) {
5041 tpc = g->ops.gr.get_nonpes_aware_tpc(g,
5042 g->gr.sm_to_cluster[sm_id].gpc_index,
5043 g->gr.sm_to_cluster[sm_id].tpc_index);
5044 } else {
5045 tpc = g->gr.sm_to_cluster[sm_id].tpc_index;
5046 }
5047 sm = g->gr.sm_to_cluster[sm_id].sm_index;
5048
5049 offset = gk20a_gr_gpc_offset(g, gpc) +
5050 gk20a_gr_tpc_offset(g, tpc) +
5051 gv11b_gr_sm_offset(g, sm);
5052
5053 val = gk20a_readl(g, gr_gpc0_tpc0_sm0_hww_global_esr_r() + offset);
5054 gk20a_writel(g, gr_gpc0_tpc0_sm0_hww_global_esr_r() + offset,
5055 val);
5056 gk20a_writel(g, gr_gpc0_tpc0_sm0_hww_warp_esr_r() + offset,
5057 0);
5058 }
5059
5060 err = gr_gk20a_enable_ctxsw(g);
5061
5062fail:
5063 nvgpu_mutex_release(&g->dbg_sessions_lock);
5064 return err;
5065}