diff options
author | Peter Daifuku <pdaifuku@nvidia.com> | 2016-04-15 21:12:34 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-05-19 18:58:24 -0400 |
commit | ce0fe5082ebb8a7e0ca5a8992e17ae4547d4db5e (patch) | |
tree | f7301c2993c78af2d69ad768e1aa6c35bede6cfc /drivers/gpu/nvgpu/gk20a/gr_gk20a.c | |
parent | 5ccaaa73af4683eabd4d135b5b08aec4a206b613 (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.c | 48 |
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 | ||
8670 | static bool gr_gk20a_is_ltcs_ltss_addr_stub(struct gk20a *g, u32 addr) | ||
8671 | { | ||
8672 | return false; | ||
8673 | } | ||
8674 | |||
8675 | static bool gr_gk20a_is_ltcn_ltss_addr_stub(struct gk20a *g, u32 addr) | ||
8676 | { | ||
8677 | return false; | ||
8678 | } | ||
8679 | |||
8680 | static 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 | |||
8686 | static 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 | |||
8656 | void gk20a_init_gr_ops(struct gpu_ops *gops) | 8692 | void 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 | } |