diff options
author | dawes <dawes> | 2000-11-08 00:06:24 +0000 |
---|---|---|
committer | dawes <dawes> | 2000-11-08 00:06:24 +0000 |
commit | bc9d002299a38f40073b455ab00a382510a82485 (patch) | |
tree | 992568d20d107747e284c8a4763e2193153daecc /xc/programs | |
parent | 38b17cc33454f7fb15124f3d6662db17742608b1 (diff) |
merge with 4.0.1dX_4_0_1d-20001107-merge
Diffstat (limited to 'xc/programs')
132 files changed, 12165 insertions, 5257 deletions
diff --git a/xc/programs/Xserver/GL/dri/dri.c b/xc/programs/Xserver/GL/dri/dri.c index 26fc6a40e..bbc8622db 100644 --- a/xc/programs/Xserver/GL/dri/dri.c +++ b/xc/programs/Xserver/GL/dri/dri.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/dri/dri.c,v 1.19 2000/06/25 16:03:43 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/dri/dri.c,v 1.21 2000/09/26 15:57:01 tsi Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. @@ -651,11 +651,9 @@ DRICreateContext(ScreenPtr pScreen, VisualPtr visual, contextStore=DRIGetContextStore(pDRIContextPriv); if (pDRIPriv->pDriverInfo->CreateContext) { - if (!((*pDRIPriv->pDriverInfo->CreateContext)(pScreen, - visual, - *pHWContext, - *pVisualConfigPriv, - (int)contextStore))) { + if (!((*pDRIPriv->pDriverInfo->CreateContext)(pScreen, visual, + *pHWContext, *pVisualConfigPriv, + (DRIContextType)(long)contextStore))) { DRIDestroyContextPriv(pDRIContextPriv); return FALSE; } @@ -687,8 +685,7 @@ DRIContextPrivDelete(pointer pResource, XID id) if (pDRIPriv->pDriverInfo->DestroyContext) { contextStore=DRIGetContextStore(pDRIContextPriv); (pDRIPriv->pDriverInfo->DestroyContext)(pDRIContextPriv->pScreen, - pDRIContextPriv->hwContext, - (int)contextStore); + pDRIContextPriv->hwContext, (DRIContextType)(long)contextStore); } return DRIDestroyContextPriv(pDRIContextPriv); } diff --git a/xc/programs/Xserver/GL/dri/sarea.h b/xc/programs/Xserver/GL/dri/sarea.h index 24ce045e0..54838251f 100644 --- a/xc/programs/Xserver/GL/dri/sarea.h +++ b/xc/programs/Xserver/GL/dri/sarea.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/dri/sarea.h,v 1.4 2000/02/23 04:46:52 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/dri/sarea.h,v 1.6 2000/09/26 15:57:02 tsi Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. @@ -37,8 +37,10 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define _SAREA_H_ /* SAREA area needs to be at least a page */ -#ifdef __alpha__ +#if defined(__alpha__) #define SAREA_MAX 0x2000 +#elif defined(__ia64__) +#define SAREA_MAX 0x10000 /* 64kB */ #else #define SAREA_MAX 0x1000 #endif diff --git a/xc/programs/Xserver/GL/dri/xf86dri.c b/xc/programs/Xserver/GL/dri/xf86dri.c index b35e5680b..e18185f61 100644 --- a/xc/programs/Xserver/GL/dri/xf86dri.c +++ b/xc/programs/Xserver/GL/dri/xf86dri.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/dri/xf86dri.c,v 1.8 2000/06/25 16:03:43 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/dri/xf86dri.c,v 1.9 2000/09/24 13:51:22 alanh Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. diff --git a/xc/programs/Xserver/GL/mesa/src/Imakefile b/xc/programs/Xserver/GL/mesa/src/Imakefile index 509077014..c2ead442c 100644 --- a/xc/programs/Xserver/GL/mesa/src/Imakefile +++ b/xc/programs/Xserver/GL/mesa/src/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/programs/Xserver/GL/mesa/src/Imakefile,v 1.15 2000/08/01 20:28:39 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/GL/mesa/src/Imakefile,v 1.16 2000/09/24 13:51:22 alanh Exp $ #define IHaveModules #include <Server.tmpl> diff --git a/xc/programs/Xserver/Imakefile b/xc/programs/Xserver/Imakefile index 4ed670b60..6ab52168c 100644 --- a/xc/programs/Xserver/Imakefile +++ b/xc/programs/Xserver/Imakefile @@ -2,7 +2,7 @@ XCOMM $TOG: Imakefile /main/249 1997/12/11 11:18:14 kaleb $ /* * Server Master Makefile */ -XCOMM $XFree86: xc/programs/Xserver/Imakefile,v 3.195 2000/09/22 05:56:35 keithp Exp $ +XCOMM $XFree86: xc/programs/Xserver/Imakefile,v 3.199 2000/10/26 17:57:50 dawes Exp $ #ifndef InstallXserverSetUID #define InstallXserverSetUID NO @@ -247,8 +247,12 @@ XPFBLIBS = dix/LibraryTargetName(xpstubs) DIX = dix/LibraryTargetName(dix) FONTBASE = $(FONTLIBSRC)/fontbase.o \ $(FONTLIBSRC)/LibraryTargetName(fontbase) - FONT = $(XFONTLIB) $(XPFBLIBS) - FONTLIBS = $(LDPRELIB) $(FONT) +#if XserverStaticFontLib + FONT = $(FONTLIBSRC)/LibraryTargetName(Xfont) +#else + FONT = $(LDPRELIB) $(XFONTLIB) +#endif + FONTLIBS = $(FONT) $(XPFBLIBS) #if UsbMouseSupport #if !HasLibUsb USB = $(XF86OSSRC)/bsd/libusb/LibraryTargetName(usb) @@ -590,6 +594,9 @@ XF1BPPLIB = $(XF86SRC)/xf1bpp/LibraryTargetName(xf1bpp) #if XF4Bpp XF4BPPLIB = $(XF86SRC)/xf4bpp/LibraryTargetName(xf4bpp) #endif +#if XF8_32Wid +XF8_32WIDLIB = $(XF86SRC)/xf8_32wid/LibraryTargetName(xf8_32wid) +#endif #if XF8_32Bpp XF8_32BPPLIB = $(XF86SRC)/xf8_32bpp/LibraryTargetName(xf8_32bpp) #endif @@ -628,7 +635,8 @@ XF86IDRIVERLIB = $(XF86SRC)/input/LibraryTargetName(idriver) XF86DRVOBJS = $(XF86SRC)/drivers/drvConf.o XF86DRVLIBS = $(XF86DRIVERLIB) $(XF86RAMDACLIB) $(XF86DDCLIB) $(XF86I2CLIB) \ $(XF86XAALIB) $(XF86VGAHWLIB) $(XF86FBDEVHWLIB) \ - $(XF8_32BPPLIB) $(XF8_16BPPLIB) $(XF24_32BPPLIB) \ + $(XF8_32WIDLIB) $(XF8_32BPPLIB) \ + $(XF8_16BPPLIB) $(XF24_32BPPLIB) \ $(XF4BPPLIB) $(XF1BPPLIB) $(XFSHADOWFBLIB) $(AFBLIB) XF86IDRVOBJS = $(XF86SRC)/input/drvConf.o XF86IDRVLIBS = $(XF86IDRIVERLIB) @@ -689,7 +697,7 @@ XCOMM SHADOWDIR = miext/shadow KD = $(KDRIVE)/LibraryTargetName(kdrive) KDFBDEV = $(KDRIVE)/fbdev/LibraryTargetName(fbdev) - + #define StdKdDirs $(KDRIVE) $(KDOSDIR) $(PSEUDO8DIR) fb $(DEPDIRS) #define StdKdSysLibs $(FONTLIBS) $(SYSLIBS) @@ -705,7 +713,9 @@ XCOMM KDDIRS = StdKdDirs - FBDEVDIRS = $(STDDIRS) $(KDDIRS) $(FBDEVDIR) + SHADOWDIR = miext/shadow + + FBDEVDIRS = $(STDDIRS) $(KDDIRS) $(FBDEVDIR) $(SHADOWDIR) FBDEVLIBS = PreFbLibs $(FBDEV) KdLibs FbPostFbLibs FBDEVSYSLIBS = StdKdSysLibs @@ -1060,7 +1070,7 @@ ServerTarget(Xvfb,$(XVFBDIRS),$(XVFBOBJS), \ #endif /* XVirtualFramebufferServer */ -#if XWinServer && !MakeDllModules +#if XWinServer XCOMM XCOMM server with DirectX framebuffer for Windows XCOMM @@ -1069,16 +1079,13 @@ CFB8DIR = cfb CFB16DIR = cfb16 CFB24DIR = cfb24 CFB32DIR = cfb32 -#ifndef Win32Architecture XWINDDXDIR = hw/xwin -#else -XWINDDXDIR = hw -#endif +DDXDIR2 = $(XWINDDXDIR) XWINDIRS = $(STDDIRS) $(MFBDIR) $(CFB8DIR) $(CFB16DIR) $(CFB24DIR) $(CFB32DIR) $(XWINDDXDIR) $(DEPDIRS) #if BuildDPMS -XWINOBJS = hw/xwin/InitInput.o hw/xwin/InitOutput.o hw/xwin/stubs.o hw/xwin/directx.o hw/xwin/dpmsstubs.o dix/main.o hw/xwin/ntux_xf.o +XWINOBJS = hw/xwin/InitInput.o hw/xwin/InitOutput.o hw/xwin/stubs.o hw/xwin/directx.o hw/xwin/dpmsstubs.o dix/main.o #else -XWINOBJS = hw/xwin/InitInput.o hw/xwin/InitOutput.o hw/xwin/stubs.o hw/xwin/directx.o dix/main.o hw/xwin/ntux_xf.o +XWINOBJS = hw/xwin/InitInput.o hw/xwin/InitOutput.o hw/xwin/stubs.o hw/xwin/directx.o dix/main.o #endif XWIN = hw/xwin/LibraryTargetName(XWin) XWINLIBS = PreFbLibs $(XWIN) $(CFB) PostFbLibs $(MI) $(SURFLIB) diff --git a/xc/programs/Xserver/fb/fboverlay.c b/xc/programs/Xserver/fb/fboverlay.c index 0c0106e04..7fc4fd12f 100644 --- a/xc/programs/Xserver/fb/fboverlay.c +++ b/xc/programs/Xserver/fb/fboverlay.c @@ -1,5 +1,5 @@ /* - * $XFree86: xc/programs/Xserver/fb/fboverlay.c,v 1.3 2000/08/09 17:50:52 keithp Exp $ + * $XFree86: xc/programs/Xserver/fb/fboverlay.c,v 1.4 2000/09/26 15:57:03 tsi Exp $ * * Copyright © 2000 SuSE, Inc. * @@ -236,7 +236,7 @@ fbOverlayCopyWindow(WindowPtr pWin, fbCopyRegion (&pPixmap->drawable, &pPixmap->drawable, 0, &layerRgn[i], dx, dy, pScrPriv->CopyWindow, 0, - (void *) i); + (void *)(long) i); } } /* diff --git a/xc/programs/Xserver/fb/fbpict.c b/xc/programs/Xserver/fb/fbpict.c index 7b4e3eb6a..7d7f15dfc 100644 --- a/xc/programs/Xserver/fb/fbpict.c +++ b/xc/programs/Xserver/fb/fbpict.c @@ -1,5 +1,5 @@ /* - * $XFree86$ + * $XFree86: xc/programs/Xserver/fb/fbpict.c,v 1.3 2000/10/21 00:26:48 keithp Exp $ * * Copyright © 2000 SuSE, Inc. * @@ -26,25 +26,7 @@ #include "fb.h" #include "picturestr.h" #include "mipict.h" - -typedef void (*CompositeFunc) (CARD8 op, - PicturePtr pSrc, - PicturePtr pMask, - PicturePtr pDst, - INT16 xSrc, - INT16 ySrc, - INT16 xMask, - INT16 yMask, - INT16 xDst, - INT16 yDst, - CARD16 width, - CARD16 height); - -#define INT_MULT(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) ) -#define GET8(v,i) ((CARD16) (CARD8) ((v) >> i)) -#define OVER(x,y,i,a,t) ((t) = INT_MULT(GET8(y,i),(a),(t)) + GET8(x,i),\ - (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) -#define IN(x,i,a,t) ((CARD32) INT_MULT(GET8(x,i),(a),(t)) << (i)) +#include "fbpict.h" #define cvt8888to0565(s) ((((s) >> 3) & 0x001f) | \ (((s) >> 5) & 0x07e0) | \ @@ -73,31 +55,31 @@ typedef void (*CompositeFunc) (CARD8 op, (*((a)+2) = (CARD8) ((v) >> 16)))) #endif -static CARD32 +CARD32 fbOver (CARD32 x, CARD32 y) { CARD16 a = ~x >> 24; CARD16 t; CARD32 m,n,o,p; - m = OVER(x,y,0,a,t); - n = OVER(x,y,8,a,t); - o = OVER(x,y,16,a,t); - p = OVER(x,y,24,a,t); + m = FbOver(x,y,0,a,t); + n = FbOver(x,y,8,a,t); + o = FbOver(x,y,16,a,t); + p = FbOver(x,y,24,a,t); return m|n|o|p; } -static CARD32 +CARD32 fbIn (CARD32 x, CARD8 y) { CARD16 a = y; CARD16 t; CARD32 m,n,o,p; - m = IN(x,0,a,t); - n = IN(x,8,a,t); - o = IN(x,16,a,t); - p = IN(x,24,a,t); + m = FbIn(x,0,a,t); + n = FbIn(x,8,a,t); + o = FbIn(x,16,a,t); + p = FbIn(x,24,a,t); return m|n|o|p; } @@ -107,19 +89,19 @@ fbIn (CARD32 x, CARD8 y) * opSRCxMASKxDST */ -static void +void fbCompositeSolidMask_nx8x8888 (CARD8 op, - PicturePtr pSrc, - PicturePtr pMask, - PicturePtr pDst, - INT16 xSrc, - INT16 ySrc, - INT16 xMask, - INT16 yMask, - INT16 xDst, - INT16 yDst, - CARD16 width, - CARD16 height) + PicturePtr pSrc, + PicturePtr pMask, + PicturePtr pDst, + INT16 xSrc, + INT16 ySrc, + INT16 xMask, + INT16 yMask, + INT16 xDst, + INT16 yDst, + CARD16 width, + CARD16 height) { CARD32 src, srca; CARD32 *dstLine, *dst, d, dstMask; @@ -188,7 +170,7 @@ fbCompositeSolidMask_nx8x8888 (CARD8 op, } } -static void +void fbCompositeSolidMask_nx8x0888 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, @@ -273,7 +255,7 @@ fbCompositeSolidMask_nx8x0888 (CARD8 op, } } -static void +void fbCompositeSolidMask_nx8x0565 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, @@ -359,7 +341,7 @@ fbCompositeSolidMask_nx8x0565 (CARD8 op, } } -static void +void fbCompositeSrc_8888x8888 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, @@ -413,7 +395,7 @@ fbCompositeSrc_8888x8888 (CARD8 op, } } -static void +void fbCompositeSrc_8888x0888 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, @@ -471,7 +453,7 @@ fbCompositeSrc_8888x0888 (CARD8 op, } } -static void +void fbCompositeSrc_8888x0565 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, @@ -532,7 +514,7 @@ fbCompositeSrc_8888x0565 (CARD8 op, } } -static void +void fbCompositeSrc_0565x0565 (CARD8 op, PicturePtr pSrc, PicturePtr pMask, @@ -577,6 +559,63 @@ fbCompositeSrc_0565x0565 (CARD8 op, } void +fbCompositeSrcAdd_8000x8000 (CARD8 op, + PicturePtr pSrc, + PicturePtr pMask, + PicturePtr pDst, + INT16 xSrc, + INT16 ySrc, + INT16 xMask, + INT16 yMask, + INT16 xDst, + INT16 yDst, + CARD16 width, + CARD16 height) +{ + CARD8 *dstLine, *dst; + CARD8 *srcLine, *src; + FbBits *dstBits, *srcBits; + FbStride dstStride, srcStride; + int dstBpp, srcBpp; + CARD8 w; + CARD8 s, d; + CARD16 t; + + fbGetDrawable(pSrc->pDrawable, srcBits, srcStride, srcBpp); + srcLine = (CARD8 *) srcBits; + srcStride = srcStride * sizeof (FbBits) / sizeof (CARD8); + srcLine += srcStride * ySrc + xSrc; + + fbGetDrawable(pDst->pDrawable, dstBits, dstStride, dstBpp); + dstLine = (CARD8 *) dstBits; + dstStride = dstStride * sizeof (FbBits) / sizeof (CARD8); + dstLine += dstStride * yDst + xDst; + + while (height--) + { + dst = dstLine; + dstLine += dstStride; + src = srcLine; + srcLine += srcStride; + w = width; + + while (w--) + { + s = *src++; + if (s != 0xff) + { + d = *dst; + t = d + s; + s = t | (0 - (t >> 8)); + } + *dst++ = s; + } + } +} + +# define mod(a,b) ((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b)) + +void fbComposite (CARD8 op, PicturePtr pSrc, PicturePtr pMask, @@ -594,6 +633,10 @@ fbComposite (CARD8 op, int n; BoxPtr pbox; CompositeFunc func; + Bool srcRepeat = pSrc->repeat; + Bool maskRepeat = FALSE; + int x_msk, y_msk, x_src, y_src, x_dst, y_dst; + int w, h, w_this, h_this; xDst += pDst->pDrawable->x; yDst += pDst->pDrawable->y; @@ -603,6 +646,7 @@ fbComposite (CARD8 op, { xMask += pMask->pDrawable->x; yMask += pMask->pDrawable->y; + maskRepeat = pMask->repeat; } if (!miComputeCompositeRegion (®ion, @@ -619,110 +663,160 @@ fbComposite (CARD8 op, height)) return; - func = 0; - if (pMask) - { - if (pMask->repeat) - { - ; - } - else + func = fbCompositeGeneral; + switch (op) { + case PictOpOver: + if (pMask) { - if (pSrc->repeat) + if (srcRepeat && + pSrc->pDrawable->width == 1 && + pSrc->pDrawable->height == 1) { - if (pSrc->pDrawable->width == 1 && - pSrc->pDrawable->height == 1) - { - switch (pSrc->pDrawable->bitsPerPixel) { - case 32: - case 24: - case 16: - switch (pMask->pDrawable->bitsPerPixel) { - case 8: - switch (pDst->pDrawable->bitsPerPixel) { - case 16: - func = fbCompositeSolidMask_nx8x0565; - break; - case 24: - func = fbCompositeSolidMask_nx8x0888; - break; - case 32: - func = fbCompositeSolidMask_nx8x8888; - break; - } + srcRepeat = FALSE; + if (PICT_FORMAT_COLOR(pSrc->format)) { + switch (pMask->format) { + case PICT_a8: + switch (pDst->format) { + case PICT_r5g6b5: + case PICT_b5g6r5: + func = fbCompositeSolidMask_nx8x0565; + break; + case PICT_r8g8b8: + case PICT_b8g8r8: + func = fbCompositeSolidMask_nx8x0888; + break; + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + case PICT_a8b8g8r8: + case PICT_x8b8g8r8: + func = fbCompositeSolidMask_nx8x8888; break; } break; } } - else - { - ; - } - } - else - { - ; - } - } - } - else - { - if (pSrc->repeat) - { - if (pSrc->pDrawable->width == 1 && - pSrc->pDrawable->height == 1) - { - ; - } - else - { - ; } } else { - switch (pSrc->pDrawable->bitsPerPixel) { - case 32: - switch (pDst->pDrawable->bitsPerPixel) { - case 32: + switch (pSrc->format) { + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + switch (pDst->format) { + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + func = fbCompositeSrc_8888x8888; + break; + case PICT_r8g8b8: + func = fbCompositeSrc_8888x0888; + break; + case PICT_r5g6b5: + func = fbCompositeSrc_8888x0565; + break; + } + break; + case PICT_a8b8g8r8: + case PICT_x8b8g8r8: + switch (pDst->format) { + case PICT_a8b8g8r8: + case PICT_x8b8g8r8: func = fbCompositeSrc_8888x8888; break; - case 24: + case PICT_b8g8r8: func = fbCompositeSrc_8888x0888; break; - case 16: + case PICT_b5g6r5: func = fbCompositeSrc_8888x0565; break; } break; - case 16: - switch (pDst->pDrawable->bitsPerPixel) { - case 16: + case PICT_r5g6b5: + switch (pDst->format) { + case PICT_r5g6b5: + func = fbCompositeSrc_0565x0565; + break; + } + break; + case PICT_b5g6r5: + switch (pDst->format) { + case PICT_b5g6r5: func = fbCompositeSrc_0565x0565; break; } break; } } + break; + case PictOpAdd: + if (pMask == 0) + { + switch (pSrc->format) { + case PICT_a8: + switch (pDst->format) { + case PICT_a8: + func = fbCompositeSrcAdd_8000x8000; + break; + } + } + } + break; } - if (func) + n = REGION_NUM_RECTS (®ion); + pbox = REGION_RECTS (®ion); + while (n--) { - n = REGION_NUM_RECTS (®ion); - pbox = REGION_RECTS (®ion); - while (n--) + h = pbox->y2 - pbox->y1; + y_src = pbox->y1 - yDst + ySrc; + y_msk = pbox->y1 - yDst + yMask; + y_dst = pbox->y1; + while (h) { - (*func) (op, pSrc, pMask, pDst, - pbox->x1 - xDst + xSrc, - pbox->y1 - yDst + ySrc, - pbox->x1 - xDst + xMask, - pbox->y1 - yDst + yMask, - pbox->x1, - pbox->y1, - pbox->x2 - pbox->x1, - pbox->y2 - pbox->y1); - pbox++; + h_this = h; + w = pbox->x2 - pbox->x1; + x_src = pbox->x1 - xDst + xSrc; + x_msk = pbox->x1 - xDst + xMask; + x_dst = pbox->x1; + if (maskRepeat) + { + y_msk = mod (y_msk, pMask->pDrawable->height); + if (h_this > pMask->pDrawable->height - y_msk) + h_this = pMask->pDrawable->height - y_msk; + } + if (srcRepeat) + { + y_src = mod (y_src, pSrc->pDrawable->height); + if (h_this > pSrc->pDrawable->height - y_src) + h_this = pSrc->pDrawable->height - y_src; + } + while (w) + { + w_this = w; + if (maskRepeat) + { + x_msk = mod (x_msk, pMask->pDrawable->width); + if (w_this > pMask->pDrawable->width - x_msk) + w_this = pMask->pDrawable->width - x_msk; + } + if (srcRepeat) + { + x_src = mod (x_src, pSrc->pDrawable->width); + if (w_this > pSrc->pDrawable->width - x_src) + w_this = pSrc->pDrawable->width - x_src; + } + (*func) (op, pSrc, pMask, pDst, + x_src, y_src, x_msk, y_msk, x_dst, y_dst, + w_this, h_this); + w -= w_this; + x_src += w_this; + x_msk += w_this; + x_dst += w_this; + } + h -= h_this; + y_src += h_this; + y_msk += h_this; + y_dst += h_this; } + pbox++; } REGION_UNINIT (pDst->pDrawable->pScreen, ®ion); } diff --git a/xc/programs/Xserver/hw/kdrive/kshadow.c b/xc/programs/Xserver/hw/kdrive/kshadow.c index 57796c987..d780a56bc 100644 --- a/xc/programs/Xserver/hw/kdrive/kshadow.c +++ b/xc/programs/Xserver/hw/kdrive/kshadow.c @@ -1,5 +1,5 @@ /* - * $XFree86$ + * $XFree86: xc/programs/Xserver/hw/kdrive/kshadow.c,v 1.3 2000/09/27 20:47:37 keithp Exp $ * * Copyright © 1999 Keith Packard * @@ -30,6 +30,8 @@ KdShadowScreenInit (KdScreenInfo *screen) void *buf; buf = shadowAlloc (screen->width, screen->height, screen->fb[0].bitsPerPixel); + if (!buf) + return FALSE; screen->fb[0].frameBuffer = buf; screen->fb[0].byteStride = BitmapBytePad (screen->width * screen->fb[0].bitsPerPixel); screen->fb[0].pixelStride = screen->fb[0].byteStride * 8 / screen->fb[0].bitsPerPixel; @@ -44,3 +46,10 @@ KdShadowInitScreen (ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc return shadowInit (pScreen, update, window); } + +void +KdShadowScreenFini (KdScreenInfo *screen) +{ + if (screen->fb[0].frameBuffer) + xfree (screen->fb[0].frameBuffer); +} diff --git a/xc/programs/Xserver/hw/kdrive/vesa/Imakefile b/xc/programs/Xserver/hw/kdrive/vesa/Imakefile index b891e70b3..be071fd5c 100644 --- a/xc/programs/Xserver/hw/kdrive/vesa/Imakefile +++ b/xc/programs/Xserver/hw/kdrive/vesa/Imakefile @@ -1,10 +1,10 @@ -XCOMM $XFree86$ +XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/vesa/Imakefile,v 1.3 2000/10/20 00:19:50 keithp Exp $ KDRIVE=.. #include "../Kdrive.tmpl" -SRCS = vesa.c vesainit.c vbe.c +SRCS = vesa.c vesainit.c vbe.c vga.c vm86.c -OBJS = vesa.o vesainit.o vbe.o +OBJS = vesa.o vesainit.o vbe.o vga.o vm86.o INCLUDES = -I. $(KDINCS) diff --git a/xc/programs/Xserver/hw/kdrive/vesa/Xvesa.man b/xc/programs/Xserver/hw/kdrive/vesa/Xvesa.man index 958934aa9..04ae7f154 100644 --- a/xc/programs/Xserver/hw/kdrive/vesa/Xvesa.man +++ b/xc/programs/Xserver/hw/kdrive/vesa/Xvesa.man @@ -1,4 +1,4 @@ -.\" $XFree86$ +.\" $XFree86: xc/programs/Xserver/hw/kdrive/vesa/Xvesa.man,v 1.3 2000/10/20 00:19:50 keithp Exp $ .TH Xvesa 1 .SH NAME Xvesa \- VESA VBE tiny X server @@ -11,10 +11,13 @@ Xvesa \- VESA VBE tiny X server is a generic X server for Linux on the x86 platform. .B Xvesa doesn't know about any particular hardware, and sets the video mode by -running the video BIOS in VM86 mode. +running the video BIOS in VM86 mode. .B Xvesa therefore runs untrusted code with full priviledges, and is one of the most insecure X servers available. +.B Xvesa +uses both standard VGA BIOS modes and any modes advertised by a VESA 2.0 +BIOS if available. .B Run at your own risk. .SH OPTIONS In addition to the normal tiny-X server's options (to be described in @@ -28,9 +31,9 @@ specifies the VESA video mode to use. If mode is not supported by your BIOS and hardware, .B Xvesa will fail, hang your system, or make your monitor explode; you are on -your own. This option is ignored if the +your own. This option overrides any .B -screen -option was used. +options. .TP 8 .B -listmodes tells the server to list all supported video modes. If @@ -55,8 +58,11 @@ don't use a linear framebuffer even if one is available. You don't want to use this option. .TP 8 .B -swaprgb -pass RGB values in the order that works on my machine. Use this if +pass RGB values in the order that works on broken BIOSes. Use this if the colours are wrong in PseudoColor modes. +.TP 8 +.B -verbose +emit diagnostic messages during BIOS initialization and teardown. .SH KEYBOARD Xvesa handles the keyboard in the same manner as the .B Xfbdev @@ -69,10 +75,17 @@ assumed to be buggy. Allowing your users to run is a major security hole. Allowing yourself to run .B Xvesa is probably a mistake. +.B Xvesa +records the current BIOS mode when it starts and restores that mode on +termination; if the video card has been reprogrammed by another application, +the display will almost certainly be trashed. The alternative of saving and +restoring the complete video card state has proven unreliable on most video +cards. .SH SEE ALSO X(1), Xserver(1), xdm(1), xinit(1), Xfbdev(1). .SH AUTHORS The tiny-X server was written by Keith Packard, and the VESA driver was added by Juliusz Chroboczek who didn't realise what he was doing until it was too late. Tiny-X uses code from XFree86, which in turn -is based on the Sample Implementation. +is based on the Sample Implementation. Keith Packard then added support for +standard VGA BIOS modes and is especially proud of 320x200 16 color mode. diff --git a/xc/programs/Xserver/hw/kdrive/vesa/vbe.c b/xc/programs/Xserver/hw/kdrive/vesa/vbe.c index fecb05803..8bd35b4b4 100644 --- a/xc/programs/Xserver/hw/kdrive/vesa/vbe.c +++ b/xc/programs/Xserver/hw/kdrive/vesa/vbe.c @@ -19,537 +19,409 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86$ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vbe.c,v 1.6 2000/10/20 00:19:50 keithp Exp $ */ -#include <stdlib.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/mman.h> -#include <sys/vm86.h> -#include <sys/io.h> -#include "vbe.h" +#include "vesa.h" -#ifdef NOT_IN_X_SERVER -#include <stdio.h> -#include <stdarg.h> -#include <malloc.h> -static void ErrorF(char*, ...); -#define xalloc(a) malloc(a) -#define xcalloc(a,b) calloc(a,b) -#define xfree(a) free(a) -#else -#include "X.h" -#include "Xproto.h" -#include "Xos.h" -#include "os.h" -#endif - -static int vm86old(struct vm86_struct *vms); -static int vm86_loop(VbeInfoPtr vi); - -static U8 rev_ints[32] = -{ 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0x80, -}; - -static U8 retcode_data[2] = -{ 0xCD, 0xFF }; - -#define LM(vi,i) (((char*)vi->loMem)[i-LOMEM_BASE]) -#define LMW(vi,i) (*(U16*)(&LM(vi,i))) -#define LML(vi,i) (*(U32*)(&LM(vi,i))) -#define MM(vi,i) (((char*)vi->magicMem)[i-MAGICMEM_BASE]) -#define MMW(vi,i) (*(U16*)(&MM(vi,i))) -#define MML(vi,i) (*(U32*)(&MM(vi,i))) -#define HM(vi,i) (((char*)vi->hiMem)[i-HIMEM_BASE]) -#define HMW(vi,i) (*(U16*)(&MM(vi,i))) -#define HML(vi,i) (*(U32*)(&MM(vi,i))) - -#define PUSHW(vi, i) \ -{ vi->vms.regs.esp -= 2;\ - LMW(vi,MAKE_POINTER(vi->vms.regs.ss, vi->vms.regs.esp)) = i;} - -VbeInfoPtr -VbeSetup() +int +VbeGetVib (Vm86InfoPtr vi, VbeInfoBlock *vib) { - int devmem = -1, devzero = -1; - void *magicMem, *loMem, *hiMem; - U32 stack_base, vib_base, vmib_base, ret_code; - VbeInfoPtr vi = NULL; - - devmem = open("/dev/mem", O_RDWR); - if(devmem < 0) { - perror("open /dev/mem"); - goto fail; - } - - devzero = open("/dev/zero", O_RDWR); - if(devmem < 0) { - perror("open /dev/zero"); - goto fail; - } - - - magicMem = mmap((void*)MAGICMEM_BASE, MAGICMEM_SIZE, - PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_PRIVATE | MAP_FIXED, devmem, MAGICMEM_BASE); - if(magicMem == MAP_FAILED) { - ErrorF("Couldn't map magic memory\n"); - goto fail; - } - - loMem = mmap((void*)LOMEM_BASE, LOMEM_SIZE, - PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_PRIVATE | MAP_FIXED, devzero, LOMEM_BASE); - if(loMem == MAP_FAILED) { - ErrorF("Couldn't map low memory\n"); - munmap(magicMem, MAGICMEM_SIZE); - goto fail; - } - - hiMem = mmap((void*)HIMEM_BASE, HIMEM_SIZE, - PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_SHARED | MAP_FIXED, - devmem, HIMEM_BASE); - if(hiMem == MAP_FAILED) { - ErrorF("Couldn't map high memory\n"); - munmap(magicMem, MAGICMEM_SIZE); - munmap(loMem, LOMEM_SIZE); - goto fail; + int code; + int mark; + int vib_base; + VbeInfoBlock *vib_low; + + mark = Vm86MarkMemory (vi); + vib_base = Vm86AllocateMemory (vi, sizeof (VbeInfoBlock)); + vib_low = (VbeInfoBlock*)&(LM(vi, vib_base)); + vi->vms.regs.eax = 0x4F00; + vi->vms.regs.es = POINTER_SEGMENT(vib_base); + vi->vms.regs.edi = POINTER_OFFSET(vib_base); + memcpy(vib_low->VbeSignature, "VBE2", 4); + code = VbeDoInterrupt10(vi); + if(code >= 0) + { + if(memcmp(vib_low->VbeSignature, "VESA", 4) == 0) + *vib = *vib_low; + else + code = -1; } + Vm86ReleaseMemory (vi, mark); + return code; +} - vi = xalloc(sizeof(VbeInfoRec)); - if (!vi) - goto unmapfail; - - vi->devmem = devmem; - vi->devzero = devzero; - vi->magicMem = magicMem; - vi->loMem = loMem; - vi->hiMem = hiMem; - vi->brk = LOMEM_BASE; - - stack_base = VbeAllocateMemory(vi, STACK_SIZE); - if(stack_base == ALLOC_FAIL) - goto unmapfail; - ret_code = VbeAllocateMemory(vi, sizeof(retcode_data)); - if(ret_code == ALLOC_FAIL) - goto unmapfail; - vib_base = VbeAllocateMemory(vi, sizeof(VbeInfoBlock)); - if(vib_base == ALLOC_FAIL) - goto unmapfail; - vmib_base = VbeAllocateMemory(vi, sizeof(VbeModeInfoBlock)); - if(vmib_base == ALLOC_FAIL) - goto unmapfail; - - vi->stack_base = stack_base; - vi->ret_code = ret_code; - vi->vib_base = vib_base; - vi->vmib_base = vmib_base; - vi->statebuffer_base = ~0; - vi->palette_scratch_base = ~0; - vi->palette_format = 6; - vi->palette_wait = 0; - vi->windowA_offset = vi->windowB_offset = -1; - vi->last_window = 1; - vi->vga_palette = 1; +int +VbeGetVmib (Vm86InfoPtr vi, int mode, VbeModeInfoBlock *vmib) +{ + int code; + int mark; + int vib_base; + int vmib_base; + VbeModeInfoBlock *vmib_low; - memset(&vi->vms, 0, sizeof(struct vm86_struct)); - vi->vms.flags = 0; - vi->vms.screen_bitmap = 0; - vi->vms.cpu_type = CPU_586; - memcpy(&vi->vms.int_revectored, rev_ints, sizeof(rev_ints)); - - ioperm(0, 0x400, 1); - iopl(3); - - return vi; - - unmapfail: - munmap(magicMem, MAGICMEM_SIZE); - munmap(loMem, LOMEM_SIZE); - munmap(hiMem, HIMEM_SIZE); - fail: - if(devmem >= 0) - close(devmem); - if(devzero >= 0) - close(devzero); - if(vi) - xfree(vi); - return NULL; + mark = Vm86MarkMemory (vi); + + vmib_base = Vm86AllocateMemory (vi, sizeof (VbeModeInfoBlock)); + vmib_low = (VbeModeInfoBlock*)&(LM(vi, vmib_base)); + + vi->vms.regs.eax = 0x4F01; + vi->vms.regs.ecx = mode&0xFFFF; + vi->vms.regs.es = POINTER_SEGMENT(vmib_base); + vi->vms.regs.edi = POINTER_OFFSET(vmib_base); + code = VbeDoInterrupt10(vi); + + if(code >= 0) + *vmib = *vmib_low; + Vm86ReleaseMemory (vi, mark); + return code; } void -VbeCleanup(VbeInfoPtr vi) +VbeReportInfo (Vm86InfoPtr vi) { - munmap(vi->magicMem, MAGICMEM_SIZE); - munmap(vi->loMem, LOMEM_SIZE); - munmap(vi->hiMem, HIMEM_SIZE); - xfree(vi); -} + VbeInfoBlock vib; + int code; -VbeInfoBlock * -VbeGetInfo(VbeInfoPtr vi) -{ - int code; - VbeInfoBlock *vib = (VbeInfoBlock*)&(LM(vi, vi->vib_base)); - vi->vms.regs.eax = 0x4F00; - vi->vms.regs.es = POINTER_SEGMENT(vi->vib_base); - vi->vms.regs.edi = POINTER_OFFSET(vi->vib_base); - memcpy(vib->VbeSignature, "VBE2", 4); - code = VbeDoInterrupt10(vi); - if(code < 0) - return NULL; - if(memcmp(vib->VbeSignature, "VESA", 4) != 0) { - ErrorF("Int 10 didn't return VESA signature in info block"); - return NULL; - } - return vib; + code = VbeGetVib (vi, &vib); + if (code >= 0) + VbeReportVib(vi, &vib); } -VbeModeInfoBlock * -VbeGetModeInfo(VbeInfoPtr vi, int mode) +int +VbeGetNmode (Vm86InfoPtr vi) { - int code; - U32 p; - VbeInfoBlock *vib = (VbeInfoBlock*)&(LM(vi, vi->vib_base)); - VbeModeInfoBlock *vmib = (VbeModeInfoBlock*)&(LM(vi, vi->vmib_base)); - p = MAKE_POINTER_1(vib->VideoModePtr); - if(!VbeIsMemory(vi, p)) { - ErrorF("VideoModePtr 0x%08X doesn't point at low memory\n", - vib->VideoModePtr); - return NULL; + VbeInfoBlock vib; + int code; + int ret = 0; + unsigned int p; + int n; + int mode; + + code = VbeGetVib (vi, &vib); + if (code >= 0) + { + p = MAKE_POINTER_1(vib.VideoModePtr); + for (n = 0; ; n++) + { + mode = Vm86MemoryW(vi, p); + if (mode == 0xffff) + break; + p += 2; + } + code = n; } - vi->vms.regs.eax = 0x4F01; - vi->vms.regs.ecx = mode&0xFFFF; - vi->vms.regs.es = POINTER_SEGMENT(vi->vmib_base); - vi->vms.regs.edi = POINTER_OFFSET(vi->vmib_base); - code = VbeDoInterrupt10(vi); - if(code < 0) - return NULL; - else - return vmib; + return code; } int -VbeSetMode(VbeInfoPtr vi, int mode, int linear) +VbeGetModes (Vm86InfoPtr vi, VesaModePtr modes, int nmode) { - int code; + VbeInfoBlock vib; + int code; + int ret = 0; + unsigned int p; + int n; + int mode; + VbeModeInfoBlock vmib; - vi->windowA_offset = vi->windowB_offset = -1; - vi->last_window = 1; + code = VbeGetVib (vi, &vib); + if (code < 0) + return code; + + memset (modes, '\0', n * sizeof (VesaModeRec)); - vi->vms.regs.eax = 0x4F02; - vi->vms.regs.ebx = (mode & 0xFFFF) | 0x8000; - if(linear) - vi->vms.regs.ebx |= 0x4000; - code = VbeDoInterrupt10(vi); - if(code < 0) - return -1; - return 0; + p = MAKE_POINTER_1(vib.VideoModePtr); + for (n = 0; n < nmode; n++) + { + mode = Vm86MemoryW(vi, p); + if (mode == 0xffff) + break; + modes[n].mode = mode; + modes[n].vbe = 1; + p += 2; + } + + nmode = n; + + for (n = 0; n < nmode; n++) + { + code = VbeGetVmib (vi, modes[n].mode, &vmib); + if (code >= 0) + { + modes[n].ModeAttributes = vmib.ModeAttributes; + modes[n].NumberOfPlanes = vmib.NumberOfPlanes; + modes[n].BitsPerPixel = vmib.BitsPerPixel; + modes[n].MemoryModel = vmib.MemoryModel; + modes[n].RedMaskSize = vmib.RedMaskSize; + modes[n].RedFieldPosition = vmib.RedFieldPosition; + modes[n].GreenMaskSize = vmib.GreenMaskSize; + modes[n].GreenFieldPosition = vmib.GreenFieldPosition; + modes[n].BlueMaskSize = vmib.BlueMaskSize; + modes[n].BlueFieldPosition = vmib.BlueFieldPosition; + modes[n].RsvdMaskSize = vmib.RsvdMaskSize; + modes[n].RsvdFieldPosition = vmib.RsvdFieldPosition; + modes[n].DirectColorModeInfo = vmib.DirectColorModeInfo; + modes[n].XResolution = vmib.XResolution; + modes[n].YResolution = vmib.YResolution; + modes[n].BytesPerScanLine = vmib.BytesPerScanLine; + } + } + + return nmode; } -int -VbeGetMode(VbeInfoPtr vi, int *mode) +VbeInfoPtr +VbeInit (Vm86InfoPtr vi) { - int code; - vi->vms.regs.eax = 0x4F03; - code = VbeDoInterrupt10(vi); - if(code < 0) - return - 1; - *mode = vi->vms.regs.ebx & 0xFFFF; - return 0; -} + VbeInfoPtr vbe; + int code; + VbeInfoBlock vib; -int -VbeSetupStateBuffer(VbeInfoPtr vi) -{ - int code; - if(vi->statebuffer_base != ~0) - return 0; - vi->vms.regs.eax = 0x4F04; - vi->vms.regs.edx = 0x0000; - vi->vms.regs.ecx = 0x000F; - code = VbeDoInterrupt10(vi); - if(code < 0) - return -1; - vi->statebuffer_base = VbeAllocateMemory(vi, vi->vms.regs.ebx & 0xFFFF); - return 0; + code = VbeGetVib (vi, &vib); + if (code < 0) + return 0; + + vbe = xalloc (sizeof (VbeInfoRec)); + if (!vbe) + return 0; + vbe->palette_format = 6; + vbe->palette_wait = TRUE; + return vbe; } -int -VbeSaveState(VbeInfoPtr vi) +void +VbeCleanup (Vm86InfoPtr vi, VbeInfoPtr vbe) { - int code; - code = VbeSetupStateBuffer(vi); - if(code < 0) - return -1; - vi->vms.regs.eax = 0x4F04; - vi->vms.regs.edx = 0x0001; - vi->vms.regs.ecx = 0x000F; - vi->vms.regs.es = POINTER_SEGMENT(vi->statebuffer_base); - vi->vms.regs.ebx = POINTER_OFFSET(vi->statebuffer_base); - code = VbeDoInterrupt10(vi); - if(code < 0) - return -1; - return 0; + xfree (vbe); } int -VbeRestoreState(VbeInfoPtr vi) +VbeSetMode (Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int linear) { - int code; - vi->vms.regs.eax = 0x4F04; - vi->vms.regs.edx = 0x0002; - vi->vms.regs.ecx = 0x000F; - vi->vms.regs.es = POINTER_SEGMENT(vi->statebuffer_base); - vi->vms.regs.ebx = POINTER_OFFSET(vi->statebuffer_base); + int code; + VbeInfoBlock vib; + int palette_wait = 0, palette_hi = 0; + + code = VbeGetVib (vi, &vib); + if (code < 0) + return -1; + + code = VbeGetVmib (vi, mode, &vbe->vmib); + if (code < 0) + return -1; + + mode = (mode & 0xffff) | 0x8000; + if (linear) + mode |= 0x4000; + + vi->vms.regs.eax = 0x4F02; + vi->vms.regs.ebx = mode; code = VbeDoInterrupt10(vi); if(code < 0) return -1; + + vbe->windowA_offset = vbe->windowB_offset = -1; + vbe->last_window = 1; + + if(vib.Capabilities[0] & 1) + palette_hi = 1; + if(vib.Capabilities[0] & 4) + palette_wait = 1; + + if(palette_hi || palette_wait) + VbeSetPaletteOptions(vi, vbe, palette_hi?8:6, palette_wait); + return 0; } -int -VbeSetTextMode(VbeInfoPtr vi, int mode) +int +VbeGetMode(Vm86InfoPtr vi, int *mode) { int code; - vi->vms.regs.eax = mode & 0x7f; + vi->vms.regs.eax = 0x4F03; code = VbeDoInterrupt10(vi); if(code < 0) - return -1; + return - 1; + *mode = vi->vms.regs.ebx & 0xFFFF; return 0; } void * -VbeMapFramebuffer(VbeInfoPtr vi, - VbeModeInfoBlock *vmib) -{ - U8 *fb; - VbeInfoBlock *vib = (VbeInfoBlock*)&(LM(vi, vi->vib_base)); - int size; - int pagesize = getpagesize(), before, after; - - size = 1024 * 64L * vib->TotalMemory; +VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *ret_size) +{ + U8 *fb; + VbeInfoBlock vib; + VbeModeInfoBlock vmib; + int size; + int pagesize = getpagesize(); + int before, after; + int devmem; + + if (VbeGetVib (vi, &vib) < 0) + return 0; + + if (VbeGetVmib (vi, mode, &vmib) < 0) + return 0; + + size = 1024 * 64L * vib.TotalMemory; + + *ret_size = size; - before = vmib->PhysBasePtr % pagesize; - after = pagesize - ((vmib->PhysBasePtr + size) % pagesize); + before = vmib.PhysBasePtr % pagesize; + after = pagesize - ((vmib.PhysBasePtr + size) % pagesize); if(after == pagesize) after = 0; - fb = mmap(0, before + size + after, - PROT_READ | PROT_WRITE, MAP_SHARED, - vi->devmem, vmib->PhysBasePtr - before); - if(fb == MAP_FAILED) { - ErrorF("Failed to map framebuffer: %d\n", errno); + fb = KdMapDevice (vmib.PhysBasePtr - before, before + size + after); + + if(fb == 0) + { + ErrorF("Failed to map framebuffer\n"); return NULL; } return fb + before; } -int -VbeUnmapFramebuffer(VbeInfoPtr vi, - VbeModeInfoBlock *vmib, - void *fb) +void +VbeUnmapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, void *fb) { - int code; - VbeInfoBlock *vib = (VbeInfoBlock*)&(LM(vi, vi->vib_base)); - int size; - int pagesize = getpagesize(), before, after; + VbeInfoBlock vib; + VbeModeInfoBlock vmib; + int size; + int pagesize = getpagesize(); + int before, after; - size = 1024 * 64L * vib->TotalMemory; + if (VbeGetVib (vi, &vib) < 0) + return; + + if (VbeGetVmib (vi, mode, &vmib) < 0) + return; + + size = 1024 * 64L * vib.TotalMemory; - before = vmib->PhysBasePtr % pagesize; - after = pagesize - ((vmib->PhysBasePtr + size) % pagesize); + before = vmib.PhysBasePtr % pagesize; + after = pagesize - ((vmib.PhysBasePtr + size) % pagesize); if(after == pagesize) after = 0; fb = (void *) ((char *) fb - before); - code = munmap(fb, before + size + after); - if(code) { - ErrorF("Couldn't unmap framebuffer: %d\n", errno); - return -1; - } - return 0; -} - -static int -PreparePalette(VbeInfoPtr vi) -{ - int code; - if(vi->palette_scratch_base == ~0) { - vi->palette_scratch_base = VbeAllocateMemory(vi, 4*256); - if(vi->palette_scratch_base == ALLOC_FAIL) { - ErrorF("Couldn't allocate scratch area for palette transfer\n"); - return -1; - } - } - if(!vi->palette_format) { - /* This isn't used currently */ - vi->vms.regs.eax = 0x4F08; - vi->vms.regs.ebx = 0x01; - code = VbeDoInterrupt10(vi); - if(code < 0) - return -1; - vi->palette_format = vi->vms.regs.ebx & 0xFF; - } - return 0; + KdUnmapDevice (fb, before + size + after); } int -VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries) +VbeSetPalette(Vm86InfoPtr vi, VbeInfoPtr vbe, int first, int number, U8 *entries) { - U8 *palette_scratch; - int i, j, code; + U8 *palette_scratch; + int mark; + int palette_base; + int i, j, code; if(number == 0) return 0; - code = PreparePalette(vi); - if(code < 0) - return -1; - if(first < 0 || number < 0 || first + number > 256) { ErrorF("Cannot set %d, %d palette entries\n", first, number); return -1; } - palette_scratch = &LM(vi, vi->palette_scratch_base); - - if(vi->palette_format < 6 || vi->palette_format > 8) { - ErrorF("Impossible palette format %d\n", vi->palette_format); + if(vbe->palette_format < 6 || vbe->palette_format > 8) { + ErrorF("Impossible palette format %d\n", vbe->palette_format); return -1; } - if (vi->vga_palette) - { - vi->vms.regs.eax = 0x1012; - vi->vms.regs.ebx = first; - vi->vms.regs.ecx = number; - vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base); - vi->vms.regs.edx = POINTER_OFFSET(vi->palette_scratch_base); - j = 0; - i = 0; - while (number--) - { - palette_scratch[j++] = entries[i++] >> (8-vi->palette_format); - palette_scratch[j++] = entries[i++] >> (8-vi->palette_format); - palette_scratch[j++] = entries[i++] >> (8-vi->palette_format); - i++; - } - } + mark = Vm86MarkMemory (vi); + palette_base = Vm86AllocateMemory (vi, 4 * 256); + + palette_scratch = &LM(vi, palette_base); + + for(i=0; i<number*4; i++) + palette_scratch[i] = entries[i] >> (8 - vbe->palette_format); + + vi->vms.regs.eax = 0x4F09; + if(vbe->palette_wait) + vi->vms.regs.ebx = 0x80; else - { - for(i=0; i<number*4; i++) - palette_scratch[i] = entries[i] >> (8 - vi->palette_format); - - vi->vms.regs.eax = 0x4F09; - if(vi->palette_wait) - vi->vms.regs.ebx = 0x80; - else - vi->vms.regs.ebx = 0x00; - vi->vms.regs.ecx = number; - vi->vms.regs.edx = first; - vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base); - vi->vms.regs.edi = POINTER_OFFSET(vi->palette_scratch_base); - } + vi->vms.regs.ebx = 0x00; + vi->vms.regs.ecx = number; + vi->vms.regs.edx = first; + vi->vms.regs.es = POINTER_SEGMENT(palette_base); + vi->vms.regs.edi = POINTER_OFFSET(palette_base); code = VbeDoInterrupt10(vi); + Vm86ReleaseMemory (vi, mark); + if(code < 0) return -1; return 0; -} +} int -VbeGetPalette(VbeInfoPtr vi, int first, int number, U8 *entries) +VbeGetPalette(Vm86InfoPtr vi, VbeInfoPtr vbe, int first, int number, U8 *entries) { - U8 *palette_scratch; - int i, j, code; + U8 *palette_scratch; + int mark; + int palette_base; + int i, j, code; - code = PreparePalette(vi); - if(code < 0) - return -1; + if(number == 0) + return 0; - if(first< 0 || number < 0 || first + number > 256) { + if(first < 0 || number < 0 || first + number > 256) { ErrorF("Cannot get %d, %d palette entries\n", first, number); return -1; } - palette_scratch = &LM(vi, vi->palette_scratch_base); - - if(vi->palette_format < 6 || vi->palette_format > 8) { - ErrorF("Impossible palette format %d\n", vi->palette_format); + if(vbe->palette_format < 6 || vbe->palette_format > 8) { + ErrorF("Impossible palette format %d\n", vbe->palette_format); return -1; } -retry: - if (vi->vga_palette) - { - vi->vms.regs.eax = 0x1017; - vi->vms.regs.ebx = first; - vi->vms.regs.ecx = number; - vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base); - vi->vms.regs.edx = POINTER_OFFSET(vi->palette_scratch_base); - code = VbeDoInterrupt10(vi); - if(code < 0) - return -1; - j = 0; - i = 0; - while (number--) - { - entries[i++] = palette_scratch[j++] << (8-vi->palette_format); - entries[i++] = palette_scratch[j++] << (8-vi->palette_format); - entries[i++] = palette_scratch[j++] << (8-vi->palette_format); - entries[i++] = 0; - } - } - else - { - vi->vms.regs.eax = 0x4F09; - vi->vms.regs.ebx = 0x01; - vi->vms.regs.ecx = number; - vi->vms.regs.edx = first; - vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base); - vi->vms.regs.edi = POINTER_OFFSET(vi->palette_scratch_base); - code = VbeDoInterrupt10(vi); - if(code < 0) - { - vi->vga_palette = TRUE; - goto retry; - } + mark = Vm86MarkMemory (vi); + palette_base = Vm86AllocateMemory (vi, 4 * 256); + palette_scratch = &LM(vi, palette_base); + + vi->vms.regs.eax = 0x4F09; + vi->vms.regs.ebx = 0x01; + vi->vms.regs.ecx = number; + vi->vms.regs.edx = first; + vi->vms.regs.es = POINTER_SEGMENT(palette_base); + vi->vms.regs.edi = POINTER_OFFSET(palette_base); + code = VbeDoInterrupt10(vi); + if(code >= 0) + { for(i=0; i<number*4; i++) - entries[i] = palette_scratch[i] << (8-vi->palette_format); + entries[i] = palette_scratch[i] << (8-vbe->palette_format); } + Vm86ReleaseMemory (vi, mark); return 0; } int -VbeSetPaletteOptions(VbeInfoPtr vi, U8 bits, int wait) +VbeSetPaletteOptions(Vm86InfoPtr vi, VbeInfoPtr vbe, U8 bits, int wait) { int code; + if(bits < 6 || bits > 8) { - ErrorF("Impossible palette format %d\n", vi->palette_format); + ErrorF("Impossible palette format %d\n", bits); return -1; } - if(bits != vi->palette_format) { - vi->palette_format = 0; + if(bits != vbe->palette_format) + { + vbe->palette_format = 0; vi->vms.regs.eax = 0x4F08; vi->vms.regs.ebx = bits << 8; code = VbeDoInterrupt10(vi); if(code < 0) return -1; - vi->palette_format = bits; + vbe->palette_format = bits; } - vi->palette_wait = wait; + vbe->palette_wait = wait; return 0; } static int -VbeReallySetWindow(VbeInfoPtr vi, U8 window, U16 winnum) +VbeReallySetWindow(Vm86InfoPtr vi, U8 window, U16 winnum) { int code; vi->vms.regs.eax = 0x4F05; @@ -562,82 +434,66 @@ VbeReallySetWindow(VbeInfoPtr vi, U8 window, U16 winnum) } void * -VbeSetWindow(VbeInfoPtr vi, int offset, int purpose, int *size_return) +VbeSetWindow(Vm86InfoPtr vi, VbeInfoPtr vbe, int offset, int purpose, int *size_return) { - VbeModeInfoBlock *vmib = (VbeModeInfoBlock*)&(LM(vi, vi->vmib_base)); - int window_size = vmib->WinSize * 1024; + int window_size = vbe->vmib.WinSize * 1024; int code; int winnum; - if(vi->windowA_offset >= 0) - if(vi->windowA_offset <= offset && vi->windowA_offset + window_size > offset) - if(vmib->WinAAttributes & purpose) - goto windowA; + if(vbe->windowA_offset >= 0) + if(vbe->windowA_offset <= offset && vbe->windowA_offset + window_size > offset) + if(vbe->vmib.WinAAttributes & purpose) + goto windowA; - if(vi->windowB_offset >= 0) - if(vi->windowB_offset <= offset && vi->windowB_offset + window_size > offset) - if(vmib->WinBAttributes & purpose) - goto windowB; + if(vbe->windowB_offset >= 0) + if(vbe->windowB_offset <= offset && vbe->windowB_offset + window_size > offset) + if(vbe->vmib.WinBAttributes & purpose) + goto windowB; - if(!(vmib->WinBAttributes & purpose) || - !(vmib->WinBAttributes & VBE_WINDOW_RELOCATE)) - goto set_windowA; + if(!(vbe->vmib.WinBAttributes & purpose) || + !(vbe->vmib.WinBAttributes & VBE_WINDOW_RELOCATE)) + goto set_windowA; - if(!(vmib->WinAAttributes & purpose) || - !(vmib->WinAAttributes & VBE_WINDOW_RELOCATE)) - goto set_windowB; + if(!(vbe->vmib.WinAAttributes & purpose) || + !(vbe->vmib.WinAAttributes & VBE_WINDOW_RELOCATE)) + goto set_windowB; - if(vi->last_window) - goto set_windowA; + if(vbe->last_window) + goto set_windowA; else - goto set_windowB; + goto set_windowB; - set_windowA: - winnum = offset / (vmib->WinGranularity * 1024); +set_windowA: + winnum = offset / (vbe->vmib.WinGranularity * 1024); code = VbeReallySetWindow(vi, 0, winnum); if(code < 0) { - ErrorF("Couldn't set window A to %d*%d\n", - (int)winnum, (int)vmib->WinGranularity); - return NULL; - } - vi->windowA_offset = winnum * vmib->WinGranularity * 1024; - windowA: - vi->last_window = 0; - *size_return = vmib->WinSize * 1024 - (offset - vi->windowA_offset); - return ((U8*)&(LM(vi, MAKE_POINTER(vmib->WinASegment, 0)))) + - offset - vi->windowA_offset; - - set_windowB: - winnum = offset / (vmib->WinGranularity * 1024); + ErrorF("Couldn't set window A to %d*%d\n", + (int)winnum, (int)vbe->vmib.WinGranularity); + return NULL; + } + vbe->windowA_offset = winnum * vbe->vmib.WinGranularity * 1024; +windowA: + vbe->last_window = 0; + *size_return = vbe->vmib.WinSize * 1024 - (offset - vbe->windowA_offset); + return ((U8*)&(LM(vi, MAKE_POINTER(vbe->vmib.WinASegment, 0)))) + offset - vbe->windowA_offset; + +set_windowB: + winnum = offset / (vbe->vmib.WinGranularity * 1024); code = VbeReallySetWindow(vi, 1, winnum); if(code < 0) { - ErrorF("Couldn't set window B to %d*%d\n", - (int)winnum, (int)vmib->WinGranularity); - return NULL; + ErrorF("Couldn't set window B to %d*%d\n", + (int)winnum, (int)vbe->vmib.WinGranularity); + return NULL; } - vi->windowB_offset = winnum * vmib->WinGranularity * 1024; - windowB: - vi->last_window = 1; - *size_return = vmib->WinSize * 1024 - (offset - vi->windowB_offset); - return ((U8*)&(LM(vi, MAKE_POINTER(vmib->WinBSegment, 0)))) + offset - vi->windowB_offset; -} - -int -VbeSetWritePlaneMask(VbeInfoPtr vi, int mask) -{ - asm volatile ("outb %b0,%w1" : : "a" (2), "d" (0x3c4)); - asm volatile ("outb %b0,%w1" : : "a" (mask), "d" (0x3c5)); -} - -int -VbeSetReadPlaneMap(VbeInfoPtr vi, int map) -{ - asm volatile ("outb %b0,%w1" : : "a" (4), "d" (0x3ce)); - asm volatile ("outb %b0,%w1" : : "a" (map), "d" (0x3cf)); + vbe->windowB_offset = winnum * vbe->vmib.WinGranularity * 1024; +windowB: + vbe->last_window = 1; + *size_return = vbe->vmib.WinSize * 1024 - (offset - vbe->windowB_offset); + return ((U8*)&(LM(vi, MAKE_POINTER(vbe->vmib.WinBSegment, 0)))) + offset - vbe->windowB_offset; } int -VbeReportInfo(VbeInfoPtr vi, VbeInfoBlock *vib) +VbeReportVib(Vm86InfoPtr vi, VbeInfoBlock *vib) { U32 i, p; unsigned char c; @@ -647,9 +503,10 @@ VbeReportInfo(VbeInfoPtr vi, VbeInfoBlock *vib) (vib->VbeVersion & 0xFF)+'0'); p = vib->OemStringPtr; for(i = 0; 1; i++) { - c = VbeMemory(vi, MAKE_POINTER_1(p+i)); + c = Vm86Memory(vi, MAKE_POINTER_1(p+i)); if(!c) break; - ErrorF("%c", c); + if (c >= ' ') + ErrorF("%c", c); if (i > 32000) { error = 1; break; @@ -667,7 +524,7 @@ VbeReportInfo(VbeInfoPtr vi, VbeInfoBlock *vib) } int -VbeReportModeInfo(VbeInfoPtr vi, U16 mode, VbeModeInfoBlock *vmib) +VbeReportModeInfo(Vm86InfoPtr vi, U16 mode, VbeModeInfoBlock *vmib) { int supported = (vmib->ModeAttributes&0x1)?1:0; int colour = (vmib->ModeAttributes&0x8)?1:0; @@ -723,526 +580,43 @@ VbeReportModeInfo(VbeInfoPtr vi, U16 mode, VbeModeInfoBlock *vmib) ErrorF("\n"); return 0; } + int -VbeDoInterrupt10(VbeInfoPtr vi) +VbeDoInterrupt10(Vm86InfoPtr vi) { int code; int oldax; oldax = vi->vms.regs.eax & 0xFFFF; - code = VbeDoInterrupt(vi, 0x10); - + code = Vm86DoInterrupt(vi, 0x10); if(code < 0) - return -1; + return -1; if((vi->vms.regs.eax & 0xFFFF) != 0x4F && (oldax & 0xFF00) == 0x4F00) { - ErrorF("Int 10h (0x%04X) failed: 0x%04X", - oldax, vi->vms.regs.eax & 0xFFFF); - if((oldax & 0xFF00) == 0x4F00) { - switch((vi->vms.regs.eax & 0xFF00)>>8) { - case 0: - ErrorF(" (success)\n"); - break; - case 1: - ErrorF(" (function call failed)\n"); - break; - case 2: - ErrorF(" (function not supported on this hardware)\n"); - break; - case 3: - ErrorF(" (function call invalid in this video mode)\n"); - break; - default: - ErrorF(" (unknown error)\n"); - break; - } - return -1; - } else { - ErrorF("\n"); - } + ErrorF("Int 10h (0x%04X) failed: 0x%04X", + oldax, vi->vms.regs.eax & 0xFFFF); + if((oldax & 0xFF00) == 0x4F00) { + switch((vi->vms.regs.eax & 0xFF00)>>8) { + case 0: + ErrorF(" (success)\n"); + return 0; + case 1: + ErrorF(" (function call failed)\n"); + break; + case 2: + ErrorF(" (function not supported on this hardware)\n"); + break; + case 3: + ErrorF(" (function call invalid in this video mode)\n"); + break; + default: + ErrorF(" (unknown error)\n"); + break; + } return -1; + } else { + ErrorF("\n"); + } } return code; } - -int -VbeDoInterrupt(VbeInfoPtr vi, int num) -{ - U16 seg, off; - int code; - - if(num < 0 || num>256) { - ErrorF("Interrupt %d doesn't exist\n"); - return -1; - } - seg = MMW(vi,num * 4 + 2); - off = MMW(vi,num * 4); - if(MAKE_POINTER(seg, off) < ROM_BASE || - MAKE_POINTER(seg, off) >= ROM_BASE + ROM_SIZE) { - ErrorF("Interrupt pointer doesn't point at ROM\n"); - return -1; - } - memcpy(&(LM(vi,vi->ret_code)), retcode_data, sizeof(retcode_data)); - vi->vms.regs.eflags = IF_MASK | IOPL_MASK; - vi->vms.regs.ss = POINTER_SEGMENT(vi->stack_base); - vi->vms.regs.esp = STACK_SIZE; - PUSHW(vi, IF_MASK | IOPL_MASK); - PUSHW(vi, POINTER_SEGMENT(vi->ret_code)); - PUSHW(vi, POINTER_OFFSET(vi->ret_code)); - vi->vms.regs.cs = seg; - vi->vms.regs.eip = off; - OsBlockSignals (); - code = vm86_loop(vi); - OsReleaseSignals (); - if(code < 0) { - perror("vm86 failed"); - return -1; - } else if(code != 0) { - ErrorF("vm86 returned 0x%04X\n", code); - return -1; - } else - return 0; -} - -static inline U8 -vm86_inb(U16 port) -{ - U8 value; - asm volatile ("inb %w1,%b0" : "=a" (value) : "d" (port)); - return value; -} - -static inline U16 -vm86_inw(U16 port) -{ - U16 value; - asm volatile ("inw %w1,%w0" : "=a" (value) : "d" (port)); - return value; -} - -static inline U32 -vm86_inl(U16 port) -{ - U32 value; - asm volatile ("inl %w1,%0" : "=a" (value) : "d" (port)); - return value; -} - -static inline void -vm86_outb(U16 port, U8 value) -{ - asm volatile ("outb %b0,%w1" : : "a" (value), "d" (port)); -} - -static inline void -vm86_outw(U16 port, U16 value) -{ - asm volatile ("outw %w0,%w1" : : "a" (value), "d" (port)); -} - -static inline void -vm86_outl(U16 port, U32 value) -{ - asm volatile ("outl %0,%w1" : : "a" (value), "d" (port)); -} - -#define SEG_CS 1 -#define SEG_DS 2 -#define SEG_ES 3 -#define SEG_SS 4 -#define SEG_GS 5 -#define SEG_FS 6 -#define REP 1 -#define REPNZ 2 -#define SET_8(_x, _y) (_x) = (_x & ~0xFF) | (_y & 0xFF); -#define SET_16(_x, _y) (_x) = (_x & ~0xFFFF) | (_y & 0xFFFF); -#define INC_IP(_i) SET_16(regs->eip, (regs->eip + _i)) -#define AGAIN INC_IP(1); goto again; - -static int -vm86_emulate(VbeInfoPtr vi) -{ - struct vm86_regs *regs = &vi->vms.regs; - U8 opcode; - int size; - int pref_seg = 0, pref_rep = 0, pref_66 = 0, pref_67 = 0; - U32 count; - int code; - - again: - if(!VbeIsMemory(vi, MAKE_POINTER(regs->cs, regs->eip))) { - ErrorF("Trying to execute unmapped memory\n"); - return -1; - } - opcode = VbeMemory(vi, MAKE_POINTER(regs->cs, regs->eip)); - switch(opcode) { - case 0x2E: pref_seg = SEG_CS; AGAIN; - case 0x3E: pref_seg = SEG_DS; AGAIN; - case 0x26: pref_seg = SEG_ES; AGAIN; - case 0x36: pref_seg = SEG_SS; AGAIN; - case 0x65: pref_seg = SEG_GS; AGAIN; - case 0x64: pref_seg = SEG_FS; AGAIN; - case 0x66: pref_66 = 1; AGAIN; - case 0x67: pref_67 = 1; AGAIN; - case 0xF2: pref_rep = REPNZ; AGAIN; - case 0xF3: pref_rep = REP; AGAIN; - - case 0xEC: /* IN AL, DX */ - SET_8(regs->eax, vm86_inb(regs->edx & 0xFFFF)); - INC_IP(1); - break; - case 0xED: /* IN AX, DX */ - if(pref_66) - regs->eax = vm86_inl(regs->edx & 0xFFFF); - else - SET_16(regs->eax, vm86_inw(regs->edx & 0xFFFF)); - INC_IP(1); - break; - case 0xE4: /* IN AL, imm8 */ - SET_8(regs->eax, - vm86_inb(VbeMemory(vi, MAKE_POINTER(regs->cs, regs->eip+1)))); - INC_IP(2); - break; - case 0xE5: /* IN AX, imm8 */ - if(pref_66) - regs->eax = - vm86_inl(VbeMemory(vi, MAKE_POINTER(regs->cs, regs->eip+1))); - else - SET_16(regs->eax, - vm86_inw(VbeMemory(vi, MAKE_POINTER(regs->cs, regs->eip+1)))); - INC_IP(2); - break; - case 0x6C: /* INSB */ - case 0x6D: /* INSW */ - if(opcode == 0x6C) { - VbeWriteMemory(vi, MAKE_POINTER(regs->es, regs->edi), - vm86_inb(regs->edx & 0xFFFF)); - size = 1; - } else if(pref_66) { - VbeWriteMemoryL(vi, MAKE_POINTER(regs->es, regs->edi), - vm86_inl(regs->edx & 0xFFFF)); - size = 4; - } else { - VbeWriteMemoryW(vi, MAKE_POINTER(regs->es, regs->edi), - vm86_inw(regs->edx & 0xFFFF)); - size = 2; - } - if(regs->eflags & (1<<10)) - regs->edi -= size; - else - regs->edi += size; - if(pref_rep) { - if(pref_66) { - regs->ecx--; - if(regs->ecx != 0) { - goto again; - } else { - SET_16(regs->ecx, regs->ecx - 1); - if(regs->ecx & 0xFFFF != 0) - goto again; - } - } - } - INC_IP(1); - break; - - case 0xEE: /* OUT DX, AL */ - vm86_outb(regs->edx & 0xFFFF, regs->eax & 0xFF); - INC_IP(1); - break; - case 0xEF: /* OUT DX, AX */ - if(pref_66) - vm86_outl(regs->edx & 0xFFFF, regs->eax); - else - vm86_outw(regs->edx & 0xFFFF, regs->eax & 0xFFFF); - INC_IP(1); - break; - case 0xE6: /* OUT imm8, AL */ - vm86_outb(VbeMemory(vi, MAKE_POINTER(regs->cs, regs->eip+1)), - regs->eax & 0xFF); - INC_IP(2); - break; - case 0xE7: /* OUT imm8, AX */ - if(pref_66) - vm86_outl(VbeMemory(vi, MAKE_POINTER(regs->cs, regs->eip+1)), - regs->eax); - else - vm86_outw(VbeMemory(vi, MAKE_POINTER(regs->cs, regs->eip+1)), - regs->eax & 0xFFFF); - INC_IP(2); - break; - case 0x6E: /* OUTSB */ - case 0x6F: /* OUTSW */ - if(opcode == 0x6E) { - vm86_outb(regs->edx & 0xFFFF, - VbeMemory(vi, MAKE_POINTER(regs->es, regs->edi))); - size = 1; - } else if(pref_66) { - vm86_outl(regs->edx & 0xFFFF, - VbeMemory(vi, MAKE_POINTER(regs->es, regs->edi))); - size = 4; - } else { - vm86_outw(regs->edx & 0xFFFF, - VbeMemory(vi, MAKE_POINTER(regs->es, regs->edi))); - size = 2; - } - if(regs->eflags & (1<<10)) - regs->edi -= size; - else - regs->edi += size; - if(pref_rep) { - if(pref_66) { - regs->ecx--; - if(regs->ecx != 0) { - goto again; - } else { - SET_16(regs->ecx, regs->ecx - 1); - if(regs->ecx & 0xFFFF != 0) - goto again; - } - } - } - INC_IP(1); - break; - - case 0x0F: - ErrorF("Hit 0F trap in VM86 code\n"); - return -1; - case 0xF0: - ErrorF("Hit lock prefix in VM86 code\n"); - return -1; - case 0xF4: - ErrorF("Hit HLT in VM86 code\n"); - return -1; - - default: - ErrorF("Unhandled GP fault in VM86 code (opcode = 0x%02X)\n", - opcode); - return -1; - } - return 0; -} -#undef SEG_CS -#undef SEG_DS -#undef SEG_ES -#undef SEG_SS -#undef SEG_GS -#undef SEG_FS -#undef REP -#undef REPNZ -#undef SET_8 -#undef SET_16 -#undef INC_IP -#undef AGAIN - -static int -vm86_loop(VbeInfoPtr vi) -{ - int code; - - while(1) { - code = vm86old(&vi->vms); - switch(VM86_TYPE(code)) { - case VM86_SIGNAL: - continue; - case VM86_UNKNOWN: - code = vm86_emulate(vi); - if(code < 0) { - VbeDebug(vi); - return -1; - } - break; - case VM86_INTx: - if(VM86_ARG(code) == 0xFF) - return 0; - else { - PUSHW(vi, vi->vms.regs.eflags) - PUSHW(vi, vi->vms.regs.cs); - PUSHW(vi, vi->vms.regs.eip); - vi->vms.regs.cs = MMW(vi,VM86_ARG(code) * 4 + 2); - vi->vms.regs.eip = MMW(vi,VM86_ARG(code) * 4); - } - break; - case VM86_STI: - ErrorF("VM86 code enabled interrupts\n"); - VbeDebug(vi); - return -1; - default: - ErrorF("Unexpected result code 0x%X from vm86\n", code); - VbeDebug(vi); - return -1; - } - } -} - -int -VbeIsMemory(VbeInfoPtr vi, U32 i) -{ - if(i >= MAGICMEM_BASE && i< MAGICMEM_BASE + MAGICMEM_SIZE) - return 1; - else if(i >= LOMEM_BASE && i< LOMEM_BASE + LOMEM_SIZE) - return 1; - else if(i >= HIMEM_BASE && i< HIMEM_BASE + HIMEM_SIZE) - return 1; - else - return 0; -} - -U8 -VbeMemory(VbeInfoPtr vi, U32 i) -{ - if(i >= MAGICMEM_BASE && i< MAGICMEM_BASE + MAGICMEM_SIZE) - return MM(vi, i); - else if(i >= LOMEM_BASE && i< LOMEM_BASE + LOMEM_SIZE) - return LM(vi, i); - else if(i >= HIMEM_BASE && i< HIMEM_BASE + HIMEM_SIZE) - return HM(vi, i); - else { - ErrorF("Reading unmapped memory at 0x%08X\n", i); - } -} - -U16 -VbeMemoryW(VbeInfoPtr vi, U32 i) -{ - if(i >= MAGICMEM_BASE && i< MAGICMEM_BASE + MAGICMEM_SIZE) - return MMW(vi, i); - else if(i >= LOMEM_BASE && i< LOMEM_BASE + LOMEM_SIZE) - return LMW(vi, i); - else if(i >= HIMEM_BASE && i< HIMEM_BASE + HIMEM_SIZE) - return HMW(vi, i); - else { - ErrorF("Reading unmapped memory at 0x%08X\n", i); - return 0; - } -} - -U32 -VbeMemoryL(VbeInfoPtr vi, U32 i) -{ - if(i >= MAGICMEM_BASE && i< MAGICMEM_BASE + MAGICMEM_SIZE) - return MML(vi, i); - else if(i >= LOMEM_BASE && i< LOMEM_BASE + LOMEM_SIZE) - return LML(vi, i); - else if(i >= HIMEM_BASE && i< HIMEM_BASE + HIMEM_SIZE) - return HML(vi, i); - else { - ErrorF("Reading unmapped memory at 0x%08X\n", i); - return 0; - } -} - -void -VbeWriteMemory(VbeInfoPtr vi, U32 i, U8 val) -{ - if(i >= MAGICMEM_BASE && i< MAGICMEM_BASE + MAGICMEM_SIZE) - MM(vi, i) = val; - else if(i >= LOMEM_BASE && i< LOMEM_BASE + LOMEM_SIZE) - LM(vi, i) = val; - else if(i >= HIMEM_BASE && i< HIMEM_BASE + HIMEM_SIZE) - HM(vi, i) = val; - else { - ErrorF("Writing unmapped memory at 0x%08X\n", i); - } -} - -void -VbeWriteMemoryW(VbeInfoPtr vi, U32 i, U16 val) -{ - if(i >= MAGICMEM_BASE && i< MAGICMEM_BASE + MAGICMEM_SIZE) - MMW(vi, i) = val; - else if(i >= LOMEM_BASE && i< LOMEM_BASE + LOMEM_SIZE) - LMW(vi, i) = val; - else if(i >= HIMEM_BASE && i< HIMEM_BASE + HIMEM_SIZE) - HMW(vi, i) = val; - else { - ErrorF("Writing unmapped memory at 0x%08X\n", i); - } -} - -void -VbeWriteMemoryL(VbeInfoPtr vi, U32 i, U32 val) -{ - if(i >= MAGICMEM_BASE && i< MAGICMEM_BASE + MAGICMEM_SIZE) - MML(vi, i) = val; - else if(i >= LOMEM_BASE && i< LOMEM_BASE + LOMEM_SIZE) - LML(vi, i) = val; - else if(i >= HIMEM_BASE && i< HIMEM_BASE + HIMEM_SIZE) - HML(vi, i) = val; - else { - ErrorF("Writing unmapped memory at 0x%08X\n", i); - } -} - -int -VbeAllocateMemory(VbeInfoPtr vi, int n) -{ - int ret; - if(n<0) { - ErrorF("Asked to allocate negative amount of memory\n"); - return vi->brk; - } - - n = (n + 15) & ~15; - if(vi->brk + n > LOMEM_BASE + LOMEM_SIZE) { - ErrorF("Out of low memory\n"); - exit(2); - } - ret = vi->brk; - vi->brk += n; - return ret; -} - -static int -vm86old(struct vm86_struct *vm) -{ - int res; - - asm volatile ( - "pushl %%ebx\n\t" - "movl %2, %%ebx\n\t" - "movl %1,%%eax\n\t" - "int $0x80\n\t" - "popl %%ebx" - : "=a" (res) : "n" (113), "r" (vm)); - if(res < 0) { - errno = -res; - res = -1; - } else - errno = 0; - OsReleaseSignals (); - return res; -} - -void -VbeDebug(VbeInfoPtr vi) -{ - struct vm86_regs *regs = &vi->vms.regs; - int i; - - ErrorF("eax=0x%08lX ebx=0x%08lX ecx=0x%08lX edx=0x%08lX\n", - regs->eax, regs->ebx, regs->ecx, regs->edx); - ErrorF("esi=0x%08lX edi=0x%08lX ebp=0x%08lX\n", - regs->esi, regs->edi, regs->ebp); - ErrorF("eip=0x%08lX esp=0x%08lX eflags=0x%08lX\n", - regs->eip, regs->esp, regs->eflags); - ErrorF("cs=0x%04lX ds=0x%04lX es=0x%04lX fs=0x%04lX gs=0x%04lX\n", - regs->cs, regs->ds, regs->es, regs->fs, regs->gs); - for(i=-7; i<8; i++) { - ErrorF(" %s%02X", - i==0?"->":"", - VbeMemory(vi, MAKE_POINTER(regs->cs, regs->eip + i))); - } - ErrorF("\n"); -} - -#ifdef NOT_IN_X_SERVER -static void -ErrorF(char *f, ...) -{ - va_list args; - va_start(args, f); - vfprintf(stderr, f, args); - va_end(args); -} -#endif diff --git a/xc/programs/Xserver/hw/kdrive/vesa/vbe.h b/xc/programs/Xserver/hw/kdrive/vesa/vbe.h index 29210310a..0633e4084 100644 --- a/xc/programs/Xserver/hw/kdrive/vesa/vbe.h +++ b/xc/programs/Xserver/hw/kdrive/vesa/vbe.h @@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86$ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vbe.h,v 1.5 2000/10/20 00:19:50 keithp Exp $ */ #ifndef _VBE_H #define _VBE_H @@ -28,56 +28,6 @@ THE SOFTWARE. #define VBE_WINDOW_READ 2 #define VBE_WINDOW_WRITE 4 -#ifndef U8 -#define U8 unsigned char -#define U16 unsigned short -#define U32 unsigned int -#endif - -/* The whole addressable memory */ -#define SYSMEM_BASE 0x00000 -#define SYSMEM_SIZE 0x100000 - -/* Interrupt vectors and BIOS data area */ -/* This is allocated privately from /dev/mem */ -#define MAGICMEM_BASE 0x00000 -#define MAGICMEM_SIZE 0x01000 - -/* The low memory, allocated privately from /dev/zero */ -/* 64KB should be enough for anyone, as they used to say */ -#define LOMEM_BASE 0x10000 -#define LOMEM_SIZE 0x10000 - -/* The video memory and BIOS ROM, allocated shared from /dev/mem */ -#define HIMEM_BASE 0xA0000 -#define HIMEM_SIZE (SYSMEM_BASE + SYSMEM_SIZE - HIMEM_BASE) - -/* The BIOS ROM */ -#define ROM_BASE 0xC0000 -#define ROM_SIZE 0x30000 - -#define STACK_SIZE 0x1000 - -#define POINTER_SEGMENT(ptr) (((unsigned int)ptr)>>4) -#define POINTER_OFFSET(ptr) (((unsigned int)ptr)&0x000F) -#define MAKE_POINTER(seg, off) (((((unsigned int)(seg))<<4) + (unsigned int)(off))) -#define MAKE_POINTER_1(lw) MAKE_POINTER(((lw)&0xFFFF0000)/0x10000, (lw)&0xFFFF) -#define ALLOC_FAIL ((U32)-1) - -typedef struct _VbeInfoRec { - int devmem, devzero; - void *magicMem, *loMem, *hiMem; - U32 brk; - struct vm86_struct vms; - U32 ret_code, stack_base, vib_base, vmib_base, statebuffer_base, palette_scratch_base; - U8 palette_format; - int palette_wait; - int windowA_offset; - int windowB_offset; - int last_window; - int vga_palette; -} VbeInfoRec, *VbeInfoPtr; - typedef struct _VbeInfoBlock { U8 VbeSignature[4]; /* VBE Signature */ U16 VbeVersion; /* VBE Version */ @@ -134,6 +84,15 @@ typedef struct _VbeModeInfoBlock { U8 Reserved2[206]; /* remainder of ModeInfoBlock */ } __attribute__((packed)) VbeModeInfoBlock; +typedef struct _VbeInfoRec { + U8 palette_format; + int palette_wait; + int windowA_offset; + int windowB_offset; + int window_size; + int last_window; + VbeModeInfoBlock vmib; +} VbeInfoRec, *VbeInfoPtr; typedef struct _SupVbeInfoBlock { U8 SupVbeSignature[7]; /* Supplemental VBE Signature */ @@ -147,32 +106,58 @@ typedef struct _SupVbeInfoBlock { U8 Reserved[221]; /* Reserved */ } __attribute__((packed)) SupVbeInfoBlock; -VbeInfoPtr VbeSetup(void); -void VbeCleanup(VbeInfoPtr vi); -VbeInfoBlock *VbeGetInfo(VbeInfoPtr vi); -VbeModeInfoBlock *VbeGetModeInfo(VbeInfoPtr vi, int mode); -int VbeSetMode(VbeInfoPtr vi, int mode, int linear); -int VbeGetMode(VbeInfoPtr vi, int *mode); -int VbeSetupStateBuffer(VbeInfoPtr vi); -int VbeSaveState(VbeInfoPtr vi); -int VbeRestoreState(VbeInfoPtr vi); -void *VbeMapFramebuffer(VbeInfoPtr vi, VbeModeInfoBlock *vmib); -int VbeUnmapFrambuffer(VbeInfoPtr vi, VbeModeInfoBlock *vmib, void *fb); -int VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries); -int VbeSetPaletteOptions(VbeInfoPtr vi, U8 bits, int wait); -void *VbeSetWindow(VbeInfoPtr vi, int offset, int purpose, int *size_return); -int VbeReportInfo(VbeInfoPtr, VbeInfoBlock *); -int VbeReportModeInfo(VbeInfoPtr, U16 mode, VbeModeInfoBlock *); - -int VbeDoInterrupt(VbeInfoPtr, int num); -int VbeDoInterrupt10(VbeInfoPtr vi); -int VbeIsMemory(VbeInfoPtr vi, U32 i); -U8 VbeMemory(VbeInfoPtr, U32); -U16 VbeMemoryW(VbeInfoPtr, U32); -U32 VbeMemoryL(VbeInfoPtr, U32); -void VbeWriteMemory(VbeInfoPtr, U32, U8); -void VbeWriteMemoryW(VbeInfoPtr, U32, U16); -void VbeWriteMemoryL(VbeInfoPtr, U32, U32); -int VbeAllocateMemory(VbeInfoPtr, int); -void VbeDebug(VbeInfoPtr vi); +int +VbeGetVib (Vm86InfoPtr vi, VbeInfoBlock *vib); + +int +VbeGetVmib (Vm86InfoPtr vi, int mode, VbeModeInfoBlock *vmib); + +void +VbeReportInfo (Vm86InfoPtr vi); + +int +VbeGetNmode (Vm86InfoPtr vi); + +int +VbeGetModes (Vm86InfoPtr vi, VesaModePtr modes, int nmode); + +int +VbeGetModeInfo(Vm86InfoPtr vi, int m, VesaModePtr mode); + +VbeInfoPtr +VbeInit (Vm86InfoPtr vi); + +int +VbeSetMode (Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int linear); + +int +VbeGetMode(Vm86InfoPtr vi, int *mode); + +void * +VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *size); + +void +VbeUnmapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, void *fb); + +int +VbeSetPalette(Vm86InfoPtr vi, VbeInfoPtr vbe, int first, int number, U8 *entries); + +int +VbeGetPalette(Vm86InfoPtr vi, VbeInfoPtr vbe, int first, int number, U8 *entries); + +int +VbeSetPaletteOptions(Vm86InfoPtr vi, VbeInfoPtr vbe, U8 bits, int wait); + +void * +VbeSetWindow(Vm86InfoPtr vi, VbeInfoPtr vbe, int offset, int purpose, int *size_return); + +int +VbeReportVib(Vm86InfoPtr vi, VbeInfoBlock *vib); + +int +VbeReportModeInfo(Vm86InfoPtr vi, U16 mode, VbeModeInfoBlock *vmib); + +int +VbeDoInterrupt10(Vm86InfoPtr vi); + #endif diff --git a/xc/programs/Xserver/hw/kdrive/vesa/vesa.c b/xc/programs/Xserver/hw/kdrive/vesa/vesa.c index 4542611c0..d2329a6e7 100644 --- a/xc/programs/Xserver/hw/kdrive/vesa/vesa.c +++ b/xc/programs/Xserver/hw/kdrive/vesa/vesa.c @@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.c,v 1.5 2000/09/15 07:25:13 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.c,v 1.8 2000/10/20 00:19:50 keithp Exp $ */ #include "vesa.h" @@ -30,6 +30,7 @@ Bool vesa_shadow = FALSE; Bool vesa_linear_fb = TRUE; Bool vesa_restore = FALSE; Bool vesa_rotate = FALSE; +Bool vesa_verbose = FALSE; #define VesaPriv(scr) ((VesaScreenPrivPtr) (scr)->driver) @@ -38,166 +39,216 @@ Bool vesa_rotate = FALSE; #define vesaHeight(scr,vmib) (ScreenRotated(scr) ? vmib->XResolution : vmib->YResolution) static Bool -vesaModeSupported(VbeInfoPtr vi, VbeModeInfoBlock *vmib, Bool complain) +vesaModeSupportable (VesaModePtr mode, Bool complain) { - if((vmib->ModeAttributes & 0x10) == 0) { - if(complain) - ErrorF("Text mode specified.\n"); - return FALSE; + if((mode->ModeAttributes & 0x10) == 0) { + if(complain) + ErrorF("Text mode specified.\n"); + return FALSE; } - if(vmib->MemoryModel != 0x06 && vmib->MemoryModel != 0x04 && vmib->MemoryModel != 0x03) { - if(complain) - ErrorF("Unsupported memory model 0x%X\n", vmib->MemoryModel); - return FALSE; + if(mode->MemoryModel != 0x06 && mode->MemoryModel != 0x04 && mode->MemoryModel != 0x03) { + if(complain) + ErrorF("Unsupported memory model 0x%X\n", mode->MemoryModel); + return FALSE; } - if((vmib->ModeAttributes & 0x80) == 0) { - if ((vmib->WinAAttributes & 0x5) != 0x5) { + if((mode->ModeAttributes & 0x80) == 0) { + if ((mode->ModeAttributes & 0x40) != 0) { if(complain) ErrorF("Neither linear nor windowed framebuffer available in this mode\n"); return FALSE; } } - if(!(vmib->ModeAttributes & 1)) { - if(complain) - ErrorF("Mode not supported on this hardware\n"); - return FALSE; + if(!(mode->ModeAttributes & 1)) { + if(complain) + ErrorF("Mode not supported on this hardware\n"); + return FALSE; } return TRUE; } -Bool -vesaListModes() +static Bool +vesaModeSupported (VesaCardPrivPtr priv, VesaModePtr mode, Bool complain) { - int code; - VbeInfoPtr vi = NULL; - VbeInfoBlock *vib; - VbeModeInfoBlock *vmib; - unsigned p, num_modes, i; - CARD16 *modes_list = NULL; - - vi = VbeSetup(); - if(!vi) - goto fail; - - vib = VbeGetInfo(vi); - if(!vib) - goto fail; - - VbeReportInfo(vi, vib); - /* The spec says you need to copy the list */ - p = MAKE_POINTER_1(vib->VideoModePtr); - num_modes = 0; - while(VbeMemoryW(vi, p) != 0xFFFF) { - num_modes++; - p+=2; - } - modes_list = ALLOCATE_LOCAL(num_modes * sizeof(CARD16)); - if(!modes_list) - goto fail; - p = MAKE_POINTER_1(vib->VideoModePtr); - for(i=0; i<num_modes; i++) { - modes_list[i] = VbeMemoryW(vi, p); - p += 2; - } - - for(i=0; i<num_modes; i++) { - vmib = VbeGetModeInfo(vi, modes_list[i]); - if(!vmib) - goto fail; - if(vesa_force_mode || vesaModeSupported(vi, vmib, FALSE)) - VbeReportModeInfo(vi, modes_list[i], vmib); - } - - if(modes_list) - DEALLOCATE_LOCAL(modes_list); - VbeCleanup(vi); - return TRUE; - - fail: - if(modes_list) - DEALLOCATE_LOCAL(modes_list); - VbeCleanup(vi); - return FALSE; + if (!priv->vbeInfo && mode->vbe) { + if (complain) + ErrorF("VBE bios mode not usable.\n"); + return FALSE; + } + return vesaModeSupportable (mode, complain); } -Bool -vesaGetModes (KdCardInfo *card, VesaCardPrivPtr priv) +void +vesaReportMode (VesaModePtr mode) { - VesaModePtr mode; - int nmode; - unsigned int i; - VbeInfoPtr vi = priv->vi; - VbeInfoBlock *vib = priv->vib; - VbeModeInfoBlock *vmib; - - /* The spec says you need to copy the list */ - i = MAKE_POINTER_1(vib->VideoModePtr); - nmode = 0; - while(VbeMemoryW(vi, i) != 0xFFFF) { - nmode++; - i+=2; - } - if (!nmode) - return FALSE; - priv->modes = xalloc (nmode * sizeof (VesaModeRec)); - if (!priv->modes) - return FALSE; - priv->nmode = nmode; - i = MAKE_POINTER_1(vib->VideoModePtr); - nmode = 0; - while(nmode < priv->nmode) { - priv->modes[nmode].mode = VbeMemoryW(vi, i); - nmode++; - i+=2; - } - i = MAKE_POINTER_1(vib->VideoModePtr); - nmode = 0; - while(nmode < priv->nmode) { - vmib = VbeGetModeInfo(vi, priv->modes[nmode].mode); - if(!vmib) - break; - priv->modes[nmode].vmib = *vmib; - i += 2; - nmode++; + int supported = (mode->ModeAttributes&MODE_SUPPORTED)?1:0; + int colour = (mode->ModeAttributes&MODE_COLOUR)?1:0; + int graphics = (mode->ModeAttributes&MODE_GRAPHICS)?1:0; + int vga_compatible = !((mode->ModeAttributes&MODE_VGA)?1:0); + int linear_fb = (mode->ModeAttributes&MODE_LINEAR)?1:0; + + ErrorF("0x%04X: %dx%dx%d%s", + (unsigned)mode->mode, + (int)mode->XResolution, (int)mode->YResolution, + vesaDepth (mode), + colour?"":" (monochrome)"); + switch(mode->MemoryModel) { + case MEMORY_TEXT: + ErrorF(" text mode"); + break; + case MEMORY_CGA: + ErrorF(" CGA graphics"); + break; + case MEMORY_HERCULES: + ErrorF(" Hercules graphics"); + break; + case MEMORY_PLANAR: + ErrorF(" Planar (%d planes)", mode->NumberOfPlanes); + break; + case MEMORY_PSEUDO: + ErrorF(" PseudoColor"); + break; + case MEMORY_NONCHAIN: + ErrorF(" Non-chain 4, 256 colour"); + break; + case MEMORY_DIRECT: + if(mode->DirectColorModeInfo & MODE_DIRECT) + ErrorF(" DirectColor"); + else + ErrorF(" TrueColor"); + ErrorF(" [%d:%d:%d:%d]", + mode->RedMaskSize, mode->GreenMaskSize, mode->BlueMaskSize, + mode->RsvdMaskSize); + if(mode->DirectColorModeInfo & 2) + ErrorF(" (reserved bits are reserved)"); + break; + case MEMORY_YUV: + ErrorF("YUV"); + break; + default: + ErrorF("unknown MemoryModel 0x%X ", mode->MemoryModel); } - return TRUE; + if(!supported) + ErrorF(" (unsupported)"); + else if(!linear_fb) + ErrorF(" (no linear framebuffer)"); + ErrorF("\n"); } +VesaModePtr +vesaGetModes (Vm86InfoPtr vi, int *ret_nmode) +{ + VesaModePtr modes; + int nmode, nmodeVbe, nmodeVga; + int code; + + code = VgaGetNmode (vi); + if (code <= 0) + nmodeVga = 0; + else + nmodeVga = code; + + code = VbeGetNmode (vi); + if (code <= 0) + nmodeVbe = 0; + else + nmodeVbe = code; + + nmode = nmodeVga + nmodeVbe; + if (nmode <= 0) + return 0; + + modes = xalloc (nmode * sizeof (VesaModeRec)); + + if (nmodeVga) + { + code = VgaGetModes (vi, modes, nmodeVga); + if (code <= 0) + nmodeVga = 0; + else + nmodeVga = code; + } + + if (nmodeVbe) + { + code = VbeGetModes (vi, modes + nmodeVga, nmodeVbe); + if (code <= 0) + nmodeVbe = 0; + else + nmodeVbe = code; + } + + nmode = nmodeVga + nmodeVbe; + + if (nmode == 0) + { + xfree (modes); + modes = 0; + return 0; + } + *ret_nmode = nmode; + return modes; +} Bool vesaInitialize (KdCardInfo *card, VesaCardPrivPtr priv) { int code; - - priv->vi = VbeSetup(); - if(!priv->vi) - goto fail; - - priv->vib = VbeGetInfo(priv->vi); - if(!priv->vib) - goto fail; - code = VbeSetupStateBuffer(priv->vi); - if(code < 0) - goto fail; - - code = VbeSaveState(priv->vi); - if(code<0) - goto fail; + priv->vi = Vm86Setup(); + if(!priv->vi) + goto fail; - if (!vesaGetModes (card, priv)) + priv->modes = vesaGetModes (priv->vi, &priv->nmode); + + if (!priv->modes) goto fail; + + priv->vbeInfo = VbeInit (priv->vi); card->driver = priv; return TRUE; - fail: +fail: if(priv->vi) - VbeCleanup(priv->vi); + Vm86Cleanup(priv->vi); return FALSE; } +void +vesaListModes (void) +{ + Vm86InfoPtr vi; + VesaModePtr modes; + int nmode; + int n; + + vi = Vm86Setup (); + if (!vi) + { + ErrorF ("Can't setup vm86\n"); + } + else + { + modes = vesaGetModes (vi, &nmode); + if (!modes) + { + ErrorF ("No modes available\n"); + } + else + { + VbeReportInfo (vi); + for (n = 0; n < nmode; n++) + { + if (vesa_force_mode || vesaModeSupportable (modes+n, 0)) + vesaReportMode (modes+n); + } + xfree (modes); + } + Vm86Cleanup (vi); + } +} + Bool vesaCardInit(KdCardInfo *card) { @@ -217,19 +268,19 @@ vesaCardInit(KdCardInfo *card) } int -vesaDepth (VbeModeInfoBlock *m) +vesaDepth (VesaModePtr mode) { - if (m->MemoryModel == 0x06) - return (m->RedMaskSize + - m->GreenMaskSize + - m->BlueMaskSize); + if (mode->MemoryModel == MEMORY_DIRECT) + return (mode->RedMaskSize + + mode->GreenMaskSize + + mode->BlueMaskSize); else - return m->BitsPerPixel; + return mode->BitsPerPixel; } Bool -vesaModeGood (KdScreenInfo *screen, - VbeModeInfoBlock *a) +vesaModeGood (KdScreenInfo *screen, + VesaModePtr a) { if (vesaWidth(screen,a) <= screen->width && vesaHeight(screen,a) <= screen->height && @@ -242,8 +293,8 @@ vesaModeGood (KdScreenInfo *screen, #define vabs(a) ((a) >= 0 ? (a) : -(a)) int -vesaSizeError (KdScreenInfo *screen, - VbeModeInfoBlock *a) +vesaSizeError (KdScreenInfo *screen, + VesaModePtr a) { int xdist, ydist; xdist = vabs (screen->width - vesaWidth(screen,a)); @@ -252,9 +303,9 @@ vesaSizeError (KdScreenInfo *screen, } Bool -vesaModeBetter (KdScreenInfo *screen, - VbeModeInfoBlock *a, - VbeModeInfoBlock *b) +vesaModeBetter (KdScreenInfo *screen, + VesaModePtr a, + VesaModePtr b) { int aerr, berr; @@ -290,21 +341,21 @@ vesaSelectMode (KdScreenInfo *screen) { for (best = 0; best < priv->nmode; best++) if (priv->modes[best].mode == vesa_video_mode && - (vesaModeSupported (priv->vi, &priv->modes[best].vmib, FALSE) || + (vesaModeSupported (priv, &priv->modes[best], FALSE) || vesa_force_mode)) return &priv->modes[best]; } for (best = 0; best < priv->nmode; best++) { - if (vesaModeSupported (priv->vi, &priv->modes[best].vmib, FALSE)) + if (vesaModeSupported (priv, &priv->modes[best], FALSE)) break; } if (best == priv->nmode) return 0; for (i = best + 1; i < priv->nmode; i++) - if (vesaModeSupported (priv->vi, &priv->modes[i].vmib, FALSE) && - vesaModeBetter (screen, &priv->modes[i].vmib, - &priv->modes[best].vmib)) + if (vesaModeSupported (priv, &priv->modes[i], FALSE) && + vesaModeBetter (screen, &priv->modes[i], + &priv->modes[best])) best = i; return &priv->modes[best]; } @@ -313,19 +364,43 @@ Bool vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr) { VesaCardPrivPtr priv = screen->card->driver; - VbeModeInfoBlock *vmib; + VesaModePtr mode; Pixel allbits; int depth; - int bpp; + int bpp, fbbpp; screen->driver = pscr; pscr->rotate = FALSE; if (screen->width < screen->height) pscr->rotate = TRUE; + + if (!screen->width || !screen->height) + { + screen->width = 640; + screen->height = 480; + } + if (!screen->fb[0].depth) + screen->fb[0].depth = 4; + + if (vesa_verbose) + ErrorF ("Mode requested %dx%dx%d\n", + screen->width, screen->height, screen->fb[0].depth); + pscr->mode = vesaSelectMode (screen); + if (!pscr->mode) + { + if (vesa_verbose) + ErrorF ("No selectable mode\n"); return FALSE; + } + if (vesa_verbose) + { + ErrorF ("\t"); + vesaReportMode (pscr->mode); + } + pscr->shadow = vesa_shadow; pscr->origDepth = screen->fb[0].depth; if (vesa_linear_fb) @@ -333,21 +408,35 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr) else pscr->mapping = VESA_WINDOWED; - vmib = &pscr->mode->vmib; + mode = pscr->mode; - depth = vesaDepth (vmib); - bpp = vmib->BitsPerPixel; + depth = vesaDepth (mode); + bpp = mode->BitsPerPixel; + + if (bpp > 24) + bpp = 32; + else if (bpp > 16) + bpp = 24; + else if (bpp > 8) + bpp = 16; + else if (bpp > 4) + bpp = 8; + else if (bpp > 1) + bpp = 4; + else + bpp = 1; + fbbpp = bpp; - switch (vmib->MemoryModel) { - case 0x06: + switch (mode->MemoryModel) { + case MEMORY_DIRECT: /* TrueColor or DirectColor */ screen->fb[0].visuals = (1 << TrueColor); screen->fb[0].redMask = - FbStipMask(vmib->RedFieldPosition, vmib->RedMaskSize); + FbStipMask(mode->RedFieldPosition, mode->RedMaskSize); screen->fb[0].greenMask = - FbStipMask(vmib->GreenFieldPosition, vmib->GreenMaskSize); + FbStipMask(mode->GreenFieldPosition, mode->GreenMaskSize); screen->fb[0].blueMask = - FbStipMask(vmib->BlueFieldPosition, vmib->BlueMaskSize); + FbStipMask(mode->BlueFieldPosition, mode->BlueMaskSize); allbits = screen->fb[0].redMask | screen->fb[0].greenMask | @@ -355,8 +444,14 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr) depth = 32; while (depth && !(allbits & (1 << (depth - 1)))) depth--; + if (vesa_verbose) + ErrorF ("\tTrue Color bpp %d depth %d red 0x%x green 0x%x blue 0x%x\n", + bpp, depth, + screen->fb[0].redMask, + screen->fb[0].greenMask, + screen->fb[0].blueMask); break; - case 0x04: + case MEMORY_PSEUDO: /* PseudoColor */ screen->fb[0].visuals = ((1 << StaticGray) | (1 << GrayScale) | @@ -367,43 +462,73 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr) screen->fb[0].blueMask = 0x00; screen->fb[0].greenMask = 0x00; screen->fb[0].redMask = 0x00; + if (vesa_verbose) + ErrorF ("\tPseudo Color bpp %d depth %d\n", + bpp, depth); break; - case 0x03: + case MEMORY_PLANAR: /* 4 plane planar */ - screen->fb[0].visuals = (1 << StaticColor); + if (mode->ModeAttributes & MODE_COLOUR) + screen->fb[0].visuals = (1 << StaticColor); + else + screen->fb[0].visuals = (1 << StaticGray); screen->fb[0].blueMask = 0x00; screen->fb[0].greenMask = 0x00; screen->fb[0].redMask = 0x00; - bpp = screen->fb[0].bitsPerPixel; - if (bpp != 8) - bpp = 4; - depth = bpp; - pscr->mapping = VESA_PLANAR; + if (bpp == 4) + { + bpp = screen->fb[0].bitsPerPixel; + if (bpp != 8) + bpp = 4; + depth = bpp; + } + if (bpp == 1) + { + pscr->mapping = VESA_MONO; + if (vesa_verbose) + ErrorF ("\tMonochrome\n"); + } + else + { + pscr->mapping = VESA_PLANAR; + if (vesa_verbose) + ErrorF ("\tStatic color bpp %d depth %d\n", + bpp, depth); + } pscr->rotate = FALSE; break; default: ErrorF("Unsupported VESA MemoryModel 0x%02X\n", - vmib->MemoryModel); + mode->MemoryModel); return FALSE; } - screen->width = vesaWidth(screen, vmib); - screen->height = vesaHeight(screen, vmib); + screen->width = vesaWidth(screen, mode); + screen->height = vesaHeight(screen, mode); screen->fb[0].depth = depth; screen->fb[0].bitsPerPixel = bpp; - screen->fb[0].byteStride = vmib->BytesPerScanLine; - screen->fb[0].pixelStride = ((vmib->BytesPerScanLine * 8) / - vmib->BitsPerPixel); + screen->fb[0].byteStride = mode->BytesPerScanLine; + screen->fb[0].pixelStride = ((mode->BytesPerScanLine * 8) / fbbpp); - if (pscr->mapping == VESA_LINEAR && !(vmib->ModeAttributes & 0x80)) + if (pscr->mapping == VESA_LINEAR && !(mode->ModeAttributes & MODE_LINEAR)) pscr->mapping = VESA_WINDOWED; if (pscr->rotate) pscr->shadow = TRUE; switch (pscr->mapping) { + case VESA_MONO: + pscr->shadow = TRUE; + /* fall through */ case VESA_LINEAR: - pscr->fb = VbeMapFramebuffer(priv->vi, vmib); + if (mode->vbe) + pscr->fb = VbeMapFramebuffer(priv->vi, priv->vbeInfo, + pscr->mode->mode, + &pscr->fb_size); + else + pscr->fb = VgaMapFramebuffer (priv->vi, + pscr->mode->mode, + &pscr->fb_size); break; case VESA_WINDOWED: pscr->fb = NULL; @@ -424,6 +549,10 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr) if (pscr->shadow) return KdShadowScreenInit (screen); + if (vesa_verbose) + ErrorF ("Mode selected %dx%dx%d\n", + screen->width, screen->height, screen->fb[0].depth); + return TRUE; } @@ -441,7 +570,7 @@ vesaScreenInit(KdScreenInfo *screen) } void * -vesaWindowPlanar (ScreenPtr pScreen, +vesaSetWindowPlanar(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, @@ -450,25 +579,96 @@ vesaWindowPlanar (ScreenPtr pScreen, KdScreenPriv(pScreen); VesaCardPrivPtr priv = pScreenPriv->card->driver; VesaScreenPrivPtr pscr = pScreenPriv->screen->driver; - VbeModeInfoBlock *vmib = &pscr->mode->vmib; static int plane; int winSize; void *base; - if (!pScreenPriv->enabled) - return 0; plane = offset & 3; - VbeSetWritePlaneMask (priv->vi, (1 << plane)); + VgaSetWritePlaneMask (priv->vi, (1 << plane)); offset = offset >> 2; - base = VbeSetWindow (priv->vi, - vmib->BytesPerScanLine * row + offset, - mode, - &winSize); + if (pscr->mode->vbe) + { + base = VbeSetWindow (priv->vi, + priv->vbeInfo, + pscr->mode->BytesPerScanLine * row + offset, + mode, + &winSize); + } + else + { + base = VgaSetWindow (priv->vi, + pscr->mode->mode, + pscr->mode->BytesPerScanLine * row + offset, + mode, + &winSize); + } *size = (CARD32) winSize; return base; } void * +vesaSetWindowLinear (ScreenPtr pScreen, + CARD32 row, + CARD32 offset, + int mode, + CARD32 *size) +{ + KdScreenPriv(pScreen); + VesaCardPrivPtr priv = pScreenPriv->card->driver; + VesaScreenPrivPtr pscr = pScreenPriv->screen->driver; + + *size = pscr->mode->BytesPerScanLine; + return (CARD8 *) pscr->fb + row * pscr->mode->BytesPerScanLine + offset; +} + +void * +vesaSetWindowWindowed (ScreenPtr pScreen, + CARD32 row, + CARD32 offset, + int mode, + CARD32 *size) +{ + KdScreenPriv(pScreen); + VesaCardPrivPtr priv = pScreenPriv->card->driver; + VesaScreenPrivPtr pscr = pScreenPriv->screen->driver; + int winSize; + void *base; + + if (pscr->mode->vbe) + { + base = VbeSetWindow (priv->vi, + priv->vbeInfo, + pscr->mode->BytesPerScanLine * row + offset, + mode, + &winSize); + } + else + { + base = VgaSetWindow (priv->vi, + pscr->mode->mode, + pscr->mode->BytesPerScanLine * row + offset, + mode, + &winSize); + } + *size = (CARD32) winSize; + return base; +} + +void * +vesaWindowPlanar (ScreenPtr pScreen, + CARD32 row, + CARD32 offset, + int mode, + CARD32 *size) +{ + KdScreenPriv(pScreen); + + if (!pScreenPriv->enabled) + return 0; + return vesaSetWindowPlanar (pScreen, row, offset, mode, size); +} + +void * vesaWindowLinear (ScreenPtr pScreen, CARD32 row, CARD32 offset, @@ -476,14 +676,10 @@ vesaWindowLinear (ScreenPtr pScreen, CARD32 *size) { KdScreenPriv(pScreen); - VesaCardPrivPtr priv = pScreenPriv->card->driver; - VesaScreenPrivPtr pscr = pScreenPriv->screen->driver; - VbeModeInfoBlock *vmib = &pscr->mode->vmib; if (!pScreenPriv->enabled) return 0; - *size = vmib->BytesPerScanLine; - return (CARD8 *) pscr->fb + row * vmib->BytesPerScanLine + offset; + return vesaSetWindowLinear (pScreen, row, offset, mode, size); } void * @@ -494,41 +690,114 @@ vesaWindowWindowed (ScreenPtr pScreen, CARD32 *size) { KdScreenPriv(pScreen); + + if (!pScreenPriv->enabled) + return 0; + return vesaSetWindowWindowed (pScreen, row, offset, mode, size); +} + +#define vesaInvertBits32(v) { \ + v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); \ + v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); \ + v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); \ +} + +void * +vesaWindowCga (ScreenPtr pScreen, + CARD32 row, + CARD32 offset, + int mode, + CARD32 *size) +{ + KdScreenPriv(pScreen); VesaCardPrivPtr priv = pScreenPriv->card->driver; VesaScreenPrivPtr pscr = pScreenPriv->screen->driver; - VbeModeInfoBlock *vmib = &pscr->mode->vmib; - int winSize; - void *base; - + int line; + if (!pScreenPriv->enabled) return 0; - base = VbeSetWindow (priv->vi, - vmib->BytesPerScanLine * row + offset, - mode, - &winSize); - *size = (CARD32) winSize; - return base; + *size = pscr->mode->BytesPerScanLine; + line = ((row & 1) << 13) + (row >> 1) * pscr->mode->BytesPerScanLine; + return (CARD8 *) pscr->fb + line + offset; } -static CARD16 vga16Colors[16][3] = { -#if 0 - { 0, 0, 0, }, /* 0 */ - { 0, 0, 0x80,}, /* 1 */ - { 0, 0x80,0, }, /* 2 */ - { 0, 0x80,0x80,}, /* 3 */ - { 0x80,0, 0, }, /* 4 */ - { 0x80,0, 0x80,}, /* 5 */ - { 0x80,0x80,0, }, /* 6 */ - { 0xC0,0xC0,0xC0,}, /* 7 */ - { 0x80,0x80,0x80,}, /* 8 */ - { 0, 0, 0xFF,}, /* 9 */ - { 0, 0xFF,0 ,}, /* 10 */ - { 0, 0xFF,0xFF,}, /* 11 */ - { 0xFF,0, 0 ,}, /* 12 */ - { 0xFF,0, 0xFF,}, /* 13 */ - { 0xFF,0xFF,0 ,}, /* 14 */ - { 0xFF,0xFF,0xFF,}, /* 15 */ -#else +void +vesaUpdateMono (ScreenPtr pScreen, + PixmapPtr pShadow, + RegionPtr damage) +{ + shadowScrPriv(pScreen); + int nbox = REGION_NUM_RECTS (damage); + BoxPtr pbox = REGION_RECTS (damage); + FbBits *shaBase, *shaLine, *sha; + FbBits s; + FbStride shaStride; + int scrBase, scrLine, scr; + int shaBpp; + int x, y, w, h, width; + int i; + FbBits *winBase, *winLine, *win; + CARD32 winSize; + FbBits bits; + int plane; + + fbGetDrawable (&pShadow->drawable, shaBase, shaStride, shaBpp); + while (nbox--) + { + x = pbox->x1 * shaBpp; + y = pbox->y1; + w = (pbox->x2 - pbox->x1) * shaBpp; + h = pbox->y2 - pbox->y1; + + scrLine = (x >> FB_SHIFT); + shaLine = shaBase + y * shaStride + (x >> FB_SHIFT); + + x &= FB_MASK; + w = (w + x + FB_MASK) >> FB_SHIFT; + + while (h--) + { + winSize = 0; + scrBase = 0; + width = w; + scr = scrLine; + sha = shaLine; + while (width) { + /* how much remains in this window */ + i = scrBase + winSize - scr; + if (i <= 0 || scr < scrBase) + { + winBase = (FbBits *) (*pScrPriv->window) (pScreen, + y, + scr * sizeof (FbBits), + SHADOW_WINDOW_WRITE, + &winSize); + if(!winBase) + return; + scrBase = scr; + winSize /= sizeof (FbBits); + i = winSize; + } + win = winBase + (scr - scrBase); + if (i > width) + i = width; + width -= i; + scr += i; + while (i--) + { + bits = *sha++; + vesaInvertBits32(bits); + *win++ = bits; + } + } + shaLine += shaStride; + y++; + } + pbox++; + } +} + +static const CARD16 vga16Colors[16][3] = { { 0, 0, 0, }, /* 0 */ { 0, 0, 0xAA,}, /* 1 */ { 0, 0xAA,0, }, /* 2 */ @@ -545,7 +814,6 @@ static CARD16 vga16Colors[16][3] = { { 0xFF,0x55,0xFF,}, /* 13 */ { 0xFF,0xFF,0x55,}, /* 14 */ { 0xFF,0xFF,0xFF,}, /* 15 */ -#endif }; Bool @@ -586,26 +854,20 @@ vesaInitScreen(ScreenPtr pScreen) case VESA_PLANAR: pScreen->CreateColormap = vesaCreateColormap16; if (pScreenPriv->screen->fb[0].bitsPerPixel == 8) - { -#if 0 - int i; - - for (i = 0; i < pScreen->numVisuals; i++) - { - if (pScreen->visuals[i].nplanes == - pScreenPriv->screen->fb[0].depth) - { - pScreen->visuals[i].ColormapEntries = 16; - } - } -#endif update = shadowUpdatePlanar4x8; - } else update = shadowUpdatePlanar4; window = vesaWindowPlanar; pscr->rotate = FALSE; break; + case VESA_MONO: + update = vesaUpdateMono; + if (pscr->mode->mode < 8) + window = vesaWindowCga; + else + window = vesaWindowLinear; + pscr->rotate = FALSE; + break; } if (pscr->rotate) { @@ -629,55 +891,41 @@ Bool vesaEnable(ScreenPtr pScreen) { KdScreenPriv(pScreen); - VesaCardPrivPtr priv = pScreenPriv->card->driver; + VesaCardPrivPtr priv = pScreenPriv->card->driver; VesaScreenPrivPtr pscr = pScreenPriv->screen->driver; - int code; - int palette_wait = 0, palette_hi = 0; - int i; - int size; - char *p; + int code; + int i; + CARD32 size; + char *p; KdMouseMatrix m; - code = VbeSetMode(priv->vi, pscr->mode->mode, pscr->mapping == VESA_LINEAR); - if(code < 0) - return FALSE; - + if (pscr->mode->vbe) { - int p; - CARD8 scratch[4] = {0x40,0x40,0x40,0}; - for (p = 0; p < 256; p++) - { - if (20 <= p && p < 21) - { - scratch[0] = 255; - scratch[1] = 255; - scratch[2] = 255; - } - else - { - scratch[0] = 0; - scratch[1] = 0; - scratch[2] = 0; - } - VbeSetPalette(priv->vi, p, 1, scratch); - } + if (vesa_verbose) + ErrorF ("Enable VBE mode 0x%x\n", pscr->mode->mode); + code = VbeSetMode(priv->vi, priv->vbeInfo, pscr->mode->mode, + pscr->mapping == VESA_LINEAR); + } + else + { + if (vesa_verbose) + ErrorF ("Enable BIOS mode 0x%x\n", pscr->mode->mode); + code = VgaSetMode (priv->vi, pscr->mode->mode); } - if(priv->vib->Capabilities[0] & 1) - palette_hi = 1; - if(priv->vib->Capabilities[0] & 4) - palette_wait = 1; - if(palette_hi || palette_wait) - VbeSetPaletteOptions(priv->vi, palette_hi?8:6, palette_wait); - + if(code < 0) + return FALSE; + switch (pscr->mapping) { + case VESA_MONO: + VgaSetWritePlaneMask (priv->vi, 0x1); case VESA_LINEAR: memcpy (priv->text, pscr->fb, VESA_TEXT_SAVE); break; case VESA_WINDOWED: for (i = 0; i < VESA_TEXT_SAVE;) { - p = VbeSetWindow(priv->vi, i, VBE_WINDOW_READ, &size); + p = vesaSetWindowWindowed (pScreen, 0, i, VBE_WINDOW_READ, &size); if(!p) { ErrorF("Couldn't set window for saving VGA font\n"); break; @@ -689,10 +937,9 @@ vesaEnable(ScreenPtr pScreen) } break; case VESA_PLANAR: - p = VbeSetWindow (priv->vi, 0, VBE_WINDOW_READ, &size); for (i = 0; i < 4; i++) { - VbeSetReadPlaneMap (priv->vi, i); + p = vesaSetWindowPlanar (pScreen, 0, i, VBE_WINDOW_READ, &size); memcpy (((char *)priv->text) + i * (VESA_TEXT_SAVE/4), p, (VESA_TEXT_SAVE/4)); } @@ -716,19 +963,20 @@ void vesaDisable(ScreenPtr pScreen) { KdScreenPriv(pScreen); - VesaCardPrivPtr priv = pScreenPriv->card->driver; + VesaCardPrivPtr priv = pScreenPriv->card->driver; VesaScreenPrivPtr pscr = pScreenPriv->screen->driver; - int i=0; - int size; - char *p; + int i=0; + CARD32 size; + char *p; switch (pscr->mapping) { case VESA_LINEAR: + case VESA_MONO: memcpy(pscr->fb, priv->text, VESA_TEXT_SAVE); break; case VESA_WINDOWED: while(i < VESA_TEXT_SAVE) { - p = VbeSetWindow(priv->vi, i, VBE_WINDOW_WRITE, &size); + p = vesaSetWindowWindowed (pScreen, 0, i, VBE_WINDOW_WRITE, &size); if(!p) { ErrorF("Couldn't set window for restoring VGA font\n"); break; @@ -740,10 +988,9 @@ vesaDisable(ScreenPtr pScreen) } break; case VESA_PLANAR: - p = VbeSetWindow (priv->vi, 0, VBE_WINDOW_WRITE, &size); for (i = 0; i < 4; i++) { - VbeSetWritePlaneMask (priv->vi, 1 << i); + p = vesaSetWindowPlanar (pScreen, 0, i, VBE_WINDOW_WRITE, &size); memcpy (p, ((char *)priv->text) + i * (VESA_TEXT_SAVE/4), (VESA_TEXT_SAVE/4)); @@ -761,29 +1008,49 @@ vesaPreserve(KdCardInfo *card) /* The framebuffer might not be valid at this point, so we cannot save the VGA fonts now; we do it in vesaEnable. */ - code = VbeSaveState(priv->vi); - if(code < 0) - FatalError("Couldn't save state\n"); + if (VbeGetMode (priv->vi, &priv->old_vbe_mode) < 0) + priv->old_vbe_mode = -1; - return; + if (VgaGetMode (priv->vi, &priv->old_vga_mode) < 0) + priv->old_vga_mode = -1; + + if (vesa_verbose) + ErrorF ("Previous modes: VBE 0x%x BIOS 0x%x\n", + priv->old_vbe_mode, priv->old_vga_mode); } void vesaRestore(KdCardInfo *card) { VesaCardPrivPtr priv = card->driver; - VbeRestoreState(priv->vi); - return; + int n; + + for (n = 0; n < priv->nmode; n++) + if (priv->modes[n].vbe && priv->modes[n].mode == (priv->old_vbe_mode&0x3fff)) + break; + + if (n < priv->nmode) + { + if (vesa_verbose) + ErrorF ("Restore VBE mode 0x%x\n", priv->old_vbe_mode); + VbeSetMode (priv->vi, priv->vbeInfo, priv->old_vbe_mode, 0); + } + else + { + if (vesa_verbose) + ErrorF ("Restore BIOS mode 0x%x\n", priv->old_vga_mode); + VgaSetMode (priv->vi, priv->old_vga_mode); + } } void vesaCardFini(KdCardInfo *card) { VesaCardPrivPtr priv = card->driver; - if (vesa_restore) - VbeSetTextMode(priv->vi,3); - VbeCleanup(priv->vi); - return; + + if (priv->vbeInfo) + VbeCleanup (priv->vi, priv->vbeInfo); + Vm86Cleanup(priv->vi); } void @@ -793,12 +1060,47 @@ vesaScreenFini(KdScreenInfo *screen) VesaCardPrivPtr priv = screen->card->driver; if (pscr->fb) - VbeUnmapFramebuffer(priv->vi, &pscr->mode->vmib, pscr->fb); + { + if (pscr->mode->vbe) + VbeUnmapFramebuffer(priv->vi, priv->vbeInfo, pscr->mode->mode, pscr->fb); + else + VgaUnmapFramebuffer (priv->vi); + } + if (pscr->shadow) + KdShadowScreenFini (screen); screen->fb[0].depth = pscr->origDepth; - return; } +int +vesaSetPalette(VesaCardPrivPtr priv, int first, int number, U8 *entries) +{ + if (priv->vga_palette) + return VgaSetPalette (priv->vi, first, number, entries); + else + return VbeSetPalette (priv->vi, priv->vbeInfo, first, number, entries); +} + + +int +vesaGetPalette(VesaCardPrivPtr priv, int first, int number, U8 *entries) +{ + int code; + + if (priv->vga_palette) + code = VgaGetPalette (priv->vi, first, number, entries); + else + { + code = VbeGetPalette (priv->vi, priv->vbeInfo, first, number, entries); + if (code < 0) + { + priv->vga_palette = 1; + code = VgaGetPalette (priv->vi, first, number, entries); + } + } + return code; +} + void vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs) { @@ -839,15 +1141,15 @@ vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs) */ if (p < 16) { - VbeSetPalette (priv->vi, p, 1, scratch); + vesaSetPalette (priv, p, 1, scratch); if (p >= 8) - VbeSetPalette (priv->vi, p+0x30, 1, scratch); + vesaSetPalette (priv, p+0x30, 1, scratch); else if (p == 6) - VbeSetPalette (priv->vi, 0x14, 1, scratch); + vesaSetPalette (priv, 0x14, 1, scratch); } } else - VbeSetPalette(priv->vi, p, 1, scratch); + vesaSetPalette(priv, p, 1, scratch); } } @@ -874,7 +1176,7 @@ vesaGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs) } for(i = 0; i<n; i++) { - VbeGetPalette(priv->vi, pdefs[i].pixel, 1, scratch); + vesaGetPalette(priv, pdefs[i].pixel, 1, scratch); pdefs[i].red = scratch[red]<<8; pdefs[i].green = scratch[green]<<8; pdefs[i].blue = scratch[blue]<<8; @@ -905,8 +1207,8 @@ vesaProcessArgument (int argc, char **argv, int i) } else if(!strcmp(argv[i], "-nolinear")) { vesa_linear_fb = FALSE; return 1; - } else if(!strcmp(argv[i], "-restore")) { - vesa_restore = TRUE; + } else if(!strcmp(argv[i], "-verbose")) { + vesa_verbose = TRUE; return 1; } diff --git a/xc/programs/Xserver/hw/kdrive/vesa/vesa.h b/xc/programs/Xserver/hw/kdrive/vesa/vesa.h index 8ded2ab67..2f23ec054 100644 --- a/xc/programs/Xserver/hw/kdrive/vesa/vesa.h +++ b/xc/programs/Xserver/hw/kdrive/vesa/vesa.h @@ -19,60 +19,133 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.h,v 1.5 2000/09/15 07:25:13 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.h,v 1.7 2000/10/20 00:19:50 keithp Exp $ */ #ifndef _VESA_H_ #define _VESA_H_ #include "kdrive.h" -#include <sys/vm86.h> -#include "vbe.h" +#include "vm86.h" #define VESA_TEXT_SAVE (64*1024) +#define MODE_SUPPORTED 0x01 +#define MODE_COLOUR 0x08 +#define MODE_GRAPHICS 0x10 +#define MODE_VGA 0x20 +#define MODE_LINEAR 0x80 + +#define MODE_DIRECT 0x1 + +#define MEMORY_TEXT 0 +#define MEMORY_CGA 1 +#define MEMORY_HERCULES 2 +#define MEMORY_PLANAR 3 +#define MEMORY_PSEUDO 4 +#define MEMORY_NONCHAIN 5 +#define MEMORY_DIRECT 6 +#define MEMORY_YUV 7 + typedef struct _VesaMode { - int mode; - VbeModeInfoBlock vmib; + int mode; /* mode number */ + int vbe; /* a VBE mode */ + int ModeAttributes; /* mode attributes */ + int NumberOfPlanes; /* number of memory planes */ + int BitsPerPixel; /* bits per pixel */ + int MemoryModel; /* memory model type */ + int RedMaskSize; /* size of direct color red mask in bits */ + int RedFieldPosition; /* bit position of lsb of red mask */ + int GreenMaskSize; /* size of direct color green mask in bits */ + int GreenFieldPosition; /* bit position of lsb of green mask */ + int BlueMaskSize; /* size of direct color blue mask in bits */ + int BlueFieldPosition; /* bit position of lsb of blue mask */ + int RsvdMaskSize; /* size of direct color reserved mask bits*/ + int RsvdFieldPosition; /* bit position of lsb of reserved mask */ + int DirectColorModeInfo; /* direct color mode attributes */ + int XResolution; /* horizontal resolution */ + int YResolution; /* vertical resolution */ + int BytesPerScanLine; /* bytes per scan line */ } VesaModeRec, *VesaModePtr; +#include "vbe.h" +#include "vga.h" + typedef struct _VesaCardPriv { - VbeInfoPtr vi; - VbeInfoBlock *vib; + int vbe; + Vm86InfoPtr vi; VesaModePtr modes; - int nmode; - char text[VESA_TEXT_SAVE]; + int nmode; + int vga_palette; + int old_vbe_mode; + int old_vga_mode; + VbeInfoPtr vbeInfo; + char text[VESA_TEXT_SAVE]; } VesaCardPrivRec, *VesaCardPrivPtr; #define VESA_LINEAR 0 #define VESA_WINDOWED 1 #define VESA_PLANAR 2 +#define VESA_MONO 3 + typedef struct _VesaScreenPriv { VesaModePtr mode; Bool shadow; Bool rotate; int mapping; int origDepth; - void *fb; + void *fb; + int fb_size; } VesaScreenPrivRec, *VesaScreenPrivPtr; extern int vesa_video_mode; extern Bool vesa_force_mode; -Bool vesaListModes(void); -Bool vesaInitialize(KdCardInfo *card, VesaCardPrivPtr priv); -Bool vesaCardInit(KdCardInfo *card); -Bool vesaInitialize (KdCardInfo *card, VesaCardPrivPtr priv); -Bool vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr); -Bool vesaScreenInit(KdScreenInfo *screen); -Bool vesaInitScreen(ScreenPtr pScreen); -Bool vesaEnable(ScreenPtr pScreen); -void vesaDisable(ScreenPtr pScreen); -void vesaPreserve(KdCardInfo *card); -void vesaRestore(KdCardInfo *card); -void vesaCardFini(KdCardInfo *card); -void vesaScreenFini(KdScreenInfo *screen); -void vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs); -void vesaGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs); -int vesaProcessArgument (int argc, char **argv, int i); +void +vesaListModes(void); + +Bool +vesaInitialize(KdCardInfo *card, VesaCardPrivPtr priv); + +Bool +vesaCardInit(KdCardInfo *card); + +Bool +vesaInitialize (KdCardInfo *card, VesaCardPrivPtr priv); + +Bool +vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr); + +Bool +vesaScreenInit(KdScreenInfo *screen); + +Bool +vesaInitScreen(ScreenPtr pScreen); + +Bool +vesaEnable(ScreenPtr pScreen); + +void +vesaDisable(ScreenPtr pScreen); + +void +vesaPreserve(KdCardInfo *card); + +void +vesaRestore(KdCardInfo *card); + +void +vesaCardFini(KdCardInfo *card); + +void +vesaScreenFini(KdScreenInfo *screen); + +void +vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs); + +void +vesaGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs); + +int +vesaProcessArgument (int argc, char **argv, int i); #endif _VESA_H_ diff --git a/xc/programs/Xserver/hw/kdrive/vesa/vesainit.c b/xc/programs/Xserver/hw/kdrive/vesa/vesainit.c index 580977058..d5cd99cdb 100644 --- a/xc/programs/Xserver/hw/kdrive/vesa/vesainit.c +++ b/xc/programs/Xserver/hw/kdrive/vesa/vesainit.c @@ -19,11 +19,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86$ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesainit.c,v 1.4 2000/10/20 00:19:50 keithp Exp $ */ #include "vesa.h" -KdCardFuncs vesaFuncs = { +const KdCardFuncs vesaFuncs = { vesaCardInit, /* cardinit */ vesaScreenInit, /* scrinit */ vesaInitScreen, /* initScreen */ diff --git a/xc/programs/Xserver/hw/xfree86/OS_cygwin.c b/xc/programs/Xserver/hw/xfree86/OS_cygwin.c deleted file mode 100644 index 997815e8b..000000000 --- a/xc/programs/Xserver/hw/xfree86/OS_cygwin.c +++ /dev/null @@ -1,221 +0,0 @@ -/* - * (c) Copyright 1998,1999 by Sebastien Marineau <sebastien@qnx.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * OREST ZBOROWSKI BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF - * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Except as contained in this notice, the name of Orest Zborowski shall not be - * used in advertising or otherwise to promote the sale, use or other dealings - * in this Software without prior written authorization from Orest Zborowski. - * - * $XFree86: xc/programs/Xserver/hw/xfree86/OS_cygwin.c,v 3.1 2000/08/10 17:40:32 dawes Exp $ - */ - -#include "Probe.h" - -#include <errno.h> -#include <fcntl.h> -#include <sys/types.h> -#include <unistd.h> -#include <windows.h> -#include <sys/mman.h> -#include <sys/cygwin.h> - -static int VT_fd = -1; -static int BIOS_fd = -1; - -/* - * OpenVideo -- - * - * Enable access to the installed video hardware. - */ -int OpenVideo() -{ - int fd; - char fn[20]; - - if (geteuid() != 0) { - fprintf(stderr, "%s: Must be run as root\n", MyName); - return(-1); - } - - if ((fd = open("/dev/conin", O_WRONLY, 0)) < 0) { - fprintf(stderr, "%s: Cannot open /dev/conin\n", MyName); - return(-1); - } - - return fd; -} - -/* - * CloseVideo -- - * - * Disable access to the video hardware. - */ -void CloseVideo() -{ - int fd; - - if (VT_fd > 0) { - close(VT_fd); - } -} - -/* - * MapVGA -- - * - * Map the VGA memory window (0xA0000-0xAFFFF) as read/write memory for - * the process for use in probing memory. - */ -Byte *MapVGA() -{ - return( MapMem(0xA0000,0x10000) ); -} - -Byte *MapMem(address, size) - unsigned long address; - unsigned long size; -{ - int fd; - Byte *base; - - if ((fd = open("/dev/zero", O_RDWR)) < 0) { - fprintf(stderr, "%s: Failed to open /dev/zero\n", MyName); - return((Byte *)0); - } - - base = (Byte *)mmap((void *)0, size, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, (off_t)address); - close(fd); - - if ((long)base == -1) { - fprintf(stderr, "%s: Failed to mmap framebuffer\n", MyName); - return((Byte *)0); - } - - return base; -} - -/* - * UnMapVGA -- - * - * Unmap the VGA memory window. - */ -void UnMapVGA(base) - Byte *base; -{ - UnMapMem(base,0x10000); - return; -} - -void UnMapMem(base,size) - Byte *base; - unsigned long size; -{ - munmap((void *)base, size); - return; -} - -/* - * ReadBIOS -- - * - * Read 'Len' bytes from the video BIOS at address 'Bios_Base'+'Offset' into - * buffer 'Buffer'. - */ -int ReadBIOS(Offset, Buffer, Len) -unsigned Offset; -Byte *Buffer; -int Len; -{ - Word tmp; - Byte *Base = Bios_Base + Offset; - Byte *mybase; - off_t myoffset; - int mysize; - - if (BIOS_fd == -1) { - if ((BIOS_fd = open("/dev/mem", O_RDONLY, 0)) < 0) { - fprintf(stderr, "%s: cannot open /dev/mem\n", MyName); - return(-1); - } - } - - if ((off_t)((off_t)Base & 0x7FFF) != (off_t)0) { - /* - * Sanity check... - */ - (void)lseek(BIOS_fd, (off_t)((off_t)Base & 0xF8000), SEEK_SET); - (void)read(BIOS_fd, &tmp, 2); - if (tmp != (Word)0xAA55) { - fprintf(stderr, "%s: BIOS sanity check failed, addr=%x\n", - MyName, (int)Base); - return(-1); - } - } - - if (lseek(BIOS_fd, (off_t)Base, SEEK_SET) < 0) { - fprintf(stderr, "%s: BIOS seek failed\n", MyName); - return(-1); - } - - if (read(BIOS_fd, Buffer, Len) != Len) { - fprintf(stderr, "%s: BIOS read failed\n", MyName); - return(-1); - } - - return Len; -} - -/* - * EnableIOPort -- - * - * Enable access to 'NumPorts' IO ports listed in array 'Ports'. - */ - -/*ARGSUSED*/ -int EnableIOPorts(NumPorts, Ports) -CONST int NumPorts; -CONST Word *Ports; -{ - return(0); -} - -/* - * DisableIOPort -- - * - * Disable access to 'NumPorts' IO ports listed in array 'Ports'. - */ - -/*ARGSUSED*/ -int DisableIOPorts(NumPorts, Port) -CONST int NumPorts; -CONST Word *Port; -{ - return(0); -} - -/* - * ShortSleep -- - * - * Sleep for the number of milliseconds specified in 'Delay'. - */ -void ShortSleep(Delay) -int Delay; -{ - usleep(Delay * 1000); -} diff --git a/xc/programs/Xserver/hw/xfree86/XF86Config.cpp b/xc/programs/Xserver/hw/xfree86/XF86Config.cpp index 96597ff11..47f084a5c 100644 --- a/xc/programs/Xserver/hw/xfree86/XF86Config.cpp +++ b/xc/programs/Xserver/hw/xfree86/XF86Config.cpp @@ -1,4 +1,4 @@ -.\" $XFree86: xc/programs/Xserver/hw/xfree86/XF86Config.cpp,v 1.10 2000/06/20 05:08:42 dawes Exp $ +.\" $XFree86: xc/programs/Xserver/hw/xfree86/XF86Config.cpp,v 1.11 2000/10/24 18:07:49 dawes Exp $ .\" shorthand for double quote that works everywhere. .ds q \N'34' .TH XF86Config __filemansuffix__ "Version 4.0.1" "XFree86" @@ -516,6 +516,9 @@ This option affects the way that bus resource sizes are estimated. Default: 0. .BI "Option \*qNoPM\*q \*q" boolean \*q Disables something to do with power management events. Default: PM enabled on platforms that support it. +.TP 7 +.BI "Option \*qXinerama\*q \*q" boolean \*q +enable or disable XINERAMA extension. Default is disabled. .SH MODULE SECTION The .B Module diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86Config.c b/xc/programs/Xserver/hw/xfree86/common/xf86Config.c index 4a64bc21b..383b00039 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86Config.c +++ b/xc/programs/Xserver/hw/xfree86/common/xf86Config.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Config.c,v 3.230 2000/09/19 12:46:12 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Config.c,v 3.233 2000/10/24 18:07:50 dawes Exp $ */ /* @@ -692,7 +692,8 @@ typedef enum { FLAG_PIXMAP, FLAG_PC98, FLAG_ESTIMATE_SIZES_AGGRESSIVELY, - FLAG_NOPM + FLAG_NOPM, + FLAG_XINERAMA } FlagValues; static OptionInfoRec FlagOptions[] = { @@ -742,6 +743,8 @@ static OptionInfoRec FlagOptions[] = { {0}, FALSE }, { FLAG_NOPM, "NoPM", OPTV_BOOLEAN, {0}, FALSE }, + { FLAG_XINERAMA, "Xinerama", OPTV_BOOLEAN, + {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -770,6 +773,7 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) int i; Pix24Flags pix24 = Pix24DontCare; Bool value; + MessageType from; if(flagsconf == NULL) return TRUE; @@ -779,11 +783,11 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) */ optp = NULL; if (flagsconf->flg_option_lst) - optp = OptionListDup(flagsconf->flg_option_lst); + optp = xf86optionListDup(flagsconf->flg_option_lst); if (layoutopts) { - tmp = OptionListDup(layoutopts); + tmp = xf86optionListDup(layoutopts); if (optp) - optp = OptionListMerge(optp, tmp); + optp = xf86optionListMerge(optp, tmp); else optp = tmp; } @@ -912,6 +916,18 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) } #endif +#ifdef PANORAMIX + from = X_DEFAULT; + if (!noPanoramiXExtension) + from = X_CMDLINE; + else if (xf86GetOptValBool(FlagOptions, FLAG_XINERAMA, &value)) { + noPanoramiXExtension = !value; + from = X_CONFIG; + } + if (!noPanoramiXExtension) + xf86Msg(from, "Xinerama: enabled\n"); +#endif + return TRUE; } @@ -1127,7 +1143,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } if (!havePointer) { if (xf86PointerName) { - confInput = xf86FindInput(xf86PointerName, + confInput = xf86findInput(xf86PointerName, xf86configptr->conf_input_lst); if (!confInput) { xf86Msg(X_ERROR, "No InputDevice section called \"%s\"\n", @@ -1137,10 +1153,10 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) from = X_CMDLINE; } else { from = X_DEFAULT; - confInput = xf86FindInput(CONF_IMPLICIT_POINTER, + confInput = xf86findInput(CONF_IMPLICIT_POINTER, xf86configptr->conf_input_lst); if (!confInput && implicitLayout) { - confInput = xf86FindInputByDriver("mouse", + confInput = xf86findInputByDriver("mouse", xf86configptr->conf_input_lst); } } @@ -1149,7 +1165,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } if (!haveKeyboard) { if (xf86KeyboardName) { - confInput = xf86FindInput(xf86KeyboardName, + confInput = xf86findInput(xf86KeyboardName, xf86configptr->conf_input_lst); if (!confInput) { xf86Msg(X_ERROR, "No InputDevice section called \"%s\"\n", @@ -1159,10 +1175,10 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) from = X_CMDLINE; } else { from = X_DEFAULT; - confInput = xf86FindInput(CONF_IMPLICIT_KEYBOARD, + confInput = xf86findInput(CONF_IMPLICIT_KEYBOARD, xf86configptr->conf_input_lst); if (!confInput && implicitLayout) { - confInput = xf86FindInputByDriver("keyboard", + confInput = xf86findInputByDriver("keyboard", xf86configptr->conf_input_lst); } } @@ -1173,7 +1189,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) count++; indp = xnfrealloc(servlayoutp->inputs, (count + 1) * sizeof(IDevRec)); indp[count - 1] = Pointer; - indp[count - 1].extraOptions = addNewOption(NULL, "CorePointer", NULL); + indp[count - 1].extraOptions = xf86addNewOption(NULL, "CorePointer", NULL); indp[count].identifier = NULL; servlayoutp->inputs = indp; } else if (!havePointer) { @@ -1187,7 +1203,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) count++; indp = xnfrealloc(servlayoutp->inputs, (count + 1) * sizeof(IDevRec)); indp[count - 1] = Keyboard; - indp[count - 1].extraOptions = addNewOption(NULL, "CoreKeyboard", NULL); + indp[count - 1].extraOptions = xf86addNewOption(NULL, "CoreKeyboard", NULL); indp[count].identifier = NULL; servlayoutp->inputs = indp; } else if (!haveKeyboard) { @@ -1237,7 +1253,7 @@ configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout, from = X_CONFIG; } if (xf86LayoutName != NULL) { - if ((l = xf86FindLayout(xf86LayoutName, conf_layout)) == NULL) { + if ((l = xf86findLayout(xf86LayoutName, conf_layout)) == NULL) { xf86Msg(X_ERROR, "No ServerLayout section called \"%s\"\n", xf86LayoutName); return FALSE; @@ -1440,17 +1456,6 @@ configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout, servlayoutp->inputs = indp; servlayoutp->options = conf_layout->lay_option_lst; from = X_DEFAULT; -#ifdef PANORAMIX - if (!noPanoramiXExtension) - from = X_CMDLINE; - else if (xf86FindOption(conf_layout->lay_option_lst, "Xinerama")) { - noPanoramiXExtension = - !xf86SetBoolOption(conf_layout->lay_option_lst, "Xinerama", FALSE); - from = X_CONFIG; - } - if (!noPanoramiXExtension) - xf86Msg(from, "Xinerama: enabled\n"); -#endif if (!checkCoreInputDevices(servlayoutp, FALSE)) return FALSE; @@ -1486,7 +1491,7 @@ configImpliedLayout(serverLayoutPtr servlayoutp, XF86ConfScreenPtr conf_screen) from = X_CONFIG; if (xf86ScreenName != NULL) { - if ((s = xf86FindScreen(xf86ScreenName, conf_screen)) == NULL) { + if ((s = xf86findScreen(xf86ScreenName, conf_screen)) == NULL) { xf86Msg(X_ERROR, "No Screen section called \"%s\"\n", xf86ScreenName); return FALSE; @@ -1660,16 +1665,20 @@ configMonitor(MonPtr monitorp, XF86ConfMonitorPtr conf_monitor) */ while(modeslnk) { - modes = xf86FindModes (modeslnk->ml_modes_str, - xf86configptr->conf_modes_lst); - modeslnk->ml_modes = modes; + /* We may want to reuse the monitor section */ + if (!modeslnk->ml_modes) { + modes = xf86findModes (modeslnk->ml_modes_str, + xf86configptr->conf_modes_lst); + modeslnk->ml_modes = modes; + - /* now add the modes found in the modes - section to the list of modes for this - monitor */ - conf_monitor->mon_modeline_lst = (XF86ConfModeLinePtr) - addListItem((GenericListPtr)conf_monitor->mon_modeline_lst, + /* now add the modes found in the modes + section to the list of modes for this + monitor */ + conf_monitor->mon_modeline_lst = (XF86ConfModeLinePtr) + xf86addListItem((GenericListPtr)conf_monitor->mon_modeline_lst, (GenericListPtr)modes->mon_modeline_lst); + } modeslnk = modeslnk->list.next; } @@ -1758,7 +1767,7 @@ lookupVisual(const char *visname) return -1; for (i = 0; i <= DirectColor; i++) { - if (!NameCompare(visname, xf86VisualNames[i])) + if (!xf86nameCompare(visname, xf86VisualNames[i])) break; } @@ -2006,7 +2015,7 @@ xf86HandleConfigFile(void) if (xf86ConfigFile) from = X_CMDLINE; - filename = xf86OpenConfigFile(searchpath, xf86ConfigFile, PROJECTROOT); + filename = xf86openConfigFile(searchpath, xf86ConfigFile, PROJECTROOT); if (filename) { xf86MsgVerb(from, 0, "Using config file: \"%s\"\n", filename); } else { @@ -2016,11 +2025,11 @@ xf86HandleConfigFile(void) xf86ErrorFVerb(0, "\n"); return FALSE; } - if ((xf86configptr = xf86ReadConfigFile ()) == NULL) { + if ((xf86configptr = xf86readConfigFile ()) == NULL) { xf86Msg(X_ERROR, "Problem parsing the config file\n"); return FALSE; } - xf86CloseConfigFile (); + xf86closeConfigFile (); /* Initialise a few things. */ @@ -2119,12 +2128,12 @@ xf86HandleConfigFile(void) Bool xf86PathIsAbsolute(const char *path) { - return (PathIsAbsolute(path) != 0); + return (xf86pathIsAbsolute(path) != 0); } Bool xf86PathIsSafe(const char *path) { - return (PathIsSafe(path) != 0); + return (xf86pathIsSafe(path) != 0); } diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86Debug.c b/xc/programs/Xserver/hw/xfree86/common/xf86Debug.c index 916003230..eb8d4456d 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86Debug.c +++ b/xc/programs/Xserver/hw/xfree86/common/xf86Debug.c @@ -1,3 +1,5 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Debug.c,v 1.3 2000/09/26 15:57:08 tsi Exp $ */ + #include <sys/time.h> #include <unistd.h> #include "X.h" diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h b/xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h index c58bd5073..39b6472e7 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h +++ b/xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h,v 1.72 2000/09/13 15:47:31 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h,v 1.75 2000/10/23 21:16:45 tsi Exp $ */ /* * PCI Probe * @@ -233,6 +233,10 @@ #define PCI_CHIP_RAGE128ML 0x4D4C #define PCI_CHIP_RAGE128PF 0x5046 #define PCI_CHIP_RAGE128PR 0x5052 +#define PCI_CHIP_RADEON_QD 0x5144 +#define PCI_CHIP_RADEON_QE 0x5145 +#define PCI_CHIP_RADEON_QF 0x5146 +#define PCI_CHIP_RADEON_QG 0x5147 #define PCI_CHIP_RAGE128RE 0x5245 #define PCI_CHIP_RAGE128RF 0x5246 #define PCI_CHIP_RAGE128RK 0x524B @@ -783,6 +787,10 @@ static pciVendorDeviceInfo xf86PCIVendorInfoData[] = { {PCI_CHIP_RAGE128ML, "Rage 128 Mobility ML",0}, {PCI_CHIP_RAGE128PF, "Rage 128 Pro PF",0}, {PCI_CHIP_RAGE128PR, "Rage 128 Pro PR",0}, + {PCI_CHIP_RADEON_QD, "Radeon QD",0}, + {PCI_CHIP_RADEON_QE, "Radeon QE",0}, + {PCI_CHIP_RADEON_QF, "Radeon QF",0}, + {PCI_CHIP_RADEON_QG, "Radeon QG",0}, {PCI_CHIP_RAGE128RE, "Rage 128 RE",0}, {PCI_CHIP_RAGE128RF, "Rage 128 RF",0}, {PCI_CHIP_RAGE128RK, "Rage 128 RK",0}, @@ -1078,6 +1086,7 @@ static pciVendorDeviceInfo xf86PCIVendorInfoData[] = { {PCI_VENDOR_SUN, { {0x1000, "EBUS",0 }, {0x1001, "Happy Meal",0 }, + {0x5000, "Advanced PCI bridge",0 }, {0x8000, "PCI Bus Module",0 }, {0x0000, NULL,0}}}, {PCI_VENDOR_CMD, { diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c b/xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c index a6c217cfd..9b44afe8f 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c +++ b/xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c,v 3.21 2000/09/19 12:46:13 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c,v 3.24 2000/10/26 11:47:45 tsi Exp $ */ /* * Copyright (c) 1997-1999 by The XFree86 Project, Inc. @@ -116,6 +116,8 @@ pciVendorDeviceInfo * xf86PCIVendorInfo; static void getPciClassFlags(pciConfigPtr *pcrpp); +static void +pciConvertListToHost(int bus, int dev, int func, resPtr list); static void FindPCIVideoInfo(void) @@ -227,8 +229,9 @@ FindPCIVideoInfo(void) mem64 = TRUE; #if defined LONG64 || defined WORD64 info->memBase[0] |= - (memType)PCIGETMEMORY64HIGH(pcrp->pci_base0) << 32; + (memType)PCIGETMEMORY64HIGH(pcrp->pci_base1) << 32; #else + if (pcrp->pci_base1) info->memBase[0] = 0; #endif } @@ -246,13 +249,14 @@ FindPCIVideoInfo(void) mem64 = TRUE; #if defined LONG64 || defined WORD64 info->memBase[1] |= - (memType)PCIGETMEMORY64HIGH(pcrp->pci_base1) << 32; + (memType)PCIGETMEMORY64HIGH(pcrp->pci_base2) << 32; #else + if (pcrp->pci_base2) info->memBase[1] = 0; #endif } } - } else if (mem64) + } else mem64 = FALSE; if (pcrp->pci_base2 && !mem64) { @@ -265,14 +269,15 @@ FindPCIVideoInfo(void) if (PCI_MAP_IS64BITMEM(pcrp->pci_base2)) { mem64 = TRUE; #if defined LONG64 || defined WORD64 - info->memBase[1] |= - (memType)PCIGETMEMORY64HIGH(pcrp->pci_base1) << 32; + info->memBase[2] |= + (memType)PCIGETMEMORY64HIGH(pcrp->pci_base3) << 32; #else - info->memBase[1] = 0; + if (pcrp->pci_base3) + info->memBase[2] = 0; #endif } } - } else if (mem64) + } else mem64 = FALSE; if (pcrp->pci_base3 && !mem64) { @@ -286,13 +291,14 @@ FindPCIVideoInfo(void) mem64 = TRUE; #if defined LONG64 || defined WORD64 info->memBase[3] |= - (memType)PCIGETMEMORY64HIGH(pcrp->pci_base3) << 32; + (memType)PCIGETMEMORY64HIGH(pcrp->pci_base4) << 32; #else + if (pcrp->pci_base4) info->memBase[3] = 0; #endif } } - } else if (mem64) + } else mem64 = FALSE; if (pcrp->pci_base4 && !mem64) { @@ -306,13 +312,14 @@ FindPCIVideoInfo(void) mem64 = TRUE; #if defined LONG64 || defined WORD64 info->memBase[4] |= - (memType)PCIGETMEMORY64HIGH(pcrp->pci_base4) << 32; + (memType)PCIGETMEMORY64HIGH(pcrp->pci_base5) << 32; #else + if (pcrp->pci_base5) info->memBase[4] = 0; #endif } } - } else if (mem64) + } else mem64 = FALSE; if (pcrp->pci_base5 && !mem64) { @@ -323,7 +330,8 @@ FindPCIVideoInfo(void) info->type[5] = pcrp->pci_base5 & PCI_MAP_MEMORY_ATTR_MASK; info->memBase[5] = (memType)PCIGETMEMORY(pcrp->pci_base5); } - } + } else + mem64 = FALSE; info->listed_class = pcrp->listed_class; } i++; @@ -992,11 +1000,14 @@ fixPciResource(int prt, memType alignment, pciVideoPtr pvp, long type) resRange range; resPtr resSize = NULL; resPtr w_tmp, w = NULL, w_2nd = NULL; - PCITAG tag = pciTag(pvp->bus,pvp->device,pvp->func); + PCITAG tag; PciBusPtr pbp = xf86PciBus, pbp1 = xf86PciBus; + pciConfigPtr pcp; resPtr tmp; if (!pvp) return FALSE; + tag = pciTag(pvp->bus,pvp->device,pvp->func); + pcp = pvp->thisCard; type &= ResAccMask; if (!type) type = ResShared; @@ -1090,8 +1101,7 @@ fixPciResource(int prt, memType alignment, pciVideoPtr pvp, long type) } /* convert bus based entries in avoid list to host base */ - xf86ConvertListToHost( - xf86GetPciEntity(pvp->bus,pvp->device,pvp->func), avoid); + pciConvertListToHost(pvp->bus,pvp->device,pvp->func, avoid); if (!w) w = xf86DupResList(ResRange); @@ -1240,19 +1250,34 @@ fixPciResource(int prt, memType alignment, pciVideoPtr pvp, long type) (*p_base) = H2B(tag,range.rBegin,type); #ifdef DEBUG ErrorF("New PCI res %i base: 0x%lx, size: 0x%lx, type %s\n", - res_n,(*p_base),(1 << (*p_size)),type | ResMem ? "Mem" : "Io"); + res_n,(*p_base),(1 << (*p_size)), (type & ResMem) ? "Mem" : "Io"); #endif if (res_n != 0xff) { - pciWriteLong(tag,PCI_CMD_BASE_REG + res_n * sizeof(CARD32), - (CARD32)(*p_base) | (CARD32)(p_type)); + if (type & ResMem) + pvp->memBase[prt] = range.rBegin; + else + pvp->ioBase[prt] = range.rBegin; + ((CARD32 *)(&(pcp->pci_base0)))[res_n] = + (CARD32)(*p_base) | (CARD32)(p_type); + pciWriteLong(tag, PCI_CMD_BASE_REG + res_n * sizeof(CARD32), + ((CARD32 *)(&(pcp->pci_base0)))[res_n]); + if (PCI_MAP_IS64BITMEM(p_type)) { #if defined LONG64 || defined WORD64 - if (PCI_MAP_IS64BITMEM(p_type)) - pciWriteLong(tag,PCI_CMD_BASE_REG + (res_n + 1) * sizeof(CARD32), - (CARD32)(*p_base >> 32)); + ((CARD32 *)(&(pcp->pci_base0)))[res_n + 1] = + (CARD32)(*p_base >> 32); + pciWriteLong(tag, PCI_CMD_BASE_REG + (res_n + 1) * sizeof(CARD32), + ((CARD32 *)(&(pcp->pci_base0)))[res_n + 1]); +#else + ((CARD32 *)(&(pcp->pci_base0)))[res_n + 1] = 0; + pciWriteLong(tag, PCI_CMD_BASE_REG + (res_n + 1) * sizeof(CARD32), + 0); #endif + } } else { - CARD32 val = pciReadLong(tag,PCI_CMD_BIOS_REG) & 0x01; - pciWriteLong(tag,PCI_CMD_BIOS_REG,(CARD32)(*p_base) | val); + pvp->biosBase = range.rBegin; + pcp->pci_baserom = (pciReadLong(tag,PCI_CMD_BIOS_REG) & 0x01) | + (CARD32)(*p_base); + pciWriteLong(tag, PCI_CMD_BIOS_REG, pcp->pci_baserom); } /* @@@ fake BIOS allocated resource */ range.type |= ResBios; @@ -1384,8 +1409,7 @@ getValidBIOSBase(PCITAG tag, int num) } pbp = pbp->next; } - xf86ConvertListToHost( - xf86GetPciEntity(pvp->bus,pvp->device,pvp->func), avoid); + pciConvertListToHost(pvp->bus,pvp->device,pvp->func, avoid); if (pvp->biosBase) { /* try biosBase first */ P_M_RANGE(range, TAG(pvp),pvp->biosBase,biosSize,ResExcMemBlock); @@ -1476,6 +1500,46 @@ printBridgeInfo(PciBusPtr PciBus) xf86PrintResList(3, PciBus->preferred_pmem); } +/* + * This Sun PCI-->PCI bridge must be handled specially since it does + * not report the decoded I/O and MEM ranges in the usual way. + */ +#define APB_IO_ADDRESS_MAP 0xde +#define APB_MEM_ADDRESS_MAP 0xdf + +static void +get_sun_apb_ranges(PciBusPtr PciBus, pciConfigPtr pcrp) +{ + unsigned char iomap, memmap; + resRange range; + int i; + + iomap = pciReadByte(pcrp->tag, APB_IO_ADDRESS_MAP); + memmap = pciReadByte(pcrp->tag, APB_MEM_ADDRESS_MAP); + + /* if (pcrp->pci_command & PCI_CMD_IO_ENABLE) */ { /* ??? */ + for (i = 0; i < 8; i++) { + if ((iomap & (1 << i)) != 0) { + PCI_I_RANGE(range, pcrp->tag, + (i << 21), (i << 21) + ((1 << 21) - 1), + ResIo | ResBlock | ResExclusive); + PciBus->io = xf86AddResToList(PciBus->io, &range, -1); + } + } + } + + /* if (pcrp->pci_command & PCI_CMD_MEM_ENABLE) */ { /* ??? */ + for (i = 0; i < 8; i++) { + if ((memmap & (1 << i)) != 0) { + PCI_M_RANGE(range, pcrp->tag, + (i << 29), (i << 29) + ((1 << 29) - 1), + ResMem | ResBlock | ResExclusive); + PciBus->mem = xf86AddResToList(PciBus->mem, &range, -1); + } + } + } +} + PciBusPtr xf86GetPciBridgeInfo(const pciConfigPtr *pciInfo) { @@ -1519,7 +1583,14 @@ xf86GetPciBridgeInfo(const pciConfigPtr *pciInfo) PciBus->subclass = sub_class; PciBus->interface = pcrp->pci_prog_if; PciBus->brcontrol = pcrp->pci_bridge_control; - if (pcrp->pci_command & PCI_CMD_IO_ENABLE) { + if (pcrp->pci_vendor == PCI_VENDOR_SUN && + pcrp->pci_device == 0x5000) { + get_sun_apb_ranges(PciBus, pcrp); + break; + } + if ((pcrp->pci_command & PCI_CMD_IO_ENABLE) && + (pcrp->pci_upper_io_base || pcrp->pci_io_base || + pcrp->pci_upper_io_limit || pcrp->pci_io_limit)) { base = (pcrp->pci_upper_io_base << 16) | ((pcrp->pci_io_base & 0xf0u) << 8); limit = (pcrp->pci_upper_io_limit << 16) | @@ -1545,7 +1616,14 @@ xf86GetPciBridgeInfo(const pciConfigPtr *pciInfo) PciBus->preferred_io, &range, -1); } } - if (pcrp->pci_command & PCI_CMD_MEM_ENABLE) { + if (pcrp->pci_command & PCI_CMD_MEM_ENABLE) { + /* + * The P2P spec requires these next two, but some bridges + * don't comply. Err on the side of caution, making the not + * so bold assumption that no bridge would ever re-route the + * bottom megabyte. + */ + if (pcrp->pci_mem_base || pcrp->pci_mem_limit) { base = pcrp->pci_mem_base & 0xfff0u; limit = pcrp->pci_mem_limit & 0xfff0u; if (base <= limit) { @@ -1555,6 +1633,12 @@ xf86GetPciBridgeInfo(const pciConfigPtr *pciInfo) PciBus->preferred_mem = xf86AddResToList(NULL, &range, -1); } + } + + if (pcrp->pci_prefetch_mem_base || + pcrp->pci_prefetch_mem_limit || + pcrp->pci_prefetch_upper_mem_base || + pcrp->pci_prefetch_upper_mem_limit) { base = pcrp->pci_prefetch_mem_base & 0xfff0u; limit = pcrp->pci_prefetch_mem_limit & 0xfff0u; #if defined(LONG64) || defined(WORD64) @@ -1568,6 +1652,7 @@ xf86GetPciBridgeInfo(const pciConfigPtr *pciInfo) PciBus->preferred_pmem = xf86AddResToList(NULL, &range, -1); } + } } break; case PCI_SUBCLASS_BRIDGE_ISA: @@ -1864,8 +1949,7 @@ ValidatePci(void) if (res_m_io == NULL) res_m_io = xf86DupResList(ResRange); - xf86ConvertListToHost( - xf86GetPciEntity(pvp->bus,pvp->device,pvp->func), avoid); + pciConvertListToHost(pvp->bus,pvp->device,pvp->func, avoid); #ifdef DEBUG xf86MsgVerb(X_INFO, 3,"avoid:\n"); @@ -2790,11 +2874,9 @@ pciTestMultiDeviceCard(int bus, int dev, int func, PCITAG** pTag) return j; } -void -pciConvertRange2Host(int entityIndex, resRange *pRange) +static void +pciTagConvertRange2Host(PCITAG tag, resRange *pRange) { - PCITAG tag = TAG(xf86GetPciInfoForEntity(entityIndex)); - switch(pRange->type & ResPhysMask) { case ResMem: switch(pRange->type & ResExtMask) { @@ -2827,3 +2909,21 @@ pciConvertRange2Host(int entityIndex, resRange *pRange) } } +static void +pciConvertListToHost(int bus, int dev, int func, resPtr list) +{ + PCITAG tag = pciTag(bus,dev,func); + while (list) { + pciTagConvertRange2Host(tag, &list->val); + list = list->next; + } +} + + +void +pciConvertRange2Host(int entityIndex, resRange *pRange) +{ + PCITAG tag = TAG(xf86GetPciInfoForEntity(entityIndex)); + pciTagConvertRange2Host(tag, pRange); +} + diff --git a/xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml b/xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml index 90373c9fd..633ef6b09 100644 --- a/xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml +++ b/xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml @@ -15,7 +15,7 @@ <date>24 October 2000 <ident> - $XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml,v 1.7 2000/08/28 18:24:15 dawes Exp $ + $XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml,v 1.8 2000/09/24 13:51:26 alanh Exp $ </ident> <toc> diff --git a/xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml b/xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml index 3830c5821..821effd12 100644 --- a/xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml +++ b/xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml @@ -15,7 +15,7 @@ <date>29 October 2000 <ident> - $XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml,v 1.5 2000/08/28 18:24:15 dawes Exp $ + $XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml,v 1.6 2000/09/24 13:51:26 alanh Exp $ </ident> <toc> diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c index a2c5acd04..6a8147fcd 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c,v 1.3 2000/08/04 21:07:13 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c,v 1.4 2000/10/11 22:52:55 tsi Exp $ */ /* * Copyright 2000 by Marc Aurele La France (TSI @ UQV), tsi@ualberta.ca * @@ -22,12 +22,13 @@ */ #include "ati.h" -#include "atiadapter.h" #include "atiadjust.h" #include "atichip.h" #include "atidac.h" #include "atidga.h" #include "atiident.h" +#include "atimode.h" +#include "atistruct.h" #include "dgaproc.h" @@ -120,7 +121,7 @@ ATIDGASetMode pATI->XModifier = pATI->bitsPerPixel / UnitOf(pATI->bitsPerPixel); ATIAdjustPreInit(pATI); - ATIAdapterPreInit(pScreenInfo, pATI, &pATI->NewHW); + ATIModePreInit(pScreenInfo, pATI, &pATI->NewHW); if (!(*pScreenInfo->SwitchMode)(scrnIndex, pMode, 0)) return FALSE; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/atiio.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/atiio.c deleted file mode 100644 index f055f2029..000000000 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/atiio.c +++ /dev/null @@ -1,119 +0,0 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atiio.c,v 1.3 1999/07/06 11:38:31 dawes Exp $ */ -/* - * Copyright 1997 through 1999 by Marc Aurele La France (TSI @ UQV), tsi@ualberta.ca - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting documentation, and - * that the name of Marc Aurele La France not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. Marc Aurele La France makes no representations - * about the suitability of this software for any purpose. It is provided - * "as-is" without express or implied warranty. - * - * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO - * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -#include "atichip.h" -#include "atiio.h" - -/* - * ATISetVGAIOBase -- - * - * This sets vgaIOBase according to the value of the passed value of the - * miscellaneous output register. - */ -void -ATISetVGAIOBase -( - ATIPtr pATI, - const CARD8 misc -) -{ - pATI->CPIO_VGABase = (misc & 0x01U) ? ColourIOBase : MonochromeIOBase; -} - -/* - * ATIModifyExtReg -- - * - * This function is called to modify certain bits in an ATI extended VGA - * register while preserving its other bits. The function will not write the - * register if it turns out its value would not change. This helps prevent - * server hangs on older adapters. - */ -void -ATIModifyExtReg -( - ATIPtr pATI, - const CARD8 Index, - int CurrentValue, - const CARD8 CurrentMask, - CARD8 NewValue -) -{ - /* Possibly retrieve the current value */ - if (CurrentValue < 0) - CurrentValue = ATIGetExtReg(Index); - - /* Compute new value */ - NewValue &= (CARD8)(~CurrentMask); - NewValue |= CurrentValue & CurrentMask; - - /* Check if value will be changed */ - if (CurrentValue == NewValue) - return; - - /* - * The following is taken from ATI's VGA Wonder programmer's reference - * manual which says that this is needed to "ensure the proper state of the - * 8/16 bit ROM toggle". I suspect a timing glitch appeared in the 18800 - * after its die was cast. 18800-1 and later chips do not exhibit this - * problem. - */ - if ((pATI->Chip <= ATI_CHIP_18800) && (Index == 0xB2U) && - ((NewValue ^ 0x40U) & CurrentValue & 0x40U)) - { - CARD8 misc = inb(R_GENMO); - CARD8 bb = ATIGetExtReg(0xBBU); - - outb(GENMO, (misc & 0xF3U) | 0x04U | ((bb & 0x10U) >> 1)); - CurrentValue &= (CARD8)(~0x40U); - ATIPutExtReg(0xB2U, CurrentValue); - ATIDelay(5); - outb(GENMO, misc); - ATIDelay(5); - if (CurrentValue != NewValue) - ATIPutExtReg(0xB2U, NewValue); - } - else - ATIPutExtReg(Index, NewValue); -} - -/* - * ATIAccessMach64PLLReg -- - * - * This function sets up the addressing required to access, for read or write, - * a 264xT's PLL registers. - */ -void -ATIAccessMach64PLLReg -( - ATIPtr pATI, - const CARD8 Index, - const Bool Write -) -{ - CARD8 clock_cntl1 = inb(pATI->CPIO_CLOCK_CNTL + 1) & - ~GetByte(PLL_WR_EN | PLL_ADDR, 1); - - /* Set PLL register to be read or written */ - outb(pATI->CPIO_CLOCK_CNTL + 1, clock_cntl1 | - GetByte(SetBits(Index, PLL_ADDR) | SetBits(Write, PLL_WR_EN), 1)); -} diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h index 663e06918..e19c4019f 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h,v 1.3 2000/08/22 21:54:30 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h,v 1.4 2000/10/11 22:52:56 tsi Exp $ */ /* * Copyright 2000 by Marc Aurele La France (TSI @ UQV), tsi@ualberta.ca * @@ -31,6 +31,7 @@ #define ___ATIMACH64IO_H___ 1 #include "atiio.h" +#include "atistruct.h" /* * A few important notes on some of the I/O statements provided: diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/atimodule.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/atimodule.h deleted file mode 100644 index 0aea97208..000000000 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/atimodule.h +++ /dev/null @@ -1,32 +0,0 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atimodule.h,v 1.1 1999/07/06 11:38:32 dawes Exp $ */ -/* - * Copyright 1997 through 1999 by Marc Aurele La France (TSI @ UQV), tsi@ualberta.ca - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting documentation, and - * that the name of Marc Aurele La France not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. Marc Aurele La France makes no representations - * about the suitability of this software for any purpose. It is provided - * "as-is" without express or implied warranty. - * - * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO - * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -#if defined(XFree86LOADER) && !defined(___ATI_MODULE_H___) -#define ___ATI_MODULE_H___ 1 - -#include "atiproto.h" -#include "xf86str.h" - -extern Bool ATILoadModules FunctionPrototype((ScrnInfoPtr)); - -#endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_driver.c index 3873c2f08..fe055b55e 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_driver.c @@ -11,7 +11,7 @@ * Guy DESBIEF */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_driver.c,v 1.14 2000/09/22 11:12:32 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_driver.c,v 1.15 2000/10/09 23:37:11 alanh Exp $ */ /* All drivers should typically include these */ #include "xf86.h" @@ -1660,6 +1660,8 @@ AlpScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) */ xf86SetBlackWhitePixels(pScreen); + xf86SetSilkenMouse(pScreen); + /* Initialise cursor functions */ miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaa.c b/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaa.c index 52aabaed9..b28025d6d 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaa.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaa.c @@ -1,6 +1,6 @@ /* (c) Itai Nahshon */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaa.c,v 1.3 2000/09/22 11:12:32 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaa.c,v 1.4 2000/10/23 12:10:14 alanh Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -18,6 +18,32 @@ #define WAIT outb(0x3CE,0x31); while(inb(0x3CF) & pCir->chip.alp->waitMsk){}; #define WAIT_1 outb(0x3CE,0x31); while(inb(0x3CF) & 0x1){}; +static const CARD16 translated_rop[] = +{ + /* GXclear */ 0x0032U, + /* GXand */ 0x0532U, + /* GXandreverse */ 0x0932U, + /* GXcopy */ 0x0D32U, + /* GXandinversted */ 0x5032U, + /* GXnoop */ 0x0632U, + /* GXxor */ 0x5932U, + /* GXor */ 0x6D32U, + /* GXnor */ 0x9032U, + /* GXequiv */ 0x9532U, + /* GXinvert */ 0x0B32U, + /* GXorReverse */ 0xAD32U, + /* GXcopyInverted */ 0xD032U, + /* GXorInverted */ 0xD632U, + /* GXnand */ 0xDA32U, + /* GXset */ 0x0E32U +}; + +#if 1 +#define SetupForRop(rop) outw(0x3CE, translated_rop[rop]) +#else +#define SetupForRop(rop) outw(0x3CE, 0x0D32) +#endif + static void AlpSync(ScrnInfoPtr pScrn) { #ifdef ALP_DEBUG @@ -29,8 +55,8 @@ static void AlpSync(ScrnInfoPtr pScrn) static void AlpSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, - int rop, unsigned int planemask, - int trans_color) + int rop, unsigned int planemask, + int trans_color) { CirPtr pCir = CIRPTR(pScrn); int pitch = pCir->pitch; @@ -40,7 +66,7 @@ AlpSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, xdir, ydir, rop, planemask, trans_color); #endif WAIT; - outw(0x3CE,0x0d32); + SetupForRop(rop); /* Set dest pitch */ outw(0x3CE, ((pitch << 8) & 0xff00) | 0x24); outw(0x3CE, ((pitch) & 0x1f00) | 0x25); @@ -118,8 +144,7 @@ AlpSetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, #endif WAIT; - /* GR32 = 0x0D => verbatim source copy (no logical op) */ - outw(0x3CE, 0x0D32); + SetupForRop(rop); switch (pCir -> Chipset) { @@ -210,8 +235,7 @@ AlpSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, #endif WAIT; - /* GR32 = 0x0D => verbatim source copy (no logical op) */ - outw(0x3CE, 0x0D32); + SetupForRop(rop); { int source = pAlp->monoPattern8x8; @@ -313,8 +337,7 @@ AlpSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, #endif WAIT; - /* GR32 = 0x0D => verbatim source copy (no logical op) */ - outw(0x3CE, 0x0D32); + SetupForRop(rop); /* GR30 = color expansion, CPU->display copy */ /* Choses 8bpp / 16bpp color expansion */ @@ -409,8 +432,7 @@ AlpSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, #endif WAIT; - /* GR32 = 0x0D => verbatim source copy (no logical op) */ - outw(0x3CE, 0x0D32); + SetupForRop(rop); /* GR30 = color expansion, CPU->display copy */ /* Choses 8bpp / 16bpp color expansion */ @@ -559,7 +581,8 @@ AlpXAAInit(ScreenPtr pScreen) XAAPtr->SetupForScreenToScreenCopy = AlpSetupForScreenToScreenCopy; XAAPtr->SubsequentScreenToScreenCopy = AlpSubsequentScreenToScreenCopy; - XAAPtr->ScreenToScreenCopyFlags = GXCOPY_ONLY|NO_TRANSPARENCY|NO_PLANEMASK; + XAAPtr->ScreenToScreenCopyFlags = + NO_TRANSPARENCY | NO_PLANEMASK; switch (pCir->Chipset) { @@ -568,15 +591,15 @@ AlpXAAInit(ScreenPtr pScreen) XAAPtr->SetupForSolidFill = AlpSetupForSolidFill; XAAPtr->SubsequentSolidFillRect = AlpSubsequentSolidFillRect; XAAPtr->SubsequentSolidFillTrap = NULL; - XAAPtr->SolidFillFlags = GXCOPY_ONLY|NO_PLANEMASK; + XAAPtr->SolidFillFlags = NO_PLANEMASK; XAAPtr->SetupForMono8x8PatternFill = AlpSetupForMono8x8PatternFill; XAAPtr->SubsequentMono8x8PatternFillRect = AlpSubsequentMono8x8PatternFillRect; XAAPtr->SubsequentMono8x8PatternFillTrap = NULL; XAAPtr->Mono8x8PatternFillFlags = - GXCOPY_ONLY|NO_PLANEMASK| - HARDWARE_PATTERN_PROGRAMMED_BITS|BIT_ORDER_IN_BYTE_MSBFIRST; + NO_PLANEMASK | + HARDWARE_PATTERN_PROGRAMMED_BITS | BIT_ORDER_IN_BYTE_MSBFIRST; #if 0 /* Currently disabled: XF86 sends DWORD-padded data, @@ -587,9 +610,9 @@ AlpXAAInit(ScreenPtr pScreen) AlpSubsequentCPUToScreenColorExpandFill; XAAPtr->ColorExpandBase = pCir->FbBase + 4; XAAPtr->CPUToScreenColorExpandFillFlags = - GXCOPY_ONLY|NO_PLANEMASK|BIT_ORDER_IN_BYTE_MSBFIRST| - SCANLINE_PAD_DWORD| - CPU_TRANSFER_PAD_DWORD|CPU_TRANSFER_BASE_FIXED; + NO_PLANEMASK | BIT_ORDER_IN_BYTE_MSBFIRST | + SCANLINE_PAD_DWORD | ROP_NEEDS_SOURCE | + CPU_TRANSFER_PAD_DWORD | CPU_TRANSFER_BASE_FIXED; #endif #if 1 /* kludge: since XF86 does not support byte-padded @@ -622,8 +645,8 @@ AlpXAAInit(ScreenPtr pScreen) malloc(buffer_size); } XAAPtr->ScanlineCPUToScreenColorExpandFillFlags = - GXCOPY_ONLY|NO_PLANEMASK|BIT_ORDER_IN_BYTE_MSBFIRST| - SCANLINE_PAD_DWORD; + NO_PLANEMASK | BIT_ORDER_IN_BYTE_MSBFIRST | + SCANLINE_PAD_DWORD | ROP_NEEDS_SOURCE; #endif break; @@ -632,7 +655,7 @@ AlpXAAInit(ScreenPtr pScreen) XAAPtr->SetupForSolidFill = AlpSetupForSolidFill; XAAPtr->SubsequentSolidFillRect = AlpSubsequentSolidFillRect; XAAPtr->SubsequentSolidFillTrap = NULL; - XAAPtr->SolidFillFlags = GXCOPY_ONLY|NO_TRANSPARENCY|NO_PLANEMASK; + XAAPtr->SolidFillFlags = NO_TRANSPARENCY|NO_PLANEMASK; outw(0x3CE, 0x200E); /* enable writes to gr33 */ break; } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/README.pm3 b/xc/programs/Xserver/hw/xfree86/drivers/glint/README.pm3 index 8502a81e8..3d5835856 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/README.pm3 +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/README.pm3 @@ -1,51 +1,44 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/README.pm3,v 1.2 2000/09/19 14:12:31 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/README.pm3,v 1.3 2000/10/17 09:07:03 alanh Exp $ */ -STATUS as of Sat, 9 Sep 2000 11:34:31 +0200 +STATUS as of Mon, 16 Oct 2000 21:24:51 +0200 Working : * Unaccelerated : Depth 8, 15, 16 and 24 are ok. I tested them upto 1280x1024 only as my monitor don't support higher modes. * HW cursor. - * Partial 2D Accels. * ShadowFb works. - -Not Working (see below for more detail) : - * Dual head : Dual head should work, but there is still a bug in the vga - functions mmio vs io issue. When run in dual head mode, the console, - altough still there will show no output. Blind typing will work though. - Well ctr-alt-del will work and is especially friendly to your partitions. - * Full 2D Accels. - * Video Overlay. - * DRI. - * Initialization on non Appian J2000 boards, if not done by the BIOS will - cause problems. - -Dual head : - - * glint_driver.c:2322-2325: - The problem is that the usage of mmio functions for vga graphics index & - port (GraphicsIndexReg : 0x63ce, GraphicsPort : 0x3cf) corrupts the - console font for pm3 and pm2v. Using IO functions for it solve this, but - breaks dualheaded as there is no more console ouput then. - -2D Accels [WORK IN PROGRESS] : - - * Only little endian is supported right now. Big endian may work also, - but i don't have a big endian box to test it on. - * Implemented are : - - Screen to screen copy. - - Solid fills. + * Full 2D Accels. (Need testing and tuning on big endian systems.) + - Sync. - Pixmap cache. - Offscreen pixmaps. - - Sync. - Clipping. - * Screen to screen copy present two problems : - - when doing the copy, there are temporary noise around the area getting - copied. - - when doing very small copies from left to right (as when the window - manager is doing opaque moves) there is corruption on the left side of - the window. Using ONLY_LEFT_TO_RIGHT_BITBLT solves this. But still, the - pm3 should be able to handle this. + - Screen to screen copy. + - Solid fills. + - HorVert Solid Lines . + - 8x8 Mono Pattern Fills. + - Color Expansion Fills. + - Images Writes. + * Appian J2000 second head initialization. + * Dual head : The console fonts will get trashed, but dual head works. +Not Working : + * 2D Accel hooks not implemented : + - Solid & Dashed Lines are not possible on glint hardware. + - 8x8 Color Pattern Fill is almost never used. + * Video Overlay. + * DRI. + +Known Problem : + + * Console gets broken when using dual headed mode. The culprit seems to be + the vga graphics index & port (GraphicsIndexReg : 0x63ce, GraphicsPort : + 0x3cf). I had to use IO acces for both these two, because if not, console + fonts would get trashed even in mono headed mode. + * R-B inversion. Sometimes, all of a sudden, it seems as the RGB order + gets changed. going to console and back solves this. + * [TRIGGERED IN ENLIGTHENMENT ONLY] When moving a window around a lot + quicly, the video outputs dies. I have to switch to a console and back + to have it restored. Is it possible that the accel engine gets + overloaded or something such ? Video Overlay [NOTHING DONE YET] : @@ -53,25 +46,12 @@ Video Overlay [NOTHING DONE YET] : DRI/3D Accels [NOTHING DONE YET] : - * Current Gamma support only works with dualmx boards and the like where - the gamma chip is actually doing the rendering, and the rasterizer chip - are slaves of the gamma chip. - - * The approach taken by the current pm3 driver is to have each pm3 having - its own driver instance. We thus need a setup for sharing the gamma between - both pm3. Such a setup was already done for the G400 dual head feature. - Need to investigate this. - - * One alternative could be to use the pm3 for 3D Accels, but as the pm3 has - only a Delta unit, this is not optimal. However it would be nice for - pm3 boards lacking gamma chip, and could maybe be shared with pm2 boards ? - - * Also it could maybe be possible to share the workload between the Gamma - and the pm3. Don't know about this though ... - -Initialization [NEED TESTING ON NON J2000 BOARD] : - - * Second head of Jeronimo 2000 is not initialized by the bios, So memory - timings need to be set. I set them only if subsysVendor & subsysCard are - matching J2000. Need feedback of other dual pm3 boards. + * First approach would be to use the gamma for one head only (most probably + the first head, it could be configurable though). + * Sharing the gamma between both driver instances would need a setup similar + of what was done for the Matrox dualheaded G400 (mga driver). + * Alternatively it could be possible to use DRI with the gamma on one head, + and DRI with the pm3 alone on the second head. This would need writing a + pm3 drm kernel driver as well as a pm3 OpenGL driver. Could be useful for + boards without gamma chips though. diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint.cpp b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint.cpp index e96e9e40b..9aeedfe1f 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint.cpp +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint.cpp @@ -1,4 +1,4 @@ -.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint.cpp,v 1.8 2000/09/19 14:12:31 alanh Exp $ +.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint.cpp,v 1.9 2000/10/17 09:07:04 alanh Exp $ .\" shorthand for double quote that works everywhere. .ds q \N'34' .TH GLINT __drivermansuffix__ "Version 4.0.1" "XFree86" @@ -18,15 +18,6 @@ is an XFree86 driver for 3Dlabs & Texas Instruments GLINT/Permedia based video cards. The driver is rather fully accelerated, and provides support for the following framebuffer depths: 8, 15 (may give bad results with FBDev support), 16, 24 (32 bpp recommended, 24 bpp has problems), 30, and an 8+24 overlay mode. -For the -.B Glint Permedia 3 -, the driver supports unaccelerated modes of depth 8 (bpp 8), 15 and 16 (bpp 16) -and 24 (bppi 32) in single headed mode. -2D Acceleration is working, but there are some visual artifacts with the -ScreenToScreenCopy accel. -Dual head (on the Appian J2000 board) is working, but the console screen will -get corrupted, blind typing still works though. -See the README.pm3 file for more details. .SH SUPPORTED HARDWARE The .B glint @@ -119,4 +110,5 @@ option. .SH "SEE ALSO" XFree86(1), XF86Config(__filemansuffix__), xf86config(1), Xserver(1), X(__miscmansuffix__) .SH AUTHORS -Authors include: Alan Hourihane, Dirk Hohndel, Stefan Dirsch, Michel Dänzer +Authors include: Alan Hourihane, Dirk Hohndel, Stefan Dirsch, Michel Dänzer, +Sven Luther diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint.h b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint.h index 9da2b8c26..41adfd348 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint.h,v 1.34 2000/09/19 19:19:22 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint.h,v 1.36 2000/10/17 09:07:04 alanh Exp $ */ /* * Copyright 1997,1998 by Alan Hourihane <alanh@fairlite.demon.co.uk> * @@ -96,7 +96,7 @@ typedef struct { int planemask; int realMXWidth; CARD32 IOAddress; - CARD32 FbAddress; + unsigned long FbAddress; int irq; unsigned char * IOBase; unsigned char * IOBaseVGA; @@ -144,6 +144,7 @@ typedef struct { CARD32 RasterizerSwap; int PM3_Config2D; int PM3_Render2D; + int PM3_AreaStippleMode; int PM3_VideoControl; #ifdef XF86DRI Bool directRenderingEnabled; @@ -209,14 +210,16 @@ Bool Permedia2VInit(ScrnInfoPtr pScrn, DisplayModePtr mode); Bool Permedia2vHWCursorInit(ScreenPtr pScreen); /* pm3_dac.c */ -void Permedia3PreInit(ScrnInfoPtr pScrn, GLINTPtr pGlint); +void Permedia3PreInit(ScrnInfoPtr pScrn); int Permedia3MemorySizeDetect(ScrnInfoPtr pScrn); void Permedia3Restore(ScrnInfoPtr pScrn, GLINTRegPtr glintReg); void Permedia3Save(ScrnInfoPtr pScrn, GLINTRegPtr glintReg); Bool Permedia3Init(ScrnInfoPtr pScrn, DisplayModePtr mode); /* pm3_accel.c */ -Bool Permedia3AccelInit(ScreenPtr pScreen); +/* Not needed, ... is it ever called outside of pm3_accel.c ? void Permedia3Sync(ScrnInfoPtr pScrn); +*/ +Bool Permedia3AccelInit(ScreenPtr pScreen); void Permedia3InitializeEngine(ScrnInfoPtr pScrn); /* End of pm3 stuff */ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c index b63dabd90..8744c7c91 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c @@ -28,7 +28,7 @@ * this work is sponsored by S.u.S.E. GmbH, Fuerth, Elsa GmbH, Aachen, * Siemens Nixdorf Informationssysteme and Appian Graphics. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c,v 1.96 2000/09/19 14:12:31 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c,v 1.98 2000/10/17 09:07:04 alanh Exp $ */ #include "fb.h" #include "cfb8_32.h" @@ -1300,7 +1300,7 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) * than a J2000, as memory timings will surely change. */ GLINTMapMem(pScrn); - Permedia3PreInit(pScrn, pGlint); + Permedia3PreInit(pScrn); GLINTUnmapMem(pScrn); pScrn->videoRam = Permedia3MemorySizeDetect(pScrn); } else if (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V) { @@ -2039,7 +2039,6 @@ GLINTUnmapMem(ScrnInfoPtr pScrn) return TRUE; } - /* * This function saves the video state. */ @@ -2306,10 +2305,11 @@ GLINTScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) if (!vgaHWMapMem(pScrn)) return FALSE; } + /* Timing problem with PM3 & PM2V chips dont like being blasted */ /* This solves the dual head problem but trahses the console font. */ - if (pGlint->Chipset = PCI_VENDOR_3DLABS_CHIP_PERMEDIA3) { + if (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA3) { /* Graphics Index VGA register don't work in mmio mode * for the Permedia3 chip, it thrashes the console font. * Let's keep the IO functions for this instead ... */ @@ -2318,12 +2318,8 @@ GLINTScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) vgaHWSetMmioFuncs(hwp, pGlint->IOBaseVGA, 0); hwp->writeGr = writeGr; hwp->readGr = readGr; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SVEN : Permedia 3 don't use mmio for VGA Graphics Index.\n"); - } - else if (pGlint->Chipset != PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V) + } else if (pGlint->Chipset != PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V) vgaHWSetMmioFuncs(hwp, pGlint->IOBaseVGA, 0); - vgaHWGetIOBase(hwp); } @@ -2634,6 +2630,7 @@ GLINTSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) pScrn = xf86Screens[scrnIndex]; pGlint = GLINTPTR(pScrn); + TRACE_ENTER("GLINTSwitchMode"); if (pGlint->FBDev) { Bool ret = fbdevHWSwitchMode(scrnIndex, mode, flags); @@ -2666,9 +2663,11 @@ GLINTSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) } } + TRACE_EXIT("GLINTSwitchMode (fbdev ?)"); return ret; } + TRACE_EXIT("GLINTSwitchMode (normal)"); return GLINTModeInit(xf86Screens[scrnIndex], mode); } @@ -2687,9 +2686,11 @@ GLINTAdjustFrame(int scrnIndex, int x, int y, int flags) pScrn = xf86Screens[scrnIndex]; pGlint = GLINTPTR(pScrn); + TRACE_ENTER("GLINTAdjustFrame"); if (pGlint->FBDev) { fbdevHWAdjustFrame(scrnIndex, x, y, flags); + TRACE_EXIT("GLINTAdjustFrame (fbdev)"); return; } @@ -2708,6 +2709,7 @@ GLINTAdjustFrame(int scrnIndex, int x, int y, int flags) GLINT_SLOW_WRITE_REG(base, PMScreenBase); break; } + TRACE_EXIT("GLINTAdjustFrame (normal)"); } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c index 7c512d542..db94756b2 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c @@ -1,36 +1,32 @@ /* - * Copyright 1997,1998 by Alan Hourihane, Wigan, England. + * Copyright 2000 by Sven Luther <luther@dpt-info.u-strasbg.fr>. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in + * documentation, and that the name of Sven Luther not be used in * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided + * specific, written prior permission. Sven Luther makes no representations + * about the suitability of this software for any purpose. It is provided * "as is" without express or implied warranty. * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * SVEN LUTHER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * EVENT SHALL SVEN LUTHER BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * - * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk> - * Dirk Hohndel, <hohndel@suse.de> - * Stefan Dirsch, <sndirsch@suse.de> - * Mark Vojkovich, <mvojkovi@ucsd.edu> - * Michel Dänzer, <michdaen@iiic.ethz.ch> - * Sven Luther, <luther@dpt-info.u-strasbg.fr> + * Authors: Sven Luther, <luther@dpt-info.u-strasbg.fr> + * Alan Hourihane, <alanh@fairlite.demon.co.uk> * * this work is sponsored by Appian Graphics. * * Permedia 3 accelerated options. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c,v 1.3 2000/09/11 16:58:56 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c,v 1.5 2000/10/26 17:57:56 dawes Exp $ */ #include "Xarch.h" #include "xf86.h" @@ -45,6 +41,7 @@ #include "fb.h" #include "glint_regs.h" +#include "pm3_regs.h" #include "glint.h" #include "xaalocal.h" /* For replacements */ @@ -52,23 +49,22 @@ #define DEBUG 0 #if DEBUG -# define TRACE_ENTER(str) ErrorF("pm2_accel: " str " %d\n",pScrn->scrnIndex) -# define TRACE_EXIT(str) ErrorF("pm2_accel: " str " done\n") -# define TRACE(str) ErrorF("pm2_accel trace: " str "\n") +# define TRACE_ENTER(str) ErrorF("pm3_accel: " str " %d\n",pScrn->scrnIndex) +# define TRACE_EXIT(str) ErrorF("pm3_accel: " str " done\n") +# define TRACE(str) ErrorF("pm3_accel trace: " str "\n") #else # define TRACE_ENTER(str) # define TRACE_EXIT(str) # define TRACE(str) #endif -static void Permedia3SetupForFillRectSolid(ScrnInfoPtr pScrn, int color, - int rop, unsigned int planemask); -static void Permedia3SubsequentFillRectSolid(ScrnInfoPtr pScrn, int x, - int y, int w, int h); -static void Permedia3SetupForFillRectSolid24bpp(ScrnInfoPtr pScrn,int color, - int rop, unsigned int planemask); -static void Permedia3SubsequentFillRectSolid24bpp(ScrnInfoPtr pScrn, int x, - int y, int w, int h); +/* Sync */ +void Permedia3Sync(ScrnInfoPtr pScrn); +/* Clipping */ +static void Permedia3SetClippingRectangle(ScrnInfoPtr pScrn, int x, int y, + int w, int h); +static void Permedia3DisableClipping(ScrnInfoPtr pScrn); +/* ScreenToScreenCopy */ static void Permedia3SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2, int w, int h); @@ -76,157 +72,264 @@ static void Permedia3SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop, unsigned int planemask, int transparency_color); -static void Permedia3SubsequentScreenToScreenCopy2432bpp(ScrnInfoPtr pScrn, - int x1, int y1, int x2, int y2, int w, int h); -static void Permedia3SetupForScreenToScreenCopy2432bpp(ScrnInfoPtr pScrn, - int xdir, int ydir, int rop, - unsigned int planemask, - int transparency_color); -static void Permedia3SetClippingRectangle(ScrnInfoPtr pScrn, int x, int y, - int w, int h); -static void Permedia3DisableClipping(ScrnInfoPtr pScrn); -static void Permedia3SetupForSolidLine(ScrnInfoPtr pScrn, int color, +/* SolidFill */ +static void Permedia3SetupForFillRectSolid(ScrnInfoPtr pScrn, int color, int rop, unsigned int planemask); -static void Permedia3SubsequentHorVertLine(ScrnInfoPtr pScrn, int x, int y, - int len, int dir); -static void Permedia3SubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, - int x, int y, int dmaj, int dmin, int e, - int len, int octant); -static void Permedia3WriteBitmap(ScrnInfoPtr pScrn, int x, int y, int w, int h, - unsigned char *src, int srcwidth, int skipleft, - int fg, int bg, int rop,unsigned int planemask); +static void Permedia3SubsequentFillRectSolid(ScrnInfoPtr pScrn, int x, + int y, int w, int h); +/* 8x8 Mono Pattern Fills */ static void Permedia3SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, - int patternx, int patterny, int fg, int bg, + int patternx, int patterny, int fg, int bg, int rop, unsigned int planemask); static void Permedia3SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, - int patternx, int patterny, int x, int y, + int x_offset, int y_offset, int x, int y, int w, int h); -static void Permedia3SetupForMono8x8PatternFill24bpp(ScrnInfoPtr pScrn, - int patternx, int patterny, int fg, int bg, - int rop, unsigned int planemask); -static void Permedia3SubsequentMono8x8PatternFillRect24bpp(ScrnInfoPtr pScrn, - int patternx, int patterny, int x, int y, - int w, int h); -static void Permedia3WritePixmap8bpp(ScrnInfoPtr pScrn, int x, int y, int w, - int h, unsigned char *src, int srcwidth, - int rop, unsigned int planemask, - int transparency_color, int bpp, int depth); -static void Permedia3WritePixmap16bpp(ScrnInfoPtr pScrn, int x, int y, int w, - int h, unsigned char *src, int srcwidth, - int rop, unsigned int planemask, - int transparency_color, int bpp, int depth); -#if 0 -static void Permedia3WritePixmap24bpp(ScrnInfoPtr pScrn, int x, int y, int w, - int h, unsigned char *src, int srcwidth, - int rop, unsigned int planemask, - int transparency_color, int bpp, int depth); -#endif -static void Permedia3WritePixmap32bpp(ScrnInfoPtr pScrn, int x, int y, int w, - int h, unsigned char *src, int srcwidth, - int rop, unsigned int planemask, - int transparency_color, int bpp, int depth); +/* Color Expansion Fills */ static void Permedia3SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int fg, int bg, int rop,unsigned int planemask); static void Permedia3SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int x, int y, int w, int h, int skipleft); -static void Permedia3SetupForScanlineCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, - int fg, int bg, int rop, - unsigned int planemask); -static void Permedia3SubsequentScanlineCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, int x, - int y, int w, int h, int skipleft); -static void Permedia3SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno); -static void Permedia3LoadCoord(ScrnInfoPtr pScrn, int x, int y, int w, int h); -static void Permedia3PolylinesThinSolidWrapper(DrawablePtr pDraw, GCPtr pGC, - int mode, int npt, DDXPointPtr pPts); -static void Permedia3PolySegmentThinSolidWrapper(DrawablePtr pDraw, GCPtr pGC, - int nseg, xSegment *pSeg); +/* Images Writes */ +static void Permedia3SetupForImageWrite(ScrnInfoPtr pScrn, int rop, + unsigned int planemask, int trans_color, + int bpp, int depth); +static void Permedia3SubsequentImageWriteRect(ScrnInfoPtr pScrn, + int x, int y, int w, int h, int skipleft); #define MAX_FIFO_ENTRIES 256 +/* Mirror stipple pattern horizontally */ #if X_BYTE_ORDER == X_BIG_ENDIAN -# define STIPPLE_SWAP 1<<18 /* Mirror stipple pattern horizontally */ +# define STIPPLE_SWAP 1<<18 #else # define STIPPLE_SWAP 0 #endif + void Permedia3InitializeEngine(ScrnInfoPtr pScrn) { GLINTPtr pGlint = GLINTPTR(pScrn); + int colorformat = 0; /* Initialize the Accelerator Engine to defaults */ - TRACE_ENTER("Permedia3InitializeEngine"); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ScissorMode); - GLINT_SLOW_WRITE_REG(UNIT_ENABLE | FBWM_Enable0, FBWriteMode); - GLINT_SLOW_WRITE_REG(0, dXSub); - GLINT_SLOW_WRITE_REG(GWIN_DisableLBUpdate, GLINTWindow); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DitherMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaBlendMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ColorDDAMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureColorMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureAddressMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PMTextureReadMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaBlendMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TexelLUTMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, YUVMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DepthMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, RouterMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FogMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AntialiasMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaTestMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StencilMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AreaStippleMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LogicalOpMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DepthMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StatisticMode); + /* Host out PreInit */ + /* Set filter mode to enable sync tag & data output */ GLINT_SLOW_WRITE_REG(0xc00, FilterMode); - GLINT_SLOW_WRITE_REG(0xffffffff, FBHardwareWriteMask); - GLINT_SLOW_WRITE_REG(0xffffffff, FBSoftwareWriteMask); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, RasterizerMode); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, GLINTDepth); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBSourceOffset); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBPixelOffset); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LBSourceOffset); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, WindowOrigin); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBWindowBase); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBSourceBase); - GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LBWindowBase); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StatisticMode); + Permedia3Sync(pScrn); + + TRACE("Permedia3InitializeEngine : first sync"); + /* Disable most units by default */ + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3DeltaMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, RasterizerMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ScissorMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LineStippleMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AreaStippleMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3GIDMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DepthMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StencilMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ColorDDAMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3TextureCoordMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3TextureIndexMode0); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3TextureIndexMode1); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureReadMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3LUTMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureFilterMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3TextureCompositeMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3TextureApplicationMode); + GLINT_SLOW_WRITE_REG(0, PM3TextureCompositeColorMode1); + GLINT_SLOW_WRITE_REG(0, PM3TextureCompositeAlphaMode1); + GLINT_SLOW_WRITE_REG(0, PM3TextureCompositeColorMode0); + GLINT_SLOW_WRITE_REG(0, PM3TextureCompositeAlphaMode0); + + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FogMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ChromaTestMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaTestMode); + /* Not done in P3Lib ??? */ + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AntialiasMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3AlphaTestMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, YUVMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3AlphaBlendColorMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3AlphaBlendAlphaMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DitherMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LogicalOpMode); + + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StatisticMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, RouterMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PM3Window); + GLINT_SLOW_WRITE_REG(0, PM3Config2D); + + GLINT_SLOW_WRITE_REG(0xffffffff, PM3SpanColorMask); + + GLINT_SLOW_WRITE_REG(0, PM3XBias); + GLINT_SLOW_WRITE_REG(0, PM3YBias); + + GLINT_SLOW_WRITE_REG(0, PM3DeltaControl); + + GLINT_SLOW_WRITE_REG(0xffffffff, BitMaskPattern); + Permedia3Sync(pScrn); + + /* ScissorStippleUnit Initialization (is it needed ?) */ + pGlint->ClippingOn = FALSE; + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ScissorMode); + /* We never use Screen Scissor ... + GLINT_SLOW_WRITE_REG( + (pScrn->virtualX&0xffff)|((pScrn->virtualY&0xffff)<<16), + ScreenSize); + GLINT_SLOW_WRITE_REG( + (0&0xffff)|((0&0xffff)<<16), + WindowOrigin); + */ + Permedia3Sync(pScrn); + + /* StencilDepthUnit Initialization */ + GLINT_SLOW_WRITE_REG(0, PM3Window); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DepthMode); + GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StencilMode); + GLINT_SLOW_WRITE_REG(0, StencilData); + Permedia3Sync(pScrn); + + /* FBReadUnit Initialization */ + TRACE("Permedia3InitializeEngine : only syncs upto now"); + GLINT_SLOW_WRITE_REG( + PM3FBDestReadEnables_E(0xff) | + PM3FBDestReadEnables_R(0xff) | + PM3FBDestReadEnables_ReferenceAlpha(0xff), + PM3FBDestReadEnables); + GLINT_SLOW_WRITE_REG(0, PM3FBDestReadBufferAddr0); + GLINT_SLOW_WRITE_REG(0, PM3FBDestReadBufferOffset0); + GLINT_SLOW_WRITE_REG( + PM3FBDestReadBufferWidth_Width(pScrn->displayWidth), + PM3FBDestReadBufferWidth0); + /* + GLINT_SLOW_WRITE_REG(0, PM3FBDestReadBufferAddr1); + GLINT_SLOW_WRITE_REG(0, PM3FBDestReadBufferOffset1); + GLINT_SLOW_WRITE_REG( + PM3FBDestReadBufferWidth_Width(pScrn->displayWidth), + PM3FBDestReadBufferWidth1); + GLINT_SLOW_WRITE_REG(0, PM3FBDestReadBufferAddr2); + GLINT_SLOW_WRITE_REG(0, PM3FBDestReadBufferOffset2); + GLINT_SLOW_WRITE_REG( + PM3FBDestReadBufferWidth_Width(pScrn->displayWidth), + PM3FBDestReadBufferWidth2); + GLINT_SLOW_WRITE_REG(0, PM3FBDestReadBufferAddr3); + GLINT_SLOW_WRITE_REG(0, PM3FBDestReadBufferOffset3); + GLINT_SLOW_WRITE_REG( + PM3FBDestReadBufferWidth_Width(pScrn->displayWidth), + PM3FBDestReadBufferWidth3); + */ + GLINT_SLOW_WRITE_REG( + PM3FBDestReadMode_ReadEnable | + /* Not needed, since FBDestRead is the same as FBWrite. + PM3FBDestReadMode_Blocking | + */ + PM3FBDestReadMode_Enable0, + PM3FBDestReadMode); + TRACE("Permedia3InitializeEngine : DestRead"); + GLINT_SLOW_WRITE_REG(0, PM3FBSourceReadBufferAddr); + GLINT_SLOW_WRITE_REG(0, PM3FBSourceReadBufferOffset); + GLINT_SLOW_WRITE_REG( + PM3FBSourceReadBufferWidth_Width(pScrn->displayWidth), + PM3FBSourceReadBufferWidth); + GLINT_SLOW_WRITE_REG( + PM3FBSourceReadMode_Blocking | + PM3FBSourceReadMode_ReadEnable, + PM3FBSourceReadMode); + TRACE("Permedia3InitializeEngine : SourceRead"); #if X_BYTE_ORDER == X_BIG_ENDIAN pGlint->RasterizerSwap = 1; #else pGlint->RasterizerSwap = 0; #endif - switch (pScrn->bitsPerPixel) { case 8: - pGlint->PixelWidth = 0x0; /* 8 Bits */ - pGlint->TexMapFormat = pGlint->pprod; + GLINT_SLOW_WRITE_REG(0x2, PixelSize); #if X_BYTE_ORDER == X_BIG_ENDIAN pGlint->RasterizerSwap |= 3<<15; /* Swap host data */ #endif break; case 16: - pGlint->PixelWidth = 0x1; /* 16 Bits */ - pGlint->TexMapFormat = pGlint->pprod | 1<<19; + GLINT_SLOW_WRITE_REG(0x1, PixelSize); #if X_BYTE_ORDER == X_BIG_ENDIAN pGlint->RasterizerSwap |= 2<<15; /* Swap host data */ #endif break; - case 24: - pGlint->PixelWidth = 0x4; /* 24 Bits */ - pGlint->TexMapFormat = pGlint->pprod | 2<<19; + case 32: + GLINT_SLOW_WRITE_REG(0x0, PixelSize); break; + } + TRACE("Permedia3InitializeEngine : PixelSize"); + Permedia3Sync(pScrn); + + /* LogicalOpUnit Initialization */ + GLINT_SLOW_WRITE_REG(0xffffffff, FBSoftwareWriteMask); + Permedia3Sync(pScrn); + + /* FBWriteUnit Initialization */ + GLINT_SLOW_WRITE_REG( + PM3FBWriteMode_WriteEnable| + PM3FBWriteMode_OpaqueSpan| + PM3FBWriteMode_Enable0, + PM3FBWriteMode); + GLINT_SLOW_WRITE_REG(0, PM3FBWriteBufferAddr0); + GLINT_SLOW_WRITE_REG(0, PM3FBWriteBufferOffset0); + GLINT_SLOW_WRITE_REG( + PM3FBWriteBufferWidth_Width(pScrn->displayWidth), + PM3FBWriteBufferWidth0); + Permedia3Sync(pScrn); + /* + GLINT_SLOW_WRITE_REG(0, PM3FBWriteBufferAddr1); + GLINT_SLOW_WRITE_REG(0, PM3FBWriteBufferOffset1); + GLINT_SLOW_WRITE_REG( + PM3FBWriteBufferWidth_Width(pScrn->displayWidth), + PM3FBWriteBufferWidth1); + GLINT_SLOW_WRITE_REG(0, PM3FBWriteBufferAddr2); + GLINT_SLOW_WRITE_REG(0, PM3FBWriteBufferOffset2); + GLINT_SLOW_WRITE_REG( + PM3FBWriteBufferWidth_Width(pScrn->displayWidth), + PM3FBWriteBufferWidth2); + GLINT_SLOW_WRITE_REG(0, PM3FBWriteBufferAddr3); + GLINT_SLOW_WRITE_REG(0, PM3FBWriteBufferOffset3); + GLINT_SLOW_WRITE_REG( + PM3FBWriteBufferWidth_Width(pScrn->displayWidth), + PM3FBWriteBufferWidth3); + */ + TRACE("Permedia3InitializeEngine : FBWrite"); + /* SizeOfframebuffer */ + GLINT_SLOW_WRITE_REG( + pScrn->displayWidth * + (8 * pGlint->FbMapSize / (pScrn->bitsPerPixel * pScrn->displayWidth) + >4095?4095: 8 * pGlint->FbMapSize / + (pScrn->bitsPerPixel * pScrn->displayWidth)), + PM3SizeOfFramebuffer); + GLINT_SLOW_WRITE_REG(0xffffffff, FBHardwareWriteMask); + Permedia3Sync(pScrn); + TRACE("Permedia3InitializeEngine : FBHardwareWriteMask & SizeOfFramebuffer"); + /* Color Format */ + switch (pScrn->depth) { + case 8: + colorformat = 4; + break; + case 15: + colorformat = 2; + break; + case 16: + colorformat = 3; + break; + case 24: case 32: - pGlint->PixelWidth = 0x2; /* 32 Bits */ - pGlint->TexMapFormat = pGlint->pprod | 2<<19; - break; + colorformat = 0; + break; } - pGlint->ClippingOn = FALSE; + GLINT_SLOW_WRITE_REG(UNIT_DISABLE| + ((colorformat&0xf)<<2)|(1<<10), + DitherMode); + + /* Other stuff */ pGlint->startxdom = 0; pGlint->startxsub = 0; pGlint->starty = 0; @@ -238,42 +341,13 @@ Permedia3InitializeEngine(ScrnInfoPtr pScrn) pGlint->h = 0; pGlint->w = 0; pGlint->ROP = 0xFF; - GLINT_SLOW_WRITE_REG(pGlint->PixelWidth, FBReadPixel); - GLINT_SLOW_WRITE_REG(pGlint->TexMapFormat, PMTextureMapFormat); - GLINT_SLOW_WRITE_REG(0, RectangleSize); - GLINT_SLOW_WRITE_REG(0, RectangleOrigin); GLINT_SLOW_WRITE_REG(0, dXDom); + GLINT_SLOW_WRITE_REG(0, dXSub); GLINT_SLOW_WRITE_REG(1<<16, dY); GLINT_SLOW_WRITE_REG(0, StartXDom); GLINT_SLOW_WRITE_REG(0, StartXSub); GLINT_SLOW_WRITE_REG(0, StartY); GLINT_SLOW_WRITE_REG(0, GLINTCount); - - GLINT_SLOW_WRITE_REG(1 | 1<<8, 0xAEE0); - GLINT_SLOW_WRITE_REG(1, 0xAEE0); - GLINT_SLOW_WRITE_REG(pScrn->displayWidth, FBSrcReadBufWidth); - GLINT_SLOW_WRITE_REG(pScrn->displayWidth, FBDstReadBufWidth0); - GLINT_SLOW_WRITE_REG(pScrn->displayWidth, FBWriteBufWidth0); - GLINT_SLOW_WRITE_REG(0, FBSrcReadBufAddr); - GLINT_SLOW_WRITE_REG(0, FBDstReadBufAddr0); - GLINT_SLOW_WRITE_REG(0, FBWriteBufAddr0); - GLINT_SLOW_WRITE_REG(0, FBSrcReadBufOffset0); - GLINT_SLOW_WRITE_REG(0, FBDstReadBufOffset0); - GLINT_SLOW_WRITE_REG(0, FBWriteBufOffset0); - GLINT_SLOW_WRITE_REG(0xff00ffff, FBDstReadEnables); - - switch (pScrn->bitsPerPixel) { - case 8: - GLINT_SLOW_WRITE_REG(0x2, PixelSize); - break; - case 16: - GLINT_SLOW_WRITE_REG(0x1, PixelSize); - break; - case 32: - GLINT_SLOW_WRITE_REG(0x0, PixelSize); - break; - } - TRACE_EXIT("Permedia3InitializeEngine"); } @@ -290,155 +364,109 @@ Permedia3AccelInit(ScreenPtr pScreen) Permedia3InitializeEngine(pScrn); - infoPtr->Flags = PIXMAP_CACHE | - OFFSCREEN_PIXMAPS | - LINEAR_FRAMEBUFFER; + /* Generic accel engine flags */ + infoPtr->Flags = + PIXMAP_CACHE | + OFFSCREEN_PIXMAPS | + LINEAR_FRAMEBUFFER; + /* Synchronization of the accel engine */ infoPtr->Sync = Permedia3Sync; + /* Clipping Setup */ + infoPtr->ClippingFlags = 0; + /* This does not work correctly, i don't know why, but i guess it is + * because the clipping stuff is not ok ... + * Let's disable it for now (also in the respective functions, we + * clear the UserScissorEnable bit in Render2D. + HARDWARE_CLIP_MONO_8x8_FILL | + HARDWARE_CLIP_SOLID_FILL; + */ infoPtr->SetClippingRectangle = Permedia3SetClippingRectangle; infoPtr->DisableClipping = Permedia3DisableClipping; - infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY; -#if 0 + /* ScreenToScreenCopy */ + infoPtr->ScreenToScreenCopyFlags = + NO_TRANSPARENCY; + infoPtr->SetupForScreenToScreenCopy = + Permedia3SetupForScreenToScreenCopy; + infoPtr->SubsequentScreenToScreenCopy = + Permedia3SubsequentScreenToScreenCopy; + + /* SolidFill */ infoPtr->SolidFillFlags = 0; - infoPtr->WriteBitmapFlags = 0; - if (pScrn->bitsPerPixel == 24) { - /* SVEN : This should be bad also, - * didn't tested it since 24bpp is broken.... - infoPtr->SetupForSolidFill = - Permedia3SetupFortillRectSolid24bpp; - infoPtr->SubsequentSolidFillRect = - Permedia3SubsequentFillRectSolid24bpp; - */ - } else { - infoPtr->SolidLineFlags = 0; - infoPtr->PolySegmentThinSolidFlags = 0; - infoPtr->PolylinesThinSolidFlags = 0; - infoPtr->SetupForSolidLine = Permedia3SetupForSolidLine; - if (!(pScrn->overlayFlags & OVERLAY_8_32_PLANAR)) - { - infoPtr->SubsequentSolidBresenhamLine = - Permedia3SubsequentSolidBresenhamLine; - } - infoPtr->PolySegmentThinSolid = Permedia3PolySegmentThinSolidWrapper; - infoPtr->PolylinesThinSolid = Permedia3PolylinesThinSolidWrapper; - } infoPtr->SetupForSolidFill = Permedia3SetupForFillRectSolid; infoPtr->SubsequentSolidFillRect = Permedia3SubsequentFillRectSolid; -#endif - - infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY; - infoPtr->SetupForScreenToScreenCopy = - Permedia3SetupForScreenToScreenCopy; - infoPtr->SubsequentScreenToScreenCopy = - Permedia3SubsequentScreenToScreenCopy; -#if 0 + /* 8x8 Mono Pattern Fills */ infoPtr->Mono8x8PatternFillFlags = - HARDWARE_PATTERN_PROGRAMMED_ORIGIN | - HARDWARE_PATTERN_PROGRAMMED_BITS | - HARDWARE_PATTERN_SCREEN_ORIGIN; - + HARDWARE_PATTERN_PROGRAMMED_ORIGIN | + HARDWARE_PATTERN_PROGRAMMED_BITS | + HARDWARE_PATTERN_SCREEN_ORIGIN | + BIT_ORDER_IN_BYTE_LSBFIRST; infoPtr->SetupForMono8x8PatternFill = - Permedia3SetupForMono8x8PatternFill; + Permedia3SetupForMono8x8PatternFill; infoPtr->SubsequentMono8x8PatternFillRect = - Permedia3SubsequentMono8x8PatternFillRect; -#endif - -#if 0 - if (pGlint->UsePCIRetry) { - infoPtr->CPUToScreenColorExpandFillFlags = SYNC_AFTER_COLOR_EXPAND | - BIT_ORDER_IN_BYTE_LSBFIRST | - CPU_TRANSFER_PAD_DWORD; - - infoPtr->ColorExpandBase = pGlint->IOBase + OutputFIFO + 4; - infoPtr->SetupForCPUToScreenColorExpandFill = - Permedia3SetupForCPUToScreenColorExpandFill; - infoPtr->SubsequentCPUToScreenColorExpandFill = - Permedia3SubsequentCPUToScreenColorExpandFill; - } else { - infoPtr->ScanlineCPUToScreenColorExpandFillFlags = - BIT_ORDER_IN_BYTE_LSBFIRST; - - infoPtr->NumScanlineColorExpandBuffers = 1; - infoPtr->ScanlineColorExpandBuffers = - pGlint->XAAScanlineColorExpandBuffers; - pGlint->XAAScanlineColorExpandBuffers[0] = - pGlint->IOBase + OutputFIFO + 4; - - infoPtr->SetupForScanlineCPUToScreenColorExpandFill = - Permedia3SetupForScanlineCPUToScreenColorExpandFill; - infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = - Permedia3SubsequentScanlineCPUToScreenColorExpandFill; - infoPtr->SubsequentColorExpandScanline = - Permedia3SubsequentColorExpandScanline; - } -#endif - - infoPtr->ColorExpandRange = MAX_FIFO_ENTRIES; - -#if 0 - infoPtr->WriteBitmap = Permedia3WriteBitmap; - - if (pScrn->bitsPerPixel == 8) - infoPtr->WritePixmap = Permedia3WritePixmap8bpp; - else - if (pScrn->bitsPerPixel == 16) - infoPtr->WritePixmap = Permedia3WritePixmap16bpp; - else - if (pScrn->bitsPerPixel == 24) { - infoPtr->WritePixmap = Permedia3WritePixmap24bpp; - infoPtr->WritePixmapFlags |= NO_PLANEMASK; - } - else - if (pScrn->bitsPerPixel == 32) - infoPtr->WritePixmap = Permedia3WritePixmap32bpp; -#endif - - /* Now fixup if we are 24bpp */ - if (pScrn->bitsPerPixel == 24) { - infoPtr->SolidFillFlags |= NO_PLANEMASK; - infoPtr->ScreenToScreenCopyFlags |= NO_PLANEMASK; - infoPtr->WriteBitmapFlags |= NO_PLANEMASK; - infoPtr->CPUToScreenColorExpandFillFlags |= NO_PLANEMASK; - infoPtr->ScanlineCPUToScreenColorExpandFillFlags |= NO_PLANEMASK; - infoPtr->Mono8x8PatternFillFlags |= NO_PLANEMASK; - } - + Permedia3SubsequentMono8x8PatternFillRect; + + /* Color Expand Fills */ + infoPtr->CPUToScreenColorExpandFillFlags = + SYNC_AFTER_COLOR_EXPAND | + LEFT_EDGE_CLIPPING | + BIT_ORDER_IN_BYTE_LSBFIRST | + CPU_TRANSFER_BASE_FIXED | + CPU_TRANSFER_PAD_DWORD; + infoPtr->ColorExpandBase = pGlint->IOBase + BitMaskPattern; + infoPtr->ColorExpandRange = 4; + infoPtr->SetupForCPUToScreenColorExpandFill = + Permedia3SetupForCPUToScreenColorExpandFill; + infoPtr->SubsequentCPUToScreenColorExpandFill = + Permedia3SubsequentCPUToScreenColorExpandFill; + + /* Images Writes */ + infoPtr->ImageWriteFlags = + NO_GXCOPY | + SYNC_AFTER_IMAGE_WRITE | + LEFT_EDGE_CLIPPING | + BIT_ORDER_IN_BYTE_LSBFIRST | + CPU_TRANSFER_BASE_FIXED | + CPU_TRANSFER_PAD_DWORD; + infoPtr->ImageWriteBase = pGlint->IOBase + PM3FBSourceData; + infoPtr->ImageWriteRange = 8; + infoPtr->SetupForImageWrite = + Permedia3SetupForImageWrite; + infoPtr->SubsequentImageWriteRect = + Permedia3SubsequentImageWriteRect; + AvailFBArea.x1 = 0; AvailFBArea.y1 = 0; AvailFBArea.x2 = pScrn->displayWidth; - AvailFBArea.y2 = ((pGlint->FbMapSize > 16384*1024) ? 16384*1024 : pGlint->FbMapSize) / (pScrn->displayWidth * + AvailFBArea.y2 = pGlint->FbMapSize / (pScrn->displayWidth * pScrn->bitsPerPixel / 8); + /* Alan does this ??? + AvailFBArea.y2 = ((pGlint->FbMapSize > 16384*1024) ? 16384*1024 : + pGlint->FbMapSize) / (pScrn->displayWidth + pScrn->bitsPerPixel / 8); + */ + /* Permedia3 has a maximum 4096x4096 framebuffer */ if (AvailFBArea.y2 > 4095) AvailFBArea.y2 = 4095; xf86InitFBManager(pScreen, &AvailFBArea); + Permedia3Sync(pScrn); return(XAAInit(pScreen, infoPtr)); } -static void Permedia3LoadCoord( - ScrnInfoPtr pScrn, - int x, int y, - int w, int h -){ - GLINTPtr pGlint = GLINTPTR(pScrn); - - if ((h != pGlint->h) || (w != pGlint->w)) { - pGlint->w = w; - pGlint->h = h; - GLINT_WRITE_REG(((h&0x0FFF)<<16)|(w&0x0FFF), RectangleSize); - } - if ((y != pGlint->y) || (x != pGlint->x)) { - pGlint->x = x; - pGlint->y = y; - GLINT_WRITE_REG(((y&0x0FFF)<<16)|(x&0x0FFF), RectangleOrigin); - } +#define CHECKCLIPPING \ +{ \ + if (pGlint->ClippingOn) { \ + pGlint->ClippingOn = FALSE; \ + GLINT_WAIT(1); \ + GLINT_WRITE_REG(0, ScissorMode); \ + } \ } - void Permedia3Sync(ScrnInfoPtr pScrn) { @@ -451,8 +479,7 @@ Permedia3Sync(ScrnInfoPtr pScrn) GLINT_WRITE_REG(0, GlintSync); do { while(GLINT_READ_REG(OutFIFOWords) == 0); -#define Sync_tag 0x188 - } while (GLINT_READ_REG(OutputFIFO) != Sync_tag); + } while (GLINT_READ_REG(OutputFIFO) != PM3SyncTag); } static void @@ -465,7 +492,6 @@ Permedia3SetClippingRectangle(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2) GLINT_WRITE_REG(1, ScissorMode); pGlint->ClippingOn = TRUE; } - static void Permedia3DisableClipping(ScrnInfoPtr pScrn) { @@ -473,6 +499,7 @@ Permedia3DisableClipping(ScrnInfoPtr pScrn) CHECKCLIPPING; } +/* ScreenToScreenCopy definition */ static void Permedia3SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop, @@ -480,232 +507,143 @@ Permedia3SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, { GLINTPtr pGlint = GLINTPTR(pScrn); TRACE_ENTER("Permedia3SetupForScreenToScreenCopy"); - - pGlint->BltScanDirection = 0; - if (xdir == 1) pGlint->BltScanDirection |= 1<<28; - if (ydir == 1) pGlint->BltScanDirection |= 1<<29; - - GLINT_WAIT(5); - DO_PLANEMASK(planemask); - - GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); - GLINT_WRITE_REG(UNIT_ENABLE /*| FBSRM_Blocking*/, FBSrcReadMode); - if ((rop == GXcopy) || (rop == GXcopyInverted)) { - GLINT_WRITE_REG(UNIT_DISABLE, FBDstReadMode); - } else { - GLINT_WRITE_REG(UNIT_ENABLE | FBDRM_Enable0 /*| FBDRM_Blocking*/, FBDstReadMode); + pGlint->PM3_Render2D = + PM3Render2D_SpanOperation | + PM3Render2D_Operation_Normal; + pGlint->ClippingOn = TRUE; + pGlint->PM3_Config2D = + PM3Config2D_UserScissorEnable | + PM3Config2D_ForegroundROPEnable | + PM3Config2D_ForegroundROP(rop) | + PM3Config2D_FBWriteEnable; + if (xdir == 1) pGlint->PM3_Render2D |= PM3Render2D_XPositive; + if (ydir == 1) pGlint->PM3_Render2D |= PM3Render2D_YPositive; + if ((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXnoop)&&(rop!=GXinvert)) { + pGlint->PM3_Render2D |= PM3Render2D_FBSourceReadEnable; + pGlint->PM3_Config2D |= PM3Config2D_Blocking; } - GLINT_WRITE_REG(rop<<1|1, LogicalOpMode); + if ((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXcopy)&&(rop!=GXcopyInverted)) + pGlint->PM3_Config2D |= PM3Config2D_FBDestReadEnable; + GLINT_WAIT(2); + DO_PLANEMASK(planemask); + GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); TRACE_EXIT("Permedia3SetupForScreenToScreenCopy"); } - static void Permedia3SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2, int w, int h) { GLINTPtr pGlint = GLINTPTR(pScrn); - + /* Spans needs to be 32 bit aligned. */ + int x_align = x1 & 0x1f; TRACE_ENTER("Permedia3SubsequentScreenToScreenCopy"); - - GLINT_WAIT(3); - GLINT_WRITE_REG(y2<<16 | x2, RectanglePosition); - GLINT_WRITE_REG((y1-y2)<<16 | (x1-x2) & 0xffff, FBSrcReadBufOffset0); - GLINT_WRITE_REG(w | 3<<14| h<<16 | pGlint->BltScanDirection, Render2D); -} - - - -static void -Permedia3PolylinesThinSolidWrapper( - DrawablePtr pDraw, - GCPtr pGC, - int mode, - int npt, - DDXPointPtr pPts -){ - XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC); - GLINTPtr pGlint = GLINTPTR(infoRec->pScrn); - pGlint->CurrentGC = pGC; - pGlint->CurrentDrawable = pDraw; - if(infoRec->NeedToSync) (*infoRec->Sync)(infoRec->pScrn); - XAAPolyLines(pDraw, pGC, mode, npt, pPts); -} - -static void -Permedia3PolySegmentThinSolidWrapper( - DrawablePtr pDraw, - GCPtr pGC, - int nseg, - xSegment *pSeg -){ - XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC); - GLINTPtr pGlint = GLINTPTR(infoRec->pScrn); - pGlint->CurrentGC = pGC; - pGlint->CurrentDrawable = pDraw; - if(infoRec->NeedToSync) (*infoRec->Sync)(infoRec->pScrn); - XAAPolySegment(pDraw, pGC, nseg, pSeg); -} - -static void -Permedia3SetupForSolidLine(ScrnInfoPtr pScrn, int color, - int rop, unsigned int planemask) -{ - GLINTPtr pGlint = GLINTPTR(pScrn); - - GLINT_WAIT(6); - DO_PLANEMASK(planemask); - GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); - GLINT_WRITE_REG(color, GLINTColor); - if (rop == GXcopy) { - GLINT_WRITE_REG(pGlint->pprod, FBReadMode); - } else { - GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); - } - LOADROP(rop); -} - -static void -Permedia3SubsequentSolidBresenhamLine( ScrnInfoPtr pScrn, - int x, int y, int dmaj, int dmin, int e, int len, int octant) -{ - GLINTPtr pGlint = GLINTPTR(pScrn); - - if(dmaj == dmin) { - GLINT_WAIT(6); - if(octant & YDECREASING) { - GLINT_WRITE_REG(-1<<16, dY); - } else { - GLINT_WRITE_REG(1<<16, dY); - } - - if(octant & XDECREASING) { - GLINT_WRITE_REG(-1<<16, dXDom); - } else { - GLINT_WRITE_REG(1<<16, dXDom); - } - - GLINT_WRITE_REG(x<<16, StartXDom); - GLINT_WRITE_REG(y<<16, StartY); - GLINT_WRITE_REG(len,GLINTCount); - GLINT_WRITE_REG(PrimitiveLine, Render); - return; - } - - fbBres(pGlint->CurrentDrawable, pGlint->CurrentGC, 0, - (octant & XDECREASING) ? -1 : 1, - (octant & YDECREASING) ? -1 : 1, - (octant & YMAJOR) ? Y_AXIS : X_AXIS, - x, y, dmin + e, dmin, -dmaj, len); + GLINT_WAIT(5); + GLINT_WRITE_REG(((y2&0x0fff)<<16)|(x2&0x0fff), ScissorMinXY); + GLINT_WRITE_REG((((y2+h)&0x0fff)<<16)|((x2+w)&0x0fff), ScissorMaxXY); + GLINT_WRITE_REG( + PM3RectanglePosition_XOffset(x2-x_align) | + PM3RectanglePosition_YOffset(y2), + PM3RectanglePosition); + GLINT_WRITE_REG( + PM3FBSourceReadBufferOffset_XOffset(x1-x2)| + PM3FBSourceReadBufferOffset_YOffset(y1-y2), + PM3FBSourceReadBufferOffset); + GLINT_WRITE_REG(pGlint->PM3_Render2D | + PM3Render2D_Width(w+x_align)| + PM3Render2D_Height(h), + PM3Render2D); + TRACE_EXIT("Permedia3SubsequentScreenToScreenCopy"); } +/* Solid Fills */ static void Permedia3SetupForFillRectSolid(ScrnInfoPtr pScrn, int color, int rop, unsigned int planemask) { GLINTPtr pGlint = GLINTPTR(pScrn); TRACE_ENTER("Permedia3SetupForFillRectSolid"); - REPLICATE(color); - GLINT_WAIT(4); + /* Prepapre Common Render2D & Config2D data */ + pGlint->PM3_Render2D = + PM3Render2D_SpanOperation | + PM3Render2D_XPositive | + PM3Render2D_YPositive | + PM3Render2D_Operation_Normal; + pGlint->PM3_Config2D = + PM3Config2D_UseConstantSource | + PM3Config2D_ForegroundROPEnable | + PM3Config2D_ForegroundROP(rop) | + PM3Config2D_FBWriteEnable; + if ((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXcopy)&&(rop!=GXcopyInverted)) + pGlint->PM3_Config2D |= PM3Config2D_FBDestReadEnable; + /* Clipping is not working ok yet, let's disable it. + if (pGlint->ClippingOn) + pGlint->PM3_Config2D |= PM3Config2D_UserScissorEnable; + */ + GLINT_WAIT(3); + /* Using FBClockColor (have to disable SpanOperation) will fill only the + * first 32 pixels of the 64 pixels of a span. Lets use ForegroundColor + * instead (from the LogicOps unit) + GLINT_WRITE_REG(color, PM3FBBlockColor); + */ + GLINT_WRITE_REG(color, PM3ForegroundColor); DO_PLANEMASK(planemask); - GLINT_WRITE_REG(color, FBBlockColor); - if ((rop == GXcopy) || (rop == GXcopyInverted)) { - GLINT_WRITE_REG(UNIT_DISABLE, FBDstReadMode); - } else { - GLINT_WRITE_REG(UNIT_ENABLE | FBDRM_Enable0 /*| FBDRM_Blocking*/, FBDstReadMode); - } - GLINT_WRITE_REG(rop<<1| 1, LogicalOpMode); + GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); TRACE_EXIT("Permedia3SetupForFillRectSolid"); } - static void Permedia3SubsequentFillRectSolid(ScrnInfoPtr pScrn, int x, int y, int w, int h) { GLINTPtr pGlint = GLINTPTR(pScrn); TRACE_ENTER("Permedia3SubsequentFillRectSolid"); - - GLINT_WAIT(3); - GLINT_WRITE_REG(y<<16 | x, RectanglePosition); - GLINT_WRITE_REG(w | 3<<28 | h<<16, Render2D); + GLINT_WAIT(2); + GLINT_WRITE_REG( + PM3RectanglePosition_XOffset(x) | + PM3RectanglePosition_YOffset(y), + PM3RectanglePosition); + GLINT_WRITE_REG(pGlint->PM3_Render2D | + PM3Render2D_Width(w) | PM3Render2D_Height(h), + PM3Render2D); TRACE_EXIT("Permedia3SubsequentFillRectSolid"); } - -static void MoveBYTE( - register CARD32* dest, - register unsigned char* src, - register int dwords -) -{ - while(dwords) { - *dest = *src; - src += 1; - dest += 1; - dwords -= 1; - } -} - -static void MoveWORDS( - register CARD32* dest, - register unsigned short* src, - register int dwords -) -{ - while(dwords & ~0x01) { - *dest = *src; - *(dest + 1) = *(src + 1); - src += 2; - dest += 2; - dwords -= 2; - } - switch(dwords) { - case 0: return; - case 1: *dest = *src; - return; - } -} - -static void MoveDWORDS( - register CARD32* dest, - register CARD32* src, - register int dwords ) -{ - while(dwords & ~0x03) { - *dest = *src; - *(dest + 1) = *(src + 1); - *(dest + 2) = *(src + 2); - *(dest + 3) = *(src + 3); - src += 4; - dest += 4; - dwords -= 4; - } - if (!dwords) return; - *dest = *src; - if (dwords == 1) return; - *(dest + 1) = *(src + 1); - if (dwords == 2) return; - *(dest + 2) = *(src + 2); -} - +/* 8x8 Mono Pattern Fills */ static void Permedia3SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, - int patternx, int patterny, - int fg, int bg, int rop, - unsigned int planemask) + int patternx, int patterny, + int fg, int bg, int rop, + unsigned int planemask) { GLINTPtr pGlint = GLINTPTR(pScrn); TRACE_ENTER("Permedia3SetupForMono8x8PatternFill"); - - GLINT_WAIT(14); - - GLINT_WRITE_REG(fg, ForegroundColor); - pGlint->FrameBufferReadMode = 0; - + REPLICATE(fg); + pGlint->PM3_Render2D = + PM3Render2D_AreaStippleEnable | + PM3Render2D_SpanOperation | + PM3Render2D_XPositive | + PM3Render2D_YPositive | + PM3Render2D_Operation_Normal; + pGlint->PM3_Config2D = + PM3Config2D_UseConstantSource | + PM3Config2D_ForegroundROPEnable | + PM3Config2D_ForegroundROP(rop) | + PM3Config2D_FBWriteEnable; + if ((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXcopy)&&(rop!=GXcopyInverted)) + pGlint->PM3_Config2D |= PM3Config2D_FBDestReadEnable; + /* Clipping is not working correctly yet ... + if (pGlint->ClippingOn) + pGlint->PM3_Config2D |= PM3Config2D_UserScissorEnable; + */ + pGlint->PM3_AreaStippleMode = 1; + pGlint->PM3_AreaStippleMode |= (2<<1); + pGlint->PM3_AreaStippleMode |= (2<<4); if (bg != -1) { + REPLICATE(bg); + pGlint->PM3_Config2D |= PM3Config2D_OpaqueSpan; + pGlint->PM3_AreaStippleMode |= 1<<20; + GLINT_WAIT(12); GLINT_WRITE_REG(bg, BackgroundColor); - pGlint->FrameBufferReadMode = 1<<20; } - - DO_PLANEMASK(planemask); + else GLINT_WAIT(11); GLINT_WRITE_REG((patternx & 0xFF), AreaStipplePattern0); GLINT_WRITE_REG((patternx & 0xFF00) >> 8, AreaStipplePattern1); GLINT_WRITE_REG((patternx & 0xFF0000) >> 16, AreaStipplePattern2); @@ -714,848 +652,121 @@ Permedia3SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, GLINT_WRITE_REG((patterny & 0xFF00) >> 8, AreaStipplePattern5); GLINT_WRITE_REG((patterny & 0xFF0000) >> 16, AreaStipplePattern6); GLINT_WRITE_REG((patterny & 0xFF000000) >> 24, AreaStipplePattern7); - - if ((rop == GXcopy) || (rop == GXcopyInverted)) { - GLINT_WRITE_REG(UNIT_DISABLE, FBDstReadMode); - } else { - GLINT_WRITE_REG(UNIT_ENABLE | FBDRM_Enable0 /*| FBDRM_Blocking*/, FBDstReadMode); - } - - GLINT_WRITE_REG(rop<<1 | 1, LogicalOpMode); + GLINT_WRITE_REG(fg, PM3ForegroundColor); + DO_PLANEMASK(planemask); + GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); TRACE_EXIT("Permedia3SetupForMono8x8PatternFill"); } - static void Permedia3SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, - int patternx, int patterny, - int x, int y, - int w, int h) + int x_offset, int y_offset, + int x, int y, int w, int h) { GLINTPtr pGlint = GLINTPTR(pScrn); - - TRACE_ENTER("Permedia3SubsequentMono8x8PatternFillRect()"); - - GLINT_WAIT(4); - GLINT_WRITE_REG(pGlint->FrameBufferReadMode|patternx<<7|patterny<<12|2<<1|2<<4|STIPPLE_SWAP|UNIT_ENABLE, AreaStippleMode); - GLINT_WRITE_REG(y<<16 | x, RectanglePosition); - GLINT_WRITE_REG(w | 1<<30 | 3<<28 |h<<16, Render2D); - - TRACE_EXIT("Permedia3SubsequentMono8x8PatternFillRect()"); + TRACE_ENTER("Permedia3SubsequentMono8x8PatternFillRect"); + GLINT_WAIT(3); + GLINT_WRITE_REG( + PM3RectanglePosition_XOffset(x) | + PM3RectanglePosition_YOffset(y), + PM3RectanglePosition); + GLINT_WRITE_REG( + (x_offset&0x7)<<7 | (y_offset&0x7)<<12 | + pGlint->PM3_AreaStippleMode, + AreaStippleMode); + GLINT_WRITE_REG(pGlint->PM3_Render2D | + PM3Render2D_Width(w) | PM3Render2D_Height(h), + PM3Render2D); + TRACE_EXIT("Permedia3SubsequentMono8x8PatternFillRect"); } -static void -Permedia3SetupForCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, - int fg, int bg, - int rop, - unsigned int planemask -){ +/* Color Expansion Fills */ +static void Permedia3SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, int rop,unsigned int planemask) +{ GLINTPtr pGlint = GLINTPTR(pScrn); - int dobackground = 0; - TRACE_ENTER("Permedia3SetupForCPUToScreenColorExpandFill"); - if (bg != -1) dobackground |= ForceBackgroundColor; - - GLINT_WAIT(7); - DO_PLANEMASK(planemask); - if (rop == GXcopy) { - GLINT_WRITE_REG(pGlint->pprod, FBReadMode); - } else { - GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); - } - - pGlint->ForeGroundColor = fg; - pGlint->BackGroundColor = bg; REPLICATE(fg); - REPLICATE(bg); - - if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { - GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); - if (dobackground) { - GLINT_WRITE_REG(bg, FBBlockColor); - } else { - GLINT_WRITE_REG(fg, FBBlockColor); - } - GLINT_WRITE_REG(pGlint->RasterizerSwap,RasterizerMode); - pGlint->FrameBufferReadMode = FastFillEnable; - } else { - GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); - GLINT_WRITE_REG(BitMaskPackingEachScanline|dobackground| - pGlint->RasterizerSwap,RasterizerMode); - GLINT_WRITE_REG(fg, ConstantColor); - if (dobackground) { - pGlint->FrameBufferReadMode = TextureEnable; - GLINT_WRITE_REG(bg, Texel0); - } else - pGlint->FrameBufferReadMode = 0; + pGlint->PM3_Render2D = + PM3Render2D_SpanOperation | + PM3Render2D_XPositive | + PM3Render2D_YPositive | + PM3Render2D_Operation_SyncOnBitMask; + pGlint->PM3_Config2D = + PM3Config2D_UserScissorEnable | + PM3Config2D_UseConstantSource | + PM3Config2D_ForegroundROPEnable | + PM3Config2D_ForegroundROP(rop) | + PM3Config2D_FBWriteEnable; + if ((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXcopy)&&(rop!=GXcopyInverted)) + pGlint->PM3_Config2D |= PM3Config2D_FBDestReadEnable; + if (bg != -1) { + REPLICATE(bg); + pGlint->PM3_Config2D |= PM3Config2D_OpaqueSpan; + GLINT_WAIT(4); + GLINT_WRITE_REG(bg, BackgroundColor); } - LOADROP(rop); + else GLINT_WAIT(3); + GLINT_WRITE_REG(fg, PM3ForegroundColor); + DO_PLANEMASK(planemask); + GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); TRACE_EXIT("Permedia3SetupForCPUToScreenColorExpandFill"); } - -static void -Permedia3SubsequentCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - int skipleft -){ +static void Permedia3SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int x, int y, int w, int h, int skipleft) +{ GLINTPtr pGlint = GLINTPTR(pScrn); - int dwords = ((w + 31) >> 5) * h; - TRACE_ENTER("Permedia3SubsequentCPUToScreenColorExpandFill"); - GLINT_WAIT(8); - Permedia3LoadCoord(pScrn, x, y, w, h); - - if ((pGlint->ROP == GXcopy) && (pGlint->BackGroundColor != -1)) { - GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive | FastFillEnable, Render); - REPLICATE(pGlint->ForeGroundColor) - GLINT_WRITE_REG(pGlint->ForeGroundColor, FBBlockColor); - } - - GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive | SyncOnBitMask | - pGlint->FrameBufferReadMode, Render); - GLINT_WRITE_REG((dwords - 1)<<16 | 0x0D, OutputFIFO); - GLINT_WAIT(dwords); + GLINT_WAIT(4); + GLINT_WRITE_REG(((y&0x0fff)<<16)|((x+skipleft)&0x0fff), ScissorMinXY); + GLINT_WRITE_REG((((y+h)&0x0fff)<<16)|((x+w)&0x0fff), ScissorMaxXY); + GLINT_WRITE_REG( + PM3RectanglePosition_XOffset(x) | + PM3RectanglePosition_YOffset(y), + PM3RectanglePosition); + GLINT_WRITE_REG(pGlint->PM3_Render2D | + PM3Render2D_Width(w) | PM3Render2D_Height(h), + PM3Render2D); TRACE_EXIT("Permedia3SubsequentCPUToScreenColorExpandFill"); } -static void -Permedia3SetupForScanlineCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, - int fg, int bg, - int rop, - unsigned int planemask -){ - GLINTPtr pGlint = GLINTPTR(pScrn); - int dobackground = 0; - - TRACE_ENTER("Permedia3SetupForScanlineCPUToScreenColorExpandFill"); - if (bg != -1) dobackground |= ForceBackgroundColor; - pGlint->BackGroundColor = bg; - pGlint->ForeGroundColor = fg; - REPLICATE(fg); - REPLICATE(bg); - GLINT_WAIT(7); - DO_PLANEMASK(planemask); - if (rop == GXcopy) { - GLINT_WRITE_REG(pGlint->pprod, FBReadMode); - } else { - GLINT_WRITE_REG(pGlint->pprod|FBRM_DstEnable, FBReadMode); - } - if ((rop == GXcopy) && (pGlint->BackGroundColor == -1)) { - pGlint->FrameBufferReadMode = FastFillEnable; - GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); - GLINT_WRITE_REG(fg, FBBlockColor); - GLINT_WRITE_REG(pGlint->RasterizerSwap,RasterizerMode); - } else { - GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); - GLINT_WRITE_REG(fg, ConstantColor); - GLINT_WRITE_REG(BitMaskPackingEachScanline|dobackground| - pGlint->RasterizerSwap,RasterizerMode); - if (dobackground) { - GLINT_WRITE_REG(bg, Texel0); - pGlint->FrameBufferReadMode = TextureEnable; - } else { - pGlint->FrameBufferReadMode = 0; - } - } - LOADROP(rop); - TRACE_EXIT("Permedia3SetupForScanlineCPUToScreenColorExpandFill"); -} - -static void -Permedia3SubsequentScanlineCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - int skipleft -){ - GLINTPtr pGlint = GLINTPTR(pScrn); - - TRACE_ENTER("Permedia3SubsequentScanlineCPUToScreenColorExpandFill"); - - pGlint->dwords = ((w + 31) >> 5); /* dwords per scanline */ - - pGlint->cpucount = h; - - GLINT_WAIT(6); - Permedia3LoadCoord(pScrn, x, y, w, h); - GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive | pGlint->FrameBufferReadMode | SyncOnBitMask, Render); - GLINT_WRITE_REG(((pGlint->dwords*h)-1)<<16 | 0x0D, OutputFIFO); - GLINT_WAIT(pGlint->dwords); - pGlint->cpucount--; - TRACE_EXIT("Permedia3SubsequentScanlineCPUToScreenColorExpandFill"); -} - -static void -Permedia3SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) +/* Images Writes */ +static void Permedia3SetupForImageWrite(ScrnInfoPtr pScrn, int rop, + unsigned int planemask, int trans_color, int bpp, int depth) { GLINTPtr pGlint = GLINTPTR(pScrn); - - if (pGlint->cpucount--) - GLINT_WAIT(pGlint->dwords); -} - - -static void -Permedia3WriteBitmap(ScrnInfoPtr pScrn, - int x, int y, int w, int h, - unsigned char *src, - int srcwidth, - int skipleft, - int fg, int bg, - int rop, - unsigned int planemask -) -{ - XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); - GLINTPtr pGlint = GLINTPTR(pScrn); - unsigned char *srcpntr; - int dwords, height, mode; - Bool SecondPass = FALSE; - - TRACE_ENTER("Permedia3WriteBitmap"); - - w += skipleft; - x -= skipleft; - dwords = (w + 31) >> 5; - - Permedia3SetClippingRectangle(pScrn,x+skipleft,y,x+w,y+h); - - if (pScrn->bitsPerPixel == 24) { - GLINT_WAIT(10); - } else { - GLINT_WAIT(11); - DO_PLANEMASK(planemask); - } - LOADROP(rop); - Permedia3LoadCoord(pScrn, x&0xFFFF, y, w, h); - if (rop == GXcopy) { - GLINT_WRITE_REG(pGlint->pprod, FBReadMode); - } else { - GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); - } - if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { - mode = FastFillEnable; - GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); - GLINT_WRITE_REG(pGlint->RasterizerSwap,RasterizerMode); - } else { - mode = 0; - GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode); - GLINT_WRITE_REG(BitMaskPackingEachScanline| - pGlint->RasterizerSwap,RasterizerMode); - } - - if(bg == -1) { - /* >>>>> set fg <<<<<<<< */ - REPLICATE(fg); - if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { - GLINT_WRITE_REG(fg, FBBlockColor); - } else { - GLINT_WRITE_REG(fg, ConstantColor); - } - } else if(rop == GXcopy) { - /* >>>>> set bg <<<<<<< */ - /* >>>>> draw rect (x,y,w,h) */ - REPLICATE(bg); - if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { - GLINT_WRITE_REG(bg, FBBlockColor); - } else { - GLINT_WRITE_REG(bg, ConstantColor); - } - GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive |mode,Render); - /* >>>>>> set fg <<<<<< */ - REPLICATE(fg); - if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { - GLINT_WRITE_REG(fg, FBBlockColor); - } else { - GLINT_WRITE_REG(fg, ConstantColor); - } - } else { - SecondPass = TRUE; - /* >>>>> set fg <<<<<<< */ - REPLICATE(fg); - if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { - GLINT_WRITE_REG(fg, FBBlockColor); - } else { - GLINT_WRITE_REG(fg, ConstantColor); - } - } - - /* >>>>>>>>> initiate transfer (x,y,w,h). Skipleft pixels on the - left edge will be clipped <<<<<< */ - -SECOND_PASS: - GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive | mode | SyncOnBitMask, Render); - - height = h; - srcpntr = src; - while(height--) { - GLINT_WAIT(dwords); - /* 0x0D is the TAG value for BitMaskPattern */ - GLINT_WRITE_REG(((dwords - 1) << 16) | 0x0D, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32 *)srcpntr, dwords); - srcpntr += srcwidth; - } - - if(SecondPass) { - SecondPass = FALSE; - /* >>>>>> invert bitmask and set bg <<<<<<<< */ - REPLICATE(bg); - GLINT_WAIT(3); - if ((pScrn->bitsPerPixel != 24) && (rop == GXcopy)) { - GLINT_WRITE_REG(InvertBitMask|pGlint->RasterizerSwap,RasterizerMode); - GLINT_WRITE_REG(bg, FBBlockColor); - } else { - GLINT_WRITE_REG(InvertBitMask|BitMaskPackingEachScanline| - pGlint->RasterizerSwap, RasterizerMode); - GLINT_WRITE_REG(bg, ConstantColor); - } - goto SECOND_PASS; - } - - GLINT_WAIT(1); - GLINT_WRITE_REG(pGlint->RasterizerSwap, RasterizerMode); - Permedia3DisableClipping(pScrn); - SET_SYNC_FLAG(infoRec); - TRACE_EXIT("Permedia3WriteBitmap"); -} - - -static void -Permedia3WritePixmap8bpp( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - unsigned char *src, - int srcwidth, - int rop, - unsigned int planemask, - int transparency_color, - int bpp, int depth -) -{ - XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); - GLINTPtr pGlint = GLINTPTR(pScrn); - int skipleft, dwords, count; - CARD32* srcp; - unsigned char *srcpbyte; - Bool FastTexLoad = FALSE; - - GLINT_WAIT(3); + TRACE_ENTER("Permedia3SetupForImageWrite"); + pGlint->PM3_Render2D = + PM3Render2D_SpanOperation | + PM3Render2D_XPositive | + PM3Render2D_YPositive | + PM3Render2D_Operation_SyncOnHostData; + pGlint->PM3_Config2D = + PM3Config2D_UserScissorEnable | + PM3Config2D_ForegroundROPEnable | + PM3Config2D_ForegroundROP(rop) | + PM3Config2D_FBWriteEnable; + if ((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXcopy)&&(rop!=GXcopyInverted)) + pGlint->PM3_Config2D |= PM3Config2D_FBDestReadEnable; + GLINT_WAIT(2); DO_PLANEMASK(planemask); - GLINT_WRITE_REG(pGlint->RasterizerSwap,RasterizerMode); - if (rop == GXcopy) { - GLINT_WRITE_REG(pGlint->pprod | FBRM_Packed, FBReadMode); - } else { - GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); - } - - dwords = (w + 3) >> 2; -#if X_BYTE_ORDER == X_LITTLE_ENDIAN - if((!(x&3)) && (!(w&3))) FastTexLoad = TRUE; -#endif - if((rop != GXcopy) || (planemask != ~0)) - FastTexLoad = FALSE; - - if (rop == GXcopy) { - skipleft = 0; - } else { - if((skipleft = (long)src & 0x03)) { - skipleft /= (bpp>>3); - - x -= skipleft; - w += skipleft; - - src = (unsigned char*)((long)src & ~0x03); - } - } - - - if(FastTexLoad) { - int address; - - GLINT_WAIT(1); - GLINT_WRITE_REG(UNIT_DISABLE, FBWriteMode); - Permedia3Sync(pScrn); /* we are not using the rasterizer */ - while(h--) { - count = dwords; - address = ((y * pScrn->displayWidth) + x) >> 2; - srcp = (CARD32*)src; - GLINT_WRITE_REG(address, TextureDownloadOffset); - while(count >= MAX_FIFO_ENTRIES) { - GLINT_WAIT(MAX_FIFO_ENTRIES); - /* (0x11 << 4) | 0x0D is the TAG for TextureData */ - GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x11 << 4) | - 0x0D, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); - count -= MAX_FIFO_ENTRIES - 1; - address += MAX_FIFO_ENTRIES - 1; - srcp += MAX_FIFO_ENTRIES - 1; - } - if(count) { - GLINT_WAIT(count + 1); - /* (0x11 << 4) | 0x0D is the TAG for TextureData */ - GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, - OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, count); - } - src += srcwidth; - y++; - } - GLINT_WAIT(1); - GLINT_WRITE_REG(UNIT_ENABLE, FBWriteMode); - } else { - char align = (x & pGlint->bppalign); - - - GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); - if (rop == GXcopy) { - GLINT_WAIT(6); - Permedia3LoadCoord(pScrn, x>>pGlint->BppShift, y, - (w+pGlint->bppalign)>>pGlint->BppShift, h); - GLINT_WRITE_REG(align<<29|x<<16|(x+w), PackedDataLimits); - } else { - Permedia3SetClippingRectangle(pScrn,x+skipleft,y,x+w,y+h); - GLINT_WAIT(5); - Permedia3LoadCoord(pScrn, x, y, w, h); - } - LOADROP(rop); - GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive | - SyncOnHostData, Render); - - if (rop == GXcopy) { - while(h--) { - count = dwords; - srcp = (CARD32*)src; - while(count >= MAX_FIFO_ENTRIES) { - GLINT_WAIT(MAX_FIFO_ENTRIES); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); - count -= MAX_FIFO_ENTRIES - 1; - srcp += MAX_FIFO_ENTRIES - 1; - } - if(count) { - GLINT_WAIT(count + 1); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, count); - } - src += srcwidth; - } - } else { - while(h--) { - count = w; - srcpbyte = (unsigned char *)src; - while(count >= MAX_FIFO_ENTRIES) { - GLINT_WAIT(MAX_FIFO_ENTRIES); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveBYTE((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (unsigned char *)srcpbyte, MAX_FIFO_ENTRIES - 1); - count -= MAX_FIFO_ENTRIES - 1; - srcpbyte += MAX_FIFO_ENTRIES - 1; - } - if(count) { - GLINT_WAIT(count + 1); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveBYTE((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (unsigned char *)srcpbyte, count); - } - src += srcwidth; - } - } - } - - Permedia3DisableClipping(pScrn); - SET_SYNC_FLAG(infoRec); -} - -static void -Permedia3WritePixmap16bpp( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - unsigned char *src, - int srcwidth, - int rop, - unsigned int planemask, - int transparency_color, - int bpp, int depth -) -{ - XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); - GLINTPtr pGlint = GLINTPTR(pScrn); - int skipleft, dwords, count; - CARD32* srcp; - unsigned short* srcpword; - Bool FastTexLoad; - - TRACE_ENTER("Permedia3WritePixmap16bpp"); - GLINT_WAIT(3); - DO_PLANEMASK(planemask); - GLINT_WRITE_REG(pGlint->RasterizerSwap,RasterizerMode); - if (rop == GXcopy) { - GLINT_WRITE_REG(pGlint->pprod | FBRM_Packed, FBReadMode); - } else { - GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); - } - - FastTexLoad = FALSE; - dwords = (w + 1) >> 1; -#if X_BYTE_ORDER == X_LITTLE_ENDIAN - if((!(x&1)) && (!(w&1))) FastTexLoad = TRUE; -#endif - if((rop != GXcopy) || (planemask != ~0)) - FastTexLoad = FALSE; - - if (rop == GXcopy) { - skipleft = 0; - } else { - if((skipleft = (long)src & 0x03L)) { - skipleft /= (bpp>>3); - - x -= skipleft; - w += skipleft; - - src = (unsigned char*)((long)src & ~0x03L); - } - } - - if(FastTexLoad) { - int address; - - GLINT_WAIT(1); - GLINT_WRITE_REG(UNIT_DISABLE, FBWriteMode); - Permedia3Sync(pScrn); /* we are not using the rasterizer */ - while(h--) { - count = dwords; - address = ((y * pScrn->displayWidth) + x) >> 1; - srcp = (CARD32*)src; - GLINT_WRITE_REG(address, TextureDownloadOffset); - while(count >= MAX_FIFO_ENTRIES) { - GLINT_WAIT(MAX_FIFO_ENTRIES); - /* (0x11 << 4) | 0x0D is the TAG for TextureData */ - GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x11 << 4) | - 0x0D, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); - count -= MAX_FIFO_ENTRIES - 1; - address += MAX_FIFO_ENTRIES - 1; - srcp += MAX_FIFO_ENTRIES - 1; - } - if(count) { - GLINT_WAIT(count + 1); - /* (0x11 << 4) | 0x0D is the TAG for TextureData */ - GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, - OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, count); - } - src += srcwidth; - y++; - } - GLINT_WAIT(1); - GLINT_WRITE_REG(UNIT_ENABLE, FBWriteMode); - } else { - char align = (x & pGlint->bppalign); - - - GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); - if (rop == GXcopy) { - GLINT_WAIT(6); - Permedia3LoadCoord(pScrn, x>>pGlint->BppShift, y, - (w+pGlint->bppalign)>>pGlint->BppShift, h); - GLINT_WRITE_REG(align<<29|x<<16|(x+w), PackedDataLimits); - } else { - Permedia3SetClippingRectangle(pScrn,x+skipleft,y,x+w,y+h); - GLINT_WAIT(5); - Permedia3LoadCoord(pScrn, x, y, w, h); - } - LOADROP(rop); - GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive | - SyncOnHostData, Render); - - if (rop == GXcopy) { - while(h--) { - count = dwords; - srcp = (CARD32*)src; - while(count >= MAX_FIFO_ENTRIES) { - GLINT_WAIT(MAX_FIFO_ENTRIES); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); - count -= MAX_FIFO_ENTRIES - 1; - srcp += MAX_FIFO_ENTRIES - 1; - } - if(count) { - GLINT_WAIT(count + 1); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, count); - } - src += srcwidth; - } - } else { - while(h--) { - count = w; - srcpword = (unsigned short *)src; - while(count >= MAX_FIFO_ENTRIES) { - GLINT_WAIT(MAX_FIFO_ENTRIES); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (unsigned short *)srcpword, MAX_FIFO_ENTRIES - 1); - count -= MAX_FIFO_ENTRIES - 1; - srcpword += MAX_FIFO_ENTRIES - 1; - } - if(count) { - GLINT_WAIT(count + 1); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (unsigned short *)srcpword, count); - } - src += srcwidth; - } - } - } - - Permedia3DisableClipping(pScrn); - SET_SYNC_FLAG(infoRec); - TRACE_EXIT("Permedia3WritePixmap16bpp"); + GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); + TRACE_EXIT("Permedia3SetupForImageWrite"); } - -#if 0 -static void -Permedia3WritePixmap24bpp( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - unsigned char *src, - int srcwidth, - int rop, - unsigned int planemask, - int transparency_color, - int bpp, int depth -) +static void Permedia3SubsequentImageWriteRect(ScrnInfoPtr pScrn, + int x, int y, int w, int h, int skipleft) { - XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); GLINTPtr pGlint = GLINTPTR(pScrn); - int skipleft = 0, dwords, count; - unsigned char* srcpbyte; - CARD32* srcp; - - GLINT_WAIT(3); - GLINT_WRITE_REG(pGlint->RasterizerSwap,RasterizerMode); - GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); - if (rop == GXcopy) { - GLINT_WRITE_REG(pGlint->pprod, FBReadMode); - } else { - GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); - } - - dwords = ((w+1)*3)>>2; - if((skipleft = (long)src & 0x03L)) { - skipleft = 4 - skipleft; - - x -= skipleft; - w += skipleft; - - src = (unsigned char*)(src - (3*skipleft)); - } - - { - Permedia3SetClippingRectangle(pScrn,x+skipleft,y,x+w,y+h); - - GLINT_WAIT(4); - Permedia3LoadCoord(pScrn, x&0xFFFF, y, w, h); - LOADROP(rop); - GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive | - SyncOnHostData, Render); - -#if 1 - while(h--) { - count = w; - srcpbyte = (unsigned char *)src; - while(count >= MAX_FIFO_ENTRIES) { - GLINT_WAIT(MAX_FIFO_ENTRIES); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveBYTE((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (unsigned char *)srcpbyte, MAX_FIFO_ENTRIES - 1); - count -= MAX_FIFO_ENTRIES - 1; - srcpbyte += MAX_FIFO_ENTRIES - 1; - } - if(count) { - GLINT_WAIT(count + 1); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveBYTE((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (unsigned char *)srcpbyte, count); - } - src += srcwidth; -#else - while(h--) { - count = dwords; - srcp = (CARD32*)src; - while(count >= MAX_FIFO_ENTRIES) { - GLINT_WAIT(MAX_FIFO_ENTRIES); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); - count -= MAX_FIFO_ENTRIES - 1; - srcp += MAX_FIFO_ENTRIES - 1; - } - if(count) { - GLINT_WAIT(count + 1); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, count); - } - src += srcwidth; -#endif - } - } - - Permedia3DisableClipping(pScrn); - SET_SYNC_FLAG(infoRec); + TRACE_ENTER("Permedia3SubsequentImageWrite"); + GLINT_WAIT(4); + GLINT_WRITE_REG(((y&0x0fff)<<16)|((x+skipleft)&0x0fff), ScissorMinXY); + GLINT_WRITE_REG((((y+h)&0x0fff)<<16)|((x+w)&0x0fff), ScissorMaxXY); + GLINT_WRITE_REG( + PM3RectanglePosition_XOffset(x) | + PM3RectanglePosition_YOffset(y), + PM3RectanglePosition); + GLINT_WRITE_REG(pGlint->PM3_Render2D | + PM3Render2D_Width(w) | PM3Render2D_Height(h), + PM3Render2D); + TRACE_EXIT("Permedia3SubsequentImageWrite"); } -#endif - -static void -Permedia3WritePixmap32bpp( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - unsigned char *src, - int srcwidth, - int rop, - unsigned int planemask, - int transparency_color, - int bpp, int depth -) -{ - XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); - GLINTPtr pGlint = GLINTPTR(pScrn); - int skipleft, dwords, count; - CARD32* srcp; - Bool FastTexLoad; - - GLINT_WAIT(3); - DO_PLANEMASK(planemask); - GLINT_WRITE_REG(pGlint->RasterizerSwap,RasterizerMode); - if (rop == GXcopy) { - GLINT_WRITE_REG(pGlint->pprod, FBReadMode); - } else { - GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode); - } - - FastTexLoad = TRUE; - dwords = w; - if((rop != GXcopy) || (planemask != ~0)) - FastTexLoad = FALSE; - - if (!FastTexLoad) { - if((skipleft = (long)src & 0x03L)) { - skipleft /= (bpp>>3); - - x -= skipleft; - w += skipleft; - - src = (unsigned char*)((long)src & ~0x03L); - } - } - - if(FastTexLoad) { - int address; - - GLINT_WAIT(1); - GLINT_WRITE_REG(UNIT_DISABLE, FBWriteMode); - Permedia3Sync(pScrn); /* we are not using the rasterizer */ - while(h--) { - count = dwords; - address = (y * pScrn->displayWidth) + x; - srcp = (CARD32*)src; - GLINT_WRITE_REG(address, TextureDownloadOffset); - while(count >= MAX_FIFO_ENTRIES) { - GLINT_WAIT(MAX_FIFO_ENTRIES); - /* (0x11 << 4) | 0x0D is the TAG for TextureData */ - GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x11 << 4) | - 0x0D, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); - count -= MAX_FIFO_ENTRIES - 1; - address += MAX_FIFO_ENTRIES - 1; - srcp += MAX_FIFO_ENTRIES - 1; - } - if(count) { - GLINT_WAIT(count + 1); - /* (0x11 << 4) | 0x0D is the TAG for TextureData */ - GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D, - OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, count); - } - src += srcwidth; - y++; - } - GLINT_WAIT(1); - GLINT_WRITE_REG(UNIT_ENABLE, FBWriteMode); - } else { - Permedia3SetClippingRectangle(pScrn,x+skipleft,y,x+w,y+h); - - GLINT_WAIT(6); - Permedia3LoadCoord(pScrn, x, y, w, h); - GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode); - LOADROP(rop); - GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive | - SyncOnHostData, Render); - - while(h--) { - count = dwords; - srcp = (CARD32*)src; - while(count >= MAX_FIFO_ENTRIES) { - GLINT_WAIT(MAX_FIFO_ENTRIES); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((MAX_FIFO_ENTRIES - 2) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, MAX_FIFO_ENTRIES - 1); - count -= MAX_FIFO_ENTRIES - 1; - srcp += MAX_FIFO_ENTRIES - 1; - } - if(count) { - GLINT_WAIT(count + 1); - /* (0x15 << 4) | 0x05 is the TAG for FBSourceData */ - GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) | - 0x05, OutputFIFO); - MoveDWORDS((CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4), - (CARD32*)srcp, count); - } - src += srcwidth; - } - } - - Permedia3DisableClipping(pScrn); - SET_SYNC_FLAG(infoRec); -} diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c index 37ee0059f..467d9674f 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c @@ -1,35 +1,31 @@ /* - * Copyright 1997,1998 by Alan Hourihane <alanh@fairlite.demon.co.uk> + * Copyright 2000 by Sven Luther <luther@dpt-info.u-strasbg.fr>. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in + * documentation, and that the name of Sven Luther not be used in * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations + * specific, written prior permission. Sven Luther makes no representations * about the suitability of this software for any purpose. It is provided * "as is" without express or implied warranty. * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * SVEN LUTHER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * EVENT SHALL SVEN LUTHER BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * * Authors: Sven Luther, <luther@dpt-info.u-strasbg.fr> - * Thomas Witzel, <twitzel@nmr.mgh.harvard.edu> - * - * - * - * + * Thomas Witzel, <twitzel@nmr.mgh.harvard.edu> * * this work is sponsored by Appian Graphics. * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c,v 1.6 2000/09/19 14:12:32 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c,v 1.8 2000/10/26 13:41:32 alanh Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -54,43 +50,17 @@ # define TRACE(str) #endif -void -Permedia3PreInit(ScrnInfoPtr pScrn, GLINTPtr pGlint) -{ - TRACE_ENTER("Permedia3PreInit"); - if ((pGlint->PciInfo->subsysVendor == 0x1097) && - (pGlint->PciInfo->subsysCard == 0x3d32)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Appian Jeronimo 2000 board detected and initialized.\n\t" - "subsysVendor = 0x%04x, subsysCard = 0x%04x.\n", - pGlint->PciInfo->subsysVendor, pGlint->PciInfo->subsysCard); - /* Memory timings for the Appian J2000 board. - * This is needed for the second head which is left unitilialized - * by the bios, thus freezing the machine. - */ - GLINT_SLOW_WRITE_REG(0x02e311B8, PM3LocalMemCaps); - GLINT_SLOW_WRITE_REG(0x07424905, PM3LocalMemTimings); - GLINT_SLOW_WRITE_REG(0x0c000003, PM3LocalMemControl); - GLINT_SLOW_WRITE_REG(0x00000061, PM3LocalMemRefresh); - GLINT_SLOW_WRITE_REG(0x00000000, PM3LocalMemPowerDown); - } - else xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Unknown Glint Permedia3 board detected.\n\t" - "subsysVendor = 0x%04x, subsysCard = 0x%04x.\n", - pGlint->PciInfo->subsysVendor, pGlint->PciInfo->subsysCard); - TRACE_EXIT("Permedia3PreInit"); -} +int PM3QuickFillMemory(ScrnInfoPtr pScrn,int size); int PM3QuickFillMemory(ScrnInfoPtr pScrn,int size) { - GLINTPtr pGlint; + GLINTPtr pGlint = GLINTPTR (pScrn); unsigned int * p; unsigned int p_content; unsigned int i, j; long savemapsize; - pGlint = GLINTPTR (pScrn); savemapsize = pGlint->FbMapSize; pGlint->FbMapSize = size*1024*1024; @@ -214,6 +184,61 @@ PM3DAC_CalculateClock return(actualclock); } +void +Permedia3PreInit(ScrnInfoPtr pScrn) +{ + GLINTPtr pGlint = GLINTPTR(pScrn); + TRACE_ENTER("Permedia3PreInit"); + if ((pGlint->PciInfo->subsysVendor == 0x1097) && + (pGlint->PciInfo->subsysCard == 0x3d32)) { + unsigned char m,n,p; + unsigned long clockused; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Appian Jeronimo 2000 board detected and initialized.\n\t" + "subsysVendor = 0x%04x, subsysCard = 0x%04x.\n", + pGlint->PciInfo->subsysVendor, pGlint->PciInfo->subsysCard); + + /* Memory timings for the Appian J2000 board. + * This is needed for the second head which is left unitilialized + * by the bios, thus freezing the machine. */ + GLINT_SLOW_WRITE_REG(0x02e311B8, PM3LocalMemCaps); + GLINT_SLOW_WRITE_REG(0x07424905, PM3LocalMemTimings); + GLINT_SLOW_WRITE_REG(0x0c000003, PM3LocalMemControl); + GLINT_SLOW_WRITE_REG(0x00000061, PM3LocalMemRefresh); + GLINT_SLOW_WRITE_REG(0x00000000, PM3LocalMemPowerDown); + + /* Let's program the K, M and S Clocks to the same values as the bios + * does for first head : + * - KClk and MClk are 105Mhz. + * - S Clock is set to PClk. + * Note 1 : pGlint->RefClock is not set yet, so use 14318 instead. + * Note 2 : KClk gets internally halved, so we need to double it. + */ + clockused = PM3DAC_CalculateClock(2*105000, 14318, &m,&n,&p); + Permedia2vOutIndReg(pScrn, PM3RD_KClkPreScale, 0x00, m); + Permedia2vOutIndReg(pScrn, PM3RD_KClkFeedbackScale, 0x00, n); + Permedia2vOutIndReg(pScrn, PM3RD_KClkPostScale, 0x00, p); + Permedia2vOutIndReg(pScrn, PM3RD_KClkControl, 0x00, + PM3RD_KClkControl_STATE_RUN | + PM3RD_KClkControl_SOURCE_PLL | + PM3RD_KClkControl_ENABLE); + Permedia2vOutIndReg(pScrn, PM3RD_MClkControl, 0x00, + PM3RD_MClkControl_STATE_RUN | + PM3RD_MClkControl_SOURCE_KCLK | + PM3RD_MClkControl_ENABLE); + Permedia2vOutIndReg(pScrn, PM3RD_SClkControl, 0x00, + PM3RD_SClkControl_STATE_RUN | + PM3RD_SClkControl_SOURCE_PCLK | + PM3RD_SClkControl_ENABLE); + } + else xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Unknown Glint Permedia3 board detected.\n\t" + "subsysVendor = 0x%04x, subsysCard = 0x%04x.\n\t" + "Let's hope that it is correctly initialized by the bios.\n", + pGlint->PciInfo->subsysVendor, pGlint->PciInfo->subsysCard); + TRACE_EXIT("Permedia3PreInit"); +} + Bool Permedia3Init(ScrnInfoPtr pScrn, DisplayModePtr mode) { @@ -221,19 +246,6 @@ Permedia3Init(ScrnInfoPtr pScrn, DisplayModePtr mode) GLINTRegPtr pReg = &pGlint->ModeReg; CARD32 temp1, temp2, temp3, temp4; - /* Memory timings for the Appian J2000 board - * This is not ideal, since the work here is duplicated - * in the Permedia3PreInit function :((( - */ - if ((pGlint->PciInfo->subsysVendor == 0x1097) && - (pGlint->PciInfo->subsysCard == 0x3d32)) { - pReg->glintRegs[PM3LocalMemCaps >> 3] = 0x02e311B8; - pReg->glintRegs[PM3LocalMemTimings >> 3] = 0x07424905; - pReg->glintRegs[PM3LocalMemControl >> 3] = 0x0c000003; - pReg->glintRegs[PM3LocalMemRefresh >> 3] = 0x00000061; - } - - pReg->glintRegs[PM3LocalMemPowerDown >> 3] = 0x00000000; pReg->glintRegs[PM3MemBypassWriteMask >> 3] = 0xffffffff; pReg->glintRegs[PM3ByAperture1Mode >> 3] = 0x00000000; pReg->glintRegs[PM3ByAperture2Mode >> 3] = 0x00000000; @@ -316,25 +328,6 @@ Permedia3Init(ScrnInfoPtr pScrn, DisplayModePtr mode) unsigned char m,n,p; unsigned long clockused; - /* Let's program the KClk to 100Mhz and set the S & M Clk too. */ -/* clockused = PM3DAC_CalculateClock(100000, - pGlint->RefClock, &m,&n,&p); - pReg->DacRegs[PM3RD_KClkPreScale] = m; - pReg->DacRegs[PM3RD_KClkFeedbackScale] = n; - pReg->DacRegs[PM3RD_KClkPostScale] = p; - pReg->DacRegs[PM3RD_KClkControl] = - PM3RD_KClkControl_STATE_RUN | - PM3RD_KClkControl_SOURCE_PLL | - PM3RD_KClkControl_ENABLE; - pReg->DacRegs[PM3RD_MClkControl] = - PM3RD_MClkControl_STATE_RUN | - PM3RD_MClkControl_SOURCE_KCLK | - PM3RD_MClkControl_ENABLE; - pReg->DacRegs[PM3RD_SClkControl] = - PM3RD_SClkControl_STATE_RUN | - PM3RD_SClkControl_SOURCE_HALF_KCLK | - PM3RD_SClkControl_ENABLE; -*/ /* Let's program the dot clock */ clockused = PM3DAC_CalculateClock(mode->Clock, pGlint->RefClock, &m,&n,&p); @@ -356,6 +349,13 @@ Permedia3Init(ScrnInfoPtr pScrn, DisplayModePtr mode) if (!(mode->Flags & V_PVSYNC)) pReg->DacRegs[PM2VDACRDSyncControl] |= 0x08; /* invert vsync */ +#if 0 /* Currently commented out while testing Flat Panel support */ + pReg->DacRegs[PM2VDACRDDACControl] = 0x01; + pReg->DacRegs[PM2VDACRDSyncControl] |= 0x40; + pReg->glintRegs[VSConfiguration >> 3] = (GLINT_READ_REG(VSConfiguration) & 0xFFFFFFF8) | 0x06; + pReg->glintRegs[VSBBase >> 3] = 1<<14; +#endif + switch (pScrn->bitsPerPixel) { case 8: @@ -395,16 +395,6 @@ Permedia3Save(ScrnInfoPtr pScrn, GLINTRegPtr glintReg) /* Permedia 3 memory Timings */ glintReg->glintRegs[PM3MemBypassWriteMask >> 3] = GLINT_READ_REG(PM3MemBypassWriteMask); - glintReg->glintRegs[PM3LocalMemCaps >> 3] = - GLINT_READ_REG(PM3LocalMemCaps); - glintReg->glintRegs[PM3LocalMemTimings >> 3] = - GLINT_READ_REG(PM3LocalMemTimings); - glintReg->glintRegs[PM3LocalMemControl >> 3] = - GLINT_READ_REG(PM3LocalMemControl); - glintReg->glintRegs[PM3LocalMemRefresh >> 3] = - GLINT_READ_REG(PM3LocalMemRefresh); - glintReg->glintRegs[PM3LocalMemPowerDown >> 3] = - GLINT_READ_REG(PM3LocalMemPowerDown); glintReg->glintRegs[PM3ByAperture1Mode >> 3] = GLINT_READ_REG(PM3ByAperture1Mode); glintReg->glintRegs[PM3ByAperture2Mode >> 3] = @@ -429,6 +419,10 @@ Permedia3Save(ScrnInfoPtr pScrn, GLINTRegPtr glintReg) glintReg->glintRegs[PMScreenBase >> 3] = GLINT_READ_REG(PMScreenBase); glintReg->glintRegs[PMVideoControl >> 3] = GLINT_READ_REG(PMVideoControl); glintReg->glintRegs[VClkCtl >> 3] = GLINT_READ_REG(VClkCtl); +#if 0 /* Currently commented out while testing Flat Panel support */ + glintReg->glintRegs[VSConfiguration >> 3] = GLINT_READ_REG(VSConfiguration); + glintReg->glintRegs[VSBBase >> 3] = GLINT_READ_REG(VSBBase); +#endif for (i=0;i<768;i++) { Permedia2ReadAddress(pScrn, i); @@ -453,20 +447,6 @@ Permedia3Save(ScrnInfoPtr pScrn, GLINTRegPtr glintReg) glintReg->DacRegs[PM2VDACRDDClk0PreScale] = Permedia2vInIndReg(pScrn, PM2VDACRDDClk0PreScale); glintReg->DacRegs[PM2VDACRDDClk0FeedbackScale] = Permedia2vInIndReg(pScrn, PM2VDACRDDClk0FeedbackScale); glintReg->DacRegs[PM2VDACRDDClk0PostScale] = Permedia2vInIndReg(pScrn, PM2VDACRDDClk0PostScale); - /* save KClk, MClk and SClk settings */ - /* glintReg->DacRegs[PM3RD_KClkControl] = - Permedia2vInIndReg(pScrn,PM3RD_KClkControl); - glintReg->DacRegs[PM3RD_MClkControl] = - Permedia2vInIndReg(pScrn,PM3RD_MClkControl); - glintReg->DacRegs[PM3RD_SClkControl] = - Permedia2vInIndReg(pScrn,PM3RD_SClkControl); - glintReg->DacRegs[PM3RD_KClkPreScale] = - Permedia2vInIndReg(pScrn,PM3RD_KClkPreScale); - glintReg->DacRegs[PM3RD_KClkFeedbackScale] = - Permedia2vInIndReg(pScrn,PM3RD_KClkFeedbackScale); - glintReg->DacRegs[PM3RD_KClkPostScale] = - Permedia2vInIndReg(pScrn,PM3RD_KClkPostScale); -*/ } void @@ -486,16 +466,6 @@ Permedia3Restore(ScrnInfoPtr pScrn, GLINTRegPtr glintReg) /* Permedia 3 memory Timings */ GLINT_SLOW_WRITE_REG(glintReg->glintRegs[PM3MemBypassWriteMask >> 3], PM3MemBypassWriteMask); - GLINT_SLOW_WRITE_REG(glintReg->glintRegs[PM3LocalMemCaps >> 3], - PM3LocalMemCaps); - GLINT_SLOW_WRITE_REG(glintReg->glintRegs[PM3LocalMemTimings >> 3], - PM3LocalMemTimings); - GLINT_SLOW_WRITE_REG(glintReg->glintRegs[PM3LocalMemControl >> 3], - PM3LocalMemControl); - GLINT_SLOW_WRITE_REG(glintReg->glintRegs[PM3LocalMemRefresh >> 3], - PM3LocalMemRefresh); - GLINT_SLOW_WRITE_REG(glintReg->glintRegs[PM3LocalMemPowerDown >> 3], - PM3LocalMemPowerDown); GLINT_SLOW_WRITE_REG(glintReg->glintRegs[PM3ByAperture1Mode >> 3], PM3ByAperture1Mode); GLINT_SLOW_WRITE_REG(glintReg->glintRegs[PM3ByAperture2Mode >> 3], @@ -521,6 +491,10 @@ Permedia3Restore(ScrnInfoPtr pScrn, GLINTRegPtr glintReg) GLINT_SLOW_WRITE_REG(glintReg->glintRegs[PMVbEnd >> 3], PMVbEnd); GLINT_SLOW_WRITE_REG(glintReg->glintRegs[PMVsStart >> 3], PMVsStart); GLINT_SLOW_WRITE_REG(glintReg->glintRegs[PMVsEnd >> 3], PMVsEnd); +#if 0 /* Currently commented out while testing Flat Panel support */ + GLINT_SLOW_WRITE_REG(glintReg->glintRegs[VSConfiguration >> 3], VSConfiguration); + GLINT_SLOW_WRITE_REG(glintReg->glintRegs[VSBBase >> 3], VSBBase); +#endif Permedia2vOutIndReg(pScrn, PM2VDACRDIndexControl, 0x00, glintReg->DacRegs[PM2VDACRDIndexControl]); @@ -550,19 +524,4 @@ Permedia3Restore(ScrnInfoPtr pScrn, GLINTRegPtr glintReg) Permedia2vOutIndReg(pScrn, PM2VDACRDDClk0PostScale, 0x00, glintReg->DacRegs[PM2VDACRDDClk0PostScale]); Permedia2vOutIndReg(pScrn, PM2VDACIndexClockControl, 0x00, temp|0x03); - /* retsore the KClk, MClk and SClk settings */ - /* Permedia2vOutIndReg(pScrn, PM3RD_KClkPreScale, 0x00, - glintReg->DacRegs[PM3RD_KClkPreScale]); - Permedia2vOutIndReg(pScrn, PM3RD_KClkFeedbackScale, 0x00, - glintReg->DacRegs[PM3RD_KClkFeedbackScale]); - Permedia2vOutIndReg(pScrn, PM3RD_KClkPostScale, 0x00, - glintReg->DacRegs[PM3RD_KClkPostScale]); - Permedia2vOutIndReg(pScrn, PM3RD_KClkControl, 0x00, - glintReg->DacRegs[PM3RD_KClkControl]); - */ /* Should we wait for KClk to be locked here ? */ - /* Permedia2vOutIndReg(pScrn, PM3RD_MClkControl, 0x00, - glintReg->DacRegs[PM3RD_MClkControl]); - Permedia2vOutIndReg(pScrn, PM3RD_SClkControl, 0x00, - glintReg->DacRegs[PM3RD_SClkControl]); -*/ } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_regs.h b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_regs.h index 677227a1f..ed455edd9 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_regs.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_regs.h @@ -1,4 +1,4 @@ -/* $XFree86: $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_regs.h,v 1.3 2000/10/17 09:07:05 alanh Exp $ */ /* * glint register file @@ -435,7 +435,8 @@ #define PM3AntialiasMode 0x8808 #define PM3AntialiasModeAnd 0xac00 #define PM3AntialiasModeOr 0xac08 - +/* ... */ +#define PM3BackgroundColor 0xb0c8 /* ... */ #define PM3ColorDDAMode 0x87e0 #define PM3ColorDDAModeAnd 0xabe0 @@ -470,6 +471,17 @@ #define PM3dXSub 0x8018 #define PM3dY 0x8028 /* ... */ +#define PM3FBBlockColor 0x8ac8 +#define PM3FBBlockColor0 0xb060 +#define PM3FBBlockColor1 0xb068 +#define PM3FBBlockColor2 0xb070 +#define PM3FBBlockColor3 0xb078 +#define PM3FBBlockColorBack 0xb0a0 +#define PM3FBBlockColorBack0 0xb080 +#define PM3FBBlockColorBack1 0xb088 +#define PM3FBBlockColorBack2 0xb090 +#define PM3FBBlockColorBack3 0xb098 +#define PM3FBColor 0x8a98 #define PM3FBDestReadBufferAddr0 0xae80 #define PM3FBDestReadBufferAddr1 0xae88 #define PM3FBDestReadBufferAddr2 0xae90 @@ -534,6 +546,7 @@ #define PM3FBHardwareWriteMask 0x8ac0 #define PM3FBSoftwareWriteMask 0x8820 +#define PM3FBData 0x8aa0 #define PM3FBSourceData 0x8aa8 #define PM3FBSourceReadBufferAddr 0xaf08 #define PM3FBSourceReadBufferOffset 0xaf10 @@ -660,6 +673,11 @@ #define PM3LBWriteMode_Packed16 1<<11 #define PM3LBWriteMode_Width(w) (((w)&0xfff)<<12) /* ... */ +#define PM3LineStippleMode 0x81a8 +#define PM3LineStippleModeAnd 0xabc0 +#define PM3LineStippleModeOr 0xabc8 +#define PM3LoadLineStippleCounters 0x81b0 +/* ... */ #define PM3LogicalOpMode 0x8828 #define PM3LogicalOpModeAnd 0xace0 #define PM3LogicalOpModeOr 0xace8 @@ -880,7 +898,7 @@ #define PM3Render2D_Width(w) ((w)&0x0fff) #define PM3Render2D_Operation_Normal 0<<12 #define PM3Render2D_Operation_SyncOnHostData 1<<12 - #define PM3Render2D_Operation_SyncOnbitMask 2<<12 + #define PM3Render2D_Operation_SyncOnBitMask 2<<12 #define PM3Render2D_Operation_PatchOrderRendering 3<<12 #define PM3Render2D_FBSourceReadEnable 1<<14 #define PM3Render2D_SpanOperation 1<<15 diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810.h b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810.h index a9d77a2a7..528344b8f 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810.h @@ -25,7 +25,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************/ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810.h,v 1.16 2000/09/17 01:36:27 mvojkovi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810.h,v 1.18 2000/10/24 22:45:06 dawes Exp $ */ /* * Authors: @@ -166,8 +166,8 @@ typedef struct _I810Rec { int DGAViewportStatus; int Chipset; - int LinearAddr; - int MMIOAddr; + unsigned long LinearAddr; + unsigned long MMIOAddr; EntityInfoPtr pEnt; pciVideoPtr PciInfo; PCITAG PciTag; @@ -311,6 +311,14 @@ extern void I810InitVideo(ScreenPtr pScreen); OUTREG(LP_RING + RING_TAIL, outring); \ } +#ifdef __GNUC__ +#define LP_RING_MESSAGE(n) \ + ErrorF("BEGIN_LP_RING %d in %s\n", n, __FUNCTION__) +#else +#define LP_RING_MESSAGE(n) \ + ErrorF("BEGIN_LP_RING %d in %s:%d\n", n, __FILE__, __LINE__) +#endif + #define BEGIN_LP_RING(n) \ unsigned int outring, ringmask; \ volatile unsigned char *virt; \ @@ -318,7 +326,7 @@ extern void I810InitVideo(ScreenPtr pScreen); if (pI810->LpRing.space < n*4) I810WaitLpRing( pScrn, n*4, 0); \ pI810->LpRing.space -= n*4; \ if (I810_DEBUG & DEBUG_VERBOSE_RING) \ - ErrorF( "BEGIN_LP_RING %d in %s\n", n, __FUNCTION__); \ + LP_RING_MESSAGE(n); \ outring = pI810->LpRing.tail; \ ringmask = pI810->LpRing.tail_mask; \ virt = pI810->LpRing.virtual_start; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c index 2e97a3c26..ccc01e0d0 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c,v 1.11 2000/09/17 01:36:27 mvojkovi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c,v 1.12 2000/09/24 13:51:26 alanh Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_driver.c index 2e55a7849..7997567c5 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_driver.c @@ -25,7 +25,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************/ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_driver.c,v 1.32 2000/09/19 12:46:16 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_driver.c,v 1.34 2000/09/26 15:57:11 tsi Exp $ */ /* * Authors: @@ -359,7 +359,7 @@ static Bool I810Probe(DriverPtr drv, int flags) { int i, numUsed, numDevSections, *usedChips; GDevPtr *devSections; - Bool foundScreen = 0; + Bool foundScreen = FALSE; /* Find the config file Device sections that match this @@ -381,9 +381,10 @@ I810Probe(DriverPtr drv, int flags) { devSections, numDevSections, drv, &usedChips); - if (flags & PROBE_DETECT) - foundScreen = TRUE; - else + if (flags & PROBE_DETECT) { + if (numUsed > 0) + foundScreen = TRUE; + } else for (i=0; i<numUsed; i++) { ScrnInfoPtr pScrn = NULL; /* Allocate new ScrnInfoRec and claim the slot */ @@ -1645,7 +1646,7 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) { if (!I810MapMem(pScrn)) return FALSE; - pScrn->memPhysBase = (int)pI810->FbBase; + pScrn->memPhysBase = (unsigned long)pI810->FbBase; pScrn->fbOffset = 0; vgaHWSetMmioFuncs(hwp, pI810->MMIOBase, 0); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_memory.c b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_memory.c index 42893411d..e37ade8b5 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_memory.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_memory.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_memory.c,v 1.15 2000/08/28 18:12:55 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_memory.c,v 1.16 2000/09/24 13:51:26 alanh Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_reg.h b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_reg.h index 450f88570..ae665af09 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_reg.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_reg.h @@ -25,6 +25,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************/ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_reg.h,v 1.4 2000/09/26 15:57:12 tsi Exp $ */ /* * Authors: diff --git a/xc/programs/Xserver/hw/xfree86/drivers/imstt/Imakefile b/xc/programs/Xserver/hw/xfree86/drivers/imstt/Imakefile index 14eab93ed..a2f771acb 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/imstt/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/drivers/imstt/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/imstt/Imakefile,v 1.2 2000/06/14 01:56:08 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/imstt/Imakefile,v 1.3 2000/10/11 16:21:21 mvojkovi Exp $ /* * * Copyright 2000 Ani Joshi <ajoshi@unixbox.com> @@ -22,7 +22,7 @@ INCLUDES = -I. -I$(XF86COMSRC) -I$(XF86OSSRC) \ -I$(XF86SRC)/xf24_32bpp -I$(SERVERSRC)/Xext \ -I$(XF86SRC)/vgahw -I$(XF86SRC)/ramdac \ -I$(XF86SRC)/rac -I$(XF86SRC)/int10 \ - -I$(XF86SRC)/fbdevhw \ + -I$(XF86SRC)/fbdevhw -I$(SERVERSRC)/render \ -I$(SERVERSRC)/include -I$(XINCLUDESRC) -I$(FONTINCSRC) \ -I$(EXTINCSRC) #endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/Imakefile b/xc/programs/Xserver/hw/xfree86/drivers/mga/Imakefile index abfc49e87..2af10824a 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/Imakefile,v 1.35 2000/09/20 00:09:22 keithp Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/Imakefile,v 1.37 2000/10/09 23:12:45 alanh Exp $ XCOMM XCOMM This is an Imakefile for the MGA driver. XCOMM @@ -15,7 +15,7 @@ SUBDIRS=hallib DRISRCS = mga_dri.c mga_warp.c mga_wrap.c DRIOBJS = mga_dri.o mga_warp.o mga_wrap.o DRIINCLUDES = -I$(SERVERSRC)/GL/dri -I$(LIBSRC)/GL/dri \ - -I$(XF86OSSRC)/linux/drm/kernel -I$(TOP)/include + -I$(TOP)/include DRIDEFINES = $(GLX_DEFINES) #endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga.h b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga.h index 26da1dead..95b44d32c 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga.h,v 1.61 2000/08/21 00:36:37 mvojkovi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga.h,v 1.65 2000/10/24 22:45:06 dawes Exp $ */ /* * MGA Millennium (MGA2064W) functions * @@ -187,11 +187,11 @@ typedef struct { int YDstOrg; int DstOrg; int SrcOrg; - CARD32 IOAddress; - CARD32 FbAddress; - CARD32 ILOADAddress; + unsigned long IOAddress; + unsigned long FbAddress; + unsigned long ILOADAddress; int FbBaseReg; - CARD32 BiosAddress; + unsigned long BiosAddress; MessageType BiosFrom; unsigned char * IOBase; unsigned char * IOBaseDense; @@ -296,7 +296,10 @@ typedef struct { int allowedWidth; void (*VideoTimerCallback)(ScrnInfoPtr, Time); void (*PaletteLoadCallback)(ScrnInfoPtr); + void (*RenderCallback)(ScrnInfoPtr); + Time RenderTime; MGAPaletteInfo palinfo[256]; /* G400 hardware bug workaround */ + FBLinearPtr LinearScratch; } MGARec, *MGAPtr; #ifdef XF86DRI @@ -361,6 +364,7 @@ Bool MGADRIScreenInit(ScreenPtr pScreen); void MGADRICloseScreen(ScreenPtr pScreen); Bool MGADRIFinishScreenInit(ScreenPtr pScreen); void MGASwapContext(ScreenPtr pScreen); +void MGASwapContext_shared(ScreenPtr pScreen); Bool mgaConfigureWarp(ScrnInfoPtr pScrn); unsigned int mgaInstallMicrocode(ScreenPtr pScreen, int agp_offset); unsigned int mgaGetMicrocodeSize(ScreenPtr pScreen); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dac3026.c b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dac3026.c index 651acbf50..5ec08696f 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dac3026.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dac3026.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dac3026.c,v 1.52 2000/01/21 01:12:20 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dac3026.c,v 1.54 2000/10/24 22:45:07 dawes Exp $ */ /* * Copyright 1994 by Robin Cutshaw <robin@XFree86.org> * @@ -269,6 +269,7 @@ MGATi3026CalcClock ( return f_pll; } +#ifndef USEMGAHAL /* * MGATi3026SetMCLK - Set the memory clock (MCLK) PLL. * @@ -352,6 +353,7 @@ MGATi3026SetMCLK( ScrnInfoPtr pScrn, long f_out ) ; } } +#endif /* * MGATi3026SetPCLK - Set the pixel (PCLK) and loop (LCLK) clocks. @@ -503,7 +505,9 @@ MGA3026Init(ScrnInfoPtr pScrn, DisplayModePtr mode) int i, BppShift, index_1d = 0; const unsigned char* initDAC; MGAPtr pMga = MGAPTR(pScrn); +#ifndef USEMGAHAL MGARamdacPtr MGAdac = &pMga->Dac; +#endif MGAFBLayout *pLayout = &pMga->CurrentLayout; MGARegPtr pReg = &pMga->ModeReg; vgaRegPtr pVga = &VGAHWPTR(pScrn)->ModeReg; @@ -716,15 +720,8 @@ MGA3026Init(ScrnInfoPtr pScrn, DisplayModePtr mode) but that's no big deal since we will Restore right after this function */ -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #ifndef USEMGAHAL MGATi3026SetMCLK( pScrn, MGAdac->MemoryClock ); -/*******************/ -/* ADDED BY MATROX */ -/*******************/ - #endif #ifdef DEBUG @@ -763,9 +760,6 @@ MGA3026Restore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, pciSetBitsLong(pMga->PciTag, PCI_OPTION_REG, OPTION_MASK, mgaReg->Option); -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #ifndef USEMGAHAL /* select pixel clock PLL as clock source */ outTi3026(TVP3026_CLK_SEL, 0, mgaReg->DacRegs[3]); @@ -774,10 +768,7 @@ MGA3026Restore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, outTi3026(TVP3026_PLL_ADDR, 0, 0x2A); outTi3026(TVP3026_LOAD_CLK_DATA, 0, 0); outTi3026(TVP3026_PIX_CLK_DATA, 0, 0); -/*******************/ -/* ADDED BY MATROX */ -/*******************/ -#endif +#endif /* * This function handles restoring the generic VGA registers. @@ -791,9 +782,6 @@ MGA3026Restore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, * goes here. */ -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #ifndef USEMGAHAL /* program pixel clock PLL */ outTi3026(TVP3026_PLL_ADDR, 0, 0x00); @@ -808,31 +796,20 @@ MGA3026Restore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, /* set Q divider for loop clock PLL */ outTi3026(TVP3026_MCLK_CTL, 0, mgaReg->DacRegs[18]); - -/*******************/ -/* ADDED BY MATROX */ -/*******************/ -#endif +#endif /* program loop PLL */ outTi3026(TVP3026_PLL_ADDR, 0, 0x00); for (i = 3; i < 6; i++) outTi3026(TVP3026_LOAD_CLK_DATA, 0, mgaReg->DacClk[i]); -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #ifndef USEMGAHAL if ((vgaReg->MiscOutReg & 0x08) && ((mgaReg->DacClk[3] & 0xC0) == 0xC0) ) { /* poll until loop PLL LOCK bit is set */ outTi3026(TVP3026_PLL_ADDR, 0, 0x3F); while ( ! (inTi3026(TVP3026_LOAD_CLK_DATA) & 0x40) ); } - -/*******************/ -/* ADDED BY MATROX */ -/*******************/ -#endif +#endif /* * restore other DAC registers @@ -885,9 +862,6 @@ MGA3026Save(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, mgaReg->ExtVga[i] = INREG8(0x1FDF); } -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #ifndef USEMGAHAL outTi3026(TVP3026_PLL_ADDR, 0, 0x00); for (i = 0; i < 3; i++) @@ -898,11 +872,7 @@ MGA3026Save(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, for (i = 3; i < 6; i++) outTi3026(TVP3026_LOAD_CLK_DATA, 0, mgaReg->DacClk[i] = inTi3026(TVP3026_LOAD_CLK_DATA)); - -/*******************/ -/* ADDED BY MATROX */ -/*******************/ -#endif +#endif for (i = 0; i < DACREGSIZE; i++) mgaReg->DacRegs[i] = inTi3026(MGADACregs[i]); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c index 091dd3edb..620b2c7d0 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c @@ -2,7 +2,7 @@ * MGA-1064, MGA-G100, MGA-G200, MGA-G400 RAMDAC driver */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c,v 1.37 2000/08/21 00:36:37 mvojkovi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c,v 1.40 2000/10/24 22:45:07 dawes Exp $ */ /* * This is a first cut at a non-accelerated version to work with the @@ -82,11 +82,6 @@ static Bool MGAGInit(ScrnInfoPtr, DisplayModePtr); static void MGAGLoadPalette(ScrnInfoPtr, int, int*, LOCO*, VisualPtr); static Bool MGAG_i2cInit(ScrnInfoPtr pScrn); - -/*******************/ -/* ADDED BY MATROX */ -/*******************/ -/* We don't need anymore: MGAGCalcClock and MGAGSetPCLK function */ #ifndef USEMGAHAL /* * MGAGCalcClock - Calculate the PLL settings (m, n, p, s). @@ -150,6 +145,7 @@ MGAGCalcClock ( ScrnInfoPtr pScrn, long f_out, post_div_max = 7; break; case PCI_CHIP_MGAG100: + case PCI_CHIP_MGAG100_PCI: case PCI_CHIP_MGAG200: case PCI_CHIP_MGAG200_PCI: default: @@ -226,7 +222,6 @@ MGAGCalcClock ( ScrnInfoPtr pScrn, long f_out, return f_pll; } - /* * MGAGSetPCLK - Set the pixel (PCLK) clock. */ @@ -250,9 +245,6 @@ MGAGSetPCLK( ScrnInfoPtr pScrn, long f_out ) pReg->DacRegs[ MGA1064_PIX_PLLC_N ] = n & 0x7F; pReg->DacRegs[ MGA1064_PIX_PLLC_P ] = (p & 0x07) | ((s & 0x03) << 3); } -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #endif /* @@ -261,6 +253,7 @@ MGAGSetPCLK( ScrnInfoPtr pScrn, long f_out ) static Bool MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode) { +#ifndef USEMGAHAL /* * initial values of the DAC registers */ @@ -277,13 +270,14 @@ MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode) /* 0x48: */ 0, 0, 0, 0, 0, 0, 0, 0 }; + int i, weight555 = FALSE; +#endif int hd, hs, he, ht, vd, vs, ve, vt, wd; - int i, BppShift; + int BppShift; MGAPtr pMga; MGARegPtr pReg; vgaRegPtr pVga; MGAFBLayout *pLayout; - int weight555 = FALSE; pMga = MGAPTR(pScrn); pReg = &pMga->ModeReg; @@ -292,9 +286,6 @@ MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode) BppShift = pMga->BppShifts[(pLayout->bitsPerPixel >> 3) - 1]; -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #ifndef USEMGAHAL /* Allocate the DacRegs space if not done already */ if (pReg->DacRegs == NULL) { @@ -436,9 +427,6 @@ MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode) default: FatalError("MGA: unsupported depth\n"); } -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #endif /* @@ -520,29 +508,17 @@ MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode) pVga->CRTC[21] = vd & 0xFF; pVga->CRTC[22] = (vt + 1) & 0xFF; -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #ifndef USEMGAHAL pReg->DacRegs[ MGA1064_CURSOR_BASE_ADR_LOW ] = pMga->FbCursorOffset >> 10; pReg->DacRegs[ MGA1064_CURSOR_BASE_ADR_HI ] = pMga->FbCursorOffset >> 18; -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #endif if (pMga->SyncOnGreen) { -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #ifndef USEMGAHAL pReg->DacRegs[ MGA1064_GEN_CTL ] &= ~0x20; -/*******************/ -/* ADDED BY MATROX */ -/*******************/ -#endif +#endif pReg->ExtVga[3] |= 0x40; } @@ -552,16 +528,8 @@ MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode) #ifndef USEMGAHAL if (mode->Flags & V_DBLSCAN) pVga->CRTC[9] |= 0x80; -#endif -/*******************/ -/* ADDED BY MATROX */ -/*******************/ -#ifndef USEMGAHAL MGAGSetPCLK( pScrn, mode->Clock ); -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #endif /* This disables the VGA memory aperture */ @@ -670,13 +638,10 @@ MGAGRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, Bool restoreFonts) { int i; - CARD32 optionMask; MGAPtr pMga = MGAPTR(pScrn); - -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #ifndef USEMGAHAL + CARD32 optionMask; + /* * Code is needed to get things back to bank zero. */ @@ -710,10 +675,6 @@ MGAGRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, if (pMga->Chipset == PCI_CHIP_MGAG400) pciSetBitsLong(pMga->PciTag, PCI_MGA_OPTION3, OPTION3_MASK, mgaReg->Option3); - -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #endif /* restore CRTCEXT regs */ for (i = 0; i < 6; i++) @@ -763,18 +724,11 @@ MGAGSave(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, MGAPtr pMga = MGAPTR(pScrn); if(pMga->SecondCrtc == TRUE) return; - -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #ifndef USEMGAHAL /* Allocate the DacRegs space if not done already */ if (mgaReg->DacRegs == NULL) { mgaReg->DacRegs = xnfcalloc(DACREGSIZE, 1); } -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #endif /* @@ -789,9 +743,6 @@ MGAGSave(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, vgaHWSave(pScrn, vgaReg, VGA_SR_MODE | (saveFonts ? VGA_SR_FONTS : 0)); MGAGSavePalette(pScrn, vgaReg->DAC); -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #ifndef USEMGAHAL /* * The port I/O code necessary to read in the extended registers. @@ -804,9 +755,6 @@ MGAGSave(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, mgaReg->Option2 = pciReadLong(pMga->PciTag, PCI_MGA_OPTION2); if (pMga->Chipset == PCI_CHIP_MGAG400) mgaReg->Option3 = pciReadLong(pMga->PciTag, PCI_MGA_OPTION3); -/*******************/ -/* ADDED BY MATROX */ -/*******************/ #endif for (i = 0; i < 6; i++) diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dri.c index 41b82801c..79aa84eac 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dri.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dri.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dri.c,v 1.5 2000/06/23 23:43:44 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dri.c,v 1.9 2000/10/24 22:45:07 dawes Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -391,7 +391,7 @@ Bool MGADRIScreenInit(ScreenPtr pScreen) if (!xf86LoaderCheckSymbol("drmAvailable")) return FALSE; if (!xf86LoaderCheckSymbol("DRIQueryVersion")) { xf86DrvMsg(pScreen->myNum, X_ERROR, - "TDFXDRIScreenInit failed (libdri.a too old)\n"); + "MGADRIScreenInit failed (libdri.a too old)\n"); return FALSE; } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c index 845e3f85a..8f78d5ab8 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c @@ -43,7 +43,7 @@ * Fixed 32bpp hires 8MB horizontal line glitch at middle right */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c,v 1.165 2000/07/11 01:46:36 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c,v 1.173 2000/10/24 22:45:07 dawes Exp $ */ /* * This is a first cut at a non-accelerated version to work with the @@ -173,6 +173,7 @@ static SymTabRec MGAChipsets[] = { { PCI_CHIP_MGA1064, "mga1064sg" }, { PCI_CHIP_MGA2164, "mga2164w" }, { PCI_CHIP_MGA2164_AGP, "mga2164w AGP" }, + { PCI_CHIP_MGAG100_PCI, "mgag100" }, { PCI_CHIP_MGAG100, "mgag100" }, { PCI_CHIP_MGAG200, "mgag200" }, { PCI_CHIP_MGAG200_PCI, "mgag200 PCI" }, @@ -186,6 +187,7 @@ static PciChipsets MGAPciChipsets[] = { { PCI_CHIP_MGA2164, PCI_CHIP_MGA2164, RES_SHARED_VGA }, { PCI_CHIP_MGA2164_AGP, PCI_CHIP_MGA2164_AGP, RES_SHARED_VGA }, { PCI_CHIP_MGAG100, PCI_CHIP_MGAG100, RES_SHARED_VGA }, + { PCI_CHIP_MGAG100_PCI, PCI_CHIP_MGAG100_PCI, RES_SHARED_VGA }, { PCI_CHIP_MGAG200, PCI_CHIP_MGAG200, RES_SHARED_VGA }, { PCI_CHIP_MGAG200_PCI, PCI_CHIP_MGAG200_PCI, RES_SHARED_VGA }, { PCI_CHIP_MGAG400, PCI_CHIP_MGAG400, RES_SHARED_VGA }, @@ -211,8 +213,13 @@ typedef enum { OPTION_TEXTURED_VIDEO, OPTION_XAALINES, OPTION_CRTC2HALF, + OPTION_INT10, OPTION_AGP_MODE_2X, - OPTION_AGP_MODE_4X + OPTION_AGP_MODE_4X, + OPTION_DIGITAL, + OPTION_TV, + OPTION_TVSTANDARD, + OPTION_CABLETYPE } MGAOpts; static OptionInfoRec MGAOptions[] = { @@ -234,8 +241,13 @@ static OptionInfoRec MGAOptions[] = { { OPTION_TEXTURED_VIDEO, "TexturedVideo",OPTV_BOOLEAN, {0}, FALSE }, { OPTION_XAALINES, "XAALines", OPTV_INTEGER, {0}, FALSE }, { OPTION_CRTC2HALF, "Crtc2Half", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_INT10, "Int10", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_AGP_MODE_2X, "AGPMode2x", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_AGP_MODE_4X, "AGPMode4x", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_DIGITAL, "DigitalScreen",OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_TV, "TV", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_TVSTANDARD, "TVStandard", OPTV_ANYSTR, {0}, FALSE }, + { OPTION_CABLETYPE, "CableType", OPTV_ANYSTR, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -287,6 +299,9 @@ static const char *xaaSymbols[] = { "XAAOverlayFBfuncs", "XAACachePlanarMonoStipple", "XAAScreenIndex", + "XAAFallbackOps", + "XAAFillSolidRects", + "XAAMoveDWORDS", NULL }; @@ -368,6 +383,12 @@ static const char *vbeSymbols[] = { NULL }; +static const char *int10Symbols[] = { + "xf86InitInt10", + "xf86FreeInt10", + NULL +}; + static const char *fbdevHWSymbols[] = { "fbdevHWInit", "fbdevHWUseBuildinMode", @@ -441,7 +462,7 @@ mgaSetup(pointer module, pointer opts, int *errmaj, int *errmin) xf8_32bppSymbols, ramdacSymbols, ddcSymbols, i2cSymbols, shadowSymbols, fbdevHWSymbols, vbeSymbols, - fbSymbols, + fbSymbols, int10Symbols, #ifdef XF86DRI drmSymbols, driSymbols, #endif @@ -913,6 +934,7 @@ MGACountRam(ScrnInfoPtr pScrn) ProbeSize = 16384; break; case PCI_CHIP_MGAG100: + case PCI_CHIP_MGAG100_PCI: if(biosInfo) /* I'm not sure if the docs are correct */ return (biosInfo & (1 << 12)) ? 16384 : 8192; case PCI_CHIP_MGA1064: @@ -1121,8 +1143,12 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) MGAMODEINFO mgaModeInfo = {0}; ULONG ulBOARDHANDLESize; UCHAR ucMgaBase2; +#if 0 ULONG ulOrgFBuffer; #endif + Bool digital = FALSE; + Bool tv = FALSE; +#endif /* * Note: This function is only called once at server startup, and @@ -1184,20 +1210,6 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) if (!vgaHWGetHWRec(pScrn)) return FALSE; -#if 0 - /* This is causing problems with restoring the card to it's - original state. If this is to be done, it needs to happen - after we've saved the original state */ - /* Initialize the card through int10 interface if needed */ - if ( xf86LoadSubModule(pScrn, "int10")){ - xf86Int10InfoPtr pInt; - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Initializing int10\n"); - pInt = xf86InitInt10(pMga->pEnt->index); - xf86FreeInt10(pInt); - } -#endif - /* Find the PCI info for this screen */ pMga->PciInfo = xf86GetPciInfoForEntity(pMga->pEnt->index); pMga->PciTag = pciTag(pMga->PciInfo->bus, pMga->PciInfo->device, @@ -1350,6 +1362,16 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) /* Process the options */ xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, MGAOptions); + if(xf86ReturnOptValBool(MGAOptions, OPTION_INT10, FALSE) && + xf86LoadSubModule(pScrn, "int10")) + { + xf86Int10InfoPtr pInt; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Initializing int10\n"); + pInt = xf86InitInt10(pMga->pEnt->index); + xf86FreeInt10(pInt); + } + /* Set the bits per RGB for 8bpp mode */ if (pScrn->depth == 8) pScrn->rgbBits = 8; @@ -1453,13 +1475,17 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) if (xf86GetOptValBool(MGAOptions, OPTION_HW_CURSOR, &pMga->HWCursor)) { from = X_CONFIG; } - /* For compatibility, accept this too (as an override) */ - if (xf86ReturnOptValBool(MGAOptions, OPTION_SW_CURSOR, FALSE)) { - from = X_CONFIG; - pMga->HWCursor = FALSE; +#ifdef USEMGAHAL + xf86GetOptValBool(MGAOptions, OPTION_TV, &tv); + if (tv == TRUE) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Support\n"); + } + xf86GetOptValBool(MGAOptions, OPTION_DIGITAL, &digital); + if (digital == TRUE) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Digital Screen Support\n"); } - xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n", - pMga->HWCursor ? "HW" : "SW"); +#endif + /* For compatibility, accept this too (as an override) */ if (xf86ReturnOptValBool(MGAOptions, OPTION_NOACCEL, FALSE)) { pMga->NoAccel = TRUE; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Acceleration disabled\n"); @@ -1594,6 +1620,7 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) break; case PCI_CHIP_MGA1064: case PCI_CHIP_MGAG100: + case PCI_CHIP_MGAG100_PCI: case PCI_CHIP_MGAG200: case PCI_CHIP_MGAG200_PCI: case PCI_CHIP_MGAG400: @@ -1964,6 +1991,7 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) } break; case PCI_CHIP_MGAG100: + case PCI_CHIP_MGAG100_PCI: maxPitch = 2048; break; case PCI_CHIP_MGAG200: @@ -2007,9 +2035,6 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) MGAFreeRec(pScrn); return FALSE; } - /*******************/ - /* ADDED BY MATROX */ - /*******************/ #ifdef USEMGAHAL if(pMga->SecondCrtc == FALSE) { ulBOARDHANDLESize = MGAGetBOARDHANDLESize(); @@ -2061,8 +2086,16 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) mgaModeInfo.ulBpp = pScrn->bitsPerPixel; mgaModeInfo.ulZoom = 1; } else { /* Second CRTC && entity is shared */ - mgaModeInfo.flOutput = MGAMODEINFO_ANALOG2 | - MGAMODEINFO_SECOND_CRTC; + if (digital == TRUE) { + mgaModeInfo.flOutput = MGAMODEINFO_DIGITAL2 | + MGAMODEINFO_SECOND_CRTC; + } else if (tv == TRUE) { + mgaModeInfo.flOutput = MGAMODEINFO_TV | + MGAMODEINFO_SECOND_CRTC; + } else { + mgaModeInfo.flOutput = MGAMODEINFO_ANALOG2 | + MGAMODEINFO_SECOND_CRTC; + } #if 1 mgaModeInfo.ulDispWidth = pScrn->virtualX; mgaModeInfo.ulDispHeight = pScrn->virtualY; @@ -2080,13 +2113,12 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) } if(MGAValidateMode(pMga->pBoard,&mgaModeInfo) != 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "MGAValidateMode found the mode to be invalid\n"); + "MGAValidateMode from HALlib found the mode to be invalid\n"); return FALSE; } pScrn->displayWidth = mgaModeInfo.ulFBPitch; - -#endif /* USEMGAHAL */ +#endif /* * Set the CRTC parameters for all of the modes based on the type @@ -2461,6 +2493,7 @@ MGASave(ScrnInfoPtr pScrn) /* Convert DisplayModeRec parameters in MGAMODEINFO parameters. */ static void FillModeInfoStruct(ScrnInfoPtr pScrn, DisplayModePtr mode) { + const char *s; MGAPtr pMga = MGAPTR(pScrn); pMga->pMgaModeInfo = (LPMGAMODEINFO) xalloc (sizeof(MGAMODEINFO)); @@ -2472,8 +2505,38 @@ static void FillModeInfoStruct(ScrnInfoPtr pScrn, DisplayModePtr mode) pMga->pMgaModeInfo->ulFBPitch = 0; pMga->pMgaModeInfo->ulBpp = pScrn->bitsPerPixel; pMga->pMgaModeInfo->ulZoom = 1; - pMga->pMgaModeInfo->flSignalMode = 0; - pMga->pMgaModeInfo->ulRefreshRate = 0; + pMga->pMgaModeInfo->flSignalMode = 0x10; + + /* Set TV standard */ + if ((s = xf86GetOptValString(MGAOptions, OPTION_TVSTANDARD))) { + if (!xf86NameCmp(s, "PAL")) { + pMga->pMgaModeInfo->flSignalMode = 0x00; + pMga->pMgaModeInfo->ulRefreshRate = 50; + pMga->pMgaModeInfo->ulTVStandard = TV_PAL; + } else { + pMga->pMgaModeInfo->ulRefreshRate = 60; + pMga->pMgaModeInfo->ulTVStandard = TV_NTSC; + } + } else { + pMga->pMgaModeInfo->ulRefreshRate = 60; + pMga->pMgaModeInfo->ulTVStandard = TV_NTSC; + } + + /* Set Cable Type */ + if ((s = xf86GetOptValString(MGAOptions, OPTION_CABLETYPE))) { + if (!xf86NameCmp(s, "SCART_RGB")) { + pMga->pMgaModeInfo->ulCableType = TV_SCART_RGB; + } else if (!xf86NameCmp(s, "SCART_COMPOSITE")) { + pMga->pMgaModeInfo->ulCableType = TV_SCART_COMPOSITE; + } else if (!xf86NameCmp(s, "SCART_TYPE2")) { + pMga->pMgaModeInfo->ulCableType = TV_SCART_TYPE2; + } else { + pMga->pMgaModeInfo->ulCableType = TV_YC_COMPOSITE; + } + } else { + pMga->pMgaModeInfo->ulCableType = TV_YC_COMPOSITE; + } + pMga->pMgaModeInfo->ulHorizRate = 0; pMga->pMgaModeInfo->ulPixClock = mode->Clock; pMga->pMgaModeInfo->ulHFPorch = mode->HSyncStart - mode->HDisplay; @@ -2489,7 +2552,7 @@ static void FillModeInfoStruct(ScrnInfoPtr pScrn, DisplayModePtr mode) pMga->pMgaModeInfo->ulPanXGran = 0; pMga->pMgaModeInfo->ulPanYGran = 0; } -#endif /* USEMGAHAL */ +#endif /* * Initialise a new mode. This is currently still using the old @@ -2504,6 +2567,16 @@ MGAModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) vgaRegPtr vgaReg; MGAPtr pMga = MGAPTR(pScrn); MGARegPtr mgaReg; +#ifdef USEMGAHAL + Bool digital = FALSE; + Bool tv = FALSE; + ULONG status; + + /* Verify if user wants digital screen output */ + xf86GetOptValBool(MGAOptions, OPTION_DIGITAL, &digital); + /* Verify if user wants TV output */ + xf86GetOptValBool(MGAOptions, OPTION_TV, &tv); +#endif vgaHWUnlock(hwp); @@ -2524,26 +2597,40 @@ MGAModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) FillModeInfoStruct(pScrn,mode); if(pMga->SecondCrtc == TRUE) { - pMga->pMgaModeInfo->flOutput = MGAMODEINFO_ANALOG2 | - MGAMODEINFO_SECOND_CRTC | - MGAMODEINFO_FORCE_PITCH | - MGAMODEINFO_FORCE_DISPLAYORG; + if (digital == TRUE) { + pMga->pMgaModeInfo->flOutput = MGAMODEINFO_DIGITAL2 | + MGAMODEINFO_SECOND_CRTC | + MGAMODEINFO_FORCE_PITCH | + MGAMODEINFO_FORCE_DISPLAYORG; + } else if (tv == TRUE) { + pMga->pMgaModeInfo->flOutput = MGAMODEINFO_TV | + MGAMODEINFO_SECOND_CRTC | + MGAMODEINFO_FORCE_PITCH | + MGAMODEINFO_FORCE_DISPLAYORG; + } else { + pMga->pMgaModeInfo->flOutput = MGAMODEINFO_ANALOG2 | + MGAMODEINFO_SECOND_CRTC | + MGAMODEINFO_FORCE_PITCH | + MGAMODEINFO_FORCE_DISPLAYORG; + } } else { pMga->pMgaModeInfo->flOutput = MGAMODEINFO_ANALOG1 | MGAMODEINFO_FORCE_PITCH; } pMga->pMgaModeInfo->ulFBPitch = pScrn->displayWidth; - if(MGAValidateMode(pMga->pBoard,pMga->pMgaModeInfo) != 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Invalid parameters\n"); + /* Validate the parameters */ + if ((status = MGAValidateMode(pMga->pBoard, pMga->pMgaModeInfo)) != 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "MGAValidateMode from HALlib found the mode to be invalid. Error: %lx\n", status); return FALSE; } - if(MGAValidateVideoParameters(pMga->pBoard,pMga->pMgaModeInfo) != 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Invalid parameters\n"); + /* Validates the Video parameters */ + if ((status = MGAValidateVideoParameters(pMga->pBoard, pMga->pMgaModeInfo)) != 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "MGAValidateVideoParameters from HALlib found the mode to be invalid. Error: %lx\n", status); return FALSE; } -#endif /* USEMGAHAL */ +#endif #ifdef XF86DRI if (pMga->directRenderingEnabled) { @@ -2552,12 +2639,14 @@ MGAModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) #endif #ifdef USEMGAHAL + /* Initialize the board */ if(MGASetMode(pMga->pBoard,pMga->pMgaModeInfo) != 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "MGASetMode returned an error. Make sure to validate the mode before.\n"); return FALSE; } #define outMGAdreg(reg, val) OUTREG8(RAMDAC_OFFSET + (reg), val) - #define outMGAdac(reg, val) \ (outMGAdreg(MGA1064_INDEX, reg), outMGAdreg(MGA1064_DATA, val)) @@ -2565,10 +2654,7 @@ MGAModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) outMGAdac(MGA1064_CURSOR_BASE_ADR_LOW, pMga->FbCursorOffset >> 10); outMGAdac(MGA1064_CURSOR_BASE_ADR_HI, pMga->FbCursorOffset >> 18); } -#endif /* USEMGAHAL */ - - -#ifndef USEMGAHAL +#else (*pMga->Restore)(pScrn, vgaReg, mgaReg, FALSE); #endif @@ -2698,11 +2784,18 @@ MGAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pMga->pClientStruct = (LPCLIENTDATA) xalloc (sizeof(CLIENTDATA)); /* Fill the client part */ pMga->pClientStruct->pMga = (MGAPtr) pMga; - MGAOpenLibrary(pMga->pBoard,pMga->pClientStruct,sizeof(CLIENTDATA)); - pMga->pMgaHwInfo = (LPMGAHWINFO) xalloc (sizeof(MGAHWINFO)); MGAGetHardwareInfo(pMga->pBoard,pMga->pMgaHwInfo); + + /* Detecting for type of display */ + if (pMga->pMgaHwInfo->ulCapsSecondOutput & MGAHWINFOCAPS_OUTPUT_TV) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV detected\n"); + } + if (pMga->pMgaHwInfo->ulCapsSecondOutput & MGAHWINFOCAPS_OUTPUT_DIGITAL) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Digital Screen detected\n"); + } + /* Now copy these to the entitystructure */ pMgaEnt->pClientStruct = pMga->pClientStruct; pMgaEnt->pBoard = pMga->pBoard; @@ -2712,7 +2805,7 @@ MGAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pMga->pBoard = pMgaEnt->pBoard; pMga->pMgaHwInfo = pMgaEnt->pMgaHwInfo; } -#endif /* USEMGAHAL */ +#endif } else { #ifdef USEMGAHAL pMga->pBoard = @@ -2721,15 +2814,12 @@ MGAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pMga->pClientStruct = (LPCLIENTDATA) xalloc (sizeof(CLIENTDATA)); /* Fill the client part */ pMga->pClientStruct->pMga = (MGAPtr) pMga; - MGAOpenLibrary(pMga->pBoard,pMga->pClientStruct,sizeof(CLIENTDATA)); - pMga->pMgaHwInfo = (LPMGAHWINFO) xalloc (sizeof(MGAHWINFO)); MGAGetHardwareInfo(pMga->pBoard,pMga->pMgaHwInfo); -#endif /* USEMGAHAL */ +#endif } - /* Initialise the MMIO vgahw functions */ vgaHWSetMmioFuncs(hwp, pMga->IOBase, PORT_OFFSET); vgaHWGetIOBase(hwp); @@ -3245,7 +3335,7 @@ MGACloseScreen(int scrnIndex, ScreenPtr pScreen) if (pMga->pMgaHwInfo) xfree(pMga->pMgaHwInfo); } -#endif /* USEMGAHAL */ +#endif if (pMga->AccelInfoRec) XAADestroyInfoRec(pMga->AccelInfoRec); @@ -3440,6 +3530,9 @@ MGABlockHandler ( UpdateCurrentTime(); (*pMga->VideoTimerCallback)(pScrn, currentTime.milliseconds); } + + if(pMga->RenderCallback) + (*pMga->RenderCallback)(pScrn); } #if defined (DEBUG) diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_macros.h b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_macros.h index 70dbcf4bb..c2a47eaf1 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_macros.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_macros.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_macros.h,v 1.14 2000/06/17 00:03:20 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_macros.h,v 1.16 2000/10/24 22:45:07 dawes Exp $ */ #ifndef _MGA_MACROS_H_ #define _MGA_MACROS_H_ @@ -84,8 +84,6 @@ while(INREG(MGAREG_DWGSYNC) != MGA_SYNC_XTAG) ; \ OUTREG(MGAREG_CXBNDRY, 0xFFFF0000); } #ifdef XF86DRI -extern void mgaGetQuiescence( ScrnInfoPtr pScrn ); - #define CHECK_DMA_QUIESCENT(pMGA, pScrn) { \ if (!pMGA->have_quiescense) { \ pMGA->GetQuiescence( pScrn ); \ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c index ab978513d..d8dbe698e 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c,v 1.70 2000/07/08 22:09:11 mvojkovi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c,v 1.78 2000/10/27 18:31:04 dawes Exp $ */ /* All drivers should typically include these */ @@ -134,6 +134,315 @@ extern void MGAValidatePolyPoint(GCPtr, unsigned long, DrawablePtr); extern void MGAFillCacheBltRects(ScrnInfoPtr, int, unsigned int, int, BoxPtr, int, int, XAACacheInfoPtr); +#ifdef RENDER + +extern Bool +MGASetupForCPUToScreenAlphaTexture ( + ScrnInfoPtr pScrn, + int op, + CARD16 red, + CARD16 green, + CARD16 blue, + CARD16 alpha, + int alphaType, + CARD8 *alphaPtr, + int alphaPitch, + int width, + int height, + int flags +); + +extern Bool +MGASetupForCPUToScreenTexture ( + ScrnInfoPtr pScrn, + int op, + int texType, + CARD8 *texPtr, + int texPitch, + int width, + int height, + int flags +); + +extern void +MGASubsequentCPUToScreenTexture ( + ScrnInfoPtr pScrn, + int dstx, + int dsty, + int srcx, + int srcy, + int width, + int height +); + +extern CARD32 MGAAlphaTextureFormats[2]; +extern CARD32 MGATextureFormats[2]; + +#if PSZ == 8 +#include "mipict.h" +#include "dixstruct.h" + +CARD32 MGAAlphaTextureFormats[2] = {PICT_a8, 0}; +CARD32 MGATextureFormats[2] = {PICT_a8r8g8b8, 0}; + +static void +RemoveLinear (FBLinearPtr linear) +{ + MGAPtr pMga = (MGAPtr)(linear->devPrivate.ptr); + + pMga->LinearScratch = NULL; /* just lost our scratch */ +} + +static void +RenderCallback (ScrnInfoPtr pScrn) +{ + MGAPtr pMga = MGAPTR(pScrn); + + if((currentTime.milliseconds > pMga->RenderTime) && pMga->LinearScratch) { + xf86FreeOffscreenLinear(pMga->LinearScratch); + pMga->LinearScratch = NULL; + } + + if(!pMga->LinearScratch) + pMga->RenderCallback = NULL; +} + +#define RENDER_DELAY 15000 + +static Bool +AllocateLinear ( + ScrnInfoPtr pScrn, + int sizeNeeded +){ + MGAPtr pMga = MGAPTR(pScrn); + + pMga->RenderTime = currentTime.milliseconds + RENDER_DELAY; + pMga->RenderCallback = RenderCallback; + + if(pMga->LinearScratch) { + if(pMga->LinearScratch->size >= sizeNeeded) + return TRUE; + else { + if(xf86ResizeOffscreenLinear(pMga->LinearScratch, sizeNeeded)) + return TRUE; + + xf86FreeOffscreenLinear(pMga->LinearScratch); + pMga->LinearScratch = NULL; + } + } + + pMga->LinearScratch = xf86AllocateOffscreenLinear( + pScrn->pScreen, sizeNeeded, 32, + NULL, RemoveLinear, pMga); + + return (pMga->LinearScratch != NULL); +} + +static int +GetPowerOfTwo(int w) +{ + int Pof2; + int i = 12; + + while(--i) { + if(w & (1 << i)) { + Pof2 = i; + if(w & ((1 << i) - 1)) + Pof2++; + break; + } + } + return Pof2; +} + + +static int tex_padw, tex_padh; + +Bool +MGASetupForCPUToScreenAlphaTexture ( + ScrnInfoPtr pScrn, + int op, + CARD16 red, + CARD16 green, + CARD16 blue, + CARD16 alpha, + int alphaType, + CARD8 *alphaPtr, + int alphaPitch, + int width, + int height, + int flags +){ + int log2w, log2h, i, pitch, sizeNeeded, offset; + MGAPtr pMga = MGAPTR(pScrn); + + if(op != PictOpOver) /* only one tested */ + return FALSE; + + if((width > 2048) || (height > 2048)) + return FALSE; + + log2w = GetPowerOfTwo(width); + log2h = GetPowerOfTwo(height); + + CHECK_DMA_QUIESCENT(pMga, pScrn); + + if(pMga->Overlay8Plus24) { + i = 0x00ffffff; + WAITFIFO(1); + SET_PLANEMASK(i); + } + + pitch = (width + 15) & ~15; + sizeNeeded = pitch * height; + if(pScrn->bitsPerPixel == 16) + sizeNeeded <<= 1; + + if(!AllocateLinear(pScrn, sizeNeeded)) + return FALSE; + + offset = pMga->LinearScratch->offset << 1; + if(pScrn->bitsPerPixel == 32) + offset <<= 1; + + if(pMga->AccelInfoRec->NeedToSync) + MGAStormSync(pScrn); + + XAA_888_plus_PICT_a8_to_8888( + (blue >> 8) | (green & 0xff00) | ((red & 0xff00) << 8), + alphaPtr, alphaPitch, (CARD32*)(pMga->FbStart + offset), + pitch, width, height); + + tex_padw = 1 << log2w; + tex_padh = 1 << log2h; + + WAITFIFO(15); + OUTREG(MGAREG_TMR0, (1 << 20) / tex_padw); /* sx inc */ + OUTREG(MGAREG_TMR1, 0); /* sy inc */ + OUTREG(MGAREG_TMR2, 0); /* tx inc */ + OUTREG(MGAREG_TMR3, (1 << 20) / tex_padh); /* ty inc */ + OUTREG(MGAREG_TMR4, 0x00000000); + OUTREG(MGAREG_TMR5, 0x00000000); + OUTREG(MGAREG_TMR8, 0x00010000); + OUTREG(MGAREG_TEXORG, offset); + OUTREG(MGAREG_TEXWIDTH, log2w | (((8 - log2w) & 63) << 9) | + ((width - 1) << 18)); + OUTREG(MGAREG_TEXHEIGHT, log2h | (((8 - log2h) & 63) << 9) | + ((height - 1) << 18)); + OUTREG(MGAREG_TEXCTL, 0x1A000106 | ((pitch & 0x07FF) << 9)); + OUTREG(MGAREG_TEXCTL2, 0x00000014); + OUTREG(MGAREG_DWGCTL, 0x000c7076); + OUTREG(MGAREG_TEXFILTER, 0x01e00020); + OUTREG(MGAREG_ALPHACTRL, 0x00000154); + + return TRUE; +} + +Bool +MGASetupForCPUToScreenTexture ( + ScrnInfoPtr pScrn, + int op, + int texType, + CARD8 *texPtr, + int texPitch, + int width, + int height, + int flags +){ + int log2w, log2h, i, pitch, sizeNeeded, offset; + MGAPtr pMga = MGAPTR(pScrn); + + if(op != PictOpOver) /* only one tested */ + return FALSE; + + if((width > 2048) || (height > 2048)) + return FALSE; + + log2w = GetPowerOfTwo(width); + log2h = GetPowerOfTwo(height); + + CHECK_DMA_QUIESCENT(pMga, pScrn); + + if(pMga->Overlay8Plus24) { + i = 0x00ffffff; + WAITFIFO(1); + SET_PLANEMASK(i); + } + + pitch = (width + 15) & ~15; + sizeNeeded = pitch * height; + if(pScrn->bitsPerPixel == 16) + sizeNeeded <<= 1; + + if(!AllocateLinear(pScrn, sizeNeeded)) + return FALSE; + + offset = pMga->LinearScratch->offset << 1; + if(pScrn->bitsPerPixel == 32) + offset <<= 1; + + if(pMga->AccelInfoRec->NeedToSync) + MGAStormSync(pScrn); + + { + CARD8 *dst = (CARD8*)(pMga->FbStart + offset); + i = height; + while(i--) { + memcpy(dst, texPtr, width << 2); + texPtr += texPitch; + dst += pitch << 2; + } + } + + tex_padw = 1 << log2w; + tex_padh = 1 << log2h; + + WAITFIFO(15); + OUTREG(MGAREG_TMR0, (1 << 20) / tex_padw); /* sx inc */ + OUTREG(MGAREG_TMR1, 0); /* sy inc */ + OUTREG(MGAREG_TMR2, 0); /* tx inc */ + OUTREG(MGAREG_TMR3, (1 << 20) / tex_padh); /* ty inc */ + OUTREG(MGAREG_TMR4, 0x00000000); + OUTREG(MGAREG_TMR5, 0x00000000); + OUTREG(MGAREG_TMR8, 0x00010000); + OUTREG(MGAREG_TEXORG, offset); + OUTREG(MGAREG_TEXWIDTH, log2w | (((8 - log2w) & 63) << 9) | + ((width - 1) << 18)); + OUTREG(MGAREG_TEXHEIGHT, log2h | (((8 - log2h) & 63) << 9) | + ((height - 1) << 18)); + OUTREG(MGAREG_TEXCTL, 0x1A000106 | ((pitch & 0x07FF) << 9)); + OUTREG(MGAREG_TEXCTL2, 0x00000014); + OUTREG(MGAREG_DWGCTL, 0x000c7076); + OUTREG(MGAREG_TEXFILTER, 0x01e00020); + OUTREG(MGAREG_ALPHACTRL, 0x00000151); + + return TRUE; +} +void +MGASubsequentCPUToScreenTexture ( + ScrnInfoPtr pScrn, + int dstx, + int dsty, + int srcx, + int srcy, + int width, + int height +){ + MGAPtr pMga = MGAPTR(pScrn); + + WAITFIFO(4); + OUTREG(MGAREG_TMR6, (srcx << 20) / tex_padw); + OUTREG(MGAREG_TMR7, (srcy << 20) / tex_padh); + OUTREG(MGAREG_FXBNDRY, ((dstx + width) << 16) | (dstx & 0xffff)); + OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (dsty << 16) | height); + + pMga->AccelInfoRec->NeedToSync = TRUE; +} + + +#endif +#endif + Bool MGANAME(AccelInit)(ScreenPtr pScreen) { @@ -141,6 +450,7 @@ MGANAME(AccelInit)(ScreenPtr pScreen) ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; MGAPtr pMga = MGAPTR(pScrn); int maxFastBlitMem, maxlines; + Bool doRender = FALSE; BoxRec AvailFBArea; pMga->ScratchBuffer = xalloc(((pScrn->displayWidth * PSZ) + 127) >> 3); @@ -167,8 +477,10 @@ MGANAME(AccelInit)(ScreenPtr pScreen) pMga->HasFBitBlt = FALSE; } pMga->MaxBlitDWORDS = 0x400000 >> 5; + /* fallthrough */ case PCI_CHIP_MGAG200: case PCI_CHIP_MGAG200_PCI: + doRender = TRUE; pMga->AccelFlags = TRANSC_SOLID_FILL | TWO_PASS_COLOR_EXPAND; @@ -181,6 +493,7 @@ MGANAME(AccelInit)(ScreenPtr pScreen) pMga->AccelFlags = 0; break; case PCI_CHIP_MGAG100: + case PCI_CHIP_MGAG100_PCI: default: pMga->AccelFlags = MGA_NO_PLANEMASK; break; @@ -314,6 +627,7 @@ MGANAME(AccelInit)(ScreenPtr pScreen) SCANLINE_PAD_DWORD | LEFT_EDGE_CLIPPING | LEFT_EDGE_CLIPPING_NEGATIVE_X | + NO_TRANSPARENCY | NO_GXCOPY; infoPtr->SetupForScanlineImageWrite = @@ -347,9 +661,9 @@ MGANAME(AccelInit)(ScreenPtr pScreen) infoPtr->PolyPointMask = GCFunction | GCPlaneMask; } if(pMga->AccelFlags & MGA_NO_PLANEMASK) { - infoPtr->ImageWriteFlags |= NO_PLANEMASK; + infoPtr->ScanlineImageWriteFlags |= NO_PLANEMASK; infoPtr->ScreenToScreenCopyFlags |= NO_PLANEMASK; - infoPtr->CPUToScreenColorExpandFillFlags |= NO_PLANEMASK; + infoPtr->ScanlineCPUToScreenColorExpandFillFlags |= NO_PLANEMASK; infoPtr->SolidFillFlags |= NO_PLANEMASK; infoPtr->SolidLineFlags |= NO_PLANEMASK; infoPtr->DashedLineFlags |= NO_PLANEMASK; @@ -414,6 +728,24 @@ MGANAME(AccelInit)(ScreenPtr pScreen) infoPtr->RestoreAccelState = MGANAME(RestoreAccelState); } +#ifdef RENDER + if(doRender && ((pScrn->bitsPerPixel == 32) || (pScrn->bitsPerPixel == 16))) + { + infoPtr->SetupForCPUToScreenAlphaTexture = + MGASetupForCPUToScreenAlphaTexture; + infoPtr->SubsequentCPUToScreenAlphaTexture = + MGASubsequentCPUToScreenTexture; + infoPtr->CPUToScreenAlphaTextureFlags = XAA_RENDER_NO_TILE | + XAA_RENDER_NO_SRC_ALPHA; + infoPtr->CPUToScreenAlphaTextureFormats = MGAAlphaTextureFormats; + + infoPtr->SetupForCPUToScreenTexture = MGASetupForCPUToScreenTexture; + infoPtr->SubsequentCPUToScreenTexture = MGASubsequentCPUToScreenTexture; + infoPtr->CPUToScreenTextureFlags = XAA_RENDER_NO_TILE; + infoPtr->CPUToScreenTextureFormats = MGATextureFormats; + } +#endif + return(XAAInit(pScreen, infoPtr)); } @@ -528,7 +860,8 @@ MGAStormEngineInit(ScrnInfoPtr pScrn) CHECK_DMA_QUIESCENT(pMga, pScrn); - if (pMga->Chipset == PCI_CHIP_MGAG100) + if ((pMga->Chipset == PCI_CHIP_MGAG100) + || (pMga->Chipset == PCI_CHIP_MGAG100_PCI)) maccess = 1 << 14; switch( pLayout->bitsPerPixel ) @@ -570,7 +903,8 @@ MGAStormEngineInit(ScrnInfoPtr pScrn) OUTREG(MGAREG_MACCESS, maccess); pMga->MAccess = maccess; pMga->PlaneMask = ~0; - if(pMga->Chipset != PCI_CHIP_MGAG100) + if((pMga->Chipset != PCI_CHIP_MGAG100) + && (pMga->Chipset != PCI_CHIP_MGAG100_PCI)) OUTREG(MGAREG_PLNWT, pMga->PlaneMask); pMga->FgColor = 0; OUTREG(MGAREG_FCOL, pMga->FgColor); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_video.c b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_video.c index 1bb193516..59a4da867 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_video.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_video.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_video.c,v 1.17 2000/09/08 02:22:00 mvojkovi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_video.c,v 1.18 2000/10/24 22:45:07 dawes Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -79,7 +79,7 @@ void MGAInitVideo(ScreenPtr pScreen) (pMga->Chipset == PCI_CHIP_MGAG400))) { - if((pMga->Overlay8Plus24 /* || dualhead */ || pMga->TexturedVideo) && + if((pMga->Overlay8Plus24 || pMga->TexturedVideo) && (pScrn->bitsPerPixel != 24)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using texture video\n"); @@ -91,9 +91,8 @@ void MGAInitVideo(ScreenPtr pScreen) pMga->TexturedVideo = FALSE; } - if(!pMga->Overlay8Plus24 /* && !dualhead */) + if(!pMga->Overlay8Plus24) MGAInitOffscreenImages(pScreen); - } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_warp.c b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_warp.c index 50b9871b3..066d20991 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_warp.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_warp.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_warp.c,v 1.3 2000/06/17 18:23:23 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_warp.c,v 1.4 2000/09/26 15:57:12 tsi Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -108,7 +108,7 @@ static unsigned int mgaG400InstallMicrocode(MGAPtr pMGA, int agp_offset) MGADRIServerPrivatePtr pMGADRIServer = pMGA->DRIServerInfo; CARD8 *vcbase = pMGADRIServer->agp_map + agp_offset; - CARD32 pcbase = (CARD32)pMGADRIServer->agpBase + agp_offset; + unsigned long pcbase = (unsigned long)pMGADRIServer->agpBase + agp_offset; unsigned int microcode_size = 0; memset(pMGADRIServer->WarpIndex, 0, @@ -150,7 +150,7 @@ static unsigned int mgaG200InstallMicrocode(MGAPtr pMGA, int agp_offset) MGADRIServerPrivatePtr pMGADRIServer = pMGA->DRIServerInfo; CARD8 *vcbase = pMGADRIServer->agp_map + agp_offset; - CARD32 pcbase = (CARD32)pMGADRIServer->agpBase + agp_offset; + unsigned long pcbase = (unsigned long)pMGADRIServer->agpBase + agp_offset; unsigned int microcode_size = 0; memset(pMGADRIServer->WarpIndex, 0, diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_wrap.c b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_wrap.c index 553d14489..4a5b7ef5f 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_wrap.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_wrap.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_wrap.c,v 1.1 2000/06/17 00:03:20 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_wrap.c,v 1.2 2000/09/24 13:51:28 alanh Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. diff --git a/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_dga.c b/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_dga.c index da4f97e89..6124f86c2 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_dga.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_dga.c @@ -21,7 +21,7 @@ * * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk> */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_dga.c,v 1.1 2000/06/22 18:09:37 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_dga.c,v 1.3 2000/10/17 21:36:15 mvojkovi Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -33,6 +33,7 @@ #include "neo.h" #include "neo_reg.h" #include "dgaproc.h" +#include "vgaHW.h" static Bool NEO_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **, int *, int *, int *); @@ -70,20 +71,18 @@ NEODGAInit(ScreenPtr pScreen) DGAModePtr modes = NULL, newmodes = NULL, currentMode; DisplayModePtr pMode, firstMode; int Bpp = pScrn->bitsPerPixel >> 3; - int num = 0; - Bool oneMore; + int num = 0, imlines, pixlines; + + imlines = (pScrn->videoRam * 1024) / + (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3)); + + pixlines = (imlines > 1024) ? 1024 : imlines; pMode = firstMode = pScrn->modes; while(pMode) { - if(0 /*pScrn->displayWidth != pMode->HDisplay*/) { - newmodes = xrealloc(modes, (num + 2) * sizeof(DGAModeRec)); - oneMore = TRUE; - } else { - newmodes = xrealloc(modes, (num + 1) * sizeof(DGAModeRec)); - oneMore = FALSE; - } + newmodes = xrealloc(modes, (num + 1) * sizeof(DGAModeRec)); if(!newmodes) { xfree(modes); @@ -91,8 +90,6 @@ NEODGAInit(ScreenPtr pScreen) } modes = newmodes; -SECOND_PASS: - currentMode = modes + num; num++; @@ -118,32 +115,16 @@ SECOND_PASS: currentMode->offset = 0; currentMode->address = pNEO->NeoFbBase; - if(oneMore) { /* first one is narrow width */ - currentMode->bytesPerScanline = ((pMode->HDisplay * Bpp) + 3) & ~3L; - currentMode->imageWidth = pMode->HDisplay; - currentMode->imageHeight = pMode->VDisplay; - currentMode->pixmapWidth = currentMode->imageWidth; - currentMode->pixmapHeight = currentMode->imageHeight; - currentMode->maxViewportX = currentMode->imageWidth - - currentMode->viewportWidth; - /* this might need to get clamped to some maximum */ - currentMode->maxViewportY = currentMode->imageHeight - - currentMode->viewportHeight; - oneMore = FALSE; - goto SECOND_PASS; - } else { - currentMode->bytesPerScanline = + currentMode->bytesPerScanline = ((pScrn->displayWidth * Bpp) + 3) & ~3L; - currentMode->imageWidth = pScrn->displayWidth; - currentMode->imageHeight = pMode->VDisplay; - currentMode->pixmapWidth = currentMode->imageWidth; - currentMode->pixmapHeight = currentMode->imageHeight; - currentMode->maxViewportX = currentMode->imageWidth - + currentMode->imageWidth = pScrn->displayWidth; + currentMode->imageHeight = imlines; + currentMode->pixmapWidth = currentMode->imageWidth; + currentMode->pixmapHeight = pixlines; + currentMode->maxViewportX = currentMode->imageWidth - currentMode->viewportWidth; - /* this might need to get clamped to some maximum */ - currentMode->maxViewportY = currentMode->imageHeight - + currentMode->maxViewportY = currentMode->imageHeight - currentMode->viewportHeight; - } pMode = pMode->next; if(pMode == firstMode) @@ -156,33 +137,29 @@ SECOND_PASS: return DGAInit(pScreen, &NEODGAFuncs, modes, num); } +static DisplayModePtr NEOSavedDGAModes[MAXSCREENS]; static Bool NEO_SetMode( ScrnInfoPtr pScrn, DGAModePtr pMode ){ - static int OldDisplayWidth[MAXSCREENS]; int index = pScrn->pScreen->myNum; NEOPtr pNEO = NEOPTR(pScrn); if(!pMode) { /* restore the original mode */ - /* put the ScreenParameters back */ - - pScrn->displayWidth = OldDisplayWidth[index]; - - NEOSwitchMode(index, pScrn->currentMode, 0); - pNEO->DGAactive = FALSE; + if(pNEO->DGAactive) { + pScrn->currentMode = NEOSavedDGAModes[index]; + NEOSwitchMode(index, pScrn->currentMode, 0); + NEOAdjustFrame(index, 0, 0, 0); + pNEO->DGAactive = FALSE; + } } else { if(!pNEO->DGAactive) { /* save the old parameters */ - OldDisplayWidth[index] = pScrn->displayWidth; - + NEOSavedDGAModes[index] = pScrn->currentMode; pNEO->DGAactive = TRUE; } - pScrn->displayWidth = pMode->bytesPerScanline / - (pMode->bitsPerPixel >> 3); - NEOSwitchMode(index, pMode->mode, 0); } @@ -205,9 +182,14 @@ NEO_SetViewport( int flags ){ NEOPtr pNEO = NEOPTR(pScrn); + vgaHWPtr hwp = VGAHWPTR(pScrn); NEOAdjustFrame(pScrn->pScreen->myNum, x, y, flags); - pNEO->DGAViewportStatus = 0; /* NEOAdjustFrame loops until finished */ + /* wait for retrace */ + while((hwp->readST01(hwp) & 0x08)); + while(!(hwp->readST01(hwp) & 0x08)); + + pNEO->DGAViewportStatus = 0; } static void diff --git a/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neomagic.cpp b/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neomagic.cpp index fb78c1238..0b8914545 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neomagic.cpp +++ b/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neomagic.cpp @@ -1,9 +1,9 @@ -.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/neomagic/neomagic.cpp,v 1.4 2000/06/14 02:13:12 dawes Exp $ +.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/neomagic/neomagic.cpp,v 1.5 2000/09/25 23:57:11 mvojkovi Exp $ .\" shorthand for double quote that works everywhere. .ds q \N'34' .TH NEOMAGIC __drivermansuffix__ "Version 4.0.1" "XFree86" .SH NAME -neomagic \- NeoMagic video driver +neomagic \- Neomagic video driver .SH SYNOPSIS .nf .B "Section \*qDevice\*q" @@ -14,17 +14,69 @@ neomagic \- NeoMagic video driver .fi .SH DESCRIPTION .B neomagic -is an XFree86 driver for NeoMagic video chips. -THIS MAN PAGE NEEDS TO BE FILLED IN. +is an XFree86 driver for the Neomagic graphics chipsets found in many +laptop computers. .SH SUPPORTED HARDWARE -The .B neomagic -driver supports... +supports the following chipsets: +.PP +.TP +MagicGraph 128 (NM2070) +.TP +MagicGraph 128V (NM2090) +.TP +MagicGraph 128ZV (NM2093) +.TP +MagicGraph 128ZV+ (NM2097) +.TP +MagicGraph 128XD (NM2160) +.TP +MagicGraph 256AV (NM2200) +.TP +MagicGraph 256AV+ (NM2230) +.TP +MagicGraph 256ZX (NM2360) +.TP +MagicGraph 256XL+ (NM2380) +.PP +The driver supports depths 8, 15, 16 and 24 for all chipsets except the +NM2070 which does not support depth 24. All depths are accelerated except for +depth 24 which is only accelerated on NM2200 +and newer models. All visuals are supported in depth 8. TrueColor and +DirectColor visuals are supported in the other depths. + .SH CONFIGURATION DETAILS Please refer to XF86Config(__filemansuffix__) for general configuration details. This section only covers configuration details specific to this driver. +.PP +The following driver +.B Options +are supported +.TP +.BI "Option \*qNoAccel\*q \*q" boolean \*q +Disable or enable acceleration. Default: acceleration is enabled. +.TP +.BI "Option \*qSWCursor\*q \*q" boolean \*q +Disable or enable software cursor. Default: software cursor is disable +and a hardware cursor is used. +.TP +.BI "Option \*qPCIBurst\*q \*q" boolean \*q +Disable or enable PCI burst modes. Default: enabled. +.TP +.BI "Option \*qRotate\*q \*qCW\*q" +.TP +.BI "Option \*qRotate\*q \*qCCW\*q" +Rotate the display clockwise or counterclockwise. This mode is unaccelerated. +Default: no rotation. +.TP +.BI "Option \*qShadowFB\*q \*q" boolean \*q +Enable or disable use of the shadow framebuffer layer. See +shadowfb(__drivermansuffix__) for further information. Default: off. +.TP + .SH "SEE ALSO" XFree86(1), XF86Config(__filemansuffix__), xf86config(1), Xserver(1), X(__miscmansuffix__) .SH AUTHORS -Authors include: ... +Authors include: Jens Owen, Kevin E. Martin, and also Egbert Eich, +Mark Vojkovich, Alan Hourihane. diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/Imakefile b/xc/programs/Xserver/hw/xfree86/drivers/r128/Imakefile index 23fa7504d..c13d95034 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/r128/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/Imakefile @@ -1,21 +1,35 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/Imakefile,v 1.9 2000/09/20 00:09:26 keithp Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/Imakefile,v 1.11 2000/10/18 17:19:58 alanh Exp $ +XCOMM +XCOMM This is the Imakefile for the ATI Rage 128 (r128) and +XCOMM the ATI Radeon (radeon) driver. XCOMM -XCOMM This is the Imakefile for the ATI Rage 128 (r128) driver. -XCOMM #define IHaveModules #include <Server.tmpl> #if BuildXF86DRI -DRISRCS = r128_dri.c -DRIOBJS = r128_dri.o -DRIINCLUDES = -I$(SERVERSRC)/GL/dri -I$(LIBSRC)/GL/dri -I$(TOP)/include -DRIDEFINES = $(GLX_DEFINES) +R128DRISRCS = r128_dri.c +R128DRIOBJS = r128_dri.o + +DRISRCS = $(R128DRISRCS) +DRIOBJS = $(R128DRIOBJS) +DRIINCLUDES = -I$(SERVERSRC)/GL/dri -I$(LIBSRC)/GL/dri -I$(TOP)/include +DRIDEFINES = $(GLX_DEFINES) #endif -SRCS = r128_driver.c r128_cursor.c r128_accel.c r128_dga.c $(DRISRCS) # r128_i2c.c +PROBESRCS = ati2_probe.c +PROBEOBJS = ati2_probe.o + +R128SRCS = r128_driver.c r128_cursor.c r128_accel.c r128_dga.c r128_video.c +R128OBJS = r128_driver.o r128_cursor.o r128_accel.o r128_dga.o r128_video.o + +RADEONSRCS = radeon_driver.c radeon_cursor.c radeon_accel.c radeon_dga.c \ + radeon_video.c +RADEONOBJS = radeon_driver.o radeon_cursor.o radeon_accel.o radeon_dga.o \ + radeon_video.o -OBJS = r128_driver.o r128_cursor.o r128_accel.o r128_dga.o $(DRIOBJS) # r128_i2c.o +SRCS = $(PROBESRCS) $(R128SRCS) $(RADEONSRCS) $(DRISRCS) +OBJS = $(PROBEOBJS) $(R128OBJS) $(RADEONOBJS) $(DRIOBJS) #if defined(XF86DriverSDK) INCLUDES = -I. -I../../include @@ -39,12 +53,37 @@ DEFINES = $(DRIDEFINES) SubdirLibraryRule($(OBJS)) #endif +#ifndef InstallLinkedDynamicModule +#define InstallLinkedDynamicModule(module,linkname,dest,subdir) @@\ +linkname: module @@\ + @@\ +AllTarget(linkname) @@\ + LinkBuildNamedModule(module,linkname,subdir) @@\ + @@\ +install:: linkname @@\ + MakeDir($(DESTDIR)dest/subdir) @@\ + RemoveFile($(DESTDIR)dest/subdir/linkname) @@\ + $(LN) module $(DESTDIR)dest/subdir/linkname +#endif + +#ifndef InstallLinkedObjectModule +#if !DoLoadableServer +#define InstallLinkedObjectModule(module,linkname,dest,subdir) /**/ +#else +#define InstallLinkedObjectModule(module,linkname,dest,subdir) @@\ +InstallLinkedDynamicModule(Concat(module,_drv.o),Concat(linkname,_drv.o),dest,subdir) +#endif +#endif + ModuleObjectRule() ObjectModuleTarget(r128,$(OBJS)) InstallObjectModule(r128,$(MODULEDIR),drivers) +InstallLinkedObjectModule(r128,ati2,$(MODULEDIR),drivers) +InstallLinkedObjectModule(r128,radeon,$(MODULEDIR),drivers) + #if !defined(XF86DriverSDK) CppManTarget(r128,) InstallModuleManPage(r128) @@ -53,6 +92,9 @@ InstallModuleManPage(r128) DependTarget() InstallDriverSDKNonExecFile(Imakefile,$(DRIVERSDKDIR)/drivers/r128) + +InstallDriverSDKNonExecFile(ati_probe.c,$(DRIVERSDKDIR)/drivers/r128) + InstallDriverSDKNonExecFile(r128.h,$(DRIVERSDKDIR)/drivers/r128) InstallDriverSDKNonExecFile(r128_accel.c,$(DRIVERSDKDIR)/drivers/r128) InstallDriverSDKNonExecFile(r128_cursor.c,$(DRIVERSDKDIR)/drivers/r128) @@ -65,5 +107,11 @@ InstallDriverSDKNonExecFile(r128_dri.h,$(DRIVERSDKDIR)/drivers/r128) InstallDriverSDKNonExecFile(r128_dripriv.h,$(DRIVERSDKDIR)/drivers/r128) InstallDriverSDKNonExecFile(r128_sarea.h,$(DRIVERSDKDIR)/drivers/r128) -InstallDriverSDKObjectModule(r128,$(DRIVERSDKMODULEDIR),drivers) +InstallDriverSDKNonExecFile(radeon.h,$(DRIVERSDKDIR)/drivers/r128) +InstallDriverSDKNonExecFile(radeon_accel.c,$(DRIVERSDKDIR)/drivers/r128) +InstallDriverSDKNonExecFile(radeon_cursor.c,$(DRIVERSDKDIR)/drivers/r128) +InstallDriverSDKNonExecFile(radeon_driver.c,$(DRIVERSDKDIR)/drivers/r128) +InstallDriverSDKNonExecFile(radeon_dga.c,$(DRIVERSDKDIR)/drivers/r128) +InstallDriverSDKNonExecFile(radeon_reg.h,$(DRIVERSDKDIR)/drivers/r128) +InstallDriverSDKObjectModule(r128,$(DRIVERSDKMODULEDIR),drivers) diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/ati2.h b/xc/programs/Xserver/hw/xfree86/drivers/r128/ati2.h new file mode 100644 index 000000000..e3eefb89d --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/ati2.h @@ -0,0 +1,49 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/ati2.h,v 1.2 2000/10/23 21:16:48 tsi Exp $ */ +/************************************************************************** + +Copyright 2000 ATI Technologies Inc. and VA Linux Systems, Inc., + Sunnyvale, California. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +on the rights to use, copy, modify, merge, publish, distribute, sub +license, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin <martin@valinux.com> + * + */ + +#ifndef _ATI2_H_ +#define _ATI2_H_ + + /* ATI2_NAME is used for the server-side + ddx driver, the client-side DRI driver, + and the kernel-level DRM driver. */ +#define ATI2_NAME "ati2" +#define ATI2_VERSION_MAJOR 4 +#define ATI2_VERSION_MINOR 0 +#define ATI2_VERSION_PATCH 0 +#define ATI2_VERSION ((ATI2_VERSION_MAJOR << 16) \ + | (ATI2_VERSION_MINOR << 8) \ + | ATI2_VERSION_PATCH) + +#endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/ati2_probe.c b/xc/programs/Xserver/hw/xfree86/drivers/r128/ati2_probe.c new file mode 100644 index 000000000..e52c1bdae --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/ati2_probe.c @@ -0,0 +1,313 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/ati2_probe.c,v 1.2 2000/10/23 12:10:14 alanh Exp $ */ +/************************************************************************** + +Copyright 2000 ATI Technologies Inc. and VA Linux Systems, Inc., + Sunnyvale, California. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +on the rights to use, copy, modify, merge, publish, distribute, sub +license, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin <martin@valinux.com> + * + */ + + +/* + * To add a new driver (e.g., zzzzz) to the r128 directory: + * + * 1. Add a new XF86ModuleData line for the new driver: + * XF86ModuleData zzzzzModuleData = { &ATI2VersRec, ATI2Setup, 0 }; + * + * 2. Add a new driver AvailableOptions function call to + * ATI2AvailableOptions: + * if (!opts) opts = ZZZZZAvailableOptions(chipid, busid); + * + * 3. Add a new driver Identify function call to ATI2Identify: + * ZZZZZIdentify(flags); + * + * 4. Add a new driver Probe function call ATI2Probe: + * foundScreen |= ZZZZZProbe(drv, flags); + * + * 5. Add any symbols that are needed in your driver as an argument to + * the call to LoaderRefSymbLists() in ATI2Setup. + * + * Note: see r128_driver.c for examples of how to write the following + * functions: + * OptionInfoPtr ZZZZZAvailableOptions(int chipid, int busid); + * void ZZZZZIdentify(int flags); + * Bool ZZZZZProbe(DriverPtr drv, int flags); */ + + + /* X and server generic header files */ +#include "xf86.h" + + /* Driver data structures */ +#include "ati2.h" +#include "r128_probe.h" +#include "radeon_probe.h" + + /* Forward definitions for driver functions */ +static OptionInfoPtr ATI2AvailableOptions(int chipid, int busid); +static Bool ATI2Probe(DriverPtr drv, int flags); +static void ATI2Identify(int flags); + + /* Define driver */ +/* NOTE: This structure must be named R128 since the directory's name is + r128 so that the static X server can find the driver. */ +DriverRec R128 = { + ATI2_VERSION, + "ATI Rage 128 and Radeon", + ATI2Identify, + ATI2Probe, + ATI2AvailableOptions, + NULL +}; + +const char *vgahwSymbols[] = { + "vgaHWGetHWRec", + "vgaHWFreeHWRec", + "vgaHWLock", + "vgaHWUnlock", + "vgaHWSave", + "vgaHWRestore", + NULL +}; + +const char *fbdevHWSymbols[] = { + "fbdevHWInit", + "fbdevHWUseBuildinMode", + + "fbdevHWGetDepth", + "fbdevHWGetVidmem", + + /* colormap */ + "fbdevHWLoadPalette", + + /* ScrnInfo hooks */ + "fbdevHWSwitchMode", + "fbdevHWAdjustFrame", + "fbdevHWEnterVT", + "fbdevHWLeaveVT", + "fbdevHWValidMode", + "fbdevHWRestore", + "fbdevHWModeInit", + "fbdevHWSave", + + "fbdevHWUnmapMMIO", + "fbdevHWUnmapVidmem", + "fbdevHWMapMMIO", + "fbdevHWMapVidmem", + + NULL +}; + +const char *ddcSymbols[] = { + "xf86PrintEDID", + "xf86DoEDID_DDC1", + "xf86DoEDID_DDC2", + NULL +}; + +#ifdef XFree86LOADER +#ifdef USE_FB +static const char *fbSymbols[] = { + "fbScreenInit", + NULL +}; +#else +static const char *cfbSymbols[] = { + "cfbScreenInit", + "cfb16ScreenInit", + "cfb24ScreenInit", + "cfb32ScreenInit", + "cfb24_32ScreenInit", + NULL +}; +#endif + +static const char *xaaSymbols[] = { + "XAADestroyInfoRec", + "XAACreateInfoRec", + "XAAInit", + "XAAStippleScanlineFuncLSBFirst", + "XAAOverlayFBfuncs", + "XAACachePlanarMonoStipple", + "XAAScreenIndex", + NULL +}; + +static const char *xf8_32bppSymbols[] = { + "xf86Overlay8Plus32Init", + NULL +}; + +static const char *ramdacSymbols[] = { + "xf86InitCursor", + "xf86CreateCursorInfoRec", + "xf86DestroyCursorInfoRec", + NULL +}; + +#ifdef XF86DRI +static const char *drmSymbols[] = { + "drmAddBufs", + "drmAddMap", + "drmAvailable", + "drmCtlAddCommand", + "drmCtlInstHandler", + "drmGetInterruptFromBusID", + "drmMapBufs", + "drmMarkBufs", + "drmUnmapBufs", + "drmFreeVersion", + "drmGetVersion", + NULL +}; + +static const char *driSymbols[] = { + "DRIGetDrawableIndex", + "DRIFinishScreenInit", + "DRIDestroyInfoRec", + "DRICloseScreen", + "DRIDestroyInfoRec", + "DRIScreenInit", + "DRIDestroyInfoRec", + "DRICreateInfoRec", + "DRILock", + "DRIUnlock", + "DRIGetSAREAPrivate", + "DRIGetContext", + "DRIQueryVersion", + "GlxSetVisualConfigs", + NULL +}; +#endif + +static const char *vbeSymbols[] = { + "VBEInit", + "vbeDoEDID", + NULL +}; + +static MODULESETUPPROTO(ATI2Setup); + +static XF86ModuleVersionInfo ATI2VersRec = +{ + ATI2_NAME, + MODULEVENDORSTRING, + MODINFOSTRING1, + MODINFOSTRING2, + XF86_VERSION_CURRENT, + ATI2_VERSION_MAJOR, ATI2_VERSION_MINOR, ATI2_VERSION_PATCH, + ABI_CLASS_VIDEODRV, + ABI_VIDEODRV_VERSION, + MOD_CLASS_VIDEODRV, + { 0, 0, 0, 0 } +}; + +XF86ModuleData ati2ModuleData = { &ATI2VersRec, ATI2Setup, 0 }; +XF86ModuleData r128ModuleData = { &ATI2VersRec, ATI2Setup, 0 }; +XF86ModuleData radeonModuleData = { &ATI2VersRec, ATI2Setup, 0 }; + +static pointer ATI2Setup(pointer module, pointer opts, int *errmaj, + int *errmin) +{ + static Bool setupDone = FALSE; + + /* This module should be loaded only once, but check to be sure. */ + + if (!setupDone) { + setupDone = TRUE; + xf86AddDriver(&R128, module, 0); + + /* + * Modules that this driver always requires may be loaded here + * by calling LoadSubModule(). + */ + /* FIXME: add DRI support here */ + + /* + * Tell the loader about symbols from other modules that this + * module might refer to. + */ + LoaderRefSymLists(vgahwSymbols, +#ifdef USE_FB + fbSymbols, +#else + cfbSymbols, +#endif + xaaSymbols, + xf8_32bppSymbols, + ramdacSymbols, +#ifdef XF86DRI + drmSymbols, + driSymbols, +#endif + fbdevHWSymbols, + vbeSymbols, + /* ddcsymbols, */ + /* i2csymbols, */ + /* shadowSymbols, */ + NULL); + + /* + * The return value must be non-NULL on success even though there + * is no TearDownProc. + */ + return (pointer)1; + } else { + if (errmaj) *errmaj = LDR_ONCEONLY; + return NULL; + } +} +#endif + +/* Return the options for supported chipset 'n'; NULL otherwise. */ +static OptionInfoPtr ATI2AvailableOptions(int chipid, int busid) +{ + OptionInfoPtr opts = NULL; + + opts = R128AvailableOptions(chipid, busid); + if (!opts) opts = RADEONAvailableOptions(chipid, busid); + + return opts; +} + +/* Return the string name for supported chipset 'n'; NULL otherwise. */ +static void ATI2Identify(int flags) +{ + R128Identify(flags); + RADEONIdentify(flags); +} + +/* Return TRUE if chipset is present; FALSE otherwise. */ +static Bool ATI2Probe(DriverPtr drv, int flags) +{ + Bool foundScreen = FALSE; + + foundScreen |= R128Probe(drv, flags); + foundScreen |= RADEONProbe(drv, flags); + + return foundScreen; +} diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128.h b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128.h index 29895d14d..8e60e2ae4 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128.h,v 1.12 2000/09/13 15:47:32 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128.h,v 1.15 2000/10/18 17:19:59 alanh Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., @@ -36,6 +36,50 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef _R128_H_ #define _R128_H_ + /* Xv support */ +#include "xf86xv.h" +#include "Xv.h" + + /* vgahw module (for VC save/restore only) */ +#include "vgaHW.h" + +#include "fbdevhw.h" + + /* XAA and Cursor Support */ +#include "xaa.h" +#include "xaalocal.h" +#include "xf86Cursor.h" + + + /* PCI support */ +#include "xf86PciInfo.h" +#include "xf86Pci.h" + + /* DDC support */ +#include "xf86DDC.h" + + /* VESA support */ +#include "vbe.h" + + /* DRI support */ +#ifdef XF86DRI +#include "GL/glxint.h" +#include "GL/glxtokens.h" +#include "xf86drm.h" +#include "xf86drmR128.h" +#include "sarea.h" +#define _XF86DRI_SERVER_ +#include "xf86dri.h" +#include "dri.h" +#include "r128_dri.h" +#include "r128_dripriv.h" +#include "r128_sarea.h" +#endif + +#ifdef RENDER +#include "picturestr.h" +#endif + #define R128_DEBUG 0 /* Turn off debugging output */ #define R128_TIMEOUT 2000000 /* Fall out of wait loops after this count */ #define R128_MMIOSIZE 0x80000 @@ -46,12 +90,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. ddx driver, the client-side DRI driver, and the kernel-level DRM driver. */ #define R128_NAME "r128" -#define R128_VERSION_MAJOR 3 -#define R128_VERSION_MINOR 1 -#define R128_VERSION_PATCH 1 -#define R128_VERSION ((R128_VERSION_MAJOR << 16) \ - | (R128_VERSION_MINOR << 8) \ - | R128_VERSION_PATCH) #if R128_DEBUG #define R128TRACE(x) \ @@ -210,7 +248,6 @@ typedef struct { Bool PaletteSavedOnVT; /* Palette saved on last VT switch */ - I2CBusPtr i2c; XAAInfoRecPtr accel; Bool accelOn; xf86CursorInfoPtr cursor; @@ -325,6 +362,7 @@ typedef struct { int textureSize; int log2TexGran; #endif + XF86VideoAdaptorPtr adaptor; } R128InfoRec, *R128InfoPtr; #define R128WaitForFifo(pScrn, entries) \ @@ -338,7 +376,7 @@ extern void R128WaitForIdle(ScrnInfoPtr pScrn); extern void R128EngineReset(ScrnInfoPtr pScrn); extern void R128EngineFlush(ScrnInfoPtr pScrn); -extern int INPLL(ScrnInfoPtr pScrn, int addr); +extern int R128INPLL(ScrnInfoPtr pScrn, int addr); extern void R128WaitForVerticalSync(ScrnInfoPtr pScrn); extern void R128AdjustFrame(int scrnIndex, int x, int y, int flags); extern Bool R128SwitchMode(int ScrnIndex, DisplayModePtr mode, int flags); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_accel.c index 0729e13a5..26ce9f163 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_accel.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_accel.c,v 1.14 2000/08/24 22:20:17 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_accel.c,v 1.16 2000/10/18 17:19:59 alanh Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., @@ -30,6 +30,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. * Authors: * Rickard E. Faith <faith@precisioninsight.com> * Kevin E. Martin <kevin@precisioninsight.com> + * Alan Hourihane <ahourihane@valinux.com> * * Credits: * @@ -48,6 +49,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. * * Notes on unimplemented XAA optimizations: * + * SetClipping: The Rage128 doesn't support the full 16bit registers needed + * for XAA clip rect support. * SolidFillTrap: This will probably work if we can compute the correct * Bresenham error values. * TwoPointLine: The Rage 128 supports Bresenham lines instead. @@ -61,17 +64,18 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. * direct/indirect method. If we had more data registers, * then we could do better. If XAA supported a trigger write * address, the code would be simpler. + * (Alan Hourihane) Update. We now use purely indirect and clip the full + * rectangle. Seems as the direct method has some problems + * with this, although this indirect method is much faster + * than the old method of setting up the engine per scanline. + * This code was the basis of the Radeon work we did. * Color8x8PatternFill: Apparently, an 8x8 color brush cannot take an 8x8 * pattern from frame buffer memory. - * ImageWrites: The direct method isn't supported because XAA does not - * support a final trigger register write. The indirect - * method slows down common operations. Perhaps additional - * XAA flags to use this only for some operations would help. + * ImageWrites: See CPUToScreenColorExpandFill. * */ -#define R128_CLIPPING 1 -#define R128_IMAGEWRITE 0 /* Indirect image write is slow */ +#define R128_IMAGEWRITE 0 /* Disable ImageWrites - faster in software */ #define R128_TRAPEZOIDS 0 /* Trapezoids don't work */ /* X and server generic header files */ @@ -88,26 +92,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "xaa.h" #include "xf86Cursor.h" - /* PCI support */ -#include "xf86PciInfo.h" -#include "xf86Pci.h" - - /* DDC support */ -#include "xf86DDC.h" - - /* DRI support */ -#ifdef XF86DRI -#include "GL/glxint.h" -#include "xf86drm.h" -#include "sarea.h" -#define _XF86DRI_SERVER_ -#include "xf86dri.h" -#include "dri.h" -#include "r128_dri.h" -#include "r128_dripriv.h" -#include "r128_sarea.h" -#endif - /* Driver data structures */ #include "r128.h" #include "r128_reg.h" @@ -137,25 +121,24 @@ static struct { /* Flush all dirty data in the Pixel Cache to memory. */ void R128EngineFlush(ScrnInfoPtr pScrn) { - int i; - unsigned int j; - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int i; OUTREGP(R128_PC_NGUI_CTLSTAT, R128_PC_FLUSH_ALL, ~R128_PC_FLUSH_ALL); for (i = 0; i < R128_TIMEOUT; i++) { - if (!((j=INREG(R128_PC_NGUI_CTLSTAT)) & R128_PC_BUSY)) break; + if (!(INREG(R128_PC_NGUI_CTLSTAT) & R128_PC_BUSY)) break; } } /* Reset graphics card to known state. */ void R128EngineReset(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); - CARD32 clock_cntl_index; - CARD32 mclk_cntl; - CARD32 gen_reset_cntl; - unsigned int j; - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + CARD32 clock_cntl_index; + CARD32 mclk_cntl; + CARD32 gen_reset_cntl; R128EngineFlush(pScrn); @@ -167,9 +150,9 @@ void R128EngineReset(ScrnInfoPtr pScrn) gen_reset_cntl = INREG(R128_GEN_RESET_CNTL); OUTREG(R128_GEN_RESET_CNTL, gen_reset_cntl | R128_SOFT_RESET_GUI); - j = INREG(R128_GEN_RESET_CNTL); + INREG(R128_GEN_RESET_CNTL); OUTREG(R128_GEN_RESET_CNTL, gen_reset_cntl & ~R128_SOFT_RESET_GUI); - j = INREG(R128_GEN_RESET_CNTL); + INREG(R128_GEN_RESET_CNTL); OUTPLL(R128_MCLK_CNTL, mclk_cntl); OUTREG(R128_CLOCK_CNTL_INDEX, clock_cntl_index); @@ -184,20 +167,18 @@ void R128EngineReset(ScrnInfoPtr pScrn) these slots are empty. */ void R128WaitForFifoFunction(ScrnInfoPtr pScrn, int entries) { - R128InfoPtr info = R128PTR(pScrn); - int i; - unsigned int j; - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int i; for (;;) { for (i = 0; i < R128_TIMEOUT; i++) { - j = INREG(R128_GUI_STAT); - info->fifo_slots = j & R128_GUI_FIFOCNT_MASK; + info->fifo_slots = INREG(R128_GUI_STAT) & R128_GUI_FIFOCNT_MASK; if (info->fifo_slots >= entries) return; } R128TRACE(("FIFO timed out: %d entries, stat=0x%08x, probe=0x%08x\n", - j & R128_GUI_FIFOCNT_MASK, - j, + INREG(R128_GUI_STAT) & R128_GUI_FIFOCNT_MASK, + INREG(R128_GUI_STAT), INREG(R128_GUI_PROBE))); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "FIFO timed out, resetting engine...\n"); @@ -213,24 +194,22 @@ void R128WaitForFifoFunction(ScrnInfoPtr pScrn, int entries) standard "sync" function that will make the hardware "quiescent". */ void R128WaitForIdle(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); - int i; - unsigned int j; - R128MMIO_VARS(); - + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int i; R128WaitForFifoFunction(pScrn, 64); for (;;) { for (i = 0; i < R128_TIMEOUT; i++) { - if (!((j=INREG(R128_GUI_STAT)) & R128_GUI_ACTIVE)) { + if (!(INREG(R128_GUI_STAT) & R128_GUI_ACTIVE)) { R128EngineFlush(pScrn); return; } } R128TRACE(("Idle timed out: %d entries, stat=0x%08x, probe=0x%08x\n", - j & R128_GUI_FIFOCNT_MASK, - j, + INREG(R128_GUI_STAT) & R128_GUI_FIFOCNT_MASK, + INREG(R128_GUI_STAT), INREG(R128_GUI_PROBE))); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Idle timed out, resetting engine...\n"); @@ -245,8 +224,8 @@ void R128WaitForIdle(ScrnInfoPtr pScrn) static void R128SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, unsigned int planemask) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; R128WaitForFifo(pScrn, 4); OUTREG(R128_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl @@ -266,8 +245,8 @@ static void R128SetupForSolidFill(ScrnInfoPtr pScrn, static void R128SubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; R128WaitForFifo(pScrn, 2); OUTREG(R128_DST_Y_X, (y << 16) | x); @@ -278,8 +257,8 @@ static void R128SubsequentSolidFillRect(ScrnInfoPtr pScrn, static void R128SetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, unsigned int planemask) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; R128WaitForFifo(pScrn, 3); OUTREG(R128_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl @@ -309,9 +288,9 @@ static void R128SubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, int major, int minor, int err, int len, int octant) { - R128InfoPtr info = R128PTR(pScrn); - int flags = 0; - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int flags = 0; if (octant & YMAJOR) flags |= R128_DST_Y_MAJOR; if (!(octant & XDECREASING)) flags |= R128_DST_X_DIR_LEFT_TO_RIGHT; @@ -336,8 +315,8 @@ static void R128SubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, static void R128SubsequentSolidHorVertLine(ScrnInfoPtr pScrn, int x, int y, int len, int dir ) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; R128WaitForFifo(pScrn, 1); OUTREG(R128_DP_CNTL, (R128_DST_X_LEFT_TO_RIGHT @@ -369,9 +348,9 @@ static void R128SetupForDashedLine(ScrnInfoPtr pScrn, int rop, unsigned int planemask, int length, unsigned char *pattern) { - R128InfoPtr info = R128PTR(pScrn); - CARD32 pat = *(CARD32 *)pattern; - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + CARD32 pat = *(CARD32 *)pattern; switch (length) { case 2: pat |= pat << 2; /* fall through */ @@ -400,9 +379,9 @@ static void R128SubsequentDashedBresenhamLine(ScrnInfoPtr pScrn, int err, int len, int octant, int phase) { - R128InfoPtr info = R128PTR(pScrn); - int flags = 0; - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int flags = 0; if (octant & YMAJOR) flags |= R128_DST_Y_MAJOR; if (!(octant & XDECREASING)) flags |= R128_DST_X_DIR_LEFT_TO_RIGHT; @@ -433,12 +412,13 @@ static void R128SubsequentSolidFillTrap(ScrnInfoPtr pScrn, int y, int h, int left, int dxL, int dyL, int eL, int right, int dxR, int dyR, int eR) { - int flags = 0; - int Lymajor = 0; - int Rymajor = 0; - int origdxL = dxL; - int origdxR = dxR; - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int flags = 0; + int Lymajor = 0; + int Rymajor = 0; + int origdxL = dxL; + int origdxR = dxR; R128TRACE(("Trap %d %d; L %d %d %d %d; R %d %d %d %d\n", y, h, @@ -478,52 +458,6 @@ static void R128SubsequentSolidFillTrap(ScrnInfoPtr pScrn, int y, int h, } #endif -#if R128_CLIPPING -/* Setup for XAA clipping rectangle. - - Tests: xtest CH06/drwrctngl - - These x11perf data show why we don't use clipping for lines. Clipping - can improve performance for other functions. - - 1024x768@76 8bpp - Without With - x11perf -seg100c1 241000.0/sec 185000.0/sec - x11perf -seg100c2 238000.0/sec 154000.0/sec - x11perf -seg100c3 194000.0/sec 132000.0/sec - -*/ -static void R128SetClippingRectangle(ScrnInfoPtr pScrn, - int left, int top, int right, int bottom) -{ - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); - - if (left > 8191 || top > 8191 || right > 8191 || bottom > 8191 - || left < 0 || top < 0 || right < 0 || bottom < 0 - || left > 4000 || right > 4000 || top > 4000 || bottom > 4000 - || left >= right || top >= bottom) - R128TRACE(("Clip %d %d %d %d *************************************\n", - left, top, right, bottom)); - - R128WaitForFifo(pScrn, 2); - OUTREG(R128_SC_TOP_LEFT, (top << 16) | left); - OUTREG(R128_SC_BOTTOM_RIGHT, (bottom << 16) | right); -} - -static void R128DisableClipping (ScrnInfoPtr pScrn) -{ - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); - - R128WaitForFifo(pScrn, 2); - OUTREG(R128_SC_TOP_LEFT, 0); - OUTREG(R128_SC_BOTTOM_RIGHT, (R128_DEFAULT_SC_RIGHT_MAX - | R128_DEFAULT_SC_BOTTOM_MAX)); -} -#endif - - /* Setup for XAA screen-to-screen copy. Tests: xtest CH06/fllrctngl (also tests transparency). @@ -533,8 +467,8 @@ static void R128SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, unsigned int planemask, int trans_color) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; info->xdir = xdir; info->ydir = ydir; @@ -566,8 +500,8 @@ static void R128SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x2, int y2, int w, int h) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; if (info->xdir < 0) x1 += w - 1, x2 += w - 1; if (info->ydir < 0) y1 += h - 1, y2 += h - 1; @@ -595,8 +529,8 @@ static void R128SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int fg, int bg, int rop, unsigned int planemask) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; R128WaitForFifo(pScrn, 6); OUTREG(R128_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl @@ -618,8 +552,8 @@ static void R128SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, int patternx, int patterny, int x, int y, int w, int h) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; R128WaitForFifo(pScrn, 3); OUTREG(R128_BRUSH_Y_X, (patterny << 8) | patternx); @@ -637,8 +571,8 @@ static void R128SetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int rop, unsigned int planemask, int trans_color) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; R128TRACE(("Color8x8 %d %d %d\n", trans_color, patx, paty)); @@ -665,7 +599,8 @@ static void R128SubsequentColor8x8PatternFillRect( ScrnInfoPtr pScrn, int patx, int paty, int x, int y, int w, int h) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; R128TRACE(("Color8x8 %d,%d %d,%d %d %d\n", patx, paty, x, y, w, h)); R128WaitForFifo(pScrn, 3); @@ -724,12 +659,13 @@ static void R128SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, unsigned int planemask) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; R128WaitForFifo(pScrn, 4); OUTREG(R128_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl - | R128_GMC_BRUSH_1X8_COLOR + | R128_GMC_DST_CLIPPING + | R128_GMC_BRUSH_NONE | (bg == -1 ? R128_GMC_SRC_DATATYPE_MONO_FG_LA : R128_GMC_SRC_DATATYPE_MONO_FG_BG) @@ -748,65 +684,74 @@ static void R128SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int w, int h, int skipleft) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int x1clip = x+skipleft; + int x2clip = x+w; - info->scanline_y = y; - info->scanline_x = x; info->scanline_h = h; - info->scanline_h_w = (1 << 16) | w; - info->scanline_words = (w + 31) / 32; - info->scanline_direct = 0; + info->scanline_words = (w + 31) >> 5; - if (info->scanline_words <= 9 && info->scanline_h > 1) { - /* Turn on direct for next set of scan lines */ +#if 0 + /* Seems as though the Rage128's doesn't like blitting directly + * as we must be overwriting something too quickly, therefore we + * render to the buffer first and then blit */ + if ((info->scanline_words * h) <= 9) { + /* Turn on direct for less than 9 dword colour expansion */ info->scratch_buffer[0] = (unsigned char *)(ADDRREG(R128_HOST_DATA_LAST) - (info->scanline_words - 1)); - info->scanline_direct = 1; + info->scanline_direct = 1; + } else +#endif + { + /* Use indirect for anything else */ + info->scratch_buffer[0] = info->scratch_save; + info->scanline_direct = 0; + } - /* Make engine ready for next line */ - R128WaitForFifo(pScrn, 2); - OUTREG(R128_DST_Y_X, ((info->scanline_y++ << 16) - | info->scanline_x)); - OUTREG(R128_DST_HEIGHT_WIDTH, info->scanline_h_w); + if (pScrn->bitsPerPixel == 24) { + x1clip *= 3; + x2clip *= 3; } + + R128WaitForFifo(pScrn, 4 + (info->scanline_direct ? + (info->scanline_words * h) : 0) ); + OUTREG(R128_SC_TOP_LEFT, (y << 16) | (x1clip & 0xffff)); + OUTREG(R128_SC_BOTTOM_RIGHT, ((y+h-1) << 16) | ((x2clip-1) & 0xffff)); + OUTREG(R128_DST_Y_X, (y << 16) | (x & 0xffff)); + /* Have to pad the width here and use clipping engine */ + OUTREG(R128_DST_HEIGHT_WIDTH, (h << 16) | ((w + 31) & ~31)); } /* Subsequent XAA indirect CPU-to-screen color expandion. This is called once for each scanline. */ static void R128SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) { - R128InfoPtr info = R128PTR(pScrn); - CARD32 *p = (CARD32 *)info->scratch_buffer[bufno]; + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + CARD32 *p = (CARD32 *)info->scratch_buffer[bufno]; int i; - int left = info->scanline_words; + int left = info->scanline_words; volatile CARD32 *d; - R128MMIO_VARS(); - - --info->scanline_h; - if (info->scanline_direct) { - if (info->scanline_h <= 1) { - /* Turn off direct for last scan line */ - info->scratch_buffer[0] = info->scratch_save; - info->scanline_direct = 0; - return; - } - } - R128WaitForFifo(pScrn, 2); - OUTREG(R128_DST_Y_X, ((info->scanline_y++ << 16) - | info->scanline_x)); - OUTREG(R128_DST_HEIGHT_WIDTH, info->scanline_h_w); - if (info->scanline_direct) return; - + --info->scanline_h; while (left) { - if (left <= 9) { + if (left <= 8) { + /* Last scanline - finish write to DATA_LAST */ + if (info->scanline_h == 0) { R128WaitForFifo(pScrn, left); /* Unrolling doesn't improve performance */ for (d = ADDRREG(R128_HOST_DATA_LAST) - (left - 1); left; --left) *d++ = *p++; + return; + } else { + R128WaitForFifo(pScrn, left); + /* Unrolling doesn't improve performance */ + for (d = ADDRREG(R128_HOST_DATA7) - (left - 1); left; --left) + *d++ = *p++; + } } else { R128WaitForFifo(pScrn, 8); /* Unrolling doesn't improve performance */ @@ -817,7 +762,6 @@ static void R128SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) } } -#if R128_IMAGEWRITE /* Setup for XAA indirect image write. @@ -827,6 +771,7 @@ static void R128SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) x11perf -putimage100 2150.0/sec 1170.0/sec x11perf -putimage500 108.0/sec 49.8/sec */ +#if R128_IMAGEWRITE static void R128SetupForScanlineImageWrite(ScrnInfoPtr pScrn, int rop, unsigned int planemask, @@ -834,14 +779,15 @@ static void R128SetupForScanlineImageWrite(ScrnInfoPtr pScrn, int bpp, int depth) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; info->scanline_bpp = bpp; R128WaitForFifo(pScrn, 2); OUTREG(R128_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl - | R128_GMC_BRUSH_SOLID_COLOR + | R128_GMC_DST_CLIPPING + | R128_GMC_BRUSH_1X8_COLOR | R128_GMC_SRC_DATATYPE_COLOR | R128_ROP[rop].rop | R128_GMC_BYTE_LSB_TO_MSB @@ -865,65 +811,78 @@ static void R128SubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn, int w, int h, int skipleft) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int x1clip = x+skipleft; + int x2clip = x+w; + + int shift = 0; /* 32bpp */ + + if (pScrn->bitsPerPixel == 8) shift = 3; + else if (pScrn->bitsPerPixel == 16) shift = 1; - info->scanline_y = y; - info->scanline_x = x; info->scanline_h = h; - info->scanline_h_w = (1 << 16) | w; - info->scanline_words = (w * info->scanline_bpp + 31) / 32; - info->scanline_direct = 0; + info->scanline_words = (w * info->scanline_bpp + 31) >> 5; - if (info->scanline_words <= 9 && info->scanline_h > 1) { - /* Turn on direct for next set of scan lines */ +#if 0 + /* Seeing as the CPUToScreen doesn't like this, I've done this + * here too, as it uses pretty much the same path. */ + if ((info->scanline_words * h) <= 9) { + /* Turn on direct for less than 9 dword colour expansion */ info->scratch_buffer[0] = (unsigned char *)(ADDRREG(R128_HOST_DATA_LAST) - (info->scanline_words - 1)); - info->scanline_direct = 1; + info->scanline_direct = 1; + } else +#endif + { + /* Use indirect for anything else */ + info->scratch_buffer[0] = info->scratch_save; + info->scanline_direct = 0; + } - /* Make engine ready for next line */ - R128WaitForFifo(pScrn, 2); - OUTREG(R128_DST_Y_X, ((info->scanline_y++ << 16) - | info->scanline_x)); - OUTREG(R128_DST_HEIGHT_WIDTH, info->scanline_h_w); + if (pScrn->bitsPerPixel == 24) { + x1clip *= 3; + x2clip *= 3; } + + R128WaitForFifo(pScrn, 4 + (info->scanline_direct ? + (info->scanline_words * h) : 0) ); + OUTREG(R128_SC_TOP_LEFT, (y << 16) | (x1clip & 0xffff)); + OUTREG(R128_SC_BOTTOM_RIGHT, ((y+h-1) << 16) | ((x2clip-1) & 0xffff)); + OUTREG(R128_DST_Y_X, (y << 16) | (x & 0xffff)); + /* Have to pad the width here and use clipping engine */ + OUTREG(R128_DST_HEIGHT_WIDTH, (h << 16) | ((w + shift) & ~shift)); } /* Subsequent XAA indirect iamge write. This is called once for each scanline. */ static void R128SubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno) { - R128InfoPtr info = R128PTR(pScrn); - CARD32 *p = (CARD32 *)info->scratch_buffer[bufno]; + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + CARD32 *p = (CARD32 *)info->scratch_buffer[bufno]; int i; - int left = info->scanline_words; + int left = info->scanline_words; volatile CARD32 *d; - R128MMIO_VARS(); - - --info->scanline_h; - if (info->scanline_direct) { - if (info->scanline_h <= 1) { - /* Turn off direct for last scan line */ - info->scratch_buffer[0] = info->scratch_save; - info->scanline_direct = 0; - return; - } - } - - R128WaitForFifo(pScrn, 2); - OUTREG(R128_DST_Y_X, ((info->scanline_y++ << 16) - | info->scanline_x)); - OUTREG(R128_DST_HEIGHT_WIDTH, info->scanline_h_w); if (info->scanline_direct) return; - + --info->scanline_h; while (left) { - if (left <= 9) { + if (left <= 8) { + /* Last scanline - finish write to DATA_LAST */ + if (info->scanline_h == 0) { R128WaitForFifo(pScrn, left); /* Unrolling doesn't improve performance */ for (d = ADDRREG(R128_HOST_DATA_LAST) - (left - 1); left; --left) *d++ = *p++; + return; + } else { + R128WaitForFifo(pScrn, left); + /* Unrolling doesn't improve performance */ + for (d = ADDRREG(R128_HOST_DATA7) - (left - 1); left; --left) + *d++ = *p++; + } } else { R128WaitForFifo(pScrn, 8); /* Unrolling doesn't improve performance */ @@ -938,8 +897,8 @@ static void R128SubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno) /* Initialize the acceleration hardware. */ void R128EngineInit(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; R128TRACE(("EngineInit (%d/%d)\n", info->CurrentLayout.pixel_code, info->CurrentLayout.bitsPerPixel)); @@ -975,8 +934,7 @@ void R128EngineInit(ScrnInfoPtr pScrn) info->dp_gui_master_cntl = ((info->datatype << R128_GMC_DST_DATATYPE_SHIFT) | R128_GMC_CLR_CMP_CNTL_DIS - | R128_GMC_AUX_CLIP_DIS - | R128_GMC_DST_CLIPPING); + | R128_GMC_AUX_CLIP_DIS); R128WaitForFifo(pScrn, 1); OUTREG(R128_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl | R128_GMC_BRUSH_SOLID_COLOR @@ -992,6 +950,7 @@ void R128EngineInit(ScrnInfoPtr pScrn) OUTREG(R128_DP_SRC_BKGD_CLR, 0x00000000); OUTREG(R128_DP_WRITE_MASK, 0xffffffff); + R128WaitForFifo(pScrn, 1); #if X_BYTE_ORDER == X_BIG_ENDIAN OUTREGP(R128_DP_DATATYPE, R128_HOST_BIG_ENDIAN_EN, ~R128_HOST_BIG_ENDIAN_EN); @@ -1054,19 +1013,18 @@ static void R128MMIOAccelInit(ScrnInfoPtr pScrn, XAAInfoRecPtr a) /* Indirect CPU-To-Screen Color Expand */ #if X_BYTE_ORDER == X_LITTLE_ENDIAN - a->ScanlineCPUToScreenColorExpandFillFlags = 0; + a->ScanlineCPUToScreenColorExpandFillFlags = LEFT_EDGE_CLIPPING + | LEFT_EDGE_CLIPPING_NEGATIVE_X; #else - a->ScanlineCPUToScreenColorExpandFillFlags = BIT_ORDER_IN_BYTE_MSBFIRST; + a->ScanlineCPUToScreenColorExpandFillFlags = BIT_ORDER_IN_BYTE_MSBFIRST + | LEFT_EDGE_CLIPPING + | LEFT_EDGE_CLIPPING_NEGATIVE_X; #endif a->NumScanlineColorExpandBuffers = 1; a->ScanlineColorExpandBuffers = info->scratch_buffer; -#if R128_IMAGEWRITE info->scratch_save = xalloc(((pScrn->virtualX+31)/32*4) - + (pScrn->virtualX - * info->pixel_bytes)); -#else - info->scratch_save = xalloc(((pScrn->virtualX+31)/32*4)); -#endif + + (pScrn->virtualX + * info->CurrentLayout.pixel_bytes)); info->scratch_buffer[0] = info->scratch_save; a->SetupForScanlineCPUToScreenColorExpandFill = R128SetupForScanlineCPUToScreenColorExpandFill; @@ -1085,33 +1043,22 @@ static void R128MMIOAccelInit(ScrnInfoPtr pScrn, XAAInfoRecPtr a) a->DashPatternMaxLength = 32; a->DashedLineFlags = (LINE_PATTERN_LSBFIRST_LSBJUSTIFIED | LINE_PATTERN_POWER_OF_2_ONLY); -#if R128_CLIPPING - /* Clipping. */ - if (info->CurrentLayout.depth != 8 && info->CurrentLayout.pixel_code != 24) { - /* There is one xtest error in 8bpp and - many xtest errors in 24/24 that do not - appear at other depths. */ - a->SetClippingRectangle = R128SetClippingRectangle; - a->DisableClipping = R128DisableClipping; - a->ClippingFlags - = (HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY - | HARDWARE_CLIP_MONO_8x8_FILL - | HARDWARE_CLIP_COLOR_8x8_FILL - | HARDWARE_CLIP_SOLID_FILL); - } -#endif -#if R128_IMAGEWRITE /* ImageWrite */ +#if R128_IMAGEWRITE a->NumScanlineImageWriteBuffers = 1; a->ScanlineImageWriteBuffers = info->scratch_buffer; info->scratch_buffer[0] = info->scratch_save; a->SetupForScanlineImageWrite = R128SetupForScanlineImageWrite; a->SubsequentScanlineImageWriteRect= R128SubsequentScanlineImageWriteRect; a->SubsequentImageWriteScanline = R128SubsequentImageWriteScanline; - a->ImageWriteFlags = (CPU_TRANSFER_PAD_DWORD - | SCANLINE_PAD_DWORD - | SYNC_AFTER_IMAGE_WRITE); + a->ScanlineImageWriteFlags = CPU_TRANSFER_PAD_DWORD + /* Performance tests show that we shouldn't use GXcopy for + * uploads as a memcpy is faster */ + | NO_GXCOPY + | LEFT_EDGE_CLIPPING + | LEFT_EDGE_CLIPPING_NEGATIVE_X + | SCANLINE_PAD_DWORD; #endif } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_cursor.c b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_cursor.c index 586a5c36a..02f9d80c9 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_cursor.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_cursor.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_cursor.c,v 1.9 2000/06/17 00:27:32 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_cursor.c,v 1.11 2000/10/18 17:19:59 alanh Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., @@ -53,6 +53,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "xaa.h" #include "xf86Cursor.h" +#include "xf86xv.h" + /* PCI support */ #include "xf86PciInfo.h" #include "xf86Pci.h" @@ -95,7 +97,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. /* Set cursor foreground and background colors. */ static void R128SetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTREG(R128_CUR_CLR0, bg); OUTREG(R128_CUR_CLR1, fg); @@ -105,12 +108,12 @@ static void R128SetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) (xorigin,yorigin). */ static void R128SetCursorPosition(ScrnInfoPtr pScrn, int x, int y) { - R128InfoPtr info = R128PTR(pScrn); - xf86CursorInfoPtr cursor = info->cursor; - int xorigin = 0; - int yorigin = 0; - int total_y = pScrn->frameY1 - pScrn->frameY0; - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + xf86CursorInfoPtr cursor = info->cursor; + int xorigin = 0; + int yorigin = 0; + int total_y = pScrn->frameY1 - pScrn->frameY0; if (x < 0) xorigin = -x; if (y < 0) yorigin = -y; @@ -130,12 +133,12 @@ static void R128SetCursorPosition(ScrnInfoPtr pScrn, int x, int y) will be called after this, so we can ignore xorigin and yorigin. */ static void R128LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *image) { - R128InfoPtr info = R128PTR(pScrn); - CARD32 *s = (CARD32 *)image; - CARD32 *d = (CARD32 *)(info->FB + info->cursor_start); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + CARD32 *s = (CARD32 *)image; + CARD32 *d = (CARD32 *)(info->FB + info->cursor_start); int y; CARD32 save; - R128MMIO_VARS(); save = INREG(R128_CRTC_GEN_CNTL); OUTREG(R128_CRTC_GEN_CNTL, save & ~R128_CRTC_CUR_EN); @@ -200,7 +203,8 @@ static void R128LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *image) /* Hide hardware cursor. */ static void R128HideCursor(ScrnInfoPtr pScrn) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTREGP(R128_CRTC_GEN_CNTL, 0, ~R128_CRTC_CUR_EN); } @@ -208,7 +212,8 @@ static void R128HideCursor(ScrnInfoPtr pScrn) /* Show hardware cursor. */ static void R128ShowCursor(ScrnInfoPtr pScrn) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTREGP(R128_CRTC_GEN_CNTL, R128_CRTC_CUR_EN, ~R128_CRTC_CUR_EN); } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dga.c b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dga.c index 918928861..9206f4728 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dga.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dga.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dga.c,v 1.2 2000/06/17 00:03:22 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dga.c,v 1.4 2000/10/18 17:20:00 alanh Exp $ */ /* * Authors: * Ove Kĺven <ovek@transgaming.com>, @@ -10,31 +10,6 @@ #include "xf86_OSproc.h" #include "xf86_ansic.h" - /* PCI support */ -#include "xf86Pci.h" -#include "xf86PciInfo.h" - - /* DDC support */ -#include "xf86DDC.h" - - /* XAA and Cursor Support */ -#include "xaa.h" -#include "xaalocal.h" -#include "xf86Cursor.h" - - /* DRI support */ -#ifdef XF86DRI -#include "GL/glxint.h" -#include "xf86drm.h" -#include "sarea.h" -#define _XF86DRI_SERVER_ -#include "xf86dri.h" -#include "dri.h" -#include "r128_dri.h" -#include "r128_dripriv.h" -#include "r128_sarea.h" -#endif - /* Driver data structures */ #include "r128.h" @@ -49,8 +24,10 @@ static int R128_GetViewport(ScrnInfoPtr); static void R128_SetViewport(ScrnInfoPtr, int, int, int); static void R128_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long); static void R128_BlitRect(ScrnInfoPtr, int, int, int, int, int, int); +#if 0 static void R128_BlitTransRect(ScrnInfoPtr, int, int, int, int, int, int, unsigned long); +#endif static DGAFunctionRec R128_DGAFuncs = { @@ -344,6 +321,7 @@ R128_BlitRect( } +#if 0 static void R128_BlitTransRect( ScrnInfoPtr pScrn, @@ -355,6 +333,7 @@ R128_BlitTransRect( /* this one should be separate since the XAA function would prohibit usage of ~0 as the key */ } +#endif static Bool diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dri.c index 4e8005602..e069bf08a 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dri.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dri.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dri.c,v 1.5 2000/08/25 13:42:37 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_dri.c,v 1.6 2000/10/18 17:20:00 alanh Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., @@ -59,31 +59,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "cfb32.h" #include "cfb24_32.h" - /* XAA and Cursor Support */ -#include "xaa.h" -#include "xf86Cursor.h" - - /* PCI support */ -#include "xf86PciInfo.h" -#include "xf86Pci.h" - - /* DDC support */ -#include "xf86DDC.h" - - /* DRI support */ -#include "GL/glxint.h" -#include "GL/glxtokens.h" -#include "xf86drm.h" -#include "xf86drmR128.h" -#include "sarea.h" -#define _XF86DRI_SERVER_ -#include "xf86dri.h" -#include "dri.h" -#include "r128_dri.h" -#include "r128_sarea.h" -#include "r128_dripriv.h" - /* Driver data structures */ +#include "ati2.h" #include "r128.h" #include "r128_reg.h" @@ -104,9 +81,9 @@ do { \ slots available is stored in info->CCEFifoSize. */ static void R128CCEWaitForFifoFunction(ScrnInfoPtr pScrn, int entries) { - R128InfoPtr info = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); unsigned char *R128MMIO = info->MMIO; - int i; + int i; for (;;) { for (i = 0; i < R128_TIMEOUT; i++) { @@ -122,9 +99,9 @@ static void R128CCEWaitForFifoFunction(ScrnInfoPtr pScrn, int entries) CCE is idle. */ void R128CCEWaitForIdle(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); unsigned char *R128MMIO = info->MMIO; - int i; + int i; if (!info->CCEInUse || info->CCEMode == R128_PM4_NONPM4) return; @@ -172,9 +149,9 @@ void R128CCEWaitForIdle(ScrnInfoPtr pScrn) /* Reset the ring buffer status, if the engine was reset */ void R128CCEResetRing(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); - unsigned char *R128MMIO = info->MMIO; - R128SAREAPrivPtr pSAREAPriv; + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + R128SAREAPrivPtr pSAREAPriv; volatile CARD32 *r128RingReadPtr; if (!info->CCEInUse || info->CCEMode == R128_PM4_NONPM4) return; @@ -195,7 +172,7 @@ void R128CCEResetRing(ScrnInfoPtr pScrn) mode is a CCE mode. The mode is stored in info->CCEMode. */ void R128CCEStart(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); unsigned char *R128MMIO = info->MMIO; if (info->CCEInUse || info->CCEMode == R128_PM4_NONPM4) return; @@ -212,7 +189,7 @@ void R128CCEStart(ScrnInfoPtr pScrn) requests before switching modes.*/ void R128CCEStop(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); unsigned char *R128MMIO = info->MMIO; if (!info->CCEInUse || info->CCEMode == R128_PM4_NONPM4) return; @@ -231,14 +208,14 @@ void R128CCEStop(ScrnInfoPtr pScrn) static Bool R128InitVisualConfigs(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - R128InfoPtr pR128 = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); int numConfigs = 0; __GLXvisualConfig *pConfigs = 0; R128ConfigPrivPtr pR128Configs = 0; R128ConfigPrivPtr *pR128ConfigPtrs = 0; int i, accum, stencil; - switch (pR128->CurrentLayout.pixel_code) { + switch (info->CurrentLayout.pixel_code) { case 8: /* 8bpp mode is not support */ case 15: /* FIXME */ case 24: /* FIXME */ @@ -395,9 +372,9 @@ static Bool R128InitVisualConfigs(ScreenPtr pScreen) break; } - pR128->numVisualConfigs = numConfigs; - pR128->pVisualConfigs = pConfigs; - pR128->pVisualConfigsPriv = pR128Configs; + info->numVisualConfigs = numConfigs; + info->pVisualConfigs = pConfigs; + info->pVisualConfigsPriv = pR128Configs; GlxSetVisualConfigs(numConfigs, pConfigs, (void**)pR128ConfigPtrs); return TRUE; } @@ -427,15 +404,15 @@ static void R128DestroyContext(ScreenPtr pScreen, drmContext hwContext, static void R128EnterServer(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - R128InfoPtr pR128 = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); - if (pR128->accel) pR128->accel->NeedToSync = TRUE; + if (info->accel) info->accel->NeedToSync = TRUE; #if 1 - if (!pR128->CCE2D) R128CCEStop(pScrn); + if (!info->CCE2D) R128CCEStop(pScrn); #else - if (pR128->CCE2D) R128CCEWaitForIdle(pScrn); - else R128CCEStop(pScrn); + if (info->CCE2D) R128CCEWaitForIdle(pScrn); + else R128CCEStop(pScrn); #endif } @@ -448,13 +425,13 @@ static void R128EnterServer(ScreenPtr pScreen) static void R128LeaveServer(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - R128InfoPtr pR128 = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); #if 1 - if (!pR128->CCE2D) R128CCEStart(pScrn); + if (!info->CCE2D) R128CCEStart(pScrn); #else - if (pR128->CCE2D) R128CCEWaitForIdle(pScrn); - else R128CCEStart(pScrn); + if (info->CCE2D) R128CCEWaitForIdle(pScrn); + else R128CCEStart(pScrn); #endif } @@ -482,13 +459,13 @@ static void R128DRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index) /* FIXME: This routine needs to have acceleration turned on */ ScreenPtr pScreen = pWin->drawable.pScreen; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - R128InfoPtr pR128 = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); BoxPtr pbox; int nbox; int depth; /* FIXME: Use accel when CCE 2D code is written */ - if (pR128->CCE2D) return; + if (info->CCE2D) return; /* FIXME: This should be based on the __GLXvisualConfig info */ switch (pScrn->bitsPerPixel) { @@ -506,29 +483,29 @@ static void R128DRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index) pbox = REGION_RECTS(prgn); nbox = REGION_NUM_RECTS(prgn); - (*pR128->accel->SetupForSolidFill)(pScrn, 0, GXcopy, -1); + (*info->accel->SetupForSolidFill)(pScrn, 0, GXcopy, -1); for (; nbox; nbox--, pbox++) { - (*pR128->accel->SubsequentSolidFillRect)(pScrn, - pbox->x1 + pR128->fbX, - pbox->y1 + pR128->fbY, - pbox->x2 - pbox->x1, - pbox->y2 - pbox->y1); - (*pR128->accel->SubsequentSolidFillRect)(pScrn, - pbox->x1 + pR128->backX, - pbox->y1 + pR128->backY, - pbox->x2 - pbox->x1, - pbox->y2 - pbox->y1); + (*info->accel->SubsequentSolidFillRect)(pScrn, + pbox->x1 + info->fbX, + pbox->y1 + info->fbY, + pbox->x2 - pbox->x1, + pbox->y2 - pbox->y1); + (*info->accel->SubsequentSolidFillRect)(pScrn, + pbox->x1 + info->backX, + pbox->y1 + info->backY, + pbox->x2 - pbox->x1, + pbox->y2 - pbox->y1); } - (*pR128->accel->SetupForSolidFill)(pScrn, depth, GXcopy, -1); + (*info->accel->SetupForSolidFill)(pScrn, depth, GXcopy, -1); for (; nbox; nbox--, pbox++) - (*pR128->accel->SubsequentSolidFillRect)(pScrn, - pbox->x1 + pR128->depthX, - pbox->y1 + pR128->depthY, - pbox->x2 - pbox->x1, - pbox->y2 - pbox->y1); + (*info->accel->SubsequentSolidFillRect)(pScrn, + pbox->x1 + info->depthX, + pbox->y1 + info->depthY, + pbox->x2 - pbox->x1, + pbox->y2 - pbox->y1); - pR128->accel->NeedToSync = TRUE; + info->accel->NeedToSync = TRUE; } /* Copy the back and depth buffers when the X server moves a window. */ @@ -537,7 +514,7 @@ static void R128DRIMoveBuffers(WindowPtr pWin, DDXPointRec ptOldOrg, { ScreenPtr pScreen = pWin->drawable.pScreen; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - R128InfoPtr pR128 = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); /* FIXME: This routine needs to have acceleration turned on */ /* FIXME: Copy XAACopyWindow() and use REGION_TRANSLATE() */ @@ -545,14 +522,14 @@ static void R128DRIMoveBuffers(WindowPtr pWin, DDXPointRec ptOldOrg, that request them */ /* FIXME: Use accel when CCE 2D code is written */ - if (pR128->CCE2D) return; + if (info->CCE2D) return; } /* Initialize the AGP state. Request memory for use in AGP space, and initialize the Rage 128 registers to point to that memory. */ -static Bool R128DRIAgpInit(R128InfoPtr pR128, ScreenPtr pScreen) +static Bool R128DRIAgpInit(R128InfoPtr info, ScreenPtr pScreen) { - unsigned char *R128MMIO = pR128->MMIO; + unsigned char *R128MMIO = info->MMIO; unsigned long mode; unsigned int vendor, device; int ret; @@ -560,7 +537,7 @@ static Bool R128DRIAgpInit(R128InfoPtr pR128, ScreenPtr pScreen) int s, l; int flags; - if (drmAgpAcquire(pR128->drmFD) < 0) { + if (drmAgpAcquire(info->drmFD) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] AGP not available\n"); return FALSE; } @@ -570,12 +547,12 @@ static Bool R128DRIAgpInit(R128InfoPtr pR128, ScreenPtr pScreen) combination of graphics card and AGP chipset. */ - mode = drmAgpGetMode(pR128->drmFD); /* Default mode */ - vendor = drmAgpVendorId(pR128->drmFD); - device = drmAgpDeviceId(pR128->drmFD); + mode = drmAgpGetMode(info->drmFD); /* Default mode */ + vendor = drmAgpVendorId(info->drmFD); + device = drmAgpDeviceId(info->drmFD); mode &= ~R128_AGP_MODE_MASK; - switch (pR128->agpMode) { + switch (info->agpMode) { case 2: mode |= R128_AGP_2X_MODE; case 1: default: mode |= R128_AGP_1X_MODE; } @@ -583,161 +560,161 @@ static Bool R128DRIAgpInit(R128InfoPtr pR128, ScreenPtr pScreen) xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] Mode 0x%08lx [AGP 0x%04x/0x%04x; Card 0x%04x/0x%04x]\n", mode, vendor, device, - pR128->PciInfo->vendor, - pR128->PciInfo->chipType); + info->PciInfo->vendor, + info->PciInfo->chipType); - if (drmAgpEnable(pR128->drmFD, mode) < 0) { + if (drmAgpEnable(info->drmFD, mode) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] AGP not enabled\n"); - drmAgpRelease(pR128->drmFD); + drmAgpRelease(info->drmFD); return FALSE; } - pR128->agpOffset = 0; + info->agpOffset = 0; - if ((ret = drmAgpAlloc(pR128->drmFD, pR128->agpSize*1024*1024, 0, NULL, - &pR128->agpMemHandle)) < 0) { + if ((ret = drmAgpAlloc(info->drmFD, info->agpSize*1024*1024, 0, NULL, + &info->agpMemHandle)) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Out of memory (%d)\n", ret); - drmAgpRelease(pR128->drmFD); + drmAgpRelease(info->drmFD); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] %d kB allocated with handle 0x%08x\n", - pR128->agpSize*1024, pR128->agpMemHandle); + info->agpSize*1024, info->agpMemHandle); - if (drmAgpBind(pR128->drmFD, pR128->agpMemHandle, pR128->agpOffset) < 0) { + if (drmAgpBind(info->drmFD, info->agpMemHandle, info->agpOffset) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not bind\n"); - drmAgpFree(pR128->drmFD, pR128->agpMemHandle); - drmAgpRelease(pR128->drmFD); + drmAgpFree(info->drmFD, info->agpMemHandle); + drmAgpRelease(info->drmFD); return FALSE; } /* Initialize the CCE ring buffer data */ - pR128->ringStart = pR128->agpOffset; - pR128->ringMapSize = pR128->ringSize*1024*1024 + 4096; - pR128->ringSizeLog2QW = R128MinBits(pR128->ringSize*1024*1024/8) - 1; + info->ringStart = info->agpOffset; + info->ringMapSize = info->ringSize*1024*1024 + 4096; + info->ringSizeLog2QW = R128MinBits(info->ringSize*1024*1024/8) - 1; - pR128->ringReadOffset = pR128->ringStart + pR128->ringMapSize; - pR128->ringReadMapSize = 4096; + info->ringReadOffset = info->ringStart + info->ringMapSize; + info->ringReadMapSize = 4096; /* Reserve space for the vertex buffer */ - pR128->vbStart = pR128->ringReadOffset + pR128->ringReadMapSize; - pR128->vbMapSize = pR128->vbSize*1024*1024; + info->vbStart = info->ringReadOffset + info->ringReadMapSize; + info->vbMapSize = info->vbSize*1024*1024; /* Reserve space for the indirect buffer */ - pR128->indStart = pR128->vbStart + pR128->vbMapSize; - pR128->indMapSize = pR128->indSize*1024*1024; + info->indStart = info->vbStart + info->vbMapSize; + info->indMapSize = info->indSize*1024*1024; /* Reserve the rest for AGP textures */ - pR128->agpTexStart = pR128->indStart + pR128->indMapSize; - s = (pR128->agpSize*1024*1024 - pR128->agpTexStart); + info->agpTexStart = info->indStart + info->indMapSize; + s = (info->agpSize*1024*1024 - info->agpTexStart); l = R128MinBits((s-1) / R128_NR_TEX_REGIONS); if (l < R128_LOG_TEX_GRANULARITY) l = R128_LOG_TEX_GRANULARITY; - pR128->agpTexMapSize = (s >> l) << l; - pR128->log2AGPTexGran = l; + info->agpTexMapSize = (s >> l) << l; + info->log2AGPTexGran = l; - if (pR128->CCESecure) flags = DRM_READ_ONLY; + if (info->CCESecure) flags = DRM_READ_ONLY; else flags = 0; - if (drmAddMap(pR128->drmFD, pR128->ringStart, pR128->ringMapSize, - DRM_AGP, flags, &pR128->ringHandle) < 0) { + if (drmAddMap(info->drmFD, info->ringStart, info->ringMapSize, + DRM_AGP, flags, &info->ringHandle) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not add ring mapping\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, - "[agp] ring handle = 0x%08lx\n", pR128->ringHandle); + "[agp] ring handle = 0x%08lx\n", info->ringHandle); - if (drmMap(pR128->drmFD, pR128->ringHandle, pR128->ringMapSize, - (drmAddressPtr)&pR128->ring) < 0) { + if (drmMap(info->drmFD, info->ringHandle, info->ringMapSize, + (drmAddressPtr)&info->ring) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not map ring\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] Ring mapped at 0x%08lx\n", - (unsigned long)pR128->ring); + (unsigned long)info->ring); - if (drmAddMap(pR128->drmFD, pR128->ringReadOffset, pR128->ringReadMapSize, - DRM_AGP, flags, &pR128->ringReadPtrHandle) < 0) { + if (drmAddMap(info->drmFD, info->ringReadOffset, info->ringReadMapSize, + DRM_AGP, flags, &info->ringReadPtrHandle) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not add ring read ptr mapping\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] ring read ptr handle = 0x%08lx\n", - pR128->ringReadPtrHandle); + info->ringReadPtrHandle); - if (drmMap(pR128->drmFD, pR128->ringReadPtrHandle, pR128->ringReadMapSize, - (drmAddressPtr)&pR128->ringReadPtr) < 0) { + if (drmMap(info->drmFD, info->ringReadPtrHandle, info->ringReadMapSize, + (drmAddressPtr)&info->ringReadPtr) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not map ring read ptr\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] Ring read ptr mapped at 0x%08lx\n", - (unsigned long)pR128->ringReadPtr); + (unsigned long)info->ringReadPtr); - if (drmAddMap(pR128->drmFD, pR128->vbStart, pR128->vbMapSize, - DRM_AGP, 0, &pR128->vbHandle) < 0) { + if (drmAddMap(info->drmFD, info->vbStart, info->vbMapSize, + DRM_AGP, 0, &info->vbHandle) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not add vertex buffers mapping\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, - "[agp] vertex buffers handle = 0x%08lx\n", pR128->vbHandle); + "[agp] vertex buffers handle = 0x%08lx\n", info->vbHandle); - if (drmMap(pR128->drmFD, pR128->vbHandle, pR128->vbMapSize, - (drmAddressPtr)&pR128->vb) < 0) { + if (drmMap(info->drmFD, info->vbHandle, info->vbMapSize, + (drmAddressPtr)&info->vb) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not map vertex buffers\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] Vertex buffers mapped at 0x%08lx\n", - (unsigned long)pR128->vb); + (unsigned long)info->vb); - if (drmAddMap(pR128->drmFD, pR128->indStart, pR128->indMapSize, - DRM_AGP, flags, &pR128->indHandle) < 0) { + if (drmAddMap(info->drmFD, info->indStart, info->indMapSize, + DRM_AGP, flags, &info->indHandle) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not add indirect buffers mapping\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, - "[agp] indirect buffers handle = 0x%08lx\n", pR128->indHandle); + "[agp] indirect buffers handle = 0x%08lx\n", info->indHandle); - if (drmMap(pR128->drmFD, pR128->indHandle, pR128->indMapSize, - (drmAddressPtr)&pR128->ind) < 0) { + if (drmMap(info->drmFD, info->indHandle, info->indMapSize, + (drmAddressPtr)&info->ind) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not map indirect buffers\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] Indirect buffers mapped at 0x%08lx\n", - (unsigned long)pR128->ind); + (unsigned long)info->ind); - if (drmAddMap(pR128->drmFD, pR128->agpTexStart, pR128->agpTexMapSize, - DRM_AGP, 0, &pR128->agpTexHandle) < 0) { + if (drmAddMap(info->drmFD, info->agpTexStart, info->agpTexMapSize, + DRM_AGP, 0, &info->agpTexHandle) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not add AGP texture map mapping\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] AGP texture map handle = 0x%08lx\n", - pR128->agpTexHandle); + info->agpTexHandle); - if (drmMap(pR128->drmFD, pR128->agpTexHandle, pR128->agpTexMapSize, - (drmAddressPtr)&pR128->agpTex) < 0) { + if (drmMap(info->drmFD, info->agpTexHandle, info->agpTexMapSize, + (drmAddressPtr)&info->agpTex) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not map AGP texture map\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] AGP Texture map mapped at 0x%08lx\n", - (unsigned long)pR128->agpTex); + (unsigned long)info->agpTex); /* Initialize Rage 128's AGP registers */ cntl = INREG(R128_AGP_CNTL); cntl &= ~R128_AGP_APER_SIZE_MASK; - switch (pR128->agpSize) { + switch (info->agpSize) { case 256: cntl |= R128_AGP_APER_SIZE_256MB; break; case 128: cntl |= R128_AGP_APER_SIZE_128MB; break; case 64: cntl |= R128_AGP_APER_SIZE_64MB; break; @@ -748,41 +725,41 @@ static Bool R128DRIAgpInit(R128InfoPtr pR128, ScreenPtr pScreen) default: xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Illegal aperture size %d kB\n", - pR128->agpSize*1024); + info->agpSize*1024); return FALSE; } - OUTREG(R128_AGP_BASE, pR128->ringHandle); /* Ring buf is at AGP offset 0 */ + OUTREG(R128_AGP_BASE, info->ringHandle); /* Ring buf is at AGP offset 0 */ OUTREG(R128_AGP_CNTL, cntl); return TRUE; } /* Fake the vertex buffers for PCI cards. */ -static Bool R128DRIPciInit(R128InfoPtr pR128, ScreenPtr pScreen) +static Bool R128DRIPciInit(R128InfoPtr info, ScreenPtr pScreen) { - pR128->vbStart = 0; - pR128->vbMapSize = pR128->vbSize*1024*1024; + info->vbStart = 0; + info->vbMapSize = info->vbSize*1024*1024; return TRUE; } /* Add a map for the MMIO registers that will be accessed by any DRI-based clients. */ -static Bool R128DRIMapInit(R128InfoPtr pR128, ScreenPtr pScreen) +static Bool R128DRIMapInit(R128InfoPtr info, ScreenPtr pScreen) { int flags; - if (pR128->CCESecure) flags = DRM_READ_ONLY; - else flags = 0; + if (info->CCESecure) flags = DRM_READ_ONLY; + else flags = 0; /* Map registers */ - pR128->registerSize = R128_MMIOSIZE; - if (drmAddMap(pR128->drmFD, pR128->MMIOAddr, pR128->registerSize, - DRM_REGISTERS, flags, &pR128->registerHandle) < 0) { + info->registerSize = R128_MMIOSIZE; + if (drmAddMap(info->drmFD, info->MMIOAddr, info->registerSize, + DRM_REGISTERS, flags, &info->registerHandle) < 0) { return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, - "[drm] register handle = 0x%08lx\n", pR128->registerHandle); + "[drm] register handle = 0x%08lx\n", info->registerHandle); return TRUE; } @@ -791,9 +768,9 @@ static Bool R128DRIMapInit(R128InfoPtr pR128, ScreenPtr pScreen) DRI-based clients. */ static void R128DRICCEInitRingBuffer(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); unsigned char *R128MMIO = info->MMIO; - unsigned long addr; + unsigned long addr; /* FIXME: When we use the CCE for the X server, we should move this function (and the support functions above) to r128_accel.c */ @@ -831,63 +808,63 @@ static void R128DRICCEInitRingBuffer(ScrnInfoPtr pScrn) } /* Initialize the kernel data structures. */ -static int R128DRIKernelInit(R128InfoPtr pR128, ScreenPtr pScreen) +static int R128DRIKernelInit(R128InfoPtr info, ScreenPtr pScreen) { drmR128Init drmInfo; drmInfo.sarea_priv_offset = sizeof(XF86DRISAREARec); - drmInfo.is_pci = pR128->IsPCI; - drmInfo.cce_mode = pR128->CCEMode; - drmInfo.cce_fifo_size = pR128->CCEFifoSize; - drmInfo.cce_secure = pR128->CCESecure; - drmInfo.ring_size = pR128->ringSize*1024*1024; - drmInfo.usec_timeout = pR128->CCEusecTimeout; - - drmInfo.fb_offset = pR128->LinearAddr; - drmInfo.agp_ring_offset = pR128->ringHandle; - drmInfo.agp_read_ptr_offset = pR128->ringReadPtrHandle; - drmInfo.agp_vertbufs_offset = pR128->vbHandle; - drmInfo.agp_indbufs_offset = pR128->indHandle; - drmInfo.agp_textures_offset = pR128->agpTexHandle; - drmInfo.mmio_offset = pR128->registerHandle; - - if (drmR128InitCCE(pR128->drmFD, &drmInfo) < 0) return FALSE; + drmInfo.is_pci = info->IsPCI; + drmInfo.cce_mode = info->CCEMode; + drmInfo.cce_fifo_size = info->CCEFifoSize; + drmInfo.cce_secure = info->CCESecure; + drmInfo.ring_size = info->ringSize*1024*1024; + drmInfo.usec_timeout = info->CCEusecTimeout; + + drmInfo.fb_offset = info->LinearAddr; + drmInfo.agp_ring_offset = info->ringHandle; + drmInfo.agp_read_ptr_offset = info->ringReadPtrHandle; + drmInfo.agp_vertbufs_offset = info->vbHandle; + drmInfo.agp_indbufs_offset = info->indHandle; + drmInfo.agp_textures_offset = info->agpTexHandle; + drmInfo.mmio_offset = info->registerHandle; + + if (drmR128InitCCE(info->drmFD, &drmInfo) < 0) return FALSE; return TRUE; } /* Add a map for the vertex buffers that will be accessed by any DRI-based clients. */ -static Bool R128DRIBufInit(R128InfoPtr pR128, ScreenPtr pScreen) +static Bool R128DRIBufInit(R128InfoPtr info, ScreenPtr pScreen) { /* Initialize vertex buffers */ - if ((pR128->vbNumBufs = drmAddBufs(pR128->drmFD, - pR128->vbMapSize / pR128->vbBufSize, - pR128->vbBufSize, - DRM_AGP_BUFFER, - pR128->vbStart)) <= 0) { + if ((info->vbNumBufs = drmAddBufs(info->drmFD, + info->vbMapSize / info->vbBufSize, + info->vbBufSize, + DRM_AGP_BUFFER, + info->vbStart)) <= 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Could not create vertex buffers list\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Added %d %d byte vertex buffers\n", - pR128->vbNumBufs, pR128->vbBufSize); + info->vbNumBufs, info->vbBufSize); - if (drmMarkBufs(pR128->drmFD, 0.133333, 0.266666)) { + if (drmMarkBufs(info->drmFD, 0.133333, 0.266666)) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to mark vertex buffers list\n"); return FALSE; } - if (!(pR128->vbBufs = drmMapBufs(pR128->drmFD))) { + if (!(info->vbBufs = drmMapBufs(info->drmFD))) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to map vertex buffers list\n"); return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Mapped %d vertex buffers\n", - pR128->vbBufs->count); + info->vbBufs->count); return TRUE; } @@ -895,9 +872,10 @@ static Bool R128DRIBufInit(R128InfoPtr pR128, ScreenPtr pScreen) /* Load the microcode for the CCE */ static void R128DRILoadMicrocode(ScrnInfoPtr pScrn) { - unsigned char *R128MMIO = R128PTR(pScrn)->MMIO; - int i; - unsigned long R128Microcode[] = { + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int i; + unsigned long R128Microcode[] = { /* CCE microcode (from ATI) */ 0, 276838400, 0, 268449792, 2, 142, 2, 145, 0, 1076765731, 0, 1617039951, 0, 774592877, 0, 1987540286, 0, 2307490946U, 0, 599558925, 0, 589505315, 0, @@ -948,7 +926,7 @@ static void R128DRILoadMicrocode(ScrnInfoPtr pScrn) /* Initialize the CCE state, and start the CCE (if used by the X server) */ static void R128DRICCEInit(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); unsigned char *R128MMIO = info->MMIO; /* CCEMode is initialized in r128_driver.c */ @@ -982,7 +960,7 @@ static void R128DRICCEInit(ScrnInfoPtr pScrn) Bool R128DRIScreenInit(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - R128InfoPtr pR128 = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); DRIInfoPtr pDRIInfo; R128DRIPtr pR128DRI; int major, minor, patch; @@ -1010,7 +988,7 @@ Bool R128DRIScreenInit(ScreenPtr pScreen) return FALSE; } - switch (pR128->CurrentLayout.pixel_code) { + switch (info->CurrentLayout.pixel_code) { case 8: /* These modes are not supported (yet). */ case 15: @@ -1027,22 +1005,22 @@ Bool R128DRIScreenInit(ScreenPtr pScreen) DRIScreenInit(). */ if (!(pDRIInfo = DRICreateInfoRec())) return FALSE; - pR128->pDRIInfo = pDRIInfo; + info->pDRIInfo = pDRIInfo; pDRIInfo->drmDriverName = R128_NAME; pDRIInfo->clientDriverName = R128_NAME; pDRIInfo->busIdString = xalloc(64); sprintf(pDRIInfo->busIdString, "PCI:%d:%d:%d", - pR128->PciInfo->bus, - pR128->PciInfo->device, - pR128->PciInfo->func); - pDRIInfo->ddxDriverMajorVersion = R128_VERSION_MAJOR; - pDRIInfo->ddxDriverMinorVersion = R128_VERSION_MINOR; - pDRIInfo->ddxDriverPatchVersion = R128_VERSION_PATCH; - pDRIInfo->frameBufferPhysicalAddress = pR128->LinearAddr; - pDRIInfo->frameBufferSize = pR128->FbMapSize; + info->PciInfo->bus, + info->PciInfo->device, + info->PciInfo->func); + pDRIInfo->ddxDriverMajorVersion = ATI2_VERSION_MAJOR; + pDRIInfo->ddxDriverMinorVersion = ATI2_VERSION_MINOR; + pDRIInfo->ddxDriverPatchVersion = ATI2_VERSION_PATCH; + pDRIInfo->frameBufferPhysicalAddress = info->LinearAddr; + pDRIInfo->frameBufferSize = info->FbMapSize; pDRIInfo->frameBufferStride = (pScrn->displayWidth * - pR128->CurrentLayout.pixel_bytes); + info->CurrentLayout.pixel_bytes); pDRIInfo->ddxDrawableTableEntry = R128_MAX_DRAWABLES; pDRIInfo->maxDrawableTableEntry = (SAREA_MAX_DRAWABLES < R128_MAX_DRAWABLES @@ -1068,8 +1046,8 @@ Bool R128DRIScreenInit(ScreenPtr pScreen) #endif if (!(pR128DRI = (R128DRIPtr)xnfcalloc(sizeof(R128DRIRec),1))) { - DRIDestroyInfoRec(pR128->pDRIInfo); - pR128->pDRIInfo = NULL; + DRIDestroyInfoRec(info->pDRIInfo); + info->pDRIInfo = NULL; return FALSE; } pDRIInfo->devPrivate = pR128DRI; @@ -1083,7 +1061,7 @@ Bool R128DRIScreenInit(ScreenPtr pScreen) pDRIInfo->MoveBuffers = R128DRIMoveBuffers; pDRIInfo->bufferRequests = DRI_ALL_WINDOWS; - if (!DRIScreenInit(pScreen, pDRIInfo, &pR128->drmFD)) { + if (!DRIScreenInit(pScreen, pDRIInfo, &info->drmFD)) { xfree(pDRIInfo->devPrivate); pDRIInfo->devPrivate = NULL; DRIDestroyInfoRec(pDRIInfo); @@ -1092,7 +1070,7 @@ Bool R128DRIScreenInit(ScreenPtr pScreen) } /* Check the r128 DRM version */ - version = drmGetVersion(pR128->drmFD); + version = drmGetVersion(info->drmFD); if (version) { if (version->version_major != 1 || version->version_minor != 0 || @@ -1113,12 +1091,12 @@ Bool R128DRIScreenInit(ScreenPtr pScreen) } /* Initialize AGP */ - if (!pR128->IsPCI && !R128DRIAgpInit(pR128, pScreen)) { + if (!info->IsPCI && !R128DRIAgpInit(info, pScreen)) { R128DRICloseScreen(pScreen); return FALSE; } /* Initialize PCI */ - if (pR128->IsPCI && !R128DRIPciInit(pR128, pScreen)) { + if (info->IsPCI && !R128DRIPciInit(info, pScreen)) { R128DRICloseScreen(pScreen); return FALSE; } @@ -1126,22 +1104,22 @@ Bool R128DRIScreenInit(ScreenPtr pScreen) /* DRIScreenInit doesn't add all the common mappings. Add additional mappings here. */ - if (!R128DRIMapInit(pR128, pScreen)) { + if (!R128DRIMapInit(info, pScreen)) { R128DRICloseScreen(pScreen); return FALSE; } /* Initialize the ring buffer */ - if (!pR128->IsPCI) R128DRICCEInitRingBuffer(pScrn); + if (!info->IsPCI) R128DRICCEInitRingBuffer(pScrn); /* Initialize the kernel data structures */ - if (!R128DRIKernelInit(pR128, pScreen)) { + if (!R128DRIKernelInit(info, pScreen)) { R128DRICloseScreen(pScreen); return FALSE; } /* Initialize vertex buffers list */ - if (!pR128->IsPCI && !R128DRIBufInit(pR128, pScreen)) { + if (!info->IsPCI && !R128DRIBufInit(info, pScreen)) { R128DRICloseScreen(pScreen); return FALSE; } @@ -1169,7 +1147,7 @@ Bool R128DRIScreenInit(ScreenPtr pScreen) Bool R128DRIFinishScreenInit(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - R128InfoPtr pR128 = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); R128SAREAPrivPtr pSAREAPriv; R128DRIPtr pR128DRI; @@ -1179,54 +1157,54 @@ Bool R128DRIFinishScreenInit(ScreenPtr pScreen) pSAREAPriv = (R128SAREAPrivPtr)DRIGetSAREAPrivate(pScreen); memset(pSAREAPriv, 0, sizeof(*pSAREAPriv)); - pR128->pDRIInfo->driverSwapMethod = DRI_HIDE_X_CONTEXT; - /* pR128->pDRIInfo->driverSwapMethod = DRI_SERVER_SWAP; */ + info->pDRIInfo->driverSwapMethod = DRI_HIDE_X_CONTEXT; + /* info->pDRIInfo->driverSwapMethod = DRI_SERVER_SWAP; */ - pR128DRI = (R128DRIPtr)pR128->pDRIInfo->devPrivate; - pR128DRI->registerHandle = pR128->registerHandle; - pR128DRI->registerSize = pR128->registerSize; + pR128DRI = (R128DRIPtr)info->pDRIInfo->devPrivate; + pR128DRI->registerHandle = info->registerHandle; + pR128DRI->registerSize = info->registerSize; - pR128DRI->ringHandle = pR128->ringHandle; - pR128DRI->ringMapSize = pR128->ringMapSize; - pR128DRI->ringSize = pR128->ringSize*1024*1024; + pR128DRI->ringHandle = info->ringHandle; + pR128DRI->ringMapSize = info->ringMapSize; + pR128DRI->ringSize = info->ringSize*1024*1024; - pR128DRI->ringReadPtrHandle = pR128->ringReadPtrHandle; - pR128DRI->ringReadMapSize = pR128->ringReadMapSize; + pR128DRI->ringReadPtrHandle = info->ringReadPtrHandle; + pR128DRI->ringReadMapSize = info->ringReadMapSize; - pR128DRI->vbHandle = pR128->vbHandle; - pR128DRI->vbMapSize = pR128->vbMapSize; - pR128DRI->vbOffset = pR128->vbStart; - pR128DRI->vbBufSize = pR128->vbBufSize; + pR128DRI->vbHandle = info->vbHandle; + pR128DRI->vbMapSize = info->vbMapSize; + pR128DRI->vbOffset = info->vbStart; + pR128DRI->vbBufSize = info->vbBufSize; - pR128DRI->indHandle = pR128->indHandle; - pR128DRI->indMapSize = pR128->indMapSize; + pR128DRI->indHandle = info->indHandle; + pR128DRI->indMapSize = info->indMapSize; - pR128DRI->agpTexHandle = pR128->agpTexHandle; - pR128DRI->agpTexMapSize = pR128->agpTexMapSize; - pR128DRI->log2AGPTexGran = pR128->log2AGPTexGran; - pR128DRI->agpTexOffset = pR128->agpTexStart; + pR128DRI->agpTexHandle = info->agpTexHandle; + pR128DRI->agpTexMapSize = info->agpTexMapSize; + pR128DRI->log2AGPTexGran = info->log2AGPTexGran; + pR128DRI->agpTexOffset = info->agpTexStart; - pR128DRI->deviceID = pR128->Chipset; + pR128DRI->deviceID = info->Chipset; pR128DRI->width = pScrn->virtualX; pR128DRI->height = pScrn->virtualY; pR128DRI->depth = pScrn->depth; pR128DRI->bpp = pScrn->bitsPerPixel; - pR128DRI->fbX = pR128->fbX; - pR128DRI->fbY = pR128->fbY; - pR128DRI->backX = pR128->backX; - pR128DRI->backY = pR128->backY; - pR128DRI->depthX = pR128->depthX; - pR128DRI->depthY = pR128->depthY; - pR128DRI->textureX = pR128->textureX; - pR128DRI->textureY = pR128->textureY; - pR128DRI->textureSize = pR128->textureSize; - pR128DRI->log2TexGran = pR128->log2TexGran; + pR128DRI->fbX = info->fbX; + pR128DRI->fbY = info->fbY; + pR128DRI->backX = info->backX; + pR128DRI->backY = info->backY; + pR128DRI->depthX = info->depthX; + pR128DRI->depthY = info->depthY; + pR128DRI->textureX = info->textureX; + pR128DRI->textureY = info->textureY; + pR128DRI->textureSize = info->textureSize; + pR128DRI->log2TexGran = info->log2TexGran; - pR128DRI->IsPCI = pR128->IsPCI; + pR128DRI->IsPCI = info->IsPCI; - pR128DRI->CCEMode = pR128->CCEMode; - pR128DRI->CCEFifoSize = pR128->CCEFifoSize; + pR128DRI->CCEMode = info->CCEMode; + pR128DRI->CCEFifoSize = info->CCEFifoSize; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "0x%08lx %d\n", pR128DRI->registerHandle, pR128DRI->registerSize); @@ -1238,66 +1216,66 @@ Bool R128DRIFinishScreenInit(ScreenPtr pScreen) void R128DRICloseScreen(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - R128InfoPtr pR128 = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); /* Stop the CCE if it is still in use */ - if (pR128->CCE2D) R128CCEStop(pScrn); + if (info->CCE2D) R128CCEStop(pScrn); /* De-allocate vertex buffers */ - if (pR128->vbBufs) { - drmUnmapBufs(pR128->vbBufs); - pR128->vbBufs = NULL; + if (info->vbBufs) { + drmUnmapBufs(info->vbBufs); + info->vbBufs = NULL; } /* De-allocate all kernel resources */ - drmR128CleanupCCE(pR128->drmFD); + drmR128CleanupCCE(info->drmFD); /* De-allocate all AGP resources */ - if (pR128->agpTex) { - drmUnmap(pR128->agpTex, pR128->agpTexMapSize); - pR128->agpTex = NULL; + if (info->agpTex) { + drmUnmap(info->agpTex, info->agpTexMapSize); + info->agpTex = NULL; } - if (pR128->ind) { - drmUnmap(pR128->ind, pR128->indMapSize); - pR128->ind = NULL; + if (info->ind) { + drmUnmap(info->ind, info->indMapSize); + info->ind = NULL; } - if (pR128->vb) { - drmUnmap(pR128->vb, pR128->vbMapSize); - pR128->vb = NULL; + if (info->vb) { + drmUnmap(info->vb, info->vbMapSize); + info->vb = NULL; } - if (pR128->ringReadPtr) { - drmUnmap(pR128->ringReadPtr, pR128->ringReadMapSize); - pR128->ringReadPtr = NULL; + if (info->ringReadPtr) { + drmUnmap(info->ringReadPtr, info->ringReadMapSize); + info->ringReadPtr = NULL; } - if (pR128->ring) { - drmUnmap(pR128->ring, pR128->ringMapSize); - pR128->ring = NULL; + if (info->ring) { + drmUnmap(info->ring, info->ringMapSize); + info->ring = NULL; } - if (pR128->agpMemHandle) { - drmAgpUnbind(pR128->drmFD, pR128->agpMemHandle); - drmAgpFree(pR128->drmFD, pR128->agpMemHandle); - pR128->agpMemHandle = 0; - drmAgpRelease(pR128->drmFD); + if (info->agpMemHandle) { + drmAgpUnbind(info->drmFD, info->agpMemHandle); + drmAgpFree(info->drmFD, info->agpMemHandle); + info->agpMemHandle = 0; + drmAgpRelease(info->drmFD); } /* De-allocate all DRI resources */ DRICloseScreen(pScreen); /* De-allocate all DRI data structures */ - if (pR128->pDRIInfo) { - if (pR128->pDRIInfo->devPrivate) { - xfree(pR128->pDRIInfo->devPrivate); - pR128->pDRIInfo->devPrivate = NULL; + if (info->pDRIInfo) { + if (info->pDRIInfo->devPrivate) { + xfree(info->pDRIInfo->devPrivate); + info->pDRIInfo->devPrivate = NULL; } - DRIDestroyInfoRec(pR128->pDRIInfo); - pR128->pDRIInfo = NULL; + DRIDestroyInfoRec(info->pDRIInfo); + info->pDRIInfo = NULL; } - if (pR128->pVisualConfigs) { - xfree(pR128->pVisualConfigs); - pR128->pVisualConfigs = NULL; + if (info->pVisualConfigs) { + xfree(info->pVisualConfigs); + info->pVisualConfigs = NULL; } - if (pR128->pVisualConfigsPriv) { - xfree(pR128->pVisualConfigsPriv); - pR128->pVisualConfigsPriv = NULL; + if (info->pVisualConfigsPriv) { + xfree(info->pVisualConfigsPriv); + info->pVisualConfigsPriv = NULL; } } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_driver.c index 618abb408..a15f4f1b4 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_driver.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_driver.c,v 1.46 2000/09/20 00:09:26 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_driver.c,v 1.53 2000/10/18 17:20:00 alanh Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., @@ -70,7 +70,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "mipointer.h" #include "micmap.h" -#define USE_FB /* not until overlays and 24->32 code added */ +#define USE_FB /* not until overlays */ #ifdef USE_FB #include "fb.h" #else @@ -83,48 +83,10 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "cfb32.h" #include "cfb24_32.h" #endif - /* Xv support */ -#include "xf86xv.h" -#include "Xv.h" - - /* vgahw module (for VC save/restore only) */ -#include "vgaHW.h" - -#include "fbdevhw.h" - - /* XAA and Cursor Support */ -#include "xaa.h" -#include "xf86Cursor.h" - - - /* PCI support */ -#include "xf86PciInfo.h" -#include "xf86Pci.h" - - /* DDC support */ -#include "xf86DDC.h" - - /* VESA support */ -#include "vbe.h" - - /* DRI support */ -#ifdef XF86DRI -#include "GL/glxint.h" -#include "xf86drm.h" -#include "sarea.h" -#define _XF86DRI_SERVER_ -#include "xf86dri.h" -#include "dri.h" -#include "r128_dri.h" -#include "r128_dripriv.h" -#include "r128_sarea.h" -#endif - -#ifdef RENDER -#include "picturestr.h" -#endif /* Driver data structures */ +#include "ati2.h" #include "r128.h" +#include "r128_probe.h" #include "r128_reg.h" #ifndef MAX @@ -133,9 +95,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. /* Forward definitions for driver functions */ -static OptionInfoPtr R128AvailableOptions(int chipid, int busid); -static Bool R128Probe(DriverPtr drv, int flags); -static void R128Identify(int flags); static Bool R128PreInit(ScrnInfoPtr pScrn, int flags); static Bool R128ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv); @@ -155,16 +114,6 @@ static void R128DisplayPowerManagementSet(ScrnInfoPtr pScrn, static Bool R128EnterVTFBDev(int scrnIndex, int flags); static void R128LeaveVTFBDev(int scrnIndex, int flags); - /* Define driver */ -DriverRec R128 = { - R128_VERSION, - "ATI Rage 128", - R128Identify, - R128Probe, - R128AvailableOptions, - NULL -}; - /* Chipsets */ static SymTabRec R128Chipsets[] = { { PCI_CHIP_RAGE128RE, "ATI Rage 128 RE (PCI)" }, @@ -195,7 +144,6 @@ static PciChipsets R128PciChipsets[] = { typedef enum { OPTION_NOACCEL, OPTION_SW_CURSOR, - OPTION_HW_CURSOR, OPTION_DAC_6BIT, OPTION_DAC_8BIT, #ifdef XF86DRI @@ -216,13 +164,13 @@ typedef enum { #endif OPTION_PANEL_WIDTH, OPTION_PANEL_HEIGHT, + OPTION_PROG_FP_REGS, OPTION_FBDEV } R128Opts; static OptionInfoRec R128Options[] = { { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, TRUE }, { OPTION_DAC_6BIT, "Dac6Bit", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_DAC_8BIT, "Dac8Bit", OPTV_BOOLEAN, {0}, TRUE }, #ifdef XF86DRI @@ -243,6 +191,7 @@ static OptionInfoRec R128Options[] = { #endif { OPTION_PANEL_WIDTH, "PanelWidth", OPTV_INTEGER, {0}, FALSE }, { OPTION_PANEL_HEIGHT, "PanelHeight", OPTV_INTEGER, {0}, FALSE }, + { OPTION_PROG_FP_REGS, "ProgramFPRegs", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_FBDEV, "UseFBDev", OPTV_BOOLEAN, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -257,216 +206,9 @@ R128RAMRec R128RAM[] = { /* Memory Specifications { 4, 4, 3, 3, 2, 3, 1, 16, 12, "64-bit DDR SGRAM" }, }; -static const char *vgahwSymbols[] = { - "vgaHWGetHWRec", - "vgaHWFreeHWRec", - "vgaHWLock", - "vgaHWUnlock", - "vgaHWSave", - "vgaHWRestore", - NULL -}; - -static const char *fbdevHWSymbols[] = { - "fbdevHWInit", - "fbdevHWUseBuildinMode", - - "fbdevHWGetDepth", - "fbdevHWGetVidmem", - - /* colormap */ - "fbdevHWLoadPalette", - - /* ScrnInfo hooks */ - "fbdevHWSwitchMode", - "fbdevHWAdjustFrame", - "fbdevHWEnterVT", - "fbdevHWLeaveVT", - "fbdevHWValidMode", - "fbdevHWRestore", - "fbdevHWModeInit", - "fbdevHWSave", - - "fbdevHWUnmapMMIO", - "fbdevHWUnmapVidmem", - "fbdevHWMapMMIO", - "fbdevHWMapVidmem", - - NULL -}; - -static const char *ddcSymbols[] = { - "xf86PrintEDID", - "xf86DoEDID_DDC1", - "xf86DoEDID_DDC2", - NULL -}; - -#if 0 -static const char *i2cSymbols[] = { - "xf86CreateI2CBusRec", - "xf86I2CBusInit", - NULL -}; -#endif - -#ifdef XFree86LOADER -static const char *vbeSymbols[] = { - "VBEInit", - "vbeDoEDID", - NULL -}; - -#ifdef USE_FB -static const char *fbSymbols[] = { - "fbScreenInit", -#ifdef RENDER - "fbPictureInit", -#endif - NULL -}; -#else -static const char *cfbSymbols[] = { - "cfbScreenInit", - "cfb16ScreenInit", - "cfb24ScreenInit", - "cfb32ScreenInit", - "cfb24_32ScreenInit", - NULL -}; -#endif - -static const char *xf8_32bppSymbols[] = { - "xf86Overlay8Plus32Init", - NULL -}; - -static const char *xaaSymbols[] = { - "XAADestroyInfoRec", - "XAACreateInfoRec", - "XAAInit", - "XAAStippleScanlineFuncLSBFirst", - "XAAOverlayFBfuncs", - "XAACachePlanarMonoStipple", - "XAAScreenIndex", - NULL -}; - -static const char *ramdacSymbols[] = { - "xf86InitCursor", - "xf86CreateCursorInfoRec", - "xf86DestroyCursorInfoRec", - NULL -}; - -#ifdef XF86DRI -static const char *drmSymbols[] = { - "drmAddBufs", - "drmAddMap", - "drmAvailable", - "drmCtlAddCommand", - "drmCtlInstHandler", - "drmGetInterruptFromBusID", - "drmMapBufs", - "drmMarkBufs", - "drmUnmapBufs", - "drmFreeVersion", - "drmGetVersion", - NULL -}; - -static const char *driSymbols[] = { - "DRIGetDrawableIndex", - "DRIFinishScreenInit", - "DRIDestroyInfoRec", - "DRICloseScreen", - "DRIDestroyInfoRec", - "DRIScreenInit", - "DRIDestroyInfoRec", - "DRICreateInfoRec", - "DRILock", - "DRIUnlock", - "DRIGetSAREAPrivate", - "DRIGetContext", - "DRIQueryVersion", - "GlxSetVisualConfigs", - NULL -}; -#endif - -static MODULESETUPPROTO(R128Setup); - -static XF86ModuleVersionInfo R128VersRec = -{ - R128_NAME, - MODULEVENDORSTRING, - MODINFOSTRING1, - MODINFOSTRING2, - XF86_VERSION_CURRENT, - R128_VERSION_MAJOR, R128_VERSION_MINOR, R128_VERSION_PATCH, - ABI_CLASS_VIDEODRV, - ABI_VIDEODRV_VERSION, - MOD_CLASS_VIDEODRV, - { 0, 0, 0, 0 } -}; - -XF86ModuleData r128ModuleData = { &R128VersRec, R128Setup, 0 }; - -static pointer R128Setup(pointer module, pointer opts, int *errmaj, - int *errmin) -{ - static Bool setupDone = FALSE; - - /* This module should be loaded only once, but check to be sure. */ - - if (!setupDone) { - setupDone = TRUE; - xf86AddDriver(&R128, module, 0); - - /* - * Modules that this driver always requires may be loaded here - * by calling LoadSubModule(). - */ - /* FIXME: add DRI support here */ - - /* - * Tell the loader about symbols from other modules that this module - * might refer to. - */ - LoaderRefSymLists(vgahwSymbols, -#ifdef USE_FB - fbSymbols, -#else - cfbSymbols, -#endif - xaaSymbols, - xf8_32bppSymbols, - ramdacSymbols, -#ifdef XF86DRI - drmSymbols, - driSymbols, -#endif - fbdevHWSymbols, - vbeSymbols, -#if 0 - NULL /* ddcsymbols */, - NULL /* i2csymbols */, - NULL /* shadowSymbols */, -#endif - NULL); - - /* - * The return value must be non-NULL on success even though there - * is no TearDownProc. - */ - return (pointer)1; - } else { - if (errmaj) *errmaj = LDR_ONCEONLY; - return NULL; - } -} - -#endif +extern const char *vgahwSymbols[]; +extern const char *fbdevHWSymbols[]; +extern const char *ddcSymbols[]; /* Allocate our private R128InfoRec. */ static Bool R128GetRec(ScrnInfoPtr pScrn) @@ -571,9 +313,10 @@ static Bool R128UnmapMem(ScrnInfoPtr pScrn) } /* Read PLL information */ -int INPLL(ScrnInfoPtr pScrn, int addr) +int R128INPLL(ScrnInfoPtr pScrn, int addr) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTREG8(R128_CLOCK_CNTL_INDEX, addr & 0x1f); return INREG(R128_CLOCK_CNTL_DATA); @@ -581,9 +324,10 @@ int INPLL(ScrnInfoPtr pScrn, int addr) #if 0 /* Read PAL information (only used for debugging). */ -static int INPAL(int idx) +static int R128INPAL(int idx) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTREG(R128_PALETTE_INDEX, idx << 16); return INREG(R128_PALETTE_DATA); @@ -593,21 +337,21 @@ static int INPAL(int idx) /* Wait for vertical sync. */ void R128WaitForVerticalSync(ScrnInfoPtr pScrn) { - int i; - R128MMIO_VARS(); - unsigned int j; + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int i; OUTREG(R128_GEN_INT_STATUS, R128_VSYNC_INT_AK); for (i = 0; i < R128_TIMEOUT; i++) { - j = INREG(R128_GEN_INT_STATUS); - if (j & R128_VSYNC_INT) break; + if (INREG(R128_GEN_INT_STATUS) & R128_VSYNC_INT) break; } } /* Blank screen. */ static void R128Blank(ScrnInfoPtr pScrn) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTREGP(R128_CRTC_EXT_CNTL, R128_CRTC_DISPLAY_DIS, ~R128_CRTC_DISPLAY_DIS); } @@ -615,7 +359,8 @@ static void R128Blank(ScrnInfoPtr pScrn) /* Unblank screen. */ static void R128Unblank(ScrnInfoPtr pScrn) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTREGP(R128_CRTC_EXT_CNTL, 0, ~R128_CRTC_DISPLAY_DIS); } @@ -643,9 +388,9 @@ static Bool R128GetBIOSParameters(ScrnInfoPtr pScrn) int i; int FPHeader = 0; -#define R128ReadBIOS(offset, buffer, length) \ - (info->BIOSFromPCI ? \ - xf86ReadPciBIOS(offset, info->PciTag, 0, buffer, length) : \ +#define R128ReadBIOS(offset, buffer, length) \ + (info->BIOSFromPCI ? \ + xf86ReadPciBIOS(offset, info->PciTag, 0, buffer, length) : \ xf86ReadBIOS(info->BIOSAddr, offset, buffer, length)) #define R128_BIOS8(v) (*((CARD8 *)(info->VBIOS + (v)))) @@ -757,6 +502,7 @@ static Bool R128GetPLLParameters(ScrnInfoPtr pScrn) CARD16 bios_header; CARD16 pll_info_block; + if (!info->VBIOS) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Video BIOS not detected, using default PLL parameters!\n"); @@ -793,15 +539,22 @@ static Bool R128GetPLLParameters(ScrnInfoPtr pScrn) return TRUE; } -static -OptionInfoPtr -R128AvailableOptions(int chipid, int busid) +/* Return the options for supported chipset 'n'; NULL otherwise. */ +OptionInfoPtr R128AvailableOptions(int chipid, int busid) { - return R128Options; + int i; + + /* Check to make sure that chip 'chipid' is supported by the Rage + 128 driver */ + for (i = 0; R128PciChipsets[i].PCIid > 0; i++) { + if (chipid == R128PciChipsets[i].PCIid) + return R128Options; + } + return NULL; } /* Return the string name for supported chipset 'n'; NULL otherwise. */ -static void R128Identify(int flags) +void R128Identify(int flags) { xf86PrintChipsets(R128_NAME, "Driver for ATI Rage 128 chipset", @@ -809,7 +562,7 @@ static void R128Identify(int flags) } /* Return TRUE if chipset is present; FALSE otherwise. */ -static Bool R128Probe(DriverPtr drv, int flags) +Bool R128Probe(DriverPtr drv, int flags) { int numUsed; int numDevSections; @@ -819,8 +572,11 @@ static Bool R128Probe(DriverPtr drv, int flags) Bool foundScreen = FALSE; int i; + /* Check to make sure that the R128_NAME or the ATI2_NAME is listed + as the Driver in the "Device" section of the XF86Config file */ if ((numDevSections = xf86MatchDevice(R128_NAME, &devSections)) <= 0) - return FALSE; + if ((numDevSections = xf86MatchDevice(ATI2_NAME, &devSections)) <= 0) + return FALSE; if (!xf86GetPciVideoInfo()) return FALSE; @@ -843,7 +599,7 @@ static Bool R128Probe(DriverPtr drv, int flags) if (pEnt->active) { ScrnInfoPtr pScrn = xf86AllocateScreen(drv, 0); - pScrn->driverVersion = R128_VERSION; + pScrn->driverVersion = ATI2_VERSION; pScrn->driverName = R128_NAME; pScrn->name = R128_NAME; pScrn->Probe = R128Probe; @@ -877,9 +633,7 @@ static Bool R128PreInitVisual(ScrnInfoPtr pScrn) if (!xf86SetDepthBpp(pScrn, 8, 8, 8, (Support24bppFb | Support32bppFb -#ifndef USE_FB | SupportConvert32to24 -#endif ))) return FALSE; @@ -961,12 +715,12 @@ static Bool R128PreInitWeight(ScrnInfoPtr pScrn) If memory type ever needs an override, put it in this routine. */ static Bool R128PreInitConfig(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); - EntityInfoPtr pEnt = info->pEnt; - GDevPtr dev = pEnt->device; - int offset = 0; /* RAM Type */ + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + EntityInfoPtr pEnt = info->pEnt; + GDevPtr dev = pEnt->device; + int offset = 0; /* RAM Type */ MessageType from; - unsigned char *R128MMIO; /* Chipset */ from = X_PROBED; @@ -1051,18 +805,26 @@ static Bool R128PreInitConfig(ScrnInfoPtr pScrn) } /* Flat panel (part 1) */ - /* FIXME: Make this an option */ - switch (info->Chipset) { - case PCI_CHIP_RAGE128LE: - case PCI_CHIP_RAGE128LF: - case PCI_CHIP_RAGE128MF: - case PCI_CHIP_RAGE128ML: info->HasPanelRegs = TRUE; break; - case PCI_CHIP_RAGE128RE: - case PCI_CHIP_RAGE128RF: - case PCI_CHIP_RAGE128RK: - case PCI_CHIP_RAGE128RL: - case PCI_CHIP_RAGE128PF: - default: info->HasPanelRegs = FALSE; break; + if (xf86GetOptValBool(R128Options, OPTION_PROG_FP_REGS, + &info->HasPanelRegs)) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Turned flat panel register programming %s\n", + info->HasPanelRegs ? "on" : "off"); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "\n\nWARNING: Forcing the driver to use/not use the flat panel registers\nmight damage your flat panel. Use at your *OWN* *RISK*.\n\n"); + } else { + switch (info->Chipset) { + case PCI_CHIP_RAGE128LE: + case PCI_CHIP_RAGE128LF: + case PCI_CHIP_RAGE128MF: + case PCI_CHIP_RAGE128ML: info->HasPanelRegs = TRUE; break; + case PCI_CHIP_RAGE128RE: + case PCI_CHIP_RAGE128RF: + case PCI_CHIP_RAGE128RK: + case PCI_CHIP_RAGE128RL: + case PCI_CHIP_RAGE128PF: + default: info->HasPanelRegs = FALSE; break; + } } /* Read registers used to determine options */ @@ -1074,6 +836,7 @@ static Bool R128PreInitConfig(ScrnInfoPtr pScrn) else pScrn->videoRam = INREG(R128_CONFIG_MEMSIZE) / 1024; info->MemCntl = INREG(R128_MEM_CNTL); + info->BusCntl = INREG(R128_BUS_CNTL); R128MMIO = NULL; R128UnmapMMIO(pScrn); @@ -1119,6 +882,7 @@ static Bool R128PreInitConfig(ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using flat panel for display\n"); #else + /* Panel CRT mode override */ if ((info->CRTOnly = xf86ReturnOptValBool(R128Options, OPTION_CRT, FALSE))) { xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, @@ -1129,11 +893,8 @@ static Bool R128PreInitConfig(ScrnInfoPtr pScrn) "Using flat panel for display\n"); } #endif - } else { - info->CRTOnly = FALSE; - } - if (info->HasPanelRegs) { + /* Panel width/height overrides */ info->PanelXRes = 0; info->PanelYRes = 0; if (xf86GetOptValInteger(R128Options, @@ -1146,6 +907,8 @@ static Bool R128PreInitConfig(ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Flat panel height: %d\n", info->PanelYRes); } + } else { + info->CRTOnly = FALSE; } #ifdef XF86DRI @@ -1181,7 +944,7 @@ static Bool R128PreInitDDC(ScrnInfoPtr pScrn) xf86LoaderReqSymLists(ddcSymbols, NULL); if (xf86LoadSubModule(pScrn, "vbe")) { pVbe = VBEInit(NULL,info->pEnt->index); - if (!pVbe) return NULL; + if (!pVbe) return FALSE; xf86SetDDCproperties(pScrn,xf86PrintEDID(vbeDoEDID(pVbe,NULL))); return TRUE; @@ -1572,11 +1335,11 @@ static Bool R128PreInit(ScrnInfoPtr pScrn, int flags) static void R128LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, LOCO *colors, VisualPtr pVisual) { - R128InfoPtr info = R128PTR(pScrn); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; int i; int idx; unsigned char r, g, b; - R128MMIO_VARS(); /* Select palette 0 (main CRTC) if using FP-enabled chip */ if (info->HasPanelRegs) PAL_SELECT(0); @@ -1677,7 +1440,7 @@ static Bool R128ScreenInit(int scrnIndex, ScreenPtr pScreen, if (!xf86ReturnOptValBool(R128Options, OPTION_NOACCEL, FALSE) && (maxy > pScrn->virtualY * 3) -#if 1 +#if 0 /* FIXME: Disable 3D support for FPs until it is tested */ && !info->HasPanelRegs #endif @@ -1769,7 +1532,8 @@ static Bool R128ScreenInit(int scrnIndex, ScreenPtr pScreen, MemBox.x1 = 0; MemBox.y1 = 0; MemBox.x2 = pScrn->displayWidth; - y2 = info->FbMapSize / (pScrn->displayWidth * info->CurrentLayout.pixel_bytes); + y2 = (info->FbMapSize + / (pScrn->displayWidth * info->CurrentLayout.pixel_bytes)); if (y2 >= 32768) y2 = 32767; /* because MemBox.y2 is signed short */ MemBox.y2 = y2; @@ -1932,6 +1696,9 @@ static Bool R128ScreenInit(int scrnIndex, ScreenPtr pScreen, miInitializeBackingStore(pScreen); xf86SetBackingStore(pScreen); + /* Set Silken Mouse */ + xf86SetSilkenMouse(pScreen); + /* Acceleration setup */ if (!xf86ReturnOptValBool(R128Options, OPTION_NOACCEL, FALSE)) { if (R128AccelInit(pScreen)) { @@ -1992,16 +1759,7 @@ static Bool R128ScreenInit(int scrnIndex, ScreenPtr pScreen, xf86DPMSInit(pScreen, R128DisplayPowerManagementSet, 0); #endif - /* Xv setup */ -#ifdef XvExtension - { - XF86VideoAdaptorPtr *ptr; - int n; - - if ((n = xf86XVListGenericAdaptors(pScrn, &ptr))) - xf86XVScreenInit(pScreen, ptr, n); - } -#endif + R128InitVideo(pScreen); /* Provide SaveScreen */ pScreen->SaveScreen = R128SaveScreen; @@ -2035,7 +1793,8 @@ static Bool R128ScreenInit(int scrnIndex, ScreenPtr pScreen, /* Write common registers (initialized to 0). */ static void R128RestoreCommonRegisters(ScrnInfoPtr pScrn, R128SavePtr restore) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTREG(R128_OVR_CLR, restore->ovr_clr); OUTREG(R128_OVR_WID_LEFT_RIGHT, restore->ovr_wid_left_right); @@ -2055,7 +1814,8 @@ static void R128RestoreCommonRegisters(ScrnInfoPtr pScrn, R128SavePtr restore) /* Write CRTC registers. */ static void R128RestoreCrtcRegisters(ScrnInfoPtr pScrn, R128SavePtr restore) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTREG(R128_CRTC_GEN_CNTL, restore->crtc_gen_cntl); @@ -2077,8 +1837,9 @@ static void R128RestoreCrtcRegisters(ScrnInfoPtr pScrn, R128SavePtr restore) /* Write flat panel registers */ static void R128RestoreFPRegisters(ScrnInfoPtr pScrn, R128SavePtr restore) { - CARD32 tmp; - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + CARD32 tmp; OUTREG(R128_CRTC2_GEN_CNTL, restore->crtc2_gen_cntl); OUTREG(R128_FP_CRTC_H_TOTAL_DISP, restore->fp_crtc_h_total_disp); @@ -2115,7 +1876,8 @@ static void R128PLLWaitForReadUpdateComplete(ScrnInfoPtr pScrn) static void R128PLLWriteUpdate(ScrnInfoPtr pScrn) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTPLLP(pScrn, R128_PPLL_REF_DIV, R128_PPLL_ATOMIC_UPDATE_W, 0xffff); } @@ -2123,7 +1885,8 @@ static void R128PLLWriteUpdate(ScrnInfoPtr pScrn) /* Write PLL registers. */ static void R128RestorePLLRegisters(ScrnInfoPtr pScrn, R128SavePtr restore) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTREGP(R128_CLOCK_CNTL_INDEX, R128_PLL_DIV_SEL, 0xffff); @@ -2167,7 +1930,8 @@ static void R128RestorePLLRegisters(ScrnInfoPtr pScrn, R128SavePtr restore) /* Write DDA registers. */ static void R128RestoreDDARegisters(ScrnInfoPtr pScrn, R128SavePtr restore) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; OUTREG(R128_DDA_CONFIG, restore->dda_config); OUTREG(R128_DDA_ON_OFF, restore->dda_on_off); @@ -2176,9 +1940,9 @@ static void R128RestoreDDARegisters(ScrnInfoPtr pScrn, R128SavePtr restore) /* Write palette data. */ static void R128RestorePalette(ScrnInfoPtr pScrn, R128SavePtr restore) { - R128InfoPtr info = R128PTR(pScrn); - int i; - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int i; if (!restore->palette_valid) return; @@ -2208,7 +1972,8 @@ static void R128RestoreMode(ScrnInfoPtr pScrn, R128SavePtr restore) /* Read common registers. */ static void R128SaveCommonRegisters(ScrnInfoPtr pScrn, R128SavePtr save) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; save->ovr_clr = INREG(R128_OVR_CLR); save->ovr_wid_left_right = INREG(R128_OVR_WID_LEFT_RIGHT); @@ -2228,7 +1993,8 @@ static void R128SaveCommonRegisters(ScrnInfoPtr pScrn, R128SavePtr save) /* Read CRTC registers. */ static void R128SaveCrtcRegisters(ScrnInfoPtr pScrn, R128SavePtr save) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; save->crtc_gen_cntl = INREG(R128_CRTC_GEN_CNTL); save->crtc_ext_cntl = INREG(R128_CRTC_EXT_CNTL); @@ -2245,7 +2011,8 @@ static void R128SaveCrtcRegisters(ScrnInfoPtr pScrn, R128SavePtr save) /* Read flat panel registers */ static void R128SaveFPRegisters(ScrnInfoPtr pScrn, R128SavePtr save) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; save->crtc2_gen_cntl = INREG(R128_CRTC2_GEN_CNTL); save->fp_crtc_h_total_disp = INREG(R128_FP_CRTC_H_TOTAL_DISP); @@ -2280,7 +2047,8 @@ static void R128SavePLLRegisters(ScrnInfoPtr pScrn, R128SavePtr save) /* Read DDA registers. */ static void R128SaveDDARegisters(ScrnInfoPtr pScrn, R128SavePtr save) { - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; save->dda_config = INREG(R128_DDA_CONFIG); save->dda_on_off = INREG(R128_DDA_ON_OFF); @@ -2289,9 +2057,9 @@ static void R128SaveDDARegisters(ScrnInfoPtr pScrn, R128SavePtr save) /* Read palette data. */ static void R128SavePalette(ScrnInfoPtr pScrn, R128SavePtr save) { - R128InfoPtr info = R128PTR(pScrn); - int i; - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int i; /* Select palette 0 (main CRTC) if using FP-enabled chip */ if (info->HasPanelRegs) PAL_SELECT(0); @@ -2320,10 +2088,10 @@ static void R128SaveMode(ScrnInfoPtr pScrn, R128SavePtr save) /* Save everything needed to restore the original VC state. */ static void R128Save(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); - R128SavePtr save = &info->SavedReg; - vgaHWPtr hwp = VGAHWPTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + R128SavePtr save = &info->SavedReg; + vgaHWPtr hwp = VGAHWPTR(pScrn); R128TRACE(("R128Save\n")); if (info->FBDev) { @@ -2346,10 +2114,10 @@ static void R128Save(ScrnInfoPtr pScrn) /* Restore the original (text) mode. */ static void R128Restore(ScrnInfoPtr pScrn) { - R128InfoPtr info = R128PTR(pScrn); - R128SavePtr restore = &info->SavedReg; - vgaHWPtr hwp = VGAHWPTR(pScrn); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + R128SavePtr restore = &info->SavedReg; + vgaHWPtr hwp = VGAHWPTR(pScrn); R128TRACE(("R128Restore\n")); if (info->FBDev) { @@ -2872,10 +2640,10 @@ static int R128ValidMode(int scrnIndex, DisplayModePtr mode, is (x,y) in virtual space. */ void R128AdjustFrame(int scrnIndex, int x, int y, int flags) { - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; - R128InfoPtr info = R128PTR(pScrn); + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; int Base; - R128MMIO_VARS(); Base = y * info->CurrentLayout.displayWidth + x; @@ -2898,7 +2666,7 @@ void R128AdjustFrame(int scrnIndex, int x, int y, int flags) mode. */ static Bool R128EnterVT(int scrnIndex, int flags) { - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; R128InfoPtr info = R128PTR(pScrn); R128TRACE(("R128EnterVT\n")); @@ -3015,10 +2783,11 @@ static void R128FreeScreen(int scrnIndex, int flags) static void R128DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags) { - int mask = (R128_CRTC_DISPLAY_DIS - | R128_CRTC_HSYNC_DIS - | R128_CRTC_VSYNC_DIS); - R128MMIO_VARS(); + R128InfoPtr info = R128PTR(pScrn); + unsigned char *R128MMIO = info->MMIO; + int mask = (R128_CRTC_DISPLAY_DIS + | R128_CRTC_HSYNC_DIS + | R128_CRTC_VSYNC_DIS); switch (PowerManagementMode) { case DPMSModeOn: diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_probe.h b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_probe.h new file mode 100644 index 000000000..35460505d --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_probe.h @@ -0,0 +1,42 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_probe.h,v 1.2 2000/10/23 21:16:49 tsi Exp $ */ +/************************************************************************** + +Copyright 2000 ATI Technologies Inc. and VA Linux Systems, Inc., + Sunnyvale, California. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +on the rights to use, copy, modify, merge, publish, distribute, sub +license, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin <martin@valinux.com> + * + */ + +#ifndef _R128_PROBE_H_ +#define _R128_PROBE_H_ + +extern OptionInfoPtr R128AvailableOptions(int chipid, int busid); +extern void R128Identify(int flags); +extern Bool R128Probe(DriverPtr drv, int flags); + +#endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_reg.h b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_reg.h index e8ff8b915..8bf906a92 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_reg.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_reg.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_reg.h,v 1.13 2000/09/13 15:47:32 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_reg.h,v 1.15 2000/10/18 17:20:01 alanh Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., @@ -56,9 +56,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #define ADDRREG(addr) ((volatile CARD32 *)(R128MMIO + (addr))) -#define R128MMIO_VARS() \ - unsigned char *R128MMIO = R128PTR(pScrn)->MMIO - #define OUTREGP(addr, val, mask) \ do { \ @@ -68,6 +65,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. OUTREG(addr, tmp); \ } while (0) +#define INPLL(pScrn, addr) R128INPLL(pScrn, addr) + #define OUTPLL(addr, val) \ do { \ OUTREG8(R128_CLOCK_CNTL_INDEX, ((addr) & 0x1f) | R128_PLL_WR_EN); \ @@ -271,6 +270,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #define R128_CLR_CMP_CLR_DST 0x15c8 #define R128_CLR_CMP_CLR_SRC 0x15c4 #define R128_CLR_CMP_CNTL 0x15c0 +# define R128_SRC_CMP_EQ_COLOR (4 << 0) # define R128_SRC_CMP_NEQ_COLOR (5 << 0) # define R128_CLR_CMP_SRC_SOURCE (1 << 24) #define R128_CLR_CMP_MASK 0x15cc @@ -688,11 +688,123 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #define R128_N_VIF_COUNT 0x0248 -#define R128_OV0_SCALE_CNTL 0x0420 /* ? */ #define R128_OVR_CLR 0x0230 #define R128_OVR_WID_LEFT_RIGHT 0x0234 #define R128_OVR_WID_TOP_BOTTOM 0x0238 +/* first overlay unit (there is only one) */ + +#define R128_OV0_Y_X_START 0x0400 +#define R128_OV0_Y_X_END 0x0404 +#define R128_OV0_EXCLUSIVE_HORZ 0x0408 +# define R128_EXCL_HORZ_START_MASK 0x000000ff +# define R128_EXCL_HORZ_END_MASK 0x0000ff00 +# define R128_EXCL_HORZ_BACK_PORCH_MASK 0x00ff0000 +# define R128_EXCL_HORZ_EXCLUSIVE_EN 0x80000000 +#define R128_OV0_EXCLUSIVE_VERT 0x040C +# define R128_EXCL_VERT_START_MASK 0x000003ff +# define R128_EXCL_VERT_END_MASK 0x03ff0000 +#define R128_OV0_REG_LOAD_CNTL 0x0410 +# define R128_REG_LD_CTL_LOCK 0x00000001L +# define R128_REG_LD_CTL_VBLANK_DURING_LOCK 0x00000002L +# define R128_REG_LD_CTL_STALL_GUI_UNTIL_FLIP 0x00000004L +# define R128_REG_LD_CTL_LOCK_READBACK 0x00000008L +#define R128_OV0_SCALE_CNTL 0x0420 +# define R128_SCALER_PIX_EXPAND 0x00000001L +# define R128_SCALER_Y2R_TEMP 0x00000002L +# define R128_SCALER_HORZ_PICK_NEAREST 0x00000003L +# define R128_SCALER_VERT_PICK_NEAREST 0x00000004L +# define R128_SCALER_SIGNED_UV 0x00000010L +# define R128_SCALER_GAMMA_SEL_MASK 0x00000060L +# define R128_SCALER_GAMMA_SEL_BRIGHT 0x00000000L +# define R128_SCALER_GAMMA_SEL_G22 0x00000020L +# define R128_SCALER_GAMMA_SEL_G18 0x00000040L +# define R128_SCALER_GAMMA_SEL_G14 0x00000060L +# define R128_SCALER_COMCORE_SHIFT_UP_ONE 0x00000080L +# define R128_SCALER_SURFAC_FORMAT 0x00000f00L +# define R128_SCALER_SOURCE_15BPP 0x00000300L +# define R128_SCALER_SOURCE_16BPP 0x00000400L +# define R128_SCALER_SOURCE_32BPP 0x00000600L +# define R128_SCALER_SOURCE_YUV9 0x00000900L +# define R128_SCALER_SOURCE_YUV12 0x00000A00L +# define R128_SCALER_SOURCE_VYUY422 0x00000B00L +# define R128_SCALER_SOURCE_YVYU422 0x00000C00L +# define R128_SCALER_SMART_SWITCH 0x00008000L +# define R128_SCALER_BURST_PER_PLANE 0x00ff0000L +# define R128_SCALER_DOUBLE_BUFFER 0x01000000L +# define R128_SCALER_DIS_LIMIT 0x08000000L +# define R128_SCALER_PRG_LOAD_START 0x10000000L +# define R128_SCALER_INT_EMU 0x20000000L +# define R128_SCALER_ENABLE 0x40000000L +# define R128_SCALER_SOFT_RESET 0x80000000L +#define R128_OV0_V_INC 0x0424 +#define R128_OV0_P1_V_ACCUM_INIT 0x0428 +# define R128_OV0_P1_MAX_LN_IN_PER_LN_OUT 0x00000003L +# define R128_OV0_P1_V_ACCUM_INIT_MASK 0x01ff8000L +#define R128_OV0_P23_V_ACCUM_INIT 0x042C +#define R128_OV0_P1_BLANK_LINES_AT_TOP 0x0430 +# define R128_P1_BLNK_LN_AT_TOP_M1_MASK 0x00000fffL +# define R128_P1_ACTIVE_LINES_M1 0x0fff0000L +#define R128_OV0_P23_BLANK_LINES_AT_TOP 0x0434 +# define R128_P23_BLNK_LN_AT_TOP_M1_MASK 0x000007ffL +# define R128_P23_ACTIVE_LINES_M1 0x07ff0000L +#define R128_OV0_VID_BUF0_BASE_ADRS 0x0440 +# define R128_VIF_BUF0_PITCH_SEL 0x00000001L +# define R128_VIF_BUF0_TILE_ADRS 0x00000002L +# define R128_VIF_BUF0_BASE_ADRS_MASK 0x03fffff0L +# define R128_VIF_BUF0_1ST_LINE_LSBS_MASK 0x48000000L +#define R128_OV0_VID_BUF1_BASE_ADRS 0x0444 +# define R128_VIF_BUF1_PITCH_SEL 0x00000001L +# define R128_VIF_BUF1_TILE_ADRS 0x00000002L +# define R128_VIF_BUF1_BASE_ADRS_MASK 0x03fffff0L +# define R128_VIF_BUF1_1ST_LINE_LSBS_MASK 0x48000000L +#define R128_OV0_VID_BUF2_BASE_ADRS 0x0448 +# define R128_VIF_BUF2_PITCH_SEL 0x00000001L +# define R128_VIF_BUF2_TILE_ADRS 0x00000002L +# define R128_VIF_BUF2_BASE_ADRS_MASK 0x03fffff0L +# define R128_VIF_BUF2_1ST_LINE_LSBS_MASK 0x48000000L +#define R128_OV0_VID_BUF3_BASE_ADRS 0x044C +#define R128_OV0_VID_BUF4_BASE_ADRS 0x0450 +#define R128_OV0_VID_BUF5_BASE_ADRS 0x0454 +#define R128_OV0_VID_BUF_PITCH0_VALUE 0x0460 +#define R128_OV0_VID_BUF_PITCH1_VALUE 0x0464 +#define R128_OV0_AUTO_FLIP_CNTL 0x0470 +#define R128_OV0_DEINTERLACE_PATTERN 0x0474 +#define R128_OV0_H_INC 0x0480 +#define R128_OV0_STEP_BY 0x0484 +#define R128_OV0_P1_H_ACCUM_INIT 0x0488 +#define R128_OV0_P23_H_ACCUM_INIT 0x048C +#define R128_OV0_P1_X_START_END 0x0494 +#define R128_OV0_P2_X_START_END 0x0498 +#define R128_OV0_P3_X_START_END 0x049C +#define R128_OV0_FILTER_CNTL 0x04A0 +#define R128_OV0_FOUR_TAP_COEF_0 0x04B0 +#define R128_OV0_FOUR_TAP_COEF_1 0x04B4 +#define R128_OV0_FOUR_TAP_COEF_2 0x04B8 +#define R128_OV0_FOUR_TAP_COEF_3 0x04BC +#define R128_OV0_FOUR_TAP_COEF_4 0x04C0 +#define R128_OV0_COLOUR_CNTL 0x04E0 +#define R128_OV0_VIDEO_KEY_CLR 0x04E4 +#define R128_OV0_VIDEO_KEY_MSK 0x04E8 +#define R128_OV0_GRAPHICS_KEY_CLR 0x04EC +#define R128_OV0_GRAPHICS_KEY_MSK 0x04F0 +#define R128_OV0_KEY_CNTL 0x04F4 +# define R128_VIDEO_KEY_FN_MASK 0x00000007L +# define R128_VIDEO_KEY_FN_FALSE 0x00000000L +# define R128_VIDEO_KEY_FN_TRUE 0x00000001L +# define R128_VIDEO_KEY_FN_EQ 0x00000004L +# define R128_VIDEO_KEY_FN_NE 0x00000005L +# define R128_GRAPHIC_KEY_FN_MASK 0x00000070L +# define R128_GRAPHIC_KEY_FN_FALSE 0x00000000L +# define R128_GRAPHIC_KEY_FN_TRUE 0x00000010L +# define R128_GRAPHIC_KEY_FN_EQ 0x00000040L +# define R128_GRAPHIC_KEY_FN_NE 0x00000050L +# define R128_CMP_MIX_MASK 0x00000100L +# define R128_CMP_MIX_OR 0x00000000L +# define R128_CMP_MIX_AND 0x00000100L +#define R128_OV0_TEST 0x04F8 + + #define R128_PALETTE_DATA 0x00b4 #define R128_PALETTE_INDEX 0x00b0 #define R128_PC_DEBUG_MODE 0x1760 diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_sarea.h b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_sarea.h index 2af80d140..dcfba4084 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_sarea.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/r128_sarea.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_sarea.h,v 1.1 2000/06/17 00:03:23 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/r128_sarea.h,v 1.2 2000/10/18 17:20:01 alanh Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon.h b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon.h new file mode 100644 index 000000000..530d2b039 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon.h @@ -0,0 +1,411 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/radeon.h,v 1.2 2000/10/23 21:16:49 tsi Exp $ */ +/************************************************************************** + +Copyright 2000 ATI Technologies Inc. and VA Linux Systems, Inc., + Sunnyvale, California. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +on the rights to use, copy, modify, merge, publish, distribute, sub +license, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin <martin@valinux.com> + * Rickard E. Faith <faith@valinux.com> + * + */ + +#ifndef _RADEON_H_ +#define _RADEON_H_ + + /* Xv support */ +#include "xf86xv.h" +#include "Xv.h" + + /* vgahw module (for VC save/restore only) */ +#include "vgaHW.h" + +#include "fbdevhw.h" + + /* XAA and Cursor Support */ +#include "xaa.h" +#include "xaalocal.h" +#include "xf86Cursor.h" + + + /* PCI support */ +#include "xf86PciInfo.h" +#include "xf86Pci.h" + + /* DDC support */ +#include "xf86DDC.h" + + /* VESA support */ +#include "vbe.h" + + /* DRI support */ +#ifdef XF86DRI +#include "GL/glxint.h" +#include "xf86drm.h" +#include "sarea.h" +#define _XF86DRI_SERVER_ +#include "xf86dri.h" +#include "dri.h" +#include "r128_dri.h" +#include "r128_dripriv.h" +#include "r128_sarea.h" +#endif + +#ifdef RENDER +#include "picturestr.h" +#endif + +/* NOTE: Turn off DRI until it is working */ +#ifdef XF86DRI +#undef XF86DRI +#endif + +#define RADEON_DEBUG 0 /* Turn off debugging output */ +#define RADEON_TIMEOUT 2000000 /* Fall out of wait loops after this count */ +#define RADEON_MMIOSIZE 0x80000 +/* Atomic updates of PLL clock don't seem to always work and stick, thus + * the bit never resets. Here - we use our own check by reading back the + * register we've just wrote to make sure it's got the Right! value */ +#define RADEON_ATOMIC_UPDATE 0 /* Use PLL Atomic updates (seems broken) */ + +#define RADEON_VBIOS_SIZE 0x00010000 + + /* RADEON_NAME is used for the server-side + ddx driver, the client-side DRI driver, + and the kernel-level DRM driver. */ +#define RADEON_NAME "radeon" + +#if RADEON_DEBUG +#define RADEONTRACE(x) \ + do { \ + ErrorF("(**) %s(%d): ", RADEON_NAME, pScrn->scrnIndex); \ + ErrorF x; \ + } while (0); +#else +#define RADEONTRACE(x) +#endif + + +/* Other macros */ +#define RADEON_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) +#define RADEON_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1)) +#define RADEONPTR(pScrn) ((RADEONInfoPtr)(pScrn)->driverPrivate) + +typedef struct { /* All values in XCLKS */ + int ML; /* Memory Read Latency */ + int MB; /* Memory Burst Length */ + int Trcd; /* RAS to CAS delay */ + int Trp; /* RAS percentage */ + int Twr; /* Write Recovery */ + int CL; /* CAS Latency */ + int Tr2w; /* Read to Write Delay */ + int Rloop; /* Loop Latency */ + int Rloop_fudge; /* Add to ML to get Rloop */ + char *name; +} RADEONRAMRec, *RADEONRAMPtr; + +typedef struct { + /* Common registers */ + CARD32 ovr_clr; + CARD32 ovr_wid_left_right; + CARD32 ovr_wid_top_bottom; + CARD32 ov0_scale_cntl; + CARD32 mpp_tb_config; + CARD32 mpp_gp_config; + CARD32 subpic_cntl; + CARD32 viph_control; + CARD32 i2c_cntl_1; + CARD32 gen_int_cntl; + CARD32 cap0_trig_cntl; + CARD32 cap1_trig_cntl; + CARD32 bus_cntl; + + /* Other registers to save for VT switches */ + CARD32 dp_datatype; + CARD32 rbbm_soft_reset; + CARD32 clock_cntl_index; + CARD32 amcgpio_en_reg; + CARD32 amcgpio_mask; + + /* CRTC registers */ + CARD32 crtc_gen_cntl; + CARD32 crtc_ext_cntl; + CARD32 dac_cntl; + CARD32 crtc_h_total_disp; + CARD32 crtc_h_sync_strt_wid; + CARD32 crtc_v_total_disp; + CARD32 crtc_v_sync_strt_wid; + CARD32 crtc_offset; + CARD32 crtc_offset_cntl; + CARD32 crtc_pitch; + + /* CRTC2 registers */ + CARD32 crtc2_gen_cntl; + + /* Flat panel registers */ + CARD32 fp_crtc_h_total_disp; + CARD32 fp_crtc_v_total_disp; + CARD32 fp_gen_cntl; + CARD32 fp_h_sync_strt_wid; + CARD32 fp_horz_stretch; + CARD32 fp_panel_cntl; + CARD32 fp_v_sync_strt_wid; + CARD32 fp_vert_stretch; + CARD32 lvds_gen_cntl; + CARD32 tmds_crc; + + /* Computed values for PLL */ + int dot_clock_freq; + int pll_output_freq; + int feedback_div; + int post_div; + + /* PLL registers */ + CARD32 ppll_ref_div; + CARD32 ppll_div_3; + CARD32 htotal_cntl; + + /* DDA register */ + CARD32 dda_config; + CARD32 dda_on_off; + + /* Pallet */ + Bool palette_valid; + CARD32 palette[256]; +} RADEONSaveRec, *RADEONSavePtr; + +typedef struct { + CARD16 reference_freq; + CARD16 reference_div; + CARD32 min_pll_freq; + CARD32 max_pll_freq; + CARD16 xclk; +} RADEONPLLRec, *RADEONPLLPtr; + +typedef struct { + int bitsPerPixel; + int depth; + int displayWidth; + int pixel_code; + int pixel_bytes; + DisplayModePtr mode; +} RADEONFBLayout; + +typedef struct { + EntityInfoPtr pEnt; + pciVideoPtr PciInfo; + PCITAG PciTag; + int Chipset; + Bool Primary; + + Bool FBDev; + + unsigned long LinearAddr; /* Frame buffer physical address */ + unsigned long MMIOAddr; /* MMIO region physical address */ + unsigned long BIOSAddr; /* BIOS physical address */ + Bool BIOSFromPCI; /* BIOS is read from PCI space */ + + unsigned char *MMIO; /* Map of MMIO region */ + unsigned char *FB; /* Map of frame buffer */ + CARD8 *VBIOS; /* Video BIOS pointer */ + + CARD32 MemCntl; + CARD32 BusCntl; + unsigned long FbMapSize; /* Size of frame buffer, in bytes */ + int Flags; /* Saved copy of mode flags */ + +#ifdef ENABLE_FLAT_PANEL + Bool HasPanelRegs; /* Current chip can connect to a FP */ + Bool CRTOnly; /* Only use External CRT instead of FP */ + int FPBIOSstart; /* Start of the flat panel info */ + + /* Computed values for FPs */ + int PanelXRes; + int PanelYRes; + int PanelPwrDly; +#endif + + RADEONPLLRec pll; + RADEONRAMPtr ram; + + RADEONSaveRec SavedReg; /* Original (text) mode */ + RADEONSaveRec ModeReg; /* Current mode */ + Bool (*CloseScreen)(int, ScreenPtr); + + Bool PaletteSavedOnVT; /* Palette saved on last VT switch */ + + XAAInfoRecPtr accel; + Bool accelOn; + xf86CursorInfoPtr cursor; + unsigned long cursor_start; + unsigned long cursor_end; + + int fifo_slots; /* Free slots in the FIFO (64 max) */ + int pix24bpp; /* Depth of pixmap for 24bpp framebuffer */ + Bool dac6bits; /* Use 6 bit DAC? */ + + /* Computed values for Radeon */ + int pitch; + int datatype; + CARD32 dp_gui_master_cntl; + + /* Saved values for ScreenToScreenCopy */ + int xdir; + int ydir; + + /* ScanlineScreenToScreenColorExpand support */ + unsigned char *scratch_buffer[1]; + unsigned char *scratch_save; + int scanline_x; + int scanline_y; + int scanline_h; + int scanline_h_w; + int scanline_words; + int scanline_direct; + int scanline_bpp; /* Only used for ImageWrite */ + + DGAModePtr DGAModes; + int numDGAModes; + Bool DGAactive; + int DGAViewportStatus; + + RADEONFBLayout CurrentLayout; +#ifdef XF86DRI + Bool directRenderingEnabled; + DRIInfoPtr pDRIInfo; + int drmFD; + int numVisualConfigs; + __GLXvisualConfig *pVisualConfigs; + RADEONConfigPrivPtr pVisualConfigsPriv; + + drmHandle fbHandle; + + drmSize registerSize; + drmHandle registerHandle; + + Bool IsPCI; /* Current card is a PCI card */ + + drmSize agpSize; + drmHandle agpMemHandle; /* Handle from drmAgpAlloc */ + unsigned long agpOffset; + unsigned char *AGP; /* Map */ + int agpMode; + + Bool CPInUse; /* CP is currently active */ + int CPMode; /* CP mode that server/clients use */ + int CPFifoSize; /* Size of the CP command FIFO */ + Bool CPSecure; /* CP security enabled */ + int CPusecTimeout; /* CP timeout in usecs */ + Bool CP2D; /* CP is used for X server 2D prims */ + + /* CP ring buffer data */ + unsigned long ringStart; /* Offset into AGP space */ + drmHandle ringHandle; /* Handle from drmAddMap */ + drmSize ringMapSize; /* Size of map */ + int ringSize; /* Size of ring (in MB) */ + unsigned char *ring; /* Map */ + int ringSizeLog2QW; + + unsigned long ringReadOffset; /* Offset into AGP space */ + drmHandle ringReadPtrHandle; /* Handle from drmAddMap */ + drmSize ringReadMapSize; /* Size of map */ + unsigned char *ringReadPtr; /* Map */ + + /* CP vertex buffer data */ + unsigned long vbStart; /* Offset into AGP space */ + drmHandle vbHandle; /* Handle from drmAddMap */ + drmSize vbMapSize; /* Size of map */ + int vbSize; /* Size of vert bufs (in MB) */ + unsigned char *vb; /* Map */ + int vbBufSize; /* Size of individual vert buf */ + int vbNumBufs; /* Number of vert bufs */ + drmBufMapPtr vbBufs; /* Buffer map */ + + /* CP indirect buffer data */ + unsigned long indStart; /* Offset into AGP space */ + drmHandle indHandle; /* Handle from drmAddMap */ + drmSize indMapSize; /* Size of map */ + int indSize; /* Size of indirect bufs (in MB) */ + unsigned char *ind; /* Map */ + + /* CP AGP Texture data */ + unsigned long agpTexStart; /* Offset into AGP space */ + drmHandle agpTexHandle; /* Handle from drmAddMap */ + drmSize agpTexMapSize; /* Size of map */ + int agpTexSize; /* Size of AGP tex space (in MB) */ + unsigned char *agpTex; /* Map */ + int log2AGPTexGran; + + /* DRI screen private data */ + int fbX; + int fbY; + int backX; + int backY; + int depthX; + int depthY; + int textureX; + int textureY; + int textureSize; + int log2TexGran; +#endif + XF86VideoAdaptorPtr adaptor; +} RADEONInfoRec, *RADEONInfoPtr; + +#define RADEONWaitForFifo(pScrn, entries) \ +do { \ + if (info->fifo_slots < entries) \ + RADEONWaitForFifoFunction(pScrn, entries); \ + info->fifo_slots -= entries; \ +} while (0) + +extern void RADEONWaitForFifoFunction(ScrnInfoPtr pScrn, int entries); +extern void RADEONWaitForIdle(ScrnInfoPtr pScrn); +extern void RADEONEngineReset(ScrnInfoPtr pScrn); +extern void RADEONEngineFlush(ScrnInfoPtr pScrn); + +extern int RADEONINPLL(ScrnInfoPtr pScrn, int addr); +extern void RADEONWaitForVerticalSync(ScrnInfoPtr pScrn); +extern void RADEONAdjustFrame(int scrnIndex, int x, int y, int flags); +extern Bool RADEONSwitchMode(int ScrnIndex, DisplayModePtr mode, int flags); + +extern Bool RADEONAccelInit(ScreenPtr pScreen); +extern void RADEONEngineInit(ScrnInfoPtr pScrn); +extern Bool RADEONCursorInit(ScreenPtr pScreen); +extern Bool RADEONDGAInit(ScreenPtr pScreen); + +extern int RADEONMinBits(int val); + +#ifdef XF86DRI +extern Bool RADEONDRIScreenInit(ScreenPtr pScreen); +extern void RADEONDRICloseScreen(ScreenPtr pScreen); +extern Bool RADEONDRIFinishScreenInit(ScreenPtr pScreen); +extern void RADEONCPStart(ScrnInfoPtr pScrn); +extern void RADEONCPStop(ScrnInfoPtr pScrn); +extern void RADEONCPResetRing(ScrnInfoPtr pScrn); +extern void RADEONCPWaitForIdle(ScrnInfoPtr pScrn); +#endif + +#endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_accel.c new file mode 100644 index 000000000..88e4f7a0a --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_accel.c @@ -0,0 +1,981 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_accel.c,v 1.1 2000/10/18 17:20:02 alanh Exp $ */ +/************************************************************************** + +Copyright 2000 ATI Technologies Inc. and VA Linux Systems, Inc., + Sunnyvale, California. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +on the rights to use, copy, modify, merge, publish, distribute, sub +license, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin <martin@valinux.com> + * Rickard E. Faith <faith@valinux.com> + * Alan Hourihane <ahourihane@valinux.com> + * + * Credits: + * + * Thanks to Ani Joshi <ajoshi@shell.unixbox.com> for providing source + * code to his Radeon driver. Portions of this file are based on the + * initialization code for that driver. + * + * References: + * + * !!!! FIXME !!!! + * RAGE 128 VR/ RAGE 128 GL Register Reference Manual (Technical + * Reference Manual P/N RRG-G04100-C Rev. 0.04), ATI Technologies: April + * 1999. + * + * RAGE 128 Software Development Manual (Technical Reference Manual P/N + * SDK-G04000 Rev. 0.01), ATI Technologies: June 1999. + * + * Notes on unimplemented XAA optimizations: + * + * SetClipping: This has been removed as XAA expects 16bit registers + * for full clipping. + * TwoPointLine: The Radeon supports this. Not Bresenham. + * DashedLine with non-power-of-two pattern length: Apparently, there is + * no way to set the length of the pattern -- it is always + * assumed to be 8 or 32 (or 1024?). + * ScreenToScreenColorExpandFill: See p. 4-17 of the Technical Reference + * Manual where it states that monochrome expansion of frame + * buffer data is not supported. + * CPUToScreenColorExpandFill, direct: The implementation here uses a hybrid + * direct/indirect method. If we had more data registers, + * then we could do better. If XAA supported a trigger write + * address, the code would be simpler. + * Color8x8PatternFill: Apparently, an 8x8 color brush cannot take an 8x8 + * pattern from frame buffer memory. + * ImageWrites: Same as CPUToScreenColorExpandFill + * + */ + +#define RADEON_IMAGEWRITE 0 /* Turned off by default - slower in accel */ + + /* X and server generic header files */ +#include "Xarch.h" +#include "xf86.h" +#include "xf86_ansic.h" +#include "xf86_OSproc.h" +#include "xf86fbman.h" + + /* Line support */ +#include "miline.h" + + /* Driver data structures */ +#include "radeon.h" +#include "radeon_reg.h" + +static struct { + int rop; + int pattern; +} RADEON_ROP[] = { + { RADEON_ROP3_ZERO, RADEON_ROP3_ZERO }, /* GXclear */ + { RADEON_ROP3_DSa, RADEON_ROP3_DPa }, /* Gxand */ + { RADEON_ROP3_SDna, RADEON_ROP3_PDna }, /* GXandReverse */ + { RADEON_ROP3_S, RADEON_ROP3_P }, /* GXcopy */ + { RADEON_ROP3_DSna, RADEON_ROP3_DPna }, /* GXandInverted */ + { RADEON_ROP3_D, RADEON_ROP3_D }, /* GXnoop */ + { RADEON_ROP3_DSx, RADEON_ROP3_DPx }, /* GXxor */ + { RADEON_ROP3_DSo, RADEON_ROP3_DPo }, /* GXor */ + { RADEON_ROP3_DSon, RADEON_ROP3_DPon }, /* GXnor */ + { RADEON_ROP3_DSxn, RADEON_ROP3_PDxn }, /* GXequiv */ + { RADEON_ROP3_Dn, RADEON_ROP3_Dn }, /* GXinvert */ + { RADEON_ROP3_SDno, RADEON_ROP3_PDno }, /* GXorReverse */ + { RADEON_ROP3_Sn, RADEON_ROP3_Pn }, /* GXcopyInverted */ + { RADEON_ROP3_DSno, RADEON_ROP3_DPno }, /* GXorInverted */ + { RADEON_ROP3_DSan, RADEON_ROP3_DPan }, /* GXnand */ + { RADEON_ROP3_ONE, RADEON_ROP3_ONE } /* GXset */ +}; + +/* Flush all dirty data in the Pixel Cache to memory. */ +void RADEONEngineFlush(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int i; + + OUTREGP(RADEON_RB2D_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL, + ~RADEON_RB2D_DC_FLUSH_ALL); + for (i = 0; i < RADEON_TIMEOUT; i++) { + if (!(INREG(RADEON_RB2D_DSTCACHE_CTLSTAT) & RADEON_RB2D_DC_BUSY)) break; + } +} + +/* Reset graphics card to known state. */ +void RADEONEngineReset(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + CARD32 clock_cntl_index; + CARD32 mclk_cntl; + CARD32 rbbm_soft_reset; + + RADEONEngineFlush(pScrn); + + clock_cntl_index = INREG(RADEON_CLOCK_CNTL_INDEX); + mclk_cntl = INPLL(pScrn, RADEON_MCLK_CNTL); + + OUTPLL(RADEON_MCLK_CNTL, (mclk_cntl | 0x003f0000)); + + rbbm_soft_reset = INREG(RADEON_RBBM_SOFT_RESET); + + OUTREG(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset | + RADEON_SOFT_RESET_CP | + RADEON_SOFT_RESET_HI | + RADEON_SOFT_RESET_SE | + RADEON_SOFT_RESET_RE | + RADEON_SOFT_RESET_PP | + RADEON_SOFT_RESET_E2 | + RADEON_SOFT_RESET_RB | + RADEON_SOFT_RESET_HDP); + INREG(RADEON_RBBM_SOFT_RESET); + OUTREG(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset & + ~(RADEON_SOFT_RESET_CP | + RADEON_SOFT_RESET_HI | + RADEON_SOFT_RESET_SE | + RADEON_SOFT_RESET_RE | + RADEON_SOFT_RESET_PP | + RADEON_SOFT_RESET_E2 | + RADEON_SOFT_RESET_RB | + RADEON_SOFT_RESET_HDP)); + INREG(RADEON_RBBM_SOFT_RESET); + + OUTPLL(RADEON_MCLK_CNTL, mclk_cntl); + OUTREG(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index); + OUTREG(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset); + +#ifdef XF86DRI + if (RADEONCP_USE_RING_BUFFER(info->CPMode)) RADEONCPResetRing(pScrn); +#endif +} + +/* The FIFO has 64 slots. This routines waits until at least `entries' of + these slots are empty. */ +void RADEONWaitForFifoFunction(ScrnInfoPtr pScrn, int entries) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int i; + + for (;;) { + for (i = 0; i < RADEON_TIMEOUT; i++) { + info->fifo_slots = + INREG(RADEON_RBBM_STATUS) & RADEON_RBBM_FIFOCNT_MASK; + if (info->fifo_slots >= entries) return; + } + RADEONTRACE(("FIFO timed out: %d entries, stat=0x%08x\n", + INREG(RADEON_RBBM_STATUS) & RADEON_RBBM_FIFOCNT_MASK, + INREG(RADEON_RBBM_STATUS))); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "FIFO timed out, resetting engine...\n"); + RADEONEngineReset(pScrn); +#ifdef XF86DRI + if (info->CP2D) RADEONCPStart(pScrn); +#endif + } +} + +/* Wait for the graphics engine to be completely idle: the FIFO has + drained, the Pixel Cache is flushed, and the engine is idle. This is a + standard "sync" function that will make the hardware "quiescent". */ +void RADEONWaitForIdle(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int i; + + RADEONTRACE(("WaitForIdle (entering): %d entries, stat=0x%08x\n", + INREG(RADEON_RBBM_STATUS) & RADEON_RBBM_FIFOCNT_MASK, + INREG(RADEON_RBBM_STATUS))); + + RADEONWaitForFifoFunction(pScrn, 64); + + for (;;) { + for (i = 0; i < RADEON_TIMEOUT; i++) { + if (!(INREG(RADEON_RBBM_STATUS) & RADEON_RBBM_ACTIVE)) { + RADEONEngineFlush(pScrn); + return; + } + } + RADEONTRACE(("Idle timed out: %d entries, stat=0x%08x\n", + INREG(RADEON_RBBM_STATUS) & RADEON_RBBM_FIFOCNT_MASK, + INREG(RADEON_RBBM_STATUS))); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Idle timed out, resetting engine...\n"); + RADEONEngineReset(pScrn); +#ifdef XF86DRI + if (info->CP2D) RADEONCPStart(pScrn); +#endif + } +} + +/* Setup for XAA SolidFill. */ +static void RADEONSetupForSolidFill(ScrnInfoPtr pScrn, + int color, int rop, unsigned int planemask) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + RADEONWaitForFifo(pScrn, 4); + OUTREG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl + | RADEON_GMC_BRUSH_SOLID_COLOR + | RADEON_GMC_SRC_DATATYPE_COLOR + | RADEON_ROP[rop].pattern)); + OUTREG(RADEON_DP_BRUSH_FRGD_CLR, color); + OUTREG(RADEON_DP_WRITE_MASK, planemask); + OUTREG(RADEON_DP_CNTL, (RADEON_DST_X_LEFT_TO_RIGHT + | RADEON_DST_Y_TOP_TO_BOTTOM)); +} + +/* Subsequent XAA SolidFillRect. + + Tests: xtest CH06/fllrctngl, xterm +*/ +static void RADEONSubsequentSolidFillRect(ScrnInfoPtr pScrn, + int x, int y, int w, int h) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + RADEONWaitForFifo(pScrn, 2); + OUTREG(RADEON_DST_Y_X, (y << 16) | x); + OUTREG(RADEON_DST_WIDTH_HEIGHT, (w << 16) | h); +} + +/* Setup for XAA solid lines. */ +static void RADEONSetupForSolidLine(ScrnInfoPtr pScrn, + int color, int rop, unsigned int planemask) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + RADEONWaitForFifo(pScrn, 3); + OUTREG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl + | RADEON_GMC_BRUSH_SOLID_COLOR + | RADEON_GMC_SRC_DATATYPE_COLOR + | RADEON_ROP[rop].pattern)); + OUTREG(RADEON_DP_BRUSH_FRGD_CLR, color); + OUTREG(RADEON_DP_WRITE_MASK, planemask); +} + + +/* Subsequent XAA solid TwoPointLine line. + + Tests: xtest CH06/drwln, ico, Mark Vojkovich's linetest program + + [See http://www.xfree86.org/devel/archives/devel/1999-Jun/0102.shtml for + Mark Vojkovich's linetest program, posted 2Jun99 to devel@xfree86.org.] +*/ +static void RADEONSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, + int x1, int y1, int x2, int y2, + int flags) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int direction = 0; + + if (x1 < x2) direction |= RADEON_DST_X_DIR_LEFT_TO_RIGHT; + if (y1 < y2) direction |= RADEON_DST_Y_DIR_TOP_TO_BOTTOM; + + RADEONWaitForFifo(pScrn, 4); + OUTREG(RADEON_DST_Y_X, (y1 << 16) | x1); + if (!(flags & OMIT_LAST)) + OUTREG(RADEON_DP_CNTL_XDIR_YDIR_YMAJOR, direction); + OUTREG(RADEON_DST_LINE_START, (y1 << 16) | x1); + OUTREG(RADEON_DST_LINE_END, (y2 << 16) | x2); +} + +/* Subsequent XAA solid horizontal and vertical lines */ +static void RADEONSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, + int x, int y, int len, int dir ) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + RADEONWaitForFifo(pScrn, 1); + OUTREG(RADEON_DP_CNTL, (RADEON_DST_X_LEFT_TO_RIGHT + | RADEON_DST_Y_TOP_TO_BOTTOM)); + + if (dir == DEGREES_0) { + RADEONSubsequentSolidFillRect(pScrn, x, y, len, 1); + } else { + RADEONSubsequentSolidFillRect(pScrn, x, y, 1, len); + } +} + +/* Setup for XAA dashed lines. + + Tests: xtest CH05/stdshs, XFree86/drwln + + NOTE: Since we can only accelerate lines with power-of-2 patterns of + length <= 32. +*/ +static void RADEONSetupForDashedLine(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, unsigned int planemask, + int length, unsigned char *pattern) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + CARD32 pat = *(CARD32 *)pattern; + + switch (length) { + case 2: pat |= pat << 2; /* fall through */ + case 4: pat |= pat << 4; /* fall through */ + case 8: pat |= pat << 8; /* fall through */ + case 16: pat |= pat << 16; + } + + RADEONWaitForFifo(pScrn, 5); + OUTREG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl + | (bg == -1 + ? RADEON_GMC_BRUSH_32x1_MONO_FG_LA + : RADEON_GMC_BRUSH_32x1_MONO_FG_BG) + | RADEON_ROP[rop].pattern + | RADEON_GMC_BYTE_LSB_TO_MSB)); + OUTREG(RADEON_DP_WRITE_MASK, planemask); + OUTREG(RADEON_DP_BRUSH_FRGD_CLR, fg); + OUTREG(RADEON_DP_BRUSH_BKGD_CLR, bg); + OUTREG(RADEON_BRUSH_DATA0, pat); +} + +/* Subsequent XAA dashed line. */ +static void RADEONSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, + int x1, int y1, + int x2, int y2, + int flags, + int phase) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int direction = 0; + + if (x1 < x2) direction |= RADEON_DST_X_DIR_LEFT_TO_RIGHT; + if (y1 < y2) direction |= RADEON_DST_Y_DIR_TOP_TO_BOTTOM; + + RADEONWaitForFifo(pScrn, 5); + if (!(flags & OMIT_LAST)) + OUTREG(RADEON_DP_CNTL_XDIR_YDIR_YMAJOR, direction); + OUTREG(RADEON_DST_Y_X, (y1 << 16) | x1); + OUTREG(RADEON_BRUSH_Y_X, (phase << 16) | phase); + OUTREG(RADEON_DST_LINE_START, (y1 << 16) | x1); + OUTREG(RADEON_DST_LINE_END, (y2 << 16) | x2); +} + +/* Setup for XAA screen-to-screen copy. + + Tests: xtest CH06/fllrctngl (also tests transparency). +*/ +static void RADEONSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, + int xdir, int ydir, int rop, + unsigned int planemask, + int trans_color) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + info->xdir = xdir; + info->ydir = ydir; + RADEONWaitForFifo(pScrn, 3); + OUTREG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl + | RADEON_GMC_BRUSH_NONE + | RADEON_GMC_SRC_DATATYPE_COLOR + | RADEON_ROP[rop].rop + | RADEON_DP_SRC_SOURCE_MEMORY)); + OUTREG(RADEON_DP_WRITE_MASK, planemask); + OUTREG(RADEON_DP_CNTL, ((xdir >= 0 + ? RADEON_DST_X_LEFT_TO_RIGHT + : 0) + | (ydir >= 0 + ? RADEON_DST_Y_TOP_TO_BOTTOM + : 0))); + + if (trans_color != -1) { + /* Set up for transparency */ + RADEONWaitForFifo(pScrn, 3); + OUTREG(RADEON_CLR_CMP_CLR_SRC, trans_color); + OUTREG(RADEON_CLR_CMP_MASK, RADEON_CLR_CMP_MSK); + /* Mmmm, Seems as though the transparency compare is opposite to r128 + * It should only draw when source != trans_color, + * this is the opposite of that. */ + OUTREG(RADEON_CLR_CMP_CNTL, (RADEON_SRC_CMP_EQ_COLOR + | RADEON_CLR_CMP_SRC_SOURCE)); + } +} + +/* Subsequent XAA screen-to-screen copy. */ +static void RADEONSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, + int x1, int y1, + int x2, int y2, + int w, int h) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + if (info->xdir < 0) x1 += w - 1, x2 += w - 1; + if (info->ydir < 0) y1 += h - 1, y2 += h - 1; + + RADEONWaitForFifo(pScrn, 3); + OUTREG(RADEON_SRC_Y_X, (y1 << 16) | x1); + OUTREG(RADEON_DST_Y_X, (y2 << 16) | x2); + OUTREG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | w); +} + +/* Setup for XAA mono 8x8 pattern color expansion. Patterns with + transparency use `bg == -1'. This routine is only used if the XAA + pixmap cache is turned on. + + Tests: xtest XFree86/fllrctngl (no other test will test this routine with + both transparency and non-transparency) +*/ +static void RADEONSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, + int patternx, int patterny, + int fg, int bg, int rop, + unsigned int planemask) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + RADEONWaitForFifo(pScrn, 6); + OUTREG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl + | (bg == -1 + ? RADEON_GMC_BRUSH_8X8_MONO_FG_LA + : RADEON_GMC_BRUSH_8X8_MONO_FG_BG) + | RADEON_ROP[rop].pattern + | RADEON_GMC_BYTE_LSB_TO_MSB)); + OUTREG(RADEON_DP_WRITE_MASK, planemask); + OUTREG(RADEON_DP_BRUSH_FRGD_CLR, fg); + OUTREG(RADEON_DP_BRUSH_BKGD_CLR, bg); + OUTREG(RADEON_BRUSH_DATA0, patternx); + OUTREG(RADEON_BRUSH_DATA1, patterny); +} + +/* Subsequent XAA 8x8 pattern color expansion. Because they are used in + the setup function, `patternx' and `patterny' are not used here. */ +static void RADEONSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, + int patternx, int patterny, + int x, int y, int w, int h) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + RADEONWaitForFifo(pScrn, 3); + OUTREG(RADEON_BRUSH_Y_X, (patterny << 8) | patternx); + OUTREG(RADEON_DST_Y_X, (y << 16) | x); + OUTREG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | w); +} + +#if 0 +/* Setup for XAA color 8x8 pattern fill. + + Tests: xtest XFree86/fllrctngl (with Mono8x8PatternFill off) +*/ +static void RADEONSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, + int patx, int paty, + int rop, unsigned int planemask, + int trans_color) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + ErrorF("Color8x8 %d %d %d\n", trans_color, patx, paty); + + RADEONWaitForFifo(pScrn, 3); + OUTREG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl + | RADEON_GMC_BRUSH_8x8_COLOR + | RADEON_GMC_SRC_DATATYPE_COLOR + | RADEON_ROP[rop].pattern + | RADEON_DP_SRC_SOURCE_MEMORY)); + OUTREG(RADEON_DP_WRITE_MASK, planemask); + OUTREG(RADEON_SRC_Y_X, (paty << 16) | patx); + + if (trans_color != -1) { + /* Set up for transparency */ + RADEONWaitForFifo(pScrn, 3); + OUTREG(RADEON_CLR_CMP_CLR_SRC, trans_color); + OUTREG(RADEON_CLR_CMP_MASK, RADEON_CLR_CMP_MSK); + /* Mmmm, Seems as though the transparency compare is opposite to r128 + * It should only draw when source != trans_color, + * this is the opposite of that. */ + OUTREG(RADEON_CLR_CMP_CNTL, (RADEON_SRC_CMP_EQ_COLOR + | RADEON_CLR_CMP_SRC_SOURCE)); + } +} + +/* Subsequent XAA 8x8 pattern color expansion. */ +static void RADEONSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, + int patx, int paty, + int x, int y, int w, int h) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + ErrorF("Color8x8 %d,%d %d,%d %d %d\n", patx, paty, x, y, w, h); + + RADEONWaitForFifo(pScrn, 4); + OUTREG(RADEON_BRUSH_Y_X, (paty << 16) | patx); + OUTREG(RADEON_DST_Y_X, (y << 16) | x); + OUTREG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | w); +} +#endif + +/* Setup for XAA indirect CPU-to-screen color expansion (indirect). + Because of how the scratch buffer is initialized, this is really a + mainstore-to-screen color expansion. Transparency is supported when `bg + == -1'. + Implementing the hybrid indirect/direct scheme improved performance in a + few areas: +*/ +static void RADEONSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, + unsigned int + planemask) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + RADEONWaitForFifo(pScrn, 4); + OUTREG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl + | RADEON_GMC_DST_CLIPPING + | RADEON_GMC_BRUSH_NONE + | (bg == -1 + ? RADEON_GMC_SRC_DATATYPE_MONO_FG_LA + : RADEON_GMC_SRC_DATATYPE_MONO_FG_BG) + | RADEON_ROP[rop].rop + | RADEON_GMC_BYTE_LSB_TO_MSB + | RADEON_DP_SRC_SOURCE_HOST_DATA)); + OUTREG(RADEON_DP_WRITE_MASK, planemask); + OUTREG(RADEON_DP_SRC_FRGD_CLR, fg); + OUTREG(RADEON_DP_SRC_BKGD_CLR, bg); +} + +/* Subsequent XAA indirect CPU-to-screen color expansion. This is only + called once for each rectangle. */ +static void RADEONSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr + pScrn, + int x, int y, + int w, int h, + int skipleft) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + info->scanline_h = h; + info->scanline_words = (w + 31) >> 5; + + if ((info->scanline_words * h) <= 9) { + /* Turn on direct for less than 9 dword colour expansion */ + info->scratch_buffer[0] + = (unsigned char *)(ADDRREG(RADEON_HOST_DATA_LAST) + - (info->scanline_words - 1)); + info->scanline_direct = 1; + } else { + /* Use indirect for anything else */ + info->scratch_buffer[0] = info->scratch_save; + info->scanline_direct = 0; + } + + RADEONWaitForFifo(pScrn, 4 + (info->scanline_direct ? + (info->scanline_words * h) : 0) ); + OUTREG(RADEON_SC_TOP_LEFT, (y << 16) | ((x+skipleft) & 0xffff)); + /* MMmm, we don't need the -1 on both y+h or x+w, why ? */ + OUTREG(RADEON_SC_BOTTOM_RIGHT, ((y+h) << 16) | ((x+w) & 0xffff)); + OUTREG(RADEON_DST_Y_X, (y << 16) | (x & 0xffff)); + /* Have to pad the width here and use clipping engine */ + OUTREG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | ((w + 31) & ~31)); +} + +/* Subsequent XAA indirect CPU-to-screen color expandion. This is called + once for each scanline. */ +static void RADEONSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + CARD32 *p = (CARD32 *)info->scratch_buffer[bufno]; + int i; + int left = info->scanline_words; + volatile CARD32 *d; + + if (info->scanline_direct) return; + --info->scanline_h; + while (left) { + if (left <= 8) { + /* Last scanline - finish write to DATA_LAST */ + if (info->scanline_h == 0) { + RADEONWaitForFifo(pScrn, left); + /* Unrolling doesn't improve performance */ + for (d = ADDRREG(RADEON_HOST_DATA_LAST) - (left - 1); left; --left) + *d++ = *p++; + return; + } else { + RADEONWaitForFifo(pScrn, left); + /* Unrolling doesn't improve performance */ + for (d = ADDRREG(RADEON_HOST_DATA7) - (left - 1); left; --left) + *d++ = *p++; + } + } else { + RADEONWaitForFifo(pScrn, 8); + /* Unrolling doesn't improve performance */ + for (d = ADDRREG(RADEON_HOST_DATA0), i = 0; i < 8; i++) + *d++ = *p++; + left -= 8; + } + } +} + +#if RADEON_IMAGEWRITE +/* Setup for XAA indirect image write. */ +static void RADEONSetupForScanlineImageWrite(ScrnInfoPtr pScrn, + int rop, + unsigned int planemask, + int trans_color, + int bpp, + int depth) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + info->scanline_bpp = bpp; + + RADEONWaitForFifo(pScrn, 2); + OUTREG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl + | RADEON_GMC_DST_CLIPPING + | RADEON_GMC_BRUSH_NONE + | RADEON_GMC_SRC_DATATYPE_COLOR + | RADEON_ROP[rop].rop + | RADEON_GMC_BYTE_LSB_TO_MSB + | RADEON_DP_SRC_SOURCE_HOST_DATA)); + OUTREG(RADEON_DP_WRITE_MASK, planemask); + + if (trans_color != -1) { + /* Set up for transparency */ + RADEONWaitForFifo(pScrn, 3); + OUTREG(RADEON_CLR_CMP_CLR_SRC, trans_color); + OUTREG(RADEON_CLR_CMP_MASK, RADEON_CLR_CMP_MSK); + /* Mmmm, Seems as though the transparency compare is opposite to r128 + * It should only draw when source != trans_color, + * this is the opposite of that. */ + OUTREG(RADEON_CLR_CMP_CNTL, (RADEON_SRC_CMP_EQ_COLOR + | RADEON_CLR_CMP_SRC_SOURCE)); + } +} + +/* Subsequent XAA indirect image write. This is only called once for each + rectangle. */ +static void RADEONSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn, + int x, int y, + int w, int h, + int skipleft) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int shift = 0; /* 32bpp */ + + if (pScrn->bitsPerPixel == 8) shift = 3; + else if (pScrn->bitsPerPixel == 16) shift = 1; + + info->scanline_h = h; + info->scanline_words = (w * info->scanline_bpp + 31) >> 5; + + if ((info->scanline_words * h) <= 9) { + /* Turn on direct for less than 9 dword colour expansion */ + info->scratch_buffer[0] + = (unsigned char *)(ADDRREG(RADEON_HOST_DATA_LAST) + - (info->scanline_words - 1)); + info->scanline_direct = 1; + } else { + /* Use indirect for anything else */ + info->scratch_buffer[0] = info->scratch_save; + info->scanline_direct = 0; + } + + RADEONWaitForFifo(pScrn, 4 + (info->scanline_direct ? + (info->scanline_words * h) : 0) ); + OUTREG(RADEON_SC_TOP_LEFT, (y << 16) | ((x+skipleft) & 0xffff)); + /* MMmm, we don't need the -1 on both y+h or x+w, why ? */ + OUTREG(RADEON_SC_BOTTOM_RIGHT, ((y+h) << 16) | ((x+w) & 0xffff)); + OUTREG(RADEON_DST_Y_X, (y << 16) | (x & 0xffff)); + /* Have to pad the width here and use clipping engine */ + OUTREG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | ((w + shift) & ~shift)); +} + +/* Subsequent XAA indirect image write. This is called once for each + scanline. */ +static void RADEONSubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + CARD32 *p = (CARD32 *)info->scratch_buffer[bufno]; + int i; + int left = info->scanline_words; + volatile CARD32 *d; + + if (info->scanline_direct) return; + --info->scanline_h; + while (left) { + if (left <= 8) { + /* Last scanline - finish write to DATA_LAST */ + if (info->scanline_h == 0) { + RADEONWaitForFifo(pScrn, left); + /* Unrolling doesn't improve performance */ + for (d = ADDRREG(RADEON_HOST_DATA_LAST) - (left - 1); left; --left) + *d++ = *p++; + return; + } else { + RADEONWaitForFifo(pScrn, left); + /* Unrolling doesn't improve performance */ + for (d = ADDRREG(RADEON_HOST_DATA7) - (left - 1); left; --left) + *d++ = *p++; + } + } else { + RADEONWaitForFifo(pScrn, 8); + /* Unrolling doesn't improve performance */ + for (d = ADDRREG(RADEON_HOST_DATA0), i = 0; i < 8; i++) + *d++ = *p++; + left -= 8; + } + } +} +#endif + +/* Initialize the acceleration hardware. */ +void RADEONEngineInit(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int pitch64; + + RADEONTRACE(("EngineInit (%d/%d)\n", + info->CurrentLayout.pixel_code, + info->CurrentLayout.bitsPerPixel)); + + OUTREG(RADEON_SCALE_3D_CNTL, 0); + RADEONEngineReset(pScrn); + + RADEONWaitForFifo(pScrn, 1); + /* turn of all automatic flushing - we'll do it all */ + OUTREG(RADEON_RB2D_DSTCACHE_MODE, 0); + + switch (info->CurrentLayout.pixel_code) { + case 8: info->datatype = 2; break; + case 15: info->datatype = 3; break; + case 16: info->datatype = 4; break; + case 24: info->datatype = 5; break; + case 32: info->datatype = 6; break; + default: + RADEONTRACE(("Unknown depth/bpp = %d/%d (code = %d)\n", + info->CurrentLayout.depth, + info->CurrentLayout.bitsPerPixel, + info->CurrentLayout.pixel_code)); + } + info->pitch = ((info->CurrentLayout.displayWidth / 8) * + (info->CurrentLayout.pixel_bytes == 3 ? 3 : 1)); + + RADEONTRACE(("Pitch for acceleration = %d\n", info->pitch)); + + pitch64 = ((pScrn->displayWidth * (pScrn->bitsPerPixel / 8) + 0x3f)) >> 6; + + RADEONWaitForFifo(pScrn, 1); + OUTREG(RADEON_DEFAULT_OFFSET, (INREG(RADEON_DEFAULT_OFFSET) & 0xC0000000) | + (pitch64 << 22)); + + RADEONWaitForFifo(pScrn, 1); +#if X_BYTE_ORDER == X_BIG_ENDIAN + OUTREGP(RADEON_DP_DATATYPE, + RADEON_HOST_BIG_ENDIAN_EN, ~RADEON_HOST_BIG_ENDIAN_EN); +#else + OUTREGP(RADEON_DP_DATATYPE, 0, ~RADEON_HOST_BIG_ENDIAN_EN); +#endif + + RADEONWaitForFifo(pScrn, 1); + OUTREG(RADEON_DEFAULT_SC_BOTTOM_RIGHT, (RADEON_DEFAULT_SC_RIGHT_MAX + | RADEON_DEFAULT_SC_BOTTOM_MAX)); + info->dp_gui_master_cntl = + ((info->datatype << RADEON_GMC_DST_DATATYPE_SHIFT) + | RADEON_GMC_CLR_CMP_CNTL_DIS); + RADEONWaitForFifo(pScrn, 1); + OUTREG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl + | RADEON_GMC_BRUSH_SOLID_COLOR + | RADEON_GMC_SRC_DATATYPE_COLOR)); + + RADEONWaitForFifo(pScrn, 7); + OUTREG(RADEON_DST_LINE_START, 0); + OUTREG(RADEON_DST_LINE_END, 0); + OUTREG(RADEON_DP_BRUSH_FRGD_CLR, 0xffffffff); + OUTREG(RADEON_DP_BRUSH_BKGD_CLR, 0x00000000); + OUTREG(RADEON_DP_SRC_FRGD_CLR, 0xffffffff); + OUTREG(RADEON_DP_SRC_BKGD_CLR, 0x00000000); + OUTREG(RADEON_DP_WRITE_MASK, 0xffffffff); + + RADEONWaitForIdle(pScrn); +} + +#ifdef XF86DRI +/* FIXME: When direct rendering is enabled, we should use the CP to + draw 2D commands */ +static void RADEONCPAccelInit(ScrnInfoPtr pScrn, XAAInfoRecPtr a) +{ + a->Flags = 0; + + /* Sync */ +#if 1 + a->Sync = RADEONWaitForIdle; +#else + a->Sync = RADEONCCEWaitForIdle; +#endif + +} +#endif + +static void RADEONMMIOAccelInit(ScrnInfoPtr pScrn, XAAInfoRecPtr a) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + a->Flags = (PIXMAP_CACHE + | OFFSCREEN_PIXMAPS + | LINEAR_FRAMEBUFFER); + + /* Sync */ + a->Sync = RADEONWaitForIdle; + + /* Solid Filled Rectangle */ + a->PolyFillRectSolidFlags = 0; + a->SetupForSolidFill = RADEONSetupForSolidFill; + a->SubsequentSolidFillRect = RADEONSubsequentSolidFillRect; + + /* Screen-to-screen Copy */ + /* Transparency uses the wrong colors for + 24 bpp mode -- the transparent part is + correct, but the opaque color is wrong. + This can be seen with netscape's I-bar + cursor when editing in the URL location + box. */ + a->ScreenToScreenCopyFlags = ((pScrn->bitsPerPixel == 24) + ? NO_TRANSPARENCY + : 0); + a->SetupForScreenToScreenCopy = RADEONSetupForScreenToScreenCopy; + a->SubsequentScreenToScreenCopy = RADEONSubsequentScreenToScreenCopy; + + /* Mono 8x8 Pattern Fill (Color Expand) */ + a->SetupForMono8x8PatternFill + = RADEONSetupForMono8x8PatternFill; + a->SubsequentMono8x8PatternFillRect + = RADEONSubsequentMono8x8PatternFillRect; + a->Mono8x8PatternFillFlags = (HARDWARE_PATTERN_PROGRAMMED_BITS + | HARDWARE_PATTERN_PROGRAMMED_ORIGIN + | HARDWARE_PATTERN_SCREEN_ORIGIN + | BIT_ORDER_IN_BYTE_LSBFIRST); + + /* Indirect CPU-To-Screen Color Expand */ +#if X_BYTE_ORDER == X_LITTLE_ENDIAN + a->ScanlineCPUToScreenColorExpandFillFlags = LEFT_EDGE_CLIPPING + /* RADEON gets upset, when using HOST provided data + * without a source rop. To show run 'xtest's drwarc */ + | ROP_NEEDS_SOURCE + | LEFT_EDGE_CLIPPING_NEGATIVE_X; +#else + a->ScanlineCPUToScreenColorExpandFillFlags = BIT_ORDER_IN_BYTE_MSBFIRST + /* RADEON gets upset, when using HOST provided data + * without a source rop. To show run 'xtest's drwarc */ + | ROP_NEEDS_SOURCE + | LEFT_EDGE_CLIPPING + | LEFT_EDGE_CLIPPING_NEGATIVE_X; +#endif + a->NumScanlineColorExpandBuffers = 1; + a->ScanlineColorExpandBuffers = info->scratch_buffer; + info->scratch_save = xalloc(((pScrn->virtualX+31)/32*4) + + (pScrn->virtualX + * info->CurrentLayout.pixel_bytes)); + info->scratch_buffer[0] = info->scratch_save; + a->SetupForScanlineCPUToScreenColorExpandFill + = RADEONSetupForScanlineCPUToScreenColorExpandFill; + a->SubsequentScanlineCPUToScreenColorExpandFill + = RADEONSubsequentScanlineCPUToScreenColorExpandFill; + a->SubsequentColorExpandScanline = RADEONSubsequentColorExpandScanline; + + a->SetupForSolidLine = RADEONSetupForSolidLine; + a->SubsequentSolidTwoPointLine = RADEONSubsequentSolidTwoPointLine; + a->SubsequentSolidHorVertLine = RADEONSubsequentSolidHorVertLine; + + a->SetupForDashedLine = RADEONSetupForDashedLine; + a->SubsequentDashedTwoPointLine = RADEONSubsequentDashedTwoPointLine; + a->DashPatternMaxLength = 32; + a->DashedLineFlags = (LINE_PATTERN_LSBFIRST_LSBJUSTIFIED + | LINE_PATTERN_POWER_OF_2_ONLY); + +#if RADEON_IMAGEWRITE + /* ImageWrite */ + a->NumScanlineImageWriteBuffers = 1; + a->ScanlineImageWriteBuffers = info->scratch_buffer; + info->scratch_buffer[0] = info->scratch_save; + a->SetupForScanlineImageWrite = RADEONSetupForScanlineImageWrite; + a->SubsequentScanlineImageWriteRect + = RADEONSubsequentScanlineImageWriteRect; + a->SubsequentImageWriteScanline = RADEONSubsequentImageWriteScanline; + a->ScanlineImageWriteFlags = CPU_TRANSFER_PAD_DWORD + /* Performance tests show that we shouldn't use GXcopy for + * uploads as a memcpy is faster */ + | NO_GXCOPY + /* RADEON gets upset, when using HOST provided data + * without a source rop. To show run 'xtest's ptimg */ + | ROP_NEEDS_SOURCE + | SCANLINE_PAD_DWORD + | LEFT_EDGE_CLIPPING + | LEFT_EDGE_CLIPPING_NEGATIVE_X; +#endif + +#if 0 + /* Color 8x8 Pattern Fill */ + a->SetupForColor8x8PatternFill + = RADEONSetupForColor8x8PatternFill; + a->SubsequentColor8x8PatternFillRect + = RADEONSubsequentColor8x8PatternFillRect; + a->Color8x8PatternFillFlags = + HARDWARE_PATTERN_PROGRAMMED_ORIGIN + | HARDWARE_PATTERN_SCREEN_ORIGIN + | BIT_ORDER_IN_BYTE_LSBFIRST; +#endif +} + +/* Initialize XAA for supported acceleration and also initialize the + graphics hardware for acceleration. */ +Bool RADEONAccelInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); + XAAInfoRecPtr a; + + if (!(a = info->accel = XAACreateInfoRec())) return FALSE; + +#ifdef XF86DRI + /* FIXME: When direct rendering is enabled, we should use the CP to + draw 2D commands */ + if (info->CP2D) RADEONCPAccelInit(pScrn, a); + else +#endif + RADEONMMIOAccelInit(pScrn, a); + + RADEONEngineInit(pScrn); + return XAAInit(pScreen, a); +} diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_cursor.c b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_cursor.c new file mode 100644 index 000000000..d0f55fea2 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_cursor.c @@ -0,0 +1,267 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_cursor.c,v 1.1 2000/10/18 17:20:02 alanh Exp $ */ +/************************************************************************** + +Copyright 2000 ATI Technologies Inc. and VA Linux Systems, Inc., + Sunnyvale, California. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +on the rights to use, copy, modify, merge, publish, distribute, sub +license, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin <martin@valinux.com> + * Rickard E. Faith <faith@valinux.com> + * + * References: + * + * !!!! FIXME !!!! + * RAGE 128 VR/ RAGE 128 GL Register Reference Manual (Technical + * Reference Manual P/N RRG-G04100-C Rev. 0.04), ATI Technologies: April + * 1999. + * + * RAGE 128 Software Development Manual (Technical Reference Manual P/N + * SDK-G04000 Rev. 0.01), ATI Technologies: June 1999. + * + */ + + /* X and server generic header files */ +#include "Xarch.h" +#include "xf86.h" +#include "xf86_ansic.h" +#include "xf86_OSproc.h" +#include "xf86fbman.h" + + /* Driver data structures */ +#include "radeon.h" +#include "radeon_reg.h" + +#if X_BYTE_ORDER == X_BIG_ENDIAN +#define P_SWAP32( a , b ) \ + ((char *)a)[0] = ((char *)b)[3]; \ + ((char *)a)[1] = ((char *)b)[2]; \ + ((char *)a)[2] = ((char *)b)[1]; \ + ((char *)a)[3] = ((char *)b)[0] + +#define P_SWAP16( a , b ) \ + ((char *)a)[0] = ((char *)b)[1]; \ + ((char *)a)[1] = ((char *)b)[0]; \ + ((char *)a)[2] = ((char *)b)[3]; \ + ((char *)a)[3] = ((char *)b)[2] +#endif + + +/* Set cursor foreground and background colors. */ +static void RADEONSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + OUTREG(RADEON_CUR_CLR0, bg); + OUTREG(RADEON_CUR_CLR1, fg); +} + +/* Set cursor position to (x,y) with offset into cursor bitmap at + (xorigin,yorigin). */ +static void RADEONSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + xf86CursorInfoPtr cursor = info->cursor; + int xorigin = 0; + int yorigin = 0; + int total_y = pScrn->frameY1 - pScrn->frameY0; + + if (x < 0) xorigin = -x; + if (y < 0) yorigin = -y; + if (y > total_y) y = total_y; + if (info->Flags & V_DBLSCAN) y *= 2; + if (xorigin >= cursor->MaxWidth) xorigin = cursor->MaxWidth - 1; + if (yorigin >= cursor->MaxHeight) yorigin = cursor->MaxHeight - 1; + + OUTREG(RADEON_CUR_HORZ_VERT_OFF, (RADEON_CUR_LOCK + | (xorigin << 16) + | yorigin)); + OUTREG(RADEON_CUR_HORZ_VERT_POSN, (RADEON_CUR_LOCK + | ((xorigin ? 0 : x) << 16) + | (yorigin ? 0 : y))); + OUTREG(RADEON_CUR_OFFSET, info->cursor_start + yorigin * 16); +} + +/* Copy cursor image from `image' to video memory. RADEONSetCursorPosition + will be called after this, so we can ignore xorigin and yorigin. */ +static void RADEONLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *image) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + CARD32 *s = (CARD32 *)image; + CARD32 *d = (CARD32 *)(info->FB + info->cursor_start); + int y; + CARD32 save; + + save = INREG(RADEON_CRTC_GEN_CNTL); + OUTREG(RADEON_CRTC_GEN_CNTL, save & ~RADEON_CRTC_CUR_EN); + +#if X_BYTE_ORDER == X_BIG_ENDIAN + switch(info->CurrentLayout.pixel_bytes) { + case 4: + case 3: + for (y = 0; y < 64; y++) { + P_SWAP32(d,s); + d++; s++; + P_SWAP32(d,s); + d++; s++; + P_SWAP32(d,s); + d++; s++; + P_SWAP32(d,s); + d++; s++; + } + break; + case 2: + for (y = 0; y < 64; y++) { + P_SWAP16(d,s); + d++; s++; + P_SWAP16(d,s); + d++; s++; + P_SWAP16(d,s); + d++; s++; + P_SWAP16(d,s); + d++; s++; + } + break; + default: + for (y = 0; y < 64; y++) { + *d++ = *s++; + *d++ = *s++; + *d++ = *s++; + *d++ = *s++; + } + } +#else + for (y = 0; y < 64; y++) { + *d++ = *s++; + *d++ = *s++; + *d++ = *s++; + *d++ = *s++; + } +#endif + + /* Set the area after the cursor to be all transparent so that we + won't display corrupted cursors on the screen */ + for (y = 0; y < 64; y++) { + *d++ = 0xffffffff; /* The AND bits */ + *d++ = 0xffffffff; + *d++ = 0x00000000; /* The XOR bits */ + *d++ = 0x00000000; + } + + OUTREG(RADEON_CRTC_GEN_CNTL, save); +} + +/* Hide hardware cursor. */ +static void RADEONHideCursor(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + OUTREGP(RADEON_CRTC_GEN_CNTL, 0, ~RADEON_CRTC_CUR_EN); +} + +/* Show hardware cursor. */ +static void RADEONShowCursor(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + OUTREGP(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_CUR_EN, ~RADEON_CRTC_CUR_EN); +} + +/* Determine if hardware cursor is in use. */ +static Bool RADEONUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); + + return info->cursor_start ? TRUE : FALSE; +} + +/* Initialize hardware cursor support. */ +Bool RADEONCursorInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); + xf86CursorInfoPtr cursor; + FBAreaPtr fbarea; + int width; + int height; + int size; + + + if (!(cursor = info->cursor = xf86CreateCursorInfoRec())) return FALSE; + + cursor->MaxWidth = 64; + cursor->MaxHeight = 64; + cursor->Flags = (HARDWARE_CURSOR_TRUECOLOR_AT_8BPP + +#if X_BYTE_ORDER == X_LITTLE_ENDIAN + | HARDWARE_CURSOR_BIT_ORDER_MSBFIRST +#endif + | HARDWARE_CURSOR_INVERT_MASK + | HARDWARE_CURSOR_AND_SOURCE_WITH_MASK + | HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 + | HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK); + + cursor->SetCursorColors = RADEONSetCursorColors; + cursor->SetCursorPosition = RADEONSetCursorPosition; + cursor->LoadCursorImage = RADEONLoadCursorImage; + cursor->HideCursor = RADEONHideCursor; + cursor->ShowCursor = RADEONShowCursor; + cursor->UseHWCursor = RADEONUseHWCursor; + + size = (cursor->MaxWidth/4) * cursor->MaxHeight; + width = pScrn->displayWidth; + height = (size*2 + 1023) / pScrn->displayWidth; + fbarea = xf86AllocateOffscreenArea(pScreen, + width, + height, + 16, + NULL, + NULL, + NULL); + + if (!fbarea) { + info->cursor_start = 0; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Hardware cursor disabled" + " due to insufficient offscreen memory\n"); + } else { + info->cursor_start = RADEON_ALIGN((fbarea->box.x1 + + width * fbarea->box.y1) + * info->CurrentLayout.pixel_bytes, + 16); + info->cursor_end = info->cursor_start + size; + } + + RADEONTRACE(("RADEONCursorInit (0x%08x-0x%08x)\n", + info->cursor_start, info->cursor_end)); + + return xf86InitCursor(pScreen, cursor); +} diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_dga.c b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_dga.c new file mode 100644 index 000000000..73c9ab786 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_dga.c @@ -0,0 +1,368 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_dga.c,v 1.1 2000/10/18 17:20:03 alanh Exp $ */ +/************************************************************************** + +Copyright 2000 ATI Technologies Inc. and VA Linux Systems, Inc., + Sunnyvale, California. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +on the rights to use, copy, modify, merge, publish, distribute, sub +license, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin <martin@valinux.com> + * + * Credits: + * + * Thanks to Ove Kĺven <ovek@transgaming.com> for writing the Rage 128 + * DGA support. Portions of this file are based on the initialization + * code for that driver. + * + */ + + /* X and server generic header files */ +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86_ansic.h" + + /* Driver data structures */ +#include "radeon.h" + + /* DGA support */ +#include "dgaproc.h" + + +static Bool RADEON_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **, + int *, int *, int *); +static Bool RADEON_SetMode(ScrnInfoPtr, DGAModePtr); +static int RADEON_GetViewport(ScrnInfoPtr); +static void RADEON_SetViewport(ScrnInfoPtr, int, int, int); +static void RADEON_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long); +static void RADEON_BlitRect(ScrnInfoPtr, int, int, int, int, int, int); +#if 0 +static void RADEON_BlitTransRect(ScrnInfoPtr, int, int, int, int, int, int, + unsigned long); +#endif + +static +DGAFunctionRec RADEON_DGAFuncs = { + RADEON_OpenFramebuffer, + NULL, + RADEON_SetMode, + RADEON_SetViewport, + RADEON_GetViewport, + RADEONWaitForIdle, + RADEON_FillRect, + RADEON_BlitRect, +#if 0 + RADEON_BlitTransRect +#else + NULL +#endif +}; + + +static DGAModePtr RADEONSetupDGAMode(ScrnInfoPtr pScrn, + DGAModePtr modes, + int *num, + int bitsPerPixel, + int depth, + Bool pixmap, + int secondPitch, + unsigned long red, + unsigned long green, + unsigned long blue, + short visualClass) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + DGAModePtr newmodes = NULL, currentMode; + DisplayModePtr pMode, firstMode; + int otherPitch, Bpp = bitsPerPixel >> 3; + Bool oneMore; + + pMode = firstMode = pScrn->modes; + + while (pMode) { + otherPitch = secondPitch ? secondPitch : pMode->HDisplay; + + if (pMode->HDisplay != otherPitch) { + newmodes = xrealloc(modes, (*num + 2) * sizeof(DGAModeRec)); + oneMore = TRUE; + } else { + newmodes = xrealloc(modes, (*num + 1) * sizeof(DGAModeRec)); + oneMore = FALSE; + } + + if (!newmodes) { + xfree(modes); + return NULL; + } + modes = newmodes; + +SECOND_PASS: + + currentMode = modes + *num; + (*num)++; + + currentMode->mode = pMode; + /* FIXME: is concurrent access really possible? */ + currentMode->flags = DGA_CONCURRENT_ACCESS; + if (pixmap) + currentMode->flags |= DGA_PIXMAP_AVAILABLE; + if (info->accel) + currentMode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT; + if (pMode->Flags & V_DBLSCAN) + currentMode->flags |= DGA_DOUBLESCAN; + if (pMode->Flags & V_INTERLACE) + currentMode->flags |= DGA_INTERLACED; + currentMode->byteOrder = pScrn->imageByteOrder; + currentMode->depth = depth; + currentMode->bitsPerPixel = bitsPerPixel; + currentMode->red_mask = red; + currentMode->green_mask = green; + currentMode->blue_mask = blue; + currentMode->visualClass = visualClass; + currentMode->viewportWidth = pMode->HDisplay; + currentMode->viewportHeight = pMode->VDisplay; + currentMode->xViewportStep = 8; + currentMode->yViewportStep = 1; + currentMode->viewportFlags = DGA_FLIP_RETRACE; + currentMode->offset = 0; + currentMode->address = (unsigned char*)info->LinearAddr; + + if (oneMore) { /* first one is narrow width */ + currentMode->bytesPerScanline = (((pMode->HDisplay * Bpp) + 3) + & ~3L); + currentMode->imageWidth = pMode->HDisplay; + currentMode->imageHeight = pMode->VDisplay; + currentMode->pixmapWidth = currentMode->imageWidth; + currentMode->pixmapHeight = currentMode->imageHeight; + currentMode->maxViewportX = currentMode->imageWidth - + currentMode->viewportWidth; + /* this might need to get clamped to some maximum */ + currentMode->maxViewportY = (currentMode->imageHeight - + currentMode->viewportHeight); + oneMore = FALSE; + goto SECOND_PASS; + } else { + currentMode->bytesPerScanline = ((otherPitch * Bpp) + 3) & ~3L; + currentMode->imageWidth = otherPitch; + currentMode->imageHeight = pMode->VDisplay; + currentMode->pixmapWidth = currentMode->imageWidth; + currentMode->pixmapHeight = currentMode->imageHeight; + currentMode->maxViewportX = (currentMode->imageWidth - + currentMode->viewportWidth); + /* this might need to get clamped to some maximum */ + currentMode->maxViewportY = (currentMode->imageHeight - + currentMode->viewportHeight); + } + + pMode = pMode->next; + if (pMode == firstMode) + break; + } + + return modes; +} + +Bool RADEONDGAInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); + DGAModePtr modes = NULL; + int num = 0; + + /* 8 */ + modes = RADEONSetupDGAMode(pScrn, modes, &num, 8, 8, + (pScrn->bitsPerPixel == 8), + ((pScrn->bitsPerPixel != 8) + ? 0 : pScrn->displayWidth), + 0, 0, 0, PseudoColor); + + /* 15 */ + modes = RADEONSetupDGAMode(pScrn, modes, &num, 16, 15, + (pScrn->bitsPerPixel == 16), + ((pScrn->depth != 15) + ? 0 : pScrn->displayWidth), + 0x7c00, 0x03e0, 0x001f, TrueColor); + + modes = RADEONSetupDGAMode(pScrn, modes, &num, 16, 15, + (pScrn->bitsPerPixel == 16), + ((pScrn->depth != 15) + ? 0 : pScrn->displayWidth), + 0x7c00, 0x03e0, 0x001f, DirectColor); + + /* 16 */ + modes = RADEONSetupDGAMode(pScrn, modes, &num, 16, 16, + (pScrn->bitsPerPixel == 16), + ((pScrn->depth != 16) + ? 0 : pScrn->displayWidth), + 0xf800, 0x07e0, 0x001f, TrueColor); + + modes = RADEONSetupDGAMode(pScrn, modes, &num, 16, 16, + (pScrn->bitsPerPixel == 16), + ((pScrn->depth != 16) + ? 0 : pScrn->displayWidth), + 0xf800, 0x07e0, 0x001f, DirectColor); + + /* 24 */ + modes = RADEONSetupDGAMode(pScrn, modes, &num, 24, 24, + (pScrn->bitsPerPixel == 24), + ((pScrn->bitsPerPixel != 24) + ? 0 : pScrn->displayWidth), + 0xff0000, 0x00ff00, 0x0000ff, TrueColor); + + modes = RADEONSetupDGAMode(pScrn, modes, &num, 24, 24, + (pScrn->bitsPerPixel == 24), + ((pScrn->bitsPerPixel != 24) + ? 0 : pScrn->displayWidth), + 0xff0000, 0x00ff00, 0x0000ff, DirectColor); + + /* 32 */ + modes = RADEONSetupDGAMode(pScrn, modes, &num, 32, 24, + (pScrn->bitsPerPixel == 32), + ((pScrn->bitsPerPixel != 32) + ? 0 : pScrn->displayWidth), + 0xff0000, 0x00ff00, 0x0000ff, TrueColor); + + modes = RADEONSetupDGAMode(pScrn, modes, &num, 32, 24, + (pScrn->bitsPerPixel == 32), + ((pScrn->bitsPerPixel != 32) + ? 0 : pScrn->displayWidth), + 0xff0000, 0x00ff00, 0x0000ff, DirectColor); + + info->numDGAModes = num; + info->DGAModes = modes; + + return DGAInit(pScreen, &RADEON_DGAFuncs, modes, num); +} + +static Bool RADEON_SetMode(ScrnInfoPtr pScrn, DGAModePtr pMode) +{ + static RADEONFBLayout SavedLayouts[MAXSCREENS]; + int index = pScrn->pScreen->myNum; + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (!pMode) { /* restore the original mode */ + /* put the ScreenParameters back */ + if (info->DGAactive) + memcpy(&info->CurrentLayout, &SavedLayouts[index], + sizeof(RADEONFBLayout)); + + pScrn->currentMode = info->CurrentLayout.mode; + + RADEONSwitchMode(index, pScrn->currentMode, 0); + RADEONAdjustFrame(index, 0, 0, 0); + info->DGAactive = FALSE; + } else { + if (!info->DGAactive) { /* save the old parameters */ + memcpy(&SavedLayouts[index], &info->CurrentLayout, + sizeof(RADEONFBLayout)); + info->DGAactive = TRUE; + } + + info->CurrentLayout.bitsPerPixel = pMode->bitsPerPixel; + info->CurrentLayout.depth = pMode->depth; + info->CurrentLayout.displayWidth = (pMode->bytesPerScanline / + (pMode->bitsPerPixel >> 3)); + info->CurrentLayout.pixel_bytes = pMode->bitsPerPixel / 8; + info->CurrentLayout.pixel_code = (pMode->bitsPerPixel != 16 + ? pMode->bitsPerPixel + : pMode->depth); + /* RADEONModeInit() will set the mode field */ + + RADEONSwitchMode(index, pMode->mode, 0); + } + + return TRUE; +} + +static int RADEON_GetViewport(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + return info->DGAViewportStatus; +} + +static void RADEON_SetViewport(ScrnInfoPtr pScrn, int x, int y, int flags) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + RADEONAdjustFrame(pScrn->pScreen->myNum, x, y, flags); + info->DGAViewportStatus = 0; /* FIXME */ +} + +static void RADEON_FillRect(ScrnInfoPtr pScrn, + int x, int y, int w, int h, + unsigned long color) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (info->accel) { + (*info->accel->SetupForSolidFill)(pScrn, color, GXcopy, ~0); + (*info->accel->SubsequentSolidFillRect)(pScrn, x, y, w, h); + SET_SYNC_FLAG(info->accel); + } +} + +static void RADEON_BlitRect(ScrnInfoPtr pScrn, + int srcx, int srcy, int w, int h, + int dstx, int dsty) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (info->accel) { + int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; + int ydir = (srcy < dsty) ? -1 : 1; + + (*info->accel->SetupForScreenToScreenCopy)(pScrn, xdir, ydir, + GXcopy, ~0, -1); + (*info->accel->SubsequentScreenToScreenCopy)(pScrn, srcx, srcy, + dstx, dsty, w, h); + SET_SYNC_FLAG(info->accel); + } +} + +#if 0 +static void RADEON_BlitTransRect(ScrnInfoPtr pScrn, + int srcx, int srcy, int w, int h, + int dstx, int dsty, unsigned long color) +{ + /* this one should be separate since the XAA function would prohibit + usage of ~0 as the key */ +} +#endif + +static Bool RADEON_OpenFramebuffer(ScrnInfoPtr pScrn, + char **name, + unsigned char **mem, + int *size, int *offset, int *flags) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + *name = NULL; /* no special device */ + *mem = (unsigned char*)info->LinearAddr; + *size = info->FbMapSize; + *offset = 0; + *flags = 0; /* DGA_NEED_ROOT; -- don't need root, just /dev/mem access */ + + return TRUE; +} diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_driver.c new file mode 100644 index 000000000..9b510272d --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_driver.c @@ -0,0 +1,2921 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_driver.c,v 1.2 2000/10/19 10:06:25 alanh Exp $ */ +/************************************************************************** + +Copyright 2000 ATI Technologies Inc. and VA Linux Systems, Inc., + Sunnyvale, California. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +on the rights to use, copy, modify, merge, publish, distribute, sub +license, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin <martin@valinux.com> + * Rickard E. Faith <faith@valinux.com> + * + * Credits: + * + * Thanks to Ani Joshi <ajoshi@shell.unixbox.com> for providing source + * code to his Radeon driver. Portions of this file are based on the + * initialization code for that driver. + * + * References: + * + * !!!! FIXME !!!! + * RAGE 128 VR/ RAGE 128 GL Register Reference Manual (Technical + * Reference Manual P/N RRG-G04100-C Rev. 0.04), ATI Technologies: April + * 1999. + * + * RAGE 128 Software Development Manual (Technical Reference Manual P/N + * SDK-G04000 Rev. 0.01), ATI Technologies: June 1999. + * + * This server does not yet support these XFree86 4.0 features: + * !!!! FIXME !!!! + * DDC1 & DDC2 + * shadowfb + * overlay planes + * + */ + + + /* X and server generic header files */ +#include "xf86.h" +#include "xf86_ansic.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86RAC.h" +#include "xf86cmap.h" +#include "xf86fbman.h" +#include "xf86int10.h" + /* Backing store, software cursor, and + colormap initialization */ +#include "mibstore.h" +#include "mipointer.h" +#include "micmap.h" + +#define USE_FB /* not until overlays */ +#ifdef USE_FB +#include "fb.h" +#else + /* CFB support */ +#define PSZ 8 +#include "cfb.h" +#undef PSZ +#include "cfb16.h" +#include "cfb24.h" +#include "cfb32.h" +#include "cfb24_32.h" +#endif + + /* Driver data structures */ +#include "ati2.h" +#include "radeon.h" +#include "radeon_probe.h" +#include "radeon_reg.h" + +#ifndef MAX +#define MAX(a,b) ((a)>(b)?(a):(b)) +#endif + + + /* Forward definitions for driver functions */ +static Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags); +static Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, + int argc, char **argv); + +static int RADEONValidMode(int scrnIndex, DisplayModePtr mode, + Bool verbose, int flag); +static Bool RADEONEnterVT(int scrnIndex, int flags); +static void RADEONLeaveVT(int scrnIndex, int flags); +static Bool RADEONCloseScreen(int scrnIndex, ScreenPtr pScreen); +static void RADEONFreeScreen(int scrnIndex, int flags); +static Bool RADEONSaveScreen(ScreenPtr pScreen, int mode); +static void RADEONSave(ScrnInfoPtr pScrn); +static void RADEONRestore(ScrnInfoPtr pScrn); +static Bool RADEONModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode); +static void RADEONDisplayPowerManagementSet(ScrnInfoPtr pScrn, + int PowerManagementMode, + int flags); +static Bool RADEONEnterVTFBDev(int scrnIndex, int flags); +static void RADEONLeaveVTFBDev(int scrnIndex, int flags); + + /* Chipsets */ +static SymTabRec RADEONChipsets[] = { + { PCI_CHIP_RADEON_QD, "ATI Radeon QD (AGP)" }, + { PCI_CHIP_RADEON_QE, "ATI Radeon QE (AGP)" }, + { PCI_CHIP_RADEON_QF, "ATI Radeon QF (AGP)" }, + { PCI_CHIP_RADEON_QG, "ATI Radeon QG (AGP)" }, + { -1, NULL } +}; + +static PciChipsets RADEONPciChipsets[] = { + { PCI_CHIP_RADEON_QD, PCI_CHIP_RADEON_QD, RES_SHARED_VGA }, + { PCI_CHIP_RADEON_QE, PCI_CHIP_RADEON_QE, RES_SHARED_VGA }, + { PCI_CHIP_RADEON_QF, PCI_CHIP_RADEON_QF, RES_SHARED_VGA }, + { PCI_CHIP_RADEON_QG, PCI_CHIP_RADEON_QG, RES_SHARED_VGA }, + { -1, -1, RES_UNDEFINED } +}; + +typedef enum { + OPTION_NOACCEL, + OPTION_SW_CURSOR, + OPTION_DAC_6BIT, + OPTION_DAC_8BIT, +#ifdef XF86DRI + OPTION_IS_PCI, + OPTION_CP_PIO, + OPTION_NO_SECURITY, + OPTION_USEC_TIMEOUT, + OPTION_AGP_MODE, + OPTION_AGP_SIZE, + OPTION_RING_SIZE, + OPTION_VERT_SIZE, + OPTION_VBUF_SIZE, + OPTION_USE_CP_2D, +#endif +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ +#if 0 + /* FIXME: Disable CRTOnly until it is tested */ + OPTION_CRT, +#endif + OPTION_PANEL_WIDTH, + OPTION_PANEL_HEIGHT, +#endif + OPTION_FBDEV +} RADEONOpts; + +static OptionInfoRec RADEONOptions[] = { + { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_DAC_6BIT, "Dac6Bit", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_DAC_8BIT, "Dac8Bit", OPTV_BOOLEAN, {0}, TRUE }, +#ifdef XF86DRI + { OPTION_IS_PCI, "ForcePCIMode", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_CP_PIO, "CPPIOMode", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_NO_SECURITY, "CPNoSecurity", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_USEC_TIMEOUT, "CPusecTimeout", OPTV_INTEGER, {0}, FALSE }, + { OPTION_AGP_MODE, "AGPMode", OPTV_INTEGER, {0}, FALSE }, + { OPTION_AGP_SIZE, "AGPSize", OPTV_INTEGER, {0}, FALSE }, + { OPTION_RING_SIZE, "RingSize", OPTV_INTEGER, {0}, FALSE }, + { OPTION_VERT_SIZE, "VBListSize", OPTV_INTEGER, {0}, FALSE }, + { OPTION_VBUF_SIZE, "VBSize", OPTV_INTEGER, {0}, FALSE }, + { OPTION_USE_CP_2D, "UseCPfor2D", OPTV_BOOLEAN, {0}, FALSE }, +#endif +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ +#if 0 + /* FIXME: Disable CRTOnly until it is tested */ + { OPTION_CRT, "CRTOnly", OPTV_BOOLEAN, {0}, FALSE }, +#endif + { OPTION_PANEL_WIDTH, "PanelWidth", OPTV_INTEGER, {0}, FALSE }, + { OPTION_PANEL_HEIGHT, "PanelHeight", OPTV_INTEGER, {0}, FALSE }, +#endif + { OPTION_FBDEV, "UseFBDev", OPTV_BOOLEAN, {0}, FALSE }, + { -1, NULL, OPTV_NONE, {0}, FALSE } +}; + +RADEONRAMRec RADEONRAM[] = { /* Memory Specifications + From Radeon Manual */ + { 4, 4, 1, 2, 1, 2, 1, 16, 12, "64-bit SDR SDRAM" }, + { 4, 4, 3, 3, 2, 3, 1, 16, 12, "64-bit DDR SDRAM" }, +}; + +extern const char *vgahwSymbols[]; +extern const char *fbdevHWSymbols[]; +extern const char *ddcSymbols[]; + +/* Allocate our private RADEONInfoRec. */ +static Bool RADEONGetRec(ScrnInfoPtr pScrn) +{ + if (pScrn->driverPrivate) return TRUE; + + pScrn->driverPrivate = xnfcalloc(sizeof(RADEONInfoRec), 1); + return TRUE; +} + +/* Free our private RADEONInfoRec. */ +static void RADEONFreeRec(ScrnInfoPtr pScrn) +{ + if (!pScrn || !pScrn->driverPrivate) return; + xfree(pScrn->driverPrivate); + pScrn->driverPrivate = NULL; +} + +/* Memory map the MMIO region. Used during pre-init and by RADEONMapMem, + below. */ +static Bool RADEONMapMMIO(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (info->FBDev) { + info->MMIO = fbdevHWMapMMIO(pScrn); + } else { + info->MMIO = xf86MapPciMem(pScrn->scrnIndex, + VIDMEM_MMIO | VIDMEM_READSIDEEFFECT, + info->PciTag, + info->MMIOAddr, + RADEON_MMIOSIZE); + } + + if (!info->MMIO) return FALSE; + return TRUE; +} + +/* Unmap the MMIO region. Used during pre-init and by RADEONUnmapMem, + below. */ +static Bool RADEONUnmapMMIO(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (info->FBDev) + fbdevHWUnmapMMIO(pScrn); + else { + xf86UnMapVidMem(pScrn->scrnIndex, info->MMIO, RADEON_MMIOSIZE); + } + info->MMIO = NULL; + return TRUE; +} + +/* Memory map the frame buffer. Used by RADEONMapMem, below. */ +static Bool RADEONMapFB(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (info->FBDev) { + info->FB = fbdevHWMapVidmem(pScrn); + } else { + info->FB = xf86MapPciMem(pScrn->scrnIndex, + VIDMEM_FRAMEBUFFER, + info->PciTag, + info->LinearAddr, + info->FbMapSize); + } + + if (!info->FB) return FALSE; + return TRUE; +} + +/* Unmap the frame buffer. Used by RADEONUnmapMem, below. */ +static Bool RADEONUnmapFB(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (info->FBDev) + fbdevHWUnmapVidmem(pScrn); + else + xf86UnMapVidMem(pScrn->scrnIndex, info->FB, info->FbMapSize); + info->FB = NULL; + return TRUE; +} + +/* Memory map the MMIO region and the frame buffer. */ +static Bool RADEONMapMem(ScrnInfoPtr pScrn) +{ + if (!RADEONMapMMIO(pScrn)) return FALSE; + if (!RADEONMapFB(pScrn)) { + RADEONUnmapMMIO(pScrn); + return FALSE; + } + return TRUE; +} + +/* Unmap the MMIO region and the frame buffer. */ +static Bool RADEONUnmapMem(ScrnInfoPtr pScrn) +{ + if (!RADEONUnmapMMIO(pScrn) || !RADEONUnmapFB(pScrn)) return FALSE; + return TRUE; +} + +/* Read PLL information */ +int RADEONINPLL(ScrnInfoPtr pScrn, int addr) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + +#if !RADEON_ATOMIC_UPDATE + while ( (INREG8(RADEON_CLOCK_CNTL_INDEX) & 0x9f) != addr) { +#endif + OUTREG8(RADEON_CLOCK_CNTL_INDEX, addr & 0x1f); +#if !RADEON_ATOMIC_UPDATE + } +#endif + return INREG(RADEON_CLOCK_CNTL_DATA); +} + +#if 0 +/* Read PAL information (only used for debugging). */ +static int RADEONINPAL(int idx) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + OUTREG(RADEON_PALETTE_INDEX, idx << 16); + return INREG(RADEON_PALETTE_DATA); +} +#endif + +/* Wait for vertical sync. */ +void RADEONWaitForVerticalSync(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int i; + + OUTREG(RADEON_GEN_INT_STATUS, RADEON_VSYNC_INT_AK); + for (i = 0; i < RADEON_TIMEOUT; i++) { + if (INREG(RADEON_GEN_INT_STATUS) & RADEON_VSYNC_INT) break; + } +} + +/* Blank screen. */ +static void RADEONBlank(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + OUTREGP(RADEON_CRTC_EXT_CNTL, + RADEON_CRTC_DISPLAY_DIS | + RADEON_CRTC_VSYNC_DIS | + RADEON_CRTC_HSYNC_DIS, + ~(RADEON_CRTC_DISPLAY_DIS | + RADEON_CRTC_VSYNC_DIS | + RADEON_CRTC_HSYNC_DIS)); +} + +/* Unblank screen. */ +static void RADEONUnblank(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + OUTREGP(RADEON_CRTC_EXT_CNTL, 0, + ~(RADEON_CRTC_DISPLAY_DIS | + RADEON_CRTC_VSYNC_DIS | + RADEON_CRTC_HSYNC_DIS)); +} + +/* Compute log base 2 of val. */ +int RADEONMinBits(int val) +{ + int bits; + + if (!val) return 1; + for (bits = 0; val; val >>= 1, ++bits); + return bits; +} + +/* Compute n/d with rounding. */ +static int RADEONDiv(int n, int d) +{ + return (n + (d / 2)) / d; +} + +/* Read the Video BIOS block and the FP registers (if applicable). */ +static Bool RADEONGetBIOSParameters(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); +#ifdef ENABLE_FLAT_PANEL + int i; + int FPHeader = 0; +#endif + +#define RADEONReadBIOS(offset, buffer, length) \ + (info->BIOSFromPCI ? \ + xf86ReadPciBIOS(offset, info->PciTag, 0, buffer, length) : \ + xf86ReadBIOS(info->BIOSAddr, offset, buffer, length)) + +#define RADEON_BIOS8(v) (*((CARD8 *)(info->VBIOS + (v)))) +#define RADEON_BIOS16(v) (*((CARD16 *)(info->VBIOS + (v)))) +#define RADEON_BIOS32(v) (*((CARD32 *)(info->VBIOS + (v)))) + + if (!(info->VBIOS = xalloc(RADEON_VBIOS_SIZE))) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Cannot allocate space for hold Video BIOS!\n"); + return FALSE; + } + + info->BIOSFromPCI = TRUE; + RADEONReadBIOS(0x0000, info->VBIOS, RADEON_VBIOS_SIZE); + if (info->VBIOS[0] != 0x55 || info->VBIOS[1] != 0xaa) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Video BIOS not detected in PCI space!\n"); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Attempting to read Video BIOS from legacy ISA space!\n"); + info->BIOSFromPCI = FALSE; + info->BIOSAddr = 0x000c0000; + RADEONReadBIOS(0x0000, info->VBIOS, RADEON_VBIOS_SIZE); + } + if (info->VBIOS[0] != 0x55 || info->VBIOS[1] != 0xaa) { + info->BIOSAddr = 0x00000000; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Video BIOS not found!\n"); + } + +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + if (info->HasPanelRegs) { + info->FPBIOSstart = 0; + + /* FIXME: There should be direct access to the start of the FP info + tables, but until we find out where that offset is stored, we + must search for the ATI signature string: "M3 ". */ + for (i = 4; i < RADEON_VBIOS_SIZE-8; i++) { + if (RADEON_BIOS8(i) == 'M' && + RADEON_BIOS8(i+1) == '3' && + RADEON_BIOS8(i+2) == ' ' && + RADEON_BIOS8(i+3) == ' ' && + RADEON_BIOS8(i+4) == ' ' && + RADEON_BIOS8(i+5) == ' ' && + RADEON_BIOS8(i+6) == ' ' && + RADEON_BIOS8(i+7) == ' ') { + FPHeader = i-2; + break; + } + } + + if (!FPHeader) return TRUE; + + /* Assume that only one panel is attached and supported */ + for (i = FPHeader+20; i < FPHeader+84; i += 2) { + if (RADEON_BIOS16(i) != 0) { + info->FPBIOSstart = RADEON_BIOS16(i); + break; + } + } + if (!info->FPBIOSstart) return TRUE; + + if (!info->PanelXRes) + info->PanelXRes = RADEON_BIOS16(info->FPBIOSstart+25); + if (!info->PanelYRes) + info->PanelYRes = RADEON_BIOS16(info->FPBIOSstart+27); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel size: %dx%d\n", + info->PanelXRes, info->PanelYRes); + + info->PanelPwrDly = RADEON_BIOS8(info->FPBIOSstart+56); + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel ID: "); + for (i = 1; i <= 24; i++) + ErrorF("%c", RADEON_BIOS8(info->FPBIOSstart+i)); + ErrorF("\n"); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel Type: "); + i = RADEON_BIOS16(info->FPBIOSstart+29); + if (i & 1) ErrorF("Color, "); + else ErrorF("Monochrome, "); + if (i & 2) ErrorF("Dual(split), "); + else ErrorF("Single, "); + switch ((i >> 2) & 0x3f) { + case 0: ErrorF("STN"); break; + case 1: ErrorF("TFT"); break; + case 2: ErrorF("Active STN"); break; + case 3: ErrorF("EL"); break; + case 4: ErrorF("Plasma"); break; + default: ErrorF("UNKNOWN"); break; + } + ErrorF("\n"); + if (RADEON_BIOS8(info->FPBIOSstart+61) & 1) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel Interface: LVDS\n"); + } else { + /* FIXME: Add Non-LVDS flat pael support */ + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Non-LVDS panel interface detected! " + "This support is untested and may not " + "function properly\n"); + } + } +#endif + + return TRUE; +} + +/* Read PLL parameters from BIOS block. Default to typical values if there + is no BIOS. */ +static Bool RADEONGetPLLParameters(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + RADEONPLLPtr pll = &info->pll; + CARD16 bios_header; + CARD16 pll_info_block; + + if (!info->VBIOS) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Video BIOS not detected, using default PLL parameters!\n"); + /* These probably aren't going to work for + the card you are using. Specifically, + reference freq can be 29.50MHz, + 28.63MHz, or 14.32MHz. YMMV. */ + pll->reference_freq = 2950; + pll->reference_div = 65; + pll->min_pll_freq = 12500; + pll->max_pll_freq = 35000; + pll->xclk = 10300; + } else { + bios_header = RADEON_BIOS16(0x48); + pll_info_block = RADEON_BIOS16(bios_header + 0x30); + RADEONTRACE(("Header at 0x%04x; PLL Information at 0x%04x\n", + bios_header, pll_info_block)); + + pll->reference_freq = RADEON_BIOS16(pll_info_block + 0x0e); + pll->reference_div = RADEON_BIOS16(pll_info_block + 0x10); + pll->min_pll_freq = RADEON_BIOS32(pll_info_block + 0x12); + pll->max_pll_freq = RADEON_BIOS32(pll_info_block + 0x16); + pll->xclk = RADEON_BIOS16(pll_info_block + 0x08); + } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "PLL parameters: rf=%d rd=%d min=%d max=%d; xclk=%d\n", + pll->reference_freq, + pll->reference_div, + pll->min_pll_freq, + pll->max_pll_freq, + pll->xclk); + + return TRUE; +} + +/* Return the options for supported chipset 'n'; NULL otherwise. */ +OptionInfoPtr RADEONAvailableOptions(int chipid, int busid) +{ + int i; + + /* Check to make sure that chip 'chipid' is supported by the Radeon + driver */ + for (i = 0; RADEONPciChipsets[i].PCIid > 0; i++) { + if (chipid == RADEONPciChipsets[i].PCIid) + return RADEONOptions; + } + return NULL; +} + +/* Return the string name for supported chipset 'n'; NULL otherwise. */ +void RADEONIdentify(int flags) +{ + xf86PrintChipsets(RADEON_NAME, + "Driver for ATI Radeon chipset", + RADEONChipsets); +} + +/* Return TRUE if chipset is present; FALSE otherwise. */ +Bool RADEONProbe(DriverPtr drv, int flags) +{ + int numUsed; + int numDevSections; + int *usedChips; + GDevPtr *devSections; + EntityInfoPtr pEnt; + Bool foundScreen = FALSE; + int i; + + /* Check to make sure that the RADEON_NAME or the ATI2_NAME is listed + as the Driver in the "Device" section of the XF86Config file */ + if ((numDevSections = xf86MatchDevice(RADEON_NAME, &devSections)) <= 0) + if ((numDevSections = xf86MatchDevice(ATI2_NAME, &devSections)) <= 0) + return FALSE; + + if (!xf86GetPciVideoInfo()) return FALSE; + + numUsed = xf86MatchPciInstances(RADEON_NAME, + PCI_VENDOR_ATI, + RADEONChipsets, + RADEONPciChipsets, + devSections, + numDevSections, + drv, + &usedChips); + + if (numUsed<=0) return FALSE; + + if (flags & PROBE_DETECT) + foundScreen = TRUE; + else for (i = 0; i < numUsed; i++) { + pEnt = xf86GetEntityInfo(usedChips[i]); + + if (pEnt->active) { + ScrnInfoPtr pScrn = xf86AllocateScreen(drv, 0); + + pScrn->driverVersion = ATI2_VERSION; + pScrn->driverName = RADEON_NAME; + pScrn->name = RADEON_NAME; + pScrn->Probe = RADEONProbe; + pScrn->PreInit = RADEONPreInit; + pScrn->ScreenInit = RADEONScreenInit; + pScrn->SwitchMode = RADEONSwitchMode; + pScrn->AdjustFrame = RADEONAdjustFrame; + pScrn->EnterVT = RADEONEnterVT; + pScrn->LeaveVT = RADEONLeaveVT; + pScrn->FreeScreen = RADEONFreeScreen; + pScrn->ValidMode = RADEONValidMode; + + foundScreen = TRUE; + + xf86ConfigActivePciEntity(pScrn, usedChips[i], RADEONPciChipsets, + 0, 0, 0, 0, 0); + } + xfree(pEnt); + } + + if (numUsed) xfree(usedChips); + xfree(devSections); + + return foundScreen; +} + +/* This is called by RADEONPreInit to set up the default visual. */ +static Bool RADEONPreInitVisual(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (!xf86SetDepthBpp(pScrn, 8, 8, 8, Support32bppFb)) + return FALSE; + + switch (pScrn->depth) { + case 8: + case 15: + case 16: + case 24: + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Given depth (%d) is not supported by %s driver\n", + pScrn->depth, RADEON_NAME); + return FALSE; + } + + xf86PrintDepthBpp(pScrn); + + info->fifo_slots = 0; + info->pix24bpp = xf86GetBppFromDepth(pScrn, pScrn->depth); + info->CurrentLayout.bitsPerPixel = pScrn->bitsPerPixel; + info->CurrentLayout.depth = pScrn->depth; + info->CurrentLayout.pixel_bytes = pScrn->bitsPerPixel / 8; + info->CurrentLayout.pixel_code = (pScrn->bitsPerPixel != 16 + ? pScrn->bitsPerPixel + : pScrn->depth); + + if (info->pix24bpp == 24) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Radeon does NOT support 24bpp\n"); + return FALSE; + } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Pixel depth = %d bits stored in %d byte%s (%d bpp pixmaps)\n", + pScrn->depth, + info->CurrentLayout.pixel_bytes, + info->CurrentLayout.pixel_bytes > 1 ? "s" : "", + info->pix24bpp); + + + if (!xf86SetDefaultVisual(pScrn, -1)) return FALSE; + + if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Default visual (%s) is not supported at depth %d\n", + xf86GetVisualName(pScrn->defaultVisual), pScrn->depth); + return FALSE; + } + return TRUE; + +} + +/* This is called by RADEONPreInit to handle all color weight issues. */ +static Bool RADEONPreInitWeight(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + /* Save flag for 6 bit DAC to use for + setting CRTC registers. Otherwise use + an 8 bit DAC, even if xf86SetWeight sets + pScrn->rgbBits to some value other than + 8. */ + info->dac6bits = FALSE; + if (pScrn->depth > 8) { + rgb defaultWeight = { 0, 0, 0 }; + if (!xf86SetWeight(pScrn, defaultWeight, defaultWeight)) return FALSE; + } else { + pScrn->rgbBits = 8; + if (xf86ReturnOptValBool(RADEONOptions, OPTION_DAC_6BIT, FALSE)) { + pScrn->rgbBits = 6; + info->dac6bits = TRUE; + } + } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d bits per RGB (%d bit DAC)\n", + pScrn->rgbBits, info->dac6bits ? 6 : 8); + + return TRUE; + +} + +/* This is called by RADEONPreInit to handle config file overrides for things + like chipset and memory regions. Also determine memory size and type. + If memory type ever needs an override, put it in this routine. */ +static Bool RADEONPreInitConfig(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + EntityInfoPtr pEnt = info->pEnt; + GDevPtr dev = pEnt->device; + int offset = 0; /* RAM Type */ + MessageType from; + unsigned char *RADEONMMIO; + + /* Chipset */ + from = X_PROBED; + if (dev->chipset && *dev->chipset) { + info->Chipset = xf86StringToToken(RADEONChipsets, dev->chipset); + from = X_CONFIG; + } else if (dev->chipID >= 0) { + info->Chipset = dev->chipID; + from = X_CONFIG; + } else { + info->Chipset = info->PciInfo->chipType; + } + pScrn->chipset = (char *)xf86TokenToString(RADEONChipsets, info->Chipset); + + if (!pScrn->chipset) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "ChipID 0x%04x is not recognized\n", info->Chipset); + return FALSE; + } + + if (info->Chipset < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Chipset \"%s\" is not recognized\n", pScrn->chipset); + return FALSE; + } + + xf86DrvMsg(pScrn->scrnIndex, from, + "Chipset: \"%s\" (ChipID = 0x%04x)\n", + pScrn->chipset, + info->Chipset); + + /* Framebuffer */ + + from = X_PROBED; + info->LinearAddr = info->PciInfo->memBase[0] & 0xfc000000; + if (dev->MemBase) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Linear address override, using 0x%08x instead of 0x%08x\n", + dev->MemBase, + info->LinearAddr); + info->LinearAddr = dev->MemBase; + from = X_CONFIG; + } else if (!info->LinearAddr) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "No valid linear framebuffer address\n"); + return FALSE; + } + xf86DrvMsg(pScrn->scrnIndex, from, + "Linear framebuffer at 0x%08lx\n", info->LinearAddr); + + /* MMIO registers */ + from = X_PROBED; + info->MMIOAddr = info->PciInfo->memBase[2] & 0xffffff00; + if (dev->IOBase) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "MMIO address override, using 0x%08x instead of 0x%08x\n", + dev->IOBase, + info->MMIOAddr); + info->MMIOAddr = dev->IOBase; + from = X_CONFIG; + } else if (!info->MMIOAddr) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid MMIO address\n"); + return FALSE; + } + xf86DrvMsg(pScrn->scrnIndex, from, + "MMIO registers at 0x%08lx\n", info->MMIOAddr); + + /* BIOS */ + from = X_PROBED; + info->BIOSAddr = info->PciInfo->biosBase & 0xfffe0000; + if (dev->BiosBase) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "BIOS address override, using 0x%08x instead of 0x%08x\n", + dev->BiosBase, + info->BIOSAddr); + info->BIOSAddr = dev->BiosBase; + from = X_CONFIG; + } + if (info->BIOSAddr) { + xf86DrvMsg(pScrn->scrnIndex, from, + "BIOS at 0x%08lx\n", info->BIOSAddr); + } + +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + /* Flat panel (part 1) */ + /* FIXME: Make this an option */ + switch (info->Chipset) { +#if 0 + case PCI_CHIP_RADEON_XX: info->HasPanelRegs = TRUE; break; +#endif + case PCI_CHIP_RADEON_QD: + case PCI_CHIP_RADEON_QE: + case PCI_CHIP_RADEON_QF: + case PCI_CHIP_RADEON_QG: + default: info->HasPanelRegs = FALSE; break; + } +#endif + + /* Read registers used to determine options */ + from = X_PROBED; + RADEONMapMMIO(pScrn); + RADEONMMIO = info->MMIO; + if (info->FBDev) + pScrn->videoRam = fbdevHWGetVidmem(pScrn) / 1024; + else + pScrn->videoRam = INREG(RADEON_CONFIG_MEMSIZE) / 1024; + info->MemCntl = INREG(RADEON_SDRAM_MODE_REG); + info->BusCntl = INREG(RADEON_BUS_CNTL); + RADEONMMIO = NULL; + RADEONUnmapMMIO(pScrn); + + /* RAM */ + switch (info->MemCntl >> 30) { + case 0: offset = 0; break; /* 64-bit SDR SDRAM */ + case 1: offset = 1; break; /* 64-bit DDR SDRAM */ + default: offset = 0; + } + info->ram = &RADEONRAM[offset]; + + if (dev->videoRam) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Video RAM override, using %d kB instead of %d kB\n", + dev->videoRam, + pScrn->videoRam); + from = X_CONFIG; + pScrn->videoRam = dev->videoRam; + } + pScrn->videoRam &= ~1023; + info->FbMapSize = pScrn->videoRam * 1024; + xf86DrvMsg(pScrn->scrnIndex, from, + "VideoRAM: %d kByte (%s)\n", pScrn->videoRam, info->ram->name); + +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + /* Flat panel (part 2) */ + if (info->HasPanelRegs) { +#if 1 + info->CRTOnly = FALSE; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using flat panel for display\n"); +#else + /* Panel CRT mode override */ + if ((info->CRTOnly = xf86ReturnOptValBool(RADEONOptions, + OPTION_CRT, FALSE))) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Using external CRT instead of " + "flat panel for display\n"); + } else { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using flat panel for display\n"); + } +#endif + + /* Panel width/height overrides */ + info->PanelXRes = 0; + info->PanelYRes = 0; + if (xf86GetOptValInteger(RADEONOptions, + OPTION_PANEL_WIDTH, &(info->PanelXRes))) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Flat panel width: %d\n", info->PanelXRes); + } + if (xf86GetOptValInteger(RADEONOptions, + OPTION_PANEL_HEIGHT, &(info->PanelYRes))) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Flat panel height: %d\n", info->PanelYRes); + } + } else { + info->CRTOnly = FALSE; + } +#endif + +#ifdef XF86DRI + /* AGP/PCI */ + if (xf86ReturnOptValBool(RADEONOptions, OPTION_IS_PCI, FALSE)) { + info->IsPCI = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced into PCI-only mode\n"); + } else { + switch (info->Chipset) { +#if 0 + case PCI_CHIP_RADEON_XX: info->IsPCI = TRUE; break; +#endif + case PCI_CHIP_RADEON_QD: + case PCI_CHIP_RADEON_QE: + case PCI_CHIP_RADEON_QF: + case PCI_CHIP_RADEON_QG: + default: info->IsPCI = FALSE; break; + } + } +#endif + + return TRUE; +} + +static Bool RADEONPreInitDDC(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + vbeInfoPtr pVbe; + + if (!xf86LoadSubModule(pScrn, "ddc")) return FALSE; + xf86LoaderReqSymLists(ddcSymbols, NULL); + if (xf86LoadSubModule(pScrn, "vbe")) { + pVbe = VBEInit(NULL,info->pEnt->index); + if (!pVbe) return FALSE; + + xf86SetDDCproperties(pScrn,xf86PrintEDID(vbeDoEDID(pVbe,NULL))); + return TRUE; + } else + return FALSE; +} + +/* This is called by RADEONPreInit to initialize gamma correction. */ +static Bool RADEONPreInitGamma(ScrnInfoPtr pScrn) +{ + Gamma zeros = { 0.0, 0.0, 0.0 }; + + if (!xf86SetGamma(pScrn, zeros)) return FALSE; + return TRUE; +} + +/* This is called by RADEONPreInit to validate modes and compute parameters + for all of the valid modes. */ +static Bool RADEONPreInitModes(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + ClockRangePtr clockRanges; + int modesFound; + char *mod = NULL; + const char *Sym = NULL; + + /* Get mode information */ + pScrn->progClock = TRUE; + clockRanges = xnfcalloc(sizeof(*clockRanges), 1); + clockRanges->next = NULL; + clockRanges->minClock = info->pll.min_pll_freq; + clockRanges->maxClock = info->pll.max_pll_freq * 10; + clockRanges->clockIndex = -1; +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + if (info->HasPanelRegs) { + clockRanges->interlaceAllowed = FALSE; + clockRanges->doubleScanAllowed = FALSE; + } else { + clockRanges->interlaceAllowed = TRUE; + clockRanges->doubleScanAllowed = TRUE; + } +#else + clockRanges->interlaceAllowed = TRUE; + clockRanges->doubleScanAllowed = TRUE; +#endif + + modesFound = xf86ValidateModes(pScrn, + pScrn->monitor->Modes, + pScrn->display->modes, + clockRanges, + NULL, /* linePitches */ + 8 * 64, /* minPitch */ + 8 * 1024, /* maxPitch */ + 64 * pScrn->bitsPerPixel, /* pitchInc */ + 128, /* minHeight */ + 2048, /* maxHeight */ + pScrn->virtualX, + pScrn->virtualY, + info->FbMapSize, + LOOKUP_BEST_REFRESH); + + if (modesFound < 1 && info->FBDev) { + fbdevHWUseBuildinMode(pScrn); + pScrn->displayWidth = pScrn->virtualX; /* FIXME: might be wrong */ + modesFound = 1; + } + + if (modesFound == -1) return FALSE; + xf86PruneDriverModes(pScrn); + if (!modesFound || !pScrn->modes) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n"); + return FALSE; + } + xf86SetCrtcForModes(pScrn, 0); + pScrn->currentMode = pScrn->modes; + xf86PrintModes(pScrn); + + /* Set DPI */ + xf86SetDpi(pScrn, 0, 0); + + /* Get ScreenInit function */ +#ifdef USE_FB + mod = "fb"; + Sym = "fbScreenInit"; +#else + switch (pScrn->bitsPerPixel) { + case 8: mod = "cfb"; Sym = "cfbScreenInit"; break; + case 16: mod = "cfb16"; Sym = "cfb16ScreenInit"; break; + case 32: mod = "cfb32"; Sym = "cfb32ScreenInit"; break; + } +#endif + if (mod && !xf86LoadSubModule(pScrn, mod)) return FALSE; + xf86LoaderReqSymbols(Sym, NULL); + +#ifdef USE_FB +#ifdef RENDER + xf86LoaderReqSymbols("fbPictureInit", NULL); +#endif +#endif + + info->CurrentLayout.displayWidth = pScrn->displayWidth; + info->CurrentLayout.mode = pScrn->currentMode; + + return TRUE; +} + +/* This is called by RADEONPreInit to initialize the hardware cursor. */ +static Bool RADEONPreInitCursor(ScrnInfoPtr pScrn) +{ + if (!xf86ReturnOptValBool(RADEONOptions, OPTION_SW_CURSOR, FALSE)) { + if (!xf86LoadSubModule(pScrn, "ramdac")) return FALSE; + } + return TRUE; +} + +/* This is called by RADEONPreInit to initialize hardware acceleration. */ +static Bool RADEONPreInitAccel(ScrnInfoPtr pScrn) +{ + if (!xf86ReturnOptValBool(RADEONOptions, OPTION_NOACCEL, FALSE)) { + if (!xf86LoadSubModule(pScrn, "xaa")) return FALSE; + } + return TRUE; +} + +static Bool RADEONPreInitInt10(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); +#if 1 + if (xf86LoadSubModule(pScrn, "int10")) { + xf86Int10InfoPtr pInt; + xf86DrvMsg(pScrn->scrnIndex,X_INFO,"initializing int10\n"); + pInt = xf86InitInt10(info->pEnt->index); + xf86FreeInt10(pInt); + } +#endif + return TRUE; +} + +#ifdef XF86DRI +static Bool RADEONPreInitDRI(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (info->IsPCI) { + info->CPMode = RADEON_DEFAULT_CP_PIO_MODE; + } else if (xf86ReturnOptValBool(RADEONOptions, OPTION_CP_PIO, FALSE)) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forcing CP into PIO mode\n"); + info->CPMode = RADEON_DEFAULT_CP_PIO_MODE; + } else { + info->CPMode = RADEON_DEFAULT_CP_BM_MODE; + } + + if (xf86ReturnOptValBool(RADEONOptions, OPTION_USE_CP_2D, FALSE)) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Using CP for 2D\n"); + info->CP2D = TRUE; + } else { + info->CP2D = FALSE; + } + + if (xf86ReturnOptValBool(RADEONOptions, OPTION_NO_SECURITY, FALSE)) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "WARNING!!! CP Security checks disabled!!! **********\n"); + info->CPSecure = FALSE; + } else { + info->CPSecure = TRUE; + } + + info->agpMode = RADEON_DEFAULT_AGP_MODE; + info->agpSize = RADEON_DEFAULT_AGP_SIZE; + info->ringSize = RADEON_DEFAULT_RING_SIZE; + info->vbSize = RADEON_DEFAULT_VB_SIZE; + info->indSize = RADEON_DEFAULT_IND_SIZE; + info->agpTexSize = RADEON_DEFAULT_AGP_TEX_SIZE; + + info->vbBufSize = RADEON_DEFAULT_VB_BUF_SIZE; + + info->CPusecTimeout = RADEON_DEFAULT_CP_TIMEOUT; + + if (!info->IsPCI) { + if (xf86GetOptValInteger(RADEONOptions, + OPTION_AGP_MODE, &(info->agpMode))) { + if (info->agpMode < 1 || info->agpMode > RADEON_AGP_MAX_MODE) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Illegal AGP Mode: %d\n", info->agpMode); + return FALSE; + } + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Using AGP %dx mode\n", info->agpMode); + } + + if (xf86GetOptValInteger(RADEONOptions, + OPTION_AGP_SIZE, (int *)&(info->agpSize))) { + switch (info->agpSize) { + case 4: + case 8: + case 16: + case 32: + case 64: + case 128: + case 256: + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Illegal AGP size: %d MB\n", info->agpSize); + return FALSE; + } + } + + if (xf86GetOptValInteger(RADEONOptions, + OPTION_RING_SIZE, &(info->ringSize))) { + if (info->ringSize < 1 || info->ringSize >= info->agpSize) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Illegal ring buffer size: %d MB\n", + info->ringSize); + return FALSE; + } + } + + if (xf86GetOptValInteger(RADEONOptions, + OPTION_VERT_SIZE, &(info->vbSize))) { + if (info->vbSize < 1 || info->vbSize >= info->agpSize) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Illegal vertex buffers list size: %d MB\n", + info->vbSize); + return FALSE; + } + } + + if (xf86GetOptValInteger(RADEONOptions, + OPTION_VBUF_SIZE, &(info->vbBufSize))) { + int numBufs = info->vbSize*1024*1024/info->vbBufSize; + if (numBufs < 2 || numBufs > 512) { /* FIXME: 512 is arbitrary */ + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Illegal individual vertex buffer size: %d bytes\n", + info->vbBufSize); + return FALSE; + } + } + + if (info->ringSize + info->vbSize + info->indSize + info->agpTexSize > + info->agpSize) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Buffers are too big for requested AGP space\n"); + return FALSE; + } + + info->agpTexSize = info->agpSize - (info->ringSize + + info->vbSize + + info->indSize); + } + + if (xf86GetOptValInteger(RADEONOptions, OPTION_USEC_TIMEOUT, + &(info->CPusecTimeout))) { + /* This option checked by the RADEON DRM kernel module */ + } + + return TRUE; +} +#endif + +static void +RADEONProbeDDC(ScrnInfoPtr pScrn, int index) +{ + vbeInfoPtr pVbe; + if (xf86LoadSubModule(pScrn, "vbe")) { + pVbe = VBEInit(NULL,index); + ConfiguredMonitor = vbeDoEDID(pVbe, NULL); + } +} + +/* RADEONPreInit is called once at server startup. */ +static Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) +{ + RADEONInfoPtr info; + + RADEONTRACE(("RADEONPreInit\n")); + if (pScrn->numEntities != 1) return FALSE; + + if (!RADEONGetRec(pScrn)) return FALSE; + + info = RADEONPTR(pScrn); + + info->pEnt = xf86GetEntityInfo(pScrn->entityList[0]); + if (info->pEnt->location.type != BUS_PCI) goto fail; + + if (flags & PROBE_DETECT) { + RADEONProbeDDC(pScrn, info->pEnt->index); + return TRUE; + } + + if (!xf86LoadSubModule(pScrn, "vgahw")) return FALSE; + xf86LoaderReqSymLists(vgahwSymbols, NULL); + if (!vgaHWGetHWRec(pScrn)) { + RADEONFreeRec(pScrn); + return FALSE; + } + + info->PciInfo = xf86GetPciInfoForEntity(info->pEnt->index); + info->PciTag = pciTag(info->PciInfo->bus, + info->PciInfo->device, + info->PciInfo->func); + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "PCI bus %d card %d func %d\n", + info->PciInfo->bus, + info->PciInfo->device, + info->PciInfo->func); + + if (xf86RegisterResources(info->pEnt->index, 0, ResNone)) goto fail; + + pScrn->racMemFlags = RAC_FB | RAC_COLORMAP; + pScrn->monitor = pScrn->confScreen->monitor; + + if (!RADEONPreInitVisual(pScrn)) goto fail; + + /* We can't do this until we have a + pScrn->display. */ + xf86CollectOptions(pScrn, NULL); + xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, RADEONOptions); + + if (!RADEONPreInitWeight(pScrn)) goto fail; + + if (xf86ReturnOptValBool(RADEONOptions, OPTION_FBDEV, FALSE)) { + info->FBDev = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Using framebuffer device\n"); + } + + if (info->FBDev) { + /* check for linux framebuffer device */ + if (!xf86LoadSubModule(pScrn, "fbdevhw")) return FALSE; + xf86LoaderReqSymLists(fbdevHWSymbols, NULL); + if (!fbdevHWInit(pScrn, info->PciInfo, NULL)) return FALSE; + pScrn->SwitchMode = fbdevHWSwitchMode; + pScrn->AdjustFrame = fbdevHWAdjustFrame; + pScrn->EnterVT = RADEONEnterVTFBDev; + pScrn->LeaveVT = RADEONLeaveVTFBDev; + pScrn->ValidMode = fbdevHWValidMode; + } + + if (!info->FBDev) + if (!RADEONPreInitInt10(pScrn)) goto fail; + + if (!RADEONPreInitConfig(pScrn)) goto fail; + + if (!RADEONGetBIOSParameters(pScrn)) goto fail; + + if (!RADEONGetPLLParameters(pScrn)) goto fail; + + if (!RADEONPreInitDDC(pScrn)) goto fail; + + if (!RADEONPreInitGamma(pScrn)) goto fail; + + if (!RADEONPreInitModes(pScrn)) goto fail; + + if (!RADEONPreInitCursor(pScrn)) goto fail; + + if (!RADEONPreInitAccel(pScrn)) goto fail; + +#ifdef XF86DRI + if (!RADEONPreInitDRI(pScrn)) goto fail; +#endif + + /* Free the video bios (if applicable) */ + if (info->VBIOS) { + xfree(info->VBIOS); + info->VBIOS = NULL; + } + + return TRUE; + + fail: + /* Pre-init failed. */ + + /* Free the video bios (if applicable) */ + if (info->VBIOS) { + xfree(info->VBIOS); + info->VBIOS = NULL; + } + + vgaHWFreeHWRec(pScrn); + RADEONFreeRec(pScrn); + return FALSE; +} + +/* Load a palette. */ +static void RADEONLoadPalette(ScrnInfoPtr pScrn, int numColors, + int *indices, LOCO *colors, VisualPtr pVisual) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int i; + int idx; + unsigned char r, g, b; + +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + /* Select palette 0 (main CRTC) if using FP-enabled chip */ + if (info->HasPanelRegs) PAL_SELECT(0); +#endif + + if (info->CurrentLayout.depth == 15) { + /* 15bpp mode. This sends 32 values. */ + for (i = 0; i < numColors; i++) { + idx = indices[i]; + r = colors[idx].red; + g = colors[idx].green; + b = colors[idx].blue; + RADEONWaitForFifo(pScrn, 32); /* delay */ + OUTPAL(idx * 8, r, g, b); + } + } + else if (info->CurrentLayout.depth == 16) { + /* 16bpp mode. This sends 64 values. */ + /* There are twice as many green values as + there are values for red and blue. So, + we take each red and blue pair, and + combine it with each of the two green + values. */ + for (i = 0; i < numColors; i++) { + idx = indices[i]; + r = colors[idx / 2].red; + g = colors[idx].green; + b = colors[idx / 2].blue; + RADEONWaitForFifo(pScrn, 32); /* delay */ + OUTPAL(idx * 4, r, g, b); + + /* AH - Added to write extra green data - How come this isn't + * needed on R128 ? We didn't load the extra green data in the + * other routine */ + if (idx <= 31) { + r = colors[idx].red; + g = colors[(idx * 2) + 1].green; + b = colors[idx].blue; + RADEONWaitForFifo(pScrn, 32); /* delay */ + OUTPAL(idx * 8, r, g, b); + } + } + } + else { + /* 8bpp mode. This sends 256 values. */ + for (i = 0; i < numColors; i++) { + idx = indices[i]; + r = colors[idx].red; + b = colors[idx].blue; + g = colors[idx].green; + RADEONWaitForFifo(pScrn, 32); /* delay */ + OUTPAL(idx, r, g, b); + } + } +} + +/* Called at the start of each server generation. */ +static Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, + int argc, char **argv) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); + BoxRec MemBox; + int y2; + + RADEONTRACE(("RADEONScreenInit %x %d\n", + pScrn->memPhysBase, pScrn->fbOffset)); + +#ifdef XF86DRI + /* Turn off the CP for now. */ + info->CPInUse = FALSE; +#endif + + if (!RADEONMapMem(pScrn)) return FALSE; + pScrn->fbOffset = 0; +#ifdef XF86DRI + info->fbX = 0; + info->fbY = 0; +#endif + + info->PaletteSavedOnVT = FALSE; + + RADEONSave(pScrn); + if (info->FBDev) { + if (!fbdevHWModeInit(pScrn, pScrn->currentMode)) return FALSE; + } else { + if (!RADEONModeInit(pScrn, pScrn->currentMode)) return FALSE; + } + + RADEONSaveScreen(pScreen, SCREEN_SAVER_ON); + pScrn->AdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); + + /* Visual setup */ + miClearVisualTypes(); + if (!miSetVisualTypes(pScrn->depth, + miGetDefaultVisualMask(pScrn->depth), + pScrn->rgbBits, + pScrn->defaultVisual)) return FALSE; + miSetPixmapDepths (); + +#ifdef XF86DRI + /* Setup DRI after visuals have been + established, but before cfbScreenInit is + called. cfbScreenInit will eventually + call the driver's InitGLXVisuals call + back. */ + { + /* FIXME: When we move to dynamic allocation of back and depth + buffers, we will want to revisit the following check for 3 + times the virtual size of the screen below. */ + int width_bytes = (pScrn->displayWidth * + info->CurrentLayout.pixel_bytes); + int maxy = info->FbMapSize / width_bytes; + + if (!xf86ReturnOptValBool(RADEONOptions, OPTION_NOACCEL, FALSE) && + (maxy > pScrn->virtualY * 3) +#ifdef ENABLE_FLAT_PANEL + /* FIXME: Disable 3D support for FPs until it is tested */ + && !info->HasPanelRegs +#endif + ) { + info->directRenderingEnabled = RADEONDRIScreenInit(pScreen); + } else { + xf86DrvMsg(scrnIndex, X_WARNING, + "Static buffer allocation failed -- " + "need at least %d kB video memory\n", + (pScrn->displayWidth * pScrn->virtualY * + info->CurrentLayout.pixel_bytes * 3 + 1023) / 1024); + info->directRenderingEnabled = FALSE; + } + } +#endif + +#ifdef USE_FB + if (!fbScreenInit (pScreen, info->FB, + pScrn->virtualX, pScrn->virtualY, + pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth, + pScrn->bitsPerPixel)) + return FALSE; +#ifdef RENDER + fbPictureInit (pScreen, 0, 0); +#endif +#else + switch (pScrn->bitsPerPixel) { + case 8: + if (!cfbScreenInit(pScreen, info->FB, + pScrn->virtualX, pScrn->virtualY, + pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth)) + return FALSE; + break; + case 16: + if (!cfb16ScreenInit(pScreen, info->FB, + pScrn->virtualX, pScrn->virtualY, + pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth)) + return FALSE; + break; + case 32: + if (!cfb32ScreenInit(pScreen, info->FB, + pScrn->virtualX, pScrn->virtualY, + pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth)) + return FALSE; + break; + default: + xf86DrvMsg(scrnIndex, X_ERROR, + "Invalid bpp (%d)\n", pScrn->bitsPerPixel); + return FALSE; + } +#endif + xf86SetBlackWhitePixels(pScreen); + + if (pScrn->bitsPerPixel > 8) { + VisualPtr visual; + + for (visual = pScreen->visuals + pScreen->numVisuals; + visual >= pScreen->visuals; + visual--) { + if ((visual->class | DynamicClass) == DirectColor) { + visual->offsetRed = pScrn->offset.red; + visual->offsetGreen = pScrn->offset.green; + visual->offsetBlue = pScrn->offset.blue; + visual->redMask = pScrn->mask.red; + visual->greenMask = pScrn->mask.green; + visual->blueMask = pScrn->mask.blue; + } + } + } + + RADEONDGAInit(pScreen); + + /* Memory manager setup */ + MemBox.x1 = 0; + MemBox.y1 = 0; + MemBox.x2 = pScrn->displayWidth; + y2 = (info->FbMapSize + / (pScrn->displayWidth * info->CurrentLayout.pixel_bytes)); + if (y2 >= 32768) y2 = 32767; /* because MemBox.y2 is signed short */ + MemBox.y2 = y2; + + /* The acceleration engine uses 14 bit + signed coordinates, so we can't have any + drawable caches beyond this region. */ + if (MemBox.y2 > 8191) MemBox.y2 = 8191; + + if (!xf86InitFBManager(pScreen, &MemBox)) { + xf86DrvMsg(scrnIndex, X_ERROR, + "Memory manager initialization to (%d,%d) (%d,%d) failed\n", + MemBox.x1, MemBox.y1, MemBox.x2, MemBox.y2); + return FALSE; + } else { + int width, height; + FBAreaPtr fbarea; + + xf86DrvMsg(scrnIndex, X_INFO, + "Memory manager initialized to (%d,%d) (%d,%d)\n", + MemBox.x1, MemBox.y1, MemBox.x2, MemBox.y2); + if ((fbarea = xf86AllocateOffscreenArea(pScreen, pScrn->displayWidth, + 2, 0, NULL, NULL, NULL))) { + xf86DrvMsg(scrnIndex, X_INFO, + "Reserved area from (%d,%d) to (%d,%d)\n", + fbarea->box.x1, fbarea->box.y1, + fbarea->box.x2, fbarea->box.y2); + } else { + xf86DrvMsg(scrnIndex, X_ERROR, "Unable to reserve area\n"); + } + if (xf86QueryLargestOffscreenArea(pScreen, &width, &height, 0, 0, 0)) { + xf86DrvMsg(scrnIndex, X_INFO, + "Largest offscreen area available: %d x %d\n", + width, height); + } + } + +#ifdef XF86DRI + /* Allocate frame buffer space for the + shared back and depth buffers as well + as for local textures. */ + if (info->directRenderingEnabled) { + FBAreaPtr fbarea; + int width_bytes = (pScrn->displayWidth * + info->CurrentLayout.pixel_bytes); + int maxy = info->FbMapSize / width_bytes; + int l; + + switch (info->CPMode) { + case RADEON_DEFAULT_CP_PIO_MODE: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CP in PIO mode\n"); + break; + case RADEON_DEFAULT_CP_BM_MODE: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CP in BM mode\n"); + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CP in UNKNOWN mode\n"); + break; + } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d MB AGP aperture\n", info->agpSize); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d MB for the ring buffer\n", info->ringSize); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d MB for vertex buffers\n", info->vbSize); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d MB for indirect buffers\n", info->indSize); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d MB for AGP textures\n", info->agpTexSize); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d byte vertex buffers\n", info->vbBufSize); + + /* Allocate the shared back buffer */ + if ((fbarea = xf86AllocateOffscreenArea(pScreen, + pScrn->virtualX, + pScrn->virtualY, + 32, NULL, NULL, NULL))) { + xf86DrvMsg(scrnIndex, X_INFO, + "Reserved back buffer from (%d,%d) to (%d,%d)\n", + fbarea->box.x1, fbarea->box.y1, + fbarea->box.x2, fbarea->box.y2); + + info->backX = fbarea->box.x1; + info->backY = fbarea->box.y1; + } else { + xf86DrvMsg(scrnIndex, X_ERROR, "Unable to reserve back buffer\n"); + info->backX = -1; + info->backY = -1; + } + + /* Allocate the shared depth buffer */ + if ((fbarea = xf86AllocateOffscreenArea(pScreen, + pScrn->virtualX, + pScrn->virtualY, + 32, NULL, NULL, NULL))) { + xf86DrvMsg(scrnIndex, X_INFO, + "Reserved depth buffer from (%d,%d) to (%d,%d)\n", + fbarea->box.x1, fbarea->box.y1, + fbarea->box.x2, fbarea->box.y2); + + info->depthX = fbarea->box.x1; + info->depthY = fbarea->box.y1; + } else { + xf86DrvMsg(scrnIndex, X_ERROR, "Unable to reserve depth buffer\n"); + info->depthX = -1; + info->depthY = -1; + } + + /* Allocate local texture space */ + if (((maxy - MemBox.y2 - 1) * width_bytes) > + (pScrn->virtualX * pScrn->virtualY * 2 * + info->CurrentLayout.pixel_bytes)) { + info->textureX = 0; + info->textureY = MemBox.y2 + 1; + info->textureSize = (maxy - MemBox.y2 - 1) * width_bytes; + + l = RADEONMinBits((info->textureSize-1) / RADEON_NR_TEX_REGIONS); + if (l < RADEON_LOG_TEX_GRANULARITY) l = RADEON_LOG_TEX_GRANULARITY; + + info->log2TexGran = l; + info->textureSize = (info->textureSize >> l) << l; + + xf86DrvMsg(scrnIndex, X_INFO, + "Reserved %d kb for textures: (%d,%d)-(%d,%d)\n", + info->textureSize/1024, + info->textureX, info->textureY, + pScrn->displayWidth, maxy); + } else if ((fbarea = xf86AllocateOffscreenArea(pScreen, + pScrn->virtualX, + pScrn->virtualY * 2, + 32, + NULL, NULL, NULL))) { + info->textureX = fbarea->box.x1; + info->textureY = fbarea->box.y1; + info->textureSize = ((fbarea->box.y2 - fbarea->box.y1) * + (fbarea->box.x2 - fbarea->box.x1) * + info->CurrentLayout.pixel_bytes); + + l = RADEONMinBits((info->textureSize-1) / RADEON_NR_TEX_REGIONS); + if (l < RADEON_LOG_TEX_GRANULARITY) l = RADEON_LOG_TEX_GRANULARITY; + + info->log2TexGran = l; + info->textureSize = (info->textureSize >> l) << l; + + xf86DrvMsg(scrnIndex, X_INFO, + "Reserved %d kb for textures: (%d,%d)-(%d,%d)\n", + info->textureSize/1024, + fbarea->box.x1, fbarea->box.y1, + fbarea->box.x2, fbarea->box.y2); + } else { + xf86DrvMsg(scrnIndex, X_ERROR, + "Unable to reserve texture space in frame buffer\n"); + info->textureX = -1; + info->textureY = -1; + } + } +#endif + + /* Backing store setup */ + miInitializeBackingStore(pScreen); + xf86SetBackingStore(pScreen); + + /* Set Silken Mouse */ + xf86SetSilkenMouse(pScreen); + + /* Acceleration setup */ + if (!xf86ReturnOptValBool(RADEONOptions, OPTION_NOACCEL, FALSE)) { + if (RADEONAccelInit(pScreen)) { + xf86DrvMsg(scrnIndex, X_INFO, "Acceleration enabled\n"); + info->accelOn = TRUE; + } else { + xf86DrvMsg(scrnIndex, X_ERROR, + "Acceleration initialization failed\n"); + xf86DrvMsg(scrnIndex, X_INFO, "Acceleration disabled\n"); + info->accelOn = FALSE; + } + } else { + xf86DrvMsg(scrnIndex, X_INFO, "Acceleration disabled\n"); + info->accelOn = FALSE; + } + + /* Cursor setup */ + miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); + + /* Hardware cursor setup */ + if (!xf86ReturnOptValBool(RADEONOptions, OPTION_SW_CURSOR, FALSE)) { + if (RADEONCursorInit(pScreen)) { + int width, height; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using hardware cursor (scanline %d)\n", + info->cursor_start / pScrn->displayWidth); + if (xf86QueryLargestOffscreenArea(pScreen, &width, &height, + 0, 0, 0)) { + xf86DrvMsg(scrnIndex, X_INFO, + "Largest offscreen area available: %d x %d\n", + width, height); + } + } else { + xf86DrvMsg(scrnIndex, X_ERROR, + "Hardware cursor initialization failed\n"); + xf86DrvMsg(scrnIndex, X_INFO, "Using software cursor\n"); + } + } else { + xf86DrvMsg(scrnIndex, X_INFO, "Using software cursor\n"); + } + + /* Colormap setup */ + if (!miCreateDefColormap(pScreen)) return FALSE; + if (!xf86HandleColormaps(pScreen, 256, info->dac6bits ? 6 : 8, + (info->FBDev ? fbdevHWLoadPalette : + RADEONLoadPalette), NULL, + CMAP_PALETTED_TRUECOLOR + | CMAP_RELOAD_ON_MODE_SWITCH +#if 0 /* This option messes up text mode! (eich@suse.de) */ + | CMAP_LOAD_EVEN_IF_OFFSCREEN +#endif + )) return FALSE; + + /* DPMS setup */ +#ifdef DPMSExtension +#ifdef ENABLE_FLAT_PANEL + if (!info->HasPanelRegs || info->CRTOnly) + xf86DPMSInit(pScreen, RADEONDisplayPowerManagementSet, 0); +#else + xf86DPMSInit(pScreen, RADEONDisplayPowerManagementSet, 0); +#endif +#endif + + RADEONInitVideo(pScreen); + + /* Provide SaveScreen */ + pScreen->SaveScreen = RADEONSaveScreen; + + /* Wrap CloseScreen */ + info->CloseScreen = pScreen->CloseScreen; + pScreen->CloseScreen = RADEONCloseScreen; + + /* Note unused options */ + if (serverGeneration == 1) + xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); + +#ifdef XF86DRI + /* DRI finalization */ + if (info->directRenderingEnabled) { + /* Now that mi, cfb, drm and others have + done their thing, complete the DRI + setup. */ + info->directRenderingEnabled = RADEONDRIFinishScreenInit(pScreen); + } + if (info->directRenderingEnabled) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering enabled\n"); + } else { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering disabled\n"); + } +#endif + + return TRUE; +} + +/* Write common registers (initialized to 0). */ +static void RADEONRestoreCommonRegisters(ScrnInfoPtr pScrn, + RADEONSavePtr restore) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + OUTREG(RADEON_OVR_CLR, restore->ovr_clr); + OUTREG(RADEON_OVR_WID_LEFT_RIGHT, restore->ovr_wid_left_right); + OUTREG(RADEON_OVR_WID_TOP_BOTTOM, restore->ovr_wid_top_bottom); + OUTREG(RADEON_OV0_SCALE_CNTL, restore->ov0_scale_cntl); + OUTREG(RADEON_MPP_TB_CONFIG, restore->mpp_tb_config ); + OUTREG(RADEON_MPP_GP_CONFIG, restore->mpp_gp_config ); + OUTREG(RADEON_SUBPIC_CNTL, restore->subpic_cntl); + OUTREG(RADEON_VIPH_CONTROL, restore->viph_control); + OUTREG(RADEON_I2C_CNTL_1, restore->i2c_cntl_1); + OUTREG(RADEON_GEN_INT_CNTL, restore->gen_int_cntl); + OUTREG(RADEON_CAP0_TRIG_CNTL, restore->cap0_trig_cntl); + OUTREG(RADEON_CAP1_TRIG_CNTL, restore->cap1_trig_cntl); + OUTREG(RADEON_BUS_CNTL, restore->bus_cntl); +} + +/* Write CRTC registers. */ +static void RADEONRestoreCrtcRegisters(ScrnInfoPtr pScrn, + RADEONSavePtr restore) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + OUTREG(RADEON_CRTC_GEN_CNTL, restore->crtc_gen_cntl); + + OUTREGP(RADEON_CRTC_EXT_CNTL, restore->crtc_ext_cntl, + RADEON_CRTC_VSYNC_DIS | + RADEON_CRTC_HSYNC_DIS | + RADEON_CRTC_DISPLAY_DIS); + + OUTREGP(RADEON_DAC_CNTL, restore->dac_cntl, + RADEON_DAC_RANGE_CNTL | + RADEON_DAC_BLANKING); + + OUTREG(RADEON_CRTC_H_TOTAL_DISP, restore->crtc_h_total_disp); + OUTREG(RADEON_CRTC_H_SYNC_STRT_WID, restore->crtc_h_sync_strt_wid); + OUTREG(RADEON_CRTC_V_TOTAL_DISP, restore->crtc_v_total_disp); + OUTREG(RADEON_CRTC_V_SYNC_STRT_WID, restore->crtc_v_sync_strt_wid); + OUTREG(RADEON_CRTC_OFFSET, restore->crtc_offset); + OUTREG(RADEON_CRTC_OFFSET_CNTL, restore->crtc_offset_cntl); + OUTREG(RADEON_CRTC_PITCH, restore->crtc_pitch); +} + +#ifdef ENABLE_FLAT_PANEL +/* Note: Radeon flat panel support has been disabled for now */ +/* Write flat panel registers */ +static void RADEONRestoreFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + CARD32 tmp; + + OUTREG(RADEON_CRTC2_GEN_CNTL, restore->crtc2_gen_cntl); + OUTREG(RADEON_FP_CRTC_H_TOTAL_DISP, restore->fp_crtc_h_total_disp); + OUTREG(RADEON_FP_CRTC_V_TOTAL_DISP, restore->fp_crtc_v_total_disp); + OUTREG(RADEON_FP_GEN_CNTL, restore->fp_gen_cntl); + OUTREG(RADEON_FP_H_SYNC_STRT_WID, restore->fp_h_sync_strt_wid); + OUTREG(RADEON_FP_HORZ_STRETCH, restore->fp_horz_stretch); + OUTREG(RADEON_FP_PANEL_CNTL, restore->fp_panel_cntl); + OUTREG(RADEON_FP_V_SYNC_STRT_WID, restore->fp_v_sync_strt_wid); + OUTREG(RADEON_FP_VERT_STRETCH, restore->fp_vert_stretch); + OUTREG(RADEON_TMDS_CRC, restore->tmds_crc); + + tmp = INREG(RADEON_LVDS_GEN_CNTL); + if ((tmp & (RADEON_LVDS_ON | RADEON_LVDS_BLON)) == + (restore->lvds_gen_cntl & (RADEON_LVDS_ON | RADEON_LVDS_BLON))) { + OUTREG(RADEON_LVDS_GEN_CNTL, restore->lvds_gen_cntl); + } else { + if (restore->lvds_gen_cntl & (RADEON_LVDS_ON | RADEON_LVDS_BLON)) { + OUTREG(RADEON_LVDS_GEN_CNTL, + restore->lvds_gen_cntl & ~RADEON_LVDS_BLON); + usleep(RADEONPTR(pScrn)->PanelPwrDly * 1000); + OUTREG(RADEON_LVDS_GEN_CNTL, restore->lvds_gen_cntl); + } else { + OUTREG(RADEON_LVDS_GEN_CNTL, + restore->lvds_gen_cntl | RADEON_LVDS_BLON); + usleep(RADEONPTR(pScrn)->PanelPwrDly * 1000); + OUTREG(RADEON_LVDS_GEN_CNTL, restore->lvds_gen_cntl); + } + } +} +#endif + +#if RADEON_ATOMIC_UPDATE +static void RADEONPLLWaitForReadUpdateComplete(ScrnInfoPtr pScrn) +{ + while (INPLL(pScrn, RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R); +} + +static void RADEONPLLWriteUpdate(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + OUTPLLP(pScrn, RADEON_PPLL_REF_DIV, RADEON_PPLL_ATOMIC_UPDATE_W, 0xffff); +} +#endif + +/* Write PLL registers. */ +static void RADEONRestorePLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + +#if !RADEON_ATOMIC_UPDATE + while ( (INREG(RADEON_CLOCK_CNTL_INDEX) & RADEON_PLL_DIV_SEL) != + RADEON_PLL_DIV_SEL) { +#endif + OUTREGP(RADEON_CLOCK_CNTL_INDEX, RADEON_PLL_DIV_SEL, 0xffff); +#if !RADEON_ATOMIC_UPDATE + } +#endif + +#if RADEON_ATOMIC_UPDATE + OUTPLLP(pScrn, + RADEON_PPLL_CNTL, + RADEON_PPLL_RESET + | RADEON_PPLL_ATOMIC_UPDATE_EN + | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN, + 0xffff); +#else + OUTPLLP(pScrn, + RADEON_PPLL_CNTL, + RADEON_PPLL_RESET, + 0xffff); +#endif + +#if RADEON_ATOMIC_UPDATE + RADEONPLLWaitForReadUpdateComplete(pScrn); +#endif + while ( (INPLL(pScrn, RADEON_PPLL_REF_DIV) & RADEON_PPLL_REF_DIV_MASK) != + (restore->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK)) { + OUTPLLP(pScrn, RADEON_PPLL_REF_DIV, + restore->ppll_ref_div, ~RADEON_PPLL_REF_DIV_MASK); + } +#if RADEON_ATOMIC_UPDATE + RADEONPLLWriteUpdate(pScrn); +#endif + +#if RADEON_ATOMIC_UPDATE + RADEONPLLWaitForReadUpdateComplete(pScrn); +#endif + while ( (INPLL(pScrn, RADEON_PPLL_DIV_3) & RADEON_PPLL_FB3_DIV_MASK) != + (restore->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK)) { + OUTPLLP(pScrn, RADEON_PPLL_DIV_3, + restore->ppll_div_3, ~RADEON_PPLL_FB3_DIV_MASK); + } +#if RADEON_ATOMIC_UPDATE + RADEONPLLWriteUpdate(pScrn); +#endif + +#if RADEON_ATOMIC_UPDATE + RADEONPLLWaitForReadUpdateComplete(pScrn); +#endif + while ( (INPLL(pScrn, RADEON_PPLL_DIV_3) & RADEON_PPLL_POST3_DIV_MASK) != + (restore->ppll_div_3 & RADEON_PPLL_POST3_DIV_MASK)) { + OUTPLLP(pScrn, RADEON_PPLL_DIV_3, + restore->ppll_div_3, ~RADEON_PPLL_POST3_DIV_MASK); + } +#if RADEON_ATOMIC_UPDATE + RADEONPLLWriteUpdate(pScrn); +#endif + +#if RADEON_ATOMIC_UPDATE + RADEONPLLWaitForReadUpdateComplete(pScrn); +#endif + OUTPLL(RADEON_HTOTAL_CNTL, restore->htotal_cntl); +#if RADEON_ATOMIC_UPDATE + RADEONPLLWriteUpdate(pScrn); +#endif + + OUTPLLP(pScrn, RADEON_PPLL_CNTL, 0, ~RADEON_PPLL_RESET); + + RADEONTRACE(("Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n", + restore->ppll_ref_div, + restore->ppll_div_3, + restore->htotal_cntl, + INPLL(pScrn, RADEON_PPLL_CNTL))); + RADEONTRACE(("Wrote: rd=%d, fd=%d, pd=%d\n", + restore->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK, + restore->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK, + (restore->ppll_div_3 & RADEON_PPLL_POST3_DIV_MASK) >> 16)); +} + +/* Write DDA registers. */ +static void RADEONRestoreDDARegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + OUTREG(RADEON_DDA_CONFIG, restore->dda_config); + OUTREG(RADEON_DDA_ON_OFF, restore->dda_on_off); +} + +/* Write palette data. */ +static void RADEONRestorePalette(ScrnInfoPtr pScrn, RADEONSavePtr restore) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int i; + + if (!restore->palette_valid) return; + +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + /* Select palette 0 (main CRTC) if using FP-enabled chip */ + if (info->HasPanelRegs) PAL_SELECT(0); +#endif + + OUTPAL_START(0); + for (i = 0; i < 256; i++) { + RADEONWaitForFifo(pScrn, 32); /* delay */ + OUTPAL_NEXT_CARD32(restore->palette[i]); + } +} + +/* Write out state to define a new video mode. */ +static void RADEONRestoreMode(ScrnInfoPtr pScrn, RADEONSavePtr restore) +{ +#ifdef ENABLE_FLAT_PANEL + RADEONInfoPtr info = RADEONPTR(pScrn); +#endif + + RADEONTRACE(("RADEONRestoreMode(%p)\n", restore)); + RADEONRestoreCommonRegisters(pScrn, restore); + RADEONRestoreCrtcRegisters(pScrn, restore); +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + if (info->HasPanelRegs) + RADEONRestoreFPRegisters(pScrn, restore); + if (!info->HasPanelRegs || info->CRTOnly) + RADEONRestorePLLRegisters(pScrn, restore); +#else + RADEONRestorePLLRegisters(pScrn, restore); +#endif + RADEONRestoreDDARegisters(pScrn, restore); + RADEONRestorePalette(pScrn, restore); +} + +/* Read common registers. */ +static void RADEONSaveCommonRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + save->ovr_clr = INREG(RADEON_OVR_CLR); + save->ovr_wid_left_right = INREG(RADEON_OVR_WID_LEFT_RIGHT); + save->ovr_wid_top_bottom = INREG(RADEON_OVR_WID_TOP_BOTTOM); + save->ov0_scale_cntl = INREG(RADEON_OV0_SCALE_CNTL); + save->mpp_tb_config = INREG(RADEON_MPP_TB_CONFIG); + save->mpp_gp_config = INREG(RADEON_MPP_GP_CONFIG); + save->subpic_cntl = INREG(RADEON_SUBPIC_CNTL); + save->viph_control = INREG(RADEON_VIPH_CONTROL); + save->i2c_cntl_1 = INREG(RADEON_I2C_CNTL_1); + save->gen_int_cntl = INREG(RADEON_GEN_INT_CNTL); + save->cap0_trig_cntl = INREG(RADEON_CAP0_TRIG_CNTL); + save->cap1_trig_cntl = INREG(RADEON_CAP1_TRIG_CNTL); + save->bus_cntl = INREG(RADEON_BUS_CNTL); +} + +/* Read CRTC registers. */ +static void RADEONSaveCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + save->crtc_gen_cntl = INREG(RADEON_CRTC_GEN_CNTL); + save->crtc_ext_cntl = INREG(RADEON_CRTC_EXT_CNTL); + save->dac_cntl = INREG(RADEON_DAC_CNTL); + save->crtc_h_total_disp = INREG(RADEON_CRTC_H_TOTAL_DISP); + save->crtc_h_sync_strt_wid = INREG(RADEON_CRTC_H_SYNC_STRT_WID); + save->crtc_v_total_disp = INREG(RADEON_CRTC_V_TOTAL_DISP); + save->crtc_v_sync_strt_wid = INREG(RADEON_CRTC_V_SYNC_STRT_WID); + save->crtc_offset = INREG(RADEON_CRTC_OFFSET); + save->crtc_offset_cntl = INREG(RADEON_CRTC_OFFSET_CNTL); + save->crtc_pitch = INREG(RADEON_CRTC_PITCH); +} + +#ifdef ENABLE_FLAT_PANEL +/* Note: Radeon flat panel support has been disabled for now */ +/* Read flat panel registers */ +static void RADEONSaveFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + save->crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL); + save->fp_crtc_h_total_disp = INREG(RADEON_FP_CRTC_H_TOTAL_DISP); + save->fp_crtc_v_total_disp = INREG(RADEON_FP_CRTC_V_TOTAL_DISP); + save->fp_gen_cntl = INREG(RADEON_FP_GEN_CNTL); + save->fp_h_sync_strt_wid = INREG(RADEON_FP_H_SYNC_STRT_WID); + save->fp_horz_stretch = INREG(RADEON_FP_HORZ_STRETCH); + save->fp_panel_cntl = INREG(RADEON_FP_PANEL_CNTL); + save->fp_v_sync_strt_wid = INREG(RADEON_FP_V_SYNC_STRT_WID); + save->fp_vert_stretch = INREG(RADEON_FP_VERT_STRETCH); + save->lvds_gen_cntl = INREG(RADEON_LVDS_GEN_CNTL); + save->tmds_crc = INREG(RADEON_TMDS_CRC); +} +#endif + +/* Read PLL registers. */ +static void RADEONSavePLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) +{ + save->ppll_ref_div = INPLL(pScrn, RADEON_PPLL_REF_DIV); + save->ppll_div_3 = INPLL(pScrn, RADEON_PPLL_DIV_3); + save->htotal_cntl = INPLL(pScrn, RADEON_HTOTAL_CNTL); + + RADEONTRACE(("Read: 0x%08x 0x%08x 0x%08x\n", + save->ppll_ref_div, + save->ppll_div_3, + save->htotal_cntl)); + RADEONTRACE(("Read: rd=%d, fd=%d, pd=%d\n", + save->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK, + save->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK, + (save->ppll_div_3 & RADEON_PPLL_POST3_DIV_MASK) >> 16)); +} + +/* Read DDA registers. */ +static void RADEONSaveDDARegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + save->dda_config = INREG(RADEON_DDA_CONFIG); + save->dda_on_off = INREG(RADEON_DDA_ON_OFF); +} + +/* Read palette data. */ +static void RADEONSavePalette(ScrnInfoPtr pScrn, RADEONSavePtr save) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int i; + +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + /* Select palette 0 (main CRTC) if using FP-enabled chip */ + if (info->HasPanelRegs) PAL_SELECT(0); +#endif + + INPAL_START(0); + for (i = 0; i < 256; i++) save->palette[i] = INPAL_NEXT(); + save->palette_valid = TRUE; +} + +/* Save state that defines current video mode. */ +static void RADEONSaveMode(ScrnInfoPtr pScrn, RADEONSavePtr save) +{ + RADEONTRACE(("RADEONSaveMode(%p)\n", save)); + + RADEONSaveCommonRegisters(pScrn, save); + RADEONSaveCrtcRegisters(pScrn, save); +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + if (RADEONPTR(pScrn)->HasPanelRegs) + RADEONSaveFPRegisters(pScrn, save); +#endif + RADEONSavePLLRegisters(pScrn, save); + RADEONSaveDDARegisters(pScrn, save); + RADEONSavePalette(pScrn, save); + + RADEONTRACE(("RADEONSaveMode returns %p\n", save)); +} + +/* Save everything needed to restore the original VC state. */ +static void RADEONSave(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + RADEONSavePtr save = &info->SavedReg; + vgaHWPtr hwp = VGAHWPTR(pScrn); + + RADEONTRACE(("RADEONSave\n")); + if (info->FBDev) { + fbdevHWSave(pScrn); + return; + } + vgaHWUnlock(hwp); + vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL); /* save mode, fonts, cmap */ + vgaHWLock(hwp); + + RADEONSaveMode(pScrn, save); + + save->dp_datatype = INREG(RADEON_DP_DATATYPE); + save->rbbm_soft_reset = INREG(RADEON_RBBM_SOFT_RESET); + save->clock_cntl_index = INREG(RADEON_CLOCK_CNTL_INDEX); + save->amcgpio_en_reg = INREG(RADEON_AMCGPIO_EN_REG); + save->amcgpio_mask = INREG(RADEON_AMCGPIO_MASK); +} + +/* Restore the original (text) mode. */ +static void RADEONRestore(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + RADEONSavePtr restore = &info->SavedReg; + vgaHWPtr hwp = VGAHWPTR(pScrn); + + RADEONTRACE(("RADEONRestore\n")); + if (info->FBDev) { + fbdevHWRestore(pScrn); + return; + } + + RADEONBlank(pScrn); + + OUTREG(RADEON_AMCGPIO_MASK, restore->amcgpio_mask); + OUTREG(RADEON_AMCGPIO_EN_REG, restore->amcgpio_en_reg); + OUTREG(RADEON_CLOCK_CNTL_INDEX, restore->clock_cntl_index); + OUTREG(RADEON_RBBM_SOFT_RESET, restore->rbbm_soft_reset); + OUTREG(RADEON_DP_DATATYPE, restore->dp_datatype); + + RADEONRestoreMode(pScrn, restore); + vgaHWUnlock(hwp); + vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_MODE | VGA_SR_FONTS ); + vgaHWLock(hwp); + +#if 0 + RADEONWaitForVerticalSync(pScrn); +#endif + RADEONUnblank(pScrn); +} + +/* Define common registers for requested video mode. */ +static void RADEONInitCommonRegisters(RADEONSavePtr save, DisplayModePtr mode, + RADEONInfoPtr info) +{ + save->ovr_clr = 0; + save->ovr_wid_left_right = 0; + save->ovr_wid_top_bottom = 0; + save->ov0_scale_cntl = 0; + save->mpp_tb_config = 0; + save->mpp_gp_config = 0; + save->subpic_cntl = 0; + save->viph_control = 0; + save->i2c_cntl_1 = 0; + save->rbbm_soft_reset = 0; + save->cap0_trig_cntl = 0; + save->cap1_trig_cntl = 0; + save->bus_cntl = info->BusCntl; + /* + * If bursts are enabled, turn on discards + * Radeon doesn't have write bursts + */ + if (save->bus_cntl & (RADEON_BUS_READ_BURST)) + save->bus_cntl |= RADEON_BUS_RD_DISCARD_EN; +} + +/* Define CRTC registers for requested video mode. */ +static Bool RADEONInitCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, + DisplayModePtr mode, RADEONInfoPtr info) +{ + int format; + int hsync_start; + int hsync_wid; + int hsync_fudge; + int vsync_wid; + int bytpp; + int hsync_fudge_default[] = { 0x00, 0x12, 0x09, 0x09, 0x06, 0x05 }; +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + int hsync_fudge_fp[] = { 0x12, 0x11, 0x09, 0x09, 0x05, 0x05 }; + int hsync_fudge_fp_crt[] = { 0x12, 0x10, 0x08, 0x08, 0x04, 0x04 }; +#endif + + switch (info->CurrentLayout.pixel_code) { + case 4: format = 1; bytpp = 0; break; + case 8: format = 2; bytpp = 1; break; + case 15: format = 3; bytpp = 2; break; /* 555 */ + case 16: format = 4; bytpp = 2; break; /* 565 */ + case 24: format = 5; bytpp = 3; break; /* RGB */ + case 32: format = 6; bytpp = 4; break; /* xRGB */ + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unsupported pixel depth (%d)\n", info->CurrentLayout.bitsPerPixel); + return FALSE; + } + RADEONTRACE(("Format = %d (%d bytes per pixel)\n", format, bytpp)); + +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + if (info->HasPanelRegs) + if (info->CRTOnly) hsync_fudge = hsync_fudge_fp_crt[format-1]; + else hsync_fudge = hsync_fudge_fp[format-1]; + else hsync_fudge = hsync_fudge_default[format-1]; +#else + hsync_fudge = hsync_fudge_default[format-1]; +#endif + + save->crtc_gen_cntl = (RADEON_CRTC_EXT_DISP_EN + | RADEON_CRTC_EN + | (format << 8) + | ((mode->Flags & V_DBLSCAN) + ? RADEON_CRTC_DBL_SCAN_EN + : 0) + | ((mode->Flags & V_INTERLACE) + ? RADEON_CRTC_INTERLACE_EN + : 0)); + + save->crtc_ext_cntl = RADEON_VGA_ATI_LINEAR | RADEON_XCRT_CNT_EN; + save->dac_cntl = (RADEON_DAC_MASK_ALL + | RADEON_DAC_VGA_ADR_EN + | (info->dac6bits ? 0 : RADEON_DAC_8BIT_EN)); + + save->crtc_h_total_disp = ((((mode->CrtcHTotal / 8) - 1) & 0xffff) + | (((mode->CrtcHDisplay / 8) - 1) << 16)); + + hsync_wid = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 8; + if (!hsync_wid) hsync_wid = 1; + if (hsync_wid > 0x3f) hsync_wid = 0x3f; + + hsync_start = mode->CrtcHSyncStart - 8 + hsync_fudge; + + save->crtc_h_sync_strt_wid = ((hsync_start & 0x1fff) + | (hsync_wid << 16) + | ((mode->Flags & V_NHSYNC) + ? RADEON_CRTC_H_SYNC_POL + : 0)); + +#if 1 + /* This works for double scan mode. */ + save->crtc_v_total_disp = (((mode->CrtcVTotal - 1) & 0xffff) + | ((mode->CrtcVDisplay - 1) << 16)); +#else + /* This is what cce/nbmode.c example code + does -- is this correct? */ + save->crtc_v_total_disp = (((mode->CrtcVTotal - 1) & 0xffff) + | ((mode->CrtcVDisplay + * ((mode->Flags & V_DBLSCAN) ? 2 : 1) - 1) + << 16)); +#endif + + vsync_wid = mode->CrtcVSyncEnd - mode->CrtcVSyncStart; + if (!vsync_wid) vsync_wid = 1; + if (vsync_wid > 0x1f) vsync_wid = 0x1f; + + save->crtc_v_sync_strt_wid = (((mode->CrtcVSyncStart - 1) & 0xfff) + | (vsync_wid << 16) + | ((mode->Flags & V_NVSYNC) + ? RADEON_CRTC_V_SYNC_POL + : 0)); + save->crtc_offset = 0; + save->crtc_offset_cntl = 0; + + save->crtc_pitch = ((pScrn->displayWidth * pScrn->bitsPerPixel) + + ((pScrn->bitsPerPixel * 8) -1)) / + (pScrn->bitsPerPixel * 8); + save->crtc_pitch |= save->crtc_pitch << 16; + + RADEONTRACE(("Pitch = %d bytes (virtualX = %d, displayWidth = %d)\n", + save->crtc_pitch, pScrn->virtualX, + info->CurrentLayout.displayWidth)); + return TRUE; +} + +#ifdef ENABLE_FLAT_PANEL +/* Note: Radeon flat panel support has been disabled for now */ +/* Define CRTC registers for requested video mode. */ +static void RADEONInitFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr orig, + RADEONSavePtr save, DisplayModePtr mode, + RADEONInfoPtr info) +{ + int xres = mode->CrtcHDisplay; + int yres = mode->CrtcVDisplay; + float Hratio, Vratio; + + if (info->CRTOnly) { + save->crtc_ext_cntl |= RADEON_CRTC_CRT_ON; + save->crtc2_gen_cntl = 0; + save->fp_gen_cntl = orig->fp_gen_cntl; + save->fp_gen_cntl &= ~(RADEON_FP_FPON | + RADEON_FP_CRTC_USE_SHADOW_VEND | + RADEON_FP_CRTC_HORZ_DIV2_EN | + RADEON_FP_CRTC_HOR_CRT_DIV2_DIS | + RADEON_FP_USE_SHADOW_EN); + save->fp_gen_cntl |= (RADEON_FP_SEL_CRTC2 | + RADEON_FP_CRTC_DONT_SHADOW_VPAR); + save->fp_panel_cntl = orig->fp_panel_cntl & ~RADEON_FP_DIGON; + save->lvds_gen_cntl = orig->lvds_gen_cntl & ~(RADEON_LVDS_ON | + RADEON_LVDS_BLON); + return; + } + + if (xres > info->PanelXRes) xres = info->PanelXRes; + if (yres > info->PanelYRes) yres = info->PanelYRes; + + Hratio = (float)xres/(float)info->PanelXRes; + Vratio = (float)yres/(float)info->PanelYRes; + + save->fp_horz_stretch = + (((((int)(Hratio * RADEON_HORZ_STRETCH_RATIO_MAX + 0.5)) + & RADEON_HORZ_STRETCH_RATIO_MASK) + << RADEON_HORZ_STRETCH_RATIO_SHIFT) | + (orig->fp_horz_stretch & (RADEON_HORZ_PANEL_SIZE | + RADEON_HORZ_FP_LOOP_STRETCH | + RADEON_HORZ_STRETCH_RESERVED))); + save->fp_horz_stretch &= ~RADEON_HORZ_AUTO_RATIO_FIX_EN; + if (Hratio == 1.0) save->fp_horz_stretch &= ~(RADEON_HORZ_STRETCH_BLEND | + RADEON_HORZ_STRETCH_ENABLE); + else save->fp_horz_stretch |= (RADEON_HORZ_STRETCH_BLEND | + RADEON_HORZ_STRETCH_ENABLE); + + save->fp_vert_stretch = + (((((int)(Vratio * RADEON_VERT_STRETCH_RATIO_MAX + 0.5)) + & RADEON_VERT_STRETCH_RATIO_MASK) + << RADEON_VERT_STRETCH_RATIO_SHIFT) | + (orig->fp_vert_stretch & (RADEON_VERT_PANEL_SIZE | + RADEON_VERT_STRETCH_RESERVED))); + save->fp_vert_stretch &= ~RADEON_VERT_AUTO_RATIO_EN; + if (Vratio == 1.0) save->fp_vert_stretch &= ~(RADEON_VERT_STRETCH_ENABLE | + RADEON_VERT_STRETCH_BLEND); + else save->fp_vert_stretch |= (RADEON_VERT_STRETCH_ENABLE | + RADEON_VERT_STRETCH_BLEND); + + save->fp_gen_cntl = (orig->fp_gen_cntl & ~(RADEON_FP_SEL_CRTC2 | + RADEON_FP_CRTC_USE_SHADOW_VEND | + RADEON_FP_CRTC_HORZ_DIV2_EN | + RADEON_FP_CRTC_HOR_CRT_DIV2_DIS | + RADEON_FP_USE_SHADOW_EN)); + if (orig->fp_gen_cntl & RADEON_FP_DETECT_SENSE) { + save->fp_gen_cntl |= (RADEON_FP_CRTC_DONT_SHADOW_VPAR | + RADEON_FP_TDMS_EN); + } + + save->fp_panel_cntl = orig->fp_panel_cntl; + save->lvds_gen_cntl = orig->lvds_gen_cntl; + + save->tmds_crc = orig->tmds_crc; + + /* Disable CRT output by disabling CRT output and setting the CRT + DAC to use CRTC2, which we set to 0's. In the future, we will + want to use the dual CRTC capabilities of the RADEON to allow both + the flat panel and external CRT to either simultaneously display + the same image or display two different images. */ + save->crtc_ext_cntl &= ~RADEON_CRTC_CRT_ON; + save->dac_cntl |= RADEON_DAC_CRT_SEL_CRTC2; + save->crtc2_gen_cntl = 0; + + /* WARNING: Be careful about turning on the flat panel */ +#if 1 + save->lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_BLON); +#else + save->fp_panel_cntl |= (RADEON_FP_DIGON | RADEON_FP_BLON); + save->fp_gen_cntl |= (RADEON_FP_FPON); +#endif + + save->fp_crtc_h_total_disp = save->crtc_h_total_disp; + save->fp_crtc_v_total_disp = save->crtc_v_total_disp; + save->fp_h_sync_strt_wid = save->crtc_h_sync_strt_wid; + save->fp_v_sync_strt_wid = save->crtc_v_sync_strt_wid; +} +#endif + +/* Define PLL registers for requested video mode. */ +static void RADEONInitPLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, + DisplayModePtr mode, RADEONPLLPtr pll, + double dot_clock) +{ + int freq = dot_clock * 100; + struct { + int divider; + int bitvalue; + } *post_div, + post_divs[] = { + /* From RAGE 128 VR/RAGE 128 GL Register + Reference Manual (Technical Reference + Manual P/N RRG-G04100-C Rev. 0.04), page + 3-17 (PLL_DIV_[3:0]). */ + { 1, 0 }, /* VCLK_SRC */ + { 2, 1 }, /* VCLK_SRC/2 */ + { 4, 2 }, /* VCLK_SRC/4 */ + { 8, 3 }, /* VCLK_SRC/8 */ + { 3, 4 }, /* VCLK_SRC/3 */ + { 16, 5 }, /* VCLK_SRC/16 */ + { 6, 6 }, /* VCLK_SRC/6 */ + { 12, 7 }, /* VCLK_SRC/12 */ + { 0, 0 } + }; + + if (freq > pll->max_pll_freq) freq = pll->max_pll_freq; + if (freq * 12 < pll->min_pll_freq) freq = pll->min_pll_freq / 12; + + for (post_div = &post_divs[0]; post_div->divider; ++post_div) { + save->pll_output_freq = post_div->divider * freq; + if (save->pll_output_freq >= pll->min_pll_freq + && save->pll_output_freq <= pll->max_pll_freq) break; + } + + save->dot_clock_freq = freq; + save->feedback_div = RADEONDiv(pll->reference_div + * save->pll_output_freq, + pll->reference_freq); + save->post_div = post_div->divider; + + RADEONTRACE(("dc=%d, of=%d, fd=%d, pd=%d\n", + save->dot_clock_freq, + save->pll_output_freq, + save->feedback_div, + save->post_div)); + + save->ppll_ref_div = pll->reference_div; + save->ppll_div_3 = (save->feedback_div | (post_div->bitvalue << 16)); + save->htotal_cntl = 0; +} + +/* Define DDA registers for requested video mode. */ +static Bool RADEONInitDDARegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, + DisplayModePtr mode, RADEONPLLPtr pll, + RADEONInfoPtr info) +{ + int DisplayFifoWidth = 128; + int DisplayFifoDepth = 32; + int XclkFreq; + int VclkFreq; + int XclksPerTransfer; + int XclksPerTransferPrecise; + int UseablePrecision; + int Roff; + int Ron; + + XclkFreq = pll->xclk; + + VclkFreq = RADEONDiv(pll->reference_freq * save->feedback_div, + pll->reference_div * save->post_div); + + XclksPerTransfer = RADEONDiv(XclkFreq * DisplayFifoWidth, + VclkFreq * + (info->CurrentLayout.pixel_bytes * 8)); + + UseablePrecision = RADEONMinBits(XclksPerTransfer) + 1; + + XclksPerTransferPrecise = RADEONDiv((XclkFreq * DisplayFifoWidth) + << (11 - UseablePrecision), + VclkFreq * + (info->CurrentLayout.pixel_bytes * 8)); + + Roff = XclksPerTransferPrecise * (DisplayFifoDepth - 4); + + Ron = (4 * info->ram->MB + + 3 * MAX(info->ram->Trcd - 2, 0) + + 2 * info->ram->Trp + + info->ram->Twr + + info->ram->CL + + info->ram->Tr2w + + XclksPerTransfer) << (11 - UseablePrecision); + + if (Ron + info->ram->Rloop >= Roff) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "(Ron = %d) + (Rloop = %d) >= (Roff = %d)\n", + Ron, info->ram->Rloop, Roff); + return FALSE; + } + + save->dda_config = (XclksPerTransferPrecise + | (UseablePrecision << 16) + | (info->ram->Rloop << 20)); + + save->dda_on_off = (Ron << 16) | Roff; + + RADEONTRACE(("XclkFreq = %d; VclkFreq = %d; per = %d, %d (useable = %d)\n", + XclkFreq, + VclkFreq, + XclksPerTransfer, + XclksPerTransferPrecise, + UseablePrecision)); + RADEONTRACE(("Roff = %d, Ron = %d, Rloop = %d\n", + Roff, Ron, info->ram->Rloop)); + + return TRUE; +} + + +/* Define initial palette for requested video mode. This doesn't do + anything for XFree86 4.0. */ +static void RADEONInitPalette(RADEONSavePtr save, RADEONInfoPtr info) +{ + save->palette_valid = FALSE; +} + +/* Define registers for a requested video mode. */ +static Bool RADEONInit(ScrnInfoPtr pScrn, DisplayModePtr mode, + RADEONSavePtr save) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + double dot_clock = mode->Clock/1000.0; + +#if RADEON_DEBUG + ErrorF("%-12.12s %7.2f %4d %4d %4d %4d %4d %4d %4d %4d (%d,%d)", + mode->name, + dot_clock, + + mode->HDisplay, + mode->HSyncStart, + mode->HSyncEnd, + mode->HTotal, + + mode->VDisplay, + mode->VSyncStart, + mode->VSyncEnd, + mode->VTotal, + pScrn->depth, + pScrn->bitsPerPixel); + if (mode->Flags & V_DBLSCAN) ErrorF(" D"); + if (mode->Flags & V_INTERLACE) ErrorF(" I"); + if (mode->Flags & V_PHSYNC) ErrorF(" +H"); + if (mode->Flags & V_NHSYNC) ErrorF(" -H"); + if (mode->Flags & V_PVSYNC) ErrorF(" +V"); + if (mode->Flags & V_NVSYNC) ErrorF(" -V"); + ErrorF("\n"); + ErrorF("%-12.12s %7.2f %4d %4d %4d %4d %4d %4d %4d %4d (%d,%d)", + mode->name, + dot_clock, + + mode->CrtcHDisplay, + mode->CrtcHSyncStart, + mode->CrtcHSyncEnd, + mode->CrtcHTotal, + + mode->CrtcVDisplay, + mode->CrtcVSyncStart, + mode->CrtcVSyncEnd, + mode->CrtcVTotal, + pScrn->depth, + pScrn->bitsPerPixel); + if (mode->Flags & V_DBLSCAN) ErrorF(" D"); + if (mode->Flags & V_INTERLACE) ErrorF(" I"); + if (mode->Flags & V_PHSYNC) ErrorF(" +H"); + if (mode->Flags & V_NHSYNC) ErrorF(" -H"); + if (mode->Flags & V_PVSYNC) ErrorF(" +V"); + if (mode->Flags & V_NVSYNC) ErrorF(" -V"); + ErrorF("\n"); +#endif + + info->Flags = mode->Flags; + + RADEONInitCommonRegisters(save, mode, info); + if (!RADEONInitCrtcRegisters(pScrn, save, mode, info)) return FALSE; +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + if (info->HasPanelRegs) + RADEONInitFPRegisters(pScrn, &info->SavedReg, save, mode, info); +#endif + RADEONInitPLLRegisters(pScrn, save, mode, &info->pll, dot_clock); + if (!RADEONInitDDARegisters(pScrn, save, mode, &info->pll, info)) + return FALSE; + if (!info->PaletteSavedOnVT) RADEONInitPalette(save, info); + + RADEONTRACE(("RADEONInit returns %p\n", save)); + return TRUE; +} + +/* Initialize a new mode. */ +static Bool RADEONModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (!RADEONInit(pScrn, mode, &info->ModeReg)) return FALSE; + /* FIXME? DRILock/DRIUnlock here? */ + pScrn->vtSema = TRUE; + RADEONBlank(pScrn); + RADEONRestoreMode(pScrn, &info->ModeReg); + RADEONUnblank(pScrn); + + info->CurrentLayout.mode = mode; + + return TRUE; +} + +static Bool RADEONSaveScreen(ScreenPtr pScreen, int mode) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + Bool unblank; + + unblank = xf86IsUnblank(mode); + if (unblank) + SetTimeSinceLastInputEvent(); + + if ((pScrn != NULL) && pScrn->vtSema) { + if (unblank) + RADEONUnblank(pScrn); + else + RADEONBlank(pScrn); + } + return TRUE; +} + +Bool RADEONSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) +{ + return RADEONModeInit(xf86Screens[scrnIndex], mode); +} + +/* Used to disallow modes that are not supported by the hardware. */ +static int RADEONValidMode(int scrnIndex, DisplayModePtr mode, + Bool verbose, int flag) +{ +#ifdef ENABLE_FLAT_PANEL + /* Note: Radeon flat panel support has been disabled for now */ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (info->HasPanelRegs) { + if (mode->Flags & V_INTERLACE) return MODE_NO_INTERLACE; + if (mode->Flags & V_DBLSCAN) return MODE_NO_DBLESCAN; + } + + if (info->HasPanelRegs && !info->CRTOnly && info->VBIOS) { + int i; + for (i = info->FPBIOSstart+64; RADEON_BIOS16(i) != 0; i += 2) { + int j = RADEON_BIOS16(i); + + if (mode->CrtcHDisplay == RADEON_BIOS16(j) && + mode->CrtcVDisplay == RADEON_BIOS16(j+2)) { + /* Assume we are using expanded mode */ + if (RADEON_BIOS16(j+5)) j = RADEON_BIOS16(j+5); + else j += 9; + + mode->Clock = (CARD32)RADEON_BIOS16(j) * 10; + + mode->HDisplay = mode->CrtcHDisplay = + ((RADEON_BIOS16(j+10) & 0x01ff)+1)*8; + mode->HSyncStart = mode->CrtcHSyncStart = + ((RADEON_BIOS16(j+12) & 0x01ff)+1)*8; + mode->HSyncEnd = mode->CrtcHSyncEnd = + mode->CrtcHSyncStart + (RADEON_BIOS8(j+14) & 0x1f); + mode->HTotal = mode->CrtcHTotal = + ((RADEON_BIOS16(j+8) & 0x01ff)+1)*8; + + mode->VDisplay = mode->CrtcVDisplay = + (RADEON_BIOS16(j+17) & 0x07ff)+1; + mode->VSyncStart = mode->CrtcVSyncStart = + (RADEON_BIOS16(j+19) & 0x07ff)+1; + mode->VSyncEnd = mode->CrtcVSyncEnd = + mode->CrtcVSyncStart + ((RADEON_BIOS16(j+19) >> 11)&0x1f); + mode->VTotal = mode->CrtcVTotal = + (RADEON_BIOS16(j+15) & 0x07ff)+1; + + return MODE_OK; + } + } + return MODE_NOMODE; + } +#endif + + return MODE_OK; +} + +/* Adjust viewport into virtual desktop such that (0,0) in viewport space + is (x,y) in virtual space. */ +void RADEONAdjustFrame(int scrnIndex, int x, int y, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int Base; + + Base = y * info->CurrentLayout.displayWidth + x; + + switch (info->CurrentLayout.pixel_code) { + case 15: + case 16: Base *= 2; break; + case 24: Base *= 3; break; + case 32: Base *= 4; break; + } + + Base &= ~7; /* 3 lower bits are always 0 */ + + if (info->CurrentLayout.pixel_code == 24) + Base += 8 * (Base % 3); /* Must be multiple of 8 and 3 */ + + OUTREG(RADEON_CRTC_OFFSET, Base); +} + +/* Called when VT switching back to the X server. Reinitialize the video + mode. */ +static Bool RADEONEnterVT(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RADEONInfoPtr info = RADEONPTR(pScrn); + + RADEONTRACE(("RADEONEnterVT\n")); +#ifdef XF86DRI + if (RADEONPTR(pScrn)->directRenderingEnabled) { + RADEONCPStart(pScrn); + DRIUnlock(pScrn->pScreen); + } +#endif + if (!RADEONModeInit(pScrn, pScrn->currentMode)) return FALSE; + if (info->accelOn) + RADEONEngineInit(pScrn); + + info->PaletteSavedOnVT = FALSE; + RADEONAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); + + return TRUE; +} + +/* Called when VT switching away from the X server. Restore the original + text mode. */ +static void RADEONLeaveVT(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RADEONInfoPtr info = RADEONPTR(pScrn); + RADEONSavePtr save = &info->ModeReg; + + RADEONTRACE(("RADEONLeaveVT\n")); +#ifdef XF86DRI + if (RADEONPTR(pScrn)->directRenderingEnabled) { + DRILock(pScrn->pScreen, 0); + RADEONCPStop(pScrn); + } +#endif + RADEONSavePalette(pScrn, save); + info->PaletteSavedOnVT = TRUE; + RADEONRestore(pScrn); +} + +static Bool +RADEONEnterVTFBDev(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RADEONInfoPtr info = RADEONPTR(pScrn); + RADEONSavePtr restore = &info->SavedReg; + fbdevHWEnterVT(scrnIndex,flags); + RADEONRestorePalette(pScrn,restore); + RADEONEngineInit(pScrn); + return TRUE; +} + +static void RADEONLeaveVTFBDev(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RADEONInfoPtr info = RADEONPTR(pScrn); + RADEONSavePtr save = &info->SavedReg; + RADEONSavePalette(pScrn,save); + fbdevHWLeaveVT(scrnIndex,flags); +} + +/* Called at the end of each server generation. Restore the original text + mode, unmap video memory, and unwrap and call the saved CloseScreen + function. */ +static Bool RADEONCloseScreen(int scrnIndex, ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RADEONInfoPtr info = RADEONPTR(pScrn); + + RADEONTRACE(("RADEONCloseScreen\n")); + +#ifdef XF86DRI + /* Disable direct rendering */ + if (info->directRenderingEnabled) { + RADEONDRICloseScreen(pScreen); + info->directRenderingEnabled = FALSE; + } +#endif + + if (pScrn->vtSema) { + RADEONRestore(pScrn); + RADEONUnmapMem(pScrn); + } + + if (info->accel) XAADestroyInfoRec(info->accel); + info->accel = NULL; + + if (info->scratch_buffer[0]) xfree(info->scratch_buffer[0]); + info->scratch_buffer[0] = NULL; + + if (info->cursor) xf86DestroyCursorInfoRec(info->cursor); + info->cursor = NULL; + + if (info->DGAModes) xfree(info->DGAModes); + info->DGAModes = NULL; + + pScrn->vtSema = FALSE; + + pScreen->CloseScreen = info->CloseScreen; + return (*pScreen->CloseScreen)(scrnIndex, pScreen); +} + +static void RADEONFreeScreen(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + + RADEONTRACE(("RADEONFreeScreen\n")); + if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) + vgaHWFreeHWRec(pScrn); + RADEONFreeRec(pScrn); +} + +#ifdef DPMSExtension +/* Sets VESA Display Power Management Signaling (DPMS) Mode. */ +static void RADEONDisplayPowerManagementSet(ScrnInfoPtr pScrn, + int PowerManagementMode, int flags) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + int mask = (RADEON_CRTC_DISPLAY_DIS + | RADEON_CRTC_HSYNC_DIS + | RADEON_CRTC_VSYNC_DIS); + + switch (PowerManagementMode) { + case DPMSModeOn: + /* Screen: On; HSync: On, VSync: On */ + OUTREGP(RADEON_CRTC_EXT_CNTL, 0, ~mask); + break; + case DPMSModeStandby: + /* Screen: Off; HSync: Off, VSync: On */ + OUTREGP(RADEON_CRTC_EXT_CNTL, + RADEON_CRTC_DISPLAY_DIS | RADEON_CRTC_HSYNC_DIS, ~mask); + break; + case DPMSModeSuspend: + /* Screen: Off; HSync: On, VSync: Off */ + OUTREGP(RADEON_CRTC_EXT_CNTL, + RADEON_CRTC_DISPLAY_DIS | RADEON_CRTC_VSYNC_DIS, ~mask); + break; + case DPMSModeOff: + /* Screen: Off; HSync: Off, VSync: Off */ + OUTREGP(RADEON_CRTC_EXT_CNTL, mask, ~mask); + break; + } +} +#endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_probe.h b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_probe.h new file mode 100644 index 000000000..7bf660aa2 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_probe.h @@ -0,0 +1,42 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_probe.h,v 1.2 2000/10/23 21:16:49 tsi Exp $ */ +/************************************************************************** + +Copyright 2000 ATI Technologies Inc. and VA Linux Systems, Inc., + Sunnyvale, California. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +on the rights to use, copy, modify, merge, publish, distribute, sub +license, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin <martin@valinux.com> + * + */ + +#ifndef _RADEON_PROBE_H_ +#define _RADEON_PROBE_H_ + +extern OptionInfoPtr RADEONAvailableOptions(int chipid, int busid); +extern void RADEONIdentify(int flags); +extern Bool RADEONProbe(DriverPtr drv, int flags); + +#endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_reg.h b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_reg.h new file mode 100644 index 000000000..86a73bec7 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_reg.h @@ -0,0 +1,1477 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/r128/radeon_reg.h,v 1.2 2000/10/18 18:54:04 alanh Exp $ */ +/************************************************************************** + +Copyright 2000 ATI Technologies Inc. and VA Linux Systems, Inc., + Sunnyvale, California. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +on the rights to use, copy, modify, merge, publish, distribute, sub +license, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL +ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin <martin@valinux.com> + * Rickard E. Faith <faith@valinux.com> + * + * References: + * + * !!!! FIXME !!!! + * RAGE 128 VR/ RAGE 128 GL Register Reference Manual (Technical + * Reference Manual P/N RRG-G04100-C Rev. 0.04), ATI Technologies: April + * 1999. + * + * !!!! FIXME !!!! + * RAGE 128 Software Development Manual (Technical Reference Manual P/N + * SDK-G04000 Rev. 0.01), ATI Technologies: June 1999. + * + */ + +/* !!!! FIXME !!!! NOTE: THIS FILE HAS BEEN CONVERTED FROM r128_reg.h + * AND CONTAINS REGISTERS AND REGISTER DEFINITIONS THAT ARE NOT CORRECT + * ON THE RADEON. A FULL AUDIT OF THIS CODE IS NEEDED! */ + +#ifndef _RADEON_REG_H_ +#define _RADEON_REG_H_ +#include <compiler.h> + + /* Memory mapped register access macros */ +#define INREG8(addr) MMIO_IN8(RADEONMMIO, addr) +#define INREG16(addr) MMIO_IN16(RADEONMMIO, addr) +#define INREG(addr) MMIO_IN32(RADEONMMIO, addr) +#define OUTREG8(addr, val) MMIO_OUT8(RADEONMMIO, addr, val) +#define OUTREG16(addr, val) MMIO_OUT16(RADEONMMIO, addr, val) +#define OUTREG(addr, val) MMIO_OUT32(RADEONMMIO, addr, val) + +#define ADDRREG(addr) ((volatile CARD32 *)(RADEONMMIO + (addr))) + + +#define OUTREGP(addr, val, mask) \ + do { \ + CARD32 tmp = INREG(addr); \ + tmp &= (mask); \ + tmp |= (val); \ + OUTREG(addr, tmp); \ + } while (0) + +#define INPLL(pScrn, addr) RADEONINPLL(pScrn, addr) + +#if !RADEON_ATOMIC_UPDATE +#define OUTPLL(addr, val) \ + do { \ + while ( (INREG(RADEON_CLOCK_CNTL_INDEX) & 0x9f) != \ + (addr | RADEON_PLL_WR_EN)) { \ + OUTREG8(RADEON_CLOCK_CNTL_INDEX, (((addr) & 0x1f) | \ + RADEON_PLL_WR_EN)); \ + } \ + OUTREG(RADEON_CLOCK_CNTL_DATA, val); \ + } while (0) +#else +#define OUTPLL(addr, val) \ + do { \ + OUTREG8(RADEON_CLOCK_CNTL_INDEX, (((addr) & 0x1f) | \ + RADEON_PLL_WR_EN)); \ + OUTREG(RADEON_CLOCK_CNTL_DATA, val); \ + } while (0) +#endif + +#define OUTPLLP(pScrn, addr, val, mask) \ + do { \ + CARD32 tmp = INPLL(pScrn, addr); \ + tmp &= (mask); \ + tmp |= (val); \ + OUTPLL(addr, tmp); \ + } while (0) + +#define OUTPAL_START(idx) \ + do { \ + OUTREG8(RADEON_PALETTE_INDEX, (idx)); \ + } while (0) + +#define OUTPAL_NEXT(r, g, b) \ + do { \ + OUTREG(RADEON_PALETTE_DATA, ((r) << 16) | ((g) << 8) | (b)); \ + } while (0) + +#define OUTPAL_NEXT_CARD32(v) \ + do { \ + OUTREG(RADEON_PALETTE_DATA, (v & 0x00ffffff)); \ + } while (0) + +#define OUTPAL(idx, r, g, b) \ + do { \ + OUTPAL_START((idx)); \ + OUTPAL_NEXT((r), (g), (b)); \ + } while (0) + +#define INPAL_START(idx) \ + do { \ + OUTREG(RADEON_PALETTE_INDEX, (idx) << 16); \ + } while (0) + +#define INPAL_NEXT() INREG(RADEON_PALETTE_DATA) + +#define PAL_SELECT(idx) \ + do { \ + if (idx) { \ + OUTREG(RADEON_DAC_CNTL, INREG(RADEON_DAC_CNTL) | \ + RADEON_DAC_PALETTE_ACC_CTL); \ + } else { \ + OUTREG(RADEON_DAC_CNTL, INREG(RADEON_DAC_CNTL) & \ + ~RADEON_DAC_PALETTE_ACC_CTL); \ + } \ + } while (0) + +#define RADEON_ADAPTER_ID 0x0f2c /* PCI */ +#define RADEON_AGP_BASE 0x0170 +#define RADEON_AGP_CNTL 0x0174 +# define RADEON_AGP_APER_SIZE_256MB (0x00 << 0) +# define RADEON_AGP_APER_SIZE_128MB (0x20 << 0) +# define RADEON_AGP_APER_SIZE_64MB (0x30 << 0) +# define RADEON_AGP_APER_SIZE_32MB (0x38 << 0) +# define RADEON_AGP_APER_SIZE_16MB (0x3c << 0) +# define RADEON_AGP_APER_SIZE_8MB (0x3e << 0) +# define RADEON_AGP_APER_SIZE_4MB (0x3f << 0) +# define RADEON_AGP_APER_SIZE_MASK (0x3f << 0) +#define RADEON_AGP_COMMAND 0x0f60 /* PCI */ +#define RADEON_AGP_PLL_CNTL 0x000b /* PLL */ +#define RADEON_AGP_STATUS 0x0f5c /* PCI */ +# define RADEON_AGP_1X_MODE 0x01 +# define RADEON_AGP_2X_MODE 0x02 +# define RADEON_AGP_4X_MODE 0x04 +# define RADEON_AGP_MODE_MASK 0x07 +#define RADEON_AMCGPIO_A_REG 0x01a0 +#define RADEON_AMCGPIO_EN_REG 0x01a8 +#define RADEON_AMCGPIO_MASK 0x0194 +#define RADEON_AMCGPIO_Y_REG 0x01a4 +#define RADEON_ATTRDR 0x03c1 /* VGA */ +#define RADEON_ATTRDW 0x03c0 /* VGA */ +#define RADEON_ATTRX 0x03c0 /* VGA */ +# define RADEON_AUX1_SC_EN (1 << 0) +# define RADEON_AUX1_SC_MODE_OR (0 << 1) +# define RADEON_AUX1_SC_MODE_NAND (1 << 1) +# define RADEON_AUX2_SC_EN (1 << 2) +# define RADEON_AUX2_SC_MODE_OR (0 << 3) +# define RADEON_AUX2_SC_MODE_NAND (1 << 3) +# define RADEON_AUX3_SC_EN (1 << 4) +# define RADEON_AUX3_SC_MODE_OR (0 << 5) +# define RADEON_AUX3_SC_MODE_NAND (1 << 5) +#define RADEON_AUX_SC_CNTL 0x1660 +#define RADEON_AUX1_SC_BOTTOM 0x1670 +#define RADEON_AUX1_SC_LEFT 0x1664 +#define RADEON_AUX1_SC_RIGHT 0x1668 +#define RADEON_AUX1_SC_TOP 0x166c +#define RADEON_AUX2_SC_BOTTOM 0x1680 +#define RADEON_AUX2_SC_LEFT 0x1674 +#define RADEON_AUX2_SC_RIGHT 0x1678 +#define RADEON_AUX2_SC_TOP 0x167c +#define RADEON_AUX3_SC_BOTTOM 0x1690 +#define RADEON_AUX3_SC_LEFT 0x1684 +#define RADEON_AUX3_SC_RIGHT 0x1688 +#define RADEON_AUX3_SC_TOP 0x168c +#define RADEON_AUX_WINDOW_HORZ_CNTL 0x02d8 +#define RADEON_AUX_WINDOW_VERT_CNTL 0x02dc + +#define RADEON_BASE_CODE 0x0f0b +#define RADEON_BIOS_0_SCRATCH 0x0010 +#define RADEON_BIOS_1_SCRATCH 0x0014 +#define RADEON_BIOS_2_SCRATCH 0x0018 +#define RADEON_BIOS_3_SCRATCH 0x001c +#define RADEON_BIOS_ROM 0x0f30 /* PCI */ +#define RADEON_BIST 0x0f0f /* PCI */ +#define RADEON_BRUSH_DATA0 0x1480 +#define RADEON_BRUSH_DATA1 0x1484 +#define RADEON_BRUSH_DATA10 0x14a8 +#define RADEON_BRUSH_DATA11 0x14ac +#define RADEON_BRUSH_DATA12 0x14b0 +#define RADEON_BRUSH_DATA13 0x14b4 +#define RADEON_BRUSH_DATA14 0x14b8 +#define RADEON_BRUSH_DATA15 0x14bc +#define RADEON_BRUSH_DATA16 0x14c0 +#define RADEON_BRUSH_DATA17 0x14c4 +#define RADEON_BRUSH_DATA18 0x14c8 +#define RADEON_BRUSH_DATA19 0x14cc +#define RADEON_BRUSH_DATA2 0x1488 +#define RADEON_BRUSH_DATA20 0x14d0 +#define RADEON_BRUSH_DATA21 0x14d4 +#define RADEON_BRUSH_DATA22 0x14d8 +#define RADEON_BRUSH_DATA23 0x14dc +#define RADEON_BRUSH_DATA24 0x14e0 +#define RADEON_BRUSH_DATA25 0x14e4 +#define RADEON_BRUSH_DATA26 0x14e8 +#define RADEON_BRUSH_DATA27 0x14ec +#define RADEON_BRUSH_DATA28 0x14f0 +#define RADEON_BRUSH_DATA29 0x14f4 +#define RADEON_BRUSH_DATA3 0x148c +#define RADEON_BRUSH_DATA30 0x14f8 +#define RADEON_BRUSH_DATA31 0x14fc +#define RADEON_BRUSH_DATA32 0x1500 +#define RADEON_BRUSH_DATA33 0x1504 +#define RADEON_BRUSH_DATA34 0x1508 +#define RADEON_BRUSH_DATA35 0x150c +#define RADEON_BRUSH_DATA36 0x1510 +#define RADEON_BRUSH_DATA37 0x1514 +#define RADEON_BRUSH_DATA38 0x1518 +#define RADEON_BRUSH_DATA39 0x151c +#define RADEON_BRUSH_DATA4 0x1490 +#define RADEON_BRUSH_DATA40 0x1520 +#define RADEON_BRUSH_DATA41 0x1524 +#define RADEON_BRUSH_DATA42 0x1528 +#define RADEON_BRUSH_DATA43 0x152c +#define RADEON_BRUSH_DATA44 0x1530 +#define RADEON_BRUSH_DATA45 0x1534 +#define RADEON_BRUSH_DATA46 0x1538 +#define RADEON_BRUSH_DATA47 0x153c +#define RADEON_BRUSH_DATA48 0x1540 +#define RADEON_BRUSH_DATA49 0x1544 +#define RADEON_BRUSH_DATA5 0x1494 +#define RADEON_BRUSH_DATA50 0x1548 +#define RADEON_BRUSH_DATA51 0x154c +#define RADEON_BRUSH_DATA52 0x1550 +#define RADEON_BRUSH_DATA53 0x1554 +#define RADEON_BRUSH_DATA54 0x1558 +#define RADEON_BRUSH_DATA55 0x155c +#define RADEON_BRUSH_DATA56 0x1560 +#define RADEON_BRUSH_DATA57 0x1564 +#define RADEON_BRUSH_DATA58 0x1568 +#define RADEON_BRUSH_DATA59 0x156c +#define RADEON_BRUSH_DATA6 0x1498 +#define RADEON_BRUSH_DATA60 0x1570 +#define RADEON_BRUSH_DATA61 0x1574 +#define RADEON_BRUSH_DATA62 0x1578 +#define RADEON_BRUSH_DATA63 0x157c +#define RADEON_BRUSH_DATA7 0x149c +#define RADEON_BRUSH_DATA8 0x14a0 +#define RADEON_BRUSH_DATA9 0x14a4 +#define RADEON_BRUSH_SCALE 0x1470 +#define RADEON_BRUSH_Y_X 0x1474 +#define RADEON_BUS_CNTL 0x0030 +# define RADEON_BUS_MASTER_DIS (1 << 6) +# define RADEON_BUS_RD_DISCARD_EN (1 << 24) +# define RADEON_BUS_RD_ABORT_EN (1 << 25) +# define RADEON_BUS_MSTR_DISCONNECT_EN (1 << 28) +# define RADEON_BUS_WRT_BURST (1 << 29) +# define RADEON_BUS_READ_BURST (1 << 30) +#define RADEON_BUS_CNTL1 0x0034 +# define RADEON_BUS_WAIT_ON_LOCK_EN (1 << 4) + +#define RADEON_CACHE_CNTL 0x1724 +#define RADEON_CACHE_LINE 0x0f0c /* PCI */ +#define RADEON_CAP0_TRIG_CNTL 0x0950 /* ? */ +#define RADEON_CAP1_TRIG_CNTL 0x09c0 /* ? */ +#define RADEON_CAPABILITIES_ID 0x0f50 /* PCI */ +#define RADEON_CAPABILITIES_PTR 0x0f34 /* PCI */ +#define RADEON_CLK_PIN_CNTL 0x0001 /* PLL */ +#define RADEON_CLOCK_CNTL_DATA 0x000c +#define RADEON_CLOCK_CNTL_INDEX 0x0008 +# define RADEON_PLL_WR_EN (1 << 7) +# define RADEON_PLL_DIV_SEL (3 << 8) +#define RADEON_CLR_CMP_CLR_3D 0x1a24 +#define RADEON_CLR_CMP_CLR_DST 0x15c8 +#define RADEON_CLR_CMP_CLR_SRC 0x15c4 +#define RADEON_CLR_CMP_CNTL 0x15c0 +# define RADEON_SRC_CMP_EQ_COLOR (4 << 0) +# define RADEON_SRC_CMP_NEQ_COLOR (5 << 0) +# define RADEON_CLR_CMP_SRC_SOURCE (1 << 24) +#define RADEON_CLR_CMP_MASK 0x15cc +# define RADEON_CLR_CMP_MSK 0xffffffff +#define RADEON_CLR_CMP_MASK_3D 0x1A28 +#define RADEON_COMMAND 0x0f04 /* PCI */ +#define RADEON_COMPOSITE_SHADOW_ID 0x1a0c +#define RADEON_CONFIG_APER_0_BASE 0x0100 +#define RADEON_CONFIG_APER_1_BASE 0x0104 +#define RADEON_CONFIG_APER_SIZE 0x0108 +#define RADEON_CONFIG_BONDS 0x00e8 +#define RADEON_CONFIG_CNTL 0x00e0 +#define RADEON_CONFIG_MEMSIZE 0x00f8 +#define RADEON_CONFIG_MEMSIZE_EMBEDDED 0x0114 +#define RADEON_CONFIG_REG_1_BASE 0x010c +#define RADEON_CONFIG_REG_APER_SIZE 0x0110 +#define RADEON_CONFIG_XSTRAP 0x00e4 +#define RADEON_CONSTANT_COLOR_C 0x1d34 +# define RADEON_CONSTANT_COLOR_MASK 0x00ffffff +# define RADEON_CONSTANT_COLOR_ONE 0x00ffffff +# define RADEON_CONSTANT_COLOR_ZERO 0x00000000 +#define RADEON_CRC_CMDFIFO_ADDR 0x0740 +#define RADEON_CRC_CMDFIFO_DOUT 0x0744 +#define RADEON_CRTC_CRNT_FRAME 0x0214 +#define RADEON_CRTC_DEBUG 0x021c +#define RADEON_CRTC_EXT_CNTL 0x0054 +# define RADEON_CRTC_VGA_XOVERSCAN (1 << 0) +# define RADEON_VGA_ATI_LINEAR (1 << 3) +# define RADEON_XCRT_CNT_EN (1 << 6) +# define RADEON_CRTC_HSYNC_DIS (1 << 8) +# define RADEON_CRTC_VSYNC_DIS (1 << 9) +# define RADEON_CRTC_DISPLAY_DIS (1 << 10) +# define RADEON_CRTC_CRT_ON (1 << 15) +#define RADEON_CRTC_EXT_CNTL_DPMS_BYTE 0x0055 +# define RADEON_CRTC_HSYNC_DIS_BYTE (1 << 0) +# define RADEON_CRTC_VSYNC_DIS_BYTE (1 << 1) +# define RADEON_CRTC_DISPLAY_DIS_BYTE (1 << 2) +#define RADEON_CRTC_GEN_CNTL 0x0050 +# define RADEON_CRTC_DBL_SCAN_EN (1 << 0) +# define RADEON_CRTC_INTERLACE_EN (1 << 1) +# define RADEON_CRTC_CSYNC_EN (1 << 4) +# define RADEON_CRTC_CUR_EN (1 << 16) +# define RADEON_CRTC_CUR_MODE_MASK (7 << 17) +# define RADEON_CRTC_ICON_EN (1 << 20) +# define RADEON_CRTC_EXT_DISP_EN (1 << 24) +# define RADEON_CRTC_EN (1 << 25) +# define RADEON_CRTC_DISP_REQ_EN_B (1 << 26) +#define RADEON_CRTC_GUI_TRIG_VLINE 0x0218 +#define RADEON_CRTC_H_SYNC_STRT_WID 0x0204 +# define RADEON_CRTC_H_SYNC_STRT_PIX (0x07 << 0) +# define RADEON_CRTC_H_SYNC_STRT_CHAR (0x1ff << 3) +# define RADEON_CRTC_H_SYNC_STRT_CHAR_SHIFT 3 +# define RADEON_CRTC_H_SYNC_WID (0x3f << 16) +# define RADEON_CRTC_H_SYNC_WID_SHIFT 16 +# define RADEON_CRTC_H_SYNC_POL (1 << 23) +#define RADEON_CRTC_H_TOTAL_DISP 0x0200 +# define RADEON_CRTC_H_TOTAL (0x01ff << 0) +# define RADEON_CRTC_H_TOTAL_SHIFT 0 +# define RADEON_CRTC_H_DISP (0x00ff << 16) +# define RADEON_CRTC_H_DISP_SHIFT 16 +#define RADEON_CRTC_OFFSET 0x0224 +#define RADEON_CRTC_OFFSET_CNTL 0x0228 +#define RADEON_CRTC_PITCH 0x022c +#define RADEON_CRTC_STATUS 0x005c +# define RADEON_CRTC_VBLANK_SAVE (1 << 1) +#define RADEON_CRTC_V_SYNC_STRT_WID 0x020c +# define RADEON_CRTC_V_SYNC_STRT (0x7ff << 0) +# define RADEON_CRTC_V_SYNC_STRT_SHIFT 0 +# define RADEON_CRTC_V_SYNC_WID (0x1f << 16) +# define RADEON_CRTC_V_SYNC_WID_SHIFT 16 +# define RADEON_CRTC_V_SYNC_POL (1 << 23) +#define RADEON_CRTC_V_TOTAL_DISP 0x0208 +# define RADEON_CRTC_V_TOTAL (0x07ff << 0) +# define RADEON_CRTC_V_TOTAL_SHIFT 0 +# define RADEON_CRTC_V_DISP (0x07ff << 16) +# define RADEON_CRTC_V_DISP_SHIFT 16 +#define RADEON_CRTC_VLINE_CRNT_VLINE 0x0210 +# define RADEON_CRTC_CRNT_VLINE_MASK (0x7ff << 16) +#define RADEON_CRTC2_CRNT_FRAME 0x0314 +#define RADEON_CRTC2_DEBUG 0x031c +#define RADEON_CRTC2_GEN_CNTL 0x03f8 +#define RADEON_CRTC2_GUI_TRIG_VLINE 0x0318 +#define RADEON_CRTC2_H_SYNC_STRT_WID 0x0304 +#define RADEON_CRTC2_H_TOTAL_DISP 0x0300 +#define RADEON_CRTC2_OFFSET 0x0324 +#define RADEON_CRTC2_OFFSET_CNTL 0x0328 +#define RADEON_CRTC2_PITCH 0x032c +#define RADEON_CRTC2_STATUS 0x03fc +#define RADEON_CRTC2_V_SYNC_STRT_WID 0x030c +#define RADEON_CRTC2_V_TOTAL_DISP 0x0308 +#define RADEON_CRTC2_VLINE_CRNT_VLINE 0x0310 +#define RADEON_CRTC8_DATA 0x03d5 /* VGA, 0x3b5 */ +#define RADEON_CRTC8_IDX 0x03d4 /* VGA, 0x3b4 */ +#define RADEON_CUR_CLR0 0x026c +#define RADEON_CUR_CLR1 0x0270 +#define RADEON_CUR_HORZ_VERT_OFF 0x0268 +#define RADEON_CUR_HORZ_VERT_POSN 0x0264 +#define RADEON_CUR_OFFSET 0x0260 +# define RADEON_CUR_LOCK (1 << 31) + +#define RADEON_DAC_CNTL 0x0058 +# define RADEON_DAC_RANGE_CNTL (3 << 0) +# define RADEON_DAC_BLANKING (1 << 2) +# define RADEON_DAC_CRT_SEL_CRTC2 (1 << 4) +# define RADEON_DAC_PALETTE_ACC_CTL (1 << 5) +# define RADEON_DAC_8BIT_EN (1 << 8) +# define RADEON_DAC_VGA_ADR_EN (1 << 13) +# define RADEON_DAC_MASK_ALL (0xff << 24) +#define RADEON_DAC_CRC_SIG 0x02cc +#define RADEON_DAC_DATA 0x03c9 /* VGA */ +#define RADEON_DAC_MASK 0x03c6 /* VGA */ +#define RADEON_DAC_R_INDEX 0x03c7 /* VGA */ +#define RADEON_DAC_W_INDEX 0x03c8 /* VGA */ +#define RADEON_DDA_CONFIG 0x02e0 +#define RADEON_DDA_ON_OFF 0x02e4 +#define RADEON_DEFAULT_OFFSET 0x16e0 +#define RADEON_DEFAULT_PITCH 0x16e4 +#define RADEON_DEFAULT_SC_BOTTOM_RIGHT 0x16e8 +# define RADEON_DEFAULT_SC_RIGHT_MAX (0x1fff << 0) +# define RADEON_DEFAULT_SC_BOTTOM_MAX (0x1fff << 16) +#define RADEON_DESTINATION_3D_CLR_CMP_VAL 0x1820 +#define RADEON_DESTINATION_3D_CLR_CMP_MSK 0x1824 +#define RADEON_DEVICE_ID 0x0f02 /* PCI */ +#define RADEON_DISP_MISC_CNTL 0x0d00 +# define RADEON_SOFT_RESET_GRPH_PP (1 << 0) +#define RADEON_DP_BRUSH_BKGD_CLR 0x1478 +#define RADEON_DP_BRUSH_FRGD_CLR 0x147c +#define RADEON_DP_CNTL 0x16c0 +# define RADEON_DST_X_LEFT_TO_RIGHT (1 << 0) +# define RADEON_DST_Y_TOP_TO_BOTTOM (1 << 1) +#define RADEON_DP_CNTL_XDIR_YDIR_YMAJOR 0x16d0 +# define RADEON_DST_Y_MAJOR (1 << 2) +# define RADEON_DST_Y_DIR_TOP_TO_BOTTOM (1 << 15) +# define RADEON_DST_X_DIR_LEFT_TO_RIGHT (1 << 31) +#define RADEON_DP_DATATYPE 0x16c4 +# define RADEON_HOST_BIG_ENDIAN_EN (1 << 29) +#define RADEON_DP_GUI_MASTER_CNTL 0x146c +# define RADEON_GMC_SRC_PITCH_OFFSET_CNTL (1 << 0) +# define RADEON_GMC_DST_PITCH_OFFSET_CNTL (1 << 1) +# define RADEON_GMC_SRC_CLIPPING (1 << 2) +# define RADEON_GMC_DST_CLIPPING (1 << 3) +# define RADEON_GMC_BRUSH_DATATYPE_MASK (0x0f << 4) +# define RADEON_GMC_BRUSH_8X8_MONO_FG_BG (0 << 4) +# define RADEON_GMC_BRUSH_8X8_MONO_FG_LA (1 << 4) +# define RADEON_GMC_BRUSH_1X8_MONO_FG_BG (4 << 4) +# define RADEON_GMC_BRUSH_1X8_MONO_FG_LA (5 << 4) +# define RADEON_GMC_BRUSH_32x1_MONO_FG_BG (6 << 4) +# define RADEON_GMC_BRUSH_32x1_MONO_FG_LA (7 << 4) +# define RADEON_GMC_BRUSH_8x8_COLOR (10 << 4) +# define RADEON_GMC_BRUSH_1X8_COLOR (12 << 4) +# define RADEON_GMC_BRUSH_SOLID_COLOR (13 << 4) +# define RADEON_GMC_BRUSH_NONE (15 << 4) +# define RADEON_GMC_DST_8BPP_CI (2 << 8) +# define RADEON_GMC_DST_15BPP (3 << 8) +# define RADEON_GMC_DST_16BPP (4 << 8) +# define RADEON_GMC_DST_24BPP (5 << 8) +# define RADEON_GMC_DST_32BPP (6 << 8) +# define RADEON_GMC_DST_8BPP_RGB (7 << 8) +# define RADEON_GMC_DST_Y8 (8 << 8) +# define RADEON_GMC_DST_RGB8 (9 << 8) +# define RADEON_GMC_DST_VYUY (11 << 8) +# define RADEON_GMC_DST_YVYU (12 << 8) +# define RADEON_GMC_DST_AYUV444 (14 << 8) +# define RADEON_GMC_DST_ARGB4444 (15 << 8) +# define RADEON_GMC_DST_DATATYPE_MASK (0x0f << 8) +# define RADEON_GMC_DST_DATATYPE_SHIFT 8 +# define RADEON_GMC_SRC_DATATYPE_MASK (3 << 12) +# define RADEON_GMC_SRC_DATATYPE_MONO_FG_BG (0 << 12) +# define RADEON_GMC_SRC_DATATYPE_MONO_FG_LA (1 << 12) +# define RADEON_GMC_SRC_DATATYPE_COLOR (3 << 12) +# define RADEON_GMC_BYTE_PIX_ORDER (1 << 14) +# define RADEON_GMC_BYTE_MSB_TO_LSB (0 << 14) +# define RADEON_GMC_BYTE_LSB_TO_MSB (1 << 14) +# define RADEON_GMC_CONVERSION_TEMP (1 << 15) +# define RADEON_GMC_CONVERSION_TEMP_6500 (0 << 15) +# define RADEON_GMC_CONVERSION_TEMP_9300 (1 << 15) +# define RADEON_GMC_ROP3_MASK (0xff << 16) +# define RADEON_DP_SRC_SOURCE_MASK (7 << 24) +# define RADEON_DP_SRC_SOURCE_MEMORY (2 << 24) +# define RADEON_DP_SRC_SOURCE_HOST_DATA (3 << 24) +# define RADEON_GMC_3D_FCN_EN (1 << 27) +# define RADEON_GMC_CLR_CMP_CNTL_DIS (1 << 28) +# define RADEON_GMC_AUX_CLIP_DIS (1 << 29) +# define RADEON_GMC_WR_MSK_DIS (1 << 30) +# define RADEON_GMC_LD_BRUSH_Y_X (1 << 31) +# define RADEON_ROP3_ZERO 0x00000000 +# define RADEON_ROP3_DSa 0x00880000 +# define RADEON_ROP3_SDna 0x00440000 +# define RADEON_ROP3_S 0x00cc0000 +# define RADEON_ROP3_DSna 0x00220000 +# define RADEON_ROP3_D 0x00aa0000 +# define RADEON_ROP3_DSx 0x00660000 +# define RADEON_ROP3_DSo 0x00ee0000 +# define RADEON_ROP3_DSon 0x00110000 +# define RADEON_ROP3_DSxn 0x00990000 +# define RADEON_ROP3_Dn 0x00550000 +# define RADEON_ROP3_SDno 0x00dd0000 +# define RADEON_ROP3_Sn 0x00330000 +# define RADEON_ROP3_DSno 0x00bb0000 +# define RADEON_ROP3_DSan 0x00770000 +# define RADEON_ROP3_ONE 0x00ff0000 +# define RADEON_ROP3_DPa 0x00a00000 +# define RADEON_ROP3_PDna 0x00500000 +# define RADEON_ROP3_P 0x00f00000 +# define RADEON_ROP3_DPna 0x000a0000 +# define RADEON_ROP3_D 0x00aa0000 +# define RADEON_ROP3_DPx 0x005a0000 +# define RADEON_ROP3_DPo 0x00fa0000 +# define RADEON_ROP3_DPon 0x00050000 +# define RADEON_ROP3_PDxn 0x00a50000 +# define RADEON_ROP3_PDno 0x00f50000 +# define RADEON_ROP3_Pn 0x000f0000 +# define RADEON_ROP3_DPno 0x00af0000 +# define RADEON_ROP3_DPan 0x005f0000 + + +#define RADEON_DP_GUI_MASTER_CNTL_C 0x1c84 +#define RADEON_DP_MIX 0x16c8 +#define RADEON_DP_SRC_BKGD_CLR 0x15dc +#define RADEON_DP_SRC_FRGD_CLR 0x15d8 +#define RADEON_DP_WRITE_MASK 0x16cc +#define RADEON_DST_BRES_DEC 0x1630 +#define RADEON_DST_BRES_ERR 0x1628 +#define RADEON_DST_BRES_INC 0x162c +#define RADEON_DST_BRES_LNTH 0x1634 +#define RADEON_DST_BRES_LNTH_SUB 0x1638 +#define RADEON_DST_HEIGHT 0x1410 +#define RADEON_DST_HEIGHT_WIDTH 0x143c +#define RADEON_DST_HEIGHT_WIDTH_8 0x158c +#define RADEON_DST_HEIGHT_WIDTH_BW 0x15b4 +#define RADEON_DST_HEIGHT_Y 0x15a0 +#define RADEON_DST_LINE_START 0x1600 +#define RADEON_DST_LINE_END 0x1604 +#define RADEON_DST_OFFSET 0x1404 +#define RADEON_DST_PITCH 0x1408 +#define RADEON_DST_PITCH_OFFSET 0x142c +#define RADEON_DST_PITCH_OFFSET_C 0x1c80 +# define RADEON_PITCH_SHIFT 21 +#define RADEON_DST_WIDTH 0x140c +#define RADEON_DST_WIDTH_HEIGHT 0x1598 +#define RADEON_DST_WIDTH_X 0x1588 +#define RADEON_DST_WIDTH_X_INCY 0x159c +#define RADEON_DST_X 0x141c +#define RADEON_DST_X_SUB 0x15a4 +#define RADEON_DST_X_Y 0x1594 +#define RADEON_DST_Y 0x1420 +#define RADEON_DST_Y_SUB 0x15a8 +#define RADEON_DST_Y_X 0x1438 + +#define RADEON_FCP_CNTL 0x0012 /* PLL */ +#define RADEON_FLUSH_1 0x1704 +#define RADEON_FLUSH_2 0x1708 +#define RADEON_FLUSH_3 0x170c +#define RADEON_FLUSH_4 0x1710 +#define RADEON_FLUSH_5 0x1714 +#define RADEON_FLUSH_6 0x1718 +#define RADEON_FLUSH_7 0x171c +#define RADEON_FOG_3D_TABLE_START 0x1810 +#define RADEON_FOG_3D_TABLE_END 0x1814 +#define RADEON_FOG_3D_TABLE_DENSITY 0x181c +#define RADEON_FOG_TABLE_INDEX 0x1a14 +#define RADEON_FOG_TABLE_DATA 0x1a18 +#define RADEON_FP_CRTC_H_TOTAL_DISP 0x0250 +#define RADEON_FP_CRTC_V_TOTAL_DISP 0x0254 +#define RADEON_FP_GEN_CNTL 0x0284 +# define RADEON_FP_FPON (1 << 0) +# define RADEON_FP_TDMS_EN (1 << 2) +# define RADEON_FP_DETECT_SENSE (1 << 8) +# define RADEON_FP_SEL_CRTC2 (1 << 13) +# define RADEON_FP_CRTC_DONT_SHADOW_VPAR (1 << 16) +# define RADEON_FP_CRTC_USE_SHADOW_VEND (1 << 18) +# define RADEON_FP_CRTC_HORZ_DIV2_EN (1 << 20) +# define RADEON_FP_CRTC_HOR_CRT_DIV2_DIS (1 << 21) +# define RADEON_FP_USE_SHADOW_EN (1 << 24) +#define RADEON_FP_H_SYNC_STRT_WID 0x02c4 +#define RADEON_FP_HORZ_STRETCH 0x028c +# define RADEON_HORZ_STRETCH_RATIO_MASK 0xffff +# define RADEON_HORZ_STRETCH_RATIO_SHIFT 0 +# define RADEON_HORZ_STRETCH_RATIO_MAX 4096 +# define RADEON_HORZ_PANEL_SIZE (0xff << 16) +# define RADEON_HORZ_PANEL_SHIFT 16 +# define RADEON_HORZ_STRETCH_PIXREP (0 << 25) +# define RADEON_HORZ_STRETCH_BLEND (1 << 25) +# define RADEON_HORZ_STRETCH_ENABLE (1 << 26) +# define RADEON_HORZ_FP_LOOP_STRETCH (0x7 << 27) +# define RADEON_HORZ_STRETCH_RESERVED (1 << 30) +# define RADEON_HORZ_AUTO_RATIO_FIX_EN (1 << 31) + +#define RADEON_FP_PANEL_CNTL 0x0288 +# define RADEON_FP_DIGON (1 << 0) +# define RADEON_FP_BLON (1 << 1) +#define RADEON_FP_V_SYNC_STRT_WID 0x02c8 +#define RADEON_FP_VERT_STRETCH 0x0290 +# define RADEON_VERT_PANEL_SIZE (0x7ff << 0) +# define RADEON_VERT_PANEL_SHIFT 0 +# define RADEON_VERT_STRETCH_RATIO_MASK 0x3ff +# define RADEON_VERT_STRETCH_RATIO_SHIFT 11 +# define RADEON_VERT_STRETCH_RATIO_MAX 1024 +# define RADEON_VERT_STRETCH_ENABLE (1 << 24) +# define RADEON_VERT_STRETCH_LINEREP (0 << 25) +# define RADEON_VERT_STRETCH_BLEND (1 << 25) +# define RADEON_VERT_AUTO_RATIO_EN (1 << 26) +# define RADEON_VERT_STRETCH_RESERVED 0xf8e00000 + +#define RADEON_GEN_INT_CNTL 0x0040 +#define RADEON_GEN_INT_STATUS 0x0044 +# define RADEON_VSYNC_INT_AK (1 << 2) +# define RADEON_VSYNC_INT (1 << 2) +#define RADEON_RBBM_SOFT_RESET 0x00f0 +# define RADEON_SOFT_RESET_CP (1 << 0) +# define RADEON_SOFT_RESET_HI (1 << 1) +# define RADEON_SOFT_RESET_SE (1 << 2) +# define RADEON_SOFT_RESET_RE (1 << 3) +# define RADEON_SOFT_RESET_PP (1 << 4) +# define RADEON_SOFT_RESET_E2 (1 << 5) +# define RADEON_SOFT_RESET_RB (1 << 6) +# define RADEON_SOFT_RESET_HDP (1 << 7) +#define RADEON_GENENB 0x03c3 /* VGA */ +#define RADEON_GENFC_RD 0x03ca /* VGA */ +#define RADEON_GENFC_WT 0x03da /* VGA, 0x03ba */ +#define RADEON_GENMO_RD 0x03cc /* VGA */ +#define RADEON_GENMO_WT 0x03c2 /* VGA */ +#define RADEON_GENS0 0x03c2 /* VGA */ +#define RADEON_GENS1 0x03da /* VGA, 0x03ba */ +#define RADEON_GPIO_MONID 0x0068 +# define RADEON_GPIO_MONID_A_0 (1 << 0) +# define RADEON_GPIO_MONID_A_1 (1 << 1) +# define RADEON_GPIO_MONID_A_2 (1 << 2) +# define RADEON_GPIO_MONID_A_3 (1 << 3) +# define RADEON_GPIO_MONID_Y_0 (1 << 8) +# define RADEON_GPIO_MONID_Y_1 (1 << 9) +# define RADEON_GPIO_MONID_Y_2 (1 << 10) +# define RADEON_GPIO_MONID_Y_3 (1 << 11) +# define RADEON_GPIO_MONID_EN_0 (1 << 16) +# define RADEON_GPIO_MONID_EN_1 (1 << 17) +# define RADEON_GPIO_MONID_EN_2 (1 << 18) +# define RADEON_GPIO_MONID_EN_3 (1 << 19) +# define RADEON_GPIO_MONID_MASK_0 (1 << 24) +# define RADEON_GPIO_MONID_MASK_1 (1 << 25) +# define RADEON_GPIO_MONID_MASK_2 (1 << 26) +# define RADEON_GPIO_MONID_MASK_3 (1 << 27) +#define RADEON_GPIO_MONIDB 0x006c +#define RADEON_GRPH8_DATA 0x03cf /* VGA */ +#define RADEON_GRPH8_IDX 0x03ce /* VGA */ +#define RADEON_GUI_DEBUG0 0x16a0 +#define RADEON_GUI_DEBUG1 0x16a4 +#define RADEON_GUI_DEBUG2 0x16a8 +#define RADEON_GUI_DEBUG3 0x16ac +#define RADEON_GUI_DEBUG4 0x16b0 +#define RADEON_GUI_DEBUG5 0x16b4 +#define RADEON_GUI_DEBUG6 0x16b8 +#define RADEON_GUI_SCRATCH_REG0 0x15e0 +#define RADEON_GUI_SCRATCH_REG1 0x15e4 +#define RADEON_GUI_SCRATCH_REG2 0x15e8 +#define RADEON_GUI_SCRATCH_REG3 0x15ec +#define RADEON_GUI_SCRATCH_REG4 0x15f0 +#define RADEON_GUI_SCRATCH_REG5 0x15f4 +#define RADEON_HEADER 0x0f0e /* PCI */ +#define RADEON_HOST_DATA0 0x17c0 +#define RADEON_HOST_DATA1 0x17c4 +#define RADEON_HOST_DATA2 0x17c8 +#define RADEON_HOST_DATA3 0x17cc +#define RADEON_HOST_DATA4 0x17d0 +#define RADEON_HOST_DATA5 0x17d4 +#define RADEON_HOST_DATA6 0x17d8 +#define RADEON_HOST_DATA7 0x17dc +#define RADEON_HOST_DATA_LAST 0x17e0 +#define RADEON_HOST_PATH_CNTL 0x0130 +#define RADEON_HTOTAL_CNTL 0x0009 /* PLL */ +#define RADEON_HW_DEBUG 0x0128 +#define RADEON_HW_DEBUG2 0x011c + +#define RADEON_I2C_CNTL_1 0x0094 /* ? */ +#define RADEON_INTERRUPT_LINE 0x0f3c /* PCI */ +#define RADEON_INTERRUPT_PIN 0x0f3d /* PCI */ +#define RADEON_IO_BASE 0x0f14 /* PCI */ + +#define RADEON_LATENCY 0x0f0d /* PCI */ +#define RADEON_LEAD_BRES_DEC 0x1608 +#define RADEON_LEAD_BRES_LNTH 0x161c +#define RADEON_LEAD_BRES_LNTH_SUB 0x1624 +#define RADEON_LVDS_GEN_CNTL 0x02d0 +# define RADEON_LVDS_ON (1 << 0) +# define RADEON_LVDS_BLON (1 << 19) +# define RADEON_LVDS_SEL_CRTC2 (1 << 23) +# define RADEON_HSYNC_DELAY_SHIFT 28 +# define RADEON_HSYNC_DELAY_MASK (0xf << 28) + +#define RADEON_MAX_LATENCY 0x0f3f /* PCI */ +#define RADEON_MC_AGP_LOCATION 0x014c +#define RADEON_MC_FB_LOCATION 0x0148 +#define RADEON_MCLK_CNTL 0x0012 /* PLL */ +# define RADEON_FORCE_GCP (1 << 16) +# define RADEON_FORCE_PIPE3D_CP (1 << 17) +# define RADEON_FORCE_RCP (1 << 18) +#define RADEON_MDGPIO_A_REG 0x01ac +#define RADEON_MDGPIO_EN_REG 0x01b0 +#define RADEON_MDGPIO_MASK 0x0198 +#define RADEON_MDGPIO_Y_REG 0x01b4 +#define RADEON_MEM_ADDR_CONFIG 0x0148 +#define RADEON_MEM_BASE 0x0f10 /* PCI */ +#define RADEON_MEM_CNTL 0x0140 +#define RADEON_MEM_INIT_LAT_TIMER 0x0154 +#define RADEON_MEM_INTF_CNTL 0x014c +#define RADEON_MEM_SDRAM_MODE_REG 0x0158 +#define RADEON_MEM_STR_CNTL 0x0150 +#define RADEON_MEM_VGA_RP_SEL 0x003c +#define RADEON_MEM_VGA_WP_SEL 0x0038 +#define RADEON_MIN_GRANT 0x0f3e /* PCI */ +#define RADEON_MM_DATA 0x0004 +#define RADEON_MM_INDEX 0x0000 +#define RADEON_MPLL_CNTL 0x000e /* PLL */ +#define RADEON_MPP_TB_CONFIG 0x01c0 /* ? */ +#define RADEON_MPP_GP_CONFIG 0x01c8 /* ? */ + +#define RADEON_N_VIF_COUNT 0x0248 + +#define RADEON_OV0_SCALE_CNTL 0x0420 /* ? */ +#define RADEON_OVR_CLR 0x0230 +#define RADEON_OVR_WID_LEFT_RIGHT 0x0234 +#define RADEON_OVR_WID_TOP_BOTTOM 0x0238 + +/* first overlay unit (there is only one) */ + +#define RADEON_OV0_Y_X_START 0x0400 +#define RADEON_OV0_Y_X_END 0x0404 +#define RADEON_OV0_EXCLUSIVE_HORZ 0x0408 +# define RADEON_EXCL_HORZ_START_MASK 0x000000ff +# define RADEON_EXCL_HORZ_END_MASK 0x0000ff00 +# define RADEON_EXCL_HORZ_BACK_PORCH_MASK 0x00ff0000 +# define RADEON_EXCL_HORZ_EXCLUSIVE_EN 0x80000000 +#define RADEON_OV0_EXCLUSIVE_VERT 0x040C +# define RADEON_EXCL_VERT_START_MASK 0x000003ff +# define RADEON_EXCL_VERT_END_MASK 0x03ff0000 +#define RADEON_OV0_REG_LOAD_CNTL 0x0410 +# define RADEON_REG_LD_CTL_LOCK 0x00000001L +# define RADEON_REG_LD_CTL_VBLANK_DURING_LOCK 0x00000002L +# define RADEON_REG_LD_CTL_STALL_GUI_UNTIL_FLIP 0x00000004L +# define RADEON_REG_LD_CTL_LOCK_READBACK 0x00000008L +#define RADEON_OV0_SCALE_CNTL 0x0420 +# define RADEON_SCALER_PIX_EXPAND 0x00000001L +# define RADEON_SCALER_Y2R_TEMP 0x00000002L +# define RADEON_SCALER_HORZ_PICK_NEAREST 0x00000003L +# define RADEON_SCALER_VERT_PICK_NEAREST 0x00000004L +# define RADEON_SCALER_SIGNED_UV 0x00000010L +# define RADEON_SCALER_GAMMA_SEL_MASK 0x00000060L +# define RADEON_SCALER_GAMMA_SEL_BRIGHT 0x00000000L +# define RADEON_SCALER_GAMMA_SEL_G22 0x00000020L +# define RADEON_SCALER_GAMMA_SEL_G18 0x00000040L +# define RADEON_SCALER_GAMMA_SEL_G14 0x00000060L +# define RADEON_SCALER_COMCORE_SHIFT_UP_ONE 0x00000080L +# define RADEON_SCALER_SURFAC_FORMAT 0x00000f00L +# define RADEON_SCALER_SOURCE_15BPP 0x00000300L +# define RADEON_SCALER_SOURCE_16BPP 0x00000400L +# define RADEON_SCALER_SOURCE_32BPP 0x00000600L +# define RADEON_SCALER_SOURCE_YUV9 0x00000900L +# define RADEON_SCALER_SOURCE_YUV12 0x00000A00L +# define RADEON_SCALER_SOURCE_VYUY422 0x00000B00L +# define RADEON_SCALER_SOURCE_YVYU422 0x00000C00L +# define RADEON_SCALER_SMART_SWITCH 0x00008000L +# define RADEON_SCALER_BURST_PER_PLANE 0x00ff0000L +# define RADEON_SCALER_DOUBLE_BUFFER 0x01000000L +# define RADEON_SCALER_DIS_LIMIT 0x08000000L +# define RADEON_SCALER_PRG_LOAD_START 0x10000000L +# define RADEON_SCALER_INT_EMU 0x20000000L +# define RADEON_SCALER_ENABLE 0x40000000L +# define RADEON_SCALER_SOFT_RESET 0x80000000L +#define RADEON_OV0_V_INC 0x0424 +#define RADEON_OV0_P1_V_ACCUM_INIT 0x0428 +# define RADEON_OV0_P1_MAX_LN_IN_PER_LN_OUT 0x00000003L +# define RADEON_OV0_P1_V_ACCUM_INIT_MASK 0x01ff8000L +#define RADEON_OV0_P23_V_ACCUM_INIT 0x042C +#define RADEON_OV0_P1_BLANK_LINES_AT_TOP 0x0430 +# define RADEON_P1_BLNK_LN_AT_TOP_M1_MASK 0x00000fffL +# define RADEON_P1_ACTIVE_LINES_M1 0x0fff0000L +#define RADEON_OV0_P23_BLANK_LINES_AT_TOP 0x0434 +# define RADEON_P23_BLNK_LN_AT_TOP_M1_MASK 0x000007ffL +# define RADEON_P23_ACTIVE_LINES_M1 0x07ff0000L +#define RADEON_OV0_VID_BUF0_BASE_ADRS 0x0440 +# define RADEON_VIF_BUF0_PITCH_SEL 0x00000001L +# define RADEON_VIF_BUF0_TILE_ADRS 0x00000002L +# define RADEON_VIF_BUF0_BASE_ADRS_MASK 0x03fffff0L +# define RADEON_VIF_BUF0_1ST_LINE_LSBS_MASK 0x48000000L +#define RADEON_OV0_VID_BUF1_BASE_ADRS 0x0444 +# define RADEON_VIF_BUF1_PITCH_SEL 0x00000001L +# define RADEON_VIF_BUF1_TILE_ADRS 0x00000002L +# define RADEON_VIF_BUF1_BASE_ADRS_MASK 0x03fffff0L +# define RADEON_VIF_BUF1_1ST_LINE_LSBS_MASK 0x48000000L +#define RADEON_OV0_VID_BUF2_BASE_ADRS 0x0448 +# define RADEON_VIF_BUF2_PITCH_SEL 0x00000001L +# define RADEON_VIF_BUF2_TILE_ADRS 0x00000002L +# define RADEON_VIF_BUF2_BASE_ADRS_MASK 0x03fffff0L +# define RADEON_VIF_BUF2_1ST_LINE_LSBS_MASK 0x48000000L +#define RADEON_OV0_VID_BUF3_BASE_ADRS 0x044C +#define RADEON_OV0_VID_BUF4_BASE_ADRS 0x0450 +#define RADEON_OV0_VID_BUF5_BASE_ADRS 0x0454 +#define RADEON_OV0_VID_BUF_PITCH0_VALUE 0x0460 +#define RADEON_OV0_VID_BUF_PITCH1_VALUE 0x0464 +#define RADEON_OV0_AUTO_FLIP_CNTL 0x0470 +#define RADEON_OV0_DEINTERLACE_PATTERN 0x0474 +#define RADEON_OV0_H_INC 0x0480 +#define RADEON_OV0_STEP_BY 0x0484 +#define RADEON_OV0_P1_H_ACCUM_INIT 0x0488 +#define RADEON_OV0_P23_H_ACCUM_INIT 0x048C +#define RADEON_OV0_P1_X_START_END 0x0494 +#define RADEON_OV0_P2_X_START_END 0x0498 +#define RADEON_OV0_P3_X_START_END 0x049C +#define RADEON_OV0_FILTER_CNTL 0x04A0 +#define RADEON_OV0_FOUR_TAP_COEF_0 0x04B0 +#define RADEON_OV0_FOUR_TAP_COEF_1 0x04B4 +#define RADEON_OV0_FOUR_TAP_COEF_2 0x04B8 +#define RADEON_OV0_FOUR_TAP_COEF_3 0x04BC +#define RADEON_OV0_FOUR_TAP_COEF_4 0x04C0 +#define RADEON_OV0_COLOUR_CNTL 0x04E0 +#define RADEON_OV0_VIDEO_KEY_CLR 0x04E4 +#define RADEON_OV0_VIDEO_KEY_MSK 0x04E8 +#define RADEON_OV0_GRAPHICS_KEY_CLR 0x04EC +#define RADEON_OV0_GRAPHICS_KEY_MSK 0x04F0 +#define RADEON_OV0_KEY_CNTL 0x04F4 +# define RADEON_VIDEO_KEY_FN_MASK 0x00000007L +# define RADEON_VIDEO_KEY_FN_FALSE 0x00000000L +# define RADEON_VIDEO_KEY_FN_TRUE 0x00000001L +# define RADEON_VIDEO_KEY_FN_EQ 0x00000004L +# define RADEON_VIDEO_KEY_FN_NE 0x00000005L +# define RADEON_GRAPHIC_KEY_FN_MASK 0x00000070L +# define RADEON_GRAPHIC_KEY_FN_FALSE 0x00000000L +# define RADEON_GRAPHIC_KEY_FN_TRUE 0x00000010L +# define RADEON_GRAPHIC_KEY_FN_EQ 0x00000040L +# define RADEON_GRAPHIC_KEY_FN_NE 0x00000050L +# define RADEON_CMP_MIX_MASK 0x00000100L +# define RADEON_CMP_MIX_OR 0x00000000L +# define RADEON_CMP_MIX_AND 0x00000100L +#define RADEON_OV0_TEST 0x04F8 + +#define RADEON_PALETTE_DATA 0x00b4 +#define RADEON_PALETTE_30_DATA 0x00b8 +#define RADEON_PALETTE_INDEX 0x00b0 +#define RADEON_PCI_GART_PAGE 0x017c +#define RADEON_PLANE_3D_MASK_C 0x1d44 +#define RADEON_PLL_TEST_CNTL 0x0013 /* PLL */ +#define RADEON_PMI_CAP_ID 0x0f5c /* PCI */ +#define RADEON_PMI_DATA 0x0f63 /* PCI */ +#define RADEON_PMI_NXT_CAP_PTR 0x0f5d /* PCI */ +#define RADEON_PMI_PMC_REG 0x0f5e /* PCI */ +#define RADEON_PMI_PMCSR_REG 0x0f60 /* PCI */ +#define RADEON_PMI_REGISTER 0x0f5c /* PCI */ +#define RADEON_PPLL_CNTL 0x0002 /* PLL */ +# define RADEON_PPLL_RESET (1 << 0) +# define RADEON_PPLL_SLEEP (1 << 1) +# define RADEON_PPLL_ATOMIC_UPDATE_EN (1 << 16) +# define RADEON_PPLL_VGA_ATOMIC_UPDATE_EN (1 << 17) +# define RADEON_PPLL_ATOMIC_UPDATE_VSYNC (1 << 18) +#define RADEON_PPLL_DIV_0 0x0004 /* PLL */ +#define RADEON_PPLL_DIV_1 0x0005 /* PLL */ +#define RADEON_PPLL_DIV_2 0x0006 /* PLL */ +#define RADEON_PPLL_DIV_3 0x0007 /* PLL */ +# define RADEON_PPLL_FB3_DIV_MASK 0x07ff +# define RADEON_PPLL_POST3_DIV_MASK 0x00070000 +#define RADEON_PPLL_REF_DIV 0x0003 /* PLL */ +# define RADEON_PPLL_REF_DIV_MASK 0x03ff +# define RADEON_PPLL_ATOMIC_UPDATE_R (1 << 15) /* same as _W */ +# define RADEON_PPLL_ATOMIC_UPDATE_W (1 << 15) /* same as _R */ +#define RADEON_PWR_MNGMT_CNTL_STATUS 0x0f60 /* PCI */ +#define RADEON_RBBM_SOFT_RESET 0x00f0 +#define RADEON_RBBM_STATUS 0x0e40 +# define RADEON_RBBM_FIFOCNT_MASK 0x007f +# define RADEON_RBBM_ACTIVE (1 << 31) +#define RADEON_RB2D_DSTCACHE_CTLSTAT 0x342c +# define RADEON_RB2D_DC_FLUSH_ALL 0xf +# define RADEON_RB2D_DC_BUSY (1 << 31) +#define RADEON_RB2D_DSTCACHE_MODE 0x3428 +#define RADEON_REG_BASE 0x0f18 /* PCI */ +#define RADEON_REGPROG_INF 0x0f09 /* PCI */ +#define RADEON_REVISION_ID 0x0f08 /* PCI */ + +#define RADEON_SC_BOTTOM 0x164c +#define RADEON_SC_BOTTOM_RIGHT 0x16f0 +#define RADEON_SC_BOTTOM_RIGHT_C 0x1c8c +#define RADEON_SC_LEFT 0x1640 +#define RADEON_SC_RIGHT 0x1644 +#define RADEON_SC_TOP 0x1648 +#define RADEON_SC_TOP_LEFT 0x16ec +#define RADEON_SC_TOP_LEFT_C 0x1c88 +#define RADEON_SDRAM_MODE_REG 0x0158 +#define RADEON_SEQ8_DATA 0x03c5 /* VGA */ +#define RADEON_SEQ8_IDX 0x03c4 /* VGA */ +#define RADEON_SNAPSHOT_F_COUNT 0x0244 +#define RADEON_SNAPSHOT_VH_COUNTS 0x0240 +#define RADEON_SNAPSHOT_VIF_COUNT 0x024c +#define RADEON_SRC_OFFSET 0x15ac +#define RADEON_SRC_PITCH 0x15b0 +#define RADEON_SRC_PITCH_OFFSET 0x1428 +#define RADEON_SRC_SC_BOTTOM 0x165c +#define RADEON_SRC_SC_BOTTOM_RIGHT 0x16f4 +#define RADEON_SRC_SC_RIGHT 0x1654 +#define RADEON_SRC_X 0x1414 +#define RADEON_SRC_X_Y 0x1590 +#define RADEON_SRC_Y 0x1418 +#define RADEON_SRC_Y_X 0x1434 +#define RADEON_STATUS 0x0f06 /* PCI */ +#define RADEON_SUBPIC_CNTL 0x0540 /* ? */ +#define RADEON_SUB_CLASS 0x0f0a /* PCI */ +#define RADEON_SURFACE_DELAY 0x0b00 +#define RADEON_SURFACE0_INFO 0x0b0c +#define RADEON_SURFACE0_LOWER_BOUND 0x0b04 +#define RADEON_SURFACE0_UPPER_BOUND 0x0b08 +#define RADEON_SURFACE1_INFO 0x0b1c +#define RADEON_SURFACE1_LOWER_BOUND 0x0b14 +#define RADEON_SURFACE1_UPPER_BOUND 0x0b18 +#define RADEON_SURFACE2_INFO 0x0b2c +#define RADEON_SURFACE2_LOWER_BOUND 0x0b24 +#define RADEON_SURFACE2_UPPER_BOUND 0x0b28 +#define RADEON_SURFACE3_INFO 0x0b3c +#define RADEON_SURFACE3_LOWER_BOUND 0x0b34 +#define RADEON_SURFACE3_UPPER_BOUND 0x0b38 +#define RADEON_SW_SEMAPHORE 0x013c + +#define RADEON_TEST_DEBUG_CNTL 0x0120 +#define RADEON_TEST_DEBUG_MUX 0x0124 +#define RADEON_TEST_DEBUG_OUT 0x012c +#define RADEON_TMDS_CRC 0x02a0 +#define RADEON_TRAIL_BRES_DEC 0x1614 +#define RADEON_TRAIL_BRES_ERR 0x160c +#define RADEON_TRAIL_BRES_INC 0x1610 +#define RADEON_TRAIL_X 0x1618 +#define RADEON_TRAIL_X_SUB 0x1620 + +#define RADEON_VCLK_ECP_CNTL 0x0008 /* PLL */ +#define RADEON_VENDOR_ID 0x0f00 /* PCI */ +#define RADEON_VGA_DDA_CONFIG 0x02e8 +#define RADEON_VGA_DDA_ON_OFF 0x02ec +#define RADEON_VID_BUFFER_CONTROL 0x0900 +#define RADEON_VIDEOMUX_CNTL 0x0190 +#define RADEON_VIPH_CONTROL 0x0c40 /* ? */ + +#define RADEON_WAIT_UNTIL 0x1720 + +#define RADEON_X_MPLL_REF_FB_DIV 0x000a /* PLL */ +#define RADEON_XCLK_CNTL 0x000d /* PLL */ +#define RADEON_XDLL_CNTL 0x000c /* PLL */ +#define RADEON_XPLL_CNTL 0x000b /* PLL */ + + /* Registers for CCE and Microcode Engine */ +#define RADEON_CP_ME_RAM_ADDR 0x07d4 +#define RADEON_CP_ME_RAM_RADDR 0x07d8 +#define RADEON_CP_ME_RAM_DATAH 0x07dc +#define RADEON_CP_ME_RAM_DATAL 0x07e0 + +#define RADEON_CP_RB_BASE 0x0700 +#define RADEON_CP_RB_CNTL 0x0704 +#define RADEON_CP_RB_RPTR_ADDR 0x070c +#define RADEON_CP_RB_RPTR 0x0710 +#define RADEON_CP_RB_WPTR 0x0714 +# define RADEON_PM4_BUFFER_DL_DONE (1 << 31) + +#define RADEON_CP_IB_BASE 0x0738 +#define RADEON_CP_IB_BUFSZ 0x073c + +#define RADEON_CP_CSQ_CNTL 0x0740 +# define RADEON_CSQ_PRIDIS_INDDIS (0 << 28) +# define RADEON_CSQ_PRIPIO_INDDIS (1 << 28) +# define RADEON_CSQ_PRIBM_INDDIS (2 << 28) +# define RADEON_CSQ_PRIPIO_INDBM (3 << 28) +# define RADEON_CSQ_PRIBM_INDBM (4 << 28) +# define RADEON_CSQ_PRIPIO_INDPIO (15 << 28) +#define RADEON_CP_RB_WPTR_DELAY 0x0718 +# define RADEON_PRE_WRITE_TIMER_SHIFT 0 +# define RADEON_PRE_WRITE_LIMIT_SHIFT 23 + +#define RADEON_AIC_CNTL 0x01d0 +# define RADEON_PCIGART_TRANSLATE_EN (1 << 0) + +#define RADEON_PM4_VC_FPU_SETUP 0x071c +# define RADEON_FRONT_DIR_CW (0 << 0) +# define RADEON_FRONT_DIR_CCW (1 << 0) +# define RADEON_FRONT_DIR_MASK (1 << 0) +# define RADEON_BACKFACE_CULL (0 << 1) +# define RADEON_BACKFACE_POINTS (1 << 1) +# define RADEON_BACKFACE_LINES (2 << 1) +# define RADEON_BACKFACE_SOLID (3 << 1) +# define RADEON_BACKFACE_MASK (3 << 1) +# define RADEON_FRONTFACE_CULL (0 << 3) +# define RADEON_FRONTFACE_POINTS (1 << 3) +# define RADEON_FRONTFACE_LINES (2 << 3) +# define RADEON_FRONTFACE_SOLID (3 << 3) +# define RADEON_FRONTFACE_MASK (3 << 3) +# define RADEON_FPU_COLOR_SOLID (0 << 5) +# define RADEON_FPU_COLOR_FLAT (1 << 5) +# define RADEON_FPU_COLOR_GOURAUD (2 << 5) +# define RADEON_FPU_COLOR_GOURAUD2 (3 << 5) +# define RADEON_FPU_COLOR_MASK (3 << 5) +# define RADEON_FPU_SUB_PIX_2BITS (0 << 7) +# define RADEON_FPU_SUB_PIX_4BITS (1 << 7) +# define RADEON_FPU_MODE_2D (0 << 8) +# define RADEON_FPU_MODE_3D (1 << 8) +# define RADEON_TRAP_BITS_DISABLE (1 << 9) +# define RADEON_EDGE_ANTIALIAS (1 << 10) +# define RADEON_SUPERSAMPLE (1 << 11) +# define RADEON_XFACTOR_2 (0 << 12) +# define RADEON_XFACTOR_4 (1 << 12) +# define RADEON_YFACTOR_2 (0 << 13) +# define RADEON_YFACTOR_4 (1 << 13) +# define RADEON_FLAT_SHADE_VERTEX_D3D (0 << 14) +# define RADEON_FLAT_SHADE_VERTEX_OGL (1 << 14) +# define RADEON_FPU_ROUND_TRUNCATE (0 << 15) +# define RADEON_FPU_ROUND_NEAREST (1 << 15) +# define RADEON_WM_SEL_8DW (0 << 16) +# define RADEON_WM_SEL_16DW (1 << 16) +# define RADEON_WM_SEL_32DW (2 << 16) +#define RADEON_PM4_VC_DEBUG_CONFIG 0x07a4 +#define RADEON_PM4_VC_STAT 0x07a8 +#define RADEON_PM4_VC_TIMESTAMP0 0x07b0 +#define RADEON_PM4_VC_TIMESTAMP1 0x07b4 +#define RADEON_PM4_STAT 0x07b8 +# define RADEON_PM4_FIFOCNT_MASK 0x0fff +# define RADEON_PM4_BUSY (1 << 16) +# define RADEON_PM4_GUI_ACTIVE (1 << 31) +#define RADEON_PM4_BUFFER_ADDR 0x07f0 +#define RADEON_CP_ME_CNTL 0x07d0 +# define RADEON_CP_ME_FREERUN (1 << 30) +#define RADEON_PM4_FIFO_DATA_EVEN 0x1000 +#define RADEON_PM4_FIFO_DATA_ODD 0x1004 + +#define RADEON_SCALE_3D_CNTL 0x1a00 +# define RADEON_SCALE_DITHER_ERR_DIFF (0 << 1) +# define RADEON_SCALE_DITHER_TABLE (1 << 1) +# define RADEON_TEX_CACHE_SIZE_FULL (0 << 2) +# define RADEON_TEX_CACHE_SIZE_HALF (1 << 2) +# define RADEON_DITHER_INIT_CURR (0 << 3) +# define RADEON_DITHER_INIT_RESET (1 << 3) +# define RADEON_ROUND_24BIT (1 << 4) +# define RADEON_TEX_CACHE_DISABLE (1 << 5) +# define RADEON_SCALE_3D_NOOP (0 << 6) +# define RADEON_SCALE_3D_SCALE (1 << 6) +# define RADEON_SCALE_3D_TEXMAP_SHADE (2 << 6) +# define RADEON_SCALE_PIX_BLEND (0 << 8) +# define RADEON_SCALE_PIX_REPLICATE (1 << 8) +# define RADEON_TEX_CACHE_SPLIT (1 << 9) +# define RADEON_APPLE_YUV_MODE (1 << 10) +# define RADEON_TEX_CACHE_PALLETE_MODE (1 << 11) +# define RADEON_ALPHA_COMB_ADD_CLAMP (0 << 12) +# define RADEON_ALPHA_COMB_ADD_NCLAMP (1 << 12) +# define RADEON_ALPHA_COMB_SUB_DST_SRC_CLAMP (2 << 12) +# define RADEON_ALPHA_COMB_SUB_DST_SRC_NCLAMP (3 << 12) +# define RADEON_FOG_TABLE (1 << 14) +# define RADEON_SIGNED_DST_CLAMP (1 << 15) +# define RADEON_ALPHA_BLEND_SRC_ZERO (0 << 16) +# define RADEON_ALPHA_BLEND_SRC_ONE (1 << 16) +# define RADEON_ALPHA_BLEND_SRC_SRCCOLOR (2 << 16) +# define RADEON_ALPHA_BLEND_SRC_INVSRCCOLOR (3 << 16) +# define RADEON_ALPHA_BLEND_SRC_SRCALPHA (4 << 16) +# define RADEON_ALPHA_BLEND_SRC_INVSRCALPHA (5 << 16) +# define RADEON_ALPHA_BLEND_SRC_DSTALPHA (6 << 16) +# define RADEON_ALPHA_BLEND_SRC_INVDSTALPHA (7 << 16) +# define RADEON_ALPHA_BLEND_SRC_DSTCOLOR (8 << 16) +# define RADEON_ALPHA_BLEND_SRC_INVDSTCOLOR (9 << 16) +# define RADEON_ALPHA_BLEND_SRC_SAT (10 << 16) +# define RADEON_ALPHA_BLEND_SRC_BLEND (11 << 16) +# define RADEON_ALPHA_BLEND_SRC_INVBLEND (12 << 16) +# define RADEON_ALPHA_BLEND_DST_ZERO (0 << 20) +# define RADEON_ALPHA_BLEND_DST_ONE (1 << 20) +# define RADEON_ALPHA_BLEND_DST_SRCCOLOR (2 << 20) +# define RADEON_ALPHA_BLEND_DST_INVSRCCOLOR (3 << 20) +# define RADEON_ALPHA_BLEND_DST_SRCALPHA (4 << 20) +# define RADEON_ALPHA_BLEND_DST_INVSRCALPHA (5 << 20) +# define RADEON_ALPHA_BLEND_DST_DSTALPHA (6 << 20) +# define RADEON_ALPHA_BLEND_DST_INVDSTALPHA (7 << 20) +# define RADEON_ALPHA_BLEND_DST_DSTCOLOR (8 << 20) +# define RADEON_ALPHA_BLEND_DST_INVDSTCOLOR (9 << 20) +# define RADEON_ALPHA_TEST_NEVER (0 << 24) +# define RADEON_ALPHA_TEST_LESS (1 << 24) +# define RADEON_ALPHA_TEST_LESSEQUAL (2 << 24) +# define RADEON_ALPHA_TEST_EQUAL (3 << 24) +# define RADEON_ALPHA_TEST_GREATEREQUAL (4 << 24) +# define RADEON_ALPHA_TEST_GREATER (5 << 24) +# define RADEON_ALPHA_TEST_NEQUAL (6 << 24) +# define RADEON_ALPHA_TEST_ALWAYS (7 << 24) +# define RADEON_COMPOSITE_SHADOW_CMP_EQUAL (0 << 28) +# define RADEON_COMPOSITE_SHADOW_CMP_NEQUAL (1 << 28) +# define RADEON_COMPOSITE_SHADOW (1 << 29) +# define RADEON_TEX_MAP_ALPHA_IN_TEXTURE (1 << 30) +# define RADEON_TEX_CACHE_LINE_SIZE_8QW (0 << 31) +# define RADEON_TEX_CACHE_LINE_SIZE_4QW (1 << 31) +#define RADEON_SCALE_3D_DATATYPE 0x1a20 + +#define RADEON_SETUP_CNTL 0x1bc4 +# define RADEON_DONT_START_TRIANGLE (1 << 0) +# define RADEON_Z_BIAS (0 << 1) +# define RADEON_DONT_START_ANY_ON (1 << 2) +# define RADEON_COLOR_SOLID_COLOR (0 << 3) +# define RADEON_COLOR_FLAT_VERT_1 (1 << 3) +# define RADEON_COLOR_FLAT_VERT_2 (2 << 3) +# define RADEON_COLOR_FLAT_VERT_3 (3 << 3) +# define RADEON_COLOR_GOURAUD (4 << 3) +# define RADEON_PRIM_TYPE_TRI (0 << 7) +# define RADEON_PRIM_TYPE_LINE (1 << 7) +# define RADEON_PRIM_TYPE_POINT (2 << 7) +# define RADEON_PRIM_TYPE_POLY_EDGE (3 << 7) +# define RADEON_TEXTURE_ST_MULT_W (0 << 9) +# define RADEON_TEXTURE_ST_DIRECT (1 << 9) +# define RADEON_STARTING_VERTEX_1 (1 << 14) +# define RADEON_STARTING_VERTEX_2 (2 << 14) +# define RADEON_STARTING_VERTEX_3 (3 << 14) +# define RADEON_ENDING_VERTEX_1 (1 << 16) +# define RADEON_ENDING_VERTEX_2 (2 << 16) +# define RADEON_ENDING_VERTEX_3 (3 << 16) +# define RADEON_SU_POLY_LINE_LAST (0 << 18) +# define RADEON_SU_POLY_LINE_NOT_LAST (1 << 18) +# define RADEON_SUB_PIX_2BITS (0 << 19) +# define RADEON_SUB_PIX_4BITS (1 << 19) +# define RADEON_SET_UP_CONTINUE (1 << 31) + +#define RADEON_WINDOW_XY_OFFSET 0x1bcc +# define RADEON_WINDOW_Y_SHIFT 4 +# define RADEON_WINDOW_X_SHIFT 20 + +#define RADEON_Z_OFFSET_C 0x1c90 +#define RADEON_Z_PITCH_C 0x1c94 +#define RADEON_Z_STEN_CNTL_C 0x1c98 +# define RADEON_Z_PIX_WIDTH_16 (0 << 1) +# define RADEON_Z_PIX_WIDTH_24 (1 << 1) +# define RADEON_Z_PIX_WIDTH_32 (2 << 1) +# define RADEON_Z_PIX_WIDTH_MASK (3 << 1) +# define RADEON_Z_TEST_NEVER (0 << 4) +# define RADEON_Z_TEST_LESS (1 << 4) +# define RADEON_Z_TEST_LESSEQUAL (2 << 4) +# define RADEON_Z_TEST_EQUAL (3 << 4) +# define RADEON_Z_TEST_GREATEREQUAL (4 << 4) +# define RADEON_Z_TEST_GREATER (5 << 4) +# define RADEON_Z_TEST_NEQUAL (6 << 4) +# define RADEON_Z_TEST_ALWAYS (7 << 4) +# define RADEON_Z_TEST_MASK (7 << 4) +# define RADEON_STENCIL_TEST_NEVER (0 << 12) +# define RADEON_STENCIL_TEST_LESS (1 << 12) +# define RADEON_STENCIL_TEST_LESSEQUAL (2 << 12) +# define RADEON_STENCIL_TEST_EQUAL (3 << 12) +# define RADEON_STENCIL_TEST_GREATEREQUAL (4 << 12) +# define RADEON_STENCIL_TEST_GREATER (5 << 12) +# define RADEON_STENCIL_TEST_NEQUAL (6 << 12) +# define RADEON_STENCIL_TEST_ALWAYS (7 << 12) +# define RADEON_STENCIL_S_FAIL_KEEP (0 << 16) +# define RADEON_STENCIL_S_FAIL_ZERO (1 << 16) +# define RADEON_STENCIL_S_FAIL_REPLACE (2 << 16) +# define RADEON_STENCIL_S_FAIL_INC (3 << 16) +# define RADEON_STENCIL_S_FAIL_DEC (4 << 16) +# define RADEON_STENCIL_S_FAIL_INV (5 << 16) +# define RADEON_STENCIL_ZPASS_KEEP (0 << 20) +# define RADEON_STENCIL_ZPASS_ZERO (1 << 20) +# define RADEON_STENCIL_ZPASS_REPLACE (2 << 20) +# define RADEON_STENCIL_ZPASS_INC (3 << 20) +# define RADEON_STENCIL_ZPASS_DEC (4 << 20) +# define RADEON_STENCIL_ZPASS_INV (5 << 20) +# define RADEON_STENCIL_ZFAIL_KEEP (0 << 24) +# define RADEON_STENCIL_ZFAIL_ZERO (1 << 24) +# define RADEON_STENCIL_ZFAIL_REPLACE (2 << 24) +# define RADEON_STENCIL_ZFAIL_INC (3 << 24) +# define RADEON_STENCIL_ZFAIL_DEC (4 << 24) +# define RADEON_STENCIL_ZFAIL_INV (5 << 24) +#define RADEON_TEX_CNTL_C 0x1c9c +# define RADEON_Z_ENABLE (1 << 0) +# define RADEON_Z_WRITE_ENABLE (1 << 1) +# define RADEON_STENCIL_ENABLE (1 << 3) +# define RADEON_SHADE_ENABLE (0 << 4) +# define RADEON_TEXMAP_ENABLE (1 << 4) +# define RADEON_SEC_TEXMAP_ENABLE (1 << 5) +# define RADEON_FOG_ENABLE (1 << 7) +# define RADEON_DITHER_ENABLE (1 << 8) +# define RADEON_ALPHA_ENABLE (1 << 9) +# define RADEON_ALPHA_TEST_ENABLE (1 << 10) +# define RADEON_SPEC_LIGHT_ENABLE (1 << 11) +# define RADEON_TEX_CHROMA_KEY_ENABLE (1 << 12) +# define RADEON_ALPHA_IN_TEX_COMPLETE_A (0 << 13) +# define RADEON_ALPHA_IN_TEX_LSB_A (1 << 13) +# define RADEON_LIGHT_DIS (0 << 14) +# define RADEON_LIGHT_COPY (1 << 14) +# define RADEON_LIGHT_MODULATE (2 << 14) +# define RADEON_LIGHT_ADD (3 << 14) +# define RADEON_LIGHT_BLEND_CONSTANT (4 << 14) +# define RADEON_LIGHT_BLEND_TEXTURE (5 << 14) +# define RADEON_LIGHT_BLEND_VERTEX (6 << 14) +# define RADEON_LIGHT_BLEND_CONST_COLOR (7 << 14) +# define RADEON_ALPHA_LIGHT_DIS (0 << 18) +# define RADEON_ALPHA_LIGHT_COPY (1 << 18) +# define RADEON_ALPHA_LIGHT_MODULATE (2 << 18) +# define RADEON_ALPHA_LIGHT_ADD (3 << 18) +# define RADEON_ANTI_ALIAS (1 << 21) +# define RADEON_TEX_CACHE_FLUSH (1 << 23) +# define RADEON_LOD_BIAS_SHIFT 24 +#define RADEON_MISC_3D_STATE_CNTL_REG 0x1ca0 +# define RADEON_REF_ALPHA_MASK 0xff +# define RADEON_MISC_SCALE_3D_NOOP (0 << 8) +# define RADEON_MISC_SCALE_3D_SCALE (1 << 8) +# define RADEON_MISC_SCALE_3D_TEXMAP_SHADE (2 << 8) +# define RADEON_MISC_SCALE_PIX_BLEND (0 << 10) +# define RADEON_MISC_SCALE_PIX_REPLICATE (1 << 10) +# define RADEON_ALPHA_COMB_ADD_CLAMP (0 << 12) +# define RADEON_ALPHA_COMB_ADD_NO_CLAMP (1 << 12) +# define RADEON_ALPHA_COMB_SUB_SRC_DST_CLAMP (2 << 12) +# define RADEON_ALPHA_COMB_SUB_SRC_DST_NO_CLAMP (3 << 12) +# define RADEON_FOG_VERTEX (0 << 14) +# define RADEON_FOG_TABLE (1 << 14) +# define RADEON_ALPHA_BLEND_SRC_ZERO (0 << 16) +# define RADEON_ALPHA_BLEND_SRC_ONE (1 << 16) +# define RADEON_ALPHA_BLEND_SRC_SRCCOLOR (2 << 16) +# define RADEON_ALPHA_BLEND_SRC_INVSRCCOLOR (3 << 16) +# define RADEON_ALPHA_BLEND_SRC_SRCALPHA (4 << 16) +# define RADEON_ALPHA_BLEND_SRC_INVSRCALPHA (5 << 16) +# define RADEON_ALPHA_BLEND_SRC_DESTALPHA (6 << 16) +# define RADEON_ALPHA_BLEND_SRC_INVDESTALPHA (7 << 16) +# define RADEON_ALPHA_BLEND_SRC_DESTCOLOR (8 << 16) +# define RADEON_ALPHA_BLEND_SRC_INVDESTCOLOR (9 << 16) +# define RADEON_ALPHA_BLEND_SRC_SRCALPHASAT (10 << 16) +# define RADEON_ALPHA_BLEND_SRC_BOTHSRCALPHA (11 << 16) +# define RADEON_ALPHA_BLEND_SRC_BOTHINVSRCALPHA (12 << 16) +# define RADEON_ALPHA_BLEND_SRC_MASK (15 << 16) +# define RADEON_ALPHA_BLEND_DST_ZERO (0 << 20) +# define RADEON_ALPHA_BLEND_DST_ONE (1 << 20) +# define RADEON_ALPHA_BLEND_DST_SRCCOLOR (2 << 20) +# define RADEON_ALPHA_BLEND_DST_INVSRCCOLOR (3 << 20) +# define RADEON_ALPHA_BLEND_DST_SRCALPHA (4 << 20) +# define RADEON_ALPHA_BLEND_DST_INVSRCALPHA (5 << 20) +# define RADEON_ALPHA_BLEND_DST_DESTALPHA (6 << 20) +# define RADEON_ALPHA_BLEND_DST_INVDESTALPHA (7 << 20) +# define RADEON_ALPHA_BLEND_DST_DESTCOLOR (8 << 20) +# define RADEON_ALPHA_BLEND_DST_INVDESTCOLOR (9 << 20) +# define RADEON_ALPHA_BLEND_DST_SRCALPHASAT (10 << 20) +# define RADEON_ALPHA_BLEND_DST_MASK (15 << 20) +# define RADEON_ALPHA_TEST_NEVER (0 << 24) +# define RADEON_ALPHA_TEST_LESS (1 << 24) +# define RADEON_ALPHA_TEST_LESSEQUAL (2 << 24) +# define RADEON_ALPHA_TEST_EQUAL (3 << 24) +# define RADEON_ALPHA_TEST_GREATEREQUAL (4 << 24) +# define RADEON_ALPHA_TEST_GREATER (5 << 24) +# define RADEON_ALPHA_TEST_NEQUAL (6 << 24) +# define RADEON_ALPHA_TEST_ALWAYS (7 << 24) +# define RADEON_ALPHA_TEST_MASK (7 << 24) +#define RADEON_TEXTURE_CLR_CMP_CLR_C 0x1ca4 +#define RADEON_TEXTURE_CLR_CMP_MSK_C 0x1ca8 +#define RADEON_FOG_COLOR_C 0x1cac +# define RADEON_FOG_BLUE_SHIFT 0 +# define RADEON_FOG_GREEN_SHIFT 8 +# define RADEON_FOG_RED_SHIFT 16 +#define RADEON_PRIM_TEX_CNTL_C 0x1cb0 +# define RADEON_MIN_BLEND_NEAREST (0 << 1) +# define RADEON_MIN_BLEND_LINEAR (1 << 1) +# define RADEON_MIN_BLEND_MIPNEAREST (2 << 1) +# define RADEON_MIN_BLEND_MIPLINEAR (3 << 1) +# define RADEON_MIN_BLEND_LINEARMIPNEAREST (4 << 1) +# define RADEON_MIN_BLEND_LINEARMIPLINEAR (5 << 1) +# define RADEON_MIN_BLEND_MASK (7 << 1) +# define RADEON_MAG_BLEND_NEAREST (0 << 4) +# define RADEON_MAG_BLEND_LINEAR (1 << 4) +# define RADEON_MAG_BLEND_MASK (7 << 4) +# define RADEON_MIP_MAP_DISABLE (1 << 7) +# define RADEON_TEX_CLAMP_S_WRAP (0 << 8) +# define RADEON_TEX_CLAMP_S_MIRROR (1 << 8) +# define RADEON_TEX_CLAMP_S_CLAMP (2 << 8) +# define RADEON_TEX_CLAMP_S_BORDER_COLOR (3 << 8) +# define RADEON_TEX_CLAMP_S_MASK (3 << 8) +# define RADEON_TEX_WRAP_S (1 << 10) +# define RADEON_TEX_CLAMP_T_WRAP (0 << 11) +# define RADEON_TEX_CLAMP_T_MIRROR (1 << 11) +# define RADEON_TEX_CLAMP_T_CLAMP (2 << 11) +# define RADEON_TEX_CLAMP_T_BORDER_COLOR (3 << 11) +# define RADEON_TEX_CLAMP_T_MASK (3 << 11) +# define RADEON_TEX_WRAP_T (1 << 13) +# define RADEON_TEX_PERSPECTIVE_DISABLE (1 << 14) +# define RADEON_DATATYPE_VQ (0 << 16) +# define RADEON_DATATYPE_CI4 (1 << 16) +# define RADEON_DATATYPE_CI8 (2 << 16) +# define RADEON_DATATYPE_ARGB1555 (3 << 16) +# define RADEON_DATATYPE_RGB565 (4 << 16) +# define RADEON_DATATYPE_RGB888 (5 << 16) +# define RADEON_DATATYPE_ARGB8888 (6 << 16) +# define RADEON_DATATYPE_RGB332 (7 << 16) +# define RADEON_DATATYPE_Y8 (8 << 16) +# define RADEON_DATATYPE_RGB8 (9 << 16) +# define RADEON_DATATYPE_CI16 (10 << 16) +# define RADEON_DATATYPE_YUV422 (11 << 16) +# define RADEON_DATATYPE_YUV422_2 (12 << 16) +# define RADEON_DATATYPE_AYUV444 (14 << 16) +# define RADEON_DATATYPE_ARGB4444 (15 << 16) +# define RADEON_PALLETE_EITHER (0 << 20) +# define RADEON_PALLETE_1 (1 << 20) +# define RADEON_PALLETE_2 (2 << 20) +# define RADEON_PSEUDOCOLOR_DT_RGB565 (0 << 24) +# define RADEON_PSEUDOCOLOR_DT_ARGB1555 (1 << 24) +# define RADEON_PSEUDOCOLOR_DT_ARGB4444 (2 << 24) +#define RADEON_PRIM_TEXTURE_COMBINE_CNTL_C 0x1cb4 +# define RADEON_COMB_DIS (0 << 0) +# define RADEON_COMB_COPY (1 << 0) +# define RADEON_COMB_COPY_INP (2 << 0) +# define RADEON_COMB_MODULATE (3 << 0) +# define RADEON_COMB_MODULATE2X (4 << 0) +# define RADEON_COMB_MODULATE4X (5 << 0) +# define RADEON_COMB_ADD (6 << 0) +# define RADEON_COMB_ADD_SIGNED (7 << 0) +# define RADEON_COMB_BLEND_VERTEX (8 << 0) +# define RADEON_COMB_BLEND_TEXTURE (9 << 0) +# define RADEON_COMB_BLEND_CONST (10 << 0) +# define RADEON_COMB_BLEND_PREMULT (11 << 0) +# define RADEON_COMB_BLEND_PREV (12 << 0) +# define RADEON_COMB_BLEND_PREMULT_INV (13 << 0) +# define RADEON_COMB_ADD_SIGNED2X (14 << 0) +# define RADEON_COMB_BLEND_CONST_COLOR (15 << 0) +# define RADEON_COMB_MASK (15 << 0) +# define RADEON_COLOR_FACTOR_TEX (4 << 4) +# define RADEON_COLOR_FACTOR_NTEX (5 << 4) +# define RADEON_COLOR_FACTOR_ALPHA (6 << 4) +# define RADEON_COLOR_FACTOR_NALPHA (7 << 4) +# define RADEON_COLOR_FACTOR_MASK (15 << 4) +# define RADEON_INPUT_FACTOR_CONST_COLOR (2 << 10) +# define RADEON_INPUT_FACTOR_CONST_ALPHA (3 << 10) +# define RADEON_INPUT_FACTOR_INT_COLOR (4 << 10) +# define RADEON_INPUT_FACTOR_INT_ALPHA (5 << 10) +# define RADEON_INPUT_FACTOR_MASK (15 << 10) +# define RADEON_COMB_ALPHA_DIS (0 << 14) +# define RADEON_COMB_ALPHA_COPY (1 << 14) +# define RADEON_COMB_ALPHA_COPY_INP (2 << 14) +# define RADEON_COMB_ALPHA_MODULATE (3 << 14) +# define RADEON_COMB_ALPHA_MODULATE2X (4 << 14) +# define RADEON_COMB_ALPHA_MODULATE4X (5 << 14) +# define RADEON_COMB_ALPHA_ADD (6 << 14) +# define RADEON_COMB_ALPHA_ADD_SIGNED (7 << 14) +# define RADEON_COMB_ALPHA_ADD_SIGNED2X (14 << 14) +# define RADEON_COMB_ALPHA_MASK (15 << 14) +# define RADEON_ALPHA_FACTOR_TEX_ALPHA (6 << 18) +# define RADEON_ALPHA_FACTOR_NTEX_ALPHA (7 << 18) +# define RADEON_ALPHA_FACTOR_MASK (15 << 18) +# define RADEON_INP_FACTOR_A_CONST_ALPHA (1 << 25) +# define RADEON_INP_FACTOR_A_INT_ALPHA (2 << 25) +# define RADEON_INP_FACTOR_A_MASK (7 << 25) +#define RADEON_TEX_SIZE_PITCH_C 0x1cb8 +# define RADEON_TEX_PITCH_SHIFT 0 +# define RADEON_TEX_SIZE_SHIFT 4 +# define RADEON_TEX_HEIGHT_SHIFT 8 +# define RADEON_TEX_MIN_SIZE_SHIFT 12 +# define RADEON_SEC_TEX_PITCH_SHIFT 16 +# define RADEON_SEC_TEX_SIZE_SHIFT 20 +# define RADEON_SEC_TEX_HEIGHT_SHIFT 24 +# define RADEON_SEC_TEX_MIN_SIZE_SHIFT 28 +# define RADEON_TEX_PITCH_MASK (0x0f << 0) +# define RADEON_TEX_SIZE_MASK (0x0f << 4) +# define RADEON_TEX_HEIGHT_MASK (0x0f << 8) +# define RADEON_TEX_MIN_SIZE_MASK (0x0f << 12) +# define RADEON_SEC_TEX_PITCH_MASK (0x0f << 16) +# define RADEON_SEC_TEX_SIZE_MASK (0x0f << 20) +# define RADEON_SEC_TEX_HEIGHT_MASK (0x0f << 24) +# define RADEON_SEC_TEX_MIN_SIZE_MASK (0x0f << 28) +# define RADEON_TEX_SIZE_PITCH_SHIFT 0 +# define RADEON_SEC_TEX_SIZE_PITCH_SHIFT 16 +# define RADEON_TEX_SIZE_PITCH_MASK (0xffff << 0) +# define RADEON_SEC_TEX_SIZE_PITCH_MASK (0xffff << 16) +#define RADEON_PRIM_TEX_0_OFFSET_C 0x1cbc +#define RADEON_PRIM_TEX_1_OFFSET_C 0x1cc0 +#define RADEON_PRIM_TEX_2_OFFSET_C 0x1cc4 +#define RADEON_PRIM_TEX_3_OFFSET_C 0x1cc8 +#define RADEON_PRIM_TEX_4_OFFSET_C 0x1ccc +#define RADEON_PRIM_TEX_5_OFFSET_C 0x1cd0 +#define RADEON_PRIM_TEX_6_OFFSET_C 0x1cd4 +#define RADEON_PRIM_TEX_7_OFFSET_C 0x1cd8 +#define RADEON_PRIM_TEX_8_OFFSET_C 0x1cdc +#define RADEON_PRIM_TEX_9_OFFSET_C 0x1ce0 +#define RADEON_PRIM_TEX_10_OFFSET_C 0x1ce4 +# define RADEON_TEX_NO_TILE (0 << 30) +# define RADEON_TEX_TILED_BY_HOST (1 << 30) +# define RADEON_TEX_TILED_BY_STORAGE (2 << 30) +# define RADEON_TEX_TILED_BY_STORAGE2 (3 << 30) + +#define RADEON_SEC_TEX_CNTL_C 0x1d00 +# define RADEON_SEC_SELECT_PRIM_ST (0 << 0) +# define RADEON_SEC_SELECT_SEC_ST (1 << 0) +#define RADEON_SEC_TEX_COMBINE_CNTL_C 0x1d04 +# define RADEON_INPUT_FACTOR_PREV_COLOR (8 << 10) +# define RADEON_INPUT_FACTOR_PREV_ALPHA (9 << 10) +# define RADEON_INP_FACTOR_A_PREV_ALPHA (4 << 25) +#define RADEON_SEC_TEX_0_OFFSET_C 0x1d08 +#define RADEON_SEC_TEX_1_OFFSET_C 0x1d0c +#define RADEON_SEC_TEX_2_OFFSET_C 0x1d10 +#define RADEON_SEC_TEX_3_OFFSET_C 0x1d14 +#define RADEON_SEC_TEX_4_OFFSET_C 0x1d18 +#define RADEON_SEC_TEX_5_OFFSET_C 0x1d1c +#define RADEON_SEC_TEX_6_OFFSET_C 0x1d20 +#define RADEON_SEC_TEX_7_OFFSET_C 0x1d24 +#define RADEON_SEC_TEX_8_OFFSET_C 0x1d28 +#define RADEON_SEC_TEX_9_OFFSET_C 0x1d2c +#define RADEON_SEC_TEX_10_OFFSET_C 0x1d30 +#define RADEON_CONSTANT_COLOR_C 0x1d34 +# define RADEON_CONSTANT_BLUE_SHIFT 0 +# define RADEON_CONSTANT_GREEN_SHIFT 8 +# define RADEON_CONSTANT_RED_SHIFT 16 +# define RADEON_CONSTANT_ALPHA_SHIFT 24 +#define RADEON_PRIM_TEXTURE_BORDER_COLOR_C 0x1d38 +# define RADEON_PRIM_TEX_BORDER_BLUE_SHIFT 0 +# define RADEON_PRIM_TEX_BORDER_GREEN_SHIFT 8 +# define RADEON_PRIM_TEX_BORDER_RED_SHIFT 16 +# define RADEON_PRIM_TEX_BORDER_ALPHA_SHIFT 24 +#define RADEON_SEC_TEXTURE_BORDER_COLOR_C 0x1d3c +# define RADEON_SEC_TEX_BORDER_BLUE_SHIFT 0 +# define RADEON_SEC_TEX_BORDER_GREEN_SHIFT 8 +# define RADEON_SEC_TEX_BORDER_RED_SHIFT 16 +# define RADEON_SEC_TEX_BORDER_ALPHA_SHIFT 24 +#define RADEON_STEN_REF_MASK_C 0x1d40 +# define RADEON_STEN_REFERENCE_SHIFT 0 +# define RADEON_STEN_MASK_SHIFT 16 +# define RADEON_STEN_WRITE_MASK_SHIFT 24 +#define RADEON_PLANE_3D_MASK_C 0x1d44 +#define RADEON_TEX_CACHE_STAT_COUNT 0x1974 + + + /* Constants */ +#define RADEON_AGP_TEX_OFFSET 0x02000000 + +#define RADEON_VB_AGE_REG RADEON_GUI_SCRATCH_REG0 +#define RADEON_SWAP_AGE_REG RADEON_GUI_SCRATCH_REG1 + + /* CCE packet types */ +#define RADEON_CCE_PACKET0 0x00000000 +#define RADEON_CCE_PACKET0_ONE_REG_WR 0x00008000 +#define RADEON_CCE_PACKET1 0x40000000 +#define RADEON_CCE_PACKET2 0x80000000 +#define RADEON_CCE_PACKET3_NOP 0xC0001000 +#define RADEON_CCE_PACKET3_PAINT 0xC0001100 +#define RADEON_CCE_PACKET3_BITBLT 0xC0001200 +#define RADEON_CCE_PACKET3_SMALLTEXT 0xC0001300 +#define RADEON_CCE_PACKET3_HOSTDATA_BLT 0xC0001400 +#define RADEON_CCE_PACKET3_POLYLINE 0xC0001500 +#define RADEON_CCE_PACKET3_SCALING 0xC0001600 +#define RADEON_CCE_PACKET3_TRANS_SCALING 0xC0001700 +#define RADEON_CCE_PACKET3_POLYSCANLINES 0xC0001800 +#define RADEON_CCE_PACKET3_NEXT_CHAR 0xC0001900 +#define RADEON_CCE_PACKET3_PAINT_MULTI 0xC0001A00 +#define RADEON_CCE_PACKET3_BITBLT_MULTI 0xC0001B00 +#define RADEON_CCE_PACKET3_PLY_NEXTSCAN 0xC0001D00 +#define RADEON_CCE_PACKET3_SET_SCISSORS 0xC0001E00 +#define RADEON_CCE_PACKET3_SET_MODE24BPP 0xC0001F00 +#define RADEON_CCE_PACKET3_CNTL_PAINT 0xC0009100 +#define RADEON_CCE_PACKET3_CNTL_BITBLT 0xC0009200 +#define RADEON_CCE_PACKET3_CNTL_SMALLTEXT 0xC0009300 +#define RADEON_CCE_PACKET3_CNTL_HOSTDATA_BLT 0xC0009400 +#define RADEON_CCE_PACKET3_CNTL_POLYLINE 0xC0009500 +#define RADEON_CCE_PACKET3_CNTL_SCALING 0xC0009600 +#define RADEON_CCE_PACKET3_CNTL_TRANS_SCALING 0xC0009700 +#define RADEON_CCE_PACKET3_CNTL_POLYSCANLINES 0xC0009800 +#define RADEON_CCE_PACKET3_CNTL_NEXT_CHAR 0xC0009900 +#define RADEON_CCE_PACKET3_CNTL_PAINT_MULTI 0xC0009A00 +#define RADEON_CCE_PACKET3_CNTL_BITBLT_MULTI 0xC0009B00 +#define RADEON_CCE_PACKET3_CNTL_TRANS_BITBLT 0xC0009C00 +#define RADEON_CCE_PACKET3_3D_SAVE_CONTEXT 0xC0002000 +#define RADEON_CCE_PACKET3_3D_PLAY_CONTEXT 0xC0002100 +#define RADEON_CCE_PACKET3_3D_RNDR_GEN_INDX_PRIM 0xC0002300 +#define RADEON_CCE_PACKET3_3D_RNDR_GEN_PRIM 0xC0002500 +#define RADEON_CCE_PACKET3_LOAD_PALETTE 0xC0002C00 +#define RADEON_CCE_PACKET3_PURGE 0xC0002D00 +#define RADEON_CCE_PACKET3_NEXT_VERTEX_BUNDLE 0xC0002E00 +# define RADEON_CCE_PACKET_MASK 0xC0000000 +# define RADEON_CCE_PACKET_COUNT_MASK 0x3fff0000 +# define RADEON_CCE_PACKET_MAX_DWORDS (1 << 14) +# define RADEON_CCE_PACKET0_REG_MASK 0x000007ff +# define RADEON_CCE_PACKET1_REG0_MASK 0x000007ff +# define RADEON_CCE_PACKET1_REG1_MASK 0x003ff800 + +#define RADEON_CCE_VC_FRMT_RHW 0x00000001 +#define RADEON_CCE_VC_FRMT_DIFFUSE_BGR 0x00000002 +#define RADEON_CCE_VC_FRMT_DIFFUSE_A 0x00000004 +#define RADEON_CCE_VC_FRMT_DIFFUSE_ARGB 0x00000008 +#define RADEON_CCE_VC_FRMT_SPEC_BGR 0x00000010 +#define RADEON_CCE_VC_FRMT_SPEC_F 0x00000020 +#define RADEON_CCE_VC_FRMT_SPEC_FRGB 0x00000040 +#define RADEON_CCE_VC_FRMT_S_T 0x00000080 +#define RADEON_CCE_VC_FRMT_S2_T2 0x00000100 +#define RADEON_CCE_VC_FRMT_RHW2 0x00000200 + +#define RADEON_CCE_VC_CNTL_PRIM_TYPE_NONE 0x00000000 +#define RADEON_CCE_VC_CNTL_PRIM_TYPE_POINT 0x00000001 +#define RADEON_CCE_VC_CNTL_PRIM_TYPE_LINE 0x00000002 +#define RADEON_CCE_VC_CNTL_PRIM_TYPE_POLY_LINE 0x00000003 +#define RADEON_CCE_VC_CNTL_PRIM_TYPE_TRI_LIST 0x00000004 +#define RADEON_CCE_VC_CNTL_PRIM_TYPE_TRI_FAN 0x00000005 +#define RADEON_CCE_VC_CNTL_PRIM_TYPE_TRI_STRIP 0x00000006 +#define RADEON_CCE_VC_CNTL_PRIM_TYPE_TRI_TYPE2 0x00000007 +#define RADEON_CCE_VC_CNTL_PRIM_WALK_IND 0x00000010 +#define RADEON_CCE_VC_CNTL_PRIM_WALK_LIST 0x00000020 +#define RADEON_CCE_VC_CNTL_PRIM_WALK_RING 0x00000030 +#define RADEON_CCE_VC_CNTL_NUM_SHIFT 16 + +#endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/init300.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/init300.c index 2b669d811..261d29ee1 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/init300.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/init300.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init300.c,v 1.3 2000/09/22 11:35:46 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init300.c,v 1.4 2000/09/26 15:57:14 tsi Exp $ */ #include "xf86.h" #include "xf86PciInfo.h" @@ -1062,7 +1062,7 @@ USHORT CalcRefreshRate(ScrnInfoPtr pScrn, DisplayModePtr mode) break; } - while(RefreshRate[Index][i] != NULL) + while(RefreshRate[Index][i] != 0) { if(temp == RefreshRate[Index][i]) { diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c index 446b4d29e..7d72a139d 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c,v 1.3 2000/09/22 11:35:46 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c,v 1.6 2000/10/10 16:38:19 alanh Exp $ */ /* modified from tdfx_dri.c, mga_dri.c */ @@ -24,9 +24,6 @@ #include "sis300_accel.h" -#include "sis_drm_public.h" -#include "drm.h" - extern void GlxSetVisualConfigs( int nconfigs, __GLXvisualConfig *configs, @@ -371,13 +368,7 @@ Bool SISDRIScreenInit(ScreenPtr pScreen) pSISDRI->AGPCmdBufOffset = pSIS->agpCmdBufAddr - pSIS->agpAddr; pSISDRI->AGPCmdBufSize = pSIS->agpCmdBufSize; - { - drm_sis_agp_t agp; - - agp.offset = AGP_CMDBUF_SIZE; - agp.size = AGP_SIZE - AGP_CMDBUF_SIZE; - xf86ioctl(pSIS->drmSubFD, SIS_IOCTL_AGP_INIT, &agp); - } + drmSiSAgpInit(pSIS->drmSubFD, AGP_CMDBUF_SIZE,(AGP_SIZE - AGP_CMDBUF_SIZE)); } while(0); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c b/xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c index 5729c5e31..3ba43df23 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c @@ -21,7 +21,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c,v 1.1 2000/05/23 04:47:44 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dga.c,v 1.2 2000/10/17 16:53:17 tsi Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -153,7 +153,7 @@ static Bool FFB_OpenFramebuffer(ScrnInfoPtr pScrn, char **name, unsigned char ** { FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); - *name = &pFfb->psdp->device; + *name = pFfb->psdp->device; /* We give the user the dumb frame buffer. */ *mem = (unsigned char *)FFB_DFB24_VOFF; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx.h b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx.h index 74eab72e8..17221f249 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx.h @@ -5,7 +5,7 @@ Copyright: 1998,1999 */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx.h,v 1.10 2000/06/17 00:03:24 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx.h,v 1.11 2000/09/26 15:57:14 tsi Exp $ */ #ifndef _TDFX_H_ #define _TDFX_H_ @@ -149,8 +149,8 @@ typedef struct _TDFXRec { int MaxClock; int ChipType; pciVideoPtr PciInfo; - int LinearAddr[MAXCHIPS]; - int MMIOAddr[MAXCHIPS]; + unsigned long LinearAddr[MAXCHIPS]; + unsigned long MMIOAddr[MAXCHIPS]; EntityInfoPtr pEnt; int numChips; PCITAG PciTag[MAXCHIPS]; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c index 87960acf3..89ba45a50 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c,v 1.14 2000/08/25 16:25:36 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c,v 1.15 2000/09/24 13:51:30 alanh Exp $ */ /* All drivers should typically include these */ #include "xf86.h" diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_dri.c index 0831c92b4..a9fc4499b 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_dri.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_dri.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_dri.c,v 1.10 2000/06/23 23:43:45 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_dri.c,v 1.12 2000/09/26 15:57:15 tsi Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -307,7 +307,7 @@ Bool TDFXDRIScreenInit(ScreenPtr pScreen) pDRIInfo = DRICreateInfoRec(); if (!pDRIInfo) { xf86DrvMsg(pScreen->myNum, X_ERROR, - "DRICreatInfoRect() failed, disabling DRI.\n"); + "DRICreateInfoRect() failed, disabling DRI.\n"); return FALSE; } @@ -449,10 +449,6 @@ TDFXCreateContext(ScreenPtr pScreen, VisualPtr visual, drmContext hwContext, void *pVisualConfigPriv, DRIContextType contextStore) { - TDFXConfigPrivPtr pTDFXConfig = (TDFXConfigPrivPtr)pVisualConfigPriv; - TDFXDRIContextPtr ctx; - - ctx=(TDFXDRIContextPtr)contextStore; return TRUE; } @@ -460,8 +456,6 @@ static void TDFXDestroyContext(ScreenPtr pScreen, drmContext hwContext, DRIContextType contextStore) { - TDFXDRIContextPtr ctx; - ctx=(TDFXDRIContextPtr)contextStore; } Bool diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c index 201216076..48c16e61e 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c @@ -25,7 +25,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************/ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c,v 1.42 2000/09/20 00:09:30 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c,v 1.43 2000/09/24 13:51:31 alanh Exp $ */ /* * Authors: diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h index b5ea9f908..850f35398 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h,v 1.6 2000/06/17 00:03:25 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h,v 1.7 2000/09/24 13:51:31 alanh Exp $ */ /* Voodoo Banshee driver version 1.0.1 diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tga/tga_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/tga/tga_accel.c index d875edefc..52fdb941b 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tga/tga_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/tga/tga_accel.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tga/tga_accel.c,v 1.10 2000/03/06 22:59:31 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tga/tga_accel.c,v 1.11 2000/10/20 12:57:26 alanh Exp $ */ /* * Copyright 1996,1997 by Alan Hourihane, Wigan, England. @@ -135,14 +135,11 @@ DEC21030AccelInit(ScreenPtr pScreen) TGA_AccelInfoRec->SubsequentSolidFillRect = TGASubsequentSolidFillRect; /* screen to screen copy */ - if(pTga->depthflag == BPP8PACKED) { /* screen to screen copy apparently doesn't work - for 32bpp tga */ - TGA_AccelInfoRec->ScreenToScreenCopyFlags = NO_TRANSPARENCY; - TGA_AccelInfoRec->SetupForScreenToScreenCopy = - TGASetupForScreenToScreenCopy; - TGA_AccelInfoRec->SubsequentScreenToScreenCopy = - TGASubsequentScreenToScreenCopy; - } + TGA_AccelInfoRec->ScreenToScreenCopyFlags = NO_TRANSPARENCY; + TGA_AccelInfoRec->SetupForScreenToScreenCopy = + TGASetupForScreenToScreenCopy; + TGA_AccelInfoRec->SubsequentScreenToScreenCopy = + TGASubsequentScreenToScreenCopy; /* mono 8x8 pattern fill */ @@ -155,21 +152,19 @@ DEC21030AccelInit(ScreenPtr pScreen) /* color expand */ /* does not work for 32bpp (yet) */ - if(pTga->depthflag == BPP8PACKED) { - TGA_AccelInfoRec->ScanlineCPUToScreenColorExpandFillFlags = - BIT_ORDER_IN_BYTE_LSBFIRST; - - TGA_AccelInfoRec->NumScanlineColorExpandBuffers = 1; - pTga->buffers[0] = (CARD32 *)malloc(CE_BUFSIZE); - TGA_AccelInfoRec->ScanlineColorExpandBuffers = - (unsigned char **)pTga->buffers; - TGA_AccelInfoRec->SetupForScanlineCPUToScreenColorExpandFill = - TGASetupForScanlineCPUToScreenColorExpandFill; - TGA_AccelInfoRec->SubsequentScanlineCPUToScreenColorExpandFill = - TGASubsequentScanlineCPUToScreenColorExpandFill; - TGA_AccelInfoRec->SubsequentColorExpandScanline = - TGASubsequentColorExpandScanline; - } + TGA_AccelInfoRec->ScanlineCPUToScreenColorExpandFillFlags = + BIT_ORDER_IN_BYTE_LSBFIRST; + + TGA_AccelInfoRec->NumScanlineColorExpandBuffers = 1; + pTga->buffers[0] = (CARD32 *)malloc(CE_BUFSIZE); + TGA_AccelInfoRec->ScanlineColorExpandBuffers = + (unsigned char **)pTga->buffers; + TGA_AccelInfoRec->SetupForScanlineCPUToScreenColorExpandFill = + TGASetupForScanlineCPUToScreenColorExpandFill; + TGA_AccelInfoRec->SubsequentScanlineCPUToScreenColorExpandFill = + TGASubsequentScanlineCPUToScreenColorExpandFill; + TGA_AccelInfoRec->SubsequentColorExpandScanline = + TGASubsequentColorExpandScanline; /* lines */ @@ -210,9 +205,9 @@ TGASetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga = NULL; unsigned int fgcolor = 0, bgcolor = 0, pmask = 0; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -274,8 +269,8 @@ TGASubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -315,27 +310,32 @@ TGASubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga; unsigned char *p = NULL; int width = 0; unsigned int addr; unsigned int pixelmask = 0; unsigned int stipple; + unsigned int align_mask; int align = 0; int skipleft; CARD32 c = 0, d = 0; CARD32 *e = NULL; int i = 0, num_dwords = 0; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); TGA_GET_OFFSET(); -/* ErrorF("TGASubsequentColorExpandScanline called\n"); */ -/* if(pTga->transparent_pattern_p) */ -/* ErrorF("transparent color expand\n"); */ + align_mask = (pTga->depthflag == BPP24) ? 0x0f : 0x03; + +#if 0 + ErrorF("TGASubsequentColorExpandScanline called\n"); + if(pTga->transparent_pattern_p) + ErrorF("transparent color expand\n"); +#endif p = (unsigned char *)pTga->buffers[0]; addr = FB_OFFSET(pTga->ce_x, pTga->ce_y); @@ -345,12 +345,13 @@ TGASubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) while(width > 0) { if(!pTga->transparent_pattern_p) pixelmask = 0xFFFFFFFF; - if(addr & 0x3) { - align = addr & 0x3; - if(!pTga->transparent_pattern_p) + + align = (addr & align_mask) / pTga->Bpp; /* no. pixels out of align */ + if (align) { + if (!pTga->transparent_pattern_p) pixelmask <<= align; -/* ErrorF("aligment is %d\n", align); */ - addr -= align; +/* ErrorF("alignment is %d\n", align); */ + addr -= align * pTga->Bpp; width += align; e = (CARD32 *)p; @@ -369,41 +370,43 @@ TGASubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) } } - - if(!pTga->transparent_pattern_p) { - if(skipleft) { + if (!pTga->transparent_pattern_p) { + if (skipleft) { pixelmask <<= skipleft; skipleft = 0; } - if(width < 32) + if (width < 32) { pixelmask &= (0xFFFFFFFF >> (32 - width)); + } + TGA_FAST_WRITE_REG(pixelmask, TGA_PIXELMASK_REG); } else { unsigned int *i = NULL; /* ErrorF("transparent scanline with x = %d, y = %d, w = %d, h = %d\n", pTga->ce_x, pTga->ce_y, pTga->ce_width, pTga->ce_height); */ - if(skipleft) { + if (skipleft) { i = (unsigned int *)p; *i &= (0xFFFFFFFF << skipleft); skipleft = 0; } - if(width < 32) { + if (width < 32) { i = (unsigned int *)p; *i &= (0xFFFFFFFF >> (32 - width)); } } - if(!pTga->transparent_pattern_p) - TGA_FAST_WRITE_REG(pixelmask, TGA_PIXELMASK_REG); - TGA_FAST_WRITE_REG(addr, TGA_ADDRESS_REG); stipple = *((unsigned int *)p); - TGA_FAST_WRITE_REG(stipple, TGA_CONTINUE_REG); - addr += 32; + switch (pTga->Chipset) { + case PCI_CHIP_TGA2: + *(unsigned int *)(pTga->FbBase + addr) = stipple; WMB; + break; + case PCI_CHIP_DEC21030: + TGA_FAST_WRITE_REG(addr, TGA_ADDRESS_REG); + TGA_FAST_WRITE_REG(stipple, TGA_CONTINUE_REG); + } + addr += 32 * pTga->Bpp; p += 4; width -= 32; - if(align) { - align = 0; - } } pTga->ce_height--; if(pTga->ce_height == 0) { @@ -430,9 +433,9 @@ TGASetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga; unsigned int fgcolor = 0, pmask = 0; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -487,8 +490,8 @@ TGASubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h) #ifdef PROFILE unsigned int stop, start; #endif - register unsigned long iobase, offset; TGAPtr pTga; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -547,9 +550,9 @@ TGASetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga; unsigned int pmask = 0; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -557,9 +560,7 @@ TGASetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, /* see section 6.2.9 */ - /* ErrorF("TGASetupForScreenToScreenCopy called\n"); */ - - if(pTga->depthflag == BPP8PACKED) { + if (pTga->depthflag == BPP8PACKED) { pmask = planemask | (planemask << 8) | (planemask << 16) | (planemask << 24); } @@ -572,7 +573,7 @@ TGASetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, pTga->current_rop = rop | pTga->depthflag; /* do we copy a rectangle from top to bottom or bottom to top? */ - if(ydir == -1) { + if (ydir == -1) { pTga->blitdir = BLIT_FORWARDS; } else { @@ -581,6 +582,7 @@ TGASetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, TGA_SAVE_OFFSET(); return; } + /* * This is the implementation of the SubsequentForScreenToScreenCopy * that sends commands to the coprocessor to perform a screen-to-screen @@ -601,23 +603,32 @@ TGASubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, #ifdef PROFILE unsigned int stop, start; #endif - register unsigned long iobase, offset; TGAPtr pTga; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); TGA_GET_OFFSET(); - - /* ErrorF("TGASubsequentScreenToScreenCopy called\n"); */ - +#if 0 + ErrorF("TGASubsequentScreenToScreenCopy(,%d,%d,%d,%d,%d,%d):" + " COPY %s BLIT %s\n", + x1, y1, x2, y2, w, h, (x2 > x1 && (x1 + w) > x2)?"BWD":"FWD", + (pTga->blitdir == BLIT_FORWARDS)?"FWD":"BWD"); +#endif + TGASync(pScrn); /* ?? */ + TGA_FAST_WRITE_REG(COPY | X11 | pTga->depthflag, TGA_MODE_REG); TGA_FAST_WRITE_REG(pTga->current_rop, TGA_RASTEROP_REG); TGA_FAST_WRITE_REG(pTga->current_planemask, TGA_PLANEMASK_REG); +#if 1 if(x2 > x1 && (x1 + w) > x2) copy_func = TGACopyLineBackwards; else copy_func = TGACopyLineForwards; +#else + copy_func = TGACopyLineForwards; +#endif TGA_SAVE_OFFSET(); if(pTga->blitdir == BLIT_FORWARDS) { @@ -631,6 +642,8 @@ TGASubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, } } + TGASync(pScrn); /* ?? */ + TGA_GET_OFFSET(); TGA_FAST_WRITE_REG(SIMPLE | X11 | pTga->depthflag, TGA_MODE_REG); TGA_FAST_WRITE_REG(MIX_SRC | pTga->depthflag, TGA_RASTEROP_REG); @@ -648,59 +661,84 @@ TGACopyLineForwards(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2, int w) int read; unsigned long source_address, destination_address; unsigned int mask_source, mask_destination; + unsigned int cando, cando_mask; int source_align, destination_align; int pixel_shift; - register unsigned long iobase, offset; #ifdef PROFILE unsigned int start, stop; #endif TGAPtr pTga; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); TGA_GET_OFFSET(); + cando = 32; + cando_mask = 0xFFFFFFFFU; + if (pTga->Chipset == PCI_CHIP_DEC21030 && pTga->depthflag == BPP24) { + cando = 16; + cando_mask = 0x0000FFFFU; + } + source_address = FB_OFFSET(x1, y1); destination_address = FB_OFFSET(x2, y2); - +#if 0 + ErrorF("CPY-FWD(,%d,%d,%d,%d,%d): sadr = 0x%lx, dadr = 0x%lx\n", + x1, y1, x2, y2, w, source_address, destination_address); +#endif read = 0; - while(read < w) { - mask_source = 0xFFFFFFFF; - if((w - read) >= 32) - mask_destination = 0xFFFFFFFF; + while (read < w) { + + mask_source = cando_mask; + if ((w - read) >= cando) + mask_destination = cando_mask; else - mask_destination = ((unsigned int)0xFFFFFFFF) >> (32 - (w - read)); + mask_destination = cando_mask >> (cando - (w - read)); + source_align = source_address & 0x07; + source_address -= source_align; + mask_source <<= source_align / pTga->Bpp; + /* mask_source &= cando_mask; */ + destination_align = destination_address & 0x07; - source_address = source_address - source_align; - mask_source <<= source_align; - destination_address = destination_address - destination_align; - mask_destination <<= destination_align; + destination_address -= destination_align; + mask_destination <<= destination_align / pTga->Bpp; + /* mask_destination &= cando_mask; */ - if(destination_align >= source_align) + if (destination_align >= source_align) pixel_shift = destination_align - source_align; else { pixel_shift = 8 - (source_align - destination_align); /* we need to prime the residue register in this case */ - destination_address = destination_address - 8; - mask_destination <<= 8; + destination_address -= 8; + mask_destination <<= 8 / pTga->Bpp; + mask_destination &= cando_mask;/* ?? */ } - + TGA_FAST_WRITE_REG(pixel_shift, TGA_PIXELSHIFT_REG); - /* use GADR and GCTR */ - TGA_FAST_WRITE_REG(source_address, TGA_ADDRESS_REG); - TGA_FAST_WRITE_REG(mask_source, TGA_CONTINUE_REG); - TGA_FAST_WRITE_REG(destination_address, TGA_ADDRESS_REG); - TGA_FAST_WRITE_REG(mask_destination, TGA_CONTINUE_REG); + switch (pTga->Chipset) { + case PCI_CHIP_TGA2: + *(unsigned int *)(pTga->FbBase + source_address) = mask_source; WMB; + *(unsigned int *)(pTga->FbBase + destination_address) = mask_destination; WMB; + break; + case PCI_CHIP_DEC21030: + /* use GADR and GCTR */ + TGA_FAST_WRITE_REG(source_address, TGA_ADDRESS_REG); + TGA_FAST_WRITE_REG(mask_source, TGA_CONTINUE_REG); + TGA_FAST_WRITE_REG(destination_address, TGA_ADDRESS_REG); + TGA_FAST_WRITE_REG(mask_destination, TGA_CONTINUE_REG); + break; + } - source_address = source_address + (32 - pixel_shift); - destination_address += 32; + source_address += (cando - (pixel_shift / pTga->Bpp)) * pTga->Bpp; + destination_address += cando * pTga->Bpp; - read += 32; - read -= destination_align; /* "read" is perhaps better + read += cando; + read -= destination_align / pTga->Bpp; /* "read" is perhaps better called "written"... */ - if(destination_align < source_align) { - read -= 8; + if (destination_align < source_align) { + read -= 8 / pTga->Bpp; } } @@ -720,124 +758,166 @@ TGACopyLineBackwards(ScrnInfoPtr pScrn, int x1, int y1, int x2, unsigned long a1, a2; unsigned long source_address, destination_address; unsigned int mask_source, mask_destination; + unsigned int cando, cando_mask; int source_align, destination_align; int pixel_shift; int read; #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); TGA_GET_OFFSET(); + cando = 32; + cando_mask = 0xFFFFFFFFU; + if (pTga->Chipset == PCI_CHIP_DEC21030 && pTga->depthflag == BPP24) { + cando = 16; + cando_mask = 0x0000FFFFU; + } + a1 = FB_OFFSET(x1, y1); a2 = FB_OFFSET(x2, y2); - source_address = FB_OFFSET((x1 + w) - 32, y1); - destination_address = FB_OFFSET((x2 + w) - 32, y2); - + source_address = FB_OFFSET((x1 + w) - cando, y1); + destination_address = FB_OFFSET((x2 + w) - cando, y2); + +#if 0 + ErrorF("CPY-BWD(,%d,%d,%d,%d,%d): sadr = 0x%lx, dadr = 0x%lx" + " a1 0x%lx a2 0x%lx\n", + x1, y1, x2, y2, w, source_address, destination_address, a1, a2); +#endif + read = 0; - while(read < w) { - mask_source = 0xFFFFFFFF; - if((w - read) >= 32) - mask_destination = 0xFFFFFFFF; - else - mask_destination = ((unsigned int)0xFFFFFFFF) << (32 - (w - read)); + while (read < w) { + mask_source = cando_mask; + if ((w - read) >= cando) + mask_destination = cando_mask; + else { + mask_destination = ((unsigned int)cando_mask) << (cando - (w - read)); + mask_destination &= cando_mask; /* esp. for cando==16 */ + } source_align = source_address & 0x07; destination_align = destination_address & 0x07; - if(read == 0 && destination_align && + if (read == 0 && destination_align && (source_align > destination_align)) { /* we want to take out all the destination_align pixels in one little copy first, then move on to the main stuff */ unsigned long tmp_src, tmp_dest; unsigned int tmp_src_mask, tmp_dest_mask; - tmp_src = (a1 + w) - source_align; - tmp_dest = ((a2 + w) - destination_align) - 8; - tmp_src_mask = 0xFFFFFFFF; - tmp_dest_mask = ((unsigned int)0x000000FF) >> (8 - destination_align); - tmp_dest_mask <<= 8; + tmp_src = a1 + (w - (source_align / pTga->Bpp)) * pTga->Bpp; + tmp_dest = a2 + (w - (destination_align / pTga->Bpp) - (8 / pTga->Bpp)) * pTga->Bpp; + tmp_src_mask = cando_mask; + tmp_dest_mask = ((unsigned int)0x000000FF) >> (8 - destination_align) / pTga->Bpp; + tmp_dest_mask <<= 8 / pTga->Bpp; pixel_shift = (8 - source_align) + destination_align; - +#if 0 + ErrorF("CPY-BWD - premature copy: sa = %d, da = %d, ps =%d\n", + source_align, destination_align, pixel_shift); +#endif TGA_FAST_WRITE_REG(pixel_shift, TGA_PIXELSHIFT_REG); - TGA_FAST_WRITE_REG(tmp_src, TGA_ADDRESS_REG); - TGA_FAST_WRITE_REG(tmp_src_mask, TGA_CONTINUE_REG); - TGA_FAST_WRITE_REG(tmp_dest, TGA_ADDRESS_REG); - TGA_FAST_WRITE_REG(tmp_dest_mask, TGA_CONTINUE_REG); - -/* ErrorF("premature copy: sa = %d, da = %d, ps =%d\n", source_align, */ -/* destination_align, pixel_shift); */ + switch (pTga->Chipset) + { + case PCI_CHIP_TGA2: + *(unsigned int *)(pTga->FbBase + tmp_src) = tmp_src_mask; WMB; + *(unsigned int *)(pTga->FbBase + tmp_dest) = tmp_dest_mask; WMB; + break; + case PCI_CHIP_DEC21030: + /* use GADR and GCTR */ + TGA_FAST_WRITE_REG(tmp_src, TGA_ADDRESS_REG); + TGA_FAST_WRITE_REG(tmp_src_mask, TGA_CONTINUE_REG); + TGA_FAST_WRITE_REG(tmp_dest, TGA_ADDRESS_REG); + TGA_FAST_WRITE_REG(tmp_dest_mask, TGA_CONTINUE_REG); + break; + } source_address += (8 - source_align); - mask_source >>= (8 - source_align); - mask_source >>= destination_align; - mask_destination >>= destination_align; + mask_source >>= (8 - source_align) / pTga->Bpp; + mask_source >>= destination_align / pTga->Bpp; + mask_destination >>= destination_align / pTga->Bpp; } - else if(read == 0 && (source_align != destination_align)) { + else if (read == 0 && (source_align != destination_align)) { source_address += (8 - source_align); /* mask_source >>= (8 - source_align); */ - /* if we comment this out, it breaks...TGA tries to + /* if we uncomment this, it breaks...TGA tries to optimize away a read of our last pixels... */ } - else if(source_align) { + else if (source_align) { source_address += (8 - source_align); - mask_source >>= (8 - source_align); + mask_source >>= (8 - source_align) / pTga->Bpp; } - if(destination_align) { + + if (destination_align) { destination_address += (8 - destination_align); - mask_destination >>= (8 - destination_align); + mask_destination >>= (8 - destination_align) / pTga->Bpp; } - if(destination_align >= source_align) + if (destination_align >= source_align) pixel_shift = destination_align - source_align; else { pixel_shift = (8 - source_align) + destination_align; - if(destination_align) { + if (destination_align) { source_address += 8; - mask_source >>= 8; + mask_source >>= 8 / pTga->Bpp; } } +#if 0 + ErrorF("CPY-BWD - normal: sadr 0x%lx sm 0x%x dadr 0x%lx dm 0x%x" + " sa %d da %d ps %d read %d\n", + source_address, mask_source, + destination_address, mask_destination, + source_align, destination_align, pixel_shift, read); +#endif TGA_FAST_WRITE_REG(pixel_shift, TGA_PIXELSHIFT_REG); - /* use GADR and GCTR */ - TGA_FAST_WRITE_REG(source_address, TGA_ADDRESS_REG); - TGA_FAST_WRITE_REG(mask_source, TGA_CONTINUE_REG); - TGA_FAST_WRITE_REG(destination_address, TGA_ADDRESS_REG); - TGA_FAST_WRITE_REG(mask_destination, TGA_CONTINUE_REG); + switch (pTga->Chipset) { + case PCI_CHIP_TGA2: + *(unsigned int *)(pTga->FbBase + source_address) = mask_source; WMB; + *(unsigned int *)(pTga->FbBase + destination_address) = mask_destination; WMB; + break; + case PCI_CHIP_DEC21030: + /* use GADR and GCTR */ + TGA_FAST_WRITE_REG(source_address, TGA_ADDRESS_REG); + TGA_FAST_WRITE_REG(mask_source, TGA_CONTINUE_REG); + TGA_FAST_WRITE_REG(destination_address, TGA_ADDRESS_REG); + TGA_FAST_WRITE_REG(mask_destination, TGA_CONTINUE_REG); + break; + } /* if(read == 0) */ /* ErrorF("sa = %d, da = %d, ps = %d\n", source_align, destination_align, */ /* pixel_shift); */ - if(destination_align > source_align) { - source_address -= 24; - destination_address -= (32 - pixel_shift); - if(read == 0) - read += 24 + source_align; + if (destination_align > source_align) { + source_address -= cando * pTga->Bpp - 8; + destination_address -= (cando - (pixel_shift / pTga->Bpp)) * pTga->Bpp; + if (read == 0) + read += (cando - 8 / pTga->Bpp) + source_align / pTga->Bpp; else - read += 24; + read += cando - 8 / pTga->Bpp; } - else if(destination_align == source_align) { - source_address -= 32; - destination_address -= 32; - if(read == 0 && destination_align) - read += (32 - (8 - destination_align)); + else if (destination_align == source_align) { + source_address -= cando * pTga->Bpp; + destination_address -= cando * pTga->Bpp; + if (read == 0 && destination_align) + read += (cando - (8 - destination_align) / pTga->Bpp); else - read += 32; + read += cando; } - else if(source_align > destination_align) { - source_address -= 24; - destination_address -= (32 - pixel_shift); + else if (source_align > destination_align) { + source_address -= cando * pTga->Bpp - 8; + destination_address -= (cando - (pixel_shift / pTga->Bpp)) * pTga->Bpp; /* only happens when read == 0 */ - if(destination_align) - read += 16 + source_align; + if (destination_align) + read += (cando - 16 / pTga->Bpp) + source_align / pTga->Bpp; else - read += 32 - pixel_shift; + read += cando - pixel_shift / pTga->Bpp; } } @@ -852,9 +932,9 @@ TGASetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty, #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga; unsigned int fgcolor = 0, bgcolor = 0, pmask = 0; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -925,7 +1005,7 @@ TGASubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty, #ifdef PROFILE register unsigned int stop, start; #endif - register unsigned long iobase, offset; + TGA_DECL(); /* ErrorF("TGASubsequentMono8x8PatternFillRect called with x = %d, y = %d, w = %d, h = %d\n", x, y, w, h); */ @@ -1005,9 +1085,9 @@ TGASetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga = NULL; unsigned int fgcolor = 0, pmask = 0; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -1056,10 +1136,10 @@ TGASubsequentSolidLine(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2, #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga = NULL; CARD32 abs_dx = 0, abs_dy = 0, address = 0, octant_reg = 0; int length = 0; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -1136,10 +1216,9 @@ TGASetupForClippedLine(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2, #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga = NULL; CARD32 abs_dx = 0, abs_dy = 0, octant_reg = 0; - + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -1200,10 +1279,10 @@ TGASubsequentClippedSolidLine(ScrnInfoPtr pScrn, int x1, int y1, int len, #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga = NULL; CARD32 address = 0; int length = 0; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -1246,9 +1325,9 @@ TGASetupForDashedLine(ScrnInfoPtr pScrn, int fg, int bg, int rop, #ifdef PROFILE unsigned int start = 0, stop = 0; #endif - register unsigned long iobase = 0, offset = 0; TGAPtr pTga = NULL; unsigned int color1 = 0, color2 = 0, pmask = 0; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -1293,13 +1372,13 @@ TGASubsequentDashedLine(ScrnInfoPtr pScrn, int x1, int y1, int x2, #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga = NULL; CARD32 abs_dx = 0, abs_dy = 0, address = 0, octant_reg = 0; int length = 0; CARD16 line_mask = 0; int pattern_overflow = 0; int l = 0; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); @@ -1418,13 +1497,13 @@ TGASubsequentClippedDashedLine(ScrnInfoPtr pScrn, int x1, int y1, int len, #ifdef PROFILE unsigned int start, stop; #endif - register unsigned long iobase, offset; TGAPtr pTga = NULL; CARD32 address = 0; int length = 0; CARD16 line_mask = 0; int pattern_overflow = 0; int l = 0; + TGA_DECL(); pTga = TGAPTR(pScrn); TGA_GET_IOBASE(); diff --git a/xc/programs/Xserver/hw/xfree86/loader/xf86sym.c b/xc/programs/Xserver/hw/xfree86/loader/xf86sym.c index 37ccbee14..6b080d5d9 100644 --- a/xc/programs/Xserver/hw/xfree86/loader/xf86sym.c +++ b/xc/programs/Xserver/hw/xfree86/loader/xf86sym.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/loader/xf86sym.c,v 1.163 2000/09/19 12:46:21 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/loader/xf86sym.c,v 1.167 2000/10/24 22:45:09 dawes Exp $ */ /* * @@ -38,7 +38,7 @@ #include "xf86Parser.h" #include "xf86Config.h" #ifdef XINPUT -#include "xf86Xinput.h" +# include "xf86Xinput.h" #endif #include "xf86OSmouse.h" #include "xf86xv.h" @@ -62,13 +62,13 @@ int sysctlbyname(const char*, void *, size_t *, void *, size_t); #endif /* XXX Should get all of these from elsewhere */ -#if defined (PowerMAX_OS) -#undef inb -#undef inw -#undef inl -#undef outb -#undef outw -#undef outl +#if defined(PowerMAX_OS) || (defined(sun) && defined(SVR4)) +# undef inb +# undef inw +# undef inl +# undef outb +# undef outw +# undef outl extern void outb(unsigned int a, unsigned char b); extern void outw(unsigned int a, unsigned short w); @@ -79,7 +79,7 @@ extern unsigned long inl(unsigned int a); #endif #if defined(__alpha__) -#ifdef linux +# ifdef linux extern unsigned long _bus_base(void); extern void _outb(char val, unsigned short port); extern void _outw(short val, unsigned short port); @@ -87,17 +87,17 @@ extern void _outl(int val, unsigned short port); extern unsigned int _inb(unsigned short port); extern unsigned int _inw(unsigned short port); extern unsigned int _inl(unsigned short port); -#endif +# endif -#ifdef __FreeBSD__ -#include <sys/types.h> +# ifdef __FreeBSD__ +# include <sys/types.h> extern void outb(u_int32_t port, u_int8_t val); extern void outw(u_int32_t port, u_int16_t val); extern void outl(u_int32_t port, u_int32_t val); extern u_int8_t inb(u_int32_t port); extern u_int16_t inw(u_int32_t port); extern u_int32_t inl(u_int32_t port); -#endif +# endif extern void* __divl(long, long); extern void* __reml(long, long); @@ -110,15 +110,24 @@ extern void* __remqu(long, long); #endif #if defined(__ia64__) +extern long __divdf3(long, long); extern long __divdi3(long, long); +extern long __divsf3(long, long); extern long __moddi3(long, long); -extern long __divdf3(long, long); +extern long __udivdi3(long, long); +extern long __umoddi3(long, long); +extern void _outb(char val, unsigned short port); +extern void _outw(short val, unsigned short port); +extern void _outl(int val, unsigned short port); +extern unsigned int _inb(unsigned short port); +extern unsigned int _inw(unsigned short port); +extern unsigned int _inl(unsigned short port); #endif #if defined(__sparc__) && defined(__GNUC__) -#define SYMFUNCDOT(func) { "." #func, (funcptr)&__sparc_dot_ ## func }, -#define SYMFUNCDOT89(func) { "." #func, (funcptr)&func ## _sparcv89 }, -#define DEFFUNCDOT(func) \ +# define SYMFUNCDOT(func) { "." #func, (funcptr)&__sparc_dot_ ## func }, +# define SYMFUNCDOT89(func) { "." #func, (funcptr)&func ## _sparcv89 }, +# define DEFFUNCDOT(func) \ extern void __sparc_dot_ ## func (void) __asm__ ("." #func); \ extern void func ## _sparcv89 (void); DEFFUNCDOT(rem) @@ -893,9 +902,9 @@ LOOKUP xfree86LookupTab[] = { of the X server) easier. */ SYMFUNC(xf86InstallSIGIOHandler) SYMFUNC(xf86RemoveSIGIOHandler) -#ifdef __alpha__ +# ifdef __alpha__ SYMFUNC(_bus_base) -#endif +# endif #endif SYMFUNC(xf86BlockSIGIO) SYMFUNC(xf86UnblockSIGIO) @@ -910,21 +919,21 @@ LOOKUP xfree86LookupTab[] = { SYMFUNC(__remq) SYMFUNC(__remqu) -#ifdef linux +# ifdef linux SYMFUNC(_outw) SYMFUNC(_outb) SYMFUNC(_outl) SYMFUNC(_inb) SYMFUNC(_inw) SYMFUNC(_inl) -#else +# else SYMFUNC(outw) SYMFUNC(outb) SYMFUNC(outl) SYMFUNC(inb) SYMFUNC(inw) SYMFUNC(inl) -#endif +# endif SYMFUNC(xf86ReadMmio32) SYMFUNC(xf86ReadMmio16) SYMFUNC(xf86ReadMmio8) @@ -936,6 +945,14 @@ LOOKUP xfree86LookupTab[] = { SYMFUNC(xf86WriteMmioNB8) SYMFUNC(memcpy) #endif +#if defined(sun) || defined(SVR4) && !defined(USL) + SYMFUNC(inb) + SYMFUNC(inw) + SYMFUNC(inl) + SYMFUNC(outb) + SYMFUNC(outw) + SYMFUNC(outl) +#endif #if defined(__powerpc__) SYMFUNC(inb) SYMFUNC(inw) @@ -943,7 +960,7 @@ LOOKUP xfree86LookupTab[] = { SYMFUNC(outb) SYMFUNC(outw) SYMFUNC(outl) -#if defined(NO_INLINE) || defined(Lynx) +# if defined(NO_INLINE) || defined(Lynx) SYMFUNC(mem_barrier) SYMFUNC(ldl_u) SYMFUNC(eieio) @@ -957,14 +974,14 @@ LOOKUP xfree86LookupTab[] = { SYMFUNC(stq_u) SYMFUNC(stw_u) SYMFUNC(write_mem_barrier) -#endif +# endif SYMFUNC(rdinx) SYMFUNC(wrinx) SYMFUNC(modinx) SYMFUNC(testrg) SYMFUNC(testinx2) SYMFUNC(testinx) -#if defined(Lynx) +# if defined(Lynx) SYMFUNC(_restf14) SYMFUNC(_restf17) SYMFUNC(_restf18) @@ -991,20 +1008,29 @@ LOOKUP xfree86LookupTab[] = { SYMFUNC(_savef27) SYMFUNC(_savef28) SYMFUNC(_savef29) -#endif -#if PPCIO_DEBUG +# endif +# if PPCIO_DEBUG SYMFUNC(debug_inb) SYMFUNC(debug_inw) SYMFUNC(debug_inl) SYMFUNC(debug_outb) SYMFUNC(debug_outw) SYMFUNC(debug_outl) -#endif +# endif #endif #if defined(__ia64__) + SYMFUNC(__divdf3) SYMFUNC(__divdi3) + SYMFUNC(__divsf3) SYMFUNC(__moddi3) - SYMFUNC(__divdf3) + SYMFUNC(__udivdi3) + SYMFUNC(__umoddi3) + SYMFUNC(_outw) + SYMFUNC(_outb) + SYMFUNC(_outl) + SYMFUNC(_inb) + SYMFUNC(_inw) + SYMFUNC(_inl) #endif #ifdef __FreeBSD__ diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/Imakefile b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/Imakefile index f0fa864fb..41328aab9 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/Imakefile,v 1.2 2000/08/16 01:45:30 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/Imakefile,v 1.3 2000/10/27 21:14:55 dawes Exp $ XCOMM $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/Imakefile,v 1.7 1999/09/14 19:55:15 faith Exp $ #define IHaveModules @@ -14,8 +14,8 @@ MOBJ = drmmodule.o MTRR_DEFINES = -DHAS_MTRR_SUPPORT #endif -SRCS = xf86drm.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c xf86drmI810.c xf86drmMga.c xf86drmR128.c $(MSRC) -OBJS = xf86drm.o xf86drmHash.o xf86drmRandom.o xf86drmSL.o xf86drmI810.o xf86drmMga.o xf86drmR128.o $(MOBJ) +SRCS = xf86drm.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c xf86drmI810.c xf86drmMga.c xf86drmR128.c xf86drmSiS.c $(MSRC) +OBJS = xf86drm.o xf86drmHash.o xf86drmRandom.o xf86drmSL.o xf86drmI810.o xf86drmMga.o xf86drmR128.o xf86drmSiS.o $(MOBJ) INCLUDES = -I$(XF86COMSRC) -I$(XF86OSSRC) -I. -I$(SERVERSRC)/include \ @@ -46,5 +46,6 @@ LinkSourceFile(xf86drmMga.c,$(XF86OSSRC)/linux/drm) LinkSourceFile(xf86drmR128.c,$(XF86OSSRC)/linux/drm) LinkSourceFile(xf86drmRandom.c,$(XF86OSSRC)/linux/drm) LinkSourceFile(xf86drmSL.c,$(XF86OSSRC)/linux/drm) +LinkSourceFile(xf86drmSiS.c,$(XF86OSSRC)/linux/drm) InstallDriverSDKLibraryModule(drm,$(DRIVERSDKMODULEDIR),freebsd) diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile index 81445a7d3..47dff5bfb 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile,v 1.2 2000/08/16 01:45:31 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile,v 1.3 2000/10/27 16:59:40 dawes Exp $ #include <Server.tmpl> @@ -18,7 +18,7 @@ LinkSourceFile(drm.h,$(XF86OSSRC)/linux/drm/kernel) LinkSourceFile(i810_drm.h,$(XF86OSSRC)/linux/drm/kernel) LinkSourceFile(mga_drm.h,$(XF86OSSRC)/linux/drm/kernel) LinkSourceFile(r128_drm.h,$(XF86OSSRC)/linux/drm/kernel) -LinkSourceFile(sis_drm_public.h,$(XF86OSSRC)/linux/drm/kernel) +LinkSourceFile(sis_drm.h,$(XF86OSSRC)/linux/drm/kernel) XCOMM This is a kludge until we determine how best to build the diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bus/linuxSbus.c b/xc/programs/Xserver/hw/xfree86/os-support/bus/linuxSbus.c index 0852eba20..36700c0d9 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bus/linuxSbus.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/bus/linuxSbus.c @@ -20,7 +20,7 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bus/linuxSbus.c,v 1.3 2000/06/30 17:15:18 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bus/linuxSbus.c,v 1.4 2000/10/17 16:53:19 tsi Exp $ */ #include <fcntl.h> #include <stdio.h> @@ -550,8 +550,8 @@ xf86SbusHideOsHwCursor(sbusDevicePtr psdp) fbcursor.cmap.red = zeros; fbcursor.cmap.green = zeros; fbcursor.cmap.blue = zeros; - fbcursor.image = zeros; - fbcursor.mask = zeros; + fbcursor.image = (char *)zeros; + fbcursor.mask = (char *)zeros; fbcursor.size.x = 32; fbcursor.size.y = 1; fbcursor.set = FB_CUR_SETALL; diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/Imakefile b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/Imakefile index 5620604a0..853185757 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/Imakefile,v 1.6 2000/06/17 00:03:34 martin Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/Imakefile,v 1.7 2000/10/10 16:38:43 alanh Exp $ #define IHaveModules #include <Server.tmpl> @@ -13,8 +13,8 @@ MOBJ = drmmodule.o MTRR_DEFINES = -DHAS_MTRR_SUPPORT #endif -SRCS = xf86drm.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c xf86drmI810.c xf86drmMga.c xf86drmR128.c $(MSRC) -OBJS = xf86drm.o xf86drmHash.o xf86drmRandom.o xf86drmSL.o xf86drmI810.o xf86drmMga.o xf86drmR128.o $(MOBJ) +SRCS = xf86drm.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c xf86drmI810.c xf86drmMga.c xf86drmR128.c xf86drmSiS.c $(MSRC) +OBJS = xf86drm.o xf86drmHash.o xf86drmRandom.o xf86drmSL.o xf86drmI810.o xf86drmMga.o xf86drmR128.o xf86drmSiS.o $(MOBJ) INCLUDES = -I$(XF86COMSRC) -I$(XF86OSSRC) -I. -I$(SERVERSRC)/include \ -I$(XINCLUDESRC) -I$(EXTINCSRC) -I../.. -Ikernel diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Makefile.linux b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Makefile.linux index b76cbeaf6..adf190059 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Makefile.linux +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Makefile.linux @@ -113,15 +113,15 @@ all:; @echo Error: Could not locate kernel tree in $A $B $C else SMP := $(shell gcc -E -nostdinc -I$(TREE) picker.c 2>/dev/null \ | grep -s 'SMP = ' | cut -d' ' -f3) -MODULES := $(shell gcc -E -nostdinc -I $(TREE) picker.c 2>/dev/null \ +MODULES := $(shell gcc -E -nostdinc -I$(TREE) picker.c 2>/dev/null \ | grep -s 'MODULES = ' | cut -d' ' -f3) -MODVERSIONS := $(shell gcc -E -nostdinc -I $(TREE) picker.c 2>/dev/null \ +MODVERSIONS := $(shell gcc -E -nostdinc -I$(TREE) picker.c 2>/dev/null \ | grep -s 'MODVERSIONS = ' | cut -d' ' -f3) AGP := $(shell gcc -E -nostdinc -I$(TREE) picker.c 2>/dev/null \ | grep -s 'AGP = ' | cut -d' ' -f3) SIS := $(shell gcc -E -nostdinc -I$(TREE) picker.c 2>/dev/null \ | grep -s 'SIS = ' | cut -d' ' -f3) -PARAMS := $(shell if fgrep kill_fasync $(TREE)/linux/fs.h \ +PARAMS := $(shell if fgrep kill_fasync $(TREE)/linux/fs.h 2>/dev/null \ | egrep -q '(band|int, int)'; then echo 3; else echo 2; fi) MACHINE := $(shell echo `uname -m`) ifeq ($(AGP),0) diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h index b182f2c99..57032d6e2 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h @@ -82,6 +82,7 @@ typedef struct drm_clip_rect { #include "mga_drm.h" #include "i810_drm.h" #include "r128_drm.h" +#include "sis_drm.h" typedef struct drm_version { int version_major; /* Major version */ @@ -369,4 +370,14 @@ typedef struct drm_agp_info { #define DRM_IOCTL_R128_PACKET DRM_IOW( 0x44, drm_r128_packet_t) #define DRM_IOCTL_R128_VERTEX DRM_IOW( 0x45, drm_r128_vertex_t) +/* SiS specific ioctls */ +#define SIS_IOCTL_FB_ALLOC DRM_IOWR( 0x44, drm_sis_mem_t) +#define SIS_IOCTL_FB_FREE DRM_IOW( 0x45, drm_sis_mem_t) +#define SIS_IOCTL_AGP_INIT DRM_IOWR( 0x53, drm_sis_agp_t) +#define SIS_IOCTL_AGP_ALLOC DRM_IOWR( 0x54, drm_sis_mem_t) +#define SIS_IOCTL_AGP_FREE DRM_IOW( 0x55, drm_sis_mem_t) +#define SIS_IOCTL_FLIP DRM_IOW( 0x48, drm_sis_flip_t) +#define SIS_IOCTL_FLIP_INIT DRM_IO( 0x49) +#define SIS_IOCTL_FLIP_FINAL DRM_IO( 0x50) + #endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmP.h b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmP.h index 6be90c516..46e08e057 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmP.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmP.h @@ -59,6 +59,15 @@ #include <asm/io.h> #include <asm/mman.h> #include <asm/uaccess.h> + +#ifndef copy_to_user_ret +#define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; }) +#endif + +#ifndef copy_from_user_ret +#define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; }) +#endif + #ifdef CONFIG_MTRR #include <asm/mtrr.h> #endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_bufs.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_bufs.c index 05d941b4c..00c0ea7f9 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_bufs.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_bufs.c @@ -420,6 +420,7 @@ int mga_infobufs(struct inode *inode, struct file *filp, unsigned int cmd, sizeof(dma->bufs[0] .freelist.high_mark))) return -EFAULT; + ++count; } } diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/picker.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/picker.c index 77519a561..4b4fbe90c 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/picker.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/picker.c @@ -1,4 +1,3 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/picker.c,v 1.3 2000/09/01 02:31:40 tsi Exp $ */ #include <linux/config.h> #include <linux/version.h> diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/r128_drm.h b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/r128_drm.h index ac6f73bcd..8a0cd1967 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/r128_drm.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/r128_drm.h @@ -57,9 +57,9 @@ typedef struct drm_r128_init { } drm_r128_init_t; typedef struct drm_r128_packet { - unsigned long *buffer; - int count; - int flags; + void *buffer; + int count; + int flags; } drm_r128_packet_t; typedef enum drm_r128_prim { diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/r128_drv.h b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/r128_drv.h index 63b98c727..da2f676d3 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/r128_drv.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/r128_drv.h @@ -197,7 +197,7 @@ extern int r128_context_switch_complete(drm_device_t *dev, int new); #define R128_MAX_USEC_TIMEOUT 100000 /* 100 ms */ -#define R128_BASE(reg) ((u32)(dev_priv->mmio->handle)) +#define R128_BASE(reg) ((unsigned long)(dev_priv->mmio->handle)) #define R128_ADDR(reg) (R128_BASE(reg) + reg) #define R128_DEREF(reg) *(__volatile__ int *)R128_ADDR(reg) diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_mm.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_mm.c index e6e8ed7dd..9a8f83ea9 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_mm.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_mm.c @@ -33,9 +33,6 @@ #include "sis_drm.h" #include "sis_ds.h" #include "sis_drv.h" -#include <linux/fb.h> -#include <linux/sisfb.h> -#include <linux/interrupt.h> #define MAX_CONTEXT 100 #define VIDEO_TYPE 0 @@ -73,7 +70,7 @@ static int del_alloc_set(int context, int type, unsigned int val) } /* fb management via fb device */ -#if 1 +#if 0 int sis_fb_alloc(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c index c933f5935..5c2c08c3b 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c @@ -27,7 +27,7 @@ * Authors: Rickard E. (Rik) Faith <faith@valinux.com> * Kevin E. Martin <martin@valinux.com> * - * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.16 2000/08/28 16:55:52 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.17 2000/09/24 13:51:32 alanh Exp $ * */ diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/int10/linux.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/int10/linux.c index 71cbf4bcf..04a9ececc 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/int10/linux.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/int10/linux.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/int10/linux.c,v 1.14 2000/07/21 21:04:05 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/int10/linux.c,v 1.15 2000/10/17 16:53:20 tsi Exp $ */ /* * linux specific part of the int10 module * Copyright 1999 Egbert Eich @@ -12,7 +12,11 @@ #define _INT10_PRIVATE #include "xf86int10.h" #include "int10Defines.h" +#ifdef __sparc__ +#define DEV_MEM "/dev/fb" +#else #define DEV_MEM "/dev/mem" +#endif #ifndef XFree86LOADER #include <sys/mman.h> #ifndef MAP_FAILED diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/lnxResource.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/lnxResource.c index c1db77996..5e783fcf2 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/lnxResource.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/lnxResource.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnxResource.c,v 3.10 2000/09/19 12:46:22 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnxResource.c,v 3.11 2000/10/17 16:53:20 tsi Exp $ */ /* Resource information code */ @@ -156,7 +156,11 @@ xf86AccResFromOS(resPtr ret) * for now until we get something better. */ +#ifdef __sparc__ +resRange PciAvoid[] = {_END}; +#else resRange PciAvoid[] = {_PCI_AVOID_PC_STYLE, _END}; +#endif resPtr xf86BusAccWindowsFromOS(void) @@ -167,7 +171,11 @@ xf86BusAccWindowsFromOS(void) RANGE(range,0,0xffffffff,ResExcMemBlock); ret = xf86AddResToList(ret, &range, -1); +#ifdef __sparc__ + RANGE(range,0,0x00ffffff,ResExcIoBlock); +#else RANGE(range,0,0x0000ffff,ResExcIoBlock); +#endif ret = xf86AddResToList(ret, &range, -1); return ret; } @@ -181,7 +189,11 @@ xf86PciBusAccWindowsFromOS(void) RANGE(range,0,0xffffffff,ResExcMemBlock); ret = xf86AddResToList(ret, &range, -1); +#ifdef __sparc__ + RANGE(range,0,0x00ffffff,ResExcIoBlock); +#else RANGE(range,0,0x0000ffff,ResExcIoBlock); +#endif ret = xf86AddResToList(ret, &range, -1); return ret; } @@ -195,7 +207,11 @@ xf86IsaBusAccWindowsFromOS(void) RANGE(range,0,0xffffffff,ResExcMemBlock); ret = xf86AddResToList(ret, &range, -1); +#ifdef __sparc__ + RANGE(range,0,0x00ffffff,ResExcIoBlock); +#else RANGE(range,0,0x0000ffff,ResExcIoBlock); +#endif ret = xf86AddResToList(ret, &range, -1); return ret; } diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_pci.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_pci.c index a47431310..6d3e0644d 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_pci.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_pci.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_pci.c,v 3.4 2000/02/08 17:19:22 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_pci.c,v 3.5 2000/10/17 16:53:20 tsi Exp $ */ #include <stdio.h> #include "X.h" @@ -28,14 +28,9 @@ xf86GetPciSizeFromOS(PCITAG tag, int index, int* bits) do { res = fgets(c,0xff,file); if (res) { -#if defined WORD64 || defined LONG64 -#define ILF "\t%*16x\t%*16x\t%*16x\t%*16x\t%*16x\t%*16x\t%*16x" -#define LF "\t%16x\t%16x\t%16x\t%16x\t%16x\t%16x\t%16x" -#else -#define ILF "\t%*08x\t%*08x\t%*08x\t%*08x\t%*08x\t%*08x\t%*08x" -#define LF "\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x\t%08x" -#endif - num = sscanf(res,"%02x%02x\t%*04x%*04x\t%*x"ILF LF, + num = sscanf(res,"%02x%02x\t%*04x%*04x\t%*x" + "\t%*x\t%*x\t%*x\t%*x\t%*x\t%*x\t%*x" + "\t%x\t%x\t%x\t%x\t%x\t%x\t%x", &bus,&devfn,&size[0],&size[1],&size[2],&size[3], &size[4],&size[5],&size[6]); if (num != 9) { /* apparantly not 2.3 style */ diff --git a/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/drm.h b/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/drm.h index b182f2c99..57032d6e2 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/drm.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/drm.h @@ -82,6 +82,7 @@ typedef struct drm_clip_rect { #include "mga_drm.h" #include "i810_drm.h" #include "r128_drm.h" +#include "sis_drm.h" typedef struct drm_version { int version_major; /* Major version */ @@ -369,4 +370,14 @@ typedef struct drm_agp_info { #define DRM_IOCTL_R128_PACKET DRM_IOW( 0x44, drm_r128_packet_t) #define DRM_IOCTL_R128_VERTEX DRM_IOW( 0x45, drm_r128_vertex_t) +/* SiS specific ioctls */ +#define SIS_IOCTL_FB_ALLOC DRM_IOWR( 0x44, drm_sis_mem_t) +#define SIS_IOCTL_FB_FREE DRM_IOW( 0x45, drm_sis_mem_t) +#define SIS_IOCTL_AGP_INIT DRM_IOWR( 0x53, drm_sis_agp_t) +#define SIS_IOCTL_AGP_ALLOC DRM_IOWR( 0x54, drm_sis_mem_t) +#define SIS_IOCTL_AGP_FREE DRM_IOW( 0x55, drm_sis_mem_t) +#define SIS_IOCTL_FLIP DRM_IOW( 0x48, drm_sis_flip_t) +#define SIS_IOCTL_FLIP_INIT DRM_IO( 0x49) +#define SIS_IOCTL_FLIP_FINAL DRM_IO( 0x50) + #endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/shared/libc_wrapper.c b/xc/programs/Xserver/hw/xfree86/os-support/shared/libc_wrapper.c index 247125e6d..9a7a85a31 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/shared/libc_wrapper.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/shared/libc_wrapper.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/libc_wrapper.c,v 1.69 2000/09/19 12:46:22 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/libc_wrapper.c,v 1.70 2000/09/26 15:57:20 tsi Exp $ */ /* * Copyright 1997 by The XFree86 Project, Inc. * @@ -1888,12 +1888,12 @@ xf86shmdt(char *addr) int xf86setjmp(xf86jmp_buf xf86env) { - return setjmp(xf86env); + return setjmp((void *)xf86env); } void xf86longjmp(xf86jmp_buf xf86env, int val) { - longjmp(xf86env,val); + longjmp((void *)xf86env, val); } diff --git a/xc/programs/Xserver/hw/xfree86/os-support/vbe/vbe.c b/xc/programs/Xserver/hw/xfree86/os-support/vbe/vbe.c index 84639a593..0b32b0218 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/vbe/vbe.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/vbe/vbe.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/vbe/vbe.c,v 1.12 2000/08/04 16:13:41 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/vbe/vbe.c,v 1.13 2000/10/12 11:19:41 tsi Exp $ */ #include "xf86.h" #include "xf86_ansic.h" @@ -60,20 +60,23 @@ VBEInit(xf86Int10InfoPtr pInt, int entityIndex) xf86ExecX86int10(pInt); - if ((pInt->ax & 0xff) != 0x4f) goto error; + if ((pInt->ax & 0xff) != 0x4f) { + xf86DrvMsgVerb(screen,X_INFO,3,"VESA BIOS not detected\n"); + goto error; + } switch (pInt->ax & 0xff00) { case 0: - xf86DrvMsg(screen,X_INFO,"VESA Bios detected\n"); + xf86DrvMsg(screen,X_INFO,"VESA BIOS detected\n"); break; case 0x100: - xf86DrvMsg(screen,X_INFO,"VESA Bios function failed\n"); + xf86DrvMsg(screen,X_INFO,"VESA BIOS function failed\n"); goto error; case 0x200: - xf86DrvMsg(screen,X_INFO,"VESA Bios not supported\n"); + xf86DrvMsg(screen,X_INFO,"VESA BIOS not supported\n"); goto error; case 0x300: - xf86DrvMsg(screen,X_INFO,"VESA Bios not supported in current mode\n"); + xf86DrvMsg(screen,X_INFO,"VESA BIOS not supported in current mode\n"); goto error; default: xf86DrvMsg(screen,X_INFO,"Invalid\n"); diff --git a/xc/programs/Xserver/hw/xfree86/os-support/xf86_ansic.h b/xc/programs/Xserver/hw/xfree86/os-support/xf86_ansic.h index a129fc0cf..58c86a106 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/xf86_ansic.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/xf86_ansic.h @@ -22,7 +22,7 @@ * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_ansic.h,v 3.42 2000/09/19 12:46:21 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_ansic.h,v 3.43 2000/10/24 22:45:10 dawes Exp $ */ #ifndef _XF86_ANSIC_H #define _XF86_ANSIC_H @@ -62,8 +62,12 @@ #endif #ifndef NULL +#if (defined(SVR4) || defined(SYSV)) && !defined(__GNUC__) +#define NULL 0 +#else #define NULL ((void *)0) #endif +#endif #ifndef EOF #define EOF (-1) #endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/xf86drm.h b/xc/programs/Xserver/hw/xfree86/os-support/xf86drm.h index 563daff13..de77ddd8b 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/xf86drm.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/xf86drm.h @@ -26,7 +26,7 @@ * * Author: Rickard E. (Rik) Faith <faith@valinux.com> * - * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86drm.h,v 1.11 2000/08/28 16:27:00 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86drm.h,v 1.12 2000/09/24 13:51:32 alanh Exp $ * */ diff --git a/xc/programs/Xserver/hw/xfree86/os-support/xf86drmMga.h b/xc/programs/Xserver/hw/xfree86/os-support/xf86drmMga.h index 33c523a00..75157024f 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/xf86drmMga.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/xf86drmMga.h @@ -1,5 +1,7 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86drmMga.h,v 3.3 2000/09/26 15:57:19 tsi Exp $ */ -/* WARNING: If you change any of these defines, make sure to change +/* + * WARNING: If you change any of these defines, make sure to change * the kernel include file as well (mga_drm.h) */ diff --git a/xc/programs/Xserver/hw/xfree86/xaa/xaaInit.c b/xc/programs/Xserver/hw/xfree86/xaa/xaaInit.c index d5f4cd97a..69c2dce13 100644 --- a/xc/programs/Xserver/hw/xfree86/xaa/xaaInit.c +++ b/xc/programs/Xserver/hw/xfree86/xaa/xaaInit.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/xaa/xaaInit.c,v 1.30 2000/09/24 18:28:56 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/xaa/xaaInit.c,v 1.31 2000/09/28 20:48:00 mvojkovi Exp $ */ #include "misc.h" #include "xf86.h" @@ -106,6 +106,7 @@ XAAInit(ScreenPtr pScreen, XAAInfoRecPtr infoRec) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; XAAScreenPtr pScreenPriv; + int i; #ifdef RENDER PictureScreenPtr ps = GetPictureScreen(pScreen); #endif @@ -134,10 +135,16 @@ XAAInit(ScreenPtr pScreen, XAAInfoRecPtr infoRec) infoRec->Flags &= ~(PIXMAP_CACHE | OFFSCREEN_PIXMAPS); if(!(infoRec->Flags & LINEAR_FRAMEBUFFER)) infoRec->Flags &= ~OFFSCREEN_PIXMAPS; -#if 0 - if(pScreen->backingStoreSupport || pScreen->saveUnderSupport) - infoRec->Flags &= ~OFFSCREEN_PIXMAPS; -#endif + + if(!infoRec->FullPlanemask) { /* for backwards compatibility */ + infoRec->FullPlanemask = (1 << pScrn->depth) - 1; + infoRec->FullPlanemasks[pScrn->depth - 1] = infoRec->FullPlanemask; + } + + for(i = 0; i < 32; i++) { + if(!infoRec->FullPlanemasks[i]) /* keep any set by caller */ + infoRec->FullPlanemasks[i] = (1 << (i+1)) - 1; + } if(!XAAInitAccel(pScreen, infoRec)) return FALSE; pScreenPriv->AccelInfoRec = infoRec; @@ -275,7 +282,8 @@ XAAGetImage ( ((pDraw->type == DRAWABLE_WINDOW) || IS_OFFSCREEN_PIXMAP(pDraw))) { if(infoRec->ReadPixmap && (format == ZPixmap) && - ((planemask & infoRec->FullPlanemask) == infoRec->FullPlanemask) && + ((planemask & infoRec->FullPlanemasks[pDraw->depth - 1]) == + infoRec->FullPlanemasks[pDraw->depth - 1]) && (pDraw->bitsPerPixel == BitsPerPixel(pDraw->depth))) { (*infoRec->ReadPixmap)(pScrn, diff --git a/xc/programs/Xserver/hw/xfree86/xaa/xaaPict.c b/xc/programs/Xserver/hw/xfree86/xaa/xaaPict.c index f8fdde77c..b065aa35b 100644 --- a/xc/programs/Xserver/hw/xfree86/xaa/xaaPict.c +++ b/xc/programs/Xserver/hw/xfree86/xaa/xaaPict.c @@ -1,5 +1,5 @@ /* - * $XFree86$ + * $XFree86: xc/programs/Xserver/hw/xfree86/xaa/xaaPict.c,v 1.5 2000/10/22 20:54:30 mvojkovi Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * @@ -33,13 +33,250 @@ #include "windowstr.h" #include "xf86str.h" #include "mi.h" -#include "miline.h" +#include "picturestr.h" +#include "glyphstr.h" +#include "picture.h" +#include "mipict.h" #include "xaa.h" #include "xaalocal.h" #include "xaawrap.h" #include "xf86fbman.h" #include "servermd.h" +static Bool +XAAGetRGBAFromPixel( + CARD32 pixel, + CARD16 *red, + CARD16 *green, + CARD16 *blue, + CARD16 *alpha, + CARD32 format +){ + + *alpha = 0xffff; + + switch(PICT_FORMAT_BPP(format)) { + case 32: + switch(format) { + case PICT_a8r8g8b8: + *alpha = (pixel >> 24) & 0x000000ff; + *alpha |= *alpha << 8; + case PICT_x8r8g8b8: + *blue = pixel & 0x000000ff; + *blue |= *blue << 8; + *green = pixel & 0x0000ff00; + *green |= *green >> 8; + *red = (pixel >> 16) & 0x000000ff; + *red |= *red << 8; + return TRUE; + case PICT_a8b8g8r8: + *alpha = (pixel >> 24) & 0x000000ff; + *alpha |= *alpha << 8; + case PICT_x8b8g8r8: + *red = pixel & 0x000000ff; + *red |= *red << 8; + *green = pixel & 0x0000ff00; + *green |= *green >> 8; + *blue = (pixel >> 16) & 0x000000ff; + *blue |= *blue << 8; + return TRUE; + default: + break; + } + break; + case 24: + switch(format) { + case PICT_r8g8b8: + *blue = pixel & 0x000000ff; + *blue |= *blue << 8; + *green = pixel & 0x0000ff00; + *green |= *green >> 8; + *red = (pixel >> 16) & 0x000000ff; + *red |= *red << 8; + return TRUE; + case PICT_b8g8r8: + *red = pixel & 0x000000ff; + *red |= *red << 8; + *green = pixel & 0x0000ff00; + *green |= *green >> 8; + *blue = (pixel >> 16) & 0x000000ff; + *blue |= *blue << 8; + return TRUE; + default: + break; + } + break; + case 16: + case 8: + case 4: + default: + return FALSE; + } + + return FALSE; +} + +/* 8:8:8 + PICT_a8 -> 8:8:8:8 texture */ + +void +XAA_888_plus_PICT_a8_to_8888 ( + CARD32 color, + CARD8 *alphaPtr, /* in bytes */ + int alphaPitch, + CARD32 *dstPtr, + int dstPitch, /* in dwords */ + int width, + int height +){ + int x; + + color &= 0x00ffffff; + + while(height--) { + for(x = 0; x < width; x++) + dstPtr[x] = color | (alphaPtr[x] << 24); + dstPtr += dstPitch; + alphaPtr += alphaPitch; + } +} + + +Bool +XAADoComposite ( + CARD8 op, + PicturePtr pSrc, + PicturePtr pMask, + PicturePtr pDst, + INT16 xSrc, + INT16 ySrc, + INT16 xMask, + INT16 yMask, + INT16 xDst, + INT16 yDst, + CARD16 width, + CARD16 height +){ + ScreenPtr pScreen = pDst->pDrawable->pScreen; + XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen); + RegionRec region; + CARD32 *formats; + BoxPtr pbox; + int nbox; + + if(!infoRec->pScrn->vtSema || + ((pDst->pDrawable->type != DRAWABLE_WINDOW) && + !IS_OFFSCREEN_PIXMAP(pDst->pDrawable))) + return FALSE; + + xDst += pDst->pDrawable->x; + yDst += pDst->pDrawable->y; + xSrc += pSrc->pDrawable->x; + ySrc += pSrc->pDrawable->y; + + if(pMask) { + /* for now we only do it if there is a 1x1 (solid) source */ + + if((pSrc->pDrawable->width == 1) && (pSrc->pDrawable->height == 1)) { + CARD16 red, green, blue, alpha; + CARD32 pixel = + *((CARD32*)(((PixmapPtr)(pSrc->pDrawable))->devPrivate.ptr)); + + if(!XAAGetRGBAFromPixel(pixel,&red,&green,&blue,&alpha,pSrc->format)) + return FALSE; + + if((alpha != 0xffff) && + (infoRec->CPUToScreenAlphaTextureFlags & XAA_RENDER_NO_SRC_ALPHA)) + return FALSE; + + formats = infoRec->CPUToScreenAlphaTextureFormats; + + while(*formats != pMask->format) { + if(!(*formats)) return FALSE; + formats++; + } + + xMask += pMask->pDrawable->x; + yMask += pMask->pDrawable->y; + + if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, + xSrc, ySrc, xMask, yMask, xDst, yDst, + width, height)) + return TRUE; + + nbox = REGION_NUM_RECTS(®ion); + pbox = REGION_RECTS(®ion); + + if(!nbox) + return TRUE; + + if(!(infoRec->SetupForCPUToScreenAlphaTexture)(infoRec->pScrn, + op, red, green, blue, alpha, pMask->format, + ((PixmapPtr)(pMask->pDrawable))->devPrivate.ptr, + ((PixmapPtr)(pMask->pDrawable))->devKind, + pMask->pDrawable->width, pMask->pDrawable->height, 0)) + return FALSE; + + xMask -= xDst; + yMask -= yDst; + + while(nbox--) { + (*infoRec->SubsequentCPUToScreenAlphaTexture)(infoRec->pScrn, + pbox->x1, pbox->y1, + pbox->x1 + xMask, pbox->y1 + yMask, + pbox->x2 - pbox->x1, pbox->y2 - pbox->y1); + pbox++; + } + + SET_SYNC_FLAG(infoRec); + REGION_UNINIT(pScreen, ®ion); + return TRUE; + } + } else { + formats = infoRec->CPUToScreenTextureFormats; + + while(*formats != pSrc->format) { + if(!(*formats)) return FALSE; + formats++; + } + + if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, + xSrc, ySrc, xMask, yMask, xDst, yDst, + width, height)) + return TRUE; + + nbox = REGION_NUM_RECTS(®ion); + pbox = REGION_RECTS(®ion); + + if(!nbox) + return TRUE; + + if(!(infoRec->SetupForCPUToScreenTexture)(infoRec->pScrn, + op, pSrc->format, + ((PixmapPtr)(pSrc->pDrawable))->devPrivate.ptr, + ((PixmapPtr)(pSrc->pDrawable))->devKind, + pSrc->pDrawable->width, pSrc->pDrawable->height, 0)) + return FALSE; + + xSrc -= xDst; + ySrc -= yDst; + + while(nbox--) { + (*infoRec->SubsequentCPUToScreenTexture)(infoRec->pScrn, + pbox->x1, pbox->y1, + pbox->x1 + xSrc, pbox->y1 + ySrc, + pbox->x2 - pbox->x1, pbox->y2 - pbox->y1); + pbox++; + } + + SET_SYNC_FLAG(infoRec); + REGION_UNINIT(pScreen, ®ion); + return TRUE; + } + + + return FALSE; +} + void XAAComposite (CARD8 op, @@ -56,9 +293,16 @@ XAAComposite (CARD8 op, CARD16 height) { ScreenPtr pScreen = pDst->pDrawable->pScreen; + XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen); XAA_RENDER_PROLOGUE(pScreen, Composite); - SYNC_CHECK(pDst->pDrawable); - (*GetPictureScreen(pScreen)->Composite) (op, + + if(!infoRec->Composite || + !(*infoRec->Composite)(op, pSrc, pMask, pDst, + xSrc, ySrc, xMask, yMask, xDst, yDst, + width, height)) + { + SYNC_CHECK(pDst->pDrawable); + (*GetPictureScreen(pScreen)->Composite) (op, pSrc, pMask, pDst, @@ -70,6 +314,11 @@ XAAComposite (CARD8 op, yDst, width, height); + } + + if(pDst->pDrawable->type == DRAWABLE_PIXMAP) + (XAA_GET_PIXMAP_PRIVATE((PixmapPtr)(pDst->pDrawable)))->flags |= DIRTY; + XAA_RENDER_EPILOGUE(pScreen, Composite, XAAComposite); } @@ -85,9 +334,20 @@ XAAGlyphs (CARD8 op, GlyphPtr *glyphs) { ScreenPtr pScreen = pDst->pDrawable->pScreen; + XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen); XAA_RENDER_PROLOGUE(pScreen, Glyphs); - SYNC_CHECK(pDst->pDrawable); - (*GetPictureScreen(pScreen)->Glyphs) (op, pSrc, pDst, maskFormat, + + if(!infoRec->Glyphs || + !(*infoRec->Glyphs)(op, pSrc, pDst, maskFormat, + xSrc, ySrc, nlist, list, glyphs)) + { + SYNC_CHECK(pDst->pDrawable); + (*GetPictureScreen(pScreen)->Glyphs) (op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs); + } + + if(pDst->pDrawable->type == DRAWABLE_PIXMAP) + (XAA_GET_PIXMAP_PRIVATE((PixmapPtr)(pDst->pDrawable)))->flags |= DIRTY; + XAA_RENDER_EPILOGUE(pScreen, Glyphs, XAAGlyphs); } diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/Imakefile b/xc/programs/Xserver/hw/xfree86/xf86cfg/Imakefile index 702961eb8..8b81fb207 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/Imakefile @@ -1,7 +1,12 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/Imakefile,v 1.6 2000/06/13 23:15:51 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/Imakefile,v 1.9 2000/10/23 21:16:51 tsi Exp $ XCOMM CDEBUGFLAGS=-g -Wall -ansi -pedantic +#if DoLoadableServer +LDSRCS = libc_wrapper.c loader.c +LDOBJS = libc_wrapper.o loader.o +#endif + SRCS =\ accessx.c\ card-cfg.c\ @@ -10,12 +15,14 @@ SRCS =\ help.c\ interface.c\ keyboard-cfg.c\ + $(LDSRCS) \ monitor-cfg.c\ mouse-cfg.c\ options.c\ screen-cfg.c\ screen.c\ startx.c\ + stubs.c\ vidmode.c\ xf86config.c @@ -27,12 +34,14 @@ OBJS =\ help.o\ interface.o\ keyboard-cfg.o\ + $(LDOBJS) \ monitor-cfg.o\ mouse-cfg.o\ options.o\ screen-cfg.o\ screen.o\ startx.o\ + stubs.o\ vidmode.o\ xf86config.o @@ -61,9 +70,21 @@ XPMPICS =\ AllTarget(ProgramTargetName($(PROG))) +#if DoLoadableServer +LOADERLIB = -L../loader -lxloader -L../dummylib -ldummy +DEFINES = -DUSE_MODULES +INCLUDES = -I../common -I../loader -I$(XF86OSSRC) \ + -I$(SERVERSRC)/include -I$(XINCLUDESRC) +WRAPPERDEFINES = -DSELF_CONTAINED_WRAPPER +#endif + +#if HasDlopen +DLLIB = DlLibrary +#endif + LOCAL_LIBRARIES = $(XKBUILIB) $(XKBFILELIB) -lxf86config $(XXF86MISCLIB) \ $(XXF86VMLIB) $(XAWLIB) $(XMULIB) $(XTOOLLIB) \ - $(XPMLIB) $(XLIB) -lm + $(XPMLIB) $(LOADERLIB) $(DLLIB) $(XLIB) -lm NormalProgramTarget($(PROG),$(OBJS),,$(LOCAL_LIBRARIES),) InstallProgramWithFlags($(PROG),$(BINDIR),NullParameter) @@ -73,4 +94,10 @@ InstallAppDefaults(XF86Cfg) InstallManPage(xf86cfg,$(MANDIR)) NormalLibraryObjectRule() + +#if DoLoadableServer +LinkSourceFile(libc_wrapper.c, $(XF86OSSRC)/shared) +SpecialCObjectRule(libc_wrapper,NullParameter,$(WRAPPERDEFINES) $(EXT_DEFINES)) +#endif + DependTarget() diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/XF86Cfg.ad b/xc/programs/Xserver/hw/xfree86/xf86cfg/XF86Cfg.ad index 2ef449bbd..4702a17e2 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/XF86Cfg.ad +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/XF86Cfg.ad @@ -26,7 +26,7 @@ !! !! Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> !! -!! $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/XF86Cfg.ad,v 1.4 2000/08/01 20:05:43 dawes Exp $ +!! $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/XF86Cfg.ad,v 1.5 2000/10/20 14:59:05 alanh Exp $ !! *Form.background: gray85 @@ -193,6 +193,7 @@ lines -1,0,0,0,0,-1 *commands.card.tip: Add video card *commands.monitor.tip: Add monitor +*topM.justify: left *topM.label: Configure Layout *topM*layout.label: Configure Layout *topM*screen.label: Configure Screen @@ -201,6 +202,9 @@ lines -1,0,0,0,0,-1 *topM.showGrip: False *work.showGrip: False +*MenuButton.leftBitmap: menu10 +*SmeBSB.HorizontalMargins: 18 + *back.label: << Back *next.label: Next >> *ok.label: Ok @@ -359,12 +363,26 @@ lines -1,0,0,0,0,-1 *cardModel.filter.fromHoriz: label *cardModel.filter.width: 171 *cardModel.viewport.width: 302 -*cardModel.viewport.height: 244 +*cardModel.viewport.height: 212 +*cardModel.driver.justify: left +*cardModel.driverL.label: Driver +*cardModel.driverL.fromVert: viewport +*cardModel.driverL.width: 50 +*cardModel.driverL.justify: right +*cardModel.driver.fromVert: viewport +*cardModel.driver.fromHoriz: driverL +*cardModel.driver.width: 250 +*cardModel.driver.left: chainRight +*cardModel.driver.right: chainRight *cardModel.busidL.label: BusID -*cardModel.busidL.fromVert: viewport -*cardModel.busid.fromVert: viewport +*cardModel.busidL.fromVert: driver +*cardModel.busidL.width: 50 +*cardModel.busidL.justify: right +*cardModel.busid.fromVert: driver *cardModel.busid.fromHoriz: busidL -*cardModel.busid.width: 255 +*cardModel.busid.width: 250 +*cardModel.busid.left: chainRight +*cardModel.busid.right: chainRight *cardModel.viewport.forceBars: True *cardModel.viewport.allowVert: True *cardModel.viewport.useRight: True @@ -398,18 +416,18 @@ lines -1,0,0,0,0,-1 .xf86cfg.pane.work.Simple.borderWidth: 1 .xf86cfg.pane.work.Simple.translations:\ -<Btn1Down>: select-device()\n\ -<Btn1Motion>: move-device()\n\ -<Btn1Up>: unselect-device()\n\ -<Btn3Down>: device-popup()\n\ -<Btn3Up>: device-popdown() +Any<Btn1Down>: select-device()\n\ +Any<Btn1Motion>: move-device()\n\ +Any<Btn1Up>: unselect-device()\n\ +Any<Btn3Down>: device-popup()\n\ +Any<Btn3Up>: device-popdown() .xf86cfg.pane.work.screen.translations:\ -<Btn1Down>: select-device()\n\ -<Btn1Motion>: move-device()\n\ -<Btn1Up>: unselect-device()\n\ -<Btn3Down>: device-popup()\n\ -<Btn3Up>: device-popdown() +Any<Btn1Down>: select-device()\n\ +Any<Btn1Motion>: move-device()\n\ +Any<Btn1Up>: unselect-device()\n\ +Any<Btn3Down>: device-popup()\n\ +Any<Btn3Up>: device-popdown() XF86Cfg.translations: #override \ <Message>WM_PROTOCOLS: quit() @@ -473,6 +491,14 @@ XF86Cfg.translations: #override \ *options*viewport.right: chainRight *options*list.longest: 376 +*options*driverOpts.label: Options for driver\ +*options*driverOpts.justify: left +*options*driverOpts.width: 278 +*options*popdown.label: Popdown dialog +*options*driverOpts.tip: This menu shows:\n\ + o option name\n\ + o option type + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! monitor !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -760,10 +786,16 @@ Press ESC or stop button to quit. *screenD*unselect.fromHoriz: viewL *screenD*select.fromVert: modeL *screenD*unselect.fromVert: select +*screenD*up.fromHoriz: viewL +*screenD*down.fromHoriz: viewL +*screenD*up.fromVert: unselect +*screenD*down.fromVert: up *screenD*viewR.fromHoriz: select *screenD*viewR.fromVert: modeL -*screenD*select.label: -> -*screenD*unselect.label: <- +*screenD*select.bitmap: right.xbm +*screenD*unselect.bitmap: left.xbm +*screenD*up.bitmap: up.xbm +*screenD*down.bitmap: down.xbm *screenD*viewL.width: 133 *screenD*viewR.width: 133 *screenD*viewL.height: 184 diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/accessx.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/accessx.c index 3a5557fe8..3842ff230 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/accessx.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/accessx.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/accessx.c,v 1.5 2000/08/01 20:05:43 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/accessx.c,v 1.7 2000/10/20 14:59:05 alanh Exp $ */ #include "config.h" @@ -84,6 +84,10 @@ static void ScaleJumpCallback(Widget, XtPointer, XtPointer); static void ApplyCallback(Widget, XtPointer, XtPointer); static void AccessXInitialize(void); +void CloseAccessXAction(Widget, XEvent*, String*, Cardinal*); +void AccessXConfigureStart(void); +void AccessXConfigureEnd(void); + /* * Implementation */ @@ -368,7 +372,7 @@ AccessXInitialize(void) XtSetArg(args[0], XtNstate, &state); XtGetValues(timeoutToggle, args, 1); - ScaleEnableCallback(enable, (XtPointer)timeout, (XtPointer)(int)state); + ScaleEnableCallback(enable, (XtPointer)timeout, (XtPointer)(long)state); if (xkb_info->xkb->ctrls->ax_timeout > 60) val = (float)(xkb_info->xkb->ctrls->ax_timeout - 60) / (float)(MAX_TIMEOUT * 60); @@ -378,11 +382,11 @@ AccessXInitialize(void) XtSetArg(args[0], XtNstate, &state); XtGetValues(sticky, args, 1); - EnableCallback(sticky, (XtPointer)stickyForm, (XtPointer)(int)state); + EnableCallback(sticky, (XtPointer)stickyForm, (XtPointer)(long)state); XtSetArg(args[0], XtNstate, &state); XtGetValues(mouse, args, 1); - EnableCallback(mouse, (XtPointer)mouseForm, (XtPointer)(int)state); + EnableCallback(mouse, (XtPointer)mouseForm, (XtPointer)(long)state); if (xkb_info->xkb->ctrls->mk_time_to_max > 10) val = (float)((xkb_info->xkb->ctrls->mk_time_to_max * (40. / 10.))) / (float)(MAX_MOUSE_TIME * 100); @@ -408,7 +412,7 @@ AccessXInitialize(void) XtSetArg(args[0], XtNstate, &state); XtGetValues(repeat, args, 1); - EnableCallback(repeat, (XtPointer)repeatForm, (XtPointer)(int)state); + EnableCallback(repeat, (XtPointer)repeatForm, (XtPointer)(long)state); if (xkb_info->xkb->ctrls->repeat_interval > 5) val = (float)(xkb_info->xkb->ctrls->repeat_interval - 5) / (float)(MAX_REPEAT_RATE * 1000); @@ -426,7 +430,7 @@ AccessXInitialize(void) XtSetArg(args[0], XtNstate, &state); XtGetValues(slowToggle, args, 1); - EnableCallback(slowToggle, (XtPointer)slowForm, (XtPointer)(int)state); + EnableCallback(slowToggle, (XtPointer)slowForm, (XtPointer)(long)state); if (xkb_info->xkb->ctrls->slow_keys_delay > 10) val = (float)(xkb_info->xkb->ctrls->repeat_delay - 10) / (float)(MAX_SLOW_TIME * 1000); @@ -436,7 +440,7 @@ AccessXInitialize(void) XtSetArg(args[0], XtNstate, &state); XtGetValues(bounceToggle, args, 1); - EnableCallback(bounceToggle, (XtPointer)bounceForm, (XtPointer)(int)state); + EnableCallback(bounceToggle, (XtPointer)bounceForm, (XtPointer)(long)state); if (xkb_info->xkb->ctrls->debounce_delay > 10) val = (float)(xkb_info->xkb->ctrls->debounce_delay - 10) / (float)(MAX_BOUNCE_TIME * 1000); @@ -446,7 +450,7 @@ AccessXInitialize(void) XtSetArg(args[0], XtNstate, &state); XtGetValues(enable, args, 1); - EnableCallback(enable, (XtPointer)form, (XtPointer)(int)state); + EnableCallback(enable, (XtPointer)form, (XtPointer)(long)state); } void @@ -467,7 +471,7 @@ AccessXConfigureEnd(void) static void EnableCallback(Widget w, XtPointer user_data, XtPointer call_data) { - XtSetSensitive((XtPointer)user_data, (int)call_data); + XtSetSensitive(user_data, (long)call_data); } /*ARGSUSED*/ @@ -476,9 +480,9 @@ ScaleEnableCallback(Widget w, XtPointer user_data, XtPointer call_data) { Scale *scale = (Scale*)user_data; - XtSetSensitive(scale->label, (int)call_data); - XtSetSensitive(scale->number, (int)call_data); - XtSetSensitive(scale->scroller, (int)call_data); + XtSetSensitive(scale->label, (long)call_data); + XtSetSensitive(scale->number, (long)call_data); + XtSetSensitive(scale->scroller, (long)call_data); } static void diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c index 8513a9089..a8bb243d2 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c @@ -26,33 +26,45 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c,v 1.2 2000/06/13 23:15:51 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c,v 1.3 2000/10/20 14:59:05 alanh Exp $ */ #include "xf86config.h" #include "mouse-cfg.h" #include "cards.h" +#include "card-cfg.h" #include <X11/Xaw/AsciiText.h> #include <X11/Xaw/Form.h> #include <X11/Xaw/Label.h> #include <X11/Xaw/List.h> +#include <X11/Xaw/MenuButton.h> +#include <X11/Xaw/SmeBSB.h> +#include <X11/Xaw/SimpleMenu.h> #include <X11/Xaw/Viewport.h> +#ifdef USE_MODULES +#include "loader.h" +#endif /* * Prototypes */ static Bool CardConfigCheck(void); static void CardModelCallback(Widget, XtPointer, XtPointer); +#ifdef USE_MODULES +static void DriverCallback(Widget, XtPointer, XtPointer); +#endif /* * Initialization */ static CardsEntry *card_entry; static XF86ConfDevicePtr current_device; -static Widget filter, list, busid; +static Widget filter, list, driver, busid; static char **cards = NULL; static int ncards; - +#ifdef USE_MODULES +static char *driver_str; +#endif /* * Implementation @@ -65,7 +77,7 @@ CardConfig(XtPointer config) /* XF86OptionPtr option;*/ char card_name[32]; Arg args[1]; - char *bus; + char *bus, *drv_nam; xf86info.cur_list = CARD; XtSetSensitive(back, xf86info.lists[CARD].cur_function > 0); @@ -98,6 +110,12 @@ CardConfig(XtPointer config) XtSetValues(ident_widget, args, 1); XtSetArg(args[0], XtNstring, card->dev_busid); XtSetValues(busid, args, 1); +#ifdef USE_MODULES + XtSetArg(args[0], XtNlabel, driver_str = card->dev_driver); +#else + XtSetArg(args[0], XtNstring, card->dev_driver); +#endif + XtSetValues(driver, args, 1); } else { XF86ConfDevicePtr device = XF86Config->conf_device_lst; @@ -110,13 +128,19 @@ CardConfig(XtPointer config) do { ++ndevices; XmuSnprintf(card_name, sizeof(card_name), "Card%d", ndevices); - } while (xf86FindDevice(card_name, + } while (xf86findDevice(card_name, XF86Config->conf_device_lst)); XtSetArg(args[0], XtNstring, card_name); XtSetValues(ident_widget, args, 1); XtSetArg(args[0], XtNstring, ""); XtSetValues(busid, args, 1); +#ifdef USE_MODULES + XtSetArg(args[0], XtNlabel, driver_str = "vga"); +#else + XtSetArg(args[0], XtNstring, "vga"); +#endif + XtSetValues(driver, args, 1); } if (ConfigLoop(CardConfigCheck) == True) { @@ -154,12 +178,22 @@ CardConfig(XtPointer config) } } if (strcasecmp(card->dev_identifier, ident_string)) - xf86RenameDevice(XF86Config, card, ident_string); + xf86renameDevice(XF86Config, card, ident_string); XtSetArg(args[0], XtNstring, &bus); XtGetValues(busid, args, 1); XtFree(card->dev_busid); card->dev_busid = XtNewString(bus); +#ifdef USE_MODULES + drv_nam = driver_str; +#else + XtSetArg(args[0], XtNstring, &drv_nam); + XtGetValues(driver, args, 1); +#endif + + XtFree(card->dev_driver); + card->dev_driver = XtNewString(drv_nam); + return ((XtPointer)card); } @@ -170,9 +204,19 @@ static Bool CardConfigCheck(void) { XF86ConfDevicePtr device = XF86Config->conf_device_lst; + char *drv_nam; + +#ifdef USE_MODULES + drv_nam = driver_str; +#else + Arg args[1]; + XtSetArg(args[0], XtNstring, &drv_nam); + XtGetValues(driver, args, 1); +#endif if (ident_string == NULL || strlen(ident_string) == 0 || - (current_device == NULL && card_entry == NULL)) + (current_device == NULL && card_entry == NULL) || + drv_nam == NULL || *drv_nam == '\0') return (False); while (device != NULL) { @@ -230,6 +274,9 @@ CardModelCallback(Widget w, XtPointer user_data, XtPointer call_data) else first = 0; + XtSetArg(args[0], XtNstring, card_entry->driver ? card_entry->driver : "vga"); + XtSetValues(driver, args, 1); + str = XtNewString(tip); XtSetArg(args[0], XtNtip, str); XtSetValues(filter, args, 1); @@ -273,6 +320,19 @@ CardFilterAction(Widget w, XEvent *ev, String *params, Cardinal *num_params) XtManageChild(list); } +#ifdef USE_MODULES +/*ARGSUSED*/ +static void +DriverCallback(Widget w, XtPointer user_data, XtPointer call_data) +{ + Arg args[1]; + + driver_str = XtName(w); + XtSetArg(args[0], XtNlabel, driver_str); + XtSetValues(driver, args, 1); +} +#endif + void CardModel(XF86SetupInfo *info) { @@ -303,6 +363,31 @@ CardModel(XF86SetupInfo *info) NULL, 0); XtAddCallback(list, XtNcallback, CardModelCallback, (XtPointer)info); + XtCreateManagedWidget("driverL", labelWidgetClass, model, NULL, 0); +#ifdef USE_MODULES + driver = XtVaCreateManagedWidget("driver", menuButtonWidgetClass, + model, + XtNmenuName, "driverM", + NULL, 0); + { + Widget menu, sme; + xf86cfgDriverOptions *opts = video_driver_info; + + menu = XtCreatePopupShell("driverM", simpleMenuWidgetClass, + driver, NULL, 0); + while (opts) { + sme = XtCreateManagedWidget(opts->name, smeBSBObjectClass, + menu, NULL, 0); + XtAddCallback(sme, XtNcallback, DriverCallback, NULL); + opts = opts->next; + } + } +#else + driver = XtVaCreateManagedWidget("driver", asciiTextWidgetClass, + model, + XtNeditType, XawtextEdit, + NULL, 0); +#endif XtCreateManagedWidget("busidL", labelWidgetClass, model, NULL, 0); busid = XtVaCreateManagedWidget("busid", asciiTextWidgetClass, model, diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/config.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/config.c index 284a72d3f..4bfc62826 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/config.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/config.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/config.c,v 1.2 2000/05/18 16:29:59 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/config.c,v 1.4 2000/10/27 18:31:05 dawes Exp $ */ #include "config.h" @@ -42,9 +42,22 @@ #include <X11/Xaw/Command.h> #include <X11/Shell.h> -#define CONFPATH "%A,%R,/etc/X11/%R,%P/etc/X11/%R,%E,%F,/etc/X11/%F," \ - "%P/etc/X11/%F,%D/%X,/etc/X11/%X,/etc/%X,%P/etc/X11/%X.%H," \ - "%P/etc/X11/%X,%P/lib/X11/%X.%H,%P/lib/X11/%X" +#define CONFPATH "%A," "%R," \ + "/etc/X11/%R," "%P/etc/X11/%R," \ + "%E," "%F," \ + "/etc/X11/%F," "%P/etc/X11/%F," \ + "%D/%X," \ + "/etc/X11/%X-%M," "/etc/X11/%X," "/etc/%X," \ + "%P/etc/X11/%X.%H," "%P/etc/X11/%X-%M," \ + "%P/etc/X11/%X," \ + "%P/lib/X11/%X.%H," "%P/lib/X11/%X-%M," \ + "%P/lib/X11/%X" +#define USER_CONFPATH "/etc/X11/%S," "%P/etc/X11/%S," \ + "/etc/X11/%G," "%P/etc/X11/%G," \ + "%P/etc/X11/%X.%H," "%P/etc/X11/%X-%M," \ + "%P/etc/X11/%X," \ + "%P/lib/X11/%X.%H," "%P/lib/X11/%X-%M," \ + "%P/lib/X11/%X" /* * Prototypes @@ -118,11 +131,13 @@ StartConfig(void) first = 0; /* Read initial configuration */ - if ((filename = xf86OpenConfigFile(CONFPATH, XF86Config_path, NULL)) == NULL) { + if ((filename = xf86openConfigFile(getuid() == 0 ? CONFPATH : USER_CONFPATH, + XF86Config_path, NULL)) == NULL) { fprintf(stderr, "Cannot to open config file.\n"); exit(1); } - if ((XF86Config = xf86ReadConfigFile()) == NULL) { + XF86Config_path = filename; + if ((XF86Config = xf86readConfigFile()) == NULL) { fprintf(stderr, "Problem when parsing config file\n"); exit(1); } diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/config.h b/xc/programs/Xserver/hw/xfree86/xf86cfg/config.h index a912fa380..c2593d62f 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/config.h +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/config.h @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/config.h,v 1.5 2000/08/04 16:13:44 eich Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/config.h,v 1.6 2000/10/20 14:59:05 alanh Exp $ */ #include <X11/IntrinsicP.h> @@ -112,7 +112,7 @@ struct _XF86SetupInfo { XF86SetupFunctionList *lists; }; -typedef Bool (*ConfigCheckFunction)(); +typedef Bool (*ConfigCheckFunction)(void); typedef struct _xf86cfgDevice xf86cfgDevice; diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/help.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/help.c index a970b1006..8f53a52ed 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/help.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/help.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/help.c,v 1.1 2000/06/13 23:15:51 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/help.c,v 1.3 2000/10/20 14:59:05 alanh Exp $ */ #include <X11/IntrinsicP.h> @@ -39,11 +39,13 @@ #include <X11/Xaw/Text.h> #include <X11/Xaw/TextSinkP.h> #include <X11/Xaw/TextSrcP.h> +#include <X11/Xmu/SysUtil.h> #include <X11/Xmu/Xmu.h> #ifndef X_NOT_STDC_ENV #include <stdlib.h> /* for bsearch() */ #endif #include <ctype.h> +#include "help.h" /* * Prototypes @@ -64,7 +66,7 @@ static Bool popped_up = False; /* * Implementation */ -Bool +void Help(char *topic) { Widget source; @@ -256,7 +258,6 @@ struct _Html_SourceInfo { /* * Proptotypes */ -void Html_ModeStart(Widget); void Html_ModeEnd(Widget); static void Html_ModeInit(void); static void Html_ParseCallback(Widget, XtPointer, XtPointer); @@ -269,7 +270,7 @@ static void Html_Commit(Html_Parser*); static void Html_AddEntities(Html_Parser*, Html_Item*); static int Html_Put(Html_Parser*, int); -static char *Html_Puts(Html_Parser*, char*); +static void Html_Puts(Html_Parser*, char*); static int Html_Format1(Html_Parser*); static int Html_Format2(Html_Parser*); static int Html_Format3(Html_Parser*); @@ -737,7 +738,8 @@ Html_Commit(Html_Parser *parser) position, length, Qli); else XawTextSourceAddEntity(parser->source, 0, /*XAW_TENT_LITEM,*/ - XAW_TENTF_HIDE, (XtPointer)head->li++, + XAW_TENTF_HIDE, + (XtPointer)(long)head->li++, position, length, Qli); } else if (quark == Qhide) @@ -1219,7 +1221,7 @@ Html_Put(Html_Parser *parser, int ch) return (ch); } -static char * +static void Html_Puts(Html_Parser *parser, char *str) { int len = strlen(str); diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/interface.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/interface.c index e83cec850..59c49d142 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/interface.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/interface.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/interface.c,v 1.5 2000/08/04 16:13:44 eich Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/interface.c,v 1.8 2000/10/27 18:31:05 dawes Exp $ */ #include <X11/IntrinsicP.h> @@ -58,6 +58,7 @@ #include "options.h" #include "vidmode.h" #include "help.h" +#include "stubs.h" #define randomize() srand((unsigned)time((time_t*)NULL)) #define DefaultXFree86Dir "/usr/X11R6" @@ -91,6 +92,7 @@ static Bool AskConfig(void); void WriteConfigAction(Widget, XEvent*, String*, Cardinal*); static void ScreenSetup(Bool); void QuitAction(Widget, XEvent*, String*, Cardinal*); +void PopdownErrorCallback(Widget, XtPointer, XtPointer); static void ErrorCancelAction(Widget, XEvent*, String*, Cardinal*); static void QuitCancelAction(Widget, XEvent*, String*, Cardinal*); static void HelpCallback(Widget, XtPointer, XtPointer); @@ -109,7 +111,10 @@ char *XF86Config_path = NULL; char *XF86Module_path = NULL; char *XF86Font_path = NULL; char *XF86RGB_path = NULL; +char *XkbConfig_path = NULL; char *XFree86Dir; +static char XF86Config_path_static[1024]; +static char XkbConfig_path_static[1024]; Bool xf86config_set = False; xf86cfgComputer computer; @@ -187,6 +192,10 @@ main(int argc, char *argv[]) XF86ConfLayoutPtr lay; int i, startedx; +#ifdef USE_MODULES + xf86Verbose = 1; +#endif + if ((XFree86Dir = getenv("XWINHOME")) == NULL) XFree86Dir = DefaultXFree86Dir; @@ -212,8 +221,10 @@ main(int argc, char *argv[]) } startedx = startx(); - if (XF86Config_path == NULL) - XF86Config_path = "/etc/X11/XF86Config"; +/* if (XF86Config_path == NULL) + XF86Config_path = "/etc/X11/XF86Config-4";*/ + if (XkbConfig_path == NULL) + XkbConfig_path = XkbConfigDir XkbConfigFile; toplevel = XtAppInitialize(&appcon, "XF86Cfg", /* optionDescList, XtNumber(optionDescList),*/ NULL, 0, @@ -379,6 +390,10 @@ main(int argc, char *argv[]) } } +#ifdef USE_MODULES + LoaderInitializeOptions(); +#endif + XtAppMainLoop(appcon); if (startedx) endx(); @@ -400,7 +415,7 @@ WriteConfig(Widget w, XtPointer user_data, XtPointer call_data) { asking_cf = 0; XtPopdown(shell_cf); - write_cf = (int)user_data; + write_cf = (long)user_data; } /*ARGSUSED*/ @@ -460,7 +475,7 @@ AskConfig(void) break; case CF_XKBConfig: str = "XKB"; - XtSetArg(args[num_args], XtNvalue, XkbConfigDir XkbConfigFile); + XtSetArg(args[num_args], XtNvalue, XkbConfig_path); ++num_args; break; } @@ -483,8 +498,24 @@ AskConfig(void) while (asking_cf) XtAppProcessEvent(XtWidgetToApplicationContext(shell_cf), XtIMAll); - if (write_cf > 0) - XF86Config_path = XawDialogGetValueString(dialog); + if (write_cf > 0) { + switch (cf_state) { + case CF_XF86Config: + XF86Config_path = XawDialogGetValueString(dialog); + XmuSnprintf(XF86Config_path_static, + sizeof(XF86Config_path_static), + "%s", XF86Config_path); + XF86Config_path = XF86Config_path_static; + break; + case CF_XKBConfig: + XkbConfig_path = XawDialogGetValueString(dialog); + XmuSnprintf(XkbConfig_path_static, + sizeof(XkbConfig_path_static), + "%s", XkbConfig_path); + XkbConfig_path = XkbConfig_path_static; + break; + } + } return (write_cf); } @@ -523,9 +554,9 @@ QuitCallback(Widget w, XtPointer user_data, XtPointer call_data) break; case 1: if ((cf_state == CF_XF86Config && - !xf86WriteConfigFile(XF86Config_path, XF86Config)) || + !xf86writeConfigFile(XF86Config_path, XF86Config)) || (cf_state == CF_XKBConfig && - !WriteXKBConfiguration(XkbConfigDir XkbConfigFile, + !WriteXKBConfiguration(XkbConfig_path, &xkb_info->config))) { static Widget shell; @@ -861,13 +892,13 @@ SelectLayoutCallback(Widget w, XtPointer user_data, XtPointer call_data) do { ++num_layouts; XmuSnprintf(name, sizeof(name), "Layout%d", num_layouts); - } while (xf86FindLayout(name, + } while (xf86findLayout(name, XF86Config->conf_layout_lst) != NULL); l = (XF86ConfLayoutPtr)XtCalloc(1, sizeof(XF86ConfLayoutRec)); l->lay_identifier = XtNewString(name); XF86Config->conf_layout_lst = - xf86AddLayout(XF86Config->conf_layout_lst, l); + xf86addLayout(XF86Config->conf_layout_lst, l); layoutsme = XtVaCreateManagedWidget("sme", smeBSBObjectClass, layoutp, XtNlabel, name, @@ -948,7 +979,7 @@ DefaultLayoutCallback(Widget w, XtPointer user_data, XtPointer call_data) XtGetValues(sme, args, 1); prev = XF86Config->conf_layout_lst; - lay = xf86FindLayout(str, prev); + lay = xf86findLayout(str, prev); if (prev == lay) return; @@ -997,7 +1028,7 @@ RemoveLayoutCallback(Widget w, XtPointer user_data, XtPointer call_data) XtSetArg(args[0], XtNlabel, &str); XtGetValues(sme, args, 1); prev = XF86Config->conf_layout_lst; - lay = xf86FindLayout(str, prev); + lay = xf86findLayout(str, prev); tmp = prev; while (tmp != NULL) { if (tmp == lay) @@ -1039,7 +1070,7 @@ RemoveLayoutCallback(Widget w, XtPointer user_data, XtPointer call_data) DrawCables(); } - xf86RemoveLayout(XF86Config, rem); + xf86removeLayout(XF86Config, rem); XtDestroyWidget(sme); } @@ -1151,7 +1182,7 @@ SetTip(xf86cfgDevice *device) void AddDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) { - AddDevice((int)user_data, NULL, 6, 6); + AddDevice((long)user_data, NULL, 6, 6); } void @@ -1169,7 +1200,7 @@ ConfigureDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) if (mouse != NULL && computer.devices[i]->config == NULL) { XF86Config->conf_input_lst = - xf86AddInput(XF86Config->conf_input_lst, + xf86addInput(XF86Config->conf_input_lst, mouse); computer.devices[i]->config = (XtPointer)mouse; } @@ -1181,7 +1212,7 @@ ConfigureDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) if (keyboard != NULL && computer.devices[i]->config == NULL) { XF86Config->conf_input_lst = - xf86AddInput(XF86Config->conf_input_lst, + xf86addInput(XF86Config->conf_input_lst, keyboard); computer.devices[i]->config = (XtPointer)keyboard; } @@ -1193,7 +1224,7 @@ ConfigureDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) if (card != NULL && computer.devices[i]->config == NULL) { XF86Config->conf_device_lst = - xf86AddDevice(XF86Config->conf_device_lst, + xf86addDevice(XF86Config->conf_device_lst, card); computer.devices[i]->config = (XtPointer)card; } @@ -1208,7 +1239,7 @@ ConfigureDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) if (monitor != NULL && computer.devices[i]->config == NULL) { XF86Config->conf_monitor_lst = - xf86AddMonitor(XF86Config->conf_monitor_lst, + xf86addMonitor(XF86Config->conf_monitor_lst, monitor); computer.devices[i]->config = (XtPointer)monitor; } @@ -1236,6 +1267,9 @@ OptionsCallback(Widget w, XtPointer user_data, XtPointer call_data) { int i; XF86OptionPtr *options; +#ifdef USE_MODULES + xf86cfgDriverOptions *drv_opts = NULL; +#endif if (config_mode == CONFIG_SCREEN) { for (i = 0; i < computer.num_screens; i++) @@ -1265,6 +1299,21 @@ OptionsCallback(Widget w, XtPointer user_data, XtPointer call_data) case CARD: options = (XF86OptionPtr*)&(((XF86ConfDevicePtr) (computer.devices[i]->config))->dev_option_lst); +#ifdef USE_MODULES + { + char *drv = ((XF86ConfDevicePtr) + (computer.devices[i]->config))->dev_driver; + + if (drv) { + drv_opts = video_driver_info; + while (drv_opts) { + if (strcmp(drv_opts->name, drv) == 0) + break; + drv_opts = drv_opts->next; + } + } + } +#endif break; case MONITOR: options = (XF86OptionPtr*)&(((XF86ConfMonitorPtr) @@ -1274,13 +1323,18 @@ OptionsCallback(Widget w, XtPointer user_data, XtPointer call_data) } } +#ifdef USE_MODULES + OptionsPopup(options, drv_opts ? drv_opts->name : NULL, + drv_opts ? drv_opts->option : NULL); +#else OptionsPopup(options); +#endif if (config_mode == CONFIG_SCREEN) { XF86OptionPtr option, options; int rotate; options = computer.screens[i]->screen->scrn_option_lst; - if ((option = xf86FindOption(options, "Rotate")) != NULL) { + if ((option = xf86findOption(options, "Rotate")) != NULL) { if (option->opt_val != NULL) rotate = strcasecmp(option->opt_val, "CW") == 0 ? 1 : strcasecmp(option->opt_val, "CCW") == 0 ? -1 : 0; @@ -1351,14 +1405,14 @@ EnableDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) nex->iref_inputdev = input; nex->iref_inputdev_str = XtNewString(input->inp_identifier); if (nmouses == 0 && computer.devices[i]->type == MOUSE) - option = xf86NewOption(XtNewString("CorePointer"), NULL); + option = xf86newOption(XtNewString("CorePointer"), NULL); else if (nkeyboards == 0 && computer.devices[i]->type == KEYBOARD) - option = xf86NewOption(XtNewString("CoreKeyboard"), NULL); + option = xf86newOption(XtNewString("CoreKeyboard"), NULL); else - option = xf86NewOption(XtNewString("SendCoreEvents"), NULL); + option = xf86newOption(XtNewString("SendCoreEvents"), NULL); nex->iref_option_lst = option; computer.layout->lay_input_lst = - xf86AddInputref(computer.layout->lay_input_lst, nex); + xf86addInputref(computer.layout->lay_input_lst, nex); } break; case CARD: for (i = 0; i < computer.num_screens; i++) { @@ -1372,7 +1426,7 @@ EnableDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) adj->adj_screen_str = XtNewString(computer.screens[i]-> screen->scrn_identifier); computer.layout->lay_adjacency_lst = (XF86ConfAdjacencyPtr) - addListItem((GenericListPtr)computer.layout-> + xf86addListItem((GenericListPtr)computer.layout-> lay_adjacency_lst, (GenericListPtr)adj); computer.screens[i]->state = USED; } @@ -1411,7 +1465,7 @@ DisableDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) switch (computer.devices[i]->type) { case MOUSE: case KEYBOARD: - xf86RemoveInputRef(computer.layout, + xf86removeInputRef(computer.layout, (XF86ConfInputPtr)(computer.devices[i]->config)); break; case CARD: { @@ -1425,7 +1479,7 @@ DisableDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) adj = computer.layout->lay_adjacency_lst; while (adj != NULL) { if (adj->adj_screen == computer.screens[j]->screen) { - xf86RemoveAdjacency(computer.layout, adj); + xf86removeAdjacency(computer.layout, adj); break; } adj = (XF86ConfAdjacencyPtr)(adj->list.next); @@ -1480,7 +1534,7 @@ RemoveDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) switch (computer.devices[i]->type) { case MOUSE: case KEYBOARD: - xf86RemoveInput(XF86Config, + xf86removeInput(XF86Config, (XF86ConfInputPtr)(computer.devices[i]->config)); break; case CARD: @@ -1496,7 +1550,7 @@ RemoveDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) --j; } if (computer.devices[i]->refcount <= 0) - xf86RemoveDevice(XF86Config, + xf86removeDevice(XF86Config, (XF86ConfDevicePtr)(computer.devices[i]->config)); } else if (computer.devices[i]->type == MONITOR) { @@ -1507,7 +1561,7 @@ RemoveDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) --j; } if (computer.devices[i]->refcount <= 0) - xf86RemoveMonitor(XF86Config, + xf86removeMonitor(XF86Config, (XF86ConfMonitorPtr)(computer.devices[i]->config)); } @@ -1717,7 +1771,7 @@ void RenameLayoutAction(Widget w, XEvent *event, XtSetArg(args[0], XtNlabel, name); XtSetValues(layoutsme, args, 1); - xf86RenameLayout(XF86Config, computer.layout, name); + xf86renameLayout(XF86Config, computer.layout, name); } /*ARGSUSED*/ @@ -1785,7 +1839,7 @@ DrawCable(Display *display, Window window, int o_x, int o_y, int d_x, int d_y) void SetConfigModeCallback(Widget w, XtPointer user_data, XtPointer call_data) { - int i, mode = (int)user_data; + int i, mode = (long)user_data; Arg args[3]; char *ptr; static Dimension height; diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/keyboard-cfg.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/keyboard-cfg.c index 3c6bbb8c9..c1737d9d5 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/keyboard-cfg.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/keyboard-cfg.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/keyboard-cfg.c,v 1.7 2000/08/04 03:51:49 tsi Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/keyboard-cfg.c,v 1.8 2000/10/20 14:59:05 alanh Exp $ */ #include "xf86config.h" @@ -144,11 +144,11 @@ KeyboardConfig(XtPointer config) current_input = keyboard; if (keyboard != NULL) { - if ((option = xf86FindOption(keyboard->inp_option_lst, XkbModel)) != NULL) + if ((option = xf86findOption(keyboard->inp_option_lst, XkbModel)) != NULL) xkb_info->defs.model = model = option->opt_val; else xkb_info->defs.model = model = xkb_model.name[0]; - if ((option = xf86FindOption(keyboard->inp_option_lst, XkbLayout)) != NULL) + if ((option = xf86findOption(keyboard->inp_option_lst, XkbLayout)) != NULL) xkb_info->defs.layout = layout = option->opt_val; else xkb_info->defs.layout = layout = xkb_layout.name[0]; @@ -172,7 +172,7 @@ KeyboardConfig(XtPointer config) ++nkeyboards; XmuSnprintf(keyboard_name, sizeof(keyboard_name), "Keyboard%d", nkeyboards); - } while (xf86FindInput(keyboard_name, + } while (xf86findInput(keyboard_name, XF86Config->conf_input_lst)); model = xkb_model.name[0]; @@ -194,7 +194,7 @@ KeyboardConfig(XtPointer config) keyboard->list.next = NULL; keyboard->inp_identifier = XtNewString(ident_string); keyboard->inp_driver = XtNewString("keyboard"); - keyboard->inp_option_lst = xf86NewOption(XtNewString(XkbModel), + keyboard->inp_option_lst = xf86newOption(XtNewString(XkbModel), XtNewString(model)); xf86addNewOption(keyboard->inp_option_lst, XtNewString(XkbLayout), XtNewString(layout)); @@ -220,37 +220,37 @@ KeyboardConfig(XtPointer config) break; } - if ((option = xf86FindOption(keyboard->inp_option_lst, XkbModel)) + if ((option = xf86findOption(keyboard->inp_option_lst, XkbModel)) != NULL) { XtFree(option->opt_val); option->opt_val = XtNewString(model); XtFree(option->opt_comment); } -/* else { + else { if (keyboard->inp_option_lst == NULL) - keyboard->inp_option_lst = xf86NewOption(XtNewString(XkbModel), + keyboard->inp_option_lst = xf86newOption(XtNewString(XkbModel), XtNewString(model)); else xf86addNewOption(keyboard->inp_option_lst, XtNewString(XkbModel), XtNewString(model)); - }*/ + } XtFree(xkb_info->config.model); xkb_info->config.model = XtNewString(model); - if ((option = xf86FindOption(keyboard->inp_option_lst, XkbLayout)) + if ((option = xf86findOption(keyboard->inp_option_lst, XkbLayout)) != NULL) { XtFree(option->opt_val); option->opt_val = XtNewString(layout); XtFree(option->opt_comment); } - /*else + else xf86addNewOption(keyboard->inp_option_lst, - XtNewString(XkbLayout), XtNewString(layout));*/ + XtNewString(XkbLayout), XtNewString(layout)); XtFree(xkb_info->config.layout); xkb_info->config.layout = XtNewString(layout); } if (strcasecmp(keyboard->inp_identifier, ident_string)) - xf86RenameInput(XF86Config, keyboard, ident_string); + xf86renameInput(XF86Config, keyboard, ident_string); xkb_info->conf = keyboard; return ((XtPointer)keyboard); @@ -434,7 +434,7 @@ InitializeKeyboard(void) if (xkb_info->config.model != NULL) xkb_info->defs.model = xkb_info->config.model; - else if ((option = xf86FindOption(keyboard->inp_option_lst, "XkbModel")) + else if ((option = xf86findOption(keyboard->inp_option_lst, "XkbModel")) != NULL) xkb_info->defs.model = option->opt_val; else @@ -442,7 +442,7 @@ InitializeKeyboard(void) if (xkb_info->config.layout != NULL) xkb_info->defs.layout = xkb_info->config.layout; - else if ((option = xf86FindOption(keyboard->inp_option_lst, "XkbLayout")) + else if ((option = xf86findOption(keyboard->inp_option_lst, "XkbLayout")) != NULL) xkb_info->defs.layout = option->opt_val; else diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/monitor-cfg.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/monitor-cfg.c index 44a03ae68..3bfdbf57c 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/monitor-cfg.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/monitor-cfg.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/monitor-cfg.c,v 1.2 2000/05/18 16:29:59 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/monitor-cfg.c,v 1.3 2000/10/20 14:59:06 alanh Exp $ */ #include "xf86config.h" @@ -173,7 +173,7 @@ MonitorConfig(XtPointer conf) ++nmonitors; XmuSnprintf(monitor_name, sizeof(monitor_name), "Monitor%d", nmonitors); - } while (xf86FindMonitor(monitor_name, + } while (xf86findMonitor(monitor_name, XF86Config->conf_monitor_lst)); XtSetArg(args[0], XtNstring, monitor_name); @@ -200,7 +200,7 @@ MonitorConfig(XtPointer conf) (monitor->mon_n_vrefresh = mon_n_vrefresh)); if (strcasecmp(monitor->mon_identifier, ident_string)) - xf86RenameMonitor(XF86Config, monitor, ident_string); + xf86renameMonitor(XF86Config, monitor, ident_string); if (oldcard != card) { int i; @@ -210,7 +210,7 @@ MonitorConfig(XtPointer conf) break; if (computer.devices[i]->config == NULL) XF86Config->conf_monitor_lst = - xf86AddMonitor(XF86Config->conf_monitor_lst, + xf86addMonitor(XF86Config->conf_monitor_lst, monitor); computer.devices[i]->config = (XtPointer)monitor; ChangeScreen(monitor, monitor, card, oldcard); diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/mouse-cfg.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/mouse-cfg.c index 3e4e73807..e3949d60e 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/mouse-cfg.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/mouse-cfg.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/mouse-cfg.c,v 1.3 2000/08/01 20:05:43 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/mouse-cfg.c,v 1.5 2000/10/20 14:59:06 alanh Exp $ */ #include "xf86config.h" @@ -40,7 +40,7 @@ #include <X11/extensions/xf86misc.h> /* - * Prootypes + * Prototypes */ static void MouseDeviceCallback(Widget, XtPointer, XtPointer); static void MouseProtocolCallback(Widget, XtPointer, XtPointer); @@ -91,13 +91,13 @@ MouseConfig(XtPointer config) current_input = mouse; if (mouse != NULL) { - emulate = xf86FindOption(mouse->inp_option_lst, + emulate = xf86findOption(mouse->inp_option_lst, Emulate3Buttons) != NULL; - if ((option = xf86FindOption(mouse->inp_option_lst, Device)) != NULL) + if ((option = xf86findOption(mouse->inp_option_lst, Device)) != NULL) device = option->opt_val; else device = NULL; - if ((option = xf86FindOption(mouse->inp_option_lst, Protocol)) != NULL) + if ((option = xf86findOption(mouse->inp_option_lst, Protocol)) != NULL) protocol = option->opt_val; else protocol = NULL; @@ -117,7 +117,7 @@ MouseConfig(XtPointer config) do { ++nmouses; XmuSnprintf(mouse_name, sizeof(mouse_name), "Mouse%d", nmouses); - } while (xf86FindInput(mouse_name, + } while (xf86findInput(mouse_name, XF86Config->conf_input_lst)); XtSetArg(args[0], XtNstring, mouse_name); @@ -143,7 +143,7 @@ MouseConfig(XtPointer config) mouse->list.next = NULL; mouse->inp_identifier = XtNewString(ident_string); mouse->inp_driver = XtNewString("mouse"); - mouse->inp_option_lst = xf86NewOption(XtNewString(Device), + mouse->inp_option_lst = xf86newOption(XtNewString(Device), XtNewString(device)); xf86addNewOption(mouse->inp_option_lst, XtNewString(Protocol), XtNewString(protocol)); @@ -157,21 +157,21 @@ MouseConfig(XtPointer config) mouse->inp_comment = NULL; } else { - if ((option = xf86FindOption(mouse->inp_option_lst, Device)) != NULL) { + if ((option = xf86findOption(mouse->inp_option_lst, Device)) != NULL) { XtFree(option->opt_val); option->opt_val = XtNewString(device); XtFree(option->opt_comment); } else { if (mouse->inp_option_lst == NULL) - mouse->inp_option_lst = xf86NewOption(XtNewString(Device), + mouse->inp_option_lst = xf86newOption(XtNewString(Device), XtNewString(device)); else xf86addNewOption(mouse->inp_option_lst, XtNewString(Device), XtNewString(device)); } - if ((option = xf86FindOption(mouse->inp_option_lst, Protocol)) != NULL) { + if ((option = xf86findOption(mouse->inp_option_lst, Protocol)) != NULL) { XtFree(option->opt_val); option->opt_val = XtNewString(protocol); XtFree(option->opt_comment); @@ -181,8 +181,8 @@ MouseConfig(XtPointer config) XtNewString(Protocol), XtNewString(protocol)); if (emulate == False) { - xf86RemoveOption(&(mouse->inp_option_lst), Emulate3Buttons); - xf86RemoveOption(&(mouse->inp_option_lst), Emulate3Timeout); + xf86removeOption(&(mouse->inp_option_lst), Emulate3Buttons); + xf86removeOption(&(mouse->inp_option_lst), Emulate3Timeout); } else if (emulate) { xf86addNewOption(mouse->inp_option_lst, @@ -192,7 +192,7 @@ MouseConfig(XtPointer config) } } if (strcasecmp(mouse->inp_identifier, ident_string)) - xf86RenameInput(XF86Config, mouse, ident_string); + xf86renameInput(XF86Config, mouse, ident_string); return ((XtPointer)mouse); } @@ -244,7 +244,7 @@ MouseProtocolCallback(Widget w, XtPointer user_data, XtPointer call_data) static void MouseEmulateCallback(Widget w, XtPointer user_data, XtPointer call_data) { - emulate = (Bool)call_data; + emulate = (Bool)(long)call_data; } static void @@ -375,8 +375,8 @@ MouseDeviceAndProtocol(XF86SetupInfo *info) NULL, 0); XtAddCallback(listP, XtNcallback, MouseProtocolCallback, NULL); - emul3 = XtCreateManagedWidget("emulate3", toggleWidgetClass, - mouse_dp, NULL, 0); + emul3 = XtVaCreateManagedWidget("emulate3", toggleWidgetClass, + mouse_dp, XtNstate, True, NULL, 0); XtAddCallback(emul3, XtNcallback, MouseEmulateCallback, NULL); apply = XtCreateManagedWidget("apply", commandWidgetClass, mouse_dp, NULL, 0); diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/options.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/options.c index 2381fb623..e3ff91b51 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/options.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/options.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/options.c,v 1.2 2000/05/18 16:29:59 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/options.c,v 1.3 2000/10/20 14:59:07 alanh Exp $ */ #include "options.h" @@ -35,7 +35,10 @@ #include <X11/Xaw/AsciiText.h> #include <X11/Xaw/List.h> #include <X11/Xaw/Command.h> +#include <X11/Xaw/MenuButton.h> #include <X11/Xaw/Paned.h> +#include <X11/Xaw/SimpleMenP.h> +#include <X11/Xaw/SmeBSB.h> #include <X11/Xaw/Viewport.h> /* @@ -47,6 +50,9 @@ static void AddOption(Widget, XtPointer, XtPointer); static void RemoveOption(Widget, XtPointer, XtPointer); static void UpdateOption(Widget, XtPointer, XtPointer); static void UpdateOptionList(void); +#ifdef USE_MODULES +static void AddDriverOption(Widget, XtPointer, XtPointer); +#endif /* * Initialization @@ -59,10 +65,24 @@ static int option_index, popped = False; /* * Implementation */ +#ifdef USE_MODULES +void +OptionsPopup(XF86OptionPtr *opts, char *driver, OptionInfoPtr drv_opts) +#else void OptionsPopup(XF86OptionPtr *opts) +#endif { static int first = 1; +#ifdef USE_MODULES + static Widget button, menu; + static char label[256], menuName[16]; + Widget sme; + char buf[256]; + int i = 0; + Arg args[1]; + static int menuN; +#endif option_str = NULL; options = opts; @@ -111,12 +131,76 @@ OptionsPopup(XF86OptionPtr *opts) XtAddCallback(list, XtNcallback, SelectOptionCallback, NULL); bottom = XtCreateManagedWidget("bottom", formWidgetClass, pane, NULL, 0); - popdown = XtCreateManagedWidget("popdown", commandWidgetClass, +#ifdef USE_MODULES + button = XtCreateManagedWidget("driverOpts", menuButtonWidgetClass, + bottom, NULL, 0); +#endif + popdown = XtVaCreateManagedWidget("popdown", commandWidgetClass, bottom, NULL, 0); +#ifdef USE_MODULES + XtVaSetValues(popdown, XtNfromHoriz, button, NULL, 0); +#endif + XtAddCallback(popdown, XtNcallback, PopdownCallback, NULL); XtRealizeWidget(shell); XSetWMProtocols(DPY, XtWindow(shell), &wm_delete_window, 1); + +#ifdef USE_MODULES + { + char *str; + + XtSetArg(args[0], XtNlabel, &str); + XtGetValues(button, args, 1); + XmuSnprintf(label, sizeof(label), "%s", str); + } +#endif + } + +#ifdef USE_MODULES + if (menu) + XtDestroyWidget(menu); + XmuSnprintf(menuName, sizeof(buf), "optionM%d", menuN); + menuN = !menuN; + menu = XtCreatePopupShell(menuName, simpleMenuWidgetClass, button, + NULL, 0); + XtVaSetValues(button, XtNmenuName, menuName, NULL, 0); + if (drv_opts) { + int len, longest = 0; + char fmt[32]; + static char *types[] = { + "none", "integer", "(non null) string", "string", "real", + "boolean", "frequency", + }; + + for (i = 0; drv_opts[i].name != NULL; i++) { + len = strlen(drv_opts[i].name); + if (len > longest) + longest = len; + } + XmuSnprintf(fmt, sizeof(fmt), "%c-%ds %%s", '%', longest); + for (; drv_opts->name != NULL; drv_opts++) { + char *type; + + if (drv_opts->type >= OPTV_NONE && drv_opts->type <= OPTV_FREQ) + type = types[drv_opts->type]; + else + type = "UNKNOWN"; + + XmuSnprintf(buf, sizeof(buf), fmt, drv_opts->name, type); + sme = XtVaCreateManagedWidget(drv_opts->name, smeBSBObjectClass, + menu, XtNlabel, buf, NULL, 0); + XtAddCallback(sme, XtNcallback, AddDriverOption, (XtPointer)drv_opts); + } + } + if (i) { + XmuSnprintf(buf, sizeof(buf), "%s%s", label, driver); + XtSetArg(args[0], XtNlabel, buf); + XtSetValues(button, args, 1); + XtMapWidget(button); } + else + XtUnmapWidget(button); +#endif UpdateOptionList(); popped = True; @@ -201,7 +285,7 @@ SelectOptionCallback(Widget w, XtPointer user_data, XtPointer call_data) option_str = info->string; option_index = info->list_index; - if ((option = xf86FindOption(*options, info->string)) != NULL) { + if ((option = xf86findOption(*options, info->string)) != NULL) { XtSetArg(args[0], XtNstring, option->opt_name); XtSetValues(name, args, 1); XtSetArg(args[0], XtNstring, @@ -223,7 +307,7 @@ AddOption(Widget w, XtPointer user_data, XtPointer call_data) XtGetValues(name, args, 1); XtSetArg(args[0], XtNstring, &val); XtGetValues(value, args, 1); - if (xf86FindOption(*options, nam) != NULL || strlen(nam) == 0) + if (xf86findOption(*options, nam) != NULL || strlen(nam) == 0) /* XXX xf86addNewOption will trash the option linked list if * the options being added already exists. */ @@ -233,6 +317,25 @@ AddOption(Widget w, XtPointer user_data, XtPointer call_data) UpdateOptionList(); } +#ifdef USE_MODULES +/*ARGSUSED*/ +static void +AddDriverOption(Widget w, XtPointer user_data, XtPointer call_data) +{ + Arg args[1]; + OptionInfoPtr opt = (OptionInfoPtr)user_data; + XF86OptionPtr option; + + XtSetArg(args[0], XtNstring, opt->name); + XtSetValues(name, args, 1); + if ((option = xf86findOption(*options, opt->name)) == NULL) + XtSetArg(args[0], XtNstring, ""); + else + XtSetArg(args[0], XtNstring, option->opt_val); + XtSetValues(value, args, 1); +} +#endif + /*ARGSUSED*/ static void RemoveOption(Widget w, XtPointer user_data, XtPointer call_data) @@ -242,7 +345,7 @@ RemoveOption(Widget w, XtPointer user_data, XtPointer call_data) XtSetArg(args[0], XtNstring, &str); XtGetValues(name, args, 1); - xf86RemoveOption(options, str); + xf86removeOption(options, str); UpdateOptionList(); } @@ -250,7 +353,7 @@ RemoveOption(Widget w, XtPointer user_data, XtPointer call_data) static void UpdateOption(Widget w, XtPointer user_data, XtPointer call_data) { -/* xf86RemoveOption(options, option_str); +/* xf86removeOption(options, option_str); AddOption(w, user_data, call_data); UpdateOptionList();*/ @@ -262,7 +365,7 @@ UpdateOption(Widget w, XtPointer user_data, XtPointer call_data) XtGetValues(name, args, 1); XtSetArg(args[0], XtNstring, &val); XtGetValues(value, args, 1); - if ((option = xf86FindOption(*options, option_str)) == NULL) + if ((option = xf86findOption(*options, option_str)) == NULL) return; XtFree(option->opt_name); option->opt_name = option_str = XtNewString(nam); diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/options.h b/xc/programs/Xserver/hw/xfree86/xf86cfg/options.h index 0ab081f79..eb5b4474a 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/options.h +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/options.h @@ -26,13 +26,20 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/options.h,v 1.2 2000/05/18 16:29:59 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/options.h,v 1.3 2000/10/20 14:59:07 alanh Exp $ */ #include "config.h" +#ifdef USE_MODULES +#include "loader.h" +#endif /* * Prototypes */ +#ifdef USE_MODULES +void OptionsPopup(XF86OptionPtr*, char*, OptionInfoPtr); +#else void OptionsPopup(XF86OptionPtr*); +#endif void OptionsCancelAction(Widget, XEvent*, String*, Cardinal*); diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/screen-cfg.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/screen-cfg.c index 8a6c514be..bda0942df 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/screen-cfg.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/screen-cfg.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/screen-cfg.c,v 1.2 2000/05/18 16:29:59 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/screen-cfg.c,v 1.4 2000/10/20 14:59:07 alanh Exp $ */ #include "xf86config.h" @@ -37,6 +37,9 @@ #include <X11/Xaw/List.h> #include <X11/Xaw/Toggle.h> #include <X11/Xaw/Viewport.h> +#ifdef USE_MODULES +#include "loader.h" +#endif #define CW 1 #define CCW -1 @@ -49,6 +52,7 @@ static void SelectIndexCallback(Widget, XtPointer, XtPointer); static void UnselectIndexCallback(Widget, XtPointer, XtPointer); static void SelectCallback(Widget, XtPointer, XtPointer); static void UnselectCallback(Widget, XtPointer, XtPointer); +static void MoveCallback(Widget, XtPointer, XtPointer); static void RotateCallback(Widget, XtPointer, XtPointer); /* @@ -152,13 +156,13 @@ ScreenConfig(XtPointer conf) if (disp == NULL) { disp = (XF86ConfDisplayPtr)XtCalloc(1, sizeof(XF86ConfDisplayRec)); screen->scrn_display_lst = (XF86ConfDisplayPtr) - addListItem((GenericListPtr)(screen->scrn_display_lst), + xf86addListItem((GenericListPtr)(screen->scrn_display_lst), (GenericListPtr)(disp)); disp->disp_depth = default_depth; } if (strcasecmp(screen->scrn_identifier, ident_string)) - xf86RenameScreen(XF86Config, screen, ident_string); + xf86renameScreen(XF86Config, screen, ident_string); screen->scrn_defaultdepth = default_depth; @@ -207,7 +211,7 @@ ScreenConfig(XtPointer conf) static char *Rotate = "Rotate"; if (screen->scrn_option_lst != NULL) - xf86RemoveOption(&screen->scrn_option_lst, Rotate); + xf86removeOption(&screen->scrn_option_lst, Rotate); if (rotate) screen->scrn_option_lst = xf86addNewOption(screen->scrn_option_lst, @@ -242,7 +246,7 @@ static void DepthCallback(Widget w, XtPointer user_data, XtPointer call_data) { if (call_data != NULL) - default_depth = (int)user_data; + default_depth = (long)user_data; } /*ARGSUSED*/ @@ -289,7 +293,19 @@ SelectCallback(Widget w, XtPointer user_data, XtPointer call_data) XtSetArg(args[0], XtNlist, defmodes); XtSetArg(args[1], XtNnumberStrings, ndefmodes); XtSetValues(listR, args, 2); - unsel_index = -1; + + XawListUnhighlight(listR); + if (ndefmodes > 1 || (ndefmodes == 1 && *defmodes[0] != '\0')) { + if (unsel_index >= ndefmodes) + unsel_index = ndefmodes - 1; + XawListHighlight(listR, unsel_index = ndefmodes - 1); + } + else + unsel_index = -1; + + /* force realyout */ + XtUnmanageChild(listR); + XtManageChild(listR); } /*ARGSUSED*/ @@ -297,10 +313,26 @@ static void UnselectCallback(Widget w, XtPointer user_data, XtPointer call_data) { Arg args[2]; + char **modes; + Cardinal num_modes; if (unsel_index < 0 || unsel_index >= ndefmodes) return; + XawListUnhighlight(listL); + XtSetArg(args[0], XtNlist, &modes); + XtSetArg(args[1], XtNnumberStrings, &num_modes); + XtGetValues(listL, args, 2); + if (modes) { + for (sel_index = 0; sel_index < num_modes; sel_index++) + if (strcmp(defmodes[unsel_index], modes[sel_index]) == 0) + break; + if (sel_index < num_modes) + XawListHighlight(listL, sel_index); + else + sel_index = -1; + } + XtFree(defmodes[unsel_index]); if (--ndefmodes > unsel_index) memmove(&defmodes[unsel_index], &defmodes[unsel_index + 1], @@ -317,7 +349,40 @@ UnselectCallback(Widget w, XtPointer user_data, XtPointer call_data) XtSetArg(args[0], XtNlist, defmodes); XtSetArg(args[1], XtNnumberStrings, ndefmodes); XtSetValues(listR, args, 2); - unsel_index = -1; + + XawListUnhighlight(listR); + if (ndefmodes > 1 || (ndefmodes == 1 && *defmodes[0] != '\0')) { + if (unsel_index >= ndefmodes) + unsel_index = ndefmodes - 1; + XawListHighlight(listR, unsel_index); + } + else + unsel_index = -1; +} + +/*ARGSUSED*/ +static void +MoveCallback(Widget w, XtPointer user_data, XtPointer call_data) +{ + char *tmp; + Bool down = (Bool)user_data; + + if (unsel_index < 0 || unsel_index >= ndefmodes) + return; + + if ((down && unsel_index + 1 >= ndefmodes) || + (!down && unsel_index - 1 < 0)) + return; + + tmp = defmodes[unsel_index]; + if (down) + defmodes[unsel_index] = defmodes[++unsel_index]; + else + defmodes[unsel_index] = defmodes[--unsel_index]; + defmodes[unsel_index] = tmp; + + XawListUnhighlight(listR); + XawListHighlight(listR, unsel_index); } /*ARGSUSED*/ @@ -325,7 +390,7 @@ void RotateCallback(Widget w, XtPointer user_data, XtPointer call_data) { if (call_data != NULL) - rotate = (int)user_data; + rotate = (long)user_data; else rotate = 0; } @@ -333,11 +398,15 @@ RotateCallback(Widget w, XtPointer user_data, XtPointer call_data) void ScreenDialog(XF86SetupInfo *info) { - static Widget dialog, d1, d4, d8, d16, d24, cw, ccw; + static Widget dialog, d1, d4, d8, d16, d24, labelRotate, cw, ccw; Arg args[2]; XF86ConfMonitorPtr mon = screen->scrn_monitor; XF86ConfModeLinePtr mline = mon != NULL ? mon->mon_modeline_lst : NULL; int i; +#ifdef USE_MODULES + xf86cfgDriverOptions *drv_opts = video_driver_info; + Bool foundRotate = False; +#endif while (nmodes > 0) XtFree(modes[--nmodes]); @@ -391,13 +460,20 @@ ScreenDialog(XF86SetupInfo *info) command = XtCreateManagedWidget("unselect", commandWidgetClass, dialog, NULL, 0); XtAddCallback(command, XtNcallback, UnselectCallback, NULL); + command = XtCreateManagedWidget("up", commandWidgetClass, + dialog, NULL, 0); + XtAddCallback(command, XtNcallback, MoveCallback, (XtPointer)False); + command = XtCreateManagedWidget("down", commandWidgetClass, + dialog, NULL, 0); + XtAddCallback(command, XtNcallback, MoveCallback, (XtPointer)True); viewport = XtCreateManagedWidget("viewR", viewportWidgetClass, dialog, NULL, 0); listR = XtCreateManagedWidget("listRight", listWidgetClass, viewport, NULL, 0); XtAddCallback(listR, XtNcallback, UnselectIndexCallback, NULL); - XtCreateManagedWidget("rotate", labelWidgetClass, dialog, NULL, 0); + labelRotate = XtCreateManagedWidget("rotate", labelWidgetClass, + dialog, NULL, 0); cw = XtCreateManagedWidget("CW", toggleWidgetClass, dialog, NULL, 0); XtAddCallback(cw, XtNcallback, RotateCallback, (XtPointer)CW); ccw = XtVaCreateManagedWidget("CCW", toggleWidgetClass, dialog, @@ -407,6 +483,34 @@ ScreenDialog(XF86SetupInfo *info) XtRealizeWidget(dialog); } +#ifdef USE_MODULES + while (drv_opts) { + if (strcmp(drv_opts->name, screen->scrn_device->dev_driver) == 0) { + OptionInfoPtr opts = drv_opts->option; + + while (opts->name) { + if (xf86nameCompare(opts->name, "Rotate") == 0) { + foundRotate = True; + break; + } + opts++; + } + break; + } + drv_opts = drv_opts->next; + } + + if (!foundRotate) { + XtUnmapWidget(labelRotate); + XtUnmapWidget(cw); + XtUnmapWidget(ccw); + } + else { + XtMapWidget(labelRotate); + XtMapWidget(cw); + XtMapWidget(ccw); + } +#endif if (rotate == CW) { XtVaSetValues(cw, XtNstate, True, NULL, 0); XtVaSetValues(ccw, XtNstate, False, NULL, 0); diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/screen.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/screen.c index 36b8ce5cb..0876e89d9 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/screen.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/screen.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/screen.c,v 1.3 2000/06/13 23:15:52 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/screen.c,v 1.4 2000/10/20 14:59:07 alanh Exp $ */ #include <X11/IntrinsicP.h> @@ -74,31 +74,31 @@ CreateScreenWidget(xf86cfgScreen *screen) */ if (screen->monitor != NULL) { options = ((XF86ConfMonitorPtr)(screen->monitor->config))->mon_option_lst; - if ((option = xf86FindOption(options, Rotate)) != NULL) { + if ((option = xf86findOption(options, Rotate)) != NULL) { if (option->opt_val != NULL) rotate = strcasecmp(option->opt_val, _CW) == 0 ? CW : strcasecmp(option->opt_val, _CCW) == 0 ? CCW : 0; - xf86RemoveOption(&((XF86ConfMonitorPtr)(screen->monitor->config)) + xf86removeOption(&((XF86ConfMonitorPtr)(screen->monitor->config)) ->mon_option_lst, Rotate); } } if (screen->card != NULL) { options = ((XF86ConfDevicePtr)(screen->card->config))->dev_option_lst; - if ((option = xf86FindOption(options, Rotate)) != NULL) { + if ((option = xf86findOption(options, Rotate)) != NULL) { if (option->opt_val != NULL) rotate += strcasecmp(option->opt_val, _CW) == 0 ? CW : strcasecmp(option->opt_val, _CCW) == 0 ? CCW : 0; - xf86RemoveOption(&((XF86ConfDevicePtr)(screen->card->config)) + xf86removeOption(&((XF86ConfDevicePtr)(screen->card->config)) ->dev_option_lst, Rotate); } } options = screen->screen->scrn_option_lst; - if ((option = xf86FindOption(options, Rotate)) != NULL) { + if ((option = xf86findOption(options, Rotate)) != NULL) { if (option->opt_val != NULL) rotate += strcasecmp(option->opt_val, _CW) == 0 ? CW : strcasecmp(option->opt_val, _CCW) == 0 ? CCW : 0; - xf86RemoveOption(&screen->screen->scrn_option_lst, Rotate); + xf86removeOption(&screen->screen->scrn_option_lst, Rotate); } rotate = rotate > 0 ? CW : rotate < 0 ? CCW : 0; @@ -195,7 +195,7 @@ AddScreen(xf86cfgDevice *mon, xf86cfgDevice *dev) ++nscreens; XmuSnprintf(screen_name, sizeof(screen_name), "Screen%d", nscreens); - } while (xf86FindScreen(screen_name, + } while (xf86findScreen(screen_name, XF86Config->conf_screen_lst) != NULL); screen = (XF86ConfScreenPtr)XtCalloc(1, sizeof(XF86ConfScreenRec)); @@ -205,7 +205,7 @@ AddScreen(xf86cfgDevice *mon, xf86cfgDevice *dev) screen->scrn_monitor_str = XtNewString(((XF86ConfMonitorPtr)(mon->config))->mon_identifier); screen->scrn_monitor = (XF86ConfMonitorPtr)(mon->config); XF86Config->conf_screen_lst = - xf86AddScreen(XF86Config->conf_screen_lst, screen); + xf86addScreen(XF86Config->conf_screen_lst, screen); adj = (XF86ConfAdjacencyPtr)XtCalloc(1, sizeof(XF86ConfAdjacencyRec)); adj->adj_screen = screen; @@ -214,7 +214,7 @@ AddScreen(xf86cfgDevice *mon, xf86cfgDevice *dev) computer.layout = XF86Config->conf_layout_lst = (XF86ConfLayoutPtr) XtCalloc(1, sizeof(XF86ConfLayoutRec)); computer.layout->lay_adjacency_lst = (XF86ConfAdjacencyPtr) - addListItem((GenericListPtr)computer.layout->lay_adjacency_lst, + xf86addListItem((GenericListPtr)computer.layout->lay_adjacency_lst, (GenericListPtr)adj); computer.screens = (xf86cfgScreen**) @@ -263,7 +263,7 @@ RemoveScreen(xf86cfgDevice *mon, xf86cfgDevice *dev) } } - xf86RemoveScreen(XF86Config, screen); + xf86removeScreen(XF86Config, screen); } void @@ -695,7 +695,7 @@ AdjustScreenUI(void) XF86ConfScreenPtr s; if (adj->adj_where >= CONF_ADJ_RIGHTOF < adj->adj_where <= CONF_ADJ_BELOW) { - s = xf86FindScreen(adj->adj_refscreen, XF86Config->conf_screen_lst); + s = xf86findScreen(adj->adj_refscreen, XF86Config->conf_screen_lst); for (i = 0; i < computer.num_screens; i++) if (computer.screens[i]->screen == s) break; @@ -793,6 +793,9 @@ AdjustScreenUI(void) for (i = 0; i < computer.num_screens; i++) if (computer.screens[i]->state == USED1) computer.screens[i]->state = USED; + else + XLowerWindow(XtDisplay(computer.screens[i]->widget), + XtWindow(computer.screens[i]->widget)); w = work->core.width / (columns + 1) - 5; h = work->core.height / (rows + 1) - 5; diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/vidmode.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/vidmode.c index a7ddd3e27..e9dafe5cf 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/vidmode.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/vidmode.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/vidmode.c,v 1.1 2000/05/18 16:30:00 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/vidmode.c,v 1.3 2000/10/20 14:59:08 alanh Exp $ */ /* @@ -474,7 +474,6 @@ VideoModeInitialize(void) rep = XtCreateManagedWidget("prev", commandWidgetClass, vtune, NULL, 0); XtAddCallback(rep, XtNcallback, SwitchCallback, (XtPointer)-1); mode = XtCreateManagedWidget("mode", menuButtonWidgetClass, vtune, NULL, 0); - menu = XtCreatePopupShell("menu", simpleMenuWidgetClass, vtune, NULL, 0); rep = XtCreateManagedWidget("next", commandWidgetClass, vtune, NULL, 0); XtAddCallback(rep, XtNcallback, SwitchCallback, (XtPointer)1); @@ -494,7 +493,8 @@ VideoModeInitialize(void) XmuSnprintf(name, sizeof(name), "%s.%d", dispstr, i); rep = XtCreateManagedWidget(name, smeBSBObjectClass, screenp, NULL, 0); - XtAddCallback(rep, XtNcallback, ChangeScreenCallback, (XtPointer)i); + XtAddCallback(rep, XtNcallback, ChangeScreenCallback, + (XtPointer)(long)i); if (i == 0) { screenb = XtVaCreateManagedWidget("screenB", menuButtonWidgetClass, vtune, @@ -504,8 +504,6 @@ VideoModeInitialize(void) } } XtRealizeWidget(screenp); - monitor = XtCreatePopupShell("monitorP", simpleMenuWidgetClass, - vtune, NULL, 0); rep = XtCreateManagedWidget("up", repeaterWidgetClass, vtune, NULL, 0); @@ -579,8 +577,8 @@ VideoModeInitialize(void) add = XtCreateManagedWidget("add", commandWidgetClass, vtune, NULL, 0); XtAddCallback(add, XtNcallback, AddModeCallback, NULL); XtCreateManagedWidget("addto", labelWidgetClass, vtune, NULL, 0); - monitorb = XtVaCreateManagedWidget("ident", menuButtonWidgetClass, vtune, - XtNmenuName, "monitorP", NULL, 0); + monitorb = XtCreateManagedWidget("ident", menuButtonWidgetClass, vtune, + NULL, 0); XtCreateManagedWidget("as", labelWidgetClass, vtune, NULL, 0); text = XtVaCreateManagedWidget("text", asciiTextWidgetClass, vtune, XtNeditType, XawtextEdit, NULL, 0); @@ -601,10 +599,11 @@ VideoModeConfigureStart(void) else XtMapWidget(vtune); if (vidtune != NULL) { - int i; Arg args[1]; Boolean state; XF86ConfMonitorPtr mon; + static char menuName[16]; + static int menuN; XtErrorFunc = XSetErrorHandler(VidmodeError); XF86VidModeLockModeSwitch(XtDisplay(toplevel), vidtune->screen, True); @@ -617,8 +616,14 @@ VideoModeConfigureStart(void) XtSetSensitive(apply, !state); autoflag = state; - for (i = 0; i < ((CompositeWidget)monitor)->composite.num_children; i++) - XtDestroyWidget(((CompositeWidget)monitor)->composite.children[i]); + if (monitor) + XtDestroyWidget(monitor); + XmuSnprintf(menuName, sizeof(menuName), "menuP%d", menuN); + menuN = !menuN; + monitor = XtCreatePopupShell(menuName, simpleMenuWidgetClass, + vtune, NULL, 0); + XtVaSetValues(monitorb, XtNmenuName, menuName, NULL, 0); + mon = XF86Config->conf_monitor_lst; while (mon != NULL) { Widget sme = XtCreateManagedWidget(mon->mon_identifier, @@ -782,7 +787,7 @@ AdjustMonitorCallback(Widget w, XtPointer client_data, XtPointer call_data) { if (repeater != w) return; - switch ((int)client_data) { + switch ((long)client_data) { case LEFT: if (modeline.hsyncend + 4 < modeline.htotal) { modeline.hsyncstart += 4; @@ -936,7 +941,7 @@ ApplyCallback(Widget w, XtPointer call_data, XtPointer client_data) static void AutoCallback(Widget w, XtPointer call_data, XtPointer client_data) { - autoflag = (Bool)client_data; + autoflag = (Bool)(long)client_data; XtSetSensitive(apply, !autoflag); } @@ -970,7 +975,7 @@ SelectCallback(Widget w, XtPointer call_data, XtPointer client_data) static void SwitchCallback(Widget w, XtPointer call_data, XtPointer client_data) { - int direction = (int)call_data; + int direction = (long)call_data; Arg args[1]; Bool result; char label[32]; @@ -1021,7 +1026,7 @@ ChangeScreenCallback(Widget w, XtPointer call_data, XtPointer client_data) { Arg args[1]; - screenno = (int)call_data; + screenno = (long)call_data; if (screenno > computer.num_vidmodes || screenno < 0 || vidtune == computer.vidmodes[screenno]) return; @@ -1069,13 +1074,19 @@ GetModes(void) int i; char label[32]; Arg args[1]; + static char menuName[16]; + static int menuN; XFree(vidtune->infos); XF86VidModeGetAllModeLines(XtDisplay(toplevel), vidtune->screen, &vidtune->num_infos, &vidtune->infos); - for (i = 0; i < ((CompositeWidget)menu)->composite.num_children; i++) - XtDestroyWidget(((CompositeWidget)menu)->composite.children[i]); + XmuSnprintf(menuName, sizeof(menuName), "menu%d", menuN); + menuN = !menuN; + if (menu) + XtDestroyWidget(menu); + menu = XtCreatePopupShell(menuName, simpleMenuWidgetClass, vtune, NULL, 0); + XtVaSetValues(mode, XtNmenuName, menuName, NULL, 0); for (i = 0; i < vidtune->num_infos; i++) { Widget sme; @@ -1105,7 +1116,7 @@ PopdownForce(Widget w, XtPointer user_data, XtPointer call_data) { asking_force = 0; XtPopdown(forceshell); - do_force = (int)user_data; + do_force = (long)user_data; } void @@ -1155,7 +1166,7 @@ AddModeCallback(Widget w, XtPointer call_data, XtPointer client_data) XBell(XtDisplay(w), 80); return; } - if (xf86FindModeLine(label, vidtune->monitor->mon_modeline_lst) + if (xf86findModeLine(label, vidtune->monitor->mon_modeline_lst) != NULL && !ForceAddMode()) return; @@ -1174,7 +1185,7 @@ AddModeCallback(Widget w, XtPointer call_data, XtPointer client_data) mode->ml_flags = modeline.flags; mode->ml_hskew = modeline.hskew; vidtune->monitor->mon_modeline_lst = - xf86AddModeLine(vidtune->monitor->mon_modeline_lst, mode); + xf86addModeLine(vidtune->monitor->mon_modeline_lst, mode); } else XBell(XtDisplay(w), 80); diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.c index 33c32019c..908568967 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.c,v 1.2 2000/05/18 16:30:01 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.c,v 1.3 2000/10/20 14:59:08 alanh Exp $ */ #include "xf86config.h" @@ -35,31 +35,7 @@ * Implementation */ int -ErrorF(const char *fmt, ...) -{ - int retval; - va_list ap; - - Va_start(ap, fmt); - retval = vfprintf(stderr, fmt, ap); - - va_end(ap); - - return (retval); -} - -int -VErrorF(const char *fmt, va_list ap) -{ - int retval; - - retval = vfprintf(stderr, fmt, ap); - - return (retval); -} - -int -xf86RemoveOption(XF86OptionPtr *options, char *name) +xf86removeOption(XF86OptionPtr *options, char *name) { XF86OptionPtr opt = *options, prev = opt; @@ -85,7 +61,7 @@ xf86RemoveOption(XF86OptionPtr *options, char *name) } int -xf86RemoveInput(XF86ConfigPtr config, XF86ConfInputPtr input) +xf86removeInput(XF86ConfigPtr config, XF86ConfInputPtr input) { XF86ConfInputPtr prev, inp = config->conf_input_lst; XF86ConfLayoutPtr lay = config->conf_layout_lst; @@ -109,21 +85,21 @@ xf86RemoveInput(XF86ConfigPtr config, XF86ConfInputPtr input) /* remove references */ while (lay != NULL) { - xf86RemoveInputRef(lay, inp); + xf86removeInputRef(lay, inp); lay = (XF86ConfLayoutPtr)(lay->list.next); } XtFree(inp->inp_identifier); XtFree(inp->inp_driver); XtFree(inp->inp_comment); - xf86OptionListFree(inp->inp_option_lst); + xf86optionListFree(inp->inp_option_lst); XtFree((XtPointer)inp); return (True); } int -xf86RemoveInputRef(XF86ConfLayoutPtr layout, XF86ConfInputPtr input) +xf86removeInputRef(XF86ConfLayoutPtr layout, XF86ConfInputPtr input) { XF86ConfInputrefPtr prev, iref = layout->lay_input_lst; @@ -131,7 +107,7 @@ xf86RemoveInputRef(XF86ConfLayoutPtr layout, XF86ConfInputPtr input) while (iref != NULL) { if (iref->iref_inputdev == input) { XtFree(iref->iref_inputdev_str); - xf86OptionListFree(iref->iref_option_lst); + xf86optionListFree(iref->iref_option_lst); if (prev == iref) layout->lay_input_lst = (XF86ConfInputrefPtr)(iref->list.next); @@ -149,7 +125,7 @@ xf86RemoveInputRef(XF86ConfLayoutPtr layout, XF86ConfInputPtr input) } int -xf86RemoveDevice(XF86ConfigPtr config, XF86ConfDevicePtr device) +xf86removeDevice(XF86ConfigPtr config, XF86ConfDevicePtr device) { XF86ConfDevicePtr prev, dev = config->conf_device_lst; XF86ConfScreenPtr psc, scr = config->conf_screen_lst; @@ -175,7 +151,7 @@ xf86RemoveDevice(XF86ConfigPtr config, XF86ConfDevicePtr device) psc = scr; while (scr != NULL) { if (scr->scrn_device == device) { - xf86RemoveScreen(config, scr); + xf86removeScreen(config, scr); if (scr == psc) scr = config->conf_screen_lst; else @@ -196,14 +172,14 @@ xf86RemoveDevice(XF86ConfigPtr config, XF86ConfDevicePtr device) XtFree(dev->dev_ramdac); XtFree(dev->dev_clockchip); XtFree(dev->dev_comment); - xf86OptionListFree(dev->dev_option_lst); + xf86optionListFree(dev->dev_option_lst); XtFree((XtPointer)dev); return (True); } int -xf86RemoveMonitor(XF86ConfigPtr config, XF86ConfMonitorPtr monitor) +xf86removeMonitor(XF86ConfigPtr config, XF86ConfMonitorPtr monitor) { XF86ConfMonitorPtr prev, mon = config->conf_monitor_lst; XF86ConfScreenPtr psc, scr = config->conf_screen_lst; @@ -229,7 +205,7 @@ xf86RemoveMonitor(XF86ConfigPtr config, XF86ConfMonitorPtr monitor) psc = scr; while (scr != NULL) { if (scr->scrn_monitor == monitor) { - xf86RemoveScreen(config, scr); + xf86removeScreen(config, scr); if (scr == psc) scr = config->conf_screen_lst; else @@ -244,14 +220,14 @@ xf86RemoveMonitor(XF86ConfigPtr config, XF86ConfMonitorPtr monitor) XtFree(mon->mon_vendor); XtFree(mon->mon_modelname); XtFree(mon->mon_comment); - xf86OptionListFree(mon->mon_option_lst); + xf86optionListFree(mon->mon_option_lst); XtFree((XtPointer)mon); return (True); } int -xf86RemoveScreen(XF86ConfigPtr config, XF86ConfScreenPtr screen) +xf86removeScreen(XF86ConfigPtr config, XF86ConfScreenPtr screen) { XF86ConfScreenPtr prev, scrn; XF86ConfLayoutPtr lay; @@ -338,14 +314,14 @@ xf86RemoveScreen(XF86ConfigPtr config, XF86ConfScreenPtr screen) XtFree(screen->scrn_obso_driver); XtFree(screen->scrn_monitor_str); XtFree(screen->scrn_device_str); - xf86OptionListFree(screen->scrn_option_lst); + xf86optionListFree(screen->scrn_option_lst); XtFree((XtPointer)screen); return (True); } int -xf86RemoveAdjacency(XF86ConfLayoutPtr layout, XF86ConfAdjacencyPtr adjacency) +xf86removeAdjacency(XF86ConfLayoutPtr layout, XF86ConfAdjacencyPtr adjacency) { XF86ConfAdjacencyPtr prev, adj = layout->lay_adjacency_lst; @@ -378,7 +354,7 @@ xf86RemoveAdjacency(XF86ConfLayoutPtr layout, XF86ConfAdjacencyPtr adjacency) } int -xf86RemoveInactive(XF86ConfLayoutPtr layout, XF86ConfInactivePtr inactive) +xf86removeInactive(XF86ConfLayoutPtr layout, XF86ConfInactivePtr inactive) { XF86ConfInactivePtr prev, inac = layout->lay_inactive_lst; @@ -406,7 +382,7 @@ xf86RemoveInactive(XF86ConfLayoutPtr layout, XF86ConfInactivePtr inactive) } int -xf86RemoveLayout(XF86ConfigPtr config, XF86ConfLayoutPtr layout) +xf86removeLayout(XF86ConfigPtr config, XF86ConfLayoutPtr layout) { XF86ConfLayoutPtr prev, lay = config->conf_layout_lst; XF86ConfAdjacencyPtr adj, nadj; @@ -430,25 +406,25 @@ xf86RemoveLayout(XF86ConfigPtr config, XF86ConfLayoutPtr layout) adj = lay->lay_adjacency_lst; while (adj != NULL) { nadj = (XF86ConfAdjacencyPtr)(adj->list.next); - xf86RemoveAdjacency(lay, adj); + xf86removeAdjacency(lay, adj); adj = nadj; } inac = lay->lay_inactive_lst; while (inac != NULL) { ninac = (XF86ConfInactivePtr)(inac->list.next); - xf86RemoveInactive(lay, inac); + xf86removeInactive(lay, inac); inac = ninac; } iref = lay->lay_input_lst; while (iref != NULL) { niref = (XF86ConfInputrefPtr)(iref->list.next); - xf86RemoveInputRef(lay, iref->iref_inputdev); + xf86removeInputRef(lay, iref->iref_inputdev); iref = niref; } - xf86OptionListFree(lay->lay_option_lst); + xf86optionListFree(lay->lay_option_lst); if (prev == lay) config->conf_layout_lst = (XF86ConfLayoutPtr)(lay->list.next); @@ -461,7 +437,7 @@ xf86RemoveLayout(XF86ConfigPtr config, XF86ConfLayoutPtr layout) } int -xf86RenameInput(XF86ConfigPtr config, XF86ConfInputPtr input, char *name) +xf86renameInput(XF86ConfigPtr config, XF86ConfInputPtr input, char *name) { XF86ConfLayoutPtr lay = config->conf_layout_lst; @@ -488,7 +464,7 @@ xf86RenameInput(XF86ConfigPtr config, XF86ConfInputPtr input, char *name) } int -xf86RenameDevice(XF86ConfigPtr config, XF86ConfDevicePtr dev, char *name) +xf86renameDevice(XF86ConfigPtr config, XF86ConfDevicePtr dev, char *name) { XF86ConfScreenPtr scr = config->conf_screen_lst; @@ -511,7 +487,7 @@ xf86RenameDevice(XF86ConfigPtr config, XF86ConfDevicePtr dev, char *name) } int -xf86RenameMonitor(XF86ConfigPtr config, XF86ConfMonitorPtr mon, char *name) +xf86renameMonitor(XF86ConfigPtr config, XF86ConfMonitorPtr mon, char *name) { XF86ConfScreenPtr scr = config->conf_screen_lst; @@ -534,7 +510,7 @@ xf86RenameMonitor(XF86ConfigPtr config, XF86ConfMonitorPtr mon, char *name) } int -xf86RenameLayout(XF86ConfigPtr config, XF86ConfLayoutPtr layout, char *name) +xf86renameLayout(XF86ConfigPtr config, XF86ConfLayoutPtr layout, char *name) { if (config == NULL || layout == NULL || name == NULL || *name == '\0') return (False); @@ -546,7 +522,7 @@ xf86RenameLayout(XF86ConfigPtr config, XF86ConfLayoutPtr layout, char *name) } int -xf86RenameScreen(XF86ConfigPtr config, XF86ConfScreenPtr scrn, char *name) +xf86renameScreen(XF86ConfigPtr config, XF86ConfScreenPtr scrn, char *name) { XF86ConfLayoutPtr lay = config->conf_layout_lst; diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.h b/xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.h index ee8747246..4392a53db 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.h +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.h @@ -26,44 +26,44 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.h,v 1.2 2000/05/18 16:30:01 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/xf86config.h,v 1.3 2000/10/20 14:59:08 alanh Exp $ */ #include "config.h" -#define xf86OptionListFree OptionListFree -#define xf86AddInput(head, ptr) \ - (XF86ConfInputPtr)addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) -#define xf86AddInputref(head, ptr) \ - (XF86ConfInputrefPtr)addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) -#define xf86AddDevice(head, ptr) \ - (XF86ConfDevicePtr)addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) -#define xf86AddMonitor(head, ptr) \ - (XF86ConfMonitorPtr)addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) -#define xf86AddScreen(head, ptr) \ - (XF86ConfScreenPtr)addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) -#define xf86AddLayout(head, ptr) \ - (XF86ConfLayoutPtr)addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) -#define xf86AddModeLine(head, ptr) \ - (XF86ConfModeLinePtr)addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) -#define xf86NewOption NewOption -#define xf86addNewOption addNewOption -#define xf86FindOption FindOption +#ifndef _xf86cfg_xf86config_h +#define _xf86cfg_xf86config_h -int ErrorF(const char*, ...); -int VErrorF(const char*, va_list); -int xf86RemoveOption(XF86OptionPtr*, char*); -int xf86RemoveInput(XF86ConfigPtr, XF86ConfInputPtr); -int xf86RemoveInputRef(XF86ConfLayoutPtr, XF86ConfInputPtr); -int xf86RemoveDevice(XF86ConfigPtr, XF86ConfDevicePtr); -int xf86RemoveMonitor(XF86ConfigPtr, XF86ConfMonitorPtr); -int xf86RemoveScreen(XF86ConfigPtr, XF86ConfScreenPtr); -int xf86RemoveAdjacency(XF86ConfLayoutPtr, XF86ConfAdjacencyPtr); -int xf86RemoveInactive(XF86ConfLayoutPtr, XF86ConfInactivePtr); -int xf86RemoveLayout(XF86ConfigPtr, XF86ConfLayoutPtr); +#define xf86addInput(head, ptr) \ + (XF86ConfInputPtr)xf86addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) +#define xf86addInputref(head, ptr) \ + (XF86ConfInputrefPtr)xf86addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) +#define xf86addDevice(head, ptr) \ + (XF86ConfDevicePtr)xf86addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) +#define xf86addMonitor(head, ptr) \ + (XF86ConfMonitorPtr)xf86addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) +#define xf86addScreen(head, ptr) \ + (XF86ConfScreenPtr)xf86addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) +#define xf86addLayout(head, ptr) \ + (XF86ConfLayoutPtr)xf86addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) +#define xf86addModeLine(head, ptr) \ + (XF86ConfModeLinePtr)xf86addListItem((GenericListPtr)(head), (GenericListPtr)(ptr)) + +int xf86removeOption(XF86OptionPtr*, char*); +int xf86removeInput(XF86ConfigPtr, XF86ConfInputPtr); +int xf86removeInputRef(XF86ConfLayoutPtr, XF86ConfInputPtr); +int xf86removeDevice(XF86ConfigPtr, XF86ConfDevicePtr); +int xf86removeMonitor(XF86ConfigPtr, XF86ConfMonitorPtr); +int xf86removeScreen(XF86ConfigPtr, XF86ConfScreenPtr); +int xf86removeAdjacency(XF86ConfLayoutPtr, XF86ConfAdjacencyPtr); +int xf86removeInactive(XF86ConfLayoutPtr, XF86ConfInactivePtr); +int xf86removeLayout(XF86ConfigPtr, XF86ConfLayoutPtr); + +int xf86renameInput(XF86ConfigPtr, XF86ConfInputPtr, char*); +int xf86renameDevice(XF86ConfigPtr, XF86ConfDevicePtr, char*); +int xf86renameMonitor(XF86ConfigPtr, XF86ConfMonitorPtr, char*); +int xf86renameLayout(XF86ConfigPtr, XF86ConfLayoutPtr, char*); +int xf86renameScreen(XF86ConfigPtr, XF86ConfScreenPtr, char*); + +#endif /* _xf86cfg_xf86config_h */ -int xf86RenameInput(XF86ConfigPtr, XF86ConfInputPtr, char*); -int xf86RenameDevice(XF86ConfigPtr, XF86ConfDevicePtr, char*); -int xf86RenameMonitor(XF86ConfigPtr, XF86ConfMonitorPtr, char*); -int xf86RenameLayout(XF86ConfigPtr, XF86ConfLayoutPtr, char*); -int xf86RenameScreen(XF86ConfigPtr, XF86ConfScreenPtr, char*); diff --git a/xc/programs/Xserver/hw/xwin/Imakefile b/xc/programs/Xserver/hw/xwin/Imakefile index 18743c54c..e8545a270 100644 --- a/xc/programs/Xserver/hw/xwin/Imakefile +++ b/xc/programs/Xserver/hw/xwin/Imakefile @@ -1,5 +1,5 @@ XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ -XCOMM $XFree86: xc/programs/Xserver/hw/xwin/Imakefile,v 1.1 2000/08/10 17:40:37 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xwin/Imakefile,v 1.2 2000/10/26 17:57:57 dawes Exp $ #include <Server.tmpl> #if HasShm @@ -18,9 +18,9 @@ OBJS1 = os2_stubs.o -SRCSA = InitInput.c InitOutput.c stubs.c miinitext.c directx.c ntux_xf.c +SRCSA = InitInput.c InitOutput.c stubs.c miinitext.c directx.c -OBJSA = InitInput.o InitOutput.o stubs.o miinitext.o directx.o ntux_xf.o +OBJSA = InitInput.o InitOutput.o stubs.o miinitext.o directx.o INCLUDES = -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ -I../../cfb -I../../mfb -I../../mi -I../../include -I../../os \ diff --git a/xc/programs/Xserver/render/miglyph.c b/xc/programs/Xserver/render/miglyph.c index 67c3164e5..cf408ea12 100644 --- a/xc/programs/Xserver/render/miglyph.c +++ b/xc/programs/Xserver/render/miglyph.c @@ -1,5 +1,5 @@ /* - * $XFree86$ + * $XFree86: xc/programs/Xserver/render/miglyph.c,v 1.3 2000/10/02 05:25:45 keithp Exp $ * * Copyright © 2000 SuSE, Inc. * @@ -59,7 +59,7 @@ miGlyphExtents (int nlist, x1 = x - glyph->info.x; if (x1 < MINSHORT) x1 = MINSHORT; - y1 = x - glyph->info.y; + y1 = y - glyph->info.y; if (y1 < MINSHORT) y1 = MINSHORT; x2 = x1 + glyph->info.width; @@ -227,5 +227,7 @@ miGlyphs (CARD8 op, 0, 0, x, y, width, height); + FreePicture ((pointer) pMask, (XID) 0); + (*pScreen->DestroyPixmap) (pMaskPixmap); } } diff --git a/xc/programs/Xserver/render/picture.c b/xc/programs/Xserver/render/picture.c index 5ea0cdaa1..2db742752 100644 --- a/xc/programs/Xserver/render/picture.c +++ b/xc/programs/Xserver/render/picture.c @@ -1,5 +1,5 @@ /* - * $XFree86: xc/programs/Xserver/render/picture.c,v 1.3 2000/08/30 18:00:41 keithp Exp $ + * $XFree86: xc/programs/Xserver/render/picture.c,v 1.8 2000/10/21 00:26:13 keithp Exp $ * * Copyright © 2000 SuSE, Inc. * @@ -226,11 +226,33 @@ PictureMatchVisual (ScreenPtr pScreen, int depth, VisualPtr pVisual) return 0; } +PictFormatPtr +PictureMatchFormat (ScreenPtr pScreen, int depth, CARD32 f) +{ + PictureScreenPtr ps = GetPictureScreen(pScreen); + PictFormatPtr format; + int nformat; + int type; + + if (!ps) + return 0; + format = ps->formats; + nformat = ps->nformats; + while (nformat--) + { + if (format->depth == depth && format->format == f & 0xffffff) + return format; + format++; + } + return 0; +} + Bool PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats) { PictureScreenPtr ps; int n; + CARD32 type, a, r, g, b; if (PictureGeneration != serverGeneration) { @@ -262,6 +284,27 @@ PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats) xfree (formats); return FALSE; } + if (formats[n].type == PictTypeIndexed) + { + type = PICT_TYPE_INDEX; + a = r = g = b = 0; + } + else + { + if ((formats[n].direct.redMask| + formats[n].direct.blueMask| + formats[n].direct.greenMask) == 0) + type = PICT_TYPE_A; + else if (formats[n].direct.red > formats[n].direct.blue) + type = PICT_TYPE_ARGB; + else + type = PICT_TYPE_ABGR; + a = Ones (formats[n].direct.alphaMask); + r = Ones (formats[n].direct.redMask); + g = Ones (formats[n].direct.greenMask); + b = Ones (formats[n].direct.blueMask); + } + formats[n].format = PICT_FORMAT(0,type,a,r,g,b); } ps = (PictureScreenPtr) xalloc (sizeof (PictureScreenRec)); if (!ps) @@ -372,6 +415,7 @@ CreatePicture (Picture pid, pPicture->id = pid; pPicture->pDrawable = pDrawable; pPicture->pFormat = pFormat; + pPicture->format = pFormat->format | (pDrawable->bitsPerPixel << 24); if (pDrawable->type == DRAWABLE_PIXMAP) { ++((PixmapPtr)pDrawable)->refcnt; @@ -636,8 +680,26 @@ FreePicture (pointer value, if (pPicture->alphaMap) FreePicture ((pointer) pPicture->alphaMap, (XID) 0); (*ps->DestroyPicture) (pPicture); - if (pPicture->pDrawable->type == DRAWABLE_PIXMAP) + if (pPicture->pDrawable->type == DRAWABLE_WINDOW) + { + WindowPtr pWindow = (WindowPtr) pPicture->pDrawable; + PicturePtr *pPrev; + + for (pPrev = (PicturePtr *) &((pWindow)->devPrivates[PictureWindowPrivateIndex].ptr); + *pPrev; + pPrev = &(*pPrev)->pNext) + { + if (*pPrev == pPicture) + { + *pPrev = pPicture->pNext; + break; + } + } + } + else if (pPicture->pDrawable->type == DRAWABLE_PIXMAP) + { (*pScreen->DestroyPixmap) ((PixmapPtr)pPicture->pDrawable); + } xfree (pPicture); } return Success; diff --git a/xc/programs/Xserver/render/picture.h b/xc/programs/Xserver/render/picture.h index 13afdd6cf..694526e95 100644 --- a/xc/programs/Xserver/render/picture.h +++ b/xc/programs/Xserver/render/picture.h @@ -1,5 +1,5 @@ /* - * $XFree86$ + * $XFree86: xc/programs/Xserver/render/picture.h,v 1.4 2000/10/07 05:58:18 keithp Exp $ * * Copyright © 2000 SuSE, Inc. * @@ -30,4 +30,75 @@ typedef struct _DirectFormat *DirectFormatPtr; typedef struct _PictFormat *PictFormatPtr; typedef struct _Picture *PicturePtr; +/* + * While the protocol is generous in format support, the + * sample implementation allows only packed RGB and GBR + * representations for data to simplify software rendering, + */ +#define PICT_FORMAT(bpp,type,a,r,g,b) (((bpp) << 24) | \ + ((type) << 16) | \ + ((a) << 12) | \ + ((r) << 8) | \ + ((g) << 4) | \ + ((b))) + +#define PICT_FORMAT_BPP(f) (((f) >> 24) ) +#define PICT_FORMAT_TYPE(f) (((f) >> 16) & 0xff) +#define PICT_FORMAT_A(f) (((f) >> 12) & 0x0f) +#define PICT_FORMAT_R(f) (((f) >> 8) & 0x0f) +#define PICT_FORMAT_G(f) (((f) >> 4) & 0x0f) +#define PICT_FORMAT_B(f) (((f) ) & 0x0f) + +#define PICT_OTHER 0 +#define PICT_TYPE_A 1 +#define PICT_TYPE_ARGB 2 +#define PICT_TYPE_ABGR 3 +#define PICT_TYPE_INDEX 4 + +#define PICT_FORMAT_COLOR(f) (PICT_FORMAT_TYPE(f) & 2) + +/* 32bpp formats */ +#define PICT_a8r8g8b8 PICT_FORMAT(32,PICT_TYPE_ARGB,8,8,8,8) +#define PICT_x8r8g8b8 PICT_FORMAT(32,PICT_TYPE_ARGB,0,8,8,8) +#define PICT_a8b8g8r8 PICT_FORMAT(32,PICT_TYPE_ABGR,8,8,8,8) +#define PICT_x8b8g8r8 PICT_FORMAT(32,PICT_TYPE_ABGR,0,8,8,8) + +/* 24bpp formats */ +#define PICT_r8g8b8 PICT_FORMAT(24,PICT_TYPE_ARGB,0,8,8,8) +#define PICT_b8g8r8 PICT_FORMAT(24,PICT_TYPE_ABGR,0,8,8,8) + +/* 16bpp formats */ +#define PICT_r5g6b5 PICT_FORMAT(16,PICT_TYPE_ARGB,0,5,6,5) +#define PICT_b5g6r5 PICT_FORMAT(16,PICT_TYPE_ABGR,0,5,6,5) + +#define PICT_a1r5g5b5 PICT_FORMAT(16,PICT_TYPE_ARGB,1,5,5,5) +#define PICT_x1r5g5b5 PICT_FORMAT(16,PICT_TYPE_ARGB,0,5,5,5) +#define PICT_a1b5g5r5 PICT_FORMAT(16,PICT_TYPE_ABGR,1,5,5,5) +#define PICT_x1b5g5r5 PICT_FORMAT(16,PICT_TYPE_ABGR,0,5,5,5) + +/* 8bpp formats */ +#define PICT_a8 PICT_FORMAT(8,PICT_TYPE_A,8,0,0,0) +#define PICT_r3g3b2 PICT_FORMAT(8,PICT_TYPE_ARGB,0,3,3,2) +#define PICT_b2g3r3 PICT_FORMAT(8,PICT_TYPE_ABGR,0,3,3,2) +#define PICT_a2r2g2b2 PICT_FORMAT(8,PICT_TYPE_ARGB,2,2,2,2) +#define PICT_a2b2g2r2 PICT_FORMAT(8,PICT_TYPE_ABGR,2,2,2,2) + +/* 4bpp formats */ +#define PICT_a4 PICT_FORMAT(4,PICT_TYPE_A,4,0,0,0) +#define PICT_r1g2b1 PICT_FORMAT(4,PICT_TYPE_ARGB,0,1,2,1) +#define PICT_b1g2r1 PICT_FORMAT(4,PICT_TYPE_ABGR,0,1,2,1) +#define PICT_a1r1g1b1 PICT_FORMAT(4,PICT_TYPE_ARGB,1,1,1,1) +#define PICT_a1b1g1r1 PICT_FORMAT(4,PICT_TYPE_ABGR,1,1,1,1) + +/* 1bpp formats */ +#define PICT_a1 PICT_FORMAT(1,PICT_TYPE_A,1,0,0,0) + +#define FixedToInt(f) (int) ((f) >> 8) +#define IntToFixed(i) ((Fixed) (i) << 8) +#define FixedE ((Fixed) 1) +#define Fixed1 (IntToFixed(1)) +#define Fixed1minusE (Fixed1 - FixedE) +#define FixedCeil(f) (((f) + Fixed1minusE) & ~Fixed1MinusE) +#define FixedFloor(f) ((f) & ~Fixed1MinusE) + #endif /* _PICTURE_H_ */ diff --git a/xc/programs/Xserver/render/picturestr.h b/xc/programs/Xserver/render/picturestr.h index 98506c094..b40eaa15b 100644 --- a/xc/programs/Xserver/render/picturestr.h +++ b/xc/programs/Xserver/render/picturestr.h @@ -1,5 +1,5 @@ /* - * $XFree86$ + * $XFree86: xc/programs/Xserver/render/picturestr.h,v 1.6 2000/10/11 23:55:33 tsi Exp $ * * Copyright © 2000 SuSE, Inc. * @@ -39,7 +39,8 @@ typedef struct _DirectFormat { } DirectFormatRec; typedef struct _PictFormat { - unsigned long id; + CARD32 id; + CARD32 format; /* except bpp */ unsigned char type; unsigned char depth; DirectFormatRec direct; @@ -49,6 +50,7 @@ typedef struct _PictFormat { typedef struct _Picture { DrawablePtr pDrawable; PictFormatPtr pFormat; + CARD32 format; /* PICT_FORMAT */ int refcnt; CARD32 id; PicturePtr pNext; /* chain on same drawable */ @@ -169,7 +171,7 @@ Bool PictureDestroyWindow (WindowPtr pWindow); Bool -PictureCloseScreen (int index, ScreenPtr pScreen); +PictureCloseScreen (int Index, ScreenPtr pScreen); PictFormatPtr PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp); @@ -177,6 +179,9 @@ PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp); PictFormatPtr PictureMatchVisual (ScreenPtr pScreen, int depth, VisualPtr pVisual); +PictFormatPtr +PictureMatchFormat (ScreenPtr pScreen, int depth, CARD32 format); + Bool PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats); @@ -214,11 +219,6 @@ int FreePictFormat (pointer pPictFormat, XID pid); -int -FreeGlyphSet (pointer pGlyphset, - XID gid); - - void CompositePicture (CARD8 op, PicturePtr pSrc, diff --git a/xc/programs/Xserver/render/render.c b/xc/programs/Xserver/render/render.c index ee09a3cbf..0e037b9c0 100644 --- a/xc/programs/Xserver/render/render.c +++ b/xc/programs/Xserver/render/render.c @@ -1,5 +1,5 @@ /* - * $XFree86$ + * $XFree86: xc/programs/Xserver/render/render.c,v 1.5 2000/10/13 02:51:03 keithp Exp $ * * Copyright © 2000 SuSE, Inc. * @@ -294,7 +294,6 @@ ProcRenderQueryPictFormats (ClientPtr client) for (s = 0; s < screenInfo.numScreens; s++) { pScreen = screenInfo.screens[s]; - ps = GetPictureScreen(pScreen); pictDepth = (xPictDepth *) (pictScreen + 1); ndepth = 0; for (d = 0; d < pScreen->numDepths; d++) @@ -331,7 +330,11 @@ ProcRenderQueryPictFormats (ClientPtr client) pictDepth = (xPictDepth *) pictVisual; } pictScreen->nDepth = ndepth; - pictScreen->fallback = ps->fallback->id; + ps = GetPictureScreen(pScreen); + if (ps) + pictScreen->fallback = ps->fallback->id; + else + pictScreen->fallback = 0; if (client->swapped) { swapl (&pictScreen->nDepth, n); |