xf86-video-ati: Branch 'master'

Dave Airlie airlied at kemper.freedesktop.org
Sun Jun 3 00:10:53 PDT 2007


 src/radeon.h        |    2 ++
 src/radeon_common.h |    7 ++++++-
 src/radeon_dri.c    |   25 +++++++++++++++++++++++++
 src/radeon_driver.c |    4 ++++
 4 files changed, 37 insertions(+), 1 deletion(-)

New commits:
diff-tree dcb64a4d3947e5a9fbda4b72e29a5b6102370f07 (from 4c61c0ee91a2ffeefce30972a584486f1df1d1ae)
Author: Dave Airlie <airlied at linux.ie>
Date:   Sun Jun 3 17:10:49 2007 +1000

    radeon: disable vbl interrupts when no 3d is running on a new enough drm

diff --git a/src/radeon.h b/src/radeon.h
index 88402df..a22e481 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -818,6 +818,7 @@ typedef struct {
 
     CARD32            tv_dac_adj;
 
+    Bool want_vblank_interrupts;
 } RADEONInfoRec, *RADEONInfoPtr;
 
 #define RADEONWaitForFifo(pScrn, entries)				\
@@ -935,6 +936,7 @@ extern drmBufPtr   RADEONCPGetBuffer(Scr
 extern void        RADEONCPFlushIndirect(ScrnInfoPtr pScrn, int discard);
 extern void        RADEONCPReleaseIndirect(ScrnInfoPtr pScrn);
 extern int         RADEONCPStop(ScrnInfoPtr pScrn,  RADEONInfoPtr info);
+extern Bool RADEONDRISetVBlankInterrupt(ScrnInfoPtr pScrn, Bool on);
 
 extern void        RADEONHostDataParams(ScrnInfoPtr pScrn, CARD8 *dst,
 					CARD32 pitch, int cpp,
diff --git a/src/radeon_common.h b/src/radeon_common.h
index 3f2c6ab..467addf 100644
--- a/src/radeon_common.h
+++ b/src/radeon_common.h
@@ -420,6 +420,8 @@ typedef union {
 #define RADEON_PARAM_SAREA_HANDLE          9
 #define RADEON_PARAM_GART_TEX_HANDLE       10
 #define RADEON_PARAM_SCRATCH_OFFSET        11
+#define RADEON_PARAM_CARD_TYPE             12
+#define RADEON_PARAM_VBLANK_CRTC           13   /* VBLANK CRTC */
 
 typedef struct drm_radeon_getparam {
 	int param;
@@ -473,7 +475,7 @@ typedef struct drm_radeon_set_param {
 #define RADEON_SETPARAM_PCIGART_LOCATION 3
 #define RADEON_SETPARAM_NEW_MEMMAP 4
 #define RADEON_SETPARAM_PCIGART_TABLE_SIZE 5
-
+#define RADEON_SETPARAM_VBLANK_CRTC 6           /* VBLANK CRTC */
 /* 1.14: Clients can allocate/free a surface
  */
 typedef struct drm_radeon_surface_alloc {
@@ -486,4 +488,7 @@ typedef struct drm_radeon_surface_free {
 	unsigned int address;
 } drmRadeonSurfaceFree;
 
+#define	DRM_RADEON_VBLANK_CRTC1 	1
+#define	DRM_RADEON_VBLANK_CRTC2 	2
+
 #endif
diff --git a/src/radeon_dri.c b/src/radeon_dri.c
index 39393f5..63c35b4 100644
--- a/src/radeon_dri.c
+++ b/src/radeon_dri.c
@@ -1352,6 +1352,25 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pSc
     return TRUE;
 }
 
+Bool RADEONDRISetVBlankInterrupt(ScrnInfoPtr pScrn, Bool on)
+{
+    RADEONInfoPtr  info    = RADEONPTR(pScrn);
+    int value = 0;
+
+    if (info->directRenderingEnabled && info->pKernelDRMVersion->version_minor >= 28) {
+	/* we could do something with mergedfb here I'm sure */
+        if (on)
+	        value = DRM_RADEON_VBLANK_CRTC1;
+
+	if (RADEONDRISetParam(pScrn, RADEON_SETPARAM_VBLANK_CRTC, value)) {
+	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "RADEON Vblank Crtc Setup Failed %d\n", value);
+	    return FALSE;
+	}
+    }
+    return TRUE;
+}
+
+
 /* Initialize the screen-specific data structures for the DRI and the
  * Radeon.  This is the main entry point to the device-specific
  * initialization code.  It calls device-independent DRI functions to
@@ -2029,6 +2048,9 @@ static void RADEONDRITransitionTo3d(Scre
 
     RADEONChangeSurfaces(pScrn);
     RADEONEnablePageFlip(pScreen);
+    
+    info->want_vblank_interrupts = TRUE;
+    RADEONDRISetVBlankInterrupt(pScrn, TRUE);
 
     if (info->cursor)
 	xf86ForceHWCursor (pScreen, TRUE);
@@ -2068,6 +2090,9 @@ static void RADEONDRITransitionTo2d(Scre
 
     RADEONChangeSurfaces(pScrn);
 
+    info->want_vblank_interrupts = FALSE;
+    RADEONDRISetVBlankInterrupt(pScrn, FALSE);
+
     if (info->cursor)
 	xf86ForceHWCursor (pScreen, FALSE);
 }
diff --git a/src/radeon_driver.c b/src/radeon_driver.c
index 25921ad..91af1ec 100644
--- a/src/radeon_driver.c
+++ b/src/radeon_driver.c
@@ -6935,6 +6935,8 @@ Bool RADEONEnterVT(int scrnIndex, int fl
 	/* get the DRI back into shape after resume */
 	RADEONDRIResume(pScrn->pScreen);
 	RADEONAdjustMemMapRegisters(pScrn, &info->ModeReg);
+
+	RADEONDRISetVBlankInterrupt (pScrn, TRUE);
     }
 #endif
     /* this will get XVideo going again, but only if XVideo was initialised
@@ -6970,6 +6972,8 @@ void RADEONLeaveVT(int scrnIndex, int fl
 		   "RADEONLeaveVT\n");
 #ifdef XF86DRI
     if (RADEONPTR(pScrn)->directRenderingInited) {
+
+	RADEONDRISetVBlankInterrupt (pScrn, FALSE);
 	DRILock(pScrn->pScreen, 0);
 	RADEONCP_STOP(pScrn, info);
 


More information about the xorg-commit mailing list