summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2014-12-03 09:11:50 -0500
committerDeepak Nibade <dnibade@nvidia.com>2016-12-27 04:52:03 -0500
commit15839d4763e0651e789a6511476851cccef0febb (patch)
tree0e0a6d52c478077049c0c51d1abf6bfdcccffacf /drivers/gpu/nvgpu/gp10b/gr_gp10b.c
parent945e5e6832bd2461b9eafa61e8dd06b793a6f6b9 (diff)
gpu: nvgpu: Implement gp10b context creation
Implement context creation for gp10b. GfxP contexts need per channel buffers. Bug 1517461 Change-Id: Ifecb59002f89f0407457730a35bfb3fe988b907a Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/660236
Diffstat (limited to 'drivers/gpu/nvgpu/gp10b/gr_gp10b.c')
-rw-r--r--drivers/gpu/nvgpu/gp10b/gr_gp10b.c221
1 files changed, 215 insertions, 6 deletions
diff --git a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
index 0dce115a..0a60612d 100644
--- a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
@@ -21,6 +21,7 @@
21#include "gp10b/gr_gp10b.h" 21#include "gp10b/gr_gp10b.h"
22#include "hw_gr_gp10b.h" 22#include "hw_gr_gp10b.h"
23#include "hw_proj_gp10b.h" 23#include "hw_proj_gp10b.h"
24#include "hw_ctxsw_prog_gp10b.h"
24 25
25bool gr_gp10b_is_valid_class(struct gk20a *g, u32 class_num) 26bool gr_gp10b_is_valid_class(struct gk20a *g, u32 class_num)
26{ 27{
@@ -297,12 +298,9 @@ clean_up:
297 return ret; 298 return ret;
298} 299}
299 300
300static void gr_gp10b_buffer_size_defaults(struct gk20a *g) 301static u32 gr_gp10b_pagepool_default_size(struct gk20a *g)
301{ 302{
302 g->gr.pagepool_default_size = 303 return gr_scc_pagepool_total_pages_hwmax_value_v();
303 gr_scc_pagepool_total_pages_hwmax_value_v();
304 g->gr.pagepool_max_size =
305 gr_scc_pagepool_total_pages_hwmax_value_v();
306} 304}
307 305
308static int gr_gp10b_calc_global_ctx_buffer_size(struct gk20a *g) 306static int gr_gp10b_calc_global_ctx_buffer_size(struct gk20a *g)
@@ -473,6 +471,212 @@ static void gr_gp10b_set_circular_buffer_size(struct gk20a *g, u32 data)
473 } 471 }
474} 472}
475 473
474static int gr_gp10b_init_ctx_state(struct gk20a *g)
475{
476 struct fecs_method_op_gk20a op = {
477 .mailbox = { .id = 0, .data = 0,
478 .clr = ~0, .ok = 0, .fail = 0},
479 .method.data = 0,
480 .cond.ok = GR_IS_UCODE_OP_NOT_EQUAL,
481 .cond.fail = GR_IS_UCODE_OP_SKIP,
482 };
483 int err;
484
485 gk20a_dbg_fn("");
486
487 err = gr_gk20a_init_ctx_state(g);
488 if (err)
489 return err;
490
491 if (!g->gr.t18x.ctx_vars.preempt_image_size) {
492 op.method.addr =
493 gr_fecs_method_push_adr_discover_preemption_image_size_v();
494 op.mailbox.ret = &g->gr.t18x.ctx_vars.preempt_image_size;
495 err = gr_gk20a_submit_fecs_method_op(g, op);
496 if (err) {
497 gk20a_err(dev_from_gk20a(g),
498 "query preempt image size failed");
499 return err;
500 }
501 }
502
503 gk20a_dbg_info("preempt image size: %u",
504 g->gr.t18x.ctx_vars.preempt_image_size);
505
506 gk20a_dbg_fn("done");
507
508 return 0;
509}
510
511int gr_gp10b_alloc_gr_ctx(struct gk20a *g,
512 struct gr_ctx_desc **gr_ctx, struct vm_gk20a *vm,
513 u32 flags)
514{
515 int err;
516
517 gk20a_dbg_fn("");
518
519 err = gr_gk20a_alloc_gr_ctx(g, gr_ctx, vm, flags);
520 if (err)
521 return err;
522
523 if (flags == NVGPU_GR_PREEMPTION_MODE_GFXP) {
524 u32 spill_size =
525 gr_gpc0_swdx_rm_spill_buffer_size_256b_default_v();
526 u32 betacb_size = ALIGN(
527 (gr_gpc0_ppc0_cbm_beta_cb_size_v_gfxp_v() *
528 gr_gpc0_ppc0_cbm_beta_cb_size_v_granularity_v() *
529 g->gr.max_tpc_count) +
530 (g->gr.alpha_cb_size *
531 gr_gpc0_ppc0_cbm_beta_cb_size_v_granularity_v() *
532 g->gr.max_tpc_count),
533 128);
534 u32 pagepool_size = g->ops.gr.pagepool_default_size(g) *
535 gr_scc_pagepool_total_pages_byte_granularity_v();
536
537 err = gk20a_gmmu_alloc_map(vm, g->gr.t18x.ctx_vars.preempt_image_size,
538 &(*gr_ctx)->t18x.preempt_ctxsw_buffer);
539 if (err) {
540 gk20a_err(dev_from_gk20a(vm->mm->g),
541 "cannot allocate preempt buffer");
542 goto fail_free_gk20a_ctx;
543 }
544
545 err = gk20a_gmmu_alloc_map(vm, spill_size,
546 &(*gr_ctx)->t18x.spill_ctxsw_buffer);
547 if (err) {
548 gk20a_err(dev_from_gk20a(vm->mm->g),
549 "cannot allocate spill buffer");
550 goto fail_free_preempt;
551 }
552
553 err = gk20a_gmmu_alloc_map(vm, betacb_size,
554 &(*gr_ctx)->t18x.betacb_ctxsw_buffer);
555 if (err) {
556 gk20a_err(dev_from_gk20a(vm->mm->g),
557 "cannot allocate beta buffer");
558 goto fail_free_spill;
559 }
560
561 err = gk20a_gmmu_alloc_map(vm, pagepool_size,
562 &(*gr_ctx)->t18x.pagepool_ctxsw_buffer);
563 if (err) {
564 gk20a_err(dev_from_gk20a(vm->mm->g),
565 "cannot allocate page pool");
566 goto fail_free_betacb;
567 }
568
569 (*gr_ctx)->t18x.preempt_mode = flags;
570 }
571
572 gk20a_dbg_fn("done");
573
574 return err;
575
576fail_free_betacb:
577 gk20a_gmmu_unmap_free(vm, &(*gr_ctx)->t18x.betacb_ctxsw_buffer);
578fail_free_spill:
579 gk20a_gmmu_unmap_free(vm, &(*gr_ctx)->t18x.spill_ctxsw_buffer);
580fail_free_preempt:
581 gk20a_gmmu_unmap_free(vm, &(*gr_ctx)->t18x.preempt_ctxsw_buffer);
582fail_free_gk20a_ctx:
583 gr_gk20a_free_gr_ctx(g, vm, *gr_ctx);
584 *gr_ctx = NULL;
585
586 return err;
587}
588
589static void gr_gp10b_free_gr_ctx(struct gk20a *g, struct vm_gk20a *vm,
590 struct gr_ctx_desc *gr_ctx)
591{
592 gk20a_dbg_fn("");
593
594 if (!gr_ctx)
595 return;
596
597 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.pagepool_ctxsw_buffer);
598 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.betacb_ctxsw_buffer);
599 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.spill_ctxsw_buffer);
600 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.preempt_ctxsw_buffer);
601 gr_gk20a_free_gr_ctx(g, vm, gr_ctx);
602
603 gk20a_dbg_fn("done");
604}
605
606static void gr_gp10b_update_ctxsw_preemption_mode(struct gk20a *g,
607 struct channel_ctx_gk20a *ch_ctx,
608 void *ctx_ptr)
609{
610 struct gr_ctx_desc *gr_ctx = ch_ctx->gr_ctx;
611 u32 gfxp_preempt_option =
612 ctxsw_prog_main_image_graphics_preemption_options_control_gfxp_f();
613 int err;
614
615 gk20a_dbg_fn("");
616
617 if (gr_ctx->t18x.preempt_mode == NVGPU_GR_PREEMPTION_MODE_GFXP) {
618 gk20a_dbg_info("GfxP: %x", gfxp_preempt_option);
619 gk20a_mem_wr32(ctx_ptr + ctxsw_prog_main_image_graphics_preemption_options_o(), 0,
620 gfxp_preempt_option);
621 }
622
623 if (gr_ctx->t18x.preempt_ctxsw_buffer.gpu_va) {
624 u32 addr;
625 u32 size;
626 u32 cbes_reserve;
627
628 gk20a_mem_wr32(ctx_ptr, ctxsw_prog_main_image_full_preemption_ptr_o(),
629 gr_ctx->t18x.preempt_ctxsw_buffer.gpu_va >> 8);
630
631 err = gr_gk20a_ctx_patch_write_begin(g, ch_ctx);
632
633 addr = (u64_lo32(gr_ctx->t18x.betacb_ctxsw_buffer.gpu_va) >>
634 gr_gpcs_setup_attrib_cb_base_addr_39_12_align_bits_v()) |
635 (u64_hi32(gr_ctx->t18x.betacb_ctxsw_buffer.gpu_va) <<
636 (32 - gr_gpcs_setup_attrib_cb_base_addr_39_12_align_bits_v()));
637
638 gk20a_dbg_info("attrib cb addr : 0x%016x", addr);
639 g->ops.gr.commit_global_attrib_cb(g, ch_ctx, addr, true);
640
641 addr = (u64_lo32(gr_ctx->t18x.pagepool_ctxsw_buffer.gpu_va) >>
642 gr_scc_pagepool_base_addr_39_8_align_bits_v()) |
643 (u64_hi32(gr_ctx->t18x.pagepool_ctxsw_buffer.gpu_va) <<
644 (32 - gr_scc_pagepool_base_addr_39_8_align_bits_v()));
645 size = gr_ctx->t18x.pagepool_ctxsw_buffer.size;
646 g->ops.gr.commit_global_pagepool(g, ch_ctx, addr, size, true);
647
648 addr = (u64_lo32(gr_ctx->t18x.spill_ctxsw_buffer.gpu_va) >>
649 gr_gpc0_swdx_rm_spill_buffer_addr_39_8_align_bits_v()) |
650 (u64_hi32(gr_ctx->t18x.pagepool_ctxsw_buffer.gpu_va) <<
651 (32 - gr_gpc0_swdx_rm_spill_buffer_addr_39_8_align_bits_v()));
652
653 gr_gk20a_ctx_patch_write(g, ch_ctx,
654 gr_gpc0_swdx_rm_spill_buffer_addr_r(),
655 gr_gpc0_swdx_rm_spill_buffer_addr_39_8_f(addr),
656 true);
657 gr_gk20a_ctx_patch_write(g, ch_ctx,
658 gr_gpc0_swdx_rm_spill_buffer_size_r(),
659 gr_gpc0_swdx_rm_spill_buffer_size_256b_f(addr),
660 true);
661
662 cbes_reserve = gr_gpcs_swdx_beta_cb_ctrl_cbes_reserve_gfxp_v();
663 gr_gk20a_ctx_patch_write(g, ch_ctx,
664 gr_gpcs_swdx_beta_cb_ctrl_r(),
665 gr_gpcs_swdx_beta_cb_ctrl_cbes_reserve_f(
666 cbes_reserve),
667 true);
668 gr_gk20a_ctx_patch_write(g, ch_ctx,
669 gr_gpcs_ppcs_cbm_beta_cb_ctrl_r(),
670 gr_gpcs_ppcs_cbm_beta_cb_ctrl_cbes_reserve_f(
671 cbes_reserve),
672 true);
673
674 gr_gk20a_ctx_patch_write_end(g, ch_ctx);
675 }
676
677 gk20a_dbg_fn("done");
678}
679
476void gp10b_init_gr(struct gpu_ops *gops) 680void gp10b_init_gr(struct gpu_ops *gops)
477{ 681{
478 gm20b_init_gr(gops); 682 gm20b_init_gr(gops);
@@ -481,7 +685,7 @@ void gp10b_init_gr(struct gpu_ops *gops)
481 gops->gr.commit_global_pagepool = gr_gp10b_commit_global_pagepool; 685 gops->gr.commit_global_pagepool = gr_gp10b_commit_global_pagepool;
482 gops->gr.add_zbc_color = gr_gp10b_add_zbc_color; 686 gops->gr.add_zbc_color = gr_gp10b_add_zbc_color;
483 gops->gr.add_zbc_depth = gr_gp10b_add_zbc_depth; 687 gops->gr.add_zbc_depth = gr_gp10b_add_zbc_depth;
484 gops->gr.buffer_size_defaults = gr_gp10b_buffer_size_defaults; 688 gops->gr.pagepool_default_size = gr_gp10b_pagepool_default_size;
485 gops->gr.calc_global_ctx_buffer_size = 689 gops->gr.calc_global_ctx_buffer_size =
486 gr_gp10b_calc_global_ctx_buffer_size; 690 gr_gp10b_calc_global_ctx_buffer_size;
487 gops->gr.handle_sw_method = gr_gp10b_handle_sw_method; 691 gops->gr.handle_sw_method = gr_gp10b_handle_sw_method;
@@ -490,4 +694,9 @@ void gp10b_init_gr(struct gpu_ops *gops)
490 gr_gp10b_set_alpha_circular_buffer_size; 694 gr_gp10b_set_alpha_circular_buffer_size;
491 gops->gr.set_circular_buffer_size = 695 gops->gr.set_circular_buffer_size =
492 gr_gp10b_set_circular_buffer_size; 696 gr_gp10b_set_circular_buffer_size;
697 gops->gr.init_ctx_state = gr_gp10b_init_ctx_state;
698 gops->gr.alloc_gr_ctx = gr_gp10b_alloc_gr_ctx;
699 gops->gr.free_gr_ctx = gr_gp10b_free_gr_ctx;
700 gops->gr.update_ctxsw_preemption_mode =
701 gr_gp10b_update_ctxsw_preemption_mode;
493} 702}