Hi, here's a small update for the Indy's newport driver. It fixes the most annoying bugs: - broken 24bpp mode setup - black console after starting X - screensaver blanking the console - 1 off errors in the RefreshArea code Branden, can this go into pre1v3? -- Guido
Index: xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h =================================================================== RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h,v retrieving revision 1.8 diff -u -u -r1.8 xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h --- xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h 2001/12/19 21:31:21 1.8 +++ xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h 2002/07/15 23:23:01 @@ -51,7 +51,7 @@ npireg_t drawmode1; /* REX3 drawmode1 common to all drawing operations */ /* ShadowFB stuff: */ - pointer ShadowPtr; + CARD32* ShadowPtr; unsigned long int ShadowPitch; unsigned int Bpp; /* Bytes per pixel */ Index: xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c =================================================================== RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c,v retrieving revision 1.19 diff -u -u -r1.19 newport_driver.c --- xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c 2002/01/04 21:22:33 1.19 +++ xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c 2002/07/15 23:23:03 @@ -681,7 +689,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); Index: xc/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c =================================================================== RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c,v retrieving revision 1.2 diff -u -u -r1.2 newport_shadow.c --- xc/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c 2001/11/23 19:50:45 1.2 +++ xc/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c 2002/07/15 23:23:05 @@ -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"); } + Index: xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c =================================================================== RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c,v retrieving revision 1.19 diff -u -r1.19 xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c --- xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c 2002/01/04 21:22:33 1.19 +++ xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c 2002/07/15 23:23:03 @@ -600,8 +601,15 @@ Bool unblank; unsigned short treg; + if (!pScreen) + return TRUE; + unblank = xf86IsUnblank(mode); pScrn = xf86Screens[pScreen->myNum]; + + if (!pScrn->vtSema) + return TRUE; + pNewportRegs = NEWPORTPTR(pScrn)->pNewportRegs; if (unblank) { Index: xc/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c =================================================================== RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c,v retrieving revision 1.2 diff -u -p -u -r1.2 newport_cmap.c --- xc/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c 2001/11/23 19:50:45 1.2 +++ xc/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c 2002/04/23 10:15:33 @@ -33,12 +33,33 @@ void NewportBackupPalette(ScrnInfoPtr pS } } +#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]); }