summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
diff options
context:
space:
mode:
authorSupriya <ssharatkumar@nvidia.com>2014-10-27 08:01:04 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:11:56 -0400
commiteb690cb391ca0578a2c086eff5085f16c32f651e (patch)
treeeaa7ba386296c52a3ded108ca53418b5a91cf8ae /drivers/gpu/nvgpu/gm20b/acr_gm20b.c
parent8c6a9fd1151299697037d58f33cfa306d8ac5d87 (diff)
gpu: nvgpu: Changes to support LS sig
Support added to send PMU and FECS signatures to ACR ucode Bug 200046413 Change-Id: Ie1babb640be20a697ad4d6dd18bd11161edb263c Signed-off-by: Vijayakumar <vsubbu@nvidia.com> Signed-off-by: Supriya <ssharatkumar@nvidia.com> Signed-off-by: Vijayakumar <vsubbu@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b/acr_gm20b.c')
-rw-r--r--drivers/gpu/nvgpu/gm20b/acr_gm20b.c88
1 files changed, 68 insertions, 20 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
index acfcf41b..50b495a6 100644
--- a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
@@ -81,7 +81,7 @@ void gm20b_init_secure_pmu(struct gpu_ops *gops)
81 81
82int pmu_ucode_details(struct gk20a *g, struct flcn_ucode_img *p_img) 82int pmu_ucode_details(struct gk20a *g, struct flcn_ucode_img *p_img)
83{ 83{
84 const struct firmware *pmu_fw, *pmu_desc; 84 const struct firmware *pmu_fw, *pmu_desc, *pmu_sig;
85 struct pmu_gk20a *pmu = &g->pmu; 85 struct pmu_gk20a *pmu = &g->pmu;
86 struct lsf_ucode_desc *lsf_desc; 86 struct lsf_ucode_desc *lsf_desc;
87 int err; 87 int err;
@@ -89,7 +89,6 @@ int pmu_ucode_details(struct gk20a *g, struct flcn_ucode_img *p_img)
89 pmu_fw = gk20a_request_firmware(g, GM20B_PMU_UCODE_IMAGE); 89 pmu_fw = gk20a_request_firmware(g, GM20B_PMU_UCODE_IMAGE);
90 if (!pmu_fw) { 90 if (!pmu_fw) {
91 gk20a_err(dev_from_gk20a(g), "failed to load pmu ucode!!"); 91 gk20a_err(dev_from_gk20a(g), "failed to load pmu ucode!!");
92 gm20b_dbg_pmu("requesting PMU ucode in GM20B failed\n");
93 return -ENOENT; 92 return -ENOENT;
94 } 93 }
95 g->acr.pmu_fw = pmu_fw; 94 g->acr.pmu_fw = pmu_fw;
@@ -99,10 +98,15 @@ int pmu_ucode_details(struct gk20a *g, struct flcn_ucode_img *p_img)
99 pmu_desc = gk20a_request_firmware(g, GM20B_PMU_UCODE_DESC); 98 pmu_desc = gk20a_request_firmware(g, GM20B_PMU_UCODE_DESC);
100 if (!pmu_desc) { 99 if (!pmu_desc) {
101 gk20a_err(dev_from_gk20a(g), "failed to load pmu ucode desc!!"); 100 gk20a_err(dev_from_gk20a(g), "failed to load pmu ucode desc!!");
102 gm20b_dbg_pmu("requesting PMU ucode in GM20B failed\n");
103 err = -ENOENT; 101 err = -ENOENT;
104 goto release_img_fw; 102 goto release_img_fw;
105 } 103 }
104 pmu_sig = gk20a_request_firmware(g, GM20B_PMU_UCODE_SIG);
105 if (!pmu_sig) {
106 gk20a_err(dev_from_gk20a(g), "failed to load pmu sig!!");
107 err = -ENOENT;
108 goto release_desc;
109 }
106 pmu->desc = (struct pmu_ucode_desc *)pmu_desc->data; 110 pmu->desc = (struct pmu_ucode_desc *)pmu_desc->data;
107 pmu->ucode_image = (u32 *)pmu_fw->data; 111 pmu->ucode_image = (u32 *)pmu_fw->data;
108 g->acr.pmu_desc = pmu_desc; 112 g->acr.pmu_desc = pmu_desc;
@@ -116,8 +120,9 @@ int pmu_ucode_details(struct gk20a *g, struct flcn_ucode_img *p_img)
116 lsf_desc = kzalloc(sizeof(struct lsf_ucode_desc), GFP_KERNEL); 120 lsf_desc = kzalloc(sizeof(struct lsf_ucode_desc), GFP_KERNEL);
117 if (!lsf_desc) { 121 if (!lsf_desc) {
118 err = -ENOMEM; 122 err = -ENOMEM;
119 goto release_desc; 123 goto release_sig;
120 } 124 }
125 memcpy(lsf_desc, (void *)pmu_sig->data, sizeof(struct lsf_ucode_desc));
121 lsf_desc->falcon_id = LSF_FALCON_ID_PMU; 126 lsf_desc->falcon_id = LSF_FALCON_ID_PMU;
122 127
123 p_img->desc = pmu->desc; 128 p_img->desc = pmu->desc;
@@ -127,7 +132,10 @@ int pmu_ucode_details(struct gk20a *g, struct flcn_ucode_img *p_img)
127 p_img->header = NULL; 132 p_img->header = NULL;
128 p_img->lsf_desc = (struct lsf_ucode_desc *)lsf_desc; 133 p_img->lsf_desc = (struct lsf_ucode_desc *)lsf_desc;
129 gm20b_dbg_pmu("requesting PMU ucode in GM20B exit\n"); 134 gm20b_dbg_pmu("requesting PMU ucode in GM20B exit\n");
135 release_firmware(pmu_sig);
130 return 0; 136 return 0;
137release_sig:
138 release_firmware(pmu_sig);
131release_desc: 139release_desc:
132 release_firmware(pmu_desc); 140 release_firmware(pmu_desc);
133release_img_fw: 141release_img_fw:
@@ -138,41 +146,54 @@ release_img_fw:
138int fecs_ucode_details(struct gk20a *g, struct flcn_ucode_img *p_img) 146int fecs_ucode_details(struct gk20a *g, struct flcn_ucode_img *p_img)
139{ 147{
140 struct lsf_ucode_desc *lsf_desc; 148 struct lsf_ucode_desc *lsf_desc;
149 const struct firmware *fecs_sig;
150 int err;
141 151
152 fecs_sig = gk20a_request_firmware(g, GM20B_FECS_UCODE_SIG);
153 if (!fecs_sig) {
154 gk20a_err(dev_from_gk20a(g), "failed to load fecs sig");
155 return -ENOENT;
156 }
142 lsf_desc = kzalloc(sizeof(struct lsf_ucode_desc), GFP_KERNEL); 157 lsf_desc = kzalloc(sizeof(struct lsf_ucode_desc), GFP_KERNEL);
143 if (!lsf_desc) 158 if (!lsf_desc) {
144 return -ENOMEM; 159 err = -ENOMEM;
160 goto rel_sig;
161 }
162 memcpy(lsf_desc, (void *)fecs_sig->data, sizeof(struct lsf_ucode_desc));
145 lsf_desc->falcon_id = LSF_FALCON_ID_FECS; 163 lsf_desc->falcon_id = LSF_FALCON_ID_FECS;
146 164
147 p_img->desc = kzalloc(sizeof(struct pmu_ucode_desc), GFP_KERNEL); 165 p_img->desc = kzalloc(sizeof(struct pmu_ucode_desc), GFP_KERNEL);
148 if (p_img->desc == NULL) { 166 if (p_img->desc == NULL) {
149 kfree(lsf_desc); 167 kfree(lsf_desc);
150 return -ENOMEM; 168 err = -ENOMEM;
169 goto free_lsf_desc;
151 } 170 }
152 171
153 p_img->desc->bootloader_start_offset = 172 p_img->desc->bootloader_start_offset =
154 g->ctxsw_ucode_info.fecs.boot.offset; 173 g->ctxsw_ucode_info.fecs.boot.offset;
155 p_img->desc->bootloader_size = 174 p_img->desc->bootloader_size =
156 g->ctxsw_ucode_info.fecs.boot.size; 175 ALIGN(g->ctxsw_ucode_info.fecs.boot.size, 256);
157 p_img->desc->bootloader_imem_offset = 176 p_img->desc->bootloader_imem_offset =
158 g->ctxsw_ucode_info.fecs.boot_imem_offset; 177 g->ctxsw_ucode_info.fecs.boot_imem_offset;
159 p_img->desc->bootloader_entry_point = 178 p_img->desc->bootloader_entry_point =
160 g->ctxsw_ucode_info.fecs.boot_entry; 179 g->ctxsw_ucode_info.fecs.boot_entry;
161 180
162 p_img->desc->image_size = g->ctxsw_ucode_info.fecs.boot.size + 181 p_img->desc->image_size =
163 g->ctxsw_ucode_info.fecs.code.size + 182 ALIGN(g->ctxsw_ucode_info.fecs.boot.size, 256) +
164 g->ctxsw_ucode_info.fecs.data.size; 183 ALIGN(g->ctxsw_ucode_info.fecs.code.size, 256) +
165 p_img->desc->app_size = 0; 184 ALIGN(g->ctxsw_ucode_info.fecs.data.size, 256);
166 p_img->desc->app_start_offset = 0; 185 p_img->desc->app_size = ALIGN(g->ctxsw_ucode_info.fecs.code.size, 256) +
186 ALIGN(g->ctxsw_ucode_info.fecs.data.size, 256);
187 p_img->desc->app_start_offset = g->ctxsw_ucode_info.fecs.code.offset;
167 p_img->desc->app_imem_offset = 0; 188 p_img->desc->app_imem_offset = 0;
168 p_img->desc->app_imem_entry = 0; 189 p_img->desc->app_imem_entry = 0;
169 p_img->desc->app_dmem_offset = 0; 190 p_img->desc->app_dmem_offset = 0;
170 p_img->desc->app_resident_code_offset = 191 p_img->desc->app_resident_code_offset = 0;
171 g->ctxsw_ucode_info.fecs.code.offset;
172 p_img->desc->app_resident_code_size = 192 p_img->desc->app_resident_code_size =
173 g->ctxsw_ucode_info.fecs.code.size; 193 g->ctxsw_ucode_info.fecs.code.size;
174 p_img->desc->app_resident_data_offset = 194 p_img->desc->app_resident_data_offset =
175 g->ctxsw_ucode_info.fecs.data.offset; 195 g->ctxsw_ucode_info.fecs.data.offset -
196 g->ctxsw_ucode_info.fecs.code.offset;
176 p_img->desc->app_resident_data_size = 197 p_img->desc->app_resident_data_size =
177 g->ctxsw_ucode_info.fecs.data.size; 198 g->ctxsw_ucode_info.fecs.data.size;
178 p_img->data = g->ctxsw_ucode_info.surface_desc.cpuva; 199 p_img->data = g->ctxsw_ucode_info.surface_desc.cpuva;
@@ -181,8 +202,14 @@ int fecs_ucode_details(struct gk20a *g, struct flcn_ucode_img *p_img)
181 p_img->fw_ver = NULL; 202 p_img->fw_ver = NULL;
182 p_img->header = NULL; 203 p_img->header = NULL;
183 p_img->lsf_desc = (struct lsf_ucode_desc *)lsf_desc; 204 p_img->lsf_desc = (struct lsf_ucode_desc *)lsf_desc;
184 gm20b_dbg_pmu("fecs fw loaded 2\n"); 205 gm20b_dbg_pmu("fecs fw loaded\n");
206 release_firmware(fecs_sig);
185 return 0; 207 return 0;
208free_lsf_desc:
209 kfree(lsf_desc);
210rel_sig:
211 release_firmware(fecs_sig);
212 return err;
186} 213}
187 214
188int prepare_ucode_blob(struct gk20a *g) 215int prepare_ucode_blob(struct gk20a *g)
@@ -411,7 +438,7 @@ int flcn_populate_bl_dmem_desc(struct gk20a *g,
411 438
412 struct flcn_ucode_img *p_img = &(lsfm->ucode_img); 439 struct flcn_ucode_img *p_img = &(lsfm->ucode_img);
413 struct flcn_bl_dmem_desc *ldr_cfg = 440 struct flcn_bl_dmem_desc *ldr_cfg =
414 (struct flcn_bl_dmem_desc *)(&p_bl_gen_desc->loader_cfg); 441 (struct flcn_bl_dmem_desc *)(&p_bl_gen_desc->bl_dmem_desc);
415 u64 addr_base; 442 u64 addr_base;
416 struct pmu_ucode_desc *desc; 443 struct pmu_ucode_desc *desc;
417 u64 addr_code, addr_data; 444 u64 addr_code, addr_data;
@@ -580,7 +607,7 @@ static int lsfm_init_wpr_contents(struct gk20a *g, struct ls_flcn_mgr *plsfm,
580 607
581 /* Tag the terminator WPR header with an invalid falcon ID. */ 608 /* Tag the terminator WPR header with an invalid falcon ID. */
582 gk20a_mem_wr32(&wpr_hdr[plsfm->managed_flcn_cnt].falcon_id, 609 gk20a_mem_wr32(&wpr_hdr[plsfm->managed_flcn_cnt].falcon_id,
583 1, LSF_FALCON_ID_INVALID); 610 0, LSF_FALCON_ID_INVALID);
584 } 611 }
585 return status; 612 return status;
586} 613}
@@ -635,6 +662,7 @@ static void lsfm_fill_static_lsb_hdr_info(struct gk20a *g,
635{ 662{
636 663
637 struct pmu_gk20a *pmu = &g->pmu; 664 struct pmu_gk20a *pmu = &g->pmu;
665 u32 full_app_size = 0;
638 u32 data = 0; 666 u32 data = 0;
639 667
640 if (pnode->ucode_img.lsf_desc) 668 if (pnode->ucode_img.lsf_desc)
@@ -669,11 +697,30 @@ static void lsfm_fill_static_lsb_hdr_info(struct gk20a *g,
669 pnode->lsb_header.bl_code_size = ALIGN( 697 pnode->lsb_header.bl_code_size = ALIGN(
670 pnode->ucode_img.desc->bootloader_size, 698 pnode->ucode_img.desc->bootloader_size,
671 LSF_BL_CODE_SIZE_ALIGNMENT); 699 LSF_BL_CODE_SIZE_ALIGNMENT);
700 full_app_size = ALIGN(pnode->ucode_img.desc->app_size,
701 LSF_BL_CODE_SIZE_ALIGNMENT) +
702 pnode->lsb_header.bl_code_size;
703 pnode->lsb_header.ucode_size = ALIGN(
704 pnode->ucode_img.desc->app_resident_data_offset,
705 LSF_BL_CODE_SIZE_ALIGNMENT) +
706 pnode->lsb_header.bl_code_size;
707 pnode->lsb_header.data_size = full_app_size -
708 pnode->lsb_header.ucode_size;
672 /* Though the BL is located at 0th offset of the image, the VA 709 /* Though the BL is located at 0th offset of the image, the VA
673 is different to make sure that it doesnt collide the actual OS 710 is different to make sure that it doesnt collide the actual OS
674 VA range */ 711 VA range */
675 pnode->lsb_header.bl_imem_off = 712 pnode->lsb_header.bl_imem_off =
676 pnode->ucode_img.desc->bootloader_imem_offset; 713 pnode->ucode_img.desc->bootloader_imem_offset;
714 pnode->lsb_header.app_code_off =
715 pnode->ucode_img.desc->app_start_offset +
716 pnode->ucode_img.desc->app_resident_code_offset;
717 pnode->lsb_header.app_code_size =
718 pnode->ucode_img.desc->app_resident_code_size;
719 pnode->lsb_header.app_data_off =
720 pnode->ucode_img.desc->app_start_offset +
721 pnode->ucode_img.desc->app_resident_data_offset;
722 pnode->lsb_header.app_data_size =
723 pnode->ucode_img.desc->app_resident_data_size;
677 724
678 /* TODO: OBJFLCN should export properties using which the below 725 /* TODO: OBJFLCN should export properties using which the below
679 flags should be populated.*/ 726 flags should be populated.*/
@@ -974,7 +1021,8 @@ err_release_acr_fw:
974 1021
975u8 pmu_is_debug_mode_en(struct gk20a *g) 1022u8 pmu_is_debug_mode_en(struct gk20a *g)
976{ 1023{
977 return 1; 1024 u32 ctl_stat = gk20a_readl(g, pwr_pmu_scpctl_stat_r());
1025 return pwr_pmu_scpctl_stat_debug_mode_v(ctl_stat);
978} 1026}
979 1027
980/* 1028/*