This patch does:

 - enable a few GCC warnings
 - make a few globals const and static
 - move MGP_RASTER_MODE writes before writes to color registers
 - compute BPP dynamically in the SolidFill EXA hook

See tracking page here for bugs left:
  http://bender.codewiz.org/wiki/XorgOlpcTasks


 configure.ac            |   14 +++++++++-
 src/amd_gx_accel.c      |   65 +++++++++++++++++++++++++++-------------------
 2 files changed, 51 insertions(+), 28 deletions(-)

diff --git a/COPYING b/COPYING
diff --git a/Makefile.am b/Makefile.am
diff --git a/README b/README
diff --git a/TODO b/TODO
diff --git a/autogen.sh b/autogen.sh
diff --git a/configure.ac b/configure.ac
index 93cc1ff..bd57f54 100644
--- a/configure.ac
+++ b/configure.ac
@@ -54,12 +54,25 @@ AC_ARG_ENABLE(geodegx-panel,
 	      [ ], 
 	      [ AMD_CFLAGS="-DPNL_SUP $AMD_CFLAGS" ])
 
+AC_ARG_ENABLE(werror,        AC_HELP_STRING([--enable-werror],
+				  [Treat warnings as errors (default: disabled)]),
+			        [WERROR=$enableval], [WERROR=no])
 AC_ARG_ENABLE(visibility,
 	      AC_HELP_STRING([--enable-visibility],
 			     [Enable GCC visibility optimizations]),
 			     [ AMD_CFLAGS="$AMD_CFLAGS -fvisibility=hidden" ],
 			     [ : ])
 
+if test "x$GCC" = "xyes"; then
+       GCC_WARNINGS1="-Wall -Wpointer-arith -Wstrict-prototypes"
+       GCC_WARNINGS2="-Wmissing-prototypes -Wmissing-declarations"
+       GCC_WARNINGS3="-Wnested-externs -fno-strict-aliasing"
+       GCC_WARNINGS="$GCC_WARNINGS1 $GCC_WARNINGS2 $GCC_WARNINGS3"
+       if test "x$WERROR" = "xyes"; then
+               GCC_WARNINGS="${GCC_WARNINGS} -Werror"
+       fi
+       AMD_CFLAGS="$GCC_WARNINGS $AMD_CFLAGS"
+fi
 # Checks for extensions
 XORG_DRIVER_CHECK_EXT(RANDR, randrproto)
 XORG_DRIVER_CHECK_EXT(RENDER, renderproto)
@@ -104,5 +117,4 @@ XORG_RELEASE_VERSION
 AC_OUTPUT([
 	Makefile
 	src/Makefile
-	man/Makefile
 ])
diff --git a/src/Makefile.am b/src/Makefile.am
diff --git a/src/amd.h b/src/amd.h
diff --git a/src/amd_blend.h b/src/amd_blend.h
diff --git a/src/amd_common.c b/src/amd_common.c
diff --git a/src/amd_driver.c b/src/amd_driver.c
diff --git a/src/amd_fourcc.h b/src/amd_fourcc.h
diff --git a/src/amd_gx_accel.c b/src/amd_gx_accel.c
index 84281f1..80c7b47 100644
--- a/src/amd_gx_accel.c
+++ b/src/amd_gx_accel.c
@@ -86,9 +86,9 @@ typedef unsigned char uchar;
 #endif
 
 #ifdef OPT_ACCEL
-unsigned int BPP;
-unsigned int BLT_MODE, VEC_MODE;
-unsigned int ACCEL_STRIDE;
+static unsigned int BPP;
+static unsigned int BLT_MODE, VEC_MODE;
+static unsigned int ACCEL_STRIDE;
 
 #define GU2_WAIT_PENDING while(READ_GP32(MGP_BLT_STATUS) & MGP_BS_BLT_PENDING)
 #define GU2_WAIT_BUSY    while(READ_GP32(MGP_BLT_STATUS) & MGP_BS_BLT_BUSY)
@@ -155,18 +155,34 @@ static const int SDfn_PM[16] = {
 
 /* (pat FUNC dst) */
 
-static int PDfn[16] = {
+static const int PDfn[16] = {
     0x00, 0xA0, 0x50, 0xF0, 0x0A, 0xAA, 0x5A, 0xFA,
     0x05, 0xA5, 0x55, 0xF5, 0x0F, 0xAF, 0x5F, 0xFF
 };
 
 /* ((pat FUNC dst) AND src-mask) OR (dst AND (NOT src-mask)) */
 
-static int PDfn_SM[16] = {
+static const int PDfn_SM[16] = {
     0x22, 0xA2, 0x62, 0xE2, 0x2A, 0xAA, 0x6A, 0xEA,
     0x26, 0xA6, 0x66, 0xE6, 0x2E, 0xAE, 0x6E, 0xEE
 };
 
+#ifdef OPT_ACCEL
+static _X_INLINE uint32_t amd_gx_BppToRasterMode(int bpp)
+{
+    switch (bpp) {
+    case 16:
+        return MGP_RM_BPPFMT_565;
+    case 32:
+        return MGP_RM_BPPFMT_8888;
+    case 8:
+        return MGP_RM_BPPFMT_332;
+    default:
+	return 0;
+    }
+}
+#endif /* OPT_ACCEL */
+
 /*----------------------------------------------------------------------------
  * GXAccelSync.
  *
@@ -225,9 +241,9 @@ GXSetupForSolidFill(ScrnInfoPtr pScrni,
         if (((ROP ^ (ROP >> 1)) & 0x55) != 0)
             BLT_MODE |= MGP_BM_DST_REQ;
         GU2_WAIT_PENDING;
+        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_PAT_COLOR_0, planemask);
         WRITE_GP32(MGP_SRC_COLOR_FG, color);
-        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_STRIDE, ACCEL_STRIDE);
     }
 #endif
@@ -402,12 +418,12 @@ GXSetupForMono8x8PatternFill(ScrnInfoPtr pScrni, int patx, int paty,
         if (((ROP ^ (ROP >> 1)) & 0x55) != 0)
             BLT_MODE |= MGP_BM_DST_REQ;
         GU2_WAIT_PENDING;
+        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_SRC_COLOR_FG, planemask);
         WRITE_GP32(MGP_PAT_COLOR_0, bg);
         WRITE_GP32(MGP_PAT_COLOR_1, fg);
         WRITE_GP32(MGP_PAT_DATA_0, patx);
         WRITE_GP32(MGP_PAT_DATA_1, paty);
-        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_STRIDE, ACCEL_STRIDE);
     }
 #endif
@@ -507,10 +523,10 @@ GXSetupForScreenToScreenCopy(ScrnInfoPtr pScrni, int xdir, int ydir, int rop,
         BLT_MODE = ((ROP ^ (ROP >> 1)) & 0x55) != 0 ?
             MGP_BM_SRC_FB | MGP_BM_DST_REQ : MGP_BM_SRC_FB;
         GU2_WAIT_PENDING;
+        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_PAT_COLOR_0, planemask);
         WRITE_GP32(MGP_SRC_COLOR_FG, trans_color);
         WRITE_GP32(MGP_SRC_COLOR_BG, ~0);
-        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_STRIDE, ACCEL_STRIDE);
     }
 #endif
@@ -772,10 +788,10 @@ GXSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrni,
             MGP_BM_SRC_MONO | MGP_BM_SRC_FB | MGP_BM_DST_REQ :
             MGP_BM_SRC_MONO | MGP_BM_SRC_FB;
         GU2_WAIT_PENDING;
+        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_PAT_COLOR_0, planemask);
         WRITE_GP32(MGP_SRC_COLOR_BG, bg);
         WRITE_GP32(MGP_SRC_COLOR_FG, fg);
-        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_STRIDE, stride);
     }
 #endif
@@ -949,10 +965,10 @@ GXSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrni, int fg, int bg,
             MGP_BM_SRC_MONO | MGP_BM_SRC_FB | MGP_BM_DST_REQ :
             MGP_BM_SRC_MONO | MGP_BM_SRC_FB;
         GU2_WAIT_PENDING;
+        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_PAT_COLOR_0, planemask);
         WRITE_GP32(MGP_SRC_COLOR_BG, bg);
         WRITE_GP32(MGP_SRC_COLOR_FG, fg);
-        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_STRIDE, ACCEL_STRIDE);
     }
 #endif
@@ -1057,9 +1073,9 @@ GXSetupForSolidLine(ScrnInfoPtr pScrni, int color, int rop, uint planemask)
         VEC_MODE = ((ROP ^ (ROP >> 1)) & 0x55) != 0 ? ((BLT_MODE |=
                 MGP_BM_DST_REQ), MGP_VM_DST_REQ) : 0;
         GU2_WAIT_PENDING;
+        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_PAT_COLOR_0, color);
         WRITE_GP32(MGP_SRC_COLOR_FG, planemask);
-        WRITE_GP32(MGP_RASTER_MODE, ROP);
         WRITE_GP32(MGP_STRIDE, ACCEL_STRIDE);
     }
 #endif
@@ -1493,17 +1509,22 @@ amd_gx_exa_PrepareSolid(PixmapPtr pxMap, int alu, Pixel planemask, Pixel fg)
 {
 
     int dstPitch = exaGetPixmapPitch(pxMap);
-    unsigned int ROP = BPP | (planemask == ~0U ? SDfn[alu] : SDfn_PM[alu]);
+    unsigned int ROP =
+	amd_gx_BppToRasterMode(pxMap->drawable.bitsPerPixel)
+	| (planemask == ~0U ? SDfn[alu] : SDfn_PM[alu]);
 
-    //ErrorF("amd_gx_exa_PrepareSolid(%#x,%#x,%#x)\n", alu, planemask, fg);
+    //  FIXME: this should go away -- workaround for the blockparty icon corruption
+    //if (pxMap->drawable.bitsPerPixel == 32)
+    //	return FALSE;
 
     BLT_MODE = ((ROP ^ (ROP >> 2)) & 0x33) == 0 ? MGP_BM_SRC_MONO : 0;
     if (((ROP ^ (ROP >> 1)) & 0x55) != 0)
         BLT_MODE |= MGP_BM_DST_REQ;
+    //ErrorF("amd_gx_exa_PrepareSolid(%#x,%#x,%#x - ROP=%x,BLT_MODE=%x)\n", alu, planemask, fg, ROP, BLT_MODE);
     GU2_WAIT_PENDING;
+    WRITE_GP32(MGP_RASTER_MODE, ROP);
     WRITE_GP32(MGP_PAT_COLOR_0, planemask);
     WRITE_GP32(MGP_SRC_COLOR_FG, fg);
-    WRITE_GP32(MGP_RASTER_MODE, ROP);
     WRITE_GP32(MGP_STRIDE, dstPitch);
     return TRUE;
 }
@@ -1516,7 +1537,7 @@ amd_gx_exa_Solid(PixmapPtr pxMap, int x1, int y1, int x2, int y2)
     unsigned int offset = exaGetPixmapOffset(pxMap) + pitch * y1 + bpp * x1;
     unsigned int size = ((x2 - x1) << 16) | (y2 - y1);
 
-    //ErrorF("amd_gx_exa_Solid() at %d,%d %d,%d\n", x1, y1, x2, y2);
+    //ErrorF("amd_gx_exa_Solid() at %d,%d %d,%d - offset=%d, bpp=%d\n", x1, y1, x2, y2, offset, bpp);
 
     GU2_WAIT_PENDING;
     WRITE_GP32(MGP_DST_OFFSET, offset);
@@ -1546,10 +1567,10 @@ amd_gx_exa_PrepareCopy(PixmapPtr pxSrc, PixmapPtr pxDst, int dx, int dy,
     BLT_MODE = ((ROP ^ (ROP >> 1)) & 0x55) != 0 ?
         MGP_BM_SRC_FB | MGP_BM_DST_REQ : MGP_BM_SRC_FB;
     GU2_WAIT_PENDING;
+    WRITE_GP32(MGP_RASTER_MODE, ROP);
     WRITE_GP32(MGP_PAT_COLOR_0, planemask);
     WRITE_GP32(MGP_SRC_COLOR_FG, ~0);
     WRITE_GP32(MGP_SRC_COLOR_BG, ~0);
-    WRITE_GP32(MGP_RASTER_MODE, ROP);
     WRITE_GP32(MGP_STRIDE, (pGeode->cpySrcPitch << 16) | dstPitch);
     return TRUE;
 }
@@ -1893,17 +1914,7 @@ GXAccelInit(ScreenPtr pScrn)
 
 #ifdef OPT_ACCEL
     ACCEL_STRIDE = (pGeode->Pitch << 16) | pGeode->Pitch;
-    switch (pScrni->bitsPerPixel) {
-    case 16:
-        BPP = MGP_RM_BPPFMT_565;
-        break;
-    case 32:
-        BPP = MGP_RM_BPPFMT_8888;
-        break;
-    default:
-        BPP = MGP_RM_BPPFMT_332;
-        break;
-    }
+    BPP = amd_gx_BppToRasterMode(pScrni->bitsPerPixel);
 #endif
 
 #if XF86EXA
diff --git a/src/amd_gx_cursor.c b/src/amd_gx_cursor.c
diff --git a/src/amd_gx_dcon.c b/src/amd_gx_dcon.c
diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c
diff --git a/src/amd_gx_randr.c b/src/amd_gx_randr.c
diff --git a/src/amd_gx_regacc.c b/src/amd_gx_regacc.c
diff --git a/src/amd_gx_rotate.c b/src/amd_gx_rotate.c
diff --git a/src/amd_gx_shadow.c b/src/amd_gx_shadow.c
diff --git a/src/amd_gx_vga.c b/src/amd_gx_vga.c
diff --git a/src/amd_gx_video.c b/src/amd_gx_video.c
diff --git a/src/amd_lx_cursor.c b/src/amd_lx_cursor.c
diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c
diff --git a/src/amd_lx_exa.c b/src/amd_lx_exa.c
diff --git a/src/amd_lx_randr.c b/src/amd_lx_randr.c
diff --git a/src/amd_lx_regacc.c b/src/amd_lx_regacc.c
diff --git a/src/amd_lx_rotate.c b/src/amd_lx_rotate.c
diff --git a/src/amd_lx_vga.c b/src/amd_lx_vga.c
diff --git a/src/amd_lx_video.c b/src/amd_lx_video.c
diff --git a/src/amd_msr.c b/src/amd_msr.c
diff --git a/src/build_num.h b/src/build_num.h
diff --git a/src/cim/cim_defs.h b/src/cim/cim_defs.h
diff --git a/src/cim/cim_df.c b/src/cim/cim_df.c
diff --git a/src/cim/cim_filter.c b/src/cim/cim_filter.c
diff --git a/src/cim/cim_gp.c b/src/cim/cim_gp.c
diff --git a/src/cim/cim_init.c b/src/cim/cim_init.c
diff --git a/src/cim/cim_modes.c b/src/cim/cim_modes.c
diff --git a/src/cim/cim_msr.c b/src/cim/cim_msr.c
diff --git a/src/cim/cim_parm.h b/src/cim/cim_parm.h
diff --git a/src/cim/cim_regs.h b/src/cim/cim_regs.h
diff --git a/src/cim/cim_rtns.h b/src/cim/cim_rtns.h
diff --git a/src/cim/cim_version.h b/src/cim/cim_version.h
diff --git a/src/cim/cim_vg.c b/src/cim/cim_vg.c
diff --git a/src/cim/cim_vip.c b/src/cim/cim_vip.c
diff --git a/src/cim/cim_vop.c b/src/cim/cim_vop.c
diff --git a/src/cim/doc/release.txt b/src/cim/doc/release.txt
diff --git a/src/cim_dev.h b/src/cim_dev.h
diff --git a/src/cimarron.c b/src/cimarron.c
diff --git a/src/durango.c b/src/durango.c
diff --git a/src/gfx/disp_gu1.c b/src/gfx/disp_gu1.c
diff --git a/src/gfx/disp_gu2.c b/src/gfx/disp_gu2.c
diff --git a/src/gfx/gfx_dcdr.c b/src/gfx/gfx_dcdr.c
diff --git a/src/gfx/gfx_defs.h b/src/gfx/gfx_defs.h
diff --git a/src/gfx/gfx_disp.c b/src/gfx/gfx_disp.c
diff --git a/src/gfx/gfx_i2c.c b/src/gfx/gfx_i2c.c
diff --git a/src/gfx/gfx_init.c b/src/gfx/gfx_init.c
diff --git a/src/gfx/gfx_mode.h b/src/gfx/gfx_mode.h
diff --git a/src/gfx/gfx_msr.c b/src/gfx/gfx_msr.c
diff --git a/src/gfx/gfx_priv.h b/src/gfx/gfx_priv.h
diff --git a/src/gfx/gfx_regs.h b/src/gfx/gfx_regs.h
diff --git a/src/gfx/gfx_rndr.c b/src/gfx/gfx_rndr.c
diff --git a/src/gfx/gfx_rtns.h b/src/gfx/gfx_rtns.h
diff --git a/src/gfx/gfx_tv.c b/src/gfx/gfx_tv.c
diff --git a/src/gfx/gfx_type.h b/src/gfx/gfx_type.h
diff --git a/src/gfx/gfx_vga.c b/src/gfx/gfx_vga.c
diff --git a/src/gfx/gfx_vid.c b/src/gfx/gfx_vid.c
diff --git a/src/gfx/gfx_vip.c b/src/gfx/gfx_vip.c
diff --git a/src/gfx/history.h b/src/gfx/history.h
diff --git a/src/gfx/i2c_acc.c b/src/gfx/i2c_acc.c
diff --git a/src/gfx/i2c_gpio.c b/src/gfx/i2c_gpio.c
diff --git a/src/gfx/init_gu1.c b/src/gfx/init_gu1.c
diff --git a/src/gfx/init_gu2.c b/src/gfx/init_gu2.c
diff --git a/src/gfx/msr_rdcl.c b/src/gfx/msr_rdcl.c
diff --git a/src/gfx/release.txt b/src/gfx/release.txt
diff --git a/src/gfx/rndr_gu1.c b/src/gfx/rndr_gu1.c
diff --git a/src/gfx/rndr_gu2.c b/src/gfx/rndr_gu2.c
diff --git a/src/gfx/saa7114.c b/src/gfx/saa7114.c
diff --git a/src/gfx/tv_1200.c b/src/gfx/tv_1200.c
diff --git a/src/gfx/tv_fs450.c b/src/gfx/tv_fs450.c
diff --git a/src/gfx/tv_fs450.h b/src/gfx/tv_fs450.h
diff --git a/src/gfx/vga_gu1.c b/src/gfx/vga_gu1.c
diff --git a/src/gfx/vid_1200.c b/src/gfx/vid_1200.c
diff --git a/src/gfx/vid_5530.c b/src/gfx/vid_5530.c
diff --git a/src/gfx/vid_rdcl.c b/src/gfx/vid_rdcl.c
diff --git a/src/gfx/vip_1200.c b/src/gfx/vip_1200.c
diff --git a/src/panel.c b/src/panel.c
diff --git a/src/panel/92xx.h b/src/panel/92xx.h
diff --git a/src/panel/cen9211.c b/src/panel/cen9211.c
diff --git a/src/panel/cen9211.h b/src/panel/cen9211.h
diff --git a/src/panel/dora9211.c b/src/panel/dora9211.c
diff --git a/src/panel/dora9211.h b/src/panel/dora9211.h
diff --git a/src/panel/drac9210.c b/src/panel/drac9210.c
diff --git a/src/panel/drac9210.h b/src/panel/drac9210.h
diff --git a/src/panel/gx2_9211.c b/src/panel/gx2_9211.c
diff --git a/src/panel/gx2_9211.h b/src/panel/gx2_9211.h
diff --git a/src/panel/panel.c b/src/panel/panel.c
diff --git a/src/panel/panel.h b/src/panel/panel.h
diff --git a/src/panel/platform.c b/src/panel/platform.c
diff --git a/src/panel/pnl_bios.c b/src/panel/pnl_bios.c
diff --git a/src/panel/pnl_defs.h b/src/panel/pnl_defs.h
diff --git a/src/panel/pnl_init.c b/src/panel/pnl_init.c
diff --git a/src/panel/readme.txt b/src/panel/readme.txt
diff --git a/src/z4l.c b/src/z4l.c
