diff --git a/src/atombios_output.c b/src/atombios_output.c index eb52f5c..94b2c59 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; @@ -601,7 +611,7 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, int device, DisplayM if (IS_DCE32_VARIANT) ErrorF("Output UNIPHY%d transmitter setup success\n", num); else - ErrorF("Output DIG%d transmitter setup success\n", num); + ErrorF("Output DIG%d transmitter setup success\n", num); return ATOM_SUCCESS; } @@ -822,25 +832,25 @@ atombios_output_dpms(xf86OutputPtr output, int mode) /*ErrorF("tmds dpms\n");*/ if (radeon_output->devices & ATOM_DEVICE_DFP1_SUPPORT) { if (IS_DCE3_VARIANT) - atombios_output_dig_dpms(output, mode, 1); + atombios_output_dig_dpms(output, mode, 2); else atombios_device_dpms(output, ATOM_DEVICE_DFP1_SUPPORT, mode); } else if (radeon_output->devices & ATOM_DEVICE_DFP2_SUPPORT) { if (IS_DCE32_VARIANT) - atombios_output_dig_dpms(output, mode, 2); + atombios_output_dig_dpms(output, mode, 0); else if (IS_DCE3_VARIANT) return; // fixme else atombios_device_dpms(output, ATOM_DEVICE_DFP2_SUPPORT, mode); } else if (radeon_output->devices & ATOM_DEVICE_DFP3_SUPPORT) { if (IS_DCE3_VARIANT) - atombios_output_dig_dpms(output, mode, 0); + atombios_output_dig_dpms(output, mode, 2); else atombios_device_dpms(output, ATOM_DEVICE_DFP3_SUPPORT, mode); } else if (radeon_output->devices & ATOM_DEVICE_DFP4_SUPPORT) { - atombios_output_dig_dpms(output, mode, 1); + atombios_output_dig_dpms(output, mode, 0); } else if (radeon_output->devices & ATOM_DEVICE_DFP5_SUPPORT) { - atombios_output_dig_dpms(output, mode, 2); + atombios_output_dig_dpms(output, mode, 0); } } else if (radeon_output->MonType == MT_CRT) { /*ErrorF("AGD: dac dpms\n");*/ @@ -927,8 +937,7 @@ atombios_set_output_crtc_source(xf86OutputPtr output) crtc_src_param2.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID; } else if (radeon_output->MonType == MT_DFP) { if (IS_DCE3_VARIANT) { - /* we route digital encoders using the CRTC ids */ - if (radeon_crtc->crtc_id) + if (radeon_output->devices & ATOM_DEVICE_DFP3_SUPPORT) crtc_src_param2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID; else crtc_src_param2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID; @@ -948,8 +957,12 @@ atombios_set_output_crtc_source(xf86OutputPtr output) else if (radeon_output->type == OUTPUT_DP) crtc_src_param2.ucEncodeMode = ATOM_ENCODER_MODE_DP; } else if (radeon_output->MonType == MT_LCD) { - if (radeon_output->devices & ATOM_DEVICE_LCD1_SUPPORT) - crtc_src_param2.ucEncoderID = ATOM_DEVICE_LCD1_INDEX; + if (radeon_output->devices & ATOM_DEVICE_LCD1_SUPPORT) { + if (IS_DCE3_VARIANT) + crtc_src_param2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID; + else + crtc_src_param2.ucEncoderID = ATOM_DEVICE_LCD1_INDEX; + } crtc_src_param2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS; } else if (OUTPUT_IS_TV) { if (radeon_output->devices & ATOM_DEVICE_TV1_SUPPORT)