diff options
author | Richard Zhao <rizhao@nvidia.com> | 2015-11-19 21:16:21 -0500 |
---|---|---|
committer | Vladislav Buzov <vbuzov@nvidia.com> | 2016-01-10 23:05:56 -0500 |
commit | f1d41774627efe612ee0ef0868d7233c5f2038f3 (patch) | |
tree | c5b67d176446d45d54fce6f886a013a579988472 /drivers/gpu/nvgpu/gk20a/gr_gk20a.c | |
parent | aeee97b059c0c2d1960d5dae7c86b7858cd00cce (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.c | 54 |
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 | ||
7264 | static 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 | |||
7264 | static void gr_gk20a_bpt_reg_info(struct gk20a *g, struct warpstate *w_state) | 7317 | static 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 | } |