diff options
author | Konsta Holtta <kholtta@nvidia.com> | 2016-04-13 07:31:39 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-04-14 11:43:16 -0400 |
commit | 64339638013d569e725766cc593a1e0ccb802f7f (patch) | |
tree | 79225427dfcd228f0ddcc7327dadd3dcbecff876 /drivers/gpu/nvgpu | |
parent | f22df728deb90f1c32318dbeaf011389df8ecb59 (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/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 9 |
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 | ||
358 | clean_up: | 358 | clean_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; |