summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2016-04-13 07:31:39 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-04-14 11:43:16 -0400
commit64339638013d569e725766cc593a1e0ccb802f7f (patch)
tree79225427dfcd228f0ddcc7327dadd3dcbecff876 /drivers
parentf22df728deb90f1c32318dbeaf011389df8ecb59 (diff)
gpu: nvgpu: clean up ctx_vars properly
Set ctx_vars.valid to false when removing support. Otherwise a re-poweron sequence could crash when the flag wouldn't match the real state of the driver. Also free all allocated regs instead of leaking some of them. Change-Id: I3fc4fa759d839bc435e53cbd942fa5d39efe7f57 Signed-off-by: Konsta Holtta <kholtta@nvidia.com> Reviewed-on: http://git-master/r/1126138 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c1
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c9
2 files changed, 10 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c
index 64d6542b..a01e43c7 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c
@@ -356,6 +356,7 @@ static int gr_gk20a_init_ctx_vars_fw(struct gk20a *g, struct gr_gk20a *gr)
356 goto done; 356 goto done;
357 357
358clean_up: 358clean_up:
359 g->gr.ctx_vars.valid = false;
359 kfree(g->gr.ctx_vars.ucode.fecs.inst.l); 360 kfree(g->gr.ctx_vars.ucode.fecs.inst.l);
360 kfree(g->gr.ctx_vars.ucode.fecs.data.l); 361 kfree(g->gr.ctx_vars.ucode.fecs.data.l);
361 kfree(g->gr.ctx_vars.ucode.gpccs.inst.l); 362 kfree(g->gr.ctx_vars.ucode.gpccs.inst.l);
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 5317bd87..aa42e1dd 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -3140,6 +3140,7 @@ static void gk20a_remove_gr_support(struct gr_gk20a *gr)
3140 gr->gpc_skip_mask = NULL; 3140 gr->gpc_skip_mask = NULL;
3141 gr->map_tiles = NULL; 3141 gr->map_tiles = NULL;
3142 3142
3143 gr->ctx_vars.valid = false;
3143 kfree(gr->ctx_vars.ucode.fecs.inst.l); 3144 kfree(gr->ctx_vars.ucode.fecs.inst.l);
3144 kfree(gr->ctx_vars.ucode.fecs.data.l); 3145 kfree(gr->ctx_vars.ucode.fecs.data.l);
3145 kfree(gr->ctx_vars.ucode.gpccs.inst.l); 3146 kfree(gr->ctx_vars.ucode.gpccs.inst.l);
@@ -3156,6 +3157,14 @@ static void gk20a_remove_gr_support(struct gr_gk20a *gr)
3156 kfree(gr->ctx_vars.ctxsw_regs.pm_sys.l); 3157 kfree(gr->ctx_vars.ctxsw_regs.pm_sys.l);
3157 kfree(gr->ctx_vars.ctxsw_regs.pm_gpc.l); 3158 kfree(gr->ctx_vars.ctxsw_regs.pm_gpc.l);
3158 kfree(gr->ctx_vars.ctxsw_regs.pm_tpc.l); 3159 kfree(gr->ctx_vars.ctxsw_regs.pm_tpc.l);
3160 kfree(gr->ctx_vars.ctxsw_regs.pm_ppc.l);
3161 kfree(gr->ctx_vars.ctxsw_regs.perf_sys.l);
3162 kfree(gr->ctx_vars.ctxsw_regs.fbp.l);
3163 kfree(gr->ctx_vars.ctxsw_regs.perf_gpc.l);
3164 kfree(gr->ctx_vars.ctxsw_regs.fbp_router.l);
3165 kfree(gr->ctx_vars.ctxsw_regs.gpc_router.l);
3166 kfree(gr->ctx_vars.ctxsw_regs.pm_ltc.l);
3167 kfree(gr->ctx_vars.ctxsw_regs.pm_fbpa.l);
3159 3168
3160 kfree(gr->ctx_vars.local_golden_image); 3169 kfree(gr->ctx_vars.local_golden_image);
3161 gr->ctx_vars.local_golden_image = NULL; 3170 gr->ctx_vars.local_golden_image = NULL;