FAILED: patch "[PATCH] drm/amd/pm: disable OD_FAN_CURVE if temp or pwm range invalid" failed to apply to 6.19-stable tree
[email protected]
maintainerThe patch below does not apply to the 6.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.19.y
git checkout FETCH_HEAD
git cherry-pick -x 3e6dd28a11083e83e11a284d99fcc9eb748c321c
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026033042-superior-difficult-0a49@gregkh' --subject-prefix 'PATCH 6.19.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 3e6dd28a11083e83e11a284d99fcc9eb748c321c Mon Sep 17 00:00:00 2001
From: Yang Wang <[email protected]>
Date: Thu, 19 Mar 2026 21:17:38 -0400
Subject: [PATCH] drm/amd/pm: disable OD_FAN_CURVE if temp or pwm range invalid
for smu v13
Forcibly disable the OD_FAN_CURVE feature when temperature or PWM range is invalid, otherwise PMFW will reject this configuration on smu v13.0.x
example:
$ sudo cat /sys/bus/pci/devices/<BDF>/gpu_od/fan_ctrl/fan_curve
OD_FAN_CURVE:
0: 0C 0%
1: 0C 0%
2: 0C 0%
3: 0C 0%
4: 0C 0%OD_RANGE:FAN_CURVE(hotspot temp): 0C 0CFAN_CURVE(fan speed): 0% 0%
$ echo "0 50 40" | sudo tee fan_curve
kernel log:
[ 756.442527] amdgpu 0000:03:00.0: amdgpu: Fan curve temp setting(50) must be within [0, 0]! [ 777.345800] amdgpu 0000:03:00.0: amdgpu: Fan curve temp setting(50) must be within [0, 0]!
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c +32 -1
@@ -59,6 +59,10 @@#define to_amdgpu_device (x) (container_of(x, struct amdgpu_device, pm.smu_i2c)) +static void smu_v13_0_0_get_od_setting_limits (struct smu_context *smu, +int od_feature_bit, +int32_t *min,int32_t *max); +static const struct smu_feature_bits smu_v13_0_0_dpm_features = { .bits = {SMU_FEATURE_BIT_INIT (FEATURE_DPM_GFXCLK_BIT ),
@@ -1043,8 +1047,35 @@ static bool smu_v13_0_0_is_od_feature_supported(struct smu_context *smu,PPTable_t *pptable = smu->smu_table.driver_pptable;const OverDriveLimits_t *const overdrive_upperlimits = &pptable->SkuTable.OverDriveLimitsBasicMax; +int32_t min_value, max_value; +bool feature_enabled; -return overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit); +switch (od_feature_bit) { +case PP_OD_FEATURE_FAN_CURVE_BIT : + feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit)); +if (feature_enabled) { +smu_v13_0_0_get_od_setting_limits (smu,PP_OD_FEATURE_FAN_CURVE_TEMP , + &min_value, &max_value); +if (!min_value && !max_value) { + feature_enabled = false; + goto out; + } + +smu_v13_0_0_get_od_setting_limits (smu,PP_OD_FEATURE_FAN_CURVE_PWM , + &min_value, &max_value); +if (!min_value && !max_value) { + feature_enabled = false; + goto out; + } + } +break ; +default : + feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit)); +break ; + } + +out: +return feature_enabled; } static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu,
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c +32 -1
@@ -59,6 +59,10 @@#define to_amdgpu_device (x) (container_of(x, struct amdgpu_device, pm.smu_i2c)) +static void smu_v13_0_7_get_od_setting_limits (struct smu_context *smu, +int od_feature_bit, +int32_t *min,int32_t *max); +static const struct smu_feature_bits smu_v13_0_7_dpm_features = { .bits = {SMU_FEATURE_BIT_INIT (FEATURE_DPM_GFXCLK_BIT ),
@@ -1053,8 +1057,35 @@ static bool smu_v13_0_7_is_od_feature_supported(struct smu_context *smu,PPTable_t *pptable = smu->smu_table.driver_pptable;const OverDriveLimits_t *const overdrive_upperlimits = &pptable->SkuTable.OverDriveLimitsBasicMax; +int32_t min_value, max_value; +bool feature_enabled; -return overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit); +switch (od_feature_bit) { +case PP_OD_FEATURE_FAN_CURVE_BIT : + feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit)); +if (feature_enabled) { +smu_v13_0_7_get_od_setting_limits (smu,PP_OD_FEATURE_FAN_CURVE_TEMP , + &min_value, &max_value); +if (!min_value && !max_value) { + feature_enabled = false; + goto out; + } + +smu_v13_0_7_get_od_setting_limits (smu,PP_OD_FEATURE_FAN_CURVE_PWM , + &min_value, &max_value); +if (!min_value && !max_value) { + feature_enabled = false; + goto out; + } + } +break ; +default : + feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit)); +break ; + } + +out: +return feature_enabled; } static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu,
Sasha Levin
maintainerPATCH 1/1 drm/amd/pm: disable OD_FAN_CURVE if temp or pwm range invalid for smu v13
From: Yang Wang <[email protected]>
[ Upstream commit 3e6dd28a11083e83e11a284d99fcc9eb748c321c ]
Forcibly disable the OD_FAN_CURVE feature when temperature or PWM range is invalid, otherwise PMFW will reject this configuration on smu v13.0.x
example:
$ sudo cat /sys/bus/pci/devices/<BDF>/gpu_od/fan_ctrl/fan_curve
OD_FAN_CURVE:
0: 0C 0%
1: 0C 0%
2: 0C 0%
3: 0C 0%
4: 0C 0%OD_RANGE:FAN_CURVE(hotspot temp): 0C 0CFAN_CURVE(fan speed): 0% 0%
$ echo "0 50 40" | sudo tee fan_curve
kernel log:
[ 756.442527] amdgpu 0000:03:00.0: amdgpu: Fan curve temp setting(50) must be within [0, 0]! [ 777.345800] amdgpu 0000:03:00.0: amdgpu: Fan curve temp setting(50) must be within [0, 0]!
--- .../drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 33 ++++++++++++++++++- .../drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 33 ++++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c +32 -1
@@ -59,6 +59,10 @@#define to_amdgpu_device (x) (container_of(x, struct amdgpu_device, pm.smu_i2c)) +static void smu_v13_0_0_get_od_setting_limits (struct smu_context *smu, +int od_feature_bit, +int32_t *min,int32_t *max); +#define FEATURE_MASK (feature) (1ULL << feature)#define SMC_DPM_FEATURE ( \ FEATURE_MASK(FEATURE_DPM_GFXCLK_BIT) | \
@@ -1061,8 +1065,35 @@ static bool smu_v13_0_0_is_od_feature_supported(struct smu_context *smu,PPTable_t *pptable = smu->smu_table.driver_pptable;const OverDriveLimits_t *const overdrive_upperlimits = &pptable->SkuTable.OverDriveLimitsBasicMax; +int32_t min_value, max_value; +bool feature_enabled; -return overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit); +switch (od_feature_bit) { +case PP_OD_FEATURE_FAN_CURVE_BIT : + feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit)); +if (feature_enabled) { +smu_v13_0_0_get_od_setting_limits (smu,PP_OD_FEATURE_FAN_CURVE_TEMP , + &min_value, &max_value); +if (!min_value && !max_value) { + feature_enabled = false; + goto out; + } + +smu_v13_0_0_get_od_setting_limits (smu,PP_OD_FEATURE_FAN_CURVE_PWM , + &min_value, &max_value); +if (!min_value && !max_value) { + feature_enabled = false; + goto out; + } + } +break ; +default : + feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit)); +break ; + } + +out: +return feature_enabled; } static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu,
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c +32 -1
@@ -59,6 +59,10 @@#define to_amdgpu_device (x) (container_of(x, struct amdgpu_device, pm.smu_i2c)) +static void smu_v13_0_7_get_od_setting_limits (struct smu_context *smu, +int od_feature_bit, +int32_t *min,int32_t *max); +#define FEATURE_MASK (feature) (1ULL << feature)#define SMC_DPM_FEATURE ( \ FEATURE_MASK(FEATURE_DPM_GFXCLK_BIT) | \
@@ -1050,8 +1054,35 @@ static bool smu_v13_0_7_is_od_feature_supported(struct smu_context *smu,PPTable_t *pptable = smu->smu_table.driver_pptable;const OverDriveLimits_t *const overdrive_upperlimits = &pptable->SkuTable.OverDriveLimitsBasicMax; +int32_t min_value, max_value; +bool feature_enabled; -return overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit); +switch (od_feature_bit) { +case PP_OD_FEATURE_FAN_CURVE_BIT : + feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit)); +if (feature_enabled) { +smu_v13_0_7_get_od_setting_limits (smu,PP_OD_FEATURE_FAN_CURVE_TEMP , + &min_value, &max_value); +if (!min_value && !max_value) { + feature_enabled = false; + goto out; + } + +smu_v13_0_7_get_od_setting_limits (smu,PP_OD_FEATURE_FAN_CURVE_PWM , + &min_value, &max_value); +if (!min_value && !max_value) { + feature_enabled = false; + goto out; + } + } +break ; +default : + feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit)); +break ; + } + +out: +return feature_enabled; } static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu,
Signature · 1 line
2.53.0