diff --git a/src/atombios_output.c b/src/atombios_output.c index eb52f5c..e4e0604 100644 --- a/src/atombios_output.c +++ b/src/atombios_output.c @@ -312,6 +312,8 @@ atombios_output_digital_setup(xf86OutputPtr output, int device, DisplayModePtr m if (radeon_output->lvds_misc & (1 << 1)) disp_data.ucMisc |= (1 << 1); } else { + if (radeon_output->linkb) + disp_data.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB; if (mode->Clock > 165000) disp_data.ucMisc |= PANEL_ENCODER_MISC_DUAL; if (pScrn->rgbBits == 8) @@ -352,6 +354,8 @@ atombios_output_digital_setup(xf86OutputPtr output, int device, DisplayModePtr m disp_data2.ucTemporal |= PANEL_ENCODER_TEMPORAL_LEVEL_4; } } else { + if (radeon_output->linkb) + disp_data2.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB; if (mode->Clock > 165000) disp_data2.ucMisc |= PANEL_ENCODER_MISC_DUAL; } @@ -441,7 +445,10 @@ atombios_output_dig_encoder_setup(xf86OutputPtr output, int device, DisplayModeP disp_data.ucConfig |= ATOM_ENCODER_CONFIG_LINKA_B; disp_data.ucLaneNum = 8; } else { - disp_data.ucConfig |= ATOM_ENCODER_CONFIG_LINKA; + if (radeon_output->linkb) + disp_data.ucConfig |= ATOM_ENCODER_CONFIG_LINKB; + else + disp_data.ucConfig |= ATOM_ENCODER_CONFIG_LINKA; disp_data.ucLaneNum = 4; } diff --git a/src/radeon_atombios.c b/src/radeon_atombios.c index 1ca9f86..50b23ad 100644 --- a/src/radeon_atombios.c +++ b/src/radeon_atombios.c @@ -1613,6 +1613,7 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn) + le16_to_cpu(con_obj->asObjects[i].usSrcDstTableOffset)); ErrorF("object id %04x %02x\n", obj_id, SrcDstTable->ucNumberOfSrc); + ErrorF("enum %d\n", num); if ((info->ChipFamily == CHIP_FAMILY_RS780) && (obj_id == CONNECTOR_OBJECT_ID_PCIE_CONNECTOR)) { @@ -1640,6 +1641,7 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn) else info->BiosConnector[i].valid = TRUE; info->BiosConnector[i].devices = 0; + info->BiosConnector[i].linkb = FALSE; for (j = 0; j < SrcDstTable->ucNumberOfSrc; j++) { uint8_t sobj_id; @@ -1647,6 +1649,9 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn) sobj_id = (le16_to_cpu(SrcDstTable->usSrcObjectID[j]) & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; ErrorF("src object id %04x %d\n", le16_to_cpu(SrcDstTable->usSrcObjectID[j]), sobj_id); + if (num == 2) + info->BiosConnector[i].linkb = TRUE; + switch(sobj_id) { case ENCODER_OBJECT_ID_INTERNAL_LVDS: info->BiosConnector[i].devices |= (1 << ATOM_DEVICE_LCD1_INDEX); @@ -2036,6 +2041,7 @@ RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn) info->BiosConnector[i].output_id = ci.sucI2cId.sbfAccess.bfI2C_LineMux; info->BiosConnector[i].devices = (1 << i); info->BiosConnector[i].ConnectorType = ci.sucConnectorInfo.sbfAccess.bfConnectorType; + info->BiosConnector[i].linkb = FALSE; if (info->BiosConnector[i].ConnectorType == CONNECTOR_NONE) { info->BiosConnector[i].valid = FALSE; diff --git a/src/radeon_output.c b/src/radeon_output.c index 5924c81..4aa99d6 100644 --- a/src/radeon_output.c +++ b/src/radeon_output.c @@ -2858,6 +2858,7 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) radeon_output->igp_lane_info = info->BiosConnector[i].igp_lane_info; radeon_output->shared_ddc = info->BiosConnector[i].shared_ddc; radeon_output->load_detection = info->BiosConnector[i].load_detection; + radeon_output->linkb = info->BiosConnector[i].linkb; if (radeon_output->ConnectorType == CONNECTOR_DVI_D) radeon_output->DACType = DAC_NONE; diff --git a/src/radeon_probe.h b/src/radeon_probe.h index 5cd610c..7ed9a6b 100644 --- a/src/radeon_probe.h +++ b/src/radeon_probe.h @@ -210,6 +210,7 @@ typedef struct { Bool shared_ddc; int i2c_line_mux; Bool load_detection; + Bool linkb; } RADEONBIOSConnector; typedef struct _RADEONOutputPrivateRec { @@ -270,6 +271,7 @@ typedef struct _RADEONOutputPrivateRec { int devices; Bool enabled; Bool shared_ddc; + Bool linkb; } RADEONOutputPrivateRec, *RADEONOutputPrivatePtr; struct avivo_pll_state {