drm/radeon/kms/pm: add support for SetVoltage cmd table (V2)
- This enables voltage adjustment on r6xx+ and certain r5xx asics. - Voltage drop support is already available for most r1xx-r5xx asics. V2: endian fix for voltage table. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
cb5fcbd540
commit
7ac9aa5a1f
|
@ -475,6 +475,12 @@ void r600_pm_init_profile(struct radeon_device *rdev)
|
||||||
|
|
||||||
void r600_pm_misc(struct radeon_device *rdev)
|
void r600_pm_misc(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
|
int requested_index = rdev->pm.requested_power_state_index;
|
||||||
|
struct radeon_power_state *ps = &rdev->pm.power_state[requested_index];
|
||||||
|
struct radeon_voltage *voltage = &ps->clock_info[0].voltage;
|
||||||
|
|
||||||
|
if ((voltage->type == VOLTAGE_SW) && voltage->voltage)
|
||||||
|
radeon_atom_set_voltage(rdev, voltage->voltage);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -176,6 +176,7 @@ void radeon_pm_suspend(struct radeon_device *rdev);
|
||||||
void radeon_pm_resume(struct radeon_device *rdev);
|
void radeon_pm_resume(struct radeon_device *rdev);
|
||||||
void radeon_combios_get_power_modes(struct radeon_device *rdev);
|
void radeon_combios_get_power_modes(struct radeon_device *rdev);
|
||||||
void radeon_atombios_get_power_modes(struct radeon_device *rdev);
|
void radeon_atombios_get_power_modes(struct radeon_device *rdev);
|
||||||
|
void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fences.
|
* Fences.
|
||||||
|
|
|
@ -1998,6 +1998,42 @@ void radeon_atom_set_memory_clock(struct radeon_device *rdev,
|
||||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
union set_voltage {
|
||||||
|
struct _SET_VOLTAGE_PS_ALLOCATION alloc;
|
||||||
|
struct _SET_VOLTAGE_PARAMETERS v1;
|
||||||
|
struct _SET_VOLTAGE_PARAMETERS_V2 v2;
|
||||||
|
};
|
||||||
|
|
||||||
|
void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level)
|
||||||
|
{
|
||||||
|
union set_voltage args;
|
||||||
|
int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
|
||||||
|
u8 frev, crev, volt_index = level;
|
||||||
|
|
||||||
|
if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (crev) {
|
||||||
|
case 1:
|
||||||
|
args.v1.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC;
|
||||||
|
args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE;
|
||||||
|
args.v1.ucVoltageIndex = volt_index;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
args.v2.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC;
|
||||||
|
args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE;
|
||||||
|
args.v2.usVoltageLevel = cpu_to_le16(level);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
|
void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct radeon_device *rdev = dev->dev_private;
|
struct radeon_device *rdev = dev->dev_private;
|
||||||
|
|
|
@ -74,7 +74,8 @@ void rs600_pm_misc(struct radeon_device *rdev)
|
||||||
if (voltage->delay)
|
if (voltage->delay)
|
||||||
udelay(voltage->delay);
|
udelay(voltage->delay);
|
||||||
}
|
}
|
||||||
}
|
} else if (voltage->type == VOLTAGE_VDDC)
|
||||||
|
radeon_atom_set_voltage(rdev, voltage->vddc_id);
|
||||||
|
|
||||||
dyn_pwrmgt_sclk_length = RREG32_PLL(DYN_PWRMGT_SCLK_LENGTH);
|
dyn_pwrmgt_sclk_length = RREG32_PLL(DYN_PWRMGT_SCLK_LENGTH);
|
||||||
dyn_pwrmgt_sclk_length &= ~REDUCED_POWER_SCLK_HILEN(0xf);
|
dyn_pwrmgt_sclk_length &= ~REDUCED_POWER_SCLK_HILEN(0xf);
|
||||||
|
|
Loading…
Reference in New Issue