Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 65171944 authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/radeon: update radeon_atom_get_voltage_table() for SI



SI uses a new atom table revision.  Required for DPM on SI.

Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 58653abd
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1478,7 +1478,7 @@ int cypress_construct_voltage_tables(struct radeon_device *rdev)
	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
	int ret;

	ret = radeon_atom_get_voltage_table(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC,
	ret = radeon_atom_get_voltage_table(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 0,
					    &eg_pi->vddc_voltage_table);
	if (ret)
		return ret;
@@ -1488,7 +1488,7 @@ int cypress_construct_voltage_tables(struct radeon_device *rdev)
							      &eg_pi->vddc_voltage_table);

	if (eg_pi->vddci_control) {
		ret = radeon_atom_get_voltage_table(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI,
		ret = radeon_atom_get_voltage_table(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0,
						    &eg_pi->vddci_voltage_table);
		if (ret)
			return ret;
+1 −1
Original line number Diff line number Diff line
@@ -242,7 +242,7 @@ int radeon_atom_get_min_voltage(struct radeon_device *rdev,
int radeon_atom_get_max_voltage(struct radeon_device *rdev,
				u8 voltage_type, u16 *max_voltage);
int radeon_atom_get_voltage_table(struct radeon_device *rdev,
				  u8 voltage_type,
				  u8 voltage_type, u8 voltage_mode,
				  struct atom_voltage_table *voltage_table);
bool radeon_atom_is_voltage_gpio(struct radeon_device *rdev,
				 u8 voltage_type, u8 voltage_mode);
+65 −25
Original line number Diff line number Diff line
@@ -3372,7 +3372,7 @@ int radeon_atom_round_to_true_voltage(struct radeon_device *rdev,
}

int radeon_atom_get_voltage_table(struct radeon_device *rdev,
				  u8 voltage_type,
				  u8 voltage_type, u8 voltage_mode,
				  struct atom_voltage_table *voltage_table)
{
	int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo);
@@ -3386,6 +3386,9 @@ int radeon_atom_get_voltage_table(struct radeon_device *rdev,
		voltage_info = (union voltage_object_info *)
			(rdev->mode_info.atom_context->bios + data_offset);

		switch (frev) {
		case 1:
		case 2:
			switch (crev) {
			case 1:
				DRM_ERROR("old table version %d, %d\n", frev, crev);
@@ -3420,7 +3423,44 @@ int radeon_atom_get_voltage_table(struct radeon_device *rdev,
				DRM_ERROR("unknown voltage object table\n");
				return -EINVAL;
			}
			break;
		case 3:
			switch (crev) {
			case 1:
				num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
					sizeof(ATOM_VOLTAGE_OBJECT_INFO_V3_1);

				for (i = 0; i < num_indices; i++) {
					if ((voltage_info->v3.asVoltageObj[i].asGpioVoltageObj.sHeader.ucVoltageType ==
					     voltage_type) &&
					    (voltage_info->v3.asVoltageObj[i].asGpioVoltageObj.sHeader.ucVoltageMode ==
					     voltage_mode)) {
						ATOM_GPIO_VOLTAGE_OBJECT_V3 *gpio =
							&voltage_info->v3.asVoltageObj[i].asGpioVoltageObj;
						if (gpio->ucGpioEntryNum > MAX_VOLTAGE_ENTRIES)
							return -EINVAL;
						for (j = 0; j < gpio->ucGpioEntryNum; j++) {
							voltage_table->entries[j].value =
								le16_to_cpu(gpio->asVolGpioLut[j].usVoltageValue);
							voltage_table->entries[j].smio_low =
								le32_to_cpu(gpio->asVolGpioLut[j].ulVoltageId);
						}
						voltage_table->mask_low = le32_to_cpu(gpio->ulGpioMaskVal);
						voltage_table->count = gpio->ucGpioEntryNum;
						voltage_table->phase_delay = gpio->ucPhaseDelay;
						return 0;
					}
				}
				break;
			default:
				DRM_ERROR("unknown voltage object table\n");
				return -EINVAL;
			}
			break;
		default:
			DRM_ERROR("unknown voltage object table\n");
			return -EINVAL;
		}
	}
	return -EINVAL;
}
+1 −0
Original line number Diff line number Diff line
@@ -597,6 +597,7 @@ struct atom_voltage_table
{
	u32 count;
	u32 mask_low;
	u32 phase_delay;
	struct atom_voltage_table_entry entries[MAX_VOLTAGE_ENTRIES];
};