summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2014-11-21 07:08:07 -0500
committerDeepak Nibade <dnibade@nvidia.com>2016-12-27 04:52:02 -0500
commit59f267981c3024cc3b73c5743d2481f80228b15f (patch)
tree1af9c59133ef0df92d6982744bdd1de846f53704 /drivers/gpu/nvgpu/gp10b/gr_gp10b.c
parente5161d1518e227050f94213e6615f8b35a5fb115 (diff)
gpu: nvgpu: gp10b: Program CB sizes
Program CB sizes. Bug 1567274 Change-Id: Idc88f69b70e85bf950af852a9ca80a328d95883f Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/654097 GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers/gpu/nvgpu/gp10b/gr_gp10b.c')
-rw-r--r--drivers/gpu/nvgpu/gp10b/gr_gp10b.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
index 844ba81f..81e04095 100644
--- a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
@@ -369,6 +369,110 @@ fail:
369 return -EINVAL; 369 return -EINVAL;
370} 370}
371 371
372static void gr_gp10b_cb_size_default(struct gk20a *g)
373{
374 struct gr_gk20a *gr = &g->gr;
375
376 gr->attrib_cb_default_size =
377 gr_gpc0_ppc0_cbm_beta_cb_size_v_default_v();
378 gr->alpha_cb_default_size =
379 gr_gpc0_ppc0_cbm_alpha_cb_size_v_default_v();
380}
381
382static void gr_gp10b_set_alpha_circular_buffer_size(struct gk20a *g, u32 data)
383{
384 struct gr_gk20a *gr = &g->gr;
385 u32 gpc_index, ppc_index, stride, val;
386 u32 pd_ab_max_output;
387 u32 alpha_cb_size = data * 4;
388
389 gk20a_dbg_fn("");
390
391 if (alpha_cb_size > gr->alpha_cb_size)
392 alpha_cb_size = gr->alpha_cb_size;
393
394 gk20a_writel(g, gr_ds_tga_constraintlogic_alpha_r(),
395 (gk20a_readl(g, gr_ds_tga_constraintlogic_alpha_r()) &
396 ~gr_ds_tga_constraintlogic_alpha_cbsize_f(~0)) |
397 gr_ds_tga_constraintlogic_alpha_cbsize_f(alpha_cb_size));
398
399 pd_ab_max_output = alpha_cb_size *
400 gr_gpc0_ppc0_cbm_alpha_cb_size_v_granularity_v() /
401 gr_pd_ab_dist_cfg1_max_output_granularity_v();
402
403 gk20a_writel(g, gr_pd_ab_dist_cfg1_r(),
404 gr_pd_ab_dist_cfg1_max_output_f(pd_ab_max_output));
405
406 for (gpc_index = 0; gpc_index < gr->gpc_count; gpc_index++) {
407 stride = proj_gpc_stride_v() * gpc_index;
408
409 for (ppc_index = 0; ppc_index < gr->gpc_ppc_count[gpc_index];
410 ppc_index++) {
411
412 val = gk20a_readl(g, gr_gpc0_ppc0_cbm_alpha_cb_size_r() +
413 stride +
414 proj_ppc_in_gpc_stride_v() * ppc_index);
415
416 val = set_field(val, gr_gpc0_ppc0_cbm_alpha_cb_size_v_m(),
417 gr_gpc0_ppc0_cbm_alpha_cb_size_v_f(alpha_cb_size *
418 gr->pes_tpc_count[ppc_index][gpc_index]));
419
420 gk20a_writel(g, gr_gpc0_ppc0_cbm_alpha_cb_size_r() +
421 stride +
422 proj_ppc_in_gpc_stride_v() * ppc_index, val);
423 }
424 }
425}
426
427static void gr_gp10b_set_circular_buffer_size(struct gk20a *g, u32 data)
428{
429 struct gr_gk20a *gr = &g->gr;
430 u32 gpc_index, ppc_index, stride, val;
431 u32 cb_size = data * 4;
432
433 gk20a_dbg_fn("");
434
435 if (cb_size > gr->attrib_cb_size)
436 cb_size = gr->attrib_cb_size;
437
438 gk20a_writel(g, gr_ds_tga_constraintlogic_beta_r(),
439 (gk20a_readl(g, gr_ds_tga_constraintlogic_beta_r()) &
440 ~gr_ds_tga_constraintlogic_beta_cbsize_f(~0)) |
441 gr_ds_tga_constraintlogic_beta_cbsize_f(cb_size));
442
443 for (gpc_index = 0; gpc_index < gr->gpc_count; gpc_index++) {
444 stride = proj_gpc_stride_v() * gpc_index;
445
446 for (ppc_index = 0; ppc_index < gr->gpc_ppc_count[gpc_index];
447 ppc_index++) {
448
449 val = gk20a_readl(g, gr_gpc0_ppc0_cbm_beta_cb_size_r() +
450 stride +
451 proj_ppc_in_gpc_stride_v() * ppc_index);
452
453 val = set_field(val,
454 gr_gpc0_ppc0_cbm_beta_cb_size_v_m(),
455 gr_gpc0_ppc0_cbm_beta_cb_size_v_f(cb_size *
456 gr->pes_tpc_count[ppc_index][gpc_index]));
457
458 gk20a_writel(g, gr_gpc0_ppc0_cbm_beta_cb_size_r() +
459 stride +
460 proj_ppc_in_gpc_stride_v() * ppc_index, val);
461
462 val = gk20a_readl(g, gr_gpcs_swdx_tc_beta_cb_size_r(
463 ppc_index + gpc_index));
464
465 val = set_field(val,
466 gr_gpcs_swdx_tc_beta_cb_size_v_m(),
467 gr_gpcs_swdx_tc_beta_cb_size_v_f(cb_size *
468 gr->gpc_ppc_count[gpc_index]));
469
470 gk20a_writel(g, gr_gpcs_swdx_tc_beta_cb_size_r(
471 ppc_index + gpc_index), val);
472 }
473 }
474}
475
372void gp10b_init_gr(struct gpu_ops *gops) 476void gp10b_init_gr(struct gpu_ops *gops)
373{ 477{
374 gm20b_init_gr(gops); 478 gm20b_init_gr(gops);
@@ -381,4 +485,9 @@ void gp10b_init_gr(struct gpu_ops *gops)
381 gops->gr.calc_global_ctx_buffer_size = 485 gops->gr.calc_global_ctx_buffer_size =
382 gr_gp10b_calc_global_ctx_buffer_size; 486 gr_gp10b_calc_global_ctx_buffer_size;
383 gops->gr.handle_sw_method = gr_gp10b_handle_sw_method; 487 gops->gr.handle_sw_method = gr_gp10b_handle_sw_method;
488 gops->gr.cb_size_default = gr_gp10b_cb_size_default;
489 gops->gr.set_alpha_circular_buffer_size =
490 gr_gp10b_set_alpha_circular_buffer_size;
491 gops->gr.set_circular_buffer_size =
492 gr_gp10b_set_circular_buffer_size;
384} 493}