mirror of
https://github.com/torvalds/linux.git
synced 2025-01-01 07:42:07 +00:00
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: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
58653abdd2
commit
6517194417
@ -1478,7 +1478,7 @@ int cypress_construct_voltage_tables(struct radeon_device *rdev)
|
|||||||
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
|
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
|
||||||
int ret;
|
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);
|
&eg_pi->vddc_voltage_table);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@ -1488,7 +1488,7 @@ int cypress_construct_voltage_tables(struct radeon_device *rdev)
|
|||||||
&eg_pi->vddc_voltage_table);
|
&eg_pi->vddc_voltage_table);
|
||||||
|
|
||||||
if (eg_pi->vddci_control) {
|
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);
|
&eg_pi->vddci_voltage_table);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -242,7 +242,7 @@ int radeon_atom_get_min_voltage(struct radeon_device *rdev,
|
|||||||
int radeon_atom_get_max_voltage(struct radeon_device *rdev,
|
int radeon_atom_get_max_voltage(struct radeon_device *rdev,
|
||||||
u8 voltage_type, u16 *max_voltage);
|
u8 voltage_type, u16 *max_voltage);
|
||||||
int radeon_atom_get_voltage_table(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);
|
struct atom_voltage_table *voltage_table);
|
||||||
bool radeon_atom_is_voltage_gpio(struct radeon_device *rdev,
|
bool radeon_atom_is_voltage_gpio(struct radeon_device *rdev,
|
||||||
u8 voltage_type, u8 voltage_mode);
|
u8 voltage_type, u8 voltage_mode);
|
||||||
|
@ -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,
|
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)
|
struct atom_voltage_table *voltage_table)
|
||||||
{
|
{
|
||||||
int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo);
|
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 *)
|
voltage_info = (union voltage_object_info *)
|
||||||
(rdev->mode_info.atom_context->bios + data_offset);
|
(rdev->mode_info.atom_context->bios + data_offset);
|
||||||
|
|
||||||
|
switch (frev) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
switch (crev) {
|
switch (crev) {
|
||||||
case 1:
|
case 1:
|
||||||
DRM_ERROR("old table version %d, %d\n", frev, crev);
|
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");
|
DRM_ERROR("unknown voltage object table\n");
|
||||||
return -EINVAL;
|
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;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -597,6 +597,7 @@ struct atom_voltage_table
|
|||||||
{
|
{
|
||||||
u32 count;
|
u32 count;
|
||||||
u32 mask_low;
|
u32 mask_low;
|
||||||
|
u32 phase_delay;
|
||||||
struct atom_voltage_table_entry entries[MAX_VOLTAGE_ENTRIES];
|
struct atom_voltage_table_entry entries[MAX_VOLTAGE_ENTRIES];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user