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