Module Name:    xsrc
Committed By:   macallan
Date:           Thu Feb 16 15:05:57 UTC 2017

Modified Files:
        xsrc/external/mit/xf86-video-chips/dist/src: ct_BltHiQV.h ct_exa.c

Log Message:
set pixmap pitch alignment to 8 bytes - the blitter will lock up otherwise
which isn't mentioned anywhere in the manual.
Leave in #ifdef DEBUG code to trace blitter timeouts just in case


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.3 -r1.2 \
    xsrc/external/mit/xf86-video-chips/dist/src/ct_BltHiQV.h
cvs rdiff -u -r1.2 -r1.3 xsrc/external/mit/xf86-video-chips/dist/src/ct_exa.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: xsrc/external/mit/xf86-video-chips/dist/src/ct_BltHiQV.h
diff -u xsrc/external/mit/xf86-video-chips/dist/src/ct_BltHiQV.h:1.1.1.3 xsrc/external/mit/xf86-video-chips/dist/src/ct_BltHiQV.h:1.2
--- xsrc/external/mit/xf86-video-chips/dist/src/ct_BltHiQV.h:1.1.1.3	Sat Aug 14 08:33:13 2010
+++ xsrc/external/mit/xf86-video-chips/dist/src/ct_BltHiQV.h	Thu Feb 16 15:05:57 2017
@@ -65,6 +65,8 @@
  * Note that BR04[31] can't be used as some C&T chipsets lockup when reading
  * the BRxx registers.
  */
+
+#if 0
 #define ctBLTWAIT \
                      {int timeout; \
                      timeout = 0; \
@@ -79,7 +81,35 @@
                          if ((cPtr->Chipset < CHIPS_CT69000 && \
 			     (timeout > 100000)) || timeout > 300000) { \
 			    unsigned char tmp; \
-                            ErrorF("timeout\n"); \
+                            ErrorF("%s: timeout %d (%d, %d, %d x %d) -> %d, %d \n", __func__, last_op, lx, ly, lw, lh, dx, dy); \
+                            ErrorF("dir %d %d, pitch %d %d\n", xdir, ydir, lsp, ldp); \
+			    tmp = cPtr->readXR(cPtr, 0x20); \
+			    cPtr->writeXR(cPtr, 0x20, ((tmp & 0xFD) | 0x2)); \
+                            usleep(10000); \
+                            cPtr->writeXR(cPtr, 0x20, (tmp & 0xFD)); \
+			    break; \
+                         } \
+		      } \
+		    }
+#endif
+
+/*
+ * XXX
+ * we only care about C&T 6555x which can safely use BR04
+ */
+
+#ifdef DEBUG
+#define ctBLTWAIT \
+                     {int timeout; \
+                     timeout = 0; \
+		     for (;;) { \
+		         if (!(MMIO_IN32(cPtr->MMIOBase,BR(0x4))&(1<<31)))\
+                             break; \
+                         timeout++; \
+                         if (timeout > 300000) { \
+			    unsigned char tmp; \
+                            ErrorF("%s: timeout %d (%d, %d, %d x %d) -> %d, %d \n", __func__, last_op, lx, ly, lw, lh, dx, dy); \
+                            ErrorF("dir %d %d, pitch %d %d\n", xdir, ydir, lsp, ldp); \
 			    tmp = cPtr->readXR(cPtr, 0x20); \
 			    cPtr->writeXR(cPtr, 0x20, ((tmp & 0xFD) | 0x2)); \
                             usleep(10000); \
@@ -89,6 +119,28 @@
 		      } \
 		    }
 
+#else
+#define ctBLTWAIT \
+                     {int timeout; \
+                     timeout = 0; \
+		     for (;;) { \
+		         if (!(MMIO_IN32(cPtr->MMIOBase,BR(0x4))&(1<<31)))\
+                             break; \
+                         timeout++; \
+                         if (timeout > 300000) { \
+			    unsigned char tmp; \
+                            ErrorF("%s: timeout\n", __func__); \
+			    tmp = cPtr->readXR(cPtr, 0x20); \
+			    cPtr->writeXR(cPtr, 0x20, ((tmp & 0xFD) | 0x2)); \
+                            usleep(10000); \
+                            cPtr->writeXR(cPtr, 0x20, (tmp & 0xFD)); \
+			    break; \
+                         } \
+		      } \
+		    }
+
+#endif
+
 #if X_BYTE_ORDER == X_BIG_ENDIAN
 # define TWEAK_24_BE(c) \
     c = ((c & 0xFF0000) >> 16) | (c & 0xFF00) | (( c & 0xFF) << 16)

Index: xsrc/external/mit/xf86-video-chips/dist/src/ct_exa.c
diff -u xsrc/external/mit/xf86-video-chips/dist/src/ct_exa.c:1.2 xsrc/external/mit/xf86-video-chips/dist/src/ct_exa.c:1.3
--- xsrc/external/mit/xf86-video-chips/dist/src/ct_exa.c:1.2	Tue Jan 24 15:47:01 2017
+++ xsrc/external/mit/xf86-video-chips/dist/src/ct_exa.c	Thu Feb 16 15:05:57 2017
@@ -21,7 +21,7 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-/* $NetBSD: ct_exa.c,v 1.2 2017/01/24 15:47:01 christos Exp $ */
+/* $NetBSD: ct_exa.c,v 1.3 2017/02/16 15:05:57 macallan Exp $ */
 
 #include <sys/types.h>
 
@@ -43,6 +43,7 @@
 #ifdef DEBUG
 #define ENTER xf86Msg(X_ERROR, "%s\n", __func__)
 #define LEAVE xf86Msg(X_ERROR, "%s done\n", __func__)
+int last_op = 0, lx, ly, lw, lh, dx, dy, xdir, ydir, lsp, ldp;
 #else
 #define ENTER
 #define LEAVE
@@ -130,12 +131,29 @@ ctCopy
     ctSETDSTADDR(dst);
     ctSETHEIGHTWIDTHGO(h, w * cAcl->BytesPerPixel);
     LEAVE;
+#ifdef DEBUG
+    last_op = 1;
+    lx = srcX;
+    ly = srcY;
+    lw = w;
+    lh = h;
+    dx = dstX;
+    dy = dstY;
+    xdir = cAcl->xdir;
+    ydir = cAcl->ydir;
+    lsp = cAcl->srcpitch;
+    ldp = dstpitch;
+#endif
 }
 
 static void
 ctDoneCopy(PixmapPtr pDstPixmap)
 {
     ENTER;
+    ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
+    CHIPSPtr cPtr = CHIPSPTR(pScrn);
+    CHIPSACLPtr cAcl = CHIPSACLPTR(pScrn);
+    ctBLTWAIT;
     LEAVE;
 }
 
@@ -180,7 +198,10 @@ ctSolid(
     ctSETDSTADDR(dst);
     ctSETSRCADDR(dst);
     ctSETHEIGHTWIDTHGO(y2 - y1, (x2 - x1) * cAcl->BytesPerPixel);
-          LEAVE;
+    LEAVE;
+#ifdef DEBUG
+    last_op = 2;
+#endif
 }
 
 /*
@@ -270,8 +291,14 @@ CHIPSInitEXA(ScreenPtr pScreen)
     pExa->memoryBase = cPtr->FbBase;
     pExa->offScreenBase = cAcl->CacheStart;
     pExa->memorySize = cAcl->CacheEnd;
-    pExa->pixmapOffsetAlign = 4;
-    pExa->pixmapPitchAlign = 4;
+
+    /*
+     * Contrary to the manual, the blitter needs 8 byte pitch alignment or it
+     * will lock up. Probably shouldn't be surprised, there are hidden 64bit 
+     * alignment requirements all over the place.
+     */ 
+    pExa->pixmapOffsetAlign = 8;
+    pExa->pixmapPitchAlign = 8;
 
     pExa->flags = EXA_OFFSCREEN_PIXMAPS;
 

Reply via email to