From 0cc118c08c30e54073e5b8729c859a08ddbe3785 Mon Sep 17 00:00:00 2001 From: Aingara Paramakuru Date: Wed, 12 Nov 2014 15:00:22 -0500 Subject: gpu: nvgpu: vgpu: fix crash during init gops->gr.detect_sm_arch was not populated for vgpu. Also, populate some members of the PMU VM struct as they are used to report GPU characteristics to userspace. Bug 1576949 Change-Id: I9ddc361d1418b942da97a82b553aac81f5f51182 Signed-off-by: Aingara Paramakuru Reviewed-on: http://git-master/r/601931 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Arto Merilainen Reviewed-by: Terje Bergstrom --- drivers/gpu/nvgpu/vgpu/gr_vgpu.c | 27 +++++++++++++++++++++++++++ drivers/gpu/nvgpu/vgpu/mm_vgpu.c | 8 ++++++++ 2 files changed, 35 insertions(+) (limited to 'drivers/gpu/nvgpu/vgpu') diff --git a/drivers/gpu/nvgpu/vgpu/gr_vgpu.c b/drivers/gpu/nvgpu/vgpu/gr_vgpu.c index 6f8baa4b..46b48b33 100644 --- a/drivers/gpu/nvgpu/vgpu/gr_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/gr_vgpu.c @@ -583,6 +583,32 @@ static int vgpu_gr_get_zcull_info(struct gk20a *g, struct gr_gk20a *gr, return 0; } +static void vgpu_gr_detect_sm_arch(struct gk20a *g) +{ + struct gk20a_platform *platform = gk20a_get_platform(g->dev); + u32 v = 0, raw_version, version = 0; + + gk20a_dbg_fn(""); + + if (vgpu_get_attribute(platform->virt_handle, + TEGRA_VGPU_ATTRIB_GPC0_TPC0_SM_ARCH, &v)) + gk20a_err(dev_from_gk20a(g), "failed to retrieve SM arch"); + + raw_version = gr_gpc0_tpc0_sm_arch_spa_version_v(v); + if (raw_version == gr_gpc0_tpc0_sm_arch_spa_version_smkepler_lp_v()) + version = 0x320; /* SM 3.2 */ + else + gk20a_err(dev_from_gk20a(g), "Unknown SM version 0x%x", + raw_version); + + /* on Kepler, SM version == SPA version */ + g->gpu_characteristics.sm_arch_spa_version = version; + g->gpu_characteristics.sm_arch_sm_version = version; + + g->gpu_characteristics.sm_arch_warp_count = + gr_gpc0_tpc0_sm_arch_warp_count_v(v); +} + static void vgpu_remove_gr_support(struct gr_gk20a *gr) { gk20a_dbg_fn(""); @@ -684,4 +710,5 @@ void vgpu_init_gr_ops(struct gpu_ops *gops) gops->gr.free_obj_ctx = vgpu_gr_free_obj_ctx; gops->gr.bind_ctxsw_zcull = vgpu_gr_bind_ctxsw_zcull; gops->gr.get_zcull_info = vgpu_gr_get_zcull_info; + gops->gr.detect_sm_arch = vgpu_gr_detect_sm_arch; } diff --git a/drivers/gpu/nvgpu/vgpu/mm_vgpu.c b/drivers/gpu/nvgpu/vgpu/mm_vgpu.c index adec4d31..eb67c01f 100644 --- a/drivers/gpu/nvgpu/vgpu/mm_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/mm_vgpu.c @@ -20,6 +20,8 @@ static int vgpu_init_mm_setup_sw(struct gk20a *g) { struct mm_gk20a *mm = &g->mm; + struct vm_gk20a *vm = &mm->pmu.vm; + u32 big_page_size = gk20a_get_platform(g->dev)->default_big_page_size; gk20a_dbg_fn(""); @@ -35,6 +37,12 @@ static int vgpu_init_mm_setup_sw(struct gk20a *g) gk20a_dbg_info("channel vm size: %dMB", (int)(mm->channel.size >> 20)); + /* gk20a_init_gpu_characteristics expects this to be populated */ + vm->big_page_size = big_page_size; + vm->compression_page_size = big_page_size; + vm->pde_stride = vm->big_page_size << 10; + vm->pde_stride_shift = ilog2(vm->pde_stride); + mm->sw_ready = true; return 0; -- cgit v1.2.2