diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0970-drm-amdgpu-fix-memory-leak-in-CGS-FW-info.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0970-drm-amdgpu-fix-memory-leak-in-CGS-FW-info.patch | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0970-drm-amdgpu-fix-memory-leak-in-CGS-FW-info.patch b/common/recipes-kernel/linux/files/0970-drm-amdgpu-fix-memory-leak-in-CGS-FW-info.patch new file mode 100644 index 00000000..39621012 --- /dev/null +++ b/common/recipes-kernel/linux/files/0970-drm-amdgpu-fix-memory-leak-in-CGS-FW-info.patch @@ -0,0 +1,100 @@ +From 7de9db94df0fbd976cc2e69efde4bef2506802d4 Mon Sep 17 00:00:00 2001 +From: Mykola Lysenko <Mykola.Lysenko@amd.com> +Date: Wed, 30 Mar 2016 05:50:11 -0400 +Subject: [PATCH 0970/1110] drm/amdgpu: fix memory leak in CGS (FW info) + +Previously requested FW pointer should not be +overwrite + +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +Signed-off-by: Mykola Lysenko <Mykola.Lysenko@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | 70 +++++++++++++++++---------------- + 1 file changed, 36 insertions(+), 34 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +index 837cdd2..490464e 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +@@ -735,42 +735,44 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device, + const uint8_t *src; + const struct smc_firmware_header_v1_0 *hdr; + +- switch (adev->asic_type) { +- case CHIP_TONGA: +- strcpy(fw_name, "amdgpu/tonga_smc.bin"); +- break; +- case CHIP_FIJI: +- strcpy(fw_name, "amdgpu/fiji_smc.bin"); +- break; +- case CHIP_POLARIS11: +- if (type == CGS_UCODE_ID_SMU) +- strcpy(fw_name, "amdgpu/polaris11_smc.bin"); +- else if (type == CGS_UCODE_ID_SMU_SK) +- strcpy(fw_name, "amdgpu/polaris11_smc_sk.bin"); +- break; +- case CHIP_POLARIS10: +- if (type == CGS_UCODE_ID_SMU) +- strcpy(fw_name, "amdgpu/polaris10_smc.bin"); +- else if (type == CGS_UCODE_ID_SMU_SK) +- strcpy(fw_name, "amdgpu/polaris10_smc_sk.bin"); +- break; +- default: +- DRM_ERROR("SMC firmware not supported\n"); +- return -EINVAL; +- } ++ if (!adev->pm.fw) { ++ switch (adev->asic_type) { ++ case CHIP_TONGA: ++ strcpy(fw_name, "amdgpu/tonga_smc.bin"); ++ break; ++ case CHIP_FIJI: ++ strcpy(fw_name, "amdgpu/fiji_smc.bin"); ++ break; ++ case CHIP_POLARIS11: ++ if (type == CGS_UCODE_ID_SMU) ++ strcpy(fw_name, "amdgpu/polaris11_smc.bin"); ++ else if (type == CGS_UCODE_ID_SMU_SK) ++ strcpy(fw_name, "amdgpu/polaris11_smc_sk.bin"); ++ break; ++ case CHIP_POLARIS10: ++ if (type == CGS_UCODE_ID_SMU) ++ strcpy(fw_name, "amdgpu/polaris10_smc.bin"); ++ else if (type == CGS_UCODE_ID_SMU_SK) ++ strcpy(fw_name, "amdgpu/polaris10_smc_sk.bin"); ++ break; ++ default: ++ DRM_ERROR("SMC firmware not supported\n"); ++ return -EINVAL; ++ } + +- err = request_firmware(&adev->pm.fw, fw_name, adev->dev); +- if (err) { +- DRM_ERROR("Failed to request firmware\n"); +- return err; +- } ++ err = request_firmware(&adev->pm.fw, fw_name, adev->dev); ++ if (err) { ++ DRM_ERROR("Failed to request firmware\n"); ++ return err; ++ } + +- err = amdgpu_ucode_validate(adev->pm.fw); +- if (err) { +- DRM_ERROR("Failed to load firmware \"%s\"", fw_name); +- release_firmware(adev->pm.fw); +- adev->pm.fw = NULL; +- return err; ++ err = amdgpu_ucode_validate(adev->pm.fw); ++ if (err) { ++ DRM_ERROR("Failed to load firmware \"%s\"", fw_name); ++ release_firmware(adev->pm.fw); ++ adev->pm.fw = NULL; ++ return err; ++ } + } + + hdr = (const struct smc_firmware_header_v1_0 *) adev->pm.fw->data; +-- +2.7.4 + |