diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-04-06 16:10:32 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-04-15 11:48:20 -0400 |
commit | 6839341bf8ffafa115cfc0427bba694ee1d131f3 (patch) | |
tree | 1f9369a3bacf0f1a2cc23371f5de988efdc07c31 /drivers/gpu/nvgpu/gm20b | |
parent | 61e009c0f8874898335e6c47a610233c3382be47 (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.c | 76 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gm20b/hal_gm20b.c | 74 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gm20b/ltc_gm20b.c | 21 |
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 | ||
643 | static bool gr_gm20b_is_tpc_addr_shared(u32 addr) | 650 | static 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 | ||
650 | static bool gr_gm20b_is_tpc_addr(u32 addr) | 659 | static 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 | ||
659 | static u32 gr_gm20b_get_tpc_num(u32 addr) | 670 | static 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 | ||
93 | static 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 | |||
92 | int gm20b_init_hal(struct gk20a *g) | 165 | int 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 & |