aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/rv6xx_dpm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/rv6xx_dpm.c')
-rw-r--r--drivers/gpu/drm/radeon/rv6xx_dpm.c38
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
1510static 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
1527static 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
1510int rv6xx_dpm_enable(struct radeon_device *rdev) 1544int 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