xf86-video-ati: Branch 'master' - 2 commits
Alex Deucher
agd5f at kemper.freedesktop.org
Sat Apr 4 15:45:21 PDT 2009
src/atombios_output.c | 178 ++++++++++++++++++--------------------------------
src/legacy_output.c | 3
src/radeon_atombios.h | 2
src/radeon_crtc.c | 5 +
src/radeon_output.c | 53 +-------------
src/radeon_probe.h | 4 -
6 files changed, 83 insertions(+), 162 deletions(-)
New commits:
commit f8c7d6a6162196a743f6885ecaf63ba50de1722a
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Sat Apr 4 16:05:20 2009 -0400
DCE3/3.2: cleanup dpms after previous changes
diff --git a/src/radeon_crtc.c b/src/radeon_crtc.c
index cd0d55e..4b508ce 100644
--- a/src/radeon_crtc.c
+++ b/src/radeon_crtc.c
@@ -115,6 +115,9 @@ radeon_crtc_mode_prepare(xf86CrtcPtr crtc)
{
RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
+ if (radeon_crtc->initialized)
+ radeon_crtc_dpms(crtc, DPMSModeOff);
+
if (radeon_crtc->enabled)
crtc->funcs->hide_cursor(crtc);
}
@@ -283,6 +286,8 @@ radeon_crtc_mode_commit(xf86CrtcPtr crtc)
{
if (crtc->scrn->pScreen != NULL)
xf86_reload_cursors(crtc->scrn->pScreen);
+
+ radeon_crtc_dpms(crtc, DPMSModeOn);
}
void
diff --git a/src/radeon_output.c b/src/radeon_output.c
index c4041c7..712ac5f 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -520,32 +520,8 @@ radeon_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
static void
radeon_mode_prepare(xf86OutputPtr output)
{
- RADEONInfoPtr info = RADEONPTR(output->scrn);
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (output->scrn);
- int o;
-
- for (o = 0; o < config->num_output; o++) {
- xf86OutputPtr loop_output = config->output[o];
- if (loop_output == output)
- continue;
- else if (loop_output->crtc) {
- xf86CrtcPtr other_crtc = loop_output->crtc;
- RADEONCrtcPrivatePtr other_radeon_crtc = other_crtc->driver_private;
- if (other_crtc->enabled) {
- if (other_radeon_crtc->initialized) {
- radeon_crtc_dpms(other_crtc, DPMSModeOff);
- if (IS_AVIVO_VARIANT || info->r4xx_atom)
- atombios_lock_crtc(info->atomBIOS, other_radeon_crtc->crtc_id, 1);
- radeon_dpms(loop_output, DPMSModeOff);
- }
- }
- }
- }
-
radeon_bios_output_lock(output, TRUE);
radeon_dpms(output, DPMSModeOff);
- radeon_crtc_dpms(output->crtc, DPMSModeOff);
-
}
static void
@@ -565,30 +541,7 @@ radeon_mode_set(xf86OutputPtr output, DisplayModePtr mode,
static void
radeon_mode_commit(xf86OutputPtr output)
{
- RADEONInfoPtr info = RADEONPTR(output->scrn);
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (output->scrn);
- int o;
-
- for (o = 0; o < config->num_output; o++) {
- xf86OutputPtr loop_output = config->output[o];
- if (loop_output == output)
- continue;
- else if (loop_output->crtc) {
- xf86CrtcPtr other_crtc = loop_output->crtc;
- RADEONCrtcPrivatePtr other_radeon_crtc = other_crtc->driver_private;
- if (other_crtc->enabled) {
- if (other_radeon_crtc->initialized) {
- radeon_crtc_dpms(other_crtc, DPMSModeOn);
- if (IS_AVIVO_VARIANT || info->r4xx_atom)
- atombios_lock_crtc(info->atomBIOS, other_radeon_crtc->crtc_id, 0);
- radeon_dpms(loop_output, DPMSModeOn);
- }
- }
- }
- }
-
radeon_dpms(output, DPMSModeOn);
- radeon_crtc_dpms(output->crtc, DPMSModeOn);
radeon_bios_output_lock(output, FALSE);
}
commit a707d355c3c6ff92252c5a060a1fc32d97547552
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Sat Apr 4 15:20:01 2009 -0400
DCE3/3.2: fix up transmitter/encoder setup
Should fix bug 21050
diff --git a/src/atombios_output.c b/src/atombios_output.c
index 4af04c1..60d6c10 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -61,7 +61,7 @@ const char *device_name[12] = {
};
static int
-atombios_output_dac_setup(xf86OutputPtr output, DisplayModePtr mode)
+atombios_output_dac_setup(xf86OutputPtr output, int action)
{
RADEONOutputPrivatePtr radeon_output = output->driver_private;
RADEONInfoPtr info = RADEONPTR(output->scrn);
@@ -71,6 +71,7 @@ atombios_output_dac_setup(xf86OutputPtr output, DisplayModePtr mode)
AtomBiosArgRec data;
unsigned char *space;
int index = 0, num = 0;
+ int clock = radeon_output->pixel_clock;
if (radeon_encoder == NULL)
return ATOM_NOT_IMPLEMENTED;
@@ -90,7 +91,7 @@ atombios_output_dac_setup(xf86OutputPtr output, DisplayModePtr mode)
break;
}
- disp_data.ucAction = ATOM_ENABLE;
+ disp_data.ucAction =action;
if (radeon_output->active_device & (ATOM_DEVICE_CRT_SUPPORT))
disp_data.ucDacStandard = ATOM_DAC1_PS2;
@@ -113,7 +114,7 @@ atombios_output_dac_setup(xf86OutputPtr output, DisplayModePtr mode)
break;
}
}
- disp_data.usPixelClock = cpu_to_le16(mode->Clock / 10);
+ disp_data.usPixelClock = cpu_to_le16(clock / 10);
data.exec.index = index;
data.exec.dataSpace = (void *)&space;
@@ -130,7 +131,7 @@ atombios_output_dac_setup(xf86OutputPtr output, DisplayModePtr mode)
}
static int
-atombios_output_tv_setup(xf86OutputPtr output, DisplayModePtr mode)
+atombios_output_tv_setup(xf86OutputPtr output, int action)
{
RADEONOutputPrivatePtr radeon_output = output->driver_private;
radeon_tvout_ptr tvout = &radeon_output->tvout;
@@ -138,10 +139,11 @@ atombios_output_tv_setup(xf86OutputPtr output, DisplayModePtr mode)
TV_ENCODER_CONTROL_PS_ALLOCATION disp_data;
AtomBiosArgRec data;
unsigned char *space;
+ int clock = radeon_output->pixel_clock;
memset(&disp_data,0, sizeof(disp_data));
- disp_data.sTVEncoder.ucAction = ATOM_ENABLE;
+ disp_data.sTVEncoder.ucAction = action;
if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT))
disp_data.sTVEncoder.ucTvStandard = ATOM_TV_CV;
@@ -177,7 +179,7 @@ atombios_output_tv_setup(xf86OutputPtr output, DisplayModePtr mode)
}
}
- disp_data.sTVEncoder.usPixelClock = cpu_to_le16(mode->Clock / 10);
+ disp_data.sTVEncoder.usPixelClock = cpu_to_le16(clock / 10);
data.exec.index = GetIndexIntoMasterTable(COMMAND, TVEncoderControl);
data.exec.dataSpace = (void *)&space;
data.exec.pspace = &disp_data;
@@ -193,19 +195,21 @@ atombios_output_tv_setup(xf86OutputPtr output, DisplayModePtr mode)
}
int
-atombios_external_tmds_setup(xf86OutputPtr output, DisplayModePtr mode)
+atombios_external_tmds_setup(xf86OutputPtr output, int action)
{
+ RADEONOutputPrivatePtr radeon_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
RADEONInfoPtr info = RADEONPTR(pScrn);
ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION disp_data;
AtomBiosArgRec data;
unsigned char *space;
+ int clock = radeon_output->pixel_clock;
memset(&disp_data,0, sizeof(disp_data));
- disp_data.sXTmdsEncoder.ucEnable = ATOM_ENABLE;
+ disp_data.sXTmdsEncoder.ucEnable = action;
- if (mode->Clock > 165000)
+ if (clock > 165000)
disp_data.sXTmdsEncoder.ucMisc = PANEL_ENCODER_MISC_DUAL;
if (pScrn->rgbBits == 8)
@@ -225,19 +229,21 @@ atombios_external_tmds_setup(xf86OutputPtr output, DisplayModePtr mode)
}
static int
-atombios_output_ddia_setup(xf86OutputPtr output, DisplayModePtr mode)
+atombios_output_ddia_setup(xf86OutputPtr output, int action)
{
+ RADEONOutputPrivatePtr radeon_output = output->driver_private;
RADEONInfoPtr info = RADEONPTR(output->scrn);
DVO_ENCODER_CONTROL_PS_ALLOCATION disp_data;
AtomBiosArgRec data;
unsigned char *space;
+ int clock = radeon_output->pixel_clock;
memset(&disp_data,0, sizeof(disp_data));
- disp_data.sDVOEncoder.ucAction = ATOM_ENABLE;
- disp_data.sDVOEncoder.usPixelClock = cpu_to_le16(mode->Clock / 10);
+ disp_data.sDVOEncoder.ucAction = action;
+ disp_data.sDVOEncoder.usPixelClock = cpu_to_le16(clock / 10);
- if (mode->Clock > 165000)
+ if (clock > 165000)
disp_data.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute = PANEL_ENCODER_MISC_DUAL;
data.exec.index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
@@ -254,7 +260,7 @@ atombios_output_ddia_setup(xf86OutputPtr output, DisplayModePtr mode)
}
static int
-atombios_output_digital_setup(xf86OutputPtr output, DisplayModePtr mode)
+atombios_output_digital_setup(xf86OutputPtr output, int action)
{
RADEONOutputPrivatePtr radeon_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
@@ -267,6 +273,7 @@ atombios_output_digital_setup(xf86OutputPtr output, DisplayModePtr mode)
int index = 0;
int major, minor;
int lvds_misc = 0;
+ int clock = radeon_output->pixel_clock;
if (radeon_encoder == NULL)
return ATOM_NOT_IMPLEMENTED;
@@ -308,11 +315,11 @@ atombios_output_digital_setup(xf86OutputPtr output, DisplayModePtr mode)
switch (minor) {
case 1:
disp_data.ucMisc = 0;
- disp_data.ucAction = PANEL_ENCODER_ACTION_ENABLE;
+ disp_data.ucAction = action;
if ((radeon_output->ConnectorType == CONNECTOR_HDMI_TYPE_A) ||
(radeon_output->ConnectorType == CONNECTOR_HDMI_TYPE_B))
disp_data.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE;
- disp_data.usPixelClock = cpu_to_le16(mode->Clock / 10);
+ disp_data.usPixelClock = cpu_to_le16(clock / 10);
if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT)) {
if (lvds_misc & (1 << 0))
disp_data.ucMisc |= PANEL_ENCODER_MISC_DUAL;
@@ -321,7 +328,7 @@ atombios_output_digital_setup(xf86OutputPtr output, DisplayModePtr mode)
} else {
if (radeon_output->linkb)
disp_data.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB;
- if (mode->Clock > 165000)
+ if (clock > 165000)
disp_data.ucMisc |= PANEL_ENCODER_MISC_DUAL;
if (pScrn->rgbBits == 8)
disp_data.ucMisc |= (1 << 1);
@@ -331,7 +338,7 @@ atombios_output_digital_setup(xf86OutputPtr output, DisplayModePtr mode)
case 2:
case 3:
disp_data2.ucMisc = 0;
- disp_data2.ucAction = PANEL_ENCODER_ACTION_ENABLE;
+ disp_data2.ucAction = action;
if (minor == 3) {
if (radeon_output->coherent_mode) {
disp_data2.ucMisc |= PANEL_ENCODER_MISC_COHERENT;
@@ -341,7 +348,7 @@ atombios_output_digital_setup(xf86OutputPtr output, DisplayModePtr mode)
if ((radeon_output->ConnectorType == CONNECTOR_HDMI_TYPE_A) ||
(radeon_output->ConnectorType == CONNECTOR_HDMI_TYPE_B))
disp_data2.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE;
- disp_data2.usPixelClock = cpu_to_le16(mode->Clock / 10);
+ disp_data2.usPixelClock = cpu_to_le16(clock / 10);
disp_data2.ucTruncate = 0;
disp_data2.ucSpatial = 0;
disp_data2.ucTemporal = 0;
@@ -364,7 +371,7 @@ atombios_output_digital_setup(xf86OutputPtr output, DisplayModePtr mode)
} else {
if (radeon_output->linkb)
disp_data2.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB;
- if (mode->Clock > 165000)
+ if (clock > 165000)
disp_data2.ucMisc |= PANEL_ENCODER_MISC_DUAL;
}
data.exec.pspace = &disp_data2;
@@ -488,16 +495,17 @@ dp_link_clock_for_mode_clock(int mode_clock)
}
static int
-atombios_output_dig_encoder_setup(xf86OutputPtr output, DisplayModePtr mode)
+atombios_output_dig_encoder_setup(xf86OutputPtr output, int action)
{
RADEONOutputPrivatePtr radeon_output = output->driver_private;
- RADEONCrtcPrivatePtr radeon_crtc = output->crtc->driver_private;
RADEONInfoPtr info = RADEONPTR(output->scrn);
radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output);
DIG_ENCODER_CONTROL_PS_ALLOCATION disp_data;
AtomBiosArgRec data;
unsigned char *space;
int index = 0, major, minor, num = 0;
+ int clock = radeon_output->pixel_clock;
+ int dig_block = radeon_output->dig_block;
if (radeon_encoder == NULL)
return ATOM_NOT_IMPLEMENTED;
@@ -505,11 +513,11 @@ atombios_output_dig_encoder_setup(xf86OutputPtr output, DisplayModePtr mode)
memset(&disp_data,0, sizeof(disp_data));
if (IS_DCE32_VARIANT) {
- if (radeon_crtc->crtc_id)
+ if (dig_block)
index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl);
else
index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl);
- num = radeon_crtc->crtc_id + 1;
+ num = dig_block + 1;
} else {
switch (radeon_encoder->encoder_id) {
case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
@@ -529,8 +537,8 @@ atombios_output_dig_encoder_setup(xf86OutputPtr output, DisplayModePtr mode)
atombios_get_command_table_version(info->atomBIOS, index, &major, &minor);
- disp_data.ucAction = ATOM_ENABLE;
- disp_data.usPixelClock = cpu_to_le16(mode->Clock / 10);
+ disp_data.ucAction = action;
+ disp_data.usPixelClock = cpu_to_le16(clock / 10);
if (IS_DCE32_VARIANT) {
switch (radeon_encoder->encoder_id) {
@@ -569,11 +577,11 @@ atombios_output_dig_encoder_setup(xf86OutputPtr output, DisplayModePtr mode)
else
disp_data.ucConfig |= ATOM_ENCODER_CONFIG_LINKA;
- if (dp_link_clock_for_mode_clock(mode->Clock) == 27000)
+ if (dp_link_clock_for_mode_clock(clock) == 27000)
disp_data.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
- disp_data.ucLaneNum = dp_lanes_for_mode_clock(mode->Clock);
- } else if (mode->Clock > 165000) {
+ disp_data.ucLaneNum = dp_lanes_for_mode_clock(clock);
+ } else if (clock > 165000) {
disp_data.ucConfig |= ATOM_ENCODER_CONFIG_LINKA_B;
disp_data.ucLaneNum = 8;
} else {
@@ -605,10 +613,9 @@ union dig_transmitter_control {
};
static int
-atombios_output_dig_transmitter_setup(xf86OutputPtr output, DisplayModePtr mode)
+atombios_output_dig_transmitter_setup(xf86OutputPtr output, int action)
{
RADEONOutputPrivatePtr radeon_output = output->driver_private;
- RADEONCrtcPrivatePtr radeon_crtc = output->crtc->driver_private;
RADEONInfoPtr info = RADEONPTR(output->scrn);
radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output);
union dig_transmitter_control disp_data;
@@ -616,6 +623,8 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, DisplayModePtr mode)
unsigned char *space;
int index = 0, num = 0;
int major, minor;
+ int clock = radeon_output->pixel_clock;
+ int dig_block = radeon_output->dig_block;
if (radeon_encoder == NULL)
return ATOM_NOT_IMPLEMENTED;
@@ -641,20 +650,20 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, DisplayModePtr mode)
atombios_get_command_table_version(info->atomBIOS, index, &major, &minor);
- disp_data.v1.ucAction = ATOM_TRANSMITTER_ACTION_ENABLE;
+ disp_data.v1.ucAction = action;
if (IS_DCE32_VARIANT) {
if (radeon_output->MonType == MT_DP) {
disp_data.v2.usPixelClock =
- cpu_to_le16(dp_link_clock_for_mode_clock(mode->Clock));
+ cpu_to_le16(dp_link_clock_for_mode_clock(clock));
disp_data.v2.acConfig.fDPConnector = 1;
- } else if (mode->Clock > 165000) {
- disp_data.v2.usPixelClock = cpu_to_le16((mode->Clock * 10 * 2) / 100);
+ } else if (clock > 165000) {
+ disp_data.v2.usPixelClock = cpu_to_le16((clock * 10 * 2) / 100);
disp_data.v2.acConfig.fDualLinkConnector = 1;
} else {
- disp_data.v2.usPixelClock = cpu_to_le16((mode->Clock * 10 * 4) / 100);
+ disp_data.v2.usPixelClock = cpu_to_le16((clock * 10 * 4) / 100);
}
- if (radeon_crtc->crtc_id)
+ if (dig_block)
disp_data.v2.acConfig.ucEncoderSel = 1;
switch (radeon_encoder->encoder_id) {
@@ -684,9 +693,9 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, DisplayModePtr mode)
if (radeon_output->MonType == MT_DP)
disp_data.v1.usPixelClock =
- cpu_to_le16(dp_link_clock_for_mode_clock(mode->Clock));
+ cpu_to_le16(dp_link_clock_for_mode_clock(clock));
else
- disp_data.v1.usPixelClock = cpu_to_le16((mode->Clock) / 10);
+ disp_data.v1.usPixelClock = cpu_to_le16((clock) / 10);
switch (radeon_encoder->encoder_id) {
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
@@ -704,7 +713,7 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, DisplayModePtr mode)
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER;
if (info->IsIGP) {
- if (mode->Clock > 165000) {
+ if (clock > 165000) {
disp_data.v1.ucConfig |= (ATOM_TRANSMITTER_CONFIG_8LANE_LINK |
ATOM_TRANSMITTER_CONFIG_LINKA_B);
/* guess */
@@ -724,7 +733,7 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, DisplayModePtr mode)
disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_12_15;
}
} else {
- if (mode->Clock > 165000)
+ if (clock > 165000)
disp_data.v1.ucConfig |= (ATOM_TRANSMITTER_CONFIG_8LANE_LINK |
ATOM_TRANSMITTER_CONFIG_LINKA_B |
ATOM_TRANSMITTER_CONFIG_LANE_0_7);
@@ -741,7 +750,7 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, DisplayModePtr mode)
case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER;
- if (mode->Clock > 165000)
+ if (clock > 165000)
disp_data.v1.ucConfig |= (ATOM_TRANSMITTER_CONFIG_8LANE_LINK |
ATOM_TRANSMITTER_CONFIG_LINKA_B |
ATOM_TRANSMITTER_CONFIG_LANE_0_7);
@@ -767,7 +776,6 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, DisplayModePtr mode)
}
}
}
- radeon_output->transmitter_config = disp_data.v1.ucConfig;
data.exec.index = index;
data.exec.dataSpace = (void *)&space;
@@ -1125,7 +1133,7 @@ atombios_output_overscan_setup(xf86OutputPtr output, DisplayModePtr mode, Displa
}
static int
-atombios_output_scaler_setup(xf86OutputPtr output, DisplayModePtr mode)
+atombios_output_scaler_setup(xf86OutputPtr output)
{
RADEONInfoPtr info = RADEONPTR(output->scrn);
RADEONOutputPrivatePtr radeon_output = output->driver_private;
@@ -1213,63 +1221,6 @@ atombios_output_scaler_setup(xf86OutputPtr output, DisplayModePtr mode)
}
-static int
-atombios_dig_dpms(xf86OutputPtr output, int mode)
-{
- RADEONOutputPrivatePtr radeon_output = output->driver_private;
- RADEONInfoPtr info = RADEONPTR(output->scrn);
- radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output);
- DIG_TRANSMITTER_CONTROL_PS_ALLOCATION disp_data;
- AtomBiosArgRec data;
- unsigned char *space;
-
- if (radeon_encoder == NULL)
- return ATOM_NOT_IMPLEMENTED;
-
- memset(&disp_data, 0, sizeof(disp_data));
-
- switch (mode) {
- case DPMSModeOn:
- disp_data.ucAction = ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT;
- break;
- case DPMSModeStandby:
- case DPMSModeSuspend:
- case DPMSModeOff:
- disp_data.ucAction = ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT;
- break;
- }
-
- disp_data.ucConfig = radeon_output->transmitter_config;
-
- if (IS_DCE32_VARIANT)
- data.exec.index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl);
- else {
- switch (radeon_encoder->encoder_id) {
- case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
- case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
- case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
- data.exec.index = GetIndexIntoMasterTable(COMMAND, DIG1TransmitterControl);
- break;
- case ENCODER_OBJECT_ID_INTERNAL_LVDS:
- case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
- case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
- data.exec.index = GetIndexIntoMasterTable(COMMAND, DIG2TransmitterControl);
- break;
- }
- }
- data.exec.dataSpace = (void *)&space;
- data.exec.pspace = &disp_data;
-
- if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
- ErrorF("Output DIG dpms success\n");
- return ATOM_SUCCESS;
- }
-
- ErrorF("Output DIG dpms failed\n");
- return ATOM_NOT_IMPLEMENTED;
-
-}
-
void
atombios_output_dpms(xf86OutputPtr output, int mode)
{
@@ -1334,7 +1285,7 @@ atombios_output_dpms(xf86OutputPtr output, int mode)
case DPMSModeOn:
radeon_encoder->devices |= radeon_output->active_device;
if (is_dig)
- (void)atombios_dig_dpms(output, mode);
+ atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT);
else {
disp_data.ucAction = ATOM_ENABLE;
data.exec.index = index;
@@ -1355,7 +1306,7 @@ atombios_output_dpms(xf86OutputPtr output, int mode)
radeon_encoder->devices &= ~(radeon_output->active_device);
if (!radeon_encoder->devices) {
if (is_dig)
- (void)atombios_dig_dpms(output, mode);
+ atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT);
else {
disp_data.ucAction = ATOM_DISABLE;
data.exec.index = index;
@@ -1563,13 +1514,16 @@ atombios_output_mode_set(xf86OutputPtr output,
DisplayModePtr adjusted_mode)
{
RADEONOutputPrivatePtr radeon_output = output->driver_private;
+ RADEONCrtcPrivatePtr radeon_crtc = output->crtc->driver_private;
radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output);
RADEONInfoPtr info = RADEONPTR(output->scrn);
if (radeon_encoder == NULL)
return;
+ radeon_output->pixel_clock = adjusted_mode->Clock;
+ radeon_output->dig_block = radeon_crtc->crtc_id;
atombios_output_overscan_setup(output, mode, adjusted_mode);
- atombios_output_scaler_setup(output, adjusted_mode);
+ atombios_output_scaler_setup(output);
atombios_set_output_crtc_source(output);
if (IS_AVIVO_VARIANT) {
@@ -1584,29 +1538,31 @@ atombios_output_mode_set(xf86OutputPtr output,
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
case ENCODER_OBJECT_ID_INTERNAL_LVDS:
case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
- atombios_output_digital_setup(output, adjusted_mode);
+ atombios_output_digital_setup(output, PANEL_ENCODER_ACTION_ENABLE);
break;
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
- atombios_output_dig_encoder_setup(output, adjusted_mode);
- atombios_output_dig_transmitter_setup(output, adjusted_mode);
+ atombios_output_dig_encoder_setup(output, ATOM_ENABLE);
+ atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_INIT);
+ atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_SETUP);
+ atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_ENABLE);
break;
case ENCODER_OBJECT_ID_INTERNAL_DDI:
- atombios_output_ddia_setup(output, adjusted_mode);
+ atombios_output_ddia_setup(output, ATOM_ENABLE);
break;
case ENCODER_OBJECT_ID_INTERNAL_DVO1:
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
- atombios_external_tmds_setup(output, adjusted_mode);
+ atombios_external_tmds_setup(output, ATOM_ENABLE);
break;
case ENCODER_OBJECT_ID_INTERNAL_DAC1:
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
case ENCODER_OBJECT_ID_INTERNAL_DAC2:
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
- atombios_output_dac_setup(output, adjusted_mode);
+ atombios_output_dac_setup(output, ATOM_ENABLE);
if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))
- atombios_output_tv_setup(output, adjusted_mode);
+ atombios_output_tv_setup(output, ATOM_ENABLE);
break;
}
atombios_apply_output_quirks(output, adjusted_mode);
diff --git a/src/legacy_output.c b/src/legacy_output.c
index 6223531..423a3e2 100644
--- a/src/legacy_output.c
+++ b/src/legacy_output.c
@@ -1589,6 +1589,7 @@ legacy_output_mode_set(xf86OutputPtr output, DisplayModePtr mode,
if (radeon_encoder == NULL)
return;
+ radeon_output->pixel_clock = adjusted_mode->Clock;
if (radeon_crtc->crtc_id == 0) {
ErrorF("set RMX\n");
is_primary = TRUE;
@@ -1614,7 +1615,7 @@ legacy_output_mode_set(xf86OutputPtr output, DisplayModePtr mode,
unsigned char *RADEONMMIO = info->MMIO;
uint32_t fp2_gen_cntl;
- atombios_external_tmds_setup(output, mode);
+ atombios_external_tmds_setup(output, ATOM_ENABLE);
fp2_gen_cntl = INREG(RADEON_FP2_GEN_CNTL) & ~R200_FP2_SOURCE_SEL_MASK;
if (radeon_crtc->crtc_id == 1)
fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC2;
diff --git a/src/radeon_atombios.h b/src/radeon_atombios.h
index efebc62..b9a5398 100644
--- a/src/radeon_atombios.h
+++ b/src/radeon_atombios.h
@@ -126,7 +126,7 @@ extern Bool
RADEONGetATOMTVInfo(xf86OutputPtr output);
extern int
-atombios_external_tmds_setup(xf86OutputPtr output, DisplayModePtr mode);
+atombios_external_tmds_setup(xf86OutputPtr output, int action);
extern void
atombios_get_command_table_version(atomBiosHandlePtr atomBIOS, int index, int *major, int *minor);
diff --git a/src/radeon_output.c b/src/radeon_output.c
index 719f9e8..c4041c7 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -110,7 +110,6 @@ extern void atombios_output_mode_set(xf86OutputPtr output,
DisplayModePtr adjusted_mode);
extern void atombios_output_dpms(xf86OutputPtr output, int mode);
extern RADEONMonitorType atombios_dac_detect(xf86OutputPtr output);
-extern int atombios_external_tmds_setup(xf86OutputPtr output, DisplayModePtr mode);
extern AtomBiosResult
atombios_lock_crtc(atomBiosHandlePtr atomBIOS, int crtc, int lock);
static void
@@ -2517,11 +2516,16 @@ static RADEONMacModel RADEONDetectMacModel(ScrnInfoPtr pScrn)
static int
radeon_output_clones (ScrnInfoPtr pScrn, xf86OutputPtr output)
{
+ RADEONInfoPtr info = RADEONPTR(pScrn);
RADEONOutputPrivatePtr radeon_output = output->driver_private;
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (pScrn);
int o;
int index_mask = 0;
+ /* DIG routing gets problematic */
+ if (IS_DCE32_VARIANT)
+ return index_mask;
+
/* LVDS is too wacky */
if (radeon_output->devices & (ATOM_DEVICE_LCD_SUPPORT))
return index_mask;
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index a0c6b2c..6479972 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -271,8 +271,10 @@ typedef struct _RADEONOutputPrivateRec {
radeon_tvout_rec tvout;
/* dce 3.x dig block */
- int transmitter_config;
int igp_lane_info;
+ int dig_block;
+
+ int pixel_clock;
} RADEONOutputPrivateRec, *RADEONOutputPrivatePtr;
struct avivo_pll_state {
More information about the xorg-commit
mailing list