diff options
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/nvgpu/gp10b/gr_gp10b.c | 109 |
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 | ||
372 | static 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 | |||
382 | static 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 | |||
427 | static 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 | |||
372 | void gp10b_init_gr(struct gpu_ops *gops) | 476 | void 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 | } |