summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2015-04-21 16:17:03 -0400
committerIshan Mittal <imittal@nvidia.com>2015-05-18 02:01:31 -0400
commit3090ace7937e38513c421426f1066836ef55877e (patch)
tree188c2712c23195cade1db25325d02a897e5814b2 /drivers/gpu/nvgpu/gm20b/acr_gm20b.c
parent539fc07012a606c7118b120c13e66fb05218daee (diff)
gpu: nvgpu: Do not leak ACR header
4b6f83704f054f5b21e05873fa5862c667a9992e tried to fix ACR related leak. It fell short, because the data structures related were local and thus the leak was not really fixed. This patch stores the ACR ucode blob in a global variable, which survives across rail gating. Change-Id: Iec3ac9d41156baa26048e079732568c0a95264f4 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/733732 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Alex Waterman <alexw@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b/acr_gm20b.c')
-rw-r--r--drivers/gpu/nvgpu/gm20b/acr_gm20b.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
index 1e07f139..2e33c3f0 100644
--- a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
@@ -216,7 +216,7 @@ int prepare_ucode_blob(struct gk20a *g)
216 struct ls_flcn_mgr lsfm_l, *plsfm; 216 struct ls_flcn_mgr lsfm_l, *plsfm;
217 struct pmu_gk20a *pmu = &g->pmu; 217 struct pmu_gk20a *pmu = &g->pmu;
218 218
219 if (g->acr.ucode_blob_start) { 219 if (g->acr.ucode_blob.cpu_va) {
220 /*Recovery case, we do not need to form 220 /*Recovery case, we do not need to form
221 non WPR blob of ucodes*/ 221 non WPR blob of ucodes*/
222 err = gk20a_init_pmu(pmu); 222 err = gk20a_init_pmu(pmu);
@@ -238,23 +238,20 @@ int prepare_ucode_blob(struct gk20a *g)
238 if (err) 238 if (err)
239 return err; 239 return err;
240 240
241 if (plsfm->managed_flcn_cnt && !plsfm->mem.cpu_va) { 241 if (plsfm->managed_flcn_cnt && !g->acr.ucode_blob.cpu_va) {
242 /* Generate WPR requirements*/ 242 /* Generate WPR requirements*/
243 err = lsf_gen_wpr_requirements(g, plsfm); 243 err = lsf_gen_wpr_requirements(g, plsfm);
244 if (err) 244 if (err)
245 return err; 245 return err;
246 246
247 /*Alloc memory to hold ucode blob contents*/ 247 /*Alloc memory to hold ucode blob contents*/
248 err = gk20a_gmmu_alloc(g, plsfm->wpr_size, &plsfm->mem); 248 err = gk20a_gmmu_alloc(g, plsfm->wpr_size, &g->acr.ucode_blob);
249 if (err) 249 if (err)
250 return err; 250 return err;
251 251
252 gm20b_dbg_pmu("managed LS falcon %d, WPR size %d bytes.\n", 252 gm20b_dbg_pmu("managed LS falcon %d, WPR size %d bytes.\n",
253 plsfm->managed_flcn_cnt, plsfm->wpr_size); 253 plsfm->managed_flcn_cnt, plsfm->wpr_size);
254 lsfm_init_wpr_contents(g, plsfm, plsfm->mem.cpu_va); 254 lsfm_init_wpr_contents(g, plsfm, g->acr.ucode_blob.cpu_va);
255 g->acr.ucode_blob_start = g->ops.mm.get_iova_addr(g,
256 plsfm->mem.sgt->sgl, 0);
257 g->acr.ucode_blob_size = plsfm->wpr_size;
258 } else { 255 } else {
259 gm20b_dbg_pmu("LSFM is managing no falcons.\n"); 256 gm20b_dbg_pmu("LSFM is managing no falcons.\n");
260 } 257 }
@@ -880,8 +877,8 @@ int gm20b_bootstrap_hs_flcn(struct gk20a *g)
880 u32 *acr_ucode_header_t210_load; 877 u32 *acr_ucode_header_t210_load;
881 u32 *acr_ucode_data_t210_load; 878 u32 *acr_ucode_data_t210_load;
882 879
883 start = acr->ucode_blob_start; 880 start = g->ops.mm.get_iova_addr(g, acr->ucode_blob.sgt->sgl, 0);
884 size = acr->ucode_blob_size; 881 size = acr->ucode_blob.size;
885 882
886 gm20b_dbg_pmu(""); 883 gm20b_dbg_pmu("");
887 884