Commit ce6eb957 authored by Ma Jun's avatar Ma Jun Committed by Alex Deucher
Browse files

drm/amd/pm: Add reset option for fan_ctrl on smu 13.0.7



Add reset option for fan_ctrl interfaces on the smu v13.0.7
User can use command "echo r > interface_name" to reset the
interface to boot value

Signed-off-by: default avatarMa Jun <Jun.Ma2@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 1007bc36
Loading
Loading
Loading
Loading
+64 −5
Original line number Diff line number Diff line
@@ -1497,6 +1497,59 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
	return size;
}

static int smu_v13_0_7_od_restore_table_single(struct smu_context *smu, long input)
{
	struct smu_table_context *table_context = &smu->smu_table;
	OverDriveTableExternal_t *boot_overdrive_table =
		(OverDriveTableExternal_t *)table_context->boot_overdrive_table;
	OverDriveTableExternal_t *od_table =
		(OverDriveTableExternal_t *)table_context->overdrive_table;
	struct amdgpu_device *adev = smu->adev;
	int i;

	switch (input) {
	case PP_OD_EDIT_FAN_CURVE:
		for (i = 0; i < NUM_OD_FAN_MAX_POINTS; i++) {
			od_table->OverDriveTable.FanLinearTempPoints[i] =
					boot_overdrive_table->OverDriveTable.FanLinearTempPoints[i];
			od_table->OverDriveTable.FanLinearPwmPoints[i] =
					boot_overdrive_table->OverDriveTable.FanLinearPwmPoints[i];
		}
		od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
		od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
		break;
	case PP_OD_EDIT_ACOUSTIC_LIMIT:
		od_table->OverDriveTable.AcousticLimitRpmThreshold =
					boot_overdrive_table->OverDriveTable.AcousticLimitRpmThreshold;
		od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
		od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
		break;
	case PP_OD_EDIT_ACOUSTIC_TARGET:
		od_table->OverDriveTable.AcousticTargetRpmThreshold =
					boot_overdrive_table->OverDriveTable.AcousticTargetRpmThreshold;
		od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
		od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
		break;
	case PP_OD_EDIT_FAN_TARGET_TEMPERATURE:
		od_table->OverDriveTable.FanTargetTemperature =
					boot_overdrive_table->OverDriveTable.FanTargetTemperature;
		od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
		od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
		break;
	case PP_OD_EDIT_FAN_MINIMUM_PWM:
		od_table->OverDriveTable.FanMinimumPwm =
					boot_overdrive_table->OverDriveTable.FanMinimumPwm;
		od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
		od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
		break;
	default:
		dev_info(adev->dev, "Invalid table index: %ld\n", input);
		return -EINVAL;
	}

	return 0;
}

static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
					 enum PP_OD_DPM_TABLE_COMMAND type,
					 long input[],
@@ -1783,11 +1836,17 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
		break;

	case PP_OD_RESTORE_DEFAULT_TABLE:
		if (size == 1) {
			ret = smu_v13_0_7_od_restore_table_single(smu, input[0]);
			if (ret)
				return ret;
		} else {
			feature_ctrlmask = od_table->OverDriveTable.FeatureCtrlMask;
			memcpy(od_table,
					table_context->boot_overdrive_table,
					sizeof(OverDriveTableExternal_t));
			od_table->OverDriveTable.FeatureCtrlMask = feature_ctrlmask;
		}
		fallthrough;

	case PP_OD_COMMIT_DPM_TABLE: