mirror of
https://github.com/openbsd/src.git
synced 2026-06-18 15:23:33 +02:00
drm/amd/pm: disable OD_FAN_CURVE if temp or pwm range invalid for smu v13
From Yang Wang ba9be472a438ea348f0fffaaebf541960ee643db in linux-6.18.y/6.18.22 3e6dd28a11083e83e11a284d99fcc9eb748c321c in mainline linux
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user