]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Mar 2025 13:09:28 +0000 (14:09 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Mar 2025 13:09:28 +0000 (14:09 +0100)
added patches:
amdgpu-pm-legacy-fix-suspend-resume-issues.patch
drm-amd-display-fixed-integer-types-and-null-check-locations.patch

queue-6.1/amdgpu-pm-legacy-fix-suspend-resume-issues.patch [new file with mode: 0644]
queue-6.1/drm-amd-display-fixed-integer-types-and-null-check-locations.patch [new file with mode: 0644]
queue-6.1/series

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 (file)
index 0000000..cc507cd
--- /dev/null
@@ -0,0 +1,192 @@
+From 91dcc66b34beb72dde8412421bdc1b4cd40e4fb8 Mon Sep 17 00:00:00 2001
+From: "chr[]" <chris@rudorff.com>
+Date: Wed, 12 Feb 2025 16:51:38 +0100
+Subject: amdgpu/pm/legacy: fix suspend/resume issues
+
+From: chr[] <chris@rudorff.com>
+
+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 <lijo.lazar@amd.com>
+Tested-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name> # on Oland PRO
+Signed-off-by: chr[] <chris@rudorff.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+(cherry picked from commit ee3dc9e204d271c9c7a8d4d38a0bce4745d33e71)
+Cc: stable@vger.kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..a46daf0
--- /dev/null
@@ -0,0 +1,99 @@
+From 0484e05d048b66d01d1f3c1d2306010bb57d8738 Mon Sep 17 00:00:00 2001
+From: Sohaib Nadeem <sohaib.nadeem@amd.com>
+Date: Wed, 31 Jan 2024 16:40:37 -0500
+Subject: drm/amd/display: fixed integer types and null check locations
+
+From: Sohaib Nadeem <sohaib.nadeem@amd.com>
+
+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 <mario.limonciello@amd.com>
+Cc: Alex Deucher <alexander.deucher@amd.com>
+Cc: stable@vger.kernel.org
+Reviewed-by: Josip Pavic <josip.pavic@amd.com>
+Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
+Signed-off-by: Sohaib Nadeem <sohaib.nadeem@amd.com>
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+[ 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 <jianqi.ren.cn@windriver.com>
+Signed-off-by: He Zhe <zhe.he@windriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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);
+       /*
index b9fffa0d71103f0f4781137af355fc908ea5c6ec..97253faf089a738f6ef8698f2308f59ef226f4fa 100644 (file)
@@ -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