summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gm20b/gr_gm20b.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2014-06-23 02:56:45 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:10:18 -0400
commit20408d5b32e5564b2fb410bc5b0bb0a198629437 (patch)
tree965dac6015b8ab7f9865f79a07b0876025f63309 /drivers/gpu/nvgpu/gm20b/gr_gm20b.c
parentb57c6501c75b478b08b9ea6e226c55e5039b5c86 (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.c55
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
659static 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
672static 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
658void gm20b_init_gr(struct gpu_ops *gops) 708void 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}