ChangeLog          |   24 ++
 configure.ac       |    2 
 src/Makefile.am    |    5 
 src/newmmio.h      |    6 
 src/s3.h           |   14 +
 src/s3_Trio64DAC.c |   72 +++-----
 src/s3_accel.c     |   16 +
 src/s3_driver.c    |  347 ++++++++++++++++++++++++++++------------
 src/s3_reg.h       |   21 ++
 src/s3_video.c     |  459 +++++++++++++++++++++++++++++------------------------
 10 files changed, 609 insertions(+), 357 deletions(-)

New commits:
commit 695868128746b7d8545fd78d1c42ebc2eac00a75
Author: Dave Airlie <airl...@redhat.com>
Date:   Mon Dec 22 15:30:39 2008 +1000

    s3: fix build by including inputstr.h

diff --git a/src/s3_driver.c b/src/s3_driver.c
index 72c3294..29e7fb5 100644
--- a/src/s3_driver.c
+++ b/src/s3_driver.c
@@ -53,6 +53,7 @@
 #include "micmap.h"
 #include "mibstore.h"
 #include "fb.h"
+#include "inputstr.h"
 
 #include "IBM.h"
 #include "TI.h"

commit 51e77345fdb5423db233f26d6af4af36887c7059
Author: Dave Airlie <airl...@redhat.com>
Date:   Mon Dec 22 15:25:45 2008 +1000

    s3 0.6.1

diff --git a/configure.ac b/configure.ac
index 0229c5f..da3284e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -22,7 +22,7 @@
 
 AC_PREREQ(2.57)
 AC_INIT([xf86-video-s3],
-        0.6.0,
+        0.6.1,
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         xf86-video-s3)
 

commit 115436e1ec83e43b1e7727903036720cb109abef
Author: Andrew Randrianasulu <rand...@mail.ru>
Date:   Mon Nov 24 12:46:48 2008 -0500

    Fix typo in map setup
    
    fixes bug 18688

diff --git a/src/s3_driver.c b/src/s3_driver.c
index 696e8d4..72c3294 100644
--- a/src/s3_driver.c
+++ b/src/s3_driver.c
@@ -1131,7 +1131,7 @@ static Bool S3MapMem(ScrnInfoPtr pScrn)
                void** result = (void**)&pS3->FBBase;
                int err = pci_device_map_range(pS3->PciInfo,
                                               pS3->FBAddress,
-                                              pS3->videoRam * 1024,
+                                              pScrn->videoRam * 1024,
                                               PCI_DEV_MAP_FLAG_WRITABLE |
                                               PCI_DEV_MAP_FLAG_WRITE_COMBINE,
                                               result);

commit ef1ca4800ee75044243d0eb2346240c50c28f0aa
Author: Adam Jackson <a...@redhat.com>
Date:   Fri Aug 15 14:07:28 2008 -0400

    Uninclude xf86Version.h

diff --git a/src/s3_driver.c b/src/s3_driver.c
index 86b336c..696e8d4 100644
--- a/src/s3_driver.c
+++ b/src/s3_driver.c
@@ -43,7 +43,6 @@
 #include "xf86_OSproc.h"
 #include "xf86Pci.h"
 #include "xf86PciInfo.h"
-#include "xf86Version.h"
 #include "xf86Resources.h"
 #include "xf86fbman.h"
 #include "xf86cmap.h"

commit 565c1ad65277080968c188a635dfd743be7ea2a3
Author: Paulo Cesar Pereira de Andrade <p...@mandriva.com.br>
Date:   Thu Jul 17 18:54:17 2008 -0300

    Correct unresolved symbol and incorrect assignment.
    
      Function miPointerPosition is deprecated and not available anymore.
      Correct "if (test = value)" -> "if (test == value)".

diff --git a/src/s3_driver.c b/src/s3_driver.c
index 797e0b3..86b336c 100644
--- a/src/s3_driver.c
+++ b/src/s3_driver.c
@@ -1186,12 +1186,13 @@ static int S3GetPixMuxShift(ScrnInfoPtr pScrn)
                shift = 1;      /* XXX IBMRGB */
        else if (pS3->Chipset == PCI_CHIP_TRIO || 
                 pS3->Chipset == PCI_CHIP_TRIO64UVP || 
-                pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX)
+                pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX) {
                if (pS3->s3Bpp == 2)
                        shift = -1; 
                else 
                        shift = 0;
-                               
+       }
+
        return shift;
 }
 
@@ -1220,7 +1221,7 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
           Set correct blanking for S3 Trio64V2. It's also needed
           to clear cr33_5.
        */
-       if (pS3->Chipset = PCI_CHIP_TRIO64V2_DXGX)
+       if (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX)
                mode->CrtcHBlankStart = mode->CrtcHDisplay + 8;
 
        if ((mode->HTotal == mode->CrtcHTotal) && (pS3->pixMuxShift != 0)) {
@@ -1903,7 +1904,7 @@ static void S3AdjustFrame(int scrnIndex, int x, int y, 
int flags)
        {
                int px, py, a;
 
-               miPointerPosition(&px, &py);
+               miPointerGetPosition(inputInfo.pointer, &px, &py);
 
                if (pS3->s3Bpp == 1)
                        a = 4 - 1;

commit 2128de2ad9fa67537d8ed56ff173b8a7b0422e0e
Author: Evgeny M. Zubok <evgeny.zu...@tochka.ru>
Date:   Mon Jul 7 14:31:10 2008 -0400

    S3: various fixes
    
            * src/s3_video.c:
    
            Streams Processor initialization.
    
            XVideo support for 16, 24 and 32 bpp (only for TRIO64V2).
    
            * src/s3_driver.c:
    
            Add XVideo option (enabled by default).
    
            Replace "swcursor" by "hwcursor" option (HW cursor
            not implemented yet for all chipsets).
    
            Close bug #5527: 24-bit colour depth support (24bpp and
            32bpp framebuffer) for TRIO64V2. Acceleration doesn't work
            with packed colour mode (24 bpp FB) but works with 32bpp
            framebuffer mode (hardware limitation? -- need data).
    
            Fix system hang-up when switching between console and X session.
    
            Some minor changes of driver messages.

diff --git a/ChangeLog b/ChangeLog
index dc15e51..fab4ec7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,27 @@
+2008-07-06  Evgeny M. Zubok <evgeny.zu...@tochka.ru>
+
+       * src/s3_video.c: 
+
+       Streams Processor initialization.
+
+       XVideo support for 16, 24 and 32 bpp (only for TRIO64V2).
+
+       * src/s3_driver.c: 
+
+       Add XVideo option (enabled by default).
+
+       Replace "swcursor" by "hwcursor" option (HW cursor 
+       not implemented yet for all chipsets).
+
+       Close bug #5527: 24-bit colour depth support (24bpp and 
+       32bpp framebuffer) for TRIO64V2. Acceleration doesn't work
+       with packed colour mode (24 bpp FB) but works with 32bpp 
+       framebuffer mode (hardware limitation? -- need data).
+
+       Fix system hang-up when switching between console and X session.
+
+       Some minor changes of driver messages.
+
 2008-02-23  Evgeny M. Zubok <evgeny.zu...@tochka.ru>
 
        * src/s3_driver.c: Add DPMS support for S3 Trio64V2 and possibly
diff --git a/src/Makefile.am b/src/Makefile.am
index 0d9ae4b..743babd 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -39,13 +39,12 @@ s3_drv_la_SOURCES = \
         s3_pcirename.h \
          s3_reg.h \
          s3_Ti.c \
-         s3_Trio64DAC.c \
-         s3_video.c
+         s3_Trio64DAC.c
 
 noinst_LTLIBRARIES = libs3_accel_newmmio.la libs3_accel_pio.la
 s3_drv_la_LIBADD = libs3_accel_newmmio.la libs3_accel_pio.la
 
-libs3_accel_newmmio_la_SOURCES = s3_accel.c
+libs3_accel_newmmio_la_SOURCES = s3_accel.c s3_video.c
 libs3_accel_newmmio_la_CFLAGS = $(AM_CFLAGS) -DS3_NEWMMIO=1
 
 libs3_accel_pio_la_SOURCES = s3_accel.c
diff --git a/src/newmmio.h b/src/newmmio.h
index fdb0d34..e783647 100644
--- a/src/newmmio.h
+++ b/src/newmmio.h
@@ -248,10 +248,10 @@ typedef struct {
 
        
 #define WaitQueue(v)                                   \
-       if(!(pS3->PCIRetry)) {                          \
+        if(!(pS3->PCIRetry)) {                         \
           mem_barrier();                               \
-          while(inb(GP_STAT) & (0x0100 >> (v)));       \
-       }
+          while(INB_GP_STAT() & (0x0100 >> (v)));      \
+        }                              
 
 #define CMD_REG_WIDTH  0x200   /* select 32bit command register */
 
diff --git a/src/s3.h b/src/s3.h
index 7c59236..a12ff6e 100644
--- a/src/s3.h
+++ b/src/s3.h
@@ -64,7 +64,7 @@ typedef struct _S3RegRec {
 typedef struct {
         unsigned char brightness;
         unsigned char contrast;
-        FBAreaPtr     area;
+        FBLinearPtr   area;
         RegionRec     clip;
         CARD32        colorKey;
         CARD32        videoStatus;
@@ -98,12 +98,15 @@ typedef struct _S3Rec {
         OptionInfoPtr           Options;
         unsigned int            Flags;
         Bool                    NoAccel;
-       Bool                    SWCursor;
+       Bool                    HWCursor;
        Bool                    SlowDRAMRefresh;
        Bool                    SlowDRAM;
        Bool                    SlowEDODRAM;
        Bool                    SlowVRAM;
        Bool                    S3NewMMIO;
+       Bool                    hasStreams;
+       int                     Streams_FIFO;
+       Bool                    XVideo;
        Bool                    PCIRetry;
        Bool                    ColorExpandBug;
 
@@ -159,7 +162,7 @@ typedef struct _S3Rec {
        unsigned char           *imageBuffer;
        int                     imageWidth;
        int                     imageHeight;
-    Bool                       hwCursor;
+       Bool                    hwCursor;
 } S3Rec, *S3Ptr;
 
 #define S3PTR(p)               ((S3Ptr)((p)->driverPrivate))
@@ -234,9 +237,14 @@ Bool S3_CursorInit(ScreenPtr pScreen);
 
 #define S3_964_SERIES()                ((pS3->Chipset == PCI_CHIP_964_0) ||    
\
                                 (pS3->Chipset == PCI_CHIP_964_1))
+
 #define        S3_TRIO_SERIES()        ((pS3->Chipset == PCI_CHIP_TRIO) ||     
\
                                 (pS3->Chipset == PCI_CHIP_AURORA64VP) || \
                                 (pS3->Chipset == PCI_CHIP_TRIO64UVP) || \
                                 (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX))
 
+#define HAS_STREAMS_PROCESSOR() ((pS3->Chipset == PCI_CHIP_AURORA64VP) || \
+                                (pS3->Chipset == PCI_CHIP_TRIO64UVP) || \
+                                (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX))
+
 #endif /* _S3_H */
diff --git a/src/s3_Trio64DAC.c b/src/s3_Trio64DAC.c
index 5b32146..e2cf257 100644
--- a/src/s3_Trio64DAC.c
+++ b/src/s3_Trio64DAC.c
@@ -35,6 +35,7 @@
 #include "compiler.h"
 
 #include "s3.h"
+#include "s3_reg.h"
 
 /* this is really quite dumb */
 Bool S3Trio64DACProbe(ScrnInfoPtr pScrn)
@@ -232,33 +233,30 @@ static void S3TrioSetPLL(ScrnInfoPtr pScrn, int clk, 
unsigned char m,
 
                outb(0x3c4, 0x08);
                outb(0x3c5, 0x06);      /* unlock extended CR9-18 */
-
-               if (clk != 10) {
-                       outb(0x3c4, 0x12);
-                       outb(0x3c5, n);
-                       outb(0x3c4, 0x13);
-                       outb(0x3c5, m);
-
-                       outb(0x3c4, 0x15);
-                       tmp = inb(0x3c5) & ~0x21;
-                       outb(0x3c5, tmp | 0x02);
-                       outb(0x3c5, tmp | 0x22);
-                       outb(0x3c5, tmp | 0x02);
-               } else {
-                       outb(0x3c4, 0x10);
-                       outb(0x3c5, n);
-                       outb(0x3c4, 0x11);
-                       outb(0x3c5, m);
-                       outb(0x3c4, 0x1a);
-                       outb(0x3c5, n);
-
-                       outb(0x3c4, 0x15);
-                       tmp = inb(0x3c5) & ~0x21;
-                       outb(0x3c5, tmp | 0x01);
-                       outb(0x3c5, tmp | 0x21);
-                       outb(0x3c5, tmp | 0x01);
-                       outb(0x3c5, tmp);
-               }
+               
+               outb(0x3c4, 0x12);      /* write N1 and N2 to DCLK PLL */
+               outb(0x3c5, n);
+               outb(0x3c4, 0x13);      /* write M to DCLK PLL */
+               outb(0x3c5, m);
+
+#if 0
+/* this code was in previous driver version but it was never called. 
+   So I decide to comment it. */
+               outb(0x3c4, 0x10);     
+               outb(0x3c5, n);
+               outb(0x3c4, 0x11);
+               outb(0x3c5, m); */
+                       
+               outb(0x3c4, 0x1a);
+               outb(0x3c5, n);
+#endif
+               /* Toggle cr15_5 by sequence 0->1->0 to immediately apply 
+                  new PLL parameters */
+               outb(0x3c4, 0x15);
+               tmp = inb(0x3c5) & ~0x20;
+               outb(0x3c5, tmp);
+               outb(0x3c5, tmp | 0x20);
+               outb(0x3c5, tmp);
 
                outb(0x3c4, 0x08);
                outb(0x3c5, 0x00);      /* lock em */
@@ -331,18 +329,17 @@ void S3Trio64DAC_Init(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
                S3TrioSetClock(pScrn, mode->Clock, 2, 1, 1, 31, 0, 3, 2,
                               135000, 270000);
 
-
-       outb(0x3c4, 1);
+       outb(0x3c4, 0x01);
        blank = inb(0x3c5);
        outb(0x3c5, blank | 0x20);      /* blank the screen */
 
        outb(0x3c4, 0x08);
        sr8 = inb(0x3c5);
-       outb(0x3c5, 0x06);
+       outb(0x3c5, 0x06);       /* unlock extended sequenser register */
 
-       outb(0x3c4, 0x0d0);
-       tmp = inb(0x3c5) & ~1;
-       outb(0x3c5, tmp);
+       outb(0x3c4, 0x0d);
+       tmp = inb(0x3c5) & ~0x01;
+       outb(0x3c5, tmp);       /* VCLK, HSYNC, VSYNC are outputs */
 
        outb(0x3c4, 0x15);
        sr15 = inb(0x3c5) & ~0x10;
@@ -352,11 +349,6 @@ void S3Trio64DAC_Init(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
        outb(pS3->vgaCRIndex, 0x33);
        cr33 = inb(pS3->vgaCRReg) & ~0x28;
 
-       if (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX)
-       {
-         cr33 |= 0x20;
-       }
-
        /* ! pixmux */
        switch (pScrn->depth) {
        case 8:
@@ -369,6 +361,7 @@ void S3Trio64DAC_Init(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
                cr33 |= 0x08;
                pixmux = 0x50;
                break;
+       case 24:
        case 32:
                pixmux = 0xd0;
                break;
@@ -377,6 +370,7 @@ void S3Trio64DAC_Init(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
        outb(pS3->vgaCRReg, cr33);
 
        outb(pS3->vgaCRIndex, 0x67);
+       WaitVSync();
        outb(pS3->vgaCRReg, pixmux | invert_vclk);
 
        outb(0x3c4, 0x15);
@@ -392,6 +386,6 @@ void S3Trio64DAC_Init(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
        outb(0x3c4, 0x08);
        outb(0x3c5, sr8);
 
-       outb(0x3c4, 1);
+       outb(0x3c4, 0x01);
        outb(0x3c5, blank);     /* unblank the screen */
 }
diff --git a/src/s3_accel.c b/src/s3_accel.c
index 675b823..78db3b1 100644
--- a/src/s3_accel.c
+++ b/src/s3_accel.c
@@ -140,7 +140,7 @@ static void S3SubsequentScreenToScreenCopy(ScrnInfoPtr 
pScrn,
        }
 }
 
-
+#if 0
 static void S3SetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
                                          int patx, int paty,
                                          int rop, unsigned int planemask,
@@ -182,6 +182,7 @@ static void S3SubsequentColor8x8PatternFillRect(ScrnInfoPtr 
pScrn,
                SET_MULT_MISC(CMD_REG_WIDTH);
        }
 }
+#endif
 
 #ifdef S3_NEWMMIO
 static void S3SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
@@ -569,9 +570,22 @@ Bool S3AccelInitPIO(ScreenPtr pScreen)
 
        pXAA->SetupForScreenToScreenCopy = S3SetupForScreenToScreenCopy;
        pXAA->SubsequentScreenToScreenCopy = S3SubsequentScreenToScreenCopy;
+       pXAA->ScreenToScreenCopyFlags = NO_TRANSPARENCY;
 
+#if 0
+/*
+  8x8 color pattern filling doesn't work properly after introducing 
+  framebuffer manager initialization before XAA initialization. There 
+  are problems with addressing a colour patterns from offscreen area.
+*/
        pXAA->SetupForColor8x8PatternFill = S3SetupForColor8x8PatternFill;
        pXAA->SubsequentColor8x8PatternFillRect = 
S3SubsequentColor8x8PatternFillRect;
+       pXAA->Color8x8PatternFillFlags = NO_TRANSPARENCY | 
+               HARDWARE_PATTERN_SCREEN_ORIGIN |
+               BIT_ORDER_IN_BYTE_MSBFIRST;
+
+       pXAA->CachePixelGranularity = 0;
+#endif
 
 #ifdef S3_NEWMMIO
        pXAA->SetupForCPUToScreenColorExpandFill =
diff --git a/src/s3_driver.c b/src/s3_driver.c
index 1a68202..797e0b3 100644
--- a/src/s3_driver.c
+++ b/src/s3_driver.c
@@ -152,20 +152,22 @@ static PciChipsets S3PciChipsets[] = {
 
 typedef enum {
        OPTION_NOACCEL,
-       OPTION_SWCURS,
+       OPTION_HWCURS,
        OPTION_SLOW_DRAM_REFRESH,
        OPTION_SLOW_DRAM,
        OPTION_SLOW_EDODRAM,
-       OPTION_SLOW_VRAM
+       OPTION_SLOW_VRAM,
+       OPTION_XVIDEO
 } S3Opts;
 
 static OptionInfoRec S3Options[] = {
        { OPTION_NOACCEL, "noaccel", OPTV_BOOLEAN, {0}, FALSE },
-       { OPTION_SWCURS, "swcursor", OPTV_BOOLEAN, {0}, FALSE },
+       { OPTION_HWCURS, "hwcursor", OPTV_BOOLEAN, {0}, FALSE },
        { OPTION_SLOW_DRAM_REFRESH, "slow_dram_refresh", OPTV_BOOLEAN, {0}, 
FALSE },
        { OPTION_SLOW_DRAM, "slow_dram", OPTV_BOOLEAN, {0}, FALSE },
        { OPTION_SLOW_EDODRAM, "slow_edodram", OPTV_BOOLEAN, {0}, FALSE },
        { OPTION_SLOW_VRAM, "slow_vram", OPTV_BOOLEAN, {0}, FALSE },
+       { OPTION_XVIDEO, "XVideo", OPTV_BOOLEAN, {0}, FALSE },
        { -1, NULL, OPTV_NONE, {0}, FALSE }
 };
 
@@ -388,21 +390,20 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
         pScrn->monitor = pScrn->confScreen->monitor;
         
         if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb | Support32bppFb))
-                return FALSE;
+           return FALSE;
 
         switch (pScrn->depth) {
-               case 8:
-                case 15:
-                case 16:
-                case 24:
-                case 32:
-                      /* OK */
-                       break;
-                default:
-                       xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                                  "Given depth (%d) is not  supported by this 
driver\n",
-                                   pScrn->depth);
-                              return FALSE;
+       case 8:
+       case 15:
+       case 16:
+       case 24:
+               /* OK */
+               break;
+       default:
+               xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                          "Given depth (%d) is not  supported by this 
driver\n",
+                          pScrn->depth);
+               return FALSE;
         }
 
         xf86PrintDepthBpp(pScrn);
@@ -427,37 +428,13 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
         xf86CollectOptions(pScrn, NULL);
         xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, S3Options);
          
-        if (xf86ReturnOptValBool(S3Options, OPTION_NOACCEL, FALSE)) {
-                pS3->NoAccel = TRUE;
-                xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: NoAccel - 
acceleration disabled\n");
-        } else          
-                pS3->NoAccel = FALSE;
-       if (xf86ReturnOptValBool(S3Options, OPTION_SWCURS, FALSE)) {
-               pS3->SWCursor = TRUE;
-               xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: SWCursor - 
using software cursor\n");
-        } else
-               pS3->SWCursor = FALSE;
-       if (xf86ReturnOptValBool(S3Options, OPTION_SLOW_DRAM_REFRESH, FALSE)) {
-               pS3->SlowDRAMRefresh = TRUE;
-               xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: Slow DRAM 
Refresh enabled\n");
-       } else
-               pS3->SlowDRAMRefresh = FALSE;
-       if (xf86ReturnOptValBool(S3Options, OPTION_SLOW_DRAM, FALSE)) {
-               pS3->SlowDRAM = TRUE;
-               xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: Slow DRAM 
enabled\n");
-       } else
-               pS3->SlowDRAM = FALSE;
-       if (xf86ReturnOptValBool(S3Options, OPTION_SLOW_EDODRAM, FALSE)) {
-               pS3->SlowEDODRAM = TRUE;
-               xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: Slow EDO DRAM 
enabled\n");
-       } else
-               pS3->SlowEDODRAM = FALSE;
-       if (xf86ReturnOptValBool(S3Options, OPTION_SLOW_DRAM, FALSE)) {
-               pS3->SlowVRAM = TRUE;
-               xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: Slow VRAM 
enabled\n");
-       } else
-               pS3->SlowVRAM = FALSE;
-
+       pS3->XVideo = xf86ReturnOptValBool(S3Options, OPTION_XVIDEO, TRUE);
+       pS3->NoAccel = xf86ReturnOptValBool(S3Options, OPTION_NOACCEL, FALSE);
+       pS3->HWCursor = xf86ReturnOptValBool(S3Options, OPTION_HWCURS, FALSE);
+       pS3->SlowDRAMRefresh = xf86ReturnOptValBool(S3Options, 
OPTION_SLOW_DRAM_REFRESH, FALSE);
+       pS3->SlowDRAM = xf86ReturnOptValBool(S3Options, OPTION_SLOW_DRAM, 
FALSE);
+       pS3->SlowEDODRAM = xf86ReturnOptValBool(S3Options, OPTION_SLOW_EDODRAM, 
FALSE);
+       pS3->SlowVRAM = xf86ReturnOptValBool(S3Options, OPTION_SLOW_VRAM, 
FALSE);
         if (pScrn->numEntities > 1) {      
                 S3FreeRec(pScrn);
                 return FALSE;
@@ -532,6 +509,11 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
                break;
        }
 
+       if (HAS_STREAMS_PROCESSOR() && pS3->S3NewMMIO)
+               pS3->hasStreams = TRUE;
+        else
+               pS3->hasStreams = FALSE;
+ 
        pS3->FBAddress = PCI_REGION_BASE(pS3->PciInfo, 0, REGION_MEM);
        pScrn->memPhysBase = pS3->FBAddress;
        pScrn->fbOffset = 0;
@@ -581,9 +563,10 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
 
        if (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX)
        {
+          /* disable DAC power saving to avoid bright left edge */
          outb (0x3d4, 0x86);
          outb (0x3d5, 0x80);
-         
+         /* disable the stream display fetch length control */
          outb (0x3d4, 0x90);
          outb (0x3d5, 0x00);
        }
@@ -664,17 +647,28 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
 #endif
                switch(pScrn->bitsPerPixel) {
                case 8:
-                       pS3->MaxClock = 135000;
+                       if (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX)
+                               pS3->MaxClock = 170000;
+                       else
+                               pS3->MaxClock = 135000;
+
+                       pScrn->rgbBits = 6;
                        break;
                case 16:
                        pS3->MaxClock = 80000;
+                       pScrn->rgbBits = 6;
                        break;
                case 24:
                case 32:
-                       pS3->MaxClock = 50000;
+                       if (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX)
+                               pS3->MaxClock = 56700;
+                       else
+                               pS3->MaxClock = 50000;
+
+                       pScrn->rgbBits = 8;
                        break;
                }
-               pScrn->rgbBits = 6;
+
                pS3->LoadPalette = S3GenericLoadPalette;
        }
 
@@ -684,7 +678,7 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
                return FALSE;
        }
 
-       if (pS3->SWCursor)
+       if (!pS3->HWCursor)
                pS3->CursorInit = NULL;
 
        pS3->RefClock = S3GetRefClock(pScrn);
@@ -749,6 +743,7 @@ static Bool S3ScreenInit(int scrnIndex, ScreenPtr pScreen, 
int argc,
 {
        ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
        S3Ptr pS3 = S3PTR(pScrn);
+       BoxRec ScreenArea;
 
        pScrn->fbOffset = 0;
 
@@ -811,31 +806,71 @@ static Bool S3ScreenInit(int scrnIndex, ScreenPtr 
pScreen, int argc,
         miInitializeBackingStore(pScreen);
         xf86SetBackingStore(pScreen);
 
+       /* framebuffer manager setup */
+       ScreenArea.x1 = 0;
+       ScreenArea.y1 = 0;
+       ScreenArea.x2 = pScrn->displayWidth;
+       ScreenArea.y2 = (pScrn->videoRam * 1024) / pS3->s3BppDisplayWidth;
+
+       if (!xf86InitFBManager(pScreen, &ScreenArea)) {
+               xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                          "Memory manager initialization to (%d,%d) (%d,%d) 
failed\n",
+                          ScreenArea.x1, ScreenArea.y1,
+                          ScreenArea.x2, ScreenArea.y2);
+               return FALSE;
+       } else
+               xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                          "Memory manager initialized to (%d,%d) (%d,%d)\n",
+                          ScreenArea.x1, ScreenArea.y1, 
+                          ScreenArea.x2, ScreenArea.y2);
+       
+
+       /* 2D acceleration setup */
+
+       if (pS3->NoAccel)
+               xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 
+                          "Acceleration disabled (by option)\n");
+
+       /* It seems that acceleration isn't supported for 24-bit packed
+          colour. Disable it for S3 Trio64V2 */
+       if (!pS3->NoAccel && (pScrn->bitsPerPixel == 24) &&
+           (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX)) {
+               xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Acceleration isn't 
supported for 24 bpp. Disabled.\n");
+               pS3->NoAccel = TRUE;
+       }
+
        if (!pS3->NoAccel) {
-               if (pS3->S3NewMMIO) {
+               if (pS3->S3NewMMIO)
                        if (S3AccelInitNewMMIO(pScreen)) {
-                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
"Acceleration enabled\n");
-                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using 
NewMMIO\n");
+                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
+                                          "Acceleration enabled\n");
+                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
+                                          "Using NewMMIO\n");
                        } else {
-                               xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 
"Acceleration initialization failed\n");
-                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
"Acceleration disabled\n");
+                               xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 
+                                          "Acceleration initialization 
failed\n");
+                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
+                                          "Acceleration disabled\n");
                        }
-               } else {
+               else {
                        if (S3AccelInitPIO(pScreen)) {
-                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
"Acceleration enabled\n");
-                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using 
PIO\n");
+                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
+                                          "Acceleration enabled\n");
+                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
+                                          "Using PIO\n");
                        } else {
-                               xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 
"Acceleration initialization failed\n");
-                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
"Acceleration disabled\n");
+                               xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 
+                                          "Acceleration initialization 
failed\n");
+                               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
+                                          "Acceleration disabled\n");
                        }
                }
-       } else {
-               xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Acceleration disabled by 
option\n");
        }
-
+       
         miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
 
-       /* hw cursor setup */
+       /* HW cursor setup */
+
        if (pS3->CursorInit) {
                if (pS3->CursorInit(pScreen))
                        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using HW 
cursor\n");
@@ -869,10 +904,54 @@ static Bool S3ScreenInit(int scrnIndex, ScreenPtr 
pScreen, int argc,
        pScrn->racIoFlags = pScrn->racMemFlags = RAC_COLORMAP
            | RAC_FB | RAC_VIEWPORT | RAC_CURSOR;
 
-#if 0
-       S3InitVideo(pScreen);
-#endif
+       if (pS3->SlowEDODRAM)
+               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
+                          "SlowEDODRAM: Setting 2-cycle EDO\n");
+
+       if (pS3->SlowVRAM)
+               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
+                          "SlowVRAM: -RAS low time is 4.5 MCLKs\n");
+
+       if (pS3->SlowDRAM)
+               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
+                          "SlowDRAM: -RAS precharge time is 3.5 MCLKs\n");
+
+       if (pS3->SlowDRAMRefresh)
+               xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
+                          "SlowDRAMRefresh: three refresh cycles per 
scanline\n");
+
+       /* XVideo setup */
+
+       if (pS3->XVideo) {
+               if (!pS3->hasStreams) {
+                       xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Overlay video 
isn't supported by video hardware. Disabled.\n");
+                       pS3->XVideo = FALSE;
+               } else if (pScrn->bitsPerPixel < 16) {
+                       xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Overlay video 
isn't supported for %d bpp. Disabled.\n", pScrn->bitsPerPixel);
+                       pS3->XVideo = FALSE;
+               }
+       } else
+               xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 
+                          "Overlay video disabled by option\n");
        
+       /* At present time we support XV only for chips with New MMIO */
+       if ((pS3->XVideo) && (pS3->S3NewMMIO))
+               S3InitVideo(pScreen);
+       
+       switch (pScrn->bitsPerPixel) {
+       case 8:
+               pS3->Streams_FIFO = FIFO_PS16_SS8;
+               break;
+       case 15:
+       case 16:
+               pS3->Streams_FIFO = FIFO_PS12_SS12;
+               break;
+       case 24:
+       case 32: 
+               pS3->Streams_FIFO = FIFO_PS8_SS16;
+               break;
+       }
+               
         return TRUE;
 }                 
 
@@ -1108,8 +1187,11 @@ static int S3GetPixMuxShift(ScrnInfoPtr pScrn)
        else if (pS3->Chipset == PCI_CHIP_TRIO || 
                 pS3->Chipset == PCI_CHIP_TRIO64UVP || 
                 pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX)
-               shift = -(pS3->s3Bpp >> 1);
-
+               if (pS3->s3Bpp == 2)
+                       shift = -1; 
+               else 
+                       shift = 0;
+                               
        return shift;
 }
 
@@ -1134,13 +1216,22 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, 
DisplayModePtr mode)
        pS3->s3ScissB = ((pScrn->videoRam * 1024) / pS3->s3BppDisplayWidth) - 1;
        pS3->s3ScissR = pScrn->displayWidth - 1;
 
-       if (mode->HTotal == mode->CrtcHTotal) {
+       /* 
+          Set correct blanking for S3 Trio64V2. It's also needed
+          to clear cr33_5.
+       */
+       if (pS3->Chipset = PCI_CHIP_TRIO64V2_DXGX)
+               mode->CrtcHBlankStart = mode->CrtcHDisplay + 8;
+
+       if ((mode->HTotal == mode->CrtcHTotal) && (pS3->pixMuxShift != 0)) {
                if (pS3->pixMuxShift > 0) {
                        /* XXX hack */
 /*                     mode->Flags |= V_PIXMUX; */
 
                        mode->CrtcHTotal >>= pS3->pixMuxShift;
                        mode->CrtcHDisplay >>= pS3->pixMuxShift;
+                       mode->CrtcHBlankStart >>= pS3->pixMuxShift;
+                       mode->CrtcHBlankEnd >>= pS3->pixMuxShift;
                        mode->CrtcHSyncStart >>= pS3->pixMuxShift;
                        mode->CrtcHSyncEnd >>= pS3->pixMuxShift;
                        mode->CrtcHSkew >>= pS3->pixMuxShift;
@@ -1149,6 +1240,8 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
 
                        mode->CrtcHTotal <<= -pS3->pixMuxShift;
                        mode->CrtcHDisplay <<= -pS3->pixMuxShift;
+                       mode->CrtcHBlankStart <<= -pS3->pixMuxShift;
+                       mode->CrtcHBlankEnd <<= -pS3->pixMuxShift;
                        mode->CrtcHSyncStart <<= -pS3->pixMuxShift;
                        mode->CrtcHSyncEnd <<= -pS3->pixMuxShift;
                        mode->CrtcHSkew <<= -pS3->pixMuxShift;
@@ -1202,13 +1295,12 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, 
DisplayModePtr mode)
        }
 
        /* We need to set this first - S3 *is* broken */
-       outw(vgaCRIndex, (pVga->CRTC[17] << 8) | 17);
+       outw(vgaCRIndex, (pVga->CRTC[17] << 8) | 17); 
        for(r=0; r<25; r++)
                outw(vgaCRIndex, (pVga->CRTC[r] << 8) | r);
 
-       for(r=0; r<9; r++) {
+       for(r=0; r<9; r++)
                outw(0x3ce, (pVga->Graphics[r] << 8) | r);
-       }
 
        inb(vgaIOBase + 0x0a);
 
@@ -1235,19 +1327,14 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, 
DisplayModePtr mode)
        if ((pS3->Chipset == PCI_CHIP_964_0) ||
            (pS3->Chipset == PCI_CHIP_964_1))
                new->cr33 = 0x20;
+       else if (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX)
+               new->cr33 &= ~0x20;
        outb(vgaCRReg, new->cr33);
        
        new->cr34 = 0x10;
        outb(vgaCRIndex, 0x34);
        outb(vgaCRReg, new->cr34);
 
-       if (pS3->SlowDRAMRefresh)
-               new->cr3a = 0xb7;
-       else
-               new->cr3a = 0xb5;
-       outb(vgaCRIndex, 0x3a);
-       outb(vgaCRReg, new->cr3a);
-
        if (pS3->Chipset != PCI_CHIP_AURORA64VP) {
                new->cr3b = (pVga->CRTC[0] + pVga->CRTC[4] + 1) / 2;
                outb(vgaCRIndex, 0x3b);
@@ -1302,7 +1389,7 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
                tmp |= 0x10;
                break;
        case 24:
-               tmp |= 0x20;
+               tmp |= 0x20; /* there is no such value in spec s3.txt */
                break;
        case 32:
                tmp |= 0x30;
@@ -1373,6 +1460,16 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
        new->cr60 = n;
        outb(vgaCRReg, new->cr60);
 
+       if (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX) {
+               new->cr60 = 255;                
+               outb(vgaCRIndex, 0x60);
+               outb(vgaCRReg, new->cr60);              
+
+               new->cr54 = 31 << 3;
+               outb(vgaCRIndex, 0x54);
+               outb(vgaCRReg, new->cr54);              
+       }
+
        outb(vgaCRIndex, 0x55);
        new->cr55 = (inb(vgaCRReg) & 0x08) | 0x40;
        outb(vgaCRReg, new->cr55);
@@ -1387,10 +1484,10 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, 
DisplayModePtr mode)
        {
                int i;
                unsigned int j;
-
-               i = ((((mode->CrtcHTotal >> 3) - 5) & 0x100) >> 8)      |
-                   ((((mode->CrtcHDisplay >> 3) - 1) & 0x100) >> 7)    |
-                   ((((mode->CrtcHSyncStart >> 3) - 1) & 0x100) >> 6)  |
+               
+               i = ((((mode->CrtcHTotal >> 3) - 5) & 0x100) >> 8)      |
+                   ((((mode->CrtcHDisplay >> 3) - 1) & 0x100) >> 7)    |
+                   ((((mode->CrtcHSyncStart >> 3) - 1) & 0x100) >> 6)  |
                    ((mode->CrtcHSyncStart & 0x800) >> 7);
                if ((mode->CrtcHSyncEnd >> 3) - (mode->CrtcHSyncStart >> 3) > 
64)
                        i |= 0x08;
@@ -1452,6 +1549,33 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
                outb(vgaCRReg, new->cr42);
        }
 
+       if (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX) {
+               unsigned char a;
+
+               outb(vgaCRIndex, 0x67);
+               a = inb(vgaCRReg) & 0xfe;
+
+               switch (pScrn->depth) {
+               case 8:
+                       break;
+               case 15:
+                       a |= (3 << 4);
+                       break;
+               case 16:
+                       a |= (5 << 4);
+                       break;
+               case 24:
+                       a |= (13 << 4);
+                       break;           
+               }
+
+               if (pS3->hasStreams)
+                       a |= (3 << 2);
+
+               WaitVSync(); /* Wait for VSync before setting mode */
+               outb(vgaCRReg, a);
+       }           
+
        if (pS3->Chipset == PCI_CHIP_968) {
                unsigned char a;
 
@@ -1513,6 +1637,35 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
                new->cr66 |= 0x80;
        outb(vgaCRReg, new->cr66);
 
+       if (pS3->SlowDRAMRefresh)
+               new->cr3a = 0xb7;
+       else
+               new->cr3a = 0xb5;
+       outb(vgaCRIndex, 0x3a);
+       outb(vgaCRReg, new->cr3a);
+
+       /* 
+          Set 3.5 MCLKs for -RAS low, 2.5 MCLKs for -RAS precharge, 
+          disable -CAS/-OE adjustment. It seems that cr68 has different 
+          format for 96x and TRIOs
+       */
+       if (!((pS3->Chipset == PCI_CHIP_968) || 
+             (pS3->Chipset == PCI_CHIP_964_0) ||
+             (pS3->Chipset == PCI_CHIP_964_1))) {
+
+               outb(vgaCRIndex, 0x39);
+               outb(vgaCRReg, 0xa5);
+
+               outb(vgaCRIndex, 0x68);
+               tmp = inb(vgaCRReg) & ~0x0f;
+               outb(vgaCRReg, tmp | 0x0f);
+
+               /* Enable 1-cycle EDO access */
+               outb(vgaCRIndex, 0x36);
+               tmp = inb(vgaCRReg);
+               outb(vgaCRReg, tmp & 0xf3);
+       }
+       
        if (pS3->SlowVRAM) {
                /*
                 * some Diamond Stealth 64 VRAM cards have a problem with
@@ -1530,7 +1683,7 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
        if (pS3->SlowDRAM) {
                /*
                 * fixes some pixel errors for a SPEA Trio64V+ card
-                * increas -RAS precharge timing from 2.5 MCLKs
+                * increase -RAS precharge timing from 2.5 MCLKs
                 * to 3.5 MCLKs
                 */
                outb(vgaCRIndex, 0x39);
@@ -1543,7 +1696,7 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, DisplayModePtr 
mode)
        if (pS3->SlowEDODRAM) {


-- 
To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to