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/gk20a/gr_gk20a.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/gk20a/gr_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 89 |
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 | ||
1870 | static int gr_gk20a_init_ctxsw_ucode(struct gk20a *g) | 1870 | int 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 | ||
1995 | static void gr_gk20a_load_falcon_bind_instblk(struct gk20a *g) | 1995 | void 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 | ||
2152 | static int gr_gk20a_load_ctxsw_ucode(struct gk20a *g, struct gr_gk20a *gr) | 2152 | int 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 | |||
2182 | static 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 | ||
4452 | static int gk20a_init_gr_reset_enable_hw(struct gk20a *g) | 4460 | int 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 | |||
4479 | out: | ||
4480 | if (err) | ||
4481 | gk20a_err(dev_from_gk20a(g), "fail"); | ||
4482 | else | ||
4483 | gk20a_dbg_fn("done"); | ||
4484 | |||
4485 | return 0; | ||
4486 | } | ||
4487 | |||
4488 | int 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 | |||
4496 | out: | 4521 | out: |
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 | ||
4820 | int gk20a_gr_reset(struct gk20a *g) | 4841 | int 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 | |||
4860 | int 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 | } |