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 fe24087766f77682f0dee3fee2d29679733f689f..891cb17fa2ce647cd7b673d34e9bd5dd9d94a6c1 100644 (file)
@@ -1108,6 +1108,8 @@ static int smu_sw_fini(void *handle)
                return ret;
        }
 
+       smu_fini_microcode(smu);
+
        return 0;
 }
 
index 9eb57bec27e19a37601a7fff074afb5631c5a12f..05abfdedcf3786178c18b911e50be393d31b3fe8 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 e1f99877cac105a539b5db7eefe555805979f1f7..c7b5b1994129d4c10891fe53dc2ad3a3eccc83f9 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 c442fc992d2e71732b80067c2d4ab25cda66d4c0..91fe6f9b4c98290b9f90b46a1f26cfce1db4c7dc 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 4c1c4af2249b50a7cfe35bc247aa754ac485577c..8dd916a8e8f8907a16187cf59c2ab589b0d819ad 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 7c0f488ff7aa00d63de90c2e00377847dbac322a..bde3912e2294ac4e530fdc056dc3c4fa5196a834 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 caea6fbd0f0cb603b1e3de05f9571a4028af0c1a..480fb74b9121bd9707742be3a31812e97d541f4e 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;