diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen.c')
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 18b66ff59dcf..bdd3d3470421 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -84,6 +84,53 @@ void evergreen_tiling_fields(unsigned tiling_flags, unsigned *bankw, | |||
84 | } | 84 | } |
85 | } | 85 | } |
86 | 86 | ||
87 | static int sumo_set_uvd_clock(struct radeon_device *rdev, u32 clock, | ||
88 | u32 cntl_reg, u32 status_reg) | ||
89 | { | ||
90 | int r, i; | ||
91 | struct atom_clock_dividers dividers; | ||
92 | |||
93 | r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, | ||
94 | clock, false, ÷rs); | ||
95 | if (r) | ||
96 | return r; | ||
97 | |||
98 | WREG32_P(cntl_reg, dividers.post_div, ~(DCLK_DIR_CNTL_EN|DCLK_DIVIDER_MASK)); | ||
99 | |||
100 | for (i = 0; i < 100; i++) { | ||
101 | if (RREG32(status_reg) & DCLK_STATUS) | ||
102 | break; | ||
103 | mdelay(10); | ||
104 | } | ||
105 | if (i == 100) | ||
106 | return -ETIMEDOUT; | ||
107 | |||
108 | return 0; | ||
109 | } | ||
110 | |||
111 | int sumo_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk) | ||
112 | { | ||
113 | int r = 0; | ||
114 | u32 cg_scratch = RREG32(CG_SCRATCH1); | ||
115 | |||
116 | r = sumo_set_uvd_clock(rdev, vclk, CG_VCLK_CNTL, CG_VCLK_STATUS); | ||
117 | if (r) | ||
118 | goto done; | ||
119 | cg_scratch &= 0xffff0000; | ||
120 | cg_scratch |= vclk / 100; /* Mhz */ | ||
121 | |||
122 | r = sumo_set_uvd_clock(rdev, dclk, CG_DCLK_CNTL, CG_DCLK_STATUS); | ||
123 | if (r) | ||
124 | goto done; | ||
125 | cg_scratch &= 0x0000ffff; | ||
126 | cg_scratch |= (dclk / 100) << 16; /* Mhz */ | ||
127 | |||
128 | done: | ||
129 | WREG32(CG_SCRATCH1, cg_scratch); | ||
130 | |||
131 | return r; | ||
132 | } | ||
133 | |||
87 | void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev) | 134 | void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev) |
88 | { | 135 | { |
89 | u16 ctl, v; | 136 | u16 ctl, v; |