diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2014-06-23 02:56:45 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:10:18 -0400 |
commit | 20408d5b32e5564b2fb410bc5b0bb0a198629437 (patch) | |
tree | 965dac6015b8ab7f9865f79a07b0876025f63309 /drivers/gpu/nvgpu/gm20b/gr_gm20b.c | |
parent | b57c6501c75b478b08b9ea6e226c55e5039b5c86 (diff) |
gpu: nvgpu: Boot FECS to secure mode
Boot FECS to secure mode if ACR is enabled.
Bug 200006956
Change-Id: Ifc107704a6456af837b7f6c513c04d152b2f4d3a
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-on: http://git-master/r/424251
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b/gr_gm20b.c')
-rw-r--r-- | drivers/gpu/nvgpu/gm20b/gr_gm20b.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c index 2efb7228..ae7864df 100644 --- a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c | |||
@@ -655,6 +655,56 @@ static int gr_gm20b_load_ctxsw_ucode_segments(struct gk20a *g, u64 addr_base, | |||
655 | return 0; | 655 | return 0; |
656 | } | 656 | } |
657 | 657 | ||
658 | #ifdef CONFIG_TEGRA_ACR | ||
659 | static void gr_gm20b_load_gpccs_with_bootloader(struct gk20a *g) | ||
660 | { | ||
661 | struct gk20a_ctxsw_ucode_info *ucode_info = &g->ctxsw_ucode_info; | ||
662 | u64 addr_base = ucode_info->ucode_gpuva; | ||
663 | |||
664 | gr_gk20a_load_falcon_bind_instblk(g); | ||
665 | |||
666 | g->ops.gr.falcon_load_ucode(g, addr_base, | ||
667 | &g->ctxsw_ucode_info.gpccs, | ||
668 | gr_gpcs_gpccs_falcon_hwcfg_r() - | ||
669 | gr_fecs_falcon_hwcfg_r()); | ||
670 | } | ||
671 | |||
672 | static int gr_gm20b_load_ctxsw_ucode(struct gk20a *g) | ||
673 | { | ||
674 | struct gk20a_ctxsw_ucode_info *ucode_info = &g->ctxsw_ucode_info; | ||
675 | u64 addr_base = ucode_info->ucode_gpuva; | ||
676 | int i; | ||
677 | |||
678 | gk20a_dbg_fn(""); | ||
679 | |||
680 | if (tegra_platform_is_linsim()) { | ||
681 | gk20a_writel(g, gr_fecs_ctxsw_mailbox_r(7), | ||
682 | gr_fecs_ctxsw_mailbox_value_f(0xc0de7777)); | ||
683 | gk20a_writel(g, gr_gpccs_ctxsw_mailbox_r(7), | ||
684 | gr_gpccs_ctxsw_mailbox_value_f(0xc0de7777)); | ||
685 | } | ||
686 | |||
687 | gr_gk20a_load_falcon_bind_instblk(g); | ||
688 | g->ops.gr.falcon_load_ucode(g, addr_base, | ||
689 | &g->ctxsw_ucode_info.gpccs, | ||
690 | gr_gpcs_gpccs_falcon_hwcfg_r() - | ||
691 | gr_fecs_falcon_hwcfg_r()); | ||
692 | |||
693 | gk20a_writel(g, gr_fecs_ctxsw_mailbox_clear_r(0), 0x0); | ||
694 | gk20a_writel(g, gr_fecs_ctxsw_mailbox_r(1), 0x1); | ||
695 | gk20a_writel(g, gr_fecs_ctxsw_mailbox_clear_r(6), 0xffffffff); | ||
696 | |||
697 | gk20a_writel(g, gr_gpccs_dmactl_r(), gr_gpccs_dmactl_require_ctx_f(0)); | ||
698 | |||
699 | gk20a_writel(g, gr_gpccs_cpuctl_r(), gr_gpccs_cpuctl_startcpu_f(1)); | ||
700 | gk20a_writel(g, gr_fecs_cpuctl_alias_r(), gr_fecs_cpuctl_startcpu_f(1)); | ||
701 | |||
702 | gk20a_dbg_fn("done"); | ||
703 | |||
704 | return 0; | ||
705 | } | ||
706 | #endif | ||
707 | |||
658 | void gm20b_init_gr(struct gpu_ops *gops) | 708 | void gm20b_init_gr(struct gpu_ops *gops) |
659 | { | 709 | { |
660 | gops->gr.init_gpc_mmu = gr_gm20b_init_gpc_mmu; | 710 | gops->gr.init_gpc_mmu = gr_gm20b_init_gpc_mmu; |
@@ -676,4 +726,9 @@ void gm20b_init_gr(struct gpu_ops *gops) | |||
676 | gops->gr.init_fs_state = gr_gm20b_ctx_state_floorsweep; | 726 | gops->gr.init_fs_state = gr_gm20b_ctx_state_floorsweep; |
677 | gops->gr.set_hww_esr_report_mask = gr_gm20b_set_hww_esr_report_mask; | 727 | gops->gr.set_hww_esr_report_mask = gr_gm20b_set_hww_esr_report_mask; |
678 | gops->gr.falcon_load_ucode = gr_gm20b_load_ctxsw_ucode_segments; | 728 | gops->gr.falcon_load_ucode = gr_gm20b_load_ctxsw_ucode_segments; |
729 | #ifdef CONFIG_TEGRA_ACR | ||
730 | gops->gr.load_ctxsw_ucode = gr_gm20b_load_ctxsw_ucode; | ||
731 | #else | ||
732 | gops->gr.load_ctxsw_ucode = gr_gk20a_load_ctxsw_ucode; | ||
733 | #endif | ||
679 | } | 734 | } |