aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0970-drm-amdgpu-fix-memory-leak-in-CGS-FW-info.patch
diff options
context:
space:
mode:
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.patch100
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
+