diff --git a/src/atombios_output.c b/src/atombios_output.c index eb52f5c..a07fdcc 100644 --- a/src/atombios_output.c +++ b/src/atombios_output.c @@ -405,17 +405,15 @@ atombios_output_dig_encoder_setup(xf86OutputPtr output, int device, DisplayModeP int index; int major, minor; - if (radeon_crtc->crtc_id) - index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl); - else - index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl); - - atombios_get_command_table_version(info->atomBIOS, index, &major, &minor); - disp_data.ucAction = ATOM_ENABLE; disp_data.usPixelClock = cpu_to_le16(mode->Clock / 10); if (IS_DCE32_VARIANT) { + if (radeon_crtc->crtc_id) + index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl); + else + index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl); + if (radeon_output->TMDSType == TMDS_UNIPHY) disp_data.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1; if (radeon_output->TMDSType == TMDS_UNIPHY1) @@ -426,10 +424,12 @@ atombios_output_dig_encoder_setup(xf86OutputPtr output, int device, DisplayModeP switch (device) { case ATOM_DEVICE_DFP1_INDEX: disp_data.ucConfig = ATOM_ENCODER_CONFIG_TRANSMITTER1; + index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl); break; case ATOM_DEVICE_LCD1_INDEX: case ATOM_DEVICE_DFP3_INDEX: disp_data.ucConfig = ATOM_ENCODER_CONFIG_TRANSMITTER2; + index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl); break; default: return ATOM_NOT_IMPLEMENTED; @@ -454,6 +454,8 @@ atombios_output_dig_encoder_setup(xf86OutputPtr output, int device, DisplayModeP else if (radeon_output->type == OUTPUT_LVDS) disp_data.ucEncoderMode = ATOM_ENCODER_MODE_LVDS; + atombios_get_command_table_version(info->atomBIOS, index, &major, &minor); + data.exec.index = index; data.exec.dataSpace = (void *)&space; data.exec.pspace = &disp_data; @@ -547,12 +549,20 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, int device, DisplayM } else { disp_data.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL; disp_data.v1.usPixelClock = cpu_to_le16((mode->Clock) / 10); - - if (radeon_crtc->crtc_id) - disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER; - else + + switch (device) { + case ATOM_DEVICE_DFP1_INDEX: disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER; - + break; + case ATOM_DEVICE_LCD1_INDEX: + case ATOM_DEVICE_DFP3_INDEX: + disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER; + break; + default: + return ATOM_NOT_IMPLEMENTED; + break; + } + if (OUTPUT_IS_DVI || (radeon_output->type == OUTPUT_HDMI)) { if (radeon_output->coherent_mode) { disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;