diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gp10b/gr_gp10b.c')
-rw-r--r-- | drivers/gpu/nvgpu/gp10b/gr_gp10b.c | 221 |
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 | ||
25 | bool gr_gp10b_is_valid_class(struct gk20a *g, u32 class_num) | 26 | bool 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 | ||
300 | static void gr_gp10b_buffer_size_defaults(struct gk20a *g) | 301 | static 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 | ||
308 | static int gr_gp10b_calc_global_ctx_buffer_size(struct gk20a *g) | 306 | static 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 | ||
474 | static 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 | |||
511 | int 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 | |||
576 | fail_free_betacb: | ||
577 | gk20a_gmmu_unmap_free(vm, &(*gr_ctx)->t18x.betacb_ctxsw_buffer); | ||
578 | fail_free_spill: | ||
579 | gk20a_gmmu_unmap_free(vm, &(*gr_ctx)->t18x.spill_ctxsw_buffer); | ||
580 | fail_free_preempt: | ||
581 | gk20a_gmmu_unmap_free(vm, &(*gr_ctx)->t18x.preempt_ctxsw_buffer); | ||
582 | fail_free_gk20a_ctx: | ||
583 | gr_gk20a_free_gr_ctx(g, vm, *gr_ctx); | ||
584 | *gr_ctx = NULL; | ||
585 | |||
586 | return err; | ||
587 | } | ||
588 | |||
589 | static 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 | |||
606 | static 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 | |||
476 | void gp10b_init_gr(struct gpu_ops *gops) | 680 | void 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 | } |