diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/rs600.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 6acba8017b9a..76cc8d3aafec 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
@@ -153,6 +153,70 @@ u32 rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) | |||
153 | return RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING; | 153 | return RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING; |
154 | } | 154 | } |
155 | 155 | ||
156 | void avivo_program_fmt(struct drm_encoder *encoder) | ||
157 | { | ||
158 | struct drm_device *dev = encoder->dev; | ||
159 | struct radeon_device *rdev = dev->dev_private; | ||
160 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
161 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
162 | int bpc = 0; | ||
163 | u32 tmp = 0; | ||
164 | enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE; | ||
165 | |||
166 | if (connector) { | ||
167 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | ||
168 | bpc = radeon_get_monitor_bpc(connector); | ||
169 | dither = radeon_connector->dither; | ||
170 | } | ||
171 | |||
172 | /* LVDS FMT is set up by atom */ | ||
173 | if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT) | ||
174 | return; | ||
175 | |||
176 | if (bpc == 0) | ||
177 | return; | ||
178 | |||
179 | switch (bpc) { | ||
180 | case 6: | ||
181 | if (dither == RADEON_FMT_DITHER_ENABLE) | ||
182 | /* XXX sort out optimal dither settings */ | ||
183 | tmp |= AVIVO_TMDS_BIT_DEPTH_CONTROL_SPATIAL_DITHER_EN; | ||
184 | else | ||
185 | tmp |= AVIVO_TMDS_BIT_DEPTH_CONTROL_TRUNCATE_EN; | ||
186 | break; | ||
187 | case 8: | ||
188 | if (dither == RADEON_FMT_DITHER_ENABLE) | ||
189 | /* XXX sort out optimal dither settings */ | ||
190 | tmp |= (AVIVO_TMDS_BIT_DEPTH_CONTROL_SPATIAL_DITHER_EN | | ||
191 | AVIVO_TMDS_BIT_DEPTH_CONTROL_SPATIAL_DITHER_DEPTH); | ||
192 | else | ||
193 | tmp |= (AVIVO_TMDS_BIT_DEPTH_CONTROL_TRUNCATE_EN | | ||
194 | AVIVO_TMDS_BIT_DEPTH_CONTROL_TRUNCATE_DEPTH); | ||
195 | break; | ||
196 | case 10: | ||
197 | default: | ||
198 | /* not needed */ | ||
199 | break; | ||
200 | } | ||
201 | |||
202 | switch (radeon_encoder->encoder_id) { | ||
203 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: | ||
204 | WREG32(AVIVO_TMDSA_BIT_DEPTH_CONTROL, tmp); | ||
205 | break; | ||
206 | case ENCODER_OBJECT_ID_INTERNAL_LVTM1: | ||
207 | WREG32(AVIVO_LVTMA_BIT_DEPTH_CONTROL, tmp); | ||
208 | break; | ||
209 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: | ||
210 | WREG32(AVIVO_DVOA_BIT_DEPTH_CONTROL, tmp); | ||
211 | break; | ||
212 | case ENCODER_OBJECT_ID_INTERNAL_DDI: | ||
213 | WREG32(AVIVO_DDIA_BIT_DEPTH_CONTROL, tmp); | ||
214 | break; | ||
215 | default: | ||
216 | break; | ||
217 | } | ||
218 | } | ||
219 | |||
156 | void rs600_pm_misc(struct radeon_device *rdev) | 220 | void rs600_pm_misc(struct radeon_device *rdev) |
157 | { | 221 | { |
158 | int requested_index = rdev->pm.requested_power_state_index; | 222 | int requested_index = rdev->pm.requested_power_state_index; |