summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
diff options
context:
space:
mode:
authorMayank Kaushik <mkaushik@nvidia.com>2014-09-17 21:11:45 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:11:57 -0400
commit3d313d06570dcb28bba73247a2c0fc52bec56af0 (patch)
tree69c98965a8f5833c791069d6bd1442075e8e6a2e /drivers/gpu/nvgpu/gk20a/gr_gk20a.c
parent50d76e9b91a4b4b03bea5f92a7a1af452ce7c6f9 (diff)
gpu: nvgpu: gm20b: halify tpc lookup
Since the number of TPCs is different between GM20B and GK20a, the function to look up the number of TPCs needs to be halified. Change-Id: I19dab9a7105814f86c08c92283a0bb70abb6aa00 Signed-off-by: Mayank Kaushik <mkaushik@nvidia.com> Reviewed-on: http://git-master/r/500064 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.c36
1 files changed, 31 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 8ac1b276..452560d8 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -5922,13 +5922,13 @@ int gr_gk20a_decode_priv_addr(struct gk20a *g, u32 addr,
5922 } else 5922 } else
5923 *gpc_num = pri_get_gpc_num(addr); 5923 *gpc_num = pri_get_gpc_num(addr);
5924 5924
5925 if (pri_is_tpc_addr(gpc_addr)) { 5925 if (g->ops.gr.is_tpc_addr(gpc_addr)) {
5926 *addr_type = CTXSW_ADDR_TYPE_TPC; 5926 *addr_type = CTXSW_ADDR_TYPE_TPC;
5927 if (pri_is_tpc_addr_shared(gpc_addr)) { 5927 if (pri_is_tpc_addr_shared(gpc_addr)) {
5928 *broadcast_flags |= PRI_BROADCAST_FLAGS_TPC; 5928 *broadcast_flags |= PRI_BROADCAST_FLAGS_TPC;
5929 return 0; 5929 return 0;
5930 } 5930 }
5931 *tpc_num = pri_get_tpc_num(gpc_addr); 5931 *tpc_num = g->ops.gr.get_tpc_num(gpc_addr);
5932 } 5932 }
5933 return 0; 5933 return 0;
5934 } else if (pri_is_be_addr(addr)) { 5934 } else if (pri_is_be_addr(addr)) {
@@ -6261,7 +6261,7 @@ static void gr_gk20a_access_smpc_reg(struct gk20a *g, u32 quad, u32 offset)
6261 6261
6262 gpc = pri_get_gpc_num(offset); 6262 gpc = pri_get_gpc_num(offset);
6263 gpc_tpc_addr = pri_gpccs_addr_mask(offset); 6263 gpc_tpc_addr = pri_gpccs_addr_mask(offset);
6264 tpc = pri_get_tpc_num(gpc_tpc_addr); 6264 tpc = g->ops.gr.get_tpc_num(gpc_tpc_addr);
6265 6265
6266 quad_ctrl = quad & 0x1; /* first bit tells us quad */ 6266 quad_ctrl = quad & 0x1; /* first bit tells us quad */
6267 half_ctrl = (quad >> 1) & 0x1; /* second bit tells us half */ 6267 half_ctrl = (quad >> 1) & 0x1; /* second bit tells us half */
@@ -6364,8 +6364,8 @@ static int gr_gk20a_find_priv_offset_in_ext_buffer(struct gk20a *g,
6364 u32 gpc_addr = 0; 6364 u32 gpc_addr = 0;
6365 gpc_num = pri_get_gpc_num(addr); 6365 gpc_num = pri_get_gpc_num(addr);
6366 gpc_addr = pri_gpccs_addr_mask(addr); 6366 gpc_addr = pri_gpccs_addr_mask(addr);
6367 if (pri_is_tpc_addr(gpc_addr)) 6367 if (g->ops.gr.is_tpc_addr(gpc_addr))
6368 tpc_num = pri_get_tpc_num(gpc_addr); 6368 tpc_num = g->ops.gr.get_tpc_num(gpc_addr);
6369 else 6369 else
6370 return -EINVAL; 6370 return -EINVAL;
6371 6371
@@ -7174,6 +7174,30 @@ void gk20a_init_gr(struct gk20a *g)
7174 init_waitqueue_head(&g->gr.init_wq); 7174 init_waitqueue_head(&g->gr.init_wq);
7175} 7175}
7176 7176
7177static bool gr_gk20a_is_tpc_addr(u32 addr)
7178{
7179 return ((addr >= proj_tpc_in_gpc_base_v()) &&
7180 (addr < proj_tpc_in_gpc_base_v() +
7181 (proj_scal_litter_num_tpc_per_gpc_v() *
7182 proj_tpc_in_gpc_stride_v())))
7183 || pri_is_tpc_addr_shared(addr);
7184}
7185
7186static u32 gr_gk20a_get_tpc_num(u32 addr)
7187{
7188 u32 i, start;
7189 u32 num_tpcs = proj_scal_litter_num_tpc_per_gpc_v();
7190
7191 for (i = 0; i < num_tpcs; i++) {
7192 start = proj_tpc_in_gpc_base_v() +
7193 (i * proj_tpc_in_gpc_stride_v());
7194 if ((addr >= start) &&
7195 (addr < (start + proj_tpc_in_gpc_stride_v())))
7196 return i;
7197 }
7198 return 0;
7199}
7200
7177void gk20a_init_gr_ops(struct gpu_ops *gops) 7201void gk20a_init_gr_ops(struct gpu_ops *gops)
7178{ 7202{
7179 gops->gr.access_smpc_reg = gr_gk20a_access_smpc_reg; 7203 gops->gr.access_smpc_reg = gr_gk20a_access_smpc_reg;
@@ -7205,4 +7229,6 @@ void gk20a_init_gr_ops(struct gpu_ops *gops)
7205 gops->gr.free_obj_ctx = gk20a_free_obj_ctx; 7229 gops->gr.free_obj_ctx = gk20a_free_obj_ctx;
7206 gops->gr.bind_ctxsw_zcull = gr_gk20a_bind_ctxsw_zcull; 7230 gops->gr.bind_ctxsw_zcull = gr_gk20a_bind_ctxsw_zcull;
7207 gops->gr.get_zcull_info = gr_gk20a_get_zcull_info; 7231 gops->gr.get_zcull_info = gr_gk20a_get_zcull_info;
7232 gops->gr.is_tpc_addr = gr_gk20a_is_tpc_addr;
7233 gops->gr.get_tpc_num = gr_gk20a_get_tpc_num;
7208} 7234}