summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
diff options
context:
space:
mode:
authorPeter Daifuku <pdaifuku@nvidia.com>2016-04-15 21:12:34 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-05-19 18:58:24 -0400
commitce0fe5082ebb8a7e0ca5a8992e17ae4547d4db5e (patch)
treef7301c2993c78af2d69ad768e1aa6c35bede6cfc /drivers/gpu/nvgpu/gk20a/gr_gk20a.c
parent5ccaaa73af4683eabd4d135b5b08aec4a206b613 (diff)
gpu: nvgpu: hwpm broadcast register support
Add support for hwpm broadcast registers (ltc and lts) In gr_gk20a_find_priv_offset_in_buffer, replace "Unknown address type" error with informational message: gr_gk20a_exec_ctx_ops calls gk20a_get_ctx_buffer_offsets and if that fails, calls gr_gk20a_get_pm_ctx_buffer_offsets; HWPM registers will fail the first call, so an error or warning is overkill. Bug 1648200 Change-Id: I197b82579e9894652add4ff254418f818981415a Signed-off-by: Peter Daifuku <pdaifuku@nvidia.com> Reviewed-on: http://git-master/r/1131365 (cherry picked from commit 9f30a92c5d87f6dadd34cc37396a6b10e3a72751) Reviewed-on: http://git-master/r/1133628 (cherry picked from commit 7eb7cfd998852ba7f7c4c40d3db286f66e83ab3a) Reviewed-on: http://git-master/r/1127749 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/gr_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c48
1 files changed, 45 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 901fea8c..943b4085 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -6318,6 +6318,13 @@ static int gr_gk20a_decode_priv_addr(struct gk20a *g, u32 addr,
6318 } 6318 }
6319 *be_num = pri_get_be_num(g, addr); 6319 *be_num = pri_get_be_num(g, addr);
6320 return 0; 6320 return 0;
6321 } else if (pri_is_ltc_addr(addr)) {
6322 *addr_type = CTXSW_ADDR_TYPE_LTCS;
6323 if (g->ops.gr.is_ltcs_ltss_addr(g, addr))
6324 *broadcast_flags |= PRI_BROADCAST_FLAGS_LTCS;
6325 else if (g->ops.gr.is_ltcn_ltss_addr(g, addr))
6326 *broadcast_flags |= PRI_BROADCAST_FLAGS_LTSS;
6327 return 0;
6321 } else { 6328 } else {
6322 *addr_type = CTXSW_ADDR_TYPE_SYS; 6329 *addr_type = CTXSW_ADDR_TYPE_SYS;
6323 return 0; 6330 return 0;
@@ -6412,7 +6419,15 @@ static int gr_gk20a_create_priv_addr_table(struct gk20a *g,
6412 pri_gpc_addr(g, pri_gpccs_addr_mask(addr), 6419 pri_gpc_addr(g, pri_gpccs_addr_mask(addr),
6413 gpc_num); 6420 gpc_num);
6414 } 6421 }
6415 } else { 6422 }
6423
6424 if (broadcast_flags & PRI_BROADCAST_FLAGS_LTSS) {
6425 g->ops.gr.split_lts_broadcast_addr(g, addr,
6426 priv_addr_table, &t);
6427 } else if (broadcast_flags & PRI_BROADCAST_FLAGS_LTCS) {
6428 g->ops.gr.split_ltc_broadcast_addr(g, addr,
6429 priv_addr_table, &t);
6430 } else if (!(broadcast_flags & PRI_BROADCAST_FLAGS_GPC)) {
6416 if (broadcast_flags & PRI_BROADCAST_FLAGS_TPC) 6431 if (broadcast_flags & PRI_BROADCAST_FLAGS_TPC)
6417 for (tpc_num = 0; 6432 for (tpc_num = 0;
6418 tpc_num < g->gr.gpc_tpc_count[gpc_num]; 6433 tpc_num < g->gr.gpc_tpc_count[gpc_num];
@@ -7296,8 +7311,7 @@ static int gr_gk20a_find_priv_offset_in_buffer(struct gk20a *g,
7296 num_tpcs) << 2); 7311 num_tpcs) << 2);
7297 } 7312 }
7298 } else { 7313 } else {
7299 gk20a_err(dev_from_gk20a(g), 7314 gk20a_dbg_fn("Unknown address type.");
7300 " Unknown address type.\n");
7301 return -EINVAL; 7315 return -EINVAL;
7302 } 7316 }
7303 err = gr_gk20a_process_context_buffer_priv_segment(g, 7317 err = gr_gk20a_process_context_buffer_priv_segment(g,
@@ -8653,6 +8667,28 @@ static int gr_gk20a_get_preemption_mode_flags(struct gk20a *g,
8653 return 0; 8667 return 0;
8654} 8668}
8655 8669
8670static bool gr_gk20a_is_ltcs_ltss_addr_stub(struct gk20a *g, u32 addr)
8671{
8672 return false;
8673}
8674
8675static bool gr_gk20a_is_ltcn_ltss_addr_stub(struct gk20a *g, u32 addr)
8676{
8677 return false;
8678}
8679
8680static void gr_gk20a_split_lts_broadcast_addr_stub(struct gk20a *g, u32 addr,
8681 u32 *priv_addr_table,
8682 u32 *priv_addr_table_index)
8683{
8684}
8685
8686static void gr_gk20a_split_ltc_broadcast_addr_stub(struct gk20a *g, u32 addr,
8687 u32 *priv_addr_table,
8688 u32 *priv_addr_table_index)
8689{
8690}
8691
8656void gk20a_init_gr_ops(struct gpu_ops *gops) 8692void gk20a_init_gr_ops(struct gpu_ops *gops)
8657{ 8693{
8658 gops->gr.access_smpc_reg = gr_gk20a_access_smpc_reg; 8694 gops->gr.access_smpc_reg = gr_gk20a_access_smpc_reg;
@@ -8723,4 +8759,10 @@ void gk20a_init_gr_ops(struct gpu_ops *gops)
8723 gops->gr.get_preemption_mode_flags = gr_gk20a_get_preemption_mode_flags; 8759 gops->gr.get_preemption_mode_flags = gr_gk20a_get_preemption_mode_flags;
8724 gops->gr.program_active_tpc_counts = gr_gk20a_program_active_tpc_counts; 8760 gops->gr.program_active_tpc_counts = gr_gk20a_program_active_tpc_counts;
8725 gops->gr.program_sm_id_numbering = gr_gk20a_program_sm_id_numbering; 8761 gops->gr.program_sm_id_numbering = gr_gk20a_program_sm_id_numbering;
8762 gops->gr.is_ltcs_ltss_addr = gr_gk20a_is_ltcs_ltss_addr_stub;
8763 gops->gr.is_ltcn_ltss_addr = gr_gk20a_is_ltcn_ltss_addr_stub;
8764 gops->gr.split_lts_broadcast_addr =
8765 gr_gk20a_split_lts_broadcast_addr_stub;
8766 gops->gr.split_ltc_broadcast_addr =
8767 gr_gk20a_split_ltc_broadcast_addr_stub;
8726} 8768}