summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
diff options
context:
space:
mode:
authorRichard Zhao <rizhao@nvidia.com>2015-11-19 21:16:21 -0500
committerVladislav Buzov <vbuzov@nvidia.com>2016-01-10 23:05:56 -0500
commitf1d41774627efe612ee0ef0868d7233c5f2038f3 (patch)
treec5b67d176446d45d54fce6f886a013a579988472 /drivers/gpu/nvgpu/gk20a/gr_gk20a.c
parentaeee97b059c0c2d1960d5dae7c86b7858cd00cce (diff)
gpu: nvgpu: abstract set sm debug mode
Add new operation g->ops.gr.set_sm_debug_mode and move native implementation to gr_gk20a.c It's preparing for adding vgpu set sm debug mode hook. JIRA VFND-1006 Bug 1594604 Change-Id: Ia5ca06a86085a690e70bfa9c62f57ec3830ea933 Signed-off-by: Richard Zhao <rizhao@nvidia.com> Reviewed-on: http://git-master/r/923232 (cherry picked from commit 032552b54c570952d1e36c08191e9f70b9c59447) Reviewed-on: http://git-master/r/835614 Reviewed-by: Aingara Paramakuru <aparamakuru@nvidia.com> Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Vladislav Buzov <vbuzov@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/gr_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 30beb962..73adb071 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -7261,6 +7261,59 @@ static void gr_gk20a_init_cyclestats(struct gk20a *g)
7261#endif 7261#endif
7262} 7262}
7263 7263
7264static int gr_gk20a_set_sm_debug_mode(struct gk20a *g,
7265 struct channel_gk20a *ch, u64 sms, bool enable)
7266{
7267 struct nvgpu_dbg_gpu_reg_op *ops;
7268 int i = 0, sm_id, err;
7269
7270 ops = kcalloc(g->gr.no_of_sm, sizeof(*ops), GFP_KERNEL);
7271 if (!ops)
7272 return -ENOMEM;
7273 for (sm_id = 0; sm_id < g->gr.no_of_sm; sm_id++) {
7274 int gpc, tpc;
7275 u32 tpc_offset, gpc_offset, reg_offset, reg_mask, reg_val;
7276
7277 if (!(sms & (1 << sm_id)))
7278 continue;
7279
7280 gpc = g->gr.sm_to_cluster[sm_id].gpc_index;
7281 tpc = g->gr.sm_to_cluster[sm_id].tpc_index;
7282
7283 tpc_offset = proj_tpc_in_gpc_stride_v() * tpc;
7284 gpc_offset = proj_gpc_stride_v() * gpc;
7285 reg_offset = tpc_offset + gpc_offset;
7286
7287 ops[i].op = REGOP(WRITE_32);
7288 ops[i].type = REGOP(TYPE_GR_CTX);
7289 ops[i].offset = gr_gpc0_tpc0_sm_dbgr_control0_r() + reg_offset;
7290
7291 reg_mask = 0;
7292 reg_val = 0;
7293 if (enable) {
7294 reg_mask |= gr_gpc0_tpc0_sm_dbgr_control0_debugger_mode_m();
7295 reg_val |= gr_gpc0_tpc0_sm_dbgr_control0_debugger_mode_on_f();
7296 reg_mask |= gr_gpc0_tpc0_sm_dbgr_control0_stop_on_any_warp_m();
7297 reg_val |= gr_gpc0_tpc0_sm_dbgr_control0_stop_on_any_warp_disable_f();
7298 reg_mask |= gr_gpc0_tpc0_sm_dbgr_control0_stop_on_any_sm_m();
7299 reg_val |= gr_gpc0_tpc0_sm_dbgr_control0_stop_on_any_sm_disable_f();
7300 } else {
7301 reg_mask |= gr_gpc0_tpc0_sm_dbgr_control0_debugger_mode_m();
7302 reg_val |= gr_gpc0_tpc0_sm_dbgr_control0_debugger_mode_off_f();
7303 }
7304
7305 ops[i].and_n_mask_lo = reg_mask;
7306 ops[i].value_lo = reg_val;
7307 i++;
7308 }
7309
7310 err = gr_gk20a_exec_ctx_ops(ch, ops, i, i, 0);
7311 if (err)
7312 gk20a_err(dev_from_gk20a(g), "Failed to access register\n");
7313 kfree(ops);
7314 return err;
7315}
7316
7264static void gr_gk20a_bpt_reg_info(struct gk20a *g, struct warpstate *w_state) 7317static void gr_gk20a_bpt_reg_info(struct gk20a *g, struct warpstate *w_state)
7265{ 7318{
7266 /* Check if we have at least one valid warp */ 7319 /* Check if we have at least one valid warp */
@@ -7374,6 +7427,7 @@ void gk20a_init_gr_ops(struct gpu_ops *gops)
7374 gops->gr.init_sm_dsm_reg_info = gr_gk20a_init_sm_dsm_reg_info; 7427 gops->gr.init_sm_dsm_reg_info = gr_gk20a_init_sm_dsm_reg_info;
7375 gops->gr.wait_empty = gr_gk20a_wait_idle; 7428 gops->gr.wait_empty = gr_gk20a_wait_idle;
7376 gops->gr.init_cyclestats = gr_gk20a_init_cyclestats; 7429 gops->gr.init_cyclestats = gr_gk20a_init_cyclestats;
7430 gops->gr.set_sm_debug_mode = gr_gk20a_set_sm_debug_mode;
7377 gops->gr.bpt_reg_info = gr_gk20a_bpt_reg_info; 7431 gops->gr.bpt_reg_info = gr_gk20a_bpt_reg_info;
7378 gops->gr.get_access_map = gr_gk20a_get_access_map; 7432 gops->gr.get_access_map = gr_gk20a_get_access_map;
7379} 7433}