summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gm20b
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2016-04-06 16:10:32 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-04-15 11:48:20 -0400
commit6839341bf8ffafa115cfc0427bba694ee1d131f3 (patch)
tree1f9369a3bacf0f1a2cc23371f5de988efdc07c31 /drivers/gpu/nvgpu/gm20b
parent61e009c0f8874898335e6c47a610233c3382be47 (diff)
gpu: nvgpu: Add litter values HAL
Move per-chip constants to be returned by a chip specific function. Implement get_litter_value() for each chip. Change-Id: I2a2730fce14010924d2507f6fa15cc2ea0795113 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/1121383
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b')
-rw-r--r--drivers/gpu/nvgpu/gm20b/gr_gm20b.c76
-rw-r--r--drivers/gpu/nvgpu/gm20b/hal_gm20b.c74
-rw-r--r--drivers/gpu/nvgpu/gm20b/ltc_gm20b.c21
3 files changed, 131 insertions, 40 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c
index 050c2bee..b49f2301 100644
--- a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c
@@ -27,7 +27,6 @@
27#include "hw_fifo_gm20b.h" 27#include "hw_fifo_gm20b.h"
28#include "hw_fb_gm20b.h" 28#include "hw_fb_gm20b.h"
29#include "hw_top_gm20b.h" 29#include "hw_top_gm20b.h"
30#include "hw_proj_gm20b.h"
31#include "hw_ctxsw_prog_gm20b.h" 30#include "hw_ctxsw_prog_gm20b.h"
32#include "hw_fuse_gm20b.h" 31#include "hw_fuse_gm20b.h"
33#include "pmu_gm20b.h" 32#include "pmu_gm20b.h"
@@ -178,6 +177,8 @@ static int gr_gm20b_commit_global_cb_manager(struct gk20a *g,
178 u32 gpc_index, ppc_index; 177 u32 gpc_index, ppc_index;
179 u32 temp; 178 u32 temp;
180 u32 cbm_cfg_size1, cbm_cfg_size2; 179 u32 cbm_cfg_size1, cbm_cfg_size2;
180 u32 gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_GPC_STRIDE);
181 u32 ppc_in_gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_PPC_IN_GPC_STRIDE);
181 182
182 gk20a_dbg_fn(""); 183 gk20a_dbg_fn("");
183 184
@@ -198,7 +199,7 @@ static int gr_gm20b_commit_global_cb_manager(struct gk20a *g,
198 gr->tpc_count * gr->attrib_cb_size; 199 gr->tpc_count * gr->attrib_cb_size;
199 200
200 for (gpc_index = 0; gpc_index < gr->gpc_count; gpc_index++) { 201 for (gpc_index = 0; gpc_index < gr->gpc_count; gpc_index++) {
201 temp = proj_gpc_stride_v() * gpc_index; 202 temp = gpc_stride * gpc_index;
202 for (ppc_index = 0; ppc_index < gr->gpc_ppc_count[gpc_index]; 203 for (ppc_index = 0; ppc_index < gr->gpc_ppc_count[gpc_index];
203 ppc_index++) { 204 ppc_index++) {
204 cbm_cfg_size1 = gr->attrib_cb_default_size * 205 cbm_cfg_size1 = gr->attrib_cb_default_size *
@@ -208,12 +209,12 @@ static int gr_gm20b_commit_global_cb_manager(struct gk20a *g,
208 209
209 gr_gk20a_ctx_patch_write(g, ch_ctx, 210 gr_gk20a_ctx_patch_write(g, ch_ctx,
210 gr_gpc0_ppc0_cbm_beta_cb_size_r() + temp + 211 gr_gpc0_ppc0_cbm_beta_cb_size_r() + temp +
211 proj_ppc_in_gpc_stride_v() * ppc_index, 212 ppc_in_gpc_stride * ppc_index,
212 cbm_cfg_size1, patch); 213 cbm_cfg_size1, patch);
213 214
214 gr_gk20a_ctx_patch_write(g, ch_ctx, 215 gr_gk20a_ctx_patch_write(g, ch_ctx,
215 gr_gpc0_ppc0_cbm_beta_cb_offset_r() + temp + 216 gr_gpc0_ppc0_cbm_beta_cb_offset_r() + temp +
216 proj_ppc_in_gpc_stride_v() * ppc_index, 217 ppc_in_gpc_stride * ppc_index,
217 attrib_offset_in_chunk, patch); 218 attrib_offset_in_chunk, patch);
218 219
219 attrib_offset_in_chunk += gr->attrib_cb_size * 220 attrib_offset_in_chunk += gr->attrib_cb_size *
@@ -221,12 +222,12 @@ static int gr_gm20b_commit_global_cb_manager(struct gk20a *g,
221 222
222 gr_gk20a_ctx_patch_write(g, ch_ctx, 223 gr_gk20a_ctx_patch_write(g, ch_ctx,
223 gr_gpc0_ppc0_cbm_alpha_cb_size_r() + temp + 224 gr_gpc0_ppc0_cbm_alpha_cb_size_r() + temp +
224 proj_ppc_in_gpc_stride_v() * ppc_index, 225 ppc_in_gpc_stride * ppc_index,
225 cbm_cfg_size2, patch); 226 cbm_cfg_size2, patch);
226 227
227 gr_gk20a_ctx_patch_write(g, ch_ctx, 228 gr_gk20a_ctx_patch_write(g, ch_ctx,
228 gr_gpc0_ppc0_cbm_alpha_cb_offset_r() + temp + 229 gr_gpc0_ppc0_cbm_alpha_cb_offset_r() + temp +
229 proj_ppc_in_gpc_stride_v() * ppc_index, 230 ppc_in_gpc_stride * ppc_index,
230 alpha_offset_in_chunk, patch); 231 alpha_offset_in_chunk, patch);
231 232
232 alpha_offset_in_chunk += gr->alpha_cb_size * 233 alpha_offset_in_chunk += gr->alpha_cb_size *
@@ -297,6 +298,8 @@ static void gr_gm20b_set_alpha_circular_buffer_size(struct gk20a *g, u32 data)
297 u32 gpc_index, ppc_index, stride, val; 298 u32 gpc_index, ppc_index, stride, val;
298 u32 pd_ab_max_output; 299 u32 pd_ab_max_output;
299 u32 alpha_cb_size = data * 4; 300 u32 alpha_cb_size = data * 4;
301 u32 gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_GPC_STRIDE);
302 u32 ppc_in_gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_PPC_IN_GPC_STRIDE);
300 303
301 gk20a_dbg_fn(""); 304 gk20a_dbg_fn("");
302 /* if (NO_ALPHA_BETA_TIMESLICE_SUPPORT_DEF) 305 /* if (NO_ALPHA_BETA_TIMESLICE_SUPPORT_DEF)
@@ -319,14 +322,14 @@ static void gr_gm20b_set_alpha_circular_buffer_size(struct gk20a *g, u32 data)
319 gr_pd_ab_dist_cfg1_max_batches_init_f()); 322 gr_pd_ab_dist_cfg1_max_batches_init_f());
320 323
321 for (gpc_index = 0; gpc_index < gr->gpc_count; gpc_index++) { 324 for (gpc_index = 0; gpc_index < gr->gpc_count; gpc_index++) {
322 stride = proj_gpc_stride_v() * gpc_index; 325 stride = gpc_stride * gpc_index;
323 326
324 for (ppc_index = 0; ppc_index < gr->gpc_ppc_count[gpc_index]; 327 for (ppc_index = 0; ppc_index < gr->gpc_ppc_count[gpc_index];
325 ppc_index++) { 328 ppc_index++) {
326 329
327 val = gk20a_readl(g, gr_gpc0_ppc0_cbm_alpha_cb_size_r() + 330 val = gk20a_readl(g, gr_gpc0_ppc0_cbm_alpha_cb_size_r() +
328 stride + 331 stride +
329 proj_ppc_in_gpc_stride_v() * ppc_index); 332 ppc_in_gpc_stride * ppc_index);
330 333
331 val = set_field(val, gr_gpc0_ppc0_cbm_alpha_cb_size_v_m(), 334 val = set_field(val, gr_gpc0_ppc0_cbm_alpha_cb_size_v_m(),
332 gr_gpc0_ppc0_cbm_alpha_cb_size_v_f(alpha_cb_size * 335 gr_gpc0_ppc0_cbm_alpha_cb_size_v_f(alpha_cb_size *
@@ -334,7 +337,7 @@ static void gr_gm20b_set_alpha_circular_buffer_size(struct gk20a *g, u32 data)
334 337
335 gk20a_writel(g, gr_gpc0_ppc0_cbm_alpha_cb_size_r() + 338 gk20a_writel(g, gr_gpc0_ppc0_cbm_alpha_cb_size_r() +
336 stride + 339 stride +
337 proj_ppc_in_gpc_stride_v() * ppc_index, val); 340 ppc_in_gpc_stride * ppc_index, val);
338 } 341 }
339 } 342 }
340} 343}
@@ -344,6 +347,8 @@ static void gr_gm20b_set_circular_buffer_size(struct gk20a *g, u32 data)
344 struct gr_gk20a *gr = &g->gr; 347 struct gr_gk20a *gr = &g->gr;
345 u32 gpc_index, ppc_index, stride, val; 348 u32 gpc_index, ppc_index, stride, val;
346 u32 cb_size = data * 4; 349 u32 cb_size = data * 4;
350 u32 gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_GPC_STRIDE);
351 u32 ppc_in_gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_PPC_IN_GPC_STRIDE);
347 352
348 gk20a_dbg_fn(""); 353 gk20a_dbg_fn("");
349 354
@@ -356,14 +361,14 @@ static void gr_gm20b_set_circular_buffer_size(struct gk20a *g, u32 data)
356 gr_ds_tga_constraintlogic_beta_cbsize_f(cb_size)); 361 gr_ds_tga_constraintlogic_beta_cbsize_f(cb_size));
357 362
358 for (gpc_index = 0; gpc_index < gr->gpc_count; gpc_index++) { 363 for (gpc_index = 0; gpc_index < gr->gpc_count; gpc_index++) {
359 stride = proj_gpc_stride_v() * gpc_index; 364 stride = gpc_stride * gpc_index;
360 365
361 for (ppc_index = 0; ppc_index < gr->gpc_ppc_count[gpc_index]; 366 for (ppc_index = 0; ppc_index < gr->gpc_ppc_count[gpc_index];
362 ppc_index++) { 367 ppc_index++) {
363 368
364 val = gk20a_readl(g, gr_gpc0_ppc0_cbm_beta_cb_size_r() + 369 val = gk20a_readl(g, gr_gpc0_ppc0_cbm_beta_cb_size_r() +
365 stride + 370 stride +
366 proj_ppc_in_gpc_stride_v() * ppc_index); 371 ppc_in_gpc_stride * ppc_index);
367 372
368 val = set_field(val, 373 val = set_field(val,
369 gr_gpc0_ppc0_cbm_beta_cb_size_v_m(), 374 gr_gpc0_ppc0_cbm_beta_cb_size_v_m(),
@@ -372,7 +377,7 @@ static void gr_gm20b_set_circular_buffer_size(struct gk20a *g, u32 data)
372 377
373 gk20a_writel(g, gr_gpc0_ppc0_cbm_beta_cb_size_r() + 378 gk20a_writel(g, gr_gpc0_ppc0_cbm_beta_cb_size_r() +
374 stride + 379 stride +
375 proj_ppc_in_gpc_stride_v() * ppc_index, val); 380 ppc_in_gpc_stride * ppc_index, val);
376 381
377 val = gk20a_readl(g, gr_gpcs_swdx_tc_beta_cb_size_r( 382 val = gk20a_readl(g, gr_gpcs_swdx_tc_beta_cb_size_r(
378 ppc_index + gpc_index)); 383 ppc_index + gpc_index));
@@ -527,14 +532,16 @@ int gr_gm20b_ctx_state_floorsweep(struct gk20a *g)
527 u32 tpc_per_gpc = 0; 532 u32 tpc_per_gpc = 0;
528 u32 tpc_sm_id = 0, gpc_tpc_id = 0; 533 u32 tpc_sm_id = 0, gpc_tpc_id = 0;
529 u32 pes_tpc_mask = 0, pes_index; 534 u32 pes_tpc_mask = 0, pes_index;
535 u32 gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_GPC_STRIDE);
536 u32 tpc_in_gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_TPC_IN_GPC_STRIDE);
530 537
531 gk20a_dbg_fn(""); 538 gk20a_dbg_fn("");
532 539
533 for (gpc_index = 0; gpc_index < gr->gpc_count; gpc_index++) { 540 for (gpc_index = 0; gpc_index < gr->gpc_count; gpc_index++) {
534 gpc_offset = proj_gpc_stride_v() * gpc_index; 541 gpc_offset = gpc_stride * gpc_index;
535 for (tpc_index = 0; tpc_index < gr->gpc_tpc_count[gpc_index]; 542 for (tpc_index = 0; tpc_index < gr->gpc_tpc_count[gpc_index];
536 tpc_index++) { 543 tpc_index++) {
537 tpc_offset = proj_tpc_in_gpc_stride_v() * tpc_index; 544 tpc_offset = tpc_in_gpc_stride * tpc_index;
538 545
539 gk20a_writel(g, gr_gpc0_tpc0_sm_cfg_r() 546 gk20a_writel(g, gr_gpc0_tpc0_sm_cfg_r()
540 + gpc_offset + tpc_offset, 547 + gpc_offset + tpc_offset,
@@ -640,32 +647,37 @@ static int gr_gm20b_load_ctxsw_ucode_segments(struct gk20a *g, u64 addr_base,
640 return 0; 647 return 0;
641} 648}
642 649
643static bool gr_gm20b_is_tpc_addr_shared(u32 addr) 650static bool gr_gm20b_is_tpc_addr_shared(struct gk20a *g, u32 addr)
644{ 651{
645 return (addr >= proj_tpc_in_gpc_shared_base_v()) && 652 u32 tpc_in_gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_TPC_IN_GPC_STRIDE);
646 (addr < (proj_tpc_in_gpc_shared_base_v() + 653 u32 tpc_in_gpc_shared_base = nvgpu_get_litter_value(g, GPU_LIT_TPC_IN_GPC_SHARED_BASE);
647 proj_tpc_in_gpc_stride_v())); 654 return (addr >= tpc_in_gpc_shared_base) &&
655 (addr < (tpc_in_gpc_shared_base +
656 tpc_in_gpc_stride));
648} 657}
649 658
650static bool gr_gm20b_is_tpc_addr(u32 addr) 659static bool gr_gm20b_is_tpc_addr(struct gk20a *g, u32 addr)
651{ 660{
652 return ((addr >= proj_tpc_in_gpc_base_v()) && 661 u32 tpc_in_gpc_base = nvgpu_get_litter_value(g, GPU_LIT_TPC_IN_GPC_BASE);
653 (addr < proj_tpc_in_gpc_base_v() + 662 u32 tpc_in_gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_TPC_IN_GPC_STRIDE);
654 (proj_scal_litter_num_tpc_per_gpc_v() * 663 u32 num_tpc_per_gpc = nvgpu_get_litter_value(g, GPU_LIT_NUM_TPC_PER_GPC);
655 proj_tpc_in_gpc_stride_v()))) 664 return ((addr >= tpc_in_gpc_base) &&
656 || gr_gm20b_is_tpc_addr_shared(addr); 665 (addr < tpc_in_gpc_base +
666 (num_tpc_per_gpc * tpc_in_gpc_stride)))
667 || gr_gm20b_is_tpc_addr_shared(g, addr);
657} 668}
658 669
659static u32 gr_gm20b_get_tpc_num(u32 addr) 670static u32 gr_gm20b_get_tpc_num(struct gk20a *g, u32 addr)
660{ 671{
661 u32 i, start; 672 u32 i, start;
662 u32 num_tpcs = proj_scal_litter_num_tpc_per_gpc_v(); 673 u32 num_tpcs = nvgpu_get_litter_value(g, GPU_LIT_NUM_TPC_PER_GPC);
674 u32 tpc_in_gpc_base = nvgpu_get_litter_value(g, GPU_LIT_TPC_IN_GPC_BASE);
675 u32 tpc_in_gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_TPC_IN_GPC_STRIDE);
663 676
664 for (i = 0; i < num_tpcs; i++) { 677 for (i = 0; i < num_tpcs; i++) {
665 start = proj_tpc_in_gpc_base_v() + 678 start = tpc_in_gpc_base + (i * tpc_in_gpc_stride);
666 (i * proj_tpc_in_gpc_stride_v());
667 if ((addr >= start) && 679 if ((addr >= start) &&
668 (addr < (start + proj_tpc_in_gpc_stride_v()))) 680 (addr < (start + tpc_in_gpc_stride)))
669 return i; 681 return i;
670 } 682 }
671 return 0; 683 return 0;
@@ -1066,6 +1078,8 @@ static void gr_gm20b_bpt_reg_info(struct gk20a *g, struct warpstate *w_state)
1066 u32 gpc, tpc, sm_id; 1078 u32 gpc, tpc, sm_id;
1067 u32 tpc_offset, gpc_offset, reg_offset; 1079 u32 tpc_offset, gpc_offset, reg_offset;
1068 u64 warps_valid = 0, warps_paused = 0, warps_trapped = 0; 1080 u64 warps_valid = 0, warps_paused = 0, warps_trapped = 0;
1081 u32 gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_GPC_STRIDE);
1082 u32 tpc_in_gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_TPC_IN_GPC_STRIDE);
1069 1083
1070 /* for maxwell & kepler */ 1084 /* for maxwell & kepler */
1071 u32 numSmPerTpc = 1; 1085 u32 numSmPerTpc = 1;
@@ -1075,8 +1089,8 @@ static void gr_gm20b_bpt_reg_info(struct gk20a *g, struct warpstate *w_state)
1075 gpc = g->gr.sm_to_cluster[sm_id].gpc_index; 1089 gpc = g->gr.sm_to_cluster[sm_id].gpc_index;
1076 tpc = g->gr.sm_to_cluster[sm_id].tpc_index; 1090 tpc = g->gr.sm_to_cluster[sm_id].tpc_index;
1077 1091
1078 tpc_offset = proj_tpc_in_gpc_stride_v() * tpc; 1092 tpc_offset = tpc_in_gpc_stride * tpc;
1079 gpc_offset = proj_gpc_stride_v() * gpc; 1093 gpc_offset = gpc_stride * gpc;
1080 reg_offset = tpc_offset + gpc_offset; 1094 reg_offset = tpc_offset + gpc_offset;
1081 1095
1082 /* 64 bit read */ 1096 /* 64 bit read */
diff --git a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c
index 559fee61..df25be5e 100644
--- a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c
@@ -34,6 +34,7 @@
34#include "debug_gm20b.h" 34#include "debug_gm20b.h"
35#include "cde_gm20b.h" 35#include "cde_gm20b.h"
36#include "therm_gm20b.h" 36#include "therm_gm20b.h"
37#include "hw_proj_gm20b.h"
37 38
38#define FUSE_OPT_PRIV_SEC_DIS_0 0x264 39#define FUSE_OPT_PRIV_SEC_DIS_0 0x264
39#define PRIV_SECURITY_DISABLE 0x01 40#define PRIV_SECURITY_DISABLE 0x01
@@ -89,6 +90,78 @@ static struct gpu_ops gm20b_ops = {
89 }, 90 },
90}; 91};
91 92
93static int gm20b_get_litter_value(struct gk20a *g,
94 enum nvgpu_litter_value value)
95{
96 int ret = EINVAL;
97 switch (value) {
98 case GPU_LIT_NUM_GPCS:
99 ret = proj_scal_litter_num_gpcs_v();
100 break;
101 case GPU_LIT_NUM_PES_PER_GPC:
102 ret = proj_scal_litter_num_pes_per_gpc_v();
103 break;
104 case GPU_LIT_NUM_ZCULL_BANKS:
105 ret = proj_scal_litter_num_zcull_banks_v();
106 break;
107 case GPU_LIT_NUM_TPC_PER_GPC:
108 ret = proj_scal_litter_num_tpc_per_gpc_v();
109 break;
110 case GPU_LIT_NUM_FBPS:
111 ret = proj_scal_litter_num_fbps_v();
112 break;
113 case GPU_LIT_GPC_BASE:
114 ret = proj_gpc_base_v();
115 break;
116 case GPU_LIT_GPC_STRIDE:
117 ret = proj_gpc_stride_v();
118 break;
119 case GPU_LIT_GPC_SHARED_BASE:
120 ret = proj_gpc_shared_base_v();
121 break;
122 case GPU_LIT_TPC_IN_GPC_BASE:
123 ret = proj_tpc_in_gpc_base_v();
124 break;
125 case GPU_LIT_TPC_IN_GPC_STRIDE:
126 ret = proj_tpc_in_gpc_stride_v();
127 break;
128 case GPU_LIT_TPC_IN_GPC_SHARED_BASE:
129 ret = proj_tpc_in_gpc_shared_base_v();
130 break;
131 case GPU_LIT_PPC_IN_GPC_STRIDE:
132 ret = proj_ppc_in_gpc_stride_v();
133 break;
134 case GPU_LIT_ROP_BASE:
135 ret = proj_rop_base_v();
136 break;
137 case GPU_LIT_ROP_STRIDE:
138 ret = proj_rop_stride_v();
139 break;
140 case GPU_LIT_ROP_SHARED_BASE:
141 ret = proj_rop_shared_base_v();
142 break;
143 case GPU_LIT_HOST_NUM_PBDMA:
144 ret = proj_host_num_pbdma_v();
145 break;
146 case GPU_LIT_LTC_STRIDE:
147 ret = proj_ltc_stride_v();
148 break;
149 case GPU_LIT_LTS_STRIDE:
150 ret = proj_lts_stride_v();
151 break;
152 case GPU_LIT_NUM_FBPAS:
153 ret = proj_scal_litter_num_fbpas_v();
154 break;
155 case GPU_LIT_FBPA_STRIDE:
156 ret = proj_fbpa_stride_v();
157 break;
158 default:
159 break;
160 }
161
162 return ret;
163}
164
92int gm20b_init_hal(struct gk20a *g) 165int gm20b_init_hal(struct gk20a *g)
93{ 166{
94 struct gpu_ops *gops = &g->ops; 167 struct gpu_ops *gops = &g->ops;
@@ -140,6 +213,7 @@ int gm20b_init_hal(struct gk20a *g)
140 gm20b_init_therm_ops(gops); 213 gm20b_init_therm_ops(gops);
141 gops->name = "gm20b"; 214 gops->name = "gm20b";
142 gops->chip_init_gpu_characteristics = gk20a_init_gpu_characteristics; 215 gops->chip_init_gpu_characteristics = gk20a_init_gpu_characteristics;
216 gops->get_litter_value = gm20b_get_litter_value;
143 217
144 c->twod_class = FERMI_TWOD_A; 218 c->twod_class = FERMI_TWOD_A;
145 c->threed_class = MAXWELL_B; 219 c->threed_class = MAXWELL_B;
diff --git a/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c b/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c
index e4e27764..4fc9d51b 100644
--- a/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c
@@ -20,7 +20,6 @@
20#include "hw_mc_gm20b.h" 20#include "hw_mc_gm20b.h"
21#include "hw_ltc_gm20b.h" 21#include "hw_ltc_gm20b.h"
22#include "hw_top_gm20b.h" 22#include "hw_top_gm20b.h"
23#include "hw_proj_gm20b.h"
24#include "hw_pri_ringmaster_gm20b.h" 23#include "hw_pri_ringmaster_gm20b.h"
25 24
26#include "gk20a/ltc_common.c" 25#include "gk20a/ltc_common.c"
@@ -109,6 +108,8 @@ int gm20b_ltc_cbc_ctrl(struct gk20a *g, enum gk20a_cbc_op op,
109 s32 retry = 200; 108 s32 retry = 200;
110 u32 slices_per_ltc = ltc_ltcs_ltss_cbc_param_slices_per_ltc_v( 109 u32 slices_per_ltc = ltc_ltcs_ltss_cbc_param_slices_per_ltc_v(
111 gk20a_readl(g, ltc_ltcs_ltss_cbc_param_r())); 110 gk20a_readl(g, ltc_ltcs_ltss_cbc_param_r()));
111 u32 ltc_stride = nvgpu_get_litter_value(g, GPU_LIT_LTC_STRIDE);
112 u32 lts_stride = nvgpu_get_litter_value(g, GPU_LIT_LTS_STRIDE);
112 113
113 gk20a_dbg_fn(""); 114 gk20a_dbg_fn("");
114 115
@@ -139,8 +140,7 @@ int gm20b_ltc_cbc_ctrl(struct gk20a *g, enum gk20a_cbc_op op,
139 for (slice = 0; slice < slices_per_ltc; slice++) { 140 for (slice = 0; slice < slices_per_ltc; slice++) {
140 141
141 ctrl1 = ltc_ltc0_lts0_cbc_ctrl1_r() + 142 ctrl1 = ltc_ltc0_lts0_cbc_ctrl1_r() +
142 ltc * proj_ltc_stride_v() + 143 ltc * ltc_stride + slice * lts_stride;
143 slice * proj_lts_stride_v();
144 144
145 retry = 200; 145 retry = 200;
146 do { 146 do {
@@ -198,6 +198,8 @@ void gm20b_ltc_isr(struct gk20a *g)
198{ 198{
199 u32 mc_intr, ltc_intr; 199 u32 mc_intr, ltc_intr;
200 int ltc, slice; 200 int ltc, slice;
201 u32 ltc_stride = nvgpu_get_litter_value(g, GPU_LIT_LTC_STRIDE);
202 u32 lts_stride = nvgpu_get_litter_value(g, GPU_LIT_LTS_STRIDE);
201 203
202 mc_intr = gk20a_readl(g, mc_intr_ltc_r()); 204 mc_intr = gk20a_readl(g, mc_intr_ltc_r());
203 gk20a_err(dev_from_gk20a(g), "mc_ltc_intr: %08x", 205 gk20a_err(dev_from_gk20a(g), "mc_ltc_intr: %08x",
@@ -207,13 +209,13 @@ void gm20b_ltc_isr(struct gk20a *g)
207 continue; 209 continue;
208 for (slice = 0; slice < g->gr.slices_per_ltc; slice++) { 210 for (slice = 0; slice < g->gr.slices_per_ltc; slice++) {
209 ltc_intr = gk20a_readl(g, ltc_ltc0_lts0_intr_r() + 211 ltc_intr = gk20a_readl(g, ltc_ltc0_lts0_intr_r() +
210 proj_ltc_stride_v() * ltc + 212 ltc_stride * ltc +
211 proj_lts_stride_v() * slice); 213 lts_stride * slice);
212 gk20a_err(dev_from_gk20a(g), "ltc%d, slice %d: %08x", 214 gk20a_err(dev_from_gk20a(g), "ltc%d, slice %d: %08x",
213 ltc, slice, ltc_intr); 215 ltc, slice, ltc_intr);
214 gk20a_writel(g, ltc_ltc0_lts0_intr_r() + 216 gk20a_writel(g, ltc_ltc0_lts0_intr_r() +
215 proj_ltc_stride_v() * ltc + 217 ltc_stride * ltc +
216 proj_lts_stride_v() * slice, 218 lts_stride * slice,
217 ltc_intr); 219 ltc_intr);
218 } 220 }
219 } 221 }
@@ -287,6 +289,7 @@ void gm20b_flush_ltc(struct gk20a *g)
287{ 289{
288 unsigned long timeout; 290 unsigned long timeout;
289 int ltc; 291 int ltc;
292 u32 ltc_stride = nvgpu_get_litter_value(g, GPU_LIT_LTC_STRIDE);
290 293
291#define __timeout_init() \ 294#define __timeout_init() \
292 do { \ 295 do { \
@@ -317,7 +320,7 @@ void gm20b_flush_ltc(struct gk20a *g)
317 __timeout_init(); 320 __timeout_init();
318 do { 321 do {
319 int cmgmt1 = ltc_ltc0_ltss_tstg_cmgmt1_r() + 322 int cmgmt1 = ltc_ltc0_ltss_tstg_cmgmt1_r() +
320 ltc * proj_ltc_stride_v(); 323 ltc * ltc_stride;
321 op_pending = gk20a_readl(g, cmgmt1); 324 op_pending = gk20a_readl(g, cmgmt1);
322 __timeout_check(); 325 __timeout_check();
323 } while (op_pending & 326 } while (op_pending &
@@ -338,7 +341,7 @@ void gm20b_flush_ltc(struct gk20a *g)
338 __timeout_init(); 341 __timeout_init();
339 do { 342 do {
340 int cmgmt0 = ltc_ltc0_ltss_tstg_cmgmt0_r() + 343 int cmgmt0 = ltc_ltc0_ltss_tstg_cmgmt0_r() +
341 ltc * proj_ltc_stride_v(); 344 ltc * ltc_stride;
342 op_pending = gk20a_readl(g, cmgmt0); 345 op_pending = gk20a_readl(g, cmgmt0);
343 __timeout_check(); 346 __timeout_check();
344 } while (op_pending & 347 } while (op_pending &