Commit 58653abd authored by Alex Deucher's avatar Alex Deucher

drm/radeon: update radeon_atom_is_voltage_gpio() for SI

SI uses a new atom table.  Required for DPM on SI.
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent eaa778af
...@@ -2529,13 +2529,13 @@ int btc_dpm_init(struct radeon_device *rdev) ...@@ -2529,13 +2529,13 @@ int btc_dpm_init(struct radeon_device *rdev)
eg_pi->smu_uvd_hs = true; eg_pi->smu_uvd_hs = true;
pi->voltage_control = pi->voltage_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 0);
pi->mvdd_control = pi->mvdd_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 0);
eg_pi->vddci_control = eg_pi->vddci_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0);
if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
&frev, &crev, &data_offset)) { &frev, &crev, &data_offset)) {
......
...@@ -2022,13 +2022,13 @@ int cypress_dpm_init(struct radeon_device *rdev) ...@@ -2022,13 +2022,13 @@ int cypress_dpm_init(struct radeon_device *rdev)
pi->lmp = RV770_LMP_DFLT; pi->lmp = RV770_LMP_DFLT;
pi->voltage_control = pi->voltage_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 0);
pi->mvdd_control = pi->mvdd_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 0);
eg_pi->vddci_control = eg_pi->vddci_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0);
if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
&frev, &crev, &data_offset)) { &frev, &crev, &data_offset)) {
......
...@@ -3977,13 +3977,13 @@ int ni_dpm_init(struct radeon_device *rdev) ...@@ -3977,13 +3977,13 @@ int ni_dpm_init(struct radeon_device *rdev)
ni_pi->mclk_rtt_mode_threshold = eg_pi->mclk_edc_wr_enable_threshold; ni_pi->mclk_rtt_mode_threshold = eg_pi->mclk_edc_wr_enable_threshold;
pi->voltage_control = pi->voltage_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 0);
pi->mvdd_control = pi->mvdd_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 0);
eg_pi->vddci_control = eg_pi->vddci_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0);
if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
&frev, &crev, &data_offset)) { &frev, &crev, &data_offset)) {
......
...@@ -244,7 +244,8 @@ int radeon_atom_get_max_voltage(struct radeon_device *rdev, ...@@ -244,7 +244,8 @@ int radeon_atom_get_max_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,
struct atom_voltage_table *voltage_table); struct atom_voltage_table *voltage_table);
bool radeon_atom_is_voltage_gpio(struct radeon_device *rdev, u8 voltage_type); bool radeon_atom_is_voltage_gpio(struct radeon_device *rdev,
u8 voltage_type, u8 voltage_mode);
void radeon_atom_update_memory_dll(struct radeon_device *rdev, void radeon_atom_update_memory_dll(struct radeon_device *rdev,
u32 mem_clock); u32 mem_clock);
void radeon_atom_set_ac_timing(struct radeon_device *rdev, void radeon_atom_set_ac_timing(struct radeon_device *rdev,
......
...@@ -3102,12 +3102,14 @@ int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev, ...@@ -3102,12 +3102,14 @@ int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev,
} }
union voltage_object_info { union voltage_object_info {
struct _ATOM_VOLTAGE_OBJECT_INFO v1; struct _ATOM_VOLTAGE_OBJECT_INFO v1;
struct _ATOM_VOLTAGE_OBJECT_INFO_V2 v2; struct _ATOM_VOLTAGE_OBJECT_INFO_V2 v2;
struct _ATOM_VOLTAGE_OBJECT_INFO_V3_1 v3;
}; };
bool bool
radeon_atom_is_voltage_gpio(struct radeon_device *rdev, u8 voltage_type) radeon_atom_is_voltage_gpio(struct radeon_device *rdev,
u8 voltage_type, u8 voltage_mode)
{ {
int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo); int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo);
u8 frev, crev; u8 frev, crev;
...@@ -3120,27 +3122,54 @@ radeon_atom_is_voltage_gpio(struct radeon_device *rdev, u8 voltage_type) ...@@ -3120,27 +3122,54 @@ radeon_atom_is_voltage_gpio(struct radeon_device *rdev, u8 voltage_type)
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 (crev) { switch (frev) {
case 1: case 1:
num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / case 2:
sizeof(ATOM_VOLTAGE_OBJECT); switch (crev) {
case 1:
for (i = 0; i < num_indices; i++) { num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
if ((voltage_info->v1.asVoltageObj[i].ucVoltageType == voltage_type) && sizeof(ATOM_VOLTAGE_OBJECT);
(voltage_info->v1.asVoltageObj[i].asControl.ucVoltageControlId ==
VOLTAGE_CONTROLLED_BY_GPIO)) for (i = 0; i < num_indices; i++) {
return true; if ((voltage_info->v1.asVoltageObj[i].ucVoltageType == voltage_type) &&
(voltage_info->v1.asVoltageObj[i].asControl.ucVoltageControlId ==
VOLTAGE_CONTROLLED_BY_GPIO))
return true;
}
break;
case 2:
num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
sizeof(ATOM_VOLTAGE_OBJECT_INFO_V2);
for (i = 0; i < num_indices; i++) {
if ((voltage_info->v2.asVoltageObj[i].ucVoltageType == voltage_type) &&
(voltage_info->v2.asVoltageObj[i].asControl.ucVoltageControlId ==
VOLTAGE_CONTROLLED_BY_GPIO))
return true;
}
break;
default:
DRM_ERROR("unknown voltage object table\n");
return false;
} }
break; break;
case 2: case 3:
num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / switch (crev) {
sizeof(ATOM_VOLTAGE_OBJECT_INFO_V2); case 1:
num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
for (i = 0; i < num_indices; i++) { sizeof(ATOM_VOLTAGE_OBJECT_INFO_V3_1);
if ((voltage_info->v2.asVoltageObj[i].ucVoltageType == voltage_type) &&
(voltage_info->v2.asVoltageObj[i].asControl.ucVoltageControlId == for (i = 0; i < num_indices; i++) {
VOLTAGE_CONTROLLED_BY_GPIO)) if ((voltage_info->v3.asVoltageObj[i].asGpioVoltageObj.sHeader.ucVoltageType ==
return true; voltage_type) &&
(voltage_info->v3.asVoltageObj[i].asGpioVoltageObj.sHeader.ucVoltageMode ==
voltage_mode))
return true;
}
break;
default:
DRM_ERROR("unknown voltage object table\n");
return false;
} }
break; break;
default: default:
......
...@@ -1933,7 +1933,7 @@ int rv6xx_dpm_init(struct radeon_device *rdev) ...@@ -1933,7 +1933,7 @@ int rv6xx_dpm_init(struct radeon_device *rdev)
pi->fb_div_scale = 0; pi->fb_div_scale = 0;
pi->voltage_control = pi->voltage_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 0);
pi->gfx_clock_gating = true; pi->gfx_clock_gating = true;
......
...@@ -2301,10 +2301,10 @@ int rv770_dpm_init(struct radeon_device *rdev) ...@@ -2301,10 +2301,10 @@ int rv770_dpm_init(struct radeon_device *rdev)
pi->lmp = RV770_LMP_DFLT; pi->lmp = RV770_LMP_DFLT;
pi->voltage_control = pi->voltage_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 0);
pi->mvdd_control = pi->mvdd_control =
radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC); radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 0);
if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
&frev, &crev, &data_offset)) { &frev, &crev, &data_offset)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment