xf86-video-ati: Branch 'master' - 3 commits

Alex Deucher agd5f at kemper.freedesktop.org
Wed Jan 2 13:42:55 PST 2008


 src/atombios_output.c |   52 +++++++++++++++++
 src/radeon_atombios.c |  146 +++++++++++++++++++++++++++++++++++++++++++-------
 src/radeon_atombios.h |    3 -
 src/radeon_modes.c    |   12 +++-
 src/radeon_output.c   |   26 ++++++--
 src/radeon_probe.h    |    2 
 6 files changed, 214 insertions(+), 27 deletions(-)

New commits:
commit ce34090c758ac91171cb6adb9b8a36e4adbf99cf
Merge: 2180f04... 30cab1d...
Author: Alex Deucher <alex at samba.(none)>
Date:   Wed Jan 2 16:41:36 2008 -0500

    Merge branch 'master' of git+ssh://agd5f@git.freedesktop.org/git/xorg/driver/xf86-video-ati

commit 2180f04b6fb94a638f6274cb4455d5688b324dbc
Author: Alex Deucher <alex at samba.(none)>
Date:   Wed Jan 2 16:41:06 2008 -0500

    RADEON: preliminary support for ATOM RMX
    
    not functional yet.

diff --git a/src/atombios_output.c b/src/atombios_output.c
index 3b9cfbf..c963368 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -316,6 +316,44 @@ atombios_output_lvds_setup(xf86OutputPtr output, DisplayModePtr mode)
     return ATOM_NOT_IMPLEMENTED;
 }
 
+static int
+atombios_output_scaler_setup(xf86OutputPtr output, DisplayModePtr mode)
+{
+    RADEONInfoPtr info       = RADEONPTR(output->scrn);
+    RADEONOutputPrivatePtr radeon_output = output->driver_private;
+    RADEONCrtcPrivatePtr radeon_crtc = output->crtc->driver_private;
+    ENABLE_SCALER_PS_ALLOCATION disp_data;
+    AtomBiosArgRec data;
+    unsigned char *space;
+
+    disp_data.ucScaler = radeon_crtc->crtc_id;
+
+    if (mode->Flags & RADEON_USE_RMX) {
+	ErrorF("Using RMX\n");
+	if (radeon_output->rmx_type == RMX_FULL ||
+	    radeon_output->rmx_type == RMX_ASPECT)
+	    disp_data.ucEnable = ATOM_SCALER_EXPANSION;
+	else if (radeon_output->rmx_type == RMX_CENTER)
+	    disp_data.ucEnable = ATOM_SCALER_CENTER;
+    } else {
+	ErrorF("Not using RMX\n");
+	disp_data.ucEnable = ATOM_SCALER_DISABLE;
+    }
+
+    data.exec.index = GetIndexIntoMasterTable(COMMAND, EnableScaler);
+    data.exec.dataSpace = (void *)&space;
+    data.exec.pspace = &disp_data;
+
+    if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
+	ErrorF("scaler %d setup success\n", radeon_crtc->crtc_id);
+	return ATOM_SUCCESS;
+    }
+
+    ErrorF("scaler %d setup failed\n", radeon_crtc->crtc_id);
+    return ATOM_NOT_IMPLEMENTED;
+
+}
+
 static AtomBiosResult
 atombios_display_device_control(atomBiosHandlePtr atomBIOS, int device, Bool state)
 {
@@ -525,6 +563,7 @@ atombios_output_mode_set(xf86OutputPtr output,
 {
     RADEONOutputPrivatePtr radeon_output = output->driver_private;
 
+    //atombios_output_scaler_setup(output, mode);
     atombios_set_output_crtc_source(output);
 
     if (radeon_output->MonType == MT_CRT) {
diff --git a/src/radeon_output.c b/src/radeon_output.c
index ecbc7b1..4c2df88 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -88,7 +88,7 @@ const char *DACTypeName[4] = {
   "None"
 };
 
-const char *ConnectorTypeName[16] = {
+const char *ConnectorTypeName[17] = {
   "None",
   "VGA",
   "DVI-I",
@@ -543,6 +543,7 @@ static Bool
 radeon_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
 		    DisplayModePtr adjusted_mode)
 {
+    RADEONInfoPtr info = RADEONPTR(output->scrn);
     RADEONOutputPrivatePtr radeon_output = output->driver_private;
 
     radeon_output->Flags &= ~RADEON_USE_RMX;
@@ -553,7 +554,7 @@ radeon_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
 	xf86CrtcPtr crtc = output->crtc;
 	RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
 
-	if (radeon_crtc->crtc_id == 0) {
+	if (IS_AVIVO_VARIANT || radeon_crtc->crtc_id == 0) {
 	    if (mode->HDisplay < radeon_output->PanelXRes ||
 		mode->VDisplay < radeon_output->PanelYRes)
 		radeon_output->Flags |= RADEON_USE_RMX;
commit dab4dc285154d40303aadaa849b85f8e251e578e
Author: Alex Deucher <alex at samba.(none)>
Date:   Wed Jan 2 16:27:19 2008 -0500

    RADEON: add support for ATOM component video table
    
    Component output is still not working.

diff --git a/src/atombios_output.c b/src/atombios_output.c
index 45e5696..3b9cfbf 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -431,6 +431,14 @@ atombios_output_dpms(xf86OutputPtr output, int mode)
 	   atombios_device_dpms(output, ATOM_DEVICE_CRT1_SUPPORT, mode);
        else if (radeon_output->devices & ATOM_DEVICE_CRT2_SUPPORT)
 	   atombios_device_dpms(output, ATOM_DEVICE_CRT2_SUPPORT, mode);
+   } else if (radeon_output->MonType == MT_CV) {
+       ErrorF("AGD: cv dpms\n");
+       if (radeon_output->devices & ATOM_DEVICE_CV_SUPPORT)
+	   atombios_device_dpms(output, ATOM_DEVICE_CV_SUPPORT, mode);
+   } else if (OUTPUT_IS_TV) {
+       ErrorF("AGD: tv dpms\n");
+       if (radeon_output->devices & ATOM_DEVICE_TV1_SUPPORT)
+	   atombios_device_dpms(output, ATOM_DEVICE_TV1_SUPPORT, mode);
    }
 
 #if 1
@@ -480,9 +488,12 @@ atombios_set_output_crtc_source(xf86OutputPtr output)
 	    } else if (radeon_output->MonType == MT_LCD) {
 		if (radeon_output->devices & ATOM_DEVICE_LCD1_SUPPORT)
 		    crtc_src_param.ucDevice = ATOM_DEVICE_LCD1_INDEX;
-	    } else if (OUTPUT_IS_TV || (radeon_output->MonType == MT_CV)) {
+	    } else if (OUTPUT_IS_TV) {
 		if (radeon_output->devices & ATOM_DEVICE_TV1_SUPPORT)
 		    crtc_src_param.ucDevice = ATOM_DEVICE_TV1_INDEX;
+	    } else if (radeon_output->MonType == MT_CV) {
+		if (radeon_output->devices & ATOM_DEVICE_CV_SUPPORT)
+		    crtc_src_param.ucDevice = ATOM_DEVICE_CV_INDEX;
 	    }
 	    break;
 	}
diff --git a/src/radeon_atombios.c b/src/radeon_atombios.c
index ff16368..18088b5 100644
--- a/src/radeon_atombios.c
+++ b/src/radeon_atombios.c
@@ -59,6 +59,8 @@ static AtomBiosResult rhdAtomAllocateFbScratch(atomBiosHandlePtr handle,
 						   AtomBiosRequestID func, AtomBiosArgPtr data);
 static AtomBiosResult rhdAtomLvdsGetTimings(atomBiosHandlePtr handle,
 					AtomBiosRequestID unused, AtomBiosArgPtr data);
+static AtomBiosResult rhdAtomCVGetTimings(atomBiosHandlePtr handle,
+					  AtomBiosRequestID unused, AtomBiosArgPtr data);
 static AtomBiosResult rhdAtomLvdsInfoQuery(atomBiosHandlePtr handle,
 					       AtomBiosRequestID func,  AtomBiosArgPtr data);
 static AtomBiosResult rhdAtomGPIOI2CInfoQuery(atomBiosHandlePtr handle,
@@ -170,6 +172,8 @@ struct atomBIOSRequests {
      "DAC2_CRTC2 Mux Register Index",		MSG_FORMAT_HEX},
     {ATOM_DAC2_CRTC2_MUX_REG_INFO,rhdAtomCompassionateDataQuery,
      "DAC2_CRTC2 Mux Register Info",		MSG_FORMAT_HEX},
+    {ATOMBIOS_GET_CV_MODES,		rhdAtomCVGetTimings,
+     "AtomBIOS Get CV Mode",			MSG_FORMAT_NONE},
     {FUNC_END,					NULL,
      NULL,					MSG_FORMAT_NONE}
 };
@@ -713,7 +717,7 @@ rhdAtomTmdsInfoQuery(atomBiosHandlePtr handle,
 }
 
 static DisplayModePtr
-rhdAtomLvdsTimings(atomBiosHandlePtr handle, ATOM_DTD_FORMAT *dtd)
+rhdAtomDTDTimings(atomBiosHandlePtr handle, ATOM_DTD_FORMAT *dtd)
 {
     DisplayModePtr mode;
 #define NAME_LEN 16
@@ -721,6 +725,9 @@ rhdAtomLvdsTimings(atomBiosHandlePtr handle, ATOM_DTD_FORMAT *dtd)
 
     //RHDFUNC(handle);
 
+    if (!dtd->usHActive || !dtd->usVActive)
+	return NULL;
+
     if (!(mode = (DisplayModePtr)xcalloc(1,sizeof(DisplayModeRec))))
 	return NULL;
 
@@ -737,23 +744,34 @@ rhdAtomLvdsTimings(atomBiosHandlePtr handle, ATOM_DTD_FORMAT *dtd)
     mode->CrtcVSyncStart = mode->VSyncStart = dtd->usVActive + dtd->usVSyncOffset;
     mode->CrtcVSyncEnd = mode->VSyncEnd = mode->VSyncStart + dtd->usVSyncWidth;
 
-    mode->SynthClock = mode->Clock  = dtd->usPixClk * 10;
+    mode->SynthClock = mode->Clock = dtd->usPixClk * 10;
 
     mode->HSync = ((float) mode->Clock) / ((float)mode->HTotal);
     mode->VRefresh = (1000.0 * ((float) mode->Clock))
 	/ ((float)(((float)mode->HTotal) * ((float)mode->VTotal)));
 
+    if (dtd->susModeMiscInfo.sbfAccess.CompositeSync)
+	mode->Flags |= V_CSYNC;
+    if (dtd->susModeMiscInfo.sbfAccess.Interlace)
+	mode->Flags |= V_INTERLACE;
+    if (dtd->susModeMiscInfo.sbfAccess.DoubleClock)
+	mode->Flags |= V_DBLSCAN;
+    if (dtd->susModeMiscInfo.sbfAccess.VSyncPolarity)
+	mode->Flags |= V_NVSYNC;
+    if (dtd->susModeMiscInfo.sbfAccess.HSyncPolarity)
+	mode->Flags |= V_NHSYNC;
+
     snprintf(name, NAME_LEN, "%dx%d",
 	     mode->HDisplay, mode->VDisplay);
     mode->name = xstrdup(name);
 
-    RHDDebug(handle->scrnIndex,"%s: LVDS Modeline: %s  "
-	     "%2.d  %i (%i) %i %i (%i) %i  %i (%i) %i %i (%i) %i\n",
-	     __func__, mode->name, mode->Clock,
-	     mode->HDisplay, mode->CrtcHBlankStart, mode->HSyncStart, mode->CrtcHSyncEnd,
-	     mode->CrtcHBlankEnd, mode->HTotal,
-	     mode->VDisplay, mode->CrtcVBlankStart, mode->VSyncStart, mode->VSyncEnd,
-	     mode->CrtcVBlankEnd, mode->VTotal);
+    ErrorF("DTD Modeline: %s  "
+	   "%2.d  %i (%i) %i %i (%i) %i  %i (%i) %i %i (%i) %i flags: 0x%x\n",
+	   mode->name, mode->Clock,
+	   mode->HDisplay, mode->CrtcHBlankStart, mode->HSyncStart, mode->CrtcHSyncEnd,
+	   mode->CrtcHBlankEnd, mode->HTotal,
+	   mode->VDisplay, mode->CrtcVBlankStart, mode->VSyncStart, mode->VSyncEnd,
+	   mode->CrtcVBlankEnd, mode->VTotal, mode->Flags);
 
     return mode;
 }
@@ -825,8 +843,98 @@ rhdAtomLvdsDDC(atomBiosHandlePtr handle, CARD32 offset, unsigned char *record)
 }
 
 static AtomBiosResult
+rhdAtomCVGetTimings(atomBiosHandlePtr handle, AtomBiosRequestID func,
+		    AtomBiosArgPtr data)
+{
+    atomDataTablesPtr atomDataPtr;
+    CARD8 crev, frev;
+    DisplayModePtr  last       = NULL;
+    DisplayModePtr  new        = NULL;
+    DisplayModePtr  first      = NULL;
+    int i;
+
+    data->modes = NULL;
+
+    atomDataPtr = handle->atomDataPtr;
+
+    if (!rhdAtomGetTableRevisionAndSize(
+	    (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->ComponentVideoInfo.base),
+	    &frev,&crev,NULL)) {
+	return ATOM_FAILED;
+    }
+
+    switch (frev) {
+
+	case 1:
+	    switch (func) {
+		case ATOMBIOS_GET_CV_MODES:
+		    for (i = 0; i < MAX_SUPPORTED_CV_STANDARDS; i++) {
+			new = rhdAtomDTDTimings(handle,
+						&atomDataPtr->ComponentVideoInfo
+						.ComponentVideoInfo->aModeTimings[i]);
+
+			if (!new)
+			    continue;
+
+			new->type      |= M_T_DRIVER;
+			new->next       = NULL;
+			new->prev       = last;
+
+			if (last) last->next = new;
+			last = new;
+			if (!first) first = new;
+		    }
+		    if (last) {
+			last->next   = NULL; //first;
+			first->prev  = NULL; //last;
+			data->modes = first;
+		    }
+		    if (data->modes)
+			return ATOM_SUCCESS;
+		default:
+		    return ATOM_FAILED;
+	    }
+	case 2:
+	    switch (func) {
+		case ATOMBIOS_GET_CV_MODES:
+		    for (i = 0; i < MAX_SUPPORTED_CV_STANDARDS; i++) {
+			new = rhdAtomDTDTimings(handle,
+						&atomDataPtr->ComponentVideoInfo
+						.ComponentVideoInfo_v21->aModeTimings[i]);
+
+			if (!new)
+			    continue;
+
+			new->type      |= M_T_DRIVER;
+			new->next       = NULL;
+			new->prev       = last;
+
+			if (last) last->next = new;
+			last = new;
+			if (!first) first = new;
+
+		    }
+		    if (last) {
+			last->next   = NULL; //first;
+			first->prev  = NULL; //last;
+			data->modes = first;
+		    }
+		    if (data->modes)
+			return ATOM_SUCCESS;
+		    return ATOM_FAILED;
+
+		default:
+		    return ATOM_FAILED;
+	    }
+	default:
+	    return ATOM_NOT_IMPLEMENTED;
+    }
+/*NOTREACHED*/
+}
+
+static AtomBiosResult
 rhdAtomLvdsGetTimings(atomBiosHandlePtr handle, AtomBiosRequestID func,
-		  AtomBiosArgPtr data)
+		    AtomBiosArgPtr data)
 {
     atomDataTablesPtr atomDataPtr;
     CARD8 crev, frev;
@@ -847,10 +955,10 @@ rhdAtomLvdsGetTimings(atomBiosHandlePtr handle, AtomBiosRequestID func,
 	case 1:
 	    switch (func) {
 		case ATOMBIOS_GET_PANEL_MODE:
-		    data->mode = rhdAtomLvdsTimings(handle,
-						    &atomDataPtr->LVDS_Info
-						    .LVDS_Info->sLCDTiming);
-		    if (data->mode)
+		    data->modes = rhdAtomDTDTimings(handle,
+						   &atomDataPtr->LVDS_Info
+						   .LVDS_Info->sLCDTiming);
+		    if (data->modes)
 			return ATOM_SUCCESS;
 		default:
 		    return ATOM_FAILED;
@@ -858,10 +966,10 @@ rhdAtomLvdsGetTimings(atomBiosHandlePtr handle, AtomBiosRequestID func,
 	case 2:
 	    switch (func) {
 		case ATOMBIOS_GET_PANEL_MODE:
-		    data->mode = rhdAtomLvdsTimings(handle,
-						    &atomDataPtr->LVDS_Info
-						    .LVDS_Info_v12->sLCDTiming);
-		    if (data->mode)
+		    data->modes = rhdAtomDTDTimings(handle,
+						   &atomDataPtr->LVDS_Info
+						   .LVDS_Info_v12->sLCDTiming);
+		    if (data->modes)
 			return ATOM_SUCCESS;
 		    return ATOM_FAILED;
 
@@ -1589,11 +1697,13 @@ RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn)
 	    continue;
 	}
 
+#if 1
 	if (i == ATOM_DEVICE_CV_INDEX) {
 	    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Skipping Component Video\n");
 	    info->BiosConnector[i].valid = FALSE;
 	    continue;
 	}
+#endif
 
 	info->BiosConnector[i].valid = TRUE;
 	info->BiosConnector[i].output_id = ci.sucI2cId.sbfAccess.bfI2C_LineMux;
diff --git a/src/radeon_atombios.h b/src/radeon_atombios.h
index d4dc1e4..4b15ec1 100644
--- a/src/radeon_atombios.h
+++ b/src/radeon_atombios.h
@@ -75,6 +75,7 @@ typedef enum _AtomBiosRequestID {
     ATOM_DAC2_CRTC2_FORCE,
     ATOM_DAC2_CRTC2_MUX_REG_IND,
     ATOM_DAC2_CRTC2_MUX_REG_INFO,
+    ATOMBIOS_GET_CV_MODES,
     FUNC_END
 } AtomBiosRequestID;
 
@@ -101,7 +102,7 @@ typedef union AtomBiosArg
     struct rhdConnectorInfo	*connectorInfo;
     unsigned char*		EDIDBlock;
     atomBiosHandlePtr		atomhandle;
-    DisplayModePtr		mode;
+    DisplayModePtr		modes;
     AtomExecRec			exec;
     AtomFbRec			fb;
 } AtomBiosArgRec, *AtomBiosArgPtr;
diff --git a/src/radeon_modes.c b/src/radeon_modes.c
index c9e99b8..e775993 100644
--- a/src/radeon_modes.c
+++ b/src/radeon_modes.c
@@ -47,8 +47,8 @@
 #include "radeon.h"
 #include "radeon_reg.h"
 #include "radeon_macros.h"
-
 #include "radeon_version.h"
+#include "radeon_atombios.h"
 
 #include "xf86Modes.h"
 				/* DDC support */
@@ -211,13 +211,23 @@ DisplayModePtr
 RADEONProbeOutputModes(xf86OutputPtr output)
 {
     RADEONOutputPrivatePtr radeon_output = output->driver_private;
+    ScrnInfoPtr pScrn = output->scrn;
+    RADEONInfoPtr info = RADEONPTR(pScrn);
     DisplayModePtr	    modes = NULL;
+    AtomBiosArgRec atomBiosArg;
+    AtomBiosResult atomBiosResult;
 
     ErrorF("in RADEONProbeOutputModes\n");
 
     if (output->status == XF86OutputStatusConnected) {
 	if (OUTPUT_IS_TV) {
 	    modes = RADEONTVModes(output);
+	} else if (radeon_output->type == OUTPUT_CV) {
+	    atomBiosResult = RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS,
+					     ATOMBIOS_GET_CV_MODES, &atomBiosArg);
+	    if (atomBiosResult == ATOM_SUCCESS) {
+		modes = atomBiosArg.modes;
+	    }
 	} else {
 	    if (output->MonInfo)
 		modes = xf86OutputGetEDIDModes (output);
diff --git a/src/radeon_output.c b/src/radeon_output.c
index 847e69a..ecbc7b1 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -48,17 +48,20 @@
 #include "radeon_tv.h"
 #include "radeon_atombios.h"
 
-const char *MonTypeName[7] = {
+const char *MonTypeName[10] = {
   "AUTO",
   "NONE",
   "CRT",
   "LVDS",
   "TMDS",
   "CTV",
-  "STV"
+  "STV",
+  "CV",
+  "HDMI",
+  "DP"
 };
 
-const RADEONMonitorType MonTypeID[7] = {
+const RADEONMonitorType MonTypeID[10] = {
   MT_UNKNOWN, /* this is just a dummy value for AUTO DETECTION */
   MT_NONE,    /* NONE -> NONE */
   MT_CRT,     /* CRT -> CRT */
@@ -66,6 +69,9 @@ const RADEONMonitorType MonTypeID[7] = {
   MT_DFP,     /* DFPs are driven via TMDS */
   MT_CTV,     /* CTV -> CTV */
   MT_STV,     /* STV -> STV */
+  MT_CV,
+  MT_HDMI,
+  MT_DP
 };
 
 const char *TMDSTypeName[4] = {
@@ -82,7 +88,7 @@ const char *DACTypeName[4] = {
   "None"
 };
 
-const char *ConnectorTypeName[15] = {
+const char *ConnectorTypeName[16] = {
   "None",
   "VGA",
   "DVI-I",
@@ -95,6 +101,8 @@ const char *ConnectorTypeName[15] = {
   "SCART",
   "HDMI-A",
   "HDMI-B",
+  "Unsupported",
+  "Unsupported",
   "DIN",
   "DisplayPort",
   "Unsupported"
@@ -1183,6 +1191,11 @@ void RADEONSetOutputType(ScrnInfoPtr pScrn, RADEONOutputPrivatePtr radeon_output
     case CONNECTOR_DVI_A:
 	output = OUTPUT_DVI_A; break;
     case CONNECTOR_DIN:
+	if (radeon_output->devices & ATOM_DEVICE_CV_SUPPORT)
+	    output = OUTPUT_CV;
+	else if (radeon_output->devices & ATOM_DEVICE_TV1_SUPPORT)
+	    output = OUTPUT_STV;
+	break;
     case CONNECTOR_STV:
 	output = OUTPUT_STV; break;
     case CONNECTOR_CTV:
@@ -1704,7 +1717,7 @@ void RADEONInitConnector(xf86OutputPtr output)
     if (OUTPUT_IS_DVI) {
 	I2CBusPtr pDVOBus;
 	radeon_output->rmx_type = RMX_OFF;
-	if (radeon_output->TMDSType == TMDS_EXT) {
+	if ((!IS_AVIVO_VARIANT) && radeon_output->TMDSType == TMDS_EXT) {
 #if defined(__powerpc__)
 	    radeon_output->dvo_i2c_reg = RADEON_GPIO_MONID;
 	    radeon_output->dvo_i2c_slave_addr = 0x70;
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index a25d635..2ee5428 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -81,6 +81,8 @@ typedef enum
     CONNECTOR_SCART,
     CONNECTOR_HDMI_TYPE_A,
     CONNECTOR_HDMI_TYPE_B,
+    CONNECTOR_0XC,
+    CONNECTOR_0XD,
     CONNECTOR_DIN,
     CONNECTOR_DISPLAY_PORT,
     CONNECTOR_UNSUPPORTED


More information about the xorg-commit mailing list