drm/amd/powerplay: add firmware cleanup on sw_fini
authorEvan Quan <evan.quan@amd.com>
Mon, 1 Jun 2020 06:03:57 +0000 (14:03 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 1 Jul 2020 05:59:17 +0000 (01:59 -0400)
To avoid possible memory leak.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
drivers/gpu/drm/amd/powerplay/navi10_ppt.c
drivers/gpu/drm/amd/powerplay/smu_internal.h
drivers/gpu/drm/amd/powerplay/smu_v11_0.c

index fe24087..891cb17 100644 (file)
@@ -1108,6 +1108,8 @@ static int smu_sw_fini(void *handle)
                return ret;
        }
 
+       smu_fini_microcode(smu);
+
        return 0;
 }
 
index 9eb57be..05abfde 100644 (file)
@@ -2469,6 +2469,7 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
        .get_unique_id = arcturus_get_unique_id,
        .init_microcode = smu_v11_0_init_microcode,
        .load_microcode = smu_v11_0_load_microcode,
+       .fini_microcode = smu_v11_0_fini_microcode,
        .init_smc_tables = smu_v11_0_init_smc_tables,
        .fini_smc_tables = smu_v11_0_fini_smc_tables,
        .init_power = smu_v11_0_init_power,
index e1f9987..c7b5b19 100644 (file)
@@ -496,6 +496,7 @@ struct pptable_funcs {
        int (*get_dpm_clock_table)(struct smu_context *smu, struct dpm_clocks *clock_table);
        int (*init_microcode)(struct smu_context *smu);
        int (*load_microcode)(struct smu_context *smu);
+       void (*fini_microcode)(struct smu_context *smu);
        int (*init_smc_tables)(struct smu_context *smu);
        int (*fini_smc_tables)(struct smu_context *smu);
        int (*init_power)(struct smu_context *smu);
index c442fc9..91fe6f9 100644 (file)
@@ -146,6 +146,8 @@ enum smu_v11_0_baco_seq {
 
 int smu_v11_0_init_microcode(struct smu_context *smu);
 
+void smu_v11_0_fini_microcode(struct smu_context *smu);
+
 int smu_v11_0_load_microcode(struct smu_context *smu);
 
 int smu_v11_0_init_smc_tables(struct smu_context *smu);
index 4c1c4af..8dd916a 100644 (file)
@@ -2310,6 +2310,7 @@ static const struct pptable_funcs navi10_ppt_funcs = {
        .update_pcie_parameters = navi10_update_pcie_parameters,
        .init_microcode = smu_v11_0_init_microcode,
        .load_microcode = smu_v11_0_load_microcode,
+       .fini_microcode = smu_v11_0_fini_microcode,
        .init_smc_tables = smu_v11_0_init_smc_tables,
        .fini_smc_tables = smu_v11_0_fini_smc_tables,
        .init_power = smu_v11_0_init_power,
index 7c0f488..bde3912 100644 (file)
@@ -27,6 +27,8 @@
 
 #define smu_init_microcode(smu) \
        ((smu)->ppt_funcs->init_microcode ? (smu)->ppt_funcs->init_microcode((smu)) : 0)
+#define smu_fini_microcode(smu) \
+       ((smu)->ppt_funcs->fini_microcode ? (smu)->ppt_funcs->fini_microcode((smu)) : 0)
 #define smu_init_smc_tables(smu) \
        ((smu)->ppt_funcs->init_smc_tables ? (smu)->ppt_funcs->init_smc_tables((smu)) : 0)
 #define smu_fini_smc_tables(smu) \
index caea6fb..480fb74 100644 (file)
@@ -199,6 +199,15 @@ out:
        return err;
 }
 
+void smu_v11_0_fini_microcode(struct smu_context *smu)
+{
+       struct amdgpu_device *adev = smu->adev;
+
+       release_firmware(adev->pm.fw);
+       adev->pm.fw = NULL;
+       adev->pm.fw_version = 0;
+}
+
 int smu_v11_0_load_microcode(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;