From: Greg Kroah-Hartman Date: Wed, 5 Mar 2025 13:09:28 +0000 (+0100) Subject: 6.1-stable patches X-Git-Tag: v6.6.81~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8965c1923f866e5550901090cb378fab859f8be7;p=thirdparty%2Fkernel%2Fstable-queue.git 6.1-stable patches added patches: amdgpu-pm-legacy-fix-suspend-resume-issues.patch drm-amd-display-fixed-integer-types-and-null-check-locations.patch --- diff --git a/queue-6.1/amdgpu-pm-legacy-fix-suspend-resume-issues.patch b/queue-6.1/amdgpu-pm-legacy-fix-suspend-resume-issues.patch new file mode 100644 index 0000000000..cc507cd1bb --- /dev/null +++ b/queue-6.1/amdgpu-pm-legacy-fix-suspend-resume-issues.patch @@ -0,0 +1,192 @@ +From 91dcc66b34beb72dde8412421bdc1b4cd40e4fb8 Mon Sep 17 00:00:00 2001 +From: "chr[]" +Date: Wed, 12 Feb 2025 16:51:38 +0100 +Subject: amdgpu/pm/legacy: fix suspend/resume issues + +From: chr[] + +commit 91dcc66b34beb72dde8412421bdc1b4cd40e4fb8 upstream. + +resume and irq handler happily races in set_power_state() + +* amdgpu_legacy_dpm_compute_clocks() needs lock +* protect irq work handler +* fix dpm_enabled usage + +v2: fix clang build, integrate Lijo's comments (Alex) + +Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/2524 +Fixes: 3712e7a49459 ("drm/amd/pm: unified lock protections in amdgpu_dpm.c") +Reviewed-by: Lijo Lazar +Tested-by: Maciej S. Szmigiero # on Oland PRO +Signed-off-by: chr[] +Signed-off-by: Alex Deucher +(cherry picked from commit ee3dc9e204d271c9c7a8d4d38a0bce4745d33e71) +Cc: stable@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c | 25 ++++++++++++++++++------ + drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c | 8 +++++-- + drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c | 26 +++++++++++++++++++------ + 3 files changed, 45 insertions(+), 14 deletions(-) + +--- a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c ++++ b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c +@@ -3056,6 +3056,7 @@ static int kv_dpm_hw_init(void *handle) + if (!amdgpu_dpm) + return 0; + ++ mutex_lock(&adev->pm.mutex); + kv_dpm_setup_asic(adev); + ret = kv_dpm_enable(adev); + if (ret) +@@ -3063,6 +3064,8 @@ static int kv_dpm_hw_init(void *handle) + else + adev->pm.dpm_enabled = true; + amdgpu_legacy_dpm_compute_clocks(adev); ++ mutex_unlock(&adev->pm.mutex); ++ + return ret; + } + +@@ -3080,32 +3083,42 @@ static int kv_dpm_suspend(void *handle) + { + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + ++ cancel_work_sync(&adev->pm.dpm.thermal.work); ++ + if (adev->pm.dpm_enabled) { ++ mutex_lock(&adev->pm.mutex); ++ adev->pm.dpm_enabled = false; + /* disable dpm */ + kv_dpm_disable(adev); + /* reset the power state */ + adev->pm.dpm.current_ps = adev->pm.dpm.requested_ps = adev->pm.dpm.boot_ps; ++ mutex_unlock(&adev->pm.mutex); + } + return 0; + } + + static int kv_dpm_resume(void *handle) + { +- int ret; ++ int ret = 0; + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +- if (adev->pm.dpm_enabled) { ++ if (!amdgpu_dpm) ++ return 0; ++ ++ if (!adev->pm.dpm_enabled) { ++ mutex_lock(&adev->pm.mutex); + /* asic init will reset to the boot state */ + kv_dpm_setup_asic(adev); + ret = kv_dpm_enable(adev); +- if (ret) ++ if (ret) { + adev->pm.dpm_enabled = false; +- else ++ } else { + adev->pm.dpm_enabled = true; +- if (adev->pm.dpm_enabled) + amdgpu_legacy_dpm_compute_clocks(adev); ++ } ++ mutex_unlock(&adev->pm.mutex); + } +- return 0; ++ return ret; + } + + static bool kv_dpm_is_idle(void *handle) +--- a/drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c ++++ b/drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c +@@ -1018,9 +1018,12 @@ void amdgpu_dpm_thermal_work_handler(str + enum amd_pm_state_type dpm_state = POWER_STATE_TYPE_INTERNAL_THERMAL; + int temp, size = sizeof(temp); + +- if (!adev->pm.dpm_enabled) +- return; ++ mutex_lock(&adev->pm.mutex); + ++ if (!adev->pm.dpm_enabled) { ++ mutex_unlock(&adev->pm.mutex); ++ return; ++ } + if (!pp_funcs->read_sensor(adev->powerplay.pp_handle, + AMDGPU_PP_SENSOR_GPU_TEMP, + (void *)&temp, +@@ -1042,4 +1045,5 @@ void amdgpu_dpm_thermal_work_handler(str + adev->pm.dpm.state = dpm_state; + + amdgpu_legacy_dpm_compute_clocks(adev->powerplay.pp_handle); ++ mutex_unlock(&adev->pm.mutex); + } +--- a/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c ++++ b/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c +@@ -7796,6 +7796,7 @@ static int si_dpm_hw_init(void *handle) + if (!amdgpu_dpm) + return 0; + ++ mutex_lock(&adev->pm.mutex); + si_dpm_setup_asic(adev); + ret = si_dpm_enable(adev); + if (ret) +@@ -7803,6 +7804,7 @@ static int si_dpm_hw_init(void *handle) + else + adev->pm.dpm_enabled = true; + amdgpu_legacy_dpm_compute_clocks(adev); ++ mutex_unlock(&adev->pm.mutex); + return ret; + } + +@@ -7820,32 +7822,44 @@ static int si_dpm_suspend(void *handle) + { + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + ++ cancel_work_sync(&adev->pm.dpm.thermal.work); ++ + if (adev->pm.dpm_enabled) { ++ mutex_lock(&adev->pm.mutex); ++ adev->pm.dpm_enabled = false; + /* disable dpm */ + si_dpm_disable(adev); + /* reset the power state */ + adev->pm.dpm.current_ps = adev->pm.dpm.requested_ps = adev->pm.dpm.boot_ps; ++ mutex_unlock(&adev->pm.mutex); + } ++ + return 0; + } + + static int si_dpm_resume(void *handle) + { +- int ret; ++ int ret = 0; + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +- if (adev->pm.dpm_enabled) { ++ if (!amdgpu_dpm) ++ return 0; ++ ++ if (!adev->pm.dpm_enabled) { + /* asic init will reset to the boot state */ ++ mutex_lock(&adev->pm.mutex); + si_dpm_setup_asic(adev); + ret = si_dpm_enable(adev); +- if (ret) ++ if (ret) { + adev->pm.dpm_enabled = false; +- else ++ } else { + adev->pm.dpm_enabled = true; +- if (adev->pm.dpm_enabled) + amdgpu_legacy_dpm_compute_clocks(adev); ++ } ++ mutex_unlock(&adev->pm.mutex); + } +- return 0; ++ ++ return ret; + } + + static bool si_dpm_is_idle(void *handle) diff --git a/queue-6.1/drm-amd-display-fixed-integer-types-and-null-check-locations.patch b/queue-6.1/drm-amd-display-fixed-integer-types-and-null-check-locations.patch new file mode 100644 index 0000000000..a46daf022f --- /dev/null +++ b/queue-6.1/drm-amd-display-fixed-integer-types-and-null-check-locations.patch @@ -0,0 +1,99 @@ +From 0484e05d048b66d01d1f3c1d2306010bb57d8738 Mon Sep 17 00:00:00 2001 +From: Sohaib Nadeem +Date: Wed, 31 Jan 2024 16:40:37 -0500 +Subject: drm/amd/display: fixed integer types and null check locations + +From: Sohaib Nadeem + +commit 0484e05d048b66d01d1f3c1d2306010bb57d8738 upstream. + +[why]: +issues fixed: +- comparison with wider integer type in loop condition which can cause +infinite loops +- pointer dereference before null check + +Cc: Mario Limonciello +Cc: Alex Deucher +Cc: stable@vger.kernel.org +Reviewed-by: Josip Pavic +Acked-by: Aurabindo Pillai +Signed-off-by: Sohaib Nadeem +Tested-by: Daniel Wheeler +Signed-off-by: Alex Deucher +[ delete changes made in drivers/gpu/drm/amd/display/dc/link/link_validation.c + for this file is not present in linux-6.1.y ] +Signed-off-by: Jianqi Ren +Signed-off-by: He Zhe +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c ++++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c +@@ -1862,19 +1862,21 @@ static enum bp_result get_firmware_info_ + /* Vega12 */ + smu_info_v3_2 = GET_IMAGE(struct atom_smu_info_v3_2, + DATA_TABLES(smu_info)); +- DC_LOG_BIOS("gpuclk_ss_percentage (unit of 0.001 percent): %d\n", smu_info_v3_2->gpuclk_ss_percentage); + if (!smu_info_v3_2) + return BP_RESULT_BADBIOSTABLE; + ++ DC_LOG_BIOS("gpuclk_ss_percentage (unit of 0.001 percent): %d\n", smu_info_v3_2->gpuclk_ss_percentage); ++ + info->default_engine_clk = smu_info_v3_2->bootup_dcefclk_10khz * 10; + } else if (revision.minor == 3) { + /* Vega20 */ + smu_info_v3_3 = GET_IMAGE(struct atom_smu_info_v3_3, + DATA_TABLES(smu_info)); +- DC_LOG_BIOS("gpuclk_ss_percentage (unit of 0.001 percent): %d\n", smu_info_v3_3->gpuclk_ss_percentage); + if (!smu_info_v3_3) + return BP_RESULT_BADBIOSTABLE; + ++ DC_LOG_BIOS("gpuclk_ss_percentage (unit of 0.001 percent): %d\n", smu_info_v3_3->gpuclk_ss_percentage); ++ + info->default_engine_clk = smu_info_v3_3->bootup_dcefclk_10khz * 10; + } + +@@ -2439,10 +2441,11 @@ static enum bp_result get_integrated_inf + info_v11 = GET_IMAGE(struct atom_integrated_system_info_v1_11, + DATA_TABLES(integratedsysteminfo)); + +- DC_LOG_BIOS("gpuclk_ss_percentage (unit of 0.001 percent): %d\n", info_v11->gpuclk_ss_percentage); + if (info_v11 == NULL) + return BP_RESULT_BADBIOSTABLE; + ++ DC_LOG_BIOS("gpuclk_ss_percentage (unit of 0.001 percent): %d\n", info_v11->gpuclk_ss_percentage); ++ + info->gpu_cap_info = + le32_to_cpu(info_v11->gpucapinfo); + /* +@@ -2654,11 +2657,12 @@ static enum bp_result get_integrated_inf + + info_v2_1 = GET_IMAGE(struct atom_integrated_system_info_v2_1, + DATA_TABLES(integratedsysteminfo)); +- DC_LOG_BIOS("gpuclk_ss_percentage (unit of 0.001 percent): %d\n", info_v2_1->gpuclk_ss_percentage); + + if (info_v2_1 == NULL) + return BP_RESULT_BADBIOSTABLE; + ++ DC_LOG_BIOS("gpuclk_ss_percentage (unit of 0.001 percent): %d\n", info_v2_1->gpuclk_ss_percentage); ++ + info->gpu_cap_info = + le32_to_cpu(info_v2_1->gpucapinfo); + /* +@@ -2816,11 +2820,11 @@ static enum bp_result get_integrated_inf + info_v2_2 = GET_IMAGE(struct atom_integrated_system_info_v2_2, + DATA_TABLES(integratedsysteminfo)); + +- DC_LOG_BIOS("gpuclk_ss_percentage (unit of 0.001 percent): %d\n", info_v2_2->gpuclk_ss_percentage); +- + if (info_v2_2 == NULL) + return BP_RESULT_BADBIOSTABLE; + ++ DC_LOG_BIOS("gpuclk_ss_percentage (unit of 0.001 percent): %d\n", info_v2_2->gpuclk_ss_percentage); ++ + info->gpu_cap_info = + le32_to_cpu(info_v2_2->gpucapinfo); + /* diff --git a/queue-6.1/series b/queue-6.1/series index b9fffa0d71..97253faf08 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -166,3 +166,5 @@ mptcp-reset-when-mptcp-opts-are-dropped-after-join.patch vmlinux.lds-ensure-that-const-vars-with-relocations-are-mapped-r-o.patch sched-core-prevent-rescheduling-when-interrupts-are-disabled.patch riscv-futex-sign-extend-compare-value-in-atomic-cmpxchg.patch +drm-amd-display-fixed-integer-types-and-null-check-locations.patch +amdgpu-pm-legacy-fix-suspend-resume-issues.patch