diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/rv6xx_dpm.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rv6xx_dpm.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/rv6xx_dpm.c b/drivers/gpu/drm/radeon/rv6xx_dpm.c index 120a63261c1a..0e8b7d9b954b 100644 --- a/drivers/gpu/drm/radeon/rv6xx_dpm.c +++ b/drivers/gpu/drm/radeon/rv6xx_dpm.c | |||
@@ -1507,6 +1507,40 @@ static void rv6xx_enable_dynamic_pcie_gen2(struct radeon_device *rdev, | |||
1507 | } | 1507 | } |
1508 | } | 1508 | } |
1509 | 1509 | ||
1510 | static void rv6xx_set_uvd_clock_before_set_eng_clock(struct radeon_device *rdev, | ||
1511 | struct radeon_ps *new_ps, | ||
1512 | struct radeon_ps *old_ps) | ||
1513 | { | ||
1514 | struct rv6xx_ps *new_state = rv6xx_get_ps(new_ps); | ||
1515 | struct rv6xx_ps *current_state = rv6xx_get_ps(old_ps); | ||
1516 | |||
1517 | if ((new_ps->vclk == old_ps->vclk) && | ||
1518 | (new_ps->dclk == old_ps->dclk)) | ||
1519 | return; | ||
1520 | |||
1521 | if (new_state->high.sclk >= current_state->high.sclk) | ||
1522 | return; | ||
1523 | |||
1524 | radeon_set_uvd_clocks(rdev, new_ps->vclk, new_ps->dclk); | ||
1525 | } | ||
1526 | |||
1527 | static void rv6xx_set_uvd_clock_after_set_eng_clock(struct radeon_device *rdev, | ||
1528 | struct radeon_ps *new_ps, | ||
1529 | struct radeon_ps *old_ps) | ||
1530 | { | ||
1531 | struct rv6xx_ps *new_state = rv6xx_get_ps(new_ps); | ||
1532 | struct rv6xx_ps *current_state = rv6xx_get_ps(old_ps); | ||
1533 | |||
1534 | if ((new_ps->vclk == old_ps->vclk) && | ||
1535 | (new_ps->dclk == old_ps->dclk)) | ||
1536 | return; | ||
1537 | |||
1538 | if (new_state->high.sclk < current_state->high.sclk) | ||
1539 | return; | ||
1540 | |||
1541 | radeon_set_uvd_clocks(rdev, new_ps->vclk, new_ps->dclk); | ||
1542 | } | ||
1543 | |||
1510 | int rv6xx_dpm_enable(struct radeon_device *rdev) | 1544 | int rv6xx_dpm_enable(struct radeon_device *rdev) |
1511 | { | 1545 | { |
1512 | struct rv6xx_power_info *pi = rv6xx_get_pi(rdev); | 1546 | struct rv6xx_power_info *pi = rv6xx_get_pi(rdev); |
@@ -1635,6 +1669,8 @@ int rv6xx_dpm_set_power_state(struct radeon_device *rdev) | |||
1635 | struct radeon_ps *old_ps = rdev->pm.dpm.current_ps; | 1669 | struct radeon_ps *old_ps = rdev->pm.dpm.current_ps; |
1636 | int ret; | 1670 | int ret; |
1637 | 1671 | ||
1672 | rv6xx_set_uvd_clock_before_set_eng_clock(rdev, new_ps, old_ps); | ||
1673 | |||
1638 | rv6xx_clear_vc(rdev); | 1674 | rv6xx_clear_vc(rdev); |
1639 | r600_power_level_enable(rdev, R600_POWER_LEVEL_LOW, true); | 1675 | r600_power_level_enable(rdev, R600_POWER_LEVEL_LOW, true); |
1640 | r600_set_at(rdev, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF); | 1676 | r600_set_at(rdev, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF); |
@@ -1717,6 +1753,8 @@ int rv6xx_dpm_set_power_state(struct radeon_device *rdev) | |||
1717 | rv6xx_program_vc(rdev); | 1753 | rv6xx_program_vc(rdev); |
1718 | rv6xx_program_at(rdev); | 1754 | rv6xx_program_at(rdev); |
1719 | 1755 | ||
1756 | rv6xx_set_uvd_clock_after_set_eng_clock(rdev, new_ps, old_ps); | ||
1757 | |||
1720 | return 0; | 1758 | return 0; |
1721 | } | 1759 | } |
1722 | 1760 | ||