drm/radeon/kms/atom: cleanup and unify DVO handling

Handle all the various asic family specific things for DVO.

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by Alex Deucher and committed by Dave Airlie 99999aaa 8b834852

+51 -45
+4
drivers/gpu/drm/radeon/radeon.h
··· 1262 1262 (rdev->family == CHIP_RS400) || \ 1263 1263 (rdev->family == CHIP_RS480)) 1264 1264 #define ASIC_IS_AVIVO(rdev) ((rdev->family >= CHIP_RS600)) 1265 + #define ASIC_IS_DCE2(rdev) ((rdev->family == CHIP_RS600) || \ 1266 + (rdev->family == CHIP_RS690) || \ 1267 + (rdev->family == CHIP_RS740) || \ 1268 + (rdev->family >= CHIP_R600)) 1265 1269 #define ASIC_IS_DCE3(rdev) ((rdev->family >= CHIP_RV620)) 1266 1270 #define ASIC_IS_DCE32(rdev) ((rdev->family >= CHIP_RV730)) 1267 1271 #define ASIC_IS_DCE4(rdev) ((rdev->family >= CHIP_CEDAR))
+45 -43
drivers/gpu/drm/radeon/radeon_encoders.c
··· 176 176 return false; 177 177 } 178 178 } 179 + 179 180 void 180 181 radeon_link_encoder_connector(struct drm_device *dev) 181 182 { ··· 427 426 428 427 } 429 428 429 + union dvo_encoder_control { 430 + ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION ext_tmds; 431 + DVO_ENCODER_CONTROL_PS_ALLOCATION dvo; 432 + DVO_ENCODER_CONTROL_PS_ALLOCATION_V3 dvo_v3; 433 + }; 434 + 430 435 void 431 - atombios_external_tmds_setup(struct drm_encoder *encoder, int action) 436 + atombios_dvo_setup(struct drm_encoder *encoder, int action) 432 437 { 433 438 struct drm_device *dev = encoder->dev; 434 439 struct radeon_device *rdev = dev->dev_private; 435 440 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 436 - ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION args; 437 - int index = 0; 441 + union dvo_encoder_control args; 442 + int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl); 438 443 439 444 memset(&args, 0, sizeof(args)); 440 445 441 - index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl); 446 + if (ASIC_IS_DCE3(rdev)) { 447 + /* DCE3+ */ 448 + args.dvo_v3.ucAction = action; 449 + args.dvo_v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 450 + args.dvo_v3.ucDVOConfig = 0; /* XXX */ 451 + } else if (ASIC_IS_DCE2(rdev)) { 452 + /* DCE2 (pre-DCE3 R6xx, RS600/690/740 */ 453 + args.dvo.sDVOEncoder.ucAction = action; 454 + args.dvo.sDVOEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 455 + /* DFP1, CRT1, TV1 depending on the type of port */ 456 + args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX; 442 457 443 - args.sXTmdsEncoder.ucEnable = action; 458 + if (radeon_encoder->pixel_clock > 165000) 459 + args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL; 460 + } else { 461 + /* R4xx, R5xx */ 462 + args.ext_tmds.sXTmdsEncoder.ucEnable = action; 444 463 445 - if (radeon_encoder->pixel_clock > 165000) 446 - args.sXTmdsEncoder.ucMisc = PANEL_ENCODER_MISC_DUAL; 464 + if (radeon_encoder->pixel_clock > 165000) 465 + args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL; 447 466 448 - /*if (pScrn->rgbBits == 8)*/ 449 - args.sXTmdsEncoder.ucMisc |= (1 << 1); 450 - 451 - atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 452 - 453 - } 454 - 455 - static void 456 - atombios_ddia_setup(struct drm_encoder *encoder, int action) 457 - { 458 - struct drm_device *dev = encoder->dev; 459 - struct radeon_device *rdev = dev->dev_private; 460 - struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 461 - DVO_ENCODER_CONTROL_PS_ALLOCATION args; 462 - int index = 0; 463 - 464 - memset(&args, 0, sizeof(args)); 465 - 466 - index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl); 467 - 468 - args.sDVOEncoder.ucAction = action; 469 - args.sDVOEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 470 - 471 - if (radeon_encoder->pixel_clock > 165000) 472 - args.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute = PANEL_ENCODER_MISC_DUAL; 467 + /*if (pScrn->rgbBits == 8)*/ 468 + args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB; 469 + } 473 470 474 471 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 475 - 476 472 } 477 473 478 474 union lvds_encoder_control { ··· 530 532 if (dig->lcd_misc & ATOM_PANEL_MISC_DUAL) 531 533 args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL; 532 534 if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB) 533 - args.v1.ucMisc |= (1 << 1); 535 + args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB; 534 536 } else { 535 537 if (dig->linkb) 536 538 args.v1.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB; 537 539 if (radeon_encoder->pixel_clock > 165000) 538 540 args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL; 539 541 /*if (pScrn->rgbBits == 8) */ 540 - args.v1.ucMisc |= (1 << 1); 542 + args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB; 541 543 } 542 544 break; 543 545 case 2: ··· 844 846 memset(&args, 0, sizeof(args)); 845 847 846 848 switch (radeon_encoder->encoder_id) { 849 + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 850 + index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); 851 + break; 847 852 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 848 853 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 849 854 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: ··· 1086 1085 break; 1087 1086 case ENCODER_OBJECT_ID_INTERNAL_DVO1: 1088 1087 case ENCODER_OBJECT_ID_INTERNAL_DDI: 1089 - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 1090 1088 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); 1089 + break; 1090 + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 1091 + if (ASIC_IS_DCE3(rdev)) 1092 + is_dig = true; 1093 + else 1094 + index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); 1091 1095 break; 1092 1096 case ENCODER_OBJECT_ID_INTERNAL_LVDS: 1093 1097 index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl); ··· 1323 1317 break; 1324 1318 default: 1325 1319 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev); 1326 - break; 1320 + return; 1327 1321 } 1328 1322 1329 1323 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); ··· 1481 1475 } 1482 1476 break; 1483 1477 case ENCODER_OBJECT_ID_INTERNAL_DDI: 1484 - atombios_ddia_setup(encoder, ATOM_ENABLE); 1485 - break; 1486 1478 case ENCODER_OBJECT_ID_INTERNAL_DVO1: 1487 1479 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 1488 - atombios_external_tmds_setup(encoder, ATOM_ENABLE); 1480 + atombios_dvo_setup(encoder, ATOM_ENABLE); 1489 1481 break; 1490 1482 case ENCODER_OBJECT_ID_INTERNAL_DAC1: 1491 1483 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: ··· 1674 1670 } 1675 1671 break; 1676 1672 case ENCODER_OBJECT_ID_INTERNAL_DDI: 1677 - atombios_ddia_setup(encoder, ATOM_DISABLE); 1678 - break; 1679 1673 case ENCODER_OBJECT_ID_INTERNAL_DVO1: 1680 1674 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 1681 - atombios_external_tmds_setup(encoder, ATOM_DISABLE); 1675 + atombios_dvo_setup(encoder, ATOM_DISABLE); 1682 1676 break; 1683 1677 case ENCODER_OBJECT_ID_INTERNAL_DAC1: 1684 1678 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
+1 -1
drivers/gpu/drm/radeon/radeon_legacy_encoders.c
··· 670 670 671 671 if (rdev->is_atom_bios) { 672 672 radeon_encoder->pixel_clock = adjusted_mode->clock; 673 - atombios_external_tmds_setup(encoder, ATOM_ENABLE); 673 + atombios_dvo_setup(encoder, ATOM_ENABLE); 674 674 fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); 675 675 } else { 676 676 fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
+1 -1
drivers/gpu/drm/radeon/radeon_mode.h
··· 524 524 struct drm_encoder *radeon_encoder_legacy_tv_dac_add(struct drm_device *dev, int bios_index, int with_tv); 525 525 struct drm_encoder *radeon_encoder_legacy_tmds_int_add(struct drm_device *dev, int bios_index); 526 526 struct drm_encoder *radeon_encoder_legacy_tmds_ext_add(struct drm_device *dev, int bios_index); 527 - extern void atombios_external_tmds_setup(struct drm_encoder *encoder, int action); 527 + extern void atombios_dvo_setup(struct drm_encoder *encoder, int action); 528 528 extern void atombios_digital_setup(struct drm_encoder *encoder, int action); 529 529 extern int atombios_get_encoder_mode(struct drm_encoder *encoder); 530 530 extern void atombios_set_edp_panel_power(struct drm_connector *connector, int action);