Rev 1963 | Rev 2160 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1963 | Rev 1986 | ||
---|---|---|---|
Line 365... | Line 365... | ||
365 | radeon_atom_get_tv_timings(rdev, 1, adjusted_mode); |
365 | radeon_atom_get_tv_timings(rdev, 1, adjusted_mode); |
366 | } |
366 | } |
367 | } |
367 | } |
Line 368... | Line 368... | ||
368 | 368 | ||
369 | if (ASIC_IS_DCE3(rdev) && |
369 | if (ASIC_IS_DCE3(rdev) && |
- | 370 | ((radeon_encoder->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) || |
|
370 | (radeon_encoder->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT))) { |
371 | radeon_encoder_is_dp_bridge(encoder))) { |
371 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
372 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
372 | radeon_dp_set_link_config(connector, mode); |
373 | radeon_dp_set_link_config(connector, mode); |
Line 373... | Line 374... | ||
373 | } |
374 | } |
Line 658... | Line 659... | ||
658 | 659 | ||
659 | /* dp bridges are always DP */ |
660 | /* dp bridges are always DP */ |
660 | if (radeon_encoder_is_dp_bridge(encoder)) |
661 | if (radeon_encoder_is_dp_bridge(encoder)) |
Line -... | Line 662... | ||
- | 662 | return ATOM_ENCODER_MODE_DP; |
|
- | 663 | ||
- | 664 | /* DVO is always DVO */ |
|
- | 665 | if (radeon_encoder->encoder_id == ATOM_ENCODER_MODE_DVO) |
|
661 | return ATOM_ENCODER_MODE_DP; |
666 | return ATOM_ENCODER_MODE_DVO; |
662 | - | ||
663 | connector = radeon_get_connector_for_encoder(encoder); |
667 | |
664 | if (!connector) { |
668 | connector = radeon_get_connector_for_encoder(encoder); |
665 | switch (radeon_encoder->encoder_id) { |
- | |
666 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: |
- | |
667 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
- | |
668 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
- | |
669 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
669 | /* if we don't have an active device yet, just use one of |
670 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: |
- | |
671 | return ATOM_ENCODER_MODE_DVI; |
- | |
672 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: |
670 | * the connectors tied to the encoder. |
673 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: |
671 | */ |
674 | default: |
- | |
675 | return ATOM_ENCODER_MODE_CRT; |
- | |
676 | } |
672 | if (!connector) |
Line 677... | Line 673... | ||
677 | } |
673 | connector = radeon_get_connector_for_encoder_init(encoder); |
678 | radeon_connector = to_radeon_connector(connector); |
674 | radeon_connector = to_radeon_connector(connector); |
679 | 675 | ||
Line 1092... | Line 1088... | ||
1092 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
1088 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
1093 | args.v2.acConfig.ucTransmitterSel = 2; |
1089 | args.v2.acConfig.ucTransmitterSel = 2; |
1094 | break; |
1090 | break; |
1095 | } |
1091 | } |
Line 1096... | Line 1092... | ||
1096 | 1092 | ||
1097 | if (is_dp) |
1093 | if (is_dp) { |
- | 1094 | args.v2.acConfig.fCoherentMode = 1; |
|
1098 | args.v2.acConfig.fCoherentMode = 1; |
1095 | args.v2.acConfig.fDPConnector = 1; |
1099 | else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { |
1096 | } else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { |
1100 | if (dig->coherent_mode) |
1097 | if (dig->coherent_mode) |
1101 | args.v2.acConfig.fCoherentMode = 1; |
1098 | args.v2.acConfig.fCoherentMode = 1; |
1102 | if (radeon_encoder->pixel_clock > 165000) |
1099 | if (radeon_encoder->pixel_clock > 165000) |
1103 | args.v2.acConfig.fDualLinkConnector = 1; |
1100 | args.v2.acConfig.fDualLinkConnector = 1; |
Line 1433... | Line 1430... | ||
1433 | } |
1430 | } |
Line 1434... | Line 1431... | ||
1434 | 1431 | ||
1435 | if (is_dig) { |
1432 | if (is_dig) { |
1436 | switch (mode) { |
1433 | switch (mode) { |
- | 1434 | case DRM_MODE_DPMS_ON: |
|
- | 1435 | /* some early dce3.2 boards have a bug in their transmitter control table */ |
|
- | 1436 | if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730)) |
|
- | 1437 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); |
|
1437 | case DRM_MODE_DPMS_ON: |
1438 | else |
1438 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); |
1439 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); |
1439 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { |
1440 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { |
Line 1440... | Line 1441... | ||
1440 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
1441 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
Line 1524... | Line 1525... | ||
1524 | break; |
1525 | break; |
1525 | } |
1526 | } |
1526 | } |
1527 | } |
Line 1527... | Line 1528... | ||
1527 | 1528 | ||
1528 | if (ext_encoder) { |
- | |
1529 | int action; |
- | |
1530 | 1529 | if (ext_encoder) { |
|
1531 | switch (mode) { |
1530 | switch (mode) { |
1532 | case DRM_MODE_DPMS_ON: |
1531 | case DRM_MODE_DPMS_ON: |
1533 | default: |
1532 | default: |
- | 1533 | if (ASIC_IS_DCE41(rdev)) { |
|
1534 | if (ASIC_IS_DCE41(rdev)) |
1534 | atombios_external_encoder_setup(encoder, ext_encoder, |
- | 1535 | EXTERNAL_ENCODER_ACTION_V3_ENABLE_OUTPUT); |
|
- | 1536 | atombios_external_encoder_setup(encoder, ext_encoder, |
|
1535 | action = EXTERNAL_ENCODER_ACTION_V3_ENABLE_OUTPUT; |
1537 | EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING_OFF); |
1536 | else |
1538 | } else |
1537 | action = ATOM_ENABLE; |
1539 | atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE); |
1538 | break; |
1540 | break; |
1539 | case DRM_MODE_DPMS_STANDBY: |
1541 | case DRM_MODE_DPMS_STANDBY: |
1540 | case DRM_MODE_DPMS_SUSPEND: |
1542 | case DRM_MODE_DPMS_SUSPEND: |
1541 | case DRM_MODE_DPMS_OFF: |
1543 | case DRM_MODE_DPMS_OFF: |
- | 1544 | if (ASIC_IS_DCE41(rdev)) { |
|
- | 1545 | atombios_external_encoder_setup(encoder, ext_encoder, |
|
- | 1546 | EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING); |
|
1542 | if (ASIC_IS_DCE41(rdev)) |
1547 | atombios_external_encoder_setup(encoder, ext_encoder, |
1543 | action = EXTERNAL_ENCODER_ACTION_V3_DISABLE_OUTPUT; |
1548 | EXTERNAL_ENCODER_ACTION_V3_DISABLE_OUTPUT); |
1544 | else |
1549 | } else |
1545 | action = ATOM_DISABLE; |
1550 | atombios_external_encoder_setup(encoder, ext_encoder, ATOM_DISABLE); |
1546 | break; |
1551 | break; |
1547 | } |
- | |
1548 | atombios_external_encoder_setup(encoder, ext_encoder, action); |
1552 | } |
Line 1549... | Line 1553... | ||
1549 | } |
1553 | } |
Line 1550... | Line 1554... | ||
1550 | 1554 | ||
Line 2002... | Line 2006... | ||
2002 | return connector_status_connected; /* STV */ |
2006 | return connector_status_connected; /* STV */ |
2003 | } |
2007 | } |
2004 | return connector_status_disconnected; |
2008 | return connector_status_disconnected; |
2005 | } |
2009 | } |
Line -... | Line 2010... | ||
- | 2010 | ||
- | 2011 | static enum drm_connector_status |
|
- | 2012 | radeon_atom_dig_detect(struct drm_encoder *encoder, struct drm_connector *connector) |
|
- | 2013 | { |
|
- | 2014 | struct drm_device *dev = encoder->dev; |
|
- | 2015 | struct radeon_device *rdev = dev->dev_private; |
|
- | 2016 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
|
- | 2017 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
|
- | 2018 | struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder); |
|
- | 2019 | u32 bios_0_scratch; |
|
- | 2020 | ||
- | 2021 | if (!ASIC_IS_DCE4(rdev)) |
|
- | 2022 | return connector_status_unknown; |
|
- | 2023 | ||
- | 2024 | if (!ext_encoder) |
|
- | 2025 | return connector_status_unknown; |
|
- | 2026 | ||
- | 2027 | if ((radeon_connector->devices & ATOM_DEVICE_CRT_SUPPORT) == 0) |
|
- | 2028 | return connector_status_unknown; |
|
- | 2029 | ||
- | 2030 | /* load detect on the dp bridge */ |
|
- | 2031 | atombios_external_encoder_setup(encoder, ext_encoder, |
|
- | 2032 | EXTERNAL_ENCODER_ACTION_V3_DACLOAD_DETECTION); |
|
- | 2033 | ||
- | 2034 | bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH); |
|
- | 2035 | ||
- | 2036 | DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices); |
|
- | 2037 | if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) { |
|
- | 2038 | if (bios_0_scratch & ATOM_S0_CRT1_MASK) |
|
- | 2039 | return connector_status_connected; |
|
- | 2040 | } |
|
- | 2041 | if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) { |
|
- | 2042 | if (bios_0_scratch & ATOM_S0_CRT2_MASK) |
|
- | 2043 | return connector_status_connected; |
|
- | 2044 | } |
|
- | 2045 | if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) { |
|
- | 2046 | if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A)) |
|
- | 2047 | return connector_status_connected; |
|
- | 2048 | } |
|
- | 2049 | if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) { |
|
- | 2050 | if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A)) |
|
- | 2051 | return connector_status_connected; /* CTV */ |
|
- | 2052 | else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A)) |
|
- | 2053 | return connector_status_connected; /* STV */ |
|
- | 2054 | } |
|
- | 2055 | return connector_status_disconnected; |
|
- | 2056 | } |
|
- | 2057 | ||
- | 2058 | void |
|
- | 2059 | radeon_atom_ext_encoder_setup_ddc(struct drm_encoder *encoder) |
|
- | 2060 | { |
|
- | 2061 | struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder); |
|
- | 2062 | ||
- | 2063 | if (ext_encoder) |
|
- | 2064 | /* ddc_setup on the dp bridge */ |
|
- | 2065 | atombios_external_encoder_setup(encoder, ext_encoder, |
|
- | 2066 | EXTERNAL_ENCODER_ACTION_V3_DDC_SETUP); |
|
- | 2067 | ||
- | 2068 | } |
|
2006 | 2069 | ||
2007 | static void radeon_atom_encoder_prepare(struct drm_encoder *encoder) |
2070 | static void radeon_atom_encoder_prepare(struct drm_encoder *encoder) |
2008 | { |
2071 | { |
2009 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
2072 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
Line 2165... | Line 2228... | ||
2165 | .mode_fixup = radeon_atom_mode_fixup, |
2228 | .mode_fixup = radeon_atom_mode_fixup, |
2166 | .prepare = radeon_atom_encoder_prepare, |
2229 | .prepare = radeon_atom_encoder_prepare, |
2167 | .mode_set = radeon_atom_encoder_mode_set, |
2230 | .mode_set = radeon_atom_encoder_mode_set, |
2168 | .commit = radeon_atom_encoder_commit, |
2231 | .commit = radeon_atom_encoder_commit, |
2169 | .disable = radeon_atom_encoder_disable, |
2232 | .disable = radeon_atom_encoder_disable, |
2170 | /* no detect for TMDS/LVDS yet */ |
2233 | .detect = radeon_atom_dig_detect, |
2171 | }; |
2234 | }; |
Line 2172... | Line 2235... | ||
2172 | 2235 | ||
2173 | static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = { |
2236 | static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = { |
2174 | .dpms = radeon_atom_encoder_dpms, |
2237 | .dpms = radeon_atom_encoder_dpms, |