summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a
diff options
context:
space:
mode:
authorVijayakumar <vsubbu@nvidia.com>2015-06-24 03:26:50 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2015-06-26 16:14:53 -0400
commit30d399de307befc4edc2b8ca66c36ad2440d34f1 (patch)
tree6e94200cc3f0c8d320de3c413ec471939990355c /drivers/gpu/nvgpu/gk20a
parent25b540e5c9b4febaa0aedc8cfe3b3fcf6cfd56b8 (diff)
gpu: nvgpu: load secure gpccs using dma
bug 200080684 use new cmd defined in ucode for loading GR falcons. flip PRIV load flag in lsb header to indicate using dma. use pmu msg as cmd completion for new cmd instead of polling fecs mailbox. also move check for using dma in non secure boot path to hal. Change-Id: I22582a705bd1ae0603f858e1fe200d72e6794a81 Signed-off-by: Vijayakumar <vsubbu@nvidia.com> Reviewed-on: http://git-master/r/761625 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h3
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c3
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c4
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.c1
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.h23
5 files changed, 31 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index d8e3586f..9a183e44 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -333,6 +333,7 @@ struct gpu_ops {
333 struct { 333 struct {
334 int (*get_netlist_name)(int index, char *name); 334 int (*get_netlist_name)(int index, char *name);
335 bool (*is_fw_defined)(void); 335 bool (*is_fw_defined)(void);
336 bool use_dma_for_fw_bootstrap;
336 } gr_ctx; 337 } gr_ctx;
337 struct { 338 struct {
338 bool (*support_sparse)(struct gk20a *g); 339 bool (*support_sparse)(struct gk20a *g);
@@ -383,7 +384,9 @@ struct gpu_ops {
383 int (*pmu_setup_hw_and_bootstrap)(struct gk20a *g); 384 int (*pmu_setup_hw_and_bootstrap)(struct gk20a *g);
384 int (*pmu_setup_elpg)(struct gk20a *g); 385 int (*pmu_setup_elpg)(struct gk20a *g);
385 int (*init_wpr_region)(struct gk20a *g); 386 int (*init_wpr_region)(struct gk20a *g);
387 int (*load_lsfalcon_ucode)(struct gk20a *g, u32 falconidmask);
386 u32 lspmuwprinitdone; 388 u32 lspmuwprinitdone;
389 u32 lsfloadedfalconid;
387 bool fecsbootstrapdone; 390 bool fecsbootstrapdone;
388 } pmu; 391 } pmu;
389 struct { 392 struct {
diff --git a/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c
index cd9a9fca..94dba7b6 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c
@@ -3,7 +3,7 @@
3 * 3 *
4 * GK20A Graphics Context 4 * GK20A Graphics Context
5 * 5 *
6 * Copyright (c) 2011-2014, NVIDIA CORPORATION. All rights reserved. 6 * Copyright (c) 2011-2015, NVIDIA CORPORATION. All rights reserved.
7 * 7 *
8 * This program is free software; you can redistribute it and/or modify it 8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License, 9 * under the terms and conditions of the GNU General Public License,
@@ -345,4 +345,5 @@ void gk20a_init_gr_ctx(struct gpu_ops *gops)
345{ 345{
346 gops->gr_ctx.get_netlist_name = gr_gk20a_get_netlist_name; 346 gops->gr_ctx.get_netlist_name = gr_gk20a_get_netlist_name;
347 gops->gr_ctx.is_fw_defined = gr_gk20a_is_firmware_defined; 347 gops->gr_ctx.is_fw_defined = gr_gk20a_is_firmware_defined;
348 gops->gr_ctx.use_dma_for_fw_bootstrap = true;
348} 349}
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index edd4c6c8..e232bf17 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -2128,7 +2128,7 @@ int gr_gk20a_load_ctxsw_ucode(struct gk20a *g)
2128 * In case bootloader is not supported, revert to the old way of 2128 * In case bootloader is not supported, revert to the old way of
2129 * loading gr ucode, without the faster bootstrap routine. 2129 * loading gr ucode, without the faster bootstrap routine.
2130 */ 2130 */
2131 if (g->gpu_characteristics.arch > NVGPU_GPU_ARCH_GM200) { 2131 if (!g->ops.gr_ctx.use_dma_for_fw_bootstrap) {
2132 gr_gk20a_load_falcon_dmem(g); 2132 gr_gk20a_load_falcon_dmem(g);
2133 gr_gk20a_load_falcon_imem(g); 2133 gr_gk20a_load_falcon_imem(g);
2134 gr_gk20a_start_falcon_ucode(g); 2134 gr_gk20a_start_falcon_ucode(g);
@@ -2161,7 +2161,7 @@ static int gr_gk20a_wait_ctxsw_ready(struct gk20a *g)
2161 return ret; 2161 return ret;
2162 } 2162 }
2163 2163
2164 if (!(g->gpu_characteristics.arch > NVGPU_GPU_ARCH_GM200)) 2164 if (g->ops.gr_ctx.use_dma_for_fw_bootstrap || g->ops.securegpccs)
2165 gk20a_writel(g, gr_fecs_current_ctx_r(), 2165 gk20a_writel(g, gr_fecs_current_ctx_r(),
2166 gr_fecs_current_ctx_valid_false_f()); 2166 gr_fecs_current_ctx_valid_false_f());
2167 2167
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
index 11322293..1f21555c 100644
--- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
@@ -2647,6 +2647,7 @@ void gk20a_init_pmu_ops(struct gpu_ops *gops)
2647 gops->pmu.pmu_setup_hw_and_bootstrap = gk20a_init_pmu_setup_hw1; 2647 gops->pmu.pmu_setup_hw_and_bootstrap = gk20a_init_pmu_setup_hw1;
2648 gops->pmu.pmu_setup_elpg = NULL; 2648 gops->pmu.pmu_setup_elpg = NULL;
2649 gops->pmu.init_wpr_region = NULL; 2649 gops->pmu.init_wpr_region = NULL;
2650 gops->pmu.load_lsfalcon_ucode = NULL;
2650} 2651}
2651 2652
2652int gk20a_init_pmu_support(struct gk20a *g) 2653int gk20a_init_pmu_support(struct gk20a *g)
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h
index f29c810e..85403767 100644
--- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h
@@ -304,6 +304,11 @@ enum {
304 GK20A_PMU_DMAIDX_END = 7 304 GK20A_PMU_DMAIDX_END = 7
305}; 305};
306 306
307struct falc_u64 {
308 u32 lo;
309 u32 hi;
310};
311
307struct falc_dma_addr { 312struct falc_dma_addr {
308 u32 dma_base; 313 u32 dma_base;
309 /*dma_base1 is 9-bit MSB for FB Base 314 /*dma_base1 is 9-bit MSB for FB Base
@@ -708,6 +713,8 @@ struct pmu_pg_cmd {
708enum { 713enum {
709 PMU_ACR_CMD_ID_INIT_WPR_REGION = 0x0 , 714 PMU_ACR_CMD_ID_INIT_WPR_REGION = 0x0 ,
710 PMU_ACR_CMD_ID_BOOTSTRAP_FALCON, 715 PMU_ACR_CMD_ID_BOOTSTRAP_FALCON,
716 PMU_ACR_CMD_ID_RESERVED,
717 PMU_ACR_CMD_ID_BOOTSTRAP_MULTIPLE_FALCONS,
711}; 718};
712 719
713/* 720/*
@@ -729,14 +736,27 @@ struct pmu_acr_cmd_bootstrap_falcon {
729 u32 falconid; 736 u32 falconid;
730}; 737};
731 738
739/*
740 * falcon ID to bootstrap
741 */
742struct pmu_acr_cmd_bootstrap_multiple_falcons {
743 u8 cmd_type;
744 u32 flags;
745 u32 falconidmask;
746 u32 usevamask;
747 struct falc_u64 wprvirtualbase;
748};
749
732#define PMU_ACR_CMD_BOOTSTRAP_FALCON_FLAGS_RESET_NO 1 750#define PMU_ACR_CMD_BOOTSTRAP_FALCON_FLAGS_RESET_NO 1
733#define PMU_ACR_CMD_BOOTSTRAP_FALCON_FLAGS_RESET_YES 0 751#define PMU_ACR_CMD_BOOTSTRAP_FALCON_FLAGS_RESET_YES 0
734 752
753
735struct pmu_acr_cmd { 754struct pmu_acr_cmd {
736 union { 755 union {
737 u8 cmd_type; 756 u8 cmd_type;
738 struct pmu_acr_cmd_bootstrap_falcon bootstrap_falcon; 757 struct pmu_acr_cmd_bootstrap_falcon bootstrap_falcon;
739 struct pmu_acr_cmd_init_wpr_details init_wpr; 758 struct pmu_acr_cmd_init_wpr_details init_wpr;
759 struct pmu_acr_cmd_bootstrap_multiple_falcons boot_falcons;
740 }; 760 };
741}; 761};
742 762
@@ -1177,6 +1197,7 @@ struct pmu_gk20a {
1177 /* TBD: remove this if ZBC seq is fixed */ 1197 /* TBD: remove this if ZBC seq is fixed */
1178 struct mem_desc seq_buf; 1198 struct mem_desc seq_buf;
1179 struct mem_desc trace_buf; 1199 struct mem_desc trace_buf;
1200 struct mem_desc wpr_buf;
1180 bool buf_loaded; 1201 bool buf_loaded;
1181 1202
1182 struct pmu_sha1_gid gid_info; 1203 struct pmu_sha1_gid gid_info;
@@ -1294,4 +1315,6 @@ int gk20a_aelpg_init_and_enable(struct gk20a *g, u8 ctrl_id);
1294void pmu_enable_irq(struct pmu_gk20a *pmu, bool enable); 1315void pmu_enable_irq(struct pmu_gk20a *pmu, bool enable);
1295int pmu_wait_message_cond(struct pmu_gk20a *pmu, u32 timeout, 1316int pmu_wait_message_cond(struct pmu_gk20a *pmu, u32 timeout,
1296 u32 *var, u32 val); 1317 u32 *var, u32 val);
1318void pmu_handle_fecs_boot_acr_msg(struct gk20a *g, struct pmu_msg *msg,
1319 void *param, u32 handle, u32 status);
1297#endif /*__PMU_GK20A_H__*/ 1320#endif /*__PMU_GK20A_H__*/