summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAlex Waterman <alexw@nvidia.com>2017-05-08 17:54:37 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-05-11 17:39:35 -0400
commit14571dc67f8e27818a84a1cbfb6b0fccac677606 (patch)
tree757a0177a2ada49a91ce7645c280526d85c409d2 /drivers/gpu
parent8bf6186b82ad484151003943a98ccac2ef8e2f54 (diff)
gpu: nvgpu: Fix mem-API usage bug in ACR
The __nvgpu_mem_create_from_pages() API takes a number of pages from which to create a buffer. In the ACR code only 1 page was passed. If the WPR region (what the ACR code creates an nvgpu_mem from) is larger than 1 page then the current code will truncate that region down to only a single page. Change-Id: I11833619c4f35a076f72071cc5b98ae2d192c5d0 Signed-off-by: Alex Waterman <alexw@nvidia.com> Reviewed-on: http://git-master/r/1477672 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/nvgpu/gm20b/acr_gm20b.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
index 7c56c4cc..98d1a34d 100644
--- a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c
@@ -383,12 +383,13 @@ int prepare_ucode_blob(struct gk20a *g)
383 int err; 383 int err;
384 struct ls_flcn_mgr lsfm_l, *plsfm; 384 struct ls_flcn_mgr lsfm_l, *plsfm;
385 struct pmu_gk20a *pmu = &g->pmu; 385 struct pmu_gk20a *pmu = &g->pmu;
386 phys_addr_t wpr_addr; 386 phys_addr_t wpr_addr, wpr_page;
387 u32 wprsize; 387 u32 wprsize;
388 int i;
388 struct mm_gk20a *mm = &g->mm; 389 struct mm_gk20a *mm = &g->mm;
389 struct vm_gk20a *vm = &mm->pmu.vm; 390 struct vm_gk20a *vm = &mm->pmu.vm;
390 struct wpr_carveout_info wpr_inf; 391 struct wpr_carveout_info wpr_inf;
391 struct page *page; 392 struct page **pages;
392 393
393 if (g->acr.ucode_blob.cpu_va) { 394 if (g->acr.ucode_blob.cpu_va) {
394 /*Recovery case, we do not need to form 395 /*Recovery case, we do not need to form
@@ -412,8 +413,17 @@ int prepare_ucode_blob(struct gk20a *g)
412 gm20b_dbg_pmu("wpr carveout base:%llx\n", wpr_inf.wpr_base); 413 gm20b_dbg_pmu("wpr carveout base:%llx\n", wpr_inf.wpr_base);
413 gm20b_dbg_pmu("wpr carveout size :%x\n", wprsize); 414 gm20b_dbg_pmu("wpr carveout size :%x\n", wprsize);
414 415
415 page = phys_to_page(wpr_addr); 416 pages = nvgpu_kmalloc(g, sizeof(struct page *) * (wprsize / PAGE_SIZE));
416 __nvgpu_mem_create_from_pages(g, &g->pmu.wpr_buf, &page, 1); 417 if (!pages)
418 return -ENOMEM;
419
420 wpr_page = wpr_addr;
421 for (i = 0; wpr_page < (wpr_addr + wprsize); i++, wpr_page += PAGE_SIZE)
422 pages[i] = phys_to_page(wpr_page);
423 __nvgpu_mem_create_from_pages(g, &g->pmu.wpr_buf, pages,
424 wprsize / PAGE_SIZE);
425 nvgpu_kfree(g, pages);
426
417 g->pmu.wpr_buf.gpu_va = nvgpu_gmmu_map(vm, &g->pmu.wpr_buf, 427 g->pmu.wpr_buf.gpu_va = nvgpu_gmmu_map(vm, &g->pmu.wpr_buf,
418 wprsize, 0, gk20a_mem_flag_none, 428 wprsize, 0, gk20a_mem_flag_none,
419 false, APERTURE_SYSMEM); 429 false, APERTURE_SYSMEM);