xf86-video-ati: Branch 'atombios-support' - 3 commits

Alex Deucher agd5f at kemper.freedesktop.org
Mon Nov 26 15:03:43 PST 2007


 src/atombios_crtc.c   |   75 -------------
 src/atombios_output.c |  274 ++++++++++++++++++++++++++++++++++++++++++++------
 src/radeon_output.c   |  170 +++++++++++++++++++------------
 src/radeon_probe.h    |    2 
 4 files changed, 352 insertions(+), 169 deletions(-)

New commits:
commit bb8545146959b748994be055d5b3de66ec66c8b2
Author: Alex Deucher <alex at samba.(none)>
Date:   Mon Nov 26 17:34:51 2007 -0500

    RADEON: first pass at TV/Component video
    
    Untested and not likely to work just yet.

diff --git a/src/atombios_output.c b/src/atombios_output.c
index ecbfbdb..f84afd0 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -23,6 +23,7 @@
  *
  * Authors:
  *    Dave Airlie <airlied at redhat.com>
+ *    Alex Deucher <alexdeucher at gmail.com>
  *
  */
 
@@ -45,23 +46,48 @@
 static int
 atombios_output_dac1_setup(xf86OutputPtr output, DisplayModePtr mode)
 {
+    RADEONOutputPrivatePtr radeon_output = output->driver_private;
     RADEONInfoPtr info       = RADEONPTR(output->scrn);
     DAC_ENCODER_CONTROL_PS_ALLOCATION disp_data;
     AtomBiosArgRec data;
     unsigned char *space;
 
     disp_data.ucAction = 1;
-    disp_data.ucDacStandard = 1;
+
+    if (radeon_output->MonType == MT_CRT)
+	disp_data.ucDacStandard = ATOM_DAC1_PS2;
+    else if (radeon_output->MonType == MT_CV)
+	disp_data.ucDacStandard = ATOM_DAC1_CV;
+    else if (OUTPUT_IS_TV) {
+	switch (radeon_output->tvStd) {
+	case TV_STD_NTSC:
+	case TV_STD_NTSC_J:
+	case TV_STD_PAL_60:
+	    disp_data.ucDacStandard = ATOM_DAC1_NTSC;
+	    break;
+	case TV_STD_PAL:
+	case TV_STD_PAL_M:
+	case TV_STD_SCART_PAL:
+	case TV_STD_SECAM:
+	case TV_STD_PAL_CN:
+	    disp_data.ucDacStandard = ATOM_DAC1_PAL;
+	    break;
+	default:
+	    disp_data.ucDacStandard = ATOM_DAC1_NTSC;
+	    break;
+	}
+    }
+
     disp_data.usPixelClock = mode->Clock / 10;
     data.exec.index = GetIndexIntoMasterTable(COMMAND, DAC1EncoderControl);
     data.exec.dataSpace = (void *)&space;
     data.exec.pspace = &disp_data;
-    
+
     if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
 	ErrorF("Output DAC1 setup success\n");
 	return ATOM_SUCCESS;
     }
-    
+
     ErrorF("Output DAC1 setup failed\n");
     return ATOM_NOT_IMPLEMENTED;
 
@@ -70,28 +96,113 @@ atombios_output_dac1_setup(xf86OutputPtr output, DisplayModePtr mode)
 static int
 atombios_output_dac2_setup(xf86OutputPtr output, DisplayModePtr mode)
 {
+    RADEONOutputPrivatePtr radeon_output = output->driver_private;
     RADEONInfoPtr info       = RADEONPTR(output->scrn);
     DAC_ENCODER_CONTROL_PS_ALLOCATION disp_data;
     AtomBiosArgRec data;
     unsigned char *space;
 
     disp_data.ucAction = 1;
-    disp_data.ucDacStandard = 1;
+
+    if (radeon_output->MonType == MT_CRT)
+	disp_data.ucDacStandard = ATOM_DAC2_PS2;
+    else if (radeon_output->MonType == MT_CV)
+	disp_data.ucDacStandard = ATOM_DAC2_CV;
+    else if (OUTPUT_IS_TV) {
+	switch (radeon_output->tvStd) {
+	case TV_STD_NTSC:
+	case TV_STD_NTSC_J:
+	case TV_STD_PAL_60:
+	    disp_data.ucDacStandard = ATOM_DAC2_NTSC;
+	    break;
+	case TV_STD_PAL:
+	case TV_STD_PAL_M:
+	case TV_STD_SCART_PAL:
+	case TV_STD_SECAM:
+	case TV_STD_PAL_CN:
+	    disp_data.ucDacStandard = ATOM_DAC2_PAL;
+	    break;
+	default:
+	    disp_data.ucDacStandard = ATOM_DAC2_NTSC;
+	    break;
+	}
+    }
+
     disp_data.usPixelClock = mode->Clock / 10;
     data.exec.index = GetIndexIntoMasterTable(COMMAND, DAC2EncoderControl);
     data.exec.dataSpace = (void *)&space;
     data.exec.pspace = &disp_data;
-    
+
     if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
 	ErrorF("Output DAC2 setup success\n");
 	return ATOM_SUCCESS;
     }
-    
+
     ErrorF("Output DAC2 setup failed\n");
     return ATOM_NOT_IMPLEMENTED;
 
 }
 
+static int
+atombios_output_tv1_setup(xf86OutputPtr output, DisplayModePtr mode)
+{
+    RADEONOutputPrivatePtr radeon_output = output->driver_private;
+    RADEONInfoPtr info       = RADEONPTR(output->scrn);
+    TV_ENCODER_CONTROL_PS_ALLOCATION disp_data;
+    AtomBiosArgRec data;
+    unsigned char *space;
+
+    disp_data.sTVEncoder.ucAction = 1;
+
+    if (radeon_output->MonType == MT_CV)
+	disp_data.sTVEncoder.ucTvStandard = ATOM_TV_CV;
+    else {
+	switch (radeon_output->tvStd) {
+	case TV_STD_NTSC:
+	    disp_data.sTVEncoder.ucTvStandard = ATOM_TV_NTSC;
+	    break;
+	case TV_STD_PAL:
+	    disp_data.sTVEncoder.ucTvStandard = ATOM_TV_PAL;
+	    break;
+	case TV_STD_PAL_M:
+	    disp_data.sTVEncoder.ucTvStandard = ATOM_TV_PALM;
+	    break;
+	case TV_STD_PAL_60:
+	    disp_data.sTVEncoder.ucTvStandard = ATOM_TV_PAL60;
+	    break;
+	case TV_STD_NTSC_J:
+	    disp_data.sTVEncoder.ucTvStandard = ATOM_TV_NTSCJ;
+	    break;
+	case TV_STD_SCART_PAL:
+	    disp_data.sTVEncoder.ucTvStandard = ATOM_TV_PAL; /* ??? */
+	    break;
+	case TV_STD_SECAM:
+	    disp_data.sTVEncoder.ucTvStandard = ATOM_TV_SECAM;
+	    break;
+	case TV_STD_PAL_CN:
+	    disp_data.sTVEncoder.ucTvStandard = ATOM_TV_PALCN;
+	    break;
+	default:
+	    disp_data.sTVEncoder.ucTvStandard = ATOM_TV_NTSC;
+	    break;
+	}
+    }
+
+    disp_data.sTVEncoder.usPixelClock = mode->Clock / 10;
+    data.exec.index = GetIndexIntoMasterTable(COMMAND, TVEncoderControl);
+    data.exec.dataSpace = (void *)&space;
+    data.exec.pspace = &disp_data;
+    
+    if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
+	ErrorF("Output TV1 setup success\n");
+	return ATOM_SUCCESS;
+    }
+    
+    ErrorF("Output TV1 setup failed\n");
+    return ATOM_NOT_IMPLEMENTED;
+
+}
+
 int
 atombios_external_tmds_setup(xf86OutputPtr output, DisplayModePtr mode)
 {
@@ -251,6 +362,12 @@ atombios_device_dpms(xf86OutputPtr output, int device, int mode)
     case ATOM_DEVICE_LCD1_SUPPORT:
 	index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl);
 	break;
+    case ATOM_DEVICE_TV1_SUPPORT:
+	index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
+	break;
+    case ATOM_DEVICE_CV_SUPPORT:
+	index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
+	break;
     default:
 	return;
     }
@@ -411,31 +528,51 @@ atombios_output_mode_set(xf86OutputPtr output,
     } else if (radeon_output->MonType == MT_LCD) {
        if (radeon_output->devices & ATOM_DEVICE_LCD1_SUPPORT)
 	   atombios_output_lvds_setup(output, adjusted_mode);
+    } else if (OUTPUT_IS_TV || (radeon_output->MonType == MT_CV)) {
+	atombios_output_dac2_setup(output, adjusted_mode);
+	atombios_output_tv1_setup(output, adjusted_mode);
     }
+
 }
 
 static AtomBiosResult
-atom_bios_dac_load_detect(atomBiosHandlePtr atomBIOS, int dac)
+atom_bios_dac_load_detect(atomBiosHandlePtr atomBIOS, xf86OutputPtr output)
 {
-  DAC_LOAD_DETECTION_PS_ALLOCATION dac_data;
-  AtomBiosArgRec data;
-  unsigned char *space;
-
-  dac_data.sDacload.usDeviceID = 0;
-  dac_data.sDacload.ucDacType = 0;
-  dac_data.sDacload.ucMisc = 0;
-
-  data.exec.index = GetIndexIntoMasterTable(COMMAND, DAC_LoadDetection);
-  data.exec.dataSpace = (void *)&space;
-  data.exec.pspace = &dac_data;
-  
-  if (RHDAtomBiosFunc(atomBIOS->scrnIndex, atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
-
-    ErrorF("Dac detection success\n");
-    return ATOM_SUCCESS ;
-  }
-  
-  ErrorF("DAC detection failed\n");
+    RADEONOutputPrivatePtr radeon_output = output->driver_private;
+    DAC_LOAD_DETECTION_PS_ALLOCATION dac_data;
+    AtomBiosArgRec data;
+    unsigned char *space;
+
+    if (radeon_output->devices & ATOM_DEVICE_CRT1_SUPPORT) {
+	dac_data.sDacload.usDeviceID = ATOM_DEVICE_CRT1_SUPPORT;
+	dac_data.sDacload.ucDacType = ATOM_DAC_A;
+    } else if (radeon_output->devices & ATOM_DEVICE_CRT2_SUPPORT) {
+	dac_data.sDacload.usDeviceID = ATOM_DEVICE_CRT2_SUPPORT;
+	dac_data.sDacload.ucDacType = ATOM_DAC_B;
+    } else if (radeon_output->devices & ATOM_DEVICE_CV_SUPPORT) {
+	dac_data.sDacload.usDeviceID = ATOM_DEVICE_CV_SUPPORT;
+	dac_data.sDacload.ucDacType = ATOM_DAC_B;
+    } else if (radeon_output->devices & ATOM_DEVICE_TV1_SUPPORT) {
+	dac_data.sDacload.usDeviceID = ATOM_DEVICE_TV1_SUPPORT;
+	dac_data.sDacload.ucDacType = ATOM_DAC_B;
+    } else {
+	ErrorF("invalid output device for dac detection\n");
+	return ATOM_NOT_IMPLEMENTED;
+    }
+
+    dac_data.sDacload.ucMisc = 0;
+
+    data.exec.index = GetIndexIntoMasterTable(COMMAND, DAC_LoadDetection);
+    data.exec.dataSpace = (void *)&space;
+    data.exec.pspace = &dac_data;
+
+    if (RHDAtomBiosFunc(atomBIOS->scrnIndex, atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
+
+	ErrorF("Dac detection success\n");
+	return ATOM_SUCCESS ;
+    }
+
+    ErrorF("DAC detection failed\n");
     return ATOM_NOT_IMPLEMENTED;
 }
 
@@ -449,19 +586,28 @@ atombios_dac_detect(ScrnInfoPtr pScrn, xf86OutputPtr output)
     AtomBiosResult ret;
     uint32_t bios_0_scratch;
 
-    ret = atom_bios_dac_load_detect(info->atomBIOS, radeon_output->DACType);
+    ret = atom_bios_dac_load_detect(info->atomBIOS, output);
     if (ret == ATOM_SUCCESS) {
-      ErrorF("DAC connect %08X\n", (unsigned int)INREG(RADEON_BIOS_0_SCRATCH));
 	bios_0_scratch = INREG(RADEON_BIOS_0_SCRATCH);
-	
+	ErrorF("DAC connect %08X\n", (unsigned int)bios_0_scratch);
+
 	if (radeon_output->devices & ATOM_DEVICE_CRT1_SUPPORT) {
-	    if (bios_0_scratch & ATOM_S0_CRT1_COLOR)
+	    if (bios_0_scratch & ATOM_S0_CRT1_MASK)
 		MonType = MT_CRT;
 	} else if (radeon_output->devices & ATOM_DEVICE_CRT2_SUPPORT) {
-	    if (bios_0_scratch & ATOM_S0_CRT2_COLOR)
+	    if (bios_0_scratch & ATOM_S0_CRT2_MASK)
 		MonType = MT_CRT;
+	} else if (radeon_output->devices & ATOM_DEVICE_CV_SUPPORT) {
+	    if (bios_0_scratch & (ATOM_S0_CV_MASK | ATOM_S0_CV_MASK_A))
+		MonType = MT_CV;
+	} else if (radeon_output->devices & ATOM_DEVICE_TV1_SUPPORT) {
+	    if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
+		MonType = MT_CTV;
+	    else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
+		MonType = MT_STV;
 	}
     }
+
     return MonType;
 }
 
diff --git a/src/radeon_output.c b/src/radeon_output.c
index faf3dc9..16aa1b8 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -2187,6 +2187,12 @@ radeon_set_property(xf86OutputPtr output, Atom property,
 	} else if (value->size == strlen("scart-pal") && !strncmp("scart-pal", s, strlen("scart-pal"))) {
 	    radeon_output->tvStd = TV_STD_SCART_PAL;
 	    return TRUE;
+	} else if (value->size == strlen("pal-cn") && !strncmp("pal-cn", s, strlen("pal-cn"))) {
+	    radeon_output->tvStd = TV_STD_PAL_CN;
+	    return TRUE;
+	} else if (value->size == strlen("secam") && !strncmp("secam", s, strlen("secam"))) {
+	    radeon_output->tvStd = TV_STD_SECAM;
+	    return TRUE;
 	}
 	return FALSE;
     }
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index c1a7913..0e325a6 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -164,6 +164,8 @@ typedef enum
     TV_STD_PAL_60    = 8,
     TV_STD_NTSC_J    = 16,
     TV_STD_SCART_PAL = 32,
+    TV_STD_SECAM     = 64,
+    TV_STD_PAL_CN    = 128,
 } TVStd;
 
 typedef struct _RADEONCrtcPrivateRec {
commit e2bde646b864dca9056d9ecfe23a0d905647ea9a
Author: Alex Deucher <alex at samba.(none)>
Date:   Mon Nov 26 14:35:57 2007 -0500

    RADEON: move crtc output source selection into atombios_output.c
    
    The function fits better as an output function and should now
    work with clones as well.

diff --git a/src/atombios_crtc.c b/src/atombios_crtc.c
index dbb8b69..0609bb5 100644
--- a/src/atombios_crtc.c
+++ b/src/atombios_crtc.c
@@ -298,79 +298,6 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr mode)
     return;
 }
 
-static void
-atombios_set_crtc_source(xf86CrtcPtr crtc)
-{
-    ScrnInfoPtr pScrn = crtc->scrn;
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
-    RADEONInfoPtr info       = RADEONPTR(pScrn);
-    AtomBiosArgRec data;
-    unsigned char *space;
-    SELECT_CRTC_SOURCE_PS_ALLOCATION crtc_src_param;
-    int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source);
-    int major, minor, i;
-    
-    atombios_get_command_table_version(info->atomBIOS, index, &major, &minor);
-    
-    ErrorF("select crtc source table is %d %d\n", major, minor);
-
-    crtc_src_param.ucCRTC = radeon_crtc->crtc_id;
-    crtc_src_param.ucDevice = 0;
-
-    for (i = 0; i < xf86_config->num_output; i++) {
-        xf86OutputPtr output = xf86_config->output[i];
-        RADEONOutputPrivatePtr radeon_output = output->driver_private;
-
-	/* doesn't seem to support cloning via atom */
-	if (output->crtc == crtc) {
-	    switch(major) {
-	    case 1: {
-		switch(minor) {
-		case 0:
-		case 1:
-		default:
-		    if (radeon_output->MonType == MT_CRT) {
-                        if (radeon_output->devices & ATOM_DEVICE_CRT1_SUPPORT)
-                            crtc_src_param.ucDevice = ATOM_DEVICE_CRT1_INDEX;
-                        else if (radeon_output->devices & ATOM_DEVICE_CRT2_SUPPORT)
-                            crtc_src_param.ucDevice = ATOM_DEVICE_CRT2_INDEX;
-                    } else if (radeon_output->MonType == MT_DFP) {
-                        if (radeon_output->devices & ATOM_DEVICE_DFP1_SUPPORT)
-                            crtc_src_param.ucDevice = ATOM_DEVICE_DFP1_INDEX;
-                        else if (radeon_output->devices & ATOM_DEVICE_DFP2_SUPPORT)
-                            crtc_src_param.ucDevice = ATOM_DEVICE_DFP2_INDEX;
-                        else if (radeon_output->devices & ATOM_DEVICE_DFP3_SUPPORT)
-                            crtc_src_param.ucDevice = ATOM_DEVICE_DFP3_INDEX;
-                    } else if (radeon_output->MonType == MT_LCD) {
-                        if (radeon_output->devices & ATOM_DEVICE_LCD1_SUPPORT)
-                            crtc_src_param.ucDevice = ATOM_DEVICE_LCD1_INDEX;
-                    }
-		    break;
-		}
-		break;
-	    }
-	    default:
-		break;
-	    }
-	}
-    }
-
-    ErrorF("device sourced: 0x%x\n", crtc_src_param.ucDevice);
-
-    data.exec.index = index;
-    data.exec.dataSpace = (void *)&space;
-    data.exec.pspace = &crtc_src_param;
-    
-    if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
-	ErrorF("Set CRTC %d Source success\n", radeon_crtc->crtc_id);
-	return;
-    }
-  
-    ErrorF("Set CRTC Source failed\n");
-    return;
-}
-
 void
 atombios_crtc_mode_set(xf86CrtcPtr crtc,
 		       DisplayModePtr mode,
@@ -480,8 +407,6 @@ atombios_crtc_mode_set(xf86CrtcPtr crtc,
 
     atombios_set_crtc_timing(info->atomBIOS, &crtc_timing);
 
-    atombios_set_crtc_source(crtc);
-
     if (info->tilingEnabled != tilingOld) {
 	/* need to redraw front buffer, I guess this can be considered a hack ? */
 	/* if this is called during ScreenInit() we don't have pScrn->pScreen yet */
diff --git a/src/atombios_output.c b/src/atombios_output.c
index a6b4277..ecbfbdb 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -323,6 +323,70 @@ atombios_output_dpms(xf86OutputPtr output, int mode)
 #endif
 }
 
+static void
+atombios_set_output_crtc_source(xf86OutputPtr output)
+{
+    RADEONOutputPrivatePtr radeon_output = output->driver_private;
+    RADEONCrtcPrivatePtr radeon_crtc = output->crtc->driver_private;
+    RADEONInfoPtr info       = RADEONPTR(output->scrn);
+    AtomBiosArgRec data;
+    unsigned char *space;
+    SELECT_CRTC_SOURCE_PS_ALLOCATION crtc_src_param;
+    int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source);
+    int major, minor;
+    
+    atombios_get_command_table_version(info->atomBIOS, index, &major, &minor);
+    
+    ErrorF("select crtc source table is %d %d\n", major, minor);
+
+    crtc_src_param.ucCRTC = radeon_crtc->crtc_id;
+    crtc_src_param.ucDevice = 0;
+
+    switch(major) {
+    case 1: {
+	switch(minor) {
+	case 0:
+	case 1:
+	default:
+	    if (radeon_output->MonType == MT_CRT) {
+		if (radeon_output->devices & ATOM_DEVICE_CRT1_SUPPORT)
+		    crtc_src_param.ucDevice = ATOM_DEVICE_CRT1_INDEX;
+		else if (radeon_output->devices & ATOM_DEVICE_CRT2_SUPPORT)
+		    crtc_src_param.ucDevice = ATOM_DEVICE_CRT2_INDEX;
+	    } else if (radeon_output->MonType == MT_DFP) {
+		if (radeon_output->devices & ATOM_DEVICE_DFP1_SUPPORT)
+		    crtc_src_param.ucDevice = ATOM_DEVICE_DFP1_INDEX;
+		else if (radeon_output->devices & ATOM_DEVICE_DFP2_SUPPORT)
+		    crtc_src_param.ucDevice = ATOM_DEVICE_DFP2_INDEX;
+		else if (radeon_output->devices & ATOM_DEVICE_DFP3_SUPPORT)
+		    crtc_src_param.ucDevice = ATOM_DEVICE_DFP3_INDEX;
+	    } else if (radeon_output->MonType == MT_LCD) {
+		if (radeon_output->devices & ATOM_DEVICE_LCD1_SUPPORT)
+		    crtc_src_param.ucDevice = ATOM_DEVICE_LCD1_INDEX;
+	    }
+	    break;
+	}
+	break;
+    }
+    default:
+	break;
+    }
+
+    ErrorF("device sourced: 0x%x\n", crtc_src_param.ucDevice);
+
+    data.exec.index = index;
+    data.exec.dataSpace = (void *)&space;
+    data.exec.pspace = &crtc_src_param;
+
+    if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
+	ErrorF("Set CRTC %d Source success\n", radeon_crtc->crtc_id);
+	return;
+    }
+
+    ErrorF("Set CRTC Source failed\n");
+    return;
+}
+
 void
 atombios_output_mode_set(xf86OutputPtr output,
 			 DisplayModePtr mode,
@@ -330,6 +394,8 @@ atombios_output_mode_set(xf86OutputPtr output,
 {
     RADEONOutputPrivatePtr radeon_output = output->driver_private;
 
+    atombios_set_output_crtc_source(output);
+
     if (radeon_output->MonType == MT_CRT) {
        if (radeon_output->devices & ATOM_DEVICE_CRT1_SUPPORT)
 	   atombios_output_dac1_setup(output, adjusted_mode);
commit 16c9be4107678a2a58d3418b7f1cc94d695ca8d6
Author: Alex Deucher <alex at samba.(none)>
Date:   Mon Nov 26 14:20:54 2007 -0500

    RADEON: add default connector table for avivo chips

diff --git a/src/radeon_output.c b/src/radeon_output.c
index 678e4d7..faf3dc9 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -46,7 +46,7 @@
 #include "radeon_probe.h"
 #include "radeon_version.h"
 #include "radeon_tv.h"
-
+#include "radeon_atombios.h"
 
 const char *MonTypeName[7] = {
   "AUTO",
@@ -2856,92 +2856,130 @@ static void RADEONSetupGenericConnectors(ScrnInfoPtr pScrn)
 	return;
     }
 
-    if (info->IsMobility) {
-	/* Below is the most common setting, but may not be true */
-	if (info->IsIGP) {
-	    info->BiosConnector[0].ddc_line = RADEON_LCD_GPIO_MASK;
-	    info->BiosConnector[0].DACType = DAC_UNKNOWN;
-	    info->BiosConnector[0].TMDSType = TMDS_UNKNOWN;
-	    info->BiosConnector[0].ConnectorType = CONNECTOR_LVDS;
-	    info->BiosConnector[0].valid = TRUE;
-
-	    /* IGP only has TVDAC */
-	    if (info->ChipFamily == CHIP_FAMILY_RS400)
-		info->BiosConnector[1].ddc_line = RADEON_GPIO_CRT2_DDC;
-	    else
-		info->BiosConnector[1].ddc_line = RADEON_GPIO_VGA_DDC;
-	    info->BiosConnector[1].DACType = DAC_TVDAC;
-	    info->BiosConnector[1].TMDSType = TMDS_UNKNOWN;
-	    info->BiosConnector[1].ConnectorType = CONNECTOR_VGA;
-	    info->BiosConnector[1].valid = TRUE;
-	} else {
-#if defined(__powerpc__)
-	    info->BiosConnector[0].ddc_line = RADEON_GPIO_DVI_DDC;
-#else
-	    info->BiosConnector[0].ddc_line = RADEON_LCD_GPIO_MASK;
-#endif
-	    info->BiosConnector[0].DACType = DAC_UNKNOWN;
-	    info->BiosConnector[0].TMDSType = TMDS_UNKNOWN;
+    if (IS_AVIVO_VARIANT) {
+	if (info->IsMobility) {
+	    info->BiosConnector[0].ddc_line = 0x7e60;
+	    info->BiosConnector[0].DACType = DAC_NONE;
+	    info->BiosConnector[0].TMDSType = TMDS_NONE;
 	    info->BiosConnector[0].ConnectorType = CONNECTOR_LVDS;
+	    info->BiosConnector[0].devices = ATOM_DEVICE_LCD1_SUPPORT;
 	    info->BiosConnector[0].valid = TRUE;
 
-	    info->BiosConnector[1].ddc_line = RADEON_GPIO_VGA_DDC;
+	    info->BiosConnector[1].ddc_line = 0x7e40;
 	    info->BiosConnector[1].DACType = DAC_PRIMARY;
-	    info->BiosConnector[1].TMDSType = TMDS_UNKNOWN;
+	    info->BiosConnector[1].TMDSType = TMDS_NONE;
 	    info->BiosConnector[1].ConnectorType = CONNECTOR_VGA;
-	    info->BiosConnector[1].valid = TRUE;
-	}
-    } else {
-	/* Below is the most common setting, but may not be true */
-	if (info->IsIGP) {
-	    if (info->ChipFamily == CHIP_FAMILY_RS400)
-		info->BiosConnector[0].ddc_line = RADEON_GPIO_CRT2_DDC;
-	    else
-		info->BiosConnector[0].ddc_line = RADEON_GPIO_VGA_DDC;
-	    info->BiosConnector[0].DACType = DAC_TVDAC;
-	    info->BiosConnector[0].TMDSType = TMDS_UNKNOWN;
-	    info->BiosConnector[0].ConnectorType = CONNECTOR_VGA;
-	    info->BiosConnector[0].valid = TRUE;
-
-	    /* not sure what a good default DDCType for DVI on 
-	     * IGP desktop chips is
-	     */
-	    info->BiosConnector[1].ddc_line = RADEON_GPIO_MONID; /* DDC_DVI? */
-	    info->BiosConnector[1].DACType = DAC_UNKNOWN;
-	    info->BiosConnector[1].TMDSType = TMDS_EXT;
-	    info->BiosConnector[1].ConnectorType = CONNECTOR_DVI_D;
+	    info->BiosConnector[1].devices = ATOM_DEVICE_CRT1_SUPPORT;
 	    info->BiosConnector[1].valid = TRUE;
 	} else {
-	    info->BiosConnector[0].ddc_line = RADEON_GPIO_DVI_DDC;
+	    info->BiosConnector[0].ddc_line = 0x7e50;
 	    info->BiosConnector[0].DACType = DAC_TVDAC;
 	    info->BiosConnector[0].TMDSType = TMDS_INT;
 	    info->BiosConnector[0].ConnectorType = CONNECTOR_DVI_I;
+	    info->BiosConnector[0].devices = ATOM_DEVICE_CRT2_SUPPORT | ATOM_DEVICE_DFP1_SUPPORT;
 	    info->BiosConnector[0].valid = TRUE;
 
-	    info->BiosConnector[1].ddc_line = RADEON_GPIO_VGA_DDC;
+	    info->BiosConnector[1].ddc_line = 0x7e40;
 	    info->BiosConnector[1].DACType = DAC_PRIMARY;
-	    info->BiosConnector[1].TMDSType = TMDS_EXT;
+	    info->BiosConnector[1].TMDSType = TMDS_NONE;
 	    info->BiosConnector[1].ConnectorType = CONNECTOR_VGA;
+	    info->BiosConnector[1].devices = ATOM_DEVICE_CRT1_SUPPORT;
 	    info->BiosConnector[1].valid = TRUE;
 	}
-    }
 
-    if (info->InternalTVOut) {
 	info->BiosConnector[2].ConnectorType = CONNECTOR_STV;
 	info->BiosConnector[2].DACType = DAC_TVDAC;
 	info->BiosConnector[2].TMDSType = TMDS_NONE;
 	info->BiosConnector[2].ddc_line = 0;
+	info->BiosConnector[2].devices = ATOM_DEVICE_TV1_SUPPORT;
 	info->BiosConnector[2].valid = TRUE;
-    }
+    } else {
+	if (info->IsMobility) {
+	    /* Below is the most common setting, but may not be true */
+	    if (info->IsIGP) {
+		info->BiosConnector[0].ddc_line = RADEON_LCD_GPIO_MASK;
+		info->BiosConnector[0].DACType = DAC_UNKNOWN;
+		info->BiosConnector[0].TMDSType = TMDS_UNKNOWN;
+		info->BiosConnector[0].ConnectorType = CONNECTOR_LVDS;
+		info->BiosConnector[0].valid = TRUE;
+
+		/* IGP only has TVDAC */
+		if (info->ChipFamily == CHIP_FAMILY_RS400)
+		    info->BiosConnector[1].ddc_line = RADEON_GPIO_CRT2_DDC;
+		else
+		    info->BiosConnector[1].ddc_line = RADEON_GPIO_VGA_DDC;
+		info->BiosConnector[1].DACType = DAC_TVDAC;
+		info->BiosConnector[1].TMDSType = TMDS_UNKNOWN;
+		info->BiosConnector[1].ConnectorType = CONNECTOR_VGA;
+		info->BiosConnector[1].valid = TRUE;
+	    } else {
+#if defined(__powerpc__)
+		info->BiosConnector[0].ddc_line = RADEON_GPIO_DVI_DDC;
+#else
+		info->BiosConnector[0].ddc_line = RADEON_LCD_GPIO_MASK;
+#endif
+		info->BiosConnector[0].DACType = DAC_UNKNOWN;
+		info->BiosConnector[0].TMDSType = TMDS_UNKNOWN;
+		info->BiosConnector[0].ConnectorType = CONNECTOR_LVDS;
+		info->BiosConnector[0].valid = TRUE;
 
-    /* Some cards have the DDC lines swapped and we have no way to
-     * detect it yet (Mac cards)
-     */
-    if (xf86ReturnOptValBool(info->Options, OPTION_REVERSE_DDC, FALSE)) {
-	info->BiosConnector[0].ddc_line = RADEON_GPIO_VGA_DDC;
-	info->BiosConnector[1].ddc_line = RADEON_GPIO_DVI_DDC;
-    }
+		info->BiosConnector[1].ddc_line = RADEON_GPIO_VGA_DDC;
+		info->BiosConnector[1].DACType = DAC_PRIMARY;
+		info->BiosConnector[1].TMDSType = TMDS_UNKNOWN;
+		info->BiosConnector[1].ConnectorType = CONNECTOR_VGA;
+		info->BiosConnector[1].valid = TRUE;
+	    }
+	} else {
+	    /* Below is the most common setting, but may not be true */
+	    if (info->IsIGP) {
+		if (info->ChipFamily == CHIP_FAMILY_RS400)
+		    info->BiosConnector[0].ddc_line = RADEON_GPIO_CRT2_DDC;
+		else
+		    info->BiosConnector[0].ddc_line = RADEON_GPIO_VGA_DDC;
+		info->BiosConnector[0].DACType = DAC_TVDAC;
+		info->BiosConnector[0].TMDSType = TMDS_UNKNOWN;
+		info->BiosConnector[0].ConnectorType = CONNECTOR_VGA;
+		info->BiosConnector[0].valid = TRUE;
+
+		/* not sure what a good default DDCType for DVI on
+		 * IGP desktop chips is
+		 */
+		info->BiosConnector[1].ddc_line = RADEON_GPIO_MONID; /* DDC_DVI? */
+		info->BiosConnector[1].DACType = DAC_UNKNOWN;
+		info->BiosConnector[1].TMDSType = TMDS_EXT;
+		info->BiosConnector[1].ConnectorType = CONNECTOR_DVI_D;
+		info->BiosConnector[1].valid = TRUE;
+	    } else {
+		info->BiosConnector[0].ddc_line = RADEON_GPIO_DVI_DDC;
+		info->BiosConnector[0].DACType = DAC_TVDAC;
+		info->BiosConnector[0].TMDSType = TMDS_INT;
+		info->BiosConnector[0].ConnectorType = CONNECTOR_DVI_I;
+		info->BiosConnector[0].valid = TRUE;
+
+		info->BiosConnector[1].ddc_line = RADEON_GPIO_VGA_DDC;
+		info->BiosConnector[1].DACType = DAC_PRIMARY;
+		info->BiosConnector[1].TMDSType = TMDS_EXT;
+		info->BiosConnector[1].ConnectorType = CONNECTOR_VGA;
+		info->BiosConnector[1].valid = TRUE;
+	    }
+	}
 
+	if (info->InternalTVOut) {
+	    info->BiosConnector[2].ConnectorType = CONNECTOR_STV;
+	    info->BiosConnector[2].DACType = DAC_TVDAC;
+	    info->BiosConnector[2].TMDSType = TMDS_NONE;
+	    info->BiosConnector[2].ddc_line = 0;
+	    info->BiosConnector[2].valid = TRUE;
+	}
+
+	/* Some cards have the DDC lines swapped and we have no way to
+	 * detect it yet (Mac cards)
+	 */
+	if (xf86ReturnOptValBool(info->Options, OPTION_REVERSE_DDC, FALSE)) {
+	    info->BiosConnector[0].ddc_line = RADEON_GPIO_VGA_DDC;
+	    info->BiosConnector[1].ddc_line = RADEON_GPIO_DVI_DDC;
+	}
+    }
 }
 
 #if defined(__powerpc__)


More information about the xorg-commit mailing list