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

Dave Airlie airlied at kemper.freedesktop.org
Sat Dec 29 23:43:56 PST 2007


 src/atombios_crtc.c   |   59 ++++++++++++++++++++++++++++++++++++++------------
 src/atombios_output.c |    3 ++
 src/radeon_atombios.c |   32 +++++++++++++++++++++++++++
 src/radeon_atombios.h |    3 ++
 src/radeon_output.c   |    2 -
 5 files changed, 84 insertions(+), 15 deletions(-)

New commits:
commit a674f683e6699c30664d9cd468a64de991c3fd7e
Author: Dave Airlie <airlied at linux.ie>
Date:   Sun Dec 30 17:43:17 2007 +1000

    atombios: enable TV-out detection code - tv out works for me with this

diff --git a/src/atombios_output.c b/src/atombios_output.c
index f84afd0..45e5696 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -480,6 +480,9 @@ 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)) {
+		if (radeon_output->devices & ATOM_DEVICE_TV1_SUPPORT)
+		    crtc_src_param.ucDevice = ATOM_DEVICE_TV1_INDEX;
 	    }
 	    break;
 	}
diff --git a/src/radeon_output.c b/src/radeon_output.c
index c5f796b..9efa056 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -359,7 +359,7 @@ void RADEONConnectorFindMonitor(ScrnInfoPtr pScrn, xf86OutputPtr output)
 			else
 			    radeon_output->MonType = MT_CTV;
 		    } else
-			radeon_output->MonType = MT_NONE;
+		        radeon_output->MonType = atombios_dac_detect(pScrn, output);
 		} else
 		    radeon_output->MonType = atombios_dac_detect(pScrn, output);
 	    }
commit aa7c28cbd943bb525698515d444cb5097880e364
Author: Dave Airlie <airlied at linux.ie>
Date:   Sun Dec 30 17:40:37 2007 +1000

    atombios: enable support for using tv timings
    
    enable support for the atombios tv timings selection by programming the crtc
    with the tv timings if a tv is detected on the output

diff --git a/src/atombios_crtc.c b/src/atombios_crtc.c
index ebfadd6..6769988 100644
--- a/src/atombios_crtc.c
+++ b/src/atombios_crtc.c
@@ -244,10 +244,12 @@ atombios_crtc_mode_set(xf86CrtcPtr crtc,
     ScrnInfoPtr pScrn = crtc->scrn;
     RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
     RADEONInfoPtr  info = RADEONPTR(pScrn);
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
     unsigned char *RADEONMMIO = info->MMIO;
     unsigned long fb_location = crtc->scrn->fbOffset + info->fbLocation;
     Bool           tilingOld   = info->tilingEnabled;
-
+    int need_tv_timings = 0;
+    int i, ret;
     SET_CRTC_TIMING_PARAMETERS_PS_ALLOCATION crtc_timing;
 
     memset(&crtc_timing, 0, sizeof(crtc_timing));
@@ -267,22 +269,51 @@ atombios_crtc_mode_set(xf86CrtcPtr crtc,
 #endif
     }
 
-    crtc_timing.ucCRTC = radeon_crtc->crtc_id;
-    crtc_timing.usH_Total = adjusted_mode->CrtcHTotal;
-    crtc_timing.usH_Disp = adjusted_mode->CrtcHDisplay;
-    crtc_timing.usH_SyncStart = adjusted_mode->CrtcHSyncStart;
-    crtc_timing.usH_SyncWidth = adjusted_mode->CrtcHSyncEnd - adjusted_mode->CrtcHSyncStart;
+    for (i = 0; i < xf86_config->num_output; i++) {
+	xf86OutputPtr output = xf86_config->output[i];
+	RADEONOutputPrivatePtr radeon_output = output->driver_private;
 
-    crtc_timing.usV_Total = adjusted_mode->CrtcVTotal;
-    crtc_timing.usV_Disp = adjusted_mode->CrtcVDisplay;
-    crtc_timing.usV_SyncStart = adjusted_mode->CrtcVSyncStart;
-    crtc_timing.usV_SyncWidth = adjusted_mode->CrtcVSyncEnd - adjusted_mode->CrtcVSyncStart;
+	if (output->crtc == crtc) {
+	    if (radeon_output->MonType == MT_STV || radeon_output->MonType == MT_CTV) {
+		if (radeon_output->tvStd == TV_STD_NTSC ||
+		    radeon_output->tvStd == TV_STD_NTSC_J ||
+		    radeon_output->tvStd == TV_STD_PAL_M)
+		    need_tv_timings = 1;
+		else
+		    need_tv_timings = 2;
 
-    if (adjusted_mode->Flags & V_NVSYNC)
-      crtc_timing.susModeMiscInfo.usAccess |= ATOM_VSYNC_POLARITY;
+	    }
+	}
+    }
 
-    if (adjusted_mode->Flags & V_NHSYNC)
-      crtc_timing.susModeMiscInfo.usAccess |= ATOM_HSYNC_POLARITY;
+    crtc_timing.ucCRTC = radeon_crtc->crtc_id;
+    if (need_tv_timings) {
+      ret = RADEONATOMGetTVTimings(pScrn, need_tv_timings - 1, &crtc_timing, &adjusted_mode->Clock);
+      if (ret == FALSE) {
+	  need_tv_timings = 0;
+      } else {
+	  adjusted_mode->CrtcHDisplay = crtc_timing.usH_Disp;
+      }
+    }
+	    
+    if (!need_tv_timings) {
+	crtc_timing.usH_Total = adjusted_mode->CrtcHTotal;
+	crtc_timing.usH_Disp = adjusted_mode->CrtcHDisplay;
+	crtc_timing.usH_SyncStart = adjusted_mode->CrtcHSyncStart;
+	crtc_timing.usH_SyncWidth = adjusted_mode->CrtcHSyncEnd - adjusted_mode->CrtcHSyncStart;
+	
+	crtc_timing.usV_Total = adjusted_mode->CrtcVTotal;
+	crtc_timing.usV_Disp = adjusted_mode->CrtcVDisplay;
+	crtc_timing.usV_SyncStart = adjusted_mode->CrtcVSyncStart;
+	crtc_timing.usV_SyncWidth = adjusted_mode->CrtcVSyncEnd - adjusted_mode->CrtcVSyncStart;
+	
+	if (adjusted_mode->Flags & V_NVSYNC)
+	    crtc_timing.susModeMiscInfo.usAccess |= ATOM_VSYNC_POLARITY;
+	
+	if (adjusted_mode->Flags & V_NHSYNC)
+	    crtc_timing.susModeMiscInfo.usAccess |= ATOM_HSYNC_POLARITY;
+	
+    }
 
     ErrorF("Mode %dx%d - %d %d %d\n", adjusted_mode->CrtcHDisplay, adjusted_mode->CrtcVDisplay,
 	   adjusted_mode->CrtcHTotal, adjusted_mode->CrtcVTotal, adjusted_mode->Flags);
diff --git a/src/radeon_atombios.c b/src/radeon_atombios.c
index 0c0122e..ff16368 100644
--- a/src/radeon_atombios.c
+++ b/src/radeon_atombios.c
@@ -1531,6 +1531,38 @@ RADEONGetATOMTVInfo(xf86OutputPtr output)
 }
 
 Bool
+RADEONATOMGetTVTimings(ScrnInfoPtr pScrn, int index, SET_CRTC_TIMING_PARAMETERS_PS_ALLOCATION *crtc_timing, uint32_t *pixel_clock)
+{
+    RADEONInfoPtr  info       = RADEONPTR(pScrn);
+    ATOM_ANALOG_TV_INFO *tv_info;
+
+    tv_info = info->atomBIOS->atomDataPtr->AnalogTV_Info;    
+
+    if (index > MAX_SUPPORTED_TV_TIMING)
+	return FALSE;
+
+    crtc_timing->usH_Total = tv_info->aModeTimings[index].usCRTC_H_Total;
+    crtc_timing->usH_Disp = tv_info->aModeTimings[index].usCRTC_H_Disp;
+    crtc_timing->usH_SyncStart = tv_info->aModeTimings[index].usCRTC_H_SyncStart;
+    crtc_timing->usH_SyncWidth = tv_info->aModeTimings[index].usCRTC_H_SyncWidth;
+
+    crtc_timing->usV_Total = tv_info->aModeTimings[index].usCRTC_V_Total;
+    crtc_timing->usV_Disp = tv_info->aModeTimings[index].usCRTC_V_Disp;
+    crtc_timing->usV_SyncStart = tv_info->aModeTimings[index].usCRTC_V_SyncStart;
+    crtc_timing->usV_SyncWidth = tv_info->aModeTimings[index].usCRTC_V_SyncWidth;
+
+    crtc_timing->susModeMiscInfo = tv_info->aModeTimings[index].susModeMiscInfo;
+
+    crtc_timing->ucOverscanRight = tv_info->aModeTimings[index].usCRTC_OverscanRight;
+    crtc_timing->ucOverscanLeft = tv_info->aModeTimings[index].usCRTC_OverscanLeft;
+    crtc_timing->ucOverscanBottom = tv_info->aModeTimings[index].usCRTC_OverscanBottom;
+    crtc_timing->ucOverscanTop = tv_info->aModeTimings[index].usCRTC_OverscanTop;
+    *pixel_clock = tv_info->aModeTimings[index].usPixelClock * 10;
+
+    return TRUE;
+}
+
+Bool
 RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn)
 {
     RADEONInfoPtr info = RADEONPTR (pScrn);
diff --git a/src/radeon_atombios.h b/src/radeon_atombios.h
index 111fb45..d4dc1e4 100644
--- a/src/radeon_atombios.h
+++ b/src/radeon_atombios.h
@@ -246,4 +246,7 @@ typedef struct _atomBiosHandle {
 
 # endif
 
+extern Bool
+RADEONATOMGetTVTimings(ScrnInfoPtr pScrn, int index, SET_CRTC_TIMING_PARAMETERS_PS_ALLOCATION *crtc_timing, uint32_t *pixel_clock);
+
 #endif /*  RHD_ATOMBIOS_H_ */


More information about the xorg-commit mailing list