diff --exclude=Makefile --exclude=*.orig -Nur xc.orig/programs/Xserver/hw/xfree86/drivers/newport/Imakefile xc.working/programs/Xserver/hw/xfree86/drivers/newport/Imakefile
--- xc.orig/programs/Xserver/hw/xfree86/drivers/newport/Imakefile	Wed May 16 08:48:09 2001
+++ xc.working/programs/Xserver/hw/xfree86/drivers/newport/Imakefile	Sat Nov  9 20:47:25 2002
@@ -3,9 +3,9 @@
 #define IHaveModules
 #include <Server.tmpl>
 
-SRCS = newport_driver.c newport_regs.c newport_cmap.c newport_shadow.c
+SRCS = newport_driver.c newport_regs.c newport_cmap.c newport_shadow.c newport_cursor.c
 
-OBJS = newport_driver.o newport_regs.o newport_cmap.o newport_shadow.o
+OBJS = newport_driver.o newport_regs.o newport_cmap.o newport_shadow.o newport_cursor.o
 
 XF86CONFIG = XF86Config.indy
 
diff --exclude=Makefile --exclude=*.orig -Nur xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport.h xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport.h
--- xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport.h	Wed Dec 19 22:31:21 2001
+++ xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport.h	Sat Nov  9 21:20:14 2002
@@ -25,7 +25,7 @@
 #include "newport_regs.h"
 
 #define NEWPORT_BASE_ADDR0  0x1f0f0000
-#define NEWPORT_BASE_OFFSET 0x0040000
+#define NEWPORT_BASE_OFFSET 0x00400000
 #define NEWPORT_MAX_BOARDS 4
 
 #if 0
@@ -47,14 +47,21 @@
 	int bitplanes; 
 	/* revision numbers of the various pieces of silicon */
 	unsigned int board_rev, cmap_rev, rex3_rev, xmap9_rev, bt445_rev;
+	/* shadow copies of frequently used registers */
 	NewportRegsPtr pNewportRegs;	/* Pointer to REX3 registers */
 	npireg_t drawmode1;		/* REX3 drawmode1 common to all drawing operations */
+	CARD16 vc2ctrl;                 /* VC2 control register */
 
 	/* ShadowFB stuff: */
-	pointer ShadowPtr;
+	CARD32* ShadowPtr;
 	unsigned long int ShadowPitch;
 	unsigned int Bpp;		/* Bytes per pixel */
 
+	/* HWCursour stuff: */
+	Bool hwCursor;
+	xf86CursorInfoPtr CursorInfoRec;
+	CARD16 curs_cmap_base;          /* MSB of the cursor's cmap */
+
 	/* wrapped funtions: */
 	CloseScreenProcPtr  CloseScreen;
 
@@ -68,12 +75,19 @@
 	npireg_t txt_smask2y;
 	npireg_t txt_clipmode;		/* Rex3 clip mode register */
 
-	unsigned short txt_vc2ctrl;	/* VC2 control register */
+	CARD16 txt_vc2ctrl;             /* VC2 control register */
+	CARD16 txt_vc2cur_x;            /* VC2 hw cursor x location */
+	CARD16 txt_vc2cur_y;            /* VC2 hw cursor x location */
+	CARD32  txt_vc2cur_data[64];    /* VC2 hw cursor glyph data */
+
 	CARD8  txt_xmap9_cfg0;		/* 0. Xmap9's control register */
 	CARD8  txt_xmap9_cfg1;		/* 1. Xmap9's control register */
+	CARD8  txt_xmap9_ccmsb;         /* cursor cmap msb */
 	CARD8  txt_xmap9_mi;		/* Xmap9s' mode index register */
 	CARD32 txt_xmap9_mod0;		/* Xmap9s' mode 0 register */
+
 	LOCO txt_colormap[256];
+
 	OptionInfoPtr Options;
 } NewportRec, *NewportPtr;
 
@@ -91,15 +105,24 @@
 void NewportRestoreRex3( ScrnInfoPtr pScrn);
 void NewportBackupXmap9s( ScrnInfoPtr pScrn);
 void NewportRestoreXmap9s( ScrnInfoPtr pScrn);
+void NewportBackupVc2( ScrnInfoPtr pScrn);
+void NewportRestoreVc2( ScrnInfoPtr pScrn);
+void NewportBackupVc2Cursor( ScrnInfoPtr pScrn);
+void NewportRestoreVc2Cursor( ScrnInfoPtr pScrn);
 
 /* newort_cmap.c */
 void NewportLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, 
 			LOCO* colors, VisualPtr pVisual);
 void NewportRestorePalette(ScrnInfoPtr pScrn);
 void NewportBackupPalette(ScrnInfoPtr pScrn);
+void NewportCmapSetRGB( NewportRegsPtr pNewportRegs, unsigned short addr, LOCO color);
 
 /* newport_shadow.c */
 void NewportRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
 void NewportRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
+
+/* newport_cursor.c */
+Bool NewportHWCursorInit(ScreenPtr pScreen);
+void NewportLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *bits);
 
 #endif /* __NEWPORT_H__ */
diff --exclude=Makefile --exclude=*.orig -Nur xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c
--- xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c	Fri Nov 23 20:50:45 2001
+++ xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c	Sat Nov  9 20:55:26 2002
@@ -5,8 +5,8 @@
 
 #include "newport.h"
 
-static void NewportCmapSetRGB( NewportRegsPtr pNewportRegs, unsigned short addr, LOCO color);
 static void NewportCmapGetRGB( NewportRegsPtr pNewportRegs, unsigned short addr, LOCO *color);
+static void NewportCmapFifoWait( NewportRegsPtr pNewportRegs);
 
 /* Load a colormap into the hardware */
 void NewportLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, \
@@ -33,19 +33,51 @@
 	}
 }
 
+#ifdef linux
+/* stolen from kernel :) */
+static unsigned char color_table[] = { 0, 4, 2, 6, 1, 5, 3, 7,
+				       8,12,10,14, 9,13,11,15 };
+ 
+/* the default colour table, for VGA+ colour systems */
+static int default_red[] = {0x00,0xaa,0x00,0xaa,0x00,0xaa,0x00,0xaa,
+    0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff};
+static int default_grn[] = {0x00,0x00,0xaa,0x55,0x00,0x00,0xaa,0xaa,
+    0x55,0x55,0xff,0xff,0x55,0x55,0xff,0xff};
+static int default_blu[] = {0x00,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,
+    0x55,0x55,0x55,0x55,0xff,0xff,0xff,0xff};
+#endif
+
 /* restore the default colormap */
 void NewportRestorePalette(ScrnInfoPtr pScrn)
 {
 	int i;
 	NewportPtr pNewport = NEWPORTPTR(pScrn);
 	
+#ifdef linux
+        for (i = 0; i < 16; i++) {
+		pNewport->txt_colormap[color_table[i]].red = default_red[i];
+		pNewport->txt_colormap[color_table[i]].green = default_grn[i];
+		pNewport->txt_colormap[color_table[i]].blue = default_blu[i];
+	}
+#endif
 	for(i = 0; i < 256; i++) {
 		NewportCmapSetRGB(pNewport->pNewportRegs, i, pNewport->txt_colormap[i]);
 	}
 }
 
+/* wait 'til cmap fifo is completely empty */
+void NewportCmapFifoWait(NewportRegsPtr pNewportRegs)
+{
+        while(1) {
+		pNewportRegs->set.dcbmode = (NPORT_DMODE_ACM0 |  NCMAP_PROTOCOL |
+						NCMAP_REGADDR_SREG | NPORT_DMODE_W1);
+		if(!(pNewportRegs->set.dcbdata0.bytes.b3 & 4))
+			break;
+        }
+}
+
 /* set the colormap entry at addr to color */
-static void NewportCmapSetRGB( NewportRegsPtr pNewportRegs, unsigned short addr, LOCO color)
+void NewportCmapSetRGB( NewportRegsPtr pNewportRegs, unsigned short addr, LOCO color)
 {
 	NewportWait(pNewportRegs);	/* this one should not be necessary */
 	NewportBfwait(pNewportRegs);
diff --exclude=Makefile --exclude=*.orig -Nur xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_cursor.c xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_cursor.c
--- xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_cursor.c	Thu Jan  1 01:00:00 1970
+++ xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_cursor.c	Sun Nov 10 13:57:51 2002
@@ -0,0 +1,164 @@
+/*
+ * newport_cursor.c
+ */
+
+#include "newport.h"
+#include "cursorstr.h"
+
+#include "servermd.h"
+
+#define MAX_CURS 32
+
+static void NewportShowCursor(ScrnInfoPtr pScrn);
+static void NewportHideCursor(ScrnInfoPtr pScrn);
+static void NewportSetCursorPosition(ScrnInfoPtr pScrn, int x, int y);
+static void NewportSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg);
+/* static void NewportLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *bits); */
+static unsigned char* NewportRealizeCursor(xf86CursorInfoPtr infoPtr, CursorPtr pCurs);
+
+Bool
+NewportHWCursorInit(ScreenPtr pScreen)
+{
+	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+	NewportPtr pNewport = NEWPORTPTR(pScrn);
+	NewportRegsPtr pNewportRegs = NEWPORTREGSPTR(pScrn);
+	xf86CursorInfoPtr infoPtr;
+	CARD16 tmp;
+
+	infoPtr = xf86CreateCursorInfoRec();
+	if(!infoPtr)
+		return FALSE;
+
+	pNewport->CursorInfoRec = infoPtr;
+	infoPtr->MaxWidth = MAX_CURS;
+	infoPtr->MaxHeight = MAX_CURS;
+	infoPtr->Flags = HARDWARE_CURSOR_TRUECOLOR_AT_8BPP;
+
+	infoPtr->SetCursorColors = NewportSetCursorColors;
+	infoPtr->SetCursorPosition = NewportSetCursorPosition;
+	infoPtr->LoadCursorImage = NewportLoadCursorImage;
+	infoPtr->HideCursor = NewportHideCursor;
+	infoPtr->ShowCursor = NewportShowCursor;
+	infoPtr->RealizeCursor = NewportRealizeCursor;
+	infoPtr->UseHWCursor = NULL;
+
+	/* enable cursor funtion in shadow register */
+	pNewport->vc2ctrl |= VC2_CTRL_ECURS;
+	/* enable glyph cursor, maximum size is 32x32x2 */
+	pNewport->vc2ctrl &= ~( VC2_CTRL_ECG64 | VC2_CTRL_ECCURS);
+	/* setup hw cursors cmap base address  */
+	NewportBfwait(pNewportRegs);
+	pNewportRegs->set.dcbmode = (DCB_XMAP0 | R_DCB_XMAP9_PROTOCOL |
+			XM9_CRS_CURS_CMAP_MSB | NPORT_DMODE_W1 );
+	tmp = pNewportRegs->set.dcbdata0.bytes.b3;
+#if 0
+	/* The docs say we can change base address of the cursors
+	 * cmap entries, but it doesn't work. */
+	tmp++;
+#endif
+	pNewportRegs->set.dcbmode = (DCB_XMAP0 | W_DCB_XMAP9_PROTOCOL |
+			XM9_CRS_CURS_CMAP_MSB | NPORT_DMODE_W1 );
+	pNewportRegs->set.dcbdata0.bytes.b3 = tmp;
+	pNewport->curs_cmap_base = (tmp << 5) & 0xffe0;
+
+	return xf86InitCursor(pScreen, infoPtr);
+}
+
+
+static void NewportShowCursor(ScrnInfoPtr pScrn)
+{
+	NewportPtr pNewport = NEWPORTPTR(pScrn);
+	NewportRegsPtr pNewportRegs = NEWPORTREGSPTR(pScrn);
+
+	pNewport->vc2ctrl |= VC2_CTRL_ECDISP;
+	NewportVc2Set( pNewportRegs, VC2_IREG_CONTROL, pNewport->vc2ctrl);
+}
+
+static void NewportHideCursor(ScrnInfoPtr pScrn)
+{
+	NewportPtr pNewport = NEWPORTPTR(pScrn);
+	NewportRegsPtr pNewportRegs = NEWPORTREGSPTR(pScrn);
+
+	pNewport->vc2ctrl &= ~VC2_CTRL_ECDISP;
+	NewportVc2Set( pNewportRegs, VC2_IREG_CONTROL, pNewport->vc2ctrl);
+}
+
+static void NewportSetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
+{
+	CARD16 x_off;
+	NewportRegsPtr pNewportRegs = NEWPORTREGSPTR(pScrn);
+	NewportPtr pNewport = NEWPORTPTR(pScrn);
+		
+	/* the docu says this should always be 31, but it isn't */
+	x_off = 31;
+	if ( pNewport->board_rev < 6 )
+		x_off = 21;
+	NewportVc2Set( pNewportRegs, VC2_IREG_CURSX, (CARD16) x + x_off);
+	NewportVc2Set( pNewportRegs, VC2_IREG_CURSY, (CARD16) y + 31);
+}
+
+static void NewportSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg)
+{
+	NewportPtr pNewport = NEWPORTPTR(pScrn);
+	NewportRegsPtr pNewportRegs = NEWPORTREGSPTR(pScrn);
+	LOCO color;
+
+	color.blue = bg & 0xff;
+	color.green = (bg & 0xff00) >> 8;
+	color.red = (bg & 0xff0000) >> 16;
+	NewportCmapSetRGB( pNewportRegs, pNewport->curs_cmap_base+2, color);
+
+	color.blue = fg & 0xff;
+	color.green = (fg & 0xff00) >> 8;
+	color.red = (fg & 0xff0000) >> 16;
+	NewportCmapSetRGB( pNewportRegs, pNewport->curs_cmap_base+1, color);
+}
+
+static unsigned char* NewportRealizeCursor(xf86CursorInfoPtr infoPtr, CursorPtr pCurs)
+{
+	int size = (infoPtr->MaxWidth * infoPtr->MaxHeight) >> 2;
+	CARD32 *mem, *SrcS, *SrcM, *DstS;
+	unsigned int i;
+
+	if (!(mem = xcalloc(1, size)))
+        	return NULL;
+
+	SrcS = (CARD32*)pCurs->bits->source;
+    	SrcM = (CARD32*)pCurs->bits->mask;
+    	DstS = mem;
+	/* first color: maximum is 32*4 Bytes */
+	for(i=0; i < pCurs->bits->height; i++) {
+		*DstS = *SrcS & *SrcM;
+		DstS++, SrcS++, SrcM++;
+	}
+	/* second color is the lower of mem: again 32*4 Bytes at most */
+	DstS = mem + MAX_CURS;
+	SrcS = (CARD32*)pCurs->bits->source;
+    	SrcM = (CARD32*)pCurs->bits->mask;
+	for(i=0; i < pCurs->bits->height; i++) {
+		*DstS = (~*SrcS) & *SrcM;
+		DstS++, SrcS++, SrcM++;
+	}
+	return (unsigned char*) mem;
+}
+
+void NewportLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *bits)
+{
+	int i;
+	CARD16 tmp;
+	NewportRegsPtr pNewportRegs = NEWPORTREGSPTR(pScrn);
+
+	/* address of cursor data in vc2's ram */
+        tmp = NewportVc2Get( pNewportRegs, VC2_IREG_CENTRY);
+ 	/* this is where we want to write to: */
+        NewportVc2Set( pNewportRegs, VC2_IREG_RADDR, tmp);
+        pNewportRegs->set.dcbmode = (NPORT_DMODE_AVC2 | VC2_REGADDR_RAM |
+                               		NPORT_DMODE_W2 | VC2_PROTOCOL);
+	/* write cursor data */
+        for (i = 0; i < ((MAX_CURS * MAX_CURS) >> 3); i++) {
+		NewportBfwait(pNewportRegs);
+		pNewportRegs->set.dcbdata0.hwords.s1 = *(unsigned short*)bits;
+		bits += sizeof(unsigned short);
+        }
+}
+
diff --exclude=Makefile --exclude=*.orig -Nur xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c
--- xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c	Fri Jan  4 22:22:33 2002
+++ xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c	Sat Nov  9 21:20:05 2002
@@ -5,7 +5,7 @@
  * 
  * This driver is based on the newport.c & newport_con.c kernel code
  *
- * (c) 2000,2001 Guido Guenther <agx@sigxcpu.org>
+ * (c) 2000-2002 Guido Guenther <agx@sigxcpu.org>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -106,6 +106,12 @@
 	NULL
 };	
 
+static const char *ramdacSymbols[] = {
+    "xf86CreateCursorInfoRec",
+    "xf86InitCursor",
+    NULL
+};
+
 static const char *shadowSymbols[] = {
 	"ShadowFBInit",
 	NULL
@@ -150,7 +156,7 @@
 		 * might refer to.
 		 *
 		 */
-		LoaderRefSymLists( fbSymbols, shadowSymbols, NULL);
+		LoaderRefSymLists( fbSymbols, ramdacSymbols, shadowSymbols, NULL);
 
 
 		/*
@@ -168,13 +174,15 @@
 
 typedef enum {
 	OPTION_BITPLANES,
-	OPTION_BUS_ID
+	OPTION_BUS_ID,
+	OPTION_HWCURSOR
 } NewportOpts;
 
 /* Supported options */
 static const OptionInfoRec NewportOptions [] = {
 	{ OPTION_BITPLANES, "bitplanes", OPTV_INTEGER, {0}, FALSE },
 	{ OPTION_BUS_ID, "BusID", OPTV_INTEGER, {0}, FALSE },
+	{ OPTION_HWCURSOR, "HWCursor", OPTV_BOOLEAN, {0}, FALSE },
 	{ -1, NULL, OPTV_NONE, {0}, FALSE }
 };
 
@@ -243,7 +251,8 @@
 					 * Set it as an ISA entity to get the entity field set up right.
 					 */
 					entity = xf86ClaimIsaSlot(drv, 0, dev, TRUE);
-					base = (NEWPORT_BASE_ADDR0 + busID * NEWPORT_BASE_OFFSET);
+					base = (NEWPORT_BASE_ADDR0
+						+ busID * NEWPORT_BASE_OFFSET);
 					RANGE(range[0], base, base + sizeof(NewportRegs),\
 							ResExcMemBlock);
 					pScrn = xf86ConfigIsaEntity(pScrn, 0, entity, NULL, range, \
@@ -385,9 +394,15 @@
 			pNewport->bitplanes);
 		return FALSE;
 	}
+
+	from=X_DEFAULT;
+	pNewport->hwCursor = TRUE;
+    	if (xf86GetOptValBool(pNewport->Options, OPTION_HWCURSOR, &pNewport->hwCursor))
+        	from = X_CONFIG;
+	xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n",
+        	pNewport->hwCursor ? "HW" : "SW");
 	
 	/* Set up clock ranges that are alway ok */
-	
 	/* XXX: Use information from VC2 here */
 	clockRanges = xnfalloc(sizeof(ClockRange));
 	clockRanges->next = NULL;
@@ -437,6 +452,15 @@
 	}
 	xf86LoaderReqSymLists( fbSymbols, NULL);
 
+	/* Load ramdac modules */
+    	if (pNewport->hwCursor) {
+        	if (!xf86LoadSubModule(pScrn, "ramdac")) {
+			NewportFreeRec(pScrn);
+            		return FALSE;
+        	}
+        	xf86LoaderReqSymLists(ramdacSymbols, NULL);
+    	}
+
 	/* Load ShadowFB module */
 	if (!xf86LoadSubModule(pScrn, "shadowfb")) {
 		NewportFreeRec(pScrn);
@@ -478,7 +502,7 @@
 	/* Setup the stuff for the shadow framebuffer */
 	pNewport->ShadowPitch = (( pScrn->virtualX * pNewport->Bpp ) + 3) & ~3L;
 	pNewport->ShadowPtr = xnfalloc(pNewport->ShadowPitch * pScrn->virtualY);
-	
+
 	if (!NewportModeInit(pScrn, pScrn->currentMode))
 			return FALSE;
 
@@ -517,7 +541,15 @@
 	/* Initialize software cursor */
 	if(!miDCInitialize(pScreen, xf86GetPointerScreenFuncs()))
 		return FALSE;
-	
+
+	/* Initialize hardware cursor */
+	if(pNewport->hwCursor)
+		if(!NewportHWCursorInit(pScreen)) {
+			xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+               		"Hardware cursor initialization failed\n");
+			return FALSE;
+	}
+
 	/* Initialise default colourmap */
 	if (!miCreateDefColormap(pScreen))
 		return FALSE;
@@ -596,21 +628,27 @@
 NewportSaveScreen(ScreenPtr pScreen, int mode)
 {
 	ScrnInfoPtr pScrn;
+	NewportPtr pNewport;
 	NewportRegsPtr pNewportRegs;
 	Bool unblank;
-	unsigned short treg;
+
+	if (!pScreen)
+		return TRUE;
 
 	unblank = xf86IsUnblank(mode);
 	pScrn = xf86Screens[pScreen->myNum];
+
+	if (!pScrn->vtSema)
+		return TRUE;
+
+	pNewport = NEWPORTPTR(pScrn);
 	pNewportRegs = NEWPORTPTR(pScrn)->pNewportRegs;
 	
-	if (unblank) {
-		treg = NewportVc2Get(pNewportRegs, VC2_IREG_CONTROL);
-	        NewportVc2Set( pNewportRegs, VC2_IREG_CONTROL, (treg | VC2_CTRL_EDISP));
-    	} else {
-		treg = NewportVc2Get(pNewportRegs, VC2_IREG_CONTROL);
-		NewportVc2Set( pNewportRegs, VC2_IREG_CONTROL, (treg & ~(VC2_CTRL_EDISP)));
-        }
+	if (unblank)
+		pNewport->vc2ctrl |= VC2_CTRL_EDISP;            
+	else
+		pNewport->vc2ctrl &= ~VC2_CTRL_EDISP;           
+	NewportVc2Set( pNewportRegs, VC2_IREG_CONTROL, pNewport->vc2ctrl);
 	return TRUE;
 }
 
@@ -641,11 +679,11 @@
 	pScrn->vtSema = TRUE;
 	/* first backup the necessary registers... */
 	NewportBackupRex3(pScrn);
-	pNewport->txt_vc2ctrl = NewportVc2Get( pNewportRegs, VC2_IREG_CONTROL);
+	if( pNewport->hwCursor )
+		NewportBackupVc2Cursor( pScrn );
+	NewportBackupVc2(pScrn);
 	NewportBackupPalette(pScrn);
-	if( pNewport->Bpp == 3) { /* at 24bpp we have to backup some more registers */
-		NewportBackupXmap9s( pScrn );
-	}
+	NewportBackupXmap9s( pScrn );
 	/* ...then  setup the hardware */
 	pNewport->drawmode1 = DM1_RGBPLANES | 
 				NPORT_DMODE1_CCLT | 
@@ -661,7 +699,7 @@
 
 		/* tell the xmap9s that we are using 24bpp */
 		NewportBfwait(pNewport->pNewportRegs);
-		pNewportRegs->set.dcbmode = (DCB_XMAP_ALL | R_DCB_XMAP9_PROTOCOL |
+		pNewportRegs->set.dcbmode = (DCB_XMAP_ALL | W_DCB_XMAP9_PROTOCOL |
 				XM9_CRS_CONFIG | NPORT_DMODE_W1 );
 		pNewportRegs->set.dcbdata0.bytes.b3 &= ~(XM9_8_BITPLANES | XM9_PUPMODE);
 		NewportBfwait(pNewport->pNewportRegs);
@@ -681,7 +719,11 @@
 					/* turn on RGB mode */	
 					NPORT_DMODE1_RGBMD | 
 					/* turn on 8888 = RGBA pixel packing */
-					NPORT_DMODE1_HD32 | NPORT_DMODE1_RWPCKD; 
+					NPORT_DMODE1_HD32 | NPORT_DMODE1_RWPCKD;
+		/* After setting up XMAP9 we have to reinitialize the CMAP for
+		 * whatever reason (the docs say nothing about it). RestorePalette()
+		 * is just a lazy way to do this */
+		NewportRestorePalette( pScrn );
 	}
 	/* blank the framebuffer */
 	NewportWait(pNewportRegs);
@@ -699,6 +741,9 @@
 	NewportWait(pNewportRegs);
 	pNewportRegs->set.drawmode1 = pNewport->drawmode1;
 
+	/* XXX: Lazy mode on: just use the textmode value */
+	pNewport->vc2ctrl = pNewport->txt_vc2ctrl;
+
 	return TRUE;
 }
 
@@ -712,15 +757,14 @@
 NewportRestore(ScrnInfoPtr pScrn, Bool Closing)
 {
 	NewportPtr pNewport = NEWPORTPTR(pScrn);
-	NewportRegsPtr pNewportRegs = pNewport->pNewportRegs;
 
 	/* Restore backed up registers */
 	NewportRestoreRex3( pScrn );
-	NewportVc2Set( pNewportRegs, VC2_IREG_CONTROL, pNewport->txt_vc2ctrl );
+	if( pNewport->hwCursor )
+		NewportRestoreVc2Cursor( pScrn );
+	NewportRestoreVc2( pScrn );
 	NewportRestorePalette( pScrn );
-	if( pNewport->Bpp == 3) {
-		NewportRestoreXmap9s( pScrn);
-	}
+	NewportRestoreXmap9s( pScrn );
 }
 
 
@@ -729,21 +773,26 @@
 static unsigned
 NewportHWProbe(unsigned probedIDs[])
 {
-	FILE* cpuinfo;		
+	FILE* cpuinfo;
 	char line[80];
 	unsigned hasNewport = 0;
+
 	if ((cpuinfo = fopen("/proc/cpuinfo", "r"))) {
-		while(fgets(line, 80, cpuinfo) != NULL) {	
+		while(fgets(line, 80, cpuinfo) != NULL) {
 			if(strstr(line, "SGI Indy") != NULL) {
 				hasNewport = 1;
+				probedIDs[0] = 0;
+				break;
+			}
+			if(strstr(line, "SGI Indigo2") != NULL) {
+				hasNewport = 1;
+				probedIDs[0] = 1;
 				break;
 			}
 		}
-		fclose(cpuinfo);	
+		fclose(cpuinfo);
 	}
-
-	probedIDs[0] = 0;
-	return hasNewport;	
+	return hasNewport;
 }
 
 /* Probe for Chipset revisions */
diff --exclude=Makefile --exclude=*.orig -Nur xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_regs.c xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_regs.c
--- xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_regs.c	Fri Dec 21 16:37:23 2001
+++ xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_regs.c	Sat Nov  9 21:01:32 2002
@@ -26,6 +26,57 @@
 	return pNewportRegs->set.dcbdata0.hwords.s1;
 }
 
+void 
+NewportBackupVc2( ScrnInfoPtr pScrn)
+{
+	NewportPtr pNewport = NEWPORTPTR(pScrn);
+	NewportRegsPtr pNewportRegs = NEWPORTREGSPTR(pScrn);
+
+	pNewport->txt_vc2ctrl = NewportVc2Get( pNewportRegs, VC2_IREG_CONTROL );
+	pNewport->txt_vc2cur_x = NewportVc2Get( pNewportRegs, VC2_IREG_CURSX );
+	pNewport->txt_vc2cur_y = NewportVc2Get( pNewportRegs, VC2_IREG_CURSY );
+}
+
+void 
+NewportRestoreVc2( ScrnInfoPtr pScrn)
+{
+	NewportPtr pNewport = NEWPORTPTR(pScrn);
+	NewportRegsPtr pNewportRegs = NEWPORTREGSPTR(pScrn);
+
+	NewportVc2Set( pNewportRegs, VC2_IREG_CONTROL, pNewport->txt_vc2ctrl );
+	NewportVc2Set( pNewportRegs, VC2_IREG_CURSX, pNewport->txt_vc2cur_x );
+	NewportVc2Set( pNewportRegs, VC2_IREG_CURSY, pNewport->txt_vc2cur_y );
+}
+
+void
+NewportRestoreVc2Cursor( ScrnInfoPtr pScrn)
+{
+	NewportPtr pNewport = NEWPORTPTR(pScrn);
+	NewportLoadCursorImage( pScrn, (CARD8*)pNewport->txt_vc2cur_data);
+}
+
+void
+NewportBackupVc2Cursor( ScrnInfoPtr pScrn)
+{
+	int i;
+	CARD16 tmp, *data;
+	NewportPtr pNewport = NEWPORTPTR(pScrn);
+	NewportRegsPtr pNewportRegs = NEWPORTREGSPTR(pScrn);
+
+	data = (CARD16*)pNewport->txt_vc2cur_data;
+	/* address of cursor data in vc2's ram */
+        tmp = NewportVc2Get( pNewportRegs, VC2_IREG_CENTRY);
+ 	/* this is where we want to write to: */
+        NewportVc2Set( pNewportRegs, VC2_IREG_RADDR, tmp);
+        pNewportRegs->set.dcbmode = (NPORT_DMODE_AVC2 | VC2_REGADDR_RAM |
+                               		NPORT_DMODE_W2 | VC2_PROTOCOL);
+	/* read cursor data */
+        for (i = 0; i < 128; i++) {
+		NewportBfwait(pNewportRegs);
+		*data = pNewportRegs->set.dcbdata0.hwords.s1;
+		data++;
+        }
+}
 
 /* Sometimes we just have to wait until we can do anything */
 void
@@ -148,6 +199,10 @@
 	pNewport->txt_xmap9_mi = pNewportRegs->set.dcbdata0.bytes.b3; 
 	/* mode register 0 of xmap 0 */
 	pNewport->txt_xmap9_mod0 = NewportXmap9GetModeRegister(pNewportRegs, 0, 0);
+	/* cursor cmap msb */
+	pNewportRegs->set.dcbmode = (DCB_XMAP0 | R_DCB_XMAP9_PROTOCOL |
+			XM9_CRS_CURS_CMAP_MSB | NPORT_DMODE_W1 );
+	pNewport->txt_xmap9_ccmsb = pNewportRegs->set.dcbdata0.bytes.b3;
 }
 
 void NewportRestoreXmap9s( ScrnInfoPtr pScrn)
@@ -172,5 +227,9 @@
 	pNewportRegs->set.dcbmode = (DCB_XMAP1 | W_DCB_XMAP9_PROTOCOL |
 				XM9_CRS_CONFIG | NPORT_DMODE_W1 );
 	pNewportRegs->set.dcbdata0.bytes.b3 = pNewport->txt_xmap9_cfg1;
+	/* cursor cmap msb */
+	pNewportRegs->set.dcbmode = (DCB_XMAP0 | R_DCB_XMAP9_PROTOCOL |
+			XM9_CRS_CURS_CMAP_MSB | NPORT_DMODE_W1 );
+	pNewportRegs->set.dcbdata0.bytes.b3 = pNewport->txt_xmap9_ccmsb;
 }
 
diff --exclude=Makefile --exclude=*.orig -Nur xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_regs.h xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_regs.h
--- xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_regs.h	Fri Nov 23 20:50:45 2001
+++ xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_regs.h	Fri Nov  8 20:49:09 2002
@@ -427,7 +427,7 @@
 #define XM9_MREG_BUF_SEL	(1 << 0)
 #define XM9_MREG_OVL_BUF_SEL	(1 << 1)	
 #define XM9_MREG_GAMMA_BYPASS	(1 << 2)
-#define XM9_MREG_MSB_CMAP	(31 << 3
+#define XM9_MREG_MSB_CMAP	(31 << 3)
 #define XM9_MREG_PIX_MODE_MASK	(3 << 8)
 #define XM9_MREG_PIX_MODE_RGB0	(1 << 8)
 #define XM9_MREG_PIX_MODE_RGB1	(1 << 9)
diff --exclude=Makefile --exclude=*.orig -Nur xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c
--- xc.orig/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c	Fri Nov 23 20:50:45 2001
+++ xc.working/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c	Fri Nov  8 20:47:27 2002
@@ -8,13 +8,13 @@
 void
 NewportRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
 {
-	unsigned long *base, *src;
 	int dx, dy, x;
+	CARD32 *base, *src;
 	NewportPtr pNewport = NEWPORTPTR(pScrn);
 	NewportRegsPtr pNewportRegs = pNewport->pNewportRegs;
 
-#define RA8_PIXELS	4	/* burst 4 pixels each time */
-#define RA8_PIXEL_SHIFT 2 	/* 4 Pixels on each burst   */
+#define RA8_BYTES	4	/* burst 4 pixels each time */
+#define RA8_BYTE_SHIFT  2 	/* 4 Pixels on each burst, so divide ShadowPitch by 4 */
 #define RA8_MASK        0xffc   /* move to 4 byte boundary   */
 
 	TRACE_ENTER("NewportRefreshArea8");
@@ -25,35 +25,36 @@
 	while(num--) {
 		NewportWait(pNewportRegs);
 		x = pbox->x1 & RA8_MASK;  	/* move x to 4 byte boundary */
-		base = (unsigned long*)pNewport->ShadowPtr 
-				+ (pbox->y1 * (pNewport->ShadowPitch >> RA8_PIXEL_SHIFT) ) 
-				+ ( x >> RA8_PIXEL_SHIFT);
+		base = pNewport->ShadowPtr 
+				+ (pbox->y1 * (pNewport->ShadowPitch >> RA8_BYTE_SHIFT) ) 
+				+ ( x >> RA8_BYTE_SHIFT);
 
 		pNewportRegs->set.xystarti = (x << 16) | pbox->y1;
-		pNewportRegs->set.xyendi = (pbox->x2 << 16) | pbox->y2;
+		pNewportRegs->set.xyendi = ((pbox->x2-1) << 16) | (pbox->y2-1);
 
-		for ( dy = pbox->y1; dy <= pbox->y2; dy++) {
+		for ( dy = pbox->y1; dy < pbox->y2; dy++) {
 
 			src = base;
-			for ( dx = x; dx <= pbox->x2; dx += RA8_PIXELS) {
+			for ( dx = x; dx < pbox->x2; dx += RA8_BYTES) {
 				pNewportRegs->go.hostrw0 = *src;  
 				src++;
 			}
-			base += ( pNewport->ShadowPitch >> RA8_PIXEL_SHIFT );
+			base += ( pNewport->ShadowPitch >> RA8_BYTE_SHIFT );
 		}
 		pbox++;
 	}
 	TRACE_EXIT("NewportRefreshArea8");
 }
 
+
 void
 NewportRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
 {
-	NewportPtr pNewport = NEWPORTPTR(pScrn);
-	NewportRegsPtr pNewportRegs = pNewport->pNewportRegs;
 	int dx, dy;
 	CARD8 *src, *base;
 	CARD32 dest;
+	NewportPtr pNewport = NEWPORTPTR(pScrn);
+	NewportRegsPtr pNewportRegs = pNewport->pNewportRegs;
 
 	TRACE_ENTER("NewportRefreshArea24");
 	NewportWait(pNewportRegs);
@@ -67,11 +68,14 @@
 		base = (CARD8*)pNewport->ShadowPtr + pbox->y1 * pNewport->ShadowPitch + pbox->x1 * 3;
 		
 		pNewportRegs->set.xystarti = (pbox->x1 << 16) | pbox->y1;
-		pNewportRegs->set.xyendi = (pbox->x2 << 16) | pbox->y2;
+		pNewportRegs->set.xyendi = ((pbox->x2-1) << 16) | (pbox->y2-1);
 		
-		for ( dy = pbox->y1; dy <= pbox->y2; dy++) {
+		for ( dy = pbox->y1; dy < pbox->y2; dy++) {
 			src = base;
-			for ( dx = pbox->x1 ;  dx <= pbox->x2 ; dx++) {
+			for ( dx = pbox->x1 ;  dx < pbox->x2 ; dx++) {
+				/* Removing these shifts by using 32bpp fb
+				 * yields < 2% percent performance gain and wastes 25% memory 
+				 */
 				dest = src[0] | src[1] << 8 | src[2] << 16;
 				pNewportRegs->go.hostrw0 = dest;	
 				src+=3;
@@ -82,3 +86,4 @@
  	}
 	TRACE_EXIT("NewportRefreshArea24");
 }
+
