|
@@ -2554,3 +2554,34 @@ void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
|
|
|
radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
|
|
|
radeon_ring_write(ring, 0x0);
|
|
|
}
|
|
|
+
|
|
|
+int tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
|
|
|
+{
|
|
|
+ struct atom_clock_dividers dividers;
|
|
|
+ int r, i;
|
|
|
+
|
|
|
+ r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
|
|
|
+ ecclk, false, ÷rs);
|
|
|
+ if (r)
|
|
|
+ return r;
|
|
|
+
|
|
|
+ for (i = 0; i < 100; i++) {
|
|
|
+ if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)
|
|
|
+ break;
|
|
|
+ mdelay(10);
|
|
|
+ }
|
|
|
+ if (i == 100)
|
|
|
+ return -ETIMEDOUT;
|
|
|
+
|
|
|
+ WREG32_P(CG_ECLK_CNTL, dividers.post_div, ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK));
|
|
|
+
|
|
|
+ for (i = 0; i < 100; i++) {
|
|
|
+ if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)
|
|
|
+ break;
|
|
|
+ mdelay(10);
|
|
|
+ }
|
|
|
+ if (i == 100)
|
|
|
+ return -ETIMEDOUT;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|