summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/nvgpu/vgpu/gp10b/vgpu_gr_gp10b.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_gr_gp10b.c b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_gr_gp10b.c
index c5c53b58..3023ef4b 100644
--- a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_gr_gp10b.c
+++ b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_gr_gp10b.c
@@ -20,16 +20,30 @@
20static void vgpu_gr_gp10b_free_gr_ctx(struct gk20a *g, struct vm_gk20a *vm, 20static void vgpu_gr_gp10b_free_gr_ctx(struct gk20a *g, struct vm_gk20a *vm,
21 struct gr_ctx_desc *gr_ctx) 21 struct gr_ctx_desc *gr_ctx)
22{ 22{
23 struct gk20a_platform *platform = gk20a_get_platform(g->dev);
24 struct tegra_vgpu_cmd_msg msg;
25 struct tegra_vgpu_gr_ctx_params *p = &msg.params.gr_ctx;
26 int err;
27
23 gk20a_dbg_fn(""); 28 gk20a_dbg_fn("");
24 29
25 if (!gr_ctx || !gr_ctx->mem.gpu_va) 30 if (!gr_ctx || !gr_ctx->mem.gpu_va)
26 return; 31 return;
27 32
33 msg.cmd = TEGRA_VGPU_CMD_CHANNEL_FREE_GR_CTX;
34 msg.handle = platform->virt_handle;
35 p->handle = gr_ctx->virt_ctx;
36 err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg));
37 WARN_ON(err || msg.ret);
38
39 gk20a_vm_free_va(vm, gr_ctx->mem.gpu_va, gr_ctx->mem.size, 0);
40
28 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.pagepool_ctxsw_buffer); 41 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.pagepool_ctxsw_buffer);
29 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.betacb_ctxsw_buffer); 42 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.betacb_ctxsw_buffer);
30 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.spill_ctxsw_buffer); 43 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.spill_ctxsw_buffer);
31 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.preempt_ctxsw_buffer); 44 gk20a_gmmu_unmap_free(vm, &gr_ctx->t18x.preempt_ctxsw_buffer);
32 vgpu_gr_free_gr_ctx(g, vm, gr_ctx); 45
46 kfree(gr_ctx);
33} 47}
34 48
35static int vgpu_gr_gp10b_alloc_gr_ctx(struct gk20a *g, 49static int vgpu_gr_gp10b_alloc_gr_ctx(struct gk20a *g,