drm/radeon/kms: add voltage type to atom set voltage function
This is needed for setting voltages other than vddc. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
b4df8be104
commit
8a83ec5ee8
|
@ -122,7 +122,7 @@ void evergreen_pm_misc(struct radeon_device *rdev)
|
||||||
|
|
||||||
if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
|
if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
|
||||||
if (voltage->voltage != rdev->pm.current_vddc) {
|
if (voltage->voltage != rdev->pm.current_vddc) {
|
||||||
radeon_atom_set_voltage(rdev, voltage->voltage);
|
radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
|
||||||
rdev->pm.current_vddc = voltage->voltage;
|
rdev->pm.current_vddc = voltage->voltage;
|
||||||
DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
|
DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
|
||||||
}
|
}
|
||||||
|
|
|
@ -587,7 +587,7 @@ void r600_pm_misc(struct radeon_device *rdev)
|
||||||
|
|
||||||
if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
|
if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
|
||||||
if (voltage->voltage != rdev->pm.current_vddc) {
|
if (voltage->voltage != rdev->pm.current_vddc) {
|
||||||
radeon_atom_set_voltage(rdev, voltage->voltage);
|
radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
|
||||||
rdev->pm.current_vddc = voltage->voltage;
|
rdev->pm.current_vddc = voltage->voltage;
|
||||||
DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage);
|
DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage);
|
||||||
}
|
}
|
||||||
|
|
|
@ -177,7 +177,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);
|
void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type);
|
||||||
void rs690_pm_info(struct radeon_device *rdev);
|
void rs690_pm_info(struct radeon_device *rdev);
|
||||||
extern int rv6xx_get_temp(struct radeon_device *rdev);
|
extern int rv6xx_get_temp(struct radeon_device *rdev);
|
||||||
extern int rv770_get_temp(struct radeon_device *rdev);
|
extern int rv770_get_temp(struct radeon_device *rdev);
|
||||||
|
|
|
@ -2577,25 +2577,25 @@ union set_voltage {
|
||||||
struct _SET_VOLTAGE_PARAMETERS_V2 v2;
|
struct _SET_VOLTAGE_PARAMETERS_V2 v2;
|
||||||
};
|
};
|
||||||
|
|
||||||
void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level)
|
void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type)
|
||||||
{
|
{
|
||||||
union set_voltage args;
|
union set_voltage args;
|
||||||
int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
|
int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
|
||||||
u8 frev, crev, volt_index = level;
|
u8 frev, crev, volt_index = voltage_level;
|
||||||
|
|
||||||
if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
|
if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (crev) {
|
switch (crev) {
|
||||||
case 1:
|
case 1:
|
||||||
args.v1.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC;
|
args.v1.ucVoltageType = voltage_type;
|
||||||
args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE;
|
args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE;
|
||||||
args.v1.ucVoltageIndex = volt_index;
|
args.v1.ucVoltageIndex = volt_index;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
args.v2.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC;
|
args.v2.ucVoltageType = voltage_type;
|
||||||
args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE;
|
args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE;
|
||||||
args.v2.usVoltageLevel = cpu_to_le16(level);
|
args.v2.usVoltageLevel = cpu_to_le16(voltage_level);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
|
DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "radeon.h"
|
#include "radeon.h"
|
||||||
#include "avivod.h"
|
#include "avivod.h"
|
||||||
|
#include "atom.h"
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -535,7 +536,8 @@ void radeon_pm_resume(struct radeon_device *rdev)
|
||||||
/* set up the default clocks if the MC ucode is loaded */
|
/* set up the default clocks if the MC ucode is loaded */
|
||||||
if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) {
|
if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) {
|
||||||
if (rdev->pm.default_vddc)
|
if (rdev->pm.default_vddc)
|
||||||
radeon_atom_set_voltage(rdev, rdev->pm.default_vddc);
|
radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
|
||||||
|
SET_VOLTAGE_TYPE_ASIC_VDDC);
|
||||||
if (rdev->pm.default_sclk)
|
if (rdev->pm.default_sclk)
|
||||||
radeon_set_engine_clock(rdev, rdev->pm.default_sclk);
|
radeon_set_engine_clock(rdev, rdev->pm.default_sclk);
|
||||||
if (rdev->pm.default_mclk)
|
if (rdev->pm.default_mclk)
|
||||||
|
@ -585,7 +587,8 @@ int radeon_pm_init(struct radeon_device *rdev)
|
||||||
/* set up the default clocks if the MC ucode is loaded */
|
/* set up the default clocks if the MC ucode is loaded */
|
||||||
if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) {
|
if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) {
|
||||||
if (rdev->pm.default_vddc)
|
if (rdev->pm.default_vddc)
|
||||||
radeon_atom_set_voltage(rdev, rdev->pm.default_vddc);
|
radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
|
||||||
|
SET_VOLTAGE_TYPE_ASIC_VDDC);
|
||||||
if (rdev->pm.default_sclk)
|
if (rdev->pm.default_sclk)
|
||||||
radeon_set_engine_clock(rdev, rdev->pm.default_sclk);
|
radeon_set_engine_clock(rdev, rdev->pm.default_sclk);
|
||||||
if (rdev->pm.default_mclk)
|
if (rdev->pm.default_mclk)
|
||||||
|
|
|
@ -114,7 +114,7 @@ void rs600_pm_misc(struct radeon_device *rdev)
|
||||||
udelay(voltage->delay);
|
udelay(voltage->delay);
|
||||||
}
|
}
|
||||||
} else if (voltage->type == VOLTAGE_VDDC)
|
} else if (voltage->type == VOLTAGE_VDDC)
|
||||||
radeon_atom_set_voltage(rdev, voltage->vddc_id);
|
radeon_atom_set_voltage(rdev, voltage->vddc_id, SET_VOLTAGE_TYPE_ASIC_VDDC);
|
||||||
|
|
||||||
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);
|
||||||
|
|
|
@ -106,7 +106,7 @@ void rv770_pm_misc(struct radeon_device *rdev)
|
||||||
|
|
||||||
if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
|
if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
|
||||||
if (voltage->voltage != rdev->pm.current_vddc) {
|
if (voltage->voltage != rdev->pm.current_vddc) {
|
||||||
radeon_atom_set_voltage(rdev, voltage->voltage);
|
radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
|
||||||
rdev->pm.current_vddc = voltage->voltage;
|
rdev->pm.current_vddc = voltage->voltage;
|
||||||
DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
|
DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue