summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gp10b/pmu_gp10b.c
diff options
context:
space:
mode:
authorMahantesh Kumbar <mkumbar@nvidia.com>2016-05-23 07:01:45 -0400
committerDeepak Nibade <dnibade@nvidia.com>2016-12-27 04:56:16 -0500
commita549165e7332c7618a61fbe65b86bf212901fee2 (patch)
tree57fc55ede4878c5e9d41fd1534678973de3d3e89 /drivers/gpu/nvgpu/gp10b/pmu_gp10b.c
parent5bc7b40524e0cd30ae5a601ed685bc2d470b8d78 (diff)
gpu: nvgpu: secure boot HAL update
-And also enable GPCCS load using DMA Updated/added secure boot HAL with methods required to support multiple GPU chips. JIRA DNVGPU-10 Change-Id: Id4546fa74954ba7be7c4544d74ad2b7a31b0ecec Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com> Reviewed-on: http://git-master/r/1151788 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gp10b/pmu_gp10b.c')
-rw-r--r--drivers/gpu/nvgpu/gp10b/pmu_gp10b.c47
1 files changed, 43 insertions, 4 deletions
diff --git a/drivers/gpu/nvgpu/gp10b/pmu_gp10b.c b/drivers/gpu/nvgpu/gp10b/pmu_gp10b.c
index fca84116..ab736fbe 100644
--- a/drivers/gpu/nvgpu/gp10b/pmu_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/pmu_gp10b.c
@@ -156,7 +156,8 @@ static void gp10b_pmu_load_multiple_falcons(struct gk20a *g, u32 falconidmask,
156 cmd.cmd.acr.boot_falcons.flags = flags; 156 cmd.cmd.acr.boot_falcons.flags = flags;
157 cmd.cmd.acr.boot_falcons.falconidmask = 157 cmd.cmd.acr.boot_falcons.falconidmask =
158 falconidmask; 158 falconidmask;
159 cmd.cmd.acr.boot_falcons.usevamask = 0; 159 cmd.cmd.acr.boot_falcons.usevamask =
160 1 << LSF_FALCON_ID_GPCCS;
160 cmd.cmd.acr.boot_falcons.wprvirtualbase.lo = 161 cmd.cmd.acr.boot_falcons.wprvirtualbase.lo =
161 u64_lo32(g->pmu.wpr_buf.gpu_va); 162 u64_lo32(g->pmu.wpr_buf.gpu_va);
162 cmd.cmd.acr.boot_falcons.wprvirtualbase.hi = 163 cmd.cmd.acr.boot_falcons.wprvirtualbase.hi =
@@ -171,7 +172,7 @@ static void gp10b_pmu_load_multiple_falcons(struct gk20a *g, u32 falconidmask,
171 return; 172 return;
172} 173}
173 174
174static int gp10b_load_falcon_ucode(struct gk20a *g, u32 falconidmask) 175int gp10b_load_falcon_ucode(struct gk20a *g, u32 falconidmask)
175{ 176{
176 u32 flags = PMU_ACR_CMD_BOOTSTRAP_FALCON_FLAGS_RESET_YES; 177 u32 flags = PMU_ACR_CMD_BOOTSTRAP_FALCON_FLAGS_RESET_YES;
177 178
@@ -221,7 +222,7 @@ static void pmu_handle_gr_param_msg(struct gk20a *g, struct pmu_msg *msg,
221 return; 222 return;
222} 223}
223 224
224static int gp10b_pg_gr_init(struct gk20a *g, u8 grfeaturemask) 225int gp10b_pg_gr_init(struct gk20a *g, u8 grfeaturemask)
225{ 226{
226 struct pmu_gk20a *pmu = &g->pmu; 227 struct pmu_gk20a *pmu = &g->pmu;
227 struct pmu_cmd cmd; 228 struct pmu_cmd cmd;
@@ -280,7 +281,7 @@ static int gp10b_pmu_setup_elpg(struct gk20a *g)
280 return ret; 281 return ret;
281} 282}
282 283
283static void gp10b_write_dmatrfbase(struct gk20a *g, u32 addr) 284void gp10b_write_dmatrfbase(struct gk20a *g, u32 addr)
284{ 285{
285 gk20a_writel(g, pwr_falcon_dmatrfbase_r(), 286 gk20a_writel(g, pwr_falcon_dmatrfbase_r(),
286 addr); 287 addr);
@@ -396,12 +397,50 @@ static int send_ecc_overide_en_dis_cmd(struct gk20a *g, u32 bitmask)
396 return status; 397 return status;
397} 398}
398 399
400static bool gp10b_is_lazy_bootstrap(u32 falcon_id)
401{
402 bool enable_status = false;
403
404 switch (falcon_id) {
405 case LSF_FALCON_ID_FECS:
406 enable_status = false;
407 break;
408 case LSF_FALCON_ID_GPCCS:
409 enable_status = true;
410 break;
411 default:
412 break;
413 }
414
415 return enable_status;
416}
417
418static bool gp10b_is_priv_load(u32 falcon_id)
419{
420 bool enable_status = false;
421
422 switch (falcon_id) {
423 case LSF_FALCON_ID_FECS:
424 enable_status = false;
425 break;
426 case LSF_FALCON_ID_GPCCS:
427 enable_status = false;
428 break;
429 default:
430 break;
431 }
432
433 return enable_status;
434}
435
399void gp10b_init_pmu_ops(struct gpu_ops *gops) 436void gp10b_init_pmu_ops(struct gpu_ops *gops)
400{ 437{
401 if (gops->privsecurity) { 438 if (gops->privsecurity) {
402 gm20b_init_secure_pmu(gops); 439 gm20b_init_secure_pmu(gops);
403 gops->pmu.init_wpr_region = gm20b_pmu_init_acr; 440 gops->pmu.init_wpr_region = gm20b_pmu_init_acr;
404 gops->pmu.load_lsfalcon_ucode = gp10b_load_falcon_ucode; 441 gops->pmu.load_lsfalcon_ucode = gp10b_load_falcon_ucode;
442 gops->pmu.is_lazy_bootstrap = gp10b_is_lazy_bootstrap;
443 gops->pmu.is_priv_load = gp10b_is_priv_load;
405 } else { 444 } else {
406 gk20a_init_pmu_ops(gops); 445 gk20a_init_pmu_ops(gops);
407 gops->pmu.load_lsfalcon_ucode = NULL; 446 gops->pmu.load_lsfalcon_ucode = NULL;