|
@@ -1489,7 +1489,7 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
int state_index = 0, mode_index = 0;
|
|
|
struct radeon_i2c_bus_rec i2c_bus;
|
|
|
|
|
|
- rdev->pm.default_power_state = NULL;
|
|
|
+ rdev->pm.default_power_state_index = -1;
|
|
|
|
|
|
if (atom_parse_data_header(mode_info->atom_context, index, NULL,
|
|
|
&frev, &crev, &data_offset)) {
|
|
@@ -1520,12 +1520,6 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
|
|
|
(rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
|
|
|
continue;
|
|
|
- /* skip overclock modes for now */
|
|
|
- if ((rdev->pm.power_state[state_index].clock_info[0].mclk >
|
|
|
- rdev->clock.default_mclk + RADEON_MODE_OVERCLOCK_MARGIN) ||
|
|
|
- (rdev->pm.power_state[state_index].clock_info[0].sclk >
|
|
|
- rdev->clock.default_sclk + RADEON_MODE_OVERCLOCK_MARGIN))
|
|
|
- continue;
|
|
|
rdev->pm.power_state[state_index].non_clock_info.pcie_lanes =
|
|
|
power_info->info.asPowerPlayInfo[i].ucNumPciELanes;
|
|
|
misc = le32_to_cpu(power_info->info.asPowerPlayInfo[i].ulMiscInfo);
|
|
@@ -1547,6 +1541,7 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
|
|
|
power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex;
|
|
|
}
|
|
|
+ rdev->pm.power_state[state_index].flags = RADEON_PM_SINGLE_DISPLAY_ONLY;
|
|
|
/* order matters! */
|
|
|
if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
|
|
|
rdev->pm.power_state[state_index].type =
|
|
@@ -1560,15 +1555,20 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_BALANCED;
|
|
|
- if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN)
|
|
|
+ if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_PERFORMANCE;
|
|
|
+ rdev->pm.power_state[state_index].flags &=
|
|
|
+ ~RADEON_PM_SINGLE_DISPLAY_ONLY;
|
|
|
+ }
|
|
|
if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_DEFAULT;
|
|
|
- rdev->pm.default_power_state = &rdev->pm.power_state[state_index];
|
|
|
+ rdev->pm.default_power_state_index = state_index;
|
|
|
rdev->pm.power_state[state_index].default_clock_mode =
|
|
|
&rdev->pm.power_state[state_index].clock_info[0];
|
|
|
+ rdev->pm.power_state[state_index].flags &=
|
|
|
+ ~RADEON_PM_SINGLE_DISPLAY_ONLY;
|
|
|
}
|
|
|
state_index++;
|
|
|
break;
|
|
@@ -1582,12 +1582,6 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
|
|
|
(rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
|
|
|
continue;
|
|
|
- /* skip overclock modes for now */
|
|
|
- if ((rdev->pm.power_state[state_index].clock_info[0].mclk >
|
|
|
- rdev->clock.default_mclk + RADEON_MODE_OVERCLOCK_MARGIN) ||
|
|
|
- (rdev->pm.power_state[state_index].clock_info[0].sclk >
|
|
|
- rdev->clock.default_sclk + RADEON_MODE_OVERCLOCK_MARGIN))
|
|
|
- continue;
|
|
|
rdev->pm.power_state[state_index].non_clock_info.pcie_lanes =
|
|
|
power_info->info_2.asPowerPlayInfo[i].ucNumPciELanes;
|
|
|
misc = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo);
|
|
@@ -1610,6 +1604,7 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
|
|
|
power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex;
|
|
|
}
|
|
|
+ rdev->pm.power_state[state_index].flags = RADEON_PM_SINGLE_DISPLAY_ONLY;
|
|
|
/* order matters! */
|
|
|
if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
|
|
|
rdev->pm.power_state[state_index].type =
|
|
@@ -1623,18 +1618,26 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_BALANCED;
|
|
|
- if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN)
|
|
|
+ if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_PERFORMANCE;
|
|
|
+ rdev->pm.power_state[state_index].flags &=
|
|
|
+ ~RADEON_PM_SINGLE_DISPLAY_ONLY;
|
|
|
+ }
|
|
|
if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE)
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_BALANCED;
|
|
|
+ if (misc2 & ATOM_PM_MISCINFO2_MULTI_DISPLAY_SUPPORT)
|
|
|
+ rdev->pm.power_state[state_index].flags &=
|
|
|
+ ~RADEON_PM_SINGLE_DISPLAY_ONLY;
|
|
|
if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_DEFAULT;
|
|
|
- rdev->pm.default_power_state = &rdev->pm.power_state[state_index];
|
|
|
+ rdev->pm.default_power_state_index = state_index;
|
|
|
rdev->pm.power_state[state_index].default_clock_mode =
|
|
|
&rdev->pm.power_state[state_index].clock_info[0];
|
|
|
+ rdev->pm.power_state[state_index].flags &=
|
|
|
+ ~RADEON_PM_SINGLE_DISPLAY_ONLY;
|
|
|
}
|
|
|
state_index++;
|
|
|
break;
|
|
@@ -1648,12 +1651,6 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
|
|
|
(rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
|
|
|
continue;
|
|
|
- /* skip overclock modes for now */
|
|
|
- if ((rdev->pm.power_state[state_index].clock_info[0].mclk >
|
|
|
- rdev->clock.default_mclk + RADEON_MODE_OVERCLOCK_MARGIN) ||
|
|
|
- (rdev->pm.power_state[state_index].clock_info[0].sclk >
|
|
|
- rdev->clock.default_sclk + RADEON_MODE_OVERCLOCK_MARGIN))
|
|
|
- continue;
|
|
|
rdev->pm.power_state[state_index].non_clock_info.pcie_lanes =
|
|
|
power_info->info_3.asPowerPlayInfo[i].ucNumPciELanes;
|
|
|
misc = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo);
|
|
@@ -1682,6 +1679,7 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
power_info->info_3.asPowerPlayInfo[i].ucVDDCI_VoltageDropIndex;
|
|
|
}
|
|
|
}
|
|
|
+ rdev->pm.power_state[state_index].flags = RADEON_PM_SINGLE_DISPLAY_ONLY;
|
|
|
/* order matters! */
|
|
|
if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
|
|
|
rdev->pm.power_state[state_index].type =
|
|
@@ -1695,16 +1693,19 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_BALANCED;
|
|
|
- if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN)
|
|
|
+ if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_PERFORMANCE;
|
|
|
+ rdev->pm.power_state[state_index].flags &=
|
|
|
+ ~RADEON_PM_SINGLE_DISPLAY_ONLY;
|
|
|
+ }
|
|
|
if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE)
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_BALANCED;
|
|
|
if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_DEFAULT;
|
|
|
- rdev->pm.default_power_state = &rdev->pm.power_state[state_index];
|
|
|
+ rdev->pm.default_power_state_index = state_index;
|
|
|
rdev->pm.power_state[state_index].default_clock_mode =
|
|
|
&rdev->pm.power_state[state_index].clock_info[0];
|
|
|
}
|
|
@@ -1713,12 +1714,14 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
}
|
|
|
}
|
|
|
/* last mode is usually default */
|
|
|
- if (!rdev->pm.default_power_state) {
|
|
|
+ if (rdev->pm.default_power_state_index == -1) {
|
|
|
rdev->pm.power_state[state_index - 1].type =
|
|
|
POWER_STATE_TYPE_DEFAULT;
|
|
|
- rdev->pm.default_power_state = &rdev->pm.power_state[state_index - 1];
|
|
|
+ rdev->pm.default_power_state_index = state_index - 1;
|
|
|
rdev->pm.power_state[state_index - 1].default_clock_mode =
|
|
|
&rdev->pm.power_state[state_index - 1].clock_info[0];
|
|
|
+ rdev->pm.power_state[state_index].flags &=
|
|
|
+ ~RADEON_PM_SINGLE_DISPLAY_ONLY;
|
|
|
}
|
|
|
} else {
|
|
|
/* add the i2c bus for thermal/fan chip */
|
|
@@ -1774,10 +1777,6 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
/* skip invalid modes */
|
|
|
if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)
|
|
|
continue;
|
|
|
- /* skip overclock modes for now */
|
|
|
- if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk >
|
|
|
- rdev->clock.default_sclk + RADEON_MODE_OVERCLOCK_MARGIN)
|
|
|
- continue;
|
|
|
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
|
|
|
VOLTAGE_SW;
|
|
|
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
|
|
@@ -1801,12 +1800,6 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) ||
|
|
|
(rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0))
|
|
|
continue;
|
|
|
- /* skip overclock modes for now */
|
|
|
- if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk >
|
|
|
- rdev->clock.default_mclk + RADEON_MODE_OVERCLOCK_MARGIN) ||
|
|
|
- (rdev->pm.power_state[state_index].clock_info[mode_index].sclk >
|
|
|
- rdev->clock.default_sclk + RADEON_MODE_OVERCLOCK_MARGIN))
|
|
|
- continue;
|
|
|
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
|
|
|
VOLTAGE_SW;
|
|
|
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
|
|
@@ -1831,12 +1824,6 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) ||
|
|
|
(rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0))
|
|
|
continue;
|
|
|
- /* skip overclock modes for now */
|
|
|
- if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk >
|
|
|
- rdev->clock.default_mclk + RADEON_MODE_OVERCLOCK_MARGIN) ||
|
|
|
- (rdev->pm.power_state[state_index].clock_info[mode_index].sclk >
|
|
|
- rdev->clock.default_sclk + RADEON_MODE_OVERCLOCK_MARGIN))
|
|
|
- continue;
|
|
|
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
|
|
|
VOLTAGE_SW;
|
|
|
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
|
|
@@ -1865,10 +1852,14 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
POWER_STATE_TYPE_PERFORMANCE;
|
|
|
break;
|
|
|
}
|
|
|
+ rdev->pm.power_state[state_index].flags = 0;
|
|
|
+ if (misc & ATOM_PPLIB_SINGLE_DISPLAY_ONLY)
|
|
|
+ rdev->pm.power_state[state_index].flags |=
|
|
|
+ RADEON_PM_SINGLE_DISPLAY_ONLY;
|
|
|
if (misc2 & ATOM_PPLIB_CLASSIFICATION_BOOT) {
|
|
|
rdev->pm.power_state[state_index].type =
|
|
|
POWER_STATE_TYPE_DEFAULT;
|
|
|
- rdev->pm.default_power_state = &rdev->pm.power_state[state_index];
|
|
|
+ rdev->pm.default_power_state_index = state_index;
|
|
|
rdev->pm.power_state[state_index].default_clock_mode =
|
|
|
&rdev->pm.power_state[state_index].clock_info[mode_index - 1];
|
|
|
}
|
|
@@ -1876,10 +1867,10 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
}
|
|
|
}
|
|
|
/* first mode is usually default */
|
|
|
- if (!rdev->pm.default_power_state) {
|
|
|
+ if (rdev->pm.default_power_state_index == -1) {
|
|
|
rdev->pm.power_state[0].type =
|
|
|
POWER_STATE_TYPE_DEFAULT;
|
|
|
- rdev->pm.default_power_state = &rdev->pm.power_state[0];
|
|
|
+ rdev->pm.default_power_state_index = 0;
|
|
|
rdev->pm.power_state[0].default_clock_mode =
|
|
|
&rdev->pm.power_state[0].clock_info[0];
|
|
|
}
|
|
@@ -1898,15 +1889,15 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|
|
rdev->pm.power_state[state_index].non_clock_info.pcie_lanes = radeon_get_pcie_lanes(rdev);
|
|
|
else
|
|
|
rdev->pm.power_state[state_index].non_clock_info.pcie_lanes = 16;
|
|
|
- rdev->pm.default_power_state = &rdev->pm.power_state[state_index];
|
|
|
+ rdev->pm.default_power_state_index = state_index;
|
|
|
+ rdev->pm.power_state[state_index].flags = 0;
|
|
|
state_index++;
|
|
|
}
|
|
|
|
|
|
rdev->pm.num_power_states = state_index;
|
|
|
|
|
|
- rdev->pm.current_power_state = rdev->pm.default_power_state;
|
|
|
- rdev->pm.current_clock_mode =
|
|
|
- rdev->pm.default_power_state->default_clock_mode;
|
|
|
+ rdev->pm.current_power_state_index = rdev->pm.default_power_state_index;
|
|
|
+ rdev->pm.current_clock_mode_index = 0;
|
|
|
}
|
|
|
|
|
|
void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable)
|