From 088a79c9e81ae244477bfa05b1f0708eff7addcb Mon Sep 17 00:00:00 2001 From: dobrek Date: Wed, 30 May 2001 14:06:11 +0000 Subject: [PATCH] -Added patch for alpha machines. NTY Changed files: XFree86-DEC.patch -> 1.1 --- XFree86-DEC.patch | 2942 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2942 insertions(+) create mode 100644 XFree86-DEC.patch diff --git a/XFree86-DEC.patch b/XFree86-DEC.patch new file mode 100644 index 0000000..7a0cab4 --- /dev/null +++ b/XFree86-DEC.patch @@ -0,0 +1,2942 @@ +diff -ur xc.orig/programs/Xserver/hw/xfree86/common/compiler.h xc/programs/Xserver/hw/xfree86/common/compiler.h +--- xc.orig/programs/Xserver/hw/xfree86/common/compiler.h Fri Dec 8 22:58:34 2000 ++++ xc/programs/Xserver/hw/xfree86/common/compiler.h Sun Mar 18 17:23:33 2001 +@@ -1514,19 +1514,17 @@ + /* Changed to kill noise generated by gcc's -Wcast-align */ + #define MMIO_IN8(base, offset) (*xf86ReadMmio8)(base, offset) + #define MMIO_IN16(base, offset) (*xf86ReadMmio16)(base, offset) +-# if defined (JENSEN_SUPPORT) + #define MMIO_IN32(base, offset) (*xf86ReadMmio32)(base, offset) ++# if defined (JENSEN_SUPPORT) + #define MMIO_OUT32(base, offset, val) \ + (*xf86WriteMmio32)((CARD32)(val), base, offset) + #define MMIO_ONB32(base, offset, val) \ + (*xf86WriteMmioNB32)((CARD32)(val), base, offset) + # else +-#define MMIO_IN32(base, offset) \ +- *(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) + #define MMIO_OUT32(base, offset, val) \ + do { \ +- *(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) = (val); \ + write_mem_barrier(); \ ++ *(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) = (val); \ + } while (0) + #define MMIO_ONB32(base, offset, val) \ + *(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) = (val) +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/ati/r128_accel.c xc/programs/Xserver/hw/xfree86/drivers/ati/r128_accel.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/ati/r128_accel.c Mon Dec 4 19:55:22 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/ati/r128_accel.c Sun Apr 1 20:51:03 2001 +@@ -838,6 +838,7 @@ + if (info->scanline_direct) return; + --info->scanline_h; + while (left) { ++ write_mem_barrier(); + if (left <= 8) { + /* Last scanline - finish write to DATA_LAST */ + if (info->scanline_h == 0) { +@@ -980,6 +981,7 @@ + if (info->scanline_direct) return; + --info->scanline_h; + while (left) { ++ write_mem_barrier(); + if (left <= 8) { + /* Last scanline - finish write to DATA_LAST */ + if (info->scanline_h == 0) { +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/ati/r128_driver.c xc/programs/Xserver/hw/xfree86/drivers/ati/r128_driver.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/ati/r128_driver.c Sat Mar 17 17:57:15 2001 ++++ xc/programs/Xserver/hw/xfree86/drivers/ati/r128_driver.c Sun Mar 18 16:51:29 2001 +@@ -1016,8 +1016,8 @@ + if (!xf86LoadSubModule(pScrn, "ddc")) return FALSE; + xf86LoaderReqSymLists(ddcSymbols, NULL); + +-#if defined(__powerpc__) +- /* Int10 is broken on PPC */ ++#if defined(__powerpc__) || defined(__alpha__) ++ /* Int10 is broken on PPC and some Alphas */ + return TRUE; + #else + if (xf86LoadSubModule(pScrn, "vbe")) { +@@ -1156,7 +1156,8 @@ + static Bool R128PreInitInt10(ScrnInfoPtr pScrn) + { + R128InfoPtr info = R128PTR(pScrn); +-#if 1 ++#if 1 && !defined(__alpha__) ++ /* int10 is broken on some Alphas */ + if (xf86LoadSubModule(pScrn, "int10")) { + xf86Int10InfoPtr pInt; + xf86DrvMsg(pScrn->scrnIndex,X_INFO,"initializing int10\n"); +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/ati/radeon_accel.c xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_accel.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/ati/radeon_accel.c Wed Nov 29 11:42:11 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_accel.c Fri Mar 23 16:20:46 2001 +@@ -585,7 +585,13 @@ + info->scanline_h = h; + info->scanline_words = (w + 31) >> 5; + +- if ((info->scanline_words * h) <= 9) { ++#ifdef __alpha__ ++ /* always indirect for Alpha */ ++ if (0) ++#else ++ if ((info->scanline_words * h) <= 9) ++#endif ++ { + /* Turn on direct for less than 9 dword colour expansion */ + info->scratch_buffer[0] + = (unsigned char *)(ADDRREG(RADEON_HOST_DATA_LAST) +@@ -621,6 +627,7 @@ + if (info->scanline_direct) return; + --info->scanline_h; + while (left) { ++ write_mem_barrier(); + if (left <= 8) { + /* Last scanline - finish write to DATA_LAST */ + if (info->scanline_h == 0) { +@@ -699,7 +706,13 @@ + info->scanline_h = h; + info->scanline_words = (w * info->scanline_bpp + 31) >> 5; + +- if ((info->scanline_words * h) <= 9) { ++#ifdef __alpha__ ++ /* always indirect for Alpha */ ++ if (0) ++#else ++ if ((info->scanline_words * h) <= 9) ++#endif ++ { + /* Turn on direct for less than 9 dword colour expansion */ + info->scratch_buffer[0] + = (unsigned char *)(ADDRREG(RADEON_HOST_DATA_LAST) +@@ -735,6 +748,7 @@ + if (info->scanline_direct) return; + --info->scanline_h; + while (left) { ++ write_mem_barrier(); + if (left <= 8) { + /* Last scanline - finish write to DATA_LAST */ + if (info->scanline_h == 0) { +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/dualmx_accel.c xc/programs/Xserver/hw/xfree86/drivers/glint/dualmx_accel.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/dualmx_accel.c Sat Jun 24 14:19:54 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/dualmx_accel.c Sun Mar 18 16:53:54 2001 +@@ -324,28 +324,6 @@ + GLINT_WRITE_REG(d<<16,dY); + } + +-static void MoveDWORDS( +- register CARD32* dest, +- register CARD32* src, +- register int dwords ) +-{ +- while(dwords & ~0x03) { +- *dest = *src; +- *(dest + 1) = *(src + 1); +- *(dest + 2) = *(src + 2); +- *(dest + 3) = *(src + 3); +- src += 4; +- dest += 4; +- dwords -= 4; +- } +- if (!dwords) return; +- *dest = *src; +- if (dwords == 1) return; +- *(dest + 1) = *(src + 1); +- if (dwords == 2) return; +- *(dest + 2) = *(src + 2); +-} +- + #define Sync_tag 0x188 + + static void +@@ -572,7 +550,8 @@ + while (dwords >= infoRec->ColorExpandRange) { + GLINT_WAIT(infoRec->ColorExpandRange); + GLINT_WRITE_REG((infoRec->ColorExpandRange - 2)<<16 | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src, ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src, + infoRec->ColorExpandRange - 1); + dwords -= (infoRec->ColorExpandRange - 1); + src += (infoRec->ColorExpandRange - 1); +@@ -580,7 +559,8 @@ + if (dwords) { + GLINT_WAIT(dwords); + GLINT_WRITE_REG((dwords - 1)<<16 | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src,dwords); ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src,dwords); + } + pGlint->cpucount += 1; + #if 0 +@@ -887,7 +867,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, infoRec->ColorExpandRange - 1); + count -= infoRec->ColorExpandRange - 1; + srcp += infoRec->ColorExpandRange - 1; +@@ -897,7 +878,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/glint.h xc/programs/Xserver/hw/xfree86/drivers/glint/glint.h +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/glint.h Wed Nov 29 11:42:16 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/glint.h Sun Mar 18 21:36:41 2001 +@@ -120,6 +120,7 @@ + Bool UseBlockWrite; + Bool UseFireGL3000; + Bool VGAcore; ++ Bool ScanlineDirect; + int MXFbSize; + CARD32 rasterizerMode; + int MinClock; +@@ -141,6 +142,7 @@ + DrawablePtr CurrentDrawable; + I2CBusPtr DDCBus, VSBus; + CARD8* XAAScanlineColorExpandBuffers[2]; ++ CARD8* ScratchBuffer; + CARD32 RasterizerSwap; + int PM3_Config2D; + int PM3_Render2D; +@@ -282,6 +284,10 @@ + LOCO *colors, VisualPtr pVisual); + void Permedia2LoadPalette16(ScrnInfoPtr pScrn, int numColors, int *indices, + LOCO *colors, VisualPtr pVisual); ++void Permedia3LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, ++ LOCO *colors, VisualPtr pVisual); ++void Permedia3LoadPalette16(ScrnInfoPtr pScrn, int numColors, int *indices, ++ LOCO *colors, VisualPtr pVisual); + void Permedia2I2CUDelay(I2CBusPtr b, int usec); + void Permedia2I2CPutBits(I2CBusPtr b, int scl, int sda); + void Permedia2I2CGetBits(I2CBusPtr b, int *scl, int *sda); +@@ -314,4 +320,8 @@ + CARD32 GLINT_VERB_READ_REG(GLINTPtr, CARD32 r, char *file, int line); + + void GLINTRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox); ++ ++void GLINT_MoveBYTES(CARD32* dest, unsigned char* src, int dwords); ++void GLINT_MoveWORDS(CARD32* dest, unsigned short* src, int dwords); ++void GLINT_MoveDWORDS(CARD32* dest, CARD32* src, int dwords); + #endif /* _GLINT_H_ */ +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c xc/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c Fri Dec 8 22:58:55 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c Sun Mar 18 21:39:59 2001 +@@ -2610,8 +2610,17 @@ + if (!miCreateDefColormap(pScreen)) + return FALSE; + ++ if (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA3) { ++ if (!xf86HandleColormaps(pScreen, 256, pScrn->rgbBits, ++ (pGlint->FBDev) ? fbdevHWLoadPalette : ++ ((pScrn->depth == 16) ? Permedia3LoadPalette16:Permedia3LoadPalette), ++ NULL, ++ CMAP_RELOAD_ON_MODE_SWITCH | ++ ((pScrn->overlayFlags & OVERLAY_8_32_PLANAR) ++ ? 0 : CMAP_PALETTED_TRUECOLOR))) ++ return FALSE; ++ } else + if ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V) || +- (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA3) || + (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA2) || + (pGlint->Chipset == PCI_VENDOR_TI_CHIP_PERMEDIA2)) { + if (!xf86HandleColormaps(pScreen, 256, pScrn->rgbBits, +@@ -3051,16 +3060,86 @@ + { + if (xf86GetVerbosity() > 2) + ErrorF("[0x%04x] <- 0x%08x (%s, %d)\n", r, v, file, line); ++#if defined(__alpha__) ++ GLINT_WRITE_REG(v, r); ++#else + *(volatile CARD32 *)((char *) pGlint->IOBase + r) = v; ++#endif + } + + CARD32 + GLINT_VERB_READ_REG(GLINTPtr pGlint, CARD32 r, char *file, int line) + { +- CARD32 v = *(volatile CARD32 *)((char *) pGlint->IOBase + r); ++ CARD32 v; + ++#if defined(__alpha__) ++ v = GLINT_READ_REG(r); ++#else ++ v = *(volatile CARD32 *)((char *) pGlint->IOBase + r); ++#endif + if (xf86GetVerbosity() > 2) + ErrorF("[0x%04x] -> 0x%08x (%s, %d)\n", r, v, file, line); + return v; + } + #endif ++ ++void GLINT_MoveBYTES( ++ register CARD32* dest, ++ register unsigned char* src, ++ register int dwords) ++{ ++#if defined(__alpha__) ++ write_mem_barrier(); ++#endif ++ while(dwords) { ++ *dest = *src; ++ src += 1; ++ dest += 1; ++ dwords -= 1; ++ } ++} ++ ++void GLINT_MoveWORDS( ++ register CARD32* dest, ++ register unsigned short* src, ++ register int dwords) ++{ ++#if defined(__alpha__) ++ write_mem_barrier(); ++#endif ++ while(dwords & ~0x01) { ++ *dest = *src; ++ *(dest + 1) = *(src + 1); ++ src += 2; ++ dest += 2; ++ dwords -= 2; ++ } ++ if(dwords) ++ *dest = *src; ++ return; ++} ++ ++void GLINT_MoveDWORDS( ++ register CARD32* dest, ++ register CARD32* src, ++ register int dwords) ++{ ++#if defined(__alpha__) ++ write_mem_barrier(); ++#endif ++ while(dwords & ~0x03) { ++ *dest = *src; ++ *(dest + 1) = *(src + 1); ++ *(dest + 2) = *(src + 2); ++ *(dest + 3) = *(src + 3); ++ src += 4; ++ dest += 4; ++ dwords -= 4; ++ } ++ if (!dwords) return; ++ *dest = *src; ++ if (dwords == 1) return; ++ *(dest + 1) = *(src + 1); ++ if (dwords == 2) return; ++ *(dest + 2) = *(src + 2); ++} +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h xc/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h Fri Oct 27 21:23:07 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h Sun Mar 18 17:05:13 2001 +@@ -1201,10 +1201,17 @@ + + #define GLINT_SLOW_WRITE_REG(v,r) \ + do{ \ +- GLINTDACDelay(5); \ ++ mem_barrier(); \ ++ GLINT_WAIT(1); \ ++ mem_barrier(); \ + GLINT_WRITE_REG(v,r); \ +- GLINTDACDelay(5); \ + }while(0) ++ ++#define GLINT_SET_INDEX(index) \ ++do{ \ ++ GLINT_SLOW_WRITE_REG(((index)>>8)&0xff,PM2VDACIndexRegHigh); \ ++ GLINT_SLOW_WRITE_REG((index)&0xff,PM2VDACIndexRegLow); \ ++} while(0) + + #define GLINT_SECONDARY_SLOW_WRITE_REG(v,r) \ + do{ \ +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm2_accel.c xc/programs/Xserver/hw/xfree86/drivers/glint/pm2_accel.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm2_accel.c Fri Mar 31 17:55:43 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/pm2_accel.c Sun Mar 18 16:55:14 2001 +@@ -356,8 +356,6 @@ + Permedia2SubsequentColorExpandScanline; + } + +- infoPtr->ColorExpandRange = MAX_FIFO_ENTRIES; +- + infoPtr->WriteBitmap = Permedia2WriteBitmap; + + if (pScrn->bitsPerPixel == 8) +@@ -427,10 +425,14 @@ + CHECKCLIPPING; + + while (GLINT_READ_REG(DMACount) != 0); +- GLINT_WAIT(1); +- GLINT_WRITE_REG(0, GlintSync); ++ ++ GLINT_SLOW_WRITE_REG(0xc00, FilterMode); ++ ++ GLINT_WAIT(2); ++ GLINT_SLOW_WRITE_REG(0, GlintSync); ++ + do { +- while(GLINT_READ_REG(OutFIFOWords) == 0); ++ while(GLINT_READ_REG(OutFIFOWords) == 0); + #define Sync_tag 0x188 + } while (GLINT_READ_REG(OutputFIFO) != Sync_tag); + } +@@ -733,63 +735,6 @@ + TRACE_EXIT("Permedia2SubsequentFillRectSolid"); + } + +-static void MoveBYTE( +- register CARD32* dest, +- register unsigned char* src, +- register int dwords +-) +-{ +- while(dwords) { +- *dest = *src; +- src += 1; +- dest += 1; +- dwords -= 1; +- } +-} +- +-static void MoveWORDS( +- register CARD32* dest, +- register unsigned short* src, +- register int dwords +-) +-{ +- while(dwords & ~0x01) { +- *dest = *src; +- *(dest + 1) = *(src + 1); +- src += 2; +- dest += 2; +- dwords -= 2; +- } +- switch(dwords) { +- case 0: return; +- case 1: *dest = *src; +- return; +- } +-} +- +-static void MoveDWORDS( +- register CARD32* dest, +- register CARD32* src, +- register int dwords ) +-{ +- while(dwords & ~0x03) { +- *dest = *src; +- *(dest + 1) = *(src + 1); +- *(dest + 2) = *(src + 2); +- *(dest + 3) = *(src + 3); +- src += 4; +- dest += 4; +- dwords -= 4; +- } +- if (!dwords) return; +- *dest = *src; +- if (dwords == 1) return; +- *(dest + 1) = *(src + 1); +- if (dwords == 2) return; +- *(dest + 2) = *(src + 2); +-} +- +- + static void + Permedia2SetupForMono8x8PatternFill24bpp(ScrnInfoPtr pScrn, + int patternx, int patterny, +@@ -1117,10 +1062,10 @@ + Permedia2SetClippingRectangle(pScrn,x+skipleft,y,x+w,y+h); + + if (pScrn->bitsPerPixel == 24) { +- GLINT_WAIT(10); ++ GLINT_WAIT(10); + } else { + GLINT_WAIT(11); +- DO_PLANEMASK(planemask); ++ DO_PLANEMASK(planemask); + } + LOADROP(rop); + Permedia2LoadCoord(pScrn, x&0xFFFF, y, w, h); +@@ -1137,39 +1082,40 @@ + mode = 0; + GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); + GLINT_WRITE_REG(BitMaskPackingEachScanline| +- pGlint->RasterizerSwap,RasterizerMode); ++ pGlint->RasterizerSwap,RasterizerMode); + } + + if(bg == -1) { + /* >>>>> set fg <<<<<<<< */ + REPLICATE(fg); +- if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { +- GLINT_WRITE_REG(fg, FBBlockColor); ++ if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { ++ GLINT_WRITE_REG(fg, FBBlockColor); + } else { +- GLINT_WRITE_REG(fg, ConstantColor); ++ GLINT_WRITE_REG(fg, ConstantColor); + } + } else if(rop == GXcopy) { +- /* >>>>> set bg <<<<<<< */ +- /* >>>>> draw rect (x,y,w,h) */ +- REPLICATE(bg); +- if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { ++ /* >>>>> set bg <<<<<<< */ ++ /* >>>>> draw rect (x,y,w,h) */ ++ REPLICATE(bg); ++ if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { + GLINT_WRITE_REG(bg, FBBlockColor); + } else { + GLINT_WRITE_REG(bg, ConstantColor); + } +- GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive |mode,Render); ++ GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive |mode, ++ Render); + /* >>>>>> set fg <<<<<< */ + REPLICATE(fg); +- if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { ++ if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { + GLINT_WRITE_REG(fg, FBBlockColor); + } else { + GLINT_WRITE_REG(fg, ConstantColor); + } + } else { +- SecondPass = TRUE; ++ SecondPass = TRUE; + /* >>>>> set fg <<<<<<< */ + REPLICATE(fg); +- if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { ++ if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { + GLINT_WRITE_REG(fg, FBBlockColor); + } else { + GLINT_WRITE_REG(fg, ConstantColor); +@@ -1188,8 +1134,8 @@ + GLINT_WAIT(dwords); + /* 0x0D is the TAG value for BitMaskPattern */ + GLINT_WRITE_REG(((dwords - 1) << 16) | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), +- (CARD32 *)srcpntr, dwords); ++ GLINT_MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ (CARD32 *)srcpntr, dwords); + srcpntr += srcwidth; + } + +@@ -1198,12 +1144,13 @@ + /* >>>>>> invert bitmask and set bg <<<<<<<< */ + REPLICATE(bg); + GLINT_WAIT(3); +- if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { +- GLINT_WRITE_REG(InvertBitMask|pGlint->RasterizerSwap,RasterizerMode); ++ if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { ++ GLINT_WRITE_REG(InvertBitMask|pGlint->RasterizerSwap, ++ RasterizerMode); + GLINT_WRITE_REG(bg, FBBlockColor); + } else { +- GLINT_WRITE_REG(InvertBitMask|BitMaskPackingEachScanline| +- pGlint->RasterizerSwap, RasterizerMode); ++ GLINT_WRITE_REG(InvertBitMask|BitMaskPackingEachScanline| ++ pGlint->RasterizerSwap, RasterizerMode); + GLINT_WRITE_REG(bg, ConstantColor); + } + goto SECOND_PASS; +@@ -1276,13 +1223,15 @@ + count = dwords; + address = ((y * pScrn->displayWidth) + x) >> 2; + srcp = (CARD32*)src; ++ GLINT_WAIT(1); + GLINT_WRITE_REG(address, TextureDownloadOffset); + while(count >= MAX_FIFO_ENTRIES) { + GLINT_WAIT(MAX_FIFO_ENTRIES); + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x11 << 4) | + 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); + count -= MAX_FIFO_ENTRIES - 1; + address += MAX_FIFO_ENTRIES - 1; +@@ -1293,7 +1242,8 @@ + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, + OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +@@ -1304,7 +1254,7 @@ + } else { + char align = (x & pGlint->bppalign); + +- ++ GLINT_WAIT(1); + GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); + if (rop == GXcopy) { + GLINT_WAIT(6); +@@ -1329,7 +1279,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); + count -= MAX_FIFO_ENTRIES - 1; + srcp += MAX_FIFO_ENTRIES - 1; +@@ -1339,7 +1290,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +@@ -1353,7 +1305,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveBYTE((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveBYTES( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (unsigned char *)srcpbyte, MAX_FIFO_ENTRIES - 1); + count -= MAX_FIFO_ENTRIES - 1; + srcpbyte += MAX_FIFO_ENTRIES - 1; +@@ -1363,7 +1316,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveBYTE((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveBYTES( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (unsigned char *)srcpbyte, count); + } + src += srcwidth; +@@ -1435,13 +1389,15 @@ + count = dwords; + address = ((y * pScrn->displayWidth) + x) >> 1; + srcp = (CARD32*)src; ++ GLINT_WAIT(1); + GLINT_WRITE_REG(address, TextureDownloadOffset); + while(count >= MAX_FIFO_ENTRIES) { + GLINT_WAIT(MAX_FIFO_ENTRIES); + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x11 << 4) | + 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); + count -= MAX_FIFO_ENTRIES - 1; + address += MAX_FIFO_ENTRIES - 1; +@@ -1452,7 +1408,8 @@ + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, + OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +@@ -1488,7 +1445,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); + count -= MAX_FIFO_ENTRIES - 1; + srcp += MAX_FIFO_ENTRIES - 1; +@@ -1498,7 +1456,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +@@ -1512,7 +1471,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (unsigned short *)srcpword, MAX_FIFO_ENTRIES - 1); + count -= MAX_FIFO_ENTRIES - 1; + srcpword += MAX_FIFO_ENTRIES - 1; +@@ -1522,7 +1482,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (unsigned short *)srcpword, count); + } + src += srcwidth; +@@ -1590,7 +1551,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveBYTE((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveBYTES( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (unsigned char *)srcpbyte, MAX_FIFO_ENTRIES - 1); + count -= MAX_FIFO_ENTRIES - 1; + srcpbyte += MAX_FIFO_ENTRIES - 1; +@@ -1600,7 +1562,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveBYTE((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveBYTES( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (unsigned char *)srcpbyte, count); + } + src += srcwidth; +@@ -1613,7 +1576,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); + count -= MAX_FIFO_ENTRIES - 1; + srcp += MAX_FIFO_ENTRIES - 1; +@@ -1623,7 +1587,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +@@ -1689,13 +1654,15 @@ + count = dwords; + address = (y * pScrn->displayWidth) + x; + srcp = (CARD32*)src; ++ GLINT_WAIT(1); + GLINT_WRITE_REG(address, TextureDownloadOffset); + while(count >= MAX_FIFO_ENTRIES) { + GLINT_WAIT(MAX_FIFO_ENTRIES); + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x11 << 4) | + 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); + count -= MAX_FIFO_ENTRIES - 1; + address += MAX_FIFO_ENTRIES - 1; +@@ -1706,7 +1673,8 @@ + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, + OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +@@ -1732,7 +1700,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); + count -= MAX_FIFO_ENTRIES - 1; + srcp += MAX_FIFO_ENTRIES - 1; +@@ -1742,7 +1711,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm2ramdac.c xc/programs/Xserver/hw/xfree86/drivers/glint/pm2ramdac.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm2ramdac.c Sat Jul 17 23:26:57 1999 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/pm2ramdac.c Sun Mar 18 22:26:08 2001 +@@ -104,16 +104,21 @@ + VisualPtr pVisual + ){ + GLINTPtr pGlint = GLINTPTR(pScrn); +- int i, index, shift; ++ int i, index, shift = 0, j, repeat = 1; + +- shift = (pScrn->depth == 15) ? 3 : 0; ++ if (pScrn->depth == 15) { ++ repeat = 8; ++ shift = 3; ++ } + + for(i = 0; i < numColors; i++) { + index = indices[i]; +- Permedia2WriteAddress(pScrn, index << shift); +- Permedia2WriteData(pScrn, colors[index].red); +- Permedia2WriteData(pScrn, colors[index].green); +- Permedia2WriteData(pScrn, colors[index].blue); ++ for (j = 0; j < repeat; j++) { ++ Permedia2WriteAddress(pScrn, (index << shift)+j); ++ Permedia2WriteData(pScrn, colors[index].red); ++ Permedia2WriteData(pScrn, colors[index].green); ++ Permedia2WriteData(pScrn, colors[index].blue); ++ } + /* for video i/o */ + GLINT_SLOW_WRITE_REG(index, TexelLUTIndex); + GLINT_SLOW_WRITE_REG((colors[index].red & 0xFF) | +@@ -132,14 +137,16 @@ + VisualPtr pVisual + ){ + GLINTPtr pGlint = GLINTPTR(pScrn); +- int i, index; ++ int i, index, j; + + for(i = 0; i < numColors; i++) { + index = indices[i]; +- Permedia2WriteAddress(pScrn, index << 2); +- Permedia2WriteData(pScrn, colors[index >> 1].red); +- Permedia2WriteData(pScrn, colors[index].green); +- Permedia2WriteData(pScrn, colors[index >> 1].blue); ++ for (j = 0; j < 4; j++) { ++ Permedia2WriteAddress(pScrn, (index << 2)+j); ++ Permedia2WriteData(pScrn, colors[index >> 1].red); ++ Permedia2WriteData(pScrn, colors[index].green); ++ Permedia2WriteData(pScrn, colors[index >> 1].blue); ++ } + GLINT_SLOW_WRITE_REG(index, TexelLUTIndex); + GLINT_SLOW_WRITE_REG((colors[index].red & 0xFF) | + ((colors[index].green & 0xFF) << 8) | +@@ -147,10 +154,12 @@ + TexelLUTData); + + if(index <= 31) { +- Permedia2WriteAddress(pScrn, index << 3); +- Permedia2WriteData(pScrn, colors[index].red); +- Permedia2WriteData(pScrn, colors[(index << 1) + 1].green); +- Permedia2WriteData(pScrn, colors[index].blue); ++ for (j = 0; j < 4; j++) { ++ Permedia2WriteAddress(pScrn, (index << 3)+j); ++ Permedia2WriteData(pScrn, colors[index].red); ++ Permedia2WriteData(pScrn, colors[(index << 1) + 1].green); ++ Permedia2WriteData(pScrn, colors[index].blue); ++ } + } + } + } +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm2v_dac.c xc/programs/Xserver/hw/xfree86/drivers/glint/pm2v_dac.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm2v_dac.c Sat Mar 17 17:57:15 2001 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/pm2v_dac.c Sun Mar 18 17:43:30 2001 +@@ -406,7 +406,10 @@ + int bg, int fg + ) + { +- /* A 2 color cursor uses last 2 indexes into hardware cursor palette */ ++ GLINTPtr pGlint = GLINTPTR(pScrn); ++ ++ if (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA3) { ++ /* PM3 uses last 2 indexes into hardware cursor palette fg first...*/ + Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+39, 0x00, (fg>>16)&0xff); + Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+40, 0x00, (fg>>8)&0xff); + Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+41, 0x00, fg & 0xff); +@@ -414,6 +417,16 @@ + Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+42, 0x00, (bg>>16)&0xff); + Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+43, 0x00, (bg>>8)&0xff); + Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+44, 0x00, bg & 0xff); ++ } else { ++ /* PM2v uses first 2 indexes into hardware cursor palette bg first...*/ ++ Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+0, 0x00, (bg>>16)&0xff); ++ Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+1, 0x00, (bg>>8)&0xff); ++ Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+2, 0x00, bg & 0xff); ++ ++ Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+3, 0x00, (fg>>16)&0xff); ++ Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+4, 0x00, (fg>>8)&0xff); ++ Permedia2vOutIndReg(pScrn, PM2VDACRDCursorPalette+5, 0x00, fg & 0xff); ++ } + } + + static Bool +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm2vramdac.c xc/programs/Xserver/hw/xfree86/drivers/glint/pm2vramdac.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm2vramdac.c Fri Feb 12 17:52:05 1999 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/pm2vramdac.c Sun Mar 18 16:51:30 2001 +@@ -43,8 +43,7 @@ + GLINTPtr pGlint = GLINTPTR(pScrn); + unsigned char tmp = 0x00; + +- GLINT_SLOW_WRITE_REG((reg>>8) & 0xff, PM2VDACIndexRegHigh); +- GLINT_SLOW_WRITE_REG(reg&0xff, PM2VDACIndexRegLow); ++ GLINT_SET_INDEX(reg); + + if (mask != 0x00) + tmp = GLINT_READ_REG (PM2VDACIndexData) & mask; +@@ -58,8 +57,7 @@ + GLINTPtr pGlint = GLINTPTR(pScrn); + unsigned char ret; + +- GLINT_SLOW_WRITE_REG (reg&0xff, PM2VDACIndexRegLow); +- GLINT_SLOW_WRITE_REG((reg>>8) & 0xff, PM2VDACIndexRegHigh); ++ GLINT_SET_INDEX(reg); + ret = GLINT_READ_REG (PM2VDACIndexData); + + return (ret); +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c Wed Nov 29 11:42:17 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c Sun Mar 18 20:15:21 2001 +@@ -47,7 +47,6 @@ + #include "xaalocal.h" /* For replacements */ + + #define DEBUG 0 +-#define USE_DIRECT_FIFO_WRITES 1 + + #if DEBUG + # define TRACE_ENTER(str) ErrorF("pm3_accel: " str " %d\n",pScrn->scrnIndex) +@@ -86,26 +85,35 @@ + int x_offset, int y_offset, int x, int y, + int w, int h); + /* Color Expansion Fills */ +-static void Permedia3SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, +- int fg, int bg, int rop,unsigned int planemask); +-static void Permedia3SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, +- int x, int y, int w, int h, int skipleft); ++static void Permedia3SetupForScanlineCPUToScreenColorExpandFill( ++ ScrnInfoPtr pScrn, ++ int fg, int bg, int rop, ++ unsigned int planemask); ++static void Permedia3SubsequentScanlineCPUToScreenColorExpandFill( ++ ScrnInfoPtr pScrn, int x, ++ int y, int w, int h, int skipleft); ++static void Permedia3SubsequentColorExpandScanline( ++ ScrnInfoPtr pScrn, ++ int bufno); + /* Direct Fifo Bitmap Writes */ + static void Permedia3WriteBitmap(ScrnInfoPtr pScrn, int x, int y, int w, int h, + unsigned char *src, int srcwidth, int skipleft, + int fg, int bg, int rop,unsigned int planemask); + /* Images Writes */ +-static void Permedia3SetupForImageWrite(ScrnInfoPtr pScrn, int rop, ++static void Permedia3SetupForScanlineImageWrite(ScrnInfoPtr pScrn, int rop, + unsigned int planemask, int trans_color, + int bpp, int depth); +-static void Permedia3SubsequentImageWriteRect(ScrnInfoPtr pScrn, ++static void Permedia3SubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn, + int x, int y, int w, int h, int skipleft); ++static void Permedia3SubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno); + /* Direct Fifo Pixmap Writes */ + static void Permedia3WritePixmap(ScrnInfoPtr pScrn, int x, int y, int w, int h, + unsigned char *src, int srcwidth, int rop, + unsigned int planemask, int transparency_color, + int bpp, int depth); + ++#define MAX_FIFO_ENTRIES 120 ++ + void + Permedia3InitializeEngine(ScrnInfoPtr pScrn) + { +@@ -407,51 +415,52 @@ + infoPtr->SubsequentMono8x8PatternFillRect = + Permedia3SubsequentMono8x8PatternFillRect; + +-#if USE_DIRECT_FIFO_WRITES +- /* Direct Fifo Bitmap Writes */ ++ /* Bitmap Writes */ + infoPtr->WriteBitmapFlags = 0; + infoPtr->WriteBitmap = Permedia3WriteBitmap; +-#endif +- +- /* Color Expand Fills */ +- infoPtr->CPUToScreenColorExpandFillFlags = +- /* +- SYNC_AFTER_COLOR_EXPAND | +- */ +- LEFT_EDGE_CLIPPING | +- BIT_ORDER_IN_BYTE_LSBFIRST | +- CPU_TRANSFER_BASE_FIXED | +- CPU_TRANSFER_PAD_DWORD; +- infoPtr->ColorExpandBase = pGlint->IOBase + BitMaskPattern; +- infoPtr->ColorExpandRange = 4; +- infoPtr->SetupForCPUToScreenColorExpandFill = +- Permedia3SetupForCPUToScreenColorExpandFill; +- infoPtr->SubsequentCPUToScreenColorExpandFill = +- Permedia3SubsequentCPUToScreenColorExpandFill; + +-#if USE_DIRECT_FIFO_WRITES +- /* Direct Fifo Images Writes */ ++ /* Pixmap Writes */ + infoPtr->WritePixmapFlags = 0; + infoPtr->WritePixmap = Permedia3WritePixmap; +-#else ++ ++ /* Color Expand Fills */ ++ infoPtr->ScanlineCPUToScreenColorExpandFillFlags = ++ LEFT_EDGE_CLIPPING | ++ LEFT_EDGE_CLIPPING_NEGATIVE_X | ++ BIT_ORDER_IN_BYTE_LSBFIRST | ++ CPU_TRANSFER_PAD_DWORD; ++ ++ infoPtr->NumScanlineColorExpandBuffers = 1; ++ pGlint->ScratchBuffer = xalloc(((pScrn->virtualX+62)/32*4) ++ + (pScrn->virtualX ++ * pScrn->bitsPerPixel / 8)); ++ infoPtr->ScanlineColorExpandBuffers = ++ pGlint->XAAScanlineColorExpandBuffers; ++ pGlint->XAAScanlineColorExpandBuffers[0] = ++ pGlint->IOBase + OutputFIFO + 4; ++ ++ infoPtr->SetupForScanlineCPUToScreenColorExpandFill = ++ Permedia3SetupForScanlineCPUToScreenColorExpandFill; ++ infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = ++ Permedia3SubsequentScanlineCPUToScreenColorExpandFill; ++ infoPtr->SubsequentColorExpandScanline = ++ Permedia3SubsequentColorExpandScanline; ++ + /* Images Writes */ +- infoPtr->ImageWriteFlags = +- NO_GXCOPY | +- /* +- SYNC_AFTER_IMAGE_WRITE | +- */ +- LEFT_EDGE_CLIPPING | +- LEFT_EDGE_CLIPPING_NEGATIVE_X | +- BIT_ORDER_IN_BYTE_LSBFIRST | +- CPU_TRANSFER_BASE_FIXED | +- CPU_TRANSFER_PAD_DWORD; +- infoPtr->ImageWriteBase = pGlint->IOBase + PM3FBSourceData; +- infoPtr->ImageWriteRange = 4; +- infoPtr->SetupForImageWrite = +- Permedia3SetupForImageWrite; +- infoPtr->SubsequentImageWriteRect = +- Permedia3SubsequentImageWriteRect; +-#endif ++ infoPtr->ScanlineImageWriteFlags = NO_GXCOPY | ++ LEFT_EDGE_CLIPPING | ++ LEFT_EDGE_CLIPPING_NEGATIVE_X | ++ BIT_ORDER_IN_BYTE_LSBFIRST | ++ CPU_TRANSFER_PAD_DWORD; ++ infoPtr->NumScanlineImageWriteBuffers = 1; ++ infoPtr->ScanlineImageWriteBuffers = ++ pGlint->XAAScanlineColorExpandBuffers; ++ infoPtr->SetupForScanlineImageWrite = ++ Permedia3SetupForScanlineImageWrite; ++ infoPtr->SubsequentScanlineImageWriteRect = ++ Permedia3SubsequentScanlineImageWriteRect; ++ infoPtr->SubsequentImageWriteScanline = ++ Permedia3SubsequentImageWriteScanline; + + /* Available Framebuffer Area for XAA. */ + AvailFBArea.x1 = 0; +@@ -461,7 +470,7 @@ + pScrn->bitsPerPixel / 8); + /* Alan does this ??? + AvailFBArea.y2 = ((pGlint->FbMapSize > 16384*1024) ? 16384*1024 : +- pGlint->FbMapSize) / (pScrn->displayWidth ++ pGlint->FbMapSize) / (pScrn->displayWidth * + pScrn->bitsPerPixel / 8); + */ + +@@ -491,8 +500,12 @@ + CHECKCLIPPING; + + while (GLINT_READ_REG(DMACount) != 0); +- GLINT_WAIT(1); ++ ++ GLINT_WAIT(3); ++ GLINT_WRITE_REG(3, BroadcastMask); /* hack! this shouldn't be needed */ ++ GLINT_WRITE_REG(0x400, FilterMode); + GLINT_WRITE_REG(0, GlintSync); ++ + do { + while(GLINT_READ_REG(OutFIFOWords) == 0); + } while (GLINT_READ_REG(OutputFIFO) != PM3SyncTag); +@@ -700,11 +713,15 @@ + } + + /* Color Expansion Fills */ +-static void Permedia3SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, +- int fg, int bg, int rop,unsigned int planemask) +-{ ++static void ++Permedia3SetupForScanlineCPUToScreenColorExpandFill( ++ ScrnInfoPtr pScrn, ++ int fg, int bg, ++ int rop, ++ unsigned int planemask ++){ + GLINTPtr pGlint = GLINTPTR(pScrn); +- TRACE_ENTER("Permedia3SetupForCPUToScreenColorExpandFill"); ++ + REPLICATE(fg); + pGlint->PM3_Render2D = + PM3Render2D_SpanOperation | +@@ -729,14 +746,23 @@ + GLINT_WRITE_REG(fg, PM3ForegroundColor); + DO_PLANEMASK(planemask); + GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); +- TRACE_EXIT("Permedia3SetupForCPUToScreenColorExpandFill"); + } +-static void Permedia3SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, +- int x, int y, int w, int h, int skipleft) +-{ ++ ++static void ++Permedia3SubsequentScanlineCPUToScreenColorExpandFill( ++ ScrnInfoPtr pScrn, ++ int x, int y, int w, int h, ++ int skipleft ++){ + GLINTPtr pGlint = GLINTPTR(pScrn); +- TRACE_ENTER("Permedia3SubsequentCPUToScreenColorExpandFill"); +- GLINT_WAIT(4); ++ ++ TRACE_ENTER("Permedia2SubsequentScanlineCPUToScreenColorExpandFill"); ++ ++ pGlint->dwords = ((w + 31) >> 5); /* dwords per scanline */ ++ ++ pGlint->cpucount = h; ++ ++ GLINT_WAIT(5); + GLINT_WRITE_REG(((y&0x0fff)<<16)|((x+skipleft)&0x0fff), ScissorMinXY); + GLINT_WRITE_REG((((y+h)&0x0fff)<<16)|((x+w)&0x0fff), ScissorMaxXY); + GLINT_WRITE_REG( +@@ -746,16 +772,60 @@ + GLINT_WRITE_REG(pGlint->PM3_Render2D | + PM3Render2D_Width(w) | PM3Render2D_Height(h), + PM3Render2D); +- TRACE_EXIT("Permedia3SubsequentCPUToScreenColorExpandFill"); ++ ++#ifdef __alpha__ ++ if (0) /* force ALPHA to use indirect always */ ++#else ++ if ((pGlint->dwords*h) < MAX_FIFO_ENTRIES) ++#endif ++ { ++ /* Turn on direct for less than 120 dword colour expansion */ ++ pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->IOBase+OutputFIFO+4; ++ pGlint->ScanlineDirect = 1; ++ GLINT_WRITE_REG(((pGlint->dwords*h)-1)<<16 | 0x0D, OutputFIFO); ++ GLINT_WAIT(pGlint->dwords*h); ++ } else { ++ /* Use indirect for anything else */ ++ pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->ScratchBuffer; ++ pGlint->ScanlineDirect = 0; ++ } ++ ++ pGlint->cpucount--; + } + ++static void ++Permedia3SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) ++{ ++ GLINTPtr pGlint = GLINTPTR(pScrn); ++ CARD32 *srcp = (CARD32*)pGlint->XAAScanlineColorExpandBuffers[bufno]; ++ int dwords = pGlint->dwords; ++ ++ if (!pGlint->ScanlineDirect) { ++ while(dwords >= MAX_FIFO_ENTRIES) { ++ GLINT_WAIT(MAX_FIFO_ENTRIES); ++ GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | 0x0D, OutputFIFO); ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); ++ dwords -= MAX_FIFO_ENTRIES - 1; ++ srcp += MAX_FIFO_ENTRIES - 1; ++ } ++ if(dwords) { ++ GLINT_WAIT(dwords + 1); ++ GLINT_WRITE_REG(((dwords - 1) << 16) | 0x0D, OutputFIFO); ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ (CARD32*)srcp, dwords); ++ } ++ } ++} + + /* Images Writes */ +-static void Permedia3SetupForImageWrite(ScrnInfoPtr pScrn, int rop, ++static void Permedia3SetupForScanlineImageWrite(ScrnInfoPtr pScrn, int rop, + unsigned int planemask, int trans_color, int bpp, int depth) + { + GLINTPtr pGlint = GLINTPTR(pScrn); +- TRACE_ENTER("Permedia3SetupForImageWrite"); ++ TRACE_ENTER("Permedia3SetupForScanlineImageWrite"); + pGlint->PM3_Render2D = + PM3Render2D_SpanOperation | + PM3Render2D_XPositive | +@@ -771,14 +841,18 @@ + GLINT_WAIT(2); + DO_PLANEMASK(planemask); + GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); +- TRACE_EXIT("Permedia3SetupForImageWrite"); ++ TRACE_EXIT("Permedia3SetupForScanlineImageWrite"); + } +-static void Permedia3SubsequentImageWriteRect(ScrnInfoPtr pScrn, ++ ++static void Permedia3SubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn, + int x, int y, int w, int h, int skipleft) + { + GLINTPtr pGlint = GLINTPTR(pScrn); +- TRACE_ENTER("Permedia3SubsequentImageWrite"); +- GLINT_WAIT(4); ++ TRACE_ENTER("Permedia3SubsequentScanlineImageWrite"); ++ pGlint->dwords = (((w * pScrn->bitsPerPixel) + 3) >> 2); /* per scanline */ ++ ++ pGlint->cpucount = h; ++ GLINT_WAIT(5); + GLINT_WRITE_REG(((y&0x0fff)<<16)|((x+skipleft)&0x0fff), ScissorMinXY); + GLINT_WRITE_REG((((y+h)&0x0fff)<<16)|((x+w)&0x0fff), ScissorMaxXY); + GLINT_WRITE_REG( +@@ -788,18 +862,63 @@ + GLINT_WRITE_REG(pGlint->PM3_Render2D | + PM3Render2D_Width(w) | PM3Render2D_Height(h), + PM3Render2D); +- TRACE_EXIT("Permedia3SubsequentImageWrite"); +-} + ++#ifdef __alpha__ ++ if (0) /* force ALPHA to use indirect always */ ++#else ++ if (pGlint->dwords < MAX_FIFO_ENTRIES) ++#endif ++ { ++ /* Turn on direct for less than 120 dword colour expansion */ ++ pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->IOBase+OutputFIFO+4; ++ pGlint->ScanlineDirect = 1; ++ GLINT_WRITE_REG(((pGlint->dwords*h)-1)<<16 | (0x15<<4) | 0x05, ++ OutputFIFO); ++ GLINT_WAIT(pGlint->dwords); ++ } else { ++ /* Use indirect for anything else */ ++ pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->ScratchBuffer; ++ pGlint->ScanlineDirect = 0; ++ } + +-/* Defines for Direct Fifo access */ ++ pGlint->cpucount--; ++ TRACE_EXIT("Permedia3SubsequentScanlineImageWrite"); ++} + +-#define WriteRange 120 +-#define PciRetryWriteRange 1023 +-#define WriteBase_Fixed ((CARD32 *)(pGlint->IOBase + PM3FBSourceData)) +-#define WriteBase ((CARD32 *)(pGlint->IOBase + OutputFIFO + 4)) ++static void ++Permedia3SubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno) ++{ ++ GLINTPtr pGlint = GLINTPTR(pScrn); ++ int dwords = pGlint->dwords; + +-/* Direct Fifo Bitmap Writes */ ++ if (pGlint->ScanlineDirect) { ++ if (pGlint->cpucount--) ++ GLINT_WAIT(dwords); ++ return; ++ } else { ++ while(dwords >= MAX_FIFO_ENTRIES) { ++ GLINT_WAIT(MAX_FIFO_ENTRIES); ++ GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | ++ 0x05, OutputFIFO); ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ (CARD32*)pGlint->XAAScanlineColorExpandBuffers[bufno], ++ MAX_FIFO_ENTRIES - 1); ++ dwords -= MAX_FIFO_ENTRIES - 1; ++ } ++ if(dwords) { ++ GLINT_WAIT(dwords + 1); ++ GLINT_WRITE_REG(((dwords - 1) << 16) | (0x15 << 4) | ++ 0x05, OutputFIFO); ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ (CARD32*)pGlint->XAAScanlineColorExpandBuffers[bufno], ++ dwords); ++ } ++ } ++} ++ ++/* Bitmap Writes */ + + static void + Permedia3WriteBitmap(ScrnInfoPtr pScrn, +@@ -810,59 +929,85 @@ + unsigned int planemask + ) + { +- int dwords; +- int ApertureRange; ++ int dwords, count; ++ CARD32 *srcp; + GLINTPtr pGlint = GLINTPTR(pScrn); + TRACE_ENTER("Permedia3WriteBitmap"); + + w += skipleft; + x -= skipleft; +- dwords = (w + 31) >>5; +- if (pGlint->UsePCIRetry) ApertureRange = PciRetryWriteRange; +- else ApertureRange = WriteRange; + + /* width of the stuff to copy in 32 bit words */ +- Permedia3SetupForCPUToScreenColorExpandFill(pScrn, fg, bg, rop, planemask); +- Permedia3SubsequentCPUToScreenColorExpandFill(pScrn, x, y, w, h, skipleft); ++ dwords = (w + 31) >>5; + +- if (dwords > ApertureRange) { +- while(h--) { +- XAAMoveDWORDS_FixedBase(WriteBase_Fixed, (CARD32*)src, dwords); +- src += srcwidth; +- } +- } else { +- /* the src is exatcly as wide as the target rectangle. We copy all +- * of it, so no need to separate stuff by scanline */ +- if(srcwidth == (dwords << 5)) { +- /* decrement contains the number of lines that can be +- * put in the fifo */ +- int decrement = ApertureRange/dwords; +- +- while(h > decrement) { +- GLINT_WAIT(dwords * decrement); +- GLINT_WRITE_REG((((dwords * decrement)-1) << 16) | 0xd, +- OutputFIFO); +- XAAMoveDWORDS(WriteBase, (CARD32*)src, dwords * decrement); +- src += (srcwidth * decrement); +- h -= decrement; +- } +- if(h) { +- GLINT_WAIT(dwords * h); +- GLINT_WRITE_REG((((dwords * h)-1) << 16) | 0xd, OutputFIFO); +- XAAMoveDWORDS(WriteBase, (CARD32*)src, dwords * h); +- } +- } else { +- while(h--) { +- GLINT_WAIT(dwords); +- GLINT_WRITE_REG(((dwords-1) << 16) | 0xd, OutputFIFO); +- XAAMoveDWORDS(WriteBase, (CARD32*)src, dwords); +- src += srcwidth; +- } +- } ++ REPLICATE(fg); ++ pGlint->PM3_Render2D = ++ PM3Render2D_SpanOperation | ++ PM3Render2D_XPositive | ++ PM3Render2D_YPositive | ++ PM3Render2D_Operation_SyncOnBitMask; ++ pGlint->PM3_Config2D = ++ PM3Config2D_UserScissorEnable | ++ PM3Config2D_UseConstantSource | ++ PM3Config2D_ForegroundROPEnable | ++ PM3Config2D_ForegroundROP(rop) | ++ PM3Config2D_FBWriteEnable; ++ if ((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXcopy)&&(rop!=GXcopyInverted)) ++ pGlint->PM3_Config2D |= PM3Config2D_FBDestReadEnable; ++ if (bg != -1) { ++ REPLICATE(bg); ++ pGlint->PM3_Config2D |= PM3Config2D_OpaqueSpan; ++ GLINT_WAIT(8); ++ GLINT_WRITE_REG(bg, BackgroundColor); ++ } ++ else GLINT_WAIT(7); ++ GLINT_WRITE_REG(fg, PM3ForegroundColor); ++ DO_PLANEMASK(planemask); ++ GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); ++ GLINT_WRITE_REG(((y&0x0fff)<<16)|((x+skipleft)&0x0fff), ScissorMinXY); ++ GLINT_WRITE_REG((((y+h)&0x0fff)<<16)|((x+w)&0x0fff), ScissorMaxXY); ++ GLINT_WRITE_REG( ++ PM3RectanglePosition_XOffset(x) | ++ PM3RectanglePosition_YOffset(y), ++ PM3RectanglePosition); ++ GLINT_WRITE_REG(pGlint->PM3_Render2D | ++ PM3Render2D_Width(w) | PM3Render2D_Height(h), ++ PM3Render2D); ++ ++#ifdef __alpha__ ++ mem_barrier(); /* dunno why, but this helps on older Alpha CPUs */ ++#endif ++ ++ while(h--) { ++ count = dwords; ++ srcp = (CARD32*)src; ++ while(count >= MAX_FIFO_ENTRIES) { ++ GLINT_WAIT(MAX_FIFO_ENTRIES); ++ GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | ++ 0x0D, OutputFIFO); ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); ++ count -= MAX_FIFO_ENTRIES - 1; ++ srcp += MAX_FIFO_ENTRIES - 1; ++ } ++ if(count) { ++ GLINT_WAIT(count + 1); ++ GLINT_WRITE_REG(((count - 1) << 16) | 0x0D, OutputFIFO); ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ (CARD32*)srcp, count); ++ } ++ src += srcwidth; + } ++ ++ Permedia3DisableClipping(pScrn); ++ Permedia3Sync(pScrn); ++ + TRACE_EXIT("Permedia3WriteBitmap"); + } +-/* Direct Fifo Images Writes */ ++ ++/* Pixmap Writes */ + + static void + Permedia3WritePixmap( +@@ -876,10 +1021,10 @@ + int bpp, int depth + ) + { +- int dwords; ++ int dwords, count; + int skipleft = (long)src & 0x03L; + int Bpp = bpp >> 3; +- int ApertureRange; ++ CARD32 *srcp; + GLINTPtr pGlint = GLINTPTR(pScrn); + TRACE_ENTER("Permedia3WritePixmap"); + +@@ -896,48 +1041,67 @@ + + src = (unsigned char*)((long)src & ~0x03L); + } +- Permedia3SetupForImageWrite(pScrn, rop, planemask, trans, bpp, depth); +- Permedia3SubsequentImageWriteRect(pScrn, x, y, w, h, skipleft); ++ ++ pGlint->PM3_Render2D = ++ PM3Render2D_SpanOperation | ++ PM3Render2D_XPositive | ++ PM3Render2D_YPositive | ++ PM3Render2D_Operation_SyncOnHostData; ++ pGlint->PM3_Config2D = ++ PM3Config2D_UserScissorEnable | ++ PM3Config2D_ForegroundROPEnable | ++ PM3Config2D_ForegroundROP(rop) | ++ PM3Config2D_FBWriteEnable; ++ if ((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXcopy)&&(rop!=GXcopyInverted)) ++ pGlint->PM3_Config2D |= PM3Config2D_FBDestReadEnable; ++ GLINT_WAIT(6); ++ DO_PLANEMASK(planemask); ++ GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); ++ GLINT_WRITE_REG(((y&0x0fff)<<16)|((x+skipleft)&0x0fff), ScissorMinXY); ++ GLINT_WRITE_REG((((y+h)&0x0fff)<<16)|((x+w)&0x0fff), ScissorMaxXY); ++ GLINT_WRITE_REG( ++ PM3RectanglePosition_XOffset(x) | ++ PM3RectanglePosition_YOffset(y), ++ PM3RectanglePosition); ++ GLINT_WRITE_REG(pGlint->PM3_Render2D | ++ PM3Render2D_Width(w) | PM3Render2D_Height(h), ++ PM3Render2D); ++ ++#ifdef __alpha__ ++ mem_barrier(); /* dunno why, but this helps on older Alpha CPUs */ ++#endif + + /* width of the stuff to copy in 32 bit words */ + dwords = ((w * Bpp) + 3) >> 2; +- if (pGlint->UsePCIRetry) ApertureRange = PciRetryWriteRange; +- else ApertureRange = WriteRange; + +- if (dwords > ApertureRange) { +- while(h--) { +- XAAMoveDWORDS_FixedBase(WriteBase_Fixed, (CARD32*)src, dwords); +- src += srcwidth; +- } +- } else { +- /* the src is exatcly as wide as the target rectangle. We copy all +- * of it, so no need to separate stuff by scanline */ +- if(srcwidth == (dwords << 2)) { +- /* decrement contains the number of lines that can be +- * put in the fifo */ +- int decrement = ApertureRange/dwords; +- +- while(h > decrement) { +- GLINT_WAIT(dwords * decrement); +- GLINT_WRITE_REG((((dwords * decrement)-1) << 16) | 0x155, +- OutputFIFO); +- XAAMoveDWORDS(WriteBase, (CARD32*)src, dwords * decrement); +- src += (srcwidth * decrement); +- h -= decrement; +- } +- if(h) { +- GLINT_WAIT(dwords * h); +- GLINT_WRITE_REG((((dwords * h)-1) << 16) | 0x155, OutputFIFO); +- XAAMoveDWORDS(WriteBase, (CARD32*)src, dwords * h); +- } +- } else { +- while(h--) { +- GLINT_WAIT(dwords); +- GLINT_WRITE_REG(((dwords-1) << 16) | 0x155, OutputFIFO); +- XAAMoveDWORDS(WriteBase, (CARD32*)src, dwords); +- src += srcwidth; +- } +- } ++ while(h--) { ++ count = dwords; ++ srcp = (CARD32*)src; ++ while(count >= MAX_FIFO_ENTRIES) { ++ GLINT_WAIT(MAX_FIFO_ENTRIES); ++ /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ ++ GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | ++ 0x05, OutputFIFO); ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); ++ count -= MAX_FIFO_ENTRIES - 1; ++ srcp += MAX_FIFO_ENTRIES - 1; ++ } ++ if(count) { ++ GLINT_WAIT(count + 1); ++ /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ ++ GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | ++ 0x05, OutputFIFO); ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ (CARD32*)srcp, count); ++ } ++ src += srcwidth; + } ++ ++ Permedia3DisableClipping(pScrn); ++ Permedia3Sync(pScrn); ++ + TRACE_EXIT("Permedia3WritePixmap"); + } +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c Sat Mar 17 17:57:15 2001 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c Sun Mar 18 21:35:54 2001 +@@ -320,7 +320,7 @@ + pReg->glintRegs[VClkCtl >> 3] = (GLINT_READ_REG(VClkCtl) & 0xFFFFFFFC); + pReg->glintRegs[PMScreenBase >> 3] = 0; + +- pReg->glintRegs[ChipConfig >> 3] = GLINT_READ_REG(ChipConfig) & 0xFFFFFFDD; ++ pReg->glintRegs[ChipConfig >> 3] = GLINT_READ_REG(ChipConfig) & 0xFFFFFFFD; + pReg->DacRegs[PM2VDACRDDACControl] = 0x00; + + { +@@ -524,4 +524,80 @@ + Permedia2vOutIndReg(pScrn, PM2VDACRDDClk0PostScale, 0x00, + glintReg->DacRegs[PM2VDACRDDClk0PostScale]); + Permedia2vOutIndReg(pScrn, PM2VDACIndexClockControl, 0x00, temp|0x03); ++} ++ ++void Permedia3LoadPalette( ++ ScrnInfoPtr pScrn, ++ int numColors, ++ int *indices, ++ LOCO *colors, ++ VisualPtr pVisual ++){ ++#if 0 /* NOT YET */ ++ GLINTPtr pGlint = GLINTPTR(pScrn); ++#endif ++ int i, index, shift = 0, j, repeat = 1; ++ ++ if (pScrn->depth == 15) { ++ repeat = 8; ++ shift = 3; ++ } ++ ++ for(i = 0; i < numColors; i++) { ++ index = indices[i]; ++ for (j = 0; j < repeat; j++) { ++ Permedia2WriteAddress(pScrn, (index << shift)+j); ++ Permedia2WriteData(pScrn, colors[index].red); ++ Permedia2WriteData(pScrn, colors[index].green); ++ Permedia2WriteData(pScrn, colors[index].blue); ++ } ++ /* for video i/o */ ++#if 0 /* NOT YET */ ++ GLINT_SLOW_WRITE_REG(index, PM3LUTIndex); ++ GLINT_SLOW_WRITE_REG((colors[index].red & 0xFF) | ++ ((colors[index].green & 0xFF) << 8) | ++ ((colors[index].blue & 0xFF) << 16), ++ PM3LUTData); ++#endif ++ } ++} ++ ++/* special one for 565 mode */ ++void Permedia3LoadPalette16( ++ ScrnInfoPtr pScrn, ++ int numColors, ++ int *indices, ++ LOCO *colors, ++ VisualPtr pVisual ++){ ++#if 0 /* NOT YET */ ++ GLINTPtr pGlint = GLINTPTR(pScrn); ++#endif ++ int i, index, j; ++ ++ for(i = 0; i < numColors; i++) { ++ index = indices[i]; ++ for (j = 0; j < 4; j++) { ++ Permedia2WriteAddress(pScrn, (index << 2)+j); ++ Permedia2WriteData(pScrn, colors[index >> 1].red); ++ Permedia2WriteData(pScrn, colors[index].green); ++ Permedia2WriteData(pScrn, colors[index >> 1].blue); ++ } ++#if 0 /* NOT YET */ ++ GLINT_SLOW_WRITE_REG(index, PM3LUTIndex); ++ GLINT_SLOW_WRITE_REG((colors[index].red & 0xFF) | ++ ((colors[index].green & 0xFF) << 8) | ++ ((colors[index].blue & 0xFF) << 16), ++ PM3LUTData); ++#endif ++ ++ if(index <= 31) { ++ for (j = 0; j < 4; j++) { ++ Permedia2WriteAddress(pScrn, (index << 3)+j); ++ Permedia2WriteData(pScrn, colors[index].red); ++ Permedia2WriteData(pScrn, colors[(index << 1) + 1].green); ++ Permedia2WriteData(pScrn, colors[index].blue); ++ } ++ } ++ } + } +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm_accel.c xc/programs/Xserver/hw/xfree86/drivers/glint/pm_accel.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/pm_accel.c Sat Jun 24 14:19:55 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/pm_accel.c Sun Mar 18 16:57:17 2001 +@@ -301,62 +301,6 @@ + return (XAAInit(pScreen, infoPtr)); + } + +-static void MoveBYTE( +- register CARD32* dest, +- register unsigned char* src, +- register int dwords +-) +-{ +- while(dwords) { +- *dest = *src; +- src += 1; +- dest += 1; +- dwords -= 1; +- } +-} +- +-static void MoveWORDS( +- register CARD32* dest, +- register unsigned short* src, +- register int dwords +-) +-{ +- while(dwords & ~0x01) { +- *dest = *src; +- *(dest + 1) = *(src + 1); +- src += 2; +- dest += 2; +- dwords -= 2; +- } +- switch(dwords) { +- case 0: return; +- case 1: *dest = *src; +- return; +- } +-} +- +-static void MoveDWORDS( +- register CARD32* dest, +- register CARD32* src, +- register int dwords ) +-{ +- while(dwords & ~0x03) { +- *dest = *src; +- *(dest + 1) = *(src + 1); +- *(dest + 2) = *(src + 2); +- *(dest + 3) = *(src + 3); +- src += 4; +- dest += 4; +- dwords -= 4; +- } +- if (!dwords) return; +- *dest = *src; +- if (dwords == 1) return; +- *(dest + 1) = *(src + 1); +- if (dwords == 2) return; +- *(dest + 2) = *(src + 2); +-} +- + static void PermediaLoadCoord( + ScrnInfoPtr pScrn, + int x, int y, +@@ -779,15 +723,16 @@ + while (dwords >= infoRec->ColorExpandRange) { + GLINT_WAIT(infoRec->ColorExpandRange); + GLINT_WRITE_REG((infoRec->ColorExpandRange - 2)<<16 | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src, +- infoRec->ColorExpandRange - 1); ++ GLINT_MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ src, infoRec->ColorExpandRange - 1); + dwords -= (infoRec->ColorExpandRange - 1); + src += (infoRec->ColorExpandRange - 1); + } + if (dwords) { + GLINT_WAIT(dwords); + GLINT_WRITE_REG((dwords - 1)<<16 | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src,dwords); ++ GLINT_MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ src,dwords); + } + pGlint->cpucount += 1; + #if 0 +@@ -915,7 +860,8 @@ + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) + | (0x11 << 4) | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, infoRec->ColorExpandRange - 1); + count -= infoRec->ColorExpandRange - 1; + address += infoRec->ColorExpandRange - 1; +@@ -926,7 +872,8 @@ + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, + OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +@@ -955,7 +902,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | + (0x15 << 4) | 0x05, OutputFIFO); +- MoveBYTE((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveBYTES( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (unsigned char *)srcpbyte, infoRec->ColorExpandRange-1); + count -= infoRec->ColorExpandRange - 1; + srcpbyte += infoRec->ColorExpandRange - 1; +@@ -965,7 +913,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveBYTE((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveBYTES( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (unsigned char *)srcpbyte, count); + } + src += srcwidth; +@@ -1038,7 +987,8 @@ + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | + (0x11 << 4) | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, infoRec->ColorExpandRange - 1); + count -= infoRec->ColorExpandRange - 1; + address += infoRec->ColorExpandRange - 1; +@@ -1049,7 +999,8 @@ + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, + OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +@@ -1078,7 +1029,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | + (0x15 << 4) | 0x05, OutputFIFO); +- MoveWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (unsigned short *)srcpword,infoRec->ColorExpandRange-1); + count -= infoRec->ColorExpandRange - 1; + srcpword += infoRec->ColorExpandRange - 1; +@@ -1088,7 +1040,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (unsigned short *)srcpword, count); + } + src += srcwidth; +@@ -1162,7 +1115,8 @@ + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | + (0x11 << 4) | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, infoRec->ColorExpandRange - 1); + count -= infoRec->ColorExpandRange - 1; + address += infoRec->ColorExpandRange - 1; +@@ -1173,7 +1127,8 @@ + /* (0x11 << 4) | 0x0D is the TAG for TextureData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, + OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +@@ -1196,7 +1151,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | + (0x15 << 4) | 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, infoRec->ColorExpandRange - 1); + count -= infoRec->ColorExpandRange - 1; + srcp += infoRec->ColorExpandRange - 1; +@@ -1206,7 +1162,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/sx_accel.c xc/programs/Xserver/hw/xfree86/drivers/glint/sx_accel.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/sx_accel.c Wed Apr 12 10:44:41 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/sx_accel.c Sun Mar 18 16:57:36 2001 +@@ -298,28 +298,6 @@ + } + } + +-static void MoveDWORDS( +- register CARD32* dest, +- register CARD32* src, +- register int dwords ) +-{ +- while(dwords & ~0x03) { +- *dest = *src; +- *(dest + 1) = *(src + 1); +- *(dest + 2) = *(src + 2); +- *(dest + 3) = *(src + 3); +- src += 4; +- dest += 4; +- dwords -= 4; +- } +- if (!dwords) return; +- *dest = *src; +- if (dwords == 1) return; +- *(dest + 1) = *(src + 1); +- if (dwords == 2) return; +- *(dest + 2) = *(src + 2); +-} +- + static void + SXSync( + ScrnInfoPtr pScrn +@@ -519,7 +497,8 @@ + while (dwords >= infoRec->ColorExpandRange) { + GLINT_WAIT(infoRec->ColorExpandRange); + GLINT_WRITE_REG((infoRec->ColorExpandRange - 2)<<16 | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src, ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src, + infoRec->ColorExpandRange - 1); + dwords -= (infoRec->ColorExpandRange - 1); + src += (infoRec->ColorExpandRange - 1); +@@ -527,7 +506,8 @@ + if (dwords) { + GLINT_WAIT(dwords); + GLINT_WRITE_REG((dwords - 1)<<16 | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src,dwords); ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src,dwords); + } + pGlint->cpucount += 1; + } +@@ -809,7 +789,8 @@ + /* (0x0f << 4) | 0x0e is the TAG for GLINTColor */ + GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | (0x0F << 4) | + 0x0E, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, infoRec->ColorExpandRange - 1); + count -= infoRec->ColorExpandRange - 1; + srcp += infoRec->ColorExpandRange - 1; +@@ -819,7 +800,8 @@ + /* (0x0F << 4) | 0x0E is the TAG for GLINTColor */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x0f << 4) | + 0x0e, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/glint/tx_accel.c xc/programs/Xserver/hw/xfree86/drivers/glint/tx_accel.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/glint/tx_accel.c Wed May 10 16:01:32 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/glint/tx_accel.c Sun Mar 18 16:57:58 2001 +@@ -326,28 +326,6 @@ + #endif + } + +-static void MoveDWORDS( +- register CARD32* dest, +- register CARD32* src, +- register int dwords ) +-{ +- while(dwords & ~0x03) { +- *dest = *src; +- *(dest + 1) = *(src + 1); +- *(dest + 2) = *(src + 2); +- *(dest + 3) = *(src + 3); +- src += 4; +- dest += 4; +- dwords -= 4; +- } +- if (!dwords) return; +- *dest = *src; +- if (dwords == 1) return; +- *(dest + 1) = *(src + 1); +- if (dwords == 2) return; +- *(dest + 2) = *(src + 2); +-} +- + static void + TXSync( + ScrnInfoPtr pScrn +@@ -541,7 +519,8 @@ + while (dwords >= infoRec->ColorExpandRange) { + GLINT_WAIT(infoRec->ColorExpandRange); + GLINT_WRITE_REG((infoRec->ColorExpandRange - 2)<<16 | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src, ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src, + infoRec->ColorExpandRange - 1); + dwords -= (infoRec->ColorExpandRange - 1); + src += (infoRec->ColorExpandRange - 1); +@@ -549,7 +528,8 @@ + if (dwords) { + GLINT_WAIT(dwords); + GLINT_WRITE_REG((dwords - 1)<<16 | 0x0D, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src,dwords); ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), src,dwords); + } + pGlint->cpucount += 1; + } +@@ -848,7 +828,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, infoRec->ColorExpandRange - 1); + count -= infoRec->ColorExpandRange - 1; + srcp += infoRec->ColorExpandRange - 1; +@@ -858,7 +839,8 @@ + /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ + GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | + 0x05, OutputFIFO); +- MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), ++ GLINT_MoveDWORDS( ++ (CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), + (CARD32*)srcp, count); + } + src += srcwidth; +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c xc/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c Sat Mar 17 17:57:15 2001 ++++ xc/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c Sun Mar 18 17:19:13 2001 +@@ -37,6 +37,16 @@ + #include "mga_dri.h" + #endif + ++#if defined(__alpha__) ++#define MGAMoveDWORDS(d,s,c) \ ++do { \ ++ write_mem_barrier(); \ ++ XAAMoveDWORDS((d),(s),(c)); \ ++} while (0) ++#else ++#define MGAMoveDWORDS(d,s,c) XAAMoveDWORDS((d),(s),(c)) ++#endif ++ + static void MGANAME(SubsequentScreenToScreenCopy)(ScrnInfoPtr pScrn, + int srcX, int srcY, int dstX, int dstY, + int w, int h); +@@ -964,6 +974,8 @@ + + CHECK_DMA_QUIESCENT(pMga, pScrn); + ++ mem_barrier(); /*??*/ ++ + while(MGAISBUSY()); + /* flush cache before a read (mga-1064g 5.1.6) */ + OUTREG8(MGAREG_CRTC_INDEX, 0); +@@ -1599,7 +1611,13 @@ + OUTREG(MGAREG_FXBNDRY, ((x + w - 1) << 16) | (x & 0xFFFF)); + OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (y << 16) | h); + +- if(pMga->expandDWORDs > pMga->FifoSize) { ++#ifdef __alpha__ ++ /* force Alpha to always use indirect */ ++ if(1) ++#else ++ if(pMga->expandDWORDs > pMga->FifoSize) ++#endif ++ { + pMga->AccelInfoRec->SubsequentColorExpandScanline = + MGANAME(SubsequentColorExpandScanlineIndirect); + pMga->AccelInfoRec->ScanlineColorExpandBuffers = +@@ -1624,13 +1642,13 @@ + + while(dwords > pMga->FifoSize) { + WAITFIFO(pMga->FifoSize); +- XAAMoveDWORDS((CARD32*)(pMga->ColorExpandBase), src, pMga->FifoSize); ++ MGAMoveDWORDS((CARD32*)(pMga->ColorExpandBase), src, pMga->FifoSize); + src += pMga->FifoSize; + dwords -= pMga->FifoSize; + } + + WAITFIFO(dwords); +- XAAMoveDWORDS((CARD32*)(pMga->ColorExpandBase), src, dwords); ++ MGAMoveDWORDS((CARD32*)(pMga->ColorExpandBase), src, dwords); + + if(!(--pMga->expandRows)) { + if(pMga->expandRemaining) { +@@ -1726,13 +1744,13 @@ + + while(dwords > pMga->FifoSize) { + WAITFIFO(pMga->FifoSize); +- XAAMoveDWORDS((CARD32*)(pMga->ColorExpandBase), src, pMga->FifoSize); ++ MGAMoveDWORDS((CARD32*)(pMga->ColorExpandBase), src, pMga->FifoSize); + src += pMga->FifoSize; + dwords -= pMga->FifoSize; + } + + WAITFIFO(dwords); +- XAAMoveDWORDS((CARD32*)(pMga->ColorExpandBase), src, dwords); ++ MGAMoveDWORDS((CARD32*)(pMga->ColorExpandBase), src, dwords); + + if(!(--pMga->expandRows)) { + DISABLE_CLIP(); +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/tga/IBM561ramdac.c xc/programs/Xserver/hw/xfree86/drivers/tga/IBM561ramdac.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/tga/IBM561ramdac.c Mon Oct 23 17:16:50 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/tga/IBM561ramdac.c Sun Mar 18 16:51:30 2001 +@@ -533,7 +533,6 @@ + TGAPtr pTga = TGAPTR(pScrn); + + unsigned int temp1[6] = {0,0,0,0,0,0}; +- struct monitor_data * c_table = &crystal_table; + + /* + * Set-up av9110 to 14.3 Mhz as reference for 561's PLL +@@ -555,10 +554,10 @@ + IBM561WriteReg(pScrn, IBM561_CONFIG_REG_4, 0x20 ); + + /* IBM561WriteReg(pScrn, IBM561_PLL_VCO_DIV_REG, 0xc8 ); */ +- IBM561WriteReg(pScrn, IBM561_PLL_VCO_DIV_REG, c_table->ibm561_vco_div); ++ IBM561WriteReg(pScrn, IBM561_PLL_VCO_DIV_REG, tga_c_table->ibm561_vco_div); + + /* IBM561WriteReg(pScrn, IBM561_PLL_REF_REG, 0x08 ); */ +- IBM561WriteReg(pScrn, IBM561_PLL_REF_REG, c_table->ibm561_ref ); ++ IBM561WriteReg(pScrn, IBM561_PLL_REF_REG, tga_c_table->ibm561_ref ); + + IBM561WriteReg(pScrn, IBM561_DIV_DOT_CLK_REG, 0xb0 ); + +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/tga/tga.h xc/programs/Xserver/hw/xfree86/drivers/tga/tga.h +--- xc.orig/programs/Xserver/hw/xfree86/drivers/tga/tga.h Fri Oct 27 21:23:37 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/tga/tga.h Sun Mar 18 16:51:30 2001 +@@ -120,7 +120,9 @@ + unsigned int ibm561_ref; + }; + +-extern struct monitor_data crystal_table; ++extern struct monitor_data tga_crystal_table[]; ++extern int tga_crystal_table_entries; ++extern struct monitor_data *tga_c_table; + + /* Prototypes */ + +@@ -131,6 +133,7 @@ + Bool saveFonts*/); + Bool DEC21030Init(ScrnInfoPtr pScrn, DisplayModePtr mode); + void write_av9110(ScrnInfoPtr pScrn, unsigned int *); ++void TGA2SetupMode(ScrnInfoPtr pScrn); + + /* tga_accel.c */ + Bool DEC21030AccelInit(ScreenPtr pScreen); +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/tga/tga_dac.c xc/programs/Xserver/hw/xfree86/drivers/tga/tga_dac.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/tga/tga_dac.c Fri Oct 27 21:23:37 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/tga/tga_dac.c Sun Mar 18 16:51:30 2001 +@@ -49,45 +49,114 @@ + /* There lies an ICS1562 Clock Generator. */ + ICS1562_CalcClockBits(freq, pll_bits); + +- switch (pTga->Chipset) { +- case PCI_CHIP_DEC21030: +- /* +- * For the DEC 21030 TGA: +- * This requires the 55 clock bits be written in a serial manner to +- * bit 0 of the CLOCK register and on the 56th bit set the hold flag. +- */ +- for (i = 0;i <= 6; i++) { +- for (j = 0; j <= 7; j++) { +- temp = (pll_bits[i] >> (7-j)) & 1; +- if (i == 6 && j == 7) +- temp |= 2; +- TGA_WRITE_REG(temp, TGA_CLOCK_REG); +- } ++ /* ++ * For the DEC 21030 TGA: ++ * This requires the 55 clock bits be written in a serial manner to ++ * bit 0 of the CLOCK register and on the 56th bit set the hold flag. ++ */ ++ for (i = 0;i <= 6; i++) { ++ for (j = 0; j <= 7; j++) { ++ temp = (pll_bits[i] >> (7-j)) & 1; ++ if (i == 6 && j == 7) ++ temp |= 2; ++ TGA_WRITE_REG(temp, TGA_CLOCK_REG); + } +- break; +- +- case PCI_CHIP_TGA2: +- /* +- * For the DEC TGA2: +- * This requires the 55 clock bits be written in a serial manner to +- * bit 0 of the CLOCK register and on the 56th bit set the hold flag. +- */ +-#if 0 +- /* ?? FIXME FIXME FIXME ?? */ +- for (i = 0;i <= 6; i++) { +- for (j = 0; j <= 7; j++) { +- temp = (pll_bits[i] >> (7-j)) & 1; +- if (i == 6 && j == 7) +- temp |= 2; +- TGA_WRITE_REG(temp, TGA_CLOCK_REG); +- } +- } +-#endif +- break; + } + } + +-struct monitor_data crystal_table = ++struct monitor_data tga_crystal_table[] = { ++{ ++/* Option 0 Monitor Info 130.8 */ ++1024, /* rows */ ++1280, /* columns */ ++130, /* 130.8 Mhz */ ++72, /* refresh rate */ ++1024, /* v scanlines */ ++3, /* v front porch */ ++3, /* v sync */ ++33, /* v back porch */ ++1280, /* h pixels */ ++32, /* h front porch */ ++160, /* h sync */ ++232, /* h back porch */ ++/* AV9110 clock serial load information 130.808 */ ++0x40, /* 0:6 VCO frequency divider N */ ++0x7, /* 7:13 Reference frequency divide M */ ++0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x1, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* IBM561 PLL setup data 130.808 */ ++0xC8, /* VCO Div: PFR=0x3, M-65=49 */ ++0x8 /* REF: N=0x8 */ ++}, ++{ ++/* Option 3 Monitor Info 104.00 Mhz */ ++900, /* rows */ ++1152, /* columns */ ++104, /* 104 Mhz */ ++72, /* refresh rate */ ++900, /* v scanlines */ ++6, /* v front porch */ ++10, /* v sync */ ++44, /* v back porch */ ++1152, /* h pixels */ ++64, /* h front porch */ ++112, /* h sync */ ++176, /* h back porch */ ++/* 103.994 MHz av9110 clock serial load information */ ++0x6d, /* 0:6 VCO frequency divider N */ ++0xf, /* 7:13 Reference frequency divide M */ ++0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x1, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 104.00 MHz IBM561 PLL setup data */ ++0x96, /* VCO Div: PFR=2, M=57 */ ++0x6 /* REF: N=6 */ ++}, ++#if 1 ++{ ++/* Option 6 Monitor Info 74.00 Mhz */ ++768, /* rows */ ++1024, /* columns */ ++74, /* 74 Mhz */ ++72, /* refresh rate */ ++768, /* v scanlines */ ++1, /* v front porch */ ++6, /* v sync */ ++22, /* v back porch */ ++1024, /* h pixels */ ++16, /* h front porch */ ++128, /* h sync */ ++128, /* h back porch */ ++/* 74.00 MHz AV9110 clock serial load information */ ++0x2a, /* 0:6 VCO frequency divider N */ ++0x41, /* 7:13 Reference frequency divide M */ ++0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x1, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 74.00 MHz IBM561 PLL setup data */ ++0x9C, /* VCO Div: PFR=2, M=0x5D*/ ++0x9 /* REF: N=0x9 */ ++}, ++#else + { + /* Option 5 Monitor Info 75.00 Mhz */ + 768, /* rows */ +@@ -117,8 +186,406 @@ + /* 75.00 MHz IBM561 PLL setup data */ + 0x93, /* VCO Div: PFR=2, M=0x54 */ + 0x8 /* REF: N=0x8 */ ++}, ++#endif ++{ ++/* Option 9 Monitor Info 50 Mhz ergo SVGA */ ++600, /* rows */ ++800, /* columns */ ++50, /* 50 Mhz */ ++72, /* refresh rate */ ++600, /* v scanlines */ ++37, /*(31 tga)v front porch */ ++6, /* v sync */ ++23, /*(29 tga)v back porch */ ++800, /* h pixels */ ++56, /* h front porch */ ++120, /* h sync */ ++64, /* h back porch */ ++/*50.00 Mhz AV9110 clock serial load information */ ++0x37, /* 0:6 VCO frequency divider N */ ++0x3f, /* 7:13 Reference frequency divide M */ ++0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x2, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 50.00 MHz IBM561 PLL setup data */ ++0x45, /* VCO Div: PFR=1, M=46*/ ++0x5 /* REF: N=5 */ ++}, ++{ ++/* Option B Monitor Info 31.5 Mhz ergo VGA */ ++480, /* rows */ ++640, /* columns */ ++32, /* 32 Mhz */ ++72, /* refresh rate */ ++480, /* v scanlines */ ++9, /* v front porch */ ++3, /* v sync */ ++28, /* v back porch */ ++640, /* h pixels */ ++24, /* h front porch */ ++40, /* h sync */ ++128, /* h back porch */ ++/* 31.50 MHz AV9110 clock serial load information */ ++0x16, /* 0:6 VCO frequency divider N */ ++0x05, /* 7:13 Reference frequency divide M */ ++0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x2, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 31.50 MHz IBM561 PLL setup data */ ++0x17, /* VCO Div: PFR=0, M=0x58 */ ++0x5 /* REF: N=0x5 */ ++}, ++#ifdef ALLOW_LT_72_HZ ++{ ++/* Option 1 Monitor Info 119.84 Mhz */ ++1024, /* rows */ ++1280, /* columns */ ++119, /* 119 Mhz */ ++66, /* refresh rate */ ++1024, /* v scanlines */ ++3, /* v front porch */ ++3, /* v sync */ ++33, /* v back porch */ ++1280, /* h pixels */ ++32, /* h front porch */ ++160, /* h sync */ ++232, /* h back porch */ ++/* 119.84MHz AV9110 clock serial load information */ ++0x2d, /* 0:6 VCO frequency divider N */ ++0x2b, /* 7:13 Reference frequency divide M */ ++0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */ ++0x1, /* 15:16 CLK/X output divide X */ ++0x1, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* IBM561 PLL setup data 119.84 */ ++0x82, /* VCO Div: PFR=0x2, M=0x43 */ ++0x4 /* REF: N=0x4 */ ++}, ++{ ++/* Option 2 Monitor Info 108.18 Mhz */ ++1024, /* rows */ ++1280, /* columns */ ++108, /* 108 Mhz */ ++60, /* refresh rate */ ++1024, /* v scanlines */ ++3, /* v front porch */ ++3, /* v sync */ ++26, /* v back porch */ ++1280, /* h pixels */ ++44, /* h front porch */ ++184, /* h sync */ ++200, /* h back porch */ ++/* 108.18 MHz av9110 Clk serial load information */ ++0x11, /* 0:6 VCO frequency divider N */ ++0x9, /* 7:13 Reference frequency divide M */ ++0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x2, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 108.18 MHz IBM561 PLL setup data */ ++0xB8, /* VCO Div: PFR=2, M=79 */ ++0x8 /* REF: N=0x8 */ ++}, ++{ ++/* Option 5 Monitor Info 75.00 Mhz */ ++768, /* rows */ ++1024, /* columns */ ++75, /* 74 Mhz */ ++70, /* refresh rate */ ++768, /* v scanlines */ ++3, /* v front porch */ ++6, /* v sync */ ++29, /* v back porch */ ++1024, /* h pixels */ ++24, /* h front porch */ ++136, /* h sync */ ++144, /* h back porch */ ++/* 75.00 MHz AV9110 clock serial load information */ ++0x6e, /* 0:6 VCO frequency divider N */ ++0x15, /* 7:13 Reference frequency divide M */ ++0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x1, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 75.00 MHz IBM561 PLL setup data */ ++0x93, /* VCO Div: PFR=2, M=0x54 */ ++0x8 /* REF: N=0x8 */ ++}, ++{ ++/* Option 7 Monitor Info 69 Mhz DEC 72 Hz */ ++864, /* rows */ ++1024, /* columns */ ++69, /* 69.x Mhz */ ++60, /* refresh rate */ ++864, /* v scanlines */ ++0, /* v front porch */ ++3, /* v sync */ ++34, /* v back porch */ ++1024, /* h pixels */ ++12, /* h front porch */ ++128, /* h sync */ ++116, /* h back porch */ ++/* 69.00 Mhz AV9110 clock serial load information */ ++0x35, /* 0:6 VCO frequency divider N */ ++0xb, /* 7:13 Reference frequency divide M */ ++0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x1, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 69.00 MHz IBM561 PLL setup data */ ++0xA9, /* VCO Div: PFR=2, M=0x6A */ ++0xB /* REF: N=0xB */ ++}, ++{ ++/* Option 8 Monitor Info 65 Mhz */ ++768, /* rows */ ++1024, /* columns */ ++65, /* 65 Mhz */ ++60, /* refresh rate */ ++768, /* v scanlines */ ++7, /* v front porch */ ++9, /* v sync */ ++26, /* v back porch */ ++1024, /* h pixels */ ++56, /* h front porch */ ++64, /* h sync */ ++200, /* h back porch */ ++/* 65.00 MHz AV9110 clock serial load information */ ++0x6d, /* 0:6 VCO frequency divider N */ ++0x0c, /* 7:13 Reference frequency divide M */ ++0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x2, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 65.00 MHz IBM561 PLL setup data */ ++0xAC, /* VCO Div: PFR=2, M=0x6D */ ++0xC /* REF: N=0xC */ ++}, ++{ ++/* Option A Monitor Info 40 Mhz SVGA */ ++600, /* rows */ ++800, /* columns */ ++40, /* 40 Mhz */ ++60, /* refresh rate */ ++600, /* v scanlines */ ++1, /* v front porch */ ++4, /* v sync */ ++23, /* v back porch */ ++800, /* h pixels */ ++40, /* h front porch */ ++128, /* h sync */ ++88, /* h back porch */ ++/* 40.00 MHz AV9110 clock serial load information */ ++0x5f, /* 0:6 VCO frequency divider N */ ++0x11, /* 7:13 Reference frequency divide M */ ++0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x2, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 40.00 MHz IBM561 PLL setup data */ ++0x42, /* VCO Div: PFR=1, M=43 */ ++0x6 /* REF: N=0x6 */ ++}, ++{ ++/* Option C Monitor Info 25.175 Mhz VGA */ ++480, /* rows */ ++640, /* columns */ ++25, /* 25.175 Mhz */ ++60, /* refresh rate */ ++480, /* v scanlines */ ++10, /* v front porch */ ++2, /* v sync */ ++33, /* v back porch */ ++640, /* h pixels */ ++16, /* h front porch */ ++96, /* h sync */ ++48, /* h back porch */ ++/* 25.175 MHz AV9110 clock serial load information */ ++0x66, /* 0:6 VCO frequency divider N */ ++0x1d, /* 7:13 Reference frequency divide M */ ++0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x2, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 25.175 MHz IBM561 PLL setup data */ ++0x3E, /* VCO Div: PFR=0, M=0x7F */ ++0x9 /* REF: N=0x9 */ ++}, ++{ ++/* Option E Monitor Info 110 Mhz */ ++1024, /* rows */ ++1280, /* columns */ ++110, ++60, /* refresh rate */ ++1024, /* v scanlines */ ++6, /* v front porch */ ++7, /* v sync */ ++44, /* v back porch */ ++1280, /* h pixels */ ++19, /* h front porch */ ++163, /* h sync */ ++234, /* h back porch */ ++/* 110.0 MHz AV9110 clock serial load information */ ++0x60, /* 0:6 VCO frequency divider N */ ++0x32, /* 7:13 Reference frequency divide M */ ++0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */ ++0x1, /* 15:16 CLK/X output divide X */ ++0x2, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 110.0 MHz IBM561 PLL setup data */ ++0xBA, /* VCO Div: PFR=0x2, M=0x7B */ ++0x8 /* REF: N=0x8 */ ++}, ++#endif /* ALLOW_LT_72_HZ */ ++#ifdef /* ALLOW_GT_72_HZ */ ++{ ++/* Option D Monitor Info 135 Mhz */ ++1024, /* rows */ ++1280, /* columns */ ++135, /* 135 Mhz */ ++75, /* refresh rate */ ++1024, /* v scanlines */ ++1, /* v front porch */ ++3, /* v sync */ ++38, /* v back porch */ ++1280, /* h pixels */ ++16, /* h front porch */ ++144, /* h sync */ ++248, /* h back porch */ ++/* 135.0 MHz AV9110 clock serial load information */ ++0x42, /* 0:6 VCO frequency divider N */ ++0x07, /* 7:13 Reference frequency divide M */ ++0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */ ++0x1, /* 15:16 CLK/X output divide X */ ++0x1, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 135.0 MHz IBM561 PLL setup data */ ++0xC1, /* VCO Div: PFR=0x3, M=0x42 */ ++0x7 /* REF: N=0x7 */ ++}, ++#ifdef ALLOW_GT_1280x1024 ++{ ++/* Option 4 Monitor Info 175.5 Mhz (8-plane) */ ++1200, /* rows */ ++1600, /* columns */ ++175, /* clock */ ++65, /* refresh rate */ ++1200, /* v scanlines */ ++1, /* v front porch */ ++3, /* v sync */ ++46, /* v back porch */ ++1600, /* h pixels */ ++32, /* h front porch */ ++192, /* h sync */ ++336, /* h back porch */ ++/* 110.0 MHz AV9110 clock serial load information */ ++0x5F, /* 0:6 VCO frequency divider N */ ++0x3E, /* 7:13 Reference frequency divide M */ ++0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) ++*/ ++0x1, /* 15:16 CLK/X output divide X */ ++0x1, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 110.0 MHz IBM561 PLL setup data */ ++0xE1, /* VCO Div: PFR=0x3, M-65=0x21 */ ++0x8 /* REF: N=0x8 */ ++}, ++{ ++/* Option F Monitor Info (24-plane) */ ++1200, /* rows */ ++1600, /* columns */ ++202.5, /* 130.8 Mhz */ ++75, /* refresh rate */ ++1200, /* v scanlines */ ++1, /* v front porch */ ++3, /* v sync */ ++46, /* v back porch */ ++1600, /* h pixels */ ++32, /* h front porch */ ++192, /* h sync */ ++336, /* h back porch */ ++/* AV9110 clock serial load information 130.808 */ ++0x60, /* 0:6 VCO frequency divider N */ ++0x32, /* 7:13 Reference frequency divide M */ ++0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */ ++0x1, /* 15:16 CLK/X output divide X */ ++0x2, /* 17:18 VCO output divide R */ ++1, /* 19 CLK Output enable. */ ++1, /* 20 CLK/X Output enable */ ++0, /* reserved, should be set to 0 */ ++0, /* Reference clock select on CLK 1=ref */ ++1, /* reserved, should be set to 1 */ ++/* 110.0 MHz IBM561 PLL setup data */ ++0xE2, /* bogus VCO Div: PFR=0x2, M=0x7B */ ++0x7 /* bogus REF: N=0x8 */ ++} ++#endif /* ALLOW_GT_1280x1024 */ ++#endif /* ALLOW_GT_72_HZ */ + }; + ++int tga_crystal_table_entries = sizeof(tga_crystal_table)/sizeof(struct monitor_data); ++ ++struct monitor_data *tga_c_table; ++ + /* ICS av9110 is only used on TGA2 */ + + void +@@ -142,30 +609,58 @@ + TGA2_WRITE_CLOCK_REG(0x0, 0xf800); + } + ++void TGA2SetupMode(ScrnInfoPtr pScrn) ++{ ++ int i; ++ ++ /* ++ * HACK HACK HACK ++ * ++ * We do not know how to generate arbitrary clocks, so we search ++ * the crystal_table above for a match. Sigh... ++ */ ++ tga_c_table = tga_crystal_table; ++ for (i = 0; i < tga_crystal_table_entries; i++, tga_c_table++) { ++ if ((tga_c_table->max_rows == pScrn->currentMode->VDisplay) && ++ (tga_c_table->max_cols == pScrn->currentMode->HDisplay)) { ++ ErrorF("Found a matching mode (%d)!\n", i); ++ break; ++ } ++ } ++ if (i == tga_crystal_table_entries) { ++#ifdef FOR_NOW ++ FatalError("Unable to find a workable mode"); ++#else ++ ErrorF("Unable to find a matching mode!\n"); ++ /* tga_c_table = &tga_crystal_table[4]; *//* 640x480 @ 72 */ ++ tga_c_table = &tga_crystal_table[2]; /* 1024x768 @ 72 */ ++#endif ++ } ++ return; ++} ++ + static void + ICS9110ClockSelect(ScrnInfoPtr pScrn, int freq) + { + unsigned int temp, temp1[6]; +- struct monitor_data *c_table; ++ int i; + + /* There lies an ICS9110 Clock Generator. */ + /* ICS9110_CalcClockBits(freq, pll_bits); */ + +- c_table = &crystal_table; +- + /* the following is based on munge_ics() from the + TRU64 kernel TGA driver */ + +- temp = (unsigned int)(c_table->vco_div | +- (c_table->ref_div << 7) | +- (c_table->vco_pre << 14) | +- (c_table->clk_div << 15) | +- (c_table->vco_out_div << 17) | +- (c_table->clk_out_en << 19) | +- (c_table->clk_out_enX << 20) | +- (c_table->res0 << 21) | +- (c_table->clk_sel << 22) | +- (c_table->res1 << 23)); ++ temp = (unsigned int)(tga_c_table->vco_div | ++ (tga_c_table->ref_div << 7) | ++ (tga_c_table->vco_pre << 14) | ++ (tga_c_table->clk_div << 15) | ++ (tga_c_table->vco_out_div << 17) | ++ (tga_c_table->clk_out_en << 19) | ++ (tga_c_table->clk_out_enX << 20) | ++ (tga_c_table->res0 << 21) | ++ (tga_c_table->clk_sel << 22) | ++ (tga_c_table->res1 << 23)); + + temp1[0] = (temp & 0x00000001) | ((temp & 0x00000002) << 7) | + ((temp & 0x00000004) << 14) | ((temp & 0x00000008) << 21); +diff -ur xc.orig/programs/Xserver/hw/xfree86/drivers/tga/tga_driver.c xc/programs/Xserver/hw/xfree86/drivers/tga/tga_driver.c +--- xc.orig/programs/Xserver/hw/xfree86/drivers/tga/tga_driver.c Mon Dec 4 19:56:22 2000 ++++ xc/programs/Xserver/hw/xfree86/drivers/tga/tga_driver.c Sun Mar 18 16:51:30 2001 +@@ -954,6 +954,15 @@ + /* Set the current mode to the first in the list */ + pScrn->currentMode = pScrn->modes; + ++ /* ++ This is a bit of a hack; we seem to have to init ++ the TGA2 chipset knowing what the mode is, so we ++ do this now as soon as we know it... ++ */ ++ if (pTga->Chipset == PCI_CHIP_TGA2) { ++ TGA2SetupMode(pScrn); ++ } ++ + /* Print the list of modes being used */ + xf86PrintModes(pScrn); + +diff -ur xc.orig/programs/Xserver/hw/xfree86/os-support/linux/lnx_axp.c xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_axp.c +--- xc.orig/programs/Xserver/hw/xfree86/os-support/linux/lnx_axp.c Sat Mar 17 17:57:16 2001 ++++ xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_axp.c Sun Mar 18 16:51:30 2001 +@@ -10,28 +10,28 @@ + axpDevice lnxGetAXP(void); + + static AXP axpList[] = { +- { "Tsunami", NULL, NULL, TSUNAMI }, +- { "Eiger", NULL, NULL, TSUNAMI }, +- {"Noname", NULL, NULL, LCA }, +- { "AlphaBook1", NULL, NULL, LCA }, +- {"EB66", NULL, NULL, LCA}, +- {"EB64+",NULL,NULL, APECS}, ++ {"Tsunami",NULL,NULL,TSUNAMI}, ++ {"Eiger",NULL,NULL,TSUNAMI}, ++ {"Noname",NULL,NULL,LCA}, ++ {"AlphaBook1",NULL,NULL,LCA}, ++ {"EB66",NULL,NULL,LCA}, ++ {"EB64+",NULL,NULL,APECS}, + {"Noritake",NULL,"EV5",CIA}, + {"Noritake",NULL,"EV56",CIA}, + {"Noritake",NULL,NULL,APECS}, +- {"XL",NULL,NULL,APECS}, ++ {"XL",NULL,NULL,APECS}, + {"Avanti",NULL,NULL,APECS}, + {"Mikasa",NULL,"EV5",CIA}, + {"Mikasa",NULL,"EV56",CIA}, + {"Mikasa",NULL,NULL,APECS}, + {"EB164","EB164",NULL,CIA}, +- {"EB164","PC164", NULL,CIA}, +- {"EB164","RX164",NULL, POLARIS}, +- {"EB164","SX164",NULL, PYXIS}, +- {"EB164","LX164",NULL, PYXIS}, ++ {"EB164","PC164",NULL,CIA}, ++ {"EB164","RX164",NULL,POLARIS}, ++ {"EB164","SX164",NULL,PYXIS}, ++ {"EB164","LX164",NULL,PYXIS}, + {"Alcor",NULL,NULL,CIA}, + {"Takara",NULL,NULL,CIA}, +- {"Sable",NULL, "EV5",T2_GAMMA}, ++ {"Sable",NULL,"EV5",T2_GAMMA}, + {"Sable",NULL,"EV56",T2_GAMMA}, + {"Sable",NULL,NULL,T2}, + {"Rawhide",NULL,NULL,MCPCIA}, +diff -ur xc.orig/programs/Xserver/hw/xfree86/os-support/linux/lnx_ev56.c xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_ev56.c +--- xc.orig/programs/Xserver/hw/xfree86/os-support/linux/lnx_ev56.c Thu Feb 17 08:45:49 2000 ++++ xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_ev56.c Sun Mar 18 16:51:30 2001 +@@ -29,18 +29,21 @@ + int + readDense8(pointer Base, register unsigned long Offset) + { ++ mem_barrier(); + return *(volatile CARD8*) ((unsigned long)Base+(Offset)); + } + + int + readDense16(pointer Base, register unsigned long Offset) + { ++ mem_barrier(); + return *(volatile CARD16*) ((unsigned long)Base+(Offset)); + } + + int + readDense32(pointer Base, register unsigned long Offset) + { ++ mem_barrier(); + return *(volatile CARD32*)((unsigned long)Base+(Offset)); + } + +@@ -65,20 +68,20 @@ + void + writeDense8(int Value, pointer Base, register unsigned long Offset) + { ++ write_mem_barrier(); + *(volatile CARD8 *)((unsigned long)Base+(Offset)) = Value; +- mem_barrier(); + } + + void + writeDense16(int Value, pointer Base, register unsigned long Offset) + { ++ write_mem_barrier(); + *(volatile CARD16 *)((unsigned long)Base+(Offset)) = Value; +- mem_barrier(); + } + + void + writeDense32(int Value, pointer Base, register unsigned long Offset) + { ++ write_mem_barrier(); + *(volatile CARD32 *)((unsigned long)Base+(Offset)) = Value; +- mem_barrier(); + } +diff -ur xc.orig/programs/Xserver/hw/xfree86/os-support/linux/lnx_video.c xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_video.c +--- xc.orig/programs/Xserver/hw/xfree86/os-support/linux/lnx_video.c Fri Dec 8 22:59:56 2000 ++++ xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_video.c Sun Mar 18 17:29:04 2001 +@@ -614,15 +614,16 @@ + + Offset += (unsigned long)Base - (unsigned long)lnxBase; + shift = (Offset & 0x3) << 3; +- if (Offset >= (hae_thresh)) { ++ if (Offset >= (hae_thresh)) { + msb = Offset & hae_mask; + Offset -= msb; + if (msb_set != msb) { +- sethae(msb); +- msb_set = msb; ++ sethae(msb); ++ msb_set = msb; + } +- } ++ } + ++ mem_barrier(); + result = *(vuip) ((unsigned long)lnxSBase + (Offset << 5)); + result >>= shift; + return 0xffUL & result; +@@ -636,14 +637,16 @@ + + Offset += (unsigned long)Base - (unsigned long)lnxBase; + shift = (Offset & 0x2) << 3; +- if (Offset >= hae_thresh) { ++ if (Offset >= hae_thresh) { + msb = Offset & hae_mask; + Offset -= msb; +- if (msb_set != msb) { +- sethae(msb); +- msb_set = msb; +- } ++ if (msb_set != msb) { ++ sethae(msb); ++ msb_set = msb; ++ } + } ++ ++ mem_barrier(); + result = *(vuip)((unsigned long)lnxSBase+(Offset<<5)+(1<<(5-2))); + result >>= shift; + return 0xffffUL & result; +@@ -652,6 +655,8 @@ + static int + readSparse32(pointer Base, register unsigned long Offset) + { ++ /* note that this is actually doing a DENSE read... */ ++ mem_barrier(); + return *(vuip)((unsigned long)Base+(Offset)); + } + +@@ -670,8 +675,8 @@ + msb_set = msb; + } + } ++ write_mem_barrier(); + *(vuip) ((unsigned long)lnxSBase + (Offset << 5)) = b * 0x01010101; +- mem_barrier(); + } + + static void +@@ -689,17 +694,16 @@ + msb_set = msb; + } + } +- *(vuip)((unsigned long)lnxSBase+(Offset<<5)+(1<<(5-2))) = +- w * 0x00010001; +- mem_barrier(); +- ++ write_mem_barrier(); ++ *(vuip)((unsigned long)lnxSBase+(Offset<<5)+(1<<(5-2))) = w * 0x00010001; + } + + static void + writeSparse32(int Value, pointer Base, register unsigned long Offset) + { ++ /* note that this is actually doing a DENSE write... */ ++ write_mem_barrier(); + *(vuip)((unsigned long)Base + (Offset)) = Value; +- mem_barrier(); + return; + } + +diff -ur xc.orig/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h +--- xc.orig/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h Fri Dec 8 22:59:49 2000 ++++ xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h Sun Mar 18 16:51:30 2001 +@@ -194,13 +194,6 @@ + extern Bool xf86UnbindGARTMemory(int screenNum, int key); + extern Bool xf86EnableAGP(int screenNum, CARD32 mode); + +-#if defined(__alpha__) +-extern void xf86JensenMemToBus(char *, long, long, int); +-extern void xf86JensenBusToMem(char *, char *, unsigned long, int); +-extern void xf86SlowBCopyFromBus(unsigned char *, unsigned char *, int); +-extern void xf86SlowBCopyToBus(unsigned char *, unsigned char *, int); +-#endif /* __alpha__ */ +- + /* These routines are in shared/sigio.c and are not loaded as part of the + module. These routines are small, and the code if very POSIX-signal (or + OS-signal) specific, so it seemed better to provide more complex -- 2.44.0