summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/pmu/pmu_fw.c
diff options
context:
space:
mode:
authorThomas Fleury <tfleury@nvidia.com>2017-10-26 19:41:24 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-11-06 16:41:36 -0500
commit94feb18de8a687bef7c94999161b6bebaa382709 (patch)
tree8bea74e24b9e29e5e0a920b956abbe73e90edff3 /drivers/gpu/nvgpu/common/pmu/pmu_fw.c
parent4e7c9c3008e8bd354afa471e1d97ba88b12194da (diff)
gpu: nvgpu: call destructor for boardobj and boardobjgrp
Maintain a list of boardobj and boardobjgrp, so that we can free related objects when removing pmu support. A flag is added in boardobj so that the destructor can determine if it should free the object. This 'allocated' flag is false when the object is embedded into another structure, which should be freed through other means. JIRA EVLR-1959 Bug 200352099 Change-Id: I6a3ff3c57f7428dd145deacf98f2992a9be9796d Signed-off-by: Thomas Fleury <tfleury@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1586596 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common/pmu/pmu_fw.c')
-rw-r--r--drivers/gpu/nvgpu/common/pmu/pmu_fw.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/common/pmu/pmu_fw.c b/drivers/gpu/nvgpu/common/pmu/pmu_fw.c
index 20eadb50..654fde21 100644
--- a/drivers/gpu/nvgpu/common/pmu/pmu_fw.c
+++ b/drivers/gpu/nvgpu/common/pmu/pmu_fw.c
@@ -29,6 +29,9 @@
29 29
30#include "gk20a/gk20a.h" 30#include "gk20a/gk20a.h"
31 31
32#include "boardobj/boardobj.h"
33#include "boardobj/boardobjgrp.h"
34
32/* PMU NS UCODE IMG */ 35/* PMU NS UCODE IMG */
33#define NVGPU_PMU_NS_UCODE_IMAGE "gpmu_ucode.bin" 36#define NVGPU_PMU_NS_UCODE_IMAGE "gpmu_ucode.bin"
34 37
@@ -2228,12 +2231,24 @@ static void nvgpu_remove_pmu_support(struct nvgpu_pmu *pmu)
2228 struct gk20a *g = gk20a_from_pmu(pmu); 2231 struct gk20a *g = gk20a_from_pmu(pmu);
2229 struct mm_gk20a *mm = &g->mm; 2232 struct mm_gk20a *mm = &g->mm;
2230 struct vm_gk20a *vm = mm->pmu.vm; 2233 struct vm_gk20a *vm = mm->pmu.vm;
2234 struct boardobj *pboardobj, *pboardobj_tmp;
2235 struct boardobjgrp *pboardobjgrp, *pboardobjgrp_tmp;
2231 2236
2232 nvgpu_log_fn(g, " "); 2237 nvgpu_log_fn(g, " ");
2233 2238
2234 if (nvgpu_alloc_initialized(&pmu->dmem)) 2239 if (nvgpu_alloc_initialized(&pmu->dmem))
2235 nvgpu_alloc_destroy(&pmu->dmem); 2240 nvgpu_alloc_destroy(&pmu->dmem);
2236 2241
2242 nvgpu_list_for_each_entry_safe(pboardobjgrp, pboardobjgrp_tmp,
2243 &g->boardobjgrp_head, boardobjgrp, node) {
2244 pboardobjgrp->destruct(pboardobjgrp);
2245 }
2246
2247 nvgpu_list_for_each_entry_safe(pboardobj, pboardobj_tmp,
2248 &g->boardobj_head, boardobj, node) {
2249 pboardobj->destruct(pboardobj);
2250 }
2251
2237 if (pmu->fw) 2252 if (pmu->fw)
2238 nvgpu_release_firmware(g, pmu->fw); 2253 nvgpu_release_firmware(g, pmu->fw);
2239 2254