Index: gfxdrivers/savage/mmio.h
===================================================================
RCS file: /cvs/directfb/DirectFB/gfxdrivers/savage/mmio.h,v
retrieving revision 1.2
diff -u -p -r1.2 mmio.h
--- gfxdrivers/savage/mmio.h	17 Jul 2002 14:09:13 -0000	1.2
+++ gfxdrivers/savage/mmio.h	22 Aug 2002 03:55:36 -0000
@@ -59,12 +59,14 @@ savage_out16(volatile uint8 *mmioaddr, u
 
 #else
 
-#define savage_out32(mmio, reg, value) *((uint32*)((mmio)+(reg))) = (uint32)(value)
-#define savage_in32(mmio, reg)         *((uint32*)((mmio)+(reg)))
-#define savage_out16(mmio, reg, value) *((uint16*)((mmio)+(reg))) = (uint16)(value)
+#define savage_out32(mmio, reg, value) (*((volatile uint32 *) ((mmio)+(reg))) = (uint32)(value))
+#define savage_in32(mmio, reg)         (*((volatile uint32 *) ((mmio)+(reg))))
+#define savage_out16(mmio, reg, value) (*((volatile uint16 *) ((mmio)+(reg))) = (uint16)(value))
 
 #endif
 
+#if 0
+
 static inline void
 vga_out8(volatile uint8 *mmioaddr, uint16 reg, uint8 value)
 {
@@ -82,5 +84,13 @@ vga_in8(volatile uint8 *mmioaddr, uint16
 {
      return *((uint8*)(mmioaddr+0x8000+reg));
 }
+
+#else
+
+#define vga_out8(mmio, reg, value)  (*((volatile uint8 *) ((mmio)+0x8000+(reg))) = (uint8)(value))
+#define vga_out16(mmio, reg, value) (*((volatile uint16 *) ((mmio)+0x8000+(reg))) = (uint16)(value))
+#define vga_in8(mmio, reg)          (*((volatile uint8 *) ((mmio)+0x8000+(reg))))
+
+#endif
 
 #endif /* __SAVAGE__MMIO_H__ */
Index: gfxdrivers/savage/savage.c
===================================================================
RCS file: /cvs/directfb/DirectFB/gfxdrivers/savage/savage.c,v
retrieving revision 1.2
diff -u -p -r1.2 savage.c
--- gfxdrivers/savage/savage.c	17 Jul 2002 14:09:13 -0000	1.2
+++ gfxdrivers/savage/savage.c	22 Aug 2002 03:55:38 -0000
@@ -231,7 +231,7 @@ driver_init_device( GraphicsDevice     *
      /* Enable 2D engine. */
 
      vga_out8( mmio, 0x3d4, 0x40 );
-     vga_out8( mmio, 0x3d4, 0x01 );
+     vga_out8( mmio, 0x3d5, 0x01 );
      
      
      savage_out32( mmio, MONO_PAT_0, ~0 );
@@ -245,38 +245,6 @@ driver_init_device( GraphicsDevice     *
      
      return DFB_OK;
 }
-
-#if 0
-static DFBResult
-driver_init_layers( void *driver_data,
-                    void *device_data )
-{
-     SavageDeviceData *sdev = (SavageDeviceData*) device_data;
-     
-     switch (sdev->accel_id) {
-#if 0
-          case FB_ACCEL_SAVAGE3D:       /* Old Streams Processor */
-          case FB_ACCEL_SAVAGE3D_MV:
-#endif
-          case FB_ACCEL_SAVAGE4:
-          case FB_ACCEL_PROSAVAGE_PM:
-          case FB_ACCEL_PROSAVAGE_KM:
-          case FB_ACCEL_S3TWISTER_P:
-          case FB_ACCEL_S3TWISTER_K:
-               savage_streams_old_init( driver_data, device_data );
-               break;
-
-          case FB_ACCEL_SAVAGE_MX_MV:   /* New Streams Processor */
-          case FB_ACCEL_SAVAGE_MX:
-          case FB_ACCEL_SAVAGE_IX_MV:
-          case FB_ACCEL_SAVAGE_IX:
-          case FB_ACCEL_SAVAGE2000:
-               break;
-     }
-
-     return DFB_OK;
-}
-#endif
 
 static void
 driver_close_device( GraphicsDevice *device,
Index: gfxdrivers/savage/savage4.c
===================================================================
RCS file: /cvs/directfb/DirectFB/gfxdrivers/savage/savage4.c,v
retrieving revision 1.3
diff -u -p -r1.3 savage4.c
--- gfxdrivers/savage/savage4.c	17 Jul 2002 14:09:13 -0000	1.3
+++ gfxdrivers/savage/savage4.c	22 Aug 2002 03:55:43 -0000
@@ -63,7 +63,7 @@
 
 /* #define SAVAGE_DEBUG */
 #ifdef SAVAGE_DEBUG
-#define SVGDBG(x...) fprintf(stderr, "savage4:");fprintf(stderr,x)
+#define SVGDBG(x...) fprintf(stderr, "savage4:" x)
 #else
 #define SVGDBG(x...)
 #endif
@@ -187,6 +187,13 @@ static inline void savage4_validate_colo
                                              state->color.g,
                                              state->color.b);
                break;
+#ifdef SUPPORT_RGB332
+          case DSPF_RGB332:
+               sdev->Fill_Color = PIXEL_RGB332(state->color.r,
+                                               state->color.g,
+                                               state->color.b);
+               break;
+#endif
           default:
                BUG( "unexpected destination format" );
                break;
@@ -218,6 +225,9 @@ static void savage4CheckState( void *drv
           case DSPF_RGB16:
           case DSPF_RGB32:
           case DSPF_ARGB:
+#ifdef SUPPORT_RGB332
+          case DSPF_RGB332:
+#endif
                break;
           default:
                return;
@@ -353,8 +363,8 @@ static void savage4DrawRectangle( void *
           
      /* fourth line */
      BCI_SEND( BCI_CMD_RECT |
-          BCI_CMD_RECT_XP | BCI_CMD_RECT_YP |
-          BCI_CMD_DEST_GBD | BCI_CMD_SRC_SOLID | (0xcc << 16) );
+               BCI_CMD_RECT_XP | BCI_CMD_RECT_YP |
+               BCI_CMD_DEST_GBD | BCI_CMD_SRC_SOLID | (0xcc << 16) );
 
      BCI_SEND( BCI_X_Y( rect->x+rect->w-1, rect->y ) );
      BCI_SEND( BCI_W_H( 1 , rect->h ) );
@@ -417,7 +427,7 @@ static void savage4Blit( void *drv, void
                    BCI_CMD_CLIP_CURRENT | BCI_CMD_DEST_GBD | 
                    BCI_CMD_SRC_PBD_COLOR | (0xcc << 16) );
  
-     SVGDBG("savage4Blit1 x:%i y:%i w:%i h:%i dx:%i dy:%i\n",
+     SVGDBG("savage4Blit x:%i y:%i w:%i h:%i dx:%i dy:%i\n",
             rect->x, rect->y, rect->w, rect->h, dx, dy);
 
      if (dx < rect->x && dx >= 0) {
Index: gfxdrivers/savage/savage_streams_old.c
===================================================================
RCS file: /cvs/directfb/DirectFB/gfxdrivers/savage/savage_streams_old.c,v
retrieving revision 1.4
diff -u -p -r1.4 savage_streams_old.c
--- gfxdrivers/savage/savage_streams_old.c	8 Aug 2002 16:56:59 -0000	1.4
+++ gfxdrivers/savage/savage_streams_old.c	22 Aug 2002 03:55:45 -0000
@@ -64,7 +64,7 @@
 
 /* #define SAVAGE_DEBUG */
 #ifdef SAVAGE_DEBUG
-#define SVGDBG(x...) fprintf(stderr, "savage_streams_old:");fprintf(stderr,x)
+#define SVGDBG(x...) fprintf(stderr, "savage_streams_old:" x)
 #else
 #define SVGDBG(x...)
 #endif
@@ -156,7 +156,7 @@ streamOnOff(SavageDriverData * sdrv, int
 
        /* turn on stream operation */ 
        vga_out8( mmio, 0x3d4, 0x67 );
-       vga_out8( mmio, 0x3d5, vga_in8( mmio, 0x3d5 ) | 0x0c );
+       vga_out8( mmio, 0x3d5, 0x0c );
      } else {
        /* turn off stream operation */ 
        vga_out8( mmio, 0x3d4, 0x67 );
@@ -509,8 +509,21 @@ savageSecondaryFlipBuffers(  DisplayLaye
 			     void                *layer_data,
                              DFBSurfaceFlipFlags flags )
 {
+     SavageDriverData *sdrv = (SavageDriverData*) driver_data;
+     SavageSecondaryLayerData *slay = (SavageSecondaryLayerData*) layer_data;
+     CoreSurface        *surface = dfb_layer_surface( layer );
+
      SVGDBG("savageSecondaryFlipBuffers\n");
-     return DFB_UNSUPPORTED;
+
+     dfb_surface_flip_buffers( surface );
+     
+     secondary_calc_regs(sdrv, slay, layer, &slay->config);
+     secondary_set_regs(sdrv, slay);
+
+     if (flags & DSFLIP_WAITFORSYNC)
+          dfb_fbdev_wait_vsync();
+
+     return DFB_OK;
 }
 
 
@@ -616,6 +629,7 @@ secondary_set_regs(SavageDriverData *sdr
         int pitch = slay->video_pitch;
 	unsigned char cr92;
 
+	SVGDBG("FIFO L2 pitch:%i\n", pitch);
 	pitch = (pitch + 7) / 8;
 	vga_out8(mmio, 0x3d4, 0x92);
 	cr92 = vga_in8( mmio, 0x3d5);
@@ -644,6 +658,7 @@ secondary_calc_regs(SavageDriverData *sd
             surface->height, front_buffer->video.pitch,
             front_buffer->video.offset);
      
+     slay->video_pitch = 1;
      slay->regs.SSTREAM_FB_SIZE = (((front_buffer->video.pitch *
                                      surface->height) / 8) - 1) & 0x003fffff;
 
@@ -678,6 +693,7 @@ secondary_calc_regs(SavageDriverData *sd
           break;
      case DSPF_I420:
           SVGDBG("secondary set to DSPF_I420\n");
+	  slay->video_pitch = 2;
           slay->regs.SSTREAM_CTRL = SAVAGE_SECONDARY_STREAM_CONTROL_SSIDF_YCbCr420;
           slay->regs.SSTREAM_FB_CB_ADDR = front_buffer->video.offset +
                (surface->height * front_buffer->video.pitch);
@@ -688,6 +704,7 @@ secondary_calc_regs(SavageDriverData *sd
           break;
      case DSPF_YV12:
           SVGDBG("secondary set to DSPF_YV12\n");
+	  slay->video_pitch = 2;
           slay->regs.SSTREAM_CTRL = SAVAGE_SECONDARY_STREAM_CONTROL_SSIDF_YCbCr420;
           slay->regs.SSTREAM_FB_CR_ADDR = front_buffer->video.offset +
                surface->height * front_buffer->video.pitch;
@@ -726,7 +743,7 @@ secondary_calc_regs(SavageDriverData *sd
      }
 
      slay->regs.SSTREAM_H_SCALE = ((32768 * src_w) / drw_w) & 0x0000FFFF;
-     slay->regs.SSTREAM_V_SCALE = ((32768 * src_h) / drw_h) & 0x000FFFF;
+     slay->regs.SSTREAM_V_SCALE = ((32768 * src_h) / drw_h) & 0x000FFFFF;
      slay->regs.SSTREAM_V_INIT_VALUE = 0;
      slay->regs.SSTREAM_SRC_LINE_COUNT = src_h & 0x7ff;
      slay->regs.SSTREAM_MULTIBUF = 0;
@@ -738,7 +755,7 @@ secondary_calc_regs(SavageDriverData *sd
      slay->regs.SSTREAM_WIN_SIZE = OS_WH(drw_w, drw_h);
      
      /* remember pitch */
-     slay->video_pitch = front_buffer->video.pitch;
+     slay->video_pitch *= front_buffer->video.pitch;
 }
 
 /* primary layer functions */
@@ -758,13 +775,21 @@ savagePrimaryInitLayer( GraphicsDevice  
                         void                       *driver_data,
                         void                       *layer_data )
 {
-     VideoMode *default_mode = dfb_fbdev->shared->modes;
+     VideoMode * default_mode;
      SavagePrimaryLayerData *play = (SavagePrimaryLayerData*) layer_data;
+     DFBResult ret;
     
      SVGDBG("savagePrimaryInitLayer w:%i h:%i bpp:%i\n",
             dfb_config->mode.width, dfb_config->mode.height,
             dfb_config->mode.depth);
     
+     /* initialize mode table */
+     ret = init_modes();
+     if (ret)
+          return ret;
+
+     default_mode = dfb_fbdev->shared->modes;
+
      /* set capabilities and type */
      layer_info->desc.caps = DLCAPS_SURFACE | DLCAPS_SCREEN_LOCATION;
      layer_info->desc.type = DLTF_GRAPHICS;
@@ -857,7 +882,7 @@ savagePrimarySetScreenLocation( DisplayL
      
      return DFB_OK;
 }
-          
+
 DisplayLayerFuncs savagePrimaryFuncs = {
      LayerDataSize:      savagePrimaryLayerDataSize,
      InitLayer:          savagePrimaryInitLayer,
@@ -889,7 +914,7 @@ primary_set_regs(SavageDriverData *sdrv,
 
      /* turn streams on */
      streamOnOff(sdrv, 1);
-          
+
      /* setup primary stream */
      savage_out32(mmio, SAVAGE_PRIMARY_STREAM_WINDOW_START,
                   play->regs.PSTREAM_WIN_START);
@@ -905,7 +930,7 @@ primary_set_regs(SavageDriverData *sdrv,
                   play->regs.PSTREAM_CTRL);
      savage_out32(mmio, SAVAGE_PRIMARY_STREAM_FRAME_BUFFER_SIZE,
                   play->regs.PSTREAM_FB_SIZE);
-          
+
      if (play->init == 0) {
           /* tweak */
           /* fifo fetch delay register */
@@ -935,23 +960,23 @@ primary_set_regs(SavageDriverData *sdrv,
           vga_out8( mmio, 0x3d4, 0x51 );
           SVGDBG( "cr51: 0x%02x\n", vga_in8( mmio, 0x3d5 ) );
           vga_out8( mmio, 0x3d5, vga_in8( mmio, 0x3d5 ) | 0x80 );
-          
+
           /* setup secondary stream */
-          savage_out32( mmio, SAVAGE_CHROMA_KEY_CONTROL, 0 );
+          savage_out32(mmio, SAVAGE_CHROMA_KEY_CONTROL, 0);
           savage_out32(mmio, SAVAGE_SECONDARY_STREAM_CONTROL, 0);
-          savage_out32( mmio, SAVAGE_CHROMA_KEY_UPPER_BOUND, 0 );
+          savage_out32(mmio, SAVAGE_CHROMA_KEY_UPPER_BOUND, 0);
           savage_out32(mmio, SAVAGE_SECONDARY_STREAM_HORIZONTAL_SCALING, 0);
-          savage_out32( mmio, SAVAGE_COLOR_ADJUSTMENT, 0 );
+          savage_out32(mmio, SAVAGE_COLOR_ADJUSTMENT, 0);
           savage_out32(mmio, SAVAGE_BLEND_CONTROL, 1 << 24);
-          savage_out32( mmio, SAVAGE_SECONDARY_STREAM_MULTIPLE_BUFFER_SUPPORT, 0 );
+          savage_out32(mmio, SAVAGE_SECONDARY_STREAM_MULTIPLE_BUFFER_SUPPORT, 0);
           savage_out32(mmio, SAVAGE_SECONDARY_STREAM_FRAME_BUFFER_ADDRESS0, 0);
-          savage_out32( mmio, SAVAGE_SECONDARY_STREAM_FRAME_BUFFER_ADDRESS1, 0 );
-          savage_out32( mmio, SAVAGE_SECONDARY_STREAM_FRAME_BUFFER_ADDRESS2, 0 );
+          savage_out32(mmio, SAVAGE_SECONDARY_STREAM_FRAME_BUFFER_ADDRESS1, 0);
+          savage_out32(mmio, SAVAGE_SECONDARY_STREAM_FRAME_BUFFER_ADDRESS2, 0);
           savage_out32(mmio, SAVAGE_SECONDARY_STREAM_FRAME_BUFFER_SIZE, 0);
           savage_out32(mmio, SAVAGE_SECONDARY_STREAM_STRIDE, 0);
           savage_out32(mmio, SAVAGE_SECONDARY_STREAM_VERTICAL_SCALING, 0);
           savage_out32(mmio, SAVAGE_SECONDARY_STREAM_SOURCE_LINE_COUNT, 0);
-          savage_out32( mmio, SAVAGE_SECONDARY_STREAM_VERTICAL_INITIAL_VALUE, 0 );
+          savage_out32(mmio, SAVAGE_SECONDARY_STREAM_VERTICAL_INITIAL_VALUE, 0);
           savage_out32(mmio, SAVAGE_SECONDARY_STREAM_WINDOW_START,
                   OS_XY(0xfffe, 0xfffe));
           savage_out32(mmio, SAVAGE_SECONDARY_STREAM_WINDOW_SIZE,
@@ -968,8 +993,9 @@ primary_calc_regs(SavageDriverData *sdrv
      CoreSurface * surface = dfb_layer_surface(layer);
      SurfaceBuffer * front_buffer = surface->front_buffer;
      
-     SVGDBG("primary_calc_regs w:%i h:%i pitch:%i\n",
-            surface->width, surface->height, front_buffer->video.pitch);
+     SVGDBG("primary_calc_regs w:%i h:%i pitch:%i video.offset:%x\n",
+            surface->width, surface->height, front_buffer->video.pitch,
+	    front_buffer->video.offset);
      
      switch (surface->format) {
      case DSPF_RGB15:
@@ -1003,7 +1029,7 @@ primary_calc_regs(SavageDriverData *sdrv
           return;
      }
 
-     play->regs.PSTREAM_FB_ADDR0 = 0;
+     play->regs.PSTREAM_FB_ADDR0 = front_buffer->video.offset & 0x01ffffff;
      play->regs.PSTREAM_FB_ADDR1 = 0;
      play->regs.PSTREAM_STRIDE = front_buffer->video.pitch & 0x00001fff;
      play->regs.PSTREAM_WIN_START = OS_XY(play->dx, play->dy);
Index: src/core/fbdev/fbdev.c
===================================================================
RCS file: /cvs/directfb/DirectFB/src/core/fbdev/fbdev.c,v
retrieving revision 1.6
diff -u -p -r1.6 fbdev.c
--- src/core/fbdev/fbdev.c	20 Aug 2002 17:53:14 -0000	1.6
+++ src/core/fbdev/fbdev.c	22 Aug 2002 03:55:58 -0000
@@ -522,7 +522,7 @@ DFBResult dfb_fbdev_wait_vsync()
      return DFB_OK;
 }
 
-static DFBResult init_modes()
+DFBResult init_modes()
 {
      dfb_fbdev_read_modes();
 
Index: src/core/fbdev/fbdev.h
===================================================================
RCS file: /cvs/directfb/DirectFB/src/core/fbdev/fbdev.h,v
retrieving revision 1.3
diff -u -p -r1.3 fbdev.h
--- src/core/fbdev/fbdev.h	16 Aug 2002 08:32:28 -0000	1.3
+++ src/core/fbdev/fbdev.h	22 Aug 2002 03:55:58 -0000
@@ -110,7 +110,7 @@ DFBResult dfb_fbdev_leave( bool emergenc
 DFBResult dfb_fbdev_wait_vsync();
 
 VideoMode *dfb_fbdev_modes();
-
+DFBResult init_modes();
 
 
 void dfb_primarylayer_register( GraphicsDevice *device );
