summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/gr_gk20a.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/gk20a/gr_gk20a.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/gk20a/gr_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c89
1 files changed, 65 insertions, 24 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 4a6dd6c5..bd9476e4 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -1867,7 +1867,7 @@ static int gr_gk20a_copy_ctxsw_ucode_segments(
1867 return 0; 1867 return 0;
1868} 1868}
1869 1869
1870static int gr_gk20a_init_ctxsw_ucode(struct gk20a *g) 1870int gr_gk20a_init_ctxsw_ucode(struct gk20a *g)
1871{ 1871{
1872 struct device *d = dev_from_gk20a(g); 1872 struct device *d = dev_from_gk20a(g);
1873 struct mm_gk20a *mm = &g->mm; 1873 struct mm_gk20a *mm = &g->mm;
@@ -1992,7 +1992,7 @@ static int gr_gk20a_init_ctxsw_ucode(struct gk20a *g)
1992 return err; 1992 return err;
1993} 1993}
1994 1994
1995static void gr_gk20a_load_falcon_bind_instblk(struct gk20a *g) 1995void gr_gk20a_load_falcon_bind_instblk(struct gk20a *g)
1996{ 1996{
1997 struct gk20a_ctxsw_ucode_info *ucode_info = &g->ctxsw_ucode_info; 1997 struct gk20a_ctxsw_ucode_info *ucode_info = &g->ctxsw_ucode_info;
1998 int retries = 20; 1998 int retries = 20;
@@ -2149,9 +2149,8 @@ static void gr_gk20a_load_falcon_with_bootloader(struct gk20a *g)
2149 gr_fecs_falcon_hwcfg_r()); 2149 gr_fecs_falcon_hwcfg_r());
2150} 2150}
2151 2151
2152static int gr_gk20a_load_ctxsw_ucode(struct gk20a *g, struct gr_gk20a *gr) 2152int gr_gk20a_load_ctxsw_ucode(struct gk20a *g)
2153{ 2153{
2154 u32 ret;
2155 2154
2156 gk20a_dbg_fn(""); 2155 gk20a_dbg_fn("");
2157 2156
@@ -2171,11 +2170,20 @@ static int gr_gk20a_load_ctxsw_ucode(struct gk20a *g, struct gr_gk20a *gr)
2171 gr_gk20a_load_falcon_imem(g); 2170 gr_gk20a_load_falcon_imem(g);
2172 gr_gk20a_start_falcon_ucode(g); 2171 gr_gk20a_start_falcon_ucode(g);
2173 } else { 2172 } else {
2174 if (!gr->skip_ucode_init) 2173 if (!g->gr.skip_ucode_init)
2175 gr_gk20a_init_ctxsw_ucode(g); 2174 gr_gk20a_init_ctxsw_ucode(g);
2176 gr_gk20a_load_falcon_with_bootloader(g); 2175 gr_gk20a_load_falcon_with_bootloader(g);
2177 gr->skip_ucode_init = true; 2176 g->gr.skip_ucode_init = true;
2178 } 2177 }
2178 gk20a_dbg_fn("done");
2179 return 0;
2180}
2181
2182static int gr_gk20a_wait_ctxsw_ready(struct gk20a *g)
2183{
2184 u32 ret;
2185
2186 gk20a_dbg_fn("");
2179 2187
2180 ret = gr_gk20a_ctx_wait_ucode(g, 0, 0, 2188 ret = gr_gk20a_ctx_wait_ucode(g, 0, 0,
2181 GR_IS_UCODE_OP_EQUAL, 2189 GR_IS_UCODE_OP_EQUAL,
@@ -4449,9 +4457,36 @@ static int gr_gk20a_wait_mem_scrubbing(struct gk20a *g)
4449 return -ETIMEDOUT; 4457 return -ETIMEDOUT;
4450} 4458}
4451 4459
4452static int gk20a_init_gr_reset_enable_hw(struct gk20a *g) 4460int gr_gk20a_init_ctxsw(struct gk20a *g)
4453{ 4461{
4454 struct gr_gk20a *gr = &g->gr; 4462 struct gr_gk20a *gr = &g->gr;
4463 u32 err = 0;
4464
4465 err = g->ops.gr.load_ctxsw_ucode(g);
4466 if (err)
4467 goto out;
4468
4469 err = gr_gk20a_wait_ctxsw_ready(g);
4470 if (err)
4471 goto out;
4472
4473 /* this appears query for sw states but fecs actually init
4474 ramchain, etc so this is hw init */
4475 err = gr_gk20a_init_ctx_state(g, gr);
4476 if (err)
4477 goto out;
4478
4479out:
4480 if (err)
4481 gk20a_err(dev_from_gk20a(g), "fail");
4482 else
4483 gk20a_dbg_fn("done");
4484
4485 return 0;
4486}
4487
4488int gk20a_init_gr_reset_enable_hw(struct gk20a *g)
4489{
4455 struct av_list_gk20a *sw_non_ctx_load = &g->gr.ctx_vars.sw_non_ctx_load; 4490 struct av_list_gk20a *sw_non_ctx_load = &g->gr.ctx_vars.sw_non_ctx_load;
4456 unsigned long end_jiffies = jiffies + 4491 unsigned long end_jiffies = jiffies +
4457 msecs_to_jiffies(gk20a_get_gr_idle_timeout(g)); 4492 msecs_to_jiffies(gk20a_get_gr_idle_timeout(g));
@@ -4483,16 +4518,6 @@ static int gk20a_init_gr_reset_enable_hw(struct gk20a *g)
4483 if (err) 4518 if (err)
4484 goto out; 4519 goto out;
4485 4520
4486 err = gr_gk20a_load_ctxsw_ucode(g, gr);
4487 if (err)
4488 goto out;
4489
4490 /* this appears query for sw states but fecs actually init
4491 ramchain, etc so this is hw init */
4492 err = gr_gk20a_init_ctx_state(g, gr);
4493 if (err)
4494 goto out;
4495
4496out: 4521out:
4497 if (err) 4522 if (err)
4498 gk20a_err(dev_from_gk20a(g), "fail"); 4523 gk20a_err(dev_from_gk20a(g), "fail");
@@ -4624,14 +4649,10 @@ int gk20a_init_gr_support(struct gk20a *g)
4624 4649
4625 gk20a_dbg_fn(""); 4650 gk20a_dbg_fn("");
4626 4651
4627 err = gk20a_init_gr_prepare(g);
4628 if (err)
4629 return err;
4630
4631 /* this is required before gr_gk20a_init_ctx_state */ 4652 /* this is required before gr_gk20a_init_ctx_state */
4632 mutex_init(&g->gr.fecs_mutex); 4653 mutex_init(&g->gr.fecs_mutex);
4633 4654
4634 err = gk20a_init_gr_reset_enable_hw(g); 4655 err = gr_gk20a_init_ctxsw(g);
4635 if (err) 4656 if (err)
4636 return err; 4657 return err;
4637 4658
@@ -4817,10 +4838,11 @@ static void gk20a_gr_set_alpha_circular_buffer_size(struct gk20a *g, u32 data)
4817 } 4838 }
4818} 4839}
4819 4840
4820int gk20a_gr_reset(struct gk20a *g) 4841int gk20a_enable_gr_hw(struct gk20a *g)
4821{ 4842{
4822 int err; 4843 int err;
4823 u32 size; 4844
4845 gk20a_dbg_fn("");
4824 4846
4825 err = gk20a_init_gr_prepare(g); 4847 err = gk20a_init_gr_prepare(g);
4826 if (err) 4848 if (err)
@@ -4830,10 +4852,28 @@ int gk20a_gr_reset(struct gk20a *g)
4830 if (err) 4852 if (err)
4831 return err; 4853 return err;
4832 4854
4855 gk20a_dbg_fn("done");
4856
4857 return 0;
4858}
4859
4860int gk20a_gr_reset(struct gk20a *g)
4861{
4862 int err;
4863 u32 size;
4864
4865 err = gk20a_enable_gr_hw(g);
4866 if (err)
4867 return err;
4868
4833 err = gk20a_init_gr_setup_hw(g); 4869 err = gk20a_init_gr_setup_hw(g);
4834 if (err) 4870 if (err)
4835 return err; 4871 return err;
4836 4872
4873 err = gr_gk20a_init_ctxsw(g);
4874 if (err)
4875 return err;
4876
4837 size = 0; 4877 size = 0;
4838 err = gr_gk20a_fecs_get_reglist_img_size(g, &size); 4878 err = gr_gk20a_fecs_get_reglist_img_size(g, &size);
4839 if (err) { 4879 if (err) {
@@ -6934,4 +6974,5 @@ void gk20a_init_gr_ops(struct gpu_ops *gops)
6934 gops->gr.set_hww_esr_report_mask = gr_gk20a_set_hww_esr_report_mask; 6974 gops->gr.set_hww_esr_report_mask = gr_gk20a_set_hww_esr_report_mask;
6935 gops->gr.setup_alpha_beta_tables = gr_gk20a_setup_alpha_beta_tables; 6975 gops->gr.setup_alpha_beta_tables = gr_gk20a_setup_alpha_beta_tables;
6936 gops->gr.falcon_load_ucode = gr_gk20a_load_ctxsw_ucode_segments; 6976 gops->gr.falcon_load_ucode = gr_gk20a_load_ctxsw_ucode_segments;
6977 gops->gr.load_ctxsw_ucode = gr_gk20a_load_ctxsw_ucode;
6937} 6978}