summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2017-05-22 07:55:47 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-05-24 15:14:24 -0400
commitf76febb962e1681690dd378884f51770e7271820 (patch)
treec91a31990cb14c8c032724981e886a2b1c255cf1 /drivers
parentf0444184278c356735420f0f88da744bf7adcdf7 (diff)
gpu: nvgpu: do not disable SM exceptions for BPT_INT
In gr_gk20a_handle_sm_exception(), we disable all SM exceptions if SM debug mode is set and irrespective of exception type But we should not disable SM exceptions if the only exception is BPT_INT Fix this by checking if only interrupt is BPT_INT and do not disable SM exceptions in that case Note that for rest of the exceptions we still need to disable SM exceptions Also, remove redudant checks of sm_debugger_attached since we bail out early if this flag is not set anyways Bug 200264850 Change-Id: I7732567273fc88f6c98f25372fd8619d92339734 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/1487040 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 4dc19091..2b1013a0 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -6155,6 +6155,7 @@ int gr_gk20a_handle_sm_exception(struct gk20a *g, u32 gpc, u32 tpc,
6155{ 6155{
6156 int ret = 0; 6156 int ret = 0;
6157 bool do_warp_sync = false, early_exit = false, ignore_debugger = false; 6157 bool do_warp_sync = false, early_exit = false, ignore_debugger = false;
6158 bool disable_sm_exceptions = true;
6158 u32 gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_GPC_STRIDE); 6159 u32 gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_GPC_STRIDE);
6159 u32 tpc_in_gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_TPC_IN_GPC_STRIDE); 6160 u32 tpc_in_gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_TPC_IN_GPC_STRIDE);
6160 u32 offset = gpc_stride * gpc + tpc_in_gpc_stride * tpc; 6161 u32 offset = gpc_stride * gpc + tpc_in_gpc_stride * tpc;
@@ -6209,9 +6210,17 @@ int gr_gk20a_handle_sm_exception(struct gk20a *g, u32 gpc, u32 tpc,
6209 return ret; 6210 return ret;
6210 } 6211 }
6211 6212
6212 /* if an sm debugger is attached, disable forwarding of tpc exceptions. 6213 /*
6213 * the debugger will reenable exceptions after servicing them. */ 6214 * Disable forwarding of tpc exceptions,
6214 if (!ignore_debugger && sm_debugger_attached) { 6215 * the debugger will reenable exceptions after servicing them.
6216 *
6217 * Do not disable exceptions if the only SM exception is BPT_INT
6218 */
6219 if ((global_esr == gr_gpc0_tpc0_sm_hww_global_esr_bpt_int_pending_f())
6220 && (warp_esr == 0))
6221 disable_sm_exceptions = false;
6222
6223 if (!ignore_debugger && disable_sm_exceptions) {
6215 u32 tpc_exception_en = gk20a_readl(g, 6224 u32 tpc_exception_en = gk20a_readl(g,
6216 gr_gpc0_tpc0_tpccs_tpc_exception_en_r() + 6225 gr_gpc0_tpc0_tpccs_tpc_exception_en_r() +
6217 offset); 6226 offset);
@@ -6219,11 +6228,11 @@ int gr_gk20a_handle_sm_exception(struct gk20a *g, u32 gpc, u32 tpc,
6219 gk20a_writel(g, 6228 gk20a_writel(g,
6220 gr_gpc0_tpc0_tpccs_tpc_exception_en_r() + offset, 6229 gr_gpc0_tpc0_tpccs_tpc_exception_en_r() + offset,
6221 tpc_exception_en); 6230 tpc_exception_en);
6222 gk20a_dbg(gpu_dbg_intr | gpu_dbg_gpu_dbg, "SM debugger attached"); 6231 gk20a_dbg(gpu_dbg_intr | gpu_dbg_gpu_dbg, "SM Exceptions disabled");
6223 } 6232 }
6224 6233
6225 /* if a debugger is present and an error has occurred, do a warp sync */ 6234 /* if a debugger is present and an error has occurred, do a warp sync */
6226 if (!ignore_debugger && sm_debugger_attached && 6235 if (!ignore_debugger &&
6227 ((warp_esr != 0) || ((global_esr & ~global_mask) != 0))) { 6236 ((warp_esr != 0) || ((global_esr & ~global_mask) != 0))) {
6228 gk20a_dbg(gpu_dbg_intr, "warp sync needed"); 6237 gk20a_dbg(gpu_dbg_intr, "warp sync needed");
6229 do_warp_sync = true; 6238 do_warp_sync = true;