diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3127-drm-amd-powerplay-fix-null-pointer-dereference-aroun.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3127-drm-amd-powerplay-fix-null-pointer-dereference-aroun.patch | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3127-drm-amd-powerplay-fix-null-pointer-dereference-aroun.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3127-drm-amd-powerplay-fix-null-pointer-dereference-aroun.patch new file mode 100644 index 00000000..96ee9417 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3127-drm-amd-powerplay-fix-null-pointer-dereference-aroun.patch @@ -0,0 +1,72 @@ +From 296307cdf9ba0f228c07cf08156cd7958ae9d4dd Mon Sep 17 00:00:00 2001 +From: Evan Quan <evan.quan@amd.com> +Date: Thu, 25 Jul 2019 12:10:34 +0800 +Subject: [PATCH 3127/4256] drm/amd/powerplay: fix null pointer dereference + around dpm state relates + +DPM state relates are not supported on the new SW SMU ASICs. But still +it's not OK to trigger null pointer dereference on accessing them. + +Change-Id: I368d108fbea438ed5d9e3b849d006ddd5308052b +Signed-off-by: Evan Quan <evan.quan@amd.com> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 18 +++++++++++++----- + drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 3 ++- + 2 files changed, 15 insertions(+), 6 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +index d24eb6980ec1..d9d1a7dd6514 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +@@ -156,12 +156,16 @@ static ssize_t amdgpu_get_dpm_state(struct device *dev, + struct amdgpu_device *adev = ddev->dev_private; + enum amd_pm_state_type pm; + +- if (is_support_sw_smu(adev) && adev->smu.ppt_funcs->get_current_power_state) +- pm = amdgpu_smu_get_current_power_state(adev); +- else if (adev->powerplay.pp_funcs->get_current_power_state) ++ if (is_support_sw_smu(adev)) { ++ if (adev->smu.ppt_funcs->get_current_power_state) ++ pm = amdgpu_smu_get_current_power_state(adev); ++ else ++ pm = adev->pm.dpm.user_state; ++ } else if (adev->powerplay.pp_funcs->get_current_power_state) { + pm = amdgpu_dpm_get_current_power_state(adev); +- else ++ } else { + pm = adev->pm.dpm.user_state; ++ } + + return snprintf(buf, PAGE_SIZE, "%s\n", + (pm == POWER_STATE_TYPE_BATTERY) ? "battery" : +@@ -188,7 +192,11 @@ static ssize_t amdgpu_set_dpm_state(struct device *dev, + goto fail; + } + +- if (adev->powerplay.pp_funcs->dispatch_tasks) { ++ if (is_support_sw_smu(adev)) { ++ mutex_lock(&adev->pm.mutex); ++ adev->pm.dpm.user_state = state; ++ mutex_unlock(&adev->pm.mutex); ++ } else if (adev->powerplay.pp_funcs->dispatch_tasks) { + amdgpu_dpm_dispatch_task(adev, AMD_PP_TASK_ENABLE_USER_STATE, &state); + } else { + mutex_lock(&adev->pm.mutex); +diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c +index abfb19ebf929..c22b4d5673fa 100644 +--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c ++++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c +@@ -305,7 +305,8 @@ int smu_get_power_num_states(struct smu_context *smu, + + /* not support power state */ + memset(state_info, 0, sizeof(struct pp_states_info)); +- state_info->nums = 0; ++ state_info->nums = 1; ++ state_info->states[0] = POWER_STATE_TYPE_DEFAULT; + + return 0; + } +-- +2.17.1 + |