From 938bea58ca42672279a3b2bc12daab09ec3f1876 Mon Sep 17 00:00:00 2001 From: Aingara Paramakuru Date: Mon, 27 Oct 2014 15:15:39 -0400 Subject: gpu: nvgpu: vgpu: init vm->gmmu_page_sizes vm->gmmu_page_sizes was not initialized properly in the vgpu case, leading to gmmu map failures. Bug 1570878 Change-Id: I16c371f65d884f59d9c9f60c7acd391b917d04ed Signed-off-by: Aingara Paramakuru --- drivers/gpu/nvgpu/gk20a/platform_vgpu_tegra.c | 1 + drivers/gpu/nvgpu/vgpu/mm_vgpu.c | 25 +++++++++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/nvgpu/gk20a/platform_vgpu_tegra.c b/drivers/gpu/nvgpu/gk20a/platform_vgpu_tegra.c index ea4fde79..ed65756a 100644 --- a/drivers/gpu/nvgpu/gk20a/platform_vgpu_tegra.c +++ b/drivers/gpu/nvgpu/gk20a/platform_vgpu_tegra.c @@ -59,6 +59,7 @@ struct gk20a_platform vgpu_tegra_platform = { .enable_aelpg = false, .probe = gk20a_tegra_probe, + .default_big_page_size = SZ_128K, .virtual_dev = true, }; diff --git a/drivers/gpu/nvgpu/vgpu/mm_vgpu.c b/drivers/gpu/nvgpu/vgpu/mm_vgpu.c index c1624ec8..adec4d31 100644 --- a/drivers/gpu/nvgpu/vgpu/mm_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/mm_vgpu.c @@ -17,10 +17,6 @@ #include "vgpu/vgpu.h" #include "gk20a/semaphore_gk20a.h" -/* note: keep the page sizes sorted lowest to highest here */ -static const u32 gmmu_page_sizes[gmmu_nr_page_sizes] = { SZ_4K, SZ_128K }; -static const u32 gmmu_page_shifts[gmmu_nr_page_sizes] = { 12, 17 }; - static int vgpu_init_mm_setup_sw(struct gk20a *g) { struct mm_gk20a *mm = &g->mm; @@ -239,10 +235,18 @@ static int vgpu_vm_alloc_share(struct gk20a_as_share *as_share, u64 vma_size; u32 num_pages, low_hole_pages; char name[32]; - int err; + int err, i; + + /* note: keep the page sizes sorted lowest to highest here */ + u32 gmmu_page_sizes[gmmu_nr_page_sizes] = { + SZ_4K, + big_page_size ? big_page_size : platform->default_big_page_size + }; gk20a_dbg_fn(""); + big_page_size = gmmu_page_sizes[gmmu_page_size_big]; + vm = kzalloc(sizeof(*vm), GFP_KERNEL); if (!vm) return -ENOMEM; @@ -252,6 +256,9 @@ static int vgpu_vm_alloc_share(struct gk20a_as_share *as_share, vm->mm = mm; vm->as_share = as_share; + for (i = 0; i < gmmu_nr_page_sizes; i++) + vm->gmmu_page_sizes[i] = gmmu_page_sizes[i]; + vm->big_pages = true; vm->va_start = big_page_size << 10; /* create a one pde hole */ @@ -273,11 +280,12 @@ static int vgpu_vm_alloc_share(struct gk20a_as_share *as_share, snprintf(name, sizeof(name), "gk20a_as_%d-%dKB", as_share->id, gmmu_page_sizes[gmmu_page_size_small]>>10); - num_pages = (u32)(vma_size >> gmmu_page_shifts[gmmu_page_size_small]); + num_pages = (u32)(vma_size >> + ilog2(gmmu_page_sizes[gmmu_page_size_small])); /* num_pages above is without regard to the low-side hole. */ low_hole_pages = (vm->va_start >> - gmmu_page_shifts[gmmu_page_size_small]); + ilog2(gmmu_page_sizes[gmmu_page_size_small])); gk20a_allocator_init(&vm->vma[gmmu_page_size_small], name, low_hole_pages, /* start */ @@ -287,7 +295,8 @@ static int vgpu_vm_alloc_share(struct gk20a_as_share *as_share, snprintf(name, sizeof(name), "gk20a_as_%d-%dKB", as_share->id, gmmu_page_sizes[gmmu_page_size_big]>>10); - num_pages = (u32)(vma_size >> gmmu_page_shifts[gmmu_page_size_big]); + num_pages = (u32)(vma_size >> + ilog2(gmmu_page_sizes[gmmu_page_size_big])); gk20a_allocator_init(&vm->vma[gmmu_page_size_big], name, num_pages, /* start */ num_pages, /* length */ -- cgit v1.2.2