diff -u xc/xc/programs/Xserver/hw/xfree86/drivers/trident/Imakefile:1.1.1.10 xc/xc/programs/Xserver/hw/xfree86/drivers/trident/Imakefile:1.1.1.10.22.1 --- xc/xc/programs/Xserver/hw/xfree86/drivers/trident/Imakefile:1.1.1.10 Mon Mar 19 09:45:50 2001 +++ xc/xc/programs/Xserver/hw/xfree86/drivers/trident/Imakefile Mon Mar 18 11:31:00 2002 @@ -6,14 +6,23 @@ #define IHaveModules #include +#if BuildXF86DRI +DRISRCS = trident_dri.c +DRIOBJS = trident_dri.o +DRIINCLUDES = -I$(SERVERSRC)/GL/dri -I$(LIBSRC)/GL/dri -I$(TOP)/include + +DRIDEFINES = $(GLX_DEFINES) +#endif + + SRCS = trident_driver.c trident_dac.c tridenthelper.c \ trident_accel.c trident_i2c.c trident_bank.c \ image_accel.c blade_accel.c tvga_dac.c trident_dga.c \ - trident_shadow.c trident_video.c + trident_shadow.c trident_video.c xp_accel.c $(DRISRCS) OBJS = trident_driver.o trident_dac.o tridenthelper.o \ trident_accel.o trident_i2c.o trident_bank.o \ image_accel.o blade_accel.o tvga_dac.o trident_dga.o \ - trident_shadow.o trident_video.o + trident_shadow.o trident_video.o xp_accel.o $(DRIOBJS) #if defined(XF86DriverSDK) INCLUDES = -I. -I../../include @@ -27,9 +36,11 @@ -I$(XF86SRC)/rac -I$(XF86SRC)/int10 \ -I$(XF86SRC)/ddc -I$(XF86SRC)/i2c \ -I$(FONTINCSRC) -I$(SERVERSRC)/include -I$(XINCLUDESRC) \ - -I$(XTOP)/include/extensions -I$(XF86OSSRC)/vbe + -I$(EXTINCSRC) -I$(XF86OSSRC)/vbe $(DRIINCLUDES) #endif +DEFINES = $(DRIDEFINES) + #if MakeHasPosixVariableSubstitutions SubdirLibraryRule($(OBJS)) #endif Index: xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident.h diff -u xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident.h:1.1.1.17 xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident.h:1.1.1.17.10.1 --- xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident.h:1.1.1.17 Sun Jan 27 10:22:51 2002 +++ xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident.h Mon Mar 18 11:31:00 2002 @@ -36,6 +36,21 @@ #include "shadowfb.h" #include "shadow.h" #include "xf86xv.h" +#include "xf86Pci.h" +#ifdef XF86DRI +#include "xf86drm.h" +#include "sarea.h" +#define _XF86DRI_SERVER_ +#include "xf86dri.h" +#include "dri.h" +#include "GL/glxint.h" +#include "trident_dri.h" +#include "trident_dripriv.h" +#endif + +#define TRIDENT_MAJOR_VERSION 1 +#define TRIDENT_MINOR_VERSION 0 +#define TRIDENT_PATCHLEVEL 0 typedef struct { unsigned char tridentRegs3x4[0x100]; @@ -64,6 +79,7 @@ unsigned char * IOBase; unsigned char * FbBase; long FbMapSize; + IOADDRESS PIOBase; Bool NoAccel; Bool HWCursor; Bool UsePCIRetry; @@ -149,6 +165,15 @@ int OverrideRskew; OptionInfoPtr Options; Bool shadowNew; +#ifdef XF86DRI + Bool directRenderingEnabled; + DRIInfoPtr pDRIInfo; + int drmSubFD; + int numVisualConfigs; + __GLXvisualConfig* pVisualConfigs; + TRIDENTConfigPrivPtr pVisualConfigsPriv; + TRIDENTRegRec DRContextRegs; +#endif } TRIDENTRec, *TRIDENTPtr; typedef struct { @@ -275,8 +300,7 @@ CYBERBLADEAI1, CYBERBLADEAI1D, CYBERBLADEE4, - CYBERBLADEXPm8, - CYBERBLADEXPm16, + BLADEXP, CYBERBLADEXPAI1 } TRIDENTType; @@ -288,7 +312,9 @@ (xf86IsPrimaryIsa())) #define HAS_DST_TRANS ((pTrident->Chipset == PROVIDIA9682) || \ - (pTrident->Chipset == PROVIDIA9685)) + (pTrident->Chipset == PROVIDIA9685) || \ + (pTrident->Chipset == BLADEXP) || \ + (pTrident->Chipset == CYBERBLADEXPAI1)) #define Is3Dchip ((pTrident->Chipset == CYBER9397) || \ (pTrident->Chipset == CYBER9397DVD) || \ @@ -305,8 +331,7 @@ (pTrident->Chipset == CYBERBLADEAI1D) || \ (pTrident->Chipset == BLADE3D) || \ (pTrident->Chipset == CYBERBLADEXPAI1) || \ - (pTrident->Chipset == CYBERBLADEXPm8) || \ - (pTrident->Chipset == CYBERBLADEXPm16)) + (pTrident->Chipset == BLADEXP)) /* * Trident DAC's Index: xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dac.c diff -u xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dac.c:1.1.1.17 xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dac.c:1.1.1.17.10.2 --- xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dac.c:1.1.1.17 Sun Jan 27 10:22:51 2002 +++ xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dac.c Tue Jun 4 08:24:10 2002 @@ -191,7 +191,6 @@ vgaHWPtr hwp = VGAHWPTR(pScrn); vgaRegPtr regp = &hwp->ModeReg; vgaRegPtr vgaReg = &hwp->ModeReg; - vgaHWGetIOBase(VGAHWPTR(pScrn)); vgaIOBase = VGAHWPTR(pScrn)->IOBase; /* Unprotect */ @@ -397,7 +396,7 @@ pReg->tridentRegs3x4[PreEndFetch] = INB(vgaIOBase + 5); #endif /* set mode */ - if (pTrident->Chipset < CYBERBLADEXPm8) { + if (pTrident->Chipset < BLADEXP) { pReg->tridentRegs3CE[BiosMode] = TridentFindMode( pScrn->currentMode->HDisplay, pScrn->currentMode->VDisplay, @@ -429,8 +428,7 @@ /* Enable Chipset specific options */ switch (pTrident->Chipset) { case CYBERBLADEXPAI1: - case CYBERBLADEXPm8: - case CYBERBLADEXPm16: + case BLADEXP: case CYBERBLADEI7: case CYBERBLADEI7D: case CYBERBLADEI1: @@ -572,8 +570,7 @@ OUTB(vgaIOBase+ 4, Performance); pReg->tridentRegs3x4[Performance] = INB(vgaIOBase + 5); - - if (pTrident->Chipset < CYBERBLADEXPm8) + if (pTrident->Chipset < BLADEXP) pReg->tridentRegs3x4[Performance] |= 0x10; OUTB(vgaIOBase+ 4, DRAMControl); @@ -640,7 +637,6 @@ TRIDENTPtr pTrident = TRIDENTPTR(pScrn); CARD8 temp; int vgaIOBase; - vgaHWGetIOBase(VGAHWPTR(pScrn)); vgaIOBase = VGAHWPTR(pScrn)->IOBase; if (pTrident->Chipset > PROVIDIA9685) { @@ -697,7 +693,7 @@ OUTW_3CE(VertStretch); OUTW_3CE(HorStretch); - if (pTrident->Chipset < CYBERBLADEXPm8) { + if (pTrident->Chipset < BLADEXP) { OUTW_3CE(BiosMode); } else { OUTW_3CE(BiosNewMode1); @@ -773,7 +769,6 @@ TRIDENTPtr pTrident = TRIDENTPTR(pScrn); CARD8 temp; int vgaIOBase; - vgaHWGetIOBase(VGAHWPTR(pScrn)); vgaIOBase = VGAHWPTR(pScrn)->IOBase; /* Goto New Mode */ @@ -886,7 +881,6 @@ { TRIDENTPtr pTrident = TRIDENTPTR(pScrn); int vgaIOBase; - vgaHWGetIOBase(VGAHWPTR(pScrn)); vgaIOBase = VGAHWPTR(pScrn)->IOBase; /* 64x64 */ @@ -897,7 +891,6 @@ TridentHideCursor(ScrnInfoPtr pScrn) { int vgaIOBase; TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - vgaHWGetIOBase(VGAHWPTR(pScrn)); vgaIOBase = VGAHWPTR(pScrn)->IOBase; OUTW(vgaIOBase + 4, 0x4150); @@ -908,7 +901,6 @@ { int vgaIOBase; TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - vgaHWGetIOBase(VGAHWPTR(pScrn)); vgaIOBase = VGAHWPTR(pScrn)->IOBase; if (x < 0) { @@ -934,7 +926,6 @@ { int vgaIOBase; TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - vgaHWGetIOBase(VGAHWPTR(pScrn)); vgaIOBase = VGAHWPTR(pScrn)->IOBase; OUTW(vgaIOBase + 4, (fg & 0x000000FF)<<8 | 0x48); OUTW(vgaIOBase + 4, (fg & 0x0000FF00) | 0x49); @@ -954,7 +945,6 @@ { TRIDENTPtr pTrident = TRIDENTPTR(pScrn); int vgaIOBase; - vgaHWGetIOBase(VGAHWPTR(pScrn)); vgaIOBase = VGAHWPTR(pScrn)->IOBase; memcpy((CARD8 *)pTrident->FbBase + (pScrn->videoRam * 1024) - 4096, @@ -997,7 +987,8 @@ infoPtr->Flags = HARDWARE_CURSOR_BIT_ORDER_MSBFIRST | HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK | HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32 | - ((pTrident->Chipset == CYBERBLADEE4) ? + ((pTrident->Chipset == CYBERBLADEE4 || + pTrident->Chipset == CYBERBLADEXPAI1) ? HARDWARE_CURSOR_TRUECOLOR_AT_8BPP : 0); infoPtr->SetCursorColors = TridentSetCursorColors; infoPtr->SetCursorPosition = TridentSetCursorPosition; Index: xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dri.c diff -u /dev/null xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dri.c:1.1.2.2 --- /dev/null Sat Jan 1 19:13:19 2005 +++ xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dri.c Tue Jun 4 08:24:12 2002 @@ -0,0 +1,681 @@ +/* + * Copyright 2002 by Alan Hourihane, Sychdyn, North Wales. + * + * 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 + * 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 + * "as is" without express or implied warranty. + * + * ALAN HOURIHANE 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 + * 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. + * + * Author: Alan Hourihane, alanh@fairlite.demon.co.uk + */ + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86_ansic.h" +#include "xf86Priv.h" +#include "xf86PciInfo.h" +#include "xf86Pci.h" +#include "fb.h" +#include "miline.h" +#include "GL/glxtokens.h" +#include "trident.h" +#include "trident_dri.h" +#include "trident_dripriv.h" + +static char TRIDENTKernelDriverName[] = "trident_dri"; +static char TRIDENTClientDriverName[] = "trident"; + +static Bool TRIDENTCreateContext(ScreenPtr pScreen, VisualPtr visual, + drmContext hwContext, void *pVisualConfigPriv, + DRIContextType contextStore); +static void TRIDENTDestroyContext(ScreenPtr pScreen, drmContext hwContext, + DRIContextType contextStore); +static void TRIDENTDRISwapContext(ScreenPtr pScreen, DRISyncType syncType, + DRIContextType readContextType, + void *readContextStore, + DRIContextType writeContextType, + void *writeContextStore); +static Bool TRIDENTDRIOpenFullScreen(ScreenPtr pScreen); +static Bool TRIDENTDRICloseFullScreen(ScreenPtr pScreen); +static void TRIDENTDRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index); +static void TRIDENTDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, + RegionPtr prgnSrc, CARD32 index); +static void TRIDENTDRITransitionTo2d(ScreenPtr pScreen); +static void TRIDENTDRITransitionTo3d(ScreenPtr pScreen); + +static Bool +TRIDENTInitVisualConfigs(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + int numConfigs = 0; + __GLXvisualConfig *pConfigs = 0; + TRIDENTConfigPrivPtr pTRIDENTConfigs = 0; + TRIDENTConfigPrivPtr *pTRIDENTConfigPtrs = 0; + int i, db, stencil, accum, depth; + + switch (pScrn->bitsPerPixel) { + case 8: + case 16: + numConfigs = 16; + + if (!(pConfigs = (__GLXvisualConfig*)xcalloc(sizeof(__GLXvisualConfig), + numConfigs))) { + return FALSE; + } + if (!(pTRIDENTConfigs = (TRIDENTConfigPrivPtr)xcalloc(sizeof(TRIDENTConfigPrivRec), + numConfigs))) { + xfree(pConfigs); + return FALSE; + } + if (!(pTRIDENTConfigPtrs = (TRIDENTConfigPrivPtr*)xcalloc(sizeof(TRIDENTConfigPrivPtr), + numConfigs))) { + xfree(pConfigs); + xfree(pTRIDENTConfigs); + return FALSE; + } + for (i=0; icpp>2) + pConfigs[i].depthSize = 24; + else +#endif + pConfigs[i].depthSize = 16; + } else { + pConfigs[i].depthSize = 0; + } + if (stencil) + pConfigs[i].stencilSize = 8; + else + pConfigs[i].stencilSize = 0; + pConfigs[i].auxBuffers = 0; + pConfigs[i].level = 0; + if (stencil || accum) + pConfigs[i].visualRating = GLX_SLOW_VISUAL_EXT; + else + pConfigs[i].visualRating = GLX_NONE_EXT; + pConfigs[i].transparentPixel = 0; + pConfigs[i].transparentRed = 0; + pConfigs[i].transparentGreen = 0; + pConfigs[i].transparentBlue = 0; + pConfigs[i].transparentAlpha = 0; + pConfigs[i].transparentIndex = 0; + i++; + } + } + } + } + if (i!=numConfigs) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] TRIDENTInitVisualConfigs: wrong number of visuals\n"); + return FALSE; + } + break; /* 16bpp */ + + case 24: + case 32: + numConfigs = 8; + + pConfigs = (__GLXvisualConfig*) xcalloc(sizeof(__GLXvisualConfig), numConfigs); + if (!pConfigs) + return FALSE; + + pTRIDENTConfigs = (TRIDENTConfigPrivPtr) xcalloc(sizeof(TRIDENTConfigPrivRec), numConfigs); + if (!pTRIDENTConfigs) { + xfree(pConfigs); + return FALSE; + } + + pTRIDENTConfigPtrs = (TRIDENTConfigPrivPtr *) xcalloc(sizeof(TRIDENTConfigPrivPtr), numConfigs); + if (!pTRIDENTConfigPtrs) { + xfree(pConfigs); + xfree(pTRIDENTConfigs); + return FALSE; + } + + for (i = 0; i < numConfigs; i++) + pTRIDENTConfigPtrs[i] = &pTRIDENTConfigs[i]; + + i=0; + for (db = 0; db <=1; db++) { + for (depth = 0; depth<=1; depth++) { + /*stencil = depth;*/ /* Z and stencil share the same memory */ + for (accum = 0; accum <= 1; accum++) { + /*for (stencil = 0; stencil <=1; stencil++) {*/ + stencil = depth; + pConfigs[i].vid = -1; + pConfigs[i].class = -1; + pConfigs[i].rgba = TRUE; + pConfigs[i].redSize = 8; + pConfigs[i].greenSize = 8; + pConfigs[i].blueSize = 8; + pConfigs[i].alphaSize = (pScrn->bitsPerPixel==32) ? 8 : 0; + pConfigs[i].redMask = 0x00ff0000; + pConfigs[i].greenMask = 0x0000ff00; + pConfigs[i].blueMask = 0x000000ff; + pConfigs[i].alphaMask = (pScrn->bitsPerPixel==32) ? 0xff000000 : 0; + if (accum) { + pConfigs[i].accumRedSize = 16; + pConfigs[i].accumGreenSize = 16; + pConfigs[i].accumBlueSize = 16; + pConfigs[i].accumAlphaSize = (pScrn->bitsPerPixel==32) ? 16 : 0; + } else { + pConfigs[i].accumRedSize = 0; + pConfigs[i].accumGreenSize = 0; + pConfigs[i].accumBlueSize = 0; + pConfigs[i].accumAlphaSize = 0; + } + if (db) + pConfigs[i].doubleBuffer = TRUE; + else + pConfigs[i].doubleBuffer = FALSE; + pConfigs[i].stereo = FALSE; + pConfigs[i].bufferSize = 16; + if (depth) { +#if 0 + if (p->cpp > 2) + pConfigs[i].depthSize = 24; + else +#endif + pConfigs[i].depthSize = 16; + } else { + pConfigs[i].depthSize = 0; + } + if (stencil) + pConfigs[i].stencilSize = 8; + else + pConfigs[i].stencilSize = 0; + pConfigs[i].auxBuffers = 0; + pConfigs[i].level = 0; + if (accum) + pConfigs[i].visualRating = GLX_SLOW_VISUAL_EXT; + else + pConfigs[i].visualRating = GLX_NONE_EXT; + pConfigs[i].transparentPixel = 0; + pConfigs[i].transparentRed = 0; + pConfigs[i].transparentGreen = 0; + pConfigs[i].transparentBlue = 0; + pConfigs[i].transparentAlpha = 0; + pConfigs[i].transparentIndex = 0; + i++; + /*}*/ + } + } + } + if (i!=numConfigs) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] TRIDENTInitVisualConfigs: wrong number of visuals\n"); + return FALSE; + } + break; + } + pTrident->numVisualConfigs = numConfigs; + pTrident->pVisualConfigs = pConfigs; + pTrident->pVisualConfigsPriv = pTRIDENTConfigs; + GlxSetVisualConfigs(numConfigs, pConfigs, (void**)pTRIDENTConfigPtrs); + return TRUE; +} + +static void +TRIDENTDoWakeupHandler(int screenNum, pointer wakeupData, unsigned long result, + pointer pReadmask) +{ + ScreenPtr pScreen = screenInfo.screens[screenNum]; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + +#if 0 + TridentNeedSync(pScrn); +#endif +} + +static void +TRIDENTDoBlockHandler(int screenNum, pointer blockData, pointer pTimeout, + pointer pReadmask) +{ + ScreenPtr pScreen = screenInfo.screens[screenNum]; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + +#if 0 + TDFXCheckSync(pScrn); +#endif +} + +Bool TRIDENTDRIScreenInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + DRIInfoPtr pDRIInfo; + TRIDENTDRIPtr pTridentDRI; + Bool bppOk = FALSE; + +#if 0 + switch (pScrn->bitsPerPixel) { + case 16: + bppOk = TRUE; + break; + case 32: + if (pTrident->ChipType > PCI_CHIP_VOODOO3) { + bppOk = TRUE; + } + break; + } + if (!bppOk) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] trident DRI not supported in %d bpp mode, disabling DRI.\n", + (pScrn->bitsPerPixel)); + if (prident->ChipType <= PCI_CHIP_VOODOO3) { + xf86DrvMsg(pScreen->myNum, X_INFO, + "[dri] To use DRI, invoke the server using 16 bpp\n" + "\t(-depth 15 or -depth 16).\n"); + } else { + xf86DrvMsg(pScreen->myNum, X_INFO, + "[dri] To use DRI, invoke the server using 16 bpp\n" + "\t(-depth 15 or -depth 16) or 32 bpp (-depth 24 -fbbpp 32).\n"); + } + return FALSE; + } +#endif + + /* Check that the GLX, DRI, and DRM modules have been loaded by testing + for canonical symbols in each module. */ + if (!xf86LoaderCheckSymbol("GlxSetVisualConfigs")) return FALSE; + if (!xf86LoaderCheckSymbol("DRIScreenInit")) return FALSE; + if (!xf86LoaderCheckSymbol("drmAvailable")) return FALSE; + if (!xf86LoaderCheckSymbol("DRIQueryVersion")) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "TRIDENTDRIScreenInit failed (libdri.a too old)\n"); + return FALSE; + } + + /* Check the DRI version */ + { + int major, minor, patch; + DRIQueryVersion(&major, &minor, &patch); + if (major != 4 || minor < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] TRIDENTDRIScreenInit failed because of a version mismatch.\n" + "[dri] libDRI version is %d.%d.%d but version 4.0.x is needed.\n" + "[dri] Disabling the DRI.\n", + major, minor, patch); + return FALSE; + } + } + + pDRIInfo = DRICreateInfoRec(); + if (!pDRIInfo) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] DRICreateInfoRect() failed, disabling DRI.\n"); + return FALSE; + } + + pTrident->pDRIInfo = pDRIInfo; + + pDRIInfo->drmDriverName = TRIDENTKernelDriverName; + pDRIInfo->clientDriverName = TRIDENTClientDriverName; + pDRIInfo->busIdString = xalloc(64); + sprintf(pDRIInfo->busIdString, "PCI:%d:%d:%d", + ((pciConfigPtr)pTrident->PciInfo->thisCard)->busnum, + ((pciConfigPtr)pTrident->PciInfo->thisCard)->devnum, + ((pciConfigPtr)pTrident->PciInfo->thisCard)->funcnum); + pDRIInfo->ddxDriverMajorVersion = TRIDENT_MAJOR_VERSION; + pDRIInfo->ddxDriverMinorVersion = TRIDENT_MINOR_VERSION; + pDRIInfo->ddxDriverPatchVersion = TRIDENT_PATCHLEVEL; + pDRIInfo->frameBufferPhysicalAddress = pTrident->FbAddress; + pDRIInfo->frameBufferSize = pScrn->displayWidth * pScrn->bitsPerPixel / 8 * pScrn->virtualY; + pDRIInfo->frameBufferStride = pScrn->displayWidth; + pDRIInfo->ddxDrawableTableEntry = TRIDENT_MAX_DRAWABLES; + + pDRIInfo->wrap.ValidateTree = 0; + pDRIInfo->wrap.PostValidateTree = 0; + pDRIInfo->wrap.BlockHandler = TRIDENTDoBlockHandler; + pDRIInfo->wrap.WakeupHandler = TRIDENTDoWakeupHandler; + + if (SAREA_MAX_DRAWABLES < TRIDENT_MAX_DRAWABLES) + pDRIInfo->maxDrawableTableEntry = SAREA_MAX_DRAWABLES; + else + pDRIInfo->maxDrawableTableEntry = TRIDENT_MAX_DRAWABLES; + +#ifdef NOT_DONE + /* FIXME need to extend DRI protocol to pass this size back to client + * for SAREA mapping that includes a device private record + */ + pDRIInfo->SAREASize = + ((sizeof(XF86DRISAREARec) + 0xfff) & 0x1000); /* round to page */ + /* + shared memory device private rec */ +#else + /* For now the mapping works by using a fixed size defined + * in the SAREA header + */ + if (sizeof(XF86DRISAREARec)/*+sizeof(TRIDENTSAREAPriv)*/>SAREA_MAX) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "Data does not fit in SAREA\n"); + return FALSE; + } + pDRIInfo->SAREASize = SAREA_MAX; +#endif + + if (!(pTridentDRI = (TRIDENTDRIPtr)xcalloc(sizeof(TRIDENTDRIRec),1))) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] DRI memory allocation failed, disabling DRI.\n"); + DRIDestroyInfoRec(pTrident->pDRIInfo); + pTrident->pDRIInfo=0; + return FALSE; + } + pDRIInfo->devPrivate = pTridentDRI; + pDRIInfo->devPrivateSize = sizeof(TRIDENTDRIRec); + pDRIInfo->contextSize = sizeof(TRIDENTDRIContextRec); + + pDRIInfo->CreateContext = TRIDENTCreateContext; + pDRIInfo->DestroyContext = TRIDENTDestroyContext; + pDRIInfo->SwapContext = TRIDENTDRISwapContext; + pDRIInfo->InitBuffers = TRIDENTDRIInitBuffers; + pDRIInfo->MoveBuffers = TRIDENTDRIMoveBuffers; + pDRIInfo->OpenFullScreen = TRIDENTDRIOpenFullScreen; + pDRIInfo->CloseFullScreen = TRIDENTDRICloseFullScreen; +#if 0 + pDRIInfo->TransitionTo2d = TRIDENTDRITransitionTo2d; + pDRIInfo->TransitionTo3d = TRIDENTDRITransitionTo3d; +#endif + pDRIInfo->bufferRequests = DRI_ALL_WINDOWS; + + pDRIInfo->createDummyCtx = FALSE; + pDRIInfo->createDummyCtxPriv = FALSE; + + if (!DRIScreenInit(pScreen, pDRIInfo, &pTrident->drmSubFD)) { + xfree(pDRIInfo->devPrivate); + pDRIInfo->devPrivate=0; + DRIDestroyInfoRec(pTrident->pDRIInfo); + pTrident->pDRIInfo=0; + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] DRIScreenInit failed, disabling DRI.\n"); + + return FALSE; + } + + /* Check the Trident DRM version */ + { + drmVersionPtr version = drmGetVersion(pTrident->drmSubFD); + if (version) { + if (version->version_major != 1 || + version->version_minor < 0) { + /* incompatible drm version */ + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] TRIDENTDRIScreenInit failed because of a version mismatch.\n" + "[dri] trident.o kernel module version is %d.%d.%d but version 1.0.x is needed.\n" + "[dri] Disabling the DRI.\n", + version->version_major, + version->version_minor, + version->version_patchlevel); + TRIDENTDRICloseScreen(pScreen); + drmFreeVersion(version); + return FALSE; + } + drmFreeVersion(version); + } + } + + if (drmAddMap(pTrident->drmSubFD, (drmHandle)pTrident->IOAddress, + 0x20000, DRM_REGISTERS, 0, &pTridentDRI->regs)<0) { + TRIDENTDRICloseScreen(pScreen); + xf86DrvMsg(pScreen->myNum, X_ERROR, "drmAddMap failed, disabling DRI.\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Registers = 0x%08lx\n", + pTridentDRI->regs); + + if (!(TRIDENTInitVisualConfigs(pScreen))) { + TRIDENTDRICloseScreen(pScreen); + xf86DrvMsg(pScreen->myNum, X_ERROR, "TRIDENTInitVisualConfigs failed, disabling DRI.\n"); + return FALSE; + } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "visual configs initialized\n" ); + + pTridentDRI->backOffset = pScrn->videoRam * 1024 - + ((pScrn->displayWidth * pScrn->bitsPerPixel / 8 * pScrn->virtualY) * 2) - 4096; + pTridentDRI->backPitch = pScrn->displayWidth; + + pTridentDRI->depthOffset = pScrn->videoRam * 1024 - + (pScrn->displayWidth * pScrn->bitsPerPixel / 8 * pScrn->virtualY) - 4096; + pTridentDRI->depthPitch = pScrn->displayWidth; + + return TRUE; +} + +void +TRIDENTDRICloseScreen(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + + DRICloseScreen(pScreen); + + if (pTrident->pDRIInfo) { + if (pTrident->pDRIInfo->devPrivate) { + xfree(pTrident->pDRIInfo->devPrivate); + pTrident->pDRIInfo->devPrivate=0; + } + DRIDestroyInfoRec(pTrident->pDRIInfo); + pTrident->pDRIInfo=0; + } + if (pTrident->pVisualConfigs) xfree(pTrident->pVisualConfigs); + if (pTrident->pVisualConfigsPriv) xfree(pTrident->pVisualConfigsPriv); +} + +static Bool +TRIDENTCreateContext(ScreenPtr pScreen, VisualPtr visual, + drmContext hwContext, void *pVisualConfigPriv, + DRIContextType contextStore) +{ + return TRUE; +} + +static void +TRIDENTDestroyContext(ScreenPtr pScreen, drmContext hwContext, + DRIContextType contextStore) +{ +} + +Bool +TRIDENTDRIFinishScreenInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + TRIDENTDRIPtr pTridentDRI; + FBAreaPtr fbarea; + int width_bytes = pScrn->displayWidth * pScrn->bitsPerPixel / 8; + + pTrident->pDRIInfo->driverSwapMethod = DRI_HIDE_X_CONTEXT; + + pTridentDRI=(TRIDENTDRIPtr)pTrident->pDRIInfo->devPrivate; + + pTridentDRI->deviceID=pTrident->PciInfo->chipType; + pTridentDRI->frontOffset = 0; + pTridentDRI->frontPitch = pScrn->displayWidth; + pTridentDRI->width=pScrn->virtualX; + pTridentDRI->height=pScrn->virtualY; + pTridentDRI->mem=pScrn->videoRam*1024; + pTridentDRI->cpp = pScrn->bitsPerPixel / 8; + + pTridentDRI->sarea_priv_offset = sizeof(XF86DRISAREARec); + + return DRIFinishScreenInit(pScreen); +} + +static void +TRIDENTDRISwapContext(ScreenPtr pScreen, DRISyncType syncType, + DRIContextType oldContextType, void *oldContext, + DRIContextType newContextType, void *newContext) +{ +} + +static void +TRIDENTDRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index) +{ + ScreenPtr pScreen = pWin->drawable.pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + BoxPtr pbox; + int nbox; + + /* It looks nicer if these start out black */ + pbox = REGION_RECTS(prgn); + nbox = REGION_NUM_RECTS(prgn); + +#if 0 + TridentSetupForSolidFill(pScrn, 0, GXcopy, -1); + while (nbox--) { + TDFXSelectBuffer(pTDFX, TDFX_BACK); + TDFXSubsequentSolidFillRect(pScrn, pbox->x1, pbox->y1, + pbox->x2-pbox->x1, pbox->y2-pbox->y1); + TDFXSelectBuffer(pTDFX, TDFX_DEPTH); + TDFXSubsequentSolidFillRect(pScrn, pbox->x1, pbox->y1, + pbox->x2-pbox->x1, pbox->y2-pbox->y1); + pbox++; + } + TRIDENTSelectBuffer(pTrident, TRIDENT_FRONT); +#endif + + pTrident->AccelInfoRec->NeedToSync = TRUE; +} + +static void +TRIDENTDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, + RegionPtr prgnSrc, CARD32 index) +{ + ScreenPtr pScreen = pParent->drawable.pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + int dx, dy, xdir, ydir, i, x, y, nbox; + BoxPtr pbox; + + dx = pParent->drawable.x - ptOldOrg.x; + dy = pParent->drawable.y - ptOldOrg.y; + + DRIMoveBuffersHelper(pScreen, dx, dy, &xdir, &ydir, prgnSrc); + + pbox = REGION_RECTS(prgnSrc); + nbox = REGION_NUM_RECTS(prgnSrc); + +#if 0 + TDFXSetupForScreenToScreenCopy(pScrn, xdir, ydir, GXcopy, ~0, -1); + + TDFXSelectBuffer(pTDFX, TDFX_BACK); + for(i = 0; i < nbox; i++) { + x = pbox[i].x1; + y = pbox[i].y1; + TDFXSubsequentScreenToScreenCopy(pScrn, x, y, x+dx, y+dy, + pbox[i].x2 - x, pbox[i].y2 - y); + } + + TDFXSelectBuffer(pTDFX, TDFX_DEPTH); + for(i = 0; i < nbox; i++) { + x = pbox[i].x1; + y = pbox[i].y1; + TDFXSubsequentScreenToScreenCopy(pScrn, x, y, x+dx, y+dy, + pbox[i].x2 - x, pbox[i].y2 - y); + } + + TDFXSelectBuffer(pTDFX, TDFX_FRONT); +#endif + + pTrident->AccelInfoRec->NeedToSync = TRUE; +} + +static Bool +TRIDENTDRIOpenFullScreen(ScreenPtr pScreen) +{ + return TRUE; +} + +static Bool +TRIDENTDRICloseFullScreen(ScreenPtr pScreen) +{ + return TRUE; +} + +#if 0 +static void +TDFXDRITransitionTo2d(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + TDFXPtr pTDFX = TDFXPTR(pScrn); + + xf86FreeOffscreenArea(pTDFX->reservedArea); +} + +static void +TDFXDRITransitionTo3d(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + TDFXPtr pTDFX = TDFXPTR(pScrn); + FBAreaPtr pArea; + + if(pTDFX->overlayBuffer) { + xf86FreeOffscreenLinear(pTDFX->overlayBuffer); + pTDFX->overlayBuffer = NULL; + } + + if(pTDFX->textureBuffer) { + xf86FreeOffscreenArea(pTDFX->textureBuffer); + pTDFX->textureBuffer = NULL; + } + + xf86PurgeUnlockedOffscreenAreas(pScreen); + + pArea = xf86AllocateOffscreenArea(pScreen, pScrn->displayWidth, + pTDFX->pixmapCacheLinesMin, + pScrn->displayWidth, NULL, NULL, NULL); + pTDFX->reservedArea = xf86AllocateOffscreenArea(pScreen, pScrn->displayWidth, + pTDFX->pixmapCacheLinesMax - pTDFX->pixmapCacheLinesMin, + pScrn->displayWidth, NULL, NULL, NULL); + xf86FreeOffscreenArea(pArea); +} +#endif Index: xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dri.h diff -u /dev/null xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dri.h:1.1.2.1 --- /dev/null Sat Jan 1 19:13:19 2005 +++ xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dri.h Tue Jun 4 08:24:55 2002 @@ -0,0 +1,28 @@ +#ifndef _TRIDENT_DRI_ +#define _TRIDENT_DRI_ + +#include "xf86drm.h" + +typedef struct { + drmHandle regs; + drmSize regsSize; + drmAddress regsMap; + int deviceID; + int width; + int height; + int mem; + int frontOffset; + int frontPitch; + int backOffset; + int backPitch; + int depthOffset; + int depthPitch; + int cpp; +#if 0 + int textureOffset; + int textureSize; +#endif + unsigned int sarea_priv_offset; +} TRIDENTDRIRec, *TRIDENTDRIPtr; + +#endif Index: xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dripriv.h diff -u /dev/null xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dripriv.h:1.1.2.1 --- /dev/null Sat Jan 1 19:13:19 2005 +++ xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_dripriv.h Tue Jun 4 08:24:55 2002 @@ -0,0 +1,22 @@ +#ifndef _TRIDENT_DRIPRIV_H_ +#define _TRIDENT_DRIPRIV_H_ + +#define TRIDENT_MAX_DRAWABLES 256 + +extern void GlxSetVisualConfigs( + int nconfigs, + __GLXvisualConfig *configs, + void **configprivs +); + +typedef struct { + /* Nothing here yet */ + int dummy; +} TRIDENTConfigPrivRec, *TRIDENTConfigPrivPtr; + +typedef struct { + /* Nothing here yet */ + int dummy; +} TRIDENTDRIContextRec, *TRIDENTDRIContextPtr; + +#endif Index: xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_driver.c diff -u xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_driver.c:1.1.1.18 xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_driver.c:1.1.1.18.10.1 --- xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_driver.c:1.1.1.18 Sun Jan 27 10:22:51 2002 +++ xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_driver.c Mon Mar 18 11:31:01 2002 @@ -113,9 +113,6 @@ #define VERSION 4000 #define TRIDENT_NAME "TRIDENT" #define TRIDENT_DRIVER_NAME "trident" -#define TRIDENT_MAJOR_VERSION 1 -#define TRIDENT_MINOR_VERSION 0 -#define TRIDENT_PATCHLEVEL 0 /* * This contains the functions needed by the server after loading the driver @@ -166,8 +163,7 @@ { CYBERBLADEI1D, "cyberbladei1d" }, { CYBERBLADEAI1, "cyberbladeAi1" }, { CYBERBLADEAI1D, "cyberbladeAi1d" }, - { CYBERBLADEXPm8, "cyberbladeXPm/8" }, - { CYBERBLADEXPm16, "cyberbladeXPm/16" }, + { BLADEXP, "bladeXP" }, { CYBERBLADEXPAI1, "cyberbladeXPAi1" }, { -1, NULL } }; @@ -209,8 +205,7 @@ { CYBERBLADEI1D, PCI_CHIP_8520, RES_SHARED_VGA }, { CYBERBLADEAI1, PCI_CHIP_8600, RES_SHARED_VGA }, { CYBERBLADEAI1D, PCI_CHIP_8620, RES_SHARED_VGA }, - { CYBERBLADEXPm8, PCI_CHIP_9910, RES_SHARED_VGA }, - { CYBERBLADEXPm16, PCI_CHIP_9930, RES_SHARED_VGA }, + { BLADEXP, PCI_CHIP_9910, RES_SHARED_VGA }, { CYBERBLADEXPAI1, PCI_CHIP_8820, RES_SHARED_VGA }, { -1, -1, RES_UNDEFINED } }; @@ -697,15 +692,15 @@ black. I'm sure there's a better way to do that, just lazy to search the docs. */ -#if 1 - hwp->writeDacWriteAddr(hwp, 0x00); - hwp->writeDacData(hwp, 0x00); hwp->writeDacData(hwp, 0x00); hwp->writeDacData(hwp, 0x00); - hwp->writeDacWriteAddr(hwp, 0x3F); - hwp->writeDacData(hwp, 0x3F); hwp->writeDacData(hwp, 0x3F); hwp->writeDacData(hwp, 0x3F); -#else - outb(0x3C8, 0x00); outb(0x3C9, 0x00); outb(0x3C9, 0x00); outb(0x3C9, 0x00); - outb(0x3C8, 0x3F); outb(0x3C9, 0x3F); outb(0x3C9, 0x3F); outb(0x3C9, 0x3F); -#endif + (*hwp->writeDacWriteAddr)(hwp, 0x00); + (*hwp->writeDacData)(hwp, 0x00); + (*hwp->writeDacData)(hwp, 0x00); + (*hwp->writeDacData)(hwp, 0x00); + + (*hwp->writeDacWriteAddr)(hwp, 0x3F); + (*hwp->writeDacData)(hwp, 0x3F); + (*hwp->writeDacData)(hwp, 0x3F); + (*hwp->writeDacData)(hwp, 0x3F); } Bool @@ -1006,9 +1001,17 @@ static int * GetAccelPitchValues(ScrnInfoPtr pScrn) { + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); int *linePitches = NULL; int lines[4] = { 512, 1024, 2048, 4096 }; /* 9440AGi */ int i, n = 0; + + if (pTrident->Chipset >= BLADEXP) { + lines[0] = 1024; + lines[1] = 2048; + lines[2] = 4096; + lines[3] = 8192; + } for (i = 0; i < 4; i++) { n++; @@ -1040,6 +1043,7 @@ TRIDENTPreInit(ScrnInfoPtr pScrn, int flags) { TRIDENTPtr pTrident; + vgaHWPtr hwp; MessageType from; CARD8 videoram, videorammask; char *ramtype = NULL, *chipset = NULL; @@ -1156,8 +1160,10 @@ if (!vgaHWGetHWRec(pScrn)) return FALSE; - vgaHWGetIOBase(VGAHWPTR(pScrn)); - vgaIOBase = VGAHWPTR(pScrn)->IOBase; + hwp = VGAHWPTR(pScrn); + vgaHWGetIOBase(hwp); + vgaIOBase = hwp->IOBase; + pTrident->PIOBase = hwp->PIOOffset; xf86SetOperatingState(RES_SHARED_VGA, pTrident->pEnt->index, ResUnusedOpr); @@ -1852,36 +1858,37 @@ pTrident->NewClockCode = TRUE; pTrident->frequency = NTSC; break; - case CYBERBLADEXPm8: + case BLADEXP: /* 0x9910 */ pTrident->ddc1Read = Tridentddc1Read; ramtype = "SGRAM"; pTrident->HasSGRAM = TRUE; - pTrident->NoAccel = TRUE; /* Disable acceleration */ - pTrident->HWCursor = FALSE; - pTrident->IsCyber = TRUE; Support24bpp = TRUE; - chipset = "CyberBladeXPm/8"; - pTrident->NewClockCode = TRUE; - pTrident->frequency = NTSC; - break; - case CYBERBLADEXPm16: - pTrident->ddc1Read = Tridentddc1Read; - ramtype = "SGRAM"; - pTrident->HasSGRAM = TRUE; - pTrident->NoAccel = TRUE; /* Disable acceleration */ - pTrident->HWCursor = FALSE; - pTrident->IsCyber = TRUE; - Support24bpp = TRUE; - chipset = "CyberBladeXPm/16"; pTrident->NewClockCode = TRUE; pTrident->frequency = NTSC; + OUTB(0x3C4, 0x5D); + if (pTrident->PciInfo->subsysVendor != 0x1023) { + chipset = "CyberBladeXP"; + pTrident->IsCyber = TRUE; + } else + if (!(INB(0x3C5) & 0x01)) { + chipset = "BladeXP"; + } else { + CARD8 mem1, mem2; + OUTB(vgaIOBase + 0x04, SPR); + mem1 = INB(vgaIOBase + 5); + OUTB(vgaIOBase + 0x04, 0xC1); + mem2 = INB(vgaIOBase + 5); + if ((mem1 & 0x0e) && (mem2 == 0x11)) { + chipset = "BladeT64"; + } else { + chipset = "BladeT16"; + } + } break; case CYBERBLADEXPAI1: pTrident->ddc1Read = Tridentddc1Read; ramtype = "SGRAM"; pTrident->HasSGRAM = TRUE; - pTrident->NoAccel = TRUE; /* Disable acceleration */ - pTrident->HWCursor = FALSE; pTrident->IsCyber = TRUE; pTrident->shadowNew = TRUE; Support24bpp = TRUE; @@ -1932,17 +1939,6 @@ pScrn->videoRam = pTrident->pEnt->device->videoRam; from = X_CONFIG; } else { - if (pTrident->Chipset == CYBERBLADEXPAI1) { - pScrn->videoRam = 16384; /* NOTE: I have no idea what the real - * value is. BIOS takes about 20M RAM - * for its own and vid RAM */ - } else - if (pTrident->Chipset == CYBERBLADEXPm8) { - pScrn->videoRam = 8192; - } else - if (pTrident->Chipset == CYBERBLADEXPm16) { - pScrn->videoRam = 16384; - } else if (pTrident->Chipset == CYBER9525DVD) { pScrn->videoRam = 2560; } else @@ -1954,31 +1950,53 @@ else videorammask = 0x0F; switch (videoram & videorammask) { - case 0x01: - pScrn->videoRam = 512; - break; - case 0x03: - pScrn->videoRam = 1024; - break; - case 0x04: /* 8MB, but - hw cursor can't store above 4MB */ - /* So, we force to 4MB for now */ - /* pScrn->videoRam = 8192; */ - /* Apparantly this isn't true for the CYBER9397DVD */ - /* maybe some other chipsets aren't affected either */ - /* XXX this needs to be investigated further */ - if (pTrident->HWCursor && (pTrident->Chipset != CYBER9397DVD)) { - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Found 8MB board, using 4MB\n"); - pScrn->videoRam = 4096; - } else - pScrn->videoRam = 8192; - break; - case 0x07: - pScrn->videoRam = 2048; - break; - case 0x0F: - pScrn->videoRam = 4096; - break; + case 0x01: + pScrn->videoRam = 512; + break; + case 0x02: /* XP */ + pScrn->videoRam = 6144; + break; + case 0x03: + pScrn->videoRam = 1024; + break; + case 0x04: + pScrn->videoRam = 8192; + break; + case 0x06: /* XP */ + pScrn->videoRam = 10240; + break; + case 0x07: + pScrn->videoRam = 2048; + break; + case 0x08: /* XP */ + pScrn->videoRam = 12288; + break; + case 0x0A: /* XP */ + pScrn->videoRam = 14336; + break; + case 0x0C: /* XP */ + pScrn->videoRam = 16384; + break; + case 0x0E: /* XP */ + OUTB(vgaIOBase + 4, 0xC1); + switch (INB(vgaIOBase + 5)) { + case 0x00: + pScrn->videoRam = 20480; + break; + case 0x01: + pScrn->videoRam = 24576; + break; + case 0x10: + pScrn->videoRam = 28672; + break; + case 0x11: + pScrn->videoRam = 32768; + break; + } + break; + case 0x0F: + pScrn->videoRam = 4096; + break; default: pScrn->videoRam = 1024; xf86DrvMsg(pScrn->scrnIndex, from, @@ -2109,7 +2127,7 @@ } /* Select valid modes from those available */ - if (pTrident->NoAccel || Is3Dchip) { + if (pTrident->NoAccel || Is3Dchip /*(Is3Dchip && pTrident->Chipset < BLADEXP)*/) { /* * XXX Assuming min pitch 256, max 4096 * XXX Assuming min height 128, max 4096 @@ -2251,6 +2269,7 @@ switch (pScrn->displayWidth * pScrn->bitsPerPixel / 8) { case 512: + case 8192: pTrident->EngineOperation |= 0x00; break; case 1024: @@ -2315,8 +2334,8 @@ pTrident->IOBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pTrident->PciTag, pTrident->IOAddress, mapsize); else { - pTrident->IOBase = xf86MapVidMem(pScrn->scrnIndex, VIDMEM_MMIO, - pTrident->IOAddress, 0x1000); + pTrident->IOBase = xf86MapDomainMemory(pScrn->scrnIndex, VIDMEM_MMIO, + pTrident->PciTag, pTrident->IOAddress, 0x1000); pTrident->IOBase += 0xF00; } @@ -2436,8 +2455,7 @@ case CYBERBLADEE4: case CYBER9397: case CYBER9397DVD: - case CYBERBLADEXPm8: - case CYBERBLADEXPm16: + case BLADEXP: case CYBERBLADEXPAI1: /* Get ready for MUX mode */ if (pTrident->MUX && @@ -2598,7 +2616,6 @@ vgaHWSetMmioFuncs(hwp, pTrident->IOBase, 0); } - vgaHWGetIOBase(hwp); vgaIOBase = VGAHWPTR(pScrn)->IOBase; /* Save the current state */ @@ -2669,6 +2686,8 @@ FBStart = pTrident->FbBase; } + pTrident->directRenderingEnabled = TRIDENTDRIScreenInit(pScreen); + /* * Call the framebuffer layer's ScreenInit function, and fill in other * pScreen fields. @@ -2776,6 +2795,9 @@ (pTrident->Chipset == BLADE3D)) BladeAccelInit(pScreen); else + if (pTrident->Chipset >= BLADEXP) + XPAccelInit(pScreen); + else ImageAccelInit(pScreen); } else { TridentAccelInit(pScreen); @@ -2825,6 +2847,9 @@ xf86DPMSInit(pScreen, (DPMSSetProcPtr)TRIDENTDisplayPowerManagementSet, 0); + if (pTrident->directRenderingEnabled) + pTrident->directRenderingEnabled = TRIDENTDRIFinishScreenInit(pScreen); + pScrn->memPhysBase = pTrident->FbAddress; pScrn->fbOffset = 0; @@ -3056,9 +3081,9 @@ static void TRIDENTEnableMMIO(ScrnInfoPtr pScrn) { - int vgaIOBase = VGAHWPTR(pScrn)->IOBase; - CARD8 temp = 0; TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + IOADDRESS vgaIOBase = pTrident->PIOBase + VGAHWPTR(pScrn)->IOBase; + CARD8 temp = 0; /* * Skip MMIO Enable in PC-9821 PCI Trident Card!! @@ -3068,14 +3093,17 @@ return; /* Goto New Mode */ - outb(0x3C4, 0x0B); inb(0x3C5); + outb(pTrident->PIOBase + 0x3C4, 0x0B); + inb(pTrident->PIOBase + 0x3C5); /* Unprotect registers */ - outb(0x3C4, NewMode1); temp = inb(0x3C5); - outb(0x3C5, 0x80); + outb(pTrident->PIOBase + 0x3C4, NewMode1); + temp = inb(pTrident->PIOBase + 0x3C5); + outb(pTrident->PIOBase + 0x3C5, 0x80); /* Enable MMIO */ - outb(vgaIOBase + 4, PCIReg); pTrident->REGPCIReg = inb(vgaIOBase + 5); + outb(vgaIOBase + 4, PCIReg); + pTrident->REGPCIReg = inb(vgaIOBase + 5); outb(vgaIOBase + 5, pTrident->REGPCIReg | 0x01); /* Enable it */ /* Protect registers */ @@ -3110,9 +3138,10 @@ OUTB(vgaIOBase + 5, pTrident->REGPCIReg & 0xFE); /* Protect registers */ - outb(0x3C4, NewMode1); - outb(0x3C5, temp); + outb(pTrident->PIOBase + 0x3C4, NewMode1); + outb(pTrident->PIOBase + 0x3C5, temp); } + /* Initialize VGA Block for Trident Chip on PC-98x1 */ static void PC98TRIDENTInit(ScrnInfoPtr pScrn) Index: xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_regs.h diff -u xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_regs.h:1.1.1.11 xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_regs.h:1.1.1.11.10.2 --- xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_regs.h:1.1.1.11 Sun Jan 27 10:22:51 2002 +++ xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_regs.h Tue Jun 4 08:24:12 2002 @@ -143,6 +143,7 @@ #define GE_NOP 0x00 /* No Operation */ #define GE_BLT 0x01 /* BitBLT ROP3 only */ #define GE_BLT_ROP4 0x02 /* BitBLT ROP4 (96xx only) */ +#define XP_BLOCKWRITE 0x02 /* BlockWrite (XP only) */ #define GE_SCANLINE 0x03 /* Scan Line */ #define GE_BRESLINE 0x04 /* Bresenham Line */ #define GE_SHVECTOR 0x05 /* Short Vector */ @@ -196,6 +197,7 @@ /* Defines for BLADE Graphics Engine */ #define BLADE_GE_STATUS 0x2120 +#define BLADE_XP_GER_OPERMODE 0x2125 #define REPLICATE(r) \ { \ @@ -218,10 +220,21 @@ } \ } +#define XP_CHECKCLIPPING \ + if (pTrident->Clipping) { \ + pTrident->Clipping = FALSE; \ + if (pTrident->Chipset < PROVIDIA9682) { \ + XP_SRCCLIP_XY(0,0); \ + XP_DSTCLIP_XY(4095,4095); \ + } \ + } + /* Merge XY */ #define XY_MERGE(x,y) \ ((((CARD32)(y)&0xFFFF) << 16) | ((CARD32)(x) & 0xffff)) +#define XP_XY_MERGE(y,x) \ + ((((CARD32)(y)&0xFFFF) << 16) | ((CARD32)(x) & 0xffff)) #define TRIDENT_WRITE_REG(v,r) \ MMIO_OUT32(pTrident->IOBase,(r),(v)) @@ -234,7 +247,7 @@ if (IsPciCard && UseMMIO) { \ MMIO_OUT8(pTrident->IOBase, addr, data); \ } else { \ - outb(addr, data); \ + outb(pTrident->PIOBase + (addr), data); \ } \ } #define OUTW(addr, data) \ @@ -242,10 +255,15 @@ if (IsPciCard && UseMMIO) { \ MMIO_OUT16(pTrident->IOBase, addr, data); \ } else { \ - outw(addr, data); \ + outw(pTrident->PIOBase + (addr), data); \ } \ } -#define INB(addr) ((IsPciCard && UseMMIO) ? MMIO_IN8(pTrident->IOBase, addr) : inb(addr)) +#define INB(addr) \ +( \ + (IsPciCard && UseMMIO) ? \ + MMIO_IN8(pTrident->IOBase, addr) : \ + inb(pTrident->PIOBase + (addr)) \ +) #define OUTW_3C4(reg) \ OUTW(0x3C4, (tridentReg->tridentRegs3C4[reg])<<8 | (reg)) @@ -284,6 +302,8 @@ MMIO_OUT8(pTrident->IOBase, OLDGER_STATUS, (c)) #define TGUI_OPERMODE(c) \ MMIO_OUT16(pTrident->IOBase, GER_OPERMODE, (c)) +#define BLADE_XP_OPERMODE(c) \ + MMIO_OUT8(pTrident->IOBase, BLADE_XP_GER_OPERMODE, (c)) /* XXX */ #define OLDTGUI_OPERMODE(c) \ { \ @@ -317,14 +337,20 @@ MMIO_OUT8(pTrident->IOBase, OLDGER_BMIX, (c)) #define TGUI_DIM_XY(w,h) \ MMIO_OUT32(pTrident->IOBase, GER_DIM_XY, XY_MERGE((w)-1,(h)-1)) +#define XP_DIM_XY(w,h) \ + MMIO_OUT32(pTrident->IOBase, GER_DIM_XY, XY_MERGE((h),(w))) #define TGUI_STYLE(c) \ MMIO_OUT32(pTrident->IOBase, GER_STYLE, (c)) #define OLDTGUI_DIMXY(w,h) \ MMIO_OUT32(pTrident->IOBase, OLDGER_DIMXY, XY_MERGE((w)-1,(h)-1)) #define TGUI_SRC_XY(x,y) \ MMIO_OUT32(pTrident->IOBase, GER_SRC_XY, XY_MERGE(x,y)) +#define XP_SRC_XY(x,y) \ + MMIO_OUT32(pTrident->IOBase, GER_SRC_XY, XP_XY_MERGE(x,y)) #define TGUI_DEST_XY(x,y) \ MMIO_OUT32(pTrident->IOBase, GER_DEST_XY, XY_MERGE(x,y)) +#define XP_DEST_XY(x,y) \ + MMIO_OUT32(pTrident->IOBase, GER_DEST_XY, XP_XY_MERGE(x,y)) #define OLDTGUI_DESTXY(x,y) \ MMIO_OUT32(pTrident->IOBase, OLDGER_DESTXY, XY_MERGE(x,y)) #define OLDTGUI_DESTLINEAR(c) \ @@ -333,6 +359,10 @@ MMIO_OUT32(pTrident->IOBase, GER_SRCCLIP_XY, XY_MERGE(x,y)) #define TGUI_DSTCLIP_XY(x,y) \ MMIO_OUT32(pTrident->IOBase, GER_DSTCLIP_XY, XY_MERGE(x,y)) +#define XP_SRCCLIP_XY(x,y) \ + MMIO_OUT32(pTrident->IOBase, GER_SRCCLIP_XY, XP_XY_MERGE(x,y)) +#define XP_DSTCLIP_XY(x,y) \ + MMIO_OUT32(pTrident->IOBase, GER_DSTCLIP_XY, XP_XY_MERGE(x,y)) #define TGUI_PATLOC(addr) \ MMIO_OUT16(pTrident->IOBase, GER_PATLOC, (addr)) #define TGUI_CKEY(c) \ Index: xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_video.c diff -u xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_video.c:1.1.1.4 xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_video.c:1.1.1.4.10.1 --- xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_video.c:1.1.1.4 Sun Jan 27 10:22:51 2002 +++ xc/xc/programs/Xserver/hw/xfree86/drivers/trident/trident_video.c Mon Mar 18 11:31:01 2002 @@ -245,7 +245,7 @@ if (pTrident->Chipset >= CYBER9397) { OUTW(vgaIOBase + 4, 0x80B9); OUTW(0x3C4, 0xC057); - OUTW(0x3C4, 0x3421); + OUTW(0x3C4, 0x3420); OUTW(0x3C4, 0x3037); } else { if (pTrident->Chipset >= PROVIDIA9682) { @@ -258,7 +258,7 @@ } } - if (pTrident->Chipset >= CYBERBLADEXPm8) { + if (pTrident->Chipset >= BLADEXP) { OUTW(0x3C4, 0x007A); OUTW(0x3C4, 0x007D); } @@ -1356,6 +1356,8 @@ pTrident->hsync = (HTotal - HSyncStart) + 23 + h_off; pTrident->vsync = (VTotal - VSyncStart) - 2 + v_off; + pTrident->hsync_rskew = 0; + pTrident->vsync_bskew = 0; /* * HACK !! As awful as this is, it appears to be the only way....Sigh! @@ -1378,8 +1380,7 @@ case PROVIDIA9685: /* Spot on */ break; - case CYBERBLADEXPm8: - case CYBERBLADEXPm16: + case BLADEXP: case CYBERBLADEXPAI1: pTrident->hsync -= 15; pTrident->hsync_rskew = 3;