diff options
author | Thomas Fleury <tfleury@nvidia.com> | 2017-10-26 19:41:24 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-11-06 16:41:36 -0500 |
commit | 94feb18de8a687bef7c94999161b6bebaa382709 (patch) | |
tree | 8bea74e24b9e29e5e0a920b956abbe73e90edff3 /drivers/gpu/nvgpu/common/pmu/pmu_fw.c | |
parent | 4e7c9c3008e8bd354afa471e1d97ba88b12194da (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.c | 15 |
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 | ||