aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2011-10-28 18:18:50 -0400
committerDave Airlie <airlied@redhat.com>2011-11-01 12:05:12 -0400
commit24153dd35edda344936ebf0f00ce477f7ed7df3b (patch)
tree3ac05521092a14bc0c1de8f6e8e863f98655cc4d /drivers
parent3f03ced88087923863aa96a5773072ef2417bbed (diff)
drm/radeon/kms: make atombios_dvo_setup() version based
Use table version numbers for param setup. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/radeon/atombios_encoders.c59
1 files changed, 38 insertions, 21 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
index 36274fac48ac..7d91d3ca9c69 100644
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
@@ -239,32 +239,49 @@ atombios_dvo_setup(struct drm_encoder *encoder, int action)
239 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 239 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
240 union dvo_encoder_control args; 240 union dvo_encoder_control args;
241 int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl); 241 int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
242 uint8_t frev, crev;
242 243
243 memset(&args, 0, sizeof(args)); 244 memset(&args, 0, sizeof(args));
244 245
245 if (ASIC_IS_DCE3(rdev)) { 246 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
246 /* DCE3+ */ 247 return;
247 args.dvo_v3.ucAction = action;
248 args.dvo_v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
249 args.dvo_v3.ucDVOConfig = 0; /* XXX */
250 } else if (ASIC_IS_DCE2(rdev)) {
251 /* DCE2 (pre-DCE3 R6xx, RS600/690/740 */
252 args.dvo.sDVOEncoder.ucAction = action;
253 args.dvo.sDVOEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
254 /* DFP1, CRT1, TV1 depending on the type of port */
255 args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX;
256
257 if (radeon_encoder->pixel_clock > 165000)
258 args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL;
259 } else {
260 /* R4xx, R5xx */
261 args.ext_tmds.sXTmdsEncoder.ucEnable = action;
262 248
263 if (radeon_encoder->pixel_clock > 165000) 249 switch (frev) {
264 args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL; 250 case 1:
251 switch (crev) {
252 case 1:
253 /* R4xx, R5xx */
254 args.ext_tmds.sXTmdsEncoder.ucEnable = action;
255
256 if (radeon_encoder->pixel_clock > 165000)
257 args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL;
258
259 args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB;
260 break;
261 case 2:
262 /* RS600/690/740 */
263 args.dvo.sDVOEncoder.ucAction = action;
264 args.dvo.sDVOEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
265 /* DFP1, CRT1, TV1 depending on the type of port */
266 args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX;
265 267
266 /*if (pScrn->rgbBits == 8)*/ 268 if (radeon_encoder->pixel_clock > 165000)
267 args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB; 269 args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL;
270 break;
271 case 3:
272 /* R6xx */
273 args.dvo_v3.ucAction = action;
274 args.dvo_v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
275 args.dvo_v3.ucDVOConfig = 0; /* XXX */
276 break;
277 default:
278 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
279 break;
280 }
281 break;
282 default:
283 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
284 break;
268 } 285 }
269 286
270 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 287 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);