diff options
author | dawes <dawes> | 2002-01-27 20:05:18 +0000 |
---|---|---|
committer | dawes <dawes> | 2002-01-27 20:05:18 +0000 |
commit | f7787b09d1e998f570fcfa08b0ff6975884d7f74 (patch) | |
tree | f925e7a5a7300e3c5c81f3310b950ba9f4e95832 | |
parent | e8d8bfaa15bc076156b2fe087a6b9e162c49cd24 (diff) |
First pass merge of XFree86 4.2.0 import.
345 files changed, 16147 insertions, 14914 deletions
diff --git a/xc/config/cf/FreeBSD.cf b/xc/config/cf/FreeBSD.cf index 330cc507c..64c96a048 100644 --- a/xc/config/cf/FreeBSD.cf +++ b/xc/config/cf/FreeBSD.cf @@ -2,7 +2,7 @@ XCOMM platform: $Xorg: FreeBSD.cf,v 1.3 2000/08/17 19:41:45 cpqbld Exp $ XCOMM XCOMM XCOMM -XCOMM platform: $XFree86: xc/config/cf/FreeBSD.cf,v 3.110 2001/08/16 14:33:44 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/FreeBSD.cf,v 3.112 2002/01/03 16:33:49 tsi Exp $ #ifndef UseElfFormat #define UseElfFormat DefaultToElfFormat diff --git a/xc/config/cf/Imake.rules b/xc/config/cf/Imake.rules index 935652ed2..8a7ee00c3 100644 --- a/xc/config/cf/Imake.rules +++ b/xc/config/cf/Imake.rules @@ -5,7 +5,7 @@ XCOMM XCOMM XCOMM XCOMM -XCOMM rules: $XFree86: xc/config/cf/Imake.rules,v 3.100 2001/08/09 20:34:05 dawes Exp $ +XCOMM rules: $XFree86: xc/config/cf/Imake.rules,v 3.102 2001/12/17 20:00:37 dawes Exp $ /* * MACHINE-INDEPENDENT RULES; DO NOT MODIFY @@ -1222,7 +1222,7 @@ InstallNamedTarget(install.man,file.$(MANNEWSUFFIX),$(INSTMANFLAGS),destdir,dest InstallHtmlManPageAliases(file,aliases,$(MANSUFFIX)) @@\ @@\ install.man:: @@\ - @(TMP=#tmp.$$$$; \ @@\ + @(TMP="#tmp.$$$$"; \ @@\ RemoveFile($${TMP}); \ @@\ echo .so `basename destdir`/file.$(MANSUFFIX) > $${TMP}; \ @@\ for i in aliases; do (set -x; \ @@\ @@ -1257,7 +1257,7 @@ install.man:: file.$(MANNEWSUFFIX) @@\ InstallHtmlManPageAliases(file,aliases,suffix) @@\ @@\ install.man:: @@\ - @(TMP=#tmp.$$$$; \ @@\ + @(TMP="#tmp.$$$$"; \ @@\ RemoveFile($${TMP}); \ @@\ echo .so `basename destdir`/file.suffix > $${TMP}; \ @@\ for i in aliases; do (set -x; \ @@\ diff --git a/xc/config/cf/Imake.tmpl b/xc/config/cf/Imake.tmpl index 33483fa2c..5c0226904 100644 --- a/xc/config/cf/Imake.tmpl +++ b/xc/config/cf/Imake.tmpl @@ -5,7 +5,7 @@ XCOMM XCOMM XCOMM XCOMM -XCOMM $XFree86: xc/config/cf/Imake.tmpl,v 3.105 2001/08/06 20:51:00 dawes Exp $ +XCOMM $XFree86: xc/config/cf/Imake.tmpl,v 3.116 2002/01/15 21:22:33 keithp Exp $ XCOMM ---------------------------------------------------------------------- /* @@ -210,6 +210,14 @@ XCOMM the platform-specific parameters - edit site.def to change #define BuildRman YES #endif +#ifndef HasGperf +#define HasGperf NO +#endif + +#ifndef GperfCmd +#define GperfCmd gperf +#endif + #ifndef RmanCmd #if BuildRman #ifdef UseInstalled /* assume BINDIR in path */ @@ -339,6 +347,9 @@ XCOMM the platform-specific parameters - edit site.def to change #define HasVFork YES #endif #endif +#ifndef HasSetProcTitle +#define HasSetProcTitle NO +#endif #ifndef HasSetUserContext #define HasSetUserContext NO #endif @@ -390,7 +401,7 @@ XCOMM the platform-specific parameters - edit site.def to change #define ByteOrder X_LITTLE_ENDIAN #elif defined(ia64Architecture) #define ByteOrder X_LITTLE_ENDIAN -#elif defined(SparcArchitecture) +#elif defined(SparcArchitecture) || defined(Sparc64Architecture) #define ByteOrder X_BIG_ENDIAN #elif defined(AlphaArchitecture) #define ByteOrder X_LITTLE_ENDIAN @@ -408,6 +419,8 @@ XCOMM the platform-specific parameters - edit site.def to change #define ByteOrder X_LITTLE_ENDIAN #elif defined(PpcArchitecture) #define ByteOrder X_BIG_ENDIAN +#elif defined(HPArchitecture) +#define ByteOrder X_BIG_ENDIAN #elif defined(SuperHArchitecture) #define ByteOrder X_LITTLE_ENDIAN #elif defined(SuperHebArchitecture) @@ -458,6 +471,9 @@ XCOMM the platform-specific parameters - edit site.def to change #ifndef HasZlib #define HasZlib NO #endif +#ifndef OsNeedZlibHeaders +#define OsNeedZlibHeaders !HasZlib +#endif #if !HasZlib /* if OS doesn't have it, we'll build it */ #undef GzipLibrary /* GzipLibrary was valid only if HasZlib */ #endif @@ -624,6 +640,17 @@ TCLIBDIR = TclLibDir #define TclLibrary #endif #endif +/* + * Libtool has two different behaviours for version numbers. + * On platforms which support a minor number, the library + * version is (version - minor).minor, on those that don't, + * the version if version.0. Linux and Darwin support minor + * numbers; some BSDs do as well. Set this to YES if libtool + * uses minor numbers on your platform. + */ +#ifndef LibtoolMinorVersions +#define LibtoolMinorVersions NO +#endif #ifndef NeedConstPrototypes #define NeedConstPrototypes NO #endif @@ -650,6 +677,10 @@ TCLIBDIR = TclLibDir #define UseGccMakeDepend NO #endif +#ifndef CaseSensitiveFileSystem +#define CaseSensitiveFileSystem YES +#endif + /* DefaultUsrBin is independent of ProjectRoot. This is a directory where programs will be found even if PATH is not set, for example when coming in remotely via rsh. */ @@ -755,6 +786,9 @@ TCLIBDIR = TclLibDir #ifndef DriverManDir #define DriverManDir $(MANSOURCEPATH)$(DRIVERMANSUFFIX) #endif +#ifndef AppLoadDefs +#define AppLoadDefs -D__apploaddir__=$(XAPPLOADDIR) +#endif #ifndef FileManDefs #define FileManDefs -D__filemansuffix__=$(FILEMANSUFFIX) #endif @@ -1544,7 +1578,7 @@ INSTALLED_INCLUDES = -I$(INCROOT) DRIVERMANSUFFIX = DriverManSuffix /* suffix for driver man pages */ MANSRCSUFFIX = ManSrcSuffix /* suffix for man page source */ MANNEWSUFFIX = ManNewSuffix /* suffix for preprocessed man source */ - MANDEFS = FileManDefs MiscManDefs DriverManDefs ProjectManDefs $(XORGMANDEFS) $(VENDORMANDEFS) + MANDEFS = AppLoadDefs FileManDefs MiscManDefs DriverManDefs ProjectManDefs $(XORGMANDEFS) $(VENDORMANDEFS) COMPRESSMANCMD = CompressManCmd diff --git a/xc/config/cf/Imakefile b/xc/config/cf/Imakefile index f3aeac4a2..dc909850e 100644 --- a/xc/config/cf/Imakefile +++ b/xc/config/cf/Imakefile @@ -1,5 +1,5 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:41:46 cpqbld Exp $ -XCOMM $XFree86: xc/config/cf/Imakefile,v 3.26 2001/01/17 16:22:30 dawes Exp $ +XCOMM $XFree86: xc/config/cf/Imakefile,v 3.27 2001/08/27 17:40:55 dawes Exp $ XCOMM Some compilers generate fatal errors if an -L directory does XCOMM not exist. Since BUILDLIBDIR may not exist yet suppress its use. diff --git a/xc/config/cf/Library.tmpl b/xc/config/cf/Library.tmpl index 7e273a567..6e3ca718a 100644 --- a/xc/config/cf/Library.tmpl +++ b/xc/config/cf/Library.tmpl @@ -19,7 +19,7 @@ XCOMM $Xorg: Library.tmpl,v 1.3 2000/08/17 19:41:46 cpqbld Exp $ -XCOMM $XFree86: xc/config/cf/Library.tmpl,v 3.14 2001/07/25 14:30:03 alanh Exp $ +XCOMM $XFree86: xc/config/cf/Library.tmpl,v 3.15 2001/08/27 17:40:55 dawes Exp $ #ifndef LibraryCplusplusOptions # if DoSharedLib && defined(SharedLibraryCplusplusOptions) diff --git a/xc/config/cf/QNX4.cf b/xc/config/cf/QNX4.cf index 340b60c82..ce75eb8f6 100644 --- a/xc/config/cf/QNX4.cf +++ b/xc/config/cf/QNX4.cf @@ -1,15 +1,11 @@ -XCOMM platform: $XFree86: xc/config/cf/QNX4.cf,v 1.3 2000/07/07 20:06:56 tsi Exp $ +XCOMM platform: $XFree86: xc/config/cf/QNX4.cf,v 1.4 2002/01/07 20:38:18 dawes Exp $ #define StripInstalledPrograms NO #define BuildServer YES #define DoLoadableServer NO /* sorry, are u listenning QSSL? */ #define BuildLBX YES /* For now */ #define ExpandManNames YES -XCOMM you can only one space (or tab) between ByteOrder and X_LITTLE_ENDIAN -XCOMM or you will have -DX_BYTE_ORDER= X_LITTLE_ENDIAN -XCOMM instead of -DX_BYTE_ORDER=X_LITTLE_ENDIAN -XCOMM in the generated Makefile -#define ByteOrder X_LITTLE_ENDIAN +#define ByteOrder X_LITTLE_ENDIAN #ifndef OSName #define OSName QNX4 @@ -34,7 +30,11 @@ XCOMM in the generated Makefile #undef ArCmd #define ArCmd wlib -b -c -p=256 #define MkdirHierCmd mkdir -p -#define InstallCmd /usr/X11R6/bin/install.qnx +#ifdef UseInstalled +#define InstallCmd install +#else +#define InstallCmd $(SHELL) $(CONFIGSRC)/util/install.sh +#endif #define DefaultCCOptions -5s -Otx -Wc,-r -b -j -Wc,-ei -N128000 -zp4 -mf #define LibraryCCOptions -5s -Otx -Wc,-r -b -j -Wc,-ei -zp4 -mf @@ -43,7 +43,7 @@ XCOMM in the generated Makefile #define ExtraLibraries -lsocket -lunix #define CLibrary #define PosixLibraries -#define ConnectionFlags -DTCPCONN +#define ConnectionFlags -DUNIXCONN -DTCPCONN #define CppCmd /usr/X11R6/bin/cpp #define HasShadowPasswd YES @@ -54,6 +54,14 @@ XCOMM in the generated Makefile #define HasPutenv YES #define HasCbrt NO #define HasVarDirectory NO +#define HasSnprintf YES +#define HasBSD44Sockets YES +#define HasPerl NO +#define LogDirectory /usr/adm +#define XLogFile XFree86 + +#define BuildHtmlManPages NO /* We don't want HTML manpages */ +#define BuildRman NO #define AvoidNullMakeCommand YES #define CompressAllFonts YES @@ -68,6 +76,8 @@ XCOMM in the generated Makefile #define NeedWidePrototypes NO #endif +#define LexCmd flex -l +#define LexLib -lfl #define TermcapLibrary -lncurses #ifndef UseStaticTermcapLib #define UseStaticTermcapLib NO diff --git a/xc/config/cf/X11.tmpl b/xc/config/cf/X11.tmpl index 1dcb90335..3b6357147 100644 --- a/xc/config/cf/X11.tmpl +++ b/xc/config/cf/X11.tmpl @@ -5,7 +5,7 @@ XCOMM XCOMM XCOMM XCOMM -XCOMM $XFree86: xc/config/cf/X11.tmpl,v 1.125 2001/08/17 22:08:09 tsi Exp $ +XCOMM $XFree86: xc/config/cf/X11.tmpl,v 1.141 2002/01/15 22:55:26 herrb Exp $ /*************************************************************************** * * @@ -41,7 +41,7 @@ XCOMM $XFree86: xc/config/cf/X11.tmpl,v 1.125 2001/08/17 22:08:09 tsi Exp $ /* X.Org release string */ #ifndef XOrgReleaseString -#define XOrgReleaseString Release 6.5 +#define XOrgReleaseString Release 6.6 #endif #ifndef XOrgManNameString @@ -66,7 +66,7 @@ VENDORMANNAME = XVendorManNameString VENDORMANVERSION = XVendorManVersionString #ifndef VendorManDefs -#define VendorManDefs -D__vendorversion__='"$(VENDORMANVERSION)" "$(VENDORMANNAME)"' +#define VendorManDefs -D__vendorversion__="$(VENDORMANVERSION) $(VENDORMANNAME)" #endif /* @@ -91,7 +91,7 @@ VENDORMANVERSION = XVendorManVersionString #define BuildLibraries (!BuildServersOnly || BuildClients) #endif #ifndef BuildLibrariesForXServers -#define BuildLibrariesForXservers BuildServer +#define BuildLibrariesForXServers BuildServer #endif #ifndef BuildFontServer #define BuildFontServer YES @@ -135,9 +135,12 @@ VENDORMANVERSION = XVendorManVersionString #ifndef BuildCIDFonts #define BuildCIDFonts YES #endif +#ifndef BuildTrueTypeFonts +#define BuildTrueTypeFonts YES +#endif /* Not used now */ #ifndef BuildLatin2Fonts -#define BuildLatin2Fonts YES +#define BuildLatin2Fonts NO #endif #ifndef BuildCyrillicFonts #define BuildCyrillicFonts YES @@ -238,6 +241,9 @@ VENDORMANVERSION = XVendorManVersionString #ifndef BuildX11Lib #define BuildX11Lib (BuildLibraries || (BuildLibrariesForXServers && XnestServer)) #endif +#ifndef BuildLoadableXlibI18n +#define BuildLoadableXlibI18n (HasDlopen && SharedLibX11) +#endif #ifndef BuildXextLib #define BuildXextLib (BuildLibraries || (BuildLibrariesForXServers && XnestServer)) #endif @@ -359,6 +365,13 @@ VENDORMANVERSION = XVendorManVersionString #ifndef BuildXKBfilelib #define BuildXKBfilelib (BuildXKB && !BuildServersOnly) #endif +#ifndef BuildXTrap +#define BuildXTrap YES +#endif +#ifndef BuildXTrapLibrary +#define BuildXTrapLibrary (BuildXTrap && !BuildServersOnly) +#endif + /* * WARNING: Setting UseXKBInClients to YES cause incompatibilities * between many clients (such as xterm) and pre-XKB shared @@ -450,8 +463,23 @@ VENDORMANVERSION = XVendorManVersionString #ifndef BuildXvLibrary #define BuildXvLibrary (BuildXvExt && !BuildServersOnly) #endif +#ifndef BuildXvMCExt +#define BuildXvMCExt NO +#endif +#ifndef BuildXvMCLibrary +#define BuildXvMCLibrary (BuildXvMCExt && !BuildServersOnly) +#endif #ifndef BuildGlxExt #define BuildGlxExt NO +#else +#if BuildGlxExt && !defined(XFree86Version) +#undef BuildXF86DRI +#undef BuildXF86DRM +#undef BuildXF86DRIDriverSupport +#define BuildXF86DRI NO +#define BuildXF86DRM NO +#define BuildXF86DRIDriverSupport NO +#endif #endif #ifndef BuildGLXLibrary #define BuildGLXLibrary (BuildGlxExt && !BuildServersOnly) @@ -712,6 +740,13 @@ FCHOWN_DEFINES = -DHAS_FCHOWN #define XTestDefines /**/ #endif #endif +#ifndef XTrapDefines +#if BuildXTrap +#define XTrapDefines -DXTRAP +#else +#define XTrapDefines /**/ +#endif +#endif #ifndef XSyncDefines #if BuildSyncExt #define XSyncDefines -DXSYNC @@ -897,6 +932,14 @@ FCHOWN_DEFINES = -DHAS_FCHOWN #endif #endif +#ifndef XvMCExtensionDefines +#if BuildXvMCExt +#define XvMCExtensionDefines -DXVMC +#else +#define XvMCExtensionDefines /**/ +#endif +#endif + #ifndef RECORDDefines #if BuildRECORD #define RECORDDefines -DXRECORD @@ -985,11 +1028,11 @@ FCHOWN_DEFINES = -DHAS_FCHOWN #endif #ifndef BaseExtensionDefines #define BaseExtensionDefines \ - MultibufferDefines MITMiscDefines XTestDefines XSyncDefines \ - XCMiscDefines RECORDDefines \ + MultibufferDefines MITMiscDefines XTestDefines XTrapDefines \ + XSyncDefines XCMiscDefines RECORDDefines \ PexDefines ShmDefines XieDefines BigReqDefines VidModeExtensionDefines \ XF86MiscExtensionDefines DBEDefines DPMSDefines EVIDefines \ - ScreenSaverExtensionDefines XvExtensionDefines \ + ScreenSaverExtensionDefines XvExtensionDefines XvMCExtensionDefines \ GlxDefines FontCacheExtensionDefines SiteExtensionDefines #endif #define ExtensionDefines BaseExtensionDefines ExtensionOSDefines @@ -1542,7 +1585,7 @@ ProjectUnsharedLibReferences(XONLY,X11,$(XLIBSRC),XBuildLibDir) XTHRSTUBLIBSRC = $(LIBSRC)/XThrStub #if SharedLibXThrStub #ifndef SharedXThrStubRev -#define SharedXThrStubRev 6.0 +#define SharedXThrStubRev 6.1 #endif SharedLibReferences(XTHRSTUB,XThrStub,$(XTHRSTUBLIBSRC),SOXTHRSTUBREV,SharedXThrStubRev) #else @@ -1640,6 +1683,21 @@ ProjectUnsharedLibReferences(XTHRSTUB,XThrStub,$(XTHRSTUBSRC),XBuildLibDir) #endif #endif +#if BuildXvMCLibrary +#ifndef SharedLibXvMC +#define SharedLibXvMC NO +#endif +#ifndef NormalLibXvMC +#define NormalLibXvMC YES +#endif +#ifndef DebugLibXvMC +#define DebugLibXvMC NO +#endif +#ifndef ProfileLibXvMC +#define ProfileLibXvMC NO +#endif +#endif + #if BuildXineramaLibrary #ifndef SharedLibXinerama #define SharedLibXinerama NO @@ -1887,6 +1945,17 @@ SharedLibReferences(XV,Xv,$(XVLIBSRC),SOXVREV,SharedXvRev) ProjectUnsharedLibReferences(XV,Xv,$(XVLIBSRC),XBuildLibDir) #endif + + XVMCLIBSRC = $(LIBSRC)/XvMC +#if SharedLibXvMC +#ifndef SharedXvMCRev +#define SharedXvMCRev 1.0 +#endif +SharedLibReferences(XVMC,XvMC,$(XVMCLIBSRC),SOXVMCREV,SharedXvMCRev) +#else +ProjectUnsharedLibReferences(XVMC,XvMC,$(XVMCLIBSRC),XBuildLibDir) +#endif + XINERAMALIBSRC = $(LIBSRC)/Xinerama #if SharedLibXinerama #ifndef SharedXineramaRev @@ -1959,7 +2028,7 @@ ProjectUnsharedLibReferences(GLW,GLw,$(GLWIDGETSRC),XBuildLibDir) XRENDERLIBSRC = $(LIBSRC)/Xrender #if SharedLibXrender #ifndef SharedXrenderRev -#define SharedXrenderRev 1.0 +#define SharedXrenderRev 1.1 #endif SharedLibReferences(XRENDER,Xrender,$(XRENDERLIBSRC),SOXRENDERREV,SharedXrenderRev) #else @@ -2457,7 +2526,7 @@ ProjectUnsharedLibReferences(FONTSTUB,fntstubs,$(FONTSUBLIBSRC),XBuildLibDir) #define SharedLibFontEnc NO #endif #ifndef NormalLibFontEnc -#define NormalLibFontEnc (!SharedLibFont | ForceNormalLib) +#define NormalLibFontEnc (!SharedLibFontEnc | ForceNormalLib) #endif #ifndef DebugLibFontEnc #define DebugLibFontEnc NO /* debugged fontenc library */ @@ -2510,9 +2579,19 @@ ProjectUnsharedLibReferences(XPM,Xpm,$(XPMLIBSRC),XBuildLibDir) #define ProfileLibFreetype2 NO #endif FREETYPE2LIBSRC = $(LIBSRC)/freetype2 + +/* FreeType 2.0.6, version_info 8:0:2 */ +#ifndef Freetype2Version +#define Freetype2Version 8.0.2 +#endif + #if SharedLibFreetype2 #ifndef SharedFreetype2Rev -#define SharedFreetype2Rev 6.0 +#if LibtoolMinorVersions +#define SharedFreetype2Rev 6.2 +#else +#define SharedFreetype2Rev 8.0 +#endif #endif SharedLibReferences(FREETYPE2,freetype,$(FREETYPE2LIBSRC),SOFREETYPE2REV,SharedFreetype2Rev) #else @@ -2620,8 +2699,12 @@ ProjectUnsharedLibReferences(XKBFILE,xkbfile,$(XKBFILELIBSRC),XBuildLibDir) XKBCOMPCMD = $(BINDIR)/XkbComp #else XKBCOMPSRC = $(PROGRAMSRC)/XkbComp +#if CrossCompiling + XKBCOMPCMD = $(PROGRAMSRC)/XkbComp/cross/XkbComp +#else XKBCOMPCMD = $(CLIENTENVSETUP) $(PRELOADSETUP) $(XBUILDBINDIR)/XkbComp #endif +#endif #else /* !BuildXKBlib */ #ifndef XkbClientDepLibs #define XkbClientDepLibs @@ -2647,6 +2730,28 @@ ProjectUnsharedLibReferences(XKBUI,xkbui,$(XKBUILIBSRC),XBuildLibDir) #define XawClientLibs $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XPMLIB) $(XLIB) #endif +#ifndef SharedLibXTrap +#define SharedLibXTrap HasSharedLibraries +#endif +#ifndef NormalLibXTrap +#define NormalLibXTrap (!SharedLibXTrap | ForceNormalLib) +#endif +#ifndef DebugLibXTrap +#define DebugLibXTrap NO /* debugged XTrap library */ +#endif +#ifndef ProfileLibXTrap +#define ProfileLibXTrap NO /* profiled XTrap library */ +#endif + XTRAPLIBSRC = $(LIBSRC)/XTrap +#if SharedLibXTrap +#ifndef SharedXTrapRev +#define SharedXTrapRev 6.4 +#endif +SharedLibReferences(XTRAP,XTrap,$(XTRAPLIBSRC),SOXTRAPREV,SharedXTrapRev) +#else +ProjectUnsharedLibReferences(XTRAP,XTrap,$(XTRAPLIBSRC),XBuildLibDir) +#endif + #ifndef NeedDefaultDepLibs #define NeedDefaultDepLibs YES #endif diff --git a/xc/config/cf/cygwin.cf b/xc/config/cf/cygwin.cf index 3d4472688..5a3d3df04 100644 --- a/xc/config/cf/cygwin.cf +++ b/xc/config/cf/cygwin.cf @@ -1,4 +1,4 @@ -XCOMM platform: $XFree86: xc/config/cf/cygwin.cf,v 3.26 2001/08/03 23:43:37 alanh Exp $ +XCOMM platform: $XFree86: xc/config/cf/cygwin.cf,v 3.34 2001/12/10 16:22:37 alanh Exp $ #ifndef OSName #define OSName Cygwin @@ -13,7 +13,7 @@ XCOMM platform: $XFree86: xc/config/cf/cygwin.cf,v 3.26 2001/08/03 23:43:37 ala #define OSMinorVersion 3 #endif #ifndef OSTeenyVersion -#define OSTeenyVersion 2 +#define OSTeenyVersion 6 #endif #define ProjectRoot /usr/X11R6 @@ -33,6 +33,8 @@ XCOMM platform: $XFree86: xc/config/cf/cygwin.cf,v 3.26 2001/08/03 23:43:37 ala #define BootstrapCFlags -L/lib/automode.o #endif +#define ExtraLoadFlags -Wl,--enable-auto-import + #define HasShadowPasswd NO #define HasLibCrypt YES #define HasPutenv YES @@ -71,7 +73,7 @@ XCOMM platform: $XFree86: xc/config/cf/cygwin.cf,v 3.26 2001/08/03 23:43:37 ala #define TermcapLibrary -lncurses.dll #define AvoidNullMakeCommand YES -#define StripInstalledPrograms NO +#define StripInstalledPrograms YES #define CompressAllFonts YES #define Malloc0ReturnsNull NO #define NeedConstPrototypes YES @@ -84,13 +86,9 @@ XCOMM platform: $XFree86: xc/config/cf/cygwin.cf,v 3.26 2001/08/03 23:43:37 ala #define HasDlopen NO #define HasGnuMake YES #define UseGccMakeDepend NO - -/* - * This options may depend on the state of POSIX thread - * support in Cygwin, which is improving as of 2001-04-12. - */ -#define ThreadedX NO -#define HasThreadSafeAPI NO +#define ThreadedX YES +#define HasThreadSafeAPI YES +#define CaseSensitiveFileSystem NO #define LnCmd ln -s #ifndef CcCmd @@ -123,6 +121,9 @@ XCOMM platform: $XFree86: xc/config/cf/cygwin.cf,v 3.26 2001/08/03 23:43:37 ala #ifndef PostIncDir #define PostIncDir `CcCmd --print-libgcc-file-name | sed 's,\\\\,/,g' | sed 's,libgcc.a,include,'` #endif +#ifndef ExtraIncDir +#define ExtraIncDir /usr/include/w32api +#endif #define LdCombineFlags -r @@ -143,11 +144,19 @@ XCOMM platform: $XFree86: xc/config/cf/cygwin.cf,v 3.26 2001/08/03 23:43:37 ala #define HasWChar32 YES #define StandardCppOptions -traditional #if UseCygIPC -# define StandardCppDefines -DHAS_SHM StandardDefines +# if ThreadedX +# define StandardCppDefines -DHAS_THREADS -DHAS_SHM StandardDefines +# else +# define StandardCppDefines -DHAS_SHM StandardDefines +# endif #else -# define StandardCppDefines StandardDefines +# if ThreadedX +# define StandardCppDefines -DHAS_THREADS StandardDefines +# else +# define StandardCppDefines StandardDefines +# endif #endif -#define ServerOSDefines XFree86ServerDefines -DDDXTIME -DFD_SETSIZE=256 -DDDXOSINIT +#define ServerOSDefines XFree86ServerDefines -DDDXTIME -DFD_SETSIZE=256 -DDDXOSINIT -DDDXOSVERRORF -DDDXOSFATALERROR #define XkbServerDefines -DXKB_ALWAYS_USES_SOFT_REPEAT #define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines #define ConnectionFlags -DTCPCONN -DUNIXCONN diff --git a/xc/config/cf/cygwin.rules b/xc/config/cf/cygwin.rules index 66f230319..c4c4ec583 100644 --- a/xc/config/cf/cygwin.rules +++ b/xc/config/cf/cygwin.rules @@ -1,11 +1,11 @@ -XCOMM $XFree86: xc/config/cf/cygwin.rules,v 3.13 2001/08/18 17:25:48 alanh Exp $ +XCOMM $XFree86: xc/config/cf/cygwin.rules,v 3.18 2001/11/15 23:15:55 alanh Exp $ /* * Cygwin shared library rules (DLL versions) */ #define HasSharedLibraries YES -#define NeedLibInsideFlag YES +#define NeedLibInsideFlag NO #define ForceNormalLib NO #define SharedLibXaw NO #define SharedLibXmu NO @@ -81,13 +81,7 @@ CppFileTarget(libname.def,libname-def.cpp,-DLIBRARY_VERSION=rev,$(ICONFIGFILES)) @@\ @@\ @@\ -junk.c: @@\ - echo "#include <cygwin/cygwin_dll.h>" >junk.c @@\ - echo "DECLARE_CYGWIN_DLL(dll_main)" >>junk.c @@\ - echo "int WINAPI dll_main(HINSTANCE a, DWORD reason, void *q)" >>junk.c @@\ - echo "{ return 1; }" >>junk.c @@\ - @@\ -Concat3(lib,libname,.dll): deplist junk.o libname.def @@\ +Concat3(lib,libname,.dll): deplist libname.def @@\ RemoveFile(LibraryTargetName(libname)) @@\ RemoveFile(Concat3(lib,libname,.dll)) @@\ MakeDLL(libname,solist) @@\ @@ -97,14 +91,52 @@ Concat3(lib,libname,.dll): deplist junk.o libname.def @@\ clean:: @@\ RemoveFile(LibraryTargetName(libname)) @@\ RemoveFile(Concat3(lib,libname,.dll)) @@\ - RemoveFile(junk.o) @@\ - RemoveFile(junk.c) @@\ - RemoveFile($(BASE_COUNTER)) #endif /* SharedDepLibraryTarget */ +/* + * SharedDepCplusplusLibraryTarget - generate rules to create a shared library. + */ + +#ifndef SharedDepCplusplusLibraryTarget +# ifdef UseInstalled +# ifndef LinkBuildSonameLibrary +# define LinkBuildSonameLibrary(lib) +# endif +# else /* !UseInstalled */ +# ifndef LinkBuildSonameLibrary +# define LinkBuildSonameLibrary(lib) (RemoveFile($(BUILDLIBDIR)/lib); @@\ + cd $(BUILDLIBDIR); $(LN) $(BUILDINCTOP)/$(CURRENT_DIR)/lib .) +# endif +# endif /* UseInstalled */ + /* + * SharedDepCplusplusLibraryTarget + */ + +#define SharedDepCplusplusLibraryTarget(libname,rev,deplist,solist,down,up) @@\ +AllTarget(Concat3(lib,libname,.dll)) @@\ + @@\ +CppFileTarget(libname.def,libname-def.cpp,-DLIBRARY_VERSION=rev,$(ICONFIGFILES)) @@\ + @@\ + @@\ + @@\ +Concat3(lib,libname,.dll): deplist libname.def @@\ + RemoveFile(LibraryTargetName(libname)) @@\ + RemoveFile(Concat3(lib,libname,.dll)) @@\ + MakeCplusplusDLL(libname,solist) @@\ + LinkBuildLibrary(Concat3(lib,libname,.a)) @@\ + LinkBuildDLL(Concat3(lib,libname,.dll)) @@\ + @@\ +clean:: @@\ + RemoveFile(LibraryTargetName(libname)) @@\ + RemoveFile(Concat3(lib,libname,.dll)) @@\ + +#endif /* SharedDepCplusplusLibraryTarget */ + + +/* * SharedDepModuleTarget */ @@ -137,19 +169,27 @@ clean:: @@\ #define InstallSharedLibraryData(libname,rev,dest) #endif /* InstallSharedLibraryData */ - +/* + * MakeDllProg + */ + +#define MakeDLLProg(libname,solist,prog) @@\ + prog -shared -Wl,--out-implib=Concat3(lib,libname,.a) -Wl,--enable-auto-import --def libname.def -o Concat3(lib,libname,.dll) solist $(REQUIREDLIBS) + /* * MakeDll */ #define MakeDLL(libname,solist) @@\ - if [ -f $(BASE_COUNTER) ]; then true; \ @@\ - else echo 0x67000000 > $(BASE_COUNTER); fi @@\ - $(DLLWRAP) -s --def libname.def --output-lib Concat3(lib,libname,.a) -o Concat3(lib,libname,.dll) solist junk.o $(REQUIREDLIBS) -image-base `cat $(BASE_COUNTER)` @@\ - IMAGE_LENGTH=`$(OBJDUMP) -x Concat3(lib,libname,.dll) |awk '/SizeOfImage/ {print "0x"$$2}'`; \ @@\ - export IMAGE_LENGTH=`expr '(' \`printf %u $$IMAGE_LENGTH\` / 65536 + 1 ')' '*' 65536` ; \ @@\ - export IMAGE_BASE=`cat $(BASE_COUNTER)`; \ @@\ - printf 0x%x `expr \`printf %u $$IMAGE_BASE\` + $$IMAGE_LENGTH` > $(BASE_COUNTER) + MakeDLLProg(libname,solist,$(CC)) + +/* + * MakeCplusplusDll + */ + +#define MakeCplusplusDLL(libname,solist) @@\ + MakeDLLProg(libname,solist,$(CXX)) + /* @@ -162,12 +202,7 @@ AllTarget(Concat3(lib,libname,.dll)) @@\ CppFileTarget(libname.def,libname-def.cpp,-DLIBRARY_VERSION=rev,$(ICONFIGFILES)) @@\ @@\ @@\ -junk.c: @@\ - echo "#include <cygwin/cygwin_dll.h>" >junk.c @@\ - echo "DECLARE_CYGWIN_DLL(dll_main)" >>junk.c @@\ - echo "int WINAPI dll_main(HINSTANCE a, DWORD reason, void *q)" >>junk.c @@\ - echo "{ return 1; }" >>junk.c @@\ -Concat3(lib,libname,.dll): solist junk.o libname.def @@\ +Concat3(lib,libname,.dll): solist libname.def @@\ RemoveFile(LibraryTargetName(libname)) @@\ RemoveFile(Concat3(lib,libname,.dll)) @@\ MakeDLL(libname,solist) @@\ @@ -176,9 +211,6 @@ Concat3(lib,libname,.dll): solist junk.o libname.def @@\ clean:: @@\ RemoveFile(LibraryTargetName(libname)) @@\ RemoveFile(Concat3(lib,libname,.dll)) @@\ - RemoveFile(junk.o) @@\ - RemoveFile(junk.c) @@\ - RemoveFile($(BASE_COUNTER)) /* diff --git a/xc/config/cf/cygwin.tmpl b/xc/config/cf/cygwin.tmpl index 7e629656c..9eddf5362 100644 --- a/xc/config/cf/cygwin.tmpl +++ b/xc/config/cf/cygwin.tmpl @@ -1,7 +1,11 @@ XCOMM $XConsortium: WinLib.tmpl,v 1.1 94/01/08 18:32:51 rws Exp $ -XCOMM $XFree86: xc/config/cf/cygwin.tmpl,v 3.7 2001/08/19 15:24:05 alanh Exp $ +XCOMM $XFree86: xc/config/cf/cygwin.tmpl,v 3.9 2001/11/16 00:52:27 dawes Exp $ -#define SharedX11Reqs +#if UseCygIPC +#define SharedX11Reqs -lcygipc +#else +#define SharedX11Reqs +#endif #define SharedOldXReqs $(LDPRELIB) $(XLIBONLY) #define SharedXReqs $(XTOOLLIB) $(XPLIB) $(XLIB) $(LDPOSTLIBS) #define SharedXtReqs $(LDPRELIB) $(SMLIB) $(ICELIB) $(XLIBONLY) @@ -40,38 +44,3 @@ XMULIB = $(XMULIBONLY) $(XTOOLLIB) $(XLIB) #ifndef XawClientLibs #define XawClientLibs $(XAWLIB) $(XMULIBONLY) $(XTOOLLIB) $(XPMLIB) $(XLIB) #endif - - -/* - * Some Imake defines needed only on Cygwin - */ - -#ifndef DllwrapCmd -#define DllwrapCmd dllwrap -#endif - -#ifndef DlltoolCmd -#define DlltoolCmd dlltool -#endif - -#ifndef ObjdumpCmd -#define ObjdumpCmd objdump -#endif - -#ifndef DllBaseCounter -# if CrossCompiling -# define DllBaseCounter ~/DLL_BASE_COUNTER /* So you don't have to be root */ -# else -# define DllBaseCounter /tmp/DLL_BASE_COUNTER -#endif -#endif - -/* - * Some Cygwin only Makefile symbols, as opposed to Imake define's - */ - - DLLWRAP = DllwrapCmd - DLLTOOL = DlltoolCmd - OBJDUMP = ObjdumpCmd - BASE_COUNTER = DllBaseCounter - diff --git a/xc/config/cf/darwin.cf b/xc/config/cf/darwin.cf index 53da4e801..236026f9f 100644 --- a/xc/config/cf/darwin.cf +++ b/xc/config/cf/darwin.cf @@ -1,13 +1,26 @@ -XCOMM $XFree86: xc/config/cf/darwin.cf,v 1.15 2001/06/11 07:23:11 torrey Exp $ +XCOMM platform: $XFree86: xc/config/cf/darwin.cf,v 1.21 2002/01/15 21:22:31 keithp Exp $ /* Darwin / Mac OS X configuration by John Carmack <johnc@idsoftware.com> */ /* imake determines the default values by parsing uname */ +#ifndef OSName #define OSName DefaultOSName +#endif +#ifndef OSMajorVersion #define OSMajorVersion DefaultOSMajorVersion +#endif +#ifndef OSMinorVersion #define OSMinorVersion DefaultOSMinorVersion -#define OSTeenyVersion 0 +#endif +#ifndef OSTeenyVersion +#define OSTeenyVersion DefaultOSTeenyVersion +#endif + +XCOMM operating system: OSName (OSMajorVersion./**/OSMinorVersion./**/OSTeenyVersion) +/* + * Define the operating system's capabilities + */ #define HasSnprintf YES #define HasPutenv YES #define HasBSD44Sockets YES @@ -16,12 +29,25 @@ XCOMM $XFree86: xc/config/cf/darwin.cf,v 1.15 2001/06/11 07:23:11 torrey Exp $ #ifndef HasShm # define HasShm YES #endif +#define HasNdbm YES + +#ifndef HasGroff +# define HasGroff YES +#endif + +/* Libtool on Darwin always uses minor numbers */ +#define LibtoolMinorVersions YES + +/* The most common file system, HFS+, is not case sensitive. */ +#ifndef CaseSensitiveFileSystem +# define CaseSensitiveFileSystem NO +#endif /* * This enables some settings for developers. */ #ifndef XFree86Devel -# define XFree86Devel NO +# define XFree86Devel NO #endif /* @@ -29,7 +55,7 @@ XCOMM $XFree86: xc/config/cf/darwin.cf,v 1.15 2001/06/11 07:23:11 torrey Exp $ * Turn off to build on raw Darwin systems. */ #ifndef DarwinQuartzSupport -# define DarwinQuartzSupport YES +# define DarwinQuartzSupport YES #endif /* we don't need -lm */ @@ -41,6 +67,8 @@ XCOMM $XFree86: xc/config/cf/darwin.cf,v 1.15 2001/06/11 07:23:11 torrey Exp $ /* we don't have a dbm library */ #define DBMLibrary /**/ +#define MkdirHierCmd mkdir -p + /* our cpp isn't in /lib/cpp and it doesn't like -undef */ #define CppCmd /usr/bin/cpp #define RawCppCmd CppCmd @@ -55,9 +83,9 @@ XCOMM $XFree86: xc/config/cf/darwin.cf,v 1.15 2001/06/11 07:23:11 torrey Exp $ # define DefaultCCOptions -Wall -Wpointer-arith -Wstrict-prototypes \ -Wmissing-prototypes -Wmissing-declarations \ -Wredundant-decls -Wnested-externs \ - -traditional-cpp + -no-cpp-precomp #else -# define DefaultCCOptions -Wall -Wpointer-arith -traditional-cpp +# define DefaultCCOptions -Wall -Wpointer-arith -no-cpp-precomp #endif #endif @@ -69,11 +97,13 @@ XCOMM $XFree86: xc/config/cf/darwin.cf,v 1.15 2001/06/11 07:23:11 torrey Exp $ #ifdef PpcDarwinArchitecture # define DarwinMachineDefines -D__powerpc__ # define OptimizedCDebugFlags -O2 +# define ByteOrder X_BIG_ENDIAN #endif /* PpcDarwinArchitecture */ #ifdef i386DarwinArchitecture # define DarwinMachineDefines -D__i386__ # define OptimizedCDebugFlags -O2 -fno-strength-reduce +# define ByteOrder X_LITTLE_ENDIAN #endif /* i386DarwinArchitecture */ /* @@ -82,13 +112,14 @@ XCOMM $XFree86: xc/config/cf/darwin.cf,v 1.15 2001/06/11 07:23:11 torrey Exp $ * * Darwin's alloca() seg faults (rather than returning NULL) on failed * allocations, so we can't use it. + * + * Darwin's setlocale() doesn't work properly, so use X11's instead. */ -#define StandardDefines DarwinMachineDefines -D__DARWIN__ -DNO_ALLOCA +#define StandardDefines DarwinMachineDefines -D__DARWIN__ \ + -DNO_ALLOCA -DX_LOCALE -/* programs/rgb/rgb.h and others needs this */ -#define HasNdbm YES - -/* set this to NO to just build the client libs, which should work without +/* + * Set this to NO to just build the client libs, which should work without * having to write any platform specific code. */ #define BuildServer YES @@ -98,15 +129,9 @@ XCOMM $XFree86: xc/config/cf/darwin.cf,v 1.15 2001/06/11 07:23:11 torrey Exp $ /* Thanks to the IOKit, the X server does not have to be SetUID. */ #ifndef InstallXserverSetUID -# define InstallXserverSetUID NO +# define InstallXserverSetUID NO #endif -/* pex? bah. I'm not going to bother getting the device - * dependent part of this working. If I get the time, i'll - * get glx working instead. - */ -#define BuildPexExt NO - /* no direct graphics extension */ #define BuildXF86DGA NO diff --git a/xc/config/cf/linux.cf b/xc/config/cf/linux.cf index 1bd00bd8b..a3d9050fd 100644 --- a/xc/config/cf/linux.cf +++ b/xc/config/cf/linux.cf @@ -4,7 +4,7 @@ XCOMM platform: $Xorg: linux.cf,v 1.3 2000/08/17 19:41:47 cpqbld Exp $ -XCOMM platform: $XFree86: xc/config/cf/linux.cf,v 3.170 2001/08/13 19:34:52 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/linux.cf,v 3.175 2002/01/15 21:22:31 keithp Exp $ #ifndef LinuxElfDefault # define LinuxElfDefault YES @@ -101,13 +101,6 @@ XCOMM binutils: (LinuxBinUtilsMajorVersion) # define XF86SetupUsesStaticTcl NO /* un-comment this when it is un-broken */ /* # define JoystickSupport YES */ -# define InstallXinitConfig YES -# define InstallXdmConfig YES -# define InstallFSConfig YES -# define DebuggableLibraries YES -# define ForceNormalLib YES -# define BuildSpecsDocs YES -# define SpecsDocDirs CTEXT GL ICCCM X11 Xext Xv i18n xterm # define XAppLoadDir EtcX11Directory/app-defaults # define XFileSearchPathDefault Concat4(EtcX11Directory/%L/%T/%N%C,%S:EtcX11Directory/%l/%T/%N%C,%S:EtcX11Directory/%T/%N%C,%S:EtcX11Directory/%L/%T/%N%S:EtcX11Directory/%l/%T/%N%S:EtcX11Directory/%T/%N%S):Concat4($(LIBDIR)/%L/%T/%N%C,%S:$(LIBDIR)/%l/%T/%N%C,%S:$(LIBDIR)/%T/%N%C,%S:$(LIBDIR)/%L/%T/%N%S:$(LIBDIR)/%l/%T/%N%S:$(LIBDIR)/%T/%N%S) /* the relative symlink created by this rule causes problems for us */ @@ -125,8 +118,6 @@ InstallNamedTargetNoClobber(install,file.ad,$(INSTAPPFLAGS),$(XAPPLOADDIR),class # define HasZlib YES # define SharedLibGlu YES # define NormalLibGlu YES -# define BuildRman NO -# define BuildHtmlManPages NO # define FSUseSyslog YES /* @@ -141,13 +132,25 @@ InstallNamedTargetNoClobber(install,file.ad,$(INSTAPPFLAGS),$(XAPPLOADDIR),class # define BuilderEMailAddr "submit@bugs.debian.org" # define XFree86Devel YES # define BuildAllSpecsDocs YES +# define InstallXinitConfig YES +# define InstallXdmConfig YES +# define InstallFSConfig YES +# define DebuggableLibraries YES +# define ForceNormalLib YES +# define BuildSpecsDocs YES +# define SpecsDocDirs CTEXT GL ICCCM X11 Xext Xv i18n xterm +# define BuildRman NO +# define BuildHtmlManPages NO + /* we build-depend on libfreetype6-dev (FreeType 2.x) */ # define BuildFreetype2Library NO # define HasFreetype2 YES -# define HasLinuxInput YES +/* m68k has no 2.4 kernel yet */ +# ifndef Mc68020Architecture +# define HasLinuxInput YES +# endif # define HasXdmAuth YES # define HasLatex YES -# define BuilderEMailAddr "submit@bugs.debian.org" /* at present, glide2 only works on i386 */ # ifdef i386Architecture # define HasGlide2 YES @@ -241,6 +244,9 @@ InstallNamedTargetNoClobber(install,file.ad,$(INSTAPPFLAGS),$(XAPPLOADDIR),class # endif #endif +/* Libtool on linux always uses minor numbers */ +#define LibtoolMinorVersions YES + /* On x86, determine whether to build with MTRR support */ #ifndef HasMTRRSupport # ifdef i386Architecture @@ -259,6 +265,8 @@ InstallNamedTargetNoClobber(install,file.ad,$(INSTAPPFLAGS),$(XAPPLOADDIR),class #ifndef XF86INT10_BUILD # ifdef i386Architecture # define XF86INT10_BUILD X86VM +# elif defined SparcArchitecture +# define XF86INT10_BUILD X86INT10_STUB # else # define XF86INT10_BUILD X86EMU_GENERIC # endif @@ -601,7 +609,7 @@ InstallNamedTargetNoClobber(install,file.ad,$(INSTAPPFLAGS),$(XAPPLOADDIR),class #if UseElfFormat # ifndef DoLoadableServer # ifdef HPArchitecture -# define DoLoadableServer YES +# define DoLoadableServer NO # else # define DoLoadableServer YES # endif @@ -678,7 +686,7 @@ InstallNamedTargetNoClobber(install,file.ad,$(INSTAPPFLAGS),$(XAPPLOADDIR),class #ifdef Arm32Architecture # define DefaultCCOptions -fsigned-char # ifndef OptimizedCDebugFlags -# define OptimizedCDebugFlags -O3 +# define OptimizedCDebugFlags -O3 # endif # define LinuxMachineDefines -D__arm__ -D__arm32__ -U__arm -Uarm # define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET @@ -687,9 +695,9 @@ InstallNamedTargetNoClobber(install,file.ad,$(INSTAPPFLAGS),$(XAPPLOADDIR),class #ifdef ia64Architecture # ifndef OptimizedCDebugFlags -# define OptimizedCDebugFlags -O2 +# define OptimizedCDebugFlags -O2 # endif -# define LinuxMachineDefines -D__ia64__ +# define LinuxMachineDefines -D__ia64__ # define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET # define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines -D_XSERVER64 #endif /* ia64Architecture */ diff --git a/xc/config/cf/nto.cf b/xc/config/cf/nto.cf index 3969f66da..5978f7d00 100644 --- a/xc/config/cf/nto.cf +++ b/xc/config/cf/nto.cf @@ -1,20 +1,23 @@ -/* $XFree86: xc/config/cf/nto.cf,v 1.3 2000/07/07 20:06:56 tsi Exp $ */ -/* Get X to build using the gcc toolchain, from QNX4 */ +/* $XFree86: xc/config/cf/nto.cf,v 1.4 2001/11/16 16:47:50 dawes Exp $ */ +/* Get X to build using the gcc toolchain, self hosted RTP x86 */ /* Let us try to separate the x86 stuff out of here as well... */ +/* don't want to conflict with QSSL's Xphoton in /usr/X11R6 */ +#define ProjectRoot /opt/X11R6 + #ifndef OSName -#define OSName Neutrino +#define OSName QNX6/Neutrino #endif #ifndef OSVendor #define OSVendor QNX Corp. #endif #ifndef OSMajorVersion -#define OSMajorVersion 2 +#define OSMajorVersion 6 #endif #ifndef OSMinorVersion -#define OSMinorVersion 0 +#define OSMinorVersion 1 #endif #if defined(i386Architecture) @@ -23,20 +26,26 @@ #define BuildServer NO #endif -/* Use a non-broken shell ... */ -#define BourneShell /bin/pdksh +#define DoLoadableServer YES + +#define BourneShell /bin/sh #define OSDefines -DNO_REGEX -DSTRINGS_ALIGNED #define XawI18nDefines -DUSE_XWCHAR_STRING -DUSE_XMBTOWC #define StripInstalledPrograms NO #define BuildLBX YES +#define ForceNormalLib YES -#define SourceDefines -D_POSIX_SOURCE -#define CrossCompiling YES +#define SourceDefines -D_POSIX_SOURCE -D_QNX_SOURCE +#define CrossCompiling NO #define DoRanlibCmd YES #define GccUsesGas YES #define MkdirHierCmd mkdir -p -#define InstallCmd /usr/X11R6/bin/install.qnx +#ifdef UseInstalled +#define InstallCmd install +#else +#define InstallCmd $(SHELL) $(CONFIGSRC)/util/install.sh +#endif #define DefaultCCOptions #define LibraryCCOptions #define ServerCCOptions @@ -52,7 +61,11 @@ #define HasSockets YES #define HasPutenv YES #define HasCbrt NO -#define HasShadowPasswd YES +#define HasShadowPasswd YES +#define HasSnprintf YES +#define HasBSD44Sockets YES + +#define BuildHtmlManPages NO /* We don't want HTML manpages */ #define AvoidNullMakeCommand YES #define CompressAllFonts YES @@ -68,7 +81,9 @@ #define NeedWidePrototypes NO #endif -#define LexLib +#define YaccCmd bison -y +#define LexCmd flex -l +#define LexLib -lfl #define TermcapLibrary -lncurses #ifndef UseStaticTermcapLib #define UseStaticTermcapLib NO @@ -81,12 +96,15 @@ #define BootstrapCFlags -D__QNXNTO__ -Di386 #define OSDefines -DNO_REGEX -DSTRINGS_ALIGNED #define NTODefines -D__i386__ -D__ELF__ -D__QNXNTO__ -D_i386 -#define CcCmd /usr/gcc/ntox86/bin/gcc -bntox86 -#define ArCmd /usr/gcc/bin/ar cq -#define LdCmd /usr/gcc/bin/ld -#define AsCmd /usr/gcc/ntox86/bin/as -#define RanlibCmd /usr/gcc/bin/ranlib -#define CppCmd /usr/gcc/lib/gcc-lib/ntox86/2.8.1/cpp +#define CcCmd gcc +#define CplusplusCmd g++ -fhonor-std -fno-builtin +#define ArCmd ar cq +#define LdCmd ld +#define AsCmd as +#define RanlibCmd ranlib +#define CppCmd /usr/bin/cpp +/* do this until NTO's cpp can support -undef in the future */ +#define RawCppCmd CppCmd -Uunix -Ui386 #define AsmDefines -DUSE_GAS -D__ELF__ -D__QNXNTO__ #define ExtraLibraries -lsocket #endif diff --git a/xc/config/cf/xf86.tmpl b/xc/config/cf/xf86.tmpl index aa9fa2f6f..40d914726 100644 --- a/xc/config/cf/xf86.tmpl +++ b/xc/config/cf/xf86.tmpl @@ -2,7 +2,7 @@ XCOMM $Xorg: xf86.tmpl,v 1.3 2000/08/17 19:41:48 cpqbld Exp $ -XCOMM $XFree86: xc/config/cf/xf86.tmpl,v 3.29 2001/08/01 00:44:32 tsi Exp $ +XCOMM $XFree86: xc/config/cf/xf86.tmpl,v 3.30 2001/11/16 00:41:47 dawes Exp $ #ifdef BuilderEMailAddr BUILDERADDR = BuilderEMailAddr diff --git a/xc/config/cf/xfree86.cf b/xc/config/cf/xfree86.cf index ec0dce922..a256b330e 100644 --- a/xc/config/cf/xfree86.cf +++ b/xc/config/cf/xfree86.cf @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/config/cf/xfree86.cf,v 3.375 2001/08/18 02:46:53 dawes Exp $ +XCOMM $XFree86: xc/config/cf/xfree86.cf,v 3.388 2002/01/03 22:51:54 alanh Exp $ /* * This configuration file contains all of the configuration * information for the XFree86 based X Servers. @@ -40,9 +40,9 @@ XCOMM $Xorg: xfree86.cf,v 1.4 2000/08/17 19:41:49 cpqbld Exp $ #ifndef XFree86VersionString #ifdef XF86_VERSION_MAJOR #if XF86_VERSION_SNAP == 0 -#define XFree86VersionString XF86_VERSION_MAJOR.XF86_VERSION_MINOR.XF86_VERSION_PATCH +#define XFree86VersionString `echo XF86_VERSION_MAJOR XF86_VERSION_MINOR XF86_VERSION_PATCH | sed 's/ /./g'` #else -#define XFree86VersionString XF86_VERSION_MAJOR.XF86_VERSION_MINOR.XF86_VERSION_PATCH.XF86_VERSION_SNAP +#define XFree86VersionString `echo XF86_VERSION_MAJOR XF86_VERSION_MINOR XF86_VERSION_PATCH XF86_VERSION_SNAP | sed 's/ /./g'` #endif #endif #endif @@ -142,7 +142,7 @@ XCOMM $Xorg: xfree86.cf,v 1.4 2000/08/17 19:41:49 cpqbld Exp $ #define XInputDrivers mouse /* acecad */ calcomp citron \ digitaledge dmc dynapro elographics \ microtouch mutouch penmount spaceorb summa \ - wacom void /* magictouch */ + wacom void /* magictouch */ hyperpen #endif /* <linux/input.h> support mainly for USB support */ @@ -291,10 +291,13 @@ XCOMM $Xorg: xfree86.cf,v 1.4 2000/08/17 19:41:49 cpqbld Exp $ # define AgpGartDrivers /**/ # endif -/* Drivers under development, but not ready for binary releases */ +/* + * Drivers under development, but not ready for binary releases, or + * drivers included on this platform only for build testing. + */ # ifndef DevelDrivers # if XFree86Devel -# define DevelDrivers imstt +# define DevelDrivers imstt newport # else # define DevelDrivers /**/ # endif @@ -316,7 +319,7 @@ XCOMM $Xorg: xfree86.cf,v 1.4 2000/08/17 19:41:49 cpqbld Exp $ # define TdfxDriDriver /**/ # endif # ifndef DriDrivers -# define DriDrivers gamma TdfxDriDriver mga i810 r128 radeon sis +# define DriDrivers gamma TdfxDriDriver mga i810 i830 r128 radeon sis # endif #endif @@ -546,7 +549,7 @@ XCOMM $Xorg: xfree86.cf,v 1.4 2000/08/17 19:41:49 cpqbld Exp $ # ifndef DevelDrivers # if XFree86Devel -# define DevelDrivers ati +# define DevelDrivers /* */ # else # define DevelDrivers /* */ # endif @@ -554,7 +557,7 @@ XCOMM $Xorg: xfree86.cf,v 1.4 2000/08/17 19:41:49 cpqbld Exp $ /* Pure PCI drivers should go first */ # ifndef XF86CardDrivers -# define XF86CardDrivers mga tdfx glint s3 s3virge rendition tga \ +# define XF86CardDrivers mga tdfx glint s3 s3virge rendition tga ati \ savage nv DevelDrivers siliconmotion vga \ XF86OSCardDrivers XF86ExtraCardDrivers # endif @@ -570,8 +573,10 @@ XCOMM $Xorg: xfree86.cf,v 1.4 2000/08/17 19:41:49 cpqbld Exp $ /* * For Motorola 68k and PPC (currently Linux, LynxOS and Net/OpenBSD) + * and Intel StrongARM (currently Linux, maybe NetBSD) */ -#if defined(PpcArchitecture) || defined(Mc68020Architecture) +#if defined(PpcArchitecture) || defined(Mc68020Architecture) || \ + defined(Arm32Architecture) || defined(HPArchitecture) # ifndef XF86Server # define XF86Server YES # endif @@ -639,7 +644,7 @@ XCOMM $Xorg: xfree86.cf,v 1.4 2000/08/17 19:41:49 cpqbld Exp $ # ifndef DevelDrivers # if XFree86Devel -# define DevelDrivers ati imstt +# define DevelDrivers imstt # else # define DevelDrivers /* */ # endif @@ -647,7 +652,7 @@ XCOMM $Xorg: xfree86.cf,v 1.4 2000/08/17 19:41:49 cpqbld Exp $ /* Pure PCI drivers should go first */ # ifndef XF86CardDrivers -# define XF86CardDrivers mga glint s3 s3virge sis savage\ +# define XF86CardDrivers ati mga glint s3 s3virge sis savage\ trident chips tdfx fbdev \ DevelDrivers vga \ XF86OSCardDrivers XF86ExtraCardDrivers @@ -851,6 +856,9 @@ IPLAN2P8_DEFS = -DUSE_IPLAN2P8 # ifndef GlxBuiltInI810 # define GlxBuiltInI810 NO # endif +# ifndef GlxBuiltInI830 +# define GlxBuiltInI830 NO +# endif # ifndef GlxBuiltInR128 # define GlxBuiltInR128 NO # endif @@ -867,6 +875,7 @@ IPLAN2P8_DEFS = -DUSE_IPLAN2P8 # if GlxBuiltInTdfx || \ GlxBuiltInMga || \ GlxBuiltInI810 || \ + GlxBuiltInI830 || \ GlxBuiltInR128 || \ GlxBuiltInRadeon || \ GlxBuildInFfb || \ @@ -878,6 +887,7 @@ IPLAN2P8_DEFS = -DUSE_IPLAN2P8 GlxBuiltInTdfx || \ GlxBuiltInMga || \ GlxBuiltInI810 || \ + GlxBuiltInI830 || \ GlxBuiltInR128 || \ GlxBuiltInRadeon || \ GlxBuiltInFfb || \ @@ -904,6 +914,9 @@ IPLAN2P8_DEFS = -DUSE_IPLAN2P8 # if GlxBuiltInI810 # define DriDrivers i810 # endif +# if GlxBuiltInI830 +# define DriDrivers i830 +# endif # if GlxBuiltInR128 # define DriDrivers r128 # endif @@ -952,18 +965,14 @@ IPLAN2P8_DEFS = -DUSE_IPLAN2P8 # if defined(SparcArchitecture) || defined(ia64Architecture) || defined(s390xArchitecture) # define GlxArchDefines -D__GLX_ALIGN64 -# else -# if defined(AlphaArchitecture) +# elif defined(AlphaArchitecture) /* On the Alpha we need to ensure floating point accuracy for 3D */ -# define GlxArchDefines -mieee -# else -# if defined(DarwinArchitecture) +# define GlxArchDefines -D__GLX_ALIGN64 -mieee +# elif defined(DarwinArchitecture) /* GLX contains lots of uninitalized globals, which can upset Darwin */ -# define GlxArchDefines -fno-common -# else -# define GlxArchDefines /**/ -# endif -# endif +# define GlxArchDefines -fno-common +# else +# define GlxArchDefines /**/ # endif # ifndef GlxExtraDefines @@ -1074,6 +1083,9 @@ IPLAN2P8_DEFS = -DUSE_IPLAN2P8 #ifndef BuildXvLibrary # define BuildXvLibrary YES #endif +#ifndef BuildXvMCLibrary +# define BuildXvMCLibrary YES +#endif #ifndef BuildGLXLibrary # define BuildGLXLibrary YES #endif @@ -1102,13 +1114,6 @@ IPLAN2P8_DEFS = -DUSE_IPLAN2P8 #endif /* - * Build SuperProbe - */ -#ifndef BuildSuperProbe -# define BuildSuperProbe NO -#endif - -/* * Build XF86Setup -- needs Tk and Tcl */ /* There are problems building XF86Setup, so turn it off for now */ @@ -1153,6 +1158,13 @@ IPLAN2P8_DEFS = -DUSE_IPLAN2P8 # define BuildXvExt YES #endif +/* + * Build the X Video Motion Compensation Extension + */ +#ifndef BuildXvMCExt +# define BuildXvMCExt YES +#endif + #if Malloc0ReturnsNull # ifndef XtMalloc0ReturnsNullDefines @@ -1231,12 +1243,12 @@ IPLAN2P8_DEFS = -DUSE_IPLAN2P8 #ifndef BuildCIDFonts # define BuildCIDFonts YES #endif +#ifndef BuildTrueTypeFonts +# define BuildTrueTypeFonts YES +#endif #ifndef BuildCyrillicFonts # define BuildCyrillicFonts YES #endif -#ifndef BuildLatin2Fonts -# define BuildLatin2Fonts YES -#endif #ifndef UseKoi8RForCyrillic # define UseKoi8RForCyrillic YES #endif @@ -1292,6 +1304,12 @@ IPLAN2P8_DEFS = -DUSE_IPLAN2P8 # define XFree86XvDefines /**/ #endif +#if BuildXvMCExt +# define XFree86XvMCDefines -DXvMCExtension +#else +# define XFree86XvMCDefines /**/ +#endif + #ifndef DlopenHack # define DlopenHack -DDLOPEN_HACK #endif @@ -1340,6 +1358,7 @@ IPLAN2P8_DEFS = -DUSE_IPLAN2P8 XFree86DGADefines XFree86XvDefines \ XFree86LoaderDefines -DXFree86Server \ VidModeExtensionDefines \ + XFree86XvMCDefines \ ServerSnprintfDefines \ SmartScheduleDefines \ DebugDefines \ diff --git a/xc/config/imake/Imakefile b/xc/config/imake/Imakefile index 62b8edf44..2e0318ea1 100644 --- a/xc/config/imake/Imakefile +++ b/xc/config/imake/Imakefile @@ -3,7 +3,7 @@ XCOMM XCOMM XCOMM XCOMM -XCOMM $XFree86: xc/config/imake/Imakefile,v 3.11 2001/01/24 17:28:55 tsi Exp $ +XCOMM $XFree86: xc/config/imake/Imakefile,v 3.12 2001/11/16 00:45:05 dawes Exp $ XCOMM Some compilers generate fatal errors if an -L directory does XCOMM not exist. Since BUILDLIBDIR may not exist yet suppress its use. diff --git a/xc/config/imake/imake.c b/xc/config/imake/imake.c index 1387f4b34..5f1032782 100644 --- a/xc/config/imake/imake.c +++ b/xc/config/imake/imake.c @@ -7,13 +7,17 @@ * be passed to the template file. * * * ***************************************************************************/ -/* $XFree86: xc/config/imake/imake.c,v 3.45 2001/08/01 00:44:33 tsi Exp $ */ +/* $XFree86: xc/config/imake/imake.c,v 3.48 2001/12/14 19:53:18 dawes Exp $ */ /* * Copyright (c) 1985, 1986, 1987, 1998 The Open Group -All Rights Reserved. +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. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -301,7 +305,7 @@ int xvariables[10]; * space instead of being deleted. Blech. */ #ifdef FIXUP_CPP_WHITESPACE -void KludgeOutputLine(), KludgeResetRule(); +void KludgeOutputLine(char **), KludgeResetRule(void); #else # define KludgeOutputLine(arg) # define KludgeResetRule() @@ -1570,7 +1574,7 @@ ReadLine(FILE *tmpfd, char *tmpfname) initialized = TRUE; fprintf (tmpfd, "# Makefile generated by imake - do not edit!\n"); fprintf (tmpfd, "# %s\n", - "$Xorg: imake.c,v 1.5 2000/08/18 04:03:59 coskrey Exp $"); + "$Xorg: imake.c,v 1.6 2001/02/09 02:03:15 xorgcvs Exp $"); } for (p1 = pline; p1 < end; p1++) { diff --git a/xc/config/util/mkhtmlindex.sh b/xc/config/util/mkhtmlindex.sh index 43e06f57e..b880617e3 100644 --- a/xc/config/util/mkhtmlindex.sh +++ b/xc/config/util/mkhtmlindex.sh @@ -1,6 +1,6 @@ #!/bin/sh # -# $XFree86: xc/config/util/mkhtmlindex.sh,v 1.3 2000/08/26 04:30:49 dawes Exp $ +# $XFree86: xc/config/util/mkhtmlindex.sh,v 1.4 2001/10/28 03:32:04 tsi Exp $ # # Copyright © 2000 by Precision Insight, Inc. # @@ -44,8 +44,8 @@ for s in $VOLLIST; do EOF for i in $list; do title="`egrep '^[0-9A-Za-z]' $i | egrep -v '^Name' | head -1`" - name="`echo $title | sed -e 's/ - .*//'`" - desc="`echo $title | sed -e 's/[^-]* - //' -e 's/<P>//'`" + name="`echo \"$title\" | sed -e 's/ - .*//'`" + desc="`echo \"$title\" | sed -e 's/[^-]* - //' -e 's/<P>//'`" echo "<LI><A href=\"$i\">$name</A> - $desc</LI>" >> $file done cat <<EOF >> $file diff --git a/xc/extras/Mesa/include/GL/osmesa.h b/xc/extras/Mesa/include/GL/osmesa.h index f1eab4dab..1505c31b2 100644 --- a/xc/extras/Mesa/include/GL/osmesa.h +++ b/xc/extras/Mesa/include/GL/osmesa.h @@ -1,5 +1,4 @@ -/* $Id: osmesa.h,v 1.4 2001/10/22 20:00:53 alanh Exp $ */ - +/* $XFree86: xc/extras/Mesa/include/GL/osmesa.h,v 1.3 2001/10/28 03:32:06 tsi Exp $ */ /* * Mesa 3-D graphics library * Version: 3.3 @@ -59,7 +58,7 @@ extern "C" { #endif -#include "GL/gl.h" +#include <GL/gl.h> #define OSMESA_MAJOR_VERSION 3 diff --git a/xc/extras/Mesa/src/OSmesa/osmesa.c b/xc/extras/Mesa/src/OSmesa/osmesa.c index f8d9bbbca..ad280c568 100644 --- a/xc/extras/Mesa/src/OSmesa/osmesa.c +++ b/xc/extras/Mesa/src/OSmesa/osmesa.c @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/OSmesa/osmesa.c,v 1.9 2002/01/02 17:49:50 tsi Exp $ */ /* * Mesa 3-D graphics library * Version: 3.3 @@ -46,6 +46,7 @@ #include "types.h" #include "vb.h" #include "extensions.h" +#include "mmath.h" #endif diff --git a/xc/extras/Mesa/src/X/xmesa1.c b/xc/extras/Mesa/src/X/xmesa1.c index 86ce2d87d..800a37f56 100644 --- a/xc/extras/Mesa/src/X/xmesa1.c +++ b/xc/extras/Mesa/src/X/xmesa1.c @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/X/xmesa1.c,v 1.17 2001/11/14 10:28:07 alanh Exp $ */ /* * Mesa 3-D graphics library * Version: 3.4.2 @@ -598,6 +598,7 @@ static GLboolean alloc_shm_back_buffer( XMesaBuffer b ) */ void xmesa_alloc_back_buffer( XMesaBuffer b ) { + (void)DitherValues; if (b->db_state==BACK_XIMAGE) { /* Deallocate the old backimage, if any */ if (b->backimage) { diff --git a/xc/extras/Mesa/src/X/xmesa2.c b/xc/extras/Mesa/src/X/xmesa2.c index 10178dcba..17729fd1e 100644 --- a/xc/extras/Mesa/src/X/xmesa2.c +++ b/xc/extras/Mesa/src/X/xmesa2.c @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/X/xmesa2.c,v 1.12 2001/11/08 04:00:11 tsi Exp $ */ /* * Mesa 3-D graphics library * Version: 3.3 @@ -4635,9 +4635,9 @@ static void read_color_span( const GLcontext *ctx, const GLubyte *pixelToG = xmesa->xm_visual->PixelToG; const GLubyte *pixelToB = xmesa->xm_visual->PixelToB; const GLushort *ptr2 = PIXELADDR2( source, x, y ); - const GLuint *ptr4 = (const GLuint *) ptr2; GLuint i; #if defined(__i386__) /* word stores don't have to be on 4-byte boundaries */ + const GLuint *ptr4 = (const GLuint *) ptr2; GLuint extraPixel = (n & 1); n -= extraPixel; for (i = 0; i < n; i += 2) { diff --git a/xc/extras/Mesa/src/X/xmesa3.c b/xc/extras/Mesa/src/X/xmesa3.c index ca8912718..67cbf2e39 100644 --- a/xc/extras/Mesa/src/X/xmesa3.c +++ b/xc/extras/Mesa/src/X/xmesa3.c @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/X/xmesa3.c,v 1.11 2001/12/11 09:18:55 alanh Exp $ */ /* * Mesa 3-D graphics library * Version: 3.4 @@ -36,6 +36,7 @@ #include "glxheader.h" #include "depth.h" #include "macros.h" +#include "mmath.h" #include "vb.h" #include "types.h" #include "xmesaP.h" @@ -67,9 +68,14 @@ static void draw_points_ANY_pixmap( GLcontext *ctx, GLuint first, GLuint last ) const GLubyte *color = VB->ColorPtr->data[i]; unsigned long pixel = xmesa_color_to_pixel( xmesa, color[0], color[1], color[2], color[3], xmesa->pixelformat); + GLfloat *win = VB->Win.data[i]; + + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; + XMesaSetForeground( dpy, gc, pixel ); - x = (GLint) VB->Win.data[i][0]; - y = FLIP( xmesa->xm_buffer, (GLint) VB->Win.data[i][1] ); + x = (GLint) win[0]; + y = FLIP( xmesa->xm_buffer, (GLint) win[1] ); XMesaDrawPoint( dpy, buffer, gc, x, y); } } @@ -79,9 +85,14 @@ static void draw_points_ANY_pixmap( GLcontext *ctx, GLuint first, GLuint last ) for (i=first;i<=last;i++) { if (VB->ClipMask[i]==0) { register int x, y; + GLfloat *win = VB->Win.data[i]; + + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; + XMesaSetForeground( dpy, gc, VB->IndexPtr->data[i] ); - x = (GLint) VB->Win.data[i][0]; - y = FLIP( xmesa->xm_buffer, (GLint) VB->Win.data[i][1] ); + x = (GLint) win[0]; + y = FLIP( xmesa->xm_buffer, (GLint) win[1] ); XMesaDrawPoint( dpy, buffer, gc, x, y); } } @@ -117,7 +128,7 @@ points_func xmesa_get_points_func( GLcontext *ctx ) /**********************************************************************/ /*** Line rendering ***/ /**********************************************************************/ - +#if 0 /* * Render a line into a pixmap, any pixel format. */ @@ -147,7 +158,7 @@ static void flat_pixmap_line( GLcontext *ctx, XMesaDrawLine( xmesa->display, xmesa->xm_buffer->buffer, gc, x0, y0, x1, y1 ); } - +#endif /* @@ -575,7 +586,7 @@ static void flat_HPCR_z_line( GLcontext *ctx, #include "linetemp.h" } - +#if 0 /* * Examine ctx->Line attributes and set xmesa->xm_buffer->gc1 * and xmesa->xm_buffer->gc2 appropriately. @@ -655,7 +666,7 @@ fprintf (stderr, "\n"); XMesaSetFillStyle( xmesa->display, xmesa->xm_buffer->gc1, FillSolid ); XMesaSetFillStyle( xmesa->display, xmesa->xm_buffer->gc2, FillSolid ); } - +#endif /* diff --git a/xc/extras/Mesa/src/X/xmesa4.c b/xc/extras/Mesa/src/X/xmesa4.c index 223c653e2..c4978f428 100644 --- a/xc/extras/Mesa/src/X/xmesa4.c +++ b/xc/extras/Mesa/src/X/xmesa4.c @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/X/xmesa4.c,v 1.10 2001/12/11 09:18:55 alanh Exp $ */ /* * Mesa 3-D graphics library * Version: 3.4 @@ -36,6 +36,7 @@ #include "glxheader.h" #include "depth.h" #include "macros.h" +#include "mmath.h" #include "vb.h" #include "types.h" #include "xmesaP.h" @@ -47,6 +48,7 @@ /*** Triangle rendering ***/ /**********************************************************************/ +#if 0 /* * Render a triangle into a pixmap, any pixel format, flat shaded and * no raster ops. @@ -85,6 +87,7 @@ static void flat_pixmap_triangle( GLcontext *ctx, XMesaFillPolygon( xmesa->display, xmesa->xm_buffer->buffer, gc, p, 3, Convex, CoordModeOrigin ); } +#endif /* @@ -1364,7 +1367,7 @@ static void flat_LOOKUP8_triangle( GLcontext *ctx, GLuint v0, GLuint v1, - +#if 0 /* * This function is called if we're about to render triangles into an * X window/pixmap. It sets the polygon stipple pattern if enabled. @@ -1437,6 +1440,7 @@ static void setup_x_polygon_options( GLcontext *ctx ) XMesaSetFillStyle( xmesa->display, xmesa->xm_buffer->gc1, fill_type ); XMesaSetFillStyle( xmesa->display, xmesa->xm_buffer->gc2, fill_type ); } +#endif #ifdef DEBUG @@ -1524,8 +1528,10 @@ _xmesa_print_triangle_func( triangle_func triFunc ) printf("flat_DITHER8_triangle\n"); else if (triFunc ==flat_LOOKUP8_triangle) printf("flat_LOOKUP8_triangle\n"); +#if 0 else if (triFunc ==flat_pixmap_triangle) printf("flat_pixmap_triangle\n"); +#endif else printf("???\n"); } diff --git a/xc/extras/Mesa/src/aatriangle.c b/xc/extras/Mesa/src/aatriangle.c index d631b0a6f..d0a613585 100644 --- a/xc/extras/Mesa/src/aatriangle.c +++ b/xc/extras/Mesa/src/aatriangle.c @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/aatriangle.c,v 1.3 2001/12/11 09:18:54 alanh Exp $ */ /* * Mesa 3-D graphics library * Version: 3.3 @@ -37,6 +37,7 @@ #include "span.h" #include "types.h" #include "vb.h" +#include "mmath.h" #endif diff --git a/xc/extras/Mesa/src/aatritemp.h b/xc/extras/Mesa/src/aatritemp.h index 2115ee9cf..5936b9657 100644 --- a/xc/extras/Mesa/src/aatritemp.h +++ b/xc/extras/Mesa/src/aatritemp.h @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/aatritemp.h,v 1.5 2001/12/11 09:18:54 alanh Exp $ */ /* * Mesa 3-D graphics library * Version: 3.3 @@ -120,7 +120,7 @@ const GLfloat area = majDx * botDy - botDx * majDy; ltor = (GLboolean) (area < 0.0F); /* Do backface culling */ - if (area * bf < 0 || area * area < .0025) + if (area * bf < 0 || area == 0 || IS_INF_OR_NAN(area) ) return; } diff --git a/xc/extras/Mesa/src/dd.h b/xc/extras/Mesa/src/dd.h index 7b269421f..774061d10 100644 --- a/xc/extras/Mesa/src/dd.h +++ b/xc/extras/Mesa/src/dd.h @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/dd.h,v 1.11 2001/10/28 03:32:06 tsi Exp $ */ /* * Mesa 3-D graphics library * Version: 3.4 @@ -938,6 +938,8 @@ struct dd_function_table { void (*BlendFuncSeparate)( GLcontext *ctx, GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorA, GLenum dfactorA ); + void (*BlendConstColor)(GLcontext *ctx, GLfloat red, GLfloat green, + GLfloat blue, GLfloat alpha); void (*ClearDepth)(GLcontext *ctx, GLclampd d); void (*CullFace)(GLcontext *ctx, GLenum mode); void (*FrontFace)(GLcontext *ctx, GLenum mode); @@ -953,6 +955,7 @@ struct dd_function_table { void (*LineStipple)(GLcontext *ctx, GLint factor, GLushort pattern ); void (*LineWidth)(GLcontext *ctx, GLfloat width); void (*LogicOpcode)(GLcontext *ctx, GLenum opcode); + void (*PointSize)(GLcontext *ctx, GLfloat size); void (*PolygonMode)(GLcontext *ctx, GLenum face, GLenum mode); void (*PolygonStipple)(GLcontext *ctx, const GLubyte *mask ); void (*Scissor)(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h); diff --git a/xc/extras/Mesa/src/glapi.c b/xc/extras/Mesa/src/glapi.c index 8a7611e4e..de19e24dc 100644 --- a/xc/extras/Mesa/src/glapi.c +++ b/xc/extras/Mesa/src/glapi.c @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/glapi.c,v 1.10 2001/12/19 15:44:34 tsi Exp $ */ /* * Mesa 3-D graphics library * Version: 3.4 @@ -1738,6 +1738,7 @@ _glapi_get_proc_name(GLuint offset) void _glapi_check_table(const struct _glapi_table *table) { +#ifdef DEBUG const GLuint entries = _glapi_get_dispatch_table_size(); const void **tab = (const void **) table; GLuint i; @@ -1745,7 +1746,6 @@ _glapi_check_table(const struct _glapi_table *table) assert(tab[i]); } -#ifdef DEBUG /* Do some spot checks to be sure that the dispatch table * slots are assigned correctly. */ diff --git a/xc/extras/Mesa/src/glthread.h b/xc/extras/Mesa/src/glthread.h index 37ad9e46a..fd3f0cc73 100644 --- a/xc/extras/Mesa/src/glthread.h +++ b/xc/extras/Mesa/src/glthread.h @@ -22,7 +22,7 @@ * 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/extras/Mesa/src/glthread.h,v 1.3 2001/10/28 03:32:06 tsi Exp $ */ /* * Thread support for gl dispatch. @@ -184,8 +184,13 @@ typedef xthread_t _glthread_Thread; typedef xmutex_rec _glthread_Mutex; +#ifdef XMUTEX_INITIALIZER #define _glthread_DECLARE_STATIC_MUTEX(name) \ static _glthread_Mutex name = XMUTEX_INITIALIZER +#else +#define _glthread_DECLARE_STATIC_MUTEX(name) \ + static _glthread_Mutex name +#endif #define _glthread_INIT_MUTEX(name) \ xmutex_init(&(name)) diff --git a/xc/extras/Mesa/src/lines.c b/xc/extras/Mesa/src/lines.c index 57e968aa9..69025863a 100644 --- a/xc/extras/Mesa/src/lines.c +++ b/xc/extras/Mesa/src/lines.c @@ -557,6 +557,7 @@ static void general_flat_rgba_line( GLcontext *ctx, GLuint vert0, GLuint vert1, GLuint pvert ) { const GLubyte *color = ctx->VB->ColorPtr->data[pvert]; + GLuint count; PB_SET_COLOR( ctx->PB, color[0], color[1], color[2], color[3] ); if (ctx->Line.StippleFlag) { @@ -565,7 +566,10 @@ static void general_flat_rgba_line( GLcontext *ctx, #define INTERP_Z 1 #define WIDE 1 #define STIPPLE 1 -#define PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, Z); +#define PLOT(X,Y) \ + PB_WRITE_PIXEL(ctx->PB, X, Y, Z); \ + count = ctx->PB->count; \ + CHECK_FULL(count); #include "linetemp.h" } else { @@ -585,7 +589,10 @@ static void general_flat_rgba_line( GLcontext *ctx, #define INTERP_XY 1 #define INTERP_Z 1 #define WIDE 1 -#define PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, Z); +#define PLOT(X,Y) \ + PB_WRITE_PIXEL(ctx->PB, X, Y, Z); \ + count = ctx->PB->count; \ + CHECK_FULL(count); #include "linetemp.h" } } diff --git a/xc/extras/Mesa/src/linetemp.h b/xc/extras/Mesa/src/linetemp.h index 2c4eac4b0..8eef034ef 100644 --- a/xc/extras/Mesa/src/linetemp.h +++ b/xc/extras/Mesa/src/linetemp.h @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/linetemp.h,v 1.11 2001/12/11 09:18:54 alanh Exp $ */ /* * Mesa 3-D graphics library * Version: 3.1 @@ -180,6 +180,17 @@ } #endif + /* Cull primitives with malformed coordinates. + */ + { + float tmp = VB->Win.data[vert0][0] + + VB->Win.data[vert0][1] + + VB->Win.data[vert1][0] + + VB->Win.data[vert1][1]; + if (IS_INF_OR_NAN(tmp)) + return; + } + /* * Despite being clipped to the view volume, the line's window coordinates * may just lie outside the window bounds. That is, if the legal window diff --git a/xc/extras/Mesa/src/lnaatemp.h b/xc/extras/Mesa/src/lnaatemp.h index 9cde169e3..38add4586 100644 --- a/xc/extras/Mesa/src/lnaatemp.h +++ b/xc/extras/Mesa/src/lnaatemp.h @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/lnaatemp.h,v 1.14 2001/12/11 09:18:54 alanh Exp $ */ /* * Mesa 3-D graphics library * Version: 3.3 @@ -65,14 +65,14 @@ #define FixedToDepth(F) ((F) >> fixedToDepthShift) #ifdef INTERP_RGBA GLfixed fr, fg, fb, fa; /* fixed-pt RGBA */ - GLfixed dfr, dfg, dfb, dfa; /* fixed-pt RGBA deltas */ + GLfixed dfr = 0, dfg = 0, dfb = 0, dfa = 0; /* fixed-pt RGBA deltas */ #endif #ifdef INTERP_SPEC GLfixed fsr, fsg, fsb; /* fixed-pt specular RGBA */ - GLfixed dfsr, dfsg, dfsb; /* fixed-pt specular RGBA deltas */ + GLfixed dfsr = 0, dfsg = 0, dfsb = 0; /* fixed-pt specular RGBA deltas */ #endif #ifdef INTERP_INDEX - GLfixed fi, dfi; + GLfixed fi, dfi = 0; #endif #if defined(INTERP_STUV0) || defined(INTERP_STUV1) GLfloat invw0 = VB->Win.data[vert0][3]; @@ -96,6 +96,17 @@ GLfloat hv01 = invw0, dhv1 = invw1 - invw0; #endif + /* Cull primitives with malformed coordinates. + */ + { + float tmp = VB->Win.data[vert0][0] + + VB->Win.data[vert0][1] + + VB->Win.data[vert1][0] + + VB->Win.data[vert1][1]; + if (IS_INF_OR_NAN(tmp)) + return; + } + if (dx == 0 && dy == 0) return; diff --git a/xc/extras/Mesa/src/mmath.c b/xc/extras/Mesa/src/mmath.c index d93400d20..e0fe9820b 100644 --- a/xc/extras/Mesa/src/mmath.c +++ b/xc/extras/Mesa/src/mmath.c @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/mmath.c,v 1.5 2001/12/11 09:18:54 alanh Exp $ */ /* * Mesa 3-D graphics library * Version: 3.3 @@ -28,6 +28,7 @@ #include "all.h" #else #include "glheader.h" +#include "macros.h" #include "mmath.h" #endif diff --git a/xc/extras/Mesa/src/mmath.h b/xc/extras/Mesa/src/mmath.h index a45465462..86212b92f 100644 --- a/xc/extras/Mesa/src/mmath.h +++ b/xc/extras/Mesa/src/mmath.h @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/mmath.h,v 1.15 2002/01/07 17:26:06 alanh Exp $ */ /* * Mesa 3-D graphics library * Version: 3.4 @@ -233,6 +233,7 @@ do { \ */ #if defined(__i386__) || defined(__sparc__) || defined(__s390x__) || \ + defined(__ppc__) || defined(__powerpc__) || \ ( defined(__alpha__) && ( defined( __IEEE_FLOAT ) || !defined( VMS ) ) ) #define USE_IEEE #define IEEE_ONE 0x3f7f0000 @@ -285,6 +286,17 @@ do { \ #endif +#ifdef USE_IEEE +/* Returns TRUE for x == Inf or x == NaN. */ +static INLINE int IS_INF_OR_NAN( float x ) +{ + union {float f; int i;} tmp; + tmp.f = x; + return !(int)((unsigned int)((tmp.i & 0x7fffffff)-0x7f800000) >> 31); +} +#else +#define IS_INF_OR_NAN(x) (!finite(x)) +#endif extern float gl_ubyte_to_float_color_tab[256]; extern float gl_ubyte_to_float_255_color_tab[256]; diff --git a/xc/extras/Mesa/src/points.c b/xc/extras/Mesa/src/points.c index c912d20df..a4eb15863 100644 --- a/xc/extras/Mesa/src/points.c +++ b/xc/extras/Mesa/src/points.c @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/points.c,v 1.8 2001/12/11 09:18:54 alanh Exp $ */ /* * Mesa 3-D graphics library * Version: 3.4 @@ -162,6 +162,8 @@ size1_ci_points( GLcontext *ctx, GLuint first, GLuint last ) win = &VB->Win.data[first][0]; for (i = first; i < last; i++) { if (VB->ClipMask[i] == 0) { + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; pbx[pbcount] = (GLint) win[0]; pby[pbcount] = (GLint) win[1]; pbz[pbcount] = (GLint) (win[2] + ctx->PointZoffset); @@ -190,10 +192,14 @@ size1_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) if (VB->ClipMask[i] == 0) { GLint x, y, z; GLint red, green, blue, alpha; + GLfloat *win = VB->Win.data[i]; + + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; - x = (GLint) VB->Win.data[i][0]; - y = (GLint) VB->Win.data[i][1]; - z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); + x = (GLint) win[0]; + y = (GLint) win[1]; + z = (GLint) (win[2] + ctx->PointZoffset); red = VB->ColorPtr->data[i][0]; green = VB->ColorPtr->data[i][1]; @@ -224,10 +230,13 @@ general_ci_points( GLcontext *ctx, GLuint first, GLuint last ) if (VB->ClipMask[i] == 0) { GLint x0, x1, y0, y1; GLint ix, iy; + GLfloat *win = VB->Win.data[i]; + GLint x = (GLint) win[0]; + GLint y = (GLint) win[1]; + GLint z = (GLint) (win[2] + ctx->PointZoffset); - GLint x = (GLint) VB->Win.data[i][0]; - GLint y = (GLint) VB->Win.data[i][1]; - GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; if (isize & 1) { /* odd size */ @@ -273,10 +282,13 @@ general_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) if (VB->ClipMask[i] == 0) { GLint x0, x1, y0, y1; GLint ix, iy; + GLfloat *win = VB->Win.data[i]; + GLint x = (GLint) win[0]; + GLint y = (GLint) win[1]; + GLint z = (GLint) (win[2] + ctx->PointZoffset); - GLint x = (GLint) VB->Win.data[i][0]; - GLint y = (GLint) VB->Win.data[i][1]; - GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; if (isize & 1) { /* odd size */ @@ -328,11 +340,14 @@ textured_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) GLint ix, iy, radius; GLint red, green, blue, alpha; GLfloat s, t, u; - - GLint x = (GLint) VB->Win.data[i][0]; - GLint y = (GLint) VB->Win.data[i][1]; - GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); GLint isize = (GLint) (ctx->Point.Size + 0.5F); + GLfloat *win = VB->Win.data[i]; + GLint x = (GLint) win[0]; + GLint y = (GLint) win[1]; + GLint z = (GLint) (win[2] + ctx->PointZoffset); + + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; if (isize < 1) { isize = 1; @@ -418,11 +433,14 @@ multitextured_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) GLint sRed, sGreen, sBlue; GLfloat s, t, u; GLfloat s1, t1, u1; - - GLint x = (GLint) VB->Win.data[i][0]; - GLint y = (GLint) VB->Win.data[i][1]; - GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); GLint isize = (GLint) (ctx->Point.Size + 0.5F); + GLfloat *win = VB->Win.data[i]; + GLint x = (GLint) win[0]; + GLint y = (GLint) win[1]; + GLint z = (GLint) (win[2] + ctx->PointZoffset); + + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; if (isize < 1) { isize = 1; @@ -556,14 +574,18 @@ antialiased_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) GLint red, green, blue, alpha; GLfloat s = 0.0F, t = 0.0F, u = 0.0F; GLfloat s1 = 0.0F, t1 = 0.0F, u1 = 0.0F; - GLfloat vx = VB->Win.data[i][0]; - GLfloat vy = VB->Win.data[i][1]; + GLfloat *win = VB->Win.data[i]; + GLfloat vx = win[0]; + GLfloat vy = win[1]; GLint xmin = (GLint) (vx - radius); GLint xmax = (GLint) (vx + radius); GLint ymin = (GLint) (vy - radius); GLint ymax = (GLint) (vy + radius); - GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); + GLint z = (GLint) (win[2] + ctx->PointZoffset); + + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; red = VB->ColorPtr->data[i][0]; green = VB->ColorPtr->data[i][1]; @@ -671,25 +693,29 @@ antialiased_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) GLint xmin, ymin, xmax, ymax; GLint x, y, z; GLint red, green, blue, alpha; + GLfloat *win = VB->Win.data[i]; - xmin = (GLint) (VB->Win.data[i][0] - 0.0 - radius); - xmax = (GLint) (VB->Win.data[i][0] - 0.0 + radius); - ymin = (GLint) (VB->Win.data[i][1] - 0.0 - radius); - ymax = (GLint) (VB->Win.data[i][1] - 0.0 + radius); - z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; + + xmin = (GLint) (win[0] - 0.0 - radius); + xmax = (GLint) (win[0] - 0.0 + radius); + ymin = (GLint) (win[1] - 0.0 - radius); + ymax = (GLint) (win[1] - 0.0 + radius); + z = (GLint) (win[2] + ctx->PointZoffset); red = VB->ColorPtr->data[i][0]; green = VB->ColorPtr->data[i][1]; blue = VB->ColorPtr->data[i][2]; /* - printf("point %g, %g\n", VB->Win.data[i][0], VB->Win.data[i][1]); + printf("point %g, %g\n", win[0], win[1]); printf("%d..%d X %d..%d\n", xmin, xmax, ymin, ymax); */ for (y = ymin; y <= ymax; y++) { for (x = xmin; x <= xmax; x++) { - const GLfloat dx = x + 0.5F - VB->Win.data[i][0]; - const GLfloat dy = y + 0.5F - VB->Win.data[i][1]; + const GLfloat dx = x + 0.5F - win[0]; + const GLfloat dy = y + 0.5F - win[1]; const GLfloat dist2 = dx*dx + dy*dy; if (dist2 < rmax2) { alpha = VB->ColorPtr->data[i][3]; @@ -828,11 +854,15 @@ dist_atten_general_ci_points( GLcontext *ctx, GLuint first, GLuint last ) GLint x0, x1, y0, y1; GLint ix, iy; GLint isize, radius; - GLint x = (GLint) VB->Win.data[i][0]; - GLint y = (GLint) VB->Win.data[i][1]; - GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); + GLfloat *win = VB->Win.data[i]; + GLint x = (GLint) win[0]; + GLint y = (GLint) win[1]; + GLint z = (GLint) (win[2] + ctx->PointZoffset); GLfloat dsize = psize * dist[i]; + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; + if (dsize >= ctx->Point.Threshold) { isize = (GLint) (MIN2(dsize, ctx->Point.MaxSize) + 0.5F); } @@ -890,12 +920,16 @@ dist_atten_general_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) GLint x0, x1, y0, y1; GLint ix, iy; GLint isize, radius; - GLint x = (GLint) VB->Win.data[i][0]; - GLint y = (GLint) VB->Win.data[i][1]; - GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); + GLfloat *win = VB->Win.data[i]; + GLint x = (GLint) win[0]; + GLint y = (GLint) win[1]; + GLint z = (GLint) (win[2] + ctx->PointZoffset); GLfloat dsize=psize*dist[i]; GLubyte alpha; + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; + if (dsize >= ctx->Point.Threshold) { isize = (GLint) (MIN2(dsize,ctx->Point.MaxSize)+0.5F); alpha = VB->ColorPtr->data[i][3]; @@ -963,12 +997,15 @@ dist_atten_textured_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) GLint red, green, blue, alpha; GLfloat s = 0.0F, t = 0.0F, u = 0.0F; GLfloat s1 = 0.0F, t1 = 0.0F, u1 = 0.0F; + GLfloat *win = VB->Win.data[i]; + GLint x = (GLint) win[0]; + GLint y = (GLint) win[1]; + GLint z = (GLint) (win[2] + ctx->PointZoffset); + GLfloat dsize = psize*dist[i]; - GLint x = (GLint) VB->Win.data[i][0]; - GLint y = (GLint) VB->Win.data[i][1]; - GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; - GLfloat dsize = psize*dist[i]; if(dsize >= ctx->Point.Threshold) { isize = (GLint) (MIN2(dsize, ctx->Point.MaxSize) + 0.5F); alpha = VB->ColorPtr->data[i][3]; @@ -1112,6 +1149,10 @@ dist_atten_antialiased_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) GLfloat s = 0.0F, t = 0.0F, u = 0.0F; GLfloat s1 = 0.0F, t1 = 0.0F, u1 = 0.0F; GLfloat dsize = psize * dist[i]; + GLfloat *win = VB->Win.data[i]; + + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; if (dsize >= ctx->Point.Threshold) { radius = MIN2(dsize, ctx->Point.MaxSize) * 0.5F; @@ -1128,11 +1169,11 @@ dist_atten_antialiased_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) rmax2 = rmax * rmax; cscale = 256.0F / (rmax2 - rmin2); - xmin = (GLint) (VB->Win.data[i][0] - radius); - xmax = (GLint) (VB->Win.data[i][0] + radius); - ymin = (GLint) (VB->Win.data[i][1] - radius); - ymax = (GLint) (VB->Win.data[i][1] + radius); - z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); + xmin = (GLint) (win[0] - radius); + xmax = (GLint) (win[0] + radius); + ymin = (GLint) (win[1] - radius); + ymax = (GLint) (win[1] + radius); + z = (GLint) (win[2] + ctx->PointZoffset); red = VB->ColorPtr->data[i][0]; green = VB->ColorPtr->data[i][1]; @@ -1204,8 +1245,8 @@ dist_atten_antialiased_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) for (y = ymin; y <= ymax; y++) { for (x = xmin; x <= xmax; x++) { - const GLfloat dx = x + 0.5F - VB->Win.data[i][0]; - const GLfloat dy = y + 0.5F - VB->Win.data[i][1]; + const GLfloat dx = x + 0.5F - win[0]; + const GLfloat dy = y + 0.5F - win[1]; const GLfloat dist2 = dx*dx + dy*dy; if (dist2 < rmax2) { alpha = VB->ColorPtr->data[i][3]; @@ -1238,6 +1279,10 @@ dist_atten_antialiased_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) GLint x, y, z; GLint red, green, blue, alpha; GLfloat dsize = psize * dist[i]; + GLfloat *win = VB->Win.data[i]; + + if (IS_INF_OR_NAN(win[0] + win[1])) + continue; if (dsize >= ctx->Point.Threshold) { radius = MIN2(dsize, ctx->Point.MaxSize) * 0.5F; @@ -1254,11 +1299,11 @@ dist_atten_antialiased_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) rmax2 = rmax * rmax; cscale = 256.0F / (rmax2 - rmin2); - xmin = (GLint) (VB->Win.data[i][0] - radius); - xmax = (GLint) (VB->Win.data[i][0] + radius); - ymin = (GLint) (VB->Win.data[i][1] - radius); - ymax = (GLint) (VB->Win.data[i][1] + radius); - z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); + xmin = (GLint) (win[0] - radius); + xmax = (GLint) (win[0] + radius); + ymin = (GLint) (win[1] - radius); + ymax = (GLint) (win[1] + radius); + z = (GLint) (win[2] + ctx->PointZoffset); red = VB->ColorPtr->data[i][0]; green = VB->ColorPtr->data[i][1]; @@ -1266,8 +1311,8 @@ dist_atten_antialiased_rgba_points( GLcontext *ctx, GLuint first, GLuint last ) for (y = ymin; y <= ymax; y++) { for (x = xmin; x <= xmax; x++) { - const GLfloat dx = x + 0.5F - VB->Win.data[i][0]; - const GLfloat dy = y + 0.5F - VB->Win.data[i][1]; + const GLfloat dx = x + 0.5F - win[0]; + const GLfloat dy = y + 0.5F - win[1]; const GLfloat dist2 = dx * dx + dy * dy; if (dist2 < rmax2) { alpha = VB->ColorPtr->data[i][3]; diff --git a/xc/extras/Mesa/src/stencil.c b/xc/extras/Mesa/src/stencil.c index 24080e3c3..dbf0f0330 100644 --- a/xc/extras/Mesa/src/stencil.c +++ b/xc/extras/Mesa/src/stencil.c @@ -1180,6 +1180,8 @@ void _mesa_write_stencil_span( GLcontext *ctx, GLint n, GLint x, GLint y, const GLstencil stencil[] ) { + const GLstencil *ssrc = stencil; + if (y < 0 || y >= ctx->DrawBuffer->Height || x + n <= 0 || x >= ctx->DrawBuffer->Width) { /* span is completely outside framebuffer */ @@ -1190,7 +1192,7 @@ _mesa_write_stencil_span( GLcontext *ctx, GLint n, GLint x, GLint y, GLint dx = -x; x = 0; n -= dx; - stencil += dx; + ssrc += dx; } if (x + n > ctx->DrawBuffer->Width) { GLint dx = x + n - ctx->DrawBuffer->Width; @@ -1201,16 +1203,16 @@ _mesa_write_stencil_span( GLcontext *ctx, GLint n, GLint x, GLint y, } if (ctx->Driver.WriteStencilSpan) { - (*ctx->Driver.WriteStencilSpan)( ctx, n, x, y, stencil, NULL ); + (*ctx->Driver.WriteStencilSpan)( ctx, n, x, y, ssrc, NULL ); } else if (ctx->DrawBuffer->Stencil) { GLstencil *s = STENCIL_ADDRESS( x, y ); #if STENCIL_BITS == 8 - MEMCPY( s, stencil, n * sizeof(GLstencil) ); + MEMCPY( s, ssrc, n * sizeof(GLstencil) ); #else GLuint i; for (i=0;i<n;i++) - s[i] = stencil[i]; + s[i] = ssrc[i]; #endif } } diff --git a/xc/extras/Mesa/src/translate.c b/xc/extras/Mesa/src/translate.c index 92149c237..5619d14b9 100644 --- a/xc/extras/Mesa/src/translate.c +++ b/xc/extras/Mesa/src/translate.c @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/translate.c,v 1.4 2001/12/11 09:18:54 alanh Exp $ */ /* * Mesa 3-D graphics library * Version: 3.3 @@ -33,6 +33,7 @@ #else #include "glheader.h" #include "mem.h" +#include "macros.h" #include "mmath.h" #include "translate.h" #include "types.h" diff --git a/xc/extras/Mesa/src/triangle.c b/xc/extras/Mesa/src/triangle.c index 5949bd782..4723fab94 100644 --- a/xc/extras/Mesa/src/triangle.c +++ b/xc/extras/Mesa/src/triangle.c @@ -372,7 +372,7 @@ static void affine_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1, GLint filter = obj->MinFilter; \ GLint envmode = unit->EnvMode; \ GLint comp, tbytesline, tsize; \ - GLfixed er, eg, eb, ea; \ + GLfixed er = 0, eg = 0, eb = 0, ea = 0; \ GLint tr, tg, tb, ta; \ if (!texture) { \ if (!_mesa_get_teximages_from_driver(ctx, obj)) \ @@ -666,7 +666,7 @@ static void persp_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1, GLint envmode = unit->EnvMode; \ GLfloat sscale, tscale; \ GLint comp, tbytesline, tsize; \ - GLfixed er, eg, eb, ea; \ + GLfixed er = 0, eg = 0, eb = 0, ea = 0; \ GLint tr, tg, tb, ta; \ if (!texture) { \ if (!_mesa_get_teximages_from_driver(ctx, obj)) \ @@ -891,7 +891,7 @@ static void general_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1, #define INTERP_STUV 1 #define SETUP_CODE \ GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ - GLint r, g, b, a; \ + GLint r = 0, g = 0, b = 0, a = 0; \ if (flat_shade) { \ r = VB->ColorPtr->data[pv][0]; \ g = VB->ColorPtr->data[pv][1]; \ @@ -977,7 +977,7 @@ static void general_textured_spec_triangle1( GLcontext *ctx, GLuint v0, #define INTERP_STUV 1 #define SETUP_CODE \ GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ - GLint r, g, b, a, sr, sg, sb; \ + GLint r = 0, g = 0, b = 0, a = 0, sr = 0, sg = 0, sb = 0; \ if (flat_shade) { \ r = VB->ColorPtr->data[pv][0]; \ g = VB->ColorPtr->data[pv][1]; \ @@ -1098,7 +1098,7 @@ static void lambda_textured_triangle1( GLcontext *ctx, GLuint v0, GLuint v1, const GLfloat twidth = (GLfloat) texImage->Width; \ const GLfloat theight = (GLfloat) texImage->Height; \ const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ - GLint r, g, b, a; \ + GLint r = 0, g = 0, b = 0, a = 0; \ if (flat_shade) { \ r = VB->ColorPtr->data[pv][0]; \ g = VB->ColorPtr->data[pv][1]; \ @@ -1195,7 +1195,7 @@ static void lambda_textured_spec_triangle1( GLcontext *ctx, GLuint v0, const GLfloat twidth = (GLfloat) texImage->Width; \ const GLfloat theight = (GLfloat) texImage->Height; \ const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ - GLint r, g, b, a, sr, sg, sb; \ + GLint r = 0, g = 0, b = 0, a = 0, sr = 0, sg = 0, sb = 0; \ if (flat_shade) { \ r = VB->ColorPtr->data[pv][0]; \ g = VB->ColorPtr->data[pv][1]; \ @@ -1304,7 +1304,7 @@ static void lambda_multitextured_triangle1( GLcontext *ctx, GLuint v0, const struct gl_texture_image *texImage0, *texImage1; \ GLfloat twidth0, theight0, twidth1, theight1; \ const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ - GLint r, g, b, a; \ + GLint r = 0, g = 0, b = 0, a = 0; \ if (obj0) { \ texImage0 = obj0->Image[obj0->BaseLevel]; \ twidth0 = texImage0->Width; \ diff --git a/xc/extras/Mesa/src/tritemp.h b/xc/extras/Mesa/src/tritemp.h index 71e62a31a..2478821fa 100644 --- a/xc/extras/Mesa/src/tritemp.h +++ b/xc/extras/Mesa/src/tritemp.h @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/tritemp.h,v 1.14 2002/01/14 21:07:57 tsi Exp $ */ /* * Mesa 3-D graphics library * Version: 3.4.1 @@ -150,7 +150,7 @@ if (area * bf < 0.0) return; - if (area == 0.0F) + if (area == 0.0F || IS_INF_OR_NAN(area) ) return; /* check for very tiny triangle */ @@ -578,56 +578,58 @@ { int subTriangle; - GLfixed fx, fxLeftEdge, fxRightEdge, fdxLeftEdge, fdxRightEdge; + GLfixed fx; + GLfixed fxLeftEdge = 0, fxRightEdge = 0; + GLfixed fdxLeftEdge = 0, fdxRightEdge = 0; GLfixed fdxOuter; int idxOuter; float dxOuter; - GLfixed fError, fdError; + GLfixed fError = 0, fdError = 0; float adjx, adjy; GLfixed fy; - int iy; + int iy = 0; #ifdef PIXEL_ADDRESS - PIXEL_TYPE *pRow; - int dPRowOuter, dPRowInner; /* offset in bytes */ + PIXEL_TYPE *pRow = NULL; + int dPRowOuter = 0, dPRowInner; /* offset in bytes */ #endif #ifdef INTERP_Z # ifdef DEPTH_TYPE - DEPTH_TYPE *zRow; - int dZRowOuter, dZRowInner; /* offset in bytes */ + DEPTH_TYPE *zRow = NULL; + int dZRowOuter = 0, dZRowInner; /* offset in bytes */ # endif - GLfixed fz, fdzOuter, fdzInner; + GLfixed fz = 0, fdzOuter = 0, fdzInner; #endif #ifdef INTERP_RGB - GLfixed fr, fdrOuter, fdrInner; - GLfixed fg, fdgOuter, fdgInner; - GLfixed fb, fdbOuter, fdbInner; + GLfixed fr = 0, fdrOuter = 0, fdrInner; + GLfixed fg = 0, fdgOuter = 0, fdgInner; + GLfixed fb = 0, fdbOuter = 0, fdbInner; #endif #ifdef INTERP_SPEC - GLfixed fsr, fdsrOuter, fdsrInner; - GLfixed fsg, fdsgOuter, fdsgInner; - GLfixed fsb, fdsbOuter, fdsbInner; + GLfixed fsr = 0, fdsrOuter = 0, fdsrInner; + GLfixed fsg = 0, fdsgOuter = 0, fdsgInner; + GLfixed fsb = 0, fdsbOuter = 0, fdsbInner; #endif #ifdef INTERP_ALPHA - GLfixed fa, fdaOuter, fdaInner; + GLfixed fa = 0, fdaOuter = 0, fdaInner; #endif #ifdef INTERP_INDEX - GLfixed fi, fdiOuter, fdiInner; + GLfixed fi = 0, fdiOuter = 0, fdiInner; #endif #ifdef INTERP_INT_ST - GLfixed fs, fdsOuter, fdsInner; - GLfixed ft, fdtOuter, fdtInner; + GLfixed fs = 0, fdsOuter = 0, fdsInner; + GLfixed ft = 0, fdtOuter = 0, fdtInner; #endif #ifdef INTERP_STUV - GLfloat sLeft, dsOuter, dsInner; - GLfloat tLeft, dtOuter, dtInner; - GLfloat uLeft, duOuter, duInner; - GLfloat vLeft, dvOuter, dvInner; + GLfloat sLeft = 0, dsOuter = 0, dsInner; + GLfloat tLeft = 0, dtOuter = 0, dtInner; + GLfloat uLeft = 0, duOuter = 0, duInner; + GLfloat vLeft = 0, dvOuter = 0, dvInner; #endif #ifdef INTERP_STUV1 - GLfloat s1Left, ds1Outer, ds1Inner; - GLfloat t1Left, dt1Outer, dt1Inner; - GLfloat u1Left, du1Outer, du1Inner; - GLfloat v1Left, dv1Outer, dv1Inner; + GLfloat s1Left = 0, ds1Outer = 0, ds1Inner; + GLfloat t1Left = 0, dt1Outer = 0, dt1Inner; + GLfloat u1Left = 0, du1Outer = 0, du1Inner; + GLfloat v1Left = 0, dv1Outer = 0, dv1Inner; #endif for (subTriangle=0; subTriangle<=1; subTriangle++) { diff --git a/xc/extras/Mesa/src/vbrender.c b/xc/extras/Mesa/src/vbrender.c index ae3a7141a..9a1fff138 100644 --- a/xc/extras/Mesa/src/vbrender.c +++ b/xc/extras/Mesa/src/vbrender.c @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/vbrender.c,v 1.10 2001/10/28 03:32:07 tsi Exp $ */ /* * Mesa 3-D graphics library * Version: 3.3 @@ -402,9 +402,6 @@ static void null_quad( GLcontext *ctx, GLuint v0, GLuint v1, #endif -extern const char *gl_prim_name[]; - - /* * Either the vertex buffer is full (VB->Count==VB_MAX) or glEnd() has been * called. Render the primitives defined by the vertices and reset the diff --git a/xc/extras/Mesa/src/xform_tmp.h b/xc/extras/Mesa/src/xform_tmp.h index 261548a4f..26e29d581 100644 --- a/xc/extras/Mesa/src/xform_tmp.h +++ b/xc/extras/Mesa/src/xform_tmp.h @@ -1,4 +1,4 @@ - +/* $XFree86: xc/extras/Mesa/src/xform_tmp.h,v 1.9 2001/10/28 03:32:07 tsi Exp $ */ /* * Mesa 3-D graphics library * Version: 3.1 diff --git a/xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c b/xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c index 8eee9fc23..ed5d7fa88 100755 --- a/xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c +++ b/xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c @@ -32,6 +32,7 @@ ** compliant with the OpenGL(R) version 1.2.1 Specification. ** */ +/* $XFree86: xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c,v 1.4 2001/10/28 03:32:25 tsi Exp $ */ #include <stdio.h> #include <GL/glx.h> @@ -432,8 +433,6 @@ static void createAttribList(GLwDrawingAreaWidget w) /* Initialize the visualInfo based on the attribute list */ static void createVisualInfo(GLwDrawingAreaWidget w) { - static XVisualInfo *visualInfo; - assert(w->glwDrawingArea.attribList); w->glwDrawingArea.visualInfo = glXChooseVisual(XtDisplay(w), XScreenNumberOfScreen(XtScreen(w)), @@ -630,7 +629,6 @@ static void Redraw(GLwDrawingAreaWidget w, XEvent *event, Region region) { GLwDrawingAreaCallbackStruct cb; - XtCallbackList cblist; cb.reason = GLwCR_EXPOSE; cb.event = event; diff --git a/xc/extras/rman/rman.c b/xc/extras/rman/rman.c index 9d615f4fc..7e1c0f9fc 100644 --- a/xc/extras/rman/rman.c +++ b/xc/extras/rman/rman.c @@ -1,4 +1,6 @@ +#ifdef UNDEF static char rcsid[] = "Header: /home/cs/phelps/spine/rman/RCS/rman.c,v 1.144 1999/08/10 00:41:55 phelps Exp phelps $"; +#endif /* PolyglotMan by Thomas A. Phelps (phelps@ACM.org) @@ -16,7 +18,7 @@ static char rcsid[] = "Header: /home/cs/phelps/spine/rman/RCS/rman.c,v 1.144 199 source interpretation added September 24, 1996 renamed PolyglotMan due to lawsuit by Rosetta, Inc. August 8, 1997 */ -/* $XFree86: xc/extras/rman/rman.c,v 1.13 2000/12/21 18:55:27 dawes Exp $ */ +/* $XFree86: xc/extras/rman/rman.c,v 1.15 2001/11/16 16:47:51 dawes Exp $ */ /* TO DO **** @@ -54,7 +56,7 @@ static char rcsid[] = "Header: /home/cs/phelps/spine/rman/RCS/rman.c,v 1.144 199 #include <sys/stat.h> #include <fcntl.h> -#ifdef Lynx +#if defined(Lynx) || defined(__QNXNTO__) extern int optind; extern char *optarg; #endif diff --git a/xc/include/Imakefile b/xc/include/Imakefile index bb596333c..176f28099 100644 --- a/xc/include/Imakefile +++ b/xc/include/Imakefile @@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/18 04:05:43 coskrey Exp $ -XCOMM $XFree86: xc/include/Imakefile,v 3.28 2001/04/28 23:52:31 dawes Exp $ +XCOMM $XFree86: xc/include/Imakefile,v 3.29 2001/08/27 17:40:56 dawes Exp $ #define IHaveSubdirs #define PassCDebugFlags /**/ diff --git a/xc/include/bitmaps/Imakefile b/xc/include/bitmaps/Imakefile index 921b5bbf3..b856ee7d3 100644 --- a/xc/include/bitmaps/Imakefile +++ b/xc/include/bitmaps/Imakefile @@ -1,5 +1,9 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/18 04:05:43 coskrey Exp $ + + +XCOMM $XFree86: xc/include/bitmaps/Imakefile,v 1.3 2001/08/28 16:48:08 tsi Exp $ + HEADERS = \ 1x1 \ 2x2 \ diff --git a/xc/include/extensions/Imakefile b/xc/include/extensions/Imakefile index 104b07eb5..762782a91 100644 --- a/xc/include/extensions/Imakefile +++ b/xc/include/extensions/Imakefile @@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/18 04:05:44 coskrey Exp $ -XCOMM $XFree86: xc/include/extensions/Imakefile,v 3.43 2001/08/01 00:44:35 tsi Exp $ +XCOMM $XFree86: xc/include/extensions/Imakefile,v 3.47 2001/12/16 18:19:50 keithp Exp $ #if BuildScreenSaverExt || BuildScreenSaveLibrary SCREENSAVERHEADERS = saver.h saverproto.h scrnsaver.h @@ -21,7 +21,7 @@ XF86VIDMODEHEADERS = xf86vmode.h xf86vmstr.h #if BuildXF86DGA || BuildXF86DGALibrary XF86DGAHEADERS = xf86dga.h xf86dgastr.h xf86dga1.h xf86dga1str.h #endif -#if BuildLBX +#if BuildLBX || BuildXextLib LBXHEADERS = XLbx.h lbxbuf.h lbxbufstr.h lbxdeltastr.h lbximage.h lbxopts.h \ lbxstr.h lbxzlib.h #endif @@ -41,14 +41,19 @@ XINERAMAHEADERS = panoramiXext.h panoramiXproto.h Xinerama.h #if BuildRender || BuildXftLibrary RENDERHEADERS = render.h renderproto.h #endif -#if BuildRandRLibrary +#if BuildRandR || BuildRandRLibrary RANDRHEADERS = randr.h randrproto.h #endif +#if BuildXTrap || BuildXTrapLibrary +XTRAPHEADERS = xtrapbits.h xtrapddmi.h xtrapdi.h xtrapemacros.h xtraplib.h \ + xtraplibp.h xtrapproto.h +#endif EXTRAHEADERS = $(SCREENSAVERHEADERS) $(XF86MISCHEADERS) $(XF86BIGFONTHEADERS) \ $(XF86VIDMODEHEADERS) $(XF86DGAHEADERS) $(XINERAMAHEADERS) \ $(LBXHEADERS) $(XVHEADERS) $(XVMCHEADERS) $(XF86RUSHHEADERS) \ - $(FONTCACHEHEADERS) $(RENDERHEADERS) $(RANDRHEADERS) + $(FONTCACHEHEADERS) $(RENDERHEADERS) $(RANDRHEADERS) \ + $(XTRAPHEADERS) diff --git a/xc/include/extensions/renderproto.h b/xc/include/extensions/renderproto.h index 222b41b1d..aa17588c6 100644 --- a/xc/include/extensions/renderproto.h +++ b/xc/include/extensions/renderproto.h @@ -1,5 +1,5 @@ /* - * $XFree86: xc/include/extensions/renderproto.h,v 1.8 2001/08/01 00:44:35 tsi Exp $ + * $XFree86: xc/include/extensions/renderproto.h,v 1.9 2001/09/07 16:21:15 keithp Exp $ * * Copyright © 2000 SuSE, Inc. * @@ -74,7 +74,7 @@ typedef struct { Colormap colormap; } xPictFormInfo; -#define sz_xPictFormInfo 24 +#define sz_xPictFormInfo 28 typedef struct { VisualID visual; diff --git a/xc/include/fonts/Imakefile b/xc/include/fonts/Imakefile index 06cb129d5..5525a68de 100644 --- a/xc/include/fonts/Imakefile +++ b/xc/include/fonts/Imakefile @@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/18 04:05:44 coskrey Exp $ -XCOMM $XFree86: xc/include/fonts/Imakefile,v 3.7 2001/01/17 17:53:26 dawes Exp $ +XCOMM $XFree86: xc/include/fonts/Imakefile,v 3.8 2001/08/27 17:40:57 dawes Exp $ HEADERS = FS.h FSproto.h fsmasks.h diff --git a/xc/lib/GL/dri/XF86dri.c b/xc/lib/GL/dri/XF86dri.c index 6bba02e3a..c4c1565d3 100644 --- a/xc/lib/GL/dri/XF86dri.c +++ b/xc/lib/GL/dri/XF86dri.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/dri/XF86dri.c,v 1.11 2000/12/07 20:26:02 dawes Exp $ */ +/* $XFree86: xc/lib/GL/dri/XF86dri.c,v 1.12 2001/08/27 17:40:57 dawes Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. diff --git a/xc/lib/GL/dri/dri_glx.c b/xc/lib/GL/dri/dri_glx.c index 87ff3edbb..d962e8585 100644 --- a/xc/lib/GL/dri/dri_glx.c +++ b/xc/lib/GL/dri/dri_glx.c @@ -24,7 +24,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/lib/GL/dri/dri_glx.c,v 1.9 2001/08/18 02:51:03 dawes Exp $ */ +/* $XFree86: xc/lib/GL/dri/dri_glx.c,v 1.10 2001/08/27 17:40:57 dawes Exp $ */ /* * Authors: diff --git a/xc/lib/GL/dri/dri_tmm.c b/xc/lib/GL/dri/dri_tmm.c index 9e3c9fa9d..def2f9bcd 100644 --- a/xc/lib/GL/dri/dri_tmm.c +++ b/xc/lib/GL/dri/dri_tmm.c @@ -24,7 +24,7 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * - * $XFree86: xc/lib/GL/dri/dri_tmm.c,v 1.2 2000/02/23 04:46:34 martin Exp $ + * $XFree86: xc/lib/GL/dri/dri_tmm.c,v 1.3 2001/08/27 17:40:57 dawes Exp $ * * * DESCRIPTION diff --git a/xc/lib/GL/dri/drm/Imakefile b/xc/lib/GL/dri/drm/Imakefile index 274540f16..6e5ff6860 100644 --- a/xc/lib/GL/dri/drm/Imakefile +++ b/xc/lib/GL/dri/drm/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/lib/GL/dri/drm/Imakefile,v 1.16 2001/04/23 19:02:11 alanh Exp $ +XCOMM $XFree86: xc/lib/GL/dri/drm/Imakefile,v 1.18 2001/10/04 18:28:21 alanh Exp $ #if GlxUseBuiltInDRIDriver #define DoNormalLib (NormalLibGlx || SharedLibGlxWithoutPIC) @@ -37,10 +37,6 @@ OS_SUBDIR2 = linux OS_SUBDIR = bsd OS_SUBDIR2 = linux #endif -#if defined(cygwinArchitecture) && 0 /* XXX FIX ME */ -OS_SUBDIR = cygwin -OS_SUBDIR2 = cygwin -#endif LinkSourceFile(xf86drm.c,$(XF86OSSRC)/$(OS_SUBDIR2)/drm) @@ -53,6 +49,7 @@ LinkSourceFile(xf86drmRadeon.c,$(XF86OSSRC)/$(OS_SUBDIR2)/drm) LinkSourceFile(drm.h,$(XF86OSSRC)/$(OS_SUBDIR2)/drm/kernel) LinkSourceFile(i810_drm.h,$(XF86OSSRC)/$(OS_SUBDIR2)/drm/kernel) +LinkSourceFile(i830_drm.h,$(XF86OSSRC)/$(OS_SUBDIR2)/drm/kernel) LinkSourceFile(mga_drm.h,$(XF86OSSRC)/$(OS_SUBDIR2)/drm/kernel) LinkSourceFile(r128_drm.h,$(XF86OSSRC)/$(OS_SUBDIR2)/drm/kernel) LinkSourceFile(radeon_drm.h,$(XF86OSSRC)/$(OS_SUBDIR2)/drm/kernel) diff --git a/xc/lib/GL/glx/pixel.c b/xc/lib/GL/glx/pixel.c index 8f771e306..353516b4a 100644 --- a/xc/lib/GL/glx/pixel.c +++ b/xc/lib/GL/glx/pixel.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/glx/pixel.c,v 1.4 2001/03/21 16:04:39 dawes Exp $ */ +/* $XFree86: xc/lib/GL/glx/pixel.c,v 1.5 2001/10/28 03:32:27 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -199,7 +199,6 @@ static void FillBitmap(__GLXcontext *gc, GLint width, GLint height, GLubyte *destImage) { GLint rowLength = gc->state.storeUnpack.rowLength; - GLint imageHeight = gc->state.storeUnpack.imageHeight; GLint alignment = gc->state.storeUnpack.alignment; GLint skipPixels = gc->state.storeUnpack.skipPixels; GLint skipRows = gc->state.storeUnpack.skipRows; @@ -277,7 +276,6 @@ void __glFillImage(__GLXcontext *gc, GLint dim, GLint width, GLint height, { GLint rowLength = gc->state.storeUnpack.rowLength; GLint imageHeight = gc->state.storeUnpack.imageHeight; - GLint imageDepth = gc->state.storeUnpack.imageDepth; GLint alignment = gc->state.storeUnpack.alignment; GLint skipPixels = gc->state.storeUnpack.skipPixels; GLint skipRows = gc->state.storeUnpack.skipRows; @@ -507,13 +505,12 @@ void __glEmptyImage(__GLXcontext *gc, GLint dim, GLint width, GLint height, { GLint rowLength = gc->state.storePack.rowLength; GLint imageHeight = gc->state.storePack.imageHeight; - GLint imageDepth = gc->state.storePack.imageDepth; GLint alignment = gc->state.storePack.alignment; GLint skipPixels = gc->state.storePack.skipPixels; GLint skipRows = gc->state.storePack.skipRows; GLint skipImages = gc->state.storePack.skipImages; GLint components, elementSize, rowSize, padding, groupsPerRow, groupSize; - GLint elementsPerRow, sourceRowSize, sourcePadding, g, h, i; + GLint elementsPerRow, sourceRowSize, sourcePadding, h, i; GLint imageSize, rowsPerImage; GLubyte *start, *iter, *itera; diff --git a/xc/lib/GL/glx/xfont.c b/xc/lib/GL/glx/xfont.c index 142aa386f..14be02f44 100644 --- a/xc/lib/GL/glx/xfont.c +++ b/xc/lib/GL/glx/xfont.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/glx/xfont.c,v 1.6 2001/05/02 15:06:02 dawes Exp $ */ +/* $XFree86: xc/lib/GL/glx/xfont.c,v 1.7 2001/10/28 03:32:27 tsi Exp $ */ /* * Mesa 3-D graphics library * Version: 3.1 @@ -171,7 +171,7 @@ fill_bitmap (Display *dpy, Window win, GC gc, static XCharStruct *isvalid(XFontStruct *fs, int which) { unsigned int rows,pages; - int byte1,byte2; + int byte1 = 0, byte2 = 0; int i,valid = 1; rows = fs->max_byte1 - fs->min_byte1 + 1; diff --git a/xc/lib/GL/mesa/dri/dri_mesa.c b/xc/lib/GL/mesa/dri/dri_mesa.c index 97aa909f9..2bf27903c 100644 --- a/xc/lib/GL/mesa/dri/dri_mesa.c +++ b/xc/lib/GL/mesa/dri/dri_mesa.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/dri/dri_mesa.c,v 1.16 2001/04/10 16:07:49 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/dri/dri_mesa.c,v 1.17 2001/08/27 17:40:57 dawes Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. diff --git a/xc/lib/GL/mesa/src/drv/common/hwlog.h b/xc/lib/GL/mesa/src/drv/common/hwlog.h index 8df6d0189..6c5a18555 100644 --- a/xc/lib/GL/mesa/src/drv/common/hwlog.h +++ b/xc/lib/GL/mesa/src/drv/common/hwlog.h @@ -24,7 +24,7 @@ * * Wittawat Yamwong <Wittawat.Yamwong@stud.uni-hannover.de> */ -/* $XFree86: xc/lib/GL/mesa/src/drv/common/hwlog.h,v 1.3 2000/11/18 19:37:05 tsi Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/common/hwlog.h,v 1.5 2001/10/31 23:22:57 tsi Exp $ */ /* Usage: * - use mgaError for error messages. Always write to X error and log file. @@ -57,15 +57,15 @@ extern hwlog_t hwlog; /* open and close log file. */ int hwOpenLog(const char *filename, char *prefix); -void hwCloseLog(); +void hwCloseLog(void); /* return 1 if log file is succesfully opened */ -int hwIsLogReady(); +int hwIsLogReady(void); /* set current log level to 'level'. Messages with level less than or equal the current log level will be written to the log file. */ void hwSetLogLevel(int level); -int hwGetLogLevel(); +int hwGetLogLevel(void); /* hwLog and hwLogv write a message to the log file. */ /* do not call these directly, use hwMsg() instead */ @@ -82,11 +82,11 @@ void hwMsg(int level, const char *format, ...); static __inline__ int hwOpenLog(const char *f, char *prefix) { hwlog.prefix=prefix; return -1; } -static __inline__ int hwIsLogReady( void ) { return 0; } -static __inline__ int hwGetLogLevel( void ) { return -1; } -static __inline__ int hwLogLevel(int level) { return 0; } -static void hwLog(int level, const char *format, ...) {} -static void hwMsg(int level, const char *format, ...) {} +#define hwIsLogReady() (0) +#define hwGetLogLevel() (-1) +#define hwLogLevel(n) (0) +#define hwLog() +#define hwMsg() #define hwCloseLog() #define hwSetLogLevel(x) diff --git a/xc/lib/GL/mesa/src/drv/ffb/ffb_vb.c b/xc/lib/GL/mesa/src/drv/ffb/ffb_vb.c index 6fa6a4ae2..9053a58d0 100644 --- a/xc/lib/GL/mesa/src/drv/ffb/ffb_vb.c +++ b/xc/lib/GL/mesa/src/drv/ffb/ffb_vb.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/ffb/ffb_vb.c,v 1.2 2000/09/24 13:51:03 alanh Exp $ +/* $XFree86: xc/lib/GL/mesa/src/drv/ffb/ffb_vb.c,v 1.3 2001/11/08 04:00:12 tsi Exp $ * * GLX Hardware Device Driver for Sun Creator/Creator3D * Copyright (C) 2000 David S. Miller @@ -180,9 +180,11 @@ void ffbDDCheckPartialRasterSetup(GLcontext *ctx, struct gl_pipeline_stage *d) void ffbDDPartialRasterSetup(struct vertex_buffer *VB) { +#if 0 ffbContextPtr fmesa = FFB_CONTEXT(VB->ctx); GLuint new = VB->pipeline->new_outputs; GLuint available = VB->pipeline->outputs; +#endif GLuint ind = 0; #if 1 diff --git a/xc/lib/GL/mesa/src/drv/gamma/gamma_texture.c b/xc/lib/GL/mesa/src/drv/gamma/gamma_texture.c index 459dd3a19..2e056e1d9 100644 --- a/xc/lib/GL/mesa/src/drv/gamma/gamma_texture.c +++ b/xc/lib/GL/mesa/src/drv/gamma/gamma_texture.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/gamma/gamma_texture.c,v 1.3 2000/06/17 00:02:56 martin Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/gamma/gamma_texture.c,v 1.4 2001/08/27 17:40:57 dawes Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. diff --git a/xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c b/xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c index 6d0428fb2..c7cf9ac35 100644 --- a/xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c +++ b/xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c @@ -24,7 +24,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/lib/GL/mesa/src/drv/i810/i810_xmesa.c,v 1.13 2001/08/18 02:51:04 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c,v 1.14 2001/10/02 11:44:13 alanh Exp $ */ /* * Authors: @@ -155,9 +155,9 @@ GLboolean XMesaInitDriver(__DRIscreenPrivate *sPriv) /* Check that the DRM driver version is compatible */ if (sPriv->drmMajor != 1 || - sPriv->drmMinor < 1) { + sPriv->drmMinor < 2) { char msg[1000]; - sprintf(msg, "i810 DRI driver expected DRM driver version 1.1 or greater but got version %d.%d.%d", sPriv->drmMajor, sPriv->drmMinor, sPriv->drmPatch); + sprintf(msg, "i810 DRI driver expected DRM driver version 1.2 or greater but got version %d.%d.%d", sPriv->drmMajor, sPriv->drmMinor, sPriv->drmPatch); __driMesaMessage(msg); return GL_FALSE; } diff --git a/xc/lib/GL/mesa/src/drv/i810/i810context.h b/xc/lib/GL/mesa/src/drv/i810/i810context.h index 17882b3be..0ac05df68 100644 --- a/xc/lib/GL/mesa/src/drv/i810/i810context.h +++ b/xc/lib/GL/mesa/src/drv/i810/i810context.h @@ -21,7 +21,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ -/* $XFree86: xc/lib/GL/mesa/src/drv/i810/i810context.h,v 1.5 2000/08/28 02:43:11 tsi Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/i810/i810context.h,v 1.6 2001/08/27 21:12:19 dawes Exp $ */ #ifndef I810CONTEXT_INC #define I810CONTEXT_INC @@ -202,13 +202,4 @@ extern int I810_DEBUG; #define DEBUG_VERBOSE_IOCTL 0x4000 - -extern GLuint i810DDRegisterPipelineStages( struct gl_pipeline_stage *out, - const struct gl_pipeline_stage *in, - GLuint nr ); - -extern GLboolean i810DDBuildPrecalcPipeline( GLcontext *ctx ); - - - #endif diff --git a/xc/lib/GL/mesa/src/drv/i810/i810fastpath.c b/xc/lib/GL/mesa/src/drv/i810/i810fastpath.c index df62cb664..459c9e6f0 100644 --- a/xc/lib/GL/mesa/src/drv/i810/i810fastpath.c +++ b/xc/lib/GL/mesa/src/drv/i810/i810fastpath.c @@ -21,7 +21,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ -/* $XFree86: xc/lib/GL/mesa/src/drv/i810/i810fastpath.c,v 1.5 2000/11/13 23:31:27 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/i810/i810fastpath.c,v 1.6 2001/08/27 21:12:19 dawes Exp $ */ #include <stdio.h> @@ -37,12 +37,9 @@ #include "i810tris.h" #include "i810state.h" #include "i810vb.h" +#include "vbcull.h" -extern void i810DDResizeVB( struct vertex_buffer *VB, GLuint size ); - -extern void gl_fast_copy_vb( struct vertex_buffer *VB ); - struct i810_fast_tab { void (*build_vertices)( struct vertex_buffer *VB, GLuint do_cliptest ); void (*interp)( GLfloat t, GLfloat *O, const GLfloat *I, const GLfloat *J ); diff --git a/xc/lib/GL/mesa/src/drv/i810/i810tex.c b/xc/lib/GL/mesa/src/drv/i810/i810tex.c index ff537aece..e7634ec00 100644 --- a/xc/lib/GL/mesa/src/drv/i810/i810tex.c +++ b/xc/lib/GL/mesa/src/drv/i810/i810tex.c @@ -21,6 +21,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ +/* $XFree86: xc/lib/GL/mesa/src/drv/i810/i810tex.c,v 1.7 2001/10/31 22:50:24 tsi Exp $ */ #include <stdlib.h> #include <stdio.h> @@ -363,7 +364,6 @@ static void i810UploadTexLevel( i810TextureObjectPtr t, int level ) { GLushort *dst = (GLushort *)(t->BufAddr + t->image[level].offset); GLubyte *src = (GLubyte *)image->Data; - i810Msg(10," CopyRGB: %p %p\n", dst, src); for (j = 0 ; j < image->Height ; j++, dst += (t->Pitch/2)) { for (i = 0 ; i < image->Width ; i++) { @@ -378,7 +378,6 @@ static void i810UploadTexLevel( i810TextureObjectPtr t, int level ) { GLushort *dst = (GLushort *)(t->BufAddr + t->image[level].offset); GLubyte *src = (GLubyte *)image->Data; - i810Msg(10," CopyRGBA: %p %p\n", dst, src); for (j = 0 ; j < image->Height ; j++, dst += (t->Pitch/2)) { for (i = 0 ; i < image->Width ; i++) { @@ -393,7 +392,6 @@ static void i810UploadTexLevel( i810TextureObjectPtr t, int level ) { GLushort *dst = (GLushort *)(t->BufAddr + t->image[level].offset); GLubyte *src = (GLubyte *)image->Data; - i810Msg(10," CopyL: %p %p\n", dst, src); for (j = 0 ; j < image->Height ; j++, dst += (t->Pitch/2)) { for (i = 0 ; i < image->Width ; i++) { @@ -409,7 +407,6 @@ static void i810UploadTexLevel( i810TextureObjectPtr t, int level ) GLushort *dst = (GLushort *)(t->BufAddr + t->image[level].offset); GLubyte *src = (GLubyte *)image->Data; int i; - i810Msg(10," CopyI: %p %p\n", dst, src); for (j = 0 ; j < image->Height ; j++, dst += (t->Pitch/2)) { for (i = 0 ; i < image->Width ; i++) { @@ -424,7 +421,6 @@ static void i810UploadTexLevel( i810TextureObjectPtr t, int level ) { GLushort *dst = (GLushort *)(t->BufAddr + t->image[level].offset); GLubyte *src = (GLubyte *)image->Data; - i810Msg(10," CopyLA: %p %p\n", dst, src); for (j = 0 ; j < image->Height ; j++, dst += (t->Pitch/2)) { for (i = 0 ; i < image->Width ; i++) { @@ -439,7 +435,6 @@ static void i810UploadTexLevel( i810TextureObjectPtr t, int level ) { GLushort *dst = (GLushort *)(t->BufAddr + t->image[level].offset); GLubyte *src = (GLubyte *)image->Data; - i810Msg(10," CopyA: %p %p\n", dst, src); for (j = 0 ; j < image->Height ; j++, dst += (t->Pitch/2)) { for (i = 0 ; i < image->Width ; i++) { @@ -456,7 +451,6 @@ static void i810UploadTexLevel( i810TextureObjectPtr t, int level ) { GLubyte *dst = (GLubyte *)(t->BufAddr + t->image[level].offset); GLubyte *src = (GLubyte *)image->Data; - i810Msg(10," CopyIndex: %p %p\n", dst, src); for (j = 0 ; j < image->Height ; j++, dst += t->Pitch) { for (i = 0 ; i < image->Width ; i++) { @@ -1304,9 +1298,6 @@ static void i810TexImage( GLcontext *ctx, i810ContextPtr imesa = I810_CONTEXT( ctx ); i810TextureObjectPtr t; - i810Msg(10,"i810TexImage(%d): level %d internalFormat %x\n", - tObj->Name, level, internalFormat); - if (target != GL_TEXTURE_2D) return; @@ -1332,10 +1323,6 @@ static void i810TexSubImage( GLcontext *ctx, GLenum target, { i810ContextPtr imesa = I810_CONTEXT( ctx ); i810TextureObjectPtr t; - i810Msg(10,"i810TexSubImage():\n"); - i810Msg(10," Size: %d,%d of %d,%d; Level %d\n", - width, height, image->Width,image->Height, - level); if ( target != GL_TEXTURE_2D ) return; diff --git a/xc/lib/GL/mesa/src/drv/mga/mgabuffers.c b/xc/lib/GL/mesa/src/drv/mga/mgabuffers.c index 731afb75a..236ca59c5 100644 --- a/xc/lib/GL/mesa/src/drv/mga/mgabuffers.c +++ b/xc/lib/GL/mesa/src/drv/mga/mgabuffers.c @@ -24,7 +24,7 @@ * Authors: * Keith Whitwell <keithw@valinux.com> */ -/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgabuffers.c,v 1.7 2001/04/10 16:07:50 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgabuffers.c,v 1.8 2001/10/31 22:50:24 tsi Exp $ */ #include <stdio.h> #include "mgacontext.h" @@ -131,7 +131,6 @@ static void mgaUpdateRectsFromSarea( mgaContextPtr mmesa ) mmesa->dirty_cliprects = (MGA_FRONT|MGA_BACK) & ~(sarea->exported_buffers); } -#endif static void printSareaRects( mgaContextPtr mmesa ) @@ -200,7 +199,7 @@ static void printMmesaRects( mgaContextPtr mmesa ) driDrawable->index, driScreen->pSAREA->drawableTable[driDrawable->index].stamp); } - +#endif void mgaUpdateRects( mgaContextPtr mmesa, GLuint buffers ) diff --git a/xc/lib/GL/mesa/src/drv/mga/mgafastpath.c b/xc/lib/GL/mesa/src/drv/mga/mgafastpath.c index 0eac06f68..30e840ef3 100644 --- a/xc/lib/GL/mesa/src/drv/mga/mgafastpath.c +++ b/xc/lib/GL/mesa/src/drv/mga/mgafastpath.c @@ -24,7 +24,7 @@ * Authors: * Keith Whitwell <keithw@valinux.com> */ -/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgafastpath.c,v 1.8 2001/04/10 16:07:50 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgafastpath.c,v 1.9 2001/08/27 21:12:19 dawes Exp $ */ #include <stdio.h> @@ -39,12 +39,9 @@ #include "mgatris.h" #include "mgastate.h" #include "mgavb.h" +#include "vbcull.h" -extern void mgaDDResizeVB( struct vertex_buffer *VB, GLuint size ); - -extern void gl_fast_copy_vb( struct vertex_buffer *VB ); - struct mga_fast_tab { void (*build_vertices)( struct vertex_buffer *VB, GLuint do_cliptest ); void (*interp)( GLfloat t, GLfloat *O, const GLfloat *I, const GLfloat *J ); diff --git a/xc/lib/GL/mesa/src/drv/mga/mgaioctl.c b/xc/lib/GL/mesa/src/drv/mga/mgaioctl.c index b07e69271..d5524c372 100644 --- a/xc/lib/GL/mesa/src/drv/mga/mgaioctl.c +++ b/xc/lib/GL/mesa/src/drv/mga/mgaioctl.c @@ -25,7 +25,7 @@ * Keith Whitwell <keithw@valinux.com> * Gareth Hughes <gareth@valinux.com> */ -/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgaioctl.c,v 1.11 2001/04/10 16:07:50 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgaioctl.c,v 1.12 2001/10/31 22:50:24 tsi Exp $ */ #include <stdio.h> @@ -296,8 +296,8 @@ void mgaSwapBuffers( mgaContextPtr mmesa ) wait++; fprintf( stderr, " last: head=0x%06x wrap=%d\n", last_frame, last_wrap ); - fprintf( stderr, " head: head=0x%06x wrap=%d\n", - MGA_READ( MGAREG_PRIMADDRESS ) - mmesa->primary_offset, + fprintf( stderr, " head: head=0x%06lx wrap=%d\n", + (long)(MGA_READ( MGAREG_PRIMADDRESS ) - mmesa->primary_offset), mmesa->sarea->last_wrap ); } UPDATE_LOCK( mmesa, DRM_LOCK_FLUSH ); diff --git a/xc/lib/GL/mesa/src/drv/mga/mgavb.c b/xc/lib/GL/mesa/src/drv/mga/mgavb.c index 90020f178..574bf82d7 100644 --- a/xc/lib/GL/mesa/src/drv/mga/mgavb.c +++ b/xc/lib/GL/mesa/src/drv/mga/mgavb.c @@ -24,7 +24,7 @@ * Authors: * Keith Whitwell <keithw@valinux.com> */ -/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgavb.c,v 1.10 2001/04/10 16:07:51 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgavb.c,v 1.11 2001/10/31 22:50:24 tsi Exp $ */ #include "mgacontext.h" #include "mgavb.h" @@ -406,7 +406,7 @@ void mgaDDPartialRasterSetup( struct vertex_buffer *VB ) void mgaDDDoRasterSetup( struct vertex_buffer *VB ) { GLcontext *ctx = VB->ctx; - mgaContextPtr mmesa = MGA_CONTEXT( ctx ); +/* mgaContextPtr mmesa = MGA_CONTEXT( ctx ); */ /* Can't lock, won't lock */ diff --git a/xc/lib/GL/mesa/src/drv/r128/r128_context.h b/xc/lib/GL/mesa/src/drv/r128/r128_context.h index 800cc1754..c23b5848b 100644 --- a/xc/lib/GL/mesa/src/drv/r128/r128_context.h +++ b/xc/lib/GL/mesa/src/drv/r128/r128_context.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_context.h,v 1.8 2001/04/10 17:53:07 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_context.h,v 1.9 2001/10/02 11:44:13 alanh Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., @@ -266,12 +266,7 @@ extern r128ContextPtr r128MakeCurrent( r128ContextPtr oldCtx, #else #include <byteswap.h> #define LE32_OUT( x, y ) do { x = bswap_32( y ); } while (0) -#define LE32_OUT_FLOAT( x, y ) \ -do { \ - GLuint __tmp; \ - *(GLfloat *)&__tmp = y; \ - x = bswap_32( __tmp ); \ -} while (0) +#define LE32_OUT_FLOAT( x, y ) do { x = bswap_32( *(unsigned int *)&y ); } while (0) #endif /* ================================================================ diff --git a/xc/lib/GL/mesa/src/drv/r128/r128_ioctl.c b/xc/lib/GL/mesa/src/drv/r128/r128_ioctl.c index 09dbb390d..a82cfe8c2 100644 --- a/xc/lib/GL/mesa/src/drv/r128/r128_ioctl.c +++ b/xc/lib/GL/mesa/src/drv/r128/r128_ioctl.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_ioctl.c,v 1.6 2001/04/10 16:07:52 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_ioctl.c,v 1.7 2001/10/31 22:50:25 tsi Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., @@ -318,8 +318,8 @@ static int r128WaitForFrameCompletion( r128ContextPtr rmesa ) #endif if ( 0 ) - fprintf( stderr, " last=0x%08x frame=0x%08x\n", - rmesa->sarea->last_frame, frame ); + fprintf( stderr, " last=0x%08x frame=0x%08lx\n", + rmesa->sarea->last_frame, (long)frame ); if ( rmesa->sarea->last_frame - frame <= R128_MAX_OUTSTANDING ) { break; diff --git a/xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c b/xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c index e7e55b8ca..e65973f5b 100644 --- a/xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c +++ b/xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c,v 1.9 2001/08/18 02:51:05 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c,v 1.12 2001/11/26 21:46:35 dawes Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., @@ -296,9 +296,9 @@ XMesaOpenFullScreen( __DRIcontextPrivate *driContextPriv ) GLboolean XMesaCloseFullScreen( __DRIcontextPrivate *driContextPriv ) { +#if 0 r128ContextPtr rmesa = (r128ContextPtr)driContextPriv->driverPrivate; -#if 0 LOCK_HARDWARE( rmesa ); r128WaitForIdleLocked( rmesa ); diff --git a/xc/lib/GL/mesa/src/drv/radeon/Imakefile b/xc/lib/GL/mesa/src/drv/radeon/Imakefile index fa896fc93..dbe9a4bfc 100644 --- a/xc/lib/GL/mesa/src/drv/radeon/Imakefile +++ b/xc/lib/GL/mesa/src/drv/radeon/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/lib/GL/mesa/src/drv/radeon/Imakefile,v 1.6 2001/05/10 16:56:11 dawes Exp $ +XCOMM $XFree86: xc/lib/GL/mesa/src/drv/radeon/Imakefile,v 1.7 2001/11/02 23:29:26 dawes Exp $ #include <Threads.tmpl> @@ -58,7 +58,7 @@ NormalLintTarget($(SRCS)) #if !GlxUseBuiltInDRIDriver LIBNAME = radeon_dri.so -SharedDepModuleTarget($(LIBNAME),DONE $(OBJS),$(OBJS)) +SharedDriModuleTarget($(LIBNAME),DONE $(OBJS),$(OBJS)) InstallDynamicModule($(LIBNAME),$(MODULEDIR),dri) #ifdef GlxSoProf diff --git a/xc/lib/GL/mesa/src/drv/sis/Imakefile b/xc/lib/GL/mesa/src/drv/sis/Imakefile index d58ed4a30..66c421073 100644 --- a/xc/lib/GL/mesa/src/drv/sis/Imakefile +++ b/xc/lib/GL/mesa/src/drv/sis/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/lib/GL/mesa/src/drv/sis/Imakefile,v 1.17 2001/05/10 16:56:12 dawes Exp $ +XCOMM $XFree86: xc/lib/GL/mesa/src/drv/sis/Imakefile,v 1.18 2001/11/02 23:29:27 dawes Exp $ #include <Threads.tmpl> @@ -64,7 +64,7 @@ NormalLintTarget($(SRCS)) #if !GlxUseBuiltInDRIDriver LIBNAME = sis_dri.so -SharedDepModuleTarget($(LIBNAME),DONE $(OBJS),$(OBJS)) +SharedDriModuleTarget($(LIBNAME),DONE $(OBJS),$(OBJS)) InstallDynamicModule($(LIBNAME),$(MODULEDIR),dri) #ifdef GlxSoProf diff --git a/xc/lib/GL/mesa/src/drv/sis/sis_mesa.c b/xc/lib/GL/mesa/src/drv/sis/sis_mesa.c index e83a6a0e9..a631000e6 100644 --- a/xc/lib/GL/mesa/src/drv/sis/sis_mesa.c +++ b/xc/lib/GL/mesa/src/drv/sis/sis_mesa.c @@ -24,7 +24,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/lib/GL/mesa/src/drv/sis/sis_mesa.c,v 1.5 2000/09/26 15:56:48 tsi Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/sis/sis_mesa.c,v 1.6 2001/10/31 22:50:25 tsi Exp $ */ /* * Authors: @@ -1045,8 +1045,8 @@ void sis_set_render_pos(GLcontext * ctx, GLubyte *base, GLuint pitch) assert (base != NULL); if (SIS_VERBOSE&VERBOSE_SIS_BUFFER){ - fprintf(stderr, "set drawing position: base=%x, pitch=%lu\n", - (unsigned long)base, pitch); + fprintf(stderr, "set drawing position: base=%lx, pitch=%lu\n", + (long)base, (long)pitch); } /* software render */ diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c index 049bd0875..fa532ba36 100644 --- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c +++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c @@ -23,7 +23,7 @@ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c,v 1.3 2001/08/18 02:51:06 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c,v 1.6 2001/12/13 00:34:21 alanh Exp $ */ /* * Original rewrite: @@ -175,7 +175,7 @@ GLboolean tdfxCreateContext( Display *dpy, GLvisual *mesaVis, return GL_FALSE; } - fxMesa->Glide.grDRIOpen( sPriv->pFB, fxScreen->regs.map, fxScreen->deviceID, + fxMesa->Glide.grDRIOpen( (char*) sPriv->pFB, fxScreen->regs.map, fxScreen->deviceID, fxScreen->width, fxScreen->height, fxScreen->mem, fxScreen->cpp, fxScreen->stride, fxScreen->fifoOffset, fxScreen->fifoSize, fxScreen->fbOffset, fxScreen->backOffset, fxScreen->depthOffset, diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h index f23ac43aa..39069f061 100644 --- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h +++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h @@ -23,7 +23,7 @@ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h,v 1.2 2001/08/18 02:51:06 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h,v 1.3 2001/10/02 11:44:13 alanh Exp $ */ /* * Original rewrite: diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c index ae2aca898..729349a24 100644 --- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c +++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c @@ -23,7 +23,7 @@ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c,v 1.2 2001/08/18 02:51:06 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c,v 1.3 2001/12/13 00:34:21 alanh Exp $ */ /* * Original rewrite: @@ -69,7 +69,7 @@ void tdfxGetLock( tdfxContextPtr fxMesa ) * that state onto the hardware when you set the state. */ void *state; - FxU32 size; + FxI32 size; fxMesa->Glide.grGet( GR_GLIDE_STATE_SIZE, 4, &size ); state = malloc( size ); FX_grGlideGetState_NoLock( state ); diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c index 65db94bbd..d97549f0a 100644 --- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c +++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c @@ -23,7 +23,7 @@ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c,v 1.2 2001/08/18 02:51:07 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c,v 1.3 2001/10/02 11:44:13 alanh Exp $ */ /* * Original rewrite: diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c index ed3d9017e..7485f6ea1 100644 --- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c +++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c @@ -23,7 +23,7 @@ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c,v 1.3 2001/08/18 02:51:07 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c,v 1.4 2001/10/02 11:44:13 alanh Exp $ */ /* * Original rewrite: diff --git a/xc/lib/Imakefile b/xc/lib/Imakefile index 5c8bfc751..8693fafd9 100644 --- a/xc/lib/Imakefile +++ b/xc/lib/Imakefile @@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:44:00 cpqbld Exp $ -XCOMM $XFree86: xc/lib/Imakefile,v 3.56 2001/08/13 21:46:46 dawes Exp $ +XCOMM $XFree86: xc/lib/Imakefile,v 3.58 2001/11/02 23:29:26 dawes Exp $ #define IHaveSubdirs #define PassCDebugFlags @@ -113,6 +113,10 @@ FREETYPE2BUILDDIR = freetype2 RANDRLIBDIR = Xrandr #endif +#if BuildXTrapLibrary +XTRAPLIBDIR = XTrap +#endif + XF86EXTLIBS = $(XF86MISCLIBDIR) $(XF86VMLIBDIR) \ $(XF86DGALIBDIR) $(XF86RUSHLIBDIR) @@ -186,7 +190,7 @@ LINTSUBDIRS = $(XAULIBDIR) $(XDMCPLIBDIR) $(THRSTUBLIBDIR) $(X11LIBDIR) \ $(XVLIBDIR) $(GLXLIBDIR) $(GLULIBDIR) $(GLWLIBDIR) \ $(DPSLIBDIR) $(DPSTKLIBDIR) $(PSRESLIBDIR) $(XINERAMADIR) \ $(ZLIBDIR) $(REGEXDIR) $(RENDERLIBDIR) $(FREETYPE2BUILDDIR) \ - $(XFTLIBDIR) $(XVMCLIBDIR) $(RANDRLIBDIR) + $(XFTLIBDIR) $(XVMCLIBDIR) $(RANDRLIBDIR) $(XTRAPLIBDIR) SUBDIRS = $(BERKDIR) xtrans $(LINTSUBDIRS) $(FONTSUBDIR) $(FONTENCSUBDIR) \ $(FONTCACHELIBDIR) diff --git a/xc/lib/font/FreeType/Imakefile b/xc/lib/font/FreeType/Imakefile index 953c6ff0d..8a61563a7 100644 --- a/xc/lib/font/FreeType/Imakefile +++ b/xc/lib/font/FreeType/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/lib/font/FreeType/Imakefile,v 1.16 2000/09/19 12:46:06 eich Exp $ +XCOMM $XFree86: xc/lib/font/FreeType/Imakefile,v 1.17 2001/08/27 17:40:58 dawes Exp $ XCOMM Imakefile created for the Freetype TrueType renderer. XCOMM Mark Leisher <mleisher@crl.nmsu.edu> diff --git a/xc/lib/font/Imakefile b/xc/lib/font/Imakefile index e48028420..234477d54 100644 --- a/xc/lib/font/Imakefile +++ b/xc/lib/font/Imakefile @@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:46:24 cpqbld Exp $ -XCOMM $XFree86: xc/lib/font/Imakefile,v 3.32 2001/01/17 19:43:16 dawes Exp $ +XCOMM $XFree86: xc/lib/font/Imakefile,v 3.33 2001/08/27 17:40:58 dawes Exp $ #include <Server.tmpl> diff --git a/xc/lib/font/Speedo/Imakefile b/xc/lib/font/Speedo/Imakefile index e2d9dcdeb..a4865cc77 100644 --- a/xc/lib/font/Speedo/Imakefile +++ b/xc/lib/font/Speedo/Imakefile @@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:46:24 cpqbld Exp $ -XCOMM $XFree86: xc/lib/font/Speedo/Imakefile,v 1.10 2001/01/19 08:13:29 dawes Exp $ +XCOMM $XFree86: xc/lib/font/Speedo/Imakefile,v 1.11 2001/08/27 17:40:58 dawes Exp $ #if BuildServer && DoLoadableServer #define IHaveSubdirs diff --git a/xc/lib/font/Type1/Imakefile b/xc/lib/font/Type1/Imakefile index f5ea064b1..95f7d061e 100644 --- a/xc/lib/font/Type1/Imakefile +++ b/xc/lib/font/Type1/Imakefile @@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:46:28 cpqbld Exp $ -XCOMM $XFree86: xc/lib/font/Type1/Imakefile,v 1.10 2001/01/17 19:43:21 dawes Exp $ +XCOMM $XFree86: xc/lib/font/Type1/Imakefile,v 1.11 2001/08/27 17:40:58 dawes Exp $ #if BuildServer && DoLoadableServer #define IHaveSubdirs diff --git a/xc/lib/font/X-TrueType/Imakefile b/xc/lib/font/X-TrueType/Imakefile index 651ecf0e7..3a8536e6b 100644 --- a/xc/lib/font/X-TrueType/Imakefile +++ b/xc/lib/font/X-TrueType/Imakefile @@ -1,5 +1,5 @@ XCOMM X-TrueType Server - TrueType rasterizer for X -XCOMM $XFree86: xc/lib/font/X-TrueType/Imakefile,v 1.7 2000/11/28 19:09:30 dawes Exp $ +XCOMM $XFree86: xc/lib/font/X-TrueType/Imakefile,v 1.8 2001/08/27 17:40:58 dawes Exp $ #define IHaveSubdirs #define PassCDebugFlags CDEBUGFLAGS="$(CDEBUGFLAGS)" diff --git a/xc/lib/font/bitmap/Imakefile b/xc/lib/font/bitmap/Imakefile index f69bd467a..5915d57a6 100644 --- a/xc/lib/font/bitmap/Imakefile +++ b/xc/lib/font/bitmap/Imakefile @@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:46:34 cpqbld Exp $ -XCOMM $XFree86: xc/lib/font/bitmap/Imakefile,v 1.11 2001/04/03 17:51:59 paulo Exp $ +XCOMM $XFree86: xc/lib/font/bitmap/Imakefile,v 1.13 2002/01/18 16:27:19 keithp Exp $ #if BuildServer && DoLoadableServer #define IHaveSubdirs @@ -12,9 +12,9 @@ XCOMM $XFree86: xc/lib/font/bitmap/Imakefile,v 1.11 2001/04/03 17:51:59 paulo Ex SUBDIRS = module #endif -#ifndef KDriveXServer BDFSRCS=bdfread.c bdfutils.c BDFOBJS=bdfread.o bdfutils.o +#ifndef KDriveXServer BDFDEFS=-DBDFFORMAT SNFSRCS=snfread.c diff --git a/xc/lib/xkbfile/Imakefile b/xc/lib/xkbfile/Imakefile index 7577296cd..d67324ee6 100644 --- a/xc/lib/xkbfile/Imakefile +++ b/xc/lib/xkbfile/Imakefile @@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:46:42 cpqbld Exp $ -XCOMM $XFree86: xc/lib/xkbfile/Imakefile,v 3.3 2001/01/17 19:43:39 dawes Exp $ +XCOMM $XFree86: xc/lib/xkbfile/Imakefile,v 3.4 2001/08/27 17:40:59 dawes Exp $ #define DoNormalLib YES #define DoSharedLib NO diff --git a/xc/lib/zlib/z-def.cpp b/xc/lib/zlib/z-def.cpp deleted file mode 100644 index eeae2c8d2..000000000 --- a/xc/lib/zlib/z-def.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#ifdef __CYGWIN__ -LIBRARY ZLIB -EXPORTS - adler32 @ 1 ; - compress @ 2 ; - compress2 @ 3 ; - crc32 @ 4 ; - deflate @ 5 ; - deflateCopy @ 6 ; - deflateEnd @ 7 ; - deflateInit2_ @ 8 ; - deflateInit_ @ 9 ; - deflateParams @ 10 ; - deflateReset @ 11 ; - deflateSetDictionary @ 12 ; - get_crc_table @ 13 ; - gzclose @ 14 ; - gzdopen @ 15 ; - gzeof @ 16 ; - gzerror @ 17 ; - gzflush @ 18 ; - gzgetc @ 19 ; -; gzgets @ 20 ; - gzopen @ 21 ; - gzprintf @ 22 ; - gzputc @ 23 ; -; gzputs @ 24 ; - gzread @ 25 ; - gzrewind @ 26 ; - gzseek @ 27 ; - gzsetparams @ 28 ; - gztell @ 29 ; - gzwrite @ 30 ; - inflate @ 31 ; - inflateEnd @ 32 ; - inflateInit2_ @ 33 ; - inflateInit_ @ 34 ; - inflateReset @ 35 ; - inflateSetDictionary @ 36 ; - inflateSync @ 37 ; - inflateSyncPoint @ 38 ; - uncompress @ 39 ; - zError @ 40 ; - zlibVersion @ 41 ; -#endif - -/* $XFree86: xc/lib/zlib/z-def.cpp,v 1.1 2000/08/09 23:40:16 dawes Exp $ */ diff --git a/xc/programs/Imakefile b/xc/programs/Imakefile index 1d1b8a010..1ff0a9558 100644 --- a/xc/programs/Imakefile +++ b/xc/programs/Imakefile @@ -2,7 +2,7 @@ XCOMM $Xorg: Imakefile,v 1.4 2000/08/17 19:47:01 cpqbld Exp $ -XCOMM $XFree86: xc/programs/Imakefile,v 3.47 2001/06/30 21:53:57 tsi Exp $ +XCOMM $XFree86: xc/programs/Imakefile,v 3.49 2001/11/02 23:29:28 dawes Exp $ #define IHaveSubdirs #define PassCDebugFlags CDEBUGFLAGS="$(CDEBUGFLAGS)" @@ -72,6 +72,10 @@ XFINDPROXYSRCDIR = xfindproxy XINPUTCLIENTDIRS = xsetmode xsetpointer #endif +#if BuildXTrapLibrary +XTRAPCLIENTDIRS = xtrap +#endif + /* makepsres should be considered as part of the DPS libraries */ #if BuildDPSLibraries MAKEPSRESDIR = makepsres @@ -105,7 +109,7 @@ SUBDIRS = $(XSSRCDIR) SUBDIRS = \ appres bdftopcf bitmap \ $(SCREENSAVESRCDIR) editres fslsfonts fstobdf iceauth \ - ico listres \ + ico listres luit \ $(MAKEPSRESDIR) $(DPSCLIENTDIRS) \ $(MKCFMSRCDIR) \ mkfontdir oclock $(PROXYMGRSRCDIR) $(RGBSRCDIR) $(RSTARTSRCDIR) \ @@ -120,7 +124,7 @@ SUBDIRS = \ xlsclients xlsfonts xmag xman xmessage xmh xmodmap xprop xrdb \ xrefresh $(XRXSRCDIR) xset \ xsetroot $(XSMSRCDIR) xstdcmap $(XINPUTCLIENTDIRS) \ - $(XTERMSRCDIR) $(XVIDTUNESRCDIR) xwd xwininfo xwud \ + $(XTERMSRCDIR) $(XTRAPCLIENTDIRS) $(XVIDTUNESRCDIR) xwd xwininfo xwud \ $(XPMCLIENTDIRS) $(XVINFOSRCDIR) \ $(XSSRCDIR) $(XASSRCDIR) $(LBXPROXYSRCDIR) $(SCRIPTSDIR) \ $(GLXCLIENTDIRS) $(XFTCACHEDIR) $(XRANDRDIR) diff --git a/xc/programs/Xserver/GL/dri/dri.c b/xc/programs/Xserver/GL/dri/dri.c index 1f3a64f86..2ce358269 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.32 2001/08/18 02:51:08 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/dri/dri.c,v 1.34 2001/12/10 19:07:19 dawes Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. @@ -66,7 +66,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "mi.h" #include "mipointer.h" -#if defined(XFree86LOADER) || defined(PANORAMIX) +#if defined(XFree86LOADER) && !defined(PANORAMIX) extern Bool noPanoramiXExtension; #endif diff --git a/xc/programs/Xserver/GL/dri/drimodule.c b/xc/programs/Xserver/GL/dri/drimodule.c index 1c2b3f112..bb7a89ee0 100644 --- a/xc/programs/Xserver/GL/dri/drimodule.c +++ b/xc/programs/Xserver/GL/dri/drimodule.c @@ -24,7 +24,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/GL/dri/drimodule.c,v 1.5 2001/06/15 21:22:39 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/dri/drimodule.c,v 1.6 2001/12/10 19:07:19 dawes Exp $ */ /* * Authors: @@ -109,6 +109,7 @@ driSetup(pointer module, pointer opts, int *errmaj, int *errmin) } else { LoaderReqSymLists(drmSymbols, NULL); + LoaderRefSymbols("noPanoramiXExtension", NULL); LoadExtension(&XF86DRIExt, FALSE); } } else { diff --git a/xc/programs/Xserver/GL/dri/sarea.h b/xc/programs/Xserver/GL/dri/sarea.h index 07c573875..5405cbcd7 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.9 2001/03/21 16:21:40 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/dri/sarea.h,v 1.10 2001/10/04 18:28:20 alanh Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. @@ -46,7 +46,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #elif defined(__ia64__) #define SAREA_MAX 0x10000 /* 64kB */ #else -#define SAREA_MAX 0x1000 +/* Intel 830M driver needs at least 8k SAREA */ +#define SAREA_MAX 0x2000 #endif #define SAREA_MAX_DRAWABLES 256 diff --git a/xc/programs/Xserver/GL/glx/g_renderswap.c b/xc/programs/Xserver/GL/glx/g_renderswap.c index 0a423d4a6..fa3f15d45 100644 --- a/xc/programs/Xserver/GL/glx/g_renderswap.c +++ b/xc/programs/Xserver/GL/glx/g_renderswap.c @@ -1,5 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/g_renderswap.c,v 1.4 2001/03/21 16:29:35 dawes Exp $ */ -/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED */ +/* $XFree86: xc/programs/Xserver/GL/glx/g_renderswap.c,v 1.5 2002/01/14 22:47:08 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -73,9 +72,6 @@ void __glXDispSwap_Begin(GLbyte *pc) void __glXDispSwap_Color3bv(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glColor3bv( (GLbyte *)(pc + 0) ); @@ -84,7 +80,7 @@ void __glXDispSwap_Color3bv(GLbyte *pc) void __glXDispSwap_Color3dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -102,6 +98,7 @@ void __glXDispSwap_Color3dv(GLbyte *pc) void __glXDispSwap_Color3fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 3); @@ -113,6 +110,7 @@ void __glXDispSwap_Color3fv(GLbyte *pc) void __glXDispSwap_Color3iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 3); @@ -124,6 +122,7 @@ void __glXDispSwap_Color3iv(GLbyte *pc) void __glXDispSwap_Color3sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 3); @@ -134,9 +133,6 @@ void __glXDispSwap_Color3sv(GLbyte *pc) void __glXDispSwap_Color3ubv(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glColor3ubv( (GLubyte *)(pc + 0) ); @@ -145,6 +141,7 @@ void __glXDispSwap_Color3ubv(GLbyte *pc) void __glXDispSwap_Color3uiv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 3); @@ -156,6 +153,7 @@ void __glXDispSwap_Color3uiv(GLbyte *pc) void __glXDispSwap_Color3usv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 3); @@ -166,9 +164,6 @@ void __glXDispSwap_Color3usv(GLbyte *pc) void __glXDispSwap_Color4bv(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glColor4bv( (GLbyte *)(pc + 0) ); @@ -177,6 +172,7 @@ void __glXDispSwap_Color4bv(GLbyte *pc) void __glXDispSwap_Color4dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 @@ -195,6 +191,7 @@ void __glXDispSwap_Color4dv(GLbyte *pc) void __glXDispSwap_Color4fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 4); @@ -206,6 +203,7 @@ void __glXDispSwap_Color4fv(GLbyte *pc) void __glXDispSwap_Color4iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 4); @@ -217,6 +215,7 @@ void __glXDispSwap_Color4iv(GLbyte *pc) void __glXDispSwap_Color4sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 4); @@ -227,9 +226,6 @@ void __glXDispSwap_Color4sv(GLbyte *pc) void __glXDispSwap_Color4ubv(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glColor4ubv( (GLubyte *)(pc + 0) ); @@ -238,6 +234,7 @@ void __glXDispSwap_Color4ubv(GLbyte *pc) void __glXDispSwap_Color4uiv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 4); @@ -249,6 +246,7 @@ void __glXDispSwap_Color4uiv(GLbyte *pc) void __glXDispSwap_Color4usv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 4); @@ -259,9 +257,6 @@ void __glXDispSwap_Color4usv(GLbyte *pc) void __glXDispSwap_EdgeFlagv(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glEdgeFlagv( (GLboolean *)(pc + 0) ); @@ -269,9 +264,6 @@ void __glXDispSwap_EdgeFlagv(GLbyte *pc) void __glXDispSwap_End(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glEnd( ); } @@ -279,7 +271,7 @@ void __glXDispSwap_End(GLbyte *pc) void __glXDispSwap_Indexdv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -297,6 +289,7 @@ void __glXDispSwap_Indexdv(GLbyte *pc) void __glXDispSwap_Indexfv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 1); @@ -308,6 +301,7 @@ void __glXDispSwap_Indexfv(GLbyte *pc) void __glXDispSwap_Indexiv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 1); @@ -319,6 +313,7 @@ void __glXDispSwap_Indexiv(GLbyte *pc) void __glXDispSwap_Indexsv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 1); @@ -329,9 +324,6 @@ void __glXDispSwap_Indexsv(GLbyte *pc) void __glXDispSwap_Normal3bv(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glNormal3bv( (GLbyte *)(pc + 0) ); @@ -340,7 +332,7 @@ void __glXDispSwap_Normal3bv(GLbyte *pc) void __glXDispSwap_Normal3dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -358,6 +350,7 @@ void __glXDispSwap_Normal3dv(GLbyte *pc) void __glXDispSwap_Normal3fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 3); @@ -369,6 +362,7 @@ void __glXDispSwap_Normal3fv(GLbyte *pc) void __glXDispSwap_Normal3iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 3); @@ -380,6 +374,7 @@ void __glXDispSwap_Normal3iv(GLbyte *pc) void __glXDispSwap_Normal3sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 3); @@ -391,7 +386,7 @@ void __glXDispSwap_Normal3sv(GLbyte *pc) void __glXDispSwap_RasterPos2dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -409,6 +404,7 @@ void __glXDispSwap_RasterPos2dv(GLbyte *pc) void __glXDispSwap_RasterPos2fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 2); @@ -420,6 +416,7 @@ void __glXDispSwap_RasterPos2fv(GLbyte *pc) void __glXDispSwap_RasterPos2iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 2); @@ -431,6 +428,7 @@ void __glXDispSwap_RasterPos2iv(GLbyte *pc) void __glXDispSwap_RasterPos2sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 2); @@ -442,7 +440,7 @@ void __glXDispSwap_RasterPos2sv(GLbyte *pc) void __glXDispSwap_RasterPos3dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -460,6 +458,7 @@ void __glXDispSwap_RasterPos3dv(GLbyte *pc) void __glXDispSwap_RasterPos3fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 3); @@ -471,6 +470,7 @@ void __glXDispSwap_RasterPos3fv(GLbyte *pc) void __glXDispSwap_RasterPos3iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 3); @@ -482,6 +482,7 @@ void __glXDispSwap_RasterPos3iv(GLbyte *pc) void __glXDispSwap_RasterPos3sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 3); @@ -493,7 +494,7 @@ void __glXDispSwap_RasterPos3sv(GLbyte *pc) void __glXDispSwap_RasterPos4dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -511,6 +512,7 @@ void __glXDispSwap_RasterPos4dv(GLbyte *pc) void __glXDispSwap_RasterPos4fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 4); @@ -522,6 +524,7 @@ void __glXDispSwap_RasterPos4fv(GLbyte *pc) void __glXDispSwap_RasterPos4iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 4); @@ -533,6 +536,7 @@ void __glXDispSwap_RasterPos4iv(GLbyte *pc) void __glXDispSwap_RasterPos4sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 4); @@ -544,7 +548,7 @@ void __glXDispSwap_RasterPos4sv(GLbyte *pc) void __glXDispSwap_Rectdv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -564,6 +568,7 @@ void __glXDispSwap_Rectdv(GLbyte *pc) void __glXDispSwap_Rectfv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 2); __GLX_SWAP_FLOAT_ARRAY(pc + 8, 2); @@ -577,6 +582,7 @@ void __glXDispSwap_Rectfv(GLbyte *pc) void __glXDispSwap_Rectiv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 2); __GLX_SWAP_INT_ARRAY(pc + 8, 2); @@ -590,6 +596,7 @@ void __glXDispSwap_Rectiv(GLbyte *pc) void __glXDispSwap_Rectsv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 2); __GLX_SWAP_SHORT_ARRAY(pc + 4, 2); @@ -603,7 +610,7 @@ void __glXDispSwap_Rectsv(GLbyte *pc) void __glXDispSwap_TexCoord1dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -621,6 +628,7 @@ void __glXDispSwap_TexCoord1dv(GLbyte *pc) void __glXDispSwap_TexCoord1fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 1); @@ -632,6 +640,7 @@ void __glXDispSwap_TexCoord1fv(GLbyte *pc) void __glXDispSwap_TexCoord1iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 1); @@ -643,6 +652,7 @@ void __glXDispSwap_TexCoord1iv(GLbyte *pc) void __glXDispSwap_TexCoord1sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 1); @@ -654,7 +664,7 @@ void __glXDispSwap_TexCoord1sv(GLbyte *pc) void __glXDispSwap_TexCoord2dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -672,6 +682,7 @@ void __glXDispSwap_TexCoord2dv(GLbyte *pc) void __glXDispSwap_TexCoord2fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 2); @@ -683,6 +694,7 @@ void __glXDispSwap_TexCoord2fv(GLbyte *pc) void __glXDispSwap_TexCoord2iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 2); @@ -694,6 +706,7 @@ void __glXDispSwap_TexCoord2iv(GLbyte *pc) void __glXDispSwap_TexCoord2sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 2); @@ -705,7 +718,7 @@ void __glXDispSwap_TexCoord2sv(GLbyte *pc) void __glXDispSwap_TexCoord3dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -723,6 +736,7 @@ void __glXDispSwap_TexCoord3dv(GLbyte *pc) void __glXDispSwap_TexCoord3fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 3); @@ -734,6 +748,7 @@ void __glXDispSwap_TexCoord3fv(GLbyte *pc) void __glXDispSwap_TexCoord3iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 3); @@ -745,6 +760,7 @@ void __glXDispSwap_TexCoord3iv(GLbyte *pc) void __glXDispSwap_TexCoord3sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 3); @@ -756,7 +772,7 @@ void __glXDispSwap_TexCoord3sv(GLbyte *pc) void __glXDispSwap_TexCoord4dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -774,6 +790,7 @@ void __glXDispSwap_TexCoord4dv(GLbyte *pc) void __glXDispSwap_TexCoord4fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 4); @@ -785,6 +802,7 @@ void __glXDispSwap_TexCoord4fv(GLbyte *pc) void __glXDispSwap_TexCoord4iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 4); @@ -796,6 +814,7 @@ void __glXDispSwap_TexCoord4iv(GLbyte *pc) void __glXDispSwap_TexCoord4sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 4); @@ -807,7 +826,7 @@ void __glXDispSwap_TexCoord4sv(GLbyte *pc) void __glXDispSwap_Vertex2dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -825,6 +844,7 @@ void __glXDispSwap_Vertex2dv(GLbyte *pc) void __glXDispSwap_Vertex2fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 2); @@ -836,6 +856,7 @@ void __glXDispSwap_Vertex2fv(GLbyte *pc) void __glXDispSwap_Vertex2iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 2); @@ -847,6 +868,7 @@ void __glXDispSwap_Vertex2iv(GLbyte *pc) void __glXDispSwap_Vertex2sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 2); @@ -858,7 +880,7 @@ void __glXDispSwap_Vertex2sv(GLbyte *pc) void __glXDispSwap_Vertex3dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -876,6 +898,7 @@ void __glXDispSwap_Vertex3dv(GLbyte *pc) void __glXDispSwap_Vertex3fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 3); @@ -887,6 +910,7 @@ void __glXDispSwap_Vertex3fv(GLbyte *pc) void __glXDispSwap_Vertex3iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 3); @@ -898,6 +922,7 @@ void __glXDispSwap_Vertex3iv(GLbyte *pc) void __glXDispSwap_Vertex3sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 3); @@ -909,7 +934,7 @@ void __glXDispSwap_Vertex3sv(GLbyte *pc) void __glXDispSwap_Vertex4dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -927,6 +952,7 @@ void __glXDispSwap_Vertex4dv(GLbyte *pc) void __glXDispSwap_Vertex4fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 4); @@ -938,6 +964,7 @@ void __glXDispSwap_Vertex4fv(GLbyte *pc) void __glXDispSwap_Vertex4iv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT_ARRAY(pc + 0, 4); @@ -949,6 +976,7 @@ void __glXDispSwap_Vertex4iv(GLbyte *pc) void __glXDispSwap_Vertex4sv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT_ARRAY(pc + 0, 4); @@ -960,7 +988,7 @@ void __glXDispSwap_Vertex4sv(GLbyte *pc) void __glXDispSwap_ClipPlane(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -1019,6 +1047,7 @@ void __glXDispSwap_Fogfv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); pname = *(GLenum *)(pc + 0); @@ -1050,6 +1079,7 @@ void __glXDispSwap_Fogiv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); pname = *(GLenum *)(pc + 0); @@ -1107,6 +1137,7 @@ void __glXDispSwap_Lightfv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -1142,6 +1173,7 @@ void __glXDispSwap_Lightiv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -1175,6 +1207,7 @@ void __glXDispSwap_LightModelfv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); pname = *(GLenum *)(pc + 0); @@ -1206,6 +1239,7 @@ void __glXDispSwap_LightModeliv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); pname = *(GLenum *)(pc + 0); @@ -1263,6 +1297,7 @@ void __glXDispSwap_Materialfv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -1298,6 +1333,7 @@ void __glXDispSwap_Materialiv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -1385,6 +1421,7 @@ void __glXDispSwap_TexParameterfv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -1420,6 +1457,7 @@ void __glXDispSwap_TexParameteriv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -1455,6 +1493,7 @@ void __glXDispSwap_TexEnvfv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -1490,6 +1529,7 @@ void __glXDispSwap_TexEnviv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -1533,6 +1573,7 @@ void __glXDispSwap_TexGendv(GLbyte *pc) GLint cmdlen; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -1576,6 +1617,7 @@ void __glXDispSwap_TexGenfv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -1611,6 +1653,7 @@ void __glXDispSwap_TexGeniv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -1628,9 +1671,6 @@ void __glXDispSwap_TexGeniv(GLbyte *pc) void __glXDispSwap_InitNames(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glInitNames( ); } @@ -1659,9 +1699,6 @@ void __glXDispSwap_PassThrough(GLbyte *pc) void __glXDispSwap_PopName(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glPopName( ); } @@ -1786,9 +1823,6 @@ void __glXDispSwap_StencilMask(GLbyte *pc) void __glXDispSwap_ColorMask(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glColorMask( *(GLboolean *)(pc + 0), *(GLboolean *)(pc + 1), @@ -1799,9 +1833,6 @@ void __glXDispSwap_ColorMask(GLbyte *pc) void __glXDispSwap_DepthMask(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glDepthMask( *(GLboolean *)(pc + 0) ); @@ -1855,9 +1886,6 @@ void __glXDispSwap_Enable(GLbyte *pc) void __glXDispSwap_PopAttrib(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glPopAttrib( ); } @@ -1962,7 +1990,7 @@ void __glXDispSwap_MapGrid2f(GLbyte *pc) void __glXDispSwap_EvalCoord1dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -1980,6 +2008,7 @@ void __glXDispSwap_EvalCoord1dv(GLbyte *pc) void __glXDispSwap_EvalCoord1fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 1); @@ -1991,7 +2020,7 @@ void __glXDispSwap_EvalCoord1fv(GLbyte *pc) void __glXDispSwap_EvalCoord2dv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -2009,6 +2038,7 @@ void __glXDispSwap_EvalCoord2dv(GLbyte *pc) void __glXDispSwap_EvalCoord2fv(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 2); @@ -2196,6 +2226,7 @@ void __glXDispSwap_PixelMapfv(GLbyte *pc) { GLint mapsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); mapsize = *(GLint *)(pc + 4); @@ -2213,6 +2244,7 @@ void __glXDispSwap_PixelMapuiv(GLbyte *pc) { GLint mapsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); mapsize = *(GLint *)(pc + 4); @@ -2230,6 +2262,7 @@ void __glXDispSwap_PixelMapusv(GLbyte *pc) { GLint mapsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); mapsize = *(GLint *)(pc + 4); @@ -2323,9 +2356,6 @@ void __glXDispSwap_Frustum(GLbyte *pc) void __glXDispSwap_LoadIdentity(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glLoadIdentity( ); } @@ -2333,6 +2363,7 @@ void __glXDispSwap_LoadIdentity(GLbyte *pc) void __glXDispSwap_LoadMatrixf(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 16); @@ -2344,7 +2375,7 @@ void __glXDispSwap_LoadMatrixf(GLbyte *pc) void __glXDispSwap_LoadMatrixd(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -2373,6 +2404,7 @@ void __glXDispSwap_MatrixMode(GLbyte *pc) void __glXDispSwap_MultMatrixf(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_FLOAT_ARRAY(pc + 0, 16); @@ -2384,7 +2416,7 @@ void __glXDispSwap_MultMatrixf(GLbyte *pc) void __glXDispSwap_MultMatrixd(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -2429,18 +2461,12 @@ void __glXDispSwap_Ortho(GLbyte *pc) void __glXDispSwap_PopMatrix(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glPopMatrix( ); } void __glXDispSwap_PushMatrix(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glPushMatrix( ); } @@ -2701,6 +2727,7 @@ void __glXDispSwap_PrioritizeTextures(GLbyte *pc) { GLsizei n; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); n = *(GLsizei *)(pc + 0); @@ -2716,9 +2743,6 @@ void __glXDispSwap_PrioritizeTextures(GLbyte *pc) void __glXDispSwap_Indexubv(GLbyte *pc) { - __GLX_DECLARE_SWAP_VARIABLES; - - glIndexubv( (GLubyte *)(pc + 0) ); @@ -2757,6 +2781,7 @@ void __glXDispSwap_ColorTableParameterfv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -2777,6 +2802,7 @@ void __glXDispSwap_ColorTableParameteriv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -2850,6 +2876,7 @@ void __glXDispSwap_ConvolutionParameterfv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -2885,6 +2912,7 @@ void __glXDispSwap_ConvolutionParameteriv(GLbyte *pc) GLenum pname; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); pname = *(GLenum *)(pc + 4); @@ -3033,7 +3061,7 @@ void __glXDispSwap_ActiveTextureARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord1dvARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -3053,6 +3081,7 @@ void __glXDispSwap_MultiTexCoord1dvARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord1fvARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_FLOAT_ARRAY(pc + 4, 1); @@ -3066,6 +3095,7 @@ void __glXDispSwap_MultiTexCoord1fvARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord1ivARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_INT_ARRAY(pc + 4, 1); @@ -3079,6 +3109,7 @@ void __glXDispSwap_MultiTexCoord1ivARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord1svARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_SHORT_ARRAY(pc + 4, 1); @@ -3092,7 +3123,7 @@ void __glXDispSwap_MultiTexCoord1svARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord2dvARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -3112,6 +3143,7 @@ void __glXDispSwap_MultiTexCoord2dvARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord2fvARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_FLOAT_ARRAY(pc + 4, 2); @@ -3125,6 +3157,7 @@ void __glXDispSwap_MultiTexCoord2fvARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord2ivARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_INT_ARRAY(pc + 4, 2); @@ -3138,6 +3171,7 @@ void __glXDispSwap_MultiTexCoord2ivARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord2svARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_SHORT_ARRAY(pc + 4, 2); @@ -3151,7 +3185,7 @@ void __glXDispSwap_MultiTexCoord2svARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord3dvARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -3171,6 +3205,7 @@ void __glXDispSwap_MultiTexCoord3dvARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord3fvARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_FLOAT_ARRAY(pc + 4, 3); @@ -3184,6 +3219,7 @@ void __glXDispSwap_MultiTexCoord3fvARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord3ivARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_INT_ARRAY(pc + 4, 3); @@ -3197,6 +3233,7 @@ void __glXDispSwap_MultiTexCoord3ivARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord3svARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_SHORT_ARRAY(pc + 4, 3); @@ -3210,7 +3247,7 @@ void __glXDispSwap_MultiTexCoord3svARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord4dvARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; - + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; #ifdef __GLX_ALIGN64 if ((unsigned long)(pc) & 7) { @@ -3230,6 +3267,7 @@ void __glXDispSwap_MultiTexCoord4dvARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord4fvARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_FLOAT_ARRAY(pc + 4, 4); @@ -3243,6 +3281,7 @@ void __glXDispSwap_MultiTexCoord4fvARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord4ivARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_INT_ARRAY(pc + 4, 4); @@ -3256,6 +3295,7 @@ void __glXDispSwap_MultiTexCoord4ivARB(GLbyte *pc) void __glXDispSwap_MultiTexCoord4svARB(GLbyte *pc) { __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_SHORT_ARRAY(pc + 4, 4); diff --git a/xc/programs/Xserver/GL/glx/g_single.c b/xc/programs/Xserver/GL/glx/g_single.c index 36f97e0fc..06529e8c5 100644 --- a/xc/programs/Xserver/GL/glx/g_single.c +++ b/xc/programs/Xserver/GL/glx/g_single.c @@ -1,5 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/g_single.c,v 1.4 2001/03/21 16:29:35 dawes Exp $ */ -/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED */ +/* $XFree86: xc/programs/Xserver/GL/glx/g_single.c,v 1.5 2002/01/14 22:47:08 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -41,7 +40,6 @@ int __glXDisp_NewList(__GLXclientState *cl, GLbyte *pc) { __GLXcontext *cx; - ClientPtr client = cl->client; int error; cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -61,7 +59,6 @@ int __glXDisp_NewList(__GLXclientState *cl, GLbyte *pc) int __glXDisp_EndList(__GLXclientState *cl, GLbyte *pc) { __GLXcontext *cx; - ClientPtr client = cl->client; int error; cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -77,7 +74,6 @@ int __glXDisp_EndList(__GLXclientState *cl, GLbyte *pc) int __glXDisp_DeleteLists(__GLXclientState *cl, GLbyte *pc) { __GLXcontext *cx; - ClientPtr client = cl->client; int error; cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -120,7 +116,6 @@ int __glXDisp_GenLists(__GLXclientState *cl, GLbyte *pc) int __glXDisp_PixelStoref(__GLXclientState *cl, GLbyte *pc) { __GLXcontext *cx; - ClientPtr client = cl->client; int error; cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -140,7 +135,6 @@ int __glXDisp_PixelStoref(__GLXclientState *cl, GLbyte *pc) int __glXDisp_PixelStorei(__GLXclientState *cl, GLbyte *pc) { __GLXcontext *cx; - ClientPtr client = cl->client; int error; cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1272,7 +1266,6 @@ int __glXDisp_DeleteTextures(__GLXclientState *cl, GLbyte *pc) { GLsizei n; __GLXcontext *cx; - ClientPtr client = cl->client; int error; cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1726,7 +1719,6 @@ int __glXDisp_DeleteTexturesEXT(__GLXclientState *cl, GLbyte *pc) { GLsizei n; __GLXcontext *cx; - ClientPtr client = cl->client; int error; cx = __glXForceCurrent(cl, __GLX_GET_VENDPRIV_CONTEXT_TAG(pc), &error); diff --git a/xc/programs/Xserver/GL/glx/g_singleswap.c b/xc/programs/Xserver/GL/glx/g_singleswap.c index 89f595266..34515997e 100644 --- a/xc/programs/Xserver/GL/glx/g_singleswap.c +++ b/xc/programs/Xserver/GL/glx/g_singleswap.c @@ -1,5 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/g_singleswap.c,v 1.4 2001/03/21 16:29:35 dawes Exp $ */ -/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED */ +/* $XFree86: xc/programs/Xserver/GL/glx/g_singleswap.c,v 1.5 2002/01/14 22:47:08 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -41,7 +40,6 @@ int __glXDispSwap_NewList(__GLXclientState *cl, GLbyte *pc) { __GLXcontext *cx; - ClientPtr client = cl->client; int error; __GLX_DECLARE_SWAP_VARIABLES; @@ -65,7 +63,6 @@ int __glXDispSwap_NewList(__GLXclientState *cl, GLbyte *pc) int __glXDispSwap_EndList(__GLXclientState *cl, GLbyte *pc) { __GLXcontext *cx; - ClientPtr client = cl->client; int error; __GLX_DECLARE_SWAP_VARIABLES; @@ -83,7 +80,6 @@ int __glXDispSwap_EndList(__GLXclientState *cl, GLbyte *pc) int __glXDispSwap_DeleteLists(__GLXclientState *cl, GLbyte *pc) { __GLXcontext *cx; - ClientPtr client = cl->client; int error; __GLX_DECLARE_SWAP_VARIABLES; @@ -135,7 +131,6 @@ int __glXDispSwap_GenLists(__GLXclientState *cl, GLbyte *pc) int __glXDispSwap_PixelStoref(__GLXclientState *cl, GLbyte *pc) { __GLXcontext *cx; - ClientPtr client = cl->client; int error; __GLX_DECLARE_SWAP_VARIABLES; @@ -159,7 +154,6 @@ int __glXDispSwap_PixelStoref(__GLXclientState *cl, GLbyte *pc) int __glXDispSwap_PixelStorei(__GLXclientState *cl, GLbyte *pc) { __GLXcontext *cx; - ClientPtr client = cl->client; int error; __GLX_DECLARE_SWAP_VARIABLES; @@ -241,6 +235,7 @@ int __glXDispSwap_GetDoublev(__GLXclientState *cl, GLbyte *pc) GLdouble answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -318,6 +313,7 @@ int __glXDispSwap_GetFloatv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -370,6 +366,7 @@ int __glXDispSwap_GetIntegerv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -422,6 +419,7 @@ int __glXDispSwap_GetLightfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -476,6 +474,7 @@ int __glXDispSwap_GetLightiv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -531,6 +530,7 @@ int __glXDispSwap_GetMapdv(__GLXclientState *cl, GLbyte *pc) GLdouble answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -587,6 +587,7 @@ int __glXDispSwap_GetMapfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -643,6 +644,7 @@ int __glXDispSwap_GetMapiv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -698,6 +700,7 @@ int __glXDispSwap_GetMaterialfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -752,6 +755,7 @@ int __glXDispSwap_GetMaterialiv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -806,6 +810,7 @@ int __glXDispSwap_GetPixelMapfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -858,6 +863,7 @@ int __glXDispSwap_GetPixelMapuiv(__GLXclientState *cl, GLbyte *pc) GLuint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -910,6 +916,7 @@ int __glXDispSwap_GetPixelMapusv(__GLXclientState *cl, GLbyte *pc) GLushort answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -962,6 +969,7 @@ int __glXDispSwap_GetTexEnvfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1016,6 +1024,7 @@ int __glXDispSwap_GetTexEnviv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1070,6 +1079,7 @@ int __glXDispSwap_GetTexGendv(__GLXclientState *cl, GLbyte *pc) GLdouble answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1124,6 +1134,7 @@ int __glXDispSwap_GetTexGenfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1178,6 +1189,7 @@ int __glXDispSwap_GetTexGeniv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1232,6 +1244,7 @@ int __glXDispSwap_GetTexParameterfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1286,6 +1299,7 @@ int __glXDispSwap_GetTexParameteriv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1340,6 +1354,7 @@ int __glXDispSwap_GetTexLevelParameterfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1396,6 +1411,7 @@ int __glXDispSwap_GetTexLevelParameteriv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1508,6 +1524,7 @@ int __glXDispSwap_AreTexturesResident(__GLXclientState *cl, GLbyte *pc) GLboolean answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1539,9 +1556,9 @@ int __glXDispSwap_DeleteTextures(__GLXclientState *cl, GLbyte *pc) { GLsizei n; __GLXcontext *cx; - ClientPtr client = cl->client; int error; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1569,6 +1586,7 @@ int __glXDispSwap_GenTextures(__GLXclientState *cl, GLbyte *pc) GLuint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1630,6 +1648,7 @@ int __glXDispSwap_GetColorTableParameterfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1684,6 +1703,7 @@ int __glXDispSwap_GetColorTableParameteriv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1738,6 +1758,7 @@ int __glXDispSwap_GetConvolutionParameterfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1792,6 +1813,7 @@ int __glXDispSwap_GetConvolutionParameteriv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1846,6 +1868,7 @@ int __glXDispSwap_GetHistogramParameterfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1900,6 +1923,7 @@ int __glXDispSwap_GetHistogramParameteriv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -1954,6 +1978,7 @@ int __glXDispSwap_GetMinmaxParameterfv(__GLXclientState *cl, GLbyte *pc) GLfloat answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -2008,6 +2033,7 @@ int __glXDispSwap_GetMinmaxParameteriv(__GLXclientState *cl, GLbyte *pc) GLint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); @@ -2062,6 +2088,7 @@ int __glXDispSwap_AreTexturesResidentEXT(__GLXclientState *cl, GLbyte *pc) GLboolean answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXVendorPrivateReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_VENDPRIV_CONTEXT_TAG(pc), &error); @@ -2093,9 +2120,9 @@ int __glXDispSwap_DeleteTexturesEXT(__GLXclientState *cl, GLbyte *pc) { GLsizei n; __GLXcontext *cx; - ClientPtr client = cl->client; int error; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXVendorPrivateReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_VENDPRIV_CONTEXT_TAG(pc), &error); @@ -2123,6 +2150,7 @@ int __glXDispSwap_GenTexturesEXT(__GLXclientState *cl, GLbyte *pc) GLuint answerBuffer[200]; char *answer; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXVendorPrivateReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_VENDPRIV_CONTEXT_TAG(pc), &error); diff --git a/xc/programs/Xserver/GL/glx/glxbuf.c b/xc/programs/Xserver/GL/glx/glxbuf.c index 6f51aca72..6e6f6142b 100644 --- a/xc/programs/Xserver/GL/glx/glxbuf.c +++ b/xc/programs/Xserver/GL/glx/glxbuf.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/glxbuf.c,v 1.6 2001/03/25 05:32:01 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/glx/glxbuf.c,v 1.7 2001/10/31 22:50:26 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -255,7 +255,9 @@ void __glXFreeBuffers(__GLXdrawablePrivate *glxPriv) { __GLdrawablePrivate *glPriv = &glxPriv->glPriv; +#if defined(__GL_MAX_AUXBUFFERS) && (__GL_MAX_AUXBUFFERS > 0) __GLcontextModes *modes = glPriv->modes; +#endif if (glPriv->frontBuffer.free) { (*glPriv->frontBuffer.free)(&glPriv->frontBuffer, glPriv); diff --git a/xc/programs/Xserver/GL/glx/glxcmdsswap.c b/xc/programs/Xserver/GL/glx/glxcmdsswap.c index 2363ee0d4..a3b8caa15 100644 --- a/xc/programs/Xserver/GL/glx/glxcmdsswap.c +++ b/xc/programs/Xserver/GL/glx/glxcmdsswap.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/glxcmdsswap.c,v 1.5 2001/03/21 16:29:36 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/glx/glxcmdsswap.c,v 1.7 2002/01/14 22:47:08 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -58,7 +58,6 @@ int __glXSwapCreateContext(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -73,7 +72,6 @@ int __glXSwapCreateContext(__GLXclientState *cl, GLbyte *pc) int __glXSwapDestroyContext(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -85,7 +83,6 @@ int __glXSwapDestroyContext(__GLXclientState *cl, GLbyte *pc) int __glXSwapMakeCurrent(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -99,7 +96,6 @@ int __glXSwapMakeCurrent(__GLXclientState *cl, GLbyte *pc) int __glXSwapIsDirect(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -111,7 +107,6 @@ int __glXSwapIsDirect(__GLXclientState *cl, GLbyte *pc) int __glXSwapQueryVersion(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -124,7 +119,6 @@ int __glXSwapQueryVersion(__GLXclientState *cl, GLbyte *pc) int __glXSwapWaitGL(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXWaitGLReq *req = (xGLXWaitGLReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -136,7 +130,6 @@ int __glXSwapWaitGL(__GLXclientState *cl, GLbyte *pc) int __glXSwapWaitX(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXWaitXReq *req = (xGLXWaitXReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -148,7 +141,6 @@ int __glXSwapWaitX(__GLXclientState *cl, GLbyte *pc) int __glXSwapCopyContext(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -171,6 +163,7 @@ int __glXSwapGetVisualConfigs(__GLXclientState *cl, GLbyte *pc) unsigned int screen; int i, p; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&req->screen); screen = req->screen; @@ -249,7 +242,6 @@ int __glXSwapGetVisualConfigs(__GLXclientState *cl, GLbyte *pc) int __glXSwapCreateGLXPixmap(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -264,7 +256,6 @@ int __glXSwapCreateGLXPixmap(__GLXclientState *cl, GLbyte *pc) int __glXSwapDestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -276,7 +267,6 @@ int __glXSwapDestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc) int __glXSwapSwapBuffers(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -289,7 +279,6 @@ int __glXSwapSwapBuffers(__GLXclientState *cl, GLbyte *pc) int __glXSwapUseXFont(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXUseXFontReq *req = (xGLXUseXFontReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -306,7 +295,6 @@ int __glXSwapUseXFont(__GLXclientState *cl, GLbyte *pc) int __glXSwapQueryExtensionsString(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXQueryExtensionsStringReq *req = NULL; __GLX_DECLARE_SWAP_VARIABLES; @@ -318,7 +306,6 @@ int __glXSwapQueryExtensionsString(__GLXclientState *cl, GLbyte *pc) int __glXSwapQueryServerString(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *)pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -331,7 +318,6 @@ int __glXSwapQueryServerString(__GLXclientState *cl, GLbyte *pc) int __glXSwapClientInfo(__GLXclientState *cl, GLbyte *pc) { - ClientPtr client = cl->client; xGLXClientInfoReq *req = (xGLXClientInfoReq *)pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -345,7 +331,6 @@ int __glXSwapClientInfo(__GLXclientState *cl, GLbyte *pc) int __glXSwapQueryContextInfoEXT(__GLXclientState *cl, char *pc) { - ClientPtr client = cl->client; xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc; __GLX_DECLARE_SWAP_VARIABLES; @@ -393,6 +378,7 @@ void glxSwapQueryExtensionsStringReply(ClientPtr client, { int length = reply->length; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT(&reply->sequenceNumber); __GLX_SWAP_INT(&reply->length); __GLX_SWAP_INT(&reply->n); @@ -419,6 +405,7 @@ void __glXSwapQueryContextInfoEXTReply(ClientPtr client, xGLXQueryContextInfoEXT { int length = reply->length; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_SHORT(&reply->sequenceNumber); __GLX_SWAP_INT(&reply->length); __GLX_SWAP_INT(&reply->n); @@ -465,7 +452,7 @@ int __glXSwapRender(__GLXclientState *cl, GLbyte *pc) pc += sz_xGLXRenderReq; left = (req->length << 2) - sz_xGLXRenderReq; while (left > 0) { - __GLXrenderSizeData *entry, renderEntry; + __GLXrenderSizeData *entry; int extra; void (* proc)(GLbyte *); @@ -581,7 +568,7 @@ int __glXSwapRenderLarge(__GLXclientState *cl, GLbyte *pc) pc += sz_xGLXRenderLargeReq; if (cl->largeCmdRequestsSoFar == 0) { - __GLXrenderSizeData *entry, renderEntry; + __GLXrenderSizeData *entry; int extra; size_t cmdlen; /* diff --git a/xc/programs/Xserver/GL/glx/glxext.c b/xc/programs/Xserver/GL/glx/glxext.c index 9ab9d8973..95a9c2e6e 100644 --- a/xc/programs/Xserver/GL/glx/glxext.c +++ b/xc/programs/Xserver/GL/glx/glxext.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/glxext.c,v 1.7 2001/03/21 16:29:36 dawes Exp $ +/* $XFree86: xc/programs/Xserver/GL/glx/glxext.c,v 1.8 2001/08/23 18:25:40 alanh Exp $ ** The contents of this file are subject to the GLX Public License Version 1.0 ** (the "License"). You may not use this file except in compliance with the ** License. You may obtain a copy of the License at Silicon Graphics, Inc., @@ -382,7 +382,6 @@ static int __glXDispatch(ClientPtr client) REQUEST(xGLXSingleReq); CARD8 opcode; int (*proc)(__GLXclientState *cl, GLbyte *pc); - __GLXcontext *cx; __GLXclientState *cl; opcode = stuff->glxCode; @@ -437,7 +436,6 @@ static int __glXSwapDispatch(ClientPtr client) REQUEST(xGLXSingleReq); CARD8 opcode; int (*proc)(__GLXclientState *cl, GLbyte *pc); - __GLXcontext *cx; __GLXclientState *cl; opcode = stuff->glxCode; diff --git a/xc/programs/Xserver/GL/glx/glxmem.c b/xc/programs/Xserver/GL/glx/glxmem.c index bc0c371e7..2d8857ab4 100644 --- a/xc/programs/Xserver/GL/glx/glxmem.c +++ b/xc/programs/Xserver/GL/glx/glxmem.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/glxmem.c,v 1.5 2001/03/21 16:29:36 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/glx/glxmem.c,v 1.6 2001/10/31 22:50:27 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -56,7 +56,6 @@ Resize(__GLdrawableBuffer *buf, GLint x, GLint y, GLuint width, GLuint height, __GLdrawablePrivate *glPriv, GLuint bufferMask) { - __GLXdrawablePrivate *glxPriv = (__GLXdrawablePrivate *) glPriv->other; GLuint newSize; void *ubase; GLint pixelWidth; diff --git a/xc/programs/Xserver/GL/glx/glxscreens.c b/xc/programs/Xserver/GL/glx/glxscreens.c index 5e98e9e1e..013057447 100644 --- a/xc/programs/Xserver/GL/glx/glxscreens.c +++ b/xc/programs/Xserver/GL/glx/glxscreens.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/glxscreens.c,v 1.6 2001/03/21 16:29:36 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/glx/glxscreens.c,v 1.8 2001/10/31 22:50:27 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -97,6 +97,7 @@ CountBits(unsigned long mask) return count; } +#if 0 /* ** A typical implementation would not probably not run through the screen's ** visuals to find ones that match the visual configs supplied by the DDX @@ -155,6 +156,7 @@ static int matchVisuals(__GLXvisualConfig *pGlxVisual, int numVisuals, __glXFree(used); return numMatchingVisuals; } +#endif /* ** Destroy routine that gets called when a drawable is freed. A drawable @@ -202,7 +204,6 @@ static Bool PositionWindow(WindowPtr pWin, int x, int y) ScreenPtr pScreen; __GLXcontext *glxc; __GLXdrawablePrivate *glxPriv; - int i; Bool ret; /* diff --git a/xc/programs/Xserver/GL/glx/glxserver.h b/xc/programs/Xserver/GL/glx/glxserver.h index 1eb3764cc..ad921511b 100644 --- a/xc/programs/Xserver/GL/glx/glxserver.h +++ b/xc/programs/Xserver/GL/glx/glxserver.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/glxserver.h,v 1.3 2001/03/21 16:29:37 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/glx/glxserver.h,v 1.4 2001/08/23 18:25:40 alanh Exp $ */ #ifndef _GLX_server_h_ #define _GLX_server_h_ @@ -161,12 +161,6 @@ extern __GLXclientState *__glXClients[]; typedef void (*__GLXdispatchRenderProcPtr)(GLbyte *); typedef int (*__GLXdispatchSingleProcPtr)(__GLXclientState *, GLbyte *); typedef int (*__GLXdispatchVendorPrivProcPtr)(__GLXclientState *, GLbyte *); -extern __GLXdispatchRenderProcPtr __glXRenderTable[]; -extern __GLXdispatchSingleProcPtr __glXSingleTable[]; -extern __GLXdispatchVendorPrivProcPtr __glXVendorPrivTable_EXT[]; -extern __GLXdispatchRenderProcPtr __glXSwapRenderTable[]; -extern __GLXdispatchSingleProcPtr __glXSwapSingleTable[]; -extern __GLXdispatchVendorPrivProcPtr __glXSwapVendorPrivTable_EXT[]; /* * Dispatch for GLX commands. @@ -200,13 +194,8 @@ extern RESTYPE __glXDrawableRes; ** Prototypes. */ - extern char *__glXcombine_strings(const char *, const char *); -extern void __glXDisp_DrawArrays(GLbyte*); -extern void __glXDispSwap_DrawArrays(GLbyte*); - - /* ** Routines for sending swapped replies. */ diff --git a/xc/programs/Xserver/GL/glx/render2swap.c b/xc/programs/Xserver/GL/glx/render2swap.c index 25f9f3915..e873d88aa 100644 --- a/xc/programs/Xserver/GL/glx/render2swap.c +++ b/xc/programs/Xserver/GL/glx/render2swap.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/render2swap.c,v 1.5 2001/03/21 16:29:37 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/glx/render2swap.c,v 1.6 2002/01/14 22:47:08 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -49,6 +49,7 @@ void __glXDispSwap_Map1f(GLbyte *pc) GLenum target; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_INT(pc + 12); @@ -80,6 +81,7 @@ void __glXDispSwap_Map2f(GLbyte *pc) GLenum target; GLint compsize; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 0); __GLX_SWAP_INT(pc + 12); @@ -119,6 +121,7 @@ void __glXDispSwap_Map1d(GLbyte *pc) GLenum target; GLdouble u1, u2, *points; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_DOUBLE(pc + 0); __GLX_SWAP_DOUBLE(pc + 8); @@ -162,6 +165,7 @@ void __glXDispSwap_Map2d(GLbyte *pc) GLint uorder, vorder, ustride, vstride, k, compsize; GLenum target; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_DOUBLE(pc + 0); __GLX_SWAP_DOUBLE(pc + 8); @@ -212,6 +216,7 @@ void __glXDispSwap_CallLists(GLbyte *pc) GLenum type; GLsizei n; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(pc + 4); __GLX_SWAP_INT(pc + 0); diff --git a/xc/programs/Xserver/GL/glx/rensize.c b/xc/programs/Xserver/GL/glx/rensize.c index 22dace4e8..523a7c62e 100644 --- a/xc/programs/Xserver/GL/glx/rensize.c +++ b/xc/programs/Xserver/GL/glx/rensize.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/rensize.c,v 1.3 2001/03/21 16:29:37 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/glx/rensize.c,v 1.4 2001/10/31 22:50:27 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -680,7 +680,6 @@ int __glXPrioritizeTexturesReqSize(GLbyte *pc, Bool swap ) int __glXTexSubImage1DReqSize(GLbyte *pc, Bool swap ) { __GLXdispatchTexSubImageHeader *hdr = (__GLXdispatchTexSubImageHeader *) pc; - GLenum target = hdr->target; GLenum format = hdr->format; GLenum type = hdr->type; GLint w = hdr->width; @@ -702,7 +701,6 @@ int __glXTexSubImage1DReqSize(GLbyte *pc, Bool swap ) int __glXTexSubImage2DReqSize(GLbyte *pc, Bool swap ) { __GLXdispatchTexSubImageHeader *hdr = (__GLXdispatchTexSubImageHeader *) pc; - GLenum target = hdr->target; GLenum format = hdr->format; GLenum type = hdr->type; GLint w = hdr->width; diff --git a/xc/programs/Xserver/GL/glx/single2swap.c b/xc/programs/Xserver/GL/glx/single2swap.c index 25b92d84c..96db415f9 100644 --- a/xc/programs/Xserver/GL/glx/single2swap.c +++ b/xc/programs/Xserver/GL/glx/single2swap.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/single2swap.c,v 1.5 2001/03/21 16:29:37 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/glx/single2swap.c,v 1.7 2002/01/14 22:47:08 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -116,6 +116,7 @@ int __glXDispSwap_RenderMode(__GLXclientState *cl, GLbyte *pc) GLubyte *retBuffer = NULL; GLenum newMode; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; int error; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); @@ -218,7 +219,6 @@ int __glXDispSwap_RenderMode(__GLXclientState *cl, GLbyte *pc) int __glXDispSwap_Flush(__GLXclientState *cl, GLbyte *pc) { __GLXcontext *cx; - ClientPtr client = cl->client; int error; __GLX_DECLARE_SWAP_VARIABLES; @@ -268,7 +268,6 @@ int __glXDispSwap_GetString(__GLXclientState *cl, GLbyte *pc) const char *string; __GLX_DECLARE_SWAP_VARIABLES; int error; - GLubyte *answer; char *buf = NULL, *buf1 = NULL; GLint length = 0; @@ -324,6 +323,7 @@ int __glXDispSwap_GetClipPlane(__GLXclientState *cl, GLbyte *pc) int error; GLdouble answer[4]; __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); diff --git a/xc/programs/Xserver/GL/glx/singlepixswap.c b/xc/programs/Xserver/GL/glx/singlepixswap.c index 64bcc60f1..2b488312e 100644 --- a/xc/programs/Xserver/GL/glx/singlepixswap.c +++ b/xc/programs/Xserver/GL/glx/singlepixswap.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/singlepixswap.c,v 1.5 2001/03/21 16:29:37 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/glx/singlepixswap.c,v 1.6 2001/10/31 22:50:27 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -108,7 +108,7 @@ int __glXDispSwap_GetTexImage(__GLXclientState *cl, GLbyte *pc) { GLint level, compsize; GLenum format, type, target; - GLboolean swapBytes, lsbFirst; + GLboolean swapBytes; __GLX_DECLARE_SWAP_VARIABLES; __GLXcontext *cx; ClientPtr client = cl->client; diff --git a/xc/programs/Xserver/GL/glx/unpack.h b/xc/programs/Xserver/GL/glx/unpack.h index a076d344a..317a3a380 100644 --- a/xc/programs/Xserver/GL/glx/unpack.h +++ b/xc/programs/Xserver/GL/glx/unpack.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/glx/unpack.h,v 1.3 2001/03/21 16:29:37 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/glx/unpack.h,v 1.4 2002/01/14 22:47:08 tsi Exp $ */ #ifndef __GLX_unpack_h__ #define __GLX_unpack_h__ @@ -144,7 +144,9 @@ extern xGLXSingleReply __glXReply; ** conceivably be replaced with routines that do the job faster. */ #define __GLX_DECLARE_SWAP_VARIABLES \ - GLbyte sw; \ + GLbyte sw + +#define __GLX_DECLARE_SWAP_ARRAY_VARIABLES \ GLbyte *swapPC; \ GLbyte *swapEnd diff --git a/xc/programs/Xserver/GL/include/GL/glx_ansic.h b/xc/programs/Xserver/GL/include/GL/glx_ansic.h index 73820cd60..e7244f01f 100644 --- a/xc/programs/Xserver/GL/include/GL/glx_ansic.h +++ b/xc/programs/Xserver/GL/include/GL/glx_ansic.h @@ -1,7 +1,7 @@ #ifndef _glx_ansic_h_ #define _glx_ansic_h_ -/* $XFree86: xc/programs/Xserver/GL/include/GL/glx_ansic.h,v 1.5 2001/03/21 20:49:08 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/include/GL/glx_ansic.h,v 1.6 2002/01/10 21:51:47 tsi Exp $ */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free @@ -52,7 +52,9 @@ #ifdef XFree86Server +#ifdef XFree86LOADER #include "xf86_ansic.h" +#endif #ifndef assert #define assert(a) #endif diff --git a/xc/programs/Xserver/GL/mesa/src/X/Imakefile b/xc/programs/Xserver/GL/mesa/src/X/Imakefile index 0c90fe00f..92c8e843c 100644 --- a/xc/programs/Xserver/GL/mesa/src/X/Imakefile +++ b/xc/programs/Xserver/GL/mesa/src/X/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/programs/Xserver/GL/mesa/src/X/Imakefile,v 1.9 2001/04/26 16:54:47 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/GL/mesa/src/X/Imakefile,v 1.11 2002/01/10 21:51:47 tsi Exp $ #define IHaveModules #include <Server.tmpl> @@ -13,6 +13,13 @@ LinkSourceFile(compsize.c,$(LIBSRC)/GL/glx) DRIVER_SRCS = xmesa1.c xmesa2.c xmesa3.c xmesa4.c DRIVER_OBJS = xmesa1.o xmesa2.o xmesa3.o xmesa4.o +#ifndef XFree86Version + +/* This appears to be the quickest way to build a non-XFree86 server */ +GLXSRV_DEFINES = -DXFree86Server + +#endif + GLX_SRCS = xf86glx.c xf86glx_util.c compsize.c GLX_OBJS = xf86glx.o xf86glx_util.o compsize.o @@ -26,7 +33,7 @@ LinkSourceFile(compsize.c,$(LIBSRC)/GL/glx) -I$(SERVERSRC)/include -I$(SERVERSRC)/GL/include \ -I$(SERVERSRC)/GL/glx - DEFINES = $(GLX_DEFINES) /*-DUSE_X86_ASM*/ + DEFINES = $(GLX_DEFINES) $(GLXSRV_DEFINES) /*-DUSE_X86_ASM*/ #if DoLoadableServer ModuleObjectRule() diff --git a/xc/programs/Xserver/GL/mesa/src/X/xf86glx.c b/xc/programs/Xserver/GL/mesa/src/X/xf86glx.c index b7ff0f97d..8abff39b9 100644 --- a/xc/programs/Xserver/GL/mesa/src/X/xf86glx.c +++ b/xc/programs/Xserver/GL/mesa/src/X/xf86glx.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/GL/mesa/src/X/xf86glx.c,v 1.10 2001/02/16 13:24:06 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/GL/mesa/src/X/xf86glx.c,v 1.11 2001/10/31 22:50:27 tsi Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. @@ -429,6 +429,8 @@ static Bool init_visuals(int *nvisualp, VisualPtr *visualp, void __MESA_setVisualConfigs(int nconfigs, __GLXvisualConfig *configs, void **privates) { + (void)kernel8; + (void)DitherValues; numConfigs = nconfigs; visualConfigs = configs; visualPrivates = privates; diff --git a/xc/programs/Xserver/Imakefile b/xc/programs/Xserver/Imakefile index 3c57989af..3991ddab1 100644 --- a/xc/programs/Xserver/Imakefile +++ b/xc/programs/Xserver/Imakefile @@ -1,8 +1,8 @@ -XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:47:01 cpqbld Exp $ +XCOMM $Xorg: Imakefile,v 1.4 2001/03/14 18:42:02 pookie Exp $ /* * Server Master Makefile */ -XCOMM $XFree86: xc/programs/Xserver/Imakefile,v 3.243 2001/08/03 23:43:37 alanh Exp $ +XCOMM $XFree86: xc/programs/Xserver/Imakefile,v 3.254 2002/01/07 20:38:21 dawes Exp $ #ifndef InstallXserverSetUID #define InstallXserverSetUID NO @@ -104,13 +104,13 @@ INSTPGMFLAGS = XIDIR = Xi #endif #if BuildXIE - XIEEXT = XIE/dixie/ModuleLibraryTargetName(dixie) \ - XIE/mixie/ModuleLibraryTargetName(mixie) - XIEDIR = XIE + XIEEXT = XIE/dixie/ModuleLibraryTargetName(dixie) \ + XIE/mixie/ModuleLibraryTargetName(mixie) + XIEDIR = XIE #endif #if BuildXKB - XKBEXT = xkb/LibraryTargetName(xkb) - XKBDIR = xkb + XKBEXT = xkb/LibraryTargetName(xkb) + XKBDIR = xkb #endif #if BuildLBX LBXEXT = lbx/LibraryTargetName(lbx) \ @@ -124,30 +124,34 @@ INSTPGMFLAGS = DBEDIR = dbe #endif #if BuildRECORD - RECORDEXT = record/LibraryTargetName(record) + RECORDEXT = record/LibraryTargetName(record) #endif #if BuildRECORD || BuildRECORDlib - RECORDDIR = record + RECORDDIR = record +#endif +#if BuildXTrap + XTRAPEXT = XTrap/LibraryTargetName(xtrap) + XTRAPDIR = XTrap #endif #ifdef SiteExtensionLibs - SITEEXTS = SiteExtensionLibs + SITEEXTS = SiteExtensionLibs #endif #ifdef SiteExtensionDirs - SITEEXTDIRS = SiteExtensionDirs + SITEEXTDIRS = SiteExtensionDirs #endif #if DoLoadableServer && HasDlopen - LIBDL = DlLibrary + LIBDL = DlLibrary #endif - LIBREGEX = RegexLibrary + LIBREGEX = RegexLibrary #if DoLoadableServer - LIBCWRAPPER = os/libcwrapper.o + LIBCWRAPPER = os/libcwrapper.o #endif #if BuildXprint #ifndef XpRasterDDX -#define XpRasterDDX NO +#define XpRasterDDX YES #endif #ifndef XpColorPclDDX #define XpColorPclDDX YES @@ -196,22 +200,23 @@ XPFBLIBS = dix/LibraryTargetName(xpstubs) #if DoLoadableServer EXTENSIONS = $(OTHEREXTS) $(RENDERLIB) $(RANDRLIB) LOADABLEEXTS = $(PEXLIBS) $(XIEEXT) $(MISCEXT) $(DBEEXT) $(RECORDEXT) \ - $(GLXEXT) + $(GLXEXT) $(XTRAPEXT) MISCEXT = Xext/LibraryTargetName(ext) OTHEREXTS = Xext/LibraryTargetName(exts) $(XKBEXT) $(XINPUTEXT) \ $(LBXEXT) $(SITEEXTS) #else EXTENSIONS = $(OTHEREXTS) $(PEXLIBS) $(GLXEXT) $(RENDERLIB) $(RANDRLIB) OTHEREXTS = Xext/LibraryTargetName(ext) $(XKBEXT) $(XINPUTEXT) \ - $(XIEEXT) $(LBXEXT) $(DBEEXT) $(RECORDEXT) $(SITEEXTS) + $(XIEEXT) $(LBXEXT) $(DBEEXT) $(RECORDEXT) \ + $(SITEEXTS) $(XTRAPEXT) #endif EXTDIRS = Xext $(XKBDIR) $(XIDIR) $(XIEDIR) $(PEXDIR) $(GLXDIR) \ $(LBXDIRS) $(DBEDIR) $(RECORDDIR) $(SITEEXTDIRS) \ - $(RENDERDIR) $(RANDRDIR) + $(RENDERDIR) $(RANDRDIR) $(XTRAPDIR) #if BuildLBX || GzipFontCompression ZLIB = GzipLibrary #endif - OS = os/LibraryTargetName(os) $(XAUTHLIB) $(XDMCPLIB) + OS = os/LibraryTargetName(os) $(DEPXAUTHLIB) $(DEPXDMCPLIB) BSDEMUL = $(DEPXBSDLIB) #if DoLoadableServer MFB = mfb/ModuleLibraryTargetName(mfb) @@ -268,7 +273,7 @@ XPFBLIBS = dix/LibraryTargetName(xpstubs) #if !HasLibUsb USB = $(XF86OSSRC)/bsd/libusb/LibraryTargetName(usb) #else - USB = -lusb + USB = UsbHidLib #endif #endif #ifdef ServerExtraSysLibs @@ -556,7 +561,6 @@ XF86INIT = $(XF86COMSRC)/xf86Init.o $(XF86COMSRC)/xf86IniExt.o XF86COMLIB = $(XF86COMSRC)/LibraryTargetName(xf86) XF86PARSLIB= $(XF86PARSERSRC)/LibraryTargetName(xf86config) XF86OSLIB = $(XF86OSSRC)/LibraryTargetName(xf86_os) -XF86HWLIB = $(XF86HWSRC)/LibraryTargetName(common_hw) #if XF86XAA XF86XAALIB = $(XF86SRC)/xaa/LibraryTargetName(xaa) #endif @@ -801,6 +805,35 @@ ServerTarget(Xtrident,$(TRIDENTDIRS),$(TRIDENTOBJS), \ $(TRIDENTLIBS),$(TRIDENTSYSLIBS)) #endif /* XTridentServer */ +#if XchipsServer +XCOMM +XCOMM server with Keith's C&T driver +XCOMM + + VESADIR = $(KDRIVE)/vesa + VESA = $(VESADIR)/LibraryTargetName(vesa) + CHIPSDIR = $(KDRIVE)/chips + CHIPS = $(CHIPSDIR)/LibraryTargetName(chips) + + KDDIRS = StdKdDirs + + CHIPSDIRS = $(STDDIRS) $(KDDIRS) \ + $(FBDEVDIR) $(VESADIR) $(SHADOWDIR) $(LAYERDIR) $(CHIPSDIR) + + CHIPSLIBS = PreFbLibs $(CHIPS) $(VESA) $(LAYER) KdLibs FbPostFbLibs +CHIPSSYSLIBS = StdKdSysLibs + +#if HasParallelMake +MakeMutex($(CHIPSDIRS) $(CHIPSLIBS) $(CHIPSSYSLIBS)) +#endif +#if ForceServerRemake +$(CHIPSOBJS) $(CHIPSLIBS) $(CHIPSSYSLIBS):: $(CHIPSDIRS) + @if [ -f $@ ]; then touch $@; fi +#endif +ServerTarget(Xchips,$(CHIPSDIRS),$(CHIPSOBJS), \ + $(CHIPSLIBS),$(CHIPSSYSLIBS)) +#endif /* XchipsServer */ + #if Xmach64Server XCOMM XCOMM server with Keith's Mach64 driver (for Mobility 1 machines) @@ -1032,7 +1065,7 @@ ServerTarget(Xvesa,$(VESADIRS),$(VESAOBJS), \ KDRIVEDIRS=$(KDDIRS) $(FBDEVDIR) $(SAVAGEDIR) $(TRIDENTDIR) $(I810DIR) \ $(SIS530DIR) $(TRIODIR) $(TS300DIR) $(ITSYDIR) $(IGSDIR) \ - $(VESADIR) $(PCMCIADIR) $(IPAQDIR) $(MACH64DIR) + $(VESADIR) $(PCMCIADIR) $(IPAQDIR) $(MACH64DIR) $(CHIPSDIR) #endif /* KDriveXServer */ #if XprtServer @@ -1167,11 +1200,7 @@ XWINOBJS = $(XWINDDXDIR)/stubs.o XWINLIBS = PreFbLibs $(XWINLIB) FbPostFbLibs $(LAYER) $(SHADOW) XWINSYSLIBS = $(FONTLIBS) $(LDPRELIBS) $(XLIB) $(SYSLIBS) -lgdi32 -lddraw -#if 0 /* - * Do not erase this block - it will be used in the future, and the - * flags are obscure enough as to be easily forgotten. - * * These flags cause XWin.exe to be a Windows executable, which * prevents XWin.exe from opening a Command Prompt window when it is * started. However, the flags also prevent XWin.exe from outputting @@ -1180,7 +1209,6 @@ XWINSYSLIBS = $(FONTLIBS) $(LDPRELIBS) $(XLIB) $(SYSLIBS) -lgdi32 -lddraw * before enabling these flags. */ EXTRA_LDOPTIONS = -mwindows -e _mainCRTStartup -#endif #if HasParallelMake MakeMutex($(XWINDIRS) $(XWINOBJS) $(XWINLIB) $(XWINLIBS) $(XWINSYSLIBS)) @@ -1201,6 +1229,15 @@ ServerTarget(XWin,$(XWINDIRS),$(XWINOBJS), \ #endif /* XWinServer */ +#ifdef DarwinArchitecture +/* + * To allow building even when building the client-side libraries is turned + * off, libraries in ProjectRoot are listed as dependencies for some targets. + * This causes problems unless we tell make where to find these dependencies. + */ +VPATH = $(BUILDLIBDIR):$(USRLIBDIR) +#endif + #if XDarwinServer XCOMM XCOMM X Darwin server for Mac OS X / Darwin @@ -1266,8 +1303,7 @@ SUBDIRS = $(STDDIRS) $(MFBDIR) $(CFBDIRS) $(IPLANDIRS) $(ILBMDIR) $(AFBDIR) \ $(LMFCFBDIR) $(DDXDIRS) $(FBDIR) $(KDRIVEDIRS) $(MIEXTDIRS) #if defined(ServerToInstall) && \ - !defined(OS2Architecture) && \ - !defined(QNX4Architecture) + !defined(OS2Architecture) install:: -(cd $(DESTDIR)$(BINDIR); $(RM) X; $(LN) ServerToInstall X) #endif diff --git a/xc/programs/Xserver/Xprint/pcl/Pcl.h b/xc/programs/Xserver/Xprint/pcl/Pcl.h index e9163149c..0532e1fcc 100644 --- a/xc/programs/Xserver/Xprint/pcl/Pcl.h +++ b/xc/programs/Xserver/Xprint/pcl/Pcl.h @@ -44,7 +44,7 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/pcl/Pcl.h,v 1.8 2001/08/01 00:44:45 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/Xprint/pcl/Pcl.h,v 1.12 2001/12/21 21:02:05 dawes Exp $ */ #ifndef _PCL_H_ #define _PCL_H_ @@ -52,24 +52,12 @@ copyright holders. #include <stdio.h> #include "scrnintstr.h" -#if 0 -#include "X.h" -#include "Xproto.h" -#include "Xatom.h" -#include "misc.h" -#include "screenint.h" -#include "colormapst.h" -#include "windowstr.h" -#include "propertyst.h" -#include "servermd.h" /* needed for IMAGE_BUFSIZE */ -#endif - #include "PclDef.h" #include "Pclmap.h" #include "PclSFonts.h" -#include "extensions/Print.h" -#include "extensions/Printstr.h" +#include <X11/extensions/Print.h> +#include <X11/extensions/Printstr.h> #include "miscstruct.h" #include "fontstruct.h" @@ -79,13 +67,16 @@ copyright holders. /* * Some sleazes to force the XrmDB stuff into the server */ +#ifndef HAVE_XPointer typedef char *XPointer; +#endif #define Status int #define True 1 #define False 0 #include "misc.h" #include <X11/Xfuncproto.h> #include <X11/Xresource.h> +#include "attributes.h" /****** * externally visible variables from PclInit.c @@ -95,6 +86,11 @@ extern int PclContextPrivateIndex; extern int PclPixmapPrivateIndex; extern int PclGCPrivateIndex; +/****** + * externally visible variables from PclAttVal.c + ******/ +extern XpValidatePoolsRec PclValidatePoolsRec; + /* * This structure defines a mapping from an X colormap ID to a list of * print contexts which use the colormap. @@ -380,12 +376,21 @@ extern void PclComputeCompositeClip( extern Bool PclCloseScreen( int index, ScreenPtr pScreen); -extern Bool InitializePclDriver( +extern Bool InitializeColorPclDriver( + int ndx, + ScreenPtr pScreen, + int argc, + char **argv); +extern Bool InitializeMonoPclDriver( + int ndx, + ScreenPtr pScreen, + int argc, + char **argv); +extern Bool InitializeLj3PclDriver( int ndx, ScreenPtr pScreen, int argc, char **argv); -static Bool PclDestroyContext( XpContextPtr pCon ); extern XpContextPtr PclGetContextFromWindow( WindowPtr win ); /****** diff --git a/xc/programs/Xserver/Xprint/ps/Ps.h b/xc/programs/Xserver/Xprint/ps/Ps.h index fd210cafd..9c65dc26f 100644 --- a/xc/programs/Xserver/Xprint/ps/Ps.h +++ b/xc/programs/Xserver/Xprint/ps/Ps.h @@ -1,9 +1,12 @@ -/* $Xorg: Ps.h,v 1.3 2000/08/17 19:48:09 cpqbld Exp $ */ +/* $Xorg: Ps.h,v 1.5 2001/02/09 02:04:35 xorgcvs Exp $ */ /* Copyright 1996, 1998 The Open Group -All Rights Reserved. +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 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -70,7 +73,7 @@ in this Software without prior written authorization from The Open Group. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/ps/Ps.h,v 1.7 2001/08/01 00:44:46 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/Xprint/ps/Ps.h,v 1.13 2001/12/21 21:02:05 dawes Exp $ */ #ifndef _PS_H_ #define _PS_H_ @@ -84,23 +87,11 @@ in this Software without prior written authorization from The Open Group. #include "scrnintstr.h" #include "dix.h" -#if 0 -#include "X.h" -#include "Xproto.h" -#include "Xatom.h" -#include "misc.h" -#include "screenint.h" -#include "colormapst.h" -#include "windowstr.h" -#include "propertyst.h" -#include "servermd.h" /* needed for IMAGE_BUFSIZE */ -#endif - #include "PsDef.h" #include "psout.h" -#include "extensions/Print.h" -#include "extensions/Printstr.h" +#include <X11/extensions/Print.h> +#include <X11/extensions/Printstr.h> #include "miscstruct.h" #include "fontstruct.h" @@ -300,7 +291,6 @@ typedef struct extern Bool InitializePsDriver(int ndx, ScreenPtr pScreen, int argc, char **argv); -static Bool PsDestroyContext(XpContextPtr pCon); extern XpContextPtr PsGetContextFromWindow(WindowPtr win); /* @@ -324,9 +314,6 @@ extern int PsGetDocumentData(XpContextPtr pCon, ClientPtr client, */ extern Bool PsCreateGC(GCPtr pGC); -static int PsGetDrawablePrivateStuff(DrawablePtr pDrawable, GC *gc, - unsigned long *valid, PsOutPtr *psOut, - ColormapPtr *cMap); extern int PsUpdateDrawableGC(GCPtr pGC, DrawablePtr pDrawable, PsOutPtr *psOut, ColormapPtr *cMap); extern void PsValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable); @@ -516,4 +503,14 @@ extern PsElmPtr PsCreateFillElementList(PixmapPtr pix, int *nElms); extern PsElmPtr PsCloneFillElementList(int nElms, PsElmPtr elms); extern void PsDestroyFillElementList(int nElms, PsElmPtr elms); +/* + * Functions in PsCache.c + */ + +#ifdef BM_CACHE +extern int PsBmIsImageCached(int gWidth, int gHeight, char *pBuffer); +extern int PsBmPutImageInCache(int gWidth, int gHeight, char *pBuffer); +extern void PsBmClearImageCache(void); +#endif + #endif /* _PS_H_ */ diff --git a/xc/programs/Xserver/Xserver.man b/xc/programs/Xserver/Xserver.man index 54ada48ea..14815d761 100644 --- a/xc/programs/Xserver/Xserver.man +++ b/xc/programs/Xserver/Xserver.man @@ -1,7 +1,11 @@ -.\" $Xorg: Xserver.man,v 1.3 2000/08/17 19:47:01 cpqbld Exp $ +.\" $Xorg: Xserver.man,v 1.4 2001/02/09 02:04:07 xorgcvs Exp $ .\" Copyright 1984 - 1991, 1993, 1994, 1998 The Open Group .\" -.\" All Rights Reserved. +.\" 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. .\" .\" The above copyright notice and this permission notice shall be included .\" in all copies or substantial portions of the Software. @@ -18,7 +22,7 @@ .\" not be used in advertising or otherwise to promote the sale, use or .\" other dealings in this Software without prior written authorization .\" from The Open Group. -.\" $XFree86: xc/programs/Xserver/Xserver.man,v 3.16 2001/03/28 14:35:14 dawes Exp $ +.\" $XFree86: xc/programs/Xserver/Xserver.man,v 3.18 2001/12/26 19:14:06 dawes Exp $ .TH XSERVER 1 __xorgversion__ .SH NAME Xserver \- X Window System display server @@ -270,6 +274,10 @@ Enable XDMCP and send IndirectQuery packets to the specified host. Use an alternate port number for XDMCP packets. Must be specified before any \-query, \-broadcast or \-indirect options. .TP 8 +.B \-from \fIlocal-address\fP +Specify the local address to send the XDMCP query from. This +is currently only implemented for direct (\-query) XDMCP queries. +.TP 8 .B \-once Causes the server to terminate (rather than reset) when the XDMCP session ends. .TP 8 diff --git a/xc/programs/Xserver/fb/fbcompose.c b/xc/programs/Xserver/fb/fbcompose.c index 840cf62d8..6299ce634 100644 --- a/xc/programs/Xserver/fb/fbcompose.c +++ b/xc/programs/Xserver/fb/fbcompose.c @@ -1,5 +1,5 @@ /* - * $XFree86: xc/programs/Xserver/fb/fbcompose.c,v 1.11 2001/08/16 08:03:25 keithp Exp $ + * $XFree86: xc/programs/Xserver/fb/fbcompose.c,v 1.13 2001/10/28 03:33:08 tsi Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * @@ -761,14 +761,13 @@ fbCombineSaturateU (FbCompositeOperand *src, FbCompositeOperand *msk, FbCompositeOperand *dst) { - CARD32 s, d; + CARD32 s = fbCombineMaskU (src, msk), d; +#if 0 CARD16 sa, da; CARD16 ad, as; CARD16 t; CARD32 m,n,o,p; - s = fbCombineMaskU (src, msk); -#if 0 d = (*dst->fetch) (dst); sa = s >> 24; da = ~d >> 24; @@ -927,7 +926,7 @@ fbCombineDisjointGeneralU (FbCompositeOperand *src, da = d >> 24; switch (combine & CombineA) { - case 0: + default: Fa = 0; break; case CombineAOut: @@ -942,7 +941,7 @@ fbCombineDisjointGeneralU (FbCompositeOperand *src, } switch (combine & CombineB) { - case 0: + default: Fb = 0; break; case CombineBOut: @@ -985,7 +984,7 @@ fbCombineDisjointGeneralC (FbCompositeOperand *src, da = d >> 24; switch (combine & CombineA) { - case 0: + default: Fa = 0; break; case CombineAOut: @@ -1008,7 +1007,7 @@ fbCombineDisjointGeneralC (FbCompositeOperand *src, } switch (combine & CombineB) { - case 0: + default: Fb = 0; break; case CombineBOut: @@ -1228,7 +1227,6 @@ fbCombineConjointGeneralU (FbCompositeOperand *src, CARD32 m,n,o,p; CARD16 Fa, Fb, t, u, v; CARD8 sa, da; - CARD32 rp; s = fbCombineMaskU (src, msk); sa = s >> 24; @@ -1237,7 +1235,7 @@ fbCombineConjointGeneralU (FbCompositeOperand *src, da = d >> 24; switch (combine & CombineA) { - case 0: + default: Fa = 0; break; case CombineAOut: @@ -1252,7 +1250,7 @@ fbCombineConjointGeneralU (FbCompositeOperand *src, } switch (combine & CombineB) { - case 0: + default: Fb = 0; break; case CombineBOut: @@ -1295,7 +1293,7 @@ fbCombineConjointGeneralC (FbCompositeOperand *src, da = d >> 24; switch (combine & CombineA) { - case 0: + default: Fa = 0; break; case CombineAOut: @@ -1318,7 +1316,7 @@ fbCombineConjointGeneralC (FbCompositeOperand *src, } switch (combine & CombineB) { - case 0: + default: Fb = 0; break; case CombineBOut: @@ -1948,7 +1946,7 @@ fbFetcha_a1 (FbCompositeOperand *op) CARD32 pixel = ((CARD32 *)line)[offset >> 5]; CARD32 a; #if BITMAP_BIT_ORDER == MSBFirst - a = pixel >> (0x1f - offset & 0x1f); + a = pixel >> (0x1f - (offset & 0x1f)); #else a = pixel >> (offset & 0x1f); #endif @@ -1968,7 +1966,7 @@ fbFetch_a1 (FbCompositeOperand *op) CARD32 pixel = ((CARD32 *)line)[offset >> 5]; CARD32 a; #if BITMAP_BIT_ORDER == MSBFirst - a = pixel >> (0x1f - offset & 0x1f); + a = pixel >> (0x1f - (offset & 0x1f)); #else a = pixel >> (offset & 0x1f); #endif @@ -1986,7 +1984,7 @@ fbFetch_g1 (FbCompositeOperand *op) CARD32 pixel = ((CARD32 *)line)[offset >> 5]; CARD32 a; #if BITMAP_BIT_ORDER == MSBFirst - a = pixel >> (0x1f - offset & 0x1f); + a = pixel >> (0x1f - (offset & 0x1f)); #else a = pixel >> (offset & 0x1f); #endif @@ -2328,44 +2326,44 @@ fbStore_external (FbCompositeOperand *op, CARD32 value) FbAccessMap fbAccessMap[] = { /* 32bpp formats */ - PICT_a8r8g8b8, fbFetch_a8r8g8b8, fbFetch_a8r8g8b8, fbStore_a8r8g8b8, - PICT_x8r8g8b8, fbFetch_x8r8g8b8, fbFetch_x8r8g8b8, fbStore_x8r8g8b8, - PICT_a8b8g8r8, fbFetch_a8b8g8r8, fbFetch_a8b8g8r8, fbStore_a8b8g8r8, - PICT_x8b8g8r8, fbFetch_x8b8g8r8, fbFetch_x8b8g8r8, fbStore_x8b8g8r8, + { PICT_a8r8g8b8, fbFetch_a8r8g8b8, fbFetch_a8r8g8b8, fbStore_a8r8g8b8 }, + { PICT_x8r8g8b8, fbFetch_x8r8g8b8, fbFetch_x8r8g8b8, fbStore_x8r8g8b8 }, + { PICT_a8b8g8r8, fbFetch_a8b8g8r8, fbFetch_a8b8g8r8, fbStore_a8b8g8r8 }, + { PICT_x8b8g8r8, fbFetch_x8b8g8r8, fbFetch_x8b8g8r8, fbStore_x8b8g8r8 }, /* 24bpp formats */ - PICT_r8g8b8, fbFetch_r8g8b8, fbFetch_r8g8b8, fbStore_r8g8b8, - PICT_b8g8r8, fbFetch_b8g8r8, fbFetch_b8g8r8, fbStore_b8g8r8, + { PICT_r8g8b8, fbFetch_r8g8b8, fbFetch_r8g8b8, fbStore_r8g8b8 }, + { PICT_b8g8r8, fbFetch_b8g8r8, fbFetch_b8g8r8, fbStore_b8g8r8 }, /* 16bpp formats */ - PICT_r5g6b5, fbFetch_r5g6b5, fbFetch_r5g6b5, fbStore_r5g6b5, - PICT_b5g6r5, fbFetch_b5g6r5, fbFetch_b5g6r5, fbStore_b5g6r5, + { PICT_r5g6b5, fbFetch_r5g6b5, fbFetch_r5g6b5, fbStore_r5g6b5 }, + { PICT_b5g6r5, fbFetch_b5g6r5, fbFetch_b5g6r5, fbStore_b5g6r5 }, - PICT_a1r5g5b5, fbFetch_a1r5g5b5, fbFetch_a1r5g5b5, fbStore_a1r5g5b5, - PICT_x1r5g5b5, fbFetch_x1r5g5b5, fbFetch_x1r5g5b5, fbStore_x1r5g5b5, - PICT_a1b5g5r5, fbFetch_a1b5g5r5, fbFetch_a1b5g5r5, fbStore_a1b5g5r5, - PICT_x1b5g5r5, fbFetch_x1b5g5r5, fbFetch_x1b5g5r5, fbStore_x1b5g5r5, + { PICT_a1r5g5b5, fbFetch_a1r5g5b5, fbFetch_a1r5g5b5, fbStore_a1r5g5b5 }, + { PICT_x1r5g5b5, fbFetch_x1r5g5b5, fbFetch_x1r5g5b5, fbStore_x1r5g5b5 }, + { PICT_a1b5g5r5, fbFetch_a1b5g5r5, fbFetch_a1b5g5r5, fbStore_a1b5g5r5 }, + { PICT_x1b5g5r5, fbFetch_x1b5g5r5, fbFetch_x1b5g5r5, fbStore_x1b5g5r5 }, /* 8bpp formats */ - PICT_a8, fbFetch_a8, fbFetcha_a8, fbStore_a8, - PICT_r3g3b2, fbFetch_r3g3b2, fbFetch_r3g3b2, fbStore_r3g3b2, - PICT_b2g3r3, fbFetch_b2g3r3, fbFetch_b2g3r3, fbStore_b2g3r3, - PICT_a2r2g2b2, fbFetch_a2r2g2b2, fbFetch_a2r2g2b2, fbStore_a2r2g2b2, - PICT_c8, fbFetch_c8, fbFetch_c8, fbStore_c8, - PICT_g8, fbFetch_c8, fbFetch_c8, fbStore_g8, + { PICT_a8, fbFetch_a8, fbFetcha_a8, fbStore_a8 }, + { PICT_r3g3b2, fbFetch_r3g3b2, fbFetch_r3g3b2, fbStore_r3g3b2 }, + { PICT_b2g3r3, fbFetch_b2g3r3, fbFetch_b2g3r3, fbStore_b2g3r3 }, + { PICT_a2r2g2b2, fbFetch_a2r2g2b2, fbFetch_a2r2g2b2, fbStore_a2r2g2b2 }, + { PICT_c8, fbFetch_c8, fbFetch_c8, fbStore_c8 }, + { PICT_g8, fbFetch_c8, fbFetch_c8, fbStore_g8 }, /* 4bpp formats */ - PICT_a4, fbFetch_a4, fbFetcha_a4, fbStore_a4, - PICT_r1g2b1, fbFetch_r1g2b1, fbFetch_r1g2b1, fbStore_r1g2b1, - PICT_b1g2r1, fbFetch_b1g2r1, fbFetch_b1g2r1, fbStore_b1g2r1, - PICT_a1r1g1b1, fbFetch_a1r1g1b1, fbFetch_a1r1g1b1, fbStore_a1r1g1b1, - PICT_a1b1g1r1, fbFetch_a1b1g1r1, fbFetch_a1b1g1r1, fbStore_a1b1g1r1, - PICT_c4, fbFetch_c4, fbFetch_c4, fbStore_c4, - PICT_g4, fbFetch_c4, fbFetch_c4, fbStore_g4, + { PICT_a4, fbFetch_a4, fbFetcha_a4, fbStore_a4 }, + { PICT_r1g2b1, fbFetch_r1g2b1, fbFetch_r1g2b1, fbStore_r1g2b1 }, + { PICT_b1g2r1, fbFetch_b1g2r1, fbFetch_b1g2r1, fbStore_b1g2r1 }, + { PICT_a1r1g1b1, fbFetch_a1r1g1b1, fbFetch_a1r1g1b1, fbStore_a1r1g1b1 }, + { PICT_a1b1g1r1, fbFetch_a1b1g1r1, fbFetch_a1b1g1r1, fbStore_a1b1g1r1 }, + { PICT_c4, fbFetch_c4, fbFetch_c4, fbStore_c4 }, + { PICT_g4, fbFetch_c4, fbFetch_c4, fbStore_g4 }, /* 1bpp formats */ - PICT_a1, fbFetch_a1, fbFetcha_a1, fbStore_a1, - PICT_g1, fbFetch_g1, fbFetch_g1, fbStore_g1, + { PICT_a1, fbFetch_a1, fbFetcha_a1, fbStore_a1 }, + { PICT_g1, fbFetch_g1, fbFetch_g1, fbStore_g1 }, }; #define NumAccessMap (sizeof fbAccessMap / sizeof fbAccessMap[0]) @@ -2443,7 +2441,7 @@ fbCompositeGeneral (CARD8 op, FbCompositeOperand src[3],msk[3],dst[3],*pmsk; FbCompositeOperand *srcPict, *srcAlpha; FbCompositeOperand *dstPict, *dstAlpha; - FbCompositeOperand *mskPict, *mskAlpha; + FbCompositeOperand *mskPict = 0, *mskAlpha = 0; FbCombineFunc f; int w; diff --git a/xc/programs/Xserver/hw/darwin/Imakefile b/xc/programs/Xserver/hw/darwin/Imakefile index a64fea603..6eccb88b3 100644 --- a/xc/programs/Xserver/hw/darwin/Imakefile +++ b/xc/programs/Xserver/hw/darwin/Imakefile @@ -1,8 +1,10 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/darwin/Imakefile,v 1.11 2001/05/18 17:48:32 torrey Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/darwin/Imakefile,v 1.12 2002/01/09 18:07:23 torrey Exp $ #include <Server.tmpl> #define IHaveSubdirs +LinkSourceFile(XFree86.man,../xfree86) + SRCS = darwin.c \ darwinKeyboard.c \ xfIOKit.c \ @@ -30,7 +32,7 @@ SUBDIRS = utils #endif DEFINES = $(CUSTOMVERDEF) $(QUARTZDEF) -EXTRAMANDEFS = $(QUARTZDEF) +EXTRAMANDEFS = $(QUARTZDEF) -D__logdir__=$(LOGDIRECTORY) NormalLibraryObjectRule() NormalLibraryTarget(darwin,$(OBJS)) @@ -38,6 +40,7 @@ NormalLibraryTarget(darwin,$(OBJS)) AllTarget(xfIOKitStartup.o) InstallManPage(XDarwin,$(MANDIR)) +InstallManPage(XFree86,$(MANDIR)) DependTarget() diff --git a/xc/programs/Xserver/hw/darwin/darwin.c b/xc/programs/Xserver/hw/darwin/darwin.c index 018b9544b..46430151d 100644 --- a/xc/programs/Xserver/hw/darwin/darwin.c +++ b/xc/programs/Xserver/hw/darwin/darwin.c @@ -4,7 +4,7 @@ * running with Quartz or the IOKit * **************************************************************/ -/* $XFree86: xc/programs/Xserver/hw/darwin/darwin.c,v 1.32 2001/08/12 00:10:01 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/darwin.c,v 1.43 2002/01/09 18:01:58 torrey Exp $ */ #include "X.h" #include "Xproto.h" @@ -45,23 +45,26 @@ #define SCROLLWHEELUPFAKE 4 #define SCROLLWHEELDOWNFAKE 5 -// X server shared global variables +/* + * X server shared global variables + */ int darwinScreensFound = 0; int darwinScreenIndex = 0; DarwinInputRec hid; int darwinEventFD = -1; Bool quartz = FALSE; -int quartzEventWriteFD = -1; -int quartzStartClients = 1; -int quartzRootless = -1; -int quartzUseSysBeep = 0; int quartzMouseAccelChange = 1; int darwinFakeButtons = 0; -UInt32 darwinDesiredWidth = 0, darwinDesiredHeight = 0; -IOIndex darwinDesiredDepth = -1; -SInt32 darwinDesiredRefresh = -1; -UInt32 darwinScreenNumber = 0; -char *darwinKeymapFile = NULL; + +// location of X11's (0,0) point in global screen coordinates +int darwinMainScreenX = 0; +int darwinMainScreenY = 0; + +// parameters read from the command line or user preferences +unsigned int darwinDesiredWidth = 0, darwinDesiredHeight = 0; +int darwinDesiredDepth = -1; +int darwinDesiredRefresh = -1; +char *darwinKeymapFile = "USA.keymapping"; // modifier masks for faking mouse buttons int darwinFakeMouse2Mask = NX_COMMANDMASK; @@ -70,9 +73,6 @@ int darwinFakeMouse3Mask = NX_ALTERNATEMASK; static DeviceIntPtr darwinPointer; static DeviceIntPtr darwinKeyboard; -// button number of pressed fake button, or 0 if no fake button is pressed -static int darwinFakeMouseButtonDown = 0; - // Common pixmap formats static PixmapFormatRec formats[] = { { 1, 1, BITMAP_SCANLINE_PAD }, @@ -111,6 +111,12 @@ DarwinPrintBanner() #if XF86_VERSION_SNAP > 0 ErrorF(".%d", XF86_VERSION_SNAP); #endif + +#if XF86_VERSION_SNAP >= 900 + ErrorF(" (%d.%d.0 RC %d)", XF86_VERSION_MAJOR, XF86_VERSION_MINOR + 1, + XF86_VERSION_SNAP - 900); +#endif + #ifdef XF86_CUSTOM_VERSION ErrorF(" (%s)", XF86_CUSTOM_VERSION); #endif @@ -160,6 +166,9 @@ static Bool DarwinAddScreen( ColormapPtr pmap; DarwinFramebufferPtr dfb; + // reset index of found screens for each server generation + if (index == 0) foundIndex = 0; + // allocate space for private per screen storage dfb = xalloc(sizeof(DarwinFramebufferRec)); SCREEN_PRIV(pScreen) = dfb; @@ -180,7 +189,7 @@ static Bool DarwinAddScreen( miClearVisualTypes(); // setup a single visual appropriate for our pixel type - // Note: Darwin kIORGBDirectPixels = X window TrueColor, not DirectColor + // Note: Darwin kIORGBDirectPixels = X TrueColor, not DirectColor if (dfb->pixelInfo.pixelType == kIORGBDirectPixels) { if (!miSetVisualTypes( dfb->colorBitsPerPixel, TrueColorMask, bitsPerRGB, TrueColor )) { @@ -290,7 +299,7 @@ static Bool DarwinAddScreen( dixScreenOrigins[index].x = dfb->x; dixScreenOrigins[index].y = dfb->y; - ErrorF("Screen %d added: %dx%d @ %d,%d\n", + ErrorF("Screen %d added: %dx%d @ (%d,%d)\n", index, dfb->width, dfb->height, dfb->x, dfb->y); return TRUE; @@ -553,8 +562,9 @@ static int DarwinParseModifierList( * Send a mouse click to X when multiple mouse buttons are simulated * with modifier-clicks, such as command-click for button 2. The dix * layer is told that the previously pressed modifier key(s) are - * released, the simulated click event is sent, and the modifier keys - * are reverted to their actual (pressed) state. This is usually + * released, the simulated click event is sent. After the mouse button + * is released, the modifier keys are reverted to their actual state, + * which may or may not be pressed at that point. This is usually * closest to what the user wants. Ie. the user typically wants to * simulate a button 2 press instead of Command-button 2. */ @@ -573,9 +583,6 @@ static void DarwinSimulateMouseClick( xe.u.u.detail = whichButton; (darwinPointer->public.processInputProc) ( &xe, darwinPointer, 1 ); - - // reset the keys - DarwinUpdateModifiers(xe, KeyPress, modifierMask); } @@ -598,7 +605,12 @@ void ProcessInputEvents(void) int r; struct timeval tv; struct timezone tz; + + // last known modifier state static int old_state = 0; + // button number and modifier mask of currently pressed fake button + static int darwinFakeMouseButtonDown = 0; + static int darwinFakeMouseButtonMask = 0; #if defined(DARWIN_WITH_QUARTZ) && defined(QUARTZ_SAFETY_DELAY) static Bool gotread = false; @@ -645,8 +657,12 @@ void ProcessInputEvents(void) // translate it to an X event and post it memset(&xe, 0, sizeof(xe)); - xe.u.keyButtonPointer.rootX = ev.location.x; - xe.u.keyButtonPointer.rootY = ev.location.y; + // Shift from global screen coordinates to coordinates relative to + // the origin of the current screen. + xe.u.keyButtonPointer.rootX = ev.location.x - darwinMainScreenX - + dixScreenOrigins[miPointerCurrentScreen()->myNum].x; + xe.u.keyButtonPointer.rootY = ev.location.y - darwinMainScreenY - + dixScreenOrigins[miPointerCurrentScreen()->myNum].y; //xe.u.keyButtonPointer.time = ev.time; xe.u.keyButtonPointer.time = tv.tv_sec * 1000 + tv.tv_usec / 1000; @@ -675,6 +691,7 @@ void ProcessInputEvents(void) DarwinSimulateMouseClick(xe, 2, ButtonPress, darwinFakeMouse2Mask); darwinFakeMouseButtonDown = 2; + darwinFakeMouseButtonMask = darwinFakeMouse2Mask; } else if (darwinFakeButtons && (ev.flags & darwinFakeMouse3Mask) == darwinFakeMouse3Mask) @@ -682,6 +699,7 @@ void ProcessInputEvents(void) DarwinSimulateMouseClick(xe, 3, ButtonPress, darwinFakeMouse3Mask); darwinFakeMouseButtonDown = 3; + darwinFakeMouseButtonMask = darwinFakeMouse3Mask; } else { xe.u.u.detail = 1; @@ -699,15 +717,22 @@ void ProcessInputEvents(void) // If last mousedown was a fake click, don't check for // mouse modifiers here. The user may have released the // modifiers before the mouse button. + xe.u.u.type = ButtonRelease; if (darwinFakeMouseButtonDown) { xe.u.u.detail = darwinFakeMouseButtonDown; darwinFakeMouseButtonDown = 0; + (darwinPointer->public.processInputProc) + ( &xe, darwinPointer, 1 ); + + // Bring modifiers back up to date + DarwinUpdateModifiers(xe, KeyPress, + darwinFakeMouseButtonMask & old_state); + darwinFakeMouseButtonMask = 0; } else { xe.u.u.detail = 1; + (darwinPointer->public.processInputProc) + ( &xe, darwinPointer, 1 ); } - xe.u.u.type = ButtonRelease; - (darwinPointer->public.processInputProc) - ( &xe, darwinPointer, 1 ); break; // Button 2 isn't handled correctly by older kernels anyway. @@ -747,7 +772,7 @@ void ProcessInputEvents(void) old_state = ev.flags; // Alphalock is toggled rather than held on, - // so we have to press and releasae it every time. + // so we have to press and release it every time. if (new_on_flags || new_off_flags & NX_ALPHASHIFTMASK) { DarwinPressKeycode(xe, KeyPress, ev.data.key.keyCode); } @@ -830,7 +855,8 @@ void ProcessInputEvents(void) break; case kXDarwinShow: - QuartzShow(ev.location.x, ev.location.y); + QuartzShow(xe.u.keyButtonPointer.rootX, + xe.u.keyButtonPointer.rootY); // The mouse location will have moved; track it. xe.u.u.type = MotionNotify; (darwinPointer->public.processInputProc) @@ -877,10 +903,9 @@ void ProcessInputEvents(void) break; } - // why isn't this handled automatically by X??? - //miPointerAbsoluteCursor( ev.location.x, ev.location.y, ev.time ); - miPointerAbsoluteCursor( ev.location.x, ev.location.y, - tv.tv_sec * 1000 + tv.tv_usec / 1000 ); + miPointerAbsoluteCursor( xe.u.keyButtonPointer.rootX, + xe.u.keyButtonPointer.rootY, + xe.u.keyButtonPointer.time ); } miPointerUpdate(); @@ -893,13 +918,11 @@ void ProcessInputEvents(void) */ void InitInput( int argc, char **argv ) { - if (serverGeneration == 1) { - darwinPointer = AddInputDevice(DarwinMouseProc, TRUE); - RegisterPointerDevice( darwinPointer ); + darwinPointer = AddInputDevice(DarwinMouseProc, TRUE); + RegisterPointerDevice( darwinPointer ); - darwinKeyboard = AddInputDevice(DarwinKeybdProc, TRUE); - RegisterKeyboardDevice( darwinKeyboard ); - } + darwinKeyboard = AddInputDevice(DarwinKeybdProc, TRUE); + RegisterKeyboardDevice( darwinKeyboard ); } /* @@ -917,7 +940,7 @@ void InitInput( int argc, char **argv ) */ void InitOutput( ScreenInfo *pScreenInfo, int argc, char **argv ) { - int i; + int i, left, top; static unsigned long generation = 0; pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER; @@ -938,16 +961,54 @@ void InitOutput( ScreenInfo *pScreenInfo, int argc, char **argv ) // Discover screens and do mode specific initialization if (quartz) { - QuartzInitOutput(); + QuartzInitOutput(argc, argv); } else { - XFIOKitInitOutput(); + XFIOKitInitOutput(argc, argv); } // Add screens - // The first is the main screen. for (i = 0; i < darwinScreensFound; i++) { AddScreen( DarwinAddScreen, argc, argv ); } + + // Shift all screens so the X11 (0, 0) coordinate is at the top left + // of the global screen coordinates. + // Screens can be arranged so the top left isn't on any screen, + // so instead use the top left of the leftmost screen as (0,0). + // This may mean some screen space is in -y, but it's better + // that (0,0) be onscreen, or else default xterms disappear. + // It's better that -y be used than -x, because when popup + // menus are forced "onscreen" by dumb window managers like twm, + // they'll shift the menus down instead of left, which still looks + // funny but is an easier target to hit. + left = dixScreenOrigins[0].x; + top = dixScreenOrigins[0].y; + + // Find leftmost screen. If there's a tie, take the topmost of the two. + for (i = 1; i < pScreenInfo->numScreens; i++) { + if (dixScreenOrigins[i].x < left || + (dixScreenOrigins[i].x == left && + dixScreenOrigins[i].y < top)) + { + left = dixScreenOrigins[i].x; + top = dixScreenOrigins[i].y; + } + } + + darwinMainScreenX = left; + darwinMainScreenY = top; + + // Shift all screens so that there is a screen whose top left + // is at X11 (0,0) and at global screen coordinate + // (darwinMainScreenX, darwinMainScreenY). + if (darwinMainScreenX != 0 || darwinMainScreenY != 0) { + for (i = 0; i < pScreenInfo->numScreens; i++) { + dixScreenOrigins[i].x -= darwinMainScreenX; + dixScreenOrigins[i].y -= darwinMainScreenY; + ErrorF("Screen %d placed at X11 coordinate (%d,%d).\n", + i, dixScreenOrigins[i].x, dixScreenOrigins[i].y); + } + } } /* @@ -961,11 +1022,24 @@ void OsVendorFatalError( void ) /* * OsVendorInit * Initialization of Darwin OS support. - * Nothing special to do here. */ void OsVendorInit(void) { - DarwinPrintBanner(); + if (serverGeneration == 1) { + DarwinPrintBanner(); + } + + // Find the full path to the keymapping file. + if ( darwinKeymapFile ) { + char *tempStr = DarwinFindLibraryFile(darwinKeymapFile, "Keyboards"); + if ( !tempStr ) + FatalError("Could not find keymapping file %s.\n", + darwinKeymapFile); + darwinKeymapFile = tempStr; + ErrorF("Using keymapping provided in %s.\n", darwinKeymapFile); + } else { + ErrorF("Reading keymapping from the kernel.\n"); + } } /* @@ -983,15 +1057,6 @@ int ddxProcessArgument( int argc, char *argv[], int i ) return numDone; #endif - if ( !strcmp( argv[i], "-screen" ) ) { - if ( i == argc-1 ) { - FatalError( "-screen must be followed by a number\n" ); - } - darwinScreenNumber = atoi( argv[i+1] ); - ErrorF( "Attempting to use screen number %i\n", darwinScreenNumber ); - return 2; - } - if ( !strcmp( argv[i], "-fakebuttons" ) ) { darwinFakeButtons = TRUE; ErrorF( "Faking a three button mouse\n" ); @@ -1034,13 +1099,15 @@ int ddxProcessArgument( int argc, char *argv[], int i ) if ( i == argc-1 ) { FatalError( "-keymap must be followed by a filename\n" ); } - darwinKeymapFile = DarwinFindLibraryFile(argv[i+1], "Keyboards"); - if ( !darwinKeymapFile ) - FatalError( "Could not find keymapping file %s.\n", argv[i+1] ); - ErrorF( "Using keymapping provided in %s.\n", darwinKeymapFile ); + darwinKeymapFile = argv[i+1]; return 2; } + if ( !strcmp( argv[i], "-nokeymap" ) ) { + darwinKeymapFile = NULL; + return 1; + } + if ( !strcmp( argv[i], "-size" ) ) { if ( i >= argc-2 ) { FatalError( "-size must be followed by two numbers\n" ); @@ -1125,9 +1192,8 @@ void ddxUseMsg( void ) ErrorF("-rootless : run rootless inside Mac OS X window server.\n"); ErrorF("-quartz : use default Mac OS X window server mode\n"); ErrorF("\n"); - ErrorF("IOKit specific options (ignored in Quartz modes):\n"); + ErrorF("Options ignored in rootless mode:\n"); #endif - ErrorF("-screen <0,1,...> : use this screen number.\n"); ErrorF("-size <height> <width> : use a screen resolution of <height> x <width>.\n"); ErrorF("-depth <8,15,24> : use this bit depth.\n"); ErrorF("-refresh <rate> : use a monitor refresh rate of <rate> Hz.\n"); @@ -1165,15 +1231,24 @@ void AbortDDX( void ) ddxGiveUp(); } +#ifdef DPMSExtension +/* + * DPMS extension stubs + */ Bool DPMSSupported(void) { - return 0; + return FALSE; +} + +void DPMSSet(int level) +{ } -void DPMSSet(void) +int DPMSGet(int *level) { - return; + return -1; } +#endif #include "mivalidate.h" // for union _Validate used by windowstr.h diff --git a/xc/programs/Xserver/hw/kdrive/vesa/vbe.c b/xc/programs/Xserver/hw/kdrive/vesa/vbe.c index f9c05d59b..c3be29e24 100644 --- a/xc/programs/Xserver/hw/kdrive/vesa/vbe.c +++ b/xc/programs/Xserver/hw/kdrive/vesa/vbe.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/vbe.c,v 1.9 2001/05/29 04:54:12 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vbe.c,v 1.10 2001/09/05 07:12:42 keithp Exp $ */ #include "vesa.h" @@ -251,7 +251,7 @@ VbeGetMode(Vm86InfoPtr vi, int *mode) } void * -VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *ret_size) +VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *ret_size, CARD32 *ret_phys) { U8 *fb; VbeInfoBlock vib; @@ -270,6 +270,7 @@ VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *ret_size) size = 1024 * 64L * vib.TotalMemory; *ret_size = size; + *ret_phys = vmib.PhysBasePtr; before = vmib.PhysBasePtr % pagesize; after = pagesize - ((vmib.PhysBasePtr + size) % pagesize); @@ -501,6 +502,48 @@ windowB: return ((U8*)&(LM(vi, MAKE_POINTER(vbe->vmib.WinBSegment, 0)))) + offset - vbe->windowB_offset; } +static const int VbeDPMSModes[4] = { + 0x00, /* KD_DPMS_NORMAL */ + 0x01, /* KD_DPMS_STANDBY */ + 0x02, /* KD_DPMS_SUSPEND */ + 0x04, /* KD_DPMS_POWERDOWN */ +}; + +Bool +VbeDPMS(Vm86InfoPtr vi, VbeInfoBlock *vib, int mode) +{ + int code; + + /* + * Check which modes are supported + */ + vi->vms.regs.eax = 0x4f10; + vi->vms.regs.ebx = 0x0000; + vi->vms.regs.es = 0; + vi->vms.regs.edi = 0; + code = VbeDoInterrupt10 (vi); + if (code < 0) + { + ErrorF ("No DPMS Support\n"); + return FALSE; + } + /* Skip this stage if it's not supported */ + if (((vi->vms.regs.ebx >> 4) & VbeDPMSModes[mode]) != VbeDPMSModes[mode]) + return FALSE; + + /* Select this mode */ + vi->vms.regs.eax = 0x4f10; + vi->vms.regs.ebx = (VbeDPMSModes[mode] << 8) | 0x01; + code = VbeDoInterrupt10 (vi); + if (code < 0) + { + ErrorF ("DPMS failed %d\n", code); + return FALSE; + } + + return TRUE; +} + int VbeReportVib(Vm86InfoPtr vi, VbeInfoBlock *vib) { diff --git a/xc/programs/Xserver/hw/kdrive/vesa/vbe.h b/xc/programs/Xserver/hw/kdrive/vesa/vbe.h index f52fa673e..50477066b 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: xc/programs/Xserver/hw/kdrive/vesa/vbe.h,v 1.6 2001/05/29 04:54:12 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vbe.h,v 1.7 2001/09/05 07:12:42 keithp Exp $ */ #ifndef _VBE_H #define _VBE_H @@ -134,7 +134,7 @@ int VbeGetMode(Vm86InfoPtr vi, int *mode); void * -VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *size); +VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *size, CARD32 *phys); void VbeUnmapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, void *fb); diff --git a/xc/programs/Xserver/hw/kdrive/vesa/vesa.c b/xc/programs/Xserver/hw/kdrive/vesa/vesa.c index 59c4ceeab..737215376 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.16 2001/07/24 19:06:04 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.c,v 1.18 2001/09/14 19:25:17 keithp Exp $ */ #include "vesa.h" #ifdef RANDR @@ -33,6 +33,7 @@ Bool vesa_shadow = FALSE; Bool vesa_linear_fb = TRUE; Bool vesa_restore = FALSE; Bool vesa_verbose = FALSE; +Bool vesa_force_text = FALSE; #define VesaPriv(scr) ((VesaScreenPrivPtr) (scr)->driver) @@ -748,6 +749,8 @@ vesaConfigureScreen (ScreenPtr pScreen) { pscr->shadow = TRUE; pscr->rotate = 0; + m.matrix[0][0] = 1; m.matrix[0][1] = 0; m.matrix[0][2] = 0; + m.matrix[1][0] = 0; m.matrix[1][1] = 1; m.matrix[1][2] = 0; } else switch (pscr->rotate) { case 0: @@ -959,11 +962,13 @@ vesaMapFramebuffer (KdScreenInfo *screen) if (pscr->mode.vbe) pscr->fb = VbeMapFramebuffer(priv->vi, priv->vbeInfo, pscr->mode.mode, - &pscr->fb_size); + &pscr->fb_size, + &pscr->fb_phys); else pscr->fb = VgaMapFramebuffer (priv->vi, pscr->mode.mode, - &pscr->fb_size); + &pscr->fb_size, + &pscr->fb_phys); if (!pscr->fb) return FALSE; break; @@ -1451,11 +1456,13 @@ vesaEnable(ScreenPtr pScreen) if (pscr->mode.vbe) pscr->fb = VbeMapFramebuffer(priv->vi, priv->vbeInfo, pscr->mode.mode, - &pscr->fb_size); + &pscr->fb_size, + &pscr->fb_phys); else pscr->fb = VgaMapFramebuffer (priv->vi, pscr->mode.mode, - &pscr->fb_size); + &pscr->fb_size, + &pscr->fb_phys); if (!pscr->fb) return FALSE; screen->fb[0].frameBuffer = (CARD8 *)(pscr->fb); @@ -1501,6 +1508,77 @@ vesaEnable(ScreenPtr pScreen) return TRUE; } +#ifndef TOSHIBA_SMM + +# ifdef linux +# define TOSHIBA_SMM 1 +# endif + +# ifndef TOSHIBA_SMM +# define TOSHIBA_SMM 0 +# endif + +#endif + +#if TOSHIBA_SMM +/* + * Toshiba laptops use a special interface to operate the backlight + */ +#include <sys/ioctl.h> +#define TOSH_PROC "/proc/toshiba" +#define TOSH_DEVICE "/dev/toshiba" +#define TOSH_SMM _IOWR('t', 0x90, 24) + +typedef struct { + unsigned int eax; + unsigned int ebx __attribute__ ((packed)); + unsigned int ecx __attribute__ ((packed)); + unsigned int edx __attribute__ ((packed)); + unsigned int esi __attribute__ ((packed)); + unsigned int edi __attribute__ ((packed)); +} SMMRegisters; + +#define HCI_BACKLIGHT 0x0002 +#define HCI_DISABLE 0x0000 +#define HCI_ENABLE 0x0001 +#define HCI_GET 0xfe00, +#define HCI_SET 0xff00 + +Bool +toshibaDPMS (ScreenPtr pScreen, int mode) +{ + SMMRegisters regs; + static int fd; + + if (!fd) + fd = open (TOSH_DEVICE, 2); + if (fd < 0) + return FALSE; + regs.eax = HCI_SET; + regs.ebx = HCI_BACKLIGHT; + regs.ecx = mode ? HCI_DISABLE : HCI_ENABLE; + if (ioctl (fd, TOSH_SMM, ®s) < 0) + return FALSE; + return TRUE; +} +#endif /* TOSHIBA_SMM */ + +Bool +vesaDPMS (ScreenPtr pScreen, int mode) +{ + KdScreenPriv(pScreen); + VesaCardPrivPtr priv = pScreenPriv->card->driver; + VesaScreenPrivPtr pscr = pScreenPriv->screen->driver; + +#if TOSHIBA_SMM + if (toshibaDPMS (pScreen, mode)) + return TRUE; +#endif + if (pscr->mode.vbe) + return VbeDPMS (priv->vi, priv->vbeInfo, mode); + return FALSE; +} + void vesaDisable(ScreenPtr pScreen) { @@ -1569,6 +1647,13 @@ vesaRestore(KdCardInfo *card) VesaCardPrivPtr priv = card->driver; int n; + if (vesa_force_text) + { + if (vesa_verbose) + ErrorF ("Forcing switch back to mode 3 text\n"); + priv->old_vbe_mode = -1; + priv->old_vga_mode = 3; + } for (n = 0; n < priv->nmode; n++) if (priv->modes[n].vbe && priv->modes[n].mode == (priv->old_vbe_mode&0x3fff)) break; @@ -1774,6 +1859,9 @@ vesaProcessArgument (int argc, char **argv, int i) } else if(!strcmp(argv[i], "-verbose")) { vesa_verbose = TRUE; return 1; + } else if(!strcmp(argv[i], "-force-text")) { + vesa_force_text = TRUE; + return 1; } return 0; diff --git a/xc/programs/Xserver/hw/kdrive/vesa/vesa.h b/xc/programs/Xserver/hw/kdrive/vesa/vesa.h index 7b69cf6dc..43ecbd0d7 100644 --- a/xc/programs/Xserver/hw/kdrive/vesa/vesa.h +++ b/xc/programs/Xserver/hw/kdrive/vesa/vesa.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: xc/programs/Xserver/hw/kdrive/vesa/vesa.h,v 1.11 2001/07/20 19:35:30 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.h,v 1.12 2001/09/05 07:12:42 keithp Exp $ */ #ifndef _VESA_H_ #define _VESA_H_ @@ -101,6 +101,7 @@ typedef struct _VesaScreenPriv { int layerKind; void *fb; int fb_size; + CARD32 fb_phys; LayerPtr pLayer; } VesaScreenPrivRec, *VesaScreenPrivPtr; @@ -137,6 +138,9 @@ vesaFinishInitScreen(ScreenPtr pScreen); Bool vesaEnable(ScreenPtr pScreen); +Bool +vesaDPMS (ScreenPtr pScreen, int mode); + void vesaDisable(ScreenPtr pScreen); diff --git a/xc/programs/Xserver/hw/kdrive/vesa/vesainit.c b/xc/programs/Xserver/hw/kdrive/vesa/vesainit.c index 7d12b5cc6..ba2ba192f 100644 --- a/xc/programs/Xserver/hw/kdrive/vesa/vesainit.c +++ b/xc/programs/Xserver/hw/kdrive/vesa/vesainit.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/vesainit.c,v 1.6 2001/06/04 09:45:42 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesainit.c,v 1.8 2001/10/12 06:33:12 keithp Exp $ */ #include "vesa.h" @@ -29,7 +29,7 @@ const KdCardFuncs vesaFuncs = { vesaInitScreen, /* initScreen */ vesaPreserve, /* preserve */ vesaEnable, /* enable */ - 0, /* dpms */ + vesaDPMS, /* dpms */ vesaDisable, /* disable */ vesaRestore, /* restore */ vesaScreenFini, /* scrfini */ @@ -69,7 +69,7 @@ InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv) void InitInput (int argc, char **argv) { - KdInitInput(&Ps2MouseFuncs, &LinuxKeyboardFuncs); + KdInitInput(&LinuxMouseFuncs, &LinuxKeyboardFuncs); } int diff --git a/xc/programs/Xserver/hw/vfb/Xvfb.man b/xc/programs/Xserver/hw/vfb/Xvfb.man index ec35a8932..e3e255298 100644 --- a/xc/programs/Xserver/hw/vfb/Xvfb.man +++ b/xc/programs/Xserver/hw/vfb/Xvfb.man @@ -1,7 +1,11 @@ -.\" $Xorg: Xvfb.man,v 1.3 2000/08/17 19:48:39 cpqbld Exp $ +.\" $Xorg: Xvfb.man,v 1.4 2001/02/09 02:04:45 xorgcvs Exp $ .\" Copyright 1993, 1998 The Open Group .\" -.\" All Rights Reserved. +.\" 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. .\" .\" The above copyright notice and this permission notice shall be included .\" in all copies or substantial portions of the Software. @@ -19,7 +23,7 @@ .\" other dealings in this Software without prior written authorization .\" from The Open Group. .\" -.\" $XFree86: xc/programs/Xserver/hw/vfb/Xvfb.man,v 1.8 2001/02/07 23:25:55 dawes Exp $ +.\" $XFree86: xc/programs/Xserver/hw/vfb/Xvfb.man,v 1.9 2001/12/14 19:59:45 dawes Exp $ .\" .TH XVFB 1 __xorgversion__ .SH NAME diff --git a/xc/programs/Xserver/hw/xfree86/Imakefile b/xc/programs/Xserver/hw/xfree86/Imakefile index 28826fc14..e9e1a99fe 100644 --- a/xc/programs/Xserver/hw/xfree86/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/Imakefile @@ -3,7 +3,7 @@ XCOMM $XConsortium: Imakefile /main/12 1996/12/16 12:31:46 rws $ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/Imakefile,v 3.77 2001/07/23 13:15:46 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/Imakefile,v 3.79 2001/10/29 16:51:55 tsi Exp $ #include <Server.tmpl> #define IHaveSubdirs @@ -67,10 +67,6 @@ RACDIR = rac INT10DIR = int10 #endif -#if BuildSuperProbe -SUPERPROBE = SuperProbe -#endif - #if BuildXF86Setup XF86SETUPDIR = XF86Setup #endif @@ -96,7 +92,7 @@ SUBDIRS = os-support common $(XAADIR) $(XF1BPPDIR) $(XF4BPPDIR) \ drivers $(LOADERDIR) $(VGAHWDIR) $(FBDEVHWDIR) $(RAMDACDIR) \ $(RACDIR) $(I2CDIR) $(DDCDIR) $(INPUTDIR) $(INT10DIR) parser \ scanpci doc dummylib $(XF86CFGDIRS) $(XF86SETUPDIR) etc \ - $(SUPERPROBE) $(DRIVERSDK) $(XF8_32WIDDIR) + $(DRIVERSDK) $(XF8_32WIDDIR) #if !defined(OS2Architecture) && !defined(cygwinArchitecture) XF86CONFIG = XF86Config diff --git a/xc/programs/Xserver/hw/xfree86/XFree86.man b/xc/programs/Xserver/hw/xfree86/XFree86.man index 7cfed8cea..e99167211 100644 --- a/xc/programs/Xserver/hw/xfree86/XFree86.man +++ b/xc/programs/Xserver/hw/xfree86/XFree86.man @@ -1,4 +1,4 @@ -.\" $XFree86: xc/programs/Xserver/hw/xfree86/XFree86.man,v 3.53 2001/08/06 18:31:01 dawes Exp $ +.\" $XFree86: xc/programs/Xserver/hw/xfree86/XFree86.man,v 3.54 2002/01/17 17:10:37 dawes Exp $ .TH XFree86 1 __vendorversion__ .SH NAME XFree86 - X11R6 X server @@ -335,7 +335,7 @@ value isn't supplied, each occurrance of this option increments the verbosity level. When the .I n value is supplied, the verbosity level is set to that value. The default -verbosity level is 1. +verbosity level is 0. .TP 8 .B \-version Print out the server version, patchlevel, release date, the operating diff --git a/xc/programs/Xserver/hw/xfree86/common/compiler.h b/xc/programs/Xserver/hw/xfree86/common/compiler.h index b84432d5e..f1f81ccf5 100644 --- a/xc/programs/Xserver/hw/xfree86/common/compiler.h +++ b/xc/programs/Xserver/hw/xfree86/common/compiler.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/compiler.h,v 3.85 2001/08/06 20:51:09 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/compiler.h,v 3.88 2002/01/07 20:38:27 dawes Exp $ */ /* * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany. * @@ -31,6 +31,26 @@ #define _COMPILER_H +/* Allow drivers to use the GCC-supported __inline__ and/or __inline. */ +#ifndef __inline__ +# if defined(__GNUC__) + /* gcc has __inline__ */ +# elif defined(__HIGHC__) +# define __inline__ _Inline +# else +# define __inline__ /**/ +# endif +#endif /* __inline__ */ +#ifndef __inline +# if defined(__GNUC__) + /* gcc has __inline */ +# elif defined(__HIGHC__) +# define __inline _Inline +# else +# define __inline /**/ +# endif +#endif /* __inline */ + #if defined(IODEBUG) && defined(__GNUC__) #define outb RealOutb #define outw RealOutw @@ -840,6 +860,67 @@ static __inline__ unsigned long ldw_u(unsigned short * r11) return r1; } +#ifdef linux /* don't mess with other OSs */ + +/* + * EGCS 1.1 knows about arbitrary unaligned loads (and we don't support older + * versions anyway. Define some packed structures to talk about such things + * with. + */ + +struct __una_u32 { unsigned int x __attribute__((packed)); }; +struct __una_u16 { unsigned short x __attribute__((packed)); }; + +static __inline__ void stw_u(unsigned long val, unsigned short *p) +{ + struct __una_u16 *ptr = (struct __una_u16 *) p; + ptr->x = val; +} + +static __inline__ void stl_u(unsigned long val, unsigned int *p) +{ + struct __una_u32 *ptr = (struct __una_u32 *) p; + ptr->x = val; +} + +#if X_BYTE_ORDER == X_BIG_ENDIAN +static __inline__ unsigned int +xf86ReadMmio32Be(__volatile__ void *base, const unsigned long offset) +{ + unsigned long addr = ((unsigned long)base) + offset; + unsigned int ret; + + __asm__ __volatile__("lw %0, 0(%1)" + : "=r" (ret) + : "r" (addr)); + return ret; +} + +static __inline__ void +xf86WriteMmio32Be(__volatile__ void *base, const unsigned long offset, + const unsigned int val) +{ + unsigned long addr = ((unsigned long)base) + offset; + + __asm__ __volatile__("sw %0, 0(%1)" + : /* No outputs */ + : "r" (val), "r" (addr)); +} +#endif + +#define mem_barrier() \ +__asm__ __volatile__( \ + "# prevent instructions being moved around\n\t" \ + ".set\tnoreorder\n\t" \ + "# 8 nops to fool the R4400 pipeline\n\t" \ + "nop;nop;nop;nop;nop;nop;nop;nop\n\t" \ + ".set\treorder" \ + : /* no output */ \ + : /* no input */ \ + : "memory") +#define write_mem_barrier() mem_barrier() + +#else /* !linux */ #define stq_u(v,p) stl_u(v,p) #define stl_u(v,p) (*(unsigned char *)(p)) = (v); \ (*(unsigned char *)(p)+1) = ((v) >> 8); \ @@ -850,6 +931,7 @@ static __inline__ unsigned long ldw_u(unsigned short * r11) (*(unsigned char *)(p)+1) = ((v) >> 8) #define mem_barrier() /* NOP */ +#endif /* !linux */ #endif /* __mips__ */ #if defined(__arm32__) @@ -1101,7 +1183,7 @@ inl(unsigned short port) #define mem_barrier() /* NOP */ #define write_mem_barrier() /* NOP */ -#if !defined(FAKEIT) && !defined(__mc68000__) && !defined(__sh__) +#if !defined(FAKEIT) && !defined(__mc68000__) && !defined(__arm__) && !defined(__sh__) && !defined(__hppa__) #ifdef GCCUSESGAS /* @@ -1210,7 +1292,7 @@ inl(unsigned short port) #endif /* GCCUSESGAS */ -#else /* !defined(FAKEIT) && !defined(__mc68000__) && !defined(__sh__) */ +#else /* !defined(FAKEIT) && !defined(__mc68000__) && !defined(__arm__) && !defined(__sh__) && !defined(__hppa__) */ static __inline__ void outb(unsigned short port, unsigned char val) @@ -1392,17 +1474,6 @@ extern unsigned inl(unsigned port); extern void outb(unsigned port, unsigned val); extern void outw(unsigned port, unsigned val); extern void outl(unsigned port, unsigned val); -#define ldq_u(p) (*((unsigned long *)(p))) -#define ldl_u(p) (*((unsigned int *)(p))) -#define ldw_u(p) (*((unsigned short *)(p))) -#undef stq_u -#define stq_u(v,p) ((unsigned long *)(p)) = (v) -#undef stl_u -#define stl_u(v,p) ((unsigned int *)(p)) = (v) -#undef stw_u -#define stw_u(v,p) ((unsigned short *)(p)) = (v) -#define mem_barrier() /* NOP */ -#define write_mem_barrier() /* NOP */ #endif /* QNX4 */ #if defined(IODEBUG) && defined(__GNUC__) @@ -1435,14 +1506,6 @@ extern void outl(unsigned port, unsigned val); *----------------------------------------------------------------------- */ -#ifndef __GNUC__ -#ifdef __HIGHC__ -#define __inline__ _Inline -#else -#define __inline__ /**/ -#endif -#endif - /* * rdinx - read the indexed byte port 'port', index 'ind', and return its value */ diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86.h b/xc/programs/Xserver/hw/xfree86/common/xf86.h index c1ac384c0..2d1816eae 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86.h +++ b/xc/programs/Xserver/hw/xfree86/common/xf86.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86.h,v 3.154 2001/06/13 23:10:39 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86.h,v 3.157 2001/12/13 18:01:50 eich Exp $ */ /* * Copyright (c) 1997 by The XFree86 Project, Inc. @@ -60,9 +60,12 @@ extern confDRIRec xf86ConfigDRI; (((p) == Pix24Use32) ? 32 : 0)) /* variables for debugging */ +#ifdef BUILDDEBUG +extern char* xf86p8bit[]; extern CARD32 xf86DummyVar1; extern CARD32 xf86DummyVar2; extern CARD32 xf86DummyVar3; +#endif /* Function Prototypes */ #ifndef _NO_XF86_PROTOTYPES @@ -110,21 +113,21 @@ pciVideoPtr xf86GetPciInfoForEntity(int entityIndex); int xf86GetPciEntity(int bus, int dev, int func); Bool xf86SetEntityFuncs(int entityIndex, EntityProc init, EntityProc enter, EntityProc leave, pointer); -void xf86DeallocateResourcesForEntity(int entityIndex, long type); +void xf86DeallocateResourcesForEntity(int entityIndex, unsigned long type); resPtr xf86RegisterResources(int entityIndex, resList list, int Access); Bool xf86CheckPciMemBase(pciVideoPtr pPci, memType base); void xf86SetAccessFuncs(EntityInfoPtr pEnt, xf86SetAccessFuncPtr funcs, xf86SetAccessFuncPtr oldFuncs); Bool xf86IsEntityPrimary(int entityIndex); Bool xf86FixPciResource(int entityIndex, int prt, memType alignment, - long type); + unsigned long type); resPtr xf86ReallocatePciResources(int entityIndex, resPtr pRes); resPtr xf86SetOperatingState(resList list, int entityIndex, int mask); void xf86EnterServerState(xf86State state); -resRange xf86GetBlock(long type, memType size, +resRange xf86GetBlock(unsigned long type, memType size, memType window_start, memType window_end, memType align_mask, resPtr avoid); -resRange xf86GetSparse(long type, memType fixed_bits, +resRange xf86GetSparse(unsigned long type, memType fixed_bits, memType decode_mask, memType address_mask, resPtr avoid); memType xf86ChkConflict(resRange *rgp, int entityIndex); diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86Config.c b/xc/programs/Xserver/hw/xfree86/common/xf86Config.c index e0bd73c6c..38d88a7bf 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.247 2001/08/19 02:47:50 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Config.c,v 3.254 2002/01/15 01:56:55 dawes Exp $ */ /* @@ -701,7 +701,8 @@ typedef enum { FLAG_NOPM, FLAG_XINERAMA, FLAG_ALLOW_DEACTIVATE_GRABS, - FLAG_ALLOW_CLOSEDOWN_GRABS + FLAG_ALLOW_CLOSEDOWN_GRABS, + FLAG_SYNCLOG } FlagValues; static OptionInfoRec FlagOptions[] = { @@ -757,10 +758,13 @@ static OptionInfoRec FlagOptions[] = { {0}, FALSE }, { FLAG_ALLOW_CLOSEDOWN_GRABS, "AllowClosedownGrabs", OPTV_BOOLEAN, {0}, FALSE }, + { FLAG_SYNCLOG, "SyncLog", OPTV_BOOLEAN, + {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE }, }; +#if defined(i386) || defined(__i386__) static Bool detectPC98(void) { @@ -777,6 +781,7 @@ detectPC98(void) return FALSE; #endif } +#endif /* __i386__ */ static Bool configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) @@ -857,15 +862,15 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) xf86Info.pciFlags = PCIForceConfig2; if (xf86IsOptionSet(FlagOptions, FLAG_PCIOSCONFIG)) xf86Info.pciFlags = PCIOsConfig; - /* - * XXX This should be handled like a proper boolean option -- see further - * above for examples. - */ - if (xf86IsOptionSet(FlagOptions, FLAG_NOPM)) - xf86Info.pmFlag = FALSE; - else - xf86Info.pmFlag = TRUE; - + + xf86Info.pmFlag = TRUE; + if (xf86GetOptValBool(FlagOptions, FLAG_NOPM, &value)) + xf86Info.pmFlag = !value; + if (xf86GetOptValBool(FlagOptions, FLAG_SYNCLOG, &value)) { + xf86Msg(X_CONFIG, "SyncLog %s\n",value?"enabled":"disabled"); + xf86Info.syncLog = value; + } + i = -1; xf86GetOptValInteger(FlagOptions, FLAG_ESTIMATE_SIZES_AGGRESSIVELY, &i); if (i >= 0) @@ -997,11 +1002,7 @@ configInputKbd(IDevPtr inputp) s = xf86SetStrOption(inputp->commonOptions, "Protocol", "standard"); if (xf86NameCmp(s, "standard") == 0) { xf86Info.kbdProc = xf86KbdProc; -#if defined(__CYGWIN__) - xf86Info.kbdEvents = NULL; -#else xf86Info.kbdEvents = xf86KbdEvents; -#endif xfree(s); } else if (xf86NameCmp(s, "xqueue") == 0) { #ifdef XQUEUE @@ -1012,10 +1013,8 @@ configInputKbd(IDevPtr inputp) xfree(s); #ifdef WSCONS_SUPPORT } else if (xf86NameCmp(s, "wskbd") == 0) { - int xf86WSKbdProc(DeviceIntPtr, int); - - xf86Info.kbdProc = xf86WSKbdProc; - xf86Info.kbdEvents = xf86KbdEvents; + xf86Info.kbdProc = xf86KbdProc; + xf86Info.kbdEvents = xf86WSKbdEvents; xfree(s); s = xf86SetStrOption(inputp->commonOptions, "Device", NULL); xf86Msg(X_CONFIG, "Keyboard: Protocol: wskbd\n"); @@ -1031,6 +1030,33 @@ configInputKbd(IDevPtr inputp) return FALSE; } xfree(s); + /* Find out keyboard type */ + if (ioctl(xf86Info.kbdFd, WSKBDIO_GTYPE, &xf86Info.wsKbdType) == -1) { + xf86ConfigError("cannot get keyboard type"); + close(xf86Info.kbdFd); + return FALSE; + } + switch (xf86Info.wsKbdType) { + case WSKBD_TYPE_PC_XT: + xf86Msg(X_PROBED, "Keyboard type: XT\n"); + break; + case WSKBD_TYPE_PC_AT: + xf86Msg(X_PROBED, "Keyboard type: AT\n"); + break; + case WSKBD_TYPE_USB: + xf86Msg(X_PROBED, "Keyboard type: USB\n"); + break; +#ifdef WSKBD_TYPE_ADB + case WSKBD_TYPE_ADB: + xf86Msg(X_PROBED, "Keyboard type: ADB\n"); + break; +#endif + default: + xf86ConfigError("Unsupported wskbd type \"%d\"", + xf86Info.wsKbdType); + close(xf86Info.kbdFd); + return FALSE; + } #endif } else { xf86ConfigError("\"%s\" is not a valid keyboard protocol name", s); @@ -2035,7 +2061,8 @@ modeIsPresent(char * modename,MonPtr monitorp) /* all I can think of is a linear search... */ while(knownmodes != NULL) { - if(strcmp(modename,knownmodes->name) == 0) + if(!strcmp(modename,knownmodes->name) && + !(knownmodes->type & M_T_DEFAULT)) return TRUE; knownmodes = knownmodes->next; } @@ -2116,18 +2143,6 @@ xf86HandleConfigFile(void) /* Initialise a few things. */ - /* Show what the marker symbols mean */ - xf86ErrorF("Markers: " X_PROBE_STRING " probed, " - X_CONFIG_STRING " from config file, " - X_DEFAULT_STRING " default setting,\n" - " " X_CMDLINE_STRING " from command line, " - X_NOTICE_STRING " notice, " - X_INFO_STRING " informational,\n" - " " X_WARNING_STRING " warning, " - X_ERROR_STRING " error, " - X_NOT_IMPLEMENTED_STRING " not implemented, " - X_UNKNOWN_STRING " unknown.\n"); - /* * now we convert part of the information contained in the parser * structures into our own structures. diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86Configure.c b/xc/programs/Xserver/hw/xfree86/common/xf86Configure.c index 52168a7ee..27df4019a 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86Configure.c +++ b/xc/programs/Xserver/hw/xfree86/common/xf86Configure.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Configure.c,v 3.62 2001/08/18 12:31:54 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Configure.c,v 3.68 2002/01/07 21:39:18 dawes Exp $ */ /* * Copyright 2000 by Alan Hourihane, Sychdyn, North Wales. * @@ -68,17 +68,21 @@ xf86MonPtr ConfiguredMonitor; Bool xf86DoConfigurePass1 = TRUE; Bool foundMouse = FALSE; -#ifndef __EMX__ -#if defined(SCO) +#if defined(__EMX__) +#define DFLT_MOUSE_DEV "mouse$" +#define DFLT_MOUSE_PROTO "OS2Mouse" +#elif defined(SCO) static char *DFLT_MOUSE_PROTO = "OSMouse"; +#elif defined(QNX4) +static char *DFLT_MOUSE_PROTO = "OSMouse"; +static char *DFLT_MOUSE_DEV = "/dev/mouse"; +#elif defined(__QNXNTO__) +static char *DFLT_MOUSE_PROTO = "OSMouse"; +static char *DFLT_MOUSE_DEV = "/dev/devi/mouse0"; #else static char *DFLT_MOUSE_DEV = "/dev/mouse"; static char *DFLT_MOUSE_PROTO = "auto"; #endif -#else -#define DFLT_MOUSE_DEV "mouse$" -#define DFLT_MOUSE_PROTO "OS2Mouse" -#endif static void GetPciCard(int vendor, int chipType, int *vendor1, int *vendor2, int *card) @@ -652,10 +656,11 @@ configureModuleSection (void) /* Add only those font backends which are referenced by fontpath */ /* 'strstr(dFP,"/dir")' is meant as 'dFP =~ m(/dir\W)' */ - if (defaultFontPath && ( - strcmp(*el, "type1") == 0 && strstr(defaultFontPath, "/Type1") || - strcmp(*el, "speedo") == 0 && strstr(defaultFontPath, "/Speedo") - )) + if (defaultFontPath && ( + (strcmp(*el, "type1") == 0 && + strstr(defaultFontPath, "/Type1")) || + (strcmp(*el, "speedo") == 0 && + strstr(defaultFontPath, "/Speedo")))) ptr->mod_load_lst = (XF86LoadPtr)xf86addListItem( (glp)ptr->mod_load_lst, (glp)module); } @@ -700,6 +705,11 @@ static XF86ConfMonitorPtr configureDDCMonitorSection (int screennum) { int i = 0; + int len, mon_width, mon_height; +#define displaySizeMaxLen 80 + char displaySize_string[displaySizeMaxLen]; + int displaySizeLen; + parsePrologue (XF86ConfMonitorPtr, XF86ConfMonitorRec) ptr->mon_identifier = xf86confmalloc(19); @@ -708,6 +718,35 @@ configureDDCMonitorSection (int screennum) ptr->mon_modelname = xf86confmalloc(12); sprintf(ptr->mon_modelname, "%x", ConfiguredMonitor->vendor.prod_id); + /* features in centimetres, we want millimetres */ + mon_width = 10 * ConfiguredMonitor->features.hsize ; + mon_height = 10 * ConfiguredMonitor->features.vsize ; + +#ifdef CONFIGURE_DISPLAYSIZE + ptr->mon_width = mon_width; + ptr->mon_height = mon_height; +#else + if (mon_width && mon_height) { + /* when values available add DisplaySize option AS A COMMENT */ + + displaySizeLen = snprintf(displaySize_string, displaySizeMaxLen, + "\t#DisplaySize\t%5d %5d\t# mm\n", + mon_width, mon_height); + + if (displaySizeLen>0 && displaySizeLen<displaySizeMaxLen) { + if (ptr->mon_comment) { + len = strlen(ptr->mon_comment); + } else { + len = 0; + } + if ((ptr->mon_comment = + xrealloc(ptr->mon_comment, len+strlen(displaySize_string)))) { + strcpy(ptr->mon_comment + len, displaySize_string); + } + } + } +#endif /* def CONFIGURE_DISPLAYSIZE */ + for (i=0;i<4;i++) { switch (ConfiguredMonitor->det_mon[i].type) { case DT: @@ -721,22 +760,16 @@ configureDDCMonitorSection (int screennum) break; case DS_ASCII_STR: case DS_SERIAL: - break; case DS_RANGES: - ptr->mon_n_hsync = 1; - ptr->mon_hsync[0].lo = - ConfiguredMonitor->det_mon[i].section.ranges.min_h; - ptr->mon_hsync[0].hi = - ConfiguredMonitor->det_mon[i].section.ranges.max_h; - ptr->mon_n_vrefresh = 1; - ptr->mon_vrefresh[0].lo = - ConfiguredMonitor->det_mon[i].section.ranges.min_v; - ptr->mon_vrefresh[0].hi = - ConfiguredMonitor->det_mon[i].section.ranges.max_v; + default: break; } } + if (ConfiguredMonitor->features.dpms) { + ptr->mon_option_lst = xf86addNewOption(ptr->mon_option_lst, "DPMS", NULL); + } + return ptr; } @@ -844,7 +877,12 @@ DoConfigure() if (home[0] == '/' && home[1] == '\0') home[0] = '\0'; - sprintf(filename, "%s/%s", home,configfile); +#ifndef QNX4 + sprintf(filename, "%s/%s", home,configfile); +#else + sprintf(filename, "//%d%s/%s", getnid(),home,configfile); +#endif + } xf86writeConfigFile(filename, xf86config); diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86Debug.c b/xc/programs/Xserver/hw/xfree86/common/xf86Debug.c index eb8d4456d..b069743a1 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86Debug.c +++ b/xc/programs/Xserver/hw/xfree86/common/xf86Debug.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Debug.c,v 1.3 2000/09/26 15:57:08 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Debug.c,v 1.4 2001/12/13 18:01:50 eich Exp $ */ #include <sys/time.h> #include <unistd.h> @@ -21,6 +21,72 @@ void xf86Break3(void) { } +char *xf86p8bit[] = { "00000000", "00000001", "00000010", "00000011", + "00000100", "00000101", "00000110", "00000111", + "00001000", "00001001", "00001010", "00001011", + "00001100", "00001101", "00001110", "00001111", + "00010000", "00010001", "00010010", "00010011", + "00010100", "00010101", "00010110", "00010111", + "00011000", "00011001", "00011010", "00011011", + "00011100", "00011101", "00011110", "00011111", + "00100000", "00100001", "00100010", "00100011", + "00100100", "00100101", "00100110", "00100111", + "00101000", "00101001", "00101010", "00101011", + "00101100", "00101101", "00101110", "00101111", + "00110000", "00110001", "00110010", "00110011", + "00110100", "00110101", "00110110", "00110111", + "00111000", "00111001", "00111010", "00111011", + "00111100", "00111101", "00111110", "00111111", + "01000000", "01000001", "01000010", "01000011", + "01000100", "01000101", "01000110", "01000111", + "01001000", "01001001", "01001010", "01001011", + "01001100", "01001101", "01001110", "01001111", + "01010000", "01010001", "01010010", "01010011", + "01010100", "01010101", "01010110", "01010111", + "01011000", "01011001", "01011010", "01011011", + "01011100", "01011101", "01011110", "01011111", + "01100000", "01100001", "01100010", "01100011", + "01100100", "01100101", "01100110", "01100111", + "01101000", "01101001", "01101010", "01101011", + "01101100", "01101101", "01101110", "01101111", + "01110000", "01110001", "01110010", "01110011", + "01110100", "01110101", "01110110", "01110111", + "01111000", "01111001", "01111010", "01111011", + "01111100", "01111101", "01111110", "01111111", + "10000000", "10000001", "10000010", "10000011", + "10000100", "10000101", "10000110", "10000111", + "10001000", "10001001", "10001010", "10001011", + "10001100", "10001101", "10001110", "10001111", + "10010000", "10010001", "10010010", "10010011", + "10010100", "10010101", "10010110", "10010111", + "10011000", "10011001", "10011010", "10011011", + "10011100", "10011101", "10011110", "10011111", + "10100000", "10100001", "10100010", "10100011", + "10100100", "10100101", "10100110", "10100111", + "10101000", "10101001", "10101010", "10101011", + "10101100", "10101101", "10101110", "10101111", + "10110000", "10110001", "10110010", "10110011", + "10110100", "10110101", "10110110", "10110111", + "10111000", "10111001", "10111010", "10111011", + "10111100", "10111101", "10111110", "10111111", + "11000000", "11000001", "11000010", "11000011", + "11000100", "11000101", "11000110", "11000111", + "11001000", "11001001", "11001010", "11001011", + "11001100", "11001101", "11001110", "11001111", + "11010000", "11010001", "11010010", "11010011", + "11010100", "11010101", "11010110", "11010111", + "11011000", "11011001", "11011010", "11011011", + "11011100", "11011101", "11011110", "11011111", + "11100000", "11100001", "11100010", "11100011", + "11100100", "11100101", "11100110", "11100111", + "11101000", "11101001", "11101010", "11101011", + "11101100", "11101101", "11101110", "11101111", + "11110000", "11110001", "11110010", "11110011", + "11110100", "11110101", "11110110", "11110111", + "11111000", "11111001", "11111010", "11111011", + "11111100", "11111101", "11111110", "11111111" +}; + CARD32 xf86DummyVar1; CARD32 xf86DummyVar2; CARD32 xf86DummyVar3; diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86DoProbe.c b/xc/programs/Xserver/hw/xfree86/common/xf86DoProbe.c index c87684639..40a4f826a 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86DoProbe.c +++ b/xc/programs/Xserver/hw/xfree86/common/xf86DoProbe.c @@ -1,5 +1,5 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86DoProbe.c,v 1.9 2000/03/01 16:00:51 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86DoProbe.c,v 1.10 2001/10/28 03:33:18 tsi Exp $ */ /* * finish setting up the server * Load the driver modules and call their probe functions. @@ -55,6 +55,8 @@ DoProbe() for (i = 0; i < xf86NumDrivers; i++) { if (xf86DriverList[i]->Probe == NULL) continue; + xf86MsgVerb(X_INFO, 3, "Probing in driver %s\n", + xf86DriverList[i]->driverName); probeResult = (*xf86DriverList[i]->Probe)(xf86DriverList[i], PROBE_DETECT); ErrorF("Probe in driver `%s' returns %s\n", diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86Events.c b/xc/programs/Xserver/hw/xfree86/common/xf86Events.c index 4a7e2ba8e..d2c11ba88 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86Events.c +++ b/xc/programs/Xserver/hw/xfree86/common/xf86Events.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Events.c,v 3.116 2001/08/17 22:08:12 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Events.c,v 3.124 2001/11/30 12:11:54 eich Exp $ */ /* * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany. * @@ -31,11 +31,11 @@ #include "compiler.h" -#include "Xpoll.h" #include "xf86.h" #include "xf86Priv.h" #define XF86_OS_PRIVS #include "xf86_OSlib.h" +#include "Xpoll.h" #include "atKeynames.h" @@ -268,8 +268,7 @@ extern u_char SpecialServerMap[]; #if !defined(__EMX__) && \ !defined(__SOL8__) && \ - (!defined(sun) || defined(i386)) && \ - !defined(__CYGWIN__) + (!defined(sun) || defined(i386)) void xf86PostKbdEvent(unsigned key) { @@ -284,14 +283,14 @@ xf86PostKbdEvent(unsigned key) KeySym *keysym; int keycode; static int lockkeys = 0; -#if defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) +#if defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT) static Bool first_time = TRUE; #endif #if defined(__sparc__) static int kbdSun = -1; #endif -#if defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) +#if defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT) if (first_time) { first_time = FALSE; @@ -346,13 +345,13 @@ xf86PostKbdEvent(unsigned key) switch (scanCode) { case KEY_Prefix0: case KEY_Prefix1: -#if defined(PCCONS_SUPPORT) || defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) +#if defined(PCCONS_SUPPORT) || defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT) if (xf86Info.consType == PCCONS || xf86Info.consType == SYSCONS || xf86Info.consType == PCVT) { #endif xf86Info.scanPrefix = scanCode; /* special prefixes */ return; -#if defined(PCCONS_SUPPORT) || defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) +#if defined(PCCONS_SUPPORT) || defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT) } break; #endif @@ -434,6 +433,7 @@ xf86PostKbdEvent(unsigned key) #ifdef __linux__ customkeycodes: #endif +#if defined(i386) || defined(__i386__) if (xf86IsPc98()) { switch (scanCode) { case 0x0e: specialkey = 0x0e; break; /* KEY_BackSpace */ @@ -457,7 +457,7 @@ customkeycodes: default: specialkey = 0x00; break; } } - +#endif #if defined (__sparc__) special: if (kbdSun) { @@ -534,9 +534,9 @@ special: if (keyboard == pointer) keyboard = NULL; } - if (xf86Info.grabInfo.server.grabstate == SERVER_GRABBED && - (server = xf86Info.grabInfo.server.client) == pointer || - server == keyboard) + if ((xf86Info.grabInfo.server.grabstate == SERVER_GRABBED) && + (((server = xf86Info.grabInfo.server.client) == pointer) || + (server == keyboard))) server = NULL; if (pointer) @@ -589,7 +589,7 @@ special: break; #endif -#if defined(linux) || (defined(CSRG_BASED) && (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT))) || defined(SCO) +#if defined(linux) || (defined(CSRG_BASED) && (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT))) || defined(SCO) /* * Under Linux, the raw keycodes are consumed before the kernel * does any processing on them, so we must emulate the vt switching @@ -606,7 +606,7 @@ special: case KEY_F9: case KEY_F10: if (VTSwitchEnabled && !xf86Info.vtSysreq -#if (defined(CSRG_BASED) && (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT))) +#if (defined(CSRG_BASED) && (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT))) && (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT) #endif ) @@ -623,7 +623,7 @@ special: case KEY_F11: case KEY_F12: if (VTSwitchEnabled && !xf86Info.vtSysreq -#if (defined(CSRG_BASED) && (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT))) +#if (defined(CSRG_BASED) && (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT))) && (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT) #endif ) @@ -876,7 +876,6 @@ special: if (scanCode < KEY_KP_7 || scanCode > KEY_KP_Decimal) { #if !defined(CSRG_BASED) && \ !defined(__GNU__) && \ - !defined(__CYGWIN__) && \ defined(KB_84) /* * magic ALT_L key on AT84 keyboards for multilingual support @@ -942,7 +941,7 @@ special: void xf86Wakeup(pointer blockData, int err, pointer pReadmask) { -#if !defined(__EMX__) && !defined(__QNX__) && !defined(__CYGWIN__) +#if !defined(__EMX__) && !defined(__QNX__) fd_set* LastSelectMask = (fd_set*)pReadmask; fd_set devicesWithInput; InputInfoPtr pInfo; @@ -1121,11 +1120,12 @@ xf86VTSwitch() if (xf86Screens[i]->EnableDisableFBAccess) (*xf86Screens[i]->EnableDisableFBAccess) (i, FALSE); } - xf86EnterServerState(SETUP); - for (i = 0; i < xf86NumScreens; i++) { - xf86Screens[i]->LeaveVT(i, 0); - } -#if !defined(__EMX__) && !defined(__CYGWIN__) +#if !defined(__EMX__) + + /* + * Keep the order: Disable Device > LeaveVT + * EnterVT > EnableDevice + */ DisableDevice((DeviceIntPtr)xf86Info.pKeyboard); pInfo = xf86InputDevs; while (pInfo) { @@ -1133,6 +1133,10 @@ xf86VTSwitch() pInfo = pInfo->next; } #endif /* !__EMX__ */ + xf86EnterServerState(SETUP); + for (i = 0; i < xf86NumScreens; i++) { + xf86Screens[i]->LeaveVT(i, 0); + } for (ih = InputHandlers; ih; ih = ih->next) xf86DisableInputHandler(ih); xf86AccessLeave(); /* We need this here, otherwise */ @@ -1161,7 +1165,7 @@ xf86VTSwitch() } SaveScreens(SCREEN_SAVER_FORCER, ScreenSaverReset); -#if !defined(__EMX__) && !defined(__CYGWIN__) +#if !defined(__EMX__) EnableDevice((DeviceIntPtr)xf86Info.pKeyboard); pInfo = xf86InputDevs; while (pInfo) { @@ -1212,7 +1216,7 @@ xf86VTSwitch() /* Turn screen saver off when switching back */ SaveScreens(SCREEN_SAVER_FORCER,ScreenSaverReset); -#if !defined(__EMX__) && !defined(__CYGWIN__) +#if !defined(__EMX__) EnableDevice((DeviceIntPtr)xf86Info.pKeyboard); pInfo = xf86InputDevs; while (pInfo) { @@ -1220,6 +1224,7 @@ xf86VTSwitch() pInfo = pInfo->next; } #endif /* !__EMX__ */ + for (ih = InputHandlers; ih; ih = ih->next) xf86EnableInputHandler(ih); } @@ -1377,34 +1382,23 @@ XTestGenerateEvent(int dev_type, int keycode, int keystate, int mousex, /* XXX Currently XKB is mandatory. */ +extern int WSKbdToKeycode(int); + void xf86PostWSKbdEvent(struct wscons_event *event) { - int type = event->type; - int value = event->value; - Bool down = (type == WSCONS_EVENT_KEY_DOWN ? TRUE : FALSE); - KeyClassRec *keyc = ((DeviceIntPtr)xf86Info.pKeyboard)->key; - xEvent kevent; - KeySym *keysym; - int keycode; - - /* - * Now map the scancodes to real X-keycodes ... - */ - keycode = value + MIN_KEYCODE; - keysym = keyc->curKeySyms.map + - keyc->curKeySyms.mapWidth * (keycode - keyc->curKeySyms.minKeyCode); - - /* - * check for an autorepeat-event - */ - if ((down && KeyPressed(keycode)) && - (xf86Info.autoRepeat != AutoRepeatModeOn || keyc->modifierMap[keycode])) - return; - - xf86Info.lastEventTime = kevent.u.keyButtonPointer.time - = event->time.tv_sec * 1000 + event->time.tv_nsec / 1000000; - - ENQUEUE(&kevent, keycode, (down ? KeyPress : KeyRelease), XE_KEYBOARD); + int type = event->type; + int value = event->value; + Bool down = (type == WSCONS_EVENT_KEY_DOWN ? TRUE : FALSE); + unsigned int keycode; + int blocked; + + /* map the scancodes to standard XFree86 scancode */ + keycode = WSKbdToKeycode(value); + if (!down) keycode |= 0x80; + /* It seems better to block SIGIO there */ + blocked = xf86BlockSIGIO(); + xf86PostKbdEvent(keycode); + xf86UnblockSIGIO(blocked); } #endif /* WSCONS_SUPPORT */ diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h b/xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h index 9f995ad19..8532aac32 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.104 2001/08/18 17:25:50 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h,v 1.119 2002/01/16 02:00:43 martin Exp $ */ /* * PCI Probe * @@ -202,6 +202,7 @@ /* ATI */ #define PCI_CHIP_MACH32 0x4158 +#define PCI_CHIP_R200_BB 0x4242 #define PCI_CHIP_MACH64CT 0x4354 #define PCI_CHIP_MACH64CX 0x4358 #define PCI_CHIP_MACH64ET 0x4554 @@ -221,6 +222,7 @@ #define PCI_CHIP_MACH64GV 0x4756 #define PCI_CHIP_MACH64GW 0x4757 #define PCI_CHIP_MACH64GX 0x4758 +#define PCI_CHIP_MACH64GY 0x4759 #define PCI_CHIP_MACH64GZ 0x475A #define PCI_CHIP_MACH64LB 0x4C42 #define PCI_CHIP_MACH64LD 0x4C44 @@ -231,6 +233,7 @@ #define PCI_CHIP_MACH64LM 0x4C4D #define PCI_CHIP_MACH64LN 0x4C4E #define PCI_CHIP_MACH64LP 0x4C50 +#define PCI_CHIP_MACH64LQ 0x4C51 #define PCI_CHIP_MACH64LR 0x4C52 #define PCI_CHIP_MACH64LS 0x4C53 #define PCI_CHIP_RADEON_LW 0x4C57 @@ -240,24 +243,28 @@ #define PCI_CHIP_RAGE128ML 0x4D4C #define PCI_CHIP_RAGE128PD 0x5044 #define PCI_CHIP_RAGE128PF 0x5046 +#define PCI_CHIP_RAGE128PP 0x5050 #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_R200_QL 0x514C +#define PCI_CHIP_R200_QN 0x514E +#define PCI_CHIP_R200_QO 0x514F +#define PCI_CHIP_RV200_QW 0x5157 #define PCI_CHIP_RADEON_QY 0x5159 #define PCI_CHIP_RADEON_QZ 0x515A +#define PCI_CHIP_R200_Ql 0x516C #define PCI_CHIP_RAGE128RE 0x5245 #define PCI_CHIP_RAGE128RF 0x5246 #define PCI_CHIP_RAGE128RG 0x5247 #define PCI_CHIP_RAGE128RK 0x524B #define PCI_CHIP_RAGE128RL 0x524C -#define PCI_CHIP_RAGE128SM 0x534D #define PCI_CHIP_RAGE128TF 0x5446 #define PCI_CHIP_RAGE128TL 0x544C #define PCI_CHIP_RAGE128TR 0x5452 - - +#define PCI_CHIP_RAGE128SM 0x534D #define PCI_CHIP_MACH64VT 0x5654 #define PCI_CHIP_MACH64VU 0x5655 #define PCI_CHIP_MACH64VV 0x5656 @@ -343,6 +350,8 @@ #define PCI_CHIP_8520 0x8520 #define PCI_CHIP_8600 0x8600 #define PCI_CHIP_8620 0x8620 +#define PCI_CHIP_8800 0x8800 +#define PCI_CHIP_8820 0x8820 #define PCI_CHIP_9320 0x9320 #define PCI_CHIP_9388 0x9388 #define PCI_CHIP_9397 0x9397 @@ -371,6 +380,7 @@ #define PCI_CHIP_MGAG200_PCI 0x0520 #define PCI_CHIP_MGAG200 0x0521 #define PCI_CHIP_MGAG400 0x0525 +#define PCI_CHIP_MGAG550 0x2527 #define PCI_CHIP_IMPRESSION 0x0D10 #define PCI_CHIP_MGAG100_PCI 0x1000 #define PCI_CHIP_MGAG100 0x1001 @@ -482,6 +492,15 @@ #define PCI_CHIP_I128_T2R 0x493D #define PCI_CHIP_I128_T2R4 0x5348 +/* Sun */ +#define PCI_CHIP_EBUS 0x1000 +#define PCI_CHIP_HAPPY_MEAL 0x1001 +#define PCI_CHIP_SIMBA 0x5000 +#define PCI_CHIP_PSYCHO 0x8000 +#define PCI_CHIP_SCHIZO 0x8001 +#define PCI_CHIP_SABRE 0xA000 +#define PCI_CHIP_HUMMINGBIRD 0xA001 + /* BrookTree */ #define PCI_CHIP_BT848 0x0350 #define PCI_CHIP_BT849 0x0351 @@ -494,8 +513,6 @@ #define PCI_CHIP_UTNT2 0x0029 #define PCI_CHIP_VTNT2 0x002C #define PCI_CHIP_UVTNT2 0x002D -#define PCI_CHIP_TNT2_A 0x002E -#define PCI_CHIP_TNT2_B 0x002F #define PCI_CHIP_ITNT2 0x00A0 #define PCI_CHIP_GEFORCE256 0x0100 #define PCI_CHIP_GEFORCEDDR 0x0101 @@ -508,11 +525,23 @@ #define PCI_CHIP_GEFORCE2GTS_1 0x0151 #define PCI_CHIP_GEFORCE2ULTRA 0x0152 #define PCI_CHIP_QUADRO2PRO 0x0153 +#define PCI_CHIP_0x0170 0x0170 +#define PCI_CHIP_0x0171 0x0171 +#define PCI_CHIP_0x0172 0x0172 +#define PCI_CHIP_0x0173 0x0173 +#define PCI_CHIP_0x0174 0x0174 +#define PCI_CHIP_0x0175 0x0175 +#define PCI_CHIP_0x0178 0x0178 +#define PCI_CHIP_0x017A 0x017A +#define PCI_CHIP_0x017B 0x017B +#define PCI_CHIP_0x017C 0x017C #define PCI_CHIP_IGEFORCE2 0x01A0 #define PCI_CHIP_GEFORCE3 0x0200 #define PCI_CHIP_GEFORCE3_1 0x0201 #define PCI_CHIP_GEFORCE3_2 0x0202 #define PCI_CHIP_QUADRO_DDC 0x0203 +#define PCI_CHIP_0x0250 0x0250 +#define PCI_CHIP_0x0258 0x0258 /* NVIDIA & SGS */ #define PCI_CHIP_RIVA128 0x0018 @@ -611,6 +640,8 @@ #define PCI_CHIP_NM2380 0x0016 /* Intel */ +#define PCI_CHIP_I830_M_BRIDGE 0x3575 +#define PCI_CHIP_I830_M 0x3577 #define PCI_CHIP_I815_BRIDGE 0x1130 #define PCI_CHIP_I815 0x1132 #define PCI_CHIP_I810_BRIDGE 0x7120 @@ -760,7 +791,7 @@ static SymTabRec xf86PCIVendorNameInfoData[] = { #endif /* Increase this as required */ -#define MAX_DEV_PER_VENDOR 64 +#define MAX_DEV_PER_VENDOR 80 typedef struct { unsigned short VendorID; @@ -808,6 +839,7 @@ static pciVendorDeviceInfo xf86PCIVendorInfoData[] = { #endif {PCI_VENDOR_ATI, { {PCI_CHIP_MACH32, "Mach32",0}, + {PCI_CHIP_R200_BB, "Radeon 8500 BB",0}, {PCI_CHIP_MACH64CT, "Mach64 CT",0}, {PCI_CHIP_MACH64CX, "Mach64 CX",0}, {PCI_CHIP_MACH64ET, "Mach64 ET",0}, @@ -827,6 +859,7 @@ static pciVendorDeviceInfo xf86PCIVendorInfoData[] = { {PCI_CHIP_MACH64GV, "Mach64 GV",0}, {PCI_CHIP_MACH64GW, "Mach64 GW",0}, {PCI_CHIP_MACH64GX, "Mach64 GX",0}, + {PCI_CHIP_MACH64GY, "Mach64 GY",0}, {PCI_CHIP_MACH64GZ, "Mach64 GZ",0}, {PCI_CHIP_MACH64LB, "Mach64 LB",0}, {PCI_CHIP_MACH64LD, "Mach64 LD",0}, @@ -837,12 +870,14 @@ static pciVendorDeviceInfo xf86PCIVendorInfoData[] = { {PCI_CHIP_MACH64LM, "Mach64 LM",0}, {PCI_CHIP_MACH64LN, "Mach64 LN",0}, {PCI_CHIP_MACH64LP, "Mach64 LP",0}, + {PCI_CHIP_MACH64LQ, "Mach64 LQ",0}, {PCI_CHIP_MACH64LR, "Mach64 LR",0}, {PCI_CHIP_MACH64LS, "Mach64 LS",0}, {PCI_CHIP_RAGE128MF, "Rage 128 Mobility MF",0}, {PCI_CHIP_RAGE128ML, "Rage 128 Mobility ML",0}, {PCI_CHIP_RAGE128PD, "Rage 128 Pro PD",0}, {PCI_CHIP_RAGE128PF, "Rage 128 Pro PF",0}, + {PCI_CHIP_RAGE128PP, "Rage 128 Pro PP",0}, {PCI_CHIP_RAGE128PR, "Rage 128 Pro PR",0}, {PCI_CHIP_RAGE128TF, "Rage 128 Pro TF",0}, {PCI_CHIP_RAGE128TL, "Rage 128 Pro TL",0}, @@ -851,8 +886,14 @@ static pciVendorDeviceInfo xf86PCIVendorInfoData[] = { {PCI_CHIP_RADEON_QE, "Radeon QE",0}, {PCI_CHIP_RADEON_QF, "Radeon QF",0}, {PCI_CHIP_RADEON_QG, "Radeon QG",0}, + {PCI_CHIP_R200_QL, "Radeon 8500 QL",0}, + {PCI_CHIP_R200_QN, "Radeon 8500 QN",0}, + {PCI_CHIP_R200_QO, "Radeon 8500 QO",0}, + {PCI_CHIP_RV200_QW, "Radeon 7500 QW",0}, {PCI_CHIP_RADEON_QY, "Radeon VE QY",0}, {PCI_CHIP_RADEON_QZ, "Radeon VE QZ",0}, + {PCI_CHIP_R200_Ql, "Radeon 8500 Ql",0}, + {PCI_CHIP_RADEON_LW, "Radeon Mobility M7 LW",0}, {PCI_CHIP_RADEON_LY, "Radeon Mobility M6 LY",0}, {PCI_CHIP_RADEON_LZ, "Radeon Mobility M6 LZ",0}, {PCI_CHIP_RAGE128SM, "Rage 128 SM",0}, @@ -972,6 +1013,8 @@ static pciVendorDeviceInfo xf86PCIVendorInfoData[] = { {PCI_CHIP_8520, "CyberBlade/DSTN/i1",0}, {PCI_CHIP_8600, "CyberBlade/Ai1",0}, {PCI_CHIP_8620, "CyberBlade/DSTN/Ai1",0}, + {PCI_CHIP_8800, "CyberBlade/XP/Ai1",0}, + {PCI_CHIP_8820, "CyberBlade/XP/DSTN/Ai1",0}, {0x0000, NULL,0}}}, #ifdef VENDOR_INCLUDE_NONVIDEO {PCI_VENDOR_ALI, { @@ -987,6 +1030,7 @@ static pciVendorDeviceInfo xf86PCIVendorInfoData[] = { {PCI_CHIP_MGAG200_PCI, "MGA G200 PCI",0}, {PCI_CHIP_MGAG200, "MGA G200 AGP",0}, {PCI_CHIP_MGAG400, "MGA G400 AGP",0}, + {PCI_CHIP_MGAG550, "MGA G550 AGP",0}, {PCI_CHIP_MGAG100_PCI, "MGA G100 PCI",0}, {PCI_CHIP_MGAG100, "MGA G100 AGP",0}, {0x0000, NULL,0}}}, @@ -1159,10 +1203,13 @@ static pciVendorDeviceInfo xf86PCIVendorInfoData[] = { {0x0021, "OC-6151",0 }, {0x0000, NULL,0}}}, {PCI_VENDOR_SUN, { - {0x1000, "EBUS",0 }, - {0x1001, "Happy Meal",0 }, - {0x5000, "Advanced PCI bridge",0 }, - {0x8000, "PCI Bus Module",0 }, + {PCI_CHIP_EBUS, "EBUS",0 }, + {PCI_CHIP_HAPPY_MEAL, "Happy Meal",0 }, + {PCI_CHIP_SIMBA, "Simba Advanced PCI bridge",0 }, + {PCI_CHIP_PSYCHO, "U2P PCI host bridge (Psycho)",0 }, + {PCI_CHIP_SCHIZO, "PCI host bridge (Schizo)",0 }, + {PCI_CHIP_SABRE, "UltraSPARC IIi host bridge (Sabre)",0 }, + {PCI_CHIP_HUMMINGBIRD, "UltraSPARC IIi host bridge (Hummingbird)",0 }, {0x0000, NULL,0}}}, {PCI_VENDOR_CMD, { {0x0640, "640A",0 }, @@ -1263,30 +1310,40 @@ static pciVendorDeviceInfo xf86PCIVendorInfoData[] = { {PCI_VENDOR_NVIDIA, { {PCI_CHIP_NV1, "NV1",0}, {PCI_CHIP_DAC64, "DAC64",0}, - {PCI_CHIP_TNT, "Riva TNT",0}, - {PCI_CHIP_TNT2, "Riva TNT2",0}, - {PCI_CHIP_UTNT2, "Riva Ultra TNT2",0}, - {PCI_CHIP_VTNT2, "Riva Vanta",0}, - {PCI_CHIP_UVTNT2, "Riva Ultra 64",0}, - {PCI_CHIP_TNT2_A, "Riva TNT2 (A)",0}, - {PCI_CHIP_TNT2_B, "Riva TNT2 (B)",0}, - {PCI_CHIP_ITNT2, "Riva Integrated",0}, + {PCI_CHIP_TNT, "RIVA TNT",0}, + {PCI_CHIP_TNT2, "RIVA TNT2/TNT2 Pro",0}, + {PCI_CHIP_UTNT2, "RIVA TNT2 Ultra",0}, + {PCI_CHIP_VTNT2, "Vanta",0}, + {PCI_CHIP_UVTNT2, "Riva TNT2 M64",0}, + {PCI_CHIP_ITNT2, "Aladdin TNT2",0}, {PCI_CHIP_GEFORCE256, "GeForce 256",0}, {PCI_CHIP_GEFORCEDDR, "GeForce DDR",0}, {PCI_CHIP_QUADRO, "Quadro",0}, - {PCI_CHIP_GEFORCE2MX, "GeForce2 MX",0}, - {PCI_CHIP_GEFORCE2MXDDR,"GeForce2 MX DDR",0}, + {PCI_CHIP_GEFORCE2MX, "GeForce2 MX/MX 400",0}, + {PCI_CHIP_GEFORCE2MXDDR,"GeForce2 MX 100/200",0}, {PCI_CHIP_GEFORCE2GO, "GeForce2 Go", 0}, - {PCI_CHIP_QUADRO2MXR, "GeForce2 MXR",0}, - {PCI_CHIP_GEFORCE2GTS, "GeForce2 GTS",0}, - {PCI_CHIP_GEFORCE2GTS_1,"GeForce2 GTS (rev 1)",0}, + {PCI_CHIP_QUADRO2MXR, "Quadro2 MXR",0}, + {PCI_CHIP_GEFORCE2GTS, "GeForce2 GTS/Pro",0}, + {PCI_CHIP_GEFORCE2GTS_1,"GeForce2 Ti",0}, {PCI_CHIP_GEFORCE2ULTRA,"GeForce2 Ultra",0}, - {PCI_CHIP_QUADRO2PRO, "Quadro 2 Pro",0}, + {PCI_CHIP_QUADRO2PRO, "Quadro2 Pro",0}, + {PCI_CHIP_0x0170, "0x0170",0}, + {PCI_CHIP_0x0171, "0x0171",0}, + {PCI_CHIP_0x0172, "0x0172",0}, + {PCI_CHIP_0x0173, "0x0173",0}, + {PCI_CHIP_0x0174, "0x0174",0}, + {PCI_CHIP_0x0175, "0x0175",0}, + {PCI_CHIP_0x0178, "0x0178",0}, + {PCI_CHIP_0x017A, "0x017A",0}, + {PCI_CHIP_0x017B, "0x017B",0}, + {PCI_CHIP_0x017C, "0x017C",0}, {PCI_CHIP_IGEFORCE2, "GeForce2 Integrated",0}, {PCI_CHIP_GEFORCE3, "GeForce3",0}, - {PCI_CHIP_GEFORCE3_1, "GeForce3 (rev 1)",0}, - {PCI_CHIP_GEFORCE3_2, "GeForce3 (rev 2)",0}, + {PCI_CHIP_GEFORCE3_1, "GeForce3 Ti 200",0}, + {PCI_CHIP_GEFORCE3_2, "GeForce3 Ti 500",0}, {PCI_CHIP_QUADRO_DDC, "Quadro DDC",0}, + {PCI_CHIP_0x0250, "0x0250",0}, + {PCI_CHIP_0x0258, "0x0258",0}, {0x0000, NULL,0}}}, {PCI_VENDOR_IMS, { {PCI_CHIP_IMSTT128, "TwinTurbo 128", 0}, @@ -1539,12 +1596,14 @@ static pciVendorDeviceInfo xf86PCIVendorInfoData[] = { {PCI_CHIP_I810_DC100_BRIDGE, "i810-dc100 Bridge",0}, {PCI_CHIP_I810_E_BRIDGE,"i810e Bridge",0}, {PCI_CHIP_I815_BRIDGE, "i815 Bridge",0}, + {PCI_CHIP_I830_M_BRIDGE,"i830M Bridge",0}, #endif {PCI_CHIP_I740_AGP, "i740 (AGP)",0}, {PCI_CHIP_I810, "i810",0}, {PCI_CHIP_I810_DC100, "i810-dc100",0}, {PCI_CHIP_I810_E, "i810e",0}, {PCI_CHIP_I815, "i815",0}, + {PCI_CHIP_I830_M, "i830M",0}, {0x0000, NULL,0}}}, {PCI_VENDOR_ADAPTEC, { {0x0010, "2940U2",0 }, @@ -1701,6 +1760,7 @@ static pciVendorCardInfo xf86PCICardInfoData[] = { { 0x0127, "Permedia3 Create!",0, NF }, { 0x0134, "Oxygen GVX1 PCI",0, NF }, { 0x0136, "Oxygen GVX210 AGP",0, NF }, + { 0x0139, "Oxygen GVX1 Pro AGP",0, NF }, { 0x0140, "Oxygen VX1-16 AGP",0, NF }, { 0x0144, "Oxygen VX1-4X AGP",0, NF }, { 0x0400, "Oxygen GVX420 AGP",0, NF }, diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86Priv.h b/xc/programs/Xserver/hw/xfree86/common/xf86Priv.h index c185adbc8..e786e3481 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86Priv.h +++ b/xc/programs/Xserver/hw/xfree86/common/xf86Priv.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Priv.h,v 3.75 2001/08/17 22:08:12 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Priv.h,v 3.76 2002/01/15 01:56:56 dawes Exp $ */ /* * Copyright (c) 1997 by The XFree86 Project, Inc. @@ -90,7 +90,7 @@ extern Bool xf86ProbeOnly; extern Bool xf86DoProbe; #ifndef DEFAULT_VERBOSE -#define DEFAULT_VERBOSE 1 +#define DEFAULT_VERBOSE 0 #endif #ifndef DEFAULT_LOG_VERBOSE #define DEFAULT_LOG_VERBOSE 3 diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c b/xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c index 410cfd7cf..e936c7752 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c +++ b/xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c @@ -1,5 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c,v 3.43 2001/06/12 04:27:14 tsi Exp $ */ - +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c,v 3.48 2001/11/30 12:11:55 eich Exp $ */ /* * Copyright (c) 1997-1999 by The XFree86 Project, Inc. */ @@ -12,7 +11,7 @@ #include <unistd.h> #include "X.h" #include "os.h" -#include "xf86Pci.h" +#include "Pci.h" #include "xf86.h" #include "xf86Priv.h" #include "xf86Resources.h" @@ -81,13 +80,15 @@ static PciBusPtr xf86PciBus = NULL; #define B2M(tag,base) pciBusAddrToHostAddr(tag,PCI_MEM,base) #define B2I(tag,base) (base) -#define B2H(tag,base,type) ((type & ResMem) ? (B2M(tag,base)) : (B2I(tag,base))) +#define B2H(tag,base,type) (((type & ResPhysMask) == ResMem) ? \ + B2M(tag, base) : B2I(tag, base)) #define M2B(tag,base) pciHostAddrToBusAddr(tag,PCI_IO,base) #define I2B(tag,base) (base) -#define H2B(tag,base,type) (type & ResMem) ? M2B(tag,base) : I2B(tag,base) +#define H2B(tag,base,type) (((type & ResPhysMask) == ResMem) ? \ + M2B(tag, base) : I2B(tag, base)) #define TAG(pvp) (pciTag(pvp->bus,pvp->device,pvp->func)) #define SIZE(size) ((1 << size) - 1) -#define PCI_SIZE(type,tag,size) ((type & ResMem) \ +#define PCI_SIZE(type,tag,size) (((type & ResPhysMask) == ResMem) \ ? pciBusAddrToHostAddr(tag,PCI_MEM_SIZE,size) \ : pciBusAddrToHostAddr(tag,PCI_IO_SIZE,size)) #define PCI_M_RANGE(range,tag,begin,end,type) \ @@ -95,14 +96,14 @@ static PciBusPtr xf86PciBus = NULL; #define PCI_I_RANGE(range,tag,begin,end,type) \ { RANGE(range,B2I(tag,begin),B2I(tag,end),type); } #define PCI_X_RANGE(range,tag,begin,end,type) \ -{ if (type & ResMem) PCI_M_RANGE(range,tag,begin,end,type); \ +{ if ((type & ResPhysMask) == ResMem) PCI_M_RANGE(range,tag,begin,end,type); \ else PCI_I_RANGE(range,tag,begin,end,type); } #define P_M_RANGE(range,tag,begin,size,type) \ PCI_M_RANGE(range,tag,begin,(begin + SIZE(size)),type) #define P_I_RANGE(range,tag,begin,size,type) \ PCI_I_RANGE(range,tag,begin,(begin + SIZE(size)),type) #define P_X_RANGE(range,tag,begin,size,type) \ -{ if (type & ResMem) P_M_RANGE(range,tag,begin,size,type); \ +{ if ((type & ResPhysMask) == ResMem) P_M_RANGE(range,tag,begin,size,type); \ else P_I_RANGE(range,tag,begin,size,type); } #define PV_M_RANGE(range,pvp,i,type) \ P_M_RANGE(range,TAG(pvp),pvp->memBase[i],pvp->size[i],type) @@ -120,6 +121,20 @@ getPciClassFlags(pciConfigPtr *pcrpp); static void pciConvertListToHost(int bus, int dev, int func, resPtr list); +static Bool +IsBaseUnassigned(CARD32 base) +{ + CARD32 mask; + + if (base & PCI_MAP_IO) + mask = ~PCI_MAP_IO_ATTR_MASK; + else + mask = ~PCI_MAP_MEMORY_ATTR_MASK; + + base &= mask; + return (!base || (base == mask)); +} + static void FindPCIVideoInfo(void) { @@ -220,17 +235,17 @@ FindPCIVideoInfo(void) } if (PCINONSYSTEMCLASSES(baseclass, subclass)) { - if (!pcrp->pci_base0 && info->size[0]) + if (info->size[0] && IsBaseUnassigned(pcrp->pci_base0)) pcrp->pci_base0 = pciCheckForBrokenBase(pcrp->tag, 0); - if (!pcrp->pci_base1 && info->size[1]) + if (info->size[1] && IsBaseUnassigned(pcrp->pci_base1)) pcrp->pci_base1 = pciCheckForBrokenBase(pcrp->tag, 1); - if (!pcrp->pci_base2 && info->size[2]) + if (info->size[2] && IsBaseUnassigned(pcrp->pci_base2)) pcrp->pci_base2 = pciCheckForBrokenBase(pcrp->tag, 2); - if (!pcrp->pci_base3 && info->size[3]) + if (info->size[3] && IsBaseUnassigned(pcrp->pci_base3)) pcrp->pci_base3 = pciCheckForBrokenBase(pcrp->tag, 3); - if (!pcrp->pci_base4 && info->size[4]) + if (info->size[4] && IsBaseUnassigned(pcrp->pci_base4)) pcrp->pci_base4 = pciCheckForBrokenBase(pcrp->tag, 4); - if (!pcrp->pci_base5 && info->size[5]) + if (info->size[5] && IsBaseUnassigned(pcrp->pci_base5)) pcrp->pci_base5 = pciCheckForBrokenBase(pcrp->tag, 5); } @@ -357,6 +372,38 @@ FindPCIVideoInfo(void) i++; } + /* If we haven't found a primary device try a different heuristic */ + if (primaryBus.type == BUS_NONE && num) { + i = 0; + while (i < num) { + k = 0; + info = xf86PciVideoInfo[i]; + while ((pcrp = xf86PciInfo[k++])) { + if ( pcrp->busnum == info->bus + && pcrp->devnum == info->device + && pcrp->funcnum == info->func ) + break; + } + + if (pcrp && (num == 1 + || ( info->class == PCI_CLASS_DISPLAY + && info->subclass == PCI_SUBCLASS_DISPLAY_MISC)) + && pcrp->pci_command & PCI_CMD_MEM_ENABLE) { + if (primaryBus.type == BUS_NONE) { + primaryBus.type = BUS_PCI; + primaryBus.id.pci.bus = pcrp->busnum; + primaryBus.id.pci.device = pcrp->devnum; + primaryBus.id.pci.func = pcrp->funcnum; + } else { + xf86Msg(X_NOTICE, + "More than one possible primary device found\n"); + primaryBus.type ^= (BusType)(-1); + } + } + i++; + } + } + /* Print a summary of the video devices found */ { for (k = 0; k < num; k++) { @@ -471,21 +518,23 @@ fixPciSizeInfo(int entityIndex) pAcc = Acc; if (pvp->memBase[j]) while (pAcc) { - if (((pAcc->res_type & (ResMem | ResBlock)) + if (((pAcc->res_type & (ResPhysMask | ResBlock)) == (ResMem | ResBlock)) && (pAcc->block_begin == B2M(TAG(pvp),pvp->memBase[j])) && (pAcc->block_end == B2M(TAG(pvp),pvp->memBase[j] + SIZE(pvp->size[j])))) break; pAcc = pAcc->next; - } else if (pvp->ioBase[j]) + } + else if (pvp->ioBase[j]) while (pAcc) { - if (((pAcc->res_type & (ResIo | ResBlock)) == + if (((pAcc->res_type & (ResPhysMask | ResBlock)) == (ResIo | ResBlock)) && (pAcc->block_begin == B2I(TAG(pvp),pvp->ioBase[j])) && (pAcc->block_end == B2I(TAG(pvp),pvp->ioBase[j] + SIZE(pvp->size[j])))) break; pAcc = pAcc->next; - } else continue; + } + else continue; pvp->size[j] = pciGetBaseSize(tag, j, TRUE, &pvp->validSize); if (pAcc) { pAcc->block_end = pvp->memBase[j] ? @@ -498,7 +547,8 @@ fixPciSizeInfo(int entityIndex) if (pvp->biosBase) { pAcc = Acc; while (pAcc) { - if (((pAcc->res_type & (ResMem | ResBlock)) == (ResMem | ResBlock)) + if (((pAcc->res_type & (ResPhysMask | ResBlock)) == + (ResMem | ResBlock)) && (pAcc->block_begin == B2M(TAG(pvp),pvp->biosBase)) && (pAcc->block_end == B2M(TAG(pvp),pvp->biosBase + SIZE(pvp->biosSize)))) break; @@ -727,9 +777,9 @@ correctPciSize(memType base, int oldsize, int newsize, long type) for (i = 0; i < 6; i++) { int j = i; if (basep[i] && (pcrp->basesize[i] == old_bits)) - if (((type & ResIo) && PCI_MAP_IS_IO(basep[i]) + if ((((type & ResPhysMask) == ResIo) && PCI_MAP_IS_IO(basep[i]) && (B2I(pcrp->tag,PCIGETIO(basep[i])) == base)) - || ((type & ResMem) && PCI_MAP_IS_MEM(basep[i]) + || (((type & ResPhysMask) == ResMem) && PCI_MAP_IS_MEM(basep[i]) && (((!PCI_MAP_IS64BITMEM(basep[i])) && (B2M(pcrp->tag,PCIGETMEMORY(basep[i])) == base)) #if defined LONG64 || defined WORD64 @@ -747,9 +797,9 @@ correctPciSize(memType base, int oldsize, int newsize, long type) for (i = 0; i < 6; i++) { if (pvp->size[i] == old_bits) { - if (((type & ResIo) && pvp->ioBase[i] + if ((((type & ResPhysMask) == ResIo) && pvp->ioBase[i] && (B2I(TAG(pvp),pvp->ioBase[i]) == base)) || - ((type & ResMem) && pvp->memBase[i] + (((type & ResPhysMask) == ResMem) && pvp->memBase[i] && (B2M(TAG(pvp),pvp->memBase[i]) == base))) { pvp->size[i] = new_bits; return; @@ -949,7 +999,8 @@ xf86GetPciRes(resPtr *activeRes, resPtr *inactiveRes) xf86MsgVerb(X_INFO, 3, "PCI %s resource overlap reduced 0x%08x" " from 0x%08x to 0x%08x\n", - (pRes->res_type & ResMem) ? "Memory" : "I/O", + ((pRes->res_type & ResPhysMask) == ResMem) ? + "Memory" : "I/O", range.rBegin, range.rEnd, pRes->block_end); } } @@ -977,7 +1028,8 @@ xf86GetPciRes(resPtr *activeRes, resPtr *inactiveRes) xf86MsgVerb(X_INFO, 3, "PCI %s resource overlap reduced 0x%08x" " from 0x%08x to 0x%08x\n", - (pRes->res_type & ResMem) ? "Memory" : "I/O", + ((pRes->res_type & ResPhysMask) == ResMem) ? + "Memory" : "I/O", range.rBegin, range.rEnd, pRes->block_end); } @@ -1026,7 +1078,7 @@ ResourceBrokerInitPci(resPtr *osRes) * PCI Resource modification */ static Bool -fixPciResource(int prt, memType alignment, pciVideoPtr pvp, long type) +fixPciResource(int prt, memType alignment, pciVideoPtr pvp, unsigned long type) { int res_n; memType *p_base; @@ -1067,6 +1119,8 @@ fixPciResource(int prt, memType alignment, pciVideoPtr pvp, long type) p_base = &(pvp->ioBase[res_n]); p_size = &(pvp->size[res_n]); p_type = pvp->type[res_n]; + PCI_I_RANGE(range, tag, 0, 0xffffffff, ResExcIoBlock); + resSize = xf86AddResToList(resSize, &range, -1); } else return FALSE; } else if (prt == 6) { type |= ResMem; @@ -1081,14 +1135,14 @@ fixPciResource(int prt, memType alignment, pciVideoPtr pvp, long type) if (! *p_base) return FALSE; - type |= ResBlock; + type |= (range.type & ResDomain) | ResBlock; /* setup avoid: PciAvoid is bus range: convert later */ avoid = xf86DupResList(pciAvoidRes); while (pbp) { if (pbp->secondary == pvp->bus) { - if (type & ResMem) { + if ((type & ResPhysMask) == ResMem) { if (((p_type & PCI_MAP_MEMORY_CACHABLE) #if 0 /*EE*/ || (res_n == 0xff)/* bios should also be prefetchable */ @@ -1122,7 +1176,7 @@ fixPciResource(int prt, memType alignment, pciVideoPtr pvp, long type) while (pbp1) { if (pbp1->primary == pvp->bus) { - if (type & ResMem) { + if ((type & ResPhysMask) == ResMem) { tmp = xf86DupResList(pbp1->preferred_pmem); avoid = xf86JoinResLists(avoid,tmp); tmp = xf86DupResList(pbp1->preferred_mem); @@ -1207,16 +1261,19 @@ fixPciResource(int prt, memType alignment, pciVideoPtr pvp, long type) #else orgAcc = xf86DupResList(Acc); pAcc = &Acc; - while ((*pAcc)) { - if ((((*pAcc)->res_type & (type & ~ResAccMask)) - == (type & ~ResAccMask)) + while (*pAcc) { + if ((((*pAcc)->res_type & (ResTypeMask|ResExtMask)) == + (type & ~ResAccMask)) && ((*pAcc)->block_begin == B2H(tag,(*p_base),type)) && ((*pAcc)->block_end == B2H(tag,(*p_base) + SIZE(*p_size), type))) { #ifdef DEBUG ErrorF("removing old resource\n"); #endif - (*pAcc) = (*pAcc)->next; + tmp = *pAcc; + *pAcc = (*pAcc)->next; + tmp->next = NULL; + xf86FreeResList(tmp); break; } else pAcc = &((*pAcc)->next); @@ -1236,7 +1293,7 @@ fixPciResource(int prt, memType alignment, pciVideoPtr pvp, long type) #endif w_tmp = w; while (w) { - if (type & w->res_type & ResPhysMask) { + if ((type & ResTypeMask) == (w->res_type & ResTypeMask)) { #ifdef DEBUG ErrorF("block_begin: 0x%lx block_end: 0x%lx\n",w->block_begin, w->block_end); @@ -1254,7 +1311,7 @@ fixPciResource(int prt, memType alignment, pciVideoPtr pvp, long type) if (range.type == ResEnd && w_2nd) { w_tmp = w_2nd; while (w_2nd) { - if (type & w_2nd->res_type & ResPhysMask) { + if ((type & ResTypeMask) == (w_2nd->res_type & ResTypeMask)) { #ifdef DEBUG ErrorF("block_begin: 0x%lx block_end: 0x%lx\n",w_2nd->block_begin, w_2nd->block_end); @@ -1288,10 +1345,11 @@ 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 & ResPhysMask) == ResMem) ? "Mem" : "Io"); #endif if (res_n != 0xff) { - if (type & ResMem) + if ((type & ResPhysMask) == ResMem) pvp->memBase[prt] = range.rBegin; else pvp->ioBase[prt] = range.rBegin; @@ -1327,7 +1385,7 @@ fixPciResource(int prt, memType alignment, pciVideoPtr pvp, long type) Bool xf86FixPciResource(int entityIndex, int prt, memType alignment, - long type) + unsigned long type) { pciVideoPtr pvp = xf86GetPciInfoForEntity(entityIndex); return fixPciResource(prt, alignment, pvp, type); @@ -1858,6 +1916,9 @@ xf86GetPciBridgeInfo(const pciConfigPtr *pciInfo) pnPciBus = &PciBus->next; PciBus->primary = -1; PciBus->secondary = -1; /* to be set below */ + PciBus->brbus = pcrp->busnum; + PciBus->brdev = pcrp->devnum; + PciBus->brfunc = pcrp->funcnum; PciBus->subclass = sub_class; PciBus->brcontrol = PCI_PCI_BRIDGE_VGA_EN; PciBus->preferred_io = xf86ExtractTypeFromList( @@ -1874,11 +1935,16 @@ xf86GetPciBridgeInfo(const pciConfigPtr *pciInfo) } } for (i = 0; i <= MaxBus; i++) { /* find PCI buses not attached to bridge */ + if (!pciBusInfo[i]) + continue; for (PciBus = PciBusBase; PciBus; PciBus = PciBus->next) if (PciBus->secondary == i) break; if (!PciBus) { /* We assume it's behind a HOST-PCI bridge */ - int minTag = 0xFFFFFF; /*find the 'smallest' free HOST-PCI bridge*/ - int tag; /*'small' is in the order of pciTag() */ + /* + * Find the 'smallest' free HOST-PCI bridge, where 'small' is in + * the order of pciTag(). + */ + PCITAG minTag = 0xFFFFFFFF, tag; PciBusPtr PciBusFound = NULL; for (PciBus = PciBusBase; PciBus; PciBus = PciBus->next) if ((PciBus->subclass == PCI_SUBCLASS_BRIDGE_HOST) && @@ -1916,7 +1982,7 @@ xf86GetPciBridgeInfo(const pciConfigPtr *pciInfo) if (PciBus->subclass == PCI_SUBCLASS_BRIDGE_PCI && PciBus->interface == PCI_IF_BRIDGE_PCI_SUBTRACTIVE) { PciBusPtr PciBus1; - for (PciBus1 = PciBusBase; PciBus1; PciBus1 = PciBus->next) { + for (PciBus1 = PciBusBase; PciBus1; PciBus1 = PciBus1->next) { if (PciBus1->secondary == PciBus->primary) { PciBus->io = PciBus1->io ? PciBus1->io : PciBus1->preferred_io; @@ -2028,31 +2094,40 @@ ValidatePci(void) if (PCIINFOCLASSES(pcrp->pci_base_class, pcrp->pci_sub_class)) continue; - if ((pcrp->pci_header_type & 0x7f) != 0) + if ((pcrp->pci_header_type & 0x7f) || + !(pcrp->pci_command & (PCI_CMD_IO_ENABLE | PCI_CMD_MEM_ENABLE))) continue; basep = &pcrp->pci_base0; for (i = 0; i < 6; i++) { if (basep[i]) { - if (PCI_MAP_IS_IO(basep[i])) - P_I_RANGE(range,pcrp->tag,PCIGETIO(basep[i]), + if (PCI_MAP_IS_IO(basep[i])) { + if (!(pcrp->pci_command & PCI_CMD_IO_ENABLE)) + continue; + P_I_RANGE(range, pcrp->tag, PCIGETIO(basep[i]), pcrp->basesize[i], ResExcIoBlock) - else if (!PCI_MAP_IS64BITMEM(basep[i])) - P_M_RANGE(range,pcrp->tag,PCIGETMEMORY(basep[i]), - pcrp->basesize[i],ResExcMemBlock) - else { + } else if (!PCI_MAP_IS64BITMEM(basep[i])) { + if (!(pcrp->pci_command & PCI_CMD_MEM_ENABLE)) + continue; + P_M_RANGE(range, pcrp->tag, PCIGETMEMORY(basep[i]), + pcrp->basesize[i], ResExcMemBlock) + } else { i++; #if defined LONG64 || defined WORD64 - P_M_RANGE(range,pcrp->tag,PCIGETMEMORY64(basep[i-1]), - pcrp->basesize[i-1],ResExcMemBlock) -#else + if (!(pcrp->pci_command & PCI_CMD_MEM_ENABLE)) continue; + P_M_RANGE(range, pcrp->tag, PCIGETMEMORY64(basep[i-1]), + pcrp->basesize[i-1], ResExcMemBlock) +#else + continue; #endif } Sys = xf86AddResToList(Sys, &range, -1); } } - if (pcrp->pci_baserom) { + if ((pcrp->pci_baserom) && + (pcrp->pci_command & PCI_CMD_MEM_ENABLE) && + (pcrp->pci_baserom & PCI_MAP_ROM_DECODE_ENABLE)) { P_M_RANGE(range,pcrp->tag,PCIGETROM(pcrp->pci_baserom), pcrp->basesize[6],ResExcMemBlock); Sys = xf86AddResToList(Sys, &range, -1); @@ -2162,8 +2237,8 @@ ValidatePci(void) } } #ifdef DEBUG - xf86MsgVerb(X_INFO, 3,"own:\n"); - xf86PrintResList(3,own); + xf86MsgVerb(X_INFO, 3, "own:\n"); + xf86PrintResList(3, own); #endif if (pvp->ioBase[i]) { PV_I_RANGE(range,pvp,i,ResExcIoBlock); @@ -2228,7 +2303,6 @@ ValidatePci(void) xf86FreeResList(res_m_io); } xf86FreeResList(Sys); - return; } resList @@ -3074,6 +3148,9 @@ pciTestMultiDeviceCard(int bus, int dev, int func, PCITAG** pTag) static void pciTagConvertRange2Host(PCITAG tag, resRange *pRange) { + if (!(pRange->type & ResBus)) + return; + switch(pRange->type & ResPhysMask) { case ResMem: switch(pRange->type & ResExtMask) { @@ -3104,6 +3181,7 @@ pciTagConvertRange2Host(PCITAG tag, resRange *pRange) } break; } + pRange->type &= ~ResBus; } static void @@ -3145,4 +3223,3 @@ xf86EnablePciBusMaster(pciVideoPtr pPci, Bool enable) else pciWriteLong(tag, PCI_CMD_STAT_REG, temp & ~PCI_CMD_MASTER_ENABLE); } - diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86sbusBus.c b/xc/programs/Xserver/hw/xfree86/common/xf86sbusBus.c index c2a5a1e0c..87042cb14 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86sbusBus.c +++ b/xc/programs/Xserver/hw/xfree86/common/xf86sbusBus.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/common/xf86sbusBus.c,v 3.6 2001/03/03 22:16:35 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86sbusBus.c,v 3.7 2001/10/28 03:33:19 tsi Exp $ */ #include <ctype.h> #include <stdio.h> @@ -38,47 +38,10 @@ #include "xf86sbusBus.h" #include "xf86Sbus.h" -#define FB_DEV_PATH "/dev/fb%d" - Bool sbusSlotClaimed = FALSE; -sbusDevicePtr *xf86SbusInfo = NULL; static int xf86nSbusInfo; -#ifndef FBTYPE_SUNGP3 -#define FBTYPE_SUNGP3 -1 -#endif -#ifndef FBTYPE_MDICOLOR -#define FBTYPE_MDICOLOR -1 -#endif -#ifndef FBTYPE_SUNLEO -#define FBTYPE_SUNLEO -1 -#endif -#ifndef FBTYPE_TCXCOLOR -#define FBTYPE_TCXCOLOR -1 -#endif -#ifndef FBTYPE_CREATOR -#define FBTYPE_CREATOR -1 -#endif - -struct sbus_devtable sbusDeviceTable[] = { - { SBUS_DEVICE_BW2, FBTYPE_SUN2BW, "bwtwo", "Sun Monochrome (bwtwo)" }, - { SBUS_DEVICE_CG2, FBTYPE_SUN2COLOR, "cgtwo", "Sun Color2 (cgtwo)" }, - { SBUS_DEVICE_CG3, FBTYPE_SUN3COLOR, "cgthree", "Sun Color3 (cgthree)" }, - { SBUS_DEVICE_CG4, FBTYPE_SUN4COLOR, "cgfour", "Sun Color4 (cgfour)" }, - { SBUS_DEVICE_CG6, FBTYPE_SUNFAST_COLOR, "cgsix", "Sun GX" }, - { SBUS_DEVICE_CG8, FBTYPE_MEMCOLOR, "cgeight", "Sun CG8/RasterOps" }, - { SBUS_DEVICE_CG12, FBTYPE_SUNGP3, "cgtwelve", "Sun GS (cgtwelve)" }, - { SBUS_DEVICE_CG14, FBTYPE_MDICOLOR, "cgfourteen", "Sun SX" }, - { SBUS_DEVICE_GT, FBTYPE_SUNGT, "gt", "Sun Graphics Tower" }, - { SBUS_DEVICE_MGX, -1, "mgx", "Quantum 3D MGXplus" }, - { SBUS_DEVICE_LEO, FBTYPE_SUNLEO, "leo", "Sun ZX or Turbo ZX" }, - { SBUS_DEVICE_TCX, FBTYPE_TCXCOLOR, "tcx", "Sun TCX" }, - { SBUS_DEVICE_FFB, FBTYPE_CREATOR, "ffb", "Sun FFB" }, - { SBUS_DEVICE_FFB, FBTYPE_CREATOR, "afb", "Sun Elite3D" }, - { 0, 0, NULL } -}; - static void CheckSbusDevice(const char *device, int fbNum) { @@ -123,21 +86,23 @@ xf86SbusProbe(void) xf86SbusInfo = xalloc(sizeof(psdp)); *xf86SbusInfo = NULL; for (i = 0; i < 32; i++) { - sprintf(fbDevName, FB_DEV_PATH, i); + sprintf(fbDevName, "/dev/fb%d", i); CheckSbusDevice(fbDevName, i); } if (sparcPromInit() >= 0) { useProm = 1; sparcPromAssignNodes(); } - for (psdpp = xf86SbusInfo, psdp = *psdpp; psdp; psdp = *++psdpp) { + for (psdpp = xf86SbusInfo; (psdp = *psdpp); psdpp++) { for (i = 0; sbusDeviceTable[i].devId; i++) if (sbusDeviceTable[i].devId == psdp->devId) psdp->descr = sbusDeviceTable[i].descr; - /* If we can use PROM information and found the PROM node for this device, - * we can tell more about the card. */ + /* + * If we can use PROM information and found the PROM node for this + * device, we can tell more about the card. + */ if (useProm && psdp->node.node) { - char *prop; + char *prop, *promPath; int len, chiprev, vmsize; switch (psdp->devId) { @@ -169,9 +134,12 @@ xf86SbusProbe(void) psdp->descr = "Sun Single width GX"; break; case 11: switch (vmsize) { - case 2: psdp->descr = "Sun Turbo GX with 1M VSIMM"; break; - case 4: psdp->descr = "Sun Turbo GX Plus"; break; - default: psdp->descr = "Sun Turbo GX"; break; + case 2: + psdp->descr = "Sun Turbo GX with 1M VSIMM"; break; + case 4: + psdp->descr = "Sun Turbo GX Plus"; break; + default: + psdp->descr = "Sun Turbo GX"; break; } } break; @@ -181,8 +149,10 @@ xf86SbusProbe(void) if (prop && !(len % 12) && len > 0) vmsize = *(int *)(prop + len - 4); switch (vmsize) { - case 0x400000: psdp->descr = "Sun SX with 4M VSIMM"; break; - case 0x800000: psdp->descr = "Sun SX with 8M VSIMM"; break; + case 0x400000: + psdp->descr = "Sun SX with 4M VSIMM"; break; + case 0x800000: + psdp->descr = "Sun SX with 8M VSIMM"; break; } break; case SBUS_DEVICE_LEO: @@ -207,26 +177,33 @@ xf86SbusProbe(void) psdp->descr = "Sun|Elite3D-M6 Horizontal"; } else { switch (chiprev) { - case 0x08: psdp->descr = "Sun FFB 67MHz Creator"; break; - case 0x0b: psdp->descr = "Sun FFB 67MHz Creator 3D"; break; - case 0x1b: psdp->descr = "Sun FFB 75MHz Creator 3D"; break; + case 0x08: + psdp->descr = "Sun FFB 67MHz Creator"; break; + case 0x0b: + psdp->descr = "Sun FFB 67MHz Creator 3D"; break; + case 0x1b: + psdp->descr = "Sun FFB 75MHz Creator 3D"; break; case 0x20: - case 0x28: psdp->descr = "Sun FFB2 Vertical Creator"; break; + case 0x28: + psdp->descr = "Sun FFB2 Vertical Creator"; break; case 0x23: - case 0x2b: psdp->descr = "Sun FFB2 Vertical Creator 3D"; break; - case 0x30: psdp->descr = "Sun FFB2+ Vertical Creator"; break; - case 0x33: psdp->descr = "Sun FFB2+ Vertical Creator 3D"; break; + case 0x2b: + psdp->descr = "Sun FFB2 Vertical Creator 3D"; break; + case 0x30: + psdp->descr = "Sun FFB2+ Vertical Creator"; break; + case 0x33: + psdp->descr = "Sun FFB2+ Vertical Creator 3D"; break; case 0x40: - case 0x48: psdp->descr = "Sun FFB2 Horizontal Creator"; break; + case 0x48: + psdp->descr = "Sun FFB2 Horizontal Creator"; break; case 0x43: - case 0x4b: psdp->descr = "Sun FFB2 Horizontal Creator 3D"; break; + case 0x4b: + psdp->descr = "Sun FFB2 Horizontal Creator 3D"; break; } } break; } - } - if (useProm && psdp->node.node) { - char *promPath; + xf86Msg(X_PROBED, "SBUS:(0x%08x) %s", psdp->node.node, psdp->descr); promPath = sparcPromNode2Pathname (&psdp->node); if (promPath) { diff --git a/xc/programs/Xserver/hw/xfree86/ddc/ddcProperty.c b/xc/programs/Xserver/hw/xfree86/ddc/ddcProperty.c index def271371..d779834c2 100644 --- a/xc/programs/Xserver/hw/xfree86/ddc/ddcProperty.c +++ b/xc/programs/Xserver/hw/xfree86/ddc/ddcProperty.c @@ -3,7 +3,7 @@ * * Copyright 1999 by Andrew C Aitchison <A.C.Aitchison@dpmms.cam.ac.uk> */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/ddc/ddcProperty.c,v 1.8 2001/07/14 19:38:29 paulo Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/ddc/ddcProperty.c,v 1.9 2001/10/28 03:33:21 tsi Exp $ */ #include "misc.h" #include "xf86.h" @@ -24,7 +24,6 @@ xf86SetDDCproperties(ScrnInfoPtr pScrnInfo, xf86MonPtr DDC) Atom EDID1Atom=-1, EDID2Atom=-1, VDIFAtom=-1; CARD8 *EDID1rawdata = NULL; CARD8 *EDID2rawdata = NULL; - CARD8 *VDIFrawdata = NULL; int i, ret; Bool makeEDID1prop = FALSE; Bool makeEDID2prop = FALSE; diff --git a/xc/programs/Xserver/hw/xfree86/doc/Install b/xc/programs/Xserver/hw/xfree86/doc/Install index ed8e3680f..2a392ebd7 100644 --- a/xc/programs/Xserver/hw/xfree86/doc/Install +++ b/xc/programs/Xserver/hw/xfree86/doc/Install @@ -1,8 +1,8 @@ - Installation Details for XFree86[tm] 4.1.0 + Installation Details for XFree86[tm] 4.2.0 The XFree86 Project, Inc - 1 June 2001 + 16 January 2002 Abstract @@ -20,14 +20,13 @@ vide a customized version of the GNU tar utility called "extract" and an installation script. We recommend that these be used to install the bina- ries. -2. Downloading the XFree86 4.1.0 binaries +2. Downloading the XFree86 4.2.0 binaries -We provide XFree86 4.1.0 binaries for a range of operating systems at our ftp -site <URL:ftp://ftp.xfree86.org/pub/XFree86/4.1.0/binaries/>. Often during -releases our ftp site is heavily loaded. Instead of downloading directly -from us we recommend that instead you use one of our mirror sites. Another -advantage of using our mirror sites is that some of them support http access -(ours does not). +We provide XFree86 4.2.0 binaries for a range of operating systems at our ftp +site <URL:ftp://ftp.xfree86.org/pub/XFree86/4.2.0/binaries/> and our web site +<URL:http://ftp.xfree86.org/pub/XFree86/4.2.0/binaries/>. Often during +releases our site is heavily loaded. Instead of downloading directly from us +we recommend that instead you use one of our mirror sites. Our binaries are organized by sub-directories which correspond to each of the OS/platforms for which we provide binaries. First go to the sub-directory @@ -66,6 +65,17 @@ NOTES: the release you're installing. Older versions of the script may not install newer releases correctly. + o If the binary distribution reported by the Xinstall.sh script isn't pre- + sent on our site, then there are two possibilities. The first is that + it hasn't been prepared and uploaded yet. This is likely if you are + looking soon after the release date. The second possibility is that we + won't have it available at all for this release. This is likely if it's + still not there about two weeks after the release date. Check here + <URL:http://www.xfree86.org/4.2.0/UPDATES.html> for information about + updates to our binary distributions, and here + <URL:http://www.xfree86.org/4.2.0/ERRATA.html> for errata related to + this release. + Once you're run the Xinstall.sh script and found which binary distribution is suitable for your system, download the necessary files. The twelve (12) mandatory files for all installations are listed below. If you have not @@ -111,7 +121,7 @@ ones you want to install. 5. Xvfb.tgz Virtual framebuffer X server 6. Xf100.tgz 100dpi fonts 7. Xfcyr.tgz Cyrillic fonts - 8. Xfscl.tgz Scalable fonts (Speedo and Type1) + 8. Xfscl.tgz Scalable fonts (Speedo, Type1 and TrueType) 9. Xhtml.tgz HTML version of the documentation 10. Xps.tgz PostScript version of the documentation 11. Xjdoc.tgz Documentation in Japanese @@ -123,9 +133,9 @@ NOTES: If you miss some and want to install them later, go to the Manual Installa- tion (section 4., page 1) section. -3. Installing XFree86 4.1.0 using the Xinstall.sh script +3. Installing XFree86 4.2.0 using the Xinstall.sh script -We strongly recommend that our XFree86 4.1.0 binaries be installed using the +We strongly recommend that our XFree86 4.2.0 binaries be installed using the Xinstall.sh script that we provide. There are a lot of steps in the manual installation process, and those steps can vary according to the platform and hardware setup. There is a description of the manual installation process @@ -242,7 +252,7 @@ later that you need it, you can create it easily by running: The next step is to configure the X server. That is covered in detail in an as-yet unwritten document :-(. In the meantime, there are three ways to cre- -ate a basic X server configuration file for XFree86 4.1.0. One is to run the +ate a basic X server configuration file for XFree86 4.2.0. One is to run the xf86config utility. Another is to run the xf86cfg utility. The third option is to use the new -configure X server option: @@ -261,11 +271,13 @@ old XF86_* and/or XF98_* X server binaries from /usr/X11R6/bin. After the X server configuration is done, it may be advisable to reboot, especially if you run xdm (or equivalent) or the font server (xfs). -4. Installing XFree86 4.1.0 manually +4. Installing XFree86 4.2.0 manually -This section describes how to manually install the XFree86 4.1.0 binary dis- -tributions. You should only use this method if you know what you're doing. -The information here covers some common cases, but not every possible case. +This section contains information about manually installing the XFree86 4.2.0 +binary distributions. You should only use this method if you know what +you're doing. The information here covers some common cases, but not every +possible case. It also may not be complete or up to date. Use at your own +risk. Put all of the downloaded files into a single directory (choose some tempo- rary location with enough space). Become the super user (root). All of the @@ -366,7 +378,7 @@ Once that's done, the main part of the installation can be done: /sbin/ldconfig -m /usr/X11R6/lib # For FreeBSD, NetBSD, OpenBSD /usr/X11R6/bin/mkfontdir /usr/X11R6/lib/X11/fonts/misc - Generated from XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/Install.sgml,v 1.12 2001/06/01 18:26:04 dawes Exp $ + Generated from XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/Install.sgml,v 1.13 2002/01/16 20:38:44 dawes Exp $ -$XFree86: xc/programs/Xserver/hw/xfree86/doc/Install,v 1.12 2001/06/01 18:28:40 dawes Exp $ +$XFree86: xc/programs/Xserver/hw/xfree86/doc/Install,v 1.14 2002/01/16 20:51:01 dawes Exp $ diff --git a/xc/programs/Xserver/hw/xfree86/doc/README.DRI b/xc/programs/Xserver/hw/xfree86/doc/README.DRI index 8ecad955c..689b6d1c7 100644 --- a/xc/programs/Xserver/hw/xfree86/doc/README.DRI +++ b/xc/programs/Xserver/hw/xfree86/doc/README.DRI @@ -2,7 +2,7 @@ VA Linux Systems, Inc. Professional Services - Graphics. - 3 May 2001 + 15 June 2001 1. Preamble @@ -45,8 +45,8 @@ XFree86 4.0 or that you're an experienced Linux developer who has compiled the DRI for himself. DRI download, compilation and installation instructions can be found at http://dri.sourceforge.net/DRIcompile.html -Edits, corrections and updates to this document may be mailed to brianp@val- -inux.com. +Edits, corrections and updates to this document may be mailed to <brian@tung- +stengrahpics.com>. 3. Supported Architectures & Hardware @@ -112,7 +112,7 @@ graphics hardware: o i810e - o ATI Rage 128, supported on Intel x86 and AMD: + o ATI Rage 128, supported on Intel x86, AMD and Alpha: o Rage Fury @@ -126,15 +126,19 @@ graphics hardware: o All-in-Wonder 128 + o Rage 128 PCI (Alpha-based systems) + Note that both PCI and AGP versions of Rage 128 based cards are sup- ported at this time. - o ATI Radeon, supported on Intel x86 and AMD: + o ATI Radeon, supported on Intel x86, AMD and Alpha: o Radeon SDR AGP o Radeon DDR AGP + o Radeon 32MB SDR PCI (Alpha-based systems) + o 3Dlabs, supported on Intel x86 and AMD: o Oxygen GMX 2000 (MX/Gamma based). Note: this driver is no longer @@ -173,7 +177,7 @@ modules. XFree86 4.0.1 added automatic kernel module loading to the X server. On Linux, the X server uses modprobe to load kernel modules. In Linux 2.4.x the DRM kernel modules should be kept in /lib/modules/2.4.x/ker- -nel/driver/char/drm/ for automatic loading to work. +nel/drivers/char/drm/ for automatic loading to work. Optionally, DRM kernel modules can be loaded manually with insmod prior to starting the X server. @@ -621,7 +625,7 @@ Or, EndSection The kernel module for 3dfx hardware is named tdfx.o and should be installed -in /lib/modules/2.4.x/kernel/driver/char/drm/. It will be automatically +in /lib/modules/2.4.x/kernel/drivers/char/drm/. It will be automatically loaded by the Xserver if needed. The DRI 3D driver for 3dfx hardware should be in /usr/X11R6/lib/mod- @@ -779,7 +783,7 @@ The Screen section should then reference the i810 device: EndSection The kernel module for the i810 is named i810.o and should be installed in -/lib/modules/2.4.x/kernel/driver/char/drm/. It will be automatically loaded +/lib/modules/2.4.x/kernel/drivers/char/drm/. It will be automatically loaded by the Xserver if needed. The DRI 3D driver for the i810 should be in /usr/X11R6/lib/mod- @@ -868,7 +872,7 @@ To use a 32bpp screen mode, use this Screen section instead: EndSection The kernel module for the G200/G400 is named mga.o and should be installed in -/lib/modules/2.4.x/kernel/driver/char/drm/. It will be automatically loaded +/lib/modules/2.4.x/kernel/drivers/char/drm/. It will be automatically loaded by the Xserver if needed. The DRI 3D driver for the G200/G400 should be in /usr/X11R6/lib/mod- @@ -993,7 +997,7 @@ The Screen section should then reference the Rage 128 device: EndSection The kernel module for the Rage 128 is named r128.o and should be installed in -/lib/modules/2.4.x/kernel/driver/char/drm/. It will be automatically loaded +/lib/modules/2.4.x/kernel/drivers/char/drm/. It will be automatically loaded by the Xserver if needed. The DRI 3D driver for the Rage 128 should be in /usr/X11R6/lib/mod- @@ -1014,7 +1018,9 @@ Note that even at 32bpp there is no alpha channel. The following OpenGL features are implemented in software and will be slow: - o Stencil buffer and accumulation buffer operations + o accumulation buffer operations + + o stencil, when using a 16bpp screen o Blend subtract, min/max and logic op blend modes @@ -1069,7 +1075,7 @@ The Screen section should then reference the Radeon device: EndSection The kernel module for the Radeon is named radeon.o and should be installed in -/lib/modules/2.4.x/kernel/driver/char/drm/. It will be automatically loaded +/lib/modules/2.4.x/kernel/drivers/char/drm/. It will be automatically loaded by the Xserver if needed. The DRI 3D driver for the Radeon should be in /usr/X11R6/lib/mod- @@ -1231,7 +1237,7 @@ demo programs is available from http://dri.sourceforge.net/res.phtml o In the future there may be IHV and Linux vendor support resources for the DRI. - Generated from XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml,v 1.24 2001/05/19 00:42:22 dawes Exp $ + Generated from XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml,v 1.27 2002/01/07 22:05:57 dawes Exp $ -$XFree86: xc/programs/Xserver/hw/xfree86/doc/README.DRI,v 1.17 2001/06/01 18:28:40 dawes Exp $ +$XFree86: xc/programs/Xserver/hw/xfree86/doc/README.DRI,v 1.19 2002/01/07 22:07:16 dawes Exp $ diff --git a/xc/programs/Xserver/hw/xfree86/doc/README.DRIcomp b/xc/programs/Xserver/hw/xfree86/doc/README.DRIcomp index 5addc30a6..b1e97f2bd 100644 --- a/xc/programs/Xserver/hw/xfree86/doc/README.DRIcomp +++ b/xc/programs/Xserver/hw/xfree86/doc/README.DRIcomp @@ -35,8 +35,8 @@ The DRI provides 3D graphics hardware acceleration for the XFree86 project. This information is intended for experienced Linux developers. Beginners are probably better off installing precompiled packages. -Edits, corrections and updates to this document may be mailed to brianp@val- -inux.com. +Edits, corrections and updates to this document may be mailed to <brian@tung- +stengrahpics.com>. 3. Prerequisites @@ -272,7 +272,7 @@ the mailing lists. 3. Check out the CVS sources: cd ~/DRI-CVS - cvs -z3 -dYOURID@cvs.dri.sourceforge.net:/cvsroot/dri co xc + cvs -z3 -d:ext:YOURID@cvs.dri.sourceforge.net:/cvsroot/dri co xc Replace YOURID with your CVS login name. You'll be prompted to enter your sourceforge password. @@ -598,7 +598,7 @@ At this point your X server should be up and running with hardware-acceler- ated direct rendering. Please read the DRI User Guide for information about trouble shooting and how to use the DRI-enabled X server for 3D applications. - Generated from XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml,v 1.14 2001/05/02 15:06:08 dawes Exp $ + Generated from XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml,v 1.16 2002/01/07 22:05:57 dawes Exp $ -$XFree86: xc/programs/Xserver/hw/xfree86/doc/README.DRIcomp,v 3.11 2001/06/01 18:28:40 dawes Exp $ +$XFree86: xc/programs/Xserver/hw/xfree86/doc/README.DRIcomp,v 3.13 2002/01/07 22:07:16 dawes Exp $ diff --git a/xc/programs/Xserver/hw/xfree86/doc/README.i810 b/xc/programs/Xserver/hw/xfree86/doc/README.i810 index 5cbd28b9f..f0474b0b2 100644 --- a/xc/programs/Xserver/hw/xfree86/doc/README.i810 +++ b/xc/programs/Xserver/hw/xfree86/doc/README.i810 @@ -109,4 +109,4 @@ http://www.precisioninsight.com Generated from XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/i810.sgml,v 1.3 2001/04/04 01:34:18 dawes Exp $ -$XFree86: xc/programs/Xserver/hw/xfree86/doc/README.i810,v 1.7 2001/06/01 18:28:42 dawes Exp $ +$XFree86: xc/programs/Xserver/hw/xfree86/doc/README.i810,v 1.9 2001/11/15 17:37:23 dawes Exp $ diff --git a/xc/programs/Xserver/hw/xfree86/doc/README.newport b/xc/programs/Xserver/hw/xfree86/doc/README.newport index a3703cd3f..9e63ccca0 100644 --- a/xc/programs/Xserver/hw/xfree86/doc/README.newport +++ b/xc/programs/Xserver/hw/xfree86/doc/README.newport @@ -1,44 +1,60 @@ Information for newport Users - Guido Guenther + Guido Günther - 1 August 2000 + 16 January 2002 1. Supported Hardware This is an unaccelerated driver for the SGI Indy's newport cards. Both the -8bit and 24bit versions are tested and working with some limitations(see -below). The 24bit newport additionally works in 8bit mode only. +8bit and 24bit versions are tested and working. -2. Notes +2. Features + + o support for 8 and 24 bit pixel depths + +3. Notes o X -configure does not generate a XF86Config file -3. Configuration + o Restoration of the console fails on some variants of the newport (Cmap + revision C) + + o There's only a 1280x1024 mode + +4. Configuration + +The driver auto-detects all device information necessary to initialize the +card. The only lines you need in the "Device" section of your XF86Config +file are: + + Section "Device" + Identifier "SGI newport" + Driver "newport" + EndSection -The following Section "Device" options are supported by the newport driver: +However, if you have problems with auto-detection, you can specify: - o Option "bitplanes" "x" Gives the maximum number of bitplanes your card - supports (8 or 24). + o bitplanes - number of physical bitplanes (8 or 24) -4. Authors +5. Authors - o Guido Guenther <guido.guenther@gmx.net> + o Guido Guenther <agx@sigxcpu.org> -5. Acknowledgements +6. Acknowledgements o Gleb O. Raiko <raiko@niisi.msk.ru> for getting the beast to build o Ralf Baechle <ralf@oss.sgi.com> for his patience... - o Ulf Carlsson <ulfc@calypso.engr.sgi.com> for comments and the dynamic - loader code + o Ulf Carlsson <ulfc@calypso.engr.sgi.com> for comments and elf loader + code - o Nina A. Podolskaya <nap@niisi.msk.ru> for dynamic loader code + o Nina A. Podolskaya <nap@niisi.msk.ru> for elf loader code o all the guys who wrote the newport_con linux kernel code - Generated from XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/newport.sgml,v 1.2 2000/12/12 18:54:29 dawes Exp $ + Generated from XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/newport.sgml,v 1.4 2002/01/16 18:21:04 dawes Exp $ -$XFree86: xc/programs/Xserver/hw/xfree86/doc/README.newport,v 1.3 2001/06/01 18:28:42 dawes Exp $ +$XFree86: xc/programs/Xserver/hw/xfree86/doc/README.newport,v 1.5 2002/01/16 20:51:03 dawes Exp $ diff --git a/xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml b/xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml index 5ce4df7f5..c3467a255 100644 --- a/xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml +++ b/xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml @@ -13,7 +13,7 @@ <date>15 June 2001 <ident> - $XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml,v 1.25 2001/08/18 02:51:11 dawes Exp $ + $XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRI.sgml,v 1.27 2002/01/07 22:05:57 dawes Exp $ </ident> <toc> @@ -71,7 +71,7 @@ name="http://dri.sourceforge.net/DRIcompile.html"> <p> Edits, corrections and updates to this document may be mailed - to brianp@valinux.com. + to <email>brian@tungstengrahpics.com</email>. <sect>Supported Architectures & Hardware <p> @@ -195,7 +195,7 @@ XFree86 4.0.1 added automatic kernel module loading to the X server. On Linux, the X server uses modprobe to load kernel modules. In Linux 2.4.x the DRM kernel modules should be kept in - <tt>/lib/modules/2.4.x/kernel/driver/char/drm/</tt> for automatic + <tt>/lib/modules/2.4.x/kernel/drivers/char/drm/</tt> for automatic loading to work. <p> Optionally, DRM kernel modules can be loaded manually with insmod @@ -748,7 +748,7 @@ <p> The kernel module for 3dfx hardware is named <tt>tdfx.o</tt> and - should be installed in /lib/modules/2.4.x/kernel/driver/char/drm/. + should be installed in /lib/modules/2.4.x/kernel/drivers/char/drm/. It will be automatically loaded by the Xserver if needed. <p> The DRI 3D driver for 3dfx hardware should be in @@ -939,7 +939,7 @@ </verb> <p> The kernel module for the i810 is named <tt>i810.o</tt> and - should be installed in /lib/modules/2.4.x/kernel/driver/char/drm/. + should be installed in /lib/modules/2.4.x/kernel/drivers/char/drm/. It will be automatically loaded by the Xserver if needed. <p> The DRI 3D driver for the i810 should be in @@ -1036,7 +1036,7 @@ <p> The kernel module for the G200/G400 is named <tt>mga.o</tt> and - should be installed in /lib/modules/2.4.x/kernel/driver/char/drm/. + should be installed in /lib/modules/2.4.x/kernel/drivers/char/drm/. It will be automatically loaded by the Xserver if needed. <p> The DRI 3D driver for the G200/G400 should be in @@ -1179,7 +1179,7 @@ </verb> <p> The kernel module for the Rage 128 is named <tt>r128.o</tt> and - should be installed in /lib/modules/2.4.x/kernel/driver/char/drm/. + should be installed in /lib/modules/2.4.x/kernel/drivers/char/drm/. It will be automatically loaded by the Xserver if needed. <p> The DRI 3D driver for the Rage 128 should be in @@ -1262,7 +1262,7 @@ </verb> <p> The kernel module for the Radeon is named <tt>radeon.o</tt> and - should be installed in /lib/modules/2.4.x/kernel/driver/char/drm/. + should be installed in /lib/modules/2.4.x/kernel/drivers/char/drm/. It will be automatically loaded by the Xserver if needed. <p> The DRI 3D driver for the Radeon should be in diff --git a/xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml b/xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml index 8fb637e42..09b17caeb 100644 --- a/xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml +++ b/xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml @@ -13,7 +13,7 @@ <date>21 April 2001 <ident> - $XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml,v 1.14 2001/05/02 15:06:08 dawes Exp $ + $XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/DRIcomp.sgml,v 1.16 2002/01/07 22:05:57 dawes Exp $ </ident> <toc> @@ -59,7 +59,7 @@ Beginners are probably better off installing precompiled packages. <p> Edits, corrections and updates to this document may be mailed - to brianp@valinux.com. + to <email>brian@tungstengrahpics.com</email>. <sect>Prerequisites <p> diff --git a/xc/programs/Xserver/hw/xfree86/doc/sgml/Install.sgml b/xc/programs/Xserver/hw/xfree86/doc/sgml/Install.sgml index 24fa59101..f24c95c3b 100644 --- a/xc/programs/Xserver/hw/xfree86/doc/sgml/Install.sgml +++ b/xc/programs/Xserver/hw/xfree86/doc/sgml/Install.sgml @@ -6,10 +6,10 @@ <title>Installation Details for XFree86™ &relvers; <author>The XFree86 Project, Inc -<date>1 June 2001 +<date>16 January 2002 <ident> -$XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/Install.sgml,v 1.12 2001/06/01 18:26:04 dawes Exp $ +$XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/Install.sgml,v 1.13 2002/01/16 20:38:44 dawes Exp $ </ident> <abstract> @@ -50,16 +50,24 @@ We provide XFree86 &relvers; <![ %updaterel [update ]]>binaries for a range of operating systems at our <![ %snapshot; [ <url name="ftp site" -url="ftp://ftp.xfree86.org/pub/XFree86/snapshots/&relvers/binaries/">. +url="ftp://ftp.xfree86.org/pub/XFree86/snapshots/&relvers/binaries/"> ]]> <![ %release; [ <url name="ftp site" -url="ftp://ftp.xfree86.org/pub/XFree86/&relvers/binaries/">. +url="ftp://ftp.xfree86.org/pub/XFree86/&relvers/binaries/"> ]]> -Often during releases our ftp site is heavily loaded. Instead of -downloading directly from us we recommend that instead you use one of -our mirror sites. Another advantage of using our mirror sites is that -some of them support http access (ours does not). +and our +<![ %snapshot; [ +<url name="web site" +url="http://ftp.xfree86.org/pub/XFree86/snapshots/&relvers/binaries/">. +]]> +<![ %release; [ +<url name="web site" +url="http://ftp.xfree86.org/pub/XFree86/&relvers/binaries/">. +]]> +Often during releases our site is heavily loaded. Instead of downloading +directly from us we recommend that instead you use one of our mirror +sites. <p> Our binaries are organized by sub-directories which correspond to each @@ -104,6 +112,19 @@ distribution. <item>Always use the version of the Xinstall.sh script that's provided with the release you're installing. Older versions of the script may not install newer releases correctly. + + <item>If the binary distribution reported by the Xinstall.sh script + isn't present on our site, then there are two possibilities. + The first is that it hasn't been prepared and uploaded yet. + This is likely if you are looking soon after the release date. + The second possibility is that we won't have it available at + all for this release. This is likely if it's still not there + about two weeks after the release date. Check <url name="here" + url="http://www.xfree86.org/&relvers;/UPDATES.html"> for + information about updates to our binary distributions, and <url + name="here" url="http://www.xfree86.org/&relvers;/ERRATA.html"> + for errata related to this release. + </itemize> Once you're run the <tt>Xinstall.sh</tt> script and found which binary @@ -173,7 +194,7 @@ the ones you want to install. 5. Xvfb.tgz Virtual framebuffer X server 6. Xf100.tgz 100dpi fonts 7. Xfcyr.tgz Cyrillic fonts -8. Xfscl.tgz Scalable fonts (Speedo and Type1) +8. Xfscl.tgz Scalable fonts (Speedo, Type1 and TrueType) 9. Xhtml.tgz HTML version of the documentation 10. Xps.tgz PostScript version of the documentation 11. Xjdoc.tgz Documentation in Japanese @@ -357,10 +378,11 @@ especially if you run xdm (or equivalent) or the font server (xfs). <![ %fullrel [ <sect>Installing XFree86 &relvers; manually<label id="manual-install"> <p> -This section describes how to manually install the XFree86 &relvers; binary -distributions. You should only use this method if you know what you're -doing. The information here covers some common cases, but not every -possible case. +This section contains information about manually installing the XFree86 +&relvers; binary distributions. You should only use this method if you +know what you're doing. The information here covers some common cases, +but not every possible case. It also may not be complete or up to date. +Use at your own risk. Put all of the downloaded files into a single directory (choose some temporary location with enough space). Become the super user (root). diff --git a/xc/programs/Xserver/hw/xfree86/doc/sgml/newport.sgml b/xc/programs/Xserver/hw/xfree86/doc/sgml/newport.sgml index a0999f79a..ff3ae33dc 100644 --- a/xc/programs/Xserver/hw/xfree86/doc/sgml/newport.sgml +++ b/xc/programs/Xserver/hw/xfree86/doc/sgml/newport.sgml @@ -4,39 +4,56 @@ <article> <title>Information for newport Users -<author>Guido Guenther -<date>1 August 2000 +<author>Guido Günther +<date>16 January 2002 <ident> -$XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/newport.sgml,v 1.2 2000/12/12 18:54:29 dawes Exp $ +$XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/newport.sgml,v 1.4 2002/01/16 18:21:04 dawes Exp $ </ident> <toc> <sect>Supported Hardware <p> This is an unaccelerated driver for the SGI Indy's newport cards. Both the - 8bit and 24bit versions are tested and working with some limitations(see below). -The 24bit newport additionally works in 8bit mode only. + 8bit and 24bit versions are tested and working. + + +<sect>Features +<p> +<itemize> + <item> support for 8 and 24 bit pixel depths +</itemize> <sect>Notes <p> <itemize> <item>X -configure does not generate a XF86Config file + <item>Restoration of the console fails on some variants of the newport + (Cmap revision C) + <item>There's only a 1280x1024 mode </itemize> <sect>Configuration <p> -The following Section "Device" options are supported by the newport driver: +The driver auto-detects all device information necessary to +initialize the card. The only lines you need in the "Device" +section of your XF86Config file are: +<verb> + Section "Device" + Identifier "SGI newport" + Driver "newport" + EndSection +</verb> + +However, if you have problems with auto-detection, you can specify: <itemize> - <item>Option "bitplanes" "x" - Gives the maximum number of bitplanes your card supports (8 or 24). + <item>bitplanes - number of physical bitplanes (8 or 24) </itemize> - <sect>Authors <p> <itemize> - <item>Guido Guenther <email>guido.guenther@gmx.net</email> + <item>Guido Guenther <email>agx@sigxcpu.org</email> </itemize> @@ -45,8 +62,8 @@ The following Section "Device" options are supported by the newport driver: <itemize> <item>Gleb O. Raiko <email>raiko@niisi.msk.ru</email> for getting the beast to build <item>Ralf Baechle <email>ralf@oss.sgi.com</email> for his patience... - <item>Ulf Carlsson <email>ulfc@calypso.engr.sgi.com</email> for comments and the dynamic loader code - <item>Nina A. Podolskaya <email>nap@niisi.msk.ru</email> for dynamic loader code + <item>Ulf Carlsson <email>ulfc@calypso.engr.sgi.com</email> for comments and elf loader code + <item>Nina A. Podolskaya <email>nap@niisi.msk.ru</email> for elf loader code <item>all the guys who wrote the newport_con linux kernel code </itemize> diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ark/ark_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/ark/ark_driver.c index 5762026cd..4c9d31413 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ark/ark_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ark/ark_driver.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ark/ark_driver.c,v 1.17 2001/08/07 07:04:42 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ark/ark_driver.c,v 1.19 2001/10/28 03:33:22 tsi Exp $ */ /* * Copyright 2000 Ani Joshi <ajoshi@unixbox.com> * @@ -204,7 +204,7 @@ static const OptionInfoRec * ARKAvailableOptions(int chipid, int busid) static void ARKIdentify(int flags) { - xf86PrintChipsets("ark", "driver (version " DRIVER_VERSION " for ARK Logic chipset", + xf86PrintChipsets("ARK", "driver (version " DRIVER_VERSION " for ARK Logic chipset", ARKChipsets); } @@ -517,7 +517,7 @@ static Bool ARKScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, ARKSave(pScrn); -/* vgaHWBlankScreen(pScrn, TRUE); */ + vgaHWBlankScreen(pScrn, TRUE); if (!ARKModeInit(pScrn, pScrn->currentMode)) return FALSE; @@ -589,7 +589,7 @@ static Bool ARKScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, CMAP_RELOAD_ON_MODE_SWITCH)) return FALSE; -/* vgaHWBlankScreen(pScrn, TRUE); */ + vgaHWBlankScreen(pScrn, FALSE); pScreen->SaveScreen = ARKSaveScreen; pARK->CloseScreen = pScreen->CloseScreen; @@ -716,12 +716,9 @@ static Bool ARKModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) offset = (pScrn->displayWidth * (pScrn->bitsPerPixel / 8)) >> 3; pVga->CRTC[0x13] = offset; - pVga->Attribute[0x11] = 0x00; new->cr41 = (offset & 0x100) >> 5; - pVga->MiscOutReg |= 0x0c; - - new->sr11 = rdinx(0x3c4, 0x11) & ~0x0f; + new->sr11 = 0x90; switch (pScrn->bitsPerPixel) { case 8: new->sr11 |= 0x06; @@ -885,9 +882,6 @@ static Bool ARKModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) new->dac_command = 0xe0; } - /* hrmm... */ - new->dac_command |= 0x02; - #if 0 /* hw cursor regs */ new->sr20 = rdinx(0x3c4, 0x20); @@ -958,7 +952,7 @@ static void ARKWriteMode(ScrnInfoPtr pScrn, vgaRegPtr pVga, ARKRegPtr new) * restoration can suceed */ wrinx(0x3c4, 0x10, new->sr10); - modinx(0x3c4, 0x11, 0x3f, new->sr11); + wrinx(0x3c4, 0x11, new->sr11); wrinx(0x3c4, 0x12, new->sr12); wrinx(0x3c4, 0x13, new->sr13); wrinx(0x3c4, 0x14, new->sr14); @@ -1008,9 +1002,6 @@ static void ARKWriteMode(ScrnInfoPtr pScrn, vgaRegPtr pVga, ARKRegPtr new) else vgaHWRestore(pScrn, pVga, VGA_SR_MODE); - inb(0x3c8); - outb(0x3c6, 0xff); - vgaHWProtect(pScrn, FALSE); } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/Imakefile b/xc/programs/Xserver/hw/xfree86/drivers/ati/Imakefile index dae4811c9..68694423a 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/Imakefile @@ -1,6 +1,6 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/Imakefile,v 1.32 2001/05/18 20:22:28 tsi Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/Imakefile,v 1.36 2002/01/16 16:22:25 tsi Exp $ XCOMM -XCOMM Copyright 1997 through 2001 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org +XCOMM Copyright 1997 through 2002 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org XCOMM XCOMM Permission to use, copy, modify, distribute, and sell this software and XCOMM its documentation for any purpose is hereby granted without fee, provided @@ -121,31 +121,54 @@ CPIOOBJS2 = atibank.o ativga.o atiwonder.o atiwonderio.o #endif -DEFINES = $(CPIODEFINES) $(NONPCIDEFINES) $(DRIDEFINES) +/* + * For now, disable DGA on SPARC. + */ +#if defined(SparcArchitecture) +# undef ATIAvoidDGA +# define ATIAvoidDGA YES +#endif + +#ifndef ATIAvoidDGA +#define ATIAVoidDGA NO +#endif + +#if ATIAvoidDGA + +DGADEFINES = -DAVOID_DGA + +#else + +DGASRCS2 = atidga.c +DGAOBJS2 = atidga.o + +#endif + +DEFINES = $(CPIODEFINES) $(DGADEFINES) $(NONPCIDEFINES) $(DRIDEFINES) SRCS1 = ati.c atiadapter.c atibus.c atichip.c atiident.c atioption.c \ - atiprobe.c atividmem.c $(MODSRCS1) $(CPIOSRCS1) \ + atiprobe.c atividmem.c $(CPIOSRCS1) $(MODSRCS1) \ radeon_probe.c r128_probe.c SRCS2 = atiaccel.c atiadjust.c aticlock.c aticonfig.c aticonsole.c \ - aticursor.c atidac.c atidga.c atidsp.c atilock.c atimach64.c \ - atimach64io.c atimode.c atipreinit.c atiprint.c atiscreen.c atiutil.c \ - ativalid.c atixv.c $(MODSRCS2) $(CPIOSRCS2) -SRCS3 = r128_accel.c r128_cursor.c r128_dga.c r128_driver.c r128_video.c \ - $(MODSRCS3) $(DRISRCS3) + aticursor.c atidac.c atidsp.c atilock.c atimach64.c atimach64io.c \ + atimode.c atipreinit.c atiprint.c atirgb514.c atiscreen.c atiutil.c \ + ativalid.c atixv.c $(CPIOSRCS2) $(DGASRCS2) $(MODSRCS2) +SRCS3 = r128_accel.c r128_cursor.c r128_dga.c r128_driver.c \ + r128_video.c $(DRISRCS3) $(MODSRCS3) SRCS4 = radeon_accel.c radeon_cursor.c radeon_dga.c radeon_driver.c \ - radeon_video.c $(MODSRCS4) $(DRISRCS4) + radeon_video.c $(DRISRCS4) $(MODSRCS4) OBJS1 = ati.o atiadapter.o atibus.o atichip.o atiident.o atioption.o \ - atiprobe.o atividmem.o $(MODOBJS1) $(CPIOOBJS1) \ + atiprobe.o atividmem.o $(CPIOOBJS1) $(MODOBJS1) \ radeon_probe.o r128_probe.o OBJS2 = atiaccel.o atiadjust.o aticlock.o aticonfig.o aticonsole.o \ - aticursor.o atidac.o atidga.o atidsp.o atilock.o atimach64.o \ - atimach64io.o atimode.o atipreinit.o atiprint.o atiscreen.o atiutil.o \ - ativalid.o atixv.o $(MODOBJS2) $(CPIOOBJS2) -OBJS3 = r128_accel.o r128_cursor.o r128_dga.o r128_driver.o r128_video.o \ - $(MODOBJS3) $(DRIOBJS3) + aticursor.o atidac.o atidsp.o atilock.o atimach64.o atimach64io.o \ + atimode.o atipreinit.o atiprint.o atirgb514.o atiscreen.o atiutil.o \ + ativalid.o atixv.o $(CPIOOBJS2) $(DGAOBJS2) $(MODOBJS2) +OBJS3 = r128_accel.o r128_cursor.o r128_dga.o r128_driver.o \ + r128_video.o $(DRIOBJS3) $(MODOBJS3) OBJS4 = radeon_accel.o radeon_cursor.o radeon_dga.o radeon_driver.o \ - radeon_video.o $(MODOBJS4) $(DRIOBJS4) + radeon_video.o $(DRIOBJS4) $(MODOBJS4) SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4) OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) @@ -192,7 +215,6 @@ DependTarget() InstallDriverSDKNonExecFile(Imakefile,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(ati.c,$(DRIVERSDKDIR)/drivers/ati) -InstallDriverSDKNonExecFile(ati.cpp,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(ati.h,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(atiaccel.c,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(atiaccel.h,$(DRIVERSDKDIR)/drivers/ati) @@ -249,6 +271,8 @@ InstallDriverSDKNonExecFile(atiprobe.c,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(atiprobe.h,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(atiproto.h,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(atiregs.h,$(DRIVERSDKDIR)/drivers/ati) +InstallDriverSDKNonExecFile(atirgb514.c,$(DRIVERSDKDIR)/drivers/ati) +InstallDriverSDKNonExecFile(atirgb514.h,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(atiscreen.c,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(atiscreen.h,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(atistruct.h,$(DRIVERSDKDIR)/drivers/ati) @@ -270,7 +294,6 @@ InstallDriverSDKNonExecFile(atiwonderio.h,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(atixv.c,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(atixv.h,$(DRIVERSDKDIR)/drivers/ati) -InstallDriverSDKNonExecFile(r128.cpp,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(r128.h,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(r128_accel.c,$(DRIVERSDKDIR)/drivers/ati) InstallDriverSDKNonExecFile(r128_cursor.c,$(DRIVERSDKDIR)/drivers/ati) diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c index 662917d88..a516cfe38 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c @@ -1,6 +1,6 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c,v 1.6 2001/05/25 02:44:35 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.c,v 1.8 2002/01/16 16:22:26 tsi Exp $ */ /* - * Copyright 2000 through 2001 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org + * Copyright 2000 through 2002 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -21,6 +21,8 @@ * PERFORMANCE OF THIS SOFTWARE. */ +#ifndef AVOID_DGA + #include "ati.h" #include "atiadjust.h" #include "atichip.h" @@ -473,3 +475,5 @@ ATIDGAInit return DGAInit(pScreen, &pATI->ATIDGAFunctions, pATI->pDGAMode, pATI->nDGAMode); } + +#endif /* AVOID_DGA */ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.h index 19bb85f49..3751ee196 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.h @@ -1,6 +1,6 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.h,v 1.3 2001/01/06 20:58:05 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atidga.h,v 1.5 2002/01/16 16:22:26 tsi Exp $ */ /* - * Copyright 2000 through 2001 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org + * Copyright 2000 through 2002 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -24,6 +24,8 @@ #ifndef ___ATIDGA_H___ #define ___ATIDGA_H___ 1 +#ifndef AVOID_DGA + #include "atipriv.h" #include "atiproto.h" @@ -31,4 +33,6 @@ extern Bool ATIDGAInit FunctionPrototype((ScrnInfoPtr, ScreenPtr, ATIPtr)); +#endif /* AVOID_DGA */ + #endif /* ___ATIDGA_H___ */ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h index 3cf340f74..0a862472d 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h @@ -1,6 +1,6 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h,v 1.11 2001/07/21 13:50:22 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64io.h,v 1.13 2002/01/16 16:22:27 tsi Exp $ */ /* - * Copyright 2000 through 2001 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org + * Copyright 2000 through 2002 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -85,11 +85,11 @@ * accessed (nor by what). */ -#define inm(_Register) \ - MMIO_IN32(pATI->pBlock[GetBits(_Register, BLOCK_SELECT)], \ +#define inm(_Register) \ + MMIO_IN32(pATI->pBlock[GetBits(_Register, BLOCK_SELECT)], \ (_Register) & MM_IO_SELECT) -#define outm(_Register, _Value) \ - MMIO_OUT32(pATI->pBlock[GetBits(_Register, BLOCK_SELECT)], \ +#define outm(_Register, _Value) \ + MMIO_OUT32(pATI->pBlock[GetBits(_Register, BLOCK_SELECT)], \ (_Register) & MM_IO_SELECT, _Value) #ifdef AVOID_CPIO @@ -99,11 +99,11 @@ # define outr(_Register, _Value) \ MMIO_OUT32(pATI->pBlock[0], (_Register) & MM_IO_SELECT, _Value) -# define in8(_Register) \ - MMIO_IN8(pATI->pBlock[0], \ +# define in8(_Register) \ + MMIO_IN8(pATI->pBlock[0], \ (_Register) & (MM_IO_SELECT | IO_BYTE_SELECT)) -# define out8(_Register, _Value) \ - MMIO_OUT8(pATI->pBlock[0], \ +# define out8(_Register, _Value) \ + MMIO_OUT8(pATI->pBlock[0], \ (_Register) & (MM_IO_SELECT | IO_BYTE_SELECT), _Value) /* Cause a cpp syntax error if any of these are used */ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/atimodule.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/atimodule.h index 7dcbc079c..21310bb48 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/atimodule.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/atimodule.h @@ -1,6 +1,6 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atimodule.h,v 1.7 2001/01/06 20:58:06 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atimodule.h,v 1.8 2002/01/16 16:22:27 tsi Exp $ */ /* - * Copyright 1997 through 2001 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org + * Copyright 1997 through 2002 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128.h index 126957d2c..e5b0dc34e 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128.h,v 1.14 2001/05/25 02:44:36 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128.h,v 1.17 2001/10/02 19:44:01 herrb Exp $ */ /* * Copyright 1999, 2000 ATI Technologies Inc., Markham, Ontario, * Precision Insight, Inc., Cedar Park, Texas, and @@ -47,6 +47,9 @@ #include "xaa.h" #include "xf86Cursor.h" + /* DDC support */ +#include "xf86DDC.h" + /* Xv support */ #include "xf86xv.h" @@ -143,6 +146,7 @@ typedef struct { CARD32 fp_vert_stretch; CARD32 lvds_gen_cntl; CARD32 tmds_crc; + CARD32 tmds_transmitter_cntl; /* Computed values for PLL */ CARD32 dot_clock_freq; @@ -211,6 +215,12 @@ typedef struct { /* Computed values for FPs */ int PanelXRes; int PanelYRes; + int HOverPlus; + int HSyncWidth; + int HBlank; + int VOverPlus; + int VSyncWidth; + int VBlank; int PanelPwrDly; R128PLLRec pll; @@ -375,6 +385,12 @@ typedef struct { int videoKey; Bool showCache; OptionInfoPtr Options; + + Bool isDFP; + Bool isPro2; + I2CBusPtr pI2CBus; + CARD32 DDCReg; + } R128InfoRec, *R128InfoPtr; #define R128WaitForFifo(pScrn, entries) \ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_accel.c index fb05ed8f1..6146a7a7c 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_accel.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_accel.c,v 1.11 2001/08/09 19:14:12 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_accel.c,v 1.13 2001/10/02 19:44:01 herrb Exp $ */ /* * Copyright 1999, 2000 ATI Technologies Inc., Markham, Ontario, * Precision Insight, Inc., Cedar Park, Texas, and @@ -84,6 +84,7 @@ #include "r128_reg.h" #include "r128_sarea.h" #ifdef XF86DRI +#include "r128_sarea.h" #define _XF86DRI_SERVER_ #include "r128_dri.h" #endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dga.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dga.c index 3e3fc97b7..caed508da 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dga.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dga.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dga.c,v 1.5 2001/05/25 02:44:36 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dga.c,v 1.6 2001/11/06 15:53:10 alanh Exp $ */ /* * Authors: * Ove Kĺven <ovek@transgaming.com>, @@ -248,8 +248,8 @@ R128_SetMode( pScrn->currentMode = info->CurrentLayout.mode; - R128SwitchMode(indx, pScrn->currentMode, 0); - R128AdjustFrame(indx, 0, 0, 0); + pScrn->SwitchMode(indx, pScrn->currentMode, 0); + pScrn->AdjustFrame(indx, 0, 0, 0); info->DGAactive = FALSE; } else { if(!info->DGAactive) { /* save the old parameters */ @@ -267,7 +267,7 @@ R128_SetMode( : pMode->depth); /* R128ModeInit() will set the mode field */ - R128SwitchMode(indx, pMode->mode, 0); + pScrn->SwitchMode(indx, pMode->mode, 0); } return TRUE; @@ -293,7 +293,7 @@ R128_SetViewport( ){ R128InfoPtr info = R128PTR(pScrn); - R128AdjustFrame(pScrn->pScreen->myNum, x, y, flags); + pScrn->AdjustFrame(pScrn->pScreen->myNum, x, y, flags); info->DGAViewportStatus = 0; /* FIXME */ } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c index de858bf24..c51338f1a 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c,v 1.17 2001/08/18 17:25:51 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c,v 1.22 2001/12/28 15:49:11 dawes Exp $ */ /* * Copyright 1999, 2000 ATI Technologies Inc., Markham, Ontario, * Precision Insight, Inc., Cedar Park, Texas, and @@ -58,6 +58,8 @@ /* ?? Alpha - this may need to be a variable to handle UP1x00 vs TITAN */ #if defined(__alpha__) # define DRM_PAGE_SIZE 8192 +#elif defined(__ia64__) +# define DRM_PAGE_SIZE getpagesize() #else # define DRM_PAGE_SIZE 4096 #endif @@ -656,7 +658,7 @@ static Bool R128DRIPciInit(R128InfoPtr info, ScreenPtr pScreen) (unsigned long)info->ring); xf86DrvMsg(pScreen->myNum, X_INFO, "[pci] Ring contents 0x%08lx\n", - *(unsigned long *)info->ring); + *(unsigned long *)(pointer)info->ring); if (drmAddMap(info->drmFD, info->ringReadOffset, info->ringReadMapSize, DRM_SCATTER_GATHER, flags, &info->ringReadPtrHandle) < 0) { @@ -679,7 +681,7 @@ static Bool R128DRIPciInit(R128InfoPtr info, ScreenPtr pScreen) (unsigned long)info->ringReadPtr); xf86DrvMsg(pScreen->myNum, X_INFO, "[pci] Ring read ptr contents 0x%08lx\n", - *(unsigned long *)info->ringReadPtr); + *(unsigned long *)(pointer)info->ringReadPtr); if (drmAddMap(info->drmFD, info->bufStart, info->bufMapSize, DRM_SCATTER_GATHER, 0, &info->bufHandle) < 0) { @@ -702,12 +704,15 @@ static Bool R128DRIPciInit(R128InfoPtr info, ScreenPtr pScreen) (unsigned long)info->buf); xf86DrvMsg(pScreen->myNum, X_INFO, "[pci] Vertex/indirect buffers contents 0x%08lx\n", - *(unsigned long *)info->buf); + *(unsigned long *)(pointer)info->buf); switch (info->Chipset) { case PCI_CHIP_RAGE128LE: case PCI_CHIP_RAGE128RE: case PCI_CHIP_RAGE128RK: + case PCI_CHIP_RAGE128PD: + case PCI_CHIP_RAGE128PP: + case PCI_CHIP_RAGE128PR: /* This is a PCI card, do nothing */ break; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_driver.c index f7e4314bb..2156a4203 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_driver.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_driver.c,v 1.38 2001/08/18 17:25:51 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_driver.c,v 1.57 2002/01/04 21:22:26 tsi Exp $ */ /* * Copyright 1999, 2000 ATI Technologies Inc., Markham, Ontario, * Precision Insight, Inc., Cedar Park, Texas, and @@ -194,7 +194,7 @@ static const char *vgahwSymbols[] = { static const char *fbdevHWSymbols[] = { "fbdevHWInit", "fbdevHWUseBuildinMode", - + "fbdevHWGetLineLength", "fbdevHWGetVidmem", /* colormap */ @@ -220,7 +220,14 @@ static const char *fbdevHWSymbols[] = { static const char *ddcSymbols[] = { "xf86PrintEDID", - "xf86SetDDCproperties", + "xf86DoEDID_DDC1", + "xf86DoEDID_DDC2", + NULL +}; + +static const char *i2cSymbols[] = { + "xf86CreateI2CBusRec", + "xf86I2CBusInit", NULL }; @@ -461,8 +468,10 @@ static void R128Blank(ScrnInfoPtr pScrn) { R128InfoPtr info = R128PTR(pScrn); unsigned char *R128MMIO = info->MMIO; - - OUTREGP(R128_CRTC_EXT_CNTL, R128_CRTC_DISPLAY_DIS, ~R128_CRTC_DISPLAY_DIS); + if(info->isDFP) + OUTREGP(R128_FP_GEN_CNTL, R128_FP_BLANK_DIS, ~R128_FP_BLANK_DIS); + else + OUTREGP(R128_CRTC_EXT_CNTL, R128_CRTC_DISPLAY_DIS, ~R128_CRTC_DISPLAY_DIS); } /* Unblank screen. */ @@ -471,7 +480,10 @@ static void R128Unblank(ScrnInfoPtr pScrn) R128InfoPtr info = R128PTR(pScrn); unsigned char *R128MMIO = info->MMIO; - OUTREGP(R128_CRTC_EXT_CNTL, 0, ~R128_CRTC_DISPLAY_DIS); + if(info->isDFP) + OUTREGP(R128_FP_GEN_CNTL, 0, ~R128_FP_BLANK_DIS); + else + OUTREGP(R128_CRTC_EXT_CNTL, 0, ~R128_CRTC_DISPLAY_DIS); } /* Compute log base 2 of val. */ @@ -604,6 +616,13 @@ static Bool R128GetBIOSParameters(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) } } + if (!info->PanelXRes || !info->PanelYRes) { + info->HasPanelRegs = FALSE; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Can't determine panel dimensions, and none specified. \ + Disabling programming of FP registers.\n"); + } + return TRUE; } @@ -815,6 +834,7 @@ static Bool R128PreInitConfig(ScrnInfoPtr pScrn) from = X_PROBED; info->LinearAddr = info->PciInfo->memBase[0] & 0xfc000000; + pScrn->memPhysBase = info->LinearAddr; if (dev->MemBase) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Linear address override, using 0x%08x instead of 0x%08x\n", @@ -872,7 +892,20 @@ static Bool R128PreInitConfig(ScrnInfoPtr pScrn) 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 { + info->isDFP = FALSE; + info->isPro2 = FALSE; switch (info->Chipset) { + /* R128 Pro and Pro2 can have DFP, we will deal with it. + No support for dual-head/xinerama yet. + M3 can also have DFP, no support for now */ + case PCI_CHIP_RAGE128TF: + case PCI_CHIP_RAGE128TL: + case PCI_CHIP_RAGE128TR: info->isPro2 = TRUE; + case PCI_CHIP_RAGE128PD: + case PCI_CHIP_RAGE128PF: + case PCI_CHIP_RAGE128PP: + case PCI_CHIP_RAGE128PR: info->isDFP = TRUE; break; + case PCI_CHIP_RAGE128LE: case PCI_CHIP_RAGE128LF: case PCI_CHIP_RAGE128MF: @@ -883,13 +916,6 @@ static Bool R128PreInitConfig(ScrnInfoPtr pScrn) case PCI_CHIP_RAGE128RK: case PCI_CHIP_RAGE128RL: case PCI_CHIP_RAGE128SM: - case PCI_CHIP_RAGE128PD: - case PCI_CHIP_RAGE128PF: - case PCI_CHIP_RAGE128PR: - /* R128 ULTRA can have dual-head and DFP, not support yet */ - case PCI_CHIP_RAGE128TF: - case PCI_CHIP_RAGE128TL: - case PCI_CHIP_RAGE128TR: default: info->HasPanelRegs = FALSE; break; } } @@ -1023,6 +1049,7 @@ static Bool R128PreInitConfig(ScrnInfoPtr pScrn) case PCI_CHIP_RAGE128LE: case PCI_CHIP_RAGE128RE: case PCI_CHIP_RAGE128RK: + case PCI_CHIP_RAGE128PP: case PCI_CHIP_RAGE128PR: case PCI_CHIP_RAGE128PD: info->IsPCI = TRUE; break; case PCI_CHIP_RAGE128LF: @@ -1060,8 +1087,7 @@ static Bool R128PreInitDDC(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) xf86LoaderReqSymLists(vbeSymbols,NULL); pVbe = VBEInit(pInt10,info->pEnt->index); if (!pVbe) return FALSE; - - xf86SetDDCproperties(pScrn,xf86PrintEDID(vbeDoEDID(pVbe,NULL))); + xf86SetDDCproperties(pScrn,xf86PrintEDID(vbeDoEDID(pVbe,NULL))); vbeFree(pVbe); return TRUE; } else @@ -1078,6 +1104,359 @@ static Bool R128PreInitGamma(ScrnInfoPtr pScrn) return TRUE; } +static void +R128I2CGetBits(I2CBusPtr b, int *Clock, int *data) +{ + ScrnInfoPtr pScrn = xf86Screens[b->scrnIndex]; + R128InfoPtr info = R128PTR(pScrn); + unsigned long val; + unsigned char *R128MMIO = info->MMIO; + + /* Get the result. */ + val = INREG(info->DDCReg); + *Clock = (val & R128_GPIO_MONID_Y_3) != 0; + *data = (val & R128_GPIO_MONID_Y_0) != 0; + +} + +static void +R128I2CPutBits(I2CBusPtr b, int Clock, int data) +{ + ScrnInfoPtr pScrn = xf86Screens[b->scrnIndex]; + R128InfoPtr info = R128PTR(pScrn); + unsigned long val; + unsigned char *R128MMIO = info->MMIO; + + val = INREG(info->DDCReg) + & ~(CARD32)(R128_GPIO_MONID_EN_0 | R128_GPIO_MONID_EN_3); + val |= (Clock ? 0:R128_GPIO_MONID_EN_3); + val |= (data ? 0:R128_GPIO_MONID_EN_0); + OUTREG(info->DDCReg, val); +} + + +static Bool +R128I2cInit(ScrnInfoPtr pScrn) +{ + R128InfoPtr info = R128PTR(pScrn); + if ( xf86LoadSubModule(pScrn, "i2c") ) + xf86LoaderReqSymLists(i2cSymbols,NULL); + else{ + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to load i2c module\n"); + return FALSE; + } + + info->pI2CBus = xf86CreateI2CBusRec(); + if(!info->pI2CBus) return FALSE; + + info->pI2CBus->BusName = "DDC"; + info->pI2CBus->scrnIndex = pScrn->scrnIndex; + info->DDCReg = R128_GPIO_MONID; + info->pI2CBus->I2CPutBits = R128I2CPutBits; + info->pI2CBus->I2CGetBits = R128I2CGetBits; + info->pI2CBus->AcknTimeout = 5; + + if (!xf86I2CBusInit(info->pI2CBus)) { + return FALSE; + } + return TRUE; +} + +/* return TRUE is a DFP is indeed connected to a DVI port */ +static Bool R128GetDFPInfo(ScrnInfoPtr pScrn) +{ + R128InfoPtr info = R128PTR(pScrn); + int i; + xf86MonPtr MonInfo = NULL; + xf86MonPtr ddc; + unsigned char *R128MMIO = info->MMIO; + + if(!R128I2cInit(pScrn)){ + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "I2C initialization failed!\n"); + } + + OUTREG(info->DDCReg, (INREG(info->DDCReg) + | R128_GPIO_MONID_MASK_0 | R128_GPIO_MONID_MASK_3)); + + OUTREG(info->DDCReg, INREG(info->DDCReg) + & ~(CARD32)(R128_GPIO_MONID_A_0 | R128_GPIO_MONID_A_3)); + + MonInfo = xf86DoEDID_DDC2(pScrn->scrnIndex, info->pI2CBus); + if(!MonInfo) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "No DFP detected\n"); + return FALSE; + } + xf86SetDDCproperties(pScrn, MonInfo); + ddc = pScrn->monitor->DDC; + + for(i=0; i<4; i++) + { + if(ddc->det_mon[i].type == 0) + { + info->PanelXRes = + ddc->det_mon[i].section.d_timings.h_active; + info->PanelYRes = + ddc->det_mon[i].section.d_timings.v_active; + + info->HOverPlus = + ddc->det_mon[i].section.d_timings.h_sync_off; + info->HSyncWidth = + ddc->det_mon[i].section.d_timings.h_sync_width; + info->HBlank = + ddc->det_mon[i].section.d_timings.h_blanking; + info->VOverPlus = + ddc->det_mon[i].section.d_timings.v_sync_off; + info->VSyncWidth = + ddc->det_mon[i].section.d_timings.v_sync_width; + info->VBlank = + ddc->det_mon[i].section.d_timings.v_blanking; + } + } + return TRUE; +} + + +static void R128SetSyncRangeFromEdid(ScrnInfoPtr pScrn, int flag) +{ + int i; + xf86MonPtr ddc = pScrn->monitor->DDC; + if(flag) /*HSync*/ + { + for(i=0; i<4; i++) + { + if(ddc->det_mon[i].type == DS_RANGES) + { + pScrn->monitor->nHsync = 1; + pScrn->monitor->hsync[0].lo = + ddc->det_mon[i].section.ranges.min_h; + pScrn->monitor->hsync[0].hi = + ddc->det_mon[i].section.ranges.max_h; + return; + } + } + /*if no sync ranges detected in detailed timing table, + let's try to derive them from supported VESA modes + Are we doing too much here!!!? + **/ + i = 0; + if(ddc->timings1.t1 & 0x02) /*800x600@56*/ + { + pScrn->monitor->hsync[i].lo = + pScrn->monitor->hsync[i].hi = 35.2; + i++; + } + if(ddc->timings1.t1 & 0x04) /*640x480@75*/ + { + pScrn->monitor->hsync[i].lo = + pScrn->monitor->hsync[i].hi = 37.5; + i++; + } + if((ddc->timings1.t1 & 0x08) || (ddc->timings1.t1 & 0x01)) + { + pScrn->monitor->hsync[i].lo = + pScrn->monitor->hsync[i].hi = 37.9; + i++; + } + if(ddc->timings1.t2 & 0x40) + { + pScrn->monitor->hsync[i].lo = + pScrn->monitor->hsync[i].hi = 46.9; + i++; + } + if((ddc->timings1.t2 & 0x80) || (ddc->timings1.t2 & 0x08)) + { + pScrn->monitor->hsync[i].lo = + pScrn->monitor->hsync[i].hi = 48.1; + i++; + } + if(ddc->timings1.t2 & 0x04) + { + pScrn->monitor->hsync[i].lo = + pScrn->monitor->hsync[i].hi = 56.5; + i++; + } + if(ddc->timings1.t2 & 0x02) + { + pScrn->monitor->hsync[i].lo = + pScrn->monitor->hsync[i].hi = 60.0; + i++; + } + if(ddc->timings1.t2 & 0x01) + { + pScrn->monitor->hsync[i].lo = + pScrn->monitor->hsync[i].hi = 64.0; + i++; + } + pScrn->monitor->nHsync = i; + } + else /*Vrefresh*/ + { + for(i=0; i<4; i++) + { + if(ddc->det_mon[i].type == DS_RANGES) + { + pScrn->monitor->nVrefresh = 1; + pScrn->monitor->vrefresh[0].lo = + ddc->det_mon[i].section.ranges.min_v; + pScrn->monitor->vrefresh[0].hi = + ddc->det_mon[i].section.ranges.max_v; + return; + } + } + i = 0; + if(ddc->timings1.t1 & 0x02) /*800x600@56*/ + { + pScrn->monitor->vrefresh[i].lo = + pScrn->monitor->vrefresh[i].hi = 56; + i++; + } + if((ddc->timings1.t1 & 0x01) || (ddc->timings1.t2 & 0x08)) + { + pScrn->monitor->vrefresh[i].lo = + pScrn->monitor->vrefresh[i].hi = 60; + i++; + } + if(ddc->timings1.t2 & 0x04) + { + pScrn->monitor->vrefresh[i].lo = + pScrn->monitor->vrefresh[i].hi = 70; + i++; + } + if((ddc->timings1.t1 & 0x08) || (ddc->timings1.t2 & 0x80)) + { + pScrn->monitor->vrefresh[i].lo = + pScrn->monitor->vrefresh[i].hi = 72; + i++; + } + if((ddc->timings1.t1 & 0x04) || (ddc->timings1.t2 & 0x40) + || (ddc->timings1.t2 & 0x02) || (ddc->timings1.t2 & 0x01)) + { + pScrn->monitor->vrefresh[i].lo = + pScrn->monitor->vrefresh[i].hi = 75; + i++; + } + pScrn->monitor->nVrefresh = i; + } +} + +/*********** + xfree's xf86ValidateModes routine deosn't work well with DFPs + here is our own validation routine. All modes between + 640<=XRes<=MaxRes and 480<=YRes<=MaxYRes will be permitted. + NOTE: RageProII doesn't support rmx, can only work with the + standard modes the monitor can support (scale). +************/ + +static int R128ValidateFPModes(ScrnInfoPtr pScrn) +{ + int i, j, count=0, width, height; + R128InfoPtr info = R128PTR(pScrn); + DisplayModePtr last = NULL, new = NULL, first = NULL; + xf86MonPtr ddc; + + /* Free any allocated modes during configuration. We don't need them*/ + while (pScrn->modes) + { + xf86DeleteMode(&pScrn->modes, pScrn->modes); + } + while (pScrn->modePool) + { + xf86DeleteMode(&pScrn->modePool, pScrn->modePool); + } + + pScrn->virtualX = pScrn->display->virtualX; + pScrn->virtualY = pScrn->display->virtualY; + + /* If no mode specified in config, we use native resolution*/ + if(!pScrn->display->modes[0]) + { + pScrn->display->modes[0] = xnfalloc(16); + sprintf(pScrn->display->modes[0], "%dx%d", + info->PanelXRes, info->PanelYRes); + } + + for(i=0; pScrn->display->modes[i] != NULL; i++) + { + if (sscanf(pScrn->display->modes[i], "%dx%d", &width, &height) == 2) + { + + if(width < 640 || width > info->PanelXRes || + height < 480 || height > info->PanelYRes) + { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Mode %s is out of range.\n" + "Valid mode should be between 640x480-%dx%d\n", + pScrn->display->modes[i], info->PanelXRes, info->PanelYRes); + continue; + } + + new = xnfcalloc(1, sizeof(DisplayModeRec)); + new->prev = last; + new->name = xnfalloc(strlen(pScrn->display->modes[i]) + 1); + strcpy(new->name, pScrn->display->modes[i]); + new->HDisplay = new->CrtcHDisplay = width; + new->VDisplay = new->CrtcVDisplay = height; + + ddc = pScrn->monitor->DDC; + for(j=0; j<DET_TIMINGS; j++) + { + /*We use native mode clock only*/ + if(ddc->det_mon[j].type == 0){ + new->Clock = ddc->det_mon[j].section.d_timings.clock / 1000; + break; + } + } + + if(new->prev) new->prev->next = new; + last = new; + if(!first) first = new; + pScrn->display->virtualX = + pScrn->virtualX = MAX(pScrn->virtualX, width); + pScrn->display->virtualY = + pScrn->virtualY = MAX(pScrn->virtualY, height); + count++; + } + else + { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Mode name %s is invalid\n", pScrn->display->modes[i]); + continue; + } + } + + if(last) + { + last->next = first; + first->prev = last; + pScrn->modes = first; + + /*FIXME: May need to validate line pitch here*/ + { + int dummy = 0; + switch(pScrn->depth / 8) + { + case 1: + dummy = 128 - pScrn->virtualX % 128; + break; + case 2: + dummy = 32 - pScrn->virtualX % 32; + break; + case 3: + case 4: + dummy = 16 - pScrn->virtualX % 16; + } + pScrn->displayWidth = pScrn->virtualX + dummy; + } + + } + + return count; +} + + /* This is called by R128PreInit to validate modes and compute parameters for all of the valid modes. */ static Bool R128PreInitModes(ScrnInfoPtr pScrn) @@ -1090,29 +1469,67 @@ static Bool R128PreInitModes(ScrnInfoPtr pScrn) const char *Sym = NULL; #endif + if(info->isDFP) { + R128MapMem(pScrn); + /* validate if DFP really connected. */ + if(!R128GetDFPInfo(pScrn)) { + info->isDFP = FALSE; + } else if(!info->isPro2) { + /* RageProII doesn't support rmx, we can't use native-mode + stretching for other non-native modes. It will rely on + whatever VESA modes monitor can support. */ + modesFound = R128ValidateFPModes(pScrn); + if(modesFound < 1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "No valid mode found for this DFP/LCD\n"); + R128UnmapMem(pScrn); + return FALSE; + + } + } + info->BIOSDisplay = R128_BIOS_DISPLAY_FP; + R128UnmapMem(pScrn); + } + + if(!info->isDFP || info->isPro2) { /* 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; - if (info->HasPanelRegs) { - clockRanges->interlaceAllowed = FALSE; - clockRanges->doubleScanAllowed = FALSE; - } else { - clockRanges->interlaceAllowed = TRUE; - clockRanges->doubleScanAllowed = TRUE; - } - - modesFound = xf86ValidateModes(pScrn, + 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; + if (info->HasPanelRegs || info->isDFP) { + clockRanges->interlaceAllowed = FALSE; + clockRanges->doubleScanAllowed = FALSE; + } else { + clockRanges->interlaceAllowed = TRUE; + clockRanges->doubleScanAllowed = TRUE; + } + + if(pScrn->monitor->DDC) { + /*if we still don't know sync range yet, let's try EDID. + Note that, since we can have dual heads, the Xconfigurator + may not be able to probe both monitors correctly through + vbe probe function (R128ProbeDDC). Here we provide an + additional way to auto-detect sync ranges if they haven't + been added to XF86Config manually. + **/ + if(pScrn->monitor->nHsync <= 0) + R128SetSyncRangeFromEdid(pScrn, 1); + if(pScrn->monitor->nVrefresh <= 0) + R128SetSyncRangeFromEdid(pScrn, 0); + } + + + modesFound = xf86ValidateModes(pScrn, pScrn->monitor->Modes, pScrn->display->modes, clockRanges, NULL, /* linePitches */ 8 * 64, /* minPitch */ 8 * 1024, /* maxPitch */ - 64 * pScrn->bitsPerPixel, /* pitchInc */ + 8 * 64, /* pitchInc */ 128, /* minHeight */ 2048, /* maxHeight */ pScrn->display->virtualX, @@ -1120,23 +1537,24 @@ static Bool R128PreInitModes(ScrnInfoPtr pScrn) 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 && info->FBDev) { + fbdevHWUseBuildinMode(pScrn); + pScrn->displayWidth = fbdevHWGetLineLength(pScrn)/(pScrn->bitsPerPixel/8); + 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; + 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); } - xf86SetCrtcForModes(pScrn, 0); + /* Set DPI */ pScrn->currentMode = pScrn->modes; xf86PrintModes(pScrn); - /* Set DPI */ xf86SetDpi(pScrn, 0, 0); /* Get ScreenInit function */ @@ -1319,6 +1737,7 @@ R128ProbeDDC(ScrnInfoPtr pScrn, int indx) if (xf86LoadSubModule(pScrn, "vbe")) { pVbe = VBEInit(NULL,indx); ConfiguredMonitor = vbeDoEDID(pVbe, NULL); + vbeFree(pVbe); } } @@ -1348,9 +1767,8 @@ Bool R128PreInit(ScrnInfoPtr pScrn, int flags) #endif fbdevHWSymbols, vbeSymbols, - int10Symbols, - ddcSymbols, - /* i2csymbols, */ + /* ddcsymbols, */ + i2cSymbols, /* shadowSymbols, */ NULL); @@ -1464,6 +1882,10 @@ Bool R128PreInit(ScrnInfoPtr pScrn, int flags) if (pInt10) xf86FreeInt10(pInt10); + xf86DrvMsg(pScrn->scrnIndex, X_NOTICE, + "For information on using the multimedia capabilities\n of this" + " adapter, please see http://gatos.sf.net.\n"); + return TRUE; fail: @@ -1495,7 +1917,7 @@ static void R128LoadPalette(ScrnInfoPtr pScrn, int numColors, unsigned char r, g, b; /* Select palette 0 (main CRTC) if using FP-enabled chip */ - if (info->HasPanelRegs) PAL_SELECT(0); + if (info->HasPanelRegs || info->isDFP) PAL_SELECT(0); if (info->CurrentLayout.depth == 15) { /* 15bpp mode. This sends 32 values. */ @@ -2019,6 +2441,8 @@ static void R128RestoreCommonRegisters(ScrnInfoPtr pScrn, R128SavePtr restore) R128InfoPtr info = R128PTR(pScrn); unsigned char *R128MMIO = info->MMIO; + OUTREG(R128_FP_GEN_CNTL, restore->fp_gen_cntl | R128_FP_BLANK_DIS); + OUTREG(R128_OVR_CLR, restore->ovr_clr); OUTREG(R128_OVR_WID_LEFT_RIGHT, restore->ovr_wid_left_right); OUTREG(R128_OVR_WID_TOP_BOTTOM, restore->ovr_wid_top_bottom); @@ -2065,16 +2489,19 @@ static void R128RestoreFPRegisters(ScrnInfoPtr pScrn, R128SavePtr restore) unsigned char *R128MMIO = info->MMIO; CARD32 tmp; - OUTREG(R128_CRTC2_GEN_CNTL, restore->crtc2_gen_cntl); + + /*OUTREG(R128_CRTC2_GEN_CNTL, restore->crtc2_gen_cntl);*/ + OUTREG(R128_FP_HORZ_STRETCH, restore->fp_horz_stretch); + OUTREG(R128_FP_VERT_STRETCH, restore->fp_vert_stretch); OUTREG(R128_FP_CRTC_H_TOTAL_DISP, restore->fp_crtc_h_total_disp); OUTREG(R128_FP_CRTC_V_TOTAL_DISP, restore->fp_crtc_v_total_disp); - OUTREG(R128_FP_GEN_CNTL, restore->fp_gen_cntl); OUTREG(R128_FP_H_SYNC_STRT_WID, restore->fp_h_sync_strt_wid); - OUTREG(R128_FP_HORZ_STRETCH, restore->fp_horz_stretch); - OUTREG(R128_FP_PANEL_CNTL, restore->fp_panel_cntl); OUTREG(R128_FP_V_SYNC_STRT_WID, restore->fp_v_sync_strt_wid); - OUTREG(R128_FP_VERT_STRETCH, restore->fp_vert_stretch); OUTREG(R128_TMDS_CRC, restore->tmds_crc); + OUTREG(R128_FP_PANEL_CNTL, restore->fp_panel_cntl); + OUTREG(R128_FP_GEN_CNTL, restore->fp_gen_cntl & ~(CARD32)R128_FP_BLANK_DIS); + + if(info->isDFP) return; tmp = INREG(R128_LVDS_GEN_CNTL); if ((tmp & (R128_LVDS_ON | R128_LVDS_BLON)) == @@ -2172,7 +2599,7 @@ static void R128RestorePalette(ScrnInfoPtr pScrn, R128SavePtr restore) if (!restore->palette_valid) return; /* Select palette 0 (main CRTC) if using FP-enabled chip */ - if (info->HasPanelRegs) PAL_SELECT(0); + if (info->HasPanelRegs || info->isDFP) PAL_SELECT(0); OUTPAL_START(0); for (i = 0; i < 256; i++) OUTPAL_NEXT_CARD32(restore->palette[i]); @@ -2186,11 +2613,13 @@ static void R128RestoreMode(ScrnInfoPtr pScrn, R128SavePtr restore) R128TRACE(("R128RestoreMode(%p)\n", restore)); R128RestoreCommonRegisters(pScrn, restore); R128RestoreCrtcRegisters(pScrn, restore); - if (info->HasPanelRegs) - R128RestoreFPRegisters(pScrn, restore); - if (!info->HasPanelRegs || info->BIOSDisplay == R128_BIOS_DISPLAY_CRT) - R128RestorePLLRegisters(pScrn, restore); + if (!(info->HasPanelRegs) || info->BIOSDisplay == R128_BIOS_DISPLAY_CRT){ + R128RestorePLLRegisters(pScrn, restore); + } R128RestoreDDARegisters(pScrn, restore); + if (info->HasPanelRegs || info->isDFP) + R128RestoreFPRegisters(pScrn, restore); + R128RestorePalette(pScrn, restore); } @@ -2251,6 +2680,7 @@ static void R128SaveFPRegisters(ScrnInfoPtr pScrn, R128SavePtr save) save->fp_vert_stretch = INREG(R128_FP_VERT_STRETCH); save->lvds_gen_cntl = INREG(R128_LVDS_GEN_CNTL); save->tmds_crc = INREG(R128_TMDS_CRC); + save->tmds_transmitter_cntl = INREG(R128_TMDS_TRANSMITTER_CNTL); } /* Read PLL registers. */ @@ -2288,7 +2718,7 @@ static void R128SavePalette(ScrnInfoPtr pScrn, R128SavePtr save) int i; /* Select palette 0 (main CRTC) if using FP-enabled chip */ - if (info->HasPanelRegs) PAL_SELECT(0); + if (info->HasPanelRegs || info->isDFP) PAL_SELECT(0); INPAL_START(0); for (i = 0; i < 256; i++) save->palette[i] = INPAL_NEXT(); @@ -2302,7 +2732,7 @@ static void R128SaveMode(ScrnInfoPtr pScrn, R128SavePtr save) R128SaveCommonRegisters(pScrn, save); R128SaveCrtcRegisters(pScrn, save); - if (R128PTR(pScrn)->HasPanelRegs) + if (R128PTR(pScrn)->HasPanelRegs || R128PTR(pScrn)->isDFP) R128SaveFPRegisters(pScrn, save); R128SavePLLRegisters(pScrn, save); R128SaveDDARegisters(pScrn, save); @@ -2450,6 +2880,21 @@ static Bool R128InitCrtcRegisters(ScrnInfoPtr pScrn, R128SavePtr save, | R128_DAC_VGA_ADR_EN | (info->dac6bits ? 0 : R128_DAC_8BIT_EN)); + + if(info->isDFP && !info->isPro2) + { + if(info->PanelXRes < mode->CrtcHDisplay) + mode->HDisplay = mode->CrtcHDisplay = info->PanelXRes; + if(info->PanelYRes < mode->CrtcVDisplay) + mode->VDisplay = mode->CrtcVDisplay = info->PanelYRes; + mode->CrtcHTotal = mode->CrtcHDisplay + info->HBlank; + mode->CrtcHSyncStart = mode->CrtcHDisplay + info->HOverPlus; + mode->CrtcHSyncEnd = mode->CrtcHSyncStart + info->HSyncWidth; + mode->CrtcVTotal = mode->CrtcVDisplay + info->VBlank; + mode->CrtcVSyncStart = mode->CrtcVDisplay + info->VOverPlus; + mode->CrtcVSyncEnd = mode->CrtcVSyncStart + info->VSyncWidth; + } + save->crtc_h_total_disp = ((((mode->CrtcHTotal / 8) - 1) & 0xffff) | (((mode->CrtcHDisplay / 8) - 1) << 16)); @@ -2516,20 +2961,20 @@ static void R128InitFPRegisters(R128SavePtr orig, R128SavePtr save, float Hratio, Vratio; if (info->BIOSDisplay == R128_BIOS_DISPLAY_CRT) { - save->crtc_ext_cntl |= R128_CRTC_CRT_ON; - save->crtc2_gen_cntl = 0; - save->fp_gen_cntl = orig->fp_gen_cntl; - save->fp_gen_cntl &= ~(R128_FP_FPON | - R128_FP_CRTC_USE_SHADOW_VEND | - R128_FP_CRTC_HORZ_DIV2_EN | - R128_FP_CRTC_HOR_CRT_DIV2_DIS | - R128_FP_USE_SHADOW_EN); - save->fp_gen_cntl |= (R128_FP_SEL_CRTC2 | - R128_FP_CRTC_DONT_SHADOW_VPAR); - save->fp_panel_cntl = orig->fp_panel_cntl & (CARD32)~R128_FP_DIGON; - save->lvds_gen_cntl = orig->lvds_gen_cntl & - (CARD32)~(R128_LVDS_ON | R128_LVDS_BLON); - return; + save->crtc_ext_cntl |= R128_CRTC_CRT_ON; + save->crtc2_gen_cntl = 0; + save->fp_gen_cntl = orig->fp_gen_cntl; + save->fp_gen_cntl &= ~(R128_FP_FPON | + R128_FP_CRTC_USE_SHADOW_VEND | + R128_FP_CRTC_HORZ_DIV2_EN | + R128_FP_CRTC_HOR_CRT_DIV2_DIS | + R128_FP_USE_SHADOW_EN); + save->fp_gen_cntl |= (R128_FP_SEL_CRTC2 | + R128_FP_CRTC_DONT_SHADOW_VPAR); + save->fp_panel_cntl = orig->fp_panel_cntl & (CARD32)~R128_FP_DIGON; + save->lvds_gen_cntl = orig->lvds_gen_cntl & + (CARD32)~(R128_LVDS_ON | R128_LVDS_BLON); + return; } if (xres > info->PanelXRes) xres = info->PanelXRes; @@ -2541,14 +2986,15 @@ static void R128InitFPRegisters(R128SavePtr orig, R128SavePtr save, save->fp_horz_stretch = (((((int)(Hratio * R128_HORZ_STRETCH_RATIO_MAX + 0.5)) & R128_HORZ_STRETCH_RATIO_MASK) << R128_HORZ_STRETCH_RATIO_SHIFT) | - (orig->fp_horz_stretch & (R128_HORZ_PANEL_SIZE | - R128_HORZ_FP_LOOP_STRETCH | - R128_HORZ_STRETCH_RESERVED))); + (orig->fp_horz_stretch & (R128_HORZ_PANEL_SIZE | + R128_HORZ_FP_LOOP_STRETCH | + R128_HORZ_STRETCH_RESERVED))); save->fp_horz_stretch &= ~R128_HORZ_AUTO_RATIO_FIX_EN; - if (Hratio == 1.0) save->fp_horz_stretch &= ~(R128_HORZ_STRETCH_BLEND | - R128_HORZ_STRETCH_ENABLE); - else save->fp_horz_stretch |= (R128_HORZ_STRETCH_BLEND | - R128_HORZ_STRETCH_ENABLE); + save->fp_horz_stretch &= ~R128_AUTO_HORZ_RATIO; + if (xres == info->PanelXRes) + save->fp_horz_stretch &= ~(R128_HORZ_STRETCH_BLEND | R128_HORZ_STRETCH_ENABLE); + else + save->fp_horz_stretch |= (R128_HORZ_STRETCH_BLEND | R128_HORZ_STRETCH_ENABLE); save->fp_vert_stretch = (((((int)(Vratio * R128_VERT_STRETCH_RATIO_MAX + 0.5)) @@ -2556,10 +3002,10 @@ static void R128InitFPRegisters(R128SavePtr orig, R128SavePtr save, (orig->fp_vert_stretch & (R128_VERT_PANEL_SIZE | R128_VERT_STRETCH_RESERVED))); save->fp_vert_stretch &= ~R128_VERT_AUTO_RATIO_EN; - if (Vratio == 1.0) save->fp_vert_stretch &= ~(R128_VERT_STRETCH_ENABLE | - R128_VERT_STRETCH_BLEND); - else save->fp_vert_stretch |= (R128_VERT_STRETCH_ENABLE | - R128_VERT_STRETCH_BLEND); + if (yres == info->PanelYRes) + save->fp_vert_stretch &= ~(R128_VERT_STRETCH_ENABLE | R128_VERT_STRETCH_BLEND); + else + save->fp_vert_stretch |= (R128_VERT_STRETCH_ENABLE | R128_VERT_STRETCH_BLEND); save->fp_gen_cntl = (orig->fp_gen_cntl & (CARD32)~(R128_FP_SEL_CRTC2 | @@ -2567,14 +3013,9 @@ static void R128InitFPRegisters(R128SavePtr orig, R128SavePtr save, R128_FP_CRTC_HORZ_DIV2_EN | R128_FP_CRTC_HOR_CRT_DIV2_DIS | R128_FP_USE_SHADOW_EN)); - if (orig->fp_gen_cntl & R128_FP_DETECT_SENSE) { - save->fp_gen_cntl |= (R128_FP_CRTC_DONT_SHADOW_VPAR | - R128_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 @@ -2582,21 +3023,36 @@ static void R128InitFPRegisters(R128SavePtr orig, R128SavePtr save, want to use the dual CRTC capabilities of the R128 to allow both the flat panel and external CRT to either simultaneously display the same image or display two different images. */ - if (info->BIOSDisplay == R128_BIOS_DISPLAY_FP_CRT) { - save->crtc_ext_cntl |= R128_CRTC_CRT_ON; - } else { - save->crtc_ext_cntl &= ~R128_CRTC_CRT_ON; - save->dac_cntl |= R128_DAC_CRT_SEL_CRTC2; - save->crtc2_gen_cntl = 0; + + if(!info->isDFP){ + if (info->BIOSDisplay == R128_BIOS_DISPLAY_FP_CRT) { + save->crtc_ext_cntl |= R128_CRTC_CRT_ON; + } else { + save->crtc_ext_cntl &= ~R128_CRTC_CRT_ON; + save->dac_cntl |= R128_DAC_CRT_SEL_CRTC2; + save->crtc2_gen_cntl = 0; + } } /* WARNING: Be careful about turning on the flat panel */ -#if 1 - save->lvds_gen_cntl |= (R128_LVDS_ON | R128_LVDS_BLON); -#else - save->fp_panel_cntl |= (R128_FP_DIGON | R128_FP_BLON); - save->fp_gen_cntl |= (R128_FP_FPON); -#endif + if(info->isDFP){ + save->fp_gen_cntl = orig->fp_gen_cntl; + + save->fp_gen_cntl &= ~(R128_FP_CRTC_USE_SHADOW_VEND | + R128_FP_CRTC_USE_SHADOW_ROWCUR | + R128_FP_CRTC_HORZ_DIV2_EN | + R128_FP_CRTC_HOR_CRT_DIV2_DIS | + R128_FP_CRT_SYNC_SEL | + R128_FP_USE_SHADOW_EN); + + save->fp_panel_cntl |= (R128_FP_DIGON | R128_FP_BLON); + save->fp_gen_cntl |= (R128_FP_FPON | R128_FP_TDMS_EN | + R128_FP_CRTC_DONT_SHADOW_VPAR | R128_FP_CRTC_DONT_SHADOW_HEND); + save->tmds_transmitter_cntl = (orig->tmds_transmitter_cntl + & ~(CARD32)R128_TMDS_PLLRST) | R128_TMDS_PLLEN; + } + else + save->lvds_gen_cntl |= (R128_LVDS_ON | R128_LVDS_BLON); save->fp_crtc_h_total_disp = save->crtc_h_total_disp; save->fp_crtc_v_total_disp = save->crtc_v_total_disp; @@ -2653,11 +3109,13 @@ static void R128InitPLLRegisters(ScrnInfoPtr pScrn, R128SavePtr save, 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 R128InitDDARegisters(ScrnInfoPtr pScrn, R128SavePtr save, - R128PLLPtr pll, R128InfoPtr info) + R128PLLPtr pll, R128InfoPtr info, + DisplayModePtr mode) { int DisplayFifoWidth = 128; int DisplayFifoDepth = 32; @@ -2674,6 +3132,11 @@ static Bool R128InitDDARegisters(ScrnInfoPtr pScrn, R128SavePtr save, VclkFreq = R128Div(pll->reference_freq * save->feedback_div, pll->reference_div * save->post_div); + if(info->isDFP && !info->isPro2){ + if(info->PanelXRes != mode->CrtcHDisplay) + VclkFreq = (VclkFreq * mode->CrtcHDisplay)/info->PanelXRes; + } + XclksPerTransfer = R128Div(XclkFreq * DisplayFifoWidth, VclkFreq * (info->CurrentLayout.pixel_bytes * 8)); @@ -2719,12 +3182,14 @@ static Bool R128InitDDARegisters(ScrnInfoPtr pScrn, R128SavePtr save, } +#if 0 /* Define initial palette for requested video mode. This doesn't do anything for XFree86 4.0. */ static void R128InitPalette(R128SavePtr save) { save->palette_valid = FALSE; } +#endif /* Define registers for a requested video mode. */ static Bool R128Init(ScrnInfoPtr pScrn, DisplayModePtr mode, R128SavePtr save) @@ -2783,12 +3248,20 @@ static Bool R128Init(ScrnInfoPtr pScrn, DisplayModePtr mode, R128SavePtr save) R128InitCommonRegisters(save, info); if (!R128InitCrtcRegisters(pScrn, save, mode, info)) return FALSE; - if (info->HasPanelRegs) - R128InitFPRegisters(&info->SavedReg, save, mode, info); - R128InitPLLRegisters(pScrn, save, &info->pll, dot_clock); - if (!R128InitDDARegisters(pScrn, save, &info->pll, info)) - return FALSE; - if (!info->PaletteSavedOnVT) R128InitPalette(save); + if (info->HasPanelRegs || info->isDFP) + R128InitFPRegisters(&info->SavedReg, save, mode, info); + if(dot_clock > 0){ + R128InitPLLRegisters(pScrn, save, &info->pll, dot_clock); + if (!R128InitDDARegisters(pScrn, save, &info->pll, info, mode)) + return FALSE; + } + else{ + save->ppll_ref_div = info->SavedReg.ppll_ref_div; + save->ppll_div_3 = info->SavedReg.ppll_div_3; + save->htotal_cntl = info->SavedReg.htotal_cntl; + save->dda_config = info->SavedReg.dda_config; + save->dda_on_off = info->SavedReg.dda_on_off; + } R128TRACE(("R128Init returns %p\n", save)); return TRUE; @@ -2841,6 +3314,14 @@ int R128ValidMode(int scrnIndex, DisplayModePtr mode, ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; R128InfoPtr info = R128PTR(pScrn); + if(info->isDFP) { + if(info->PanelXRes < mode->CrtcHDisplay || + info->PanelYRes < mode->CrtcVDisplay) + return MODE_NOMODE; + else + return MODE_OK; + } + if (info->HasPanelRegs) { if (mode->Flags & V_INTERLACE) return MODE_NO_INTERLACE; if (mode->Flags & V_DBLSCAN) return MODE_NO_DBLESCAN; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_probe.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_probe.c index 4ee63dac6..34d781b34 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_probe.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_probe.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_probe.c,v 1.15 2001/08/18 17:25:51 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_probe.c,v 1.16 2001/11/05 23:37:50 alanh Exp $ */ /* * Copyright 1999, 2000 ATI Technologies Inc., Markham, Ontario, * Precision Insight, Inc., Cedar Park, Texas, and @@ -83,6 +83,7 @@ SymTabRec R128Chipsets[] = { { PCI_CHIP_RAGE128SM, "ATI Rage 128 SM (AGP)" }, { PCI_CHIP_RAGE128PD, "ATI Rage 128 Pro PD (PCI)" }, { PCI_CHIP_RAGE128PF, "ATI Rage 128 Pro PF (AGP)" }, + { PCI_CHIP_RAGE128PP, "ATI Rage 128 Pro PP (PCI)" }, { PCI_CHIP_RAGE128PR, "ATI Rage 128 Pro PR (PCI)" }, { PCI_CHIP_RAGE128TF, "ATI Rage 128 Pro ULTRA TF (AGP)" }, { PCI_CHIP_RAGE128TL, "ATI Rage 128 Pro ULTRA TL (AGP)" }, @@ -103,6 +104,7 @@ PciChipsets R128PciChipsets[] = { { PCI_CHIP_RAGE128SM, PCI_CHIP_RAGE128SM, RES_SHARED_VGA }, { PCI_CHIP_RAGE128PD, PCI_CHIP_RAGE128PD, RES_SHARED_VGA }, { PCI_CHIP_RAGE128PF, PCI_CHIP_RAGE128PF, RES_SHARED_VGA }, + { PCI_CHIP_RAGE128PP, PCI_CHIP_RAGE128PP, RES_SHARED_VGA }, { PCI_CHIP_RAGE128PR, PCI_CHIP_RAGE128PR, RES_SHARED_VGA }, { PCI_CHIP_RAGE128TF, PCI_CHIP_RAGE128TF, RES_SHARED_VGA }, { PCI_CHIP_RAGE128TL, PCI_CHIP_RAGE128TL, RES_SHARED_VGA }, diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_reg.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_reg.h index 4be9e1d47..85ed44635 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_reg.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_reg.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_reg.h,v 1.11 2001/04/10 16:07:59 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_reg.h,v 1.13 2001/10/02 11:44:16 alanh Exp $ */ /* * Copyright 1999, 2000 ATI Technologies Inc., Markham, Ontario, * Precision Insight, Inc., Cedar Park, Texas, and @@ -322,6 +322,8 @@ # define R128_CRTC_VSYNC_DIS (1 << 9) # define R128_CRTC_DISPLAY_DIS (1 << 10) # define R128_CRTC_CRT_ON (1 << 15) +# define R128_FP_OUT_EN (1 << 22) +# define R128_FP_ACTIVE (1 << 23) #define R128_CRTC_EXT_CNTL_DPMS_BYTE 0x0055 # define R128_CRTC_HSYNC_DIS_BYTE (1 << 0) # define R128_CRTC_VSYNC_DIS_BYTE (1 << 1) @@ -556,13 +558,17 @@ #define R128_FP_CRTC_V_TOTAL_DISP 0x0254 #define R128_FP_GEN_CNTL 0x0284 # define R128_FP_FPON (1 << 0) +# define R128_FP_BLANK_DIS (1 << 1) # define R128_FP_TDMS_EN (1 << 2) # define R128_FP_DETECT_SENSE (1 << 8) # define R128_FP_SEL_CRTC2 (1 << 13) # define R128_FP_CRTC_DONT_SHADOW_VPAR (1 << 16) +# define R128_FP_CRTC_DONT_SHADOW_HEND (1 << 17) # define R128_FP_CRTC_USE_SHADOW_VEND (1 << 18) +# define R128_FP_CRTC_USE_SHADOW_ROWCUR (1 << 19) # define R128_FP_CRTC_HORZ_DIV2_EN (1 << 20) # define R128_FP_CRTC_HOR_CRT_DIV2_DIS (1 << 21) +# define R128_FP_CRT_SYNC_SEL (1 << 23) # define R128_FP_USE_SHADOW_EN (1 << 24) #define R128_FP_H_SYNC_STRT_WID 0x02c4 #define R128_FP_HORZ_STRETCH 0x028c @@ -571,6 +577,7 @@ # define R128_HORZ_STRETCH_RATIO_MAX 4096 # define R128_HORZ_PANEL_SIZE (0xff << 16) # define R128_HORZ_PANEL_SHIFT 16 +# define R128_AUTO_HORZ_RATIO (0 << 24) # define R128_HORZ_STRETCH_PIXREP (0 << 25) # define R128_HORZ_STRETCH_BLEND (1 << 25) # define R128_HORZ_STRETCH_ENABLE (1 << 26) @@ -913,6 +920,9 @@ #define R128_TEST_DEBUG_MUX 0x0124 #define R128_TEST_DEBUG_OUT 0x012c #define R128_TMDS_CRC 0x02a0 +#define R128_TMDS_TRANSMITTER_CNTL 0x02a4 +# define R128_TMDS_PLLEN (1 << 0) +# define R128_TMDS_PLLRST (1 << 1) #define R128_TRAIL_BRES_DEC 0x1614 #define R128_TRAIL_BRES_ERR 0x160c #define R128_TRAIL_BRES_INC 0x1610 diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_video.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_video.c index bbca9d4c0..ac7459502 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_video.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_video.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_video.c,v 1.19 2001/08/09 19:14:12 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/r128_video.c,v 1.20 2001/10/02 11:44:16 alanh Exp $ */ #include "r128.h" #include "r128_reg.h" diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h index 9c06847fe..cce71271d 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h,v 1.21 2001/07/25 08:04:43 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h,v 1.24 2001/11/14 16:50:44 alanh Exp $ */ /* * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and * VA Linux Systems Inc., Fremont, California. @@ -116,6 +116,7 @@ typedef struct { CARD32 cap0_trig_cntl; CARD32 cap1_trig_cntl; CARD32 bus_cntl; + CARD32 surface_cntl; /* Other registers to save for VT switches */ CARD32 dp_datatype; @@ -265,14 +266,15 @@ typedef struct { RADEONDDCType DDCType; RADEONConnectorType ConnectorType; BOOL HasCRTC2; /* VE/M6/M7 */ - BOOL IsM7; /* M7 chip */ + BOOL IsR200; /* R200 chip */ + BOOL IsRV200; /* RV200 chip */ BOOL IsSecondary; /* second Screen */ BOOL UseCRT; /* force use CRT port as primary */ BOOL IsM6; /* M6 card, for some workarounds */ BOOL SwitchingMode; int FPBIOSstart; /* Start of the flat panel info */ - /* Computed values for FPs */ + /* EDID or BIOS values for FPs */ int PanelXRes; int PanelYRes; int HOverPlus; @@ -282,6 +284,7 @@ typedef struct { int VSyncWidth; int VBlank; int PanelPwrDly; + int DotClock; /****************************************************/ /*for getting EDID data using DDC interface*/ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_accel.c index 8f82abfd0..a4b844d37 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_accel.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_accel.c,v 1.17 2001/08/17 22:08:13 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_accel.c,v 1.23 2001/11/24 14:38:19 tsi Exp $ */ /* * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and * VA Linux Systems Inc., Fremont, California. @@ -74,6 +74,7 @@ #include "radeon.h" #include "radeon_probe.h" #include "radeon_reg.h" +#include "radeon_version.h" #ifdef XF86DRI #define _XF86DRI_SERVER_ #include "radeon_dri.h" @@ -316,6 +317,9 @@ void RADEONEngineRestore(ScrnInfoPtr pScrn) OUTREGP(RADEON_DP_DATATYPE, 0, ~RADEON_HOST_BIG_ENDIAN_EN); #endif + /* restore SURFACE_CNTL */ + OUTREG(RADEON_SURFACE_CNTL, info->ModeReg.surface_cntl); + RADEONWaitForFifo(pScrn, 1); OUTREG(RADEON_DEFAULT_SC_BOTTOM_RIGHT, (RADEON_DEFAULT_SC_RIGHT_MAX | RADEON_DEFAULT_SC_BOTTOM_MAX)); @@ -346,7 +350,6 @@ void RADEONRestoreAccelState(ScrnInfoPtr pScrn) RADEONEntPtr pRADEONEnt; DevUnion* pPriv; - /*xf86DrvMsg(pScrn->scrnIndex, X_INFO, "===>Restore\n");*/ pPriv = xf86GetEntityPrivate(pScrn->entityList[0], gRADEONEntityIndex); pRADEONEnt = pPriv->ptr; @@ -368,8 +371,6 @@ void RADEONRestoreAccelState(ScrnInfoPtr pScrn) RADEONWaitForIdle(pScrn); - /*xf86DrvMsg(pScrn->scrnIndex, X_INFO, "<===Restore\n");*/ - } /* This callback is required for multiheader cards using XAA */ @@ -408,6 +409,15 @@ static void RADEONEngineInit(ScrnInfoPtr pScrn) info->CurrentLayout.bitsPerPixel)); OUTREG(RADEON_RB3D_CNTL, 0); +#if defined(__powerpc__) +#if defined(XF86_DRI) + if(!info->directRenderinEnabled) +#endif + { + OUTREG(RADEON_MC_FB_LOCATION, 0xffff0000); + OUTREG(RADEON_MC_AGP_LOCATION, 0xfffff000); + } +#endif RADEONEngineReset(pScrn); switch (info->CurrentLayout.pixel_code) { @@ -481,6 +491,47 @@ static void RADEONSubsequentSolidFillRect(ScrnInfoPtr pScrn, } /* Setup for XAA solid lines. */ + +/* unlike r128, Radeon don't have the Last-Pel controlling bit in DP_CNTL_XDIR_YDIR_YMAJOR + for line drawing, so we have to do it using our own extrapolation routine*/ +static void LastLinePel(int *X1, int *Y1, int *X2, int *Y2) +{ + int tg, deltax, deltay; + int xa = *X1, ya = *Y1, xb = *X2, yb = *Y2; + + deltax = xb - xa; + deltay = yb - ya; + + if(deltax == 0) + tg = 40; + else + tg = labs((deltay<<4) / deltax); + + if((tg >= 7) && (tg <= 39)) + { + if(deltax > 0)xb++; + else xb--; + if(deltay > 0)yb++; + else yb--; + } + else + { + if(labs(deltax) > labs(deltay)) + { + if(deltax > 0) xb++; + else xb--; + } + else + { + if(deltay > 0) yb++; + else yb--; + } + + } +} + + +/* Setup for XAA solid lines. */ static void RADEONSetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, unsigned int planemask) { @@ -510,17 +561,14 @@ static void RADEONSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, { RADEONInfoPtr info = RADEONPTR(pScrn); unsigned char *RADEONMMIO = info->MMIO; - int direction = 0; - if (xa < xb) direction |= RADEON_DST_X_DIR_LEFT_TO_RIGHT; - if (ya < yb) direction |= RADEON_DST_Y_DIR_TOP_TO_BOTTOM; - - RADEONWaitForFifo(pScrn, 4); - OUTREG(RADEON_DST_Y_X, (ya << 16) | xa); if (!(flags & OMIT_LAST)) - OUTREG(RADEON_DP_CNTL_XDIR_YDIR_YMAJOR, direction); + LastLinePel(&xa, &ya, &xb, &yb); + + RADEONWaitForFifo(pScrn, 2); OUTREG(RADEON_DST_LINE_START, (ya << 16) | xa); OUTREG(RADEON_DST_LINE_END, (yb << 16) | xb); + } /* Subsequent XAA solid horizontal and vertical lines */ @@ -586,18 +634,13 @@ static void RADEONSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, { RADEONInfoPtr info = RADEONPTR(pScrn); unsigned char *RADEONMMIO = info->MMIO; - int direction = 0; - - if (xa < xb) direction |= RADEON_DST_X_DIR_LEFT_TO_RIGHT; - if (ya < yb) direction |= RADEON_DST_Y_DIR_TOP_TO_BOTTOM; - - RADEONWaitForFifo(pScrn, 5); + RADEONWaitForFifo(pScrn, 3); if (!(flags & OMIT_LAST)) - OUTREG(RADEON_DP_CNTL_XDIR_YDIR_YMAJOR, direction); - OUTREG(RADEON_DST_Y_X, (ya << 16) | xa); - OUTREG(RADEON_BRUSH_Y_X, (phase << 16) | phase); + LastLinePel(&xa, &ya, &xb, &yb); + OUTREG(RADEON_DST_LINE_START, (ya << 16) | xa); + OUTREG(RADEON_DST_LINE_PATCOUNT, phase); OUTREG(RADEON_DST_LINE_END, (yb << 16) | xb); } @@ -990,6 +1033,62 @@ static void RADEONSubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno) } } +static void RADEONSetClippingRectangle(ScrnInfoPtr pScrn, + int xa, int ya, int xb, int yb) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + unsigned long tmp = 0; + + if(xa < 0) + { + tmp = -xa; + tmp |= RADEON_SC_SIGN_MASK_LO; + } + else tmp = xa; + + if(ya < 0) + { + tmp |= ((-ya) << 16); + tmp |= RADEON_SC_SIGN_MASK_HI; + } + else tmp |= (ya << 16); + + OUTREG(RADEON_SC_TOP_LEFT, tmp); + + if(xb < 0) + { + tmp = -xb; + tmp |= RADEON_SC_SIGN_MASK_LO; + } + else tmp = xb; + + if(yb < 0) + { + tmp |= ((-yb) << 16); + tmp |= RADEON_SC_SIGN_MASK_HI; + } + else tmp |= (yb << 16); + OUTREG(RADEON_SC_BOTTOM_RIGHT, tmp); + + OUTREG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl | RADEON_GMC_DST_CLIPPING)); + +} + +static void +RADEONDisableClipping(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + + OUTREG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl & ~(CARD32)RADEON_GMC_DST_CLIPPING)); + + OUTREG(RADEON_SC_TOP_LEFT, 0); + OUTREG(RADEON_SC_BOTTOM_RIGHT, INREG(RADEON_DEFAULT_SC_BOTTOM_RIGHT)); + +} + + /* ================================================================ * CP-based 2D acceleration @@ -1112,6 +1211,208 @@ static void RADEONCPSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, ADVANCE_RING(); } +/* Setup for XAA solid lines. */ +static void RADEONCPSetupForSolidLine(ScrnInfoPtr pScrn, + int color, int rop, unsigned int planemask) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + RING_LOCALS; + BEGIN_RING( 6 ); + OUT_RING_REG(RADEON_DP_GUI_MASTER_CNTL, (info->dp_gui_master_cntl + | RADEON_GMC_BRUSH_SOLID_COLOR + | RADEON_GMC_SRC_DATATYPE_COLOR + | RADEON_ROP[rop].pattern)); + OUT_RING_REG(RADEON_DP_BRUSH_FRGD_CLR, color); + OUT_RING_REG(RADEON_DP_WRITE_MASK, planemask); + + ADVANCE_RING(); + +} + + +/* 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 RADEONCPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, + int xa, int ya, int xb, int yb, + int flags) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + RING_LOCALS; + BEGIN_RING( 4 ); + + if (!(flags & OMIT_LAST)) + { + LastLinePel(&xa, &ya, &xb, &yb); + } + + OUT_RING_REG(RADEON_DST_LINE_START, (ya << 16) | xa); + OUT_RING_REG(RADEON_DST_LINE_END, (yb << 16) | xb); + + ADVANCE_RING(); + +} + +/* Subsequent XAA solid horizontal and vertical lines */ +static void RADEONCPSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, + int x, int y, int len, int dir ) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + RING_LOCALS; + BEGIN_RING( 6 ); + + OUT_RING_REG(RADEON_DP_CNTL, (RADEON_DST_X_LEFT_TO_RIGHT + | RADEON_DST_Y_TOP_TO_BOTTOM)); + + if (dir == DEGREES_0) + { + OUT_RING_REG( RADEON_DST_Y_X, (y << 16) | x ); + OUT_RING_REG( RADEON_DST_WIDTH_HEIGHT, (len << 16) | 1 ); + } + else + { + OUT_RING_REG( RADEON_DST_Y_X, (y << 16) | x ); + OUT_RING_REG( RADEON_DST_WIDTH_HEIGHT, (1 << 16) | len ); + } + ADVANCE_RING(); +} + + +/* 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 RADEONCPSetupForDashedLine(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, unsigned int planemask, + int length, unsigned char *pattern) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + CARD32 pat = *(CARD32 *)(pointer)pattern; + + RING_LOCALS; + + 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; + } + + BEGIN_RING( 12 ); + OUT_RING_REG(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)); + OUT_RING_REG(RADEON_DP_WRITE_MASK, planemask); + OUT_RING_REG(RADEON_DP_BRUSH_FRGD_CLR, fg); + if(bg != -1) OUT_RING_REG(RADEON_DP_BRUSH_BKGD_CLR, bg); + OUT_RING_REG(RADEON_BRUSH_DATA0, pat); + ADVANCE_RING(); + +} + +/* Subsequent XAA dashed line. */ +static void RADEONCPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, + int xa, int ya, + int xb, int yb, + int flags, + int phase) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + RING_LOCALS; + + if (!(flags & OMIT_LAST)) + { + LastLinePel(&xa, &ya, &xb, &yb); + } + + BEGIN_RING(6); + OUT_RING_REG(RADEON_DST_LINE_START, (ya << 16) | xa); + OUT_RING_REG(RADEON_DST_LINE_PATCOUNT, phase); + OUT_RING_REG(RADEON_DST_LINE_END, (yb << 16) | xb); + ADVANCE_RING(); +} + + +static void RADEONCPSetClippingRectangle(ScrnInfoPtr pScrn, + int xa, int ya, int xb, int yb) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + unsigned long tmp1 = 0, tmp2 = 0; + + if(xa < 0) + { + tmp1 = -xa; + tmp1 |= RADEON_SC_SIGN_MASK_LO; + } + else tmp1 = xa; + + if(ya < 0) + { + tmp1 |= ((-ya) << 16); + tmp1 |= RADEON_SC_SIGN_MASK_HI; + } + else tmp1 |= (ya << 16); + + if(xb < 0) + { + tmp2 = -xb; + tmp2 |= RADEON_SC_SIGN_MASK_LO; + } + else tmp2 = xb; + + if(yb < 0) + { + tmp2 |= ((-yb) << 16); + tmp2 |= RADEON_SC_SIGN_MASK_HI; + } + else tmp2 |= (yb << 16); + + { + + RING_LOCALS; + BEGIN_RING( 3 ); + OUT_RING_REG(RADEON_SC_TOP_LEFT, tmp1); + OUT_RING_REG(RADEON_SC_BOTTOM_RIGHT, tmp2); + OUT_RING_REG(RADEON_DP_GUI_MASTER_CNTL, + (info->dp_gui_master_cntl | RADEON_GMC_DST_CLIPPING)); + + ADVANCE_RING(); + } +} + +static void +RADEONCPDisableClipping(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + /* unsigned char *RADEONMMIO = info->MMIO;*/ + RING_LOCALS; + BEGIN_RING( 3 ); + OUT_RING_REG(RADEON_DP_GUI_MASTER_CNTL, + (info->dp_gui_master_cntl & ~(CARD32)(RADEON_GMC_DST_CLIPPING))); + OUT_RING_REG(RADEON_SC_TOP_LEFT, 0); + OUT_RING_REG(RADEON_SC_BOTTOM_RIGHT, (RADEON_DEFAULT_SC_RIGHT_MAX + | RADEON_DEFAULT_SC_BOTTOM_MAX)); + + ADVANCE_RING(); + +} + + /* Point the DST_PITCH_OFFSET register at the current buffer. This * allows us to interact with the back and depth buffers. All CP 2D * acceleration commands use the DST_PITCH_OFFSET register. @@ -1276,6 +1577,31 @@ static void RADEONCPAccelInit(ScrnInfoPtr pScrn, XAAInfoRecPtr a) a->SetupForScreenToScreenCopy = RADEONCPSetupForScreenToScreenCopy; a->SubsequentScreenToScreenCopy = RADEONCPSubsequentScreenToScreenCopy; + + a->SetupForDashedLine = RADEONCPSetupForDashedLine; + a->SubsequentDashedTwoPointLine = RADEONCPSubsequentDashedTwoPointLine; + a->DashPatternMaxLength = 32; + /*ROP3 doesn't seem to work properly for dashedline with GXinvert*/ + a->DashedLineFlags = (LINE_PATTERN_LSBFIRST_LSBJUSTIFIED + | LINE_PATTERN_POWER_OF_2_ONLY + | ROP_NEEDS_SOURCE); + + + a->SolidLineFlags = 0; + a->SetupForSolidLine = RADEONCPSetupForSolidLine; + a->SubsequentSolidTwoPointLine = RADEONCPSubsequentSolidTwoPointLine; + a->SubsequentSolidHorVertLine = RADEONCPSubsequentSolidHorVertLine; + a->SubsequentSolidBresenhamLine = NULL; + + /* clipping */ + a->SetClippingRectangle = RADEONCPSetClippingRectangle; + a->DisableClipping = RADEONCPDisableClipping; + a->ClippingFlags = HARDWARE_CLIP_SOLID_LINE | + HARDWARE_CLIP_DASHED_LINE | + /*HARDWARE_CLIP_SOLID_FILL |*/ /* seems very slow with this on ???*/ + HARDWARE_CLIP_MONO_8x8_FILL | + HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY; + if(!info->IsSecondary && xf86IsEntityShared(pScrn->entityList[0])) a->RestoreAccelState = RADEONRestoreCPAccelState; @@ -1347,8 +1673,21 @@ static void RADEONMMIOAccelInit(ScrnInfoPtr pScrn, XAAInfoRecPtr a) a->SetupForDashedLine = RADEONSetupForDashedLine; a->SubsequentDashedTwoPointLine = RADEONSubsequentDashedTwoPointLine; a->DashPatternMaxLength = 32; + /*ROP3 doesn't seem to work properly for dashedline with GXinvert*/ a->DashedLineFlags = (LINE_PATTERN_LSBFIRST_LSBJUSTIFIED - | LINE_PATTERN_POWER_OF_2_ONLY); + | LINE_PATTERN_POWER_OF_2_ONLY + | ROP_NEEDS_SOURCE); + + /* clipping, note without this, + all line accelerations will not be called */ + a->SetClippingRectangle = RADEONSetClippingRectangle; + a->DisableClipping = RADEONDisableClipping; + a->ClippingFlags = HARDWARE_CLIP_SOLID_LINE | + HARDWARE_CLIP_DASHED_LINE | + /*HARDWARE_CLIP_SOLID_FILL |*/ /* seems very slow with this on ???*/ + HARDWARE_CLIP_MONO_8x8_FILL | + HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY; + if(xf86IsEntityShared(pScrn->entityList[0])) { diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_cursor.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_cursor.c index 99bdc79c1..5fb3fada8 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_cursor.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_cursor.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_cursor.c,v 1.7 2001/08/17 22:08:13 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_cursor.c,v 1.9 2001/11/23 19:50:45 dawes Exp $ */ /* * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and * VA Linux Systems Inc., Fremont, California. @@ -103,29 +103,36 @@ static void RADEONSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) if (xorigin >= cursor->MaxWidth) xorigin = cursor->MaxWidth - 1; if (yorigin >= cursor->MaxHeight) yorigin = cursor->MaxHeight - 1; +#if 0 + /* This test is NOT needed, and is the cause of jerky behavior + * as the mouse approaches the left edge of the screen, especially + * at high acceleration. + * + * Nowhere below is x (or y) used when they are negative! + */ if(x >= 0) +#endif { if(!info->IsSecondary) { - OUTREG(RADEON_CUR_HORZ_VERT_OFF, (RADEON_CUR_LOCK + OUTREG(RADEON_CUR_HORZ_VERT_OFF, (RADEON_CUR_LOCK | (xorigin << 16) | yorigin)); - OUTREG(RADEON_CUR_HORZ_VERT_POSN, (RADEON_CUR_LOCK + 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); + OUTREG(RADEON_CUR_OFFSET, info->cursor_start + yorigin * 16); } else { - OUTREG(RADEON_CUR2_HORZ_VERT_OFF, (RADEON_CUR2_LOCK + OUTREG(RADEON_CUR2_HORZ_VERT_OFF, (RADEON_CUR2_LOCK | (xorigin << 16) | yorigin)); - OUTREG(RADEON_CUR2_HORZ_VERT_POSN, (RADEON_CUR2_LOCK + OUTREG(RADEON_CUR2_HORZ_VERT_POSN, (RADEON_CUR2_LOCK | ((xorigin ? 0 : x) << 16) | (yorigin ? 0 : y))); - OUTREG(RADEON_CUR2_OFFSET, - info->cursor_start + pScrn->fbOffset + yorigin * 16); + OUTREG(RADEON_CUR2_OFFSET, + info->cursor_start + pScrn->fbOffset + yorigin * 16); } } } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dga.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dga.c index ccf6e482a..29d4c05a0 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dga.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dga.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dga.c,v 1.6 2001/05/25 02:44:36 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dga.c,v 1.8 2001/12/04 17:30:46 tsi Exp $ */ /* * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and * VA Linux Systems Inc., Fremont, California. @@ -76,74 +76,68 @@ static DGAModePtr RADEONSetupDGAMode(ScrnInfoPtr pScrn, 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; + unsigned int size; + int pitch, Bpp = bitsPerPixel >> 3; SECOND_PASS: - currentMode = modes + *num; - (*num)++; - - currentMode->mode = pMode; - currentMode->flags = DGA_CONCURRENT_ACCESS; - if (pixmap) - currentMode->flags |= DGA_PIXMAP_AVAILABLE; - if (info->accel) { - if (info->accel->SetupForSolidFill && - info->accel->SubsequentSolidFillRect) - currentMode->flags |= DGA_FILL_RECT; - if (info->accel->SetupForScreenToScreenCopy && - info->accel->SubsequentScreenToScreenCopy) - currentMode->flags |= DGA_BLIT_RECT | DGA_BLIT_RECT_TRANS; - - if (currentMode->flags & - (DGA_PIXMAP_AVAILABLE | DGA_FILL_RECT | - DGA_BLIT_RECT | DGA_BLIT_RECT_TRANS)) - currentMode->flags &= ~DGA_CONCURRENT_ACCESS; - } - 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; + pMode = firstMode = pScrn->modes; + + while (1) { + pitch = pScrn->displayWidth; + size = pitch * Bpp * pMode->VDisplay; + + if ((!secondPitch || (pitch != secondPitch)) && + (size <= info->FbMapSize)) { + + if (secondPitch) + pitch = secondPitch; + + if (!(newmodes = xrealloc(modes, (*num + 1) * sizeof(DGAModeRec)))) + break; + + modes = newmodes; + currentMode = modes + *num; + + currentMode->mode = pMode; + currentMode->flags = DGA_CONCURRENT_ACCESS; + + if (pixmap) + currentMode->flags |= DGA_PIXMAP_AVAILABLE; + + if (info->accel) { + if (info->accel->SetupForSolidFill && + info->accel->SubsequentSolidFillRect) + currentMode->flags |= DGA_FILL_RECT; + if (info->accel->SetupForScreenToScreenCopy && + info->accel->SubsequentScreenToScreenCopy) + currentMode->flags |= DGA_BLIT_RECT | DGA_BLIT_RECT_TRANS; + if (currentMode->flags & + (DGA_PIXMAP_AVAILABLE | DGA_FILL_RECT | + DGA_BLIT_RECT | DGA_BLIT_RECT_TRANS)) + currentMode->flags &= ~DGA_CONCURRENT_ACCESS; + } + 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; + currentMode->bytesPerScanline = pitch * Bpp; + currentMode->imageWidth = pitch; + currentMode->imageHeight = info->FbMapSize / currentMode->bytesPerScanline; currentMode->pixmapWidth = currentMode->imageWidth; currentMode->pixmapHeight = currentMode->imageHeight; currentMode->maxViewportX = currentMode->imageWidth - @@ -151,19 +145,7 @@ SECOND_PASS: /* 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); + (*num)++; } pMode = pMode->next; @@ -171,6 +153,11 @@ SECOND_PASS: break; } + if (secondPitch) { + secondPitch = 0; + goto SECOND_PASS; + } + return modes; } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c index 79011ea77..815567943 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c,v 1.13 2001/05/02 15:06:08 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c,v 1.14 2001/10/01 13:44:03 eich Exp $ */ /* * Copyright 2000 ATI Technologies Inc., Markham, Ontario, * VA Linux Systems Inc., Fremont, California. @@ -62,6 +62,8 @@ /* ?? Alpha - this may need to be a variable to handle UP1x00 vs TITAN */ #if defined(__alpha__) # define DRM_PAGE_SIZE 8192 +#elif defined(__ia64__) +# define DRM_PAGE_SIZE getpagesize() #else # define DRM_PAGE_SIZE 4096 #endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c index 9f3d72586..cb46661a3 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c,v 1.34 2001/08/17 22:08:13 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c,v 1.50 2002/01/16 02:00:43 martin Exp $ */ /* * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and * VA Linux Systems Inc., Fremont, California. @@ -114,8 +114,6 @@ 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); typedef enum { OPTION_NOACCEL, @@ -134,6 +132,7 @@ typedef enum { OPTION_DEPTH_MOVE, #endif OPTION_CRT_SCREEN, + OPTION_PANEL_SIZE, OPTION_FBDEV } RADEONOpts; @@ -152,8 +151,8 @@ const OptionInfoRec RADEONOptions[] = { { OPTION_BUFFER_SIZE, "BufferSize", OPTV_INTEGER, {0}, FALSE }, { OPTION_DEPTH_MOVE, "EnableDepthMoves", OPTV_BOOLEAN, {0}, FALSE }, #endif - { OPTION_CRT_SCREEN, "crt_screen", OPTV_BOOLEAN, {0}, -FALSE}, + { OPTION_CRT_SCREEN, "CrtScreen", OPTV_BOOLEAN, {0}, FALSE}, + { OPTION_PANEL_SIZE, "PanelSize", OPTV_ANYSTR, {0}, FALSE }, { OPTION_FBDEV, "UseFBDev", OPTV_BOOLEAN, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -172,6 +171,7 @@ static const char *vgahwSymbols[] = { "vgaHWRestore", "vgaHWSave", "vgaHWUnlock", + "vgaHWGetIOBase", NULL }; @@ -203,7 +203,8 @@ static const char *fbdevHWSymbols[] = { static const char *ddcSymbols[] = { "xf86PrintEDID", - "xf86SetDDCproperties", + "xf86DoEDID_DDC1", + "xf86DoEDID_DDC2", NULL }; @@ -749,9 +750,12 @@ static Bool RADEONGetBIOSParameters(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) } if (info->VBIOS[0] != 0x55 || info->VBIOS[1] != 0xaa) { + xfree(info->VBIOS); + info->VBIOS = NULL; info->BIOSAddr = 0x00000000; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Video BIOS not found!\n"); + return TRUE; } info->FPBIOSstart = RADEON_BIOS16(0x48); @@ -856,161 +860,85 @@ static Bool RADEONGetBIOSParameters(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) RADEONMMIO = NULL; RADEONUnmapMMIO(pScrn); + info->HBlank = 0; + info->HOverPlus = 0; + info->HSyncWidth = 0; + info->VBlank = 0; + info->VOverPlus = 0; + info->VSyncWidth = 0; + info->DotClock = 0; + + if(info->DisplayType == MT_LCD) { + tmp = RADEON_BIOS16(info->FPBIOSstart + 0x40); + if(!tmp) { + info->PanelPwrDly = 200; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "No Panel Info Table found in BIOS!\n"); + } else { + char stmp[30]; + int tmp0; + for(i=0; i<24; i++) + stmp[i] = RADEON_BIOS8(tmp+i+1); + stmp[24] = 0; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Panel ID string: %s\n", stmp); + info->PanelXRes = RADEON_BIOS16(tmp+25); + info->PanelYRes = RADEON_BIOS16(tmp+27); + xf86DrvMsg(0, X_INFO, "Panel Size from BIOS: %dx%d\n", + info->PanelXRes, info->PanelYRes); + info->PanelPwrDly = RADEON_BIOS16(tmp+44); + if(info->PanelPwrDly > 2000 || info->PanelPwrDly < 0) + info->PanelPwrDly = 2000; + for(i=0; i<20; i++) { + tmp0 = RADEON_BIOS16(tmp+64+i*2); + if(tmp0 == 0) break; + if((RADEON_BIOS16(tmp0) == info->PanelXRes) && + (RADEON_BIOS16(tmp0+2) == info->PanelYRes)) { + + info->HBlank = (RADEON_BIOS16(tmp0+17) - RADEON_BIOS16(tmp0+19)) * 8; + info->HOverPlus = (RADEON_BIOS16(tmp0+21) - RADEON_BIOS16(tmp0+19) - 1) * 8; + info->HSyncWidth = RADEON_BIOS8(tmp0+23) * 8; + info->VBlank = RADEON_BIOS16(tmp0+24) - RADEON_BIOS16(tmp0+26); + info->VOverPlus = (RADEON_BIOS16(tmp0+28) & 0x7ff) - RADEON_BIOS16(tmp0+26); + info->VSyncWidth = (RADEON_BIOS16(tmp0+28) & 0xf800) >> 11; + info->DotClock = RADEON_BIOS16(tmp0+9) * 10; + } + } + } + } + /* Detect connector type from BIOS, used for - I2C/DDC qeurying EDID*/ + I2C/DDC qeurying EDID, Only available for VE or newer cards*/ tmp = RADEON_BIOS16(info->FPBIOSstart + 0x50); - for(i=1; i<4; i++) - { - if(!RADEON_BIOS8(tmp + i*2) && i>1) break; + if(tmp) + { + for(i=1; i<4; i++) { + if(!RADEON_BIOS8(tmp + i*2) && i>1) break; - /*Note: our Secondary port (CRT port) - actually uses primary DAC*/ - if(RADEON_BIOS16(tmp + i*2) & 0x01) - { - if(!info->IsSecondary) - { - info->DDCType = - (RADEON_BIOS16(tmp + i*2) & 0x0f00) >> 8; - break; - } - } - else /*Primary DAC*/ - { - if(info->IsSecondary || !info->HasCRTC2 - || BypassSecondary) - { - info->DDCType = - (RADEON_BIOS16(tmp + i*2) & 0x0f00) >> 8; - break; + /*Note: our Secondary port (CRT port) + actually uses primary DAC*/ + if(RADEON_BIOS16(tmp + i*2) & 0x01) { + if(!info->IsSecondary) { + info->DDCType = + (RADEON_BIOS16(tmp + i*2) & 0x0f00) >> 8; + break; + } + } else {/*Primary DAC*/ + + if(info->IsSecondary || BypassSecondary || !info->HasCRTC2) { + info->DDCType = + (RADEON_BIOS16(tmp + i*2) & 0x0f00) >> 8; + break; + } } } - } - - /* Note: One card can have multiple output formats */ - /* Note: TV support has not been implemented yet */ - - /***** - if(RADEON_BIOS16(info->FPBIOSstart + 0x32)) - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "This card supports TV output\n"); - - if(RADEON_BIOS16(info->FPBIOSstart + 0x34)) - { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "This card supports DFP output\n"); + } else { + /* orignal radeon cards, set it to DDC_VGA, + this will not work with AIW, it should be DDC_DVI, + let it fall back to VBE calls for AIW */ + info->DDCType = DDC_VGA; } - - if(RADEON_BIOS16(info->FPBIOSstart + 0x40)) - { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "This card supports LCD output\n"); - } - ******/ } -#if 0 - /*retrieving panel size info from BIOS doesn't quite work at present - */ - if(info->Port1 == MT_LCD) - { - int FPHeader = 0; - int i; - info->FPBIOSstart = 0; - return TRUE; - - /* 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: "M6 ". */ - for (i = 4; i < RADEON_VBIOS_SIZE-8; i++) - { - if (RADEON_BIOS8(i) == 'M' && - RADEON_BIOS8(i+1) == '6' && - 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) - { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Cannot find Flat Panel Header\n"); - 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) - { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Cannot find Flat Panel BIOS Start\n"); - return TRUE; - } - info->PanelXRes = RADEON_BIOS16(info->FPBIOSstart+25); - 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; } @@ -1030,11 +958,15 @@ static Bool RADEONGetPLLParameters(ScrnInfoPtr pScrn) 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; + /* + * these are somewhat sane defaults for Mac boards, we will + * need to find a good way of getting these from OpenFirmware + */ + pll->reference_freq = 2700; + pll->reference_div = 67; pll->min_pll_freq = 12500; pll->max_pll_freq = 35000; - pll->xclk = 10300; + pll->xclk = 16615; } else { bios_header = RADEON_BIOS16(0x48); pll_info_block = RADEON_BIOS16(bios_header + 0x30); @@ -1200,10 +1132,19 @@ static Bool RADEONPreInitConfig(ScrnInfoPtr pScrn) /*VE or M6 has secondary CRTC*/ info->HasCRTC2 = TRUE; break; - case PCI_CHIP_RADEON_LW: - /* M7 */ + case PCI_CHIP_R200_QL: + case PCI_CHIP_R200_QN: + case PCI_CHIP_R200_QO: + case PCI_CHIP_R200_Ql: + case PCI_CHIP_R200_BB: + /*R200 has secondary CRTC*/ + info->HasCRTC2 = TRUE; + info->IsR200 = TRUE; + break; + case PCI_CHIP_RV200_QW: /* RV200 desktop */ + case PCI_CHIP_RADEON_LW: /* M7 */ info->HasCRTC2 = TRUE; - info->IsM7 = TRUE; + info->IsRV200 = TRUE; break; default: info->HasCRTC2 = FALSE; @@ -1213,6 +1154,7 @@ static Bool RADEONPreInitConfig(ScrnInfoPtr pScrn) from = X_PROBED; info->LinearAddr = info->PciInfo->memBase[0] & 0xfc000000; + pScrn->memPhysBase = info->LinearAddr; if (dev->MemBase) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Linear address override, using 0x%08x instead of 0x%08x\n", @@ -1271,6 +1213,8 @@ static Bool RADEONPreInitConfig(ScrnInfoPtr pScrn) else pScrn->videoRam = INREG(RADEON_CONFIG_MEMSIZE) / 1024; + /* some production boards of m6 will return 0 if it's 8 MB */ + if(pScrn->videoRam == 0) pScrn->videoRam = 8192; if(info->IsSecondary) { @@ -1326,15 +1270,21 @@ static Bool RADEONPreInitConfig(ScrnInfoPtr pScrn) #if 0 case PCI_CHIP_RADEON_XX: info->IsPCI = TRUE; break; #endif - case PCI_CHIP_RADEON_QY: - case PCI_CHIP_RADEON_QZ: - case PCI_CHIP_RADEON_LW: - case PCI_CHIP_RADEON_LY: - case PCI_CHIP_RADEON_LZ: + case PCI_CHIP_RADEON_QY: + case PCI_CHIP_RADEON_QZ: + case PCI_CHIP_RADEON_LW: + case PCI_CHIP_RADEON_LY: + case PCI_CHIP_RADEON_LZ: case PCI_CHIP_RADEON_QD: case PCI_CHIP_RADEON_QE: case PCI_CHIP_RADEON_QF: case PCI_CHIP_RADEON_QG: + case PCI_CHIP_R200_QL: + case PCI_CHIP_R200_QN: + case PCI_CHIP_R200_QO: + case PCI_CHIP_R200_Ql: + case PCI_CHIP_R200_BB: + case PCI_CHIP_RV200_QW: default: info->IsPCI = FALSE; break; } } @@ -1584,7 +1534,8 @@ static int RADEONValidateFPModes(ScrnInfoPtr pScrn) if(ddc->det_mon[j].type == 0) new->Clock = ddc->det_mon[j].section.d_timings.clock / 1000; } - } + } else + new->Clock = info->DotClock; if(new->prev) new->prev->next = new; last = new; @@ -1849,6 +1800,10 @@ static Bool RADEONPreInitModes(ScrnInfoPtr pScrn) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid mode found for this DFP/LCD\n"); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "If you have an analog monitor attached but no DFP/LCD try" + "specifying\n\t'Option \"CrtScreen\"' in your X server" + "config file.\n"); return FALSE; } } @@ -1912,11 +1867,13 @@ static Bool RADEONPreInitInt10(ScrnInfoPtr pScrn, xf86Int10InfoPtr *ppInt10) { RADEONInfoPtr info = RADEONPTR(pScrn); +#if !defined(__powerpc__) if (xf86LoadSubModule(pScrn, "int10")) { xf86LoaderReqSymLists(int10Symbols, NULL); xf86DrvMsg(pScrn->scrnIndex,X_INFO,"initializing int10\n"); *ppInt10 = xf86InitInt10(info->pEnt->index); } +#endif return TRUE; } @@ -2049,8 +2006,9 @@ RADEONProbeDDC(ScrnInfoPtr pScrn, int indx) trouble...*/ static Bool RadeonGetDFPInfo(ScrnInfoPtr pScrn) { - RADEONInfoPtr info = RADEONPTR(pScrn); + RADEONInfoPtr info = RADEONPTR(pScrn); + char *s; unsigned long r; unsigned short a, b; unsigned char* RADEONMMIO; @@ -2081,42 +2039,57 @@ static Bool RadeonGetDFPInfo(ScrnInfoPtr pScrn) ddc->det_mon[i].section.d_timings.v_sync_width; info->VBlank = ddc->det_mon[i].section.d_timings.v_blanking; + return TRUE; } } } + /* in case both EDID and BIOS probings failed, we'll try to get + panel information from the registers. This will depends on + how the registers are set up by bios, not very reliable*/ mapped = RADEONMapMem(pScrn); RADEONMMIO = info->MMIO; + if(info->PanelXRes==0 || info->PanelYRes==0) { r = INREG(RADEON_FP_VERT_STRETCH); - r &= 0x00fff000; - info->PanelYRes = (unsigned short)(r >> 0x0c) + 1; + if(r & 0x08000000) { + r &= 0x00fff000; + info->PanelYRes = (unsigned short)(r >> 0x0c) + 1; + } else { + info->PanelYRes = (unsigned short)(((float)(INREG(RADEON_FP_CRTC_V_TOTAL_DISP >> 16) + 1.0) + * 4096.0 / (float) (r & 0x00000fff)) + 0.5); + } - switch(info->PanelYRes) - { - case 480: info->PanelXRes = 640; - break; - case 600: info->PanelXRes = 800; - break; - case 768: info->PanelXRes = 1024; - break; - case 1024: info->PanelXRes = 1280; - break; - case 1050: info->PanelXRes = 1400; - break; - case 1200: info->PanelXRes = 1600; - break; - default: - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to detect the panel size.\n"); - return FALSE; + r = INREG(RADEON_FP_HORZ_STRETCH); + if(r & 0x08000000) { + r &= 0x01ff0000; + info->PanelXRes = (unsigned short)(r >> 0x10) + 1; + info->PanelXRes *= 8; + } else { + info->PanelXRes = (unsigned short)(((float)(INREG(RADEON_FP_CRTC_H_TOTAL_DISP >> 16) + 1.0) * 8.0 + * 4096.0 / (float) (r & 0x0000ffff)) + 0.5); + } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Detected panel size from registers: %dx%d\n", info->PanelXRes, info->PanelYRes); + if ((s = xf86GetOptValString(info->Options, OPTION_PANEL_SIZE))) { + if (sscanf(s, "%dx%d", &info->PanelXRes, &info->PanelYRes) == 2) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Panel size: %dx%d defined in config file is used\n", + info->PanelXRes, info->PanelYRes); + } + } } - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Detected panel size: %dx%d\n", info->PanelXRes, info->PanelYRes); + if (info->PanelXRes == 0 || info->PanelYRes == 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to detect the panel size.\n"); + return FALSE; + } + if(info->HBlank == 0 || info->VBlank == 0) { r = INREG(RADEON_FP_CRTC_H_TOTAL_DISP); a = (r & RADEON_FP_CRTC_H_TOTAL_MASK) + 4; b = (r & 0x01FF0000) >> RADEON_FP_CRTC_H_DISP_SHIFT; @@ -2141,7 +2114,8 @@ static Bool RadeonGetDFPInfo(ScrnInfoPtr pScrn) - b + 1; info->VSyncWidth = (unsigned short)((r & RADEON_FP_V_SYNC_WID_MASK) >> RADEON_FP_V_SYNC_WID_SHIFT); - + } + if(mapped) RADEONUnmapMem(pScrn); return TRUE; @@ -2241,6 +2215,8 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) return FALSE; } + vgaHWGetIOBase(VGAHWPTR(pScrn)); + info->PciInfo = xf86GetPciInfoForEntity(info->pEnt->index); info->PciTag = pciTag(info->PciInfo->bus, info->PciInfo->device, @@ -2255,7 +2231,7 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) if (xf86RegisterResources(info->pEnt->index, 0, ResExclusive)) goto fail; - pScrn->racMemFlags = RAC_FB | RAC_COLORMAP; + pScrn->racMemFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR; pScrn->monitor = pScrn->confScreen->monitor; if (!RADEONPreInitVisual(pScrn)) goto fail; @@ -2293,8 +2269,6 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) if (!fbdevHWInit(pScrn, info->PciInfo, NULL)) return FALSE; pScrn->SwitchMode = fbdevHWSwitchMode; pScrn->AdjustFrame = fbdevHWAdjustFrame; - pScrn->EnterVT = RADEONEnterVTFBDev; - pScrn->LeaveVT = RADEONLeaveVTFBDev; pScrn->ValidMode = fbdevHWValidMode; } @@ -2305,7 +2279,15 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) if (!RADEONPreInitConfig(pScrn)) goto fail; +#if !defined(__powerpc__) if (!RADEONGetBIOSParameters(pScrn, pInt10)) goto fail; +#else + /* + * force type to CRT since we currently can't read BIOS to + * tell us what kind of heads we have + */ + info->DisplayType = MT_CRT; +#endif RADEONPreInitDDC(pScrn); info->HasEDID = @@ -2339,6 +2321,10 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) if (pInt10) xf86FreeInt10(pInt10); + xf86DrvMsg(pScrn->scrnIndex, X_NOTICE, + "For information on using the multimedia capabilities\n of this" + " adapter, please see http://gatos.sf.net.\n"); + return TRUE; fail: @@ -2478,7 +2464,9 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) RADEONSave(pScrn); if (info->FBDev) { + unsigned char *RADEONMMIO = info->MMIO; if (!fbdevHWModeInit(pScrn, pScrn->currentMode)) return FALSE; + info->ModeReg.surface_cntl = INREG(RADEON_SURFACE_CNTL); } else { if (!RADEONModeInit(pScrn, pScrn->currentMode)) return FALSE; } @@ -2519,6 +2507,10 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) (pScrn->displayWidth * pScrn->virtualY * info->CurrentLayout.pixel_bytes * 3 + 1023) / 1024); info->directRenderingEnabled = FALSE; + } else if (info->IsR200) { + info->directRenderingEnabled = FALSE; + xf86DrvMsg(scrnIndex, X_WARNING, + "Direct rendering not yet supported on Radeon 8500\n"); } else { if(info->IsSecondary) info->directRenderingEnabled = FALSE; @@ -2931,6 +2923,7 @@ static void RADEONRestoreCommonRegisters(ScrnInfoPtr pScrn, 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); + OUTREG(RADEON_SURFACE_CNTL, restore->surface_cntl); } /* Write CRTC registers. */ @@ -3241,6 +3234,7 @@ static void RADEONRestoreDDARegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore) OUTREG(RADEON_DDA_ON_OFF, restore->dda_on_off); } +#if 0 /* Write palette data. */ static void RADEONRestorePalette(ScrnInfoPtr pScrn, RADEONSavePtr restore) { @@ -3264,6 +3258,7 @@ static void RADEONRestorePalette(ScrnInfoPtr pScrn, RADEONSavePtr restore) OUTPAL_NEXT_CARD32(restore->palette[i]); } } +#endif /* Write out state to define a new video mode. */ static void @@ -3333,7 +3328,7 @@ RADEONRestoreMode(ScrnInfoPtr pScrn, RADEONSavePtr restore) else { RADEONRestoreCommonRegisters(pScrn, restore); - RADEONRestoreDDARegisters(pScrn, restore); + RADEONRestoreDDARegisters(pScrn, restore); if(!pRADEONEnt->HasSecondary || pRADEONEnt->IsSecondaryRestored || info->SwitchingMode) { @@ -3362,7 +3357,9 @@ RADEONRestoreMode(ScrnInfoPtr pScrn, RADEONSavePtr restore) } */ - /*RADEONRestorePalette(pScrn, &info->SavedReg);*/ +#if 0 + RADEONRestorePalette(pScrn, &info->SavedReg); +#endif } /* Read common registers. */ @@ -3384,6 +3381,7 @@ static void RADEONSaveCommonRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) 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); + save->surface_cntl = INREG(RADEON_SURFACE_CNTL); } /* Read CRTC registers. */ @@ -3552,7 +3550,15 @@ static void RADEONSave(ScrnInfoPtr pScrn) if(!info->IsSecondary) { vgaHWUnlock(hwp); - vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL); /* save mode, fonts,cmap */ +#if defined(__powerpc__) + /* temporary hack to prevent crashing on PowerMacs when trying to + * read VGA fonts and colormap, will find a better solution + * in the future + */ + vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_MODE); /* save mode only */ +#else + vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL); /* save mode, fonts,cmap */ +#endif vgaHWLock(hwp); save->dp_datatype = INREG(RADEON_DP_DATATYPE); save->rbbm_soft_reset = INREG(RADEON_RBBM_SOFT_RESET); @@ -3561,9 +3567,7 @@ static void RADEONSave(ScrnInfoPtr pScrn) save->amcgpio_mask = INREG(RADEON_AMCGPIO_MASK); } - RADEONSaveMode(pScrn, save); - } /* Restore the original (text) mode. */ @@ -3589,14 +3593,28 @@ static void RADEONRestore(ScrnInfoPtr pScrn) /* M6 card has trouble restoring text mode for its CRT. Needs this workaround.*/ - if(xf86IsEntityShared(pScrn->entityList[0])) /* && info->IsM6)*/ + if(xf86IsEntityShared(pScrn->entityList[0]) && info->IsM6) OUTREG(RADEON_DAC_CNTL2, restore->dac2_cntl); RADEONRestoreMode(pScrn, restore); + + /* Temp fix to "solve" VT switch problems. When switching VTs on + some systems, the console can either hang or the fonts can be + corrupted. This hack solves the problem 99% of the time. A + correct fix is being worked on. */ + usleep(100000); + if(!info->IsSecondary) { vgaHWUnlock(hwp); +#if defined(__powerpc__) + /* temporary hack to prevent crashing on PowerMacs when trying to + * write VGA fonts, will find a better solution in the future + */ + vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_MODE ); +#else vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_MODE | VGA_SR_FONTS ); +#endif vgaHWLock(hwp); } @@ -3734,7 +3752,7 @@ static Bool RADEONInitCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, | (hsync_wid << 16) | ((mode->Flags & V_NHSYNC) ? RADEON_CRTC_H_SYNC_POL - : RADEON_CRTC_H_SYNC_POL)); + : 0)); #if 1 /* This works for double scan mode. */ @@ -3757,7 +3775,7 @@ static Bool RADEONInitCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, | (vsync_wid << 16) | ((mode->Flags & V_NVSYNC) ? RADEON_CRTC_V_SYNC_POL - : RADEON_CRTC_V_SYNC_POL)); + : 0)); save->crtc_offset = 0; save->crtc_offset_cntl = 0; @@ -3767,6 +3785,18 @@ static Bool RADEONInitCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, (pScrn->bitsPerPixel * 8); save->crtc_pitch |= save->crtc_pitch << 16; + save->surface_cntl = RADEON_SURF_TRANSLATION_DIS; +#if X_BYTE_ORDER == X_BIG_ENDIAN + switch (pScrn->bitsPerPixel) { + case 16: + save->surface_cntl |= RADEON_NONSURF_AP0_SWP_16BPP; + break; + case 32: + save->surface_cntl |= RADEON_NONSURF_AP0_SWP_32BPP; + break; + } +#endif + RADEONTRACE(("Pitch = %d bytes (virtualX = %d, displayWidth = %d)\n", save->crtc_pitch, pScrn->virtualX, info->CurrentLayout.displayWidth)); @@ -3811,17 +3841,14 @@ static Bool RADEONInitCrtc2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save, ? RADEON_CRTC2_INTERLACE_EN : 0)); - if(!info->IsM7) + if(info->IsR200) + save->disp_output_cntl = + ((info->SavedReg.disp_output_cntl & ~(CARD32)RADEON_DISP_DAC_SOURCE_MASK) + | RADEON_DISP_DAC_SOURCE_CRTC2); + else save->dac2_cntl = info->SavedReg.dac2_cntl /*| RADEON_DAC2_DAC2_CLK_SEL*/ | RADEON_DAC2_DAC_CLK_SEL; - else - { - save->disp_output_cntl = - ((info->SavedReg.disp_output_cntl & - (CARD32)~RADEON_DISP_DAC_SOURCE_MASK) - | RADEON_DISP_DAC_SOURCE_CRTC2); - } save->crtc2_h_total_disp = ((((mode->CrtcHTotal / 8) - 1) & 0x3ff) | ((((mode->CrtcHDisplay / 8) - 1) & 0x1ff) << 16)); @@ -4382,18 +4409,25 @@ Bool RADEONEnterVT(int scrnIndex, int flags) RADEONInfoPtr info = RADEONPTR(pScrn); RADEONTRACE(("RADEONEnterVT\n")); + + if (info->FBDev) { + unsigned char *RADEONMMIO = info->MMIO; + if (!fbdevHWEnterVT(scrnIndex,flags)) return FALSE; + info->PaletteSavedOnVT = FALSE; + info->ModeReg.surface_cntl = INREG(RADEON_SURFACE_CNTL); + } else + if (!RADEONModeInit(pScrn, pScrn->currentMode)) return FALSE; + + if (info->accelOn) + RADEONEngineRestore(pScrn); + #ifdef XF86DRI if (RADEONPTR(pScrn)->directRenderingEnabled) { RADEONCP_START(pScrn, info); DRIUnlock(pScrn->pScreen); } #endif - if (!RADEONModeInit(pScrn, pScrn->currentMode)) return FALSE; - - if (info->accelOn) - RADEONEngineRestore(pScrn); - /*info->PaletteSavedOnVT = FALSE;*/ RADEONAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); return TRUE; } @@ -4404,7 +4438,7 @@ void RADEONLeaveVT(int scrnIndex, int flags) { ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; RADEONInfoPtr info = RADEONPTR(pScrn); - /*RADEONSavePtr save = &info->ModeReg;*/ + RADEONSavePtr save = &info->ModeReg; RADEONTRACE(("RADEONLeaveVT\n")); #ifdef XF86DRI @@ -4413,34 +4447,13 @@ void RADEONLeaveVT(int scrnIndex, int flags) RADEONCP_STOP(pScrn, info); } #endif - /* not used at present */ - /* - 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); - if (info->accelOn) - RADEONEngineRestore(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); + if (info->FBDev) { + RADEONSavePalette(pScrn, save); + info->PaletteSavedOnVT = TRUE; + fbdevHWLeaveVT(scrnIndex,flags); + } else + RADEONRestore(pScrn); } /* Called at the end of each server generation. Restore the original text @@ -4530,5 +4543,3 @@ static void RADEONDisplayPowerManagementSet(ScrnInfoPtr pScrn, break; } } - - diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_misc.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_misc.c index 9ccf8a6c2..55290ec03 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_misc.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_misc.c @@ -1,6 +1,6 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_misc.c,v 1.3 2001/01/06 20:58:08 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_misc.c,v 1.4 2002/01/16 16:22:28 tsi Exp $ */ /* - * Copyright 2000 through 2001 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org + * Copyright 2000 through 2002 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_probe.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_probe.c index 962ff1c36..efae8c77f 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_probe.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_probe.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_probe.c,v 1.12 2001/07/25 08:04:43 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_probe.c,v 1.15 2002/01/16 02:00:44 martin Exp $ */ /* * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and * VA Linux Systems Inc., Fremont, California. @@ -83,6 +83,12 @@ SymTabRec RADEONChipsets[] = { { PCI_CHIP_RADEON_LW, "ATI Radeon Mobility LW (AGP)" }, { PCI_CHIP_RADEON_LY, "ATI Radeon Mobility LY (AGP)" }, { PCI_CHIP_RADEON_LZ, "ATI Radeon Mobility LZ (AGP)" }, + { PCI_CHIP_R200_QL, "ATI Radeon 8500 QL (AGP)" }, + { PCI_CHIP_R200_QN, "ATI Radeon 8500 QN (AGP)" }, + { PCI_CHIP_R200_QO, "ATI Radeon 8500 QO (AGP)" }, + { PCI_CHIP_R200_Ql, "ATI Radeon 8500 Ql (AGP)" }, + { PCI_CHIP_R200_BB, "ATI Radeon 8500 BB (AGP)" }, + { PCI_CHIP_RV200_QW, "ATI Radeon 7500 QW (AGP)" }, { -1, NULL } }; @@ -96,6 +102,12 @@ PciChipsets RADEONPciChipsets[] = { { PCI_CHIP_RADEON_LW, PCI_CHIP_RADEON_LW, RES_SHARED_VGA }, { PCI_CHIP_RADEON_LY, PCI_CHIP_RADEON_LY, RES_SHARED_VGA }, { PCI_CHIP_RADEON_LZ, PCI_CHIP_RADEON_LZ, RES_SHARED_VGA }, + { PCI_CHIP_R200_QL, PCI_CHIP_R200_QL, RES_SHARED_VGA }, + { PCI_CHIP_R200_QN, PCI_CHIP_R200_QN, RES_SHARED_VGA }, + { PCI_CHIP_R200_QO, PCI_CHIP_R200_QO, RES_SHARED_VGA }, + { PCI_CHIP_R200_Ql, PCI_CHIP_R200_Ql, RES_SHARED_VGA }, + { PCI_CHIP_R200_BB, PCI_CHIP_R200_BB, RES_SHARED_VGA }, + { PCI_CHIP_RV200_QW, PCI_CHIP_RV200_QW, RES_SHARED_VGA }, { -1, -1, RES_UNDEFINED } }; @@ -222,6 +234,12 @@ RADEONProbe(DriverPtr drv, int flags) /* VE/M6 card support Dual-Head, mark the entity as sharable*/ if(pEnt->chipset == PCI_CHIP_RADEON_QY || pEnt->chipset == PCI_CHIP_RADEON_QZ || + pEnt->chipset == PCI_CHIP_R200_QL || + pEnt->chipset == PCI_CHIP_R200_QN || + pEnt->chipset == PCI_CHIP_R200_QO || + pEnt->chipset == PCI_CHIP_R200_Ql || + pEnt->chipset == PCI_CHIP_R200_BB || + pEnt->chipset == PCI_CHIP_RV200_QW || pEnt->chipset == PCI_CHIP_RADEON_LW || pEnt->chipset == PCI_CHIP_RADEON_LY || pEnt->chipset == PCI_CHIP_RADEON_LZ) diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h index 4b8b727c9..676f859fe 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h,v 1.11 2001/08/17 22:08:13 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h,v 1.13 2001/09/26 12:49:25 alanh Exp $ */ /* * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and * VA Linux Systems Inc., Fremont, California. @@ -592,6 +592,7 @@ #define RADEON_DST_HEIGHT_Y 0x15a0 #define RADEON_DST_LINE_START 0x1600 #define RADEON_DST_LINE_END 0x1604 +#define RADEON_DST_LINE_PATCOUNT 0x1608 #define RADEON_DST_OFFSET 0x1404 #define RADEON_DST_PITCH 0x1408 #define RADEON_DST_PITCH_OFFSET 0x142c @@ -1013,6 +1014,8 @@ #define RADEON_SC_TOP 0x1648 #define RADEON_SC_TOP_LEFT 0x16ec #define RADEON_SC_TOP_LEFT_C 0x1c88 +# define RADEON_SC_SIGN_MASK_LO 0x8000 +# define RADEON_SC_SIGN_MASK_HI 0x80000000 #define RADEON_SDRAM_MODE_REG 0x0158 #define RADEON_SEQ8_DATA 0x03c5 /* VGA */ #define RADEON_SEQ8_IDX 0x03c4 /* VGA */ @@ -1033,6 +1036,9 @@ #define RADEON_SUBPIC_CNTL 0x0540 /* ? */ #define RADEON_SUB_CLASS 0x0f0a /* PCI */ #define RADEON_SURFACE_CNTL 0x0b00 +# define RADEON_SURF_TRANSLATION_DIS (1 << 8) +# define RADEON_NONSURF_AP0_SWP_16BPP (1 << 20) +# define RADEON_NONSURF_AP0_SWP_32BPP (1 << 21) #define RADEON_SURFACE0_INFO 0x0b0c #define RADEON_SURFACE0_LOWER_BOUND 0x0b04 #define RADEON_SURFACE0_UPPER_BOUND 0x0b08 diff --git a/xc/programs/Xserver/hw/xfree86/drivers/chips/ct_video.c b/xc/programs/Xserver/hw/xfree86/drivers/chips/ct_video.c index 3470f1fcb..be0a4fac8 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/chips/ct_video.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/chips/ct_video.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/ct_video.c,v 1.8 2001/06/15 21:22:48 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/ct_video.c,v 1.9 2001/10/01 13:44:04 eich Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -167,6 +167,9 @@ typedef struct { CARD32 videoStatus; Time offTime; Time freeTime; + Bool doubleBuffer; + Bool manualDoubleBuffer; + int currentBuffer; } CHIPSPortPrivRec, *CHIPSPortPrivPtr; @@ -184,7 +187,6 @@ CHIPSResetVideo(ScrnInfoPtr pScrn) CHIPSHiQVSync(pScrn); mr3c = cPtr->readMR(cPtr, 0x3C); cPtr->writeMR(cPtr, 0x3C, (mr3c | 0x6)); - switch (pScrn->depth) { case 8: cPtr->writeMR(cPtr, 0x3D, 0x00); @@ -269,7 +271,10 @@ CHIPSSetupImageVideo(ScreenPtr pScreen) pPriv->colorKey = cPtr->videoKey; pPriv->videoStatus = 0; - + pPriv->doubleBuffer = TRUE; + pPriv->manualDoubleBuffer = FALSE; + pPriv->currentBuffer = 0; + /* gotta uninit this someplace */ REGION_INIT(pScreen, &pPriv->clip, NullBox, 0); @@ -601,6 +606,35 @@ CHIPSAllocateMemory( return new_linear; } +static int +CHIPSSetCurrentPlaybackBuffer(CHIPSPtr cPtr, int n) +{ + + CARD8 mr20; + mr20 = cPtr->readMR(cPtr, 0x20); + mr20 &= ~0x1B; + if (!n) mr20 |= 0x10; + cPtr->writeMR(cPtr, 0x22, mr20); + return n; +} + +static int +CHIPSWaitGetNextFrame(CHIPSPtr cPtr) +{ + volatile CARD8 mr20; + volatile CARD8 mr21; + + mr20 = cPtr->readMR(cPtr, 0x20); + while (1) { + mr21 = cPtr->readMR(cPtr, 0x21); + if (!(mr20 & (1 << 5)) || !(mr21 & 1)) + break; + } + mr20 &= ~0x4; + mr20 = cPtr->readMR(cPtr, 0x20); + return (mr21 & 2)? 0 : 1; +} + static void CHIPSDisplayVideo( ScrnInfoPtr pScrn, @@ -611,56 +645,70 @@ CHIPSDisplayVideo( int x1, int y1, int x2, int y2, BoxPtr dstBox, short src_w, short src_h, - short drw_w, short drw_h + short drw_w, short drw_h, + Bool triggerBufSwitch ){ CHIPSPtr cPtr = CHIPSPTR(pScrn); + CHIPSPortPrivPtr pPriv = GET_PORT_PRIVATE(pScrn); DisplayModePtr mode = pScrn->currentMode; - unsigned char tmp; + unsigned char tmp, m1f, m1e; + int buffer = pPriv->currentBuffer; CHIPSHiQVSync(pScrn); tmp = cPtr->readXR(cPtr, 0xD0); cPtr->writeXR(cPtr, 0xD0, (tmp | 0x10)); - tmp = cPtr->readMR(cPtr, 0x1E); - tmp &= 0xE0; /* Set Zoom and Direction */ + m1e = cPtr->readMR(cPtr, 0x1E); + m1e &= 0xE0; /* Set Zoom and Direction */ if ((!(cPtr->PanelType & ChipsLCD)) && (mode->Flags & V_INTERLACE)) - tmp |= 0x10; - cPtr->writeMR(cPtr, 0x1E, tmp); - tmp = cPtr->readMR(cPtr, 0x1F); - tmp = (tmp & 0x14); /* Mask reserved bits, unset interpolation */ + m1e |= 0x10; + + m1f = cPtr->readMR(cPtr, 0x1F); + m1f = (m1f & 0x14); /* Mask reserved bits, unset interpolation */ switch(id) { case 0x35315652: /* RGB15 */ - tmp |= 0x09; + m1f |= 0x09; break; case 0x36315652: /* RGB16 */ - tmp |= 0x08; + m1f |= 0x08; break; case FOURCC_YV12: /* YV12 */ - /* tmp |= 0x03 */ - tmp |= 0x00; + /* m1f |= 0x03 */ + m1f |= 0x00; break; case FOURCC_YUY2: /* YUY2 */ default: - tmp |= 0x00; /* Do nothing here */ + m1f |= 0x00; /* Do nothing here */ break; } - cPtr->writeMR(cPtr, 0x1F, tmp); + offset += (x1 >> 15) & ~0x01; + /* Setup Pointer 1 */ + if (!buffer || pPriv->manualDoubleBuffer || !pPriv->doubleBuffer) { + cPtr->writeMR(cPtr, 0x22, (offset & 0xF8)); + cPtr->writeMR(cPtr, 0x23, ((offset >> 8) & 0xFF)); + cPtr->writeMR(cPtr, 0x24, ((offset >> 16) & 0xFF)); + } + /* Setup Pointer 2 */ + if ((buffer && !pPriv->manualDoubleBuffer) || !pPriv->doubleBuffer) { + cPtr->writeMR(cPtr, 0x25, (offset & 0xF8)); + cPtr->writeMR(cPtr, 0x26, ((offset >> 8) & 0xFF)); + cPtr->writeMR(cPtr, 0x27, ((offset >> 16) & 0xFF)); + } + + + tmp = cPtr->readMR(cPtr, 0x04); + if (pPriv->doubleBuffer && !pPriv->manualDoubleBuffer && triggerBufSwitch) + tmp |= 0x18; + cPtr->writeMR(cPtr, 0x04, tmp); + tmp = cPtr->readMR(cPtr, 0x20); tmp &= 0xC3; + if (pPriv->doubleBuffer && !pPriv->manualDoubleBuffer && triggerBufSwitch) + tmp |= ((1 << 2 | 1 << 5) | ((buffer) ? (1 << 4) : 0)); cPtr->writeMR(cPtr, 0x20, tmp); - offset += (x1 >> 15) & ~0x01; - - /* Setup Pointer 1 */ - cPtr->writeMR(cPtr, 0x22, (offset & 0xF8)); - cPtr->writeMR(cPtr, 0x23, ((offset >> 8) & 0xFF)); - cPtr->writeMR(cPtr, 0x24, ((offset >> 16) & 0xFF)); - /* Setup Pointer 2 */ - cPtr->writeMR(cPtr, 0x25, (offset & 0xF8)); - cPtr->writeMR(cPtr, 0x26, ((offset >> 8) & 0xFF)); - cPtr->writeMR(cPtr, 0x27, ((offset >> 16) & 0xFF)); cPtr->writeMR(cPtr, 0x28, ((width >> 2) - 1)); /* Width */ cPtr->writeMR(cPtr, 0x34, ((width >> 2) - 1)); @@ -688,25 +736,21 @@ CHIPSDisplayVideo( /* Horizontal Zoom */ if (drw_w > src_w) { - tmp = cPtr->readMR(cPtr, 0x1F); - cPtr->writeMR(cPtr, 0x1F, (tmp | 0x20)); /* set H-interpolation */ - tmp = cPtr->readMR(cPtr, 0x1E); - cPtr->writeMR(cPtr, 0x1E, (tmp | 0x04)); + m1f = m1f | 0x20; /* set H-interpolation */ + m1e = m1e | 0x04; tmp = cPtr->VideoZoomMax * src_w / drw_w; cPtr->writeMR(cPtr, 0x32, tmp); } /* Vertical Zoom */ if (drw_h > src_h) { -#if 1 - tmp = cPtr->readMR(cPtr, 0x1F); - cPtr->writeMR(cPtr, 0x1F, (tmp | 0xc0)); /* set V-interpolation */ -#endif - tmp = cPtr->readMR(cPtr, 0x1E); - cPtr->writeMR(cPtr, 0x1E, (tmp | 0x08)); + m1f = m1f | 0xc0; + m1e = m1e | 0x08; /* set V-interpolation */ tmp = cPtr->VideoZoomMax * src_h / drw_h ; cPtr->writeMR(cPtr, 0x33, tmp); } + cPtr->writeMR(cPtr, 0x1F, m1f); + cPtr->writeMR(cPtr, 0x1E, m1e); tmp = cPtr->readMR(cPtr, 0x3C); cPtr->writeMR(cPtr, 0x3C, (tmp | 0x7)); @@ -734,7 +778,7 @@ CHIPSPutImage( int top, left, npixels, nlines, bpp; BoxRec dstBox; CARD32 tmp; - + if(drw_w > 16384) drw_w = 16384; /* Clip */ @@ -761,6 +805,8 @@ CHIPSPutImage( dstPitch = ((width << 1) + 15) & ~15; new_size = ((dstPitch * height) + bpp - 1) / bpp; + if (pPriv->doubleBuffer) + new_size <<= 1; switch(id) { case FOURCC_YV12: /* YV12 */ @@ -774,8 +820,15 @@ CHIPSPutImage( break; } - if(!(pPriv->linear = CHIPSAllocateMemory(pScrn, pPriv->linear, new_size))) + if(!(pPriv->linear = CHIPSAllocateMemory(pScrn, pPriv->linear, new_size))) { + if (pPriv->doubleBuffer && + (pPriv->linear = CHIPSAllocateMemory(pScrn, pPriv->linear, + new_size >> 1))) { + new_size >>= 1; + pPriv->doubleBuffer = FALSE; + } else return BadAlloc; + } /* copy data */ top = y1 >> 16; @@ -784,6 +837,11 @@ CHIPSPutImage( left <<= 1; offset = pPriv->linear->offset * bpp; + if (!pPriv->manualDoubleBuffer) + pPriv->currentBuffer = CHIPSWaitGetNextFrame(cPtr); + if(pPriv->doubleBuffer && pPriv->currentBuffer) + offset += (new_size * bpp) >> 1; + dst_start = cPtr->FbBase + offset + left + (top * dstPitch); switch(id) { @@ -813,12 +871,15 @@ CHIPSPutImage( REGION_RECTS(clipBoxes)); } -offset += top * dstPitch; + offset += top * dstPitch; CHIPSDisplayVideo(pScrn, id, offset, width, height, dstPitch, - x1, y1, x2, y2, &dstBox, src_w, src_h, drw_w, drw_h); + x1, y1, x2, y2, &dstBox, src_w, src_h, drw_w, drw_h, TRUE); pPriv->videoStatus = CLIENT_VIDEO_ON; + if (pPriv->manualDoubleBuffer) + pPriv->currentBuffer ^= 1; + return Success; } @@ -1047,10 +1108,14 @@ CHIPSDisplaySurface( dstBox.y1 -= pScrn->frameY0; dstBox.y2 -= pScrn->frameY0; + if (portPriv->doubleBuffer) + portPriv->currentBuffer = CHIPSSetCurrentPlaybackBuffer(cPtr,0); + else + portPriv->currentBuffer = 0; CHIPSDisplayVideo(pScrn, surface->id, surface->offsets[0], surface->width, surface->height, surface->pitches[0], - x1, y1, x2, y2, &dstBox, src_w, src_h, drw_w, drw_h); + x1, y1, x2, y2, &dstBox, src_w, src_h, drw_w, drw_h, FALSE); XAAFillSolidRects(pScrn, portPriv->colorKey, GXcopy, ~0, REGION_NUM_RECTS(clipBoxes), diff --git a/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp.h b/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp.h index 474cfe158..01c530168 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp.h,v 1.7 2001/05/04 19:05:35 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp.h,v 1.8 2001/10/01 13:44:05 eich Exp $ */ /* (c) Itai Nahshon */ @@ -77,6 +77,7 @@ typedef struct alpRec { /* MMIO Base for BitBLT operation. This is IOBase for 5446 and 7548, IOBase+0x100 for 5480 */ unsigned char * BLTBase; + CARD32 transRop; /* XXX For XF86Config based mem configuration */ CARD32 sr0f, sr17; } AlpRec, *AlpPtr; 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 89eb3192f..500650a36 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.24 2001/08/17 13:27:55 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_driver.c,v 1.26 2002/01/04 21:22:29 tsi Exp $ */ /* All drivers should typically include these */ #include "xf86.h" @@ -754,7 +754,7 @@ AlpPreInit(ScrnInfoPtr pScrn, int flags) * XXX Check if this is correct */ if (!pCir->UseMMIO) { - pScrn->racIoFlags = RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT; + pScrn->racIoFlags = RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT | RAC_FB; xf86SetOperatingState(resVgaMemShared, pCir->pEnt->index,ResUnusedOpr); } else { xf86SetOperatingState(RES_SHARED_VGA, pCir->pEnt->index, ResUnusedOpr); @@ -892,7 +892,7 @@ AlpPreInit(ScrnInfoPtr pScrn, int flags) break; } - /* We use a programamble clock */ + /* We use a programmable clock */ pScrn->progClock = TRUE; /* XXX Set HW cursor use */ 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 5872a905a..36a09aae3 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.6 2001/02/15 17:39:27 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaa.c,v 1.7 2001/10/01 13:44:05 eich Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -91,16 +91,14 @@ AlpSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, dest = y2 * pitch + x2 * pScrn->bitsPerPixel / 8; source = y1 * pitch + x1 * pScrn->bitsPerPixel / 8; if (dest > source) { - decrement = 1; + decrement = 1 << 8; dest += hh * pitch + ww; source += hh * pitch + ww; } WAIT; - outb(0x3CE, 0x30); - outb(0x3CF, decrement); - outb(0x3CE, 0x31); + outw(0x3CE, decrement | 0x30); /* Width */ outw(0x3CE, ((ww << 8) & 0xff00) | 0x20); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaam.c b/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaam.c index e77926899..52ceb9e16 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaam.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaam.c @@ -1,6 +1,6 @@ /* (c) Itai Nahshon */ - -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaam.c,v 1.6 2001/02/15 17:39:27 eich Exp $ */ +#define DEBUG +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/alp_xaam.c,v 1.7 2001/10/01 13:44:05 eich Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -18,23 +18,23 @@ #ifdef DEBUG #define minb(p) \ - ErrorF("minb(%X)\n", p),\ - MMIO_IN8(pCir->chip.alp->BLTBase, (p)) + (ErrorF("minb(%X)\n", p),\ + MMIO_IN8(pCir->chip.alp->BLTBase, (p))) #define moutb(p,v) \ - ErrorF("moutb(%X)\n", p),\ - MMIO_OUT8(pCir->chip.alp->BLTBase, (p),(v)) + (ErrorF("moutb(%X, %X)\n", p,v),\ + MMIO_OUT8(pCir->chip.alp->BLTBase, (p),(v))) #define vga_minb(p) \ - ErrorF("minb(%X)\n", p),\ - MMIO_IN8(hwp->MMIOBase, (hwp->MMIOOffset + (p))) + (ErrorF("minb(%X)\n", p),\ + MMIO_IN8(hwp->MMIOBase, (hwp->MMIOOffset + (p)))) #define vga_moutb(p,v) \ - ErrorF("moutb(%X)\n", p),\ - MMIO_OUT8(pCir->MMIOBase, (hwp->MMIOOffset + (p)),(v)) + { ErrorF("moutb(%X, %X)\n", p,v);\ + MMIO_OUT8(hwp->MMIOBase, (hwp->MMIOOffset + (p)),(v));} #define minl(p) \ - ErrorF("minl(%X)\n", p),\ - MMIO_IN32(pCir->chip.alp->BLTBase, (p)) + (ErrorF("minl(%X)\n", p),\ + MMIO_IN32(pCir->chip.alp->BLTBase, (p))) #define moutl(p,v) \ - ErrorF("moutl(%X)\n", p),\ - MMIO_OUT32(pCir->chip.alp->BLTBase, (p),(v)) + (ErrorF("moutl(%X, %X)\n", p,v),\ + MMIO_OUT32(pCir->chip.alp->BLTBase, (p),(v))) #else #define minb(p) MMIO_IN8(pCir->chip.alp->BLTBase, (p)) #define moutb(p,v) MMIO_OUT8(pCir->chip.alp->BLTBase, (p),(v)) @@ -65,9 +65,7 @@ static const CARD8 translated_rop[] = }; #define WAIT while(minl(0x40) & pCir->chip.alp->waitMsk){}; -#define WAIT_1 while(minl(0x40) & 0x1){}; - -#define SetupForRop(rop) moutb(0x1A, translated_rop[rop]) +#define WAIT_1 while((minl(0x40)) & 0x1){}; static void AlpSync(ScrnInfoPtr pScrn) { @@ -88,8 +86,8 @@ AlpSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop, WAIT; - SetupForRop(rop); - + pCir->chip.alp->transRop = translated_rop[rop] << 16; + #ifdef ALP_DEBUG ErrorF("AlpSetupForScreenToScreenCopy xdir=%d ydir=%d rop=%x planemask=%x trans_color=%x\n", xdir, ydir, rop, planemask, trans_color); @@ -124,7 +122,7 @@ AlpSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, moutl(0x08, (hh << 16) | ww); /* source */ moutl(0x14, source & 0x3fffff); - moutl(0x18, 0x0d0000 | decrement); + moutl(0x18, pCir->chip.alp->transRop | decrement); /* dest */ write_mem_barrier(); @@ -153,8 +151,6 @@ AlpSetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, WAIT; - SetupForRop(rop); - #ifdef ALP_DEBUG ErrorF("AlpSetupForSolidFill color=%x rop=%x planemask=%x\n", color, rop, planemask); @@ -164,7 +160,9 @@ AlpSetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, /* Set dest pitch */ moutl(0x0C, pitch & 0x1fff); - moutl(0x18, (0xC0|((pScrn->bitsPerPixel - 8) << 1)) | 0x040d0000); + moutl(0x18, (((pScrn->bitsPerPixel - 8) << 1)) + | translated_rop[rop] << 16 + | 0x040000C0); } static void @@ -249,6 +247,7 @@ AlpXAAInitMMIO(ScreenPtr pScreen) switch (pCir->Chipset) { case PCI_CHIP_GD5480: + case PCI_CHIP_GD5446: pCir->chip.alp->BLTBase = pCir->IOBase + 0x100; break; default: diff --git a/xc/programs/Xserver/hw/xfree86/drivers/cirrus/cir_dga.c b/xc/programs/Xserver/hw/xfree86/drivers/cirrus/cir_dga.c index 233550fb7..767716079 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/cirrus/cir_dga.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/cirrus/cir_dga.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/cir_dga.c,v 1.6 2001/04/01 14:00:10 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/cirrus/cir_dga.c,v 1.7 2001/10/01 13:44:05 eich Exp $ */ /* * Copyright 2000 by Egbert Eich * @@ -78,7 +78,6 @@ CirDGAInit(ScreenPtr pScreen) if (!pCir->DGAnumModes) { - ErrorF("DGAINIT\n"); pMode = firstMode = pScrn->modes; while (pMode) { newmodes = xrealloc(modes, (num + 1) * sizeof (DGAModeRec)); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint.h b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint.h index 3a1a883da..731d83a8e 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.51 2001/08/19 02:47:50 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint.h,v 1.54 2001/12/08 16:01:52 alanh Exp $ */ /* * Copyright 1997-2001 by Alan Hourihane <alanh@fairlite.demon.co.uk> * @@ -179,6 +179,7 @@ typedef struct { GLINTRegRec DRContextRegs; #endif OptionInfoPtr Options; + Bool PM3_UsingSGRAM; } GLINTRec, *GLINTPtr; /* Defines for PCI data */ @@ -197,6 +198,8 @@ typedef struct { ((PCI_VENDOR_3DLABS << 16) | PCI_CHIP_PERMEDIA3) #define PCI_VENDOR_3DLABS_CHIP_PERMEDIA4 \ ((PCI_VENDOR_3DLABS << 16) | PCI_CHIP_PERMEDIA4) +#define PCI_VENDOR_3DLABS_CHIP_R4 \ + ((PCI_VENDOR_3DLABS << 16) | PCI_CHIP_R4) #define PCI_VENDOR_3DLABS_CHIP_300SX \ ((PCI_VENDOR_3DLABS << 16) | PCI_CHIP_300SX) #define PCI_VENDOR_3DLABS_CHIP_500TX \ @@ -205,6 +208,8 @@ typedef struct { ((PCI_VENDOR_3DLABS << 16) | PCI_CHIP_MX) #define PCI_VENDOR_3DLABS_CHIP_GAMMA \ ((PCI_VENDOR_3DLABS << 16) | PCI_CHIP_GAMMA) +#define PCI_VENDOR_3DLABS_CHIP_GAMMA2 \ + ((PCI_VENDOR_3DLABS << 16) | PCI_CHIP_GAMMA2) #define PCI_VENDOR_3DLABS_CHIP_DELTA \ ((PCI_VENDOR_3DLABS << 16) | PCI_CHIP_DELTA) @@ -219,6 +224,7 @@ void Permedia2RestoreDACValues(ScrnInfoPtr pScrn); void Permedia2Restore(ScrnInfoPtr pScrn, GLINTRegPtr glintReg); void Permedia2Save(ScrnInfoPtr pScrn, GLINTRegPtr glintReg); Bool Permedia2Init(ScrnInfoPtr pScrn, DisplayModePtr mode); +void Permedia2PreInit(ScrnInfoPtr pScrn); Bool Permedia2AccelInit(ScreenPtr pScreen); void Permedia2Sync(ScrnInfoPtr pScrn); void Permedia2InitializeEngine(ScrnInfoPtr pScrn); @@ -328,6 +334,7 @@ Bool GLINTSwitchMode(int scrnIndex, DisplayModePtr mode, int flags); void GLINTAdjustFrame(int scrnIndex, int x, int y, int flags); extern int partprodPermedia[]; +extern const char *GLINTint10Symbols[]; Bool GLINTDGAInit(ScreenPtr pScreen); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dga.c b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dga.c index 0b6587185..ece765767 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dga.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dga.c @@ -21,7 +21,7 @@ * * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk> */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dga.c,v 1.3 2001/04/10 20:33:30 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dga.c,v 1.4 2001/12/16 21:36:50 alanh Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -42,10 +42,6 @@ static int GLINT_GetViewport(ScrnInfoPtr); static void GLINT_SetViewport(ScrnInfoPtr, int, int, int); static void GLINT_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long); static void GLINT_BlitRect(ScrnInfoPtr, int, int, int, int, int, int); -#if 0 -static void GLINT_BlitTransRect(ScrnInfoPtr, int, int, int, int, int, int, - unsigned long); -#endif static DGAFunctionRec GLINTDGAFuncs = { @@ -57,11 +53,7 @@ DGAFunctionRec GLINTDGAFuncs = { GLINT_Sync, GLINT_FillRect, GLINT_BlitRect, -#if 0 - GLINT_BlitTransRect -#else NULL -#endif }; Bool @@ -101,7 +93,7 @@ SECOND_PASS: currentMode->mode = pMode; currentMode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE; if(!pGlint->NoAccel) - currentMode->flags |= DGA_FILL_RECT /*| DGA_BLIT_RECT*/; + currentMode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT; if(pMode->Flags & V_DBLSCAN) currentMode->flags |= DGA_DOUBLESCAN; if(pMode->Flags & V_INTERLACE) @@ -260,22 +252,6 @@ GLINT_BlitRect( } } - -#if 0 -static void -GLINT_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 GLINT_OpenFramebuffer( ScrnInfoPtr pScrn, 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 df222f6ef..3377d3a0a 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.135 2001/08/18 11:37:30 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c,v 1.144 2002/01/04 21:22:30 tsi Exp $ */ #include "fb.h" #include "cfb8_32.h" @@ -131,6 +131,7 @@ static SymTabRec GLINTVGAChipsets[] = { { PCI_VENDOR_TI_CHIP_PERMEDIA2, "ti_pm2" }, { PCI_VENDOR_TI_CHIP_PERMEDIA, "ti_pm" }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA4, "pm4" }, + { PCI_VENDOR_3DLABS_CHIP_R4, "r4" }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA3, "pm3" }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V, "pm2v" }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA2, "pm2" }, @@ -142,6 +143,7 @@ static PciChipsets GLINTVGAPciChipsets[] = { { PCI_VENDOR_TI_CHIP_PERMEDIA2, PCI_VENDOR_TI_CHIP_PERMEDIA2, RES_SHARED_VGA }, { PCI_VENDOR_TI_CHIP_PERMEDIA, PCI_VENDOR_TI_CHIP_PERMEDIA, NULL }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA4, PCI_VENDOR_3DLABS_CHIP_PERMEDIA4, RES_SHARED_VGA }, + { PCI_VENDOR_3DLABS_CHIP_R4, PCI_VENDOR_3DLABS_CHIP_R4, RES_SHARED_VGA }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA3, PCI_VENDOR_3DLABS_CHIP_PERMEDIA3, RES_SHARED_VGA }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V, PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V, RES_SHARED_VGA }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA2, PCI_VENDOR_3DLABS_CHIP_PERMEDIA2, RES_SHARED_VGA }, @@ -151,8 +153,10 @@ static PciChipsets GLINTVGAPciChipsets[] = { static SymTabRec GLINTChipsets[] = { { PCI_VENDOR_3DLABS_CHIP_GAMMA, "gamma" }, + { PCI_VENDOR_3DLABS_CHIP_GAMMA2, "gamma2" }, { PCI_VENDOR_TI_CHIP_PERMEDIA2, "ti_pm2" }, { PCI_VENDOR_TI_CHIP_PERMEDIA, "ti_pm" }, + { PCI_VENDOR_3DLABS_CHIP_R4, "r4" }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA4, "pm4" }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA3, "pm3" }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V, "pm2v" }, @@ -167,8 +171,10 @@ static SymTabRec GLINTChipsets[] = { static PciChipsets GLINTPciChipsets[] = { { PCI_VENDOR_3DLABS_CHIP_GAMMA, PCI_VENDOR_3DLABS_CHIP_GAMMA, NULL }, + { PCI_VENDOR_3DLABS_CHIP_GAMMA2, PCI_VENDOR_3DLABS_CHIP_GAMMA2, NULL }, { PCI_VENDOR_TI_CHIP_PERMEDIA2, PCI_VENDOR_TI_CHIP_PERMEDIA2, RES_SHARED_VGA }, { PCI_VENDOR_TI_CHIP_PERMEDIA, PCI_VENDOR_TI_CHIP_PERMEDIA, NULL }, + { PCI_VENDOR_3DLABS_CHIP_R4, PCI_VENDOR_3DLABS_CHIP_R4, RES_SHARED_VGA }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA4, PCI_VENDOR_3DLABS_CHIP_PERMEDIA4, RES_SHARED_VGA }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA3, PCI_VENDOR_3DLABS_CHIP_PERMEDIA3, RES_SHARED_VGA }, { PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V, PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V, RES_SHARED_VGA }, @@ -325,7 +331,7 @@ static const char *fbdevHWSymbols[] = { NULL }; -static const char *int10Symbols[] = { +const char *GLINTint10Symbols[] = { "xf86FreeInt10", "xf86InitInt10", NULL @@ -337,6 +343,7 @@ static const char *drmSymbols[] = { "drmAddMap", "drmCtlInstHandler", "drmFreeVersion", + "drmGetInterruptFromBusID", "drmGetVersion", "drmMapBufs", "drmUnmapBufs", @@ -386,7 +393,7 @@ glintSetup(pointer module, pointer opts, int *errmaj, int *errmin) xf86AddDriver(&GLINT, module, 0); LoaderRefSymLists(fbSymbols, ddcSymbols, i2cSymbols, xaaSymbols, xf8_32bppSymbols, - shadowSymbols, fbdevHWSymbols, int10Symbols, + shadowSymbols, fbdevHWSymbols, GLINTint10Symbols, vbeSymbols, ramdacSymbols, #ifdef XF86DRI drmSymbols, driSymbols, @@ -753,6 +760,7 @@ GLINTProbe(DriverPtr drv, int flags) } else /* Only claim other chips when GAMMA is used */ if ((pPci->chipType == PCI_CHIP_GAMMA) || + (pPci->chipType == PCI_CHIP_GAMMA2) || (pPci->chipType == PCI_CHIP_DELTA)) { while (*checkusedPci != NULL) { int eIndex; @@ -861,6 +869,7 @@ GetAccelPitchValues(ScrnInfoPtr pScrn) linep = &partprod500TX[0]; break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: /* When GAMMA/DELTA in use, we always have MultiChip defined, even if * only one chip is connected to GAMMA/DELTA as the entities > 1 @@ -1023,6 +1032,7 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) (pPci->chipType == PCI_CHIP_TI_PERMEDIA) || (pPci->chipType == PCI_CHIP_500TX) || (pPci->chipType == PCI_CHIP_300SX) || + (pPci->chipType == PCI_CHIP_R4) || (pPci->chipType == PCI_CHIP_PERMEDIA3) ) { pGlint->MultiChip = pPci->chipType; if (pGlint->numMultiDevices >= GLINT_MAX_MULTI_DEVICES) { @@ -1043,6 +1053,7 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) pciVideoPtr pPci = xf86GetPciInfoForEntity(pEnt->index); if ( ((pPci->chipType == PCI_CHIP_GAMMA) || + (pPci->chipType == PCI_CHIP_GAMMA2) || (pPci->chipType == PCI_CHIP_DELTA)) && (pGlint->numMultiDevices == 0) ) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, @@ -1056,6 +1067,7 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) pciVideoPtr pPci = xf86GetPciInfoForEntity(pEnt->index); if ((pPci->chipType != PCI_CHIP_GAMMA) && + (pPci->chipType != PCI_CHIP_GAMMA2) && (pPci->chipType != PCI_CHIP_DELTA)) { GLINTProbeDDC(pScrn, pGlint->pEnt->index); return TRUE; @@ -1078,15 +1090,14 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) * We support both 24bpp and 32bpp layouts, so indicate that. */ if (FBDevProbed) { - int default_depth; + int default_depth, fbbpp; if (!fbdevHWInit(pScrn,NULL,xf86FindOptionValue(pGlint->pEnt->device->options,"fbdev"))) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "fbdevHWInit failed!\n"); return FALSE; } - default_depth = fbdevHWGetDepth(pScrn); - if (!xf86SetDepthBpp(pScrn, default_depth, default_depth, default_depth, - Support24bppFb | Support32bppFb)) + default_depth = fbdevHWGetDepth(pScrn,&fbbpp); + if (!xf86SetDepthBpp(pScrn, default_depth, default_depth, fbbpp,0)) return FALSE; } else { if (!xf86SetDepthBpp(pScrn, 8, 0, 0, Support24bppFb | Support32bppFb @@ -1152,7 +1163,7 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) } } - /* We use a programamble clock */ + /* We use a programmable clock */ pScrn->progClock = TRUE; /* Collect all of the relevant option flags (fill in pScrn->options) */ @@ -1415,12 +1426,17 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) /* We have to boot some multiple head type boards here */ GLINTMapMem(pScrn); switch (pGlint->Chipset) { + case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: Permedia3PreInit(pScrn); break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V: Permedia2VPreInit(pScrn); break; + case PCI_VENDOR_3DLABS_CHIP_PERMEDIA2: + case PCI_VENDOR_TI_CHIP_PERMEDIA2: + Permedia2PreInit(pScrn); + break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: switch (pGlint->MultiChip) { case PCI_CHIP_PERMEDIA3: @@ -1520,12 +1536,14 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) pScrn->videoRam = (((GLINT_READ_REG(PMMemConfig) >> 29) & 0x03) + 1) * 2048; break; + case PCI_VENDOR_3DLABS_CHIP_R4: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: pScrn->videoRam = Permedia3MemorySizeDetect(pScrn); break; case PCI_VENDOR_3DLABS_CHIP_DELTA: case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: switch (pGlint->MultiChip) { case PCI_CHIP_PERMEDIA: case PCI_CHIP_TI_PERMEDIA: @@ -1558,6 +1576,11 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) "Attached Rasterizer is Permedia3\n"); pScrn->videoRam = Permedia3MemorySizeDetect(pScrn); break; + case PCI_CHIP_R4: + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Attached Rasterizer is R4\n"); + pScrn->videoRam = Permedia3MemorySizeDetect(pScrn); + break; } xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Number of Rasterizers attached is %d\n", @@ -1574,8 +1597,9 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) /* OVERRIDE videoRam/FbMapSize, for Multiply connected chips to GAMMA */ pGlint->MultiAperture = FALSE; - if ( (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA) && - (pGlint->numMultiDevices == 2) ) { + if ( ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA) || + (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA2)) && + (pGlint->numMultiDevices == 2) ) { CARD32 chipconfig; CARD32 size = 0; CARD32 temp; @@ -1661,8 +1685,14 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) return FALSE; } break; + case PCI_VENDOR_3DLABS_CHIP_R4: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: + if (pScrn->bitsPerPixel == 24) { + xf86DrvMsg(pScrn->scrnIndex, from, + "-depth 24 -pixmap24 not supported by this chip.\n"); + return FALSE; + } pGlint->FIFOSize = 120; maxheight = 4096; maxwidth = 4096; @@ -1771,6 +1801,7 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) } break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: pGlint->FIFOSize = 32; if (pScrn->bitsPerPixel == 24) { xf86DrvMsg(pScrn->scrnIndex, from, @@ -1840,7 +1871,8 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) } } if (!pGlint->RamDac) { - if (pGlint->MultiChip == PCI_CHIP_PERMEDIA3) { + if ((pGlint->MultiChip == PCI_CHIP_PERMEDIA3) || + (pGlint->MultiChip == PCI_CHIP_R4)) { pGlint->RefClock = 14318; pGlint->RamDacRec = RamDacCreateInfoRec(); pGlint->RamDacRec->ReadDAC = Permedia2vInIndReg; @@ -1866,12 +1898,13 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) /* Initialize the card through int10 interface if needed */ if (pGlint->Chipset != PCI_VENDOR_3DLABS_CHIP_GAMMA && + pGlint->Chipset != PCI_VENDOR_3DLABS_CHIP_GAMMA2 && pGlint->Chipset != PCI_VENDOR_3DLABS_CHIP_DELTA && - !xf86IsPrimaryPci(pGlint->PciInfo)) { + !xf86IsPrimaryPci(pGlint->PciInfo) && !pGlint->FBDev) { if ( xf86LoadSubModule(pScrn, "int10")){ xf86Int10InfoPtr pInt; - xf86LoaderReqSymLists(int10Symbols, NULL); + xf86LoaderReqSymLists(GLINTint10Symbols, NULL); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Initializing int10\n"); pInt = xf86InitInt10(pGlint->pEnt->index); xf86FreeInt10(pInt); @@ -1962,6 +1995,9 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) } if ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA3) || (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA4) || + (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_R4) || + ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA2) && + (pGlint->MultiChip == PCI_CHIP_R4)) || ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA) && (pGlint->MultiChip == PCI_CHIP_PERMEDIA3)) ) pGlint->MaxClock = 300000; @@ -1992,6 +2028,9 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) if ((pGlint->NoAccel) || (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA3) || (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA4) || + (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_R4) || + ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA2) && + (pGlint->MultiChip == PCI_CHIP_R4)) || ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA) && (pGlint->MultiChip == PCI_CHIP_PERMEDIA3)) ) { /* @@ -2133,6 +2172,7 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) pGlint->bppalign = 0; break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: switch (pGlint->MultiChip) { case PCI_CHIP_MX: @@ -2150,7 +2190,8 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) break; } - if ( (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA) && + if ( ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA) || + (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA2)) && (pGlint->numMultiDevices == 2) ) { int bytesPerPixel, realWidthBytes, inputXSpanBytes; CARD32 postMultiply, productEnable, use16xProduct, inputXSpan; @@ -2301,6 +2342,7 @@ GLINTPreInit(ScrnInfoPtr pScrn, int flags) (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V) || (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA3) || (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA4) || + (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_R4) || (pGlint->Chipset == PCI_VENDOR_TI_CHIP_PERMEDIA2)) { if (xf86LoadSubModule(pScrn, "i2c")) { I2CBusPtr pBus; @@ -2454,6 +2496,7 @@ GLINTSave(ScrnInfoPtr pScrn) break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: Permedia3Save(pScrn, glintReg); break; case PCI_VENDOR_TI_CHIP_PERMEDIA: @@ -2468,6 +2511,7 @@ GLINTSave(ScrnInfoPtr pScrn) (*pGlint->RamDac->Save)(pScrn, pGlint->RamDacRec, RAMDACreg); break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: switch (pGlint->MultiChip) { case PCI_CHIP_500TX: @@ -2489,6 +2533,7 @@ GLINTSave(ScrnInfoPtr pScrn) PermediaSave(pScrn, glintReg); (*pGlint->RamDac->Save)(pScrn, pGlint->RamDacRec, RAMDACreg); break; + case PCI_CHIP_R4: case PCI_CHIP_PERMEDIA3: if (pGlint->numMultiDevices == 2) { ACCESSCHIP2(); @@ -2532,6 +2577,7 @@ GLINTModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: ret = Permedia3Init(pScrn, mode, glintReg); break; case PCI_VENDOR_TI_CHIP_PERMEDIA: @@ -2544,6 +2590,7 @@ GLINTModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) ret = TXInit(pScrn, mode, glintReg); break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: switch (pGlint->MultiChip) { case PCI_CHIP_MX: @@ -2560,6 +2607,7 @@ GLINTModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) case PCI_CHIP_TI_PERMEDIA: ret = PermediaInit(pScrn, mode); break; + case PCI_CHIP_R4: case PCI_CHIP_PERMEDIA3: if (pGlint->numMultiDevices == 2) { ACCESSCHIP2(); @@ -2591,6 +2639,7 @@ GLINTModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: Permedia3Restore(pScrn, glintReg); break; case PCI_VENDOR_TI_CHIP_PERMEDIA: @@ -2605,6 +2654,7 @@ GLINTModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) (*pGlint->RamDac->Restore)(pScrn, pGlint->RamDacRec, RAMDACreg); break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: switch (pGlint->MultiChip) { case PCI_CHIP_500TX: @@ -2626,6 +2676,7 @@ GLINTModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) PermediaRestore(pScrn, glintReg); (*pGlint->RamDac->Restore)(pScrn, pGlint->RamDacRec, RAMDACreg); break; + case PCI_CHIP_R4: case PCI_CHIP_PERMEDIA3: if (pGlint->numMultiDevices == 2) { ACCESSCHIP2(); @@ -2676,6 +2727,7 @@ GLINTRestore(ScrnInfoPtr pScrn) break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: Permedia3Restore(pScrn, glintReg); break; case PCI_VENDOR_TI_CHIP_PERMEDIA: @@ -2690,6 +2742,7 @@ GLINTRestore(ScrnInfoPtr pScrn) (*pGlint->RamDac->Restore)(pScrn, pGlint->RamDacRec, RAMDACreg); break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: switch (pGlint->MultiChip) { case PCI_CHIP_MX: @@ -2711,6 +2764,7 @@ GLINTRestore(ScrnInfoPtr pScrn) PermediaRestore(pScrn, glintReg); (*pGlint->RamDac->Restore)(pScrn, pGlint->RamDacRec, RAMDACreg); break; + case PCI_CHIP_R4: case PCI_CHIP_PERMEDIA3: if (pGlint->numMultiDevices == 2) { ACCESSCHIP2(); @@ -2923,6 +2977,7 @@ GLINTScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: Permedia3AccelInit(pScreen); break; case PCI_VENDOR_TI_CHIP_PERMEDIA: @@ -2934,6 +2989,7 @@ GLINTScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) TXAccelInit(pScreen); break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: switch (pGlint->MultiChip) { case PCI_CHIP_500TX: @@ -2947,6 +3003,7 @@ GLINTScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) case PCI_CHIP_TI_PERMEDIA: PermediaAccelInit(pScreen); break; + case PCI_CHIP_R4: case PCI_CHIP_PERMEDIA3: Permedia3AccelInit(pScreen); break; @@ -2974,6 +3031,9 @@ GLINTScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) if ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V) || (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA3) || (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA4) || + (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_R4) || + ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA2) && + (pGlint->MultiChip == PCI_CHIP_R4)) || ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA) && (pGlint->MultiChip == PCI_CHIP_PERMEDIA3)) ) Permedia2vHWCursorInit(pScreen); @@ -2995,6 +3055,9 @@ GLINTScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) if ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA3) || (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_PERMEDIA4) || + (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_R4) || + ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA2) && + (pGlint->MultiChip == PCI_CHIP_R4)) || ((pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA) && (pGlint->MultiChip == PCI_CHIP_PERMEDIA3)) ) { if (!xf86HandleColormaps(pScreen, 256, pScrn->rgbBits, @@ -3058,6 +3121,7 @@ GLINTScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) } #endif + pScrn->memPhysBase = pGlint->FbAddress; pScrn->fbOffset = 0; pGlint->CloseScreen = pScreen->CloseScreen; @@ -3077,10 +3141,13 @@ GLINTScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: Permedia3InitVideo(pScreen); break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: switch (pGlint->MultiChip) { + case PCI_CHIP_R4: case PCI_CHIP_PERMEDIA3: Permedia3InitVideo(pScreen); } @@ -3119,6 +3186,7 @@ GLINTSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: Permedia3InitializeEngine(pScrn); break; case PCI_VENDOR_TI_CHIP_PERMEDIA: @@ -3133,6 +3201,7 @@ GLINTSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) SXInitializeEngine(pScrn); break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: switch (pGlint->MultiChip) { case PCI_CHIP_500TX: @@ -3146,6 +3215,7 @@ GLINTSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) case PCI_CHIP_TI_PERMEDIA: PermediaInitializeEngine(pScrn); break; + case PCI_CHIP_R4: case PCI_CHIP_PERMEDIA3: Permedia3InitializeEngine(pScrn); break; @@ -3199,12 +3269,15 @@ GLINTAdjustFrame(int scrnIndex, int x, int y, int flags) break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: base = (y * pScrn->displayWidth + x) >> pGlint->BppShift; GLINT_SLOW_WRITE_REG(base, PMScreenBase); break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: switch (pGlint->MultiChip) { + case PCI_CHIP_R4: case PCI_CHIP_PERMEDIA3: base = (y * pScrn->displayWidth + x) >> pGlint->BppShift; GLINT_SLOW_WRITE_REG(base, PMScreenBase); @@ -3260,6 +3333,7 @@ GLINTEnterVT(int scrnIndex, int flags) break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: Permedia3InitializeEngine(pScrn); break; case PCI_VENDOR_TI_CHIP_PERMEDIA: @@ -3274,6 +3348,7 @@ GLINTEnterVT(int scrnIndex, int flags) SXInitializeEngine(pScrn); break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: switch (pGlint->MultiChip) { case PCI_CHIP_500TX: @@ -3287,6 +3362,7 @@ GLINTEnterVT(int scrnIndex, int flags) case PCI_CHIP_TI_PERMEDIA: PermediaInitializeEngine(pScrn); break; + case PCI_CHIP_R4: case PCI_CHIP_PERMEDIA3: Permedia3InitializeEngine(pScrn); break; @@ -3424,6 +3500,7 @@ GLINTValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) switch (pGlint->Chipset) { case PCI_VENDOR_TI_CHIP_PERMEDIA2: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA2: @@ -3484,6 +3561,7 @@ GLINTSaveScreen(ScreenPtr pScreen, int mode) case PCI_VENDOR_TI_CHIP_PERMEDIA2: case PCI_VENDOR_TI_CHIP_PERMEDIA: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA2V: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA2: @@ -3498,8 +3576,10 @@ GLINTSaveScreen(ScreenPtr pScreen, int mode) case PCI_VENDOR_3DLABS_CHIP_MX: break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: switch (pGlint->MultiChip) { + case PCI_CHIP_R4: case PCI_CHIP_PERMEDIA3: case PCI_CHIP_PERMEDIA: case PCI_CHIP_TI_PERMEDIA: @@ -3694,6 +3774,7 @@ Shiftbpp(ScrnInfoPtr pScrn, int value) break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: + case PCI_VENDOR_3DLABS_CHIP_R4: logbytesperaccess = 4; break; case PCI_VENDOR_3DLABS_CHIP_300SX: @@ -3706,6 +3787,7 @@ Shiftbpp(ScrnInfoPtr pScrn, int value) logbytesperaccess = 3; break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: + case PCI_VENDOR_3DLABS_CHIP_GAMMA2: case PCI_VENDOR_3DLABS_CHIP_DELTA: switch (pGlint->MultiChip) { case PCI_CHIP_500TX: @@ -3721,6 +3803,7 @@ Shiftbpp(ScrnInfoPtr pScrn, int value) case PCI_CHIP_TI_PERMEDIA: logbytesperaccess = 2; break; + case PCI_CHIP_R4: case PCI_CHIP_PERMEDIA3: logbytesperaccess = 4; break; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h index 6b5ac64b2..a91d914f9 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h,v 1.28 2001/08/18 11:37:31 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h,v 1.31 2001/12/08 16:01:52 alanh Exp $ */ /* * glint register file @@ -30,12 +30,17 @@ #define PCI_CHIP_3DLABS_PERMEDIA2V 0x09 #define PCI_CHIP_3DLABS_PERMEDIA3 0x0A #define PCI_CHIP_3DLABS_PERMEDIA4 0x0C +#define PCI_CHIP_3DLABS_R4 0x0D +#define PCI_CHIP_3DLABS_GAMMA2 0x0E #define PCI_CHIP_TI_PERMEDIA 0x3d04 /* The boards we know */ #define IS_GLORIAXXL ((pGlint->PciInfo->subsysVendor == 0x1048) && \ (pGlint->PciInfo->subsysCard == 0x0a42)) +#define IS_GLORIASYNERGY ((pGlint->PciInfo->subsysVendor == 0x1048) && \ + (pGlint->PciInfo->subsysCard == 0x0a32)) + #define IS_GMX2000 ((pGlint->PciInfo->subsysVendor == 0x3d3d) && \ (pGlint->PciInfo->subsysCard == 0x0106)) @@ -45,6 +50,32 @@ #define IS_JPRO ((pGlint->PciInfo->subsysVendor == 0x1097) && \ (pGlint->PciInfo->subsysCard == 0x3db3)) +/* COMPAQ OEM VX1 PCI + * subsys == 0x0121 if VGA is enabled + * subsys == 0x000a if VGA has never been enabled + */ +#define IS_PCI_QVX1 (pGlint->PciInfo->subsysVendor == 0x3d3d && \ + ((pGlint->PciInfo->subsysCard == 0x0121) || \ + (pGlint->PciInfo->subsysCard == 0x000a))) + +/* COMPAQ OEM VX1 AGP + * subsys == 0x0144 if VGA is enabled + * subsys == 0x000c if VGA has never been enabled + */ +#define IS_AGP_QVX1 (pGlint->PciInfo->subsysVendor == 0x3d3d && \ + ((pGlint->PciInfo->subsysCard == 0x0144) || \ + (pGlint->PciInfo->subsysCard == 0x000c))) + +#define IS_QVX1 (IS_PCI_QVX1 || IS_AGP_QVX1) + +#define IS_ELSA_SYNERGY ((pGlint->PciInfo->subsysVendor == 0x1048) && \ + (pGlint->PciInfo->subsysCard == 0x0a32)) + +/* COMPAQ OEM Permedia 2V with VGA disable jumper - 0x13e9 ? */ +#define IS_QPM2V ((pGlint->PciInfo->subsysVendor == 0x13e9) && \ + ((pGlint->PciInfo->subsysCard == 0x0100) || \ + (pGlint->PciInfo->subsysCard == 0x0002))) + /********************************************** * GLINT 500TX Configuration Region Registers * ***********************************************/ @@ -1241,7 +1272,8 @@ do{ \ #define REPLICATE(r) \ { \ if (pScrn->bitsPerPixel == 16) { \ - r = ((r & 0xFFFF) << 16) | (r & 0xFFFF); \ + r &= 0xFFFF; \ + r |= (r<<16); \ } else \ if (pScrn->bitsPerPixel == 8) { \ r &= 0xFF; \ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm2_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm2_accel.c index cf98fc79b..583fbc105 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm2_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm2_accel.c @@ -30,7 +30,7 @@ * * Permedia 2 accelerated options. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm2_accel.c,v 1.30 2001/05/30 11:41:53 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm2_accel.c,v 1.31 2001/10/28 03:33:30 tsi Exp $ */ #include "Xarch.h" #include "xf86.h" @@ -1386,7 +1386,6 @@ Permedia2WritePixmap32bpp( GLINTPtr pGlint = GLINTPTR(pScrn); int skipleft, dwords, count; CARD32* srcp; - Bool FastTexLoad; GLINT_WAIT(3); DO_PLANEMASK(planemask); @@ -1397,23 +1396,9 @@ Permedia2WritePixmap32bpp( 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) { + if((rop == GXcopy) && (planemask == ~0)) { int address; GLINT_WAIT(1); @@ -1452,6 +1437,15 @@ Permedia2WritePixmap32bpp( GLINT_WAIT(1); GLINT_WRITE_REG(UNIT_ENABLE, FBWriteMode); } else { + if((skipleft = (long)src & 0x03L)) { + skipleft /= (bpp>>3); + + x -= skipleft; + w += skipleft; + + src = (unsigned char*)((long)src & ~0x03L); + } + Permedia2SetClippingRectangle(pScrn,x+skipleft,y,x+w,y+h); GLINT_WAIT(6); 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 05bcaa36c..b7ea2cb32 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c @@ -26,7 +26,7 @@ * * Permedia 3 accelerated options. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c,v 1.28 2001/08/18 11:41:45 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_accel.c,v 1.29 2001/11/20 00:09:13 alanh Exp $ */ #include "Xarch.h" #include "xf86.h" @@ -58,6 +58,29 @@ # define TRACE(str) #endif +#define PM3_WRITEMASK \ + (pGlint->PM3_UsingSGRAM ? PM3FBHardwareWriteMask : PM3FBSoftwareWriteMask ) +#define PM3_OTHERWRITEMASK \ + (pGlint->PM3_UsingSGRAM ? PM3FBSoftwareWriteMask : PM3FBHardwareWriteMask ) + +#ifndef XF86DRI +#define PM3_PLANEMASK(planemask) \ +{ \ + if (planemask != pGlint->planemask) { \ + pGlint->planemask = planemask; \ + REPLICATE(planemask); \ + GLINT_WRITE_REG(planemask, PM3_WRITEMASK); \ + } \ +} +#else +#define PM3_PLANEMASK(planemask) \ + { \ + pGlint->planemask = planemask; \ + REPLICATE(planemask); \ + GLINT_WRITE_REG(planemask, PM3_WRITEMASK); \ + } +#endif + /* Clipping */ static void Permedia3SetClippingRectangle(ScrnInfoPtr pScrn, int x, int y, int w, int h); @@ -278,7 +301,7 @@ Permedia3InitializeEngine(ScrnInfoPtr pScrn) TRACE("Permedia3InitializeEngine : PixelSize"); /* LogicalOpUnit Initialization */ - GLINT_SLOW_WRITE_REG(0xffffffff, FBSoftwareWriteMask); + GLINT_SLOW_WRITE_REG(0xffffffff, PM3_OTHERWRITEMASK); /* FBWriteUnit Initialization */ GLINT_SLOW_WRITE_REG( @@ -316,7 +339,7 @@ Permedia3InitializeEngine(ScrnInfoPtr pScrn) >4095?4095: 8 * pGlint->FbMapSize / (pScrn->bitsPerPixel * pScrn->displayWidth)), PM3SizeOfFramebuffer); - GLINT_SLOW_WRITE_REG(0xffffffff, FBHardwareWriteMask); + GLINT_SLOW_WRITE_REG(0xffffffff, PM3_WRITEMASK); TRACE("Permedia3InitializeEngine : FBHardwareWriteMask & SizeOfFramebuffer"); /* Color Format */ switch (pScrn->depth) { @@ -598,7 +621,7 @@ Permedia3SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, pGlint->PM3_Config2D |= PM3Config2D_FBDestReadEnable; GLINT_WAIT(2); - DO_PLANEMASK(planemask); + PM3_PLANEMASK(planemask); GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); TRACE_EXIT("Permedia3SetupForScreenToScreenCopy"); @@ -657,21 +680,32 @@ Permedia3SetupForFillRectSolid(ScrnInfoPtr pScrn, int color, (pScrn->displayWidth <= 1600)) { pGlint->AccelInfoRec->SubsequentSolidFillRect = Permedia3SubsequentFillRectSolid32bpp; - GLINT_WRITE_REG(color, PM3FBBlockColor); + if (pGlint->PM3_UsingSGRAM) { + GLINT_WRITE_REG(color, PM3FBBlockColor); + } else { + pGlint->PM3_Render2D |= PM3Render2D_SpanOperation; + GLINT_WRITE_REG(color, PM3ForegroundColor); + } } else { pGlint->AccelInfoRec->SubsequentSolidFillRect = Permedia3SubsequentFillRectSolid; /* Can't do block fills at 8bpp either */ if ((rop == GXcopy) && (pScrn->bitsPerPixel == 16)) { - GLINT_WRITE_REG(color, PM3FBBlockColor); + if (pGlint->PM3_UsingSGRAM) { + GLINT_WRITE_REG(color, PM3FBBlockColor); + } else { + pGlint->PM3_Render2D |= PM3Render2D_SpanOperation; + GLINT_WRITE_REG(color, PM3ForegroundColor); + } } else { pGlint->PM3_Render2D |= PM3Render2D_SpanOperation; - GLINT_WRITE_REG(color, PM3ForegroundColor); + GLINT_WRITE_REG(color, PM3ForegroundColor); } } - if ((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXcopy)&&(rop!=GXcopyInverted)) + PM3_PLANEMASK(planemask); + if (((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXcopy)&&(rop!=GXcopyInverted)) + || ((planemask != 0xffffffff) && !(pGlint->PM3_UsingSGRAM))) pGlint->PM3_Config2D |= PM3Config2D_FBDestReadEnable; - DO_PLANEMASK(planemask); GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); TRACE_EXIT("Permedia3SetupForFillRectSolid"); } @@ -773,7 +807,7 @@ Permedia3SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, GLINT_WRITE_REG((patterny & 0xFF0000) >> 16, AreaStipplePattern6); GLINT_WRITE_REG((patterny & 0xFF000000) >> 24, AreaStipplePattern7); GLINT_WRITE_REG(fg, PM3ForegroundColor); - DO_PLANEMASK(planemask); + PM3_PLANEMASK(planemask); GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); TRACE_EXIT("Permedia3SetupForMono8x8PatternFill"); } @@ -830,7 +864,7 @@ Permedia3SetupForScanlineCPUToScreenColorExpandFill( } else GLINT_WAIT(3); GLINT_WRITE_REG(fg, PM3ForegroundColor); - DO_PLANEMASK(planemask); + PM3_PLANEMASK(planemask); GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); } @@ -925,7 +959,7 @@ static void Permedia3SetupForScanlineImageWrite(ScrnInfoPtr pScrn, int rop, if ((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXcopy)&&(rop!=GXcopyInverted)) pGlint->PM3_Config2D |= PM3Config2D_FBDestReadEnable; GLINT_WAIT(2); - DO_PLANEMASK(planemask); + PM3_PLANEMASK(planemask); GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); TRACE_EXIT("Permedia3SetupForScanlineImageWrite"); } @@ -1057,7 +1091,7 @@ Permedia3WritePixmap( if ((rop!=GXclear)&&(rop!=GXset)&&(rop!=GXcopy)&&(rop!=GXcopyInverted)) pGlint->PM3_Config2D |= PM3Config2D_FBDestReadEnable; GLINT_WAIT(6); - DO_PLANEMASK(planemask); + PM3_PLANEMASK(planemask); GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); GLINT_WRITE_REG(((y&0x0fff)<<16)|((x+skipleft)&0x0fff), ScissorMinXY); GLINT_WRITE_REG((((y+h)&0x0fff)<<16)|((x+w)&0x0fff), ScissorMaxXY); @@ -1142,7 +1176,7 @@ Permedia3WriteBitmap(ScrnInfoPtr pScrn, } else GLINT_WAIT(7); GLINT_WRITE_REG(fg, PM3ForegroundColor); - DO_PLANEMASK(planemask); + PM3_PLANEMASK(planemask); GLINT_WRITE_REG(pGlint->PM3_Config2D, PM3Config2D); GLINT_WRITE_REG(((y&0x0fff)<<16)|((x+skipleft)&0x0fff), ScissorMinXY); GLINT_WRITE_REG((((y+h)&0x0fff)<<16)|((x+w)&0x0fff), ScissorMaxXY); 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 933d1c241..7a2ca55a7 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c @@ -26,7 +26,7 @@ * this work is sponsored by Appian Graphics. * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c,v 1.25 2001/08/18 11:37:31 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_dac.c,v 1.30 2001/12/10 21:11:00 alanh Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -34,6 +34,7 @@ #include "xf86PciInfo.h" #include "xf86Pci.h" +#include "xf86int10.h" #include "glint_regs.h" #include "pm3_regs.h" @@ -77,7 +78,6 @@ Permedia3MemorySizeDetect(ScrnInfoPtr pScrn) * So, 16MB appears at offset 0, nothing between 16-32, then it re-appears * at offset 32. * This below is to detect the cases of memory combinations - * It may also need closer examination for boards other than 16 or 32MB */ /* Test first 32MB */ @@ -94,7 +94,7 @@ Permedia3MemorySizeDetect(ScrnInfoPtr pScrn) } /* Ok, we're satisfied we've got 32MB, let's test the second lot */ - if (size == i) { + if ((size + 1) == i) { for(i=0;i<32;i++) { /* Clear first 32MB */ MMIO_OUT32(pGlint->FbBase, i*1024*1024, 0); @@ -278,8 +278,10 @@ void Permedia3PreInit(ScrnInfoPtr pScrn) { GLINTPtr pGlint = GLINTPTR(pScrn); + CARD32 LocalMemCaps; TRACE_ENTER("Permedia3PreInit"); + if (IS_J2000) { unsigned char m,n,p; unsigned long clockused; @@ -321,6 +323,51 @@ Permedia3PreInit(ScrnInfoPtr pScrn) PM3RD_SClkControl_ENABLE); } +#if defined(__alpha__) + /* + * On Alpha, we have to "int10" secondary VX1 cards early; + * otherwise, some information taken from registers, like + * memory size, is incorrect. + */ + if (!xf86IsPrimaryPci(pGlint->PciInfo)) { + if ( IS_QVX1 ) { + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "VX1 secondary enabling VGA before int10\n"); + + /* Enable VGA on the current card. */ + pciWriteByte( pGlint->PciTag, 0xf8, 0 ); + pciWriteByte( pGlint->PciTag, 0xf4, 0 ); + pciWriteByte( pGlint->PciTag, 0xfc, 0 ); + + /* The card we are on should be VGA-enabled now, so run int10. */ + if (xf86LoadSubModule(pScrn, "int10")) { + xf86Int10InfoPtr pInt; + + xf86LoaderReqSymLists(GLINTint10Symbols, NULL); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Initializing int10\n"); + pInt = xf86InitInt10(pGlint->pEnt->index); + xf86FreeInt10(pInt); + } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "VX1 secondary disabling VGA after int10\n"); + + /* Finally, disable VGA on the current card. */ + pciWriteByte( pGlint->PciTag, 0xf8, 0x70 ); + pciWriteByte( pGlint->PciTag, 0xf4, 0x01 ); + pciWriteByte( pGlint->PciTag, 0xfc, 0x00 ); + } + } +#endif /* __alpha__ */ + + /* If we have SDRAM instead of SGRAM, we have to do some things + differently in the FillRectSolid code. */ + LocalMemCaps = GLINT_READ_REG(PM3LocalMemCaps); + pGlint->PM3_UsingSGRAM = !(LocalMemCaps & PM3LocalMemCaps_NoWriteMask); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using %s memory\n", + pGlint->PM3_UsingSGRAM ? "SGRAM" : "SDRAM"); + TRACE_EXIT("Permedia3PreInit"); } @@ -413,12 +460,26 @@ Permedia3Init(ScrnInfoPtr pScrn, DisplayModePtr mode, GLINTRegPtr pReg) /* Let's program the dot clock */ switch (pGlint->Chipset) { case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: - clockused = PM4DAC_CalculateClock(mode->Clock * 1, /* HACK */ + case PCI_VENDOR_3DLABS_CHIP_R4: + clockused = PM4DAC_CalculateClock(mode->Clock, pGlint->RefClock, &m,&n,&p); break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: clockused = PM3DAC_CalculateClock(mode->Clock, pGlint->RefClock, &m,&n,&p); + break; + case PCI_VENDOR_3DLABS_CHIP_GAMMA: + switch (pGlint->MultiChip) { + case PCI_CHIP_PERMEDIA3: + clockused = PM3DAC_CalculateClock(mode->Clock, + pGlint->RefClock, &m,&n,&p); + break; + case PCI_CHIP_R4: + clockused = PM4DAC_CalculateClock(mode->Clock, + pGlint->RefClock, &m,&n,&p); + break; + } + break; } STOREDAC(PM3RD_DClk0PreScale, m); STOREDAC(PM3RD_DClk0FeedbackScale, n); 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 7754e1bdc..8cfd2607d 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: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_regs.h,v 1.8 2001/08/18 11:37:31 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_regs.h,v 1.9 2001/11/20 00:09:15 alanh Exp $ */ /* * glint register file @@ -90,6 +90,7 @@ #define PM3MemBypassWriteMask 0x1008 #define PM3MemScratch 0x1010 #define PM3LocalMemCaps 0x1018 + #define PM3LocalMemCaps_NoWriteMask (1<<28) #define PM3LocalMemTimings 0x1020 #define PM3LocalMemControl 0x1028 #define PM3LocalMemRefresh 0x1030 diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_video.c b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_video.c index 26f31b5c2..4dcb46661 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_video.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_video.c @@ -22,7 +22,7 @@ * Authors: Alan Hourihane, alanh@fairlite.demon.co.uk * Sven Luther <luther@dpt-info.u-strasbg.fr> */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_video.c,v 1.7 2001/08/18 11:37:31 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_video.c,v 1.8 2001/10/28 03:33:30 tsi Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -830,7 +830,9 @@ Permedia3PutImage( Bool sync, RegionPtr clipBoxes, pointer data ){ +#if 0 GLINTPtr pGlint = GLINTPTR(pScrn); +#endif GLINTPortPrivPtr pPriv = (GLINTPortPrivPtr)data; INT32 x1, x2, y1, y2; int pitch; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i128/i128_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/i128/i128_driver.c index 2c69c4bfa..f6b949d2d 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i128/i128_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/i128/i128_driver.c @@ -22,7 +22,7 @@ * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i128/i128_driver.c,v 1.23 2001/06/15 21:22:51 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i128/i128_driver.c,v 1.25 2002/01/04 21:22:31 tsi Exp $ */ /* All drivers should typically include these */ @@ -627,7 +627,7 @@ I128PreInit(ScrnInfoPtr pScrn, int flags) bytesPerPixel = pScrn->bitsPerPixel / 8; - /* We use a programamble clock */ + /* We use a programmable clock */ pScrn->progClock = TRUE; /* Collect all of the relevant option flags (fill in pScrn->options) */ @@ -1976,8 +1976,7 @@ I128DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, if (pI128->RamdacType == TI3025_DAC) return; - pI128->mem.rbase_g[IDXL_I] = IBMRGB_sync; MB; - snc = pI128->mem.rbase_g[DATA_I]; + snc = pI128->mem.rbase_g[CRT_1CON]; switch (PowerManagementMode) { @@ -1998,8 +1997,7 @@ I128DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, snc &= ~0x30; break; } - pI128->mem.rbase_g[IDXL_I] = IBMRGB_sync; MB; - pI128->mem.rbase_g[DATA_I] = snc; MB; + pI128->mem.rbase_g[CRT_1CON] = snc; MB; } void diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/Imakefile b/xc/programs/Xserver/hw/xfree86/drivers/i810/Imakefile index 22ea98c08..a7d0a488b 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/Imakefile,v 1.14 2001/01/24 00:06:20 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/Imakefile,v 1.18 2001/10/04 18:28:21 alanh Exp $ XCOMM XCOMM This is the Imakefile for the i810 driver. XCOMM @@ -7,18 +7,20 @@ XCOMM #include <Server.tmpl> #if BuildXF86DRI -DRISRCS = i810_dri.c -DRIOBJS = i810_dri.o +DRISRCS = i810_dri.c i810_hwmc.c i830_dri.c +DRIOBJS = i810_dri.o i810_hwmc.o i830_dri.o DRIINCLUDES = -I$(SERVERSRC)/GL/dri -I$(LIBSRC)/GL/dri \ -I$(XF86OSSRC)/linux/drm/kernel -I$(TOP)/include DRIDEFINES = $(GLX_DEFINES) #endif SRCS = i810_driver.c i810_cursor.c i810_accel.c i810_io.c \ - i810_memory.c i810_wmark.c i810_dga.c i810_video.c $(DRISRCS) + i810_memory.c i810_wmark.c i810_dga.c i810_video.c \ + i830_driver.c $(DRISRCS) OBJS = i810_driver.o i810_cursor.o i810_accel.o i810_io.o \ - i810_memory.o i810_wmark.o i810_dga.o i810_video.o $(DRIOBJS) + i810_memory.o i810_wmark.o i810_dga.o i810_video.o \ + i830_driver.o $(DRIOBJS) #if defined(XF86DriverSDK) INCLUDES = -I. -I../../include @@ -36,6 +38,8 @@ INCLUDES = -I. -I$(XF86COMSRC) -I$(XF86OSSRC) \ #endif DEFINES = $(DRIDEFINES) +LinkSourceFile(i830_3d_reg.h, $(GLXLIBSRC)/mesa/src/drv/i830) + #if MakeHasPosixVariableSubstitutions SubdirLibraryRule($(OBJS)) #endif @@ -64,5 +68,8 @@ InstallDriverSDKNonExecFile(i810_io.c,$(DRIVERSDKDIR)/drivers/i810) InstallDriverSDKNonExecFile(i810_memory.c,$(DRIVERSDKDIR)/drivers/i810) InstallDriverSDKNonExecFile(i810_wmark.c,$(DRIVERSDKDIR)/drivers/i810) InstallDriverSDKNonExecFile(i810_reg.h,$(DRIVERSDKDIR)/drivers/i810) +InstallDriverSDKNonExecFile(i830_dri.c,$(DRIVERSDKDIR)/drivers/i810) +InstallDriverSDKNonExecFile(i830_dri.h,$(DRIVERSDKDIR)/drivers/i810) +InstallDriverSDKNonExecFile(i830_driver.c,$(DRIVERSDKDIR)/drivers/i810) InstallDriverSDKObjectModule(i810,$(DRIVERSDKMODULEDIR),drivers) diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/README b/xc/programs/Xserver/hw/xfree86/drivers/i810/README index f7e30d386..2bc4a0191 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/README +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/README @@ -7,7 +7,8 @@ * Intel 810 motherboards: i810, i810-dc100, - i810e. + i810e, + i830m. 2. Features @@ -19,7 +20,9 @@ * Support for high resolution video modes up to 1600x1200. * Fully programmable clock supported. * Robust text mode restore for VT switching. - + * Xv surfaces for YUV Video display and scaling. + * XvMC hardware motion compensation for MPEG decoding. + * Hardware accelerated 3D for i830m 3. Technical Notes @@ -32,9 +35,7 @@ 4. Reported Working Video Cards - * Intel evaluation hardware - i810, i810-dc100 and i810e. - * Tyan Tomcat Motherboard. - * HappyPC set-top box. + * i810, i810-dc100, i810e, i815, i815e, i830m. 5. Configuration @@ -44,8 +45,15 @@ Section "Device" Identifier "i810" + VideoRam 16384 EndSection + The VideoRam option is optional and determines how much system + memory will be used for graphics purposes. The i810 uses system + memory for all graphics memory due to the shared memory nature + of the chipset. 16-64MB is the recommended range depending on + available system resources. + If you have problems with auto-detection, you can specify: DacSpeed - in MHz @@ -59,9 +67,18 @@ Note: the i810 X server detects whether your motherboard has display cache video memory. This memory is has reduced bandwidth - compared to normal system memory, and isn't used by the server. The - main function of this memory is for ancillary buffers (eg. z buffer) - in a forthcoming 3d capable server. + compared to normal system memory, and isn't used by the server for + normal operation. The main function of this memory is for + ancillary buffers (eg. z buffer) in a 3d capable server. + + + In order to make use of the XvMC extension you will need to specify: + Option "XvMCSurfaces" "6" + or + Option "XvMCSurfaces" "7" + in the device section. Note that the memory for XvMC is preallocated and + unavailable for general graphics use. At this time there are no generally + available XvMC capable Mpeg decoders. 6. Driver Options @@ -71,7 +88,6 @@ 7. Known Limitations - - No 3d support in this release. - No 32bpp support in this driver. - Running Two Xservers on different VT's is not supported at this time. @@ -91,3 +107,4 @@ http://support.intel.com/support/graphics/intel810/linuxinstal.htm +$XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/README,v 1.4 2001/10/28 03:33:31 tsi Exp $ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810.h b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810.h index 52c6a7b30..452ee302d 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.21 2001/05/19 00:26:44 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810.h,v 1.29 2002/01/14 18:43:51 dawes Exp $ */ /* * Authors: @@ -33,6 +33,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ +/* #define I830DEBUG */ + #ifndef _I810_H_ #define _I810_H_ @@ -44,6 +46,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "xaa.h" #include "xf86Cursor.h" #include "xf86xv.h" +#include "xf86int10.h" +#include "vgaHW.h" #ifdef XF86DRI #include "xf86drm.h" @@ -53,6 +57,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "dri.h" #include "GL/glxint.h" #include "i810_dri.h" +#include "i830_dri.h" #endif @@ -60,9 +65,252 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define I810_NAME "I810" #define I810_DRIVER_NAME "i810" #define I810_MAJOR_VERSION 1 -#define I810_MINOR_VERSION 0 +#define I810_MINOR_VERSION 1 #define I810_PATCHLEVEL 0 +#ifdef __GNUC__ +#define PFX __FILE__,__LINE__,__FUNCTION__ +#define FUNCTION_NAME __FUNCTION__ +#else +#define PFX __FILE__,__LINE__,"" +#define FUNCTION_NAME "" +#endif + +#ifdef I830DEBUG +#define MARKER() fprintf(stderr,"\n### %s:%d: >>> %s <<< ###\n\n",__FILE__,__LINE__,__FUNCTION__) +#define DPRINTF DPRINTF_stub +#else /* #ifdef I830DEBUG */ +#define MARKER() +/* this is a real ugle hack to get the compiler to optimize the debugging statements into oblivion */ +#define DPRINTF if(0) DPRINTF_stub +#endif /* #ifdef I830DEBUG */ + +#define KB(x) ((x) * 1024) +#define MB(x) ((x) * KB(1024)) + +/* I830 Video BIOS support */ + +/* This code is Heavily based upon the VESA driver written by: + * Paulo C~^Aésar Pereira de Andrade <pcpa@conectiva.com.br> */ + +typedef struct _VBEInfoBlock VBEInfoBlock; +typedef struct _ModeInfoBlock ModeInfoBlock; +typedef struct _CRTCInfoBlock CRTCInfoBlock; +typedef struct _VBT_header VBTHeader; +typedef struct _BIOSDataBlock BIOSDataBlock; + +#define FARP(p) (((unsigned)(p & 0xffff0000) >> 12) | (p & 0xffff)) + +typedef struct _VESARec +{ + xf86Int10InfoPtr pInt; + EntityInfoPtr pEnt; + CARD16 major, minor; + VBEInfoBlock *vbeInfo; + GDevPtr device; + pciVideoPtr pciInfo; + PCITAG pciTag; + CARD16 maxBytesPerScanline; + int mapPhys, mapOff, mapSize; /* video memory */ + void *base, *VGAbase; + CARD8 *state, *pstate; /* SVGA state */ + int statePage, stateSize, stateMode; + int page; + CARD8 *block; + int pix24bpp; + CARD32 *pal, *savedPal; + CARD8 *fonts; + xf86MonPtr monitor; + Bool shadowFB, primary; + CARD8 *shadowPtr; + CARD32 windowAoffset; +} VESARec, *VESAPtr; + +typedef struct _ModeInfoData +{ + int mode; + ModeInfoBlock *data; + CRTCInfoBlock *block; +} ModeInfoData; + +#if !defined(__GNUC__) && !defined(__attribute__) +#define __attribute__(a) +#endif + +/* + * INT 0 + */ +struct _VBEInfoBlock +{ + /* VESA 1.2 fields */ + CARD8 VESASignature[4]; /* VESA */ + CARD16 VESAVersion; /* Higher byte major, lower byte minor */ + /*CARD32*/char *OEMStringPtr; /* Pointer to OEM string */ + CARD8 Capabilities[4]; /* Capabilities of the video environment */ + + /*CARD32*/CARD16 *VideoModePtr; /* pointer to supported Super VGA modes */ + + CARD16 TotalMemory; /* Number of 64kb memory blocks on board */ + /* if not VESA 2, 236 scratch bytes follow (256 bytes total size) */ + + /* VESA 2 fields */ + CARD16 OemSoftwareRev; /* VBE implementation Software revision */ + /*CARD32*/char *OemVendorNamePtr; /* Pointer to Vendor Name String */ + /*CARD32*/char *OemProductNamePtr; /* Pointer to Product Name String */ + /*CARD32*/char *OemProductRevPtr; /* Pointer to Product Revision String */ + CARD8 Reserved[222]; /* Reserved for VBE implementation */ + CARD8 OemData[256]; /* Data Area for OEM Strings */ +} __attribute__((packed)); + +/* + * INT 1 + */ +struct _ModeInfoBlock { + CARD16 ModeAttributes; /* mode attributes */ + CARD8 WinAAttributes; /* window A attributes */ + CARD8 WinBAttributes; /* window B attributes */ + CARD16 WinGranularity; /* window granularity */ + CARD16 WinSize; /* window size */ + CARD16 WinASegment; /* window A start segment */ + CARD16 WinBSegment; /* window B start segment */ + CARD32 WinFuncPtr; /* real mode pointer to window function */ + CARD16 BytesPerScanline; /* bytes per scanline */ + + /* Mandatory information for VBE 1.2 and above */ + CARD16 XResolution; /* horizontal resolution in pixels or characters */ + CARD16 YResolution; /* vertical resolution in pixels or characters */ + CARD8 XCharSize; /* character cell width in pixels */ + CARD8 YCharSize; /* character cell height in pixels */ + CARD8 NumberOfPlanes; /* number of memory planes */ + CARD8 BitsPerPixel; /* bits per pixel */ + CARD8 NumberOfBanks; /* number of banks */ + CARD8 MemoryModel; /* memory model type */ + CARD8 BankSize; /* bank size in KB */ + CARD8 NumberOfImages; /* number of images */ + CARD8 Reserved; /* 1 */ /* reserved for page function */ + + /* Direct color fields (required for direct/6 and YUV/7 memory models) */ + CARD8 RedMaskSize; /* size of direct color red mask in bits */ + CARD8 RedFieldPosition; /* bit position of lsb of red mask */ + CARD8 GreenMaskSize; /* size of direct color green mask in bits */ + CARD8 GreenFieldPosition; /* bit position of lsb of green mask */ + CARD8 BlueMaskSize; /* size of direct color blue mask in bits */ + CARD8 BlueFieldPosition; /* bit position of lsb of blue mask */ + CARD8 RsvdMaskSize; /* size of direct color reserved mask in bits */ + CARD8 RsvdFieldPosition; /* bit position of lsb of reserved mask */ + CARD8 DirectColorModeInfo; /* direct color mode attributes */ + + /* Mandatory information for VBE 2.0 and above */ + CARD32 PhysBasePtr; /* physical address for flat memory frame buffer */ + CARD32 Reserved32; /* 0 */ /* Reserved - always set to 0 */ + CARD16 Reserved16; /* 0 */ /* Reserved - always set to 0 */ + + /* Mandatory information for VBE 3.0 and above */ + CARD16 LinBytesPerScanLine; /* bytes per scan line for linear modes */ + CARD8 BnkNumberOfImagePages; /* number of images for banked modes */ + CARD8 LinNumberOfImagePages; /* number of images for linear modes */ + CARD8 LinRedMaskSize; /* size of direct color red mask (linear modes) */ + CARD8 LinRedFieldPosition; /* bit position of lsb of red mask (linear modes) */ + CARD8 LinGreenMaskSize; /* size of direct color green mask (linear modes) */ + CARD8 LinGreenFieldPosition; /* bit position of lsb of green mask (linear modes) */ + CARD8 LinBlueMaskSize; /* size of direct color blue mask (linear modes) */ + CARD8 LinBlueFieldPosition; /* bit position of lsb of blue mask (linear modes) */ + CARD8 LinRsvdMaskSize; /* size of direct color reserved mask (linear modes) */ + CARD8 LinRsvdFieldPosition; /* bit position of lsb of reserved mask (linear modes) */ + CARD32 MaxPixelClock; /* maximum pixel clock (in Hz) for graphics mode */ + CARD8 Reserved2[189]; /* remainder of ModeInfoBlock */ +} __attribute__((packed)); + +/* + * INT2 + */ +#define CRTC_DBLSCAN (1<<0) +#define CRTC_INTERLACE (1<<1) +#define CRTC_NHSYNC (1<<2) +#define CRTC_NVSYNC (1<<3) + +struct _CRTCInfoBlock +{ + CARD16 HorizontalTotal; /* Horizontal total in pixels */ + CARD16 HorizontalSyncStart; /* Horizontal sync start in pixels */ + CARD16 HorizontalSyncEnd; /* Horizontal sync end in pixels */ + CARD16 VerticalTotal; /* Vertical total in lines */ + CARD16 VerticalSyncStart; /* Vertical sync start in lines */ + CARD16 VerticalSyncEnd; /* Vertical sync end in lines */ + CARD8 Flags; /* Flags (Interlaced, Double Scan etc) */ + CARD32 PixelClock; /* Pixel clock in units of Hz */ + CARD16 RefreshRate; /* Refresh rate in units of 0.01 Hz */ + CARD8 Reserved[40]; /* remainder of ModeInfoBlock */ +} __attribute__((packed)); + +/* CRTCInfoBlock is in the VESA 3.0 specs */ +typedef struct _VESApmi +{ + int seg_tbl; + int tbl_off; + int tbl_len; +} VESApmi; + +/* Functions */ +const OptionInfoRec *I830BIOSAvailableOptions(int chipid, int busid); +ModeInfoBlock *I830VESAGetModeInfo(ScrnInfoPtr pScrn, int mode); +void I830BIOSProbeDDC(ScrnInfoPtr pScrn, int index); +void I830VESAFreeModeInfo(ModeInfoBlock *block); +Bool I830BIOSPreInit(ScrnInfoPtr pScrn, int flags); +void I830BIOSSaveRegisters(ScrnInfoPtr pScrn); +void I830BIOSSetRegisters(ScrnInfoPtr pScrn, int mode); +Bool I830VESAGetVBEMode(ScrnInfoPtr pScrn, int *mode); +Bool I830VESASetVBEMode(ScrnInfoPtr pScrn, int mode, CRTCInfoBlock *block); +Bool I830VESASaveRestore(ScrnInfoPtr pScrn, int function); +Bool I830VESASetGetLogicalScanlineLength(ScrnInfoPtr pScrn, int command, + int width, int *pixels, int *bytes, + int *max); +int I830VESASetGetDACPaletteFormat(ScrnInfoPtr pScrn, int bits); +CARD32 *I830VESASetGetPaletteData(ScrnInfoPtr pScrn, Bool set, int first, + int num, CARD32 *data, Bool secondary, + Bool wait_retrace); +Bool I830BIOSInitializeFirstMode(int scrnIndex); +Bool I830BIOSScreenInit(int scrnIndex, ScreenPtr pScreen, + int argc, char **argv); +Bool I830VESASetDisplayStart(ScrnInfoPtr pScrn, int x, int y, + Bool wait_retrace); +void I830BIOSAdjustFrame(int scrnIndex, int x, int y, int flags); +void I830BIOSFreeScreen(int scrnIndex, int flags); +void I830BIOSLeaveVT(int scrnIndex, int flags); +Bool I830BIOSEnterVT(int scrnIndex, int flags); +Bool I830BIOSSwitchMode(int scrnIndex, DisplayModePtr mode, int flags); +Bool I830BIOSSaveScreen(ScreenPtr pScreen, Bool unblack); +Bool I830BIOSCloseScreen(int scrnIndex, ScreenPtr pScreen); + +#define SCANWID_SET 0 +#define SCANWID_GET 1 +#define SCANWID_SET_BYTES 2 +#define SCANWID_GET_MAX 3 +#define I830VESASetLogicalScanline(pScrn, width) \ + I830VESASetGetLogicalScanlineLength(pScrn, SCANWID_SET, \ + width, NULL, NULL, NULL) +#define I830VESASetLogicalScanlineBytes(pScrn, width) \ + I830VESASetGetLogicalScanlineLength(pScrn, width, SCANWID_SET_BYTES, \ + NULL, NULL, NULL) +#define I830VESAGetLogicalScanline(pScrn, pixels, bytes, max) \ + I830VESASetGetLogicalScanlineLength(pScrn, SCANWID_GET, NULL, \ + pixels, bytes, max) +#define I830VESAGetMaxLogicalScanline(pScrn, pixels, bytes, max) \ + I830VESASetGetLogicalScanlineLength(pScrn, SCANWID_GET_MAX, \ + NULL, pixels, bytes, max) + +#define MODE_QUERY 0 +#define MODE_SAVE 1 +#define MODE_RESTORE 2 + +#define SET_SAVED_MODE 1 +#define SET_CURRENT_MODE 2 + +/* HWMC Surfaces */ +#define I810_MAX_SURFACES 7 +#define I810_MAX_SUBPICTURES 2 +#define I810_TOTAL_SURFACES 9 + /* Globals */ typedef struct _I810Rec *I810Ptr; @@ -80,6 +328,18 @@ extern void I810SetTiledMemory(ScrnInfoPtr pScrn, unsigned pitch, unsigned size); +typedef enum { + OPTION_NOACCEL, + OPTION_SW_CURSOR, + OPTION_COLOR_KEY, + OPTION_CACHE_LINES, + OPTION_DAC_6BIT, + OPTION_DRI, + OPTION_NO_DDC, + OPTION_STRETCH, + OPTION_CENTER, + OPTION_XVMC_SURFACES +} I810Opts; /* Linear region allocated in framebuffer. */ @@ -132,6 +392,58 @@ typedef struct { } I810RegRec, *I810RegPtr; +typedef struct +{ + unsigned int LprbTail; + unsigned int LprbHead; + unsigned int LprbStart; + unsigned int LprbLen; + + unsigned int Fence[8]; + + unsigned int VideoClk_VGA0_M1M2N; + unsigned int VideoClk_VGA1_M1M2N; + unsigned int VideoClk_PostDiv; + unsigned int fpa_0; + unsigned int fpa_1; + unsigned int dpll_a; + unsigned int dpll_b; + + unsigned int LMI_FIFO_Watermark; + unsigned int LMI_FIFO_Watermark2; + + unsigned int HTotal_A; + unsigned int HBlank_A; + unsigned int HSync_A; + unsigned int VTotal_A; + unsigned int VBlank_A; + unsigned int VSync_A; + unsigned int Bclrpat_A; + unsigned int PipeASRC; + + unsigned int HTotal_B; + unsigned int HBlank_B; + unsigned int HSync_B; + unsigned int VTotal_B; + unsigned int VBlank_B; + unsigned int VSync_B; + unsigned int Bclrpat_B; + unsigned int PipeBSRC; + + unsigned int PipeAConf; + unsigned int PipeBConf; + unsigned int DspACntr; + unsigned int DspAStride; + unsigned int DspABase; + unsigned int DspBCntr; + unsigned int DspBStride; + unsigned int DspBBase; + + unsigned int adpa; + unsigned int dv0a; + unsigned int dv0b; +} I830RegRec, *I830RegPtr; + typedef struct _I810Rec { unsigned char *MMIOBase; unsigned char *FbBase; @@ -150,7 +462,8 @@ typedef struct _I810Rec { I810MemRange TexMem; I810MemRange Scratch; I810MemRange BufferMem; - + I810MemRange ContextMem; + I810MemRange MC; int auxPitch; int auxPitchBits; @@ -161,6 +474,8 @@ typedef struct _I810Rec { unsigned long OverlayPhysical; unsigned long OverlayStart; int colorKey; + int surfaceAllocation[I810_TOTAL_SURFACES]; + int numSurfaces; DGAModePtr DGAModes; int numDGAModes; @@ -200,6 +515,10 @@ typedef struct _I810Rec { I810RegRec SavedReg; I810RegRec ModeReg; + + I830RegRec i830_SavedReg; + I830RegRec i830_ModeReg; + XAAInfoRecPtr AccelInfoRec; xf86CursorInfoPtr CursorInfoRec; CloseScreenProcPtr CloseScreen; @@ -223,16 +542,28 @@ typedef struct _I810Rec { unsigned long backHandle; unsigned long zHandle; unsigned long cursorHandle; + unsigned long xvmcHandle; unsigned long sysmemHandle; Bool agpAcquired; drmHandle buffer_map; drmHandle ring_map; drmHandle overlay_map; + drmHandle mc_map; + drmHandle xvmcContext; #endif Bool agpAcquired2d; XF86VideoAdaptorPtr adaptor; OptionInfoPtr Options; + + /* Stolen memory support */ + unsigned long StolenSize; + Bool StolenOnly; + + /* Video BIOS support */ + VESAPtr vesa; + + int configured_device; } I810Rec; #define I810PTR(p) ((I810Ptr)((p)->driverPrivate)) @@ -241,6 +572,14 @@ typedef struct _I810Rec { #define I810_BACK 1 #define I810_DEPTH 2 +extern const char *I810vgahwSymbols[]; +extern const char *I810ramdacSymbols[]; +extern const char *I810int10Symbols[]; +extern const char *I810vbeSymbols[]; +extern const char *I810ddcSymbols[]; +extern const char *I810fbSymbols[]; +extern const char *I810xaaSymbols[]; + extern Bool I810DRIScreenInit(ScreenPtr pScreen); extern void I810DRICloseScreen(ScreenPtr pScreen); extern Bool I810DRIFinishScreenInit(ScreenPtr pScreen); @@ -299,6 +638,59 @@ extern void I810EmitInvarientState(ScrnInfoPtr pScrn); extern Bool I810DGAInit(ScreenPtr pScreen); extern void I810InitVideo(ScreenPtr pScreen); +extern void I810InitMC(ScreenPtr pScreen); + +extern const OptionInfoRec *I810AvailableOptions(int chipid, int busid); + +extern Bool I810MapMem(ScrnInfoPtr pScrn); +extern Bool I810UnmapMem(ScrnInfoPtr pScrn); +extern void I810SetRingRegs(ScrnInfoPtr pScrn); + +/* I830 specific functions */ +extern void I830EmitInvarientState(ScrnInfoPtr pScrn); + +extern Bool I830DRIScreenInit(ScreenPtr pScreen); +extern void I830DRICloseScreen(ScreenPtr pScreen); +extern Bool I830DRIFinishScreenInit(ScreenPtr pScreen); +extern Bool I830InitDma(ScrnInfoPtr pScrn); +extern Bool I830CleanupDma(ScrnInfoPtr pScrn); +extern Bool I830AccelInit(ScreenPtr pScreen); +extern void I830SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, + int ydir, int rop, + unsigned int planemask, + int trans_color); +extern void I830SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int srcX, + int srcY, int dstX, int dstY, + int w, int h); +extern void I830SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, + unsigned int planemask); +extern void I830SubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, + int w, int h); + +/* Debug functions */ +extern char *i810_outreg_get_addr_name(unsigned int addr, int size); +extern void i810_outreg_decode_register(unsigned int addr, unsigned int val, int size); +extern void I830PrintAllRegisters(I830RegPtr i810Reg); +extern void I830ReadAllRegisters(I810Ptr pI810, I830RegPtr i810Reg); +void DPRINTF_stub (const char *filename,int line,const char *function,const char *fmt, ...); + +/* BIOS debug macro */ +#define xf86ExecX86int10_wrapper(pInt, pScrn) do \ + { \ + if(I810_DEBUG & DEBUG_VERBOSE_BIOS) \ + { \ + ErrorF("\n\n\n\nExecuting (ax == 0x%x) BIOS call\n", pInt->ax); \ + ErrorF("Checking Error state before execution\n"); \ + I810PrintErrorState(pScrn); \ + } \ + xf86ExecX86int10(pInt); \ + if(I810_DEBUG & DEBUG_VERBOSE_BIOS) \ + { \ + ErrorF("Checking Error state after execution\n"); \ + usleep(50000); \ + I810PrintErrorState(pScrn); \ + } \ + } while(0) #define minb(p) *(volatile CARD8 *)(pI810->MMIOBase + (p)) #define moutb(p,v) *(volatile CARD8 *)(pI810->MMIOBase + (p)) = (v) @@ -316,48 +708,66 @@ 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; \ - if (n>2 && (I810_DEBUG&DEBUG_ALWAYS_SYNC)) I810Sync( pScrn ); \ +#define DO_RING_IDLE() do \ + { \ + int _head; \ + int _tail; \ + int _i; \ + do \ + { \ + _head = INREG(LP_RING + RING_HEAD) & HEAD_ADDR; \ + _tail = INREG(LP_RING + RING_TAIL) & TAIL_ADDR; \ + for(_i = 0; _i < 65535; _i++); \ + } \ + while(_head != _tail); \ + } while(0) + +#define BEGIN_LP_RING(n) \ + unsigned int outring, ringmask; \ + volatile unsigned char *virt; \ + if (n>2 && (I810_DEBUG&DEBUG_ALWAYS_SYNC)) DO_RING_IDLE(); \ if (pI810->LpRing.space < n*4) I810WaitLpRing( pScrn, n*4, 0); \ - pI810->LpRing.space -= n*4; \ - if (I810_DEBUG & DEBUG_VERBOSE_RING) \ - LP_RING_MESSAGE(n); \ - outring = pI810->LpRing.tail; \ - ringmask = pI810->LpRing.tail_mask; \ - virt = pI810->LpRing.virtual_start; + pI810->LpRing.space -= n*4; \ + if (I810_DEBUG & DEBUG_VERBOSE_RING) \ + ErrorF( "BEGIN_LP_RING %d in %s\n", n, FUNCTION_NAME); \ + outring = pI810->LpRing.tail; \ + ringmask = pI810->LpRing.tail_mask; \ + virt = pI810->LpRing.virtual_start; /* Memory mapped register access macros */ #define INREG8(addr) *(volatile CARD8 *)(pI810->MMIOBase + (addr)) #define INREG16(addr) *(volatile CARD16 *)(pI810->MMIOBase + (addr)) #define INREG(addr) *(volatile CARD32 *)(pI810->MMIOBase + (addr)) -#define OUTREG8(addr, val) do { \ - *(volatile CARD8 *)(pI810->MMIOBase + (addr)) = (val); \ - if (I810_DEBUG&DEBUG_VERBOSE_OUTREG) \ - ErrorF( "OUTREG8(%x, %x)\n", addr, val); \ -} while (0) - -#define OUTREG16(addr, val) do { \ - *(volatile CARD16 *)(pI810->MMIOBase + (addr)) = (val); \ - if (I810_DEBUG&DEBUG_VERBOSE_OUTREG) \ - ErrorF( "OUTREG16(%x, %x)\n", addr, val); \ -} while (0) - -#define OUTREG(addr, val) do { \ - *(volatile CARD32 *)(pI810->MMIOBase + (addr)) = (val); \ - if (I810_DEBUG&DEBUG_VERBOSE_OUTREG) \ - ErrorF( "OUTREG(%x, %x)\n", addr, val); \ -} while (0) +#define OUTREG8(addr, val) do \ + { \ + *(volatile CARD8 *)(pI810->MMIOBase + (addr)) = (val); \ + if (I810_DEBUG&DEBUG_VERBOSE_OUTREG) { \ + char *_name = i810_outreg_get_addr_name(addr, 8); \ + ErrorF( "OUTREG8(%s, %x, %x) in %s\n", _name, addr, val, FUNCTION_NAME); \ + i810_outreg_decode_register(addr, val, 8); \ + } \ + } while (0) + +#define OUTREG16(addr, val) do \ + { \ + *(volatile CARD16 *)(pI810->MMIOBase + (addr)) = (val); \ + if (I810_DEBUG&DEBUG_VERBOSE_OUTREG) { \ + char *_name = i810_outreg_get_addr_name(addr, 16); \ + ErrorF( "OUTREG16(%s, %x, %x) in %s\n", _name, addr, val, FUNCTION_NAME); \ + i810_outreg_decode_register(addr, val, 16); \ + } \ + } while (0) + +#define OUTREG(addr, val) do \ + { \ + *(volatile CARD32 *)(pI810->MMIOBase + (addr)) = (val); \ + if (I810_DEBUG&DEBUG_VERBOSE_OUTREG) { \ + char *_name = i810_outreg_get_addr_name(addr, 32); \ + ErrorF( "OUTREG(%s, %x, %x) in %s\n", _name, addr, val, FUNCTION_NAME); \ + i810_outreg_decode_register(addr, val, 32); \ + } \ + } while (0) /* To remove all debugging, make sure I810_DEBUG is defined as a * preprocessor symbol, and equal to zero. @@ -377,7 +787,7 @@ extern int I810_DEBUG; #define DEBUG_VERBOSE_CURSOR 0x40 #define DEBUG_ALWAYS_SYNC 0x80 #define DEBUG_VERBOSE_DRI 0x100 - +#define DEBUG_VERBOSE_BIOS 0x200 /* Size of the mmio region. */ @@ -400,11 +810,8 @@ extern int I810_DEBUG; pI810->PciInfo->chipType == PCI_CHIP_I810_DC100 || \ pI810->PciInfo->chipType == PCI_CHIP_I810_E) #define IS_I815(pI810) (pI810->PciInfo->chipType == PCI_CHIP_I815) +#define IS_I830(pI810) (pI810->PciInfo->chipType == PCI_CHIP_I830_M) #endif - - - - diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_accel.c index 7a8063a45..bffb03190 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_accel.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_accel.c,v 1.11 2000/09/15 23:25:48 mvojkovi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_accel.c,v 1.12 2001/10/04 18:28:21 alanh Exp $ */ /* * Authors: @@ -214,7 +214,6 @@ I810AccelInit( ScreenPtr pScreen ) return XAAInit(pScreen, infoPtr); } - int I810WaitLpRing( ScrnInfoPtr pScrn, int n, int timeout_millis ) { @@ -651,3 +650,396 @@ I810EmitInvarientState(ScrnInfoPtr pScrn) ADVANCE_LP_RING(); } + +/* I830 Accel Functions */ + +static void I830SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, + int pattx, int patty, + int fg, int bg, int rop, + unsigned int planemask); +static void I830SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, + int pattx, int patty, + int x, int y, int w, int h); + +static void I830SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, + unsigned int mask); + +static void I830SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int x, int y, + int w, int h, + int skipleft ); + +static void I830SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno); + + +/* The following function sets up the supported acceleration. Call it + * from the FbInit() function in the SVGA driver, or before ScreenInit + * in a monolithic server. + */ +Bool +I830AccelInit(ScreenPtr pScreen) +{ + XAAInfoRecPtr infoPtr; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + I810Ptr pI810 = I810PTR(pScrn); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) ErrorF("I830AccelInit\n"); + + pI810->AccelInfoRec = infoPtr = XAACreateInfoRec(); + if (!infoPtr) return FALSE; + + pI810->bufferOffset = 0; + infoPtr->Flags = LINEAR_FRAMEBUFFER | OFFSCREEN_PIXMAPS | PIXMAP_CACHE; + + /* Use the same sync function as the I810. + */ + infoPtr->Sync = I810Sync; + + /* Everything else is different enough to justify different functions */ + { + infoPtr->SolidFillFlags = NO_PLANEMASK; + infoPtr->SetupForSolidFill = I830SetupForSolidFill; + infoPtr->SubsequentSolidFillRect = I830SubsequentSolidFillRect; + } + + { + infoPtr->ScreenToScreenCopyFlags = (NO_PLANEMASK | NO_TRANSPARENCY); + + infoPtr->SetupForScreenToScreenCopy = I830SetupForScreenToScreenCopy; + infoPtr->SubsequentScreenToScreenCopy = I830SubsequentScreenToScreenCopy; + } + + { + infoPtr->SetupForMono8x8PatternFill = I830SetupForMono8x8PatternFill; + infoPtr->SubsequentMono8x8PatternFillRect = + I830SubsequentMono8x8PatternFillRect; + + infoPtr->Mono8x8PatternFillFlags = (HARDWARE_PATTERN_PROGRAMMED_BITS | + HARDWARE_PATTERN_SCREEN_ORIGIN | + HARDWARE_PATTERN_PROGRAMMED_ORIGIN | + BIT_ORDER_IN_BYTE_MSBFIRST | + NO_PLANEMASK); + + } + + if(pI810->Scratch.Size != 0) { + int i; + int width = ((pScrn->displayWidth + 31) & ~31) / 8; + int nr_buffers = pI810->Scratch.Size / width; + unsigned char *ptr = pI810->FbBase + pI810->Scratch.Start; + + pI810->NumScanlineColorExpandBuffers = nr_buffers; + pI810->ScanlineColorExpandBuffers = (unsigned char **) + xnfcalloc( nr_buffers, sizeof (unsigned char *) ); + + for (i = 0 ; i < nr_buffers ; i++, ptr += width) + pI810->ScanlineColorExpandBuffers[i] = ptr; + + infoPtr->ScanlineCPUToScreenColorExpandFillFlags = + (NO_PLANEMASK | + ROP_NEEDS_SOURCE | + BIT_ORDER_IN_BYTE_MSBFIRST); + + infoPtr->ScanlineColorExpandBuffers = (unsigned char **) + xnfcalloc( 1, sizeof (unsigned char *) ); + infoPtr->NumScanlineColorExpandBuffers = 1; + + infoPtr->ScanlineColorExpandBuffers[0] = + pI810->ScanlineColorExpandBuffers[0]; + pI810->nextColorExpandBuf = 0; + + infoPtr->SetupForScanlineCPUToScreenColorExpandFill = + I830SetupForScanlineCPUToScreenColorExpandFill; + + infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = + I830SubsequentScanlineCPUToScreenColorExpandFill; + + infoPtr->SubsequentColorExpandScanline = + I830SubsequentColorExpandScanline; + } + + I810SelectBuffer(pScrn, I810_FRONT); + + return XAAInit(pScreen, infoPtr); +} + +void +I830SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, + unsigned int planemask) +{ + I810Ptr pI810 = I810PTR(pScrn); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF( "I830SetupForFillRectSolid color: %x rop: %x mask: %x\n", + color, rop, planemask); + + pI810->BR[13] = ((i810PatternRop[rop] << 16) | + (pScrn->displayWidth * pI810->cpp)); + + pI810->BR[16] = color; + + switch (pScrn->bitsPerPixel) { + case 8: break; + case 16: pI810->BR[13] |= (1<<24); break; + case 32: pI810->BR[13] |= ((1<<25)|(1<<24)); break; + } +} + +void +I830SubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h) +{ + I810Ptr pI810 = I810PTR(pScrn); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF( "I830SubsequentFillRectSolid %d,%d %dx%d\n", + x,y,w,h); + + { + BEGIN_LP_RING(6); + + if(pScrn->bitsPerPixel == 32) { + OUT_RING(COLOR_BLT_CMD | COLOR_BLT_WRITE_ALPHA | COLOR_BLT_WRITE_RGB); + } else { + OUT_RING(COLOR_BLT_CMD); + } + OUT_RING(pI810->BR[13]); + OUT_RING((h << 16) | (w * pI810->cpp)); + OUT_RING(pI810->bufferOffset + (y * pScrn->displayWidth + x) * + pI810->cpp); + OUT_RING(pI810->BR[16]); + OUT_RING(0); + + ADVANCE_LP_RING(); + } +} + +void +I830SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop, + unsigned int planemask, int transparency_color) +{ + I810Ptr pI810 = I810PTR(pScrn); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF( "I830SetupForScreenToScreenCopy %d %d %x %x %d\n", + xdir, ydir, rop, planemask, transparency_color); + + pI810->BR[13] = (pScrn->displayWidth * pI810->cpp); + pI810->BR[13] |= i810Rop[rop] << 16; + + switch (pScrn->bitsPerPixel) { + case 8: break; + case 16: pI810->BR[13] |= (1<<24); break; + case 32: pI810->BR[13] |= ((1<<25)|(1<<24)); break; + } + +} + +void +I830SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int src_x1, int src_y1, + int dst_x1, int dst_y1, int w, int h) +{ + I810Ptr pI810 = I810PTR(pScrn); + int dst_x2, dst_y2; + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF( "I830SubsequentScreenToScreenCopy %d,%d - %d,%d %dx%d\n", + src_x1,src_y1,dst_x1,dst_y1,w,h); + + dst_x2 = dst_x1 + w; + dst_y2 = dst_y1 + h; + + { + BEGIN_LP_RING(8); + + if(pScrn->bitsPerPixel == 32) { + OUT_RING(XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA | + XY_SRC_COPY_BLT_WRITE_RGB); + } else { + OUT_RING(XY_SRC_COPY_BLT_CMD); + } + OUT_RING(pI810->BR[13]); + OUT_RING((dst_y1 << 16) | (dst_x1 & 0xffff)); + OUT_RING((dst_y2 << 16) | (dst_x2 & 0xffff)); + OUT_RING(pI810->bufferOffset); + OUT_RING((src_y1 << 16) | (src_x1 & 0xffff)); + OUT_RING(pI810->BR[13] & 0xFFFF); + OUT_RING(pI810->bufferOffset); + + ADVANCE_LP_RING(); + } +} + +static void +I830SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int pattx, int patty, + int fg, int bg, int rop, + unsigned int planemask) +{ + I810Ptr pI810 = I810PTR(pScrn); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF( "I830SetupFor8x8PatternColorExpand\n"); + + pI810->BR[16] = pattx; + pI810->BR[17] = patty; + pI810->BR[18] = bg; + pI810->BR[19] = fg; + + pI810->BR[13] = (pScrn->displayWidth * pI810->cpp); /* In bytes */ + pI810->BR[13] |= i810PatternRop[rop] << 16; + if (bg == -1) pI810->BR[13] |= (1<<28); + + switch (pScrn->bitsPerPixel) { + case 8: break; + case 16: pI810->BR[13] |= (1<<24); break; + case 32: pI810->BR[13] |= ((1<<25)|(1<<24)); break; + } + +} + +static void +I830SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, int pattx, int patty, + int x, int y, int w, int h) +{ + I810Ptr pI810 = I810PTR(pScrn); + int x1, x2, y1, y2; + + x1 = x; + x2 = x + w; + y1 = y; + y2 = y + h; + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF( "I830Subsequent8x8PatternColorExpand\n"); + + { + BEGIN_LP_RING( 10 ); + + if(pScrn->bitsPerPixel == 32) { + OUT_RING(XY_MONO_PAT_BLT_CMD | XY_MONO_PAT_BLT_WRITE_ALPHA | + XY_MONO_PAT_BLT_WRITE_RGB | + ((patty << 8) & XY_MONO_PAT_VERT_SEED) | + ((pattx << 12) & XY_MONO_PAT_HORT_SEED)); + } else { + OUT_RING(XY_MONO_PAT_BLT_CMD | + ((patty << 8) & XY_MONO_PAT_VERT_SEED) | + ((pattx << 12) & XY_MONO_PAT_HORT_SEED)); + } + OUT_RING(pI810->BR[13]); + OUT_RING((y1 << 16) | x1); + OUT_RING((y2 << 16) | x2); + OUT_RING(pI810->bufferOffset); + OUT_RING(pI810->BR[18]); /* bg */ + OUT_RING(pI810->BR[19]); /* fg */ + OUT_RING(pI810->BR[16]); /* pattern data */ + OUT_RING(pI810->BR[17]); + OUT_RING(0); + ADVANCE_LP_RING(); + } +} + +static void +I830GetNextScanlineColorExpandBuffer(ScrnInfoPtr pScrn) +{ + I810Ptr pI810 = I810PTR(pScrn); + XAAInfoRecPtr infoPtr = pI810->AccelInfoRec; + + if (pI810->nextColorExpandBuf == pI810->NumScanlineColorExpandBuffers) + I810Sync( pScrn ); + + infoPtr->ScanlineColorExpandBuffers[0] = + pI810->ScanlineColorExpandBuffers[pI810->nextColorExpandBuf]; + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF( "using color expand buffer %d\n", + pI810->nextColorExpandBuf); + + pI810->nextColorExpandBuf++; +} + +static void +I830SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, int rop, + unsigned int planemask) +{ + I810Ptr pI810 = I810PTR(pScrn); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF("I830SetupForScanlineScreenToScreenColorExpand %d %d %x %x\n", + fg,bg,rop,planemask); + + /* Fill out register values */ + pI810->BR[13] = (pScrn->displayWidth * pI810->cpp); + pI810->BR[13] |= i810Rop[rop] << 16; + if (bg == -1) pI810->BR[13] |= (1<<29); + + switch (pScrn->bitsPerPixel) { + case 8: break; + case 16: pI810->BR[13] |= (1<<24); break; + case 32: pI810->BR[13] |= ((1<<25)|(1<<24)); break; + } + + pI810->BR[18] = bg; + pI810->BR[19] = fg; + + I830GetNextScanlineColorExpandBuffer( pScrn ); +} + +static void +I830SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int x, int y, + int w, int h, + int skipleft) +{ + I810Ptr pI810 = I810PTR(pScrn); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF("I830SubsequentScanlineCPUToScreenColorExpandFill " + "%d,%d %dx%x %d\n", + x,y,w,h,skipleft); + + /* Fill out register values */ + pI810->BR[9] = (pI810->bufferOffset + + (y * pScrn->displayWidth + x) * pI810->cpp); + pI810->BR[11] = ((1 << 16) | w); +} + +static void +I830SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) +{ + I810Ptr pI810 = I810PTR(pScrn); + + pI810->BR[12] = (pI810->AccelInfoRec->ScanlineColorExpandBuffers[0] - + pI810->FbBase); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF( "I830SubsequentColorExpandScanline %d (addr %x)\n", + bufno, + pI810->BR[12]); + + { + BEGIN_LP_RING( 8 ); + + if(pScrn->bitsPerPixel == 32) { + OUT_RING(XY_MONO_SRC_BLT_CMD | XY_MONO_SRC_BLT_WRITE_ALPHA | + XY_MONO_SRC_BLT_WRITE_RGB); + } else { + OUT_RING(XY_MONO_SRC_BLT_CMD); + } + OUT_RING(pI810->BR[13]); + OUT_RING(0); /* x1 = 0, y1 = 0 */ + OUT_RING(pI810->BR[11]); /* x2 = w, y2 = 1 */ + OUT_RING(pI810->BR[9]); /* dst addr */ + OUT_RING(pI810->BR[12]); /* src addr */ + OUT_RING( pI810->BR[18]); /* bg */ + OUT_RING( pI810->BR[19]); /* fg */ + + ADVANCE_LP_RING(); + } + + /* Advance to next scanline. + */ + pI810->BR[9] += pScrn->displayWidth * pI810->cpp; + I830GetNextScanlineColorExpandBuffer( pScrn ); +} diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_cursor.c b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_cursor.c index 903ecd5b9..6001d5e8b 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_cursor.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_cursor.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_cursor.c,v 1.2 2000/02/23 04:47:15 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_cursor.c,v 1.4 2001/10/10 14:08:36 alanh Exp $ */ /* * Authors: @@ -48,8 +48,6 @@ static void I810HideCursor(ScrnInfoPtr pScrn); static void I810SetCursorColors(ScrnInfoPtr pScrn, int bg, int fb); static Bool I810UseHWCursor(ScreenPtr pScrn, CursorPtr pCurs); - - Bool I810CursorInit(ScreenPtr pScreen) { @@ -69,7 +67,8 @@ I810CursorInit(ScreenPtr pScreen) HARDWARE_CURSOR_INVERT_MASK | HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK | HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | - HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64); + HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 | + 0); infoPtr->SetCursorColors = I810SetCursorColors; infoPtr->SetCursorPosition = I810SetCursorPosition; @@ -89,9 +88,6 @@ I810UseHWCursor(ScreenPtr pScreen, CursorPtr pCurs) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; I810Ptr pI810 = I810PTR(pScrn); -/* if (pScrn->currentMode->Flags&V_DBLSCAN) */ -/* return FALSE; */ - if (!pI810->CursorPhysical) return FALSE; return TRUE; } @@ -101,7 +97,7 @@ I810LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) { I810Ptr pI810 = I810PTR(pScrn); CARD8 *pcurs = (CARD8 *)(pI810->FbBase + pI810->CursorStart); int x, y; - + for (y = 0; y < 64; y++) { for (x = 0; x < 64 / 4; x++) { *pcurs++ = *src++; @@ -109,80 +105,140 @@ I810LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) { } } -void -I810SetCursorPosition(ScrnInfoPtr pScrn, int x, int y) { - I810Ptr pI810 = I810PTR(pScrn); - int flag; - - if (I810_DEBUG & DEBUG_VERBOSE_CURSOR) - ErrorF( "I810SetCursorPosition %d %d\n", x, y); - - x += pI810->CursorOffset; +#define CURACNTR 0x70080 +#define CURSORA_DISABLE 0 +#define CURSORA_MODE_64_3C (1<<2) +#define CURSORA_MODE_64_AND_XOR ((1<<2)|(1)) +#define CURSORA_MODE_64_4C ((1<<2)|(1<<1)) +#define CURSORA_MODE_64_32BPP_AND_XOR ((1<<2)|(1<<1)|(1)) +#define CURSORA_MODE_64_32BPP_ARGB ((1<<5)|(1<<2)|(1<<1)|(1)) +#define CURSORA_RESERVED ((1<<31)|(1<<30)|(1<<29)|(1<<24)|(1<<23)|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)|(1<<7)|(1<<6)|(1<<4)) +#define CURABASE 0x70084 - if (x >= 0) flag = CURSOR_X_POS; - else { - flag = CURSOR_X_NEG; - x=-x; - } - - OUTREG8( CURSOR_X_LO, x&0xFF); - OUTREG8( CURSOR_X_HI, (((x >> 8) & 0x07) | flag)); - - if (y >= 0) flag = CURSOR_Y_POS; - else { - flag = CURSOR_Y_NEG; - y=-y; - } - OUTREG8( CURSOR_Y_LO, y&0xFF); - OUTREG8( CURSOR_Y_HI, (((y >> 8) & 0x07) | flag)); +void +I810SetCursorPosition(ScrnInfoPtr pScrn, int x, int y) +{ + I810Ptr pI810 = I810PTR(pScrn); + int flag; + +#if 0 + DPRINTF (PFX, + "%s %d %d\n" + "--> CURACNTR == 0x%.8x\n" + "--> CURBCNTR == 0x%.8x\n", + __FUNCTION__,x,y, + INREG (0x70080), + INREG (0x700C0)); +#endif + /* FIXME: hack to get around disappearing cursor problems. + * don't know why this work though. */ + if (IS_I830 (pI810)) + { + INREG (0x70080); + INREG (0x700C0); + } + + x += pI810->CursorOffset; + + if (x >= 0) flag = CURSOR_X_POS; + else { + flag = CURSOR_X_NEG; + x=-x; + } + + OUTREG8( CURSOR_X_LO, x&0xFF); + OUTREG8( CURSOR_X_HI, (((x >> 8) & 0x07) | flag)); + + if (y >= 0) flag = CURSOR_Y_POS; + else { + flag = CURSOR_Y_NEG; + y=-y; + } + OUTREG8( CURSOR_Y_LO, y&0xFF); + OUTREG8( CURSOR_Y_HI, (((y >> 8) & 0x07) | flag)); + + /* FIXME */ + OUTREG(CURABASE, pI810->CursorPhysical); } static void -I810ShowCursor(ScrnInfoPtr pScrn) { - I810Ptr pI810 = I810PTR(pScrn); - unsigned char tmp; - - OUTREG( CURSOR_BASEADDR, pI810->CursorPhysical); - OUTREG8( CURSOR_CONTROL, CURSOR_ORIGIN_DISPLAY | CURSOR_MODE_64_3C); - - tmp = INREG8( PIXPIPE_CONFIG_0 ); - tmp |= HW_CURSOR_ENABLE; - OUTREG8( PIXPIPE_CONFIG_0, tmp); +I810ShowCursor(ScrnInfoPtr pScrn) +{ + I810Ptr pI810 = I810PTR(pScrn); + unsigned char tmp; + CARD32 temp; + + if(IS_I830(pI810)) { + temp = INREG(CURACNTR); + temp &= CURSORA_RESERVED; + temp |= CURSORA_MODE_64_AND_XOR; + OUTREG(CURACNTR, temp); + OUTREG(CURABASE, pI810->CursorPhysical); + } else { + OUTREG( CURSOR_BASEADDR, pI810->CursorPhysical); + OUTREG8( CURSOR_CONTROL, CURSOR_ORIGIN_DISPLAY | CURSOR_MODE_64_3C); + + tmp = INREG8( PIXPIPE_CONFIG_0 ); + tmp |= HW_CURSOR_ENABLE; + OUTREG8( PIXPIPE_CONFIG_0, tmp); + } } static void -I810HideCursor(ScrnInfoPtr pScrn) { - unsigned char tmp; - I810Ptr pI810 = I810PTR(pScrn); +I810HideCursor(ScrnInfoPtr pScrn) +{ + unsigned char tmp; + CARD32 temp; + I810Ptr pI810 = I810PTR(pScrn); - tmp=INREG8( PIXPIPE_CONFIG_0 ); - tmp &= ~HW_CURSOR_ENABLE; - OUTREG8( PIXPIPE_CONFIG_0, tmp); + if(IS_I830(pI810)) { + temp = INREG(CURACNTR); + temp &= CURSORA_RESERVED; + temp |= CURSORA_DISABLE; + OUTREG(CURACNTR, temp); + OUTREG(CURABASE, pI810->CursorPhysical); + } else { + tmp=INREG8( PIXPIPE_CONFIG_0 ); + tmp &= ~HW_CURSOR_ENABLE; + OUTREG8( PIXPIPE_CONFIG_0, tmp); + } } -static void -I810SetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) { - int tmp; - I810Ptr pI810 = I810PTR(pScrn); - - tmp=INREG8(PIXPIPE_CONFIG_0); - tmp |= EXTENDED_PALETTE; - OUTREG8( PIXPIPE_CONFIG_0, tmp); - - pI810->writeStandard(pI810, DACMASK, 0xFF); - pI810->writeStandard(pI810, DACWX, 0x04); - - pI810->writeStandard(pI810, DACDATA, (bg & 0x00FF0000) >> 16); - pI810->writeStandard(pI810, DACDATA, (bg & 0x0000FF00) >> 8); - pI810->writeStandard(pI810, DACDATA, (bg & 0x000000FF)); +#define CURAPALET0 0x70090 +#define CURAPALET1 0x70094 +#define CURAPALET2 0x70098 +#define CURAPALET3 0x7009c - pI810->writeStandard(pI810, DACDATA, (fg & 0x00FF0000) >> 16); - pI810->writeStandard(pI810, DACDATA, (fg & 0x0000FF00) >> 8); - pI810->writeStandard(pI810, DACDATA, (fg & 0x000000FF)); +static void +I810SetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) +{ + int tmp; + I810Ptr pI810 = I810PTR(pScrn); - tmp=INREG8( PIXPIPE_CONFIG_0 ); - tmp &= ~EXTENDED_PALETTE; - OUTREG8( PIXPIPE_CONFIG_0, tmp ); + if(IS_I830(pI810)) { + OUTREG(CURAPALET0, bg & 0x00ffffff); + OUTREG(CURAPALET1, fg & 0x00ffffff); + OUTREG(CURAPALET2, fg & 0x00ffffff); + OUTREG(CURAPALET3, bg & 0x00ffffff); + } else { + tmp=INREG8(PIXPIPE_CONFIG_0); + tmp |= EXTENDED_PALETTE; + OUTREG8( PIXPIPE_CONFIG_0, tmp); + + pI810->writeStandard(pI810, DACMASK, 0xFF); + pI810->writeStandard(pI810, DACWX, 0x04); + + pI810->writeStandard(pI810, DACDATA, (bg & 0x00FF0000) >> 16); + pI810->writeStandard(pI810, DACDATA, (bg & 0x0000FF00) >> 8); + pI810->writeStandard(pI810, DACDATA, (bg & 0x000000FF)); + + pI810->writeStandard(pI810, DACDATA, (fg & 0x00FF0000) >> 16); + pI810->writeStandard(pI810, DACDATA, (fg & 0x0000FF00) >> 8); + pI810->writeStandard(pI810, DACDATA, (fg & 0x000000FF)); + + tmp=INREG8( PIXPIPE_CONFIG_0 ); + tmp &= ~EXTENDED_PALETTE; + OUTREG8( PIXPIPE_CONFIG_0, tmp ); + } } - diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dga.c b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dga.c index 56eeb7863..50d493e42 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dga.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dga.c @@ -21,7 +21,7 @@ * * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk> */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dga.c,v 1.2 2000/09/17 23:18:19 mvojkovi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dga.c,v 1.4 2001/10/10 14:08:37 alanh Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -43,8 +43,10 @@ static int I810_GetViewport(ScrnInfoPtr); static void I810_SetViewport(ScrnInfoPtr, int, int, int); static void I810_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long); static void I810_BlitRect(ScrnInfoPtr, int, int, int, int, int, int); +#if 0 static void I810_BlitTransRect(ScrnInfoPtr, int, int, int, int, int, int, unsigned long); +#endif static DGAFunctionRec I810DGAFuncs = { @@ -73,6 +75,8 @@ I810DGAInit(ScreenPtr pScreen) int Bpp = pScrn->bitsPerPixel >> 3; int num = 0; + MARKER(); + pMode = firstMode = pScrn->modes; while(pMode) { @@ -145,20 +149,24 @@ I810_SetMode( int index = pScrn->pScreen->myNum; I810Ptr pI810 = I810PTR(pScrn); + MARKER(); + if(!pMode) { /* restore the original mode */ + DPRINTF (PFX,"Restoring original mode (from DGA mode)\n"); if(pI810->DGAactive) { pScrn->currentMode = I810SavedDGAModes[index]; - I810SwitchMode(index, pScrn->currentMode, 0); - I810AdjustFrame(index, 0, 0, 0); + pScrn->SwitchMode(index, pScrn->currentMode, 0); + pScrn->AdjustFrame(index, 0, 0, 0); pI810->DGAactive = FALSE; } } else { if(!pI810->DGAactive) { + DPRINTF (PFX,"Setting DGA mode\n"); I810SavedDGAModes[index] = pScrn->currentMode; pI810->DGAactive = TRUE; } - I810SwitchMode(index, pMode->mode, 0); + pScrn->SwitchMode(index, pMode->mode, 0); } return TRUE; @@ -170,6 +178,8 @@ I810_GetViewport( ){ I810Ptr pI810 = I810PTR(pScrn); + MARKER(); + return pI810->DGAViewportStatus; } @@ -182,7 +192,9 @@ I810_SetViewport( I810Ptr pI810 = I810PTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); - I810AdjustFrame(pScrn->pScreen->myNum, x, y, flags); + MARKER(); + + pScrn->AdjustFrame(pScrn->pScreen->myNum, x, y, flags); /* wait for retrace */ while((hwp->readST01(hwp) & 0x08)); @@ -199,6 +211,8 @@ I810_FillRect ( ){ I810Ptr pI810 = I810PTR(pScrn); + MARKER(); + if(pI810->AccelInfoRec) { (*pI810->AccelInfoRec->SetupForSolidFill)(pScrn, color, GXcopy, ~0); (*pI810->AccelInfoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h); @@ -212,6 +226,8 @@ I810_Sync( ){ I810Ptr pI810 = I810PTR(pScrn); + MARKER(); + if(pI810->AccelInfoRec) { (*pI810->AccelInfoRec->Sync)(pScrn); } @@ -226,6 +242,8 @@ I810_BlitRect( ){ I810Ptr pI810 = I810PTR(pScrn); + MARKER(); + if(pI810->AccelInfoRec) { int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; int ydir = (srcy < dsty) ? -1 : 1; @@ -238,7 +256,7 @@ I810_BlitRect( } } - +#if 0 static void I810_BlitTransRect( ScrnInfoPtr pScrn, @@ -247,10 +265,13 @@ I810_BlitTransRect( int dstx, int dsty, unsigned long color ){ + + MARKER(); + /* this one should be separate since the XAA function would prohibit usage of ~0 as the key */ } - +#endif static Bool I810_OpenFramebuffer( @@ -263,11 +284,18 @@ I810_OpenFramebuffer( ){ I810Ptr pI810 = I810PTR(pScrn); + MARKER(); + *name = NULL; /* no special device */ *mem = (unsigned char*)pI810->LinearAddr; *size = pI810->FbMapSize; *offset = 0; *flags = DGA_NEED_ROOT; + DPRINTF (PFX, + " mem == 0x%.8x (pI810->LinearAddr)\n" + "size == %lu (pI810->FbMapSize)\n", + *mem,*size); + return TRUE; } 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 37d8b10b1..ac0879400 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.23 2001/08/18 02:51:12 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c,v 1.25 2001/12/21 21:04:36 dawes Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -82,6 +82,8 @@ Bool I810InitDma(ScrnInfoPtr pScrn) info.front_offset = 0; info.back_offset = pI810->BackBuffer.Start; info.depth_offset = pI810->DepthBuffer.Start; + info.overlay_offset = pI810->OverlayStart; + info.overlay_physical = pI810->OverlayPhysical; info.w = pScrn->virtualX; info.h = pScrn->virtualY; info.pitch = pI810->auxPitch; @@ -337,11 +339,11 @@ Bool I810DRIScreenInit(ScreenPtr pScreen) drmVersionPtr version = drmGetVersion(pI810->drmSubFD); if (version) { if (version->version_major != 1 || - version->version_minor < 1) { + version->version_minor < 2) { /* incompatible drm version */ xf86DrvMsg(pScreen->myNum, X_ERROR, "[dri] I810DRIScreenInit failed because of a version mismatch.\n" - "[dri] i810.o kernel module version is %d.%d.%d but version 1.1 or greater is needed.\n" + "[dri] i810.o kernel module version is %d.%d.%d but version 1.2 or greater is needed.\n" "[dri] Disabling DRI.\n", version->version_major, version->version_minor, @@ -367,6 +369,7 @@ Bool I810DRIScreenInit(ScreenPtr pScreen) pI810->backHandle = 0; pI810->zHandle = 0; pI810->cursorHandle = 0; + pI810->xvmcHandle = 0; pI810->sysmemHandle = 0; pI810->agpAcquired = FALSE; pI810->dcacheHandle = 0; @@ -431,6 +434,26 @@ Bool I810DRIScreenInit(ScreenPtr pScreen) sysmem_size = sysmem_size - 2*back_size; } + /* Max size is 48 without XvMC, 41 with 6 surfaces, 40 with 7 surfaces */ + if(pI810->numSurfaces && (pI810->numSurfaces == 6)) { + if(sysmem_size > (pI810->FbMapSize - 7*1024*1024)) { + sysmem_size = (pI810->FbMapSize - 7*1024*1024); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "User requested more memory then fits in the agp aperture\n" + "Truncating to %d bytes of memory\n", + sysmem_size); + } + } + if(pI810->numSurfaces && (pI810->numSurfaces == 7)) { + if(sysmem_size > (pI810->FbMapSize - 8*1024*1024)) { + sysmem_size = (pI810->FbMapSize - 8*1024*1024); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "User requested more memory then fits in the agp aperture\n" + "Truncating to %d bytes of memory\n", + sysmem_size); + } + } + if(sysmem_size > pI810->FbMapSize) { sysmem_size = pI810->FbMapSize; @@ -543,6 +566,55 @@ Bool I810DRIScreenInit(ScreenPtr pScreen) return FALSE; } +/* Allocate 7 or 8MB for XvMC this is setup as follows to best use tiled + regions and required surface pitches. (Numbers are adjusted if the + AGP region is only 32MB + For numSurfaces == 6 + 44 - 48MB = 4MB Fence, 8 Tiles wide + 43 - 44MB = 1MB Fence, 8 Tiles wide + 42 - 43MB = 1MB Fence, 4 Tiles wide + 41 - 42MB = 1MB Fence, 4 Tiles wide + For numSurfaces == 7 + 44 - 48MB = 4MB Fence, 8 Tiles wide + 43 - 44MB = 1MB Fence, 8 Tiles wide + 42.5 - 43MB = 0.5MB Fence, 8 Tiles wide + 42 - 42.5MB = 0.5MB Fence, 4 Tiles wide + 40 - 42MB = 2MB Fence, 4 Tiles wide + */ + if(pI810->numSurfaces) { + if(pI810->numSurfaces == 6) { + pI810->MC.Size = 7*1024*1024; + pI810->MC.Start = pI810->FbMapSize - 7*1024*1024; + + } + if(pI810->numSurfaces == 7) { + pI810->MC.Size = 8*1024*1024; + pI810->MC.Start = pI810->FbMapSize - 8*1024*1024; + } + drmAgpAlloc(pI810->drmSubFD, pI810->MC.Size, 0, NULL, &agpHandle); + pI810->xvmcHandle = agpHandle; + + if (agpHandle != 0) { + if (drmAgpBind(pI810->drmSubFD, agpHandle, pI810->MC.Start) == 0) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "GART: Allocated 7MB for HWMC\n"); + pI810->MC.End = pI810->MC.Start + pI810->MC.Size; + } + else { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "GART: HWMC bind failed\n"); + pI810->MC.Start = 0; + pI810->MC.Size = 0; + pI810->MC.End = 0; + } + } else { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "GART: HWMC alloc failed\n"); + pI810->MC.Start = 0; + pI810->MC.Size = 0; + pI810->MC.End = 0; + } + pI810->xvmcContext = 0; + } + drmAgpAlloc(pI810->drmSubFD, 4096, 2, (unsigned long *)&pI810->CursorPhysical, &agpHandle); pI810->cursorHandle = agpHandle; @@ -566,13 +638,11 @@ Bool I810DRIScreenInit(ScreenPtr pScreen) pI810->CursorPhysical = 0; } - /* Steal some of the excess cursor space for the overlay regs, - * then allocate 202*2 pages for the overlay buffers. + /* Steal some of the excess cursor space for the overlay regs. */ pI810->OverlayPhysical = pI810->CursorPhysical + 1024; pI810->OverlayStart = pI810->CursorStart + 1024; - /* drmAddMap happens later to preserve index order */ @@ -586,6 +656,57 @@ Bool I810DRIScreenInit(ScreenPtr pScreen) i810_pitches[pitch_idx], 8*1024*1024); + + /* These are for HWMC surfaces */ + if(pI810->numSurfaces == 6) { + I810SetTiledMemory(pScrn, 3, + pI810->MC.Start, + 512, + 1024*1024); + + I810SetTiledMemory(pScrn, 4, + pI810->MC.Start + 1024*1024, + 512, + 1024*1024); + + I810SetTiledMemory(pScrn, 5, + pI810->MC.Start + 1024*1024*2, + 1024, + 1024*1024); + + I810SetTiledMemory(pScrn, 6, + pI810->MC.Start + 1024*1024*3, + 1024, + 4*1024*1024); + } + if(pI810->numSurfaces == 7) { + I810SetTiledMemory(pScrn, 3, + pI810->MC.Start, + 512, + 2*1024*1024); + + I810SetTiledMemory(pScrn, 4, + pI810->MC.Start + 2*1024*1024, + 512, + 512*1024); + + I810SetTiledMemory(pScrn, 5, + pI810->MC.Start + 2*1024*1024 + 512*1024, + 1024, + 512*1024); + + I810SetTiledMemory(pScrn, 6, + pI810->MC.Start + 3*1024*1024, + 1024, + 1*1024*1024); + + I810SetTiledMemory(pScrn, 7, + pI810->MC.Start + 4*1024*1024, + 1024, + 4*1024*1024); + + } + pI810->auxPitch = i810_pitches[pitch_idx]; pI810->auxPitchBits = i810_pitch_flags[pitch_idx]; pI810->SavedDcacheMem = pI810->DcacheMem; @@ -774,6 +895,7 @@ I810DRICloseScreen(ScreenPtr pScreen) if(pI810->backHandle) drmAgpFree(pI810->drmSubFD, pI810->backHandle); if(pI810->zHandle) drmAgpFree(pI810->drmSubFD, pI810->zHandle); if(pI810->cursorHandle) drmAgpFree(pI810->drmSubFD, pI810->cursorHandle); + if(pI810->xvmcHandle) drmAgpFree(pI810->drmSubFD, pI810->xvmcHandle); if(pI810->sysmemHandle) drmAgpFree(pI810->drmSubFD, pI810->sysmemHandle); if(pI810->agpAcquired == TRUE) drmAgpRelease(pI810->drmSubFD); @@ -781,6 +903,7 @@ I810DRICloseScreen(ScreenPtr pScreen) pI810->backHandle = 0; pI810->zHandle = 0; pI810->cursorHandle = 0; + pI810->xvmcHandle = 0; pI810->sysmemHandle = 0; pI810->agpAcquired = FALSE; pI810->dcacheHandle = 0; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.h b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.h index f8e46ee3a..96a680b85 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.h @@ -1,10 +1,10 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.h,v 1.5 2001/03/21 17:02:23 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.h,v 1.6 2001/10/04 18:28:21 alanh Exp $ */ #ifndef _I810_DRI_ #define _I810_DRI_ -#include "xf86drm.h" -#include "xf86drmI810.h" +#include <xf86drm.h> +#include <xf86drmI810.h> #define I810_MAX_DRAWABLES 256 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 03be327e5..a81537306 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.52 2001/06/13 23:34:14 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_driver.c,v 1.65 2002/01/09 16:02:29 dawes Exp $ */ /* * Authors: @@ -71,7 +71,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /* Required Functions: */ static void I810Identify(int flags); -static const OptionInfoRec * I810AvailableOptions(int chipid, int busid); static Bool I810Probe(DriverPtr drv, int flags); static Bool I810PreInit(ScrnInfoPtr pScrn, int flags); static Bool I810ScreenInit(int Index, ScreenPtr pScreen, int argc, char **argv); @@ -102,7 +101,8 @@ static SymTabRec I810Chipsets[] = { { PCI_CHIP_I810, "i810"}, { PCI_CHIP_I810_DC100, "i810-dc100"}, { PCI_CHIP_I810_E, "i810e"}, - { PCI_CHIP_I815, "i815"}, + { PCI_CHIP_I815, "i815"}, + { PCI_CHIP_I830_M, "i830M"}, { -1, NULL } }; @@ -110,20 +110,11 @@ static PciChipsets I810PciChipsets[] = { { PCI_CHIP_I810, PCI_CHIP_I810, RES_SHARED_VGA }, { PCI_CHIP_I810_DC100, PCI_CHIP_I810_DC100, RES_SHARED_VGA }, { PCI_CHIP_I810_E, PCI_CHIP_I810_E, RES_SHARED_VGA }, - { PCI_CHIP_I815, PCI_CHIP_I815, RES_SHARED_VGA }, + { PCI_CHIP_I815, PCI_CHIP_I815, RES_SHARED_VGA }, + { PCI_CHIP_I830_M, PCI_CHIP_I830_M, RES_SHARED_VGA }, { -1, -1, RES_UNDEFINED } }; -typedef enum { - OPTION_NOACCEL, - OPTION_SW_CURSOR, - OPTION_COLOR_KEY, - OPTION_CACHE_LINES, - OPTION_DAC_6BIT, - OPTION_DRI, - OPTION_NO_DDC -} I810Opts; - static const OptionInfoRec I810Options[] = { { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE }, @@ -132,14 +123,16 @@ static const OptionInfoRec I810Options[] = { { OPTION_DAC_6BIT, "Dac6Bit", OPTV_BOOLEAN, {0}, FALSE}, { OPTION_DRI, "DRI", OPTV_BOOLEAN, {0}, FALSE}, { OPTION_NO_DDC, "NoDDC", OPTV_BOOLEAN, {0}, FALSE}, + { OPTION_XVMC_SURFACES, "XvMCSurfaces", OPTV_INTEGER, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE} }; -static const char *vgahwSymbols[] = { +const char *I810vgahwSymbols[] = { "vgaHWFreeHWRec", "vgaHWGetHWRec", "vgaHWGetIOBase", "vgaHWGetIndex", + "vgaHWHandleColormaps", "vgaHWInit", "vgaHWLock", "vgaHWMapMem", @@ -153,40 +146,53 @@ static const char *vgahwSymbols[] = { NULL }; -static const char *fbSymbols[] = { +const char *I810fbSymbols[] = { "fbPictureInit", "fbScreenInit", NULL }; -static const char *vbeSymbols[] = { +const char *I810vbeSymbols[] = { "VBEInit", "vbeDoEDID", "vbeFree", NULL }; -static const char *ddcSymbols[] = { +const char *I810ddcSymbols[] = { "xf86PrintEDID", "xf86SetDDCproperties", NULL }; -static const char *xaaSymbols[] = { +const char *I810int10Symbols[] = { + "xf86ExecX86int10", + "xf86InitInt10", + "xf86Int10AllocPages", + "xf86int10Addr", + NULL +}; + +const char *I810xaaSymbols[] = { + "XAACachePlanarMonoStipple", "XAACreateInfoRec", "XAADestroyInfoRec", "XAAFillSolidRects" "XAAInit", + "XAAOverlayFBfuncs", + "XAAScreenIndex", + "XAAStippleScanlineFuncLSBFirst", NULL }; -static const char *ramdacSymbols[] = { +const char *I810ramdacSymbols[] = { "xf86CreateCursorInfoRec", "xf86DestroyCursorInfoRec", "xf86InitCursor", NULL }; +#ifdef XFree86LOADER #ifdef XF86DRI static const char *drmSymbols[] = { "drmAddBufs", @@ -197,12 +203,18 @@ static const char *drmSymbols[] = { "drmAgpEnable", "drmAgpFree", "drmAgpRelease", + "drmAvailable", + "drmAuthMagic", + "drmCreateContext", "drmCtlInstHandler", + "drmDestroyContext", "drmFreeVersion", "drmGetInterruptFromBusID", "drmGetVersion", "drmI810CleanupDma", "drmI810InitDma", + "drmI830CleanupDma", + "drmI830InitDma", NULL }; @@ -211,6 +223,8 @@ static const char *driSymbols[] = { "DRICreateInfoRec", "DRIDestroyInfoRec", "DRIFinishScreenInit", + "DRIGetContext", + "DRIGetDrawableIndex", "DRIGetSAREAPrivate", "DRILock", "DRIQueryVersion", @@ -220,6 +234,7 @@ static const char *driSymbols[] = { NULL }; #endif +#endif #ifndef I810_DEBUG @@ -280,16 +295,17 @@ i810Setup(pointer module, pointer opts, int *errmaj, int *errmin) * Tell the loader about symbols from other modules that this module * might refer to. */ - LoaderRefSymLists(vgahwSymbols, - fbSymbols, - xaaSymbols, - ramdacSymbols, + LoaderRefSymLists(I810vgahwSymbols, + I810fbSymbols, + I810xaaSymbols, + I810ramdacSymbols, #ifdef XF86DRI drmSymbols, driSymbols, #endif - vbeSymbols, - ddcSymbols, + I810vbeSymbols, + I810ddcSymbols, + I810int10Symbols, NULL); /* @@ -340,9 +356,11 @@ I810Identify(int flags) { xf86PrintChipsets(I810_NAME, "Driver for Intel i810 chipset", I810Chipsets); } -static const OptionInfoRec * +const OptionInfoRec * I810AvailableOptions(int chipid, int busid) { + const OptionInfoRec *pOptions; + if ((pOptions = I830BIOSAvailableOptions (chipid,busid))) return pOptions; return I810Options; } /* @@ -387,20 +405,40 @@ I810Probe(DriverPtr drv, int flags) { /* Allocate new ScrnInfoRec and claim the slot */ if ((pScrn = xf86ConfigPciEntity(pScrn, 0, usedChips[i], I810PciChipsets, 0, 0, 0, 0, 0))){ - pScrn->driverVersion = I810_VERSION; - pScrn->driverName = I810_DRIVER_NAME; - pScrn->name = I810_NAME; - pScrn->Probe = I810Probe; - pScrn->PreInit = I810PreInit; - pScrn->ScreenInit = I810ScreenInit; - pScrn->SwitchMode = I810SwitchMode; - pScrn->AdjustFrame = I810AdjustFrame; - pScrn->EnterVT = I810EnterVT; - pScrn->LeaveVT = I810LeaveVT; - pScrn->FreeScreen = I810FreeScreen; - pScrn->ValidMode = I810ValidMode; - foundScreen = TRUE; - } + EntityInfoPtr pEnt; + + pEnt = xf86GetEntityInfo(usedChips[i]); + + if (pEnt->chipset == PCI_CHIP_I830_M) { + pScrn->driverVersion = I810_VERSION; + pScrn->driverName = I810_DRIVER_NAME; + pScrn->name = I810_NAME; + pScrn->Probe = I810Probe; + pScrn->PreInit = I830BIOSPreInit; + pScrn->ScreenInit = I830BIOSScreenInit; + pScrn->SwitchMode = I830BIOSSwitchMode; + pScrn->AdjustFrame = I830BIOSAdjustFrame; + pScrn->EnterVT = I830BIOSEnterVT; + pScrn->LeaveVT = I830BIOSLeaveVT; + pScrn->FreeScreen = I830BIOSFreeScreen; + pScrn->ValidMode = I810ValidMode; + foundScreen = TRUE; + } else { + pScrn->driverVersion = I810_VERSION; + pScrn->driverName = I810_DRIVER_NAME; + pScrn->name = I810_NAME; + pScrn->Probe = I810Probe; + pScrn->PreInit = I810PreInit; + pScrn->ScreenInit = I810ScreenInit; + pScrn->SwitchMode = I810SwitchMode; + pScrn->AdjustFrame = I810AdjustFrame; + pScrn->EnterVT = I810EnterVT; + pScrn->LeaveVT = I810LeaveVT; + pScrn->FreeScreen = I810FreeScreen; + pScrn->ValidMode = I810ValidMode; + foundScreen = TRUE; + } + } } xfree(usedChips); @@ -416,6 +454,7 @@ I810ProbeDDC(ScrnInfoPtr pScrn, int index) if (xf86LoadSubModule(pScrn, "vbe")) { pVbe = VBEInit(NULL,index); ConfiguredMonitor = vbeDoEDID(pVbe, NULL); + vbeFree(pVbe); } } @@ -432,7 +471,7 @@ I810DoDDC(ScrnInfoPtr pScrn, int index) } if (xf86LoadSubModule(pScrn, "vbe") && (pVbe = VBEInit(NULL,index))) { - xf86LoaderReqSymLists(vbeSymbols, NULL); + xf86LoaderReqSymLists(I810vbeSymbols, NULL); MonInfo = vbeDoEDID(pVbe, NULL); xf86PrintEDID( MonInfo ); xf86SetDDCproperties(pScrn, MonInfo); @@ -480,7 +519,7 @@ I810PreInit(ScrnInfoPtr pScrn, int flags) { /* The vgahw module should be loaded here when needed */ if (!xf86LoadSubModule(pScrn, "vgahw")) return FALSE; - xf86LoaderReqSymLists(vgahwSymbols, NULL); + xf86LoaderReqSymLists(I810vgahwSymbols, NULL); /* Allocate a vgaHWRec */ if (!vgaHWGetHWRec(pScrn)) return FALSE; @@ -533,7 +572,7 @@ I810PreInit(ScrnInfoPtr pScrn, int flags) { if (!xf86SetDefaultVisual(pScrn, -1)) return FALSE; - /* We use a programamble clock */ + /* We use a programmable clock */ pScrn->progClock = TRUE; hwp = VGAHWPTR(pScrn); @@ -628,6 +667,15 @@ I810PreInit(ScrnInfoPtr pScrn, int flags) { xf86DrvMsg(pScrn->scrnIndex, from, "IO registers at addr 0x%lX\n", (unsigned long)pI810->MMIOAddr); + /* AGP GART support is required. Don't proceed any further if it isn't + * present. + */ + if (!xf86AgpGARTSupported()) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "AGP GART support is not available. Make sure your kernel has\n" + "\tagpgart support or that the agpgart kernel module is loaded.\n"); + return FALSE; + } /* Find out memory bus frequency. */ @@ -787,14 +835,14 @@ I810PreInit(ScrnInfoPtr pScrn, int flags) { I810FreeRec(pScrn); return FALSE; } - xf86LoaderReqSymLists(fbSymbols, NULL); + xf86LoaderReqSymLists(I810fbSymbols, NULL); if (!xf86ReturnOptValBool(pI810->Options, OPTION_NOACCEL, FALSE)) { if (!xf86LoadSubModule(pScrn, "xaa")) { I810FreeRec(pScrn); return FALSE; } - xf86LoaderReqSymLists(xaaSymbols, NULL); + xf86LoaderReqSymLists(I810xaaSymbols, NULL); } if (!xf86ReturnOptValBool(pI810->Options, OPTION_SW_CURSOR, FALSE)) { @@ -802,7 +850,7 @@ I810PreInit(ScrnInfoPtr pScrn, int flags) { I810FreeRec(pScrn); return FALSE; } - xf86LoaderReqSymLists(ramdacSymbols, NULL); + xf86LoaderReqSymLists(I810ramdacSymbols, NULL); } if (xf86GetOptValInteger(pI810->Options, OPTION_COLOR_KEY, &(pI810->colorKey))) @@ -815,6 +863,29 @@ I810PreInit(ScrnInfoPtr pScrn, int flags) { (((pScrn->mask.blue >> pScrn->offset.blue) - 1) << pScrn->offset.blue); } + + if (xf86GetOptValInteger(pI810->Options, OPTION_XVMC_SURFACES, + &(pI810->numSurfaces))) + { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "%d XvMC Surfaces Requested.\n", + pI810->numSurfaces); + if(pI810->numSurfaces > 7) { + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Using 7 XvMC Surfaces (Maximum Allowed).\n"); + pI810->numSurfaces = 7; + } + if(pI810->numSurfaces < 6) { + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Using 6 XvMC Surfaces (Minimum Allowed).\n"); + pI810->numSurfaces = 6; + } + } else { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "XvMC is Disabled: use XvMCSurfaces config option to enable.\n"); + pI810->numSurfaces = 0; + } + + /* We wont be using the VGA access after the probe */ { resRange vgaio[] = { {ResShrIoBlock,0x3B0,0x3BB}, @@ -855,7 +926,7 @@ I810MapMMIO(ScrnInfoPtr pScrn) -static Bool +Bool I810MapMem(ScrnInfoPtr pScrn) { I810Ptr pI810 = I810PTR(pScrn); @@ -878,7 +949,7 @@ I810MapMem(ScrnInfoPtr pScrn) return TRUE; } -static Bool +Bool I810UnmapMem(ScrnInfoPtr pScrn) { I810Ptr pI810 = I810PTR(pScrn); @@ -956,9 +1027,9 @@ DoSave(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg, Bool saveFonts) * in the generic VGA portion. */ if (saveFonts) - vgaHWSave(pScrn, vgaReg, VGA_SR_MODE|VGA_SR_FONTS); + vgaHWSave(pScrn, vgaReg, VGA_SR_MODE|VGA_SR_FONTS|VGA_SR_CMAP); else - vgaHWSave(pScrn, vgaReg, VGA_SR_MODE); + vgaHWSave(pScrn, vgaReg, VGA_SR_MODE|VGA_SR_CMAP); /* * The port I/O code necessary to read in the extended registers @@ -1006,10 +1077,15 @@ I810Save(ScrnInfoPtr pScrn) { vgaHWPtr hwp; I810Ptr pI810; - + CARD32 temp; + hwp = VGAHWPTR(pScrn); pI810 = I810PTR(pScrn); DoSave(pScrn, &hwp->SavedReg, &pI810->SavedReg, TRUE); + + temp = INREG(MEMMODE); + temp |= 4; + OUTREG(MEMMODE, temp); } @@ -1140,9 +1216,9 @@ DoRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg, * restore clock-select bits. */ if (restoreFonts) - vgaHWRestore(pScrn, vgaReg, VGA_SR_FONTS|VGA_SR_MODE); + vgaHWRestore(pScrn, vgaReg, VGA_SR_FONTS|VGA_SR_MODE|VGA_SR_CMAP); else - vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE); + vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE|VGA_SR_CMAP); hwp->writeCrtc(hwp, EXT_VERT_TOTAL, i810Reg->ExtVertTotal); hwp->writeCrtc(hwp, EXT_VERT_DISPLAY, i810Reg->ExtVertDispEnd); @@ -1245,9 +1321,9 @@ DoRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg, if (!(vgaReg->Attribute[0x10] & 0x1)) { usleep(50000); if (restoreFonts) - vgaHWRestore(pScrn, vgaReg, VGA_SR_FONTS|VGA_SR_MODE); + vgaHWRestore(pScrn, vgaReg, VGA_SR_FONTS|VGA_SR_MODE|VGA_SR_CMAP); else - vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE); + vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE|VGA_SR_CMAP); } vgaHWProtect(pScrn, FALSE); @@ -1259,7 +1335,7 @@ DoRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg, } -static void +void I810SetRingRegs( ScrnInfoPtr pScrn ) { unsigned int itemp; I810Ptr pI810 = I810PTR(pScrn); @@ -1273,7 +1349,11 @@ I810SetRingRegs( ScrnInfoPtr pScrn ) { OUTREG(LP_RING + RING_START, itemp ); itemp = INREG(LP_RING + RING_LEN); - itemp &= ~(RING_NR_PAGES | RING_REPORT_MASK | RING_VALID_MASK); + if (IS_I830 (pI810)) { + itemp &= ~(I830_RING_NR_PAGES | RING_REPORT_MASK | RING_VALID_MASK); + } else { + itemp &= ~(RING_NR_PAGES | RING_REPORT_MASK | RING_VALID_MASK); + } itemp |= ((pI810->LpRing.mem.Size-4096) | RING_NO_REPORT | RING_VALID); OUTREG(LP_RING + RING_LEN, itemp ); } @@ -1345,7 +1425,7 @@ I810CalcVCLK( ScrnInfoPtr pScrn, double freq ) i810Reg->VideoClk2_N = (n_best-2) & 0x3FF; i810Reg->VideoClk2_DivisorSel = (p_best << 4); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Setting dot clock to %.1lf MHz " + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting dot clock to %.1lf MHz " "[ 0x%x 0x%x 0x%x ] " "[ %d %d %d ]\n", CALC_VCLK(m_best,n_best,p_best), @@ -1706,27 +1786,46 @@ I810AllocateFront(ScrnInfoPtr pScrn) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Framebuffer allocation failed\n"); return FALSE; - } + } else + DPRINTF (PFX, + "Frame buffer at 0x%.8x (%luk, %lu bytes)\n", + pI810->FrontBuffer.Start, + pI810->FrontBuffer.Size / 1024, + pI810->FrontBuffer.Size); memset( &(pI810->LpRing), 0, sizeof( I810RingBuffer ) ); if(I810AllocLow( &(pI810->LpRing.mem), &(pI810->SysMem), 16*4096 )) { - if (I810_DEBUG & DEBUG_VERBOSE_MEMORY) - ErrorF( "ring buffer at local %lx\n", - pI810->LpRing.mem.Start); + DPRINTF (PFX, + "Ring buffer at 0x%.8x (%luk, %lu bytes)\n", + pI810->LpRing.mem.Start, + pI810->LpRing.mem.Size / 1024, + pI810->LpRing.mem.Size); pI810->LpRing.tail_mask = pI810->LpRing.mem.Size - 1; pI810->LpRing.virtual_start = pI810->FbBase + pI810->LpRing.mem.Start; pI810->LpRing.head = 0; pI810->LpRing.tail = 0; pI810->LpRing.space = 0; + } else { + xf86DrvMsg (pScrn->scrnIndex,X_ERROR,"Ring buffer allocation failed\n"); + return (FALSE); } - + if ( I810AllocLow( &pI810->Scratch, &(pI810->SysMem), 64*1024 ) || I810AllocLow( &pI810->Scratch, &(pI810->SysMem), 16*1024 ) ) { + DPRINTF (PFX, + "Scratch memory at 0x%.8x (%luk, %lu bytes)\n", + pI810->Scratch.Start, + pI810->Scratch.Size / 1024, + pI810->Scratch.Size); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Allocated Scratch Memory\n"); + } else { + xf86DrvMsg (pScrn->scrnIndex,X_ERROR,"Scratch memory allocation failed\n"); + return (FALSE); } - + pI810->DoneFrontAlloc = TRUE; return TRUE; } @@ -1914,6 +2013,12 @@ I810ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) { */ pI810->directRenderingEnabled = I810DRIFinishScreenInit(pScreen); } +#ifdef XvMCExtension + if (pI810->directRenderingEnabled) { + /* Initialize the hardware motion compensation code */ + I810InitMC(pScreen); + } +#endif #endif if (pI810->directRenderingEnabled) { 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 ee79e66f1..676b4f2cd 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.18 2000/12/02 15:25:38 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_memory.c,v 1.23 2002/01/09 00:37:30 dawes Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. @@ -39,164 +39,242 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "i810.h" #include "i810_reg.h" -int I810AllocLow( I810MemRange *result, I810MemRange *pool, int size ) +int I810AllocLow (I810MemRange *result,I810MemRange *pool,int size) { - if (size > pool->Size) return 0; + if (size > pool->Size) return (0); pool->Size -= size; result->Size = size; result->Start = pool->Start; result->End = pool->Start += size; - return 1; + + return (1); } -int I810AllocHigh( I810MemRange *result, I810MemRange *pool, int size ) +int I810AllocHigh (I810MemRange *result,I810MemRange *pool,int size) { - if (size > pool->Size) return 0; + if (size > pool->Size) return (0); pool->Size -= size; result->Size = size; result->End = pool->End; result->Start = pool->End -= size; - return 1; + + return (1); } -int I810AllocateGARTMemory( ScrnInfoPtr pScrn ) +int I810AllocateGARTMemory (ScrnInfoPtr pScrn) { unsigned long size = pScrn->videoRam * 1024; - I810Ptr pI810 = I810PTR(pScrn); + I810Ptr pI810 = I810PTR (pScrn); int key; long tom = 0; unsigned long physical; - if (!xf86AgpGARTSupported()) - return FALSE; - - if (!xf86AcquireGART(pScrn->scrnIndex)) - return FALSE; + if (pI810->StolenOnly == TRUE && pI810->StolenSize) + { + pI810->SysMem.Start = 0; + pI810->SysMem.Size = pI810->StolenSize; + pI810->SysMem.End = pI810->StolenSize; + pI810->SavedSysMem = pI810->SysMem; + pI810->agpAcquired2d = TRUE; + + pI810->CursorPhysical = 0; + pI810->CursorStart = 0; + + pI810->HwcursKey = -1; + pI810->DcacheKey = -1; + pI810->VramKey = -1; + + return (TRUE); + } + + if (!xf86AgpGARTSupported () || !xf86AcquireGART (pScrn->scrnIndex)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "AGP GART support is either not available or cannot be used.\n" + "\tMake sure your kernel has agpgart support or has the\n" + "\tagpgart module loaded.\n"); + return (FALSE); + } /* This allows the 2d only Xserver to regen */ pI810->agpAcquired2d = TRUE; - - /* Treat the gart like video memory - we assume we own all that is - * there, so ignore EBUSY errors. Don't try to remove it on - * failure, either, as other X server may be using it. - */ - - if ((key = xf86AllocateGARTMemory(pScrn->scrnIndex, size, 0, NULL)) == -1) - return FALSE; - - pI810->VramOffset = 0; - pI810->VramKey = key; - - if (!xf86BindGARTMemory(pScrn->scrnIndex, key, 0)) - return FALSE; - - - pI810->SysMem.Start = 0; - pI810->SysMem.Size = size; - pI810->SysMem.End = size; - pI810->SavedSysMem = pI810->SysMem; - - tom = pI810->SysMem.End; - - pI810->DcacheMem.Start = 0; - pI810->DcacheMem.End = 0; - pI810->DcacheMem.Size = 0; - pI810->CursorPhysical = 0; - - /* Dcache - half the speed of normal ram, so not really useful for - * a 2d server. Don't bother reporting its presence. This is - * mapped in addition to the requested amount of system ram. - */ - size = 1024 * 4096; - /* Keep it 512K aligned for the sake of tiled regions. - */ - tom += 0x7ffff; - tom &= ~0x7ffff; - - if ((key = xf86AllocateGARTMemory(pScrn->scrnIndex, size, 1, NULL)) != -1) { - pI810->DcacheOffset= tom; - pI810->DcacheKey = key; - if (!xf86BindGARTMemory(pScrn->scrnIndex, key, tom)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Allocation of %d bytes for DCACHE failed\n", size); - pI810->DcacheKey = -1; - } else { - pI810->DcacheMem.Start = tom; - pI810->DcacheMem.Size = size; - pI810->DcacheMem.End = pI810->DcacheMem.Start + pI810->DcacheMem.Size; - tom = pI810->DcacheMem.End; - } - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "No physical memory available for %d bytes of DCACHE\n", - size); - pI810->DcacheKey = -1; - } - - - /* Mouse cursor -- The i810 (crazy) needs a physical address in - * system memory from which to upload the cursor. We get this from - * the agpgart module using a special memory type. + if (IS_I830 (pI810)) + { + /* + * The I830 is slightly different from the I810/I815, it has no + * dcache and it has stolen memory by default in its gtt. All + * additional memory must go after it. + */ + + int offset,alloc_size; + + DPRINTF (PFX, + "size == %luk (%lu bytes == pScrn->videoRam)\n" + "pI810->StolenSize == %luk (%lu bytes)\n", + size/1024,size, + pI810->StolenSize/1024,pI810->StolenSize); + + alloc_size = size; + if (alloc_size <= pI810->StolenSize) + offset = alloc_size = 0; + else + { + alloc_size -= pI810->StolenSize; /* Stolen size is in bytes */ + offset = pI810->StolenSize; + } + + if (alloc_size) + { + if ((key = xf86AllocateGARTMemory (pScrn->scrnIndex,alloc_size,0,NULL)) == -1) + return (FALSE); + + DPRINTF (PFX, + "alloc_size == %luk (%lu bytes)\n" + " key == 0x%.8x\n" + " offset == 0x%.8x\n", + alloc_size/1024,alloc_size, + key,offset); + + if (!xf86BindGARTMemory (pScrn->scrnIndex,key,offset)) + return (FALSE); + + pI810->VramOffset = offset; + pI810->VramKey = key; + } + else pI810->VramKey = -1; + + pI810->SysMem.Start = 0; + pI810->SysMem.Size = size; + pI810->SysMem.End = size; + pI810->SavedSysMem = pI810->SysMem; + pI810->DcacheKey = -1; + + tom = size <= pI810->StolenSize ? pI810->StolenSize : pI810->SysMem.End; + } + else + { + /* + * I810/I815 + * + * Treat the gart like video memory - we assume we own all that is + * there, so ignore EBUSY errors. Don't try to remove it on + * failure, either, as other X server may be using it. + */ + + if ((key = xf86AllocateGARTMemory (pScrn->scrnIndex,size,0,NULL)) == -1) + return (FALSE); + + pI810->VramOffset = 0; + pI810->VramKey = key; + + if (!xf86BindGARTMemory (pScrn->scrnIndex,key,0)) + return (FALSE); + + pI810->SysMem.Start = 0; + pI810->SysMem.Size = size; + pI810->SysMem.End = size; + pI810->SavedSysMem = pI810->SysMem; + + tom = pI810->SysMem.End; + + pI810->DcacheMem.Start = 0; + pI810->DcacheMem.End = 0; + pI810->DcacheMem.Size = 0; + pI810->CursorPhysical = 0; + + /* + * Dcache - half the speed of normal ram, so not really useful for + * a 2d server. Don't bother reporting its presence. This is + * mapped in addition to the requested amount of system ram. + */ + + size = 1024 * 4096; + + /* + * Keep it 512K aligned for the sake of tiled regions. + */ + + tom += 0x7ffff; + tom &= ~0x7ffff; + + if ((key = xf86AllocateGARTMemory (pScrn->scrnIndex,size,1,NULL)) != -1) + { + pI810->DcacheOffset = tom; + pI810->DcacheKey = key; + if (!xf86BindGARTMemory (pScrn->scrnIndex,key,tom)) + { + xf86DrvMsg (pScrn->scrnIndex,X_INFO,"Allocation of %d bytes for DCACHE failed\n",size); + pI810->DcacheKey = -1; + } + else + { + pI810->DcacheMem.Start = tom; + pI810->DcacheMem.Size = size; + pI810->DcacheMem.End = pI810->DcacheMem.Start + pI810->DcacheMem.Size; + tom = pI810->DcacheMem.End; + } + } + else + { + xf86DrvMsg (pScrn->scrnIndex,X_INFO,"No physical memory available for %d bytes of DCACHE\n",size); + pI810->DcacheKey = -1; + } + } + + /* + * Mouse cursor -- The i810 (crazy) needs a physical address in + * system memory from which to upload the cursor. We get this from + * the agpgart module using a special memory type. */ - /* 4k for the cursor is excessive, I'm going to steal 3k for - * overlay registers later + /* + * 4k for the cursor is excessive, I'm going to steal 3k for + * overlay registers later */ size = 4096; - if ((key = xf86AllocateGARTMemory(pScrn->scrnIndex, size, 2, - &physical)) == -1) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "No physical memory available for HW cursor\n"); - pI810->HwcursKey = -1; - } else { - pI810->HwcursOffset= tom; - pI810->HwcursKey = key; - if (!xf86BindGARTMemory(pScrn->scrnIndex, key, tom)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Allocation of %d bytes for HW cursor failed\n", - size); - pI810->HwcursKey = -1; - } else { - pI810->CursorPhysical = physical; - pI810->CursorStart = tom; - tom += size; - } - } - - /* Overlay register buffer -- Just like the cursor, the i810 needs a - * physical address in system memory from which to upload the overlay - * registers. + if ((key = xf86AllocateGARTMemory (pScrn->scrnIndex,size,2,&physical)) == -1) + { + xf86DrvMsg (pScrn->scrnIndex,X_INFO,"No physical memory available for HW cursor\n"); + pI810->HwcursKey = -1; + pI810->CursorStart = 0; + } + else + { + pI810->HwcursOffset = tom; + pI810->HwcursKey = key; + if (!xf86BindGARTMemory (pScrn->scrnIndex,key,tom)) + { + xf86DrvMsg (pScrn->scrnIndex,X_INFO,"Allocation of %d bytes for HW cursor failed\n",size); + pI810->HwcursKey = -1; + } + else + { + pI810->CursorPhysical = physical; + pI810->CursorStart = tom; + tom += size; + } + } + + /* + * Overlay register buffer -- Just like the cursor, the i810 needs a + * physical address in system memory from which to upload the overlay + * registers. */ - if (pI810->CursorStart != 0) { - pI810->OverlayPhysical = pI810->CursorPhysical + 1024; - pI810->OverlayStart = pI810->CursorStart + 1024; - } - - pI810->GttBound = 1; - return TRUE; -} + if (pI810->CursorStart != 0) + { + pI810->OverlayPhysical = pI810->CursorPhysical + 1024; + pI810->OverlayStart = pI810->CursorStart + 1024; + } -#if 0 -void I810FreeGARTMemory( ScrnInfoPtr pScrn ) -{ -#ifdef linux - I810Ptr pI810 = I810PTR(pScrn); + pI810->GttBound = 1; - if (pI810->gartfd != -1) { - close( pI810->gartfd ); - pI810->gartfd = -1; - } -#endif + return (TRUE); } -#endif - - /* Tiled memory is good... really, really good... * @@ -205,149 +283,173 @@ void I810FreeGARTMemory( ScrnInfoPtr pScrn ) * of the first memory segment, or perhaps allocate a discontigous * framebuffer to get more alignment 'sweet spots'. */ -void I810SetTiledMemory(ScrnInfoPtr pScrn, - int nr, - unsigned start, - unsigned pitch, - unsigned size) +void I810SetTiledMemory (ScrnInfoPtr pScrn,int nr,unsigned int start,unsigned int pitch,unsigned int size) { - I810Ptr pI810 = I810PTR(pScrn); + I810Ptr pI810 = I810PTR (pScrn); I810RegPtr i810Reg = &pI810->ModeReg; CARD32 val; + CARD32 fence_mask = 0; - if (nr < 0 || nr > 7) { - xf86DrvMsg(X_WARNING, pScrn->scrnIndex, - "I810SetTiledMemory - fence %d out of range\n", nr); - return; - } + if (nr < 0 || nr > 7) + { + xf86DrvMsg (X_WARNING,pScrn->scrnIndex,"%s - fence %d out of range\n","I810SetTiledMemory",nr); + return; + } i810Reg->Fence[nr] = 0; - if (start & ~FENCE_START_MASK) { - xf86DrvMsg(X_WARNING, pScrn->scrnIndex, - "I810SetTiledMemory %d: start (%x) is not 512k aligned\n", - nr, start); - return; - } - if (start % size) { - xf86DrvMsg(X_WARNING, pScrn->scrnIndex, - "I810SetTiledMemory %d: start (%x) is not size (%x) aligned\n", - nr, start, size); - return; - } + fence_mask = IS_I830 (pI810) ? ~I830_FENCE_START_MASK : ~FENCE_START_MASK; - if (pitch & 127) { - xf86DrvMsg(X_WARNING, pScrn->scrnIndex, - "I810SetTiledMemory %d: pitch (%x) not a multiple of 128 bytes\n", - nr, pitch); - return; - } + if (start & fence_mask) + { + xf86DrvMsg (X_WARNING,pScrn->scrnIndex,"%s %d: start (%x) is not 512k aligned\n","I810SetTiledMemory",nr,start); + return; + } + + if (start % size) + { + xf86DrvMsg (X_WARNING,pScrn->scrnIndex,"%s %d: start (%x) is not size (%x) aligned\n","I810SetTiledMemory",nr,start,size); + return; + } + + if (pitch & 127) + { + xf86DrvMsg (X_WARNING,pScrn->scrnIndex,"%s %d: pitch (%x) not a multiple of 128 bytes\n","I810SetTiledMemory",nr,pitch); + return; + } val = (start | FENCE_X_MAJOR | FENCE_VALID); - - switch (size) { - case (512*1024): val |= FENCE_SIZE_512K; break; - case (1024*1024): val |= FENCE_SIZE_1M; break; - case (2*1024*1024): val |= FENCE_SIZE_2M; break; - case (4*1024*1024): val |= FENCE_SIZE_4M; break; - case (8*1024*1024): val |= FENCE_SIZE_8M; break; - case (16*1024*1024): val |= FENCE_SIZE_16M; break; - case (32*1024*1024): val |= FENCE_SIZE_32M; break; - default: - xf86DrvMsg(X_WARNING, pScrn->scrnIndex, - "I810SetTiledMemory %d: illegal size (0x%x)\n", size); - return; - } - switch (pitch/128) { - case 1: val |= FENCE_PITCH_1; break; - case 2: val |= FENCE_PITCH_2; break; - case 4: val |= FENCE_PITCH_4; break; - case 8: val |= FENCE_PITCH_8; break; - case 16: val |= FENCE_PITCH_16; break; - case 32: val |= FENCE_PITCH_32; break; - default: - xf86DrvMsg(X_WARNING, pScrn->scrnIndex, - "%d: illegal size (0x%x)\n", size); - return; - } + if (IS_I830 (pI810)) + { + switch (size) + { + case KB (512): val |= FENCE_SIZE_512K; break; + case MB (1): val |= FENCE_SIZE_1M; break; + case MB (2): val |= FENCE_SIZE_2M; break; + case MB (4): val |= FENCE_SIZE_4M; break; + case MB (8): val |= FENCE_SIZE_8M; break; + case MB (16): val |= FENCE_SIZE_16M; break; + case MB (32): val |= FENCE_SIZE_32M; break; + case MB (64): val |= FENCE_SIZE_64M; break; + default: + xf86DrvMsg (X_WARNING,pScrn->scrnIndex,"%s %d: illegal size (0x%x)\n","I810SetTiledMemory",nr,size); + return; + } + + switch (pitch / 128) + { + case 1: val |= FENCE_PITCH_1; break; + case 2: val |= FENCE_PITCH_2; break; + case 4: val |= FENCE_PITCH_4; break; + case 8: val |= FENCE_PITCH_8; break; + case 16: val |= FENCE_PITCH_16; break; + case 32: val |= FENCE_PITCH_32; break; + case 64: val |= FENCE_PITCH_64; break; + default: + xf86DrvMsg (X_WARNING,pScrn->scrnIndex,"%s %d: illegal size (0x%x)\n","I810SetTiledMemory",nr,size); + return; + } + } + else + { + switch (size) + { + case KB (512): val |= FENCE_SIZE_512K; break; + case MB (1): val |= FENCE_SIZE_1M; break; + case MB (2): val |= FENCE_SIZE_2M; break; + case MB (4): val |= FENCE_SIZE_4M; break; + case MB (8): val |= FENCE_SIZE_8M; break; + case MB (16): val |= FENCE_SIZE_16M; break; + case MB (32): val |= FENCE_SIZE_32M; break; + default: + xf86DrvMsg (X_WARNING,pScrn->scrnIndex,"%s %d: illegal size (0x%x)\n","I810SetTiledMemory",nr,size); + return; + } + + switch (pitch / 128) + { + case 1: val |= FENCE_PITCH_1; break; + case 2: val |= FENCE_PITCH_2; break; + case 4: val |= FENCE_PITCH_4; break; + case 8: val |= FENCE_PITCH_8; break; + case 16: val |= FENCE_PITCH_16; break; + case 32: val |= FENCE_PITCH_32; break; + default: + xf86DrvMsg (X_WARNING,pScrn->scrnIndex,"%s %d: illegal size (0x%x)\n","I810SetTiledMemory",nr,size); + return; + } + } i810Reg->Fence[nr] = val; } -Bool -I810BindGARTMemory( ScrnInfoPtr pScrn ) +Bool I810BindGARTMemory (ScrnInfoPtr pScrn) { - I810Ptr pI810 = I810PTR(pScrn); - - if (xf86AgpGARTSupported() && !pI810->directRenderingEnabled && - !pI810->GttBound) { - if (!xf86AcquireGART(pScrn->scrnIndex)) - return FALSE; - if (!xf86BindGARTMemory(pScrn->scrnIndex, pI810->VramKey, - pI810->VramOffset)) - return FALSE; - if (pI810->DcacheKey != -1) { - if (!xf86BindGARTMemory(pScrn->scrnIndex, pI810->DcacheKey, - pI810->DcacheOffset)) - return FALSE; - } - if (pI810->HwcursKey != -1) { - if (!xf86BindGARTMemory(pScrn->scrnIndex, pI810->HwcursKey, - pI810->HwcursOffset)) - return FALSE; - } - pI810->GttBound = 1; - } - return TRUE; + I810Ptr pI810 = I810PTR (pScrn); + + if (pI810->StolenOnly == TRUE) return (TRUE); + + if (xf86AgpGARTSupported () && !pI810->directRenderingEnabled && !pI810->GttBound) + { + if (!xf86AcquireGART (pScrn->scrnIndex)) + return (FALSE); + + if (pI810->VramKey != -1 && !xf86BindGARTMemory (pScrn->scrnIndex,pI810->VramKey,pI810->VramOffset)) + return (FALSE); + + if (pI810->DcacheKey != -1 && !xf86BindGARTMemory (pScrn->scrnIndex,pI810->DcacheKey,pI810->DcacheOffset)) + return (FALSE); + + if (pI810->HwcursKey != -1 && !xf86BindGARTMemory (pScrn->scrnIndex,pI810->HwcursKey,pI810->HwcursOffset)) + return (FALSE); + + pI810->GttBound = 1; + } + + return (TRUE); } -Bool -I810UnbindGARTMemory( ScrnInfoPtr pScrn ) +Bool I810UnbindGARTMemory (ScrnInfoPtr pScrn) { - I810Ptr pI810 = I810PTR(pScrn); - - if (xf86AgpGARTSupported() && !pI810->directRenderingEnabled && - pI810->GttBound) { - if (!xf86UnbindGARTMemory(pScrn->scrnIndex, pI810->VramKey)) - return FALSE; - if (pI810->DcacheKey != -1) { - if (!xf86UnbindGARTMemory(pScrn->scrnIndex, pI810->DcacheKey)) - return FALSE; - } - if (pI810->HwcursKey != -1) { - if (!xf86UnbindGARTMemory(pScrn->scrnIndex, pI810->HwcursKey)) - return FALSE; - } - if (!xf86ReleaseGART(pScrn->scrnIndex)) - return FALSE; - pI810->GttBound = 0; - } - return TRUE; + I810Ptr pI810 = I810PTR (pScrn); + + if (pI810->StolenOnly == TRUE) return (TRUE); + + if (xf86AgpGARTSupported () && !pI810->directRenderingEnabled && pI810->GttBound) + { + if (pI810->VramKey != -1 && !xf86UnbindGARTMemory (pScrn->scrnIndex,pI810->VramKey)) + return (FALSE); + + if (pI810->DcacheKey != -1 && !xf86UnbindGARTMemory (pScrn->scrnIndex,pI810->DcacheKey)) + return (FALSE); + + if (pI810->HwcursKey != -1 && !xf86UnbindGARTMemory (pScrn->scrnIndex,pI810->HwcursKey)) + return (FALSE); + + if (!xf86ReleaseGART (pScrn->scrnIndex)) + return (FALSE); + + pI810->GttBound = 0; + } + + return (TRUE); } -int -I810CheckAvailableMemory(ScrnInfoPtr pScrn) +int I810CheckAvailableMemory (ScrnInfoPtr pScrn) { AgpInfoPtr agpinf; int maxPages; - if (!xf86AgpGARTSupported()) - return -1; - - if (!xf86AcquireGART(pScrn->scrnIndex)) - return -1; - - if ((agpinf = xf86GetAGPInfo(pScrn->scrnIndex)) == NULL) - return -1; - - if (!xf86ReleaseGART(pScrn->scrnIndex)) - return -1; + if (!xf86AgpGARTSupported () || + !xf86AcquireGART (pScrn->scrnIndex) || + (agpinf = xf86GetAGPInfo (pScrn->scrnIndex)) == NULL || + !xf86ReleaseGART (pScrn->scrnIndex)) + return (-1); maxPages = agpinf->totalPages - agpinf->usedPages; - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 2, - "I810CheckAvailableMemory: %dk available\n", maxPages * 4); + xf86DrvMsgVerb (pScrn->scrnIndex,X_INFO,2,"%s: %dk available\n","I810CheckAvailableMemory",maxPages * 4); - return maxPages * 4; + return (maxPages * 4); } 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 ae665af09..1e4cd6a86 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_reg.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_reg.h @@ -1,4 +1,4 @@ - +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_reg.h,v 1.6 2001/10/28 03:33:32 tsi Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. @@ -25,7 +25,6 @@ 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: @@ -218,6 +217,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define VCLK2_VCO_M 0x6008 /* treat as 16 bit? (includes msbs) */ #define VCLK2_VCO_N 0x600a #define VCLK2_VCO_DIV_SEL 0x6012 + +#define VCLK_DIVISOR_VGA0 0x6000 +#define VCLK_DIVISOR_VGA1 0x6004 +#define VCLK_POST_DIV 0x6010 + #define POST_DIV_SELECT 0x70 #define POST_DIV_1 0x00 #define POST_DIV_2 0x10 @@ -302,6 +306,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - what does it all mean? */ #define FWATER_BLC 0x20d8 +#define FWATER_BLC2 0x20dc #define MM_BURST_LENGTH 0x00700000 #define MM_FIFO_WATERMARK 0x0001F000 #define LM_BURST_LENGTH 0x00000700 @@ -313,6 +318,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define FENCE 0x2000 #define FENCE_NR 8 +#define I830_FENCE_START_MASK 0x07f80000 + #define FENCE_START_MASK 0x03F80000 #define FENCE_X_MAJOR 0x00000000 #define FENCE_Y_MAJOR 0x00001000 @@ -324,6 +331,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define FENCE_SIZE_8M 0x00000400 #define FENCE_SIZE_16M 0x00000500 #define FENCE_SIZE_32M 0x00000600 +#define FENCE_SIZE_64M 0x00000700 #define FENCE_PITCH_MASK 0x00000070 #define FENCE_PITCH_1 0x00000000 #define FENCE_PITCH_2 0x00000010 @@ -331,6 +339,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define FENCE_PITCH_8 0x00000030 #define FENCE_PITCH_16 0x00000040 #define FENCE_PITCH_32 0x00000050 +#define FENCE_PITCH_64 0x00000060 #define FENCE_VALID 0x00000001 @@ -395,6 +404,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define RING_LEN 0x0C #define RING_NR_PAGES 0x000FF000 +#define I830_RING_NR_PAGES 0x001FF000 #define RING_REPORT_MASK 0x00000006 #define RING_REPORT_64K 0x00000002 #define RING_REPORT_128K 0x00000004 @@ -560,3 +570,245 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define CS_USE_CTX0 0 #define CS_USE_CTX1 (1<<0) +/* I830 CRTC registers */ +#define HTOTAL_A 0x60000 +#define HBLANK_A 0x60004 +#define HSYNC_A 0x60008 +#define VTOTAL_A 0x6000c +#define VBLANK_A 0x60010 +#define VSYNC_A 0x60014 +#define PIPEASRC 0x6001c +#define BCLRPAT_A 0x60020 + +#define HTOTAL_B 0x61000 +#define HBLANK_B 0x61004 +#define HSYNC_B 0x61008 +#define VTOTAL_B 0x6100c +#define VBLANK_B 0x61010 +#define VSYNC_B 0x61014 +#define PIPEBSRC 0x6101c +#define BCLRPAT_B 0x61020 + +#define DPLL_A 0x06014 +#define DPLL_B 0x06018 +#define FPA0 0x06040 +#define FPA1 0x06044 + +#define I830_HTOTAL_MASK 0xfff0000 +#define I830_HACTIVE_MASK 0x7ff + +#define I830_HBLANKEND_MASK 0xfff0000 +#define I830_HBLANKSTART_MASK 0xfff + +#define I830_HSYNCEND_MASK 0xfff0000 +#define I830_HSYNCSTART_MASK 0xfff + +#define I830_VTOTAL_MASK 0xfff0000 +#define I830_VACTIVE_MASK 0x7ff + +#define I830_VBLANKEND_MASK 0xfff0000 +#define I830_VBLANKSTART_MASK 0xfff + +#define I830_VSYNCEND_MASK 0xfff0000 +#define I830_VSYNCSTART_MASK 0xfff + +#define I830_PIPEA_HORZ_MASK 0x7ff0000 +#define I830_PIPEA_VERT_MASK 0x7ff + +#define ADPA 0x61100 +#define ADPA_DAC_ENABLE (1<<31) +#define ADPA_DAC_DISABLE 0 +#define ADPA_PIPE_A_SELECT 0 +#define ADPA_USE_VGA_HVPOLARITY (1<<15) +#define ADPA_SETS_HVPOLARITY 0 +#define ADPA_VSYNC_CNTL_DISABLE (1<<11) +#define ADPA_VSYNC_CNTL_ENABLE 0 +#define ADPA_HSYNC_CNTL_DISABLE (1<<10) +#define ADPA_HSYNC_CNTL_ENABLE 0 +#define ADPA_VSYNC_ACTIVE_HIGH (1<<4) +#define ADPA_VSYNC_ACTIVE_LOW 0 +#define ADPA_HSYNC_ACTIVE_HIGH (1<<3) +#define ADPA_HSYNC_ACTIVE_LOW 0 + + +#define DV0A 0x61120 +#define DV0A_DISABLE (1<<31) + +#define DV0B 0x61140 +#define DV0B_DISABLE (1<<31) + + +#define PIPEACONF 0x70008 +#define PIPEACONF_ENABLE (1<<31) +#define PIPEACONF_DISABLE 0 +#define PIPEACONF_DOUBLE_WIDE (1<<30) +#define PIPEACONF_SINGLE_WIDE 0 +#define PIPEACONF_PIPE_UNLOCKED 0 +#define PIPEACONF_PIPE_LOCKED (1<<25) +#define PIPEACONF_PALETTE 0 +#define PIPEACONF_GAMMA (1<<24) + +#define PIPEBCONF 0x71008 +#define PIPEBCONF_ENABLE (1<<31) +#define PIPEBCONF_DISABLE 0 +#define PIPEBCONF_GAMMA (1<<24) +#define PIPEBCONF_PALETTE 0 + +#define DSPACNTR 0x70180 +#define DSPACNTR_PLANE_A_ENABLE (1<<31) +#define DSPACNTR_PLANE_A_DISABLE 0 +#define DSPACNTR_GAMMA_ENABLE (1<<30) +#define DSPACNTR_GAMMA_DISABLE 0 +#define DSPACNTR_8BPP (1<<27) +#define DSPACNTR_16BPP ((1<<26)|(1<<28)) +#define DSPACNTR_32BPP_NO_ALPHA ((1<<27)|(1<<28)) +#define DSPACNTR_32BPP ((1<<26)|(1<<27)|(1<<28)) +#define DSPACNTR_STEREO_ENABLE (1<<25) +#define DSPACNTR_STEREO_DISABLE 0 +#define DSPACNTR_SEL_PIPE_A 0 +#define DSPACNTR_SEL_PIPE_B (1<<24) +#define DSPACNTR_SRC_KEY_ENABLE (1<<22) +#define DSPACNTR_SRC_KEY_DISABLE 0 +#define DSPACNTR_LINE_DOUBLE (1<<20) +#define DSPACNTR_NO_LINE_DOUBLE 0 +#define DSPACNTR_STEREO_POLARITY_FIRST 0 +#define DSPACNTR_STEREO_POLARITY_SECOND (1<<18) + +#define DSPABASE 0x70184 +#define DSPASTRIDE 0x70188 + +#define DSPBCNTR 0x71180 +#define DSPBCNTR_PLANE_B_ENABLE (1<<31) +#define DSPBCNTR_PLANE_B_DISABLE 0 +#define DSPBCNTR_GAMMA_ENABLE (1<<30) +#define DSPBCNTR_GAMMA_DISABLE 0 +#define DSPBCNTR_8BPP (1<<27) +#define DSPBCNTR_16BPP ((1<<26)|(1<<28)) +#define DSPBCNTR_32BPP_NO_ALPHA ((1<<27)|(1<<28)) +#define DSPBCNTR_32BPP ((1<<26)|(1<<27)|(1<<28)) +#define DSPBCNTR_STEREO_ENABLE (1<<25) +#define DSPBCNTR_STEREO_DISABLE 0 +#define DSPBCNTR_SEL_PIPE_A 0 +#define DSPBCNTR_SEL_PIPE_B (1<<24) +#define DSPBCNTR_SRC_KEY_ENABLE (1<<22) +#define DSPBCNTR_SRC_KEY_DISABLE 0 +#define DSPBCNTR_LINE_DOUBLE (1<<20) +#define DSPBCNTR_NO_LINE_DOUBLE 0 +#define DSPBCNTR_STEREO_POLARITY_FIRST 0 +#define DSPBCNTR_STEREO_POLARITY_SECOND (1<<18) +#define DSPBCNTR_ALPHA_TRANS_ENABLE (1<<15) +#define DSPBCNTR_ALPHA_TRANS_DISABLE 0 +#define DSPBCNTR_SPRITE_ABOVE_DISPLAYA 0 +#define DSPBCNTR_SPRITE_ABOVE_OVERLAY (1) + +#define DSPBBASE 0x71184 +#define DSPBSTRIDE 0x71188 + +/* Various masks for reserved bits, etc. */ +#define I830_FWATER1_MASK (~((1<<11)|(1<<10)|(1<<9)| \ + (1<<8)|(1<<26)|(1<<25)|(1<<24)|(1<<5)|(1<<4)|(1<<3)| \ + (1<<2)|(1<<1)|1|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16))) +#define I830_FWATER2_MASK ~(0) + +#define DV0A_RESERVED ((1<<26)|(1<<25)|(1<<24)|(1<<23)|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<16)|(1<<5)|(1<<1)|1) +#define DV0B_RESERVED ((1<<27)|(1<<26)|(1<<25)|(1<<24)|(1<<23)|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<16)|(1<<5)|(1<<1)|1) +#define VGA0_N_DIVISOR_MASK ((1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)) +#define VGA0_M1_DIVISOR_MASK ((1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)) +#define VGA0_M2_DIVISOR_MASK ((1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|1) +#define VGA0_M1M2N_RESERVED ~(VGA0_N_DIVISOR_MASK|VGA0_M1_DIVISOR_MASK|VGA0_M2_DIVISOR_MASK) +#define VGA0_POSTDIV_MASK ((1<<7)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|1) +#define VGA1_POSTDIV_MASK ((1<<15)|(1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)) +#define VGA_POSTDIV_RESERVED ~(VGA0_POSTDIV_MASK|VGA1_POSTDIV_MASK|(1<<7)|(1<<15)) +#define DPLLA_POSTDIV_MASK ((1<<23)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)) +#define DPLLA_RESERVED ((1<<27)|(1<<26)|(1<<25)|(1<<24)|(1<<22)|(1<<15)|(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|1) +#define ADPA_RESERVED ((1<<2)|(1<<1)|1|(1<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)|(1<<30)|(1<<29)|(1<<28)|(1<<27)|(1<<26)|(1<<25)|(1<<24)|(1<<23)|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)) +#define SUPER_WORD 32 +#define BURST_A_MASK ((1<<11)|(1<<10)|(1<<9)|(1<<8)) +#define BURST_B_MASK ((1<<26)|(1<<25)|(1<<24)) +#define WATER_A_MASK ((1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|1) +#define WATER_B_MASK ((1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)) +#define WATER_RESERVED ((1<<31)|(1<<30)|(1<<29)|(1<<28)|(1<<27)|(1<<23)|(1<<22)|(1<<21)|(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<7)|(1<<6)) +#define PIPEACONF_RESERVED ((1<<29)|(1<<28)|(1<<27)|(1<<23)|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)|0xffff) +#define PIPEBCONF_RESERVED ((1<<30)|(1<<29)|(1<<28)|(1<<27)|(1<<26)|(1<<25)|(1<<23)|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)|0xffff) +#define DSPACNTR_RESERVED ((1<<23)|(1<<19)|(1<<17)|(1<<16)|0xffff) +#define DSPBCNTR_RESERVED ((1<<23)|(1<<19)|(1<<17)|(1<<16)|0x7ffe) + +#define I830_GMCH_CTRL 0x52 + +#define I830_GMCH_ENABLED 0x4 +#define I830_GMCH_MEM_MASK 0x1 +#define I830_GMCH_MEM_64M 0x1 +#define I830_GMCH_MEM_128M 0 + +#define I830_GMCH_GMS_MASK 0x70 +#define I830_GMCH_GMS_DISABLED 0x00 +#define I830_GMCH_GMS_LOCAL 0x10 +#define I830_GMCH_GMS_STOLEN_512 0x20 +#define I830_GMCH_GMS_STOLEN_1024 0x30 +#define I830_GMCH_GMS_STOLEN_8192 0x40 + +#define I830_RDRAM_CHANNEL_TYPE 0x03010 +#define I830_RDRAM_ND(x) (((x) & 0x20) >> 5) +#define I830_RDRAM_DDT(x) (((x) & 0x18) >> 3) + +/* BLT commands */ +#define COLOR_BLT_CMD ((2<<29)|(0x40<<22)|(0x3)) +#define COLOR_BLT_WRITE_ALPHA (1<<21) +#define COLOR_BLT_WRITE_RGB (1<<20) + +#define XY_COLOR_BLT_CMD ((2<<29)|(0x50<<22)|(0x4)) +#define XY_COLOR_BLT_WRITE_ALPHA (1<<21) +#define XY_COLOR_BLT_WRITE_RGB (1<<20) + +#define XY_SETUP_CLIP_BLT_CMD ((2<<29)|(3<<22)|1) + +#define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6) +#define XY_SRC_COPY_BLT_WRITE_ALPHA (1<<21) +#define XY_SRC_COPY_BLT_WRITE_RGB (1<<20) + +#define SRC_COPY_BLT_CMD ((2<<29)|(0x43<<22)|0x4) +#define SRC_COPY_BLT_WRITE_ALPHA (1<<21) +#define SRC_COPY_BLT_WRITE_RGB (1<<20) + +#define XY_MONO_PAT_BLT_CMD ((0x2<<29)|(0x52<<22)|0x7) +#define XY_MONO_PAT_VERT_SEED ((1<<10)|(1<<9)|(1<<8)) +#define XY_MONO_PAT_HORT_SEED ((1<<14)|(1<<13)|(1<<12)) +#define XY_MONO_PAT_BLT_WRITE_ALPHA (1<<21) +#define XY_MONO_PAT_BLT_WRITE_RGB (1<<20) + +#define XY_MONO_SRC_BLT_CMD ((0x2<<29)|(0x54<<22)|(0x6)) +#define XY_MONO_SRC_BLT_WRITE_ALPHA (1<<21) +#define XY_MONO_SRC_BLT_WRITE_RGB (1<<20) + +/* 3d state */ +#define STATE3D_FOG_MODE ((3<<29)|(0x1d<<24)|(0x89<<16)|2) +#define FOG_MODE_VERTEX (1<<31) +#define STATE3D_MAP_COORD_TRANSFORM ((3<<29)|(0x1d<<24)|(0x8c<<16)) +#define DISABLE_TEX_TRANSFORM (1<<28) +#define TEXTURE_SET(x) (x<<29) +#define STATE3D_RASTERIZATION_RULES ((3<<29)|(0x07<<24)) +#define POINT_RASTER_ENABLE (1<<15) +#define POINT_RASTER_OGL (1<<13) +#define STATE3D_VERTEX_TRANSFORM ((3<<29)|(0x1d<<24)|(0x8b<<16)) +#define DISABLE_VIEWPORT_TRANSFORM (1<<31) +#define DISABLE_PERSPECTIVE_DIVIDE (1<<29) + +#define MI_SET_CONTEXT (0x18<<23) +#define CTXT_NO_RESTORE (1) +#define CTXT_PALETTE_SAVE_DISABLE (1<<3) +#define CTXT_PALETTE_RESTORE_DISABLE (1<<2) + +/* Dword 0 */ +#define MI_VERTEX_BUFFER (0x17<<23) +#define MI_VERTEX_BUFFER_IDX(x) (x<<20) +#define MI_VERTEX_BUFFER_PITCH(x) (x<<13) +#define MI_VERTEX_BUFFER_WIDTH(x) (x<<6) +/* Dword 1 */ +#define MI_VERTEX_BUFFER_DISABLE (1) + +#define STATE3D_COLOR_FACTOR ((0x3<<29)|(0x1d<<24)|(0x01<<16)) + +/* STATE3D_FOG_MODE stuff */ +#define ENABLE_FOG_SOURCE (1<<27) +#define ENABLE_FOG_CONST (1<<24) +#define ENABLE_FOG_DENSITY (1<<23) diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_video.c b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_video.c index 9fa50c854..59d79e169 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_video.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_video.c @@ -23,7 +23,7 @@ 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_video.c,v 1.18 2001/06/15 21:22:52 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_video.c,v 1.21 2001/12/04 21:17:56 tsi Exp $ */ /* * i810_video.c: i810 Xv driver. Based on the mga Xv driver by Mark Vojkovich. @@ -81,8 +81,9 @@ static void I810BlockHandler(int, pointer, pointer, pointer); static Atom xvBrightness, xvContrast, xvColorKey; -#define IMAGE_MAX_WIDTH 720 -#define IMAGE_MAX_HEIGHT 576 +#define IMAGE_MAX_WIDTH 1440 +#define IMAGE_FAST_WIDTH 720 +#define IMAGE_MAX_HEIGHT 1080 #define Y_BUF_SIZE (IMAGE_MAX_WIDTH * IMAGE_MAX_HEIGHT) #define OVERLAY_UPDATE(p) OUTREG(0x30000, p | 0x80000000); @@ -749,6 +750,13 @@ I810DisplayVideo( break; } + /* wide video formats (>720 pixels) are special */ + if( swidth > IMAGE_FAST_WIDTH ) { + overlay->OV0CONF = 1; /* one 1440 pixel line buffer */ + } else { + overlay->OV0CONF = 0; /* two 720 pixel line buffers */ + } + overlay->SHEIGHT = height | (height << 15); overlay->DWINPOS = (dstBox->y1 << 16) | dstBox->x1; overlay->DWINSZ = ((dstBox->y2 - dstBox->y1) << 16) | @@ -949,9 +957,10 @@ I810PutImage( I810PortPrivPtr pPriv = (I810PortPrivPtr)data; INT32 x1, x2, y1, y2; int srcPitch, dstPitch; - int top, left, npixels, nlines, size; + int top, left, npixels, nlines, size, loops; BoxRec dstBox; + /* Clip */ x1 = src_x; x2 = src_x + src_w; @@ -1004,8 +1013,18 @@ I810PutImage( pPriv->VBuf1offset = pPriv->UBuf1offset + (dstPitch * height >> 1); - /* wait for the last rendered buffer to be flipped in */ - while (((INREG(DOV0STA)&0x00100000)>>20) != pPriv->currentBuf); + /* Make sure this buffer isn't in use */ + loops = 0; + while (loops < 1000000) { + if(((INREG(DOV0STA)&0x00100000)>>20) == pPriv->currentBuf) { + break; + } + loops++; + } + if(loops >= 1000000) { + pPriv->currentBuf = !pPriv->currentBuf; + } + /* buffer swap */ if (pPriv->currentBuf == 0) @@ -1063,13 +1082,19 @@ I810QueryImageAttributes( ){ int size, tmp; - if(*w > 720) *w = 720; - if(*h > 576) *h = 576; + if(*w > IMAGE_MAX_WIDTH) *w = IMAGE_MAX_WIDTH; + if(*h > IMAGE_MAX_HEIGHT) *h = IMAGE_MAX_HEIGHT; *w = (*w + 1) & ~1; if(offsets) offsets[0] = 0; switch(id) { + /* IA44 is for XvMC only */ + case FOURCC_IA44: + case FOURCC_AI44: + if(pitches) pitches[0] = *w; + size = *w * *h; + break; case FOURCC_YV12: case FOURCC_I420: *h = (*h + 1) & ~1; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_wmark.c b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_wmark.c index 447e0521e..6c2faf437 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_wmark.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_wmark.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_wmark.c,v 1.4 2000/09/08 22:43:06 mvojkovi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_wmark.c,v 1.6 2001/11/26 18:55:48 dawes Exp $ */ /* * Authors: @@ -40,9 +40,6 @@ struct wm_info { unsigned int wm; }; -#define XCONFIG_PROBED "()" -#define NAME "i810" - struct wm_info i810_wm_8_100[] = { { 0, 0x22003000 }, { 25.2, 0x22003000 }, @@ -295,7 +292,7 @@ unsigned int I810CalcWatermark( ScrnInfoPtr pScrn, double freq, Bool dcache ) if (i == nr) i--; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "chose watermark 0x%x: (tab.freq %.1f)\n", tab[i].wm, tab[i].freq); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c index c3146ad01..8a4d69f26 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c,v 1.17 2001/08/07 07:04:47 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c,v 1.18 2001/11/08 04:15:31 tsi Exp $ */ /* * Copyright 2000 Ani Joshi <ajoshi@unixbox.com> @@ -254,7 +254,7 @@ static const OptionInfoRec * IMSTTAvailableOptions(int chipid, int busid) static void IMSTTIdentify(int flags) { - xf86PrintChipsets("imstt", "driver (version " DRIVER_VERSION " for IMS TwinTurbo chipsets ", + xf86PrintChipsets("IMSTT", "driver (version " DRIVER_VERSION " for IMS TwinTurbo chipsets ", IMSTTChipsets); } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga.h b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga.h index 58cc9293f..1f6d927fb 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.75 2001/05/04 19:05:41 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga.h,v 1.79 2002/01/11 15:42:57 dawes Exp $ */ /* * MGA Millennium (MGA2064W) functions * @@ -108,7 +108,7 @@ void dbg_outreg32(ScrnInfoPtr,int,int); #define MGA_MODULE_DATA mgaModuleData #define MGA_DRIVER_NAME "mga" #define MGA_MAJOR_VERSION 1 -#define MGA_MINOR_VERSION 0 +#define MGA_MINOR_VERSION 1 #define MGA_PATCHLEVEL 0 typedef struct { @@ -142,6 +142,8 @@ typedef struct { typedef struct { int brightness; int contrast; + Bool doubleBuffer; + unsigned char currentBuffer; FBLinearPtr linear; RegionRec clip; CARD32 colorKey; @@ -237,6 +239,7 @@ typedef struct { EntityInfoPtr pEnt; MGABiosInfo Bios; MGABios2Info Bios2; + CARD8 BiosOutputMode; pciVideoPtr PciInfo; PCITAG PciTag; xf86AccessRec Access; @@ -259,7 +262,6 @@ typedef struct { unsigned long BiosAddress; MessageType BiosFrom; unsigned char * IOBase; - unsigned char * IOBaseDense; unsigned char * FbBase; unsigned char * ILOADBase; unsigned char * FbStart; @@ -353,6 +355,7 @@ typedef struct { #endif XF86VideoAdaptorPtr adaptor; Bool SecondCrtc; + Bool SecondOutput; GDevPtr device; /* The hardware's real SrcOrg */ int realSrcOrg; @@ -483,15 +486,36 @@ Bool MgaInitDma(ScrnInfoPtr pScrn, int prim_size); #endif -void CRTC2Set(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo); -void EnableSecondOutPut(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo); -void CRTC2SetPitch(ScrnInfoPtr pSrcn, xMODEINFO *pModeInfo); -void CRTC2SetDisplayStart(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo, CARD32 base, CARD32 ulX, CARD32 ulY); +void MGACRTC2Set(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo); +void MGAEnableSecondOutPut(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo); +void MGACRTC2SetPitch(ScrnInfoPtr pSrcn, xMODEINFO *pModeInfo); +void MGACRTC2SetDisplayStart(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo, CARD32 base, CARD32 ulX, CARD32 ulY); -void CRTC2Get(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo); -void CRTC2GetPitch(ScrnInfoPtr pSrcn, xMODEINFO *pModeInfo); -void CRTC2GetDisplayStart(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo, CARD32 base, CARD32 ulX, CARD32 ulY); +void MGACRTC2Get(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo); +void MGACRTC2GetPitch(ScrnInfoPtr pSrcn, xMODEINFO *pModeInfo); +void MGACRTC2GetDisplayStart(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo, CARD32 base, CARD32 ulX, CARD32 ulY); -double G450SetPLLFreq(ScrnInfoPtr pScrn, long f_out); -void printDac(ScrnInfoPtr pScrn); +double MGAG450SetPLLFreq(ScrnInfoPtr pScrn, long f_out); +void MGAprintDac(ScrnInfoPtr pScrn); + +#ifdef USEMGAHAL +/************ ESC Call Definition ***************/ +typedef struct { + char *function; + void (*funcptr)(ScrnInfoPtr pScrn, unsigned long *param, char *out, DisplayModePtr pMode); +} MGAEscFuncRec, *MGAEscFuncPtr; + +typedef struct { + char function[32]; + unsigned long parameters[32]; +} EscCmdStruct; + +extern LPMGAMODEINFO pMgaModeInfo[2]; +extern MGAMODEINFO TmpMgaModeInfo[2]; + +extern void MGAExecuteEscCmd(ScrnInfoPtr pScrn, char *cmdline , char *sResult, DisplayModePtr pMode); +void FillDisplayModeStruct(DisplayModePtr pMode, LPMGAMODEINFO pModeInfo); +/************************************************/ +#endif + #endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_arc.c b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_arc.c index 424989b21..1045cfac5 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_arc.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_arc.c @@ -2,7 +2,11 @@ Copyright 1989, 1998 The Open Group -All Rights Reserved. +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. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -19,7 +23,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. ********************************************************/ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_arc.c,v 1.9 2000/06/25 12:46:00 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_arc.c,v 1.10 2001/12/14 19:59:51 dawes Exp $ */ #include "X.h" 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 2b3536f3a..126291288 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c @@ -1,8 +1,8 @@ /* - * MGA-1064, MGA-G100, MGA-G200, MGA-G400 RAMDAC driver + * MGA-1064, MGA-G100, MGA-G200, MGA-G400, MGA-G550 RAMDAC driver */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c,v 1.46 2001/04/06 16:51:19 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c,v 1.49 2002/01/11 15:42:57 dawes Exp $ */ /* * This is a first cut at a non-accelerated version to work with the @@ -110,6 +110,7 @@ MGAGCalcClock ( ScrnInfoPtr pScrn, long f_out, post_div_max = 7; break; case PCI_CHIP_MGAG400: + case PCI_CHIP_MGAG550: ref_freq = 27050.5; feed_div_min = 7; feed_div_max = 127; @@ -210,8 +211,8 @@ MGAGSetPCLK( ScrnInfoPtr pScrn, long f_out ) /* The actual frequency output by the clock */ double f_pll; - if(MGAISG450(pMga)) { - G450SetPLLFreq(pScrn, f_out); + if(MGAISGx50(pMga)) { + MGAG450SetPLLFreq(pScrn, f_out); return; } @@ -327,10 +328,11 @@ MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode) pReg->Option2 = 0x0000007; break; case PCI_CHIP_MGAG400: + case PCI_CHIP_MGAG550: #ifdef USEMGAHAL MGA_HAL(break;); #endif - if (MGAISG450(pMga)) + if (MGAISGx50(pMga)) break; if(pMga->Dac.maxPixelClock == 360000) { /* G400 MAX */ @@ -523,7 +525,7 @@ MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode) if (mode->Flags & V_DBLSCAN) pVga->CRTC[9] |= 0x80; - if(MGAISG450(pMga)) { + if(MGAISGx50(pMga)) { OUTREG(MGAREG_ZORG, 0); } @@ -543,9 +545,9 @@ MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode) /* Writing values to crtc2[] array */ if (pMga->SecondCrtc) { - CRTC2Get(pScrn, &ModeInfo); - CRTC2GetPitch(pScrn, &ModeInfo); - CRTC2GetDisplayStart(pScrn, &ModeInfo,0,0,0); + MGACRTC2Get(pScrn, &ModeInfo); + MGACRTC2GetPitch(pScrn, &ModeInfo); + MGACRTC2GetDisplayStart(pScrn, &ModeInfo,0,0,0); } return(TRUE); } @@ -573,7 +575,6 @@ MGAPaletteLoadCallback(ScrnInfoPtr pScrn) } pal++; } - pMga->PaletteLoadCallback = NULL; } @@ -589,7 +590,7 @@ void MGAGLoadPalette( if((pMga->CurrentLayout.Overlay8Plus24) && (pVisual->nplanes != 8)) return; - if(pMga->Chipset == PCI_CHIP_MGAG400){ + if(pMga->Chipset == PCI_CHIP_MGAG400 || pMga->Chipset == PCI_CHIP_MGAG550){ /* load them at the retrace in the block handler instead to work around some problems with static on the screen */ while(numColors--) { @@ -672,7 +673,7 @@ MGA_NOT_HAL( (i == 0x1c) || ((i >= 0x1f) && (i <= 0x29)) || ((i >= 0x30) && (i <= 0x37)) || - (MGAISG450(pMga) && + (MGAISGx50(pMga) && ((i == 0x2c) || (i == 0x2d) || (i == 0x2e) || (i == 0x4c) || (i == 0x4d) || (i == 0x4e)))) continue; @@ -683,14 +684,14 @@ MGA_NOT_HAL( should be correct already */ optionMask = (pMga->Primary) ? OPTION1_MASK_PRIMARY : OPTION1_MASK; - if (!MGAISG450(pMga)) { + if (!MGAISGx50(pMga)) { /* restore pci_option register */ pciSetBitsLong(pMga->PciTag, PCI_OPTION_REG, optionMask, mgaReg->Option); if (pMga->Chipset != PCI_CHIP_MGA1064) pciSetBitsLong(pMga->PciTag, PCI_MGA_OPTION2, OPTION2_MASK, mgaReg->Option2); - if (pMga->Chipset == PCI_CHIP_MGAG400) + if (pMga->Chipset == PCI_CHIP_MGAG400 || pMga->Chipset == PCI_CHIP_MGAG550) pciSetBitsLong(pMga->PciTag, PCI_MGA_OPTION3, OPTION3_MASK, mgaReg->Option3); } @@ -715,11 +716,12 @@ MGA_NOT_HAL( /* Second Crtc */ xMODEINFO ModeInfo; +MGA_NOT_HAL( /* Enable Dual Head */ - CRTC2Set(pScrn, &ModeInfo); - EnableSecondOutPut(pScrn, &ModeInfo); - CRTC2SetPitch(pScrn, &ModeInfo); - CRTC2SetDisplayStart(pScrn, &ModeInfo,0,0,0); + MGACRTC2Set(pScrn, &ModeInfo); + MGAEnableSecondOutPut(pScrn, &ModeInfo); + MGACRTC2SetPitch(pScrn, &ModeInfo); + MGACRTC2SetDisplayStart(pScrn, &ModeInfo,0,0,0); for (i = 0x80; i <= 0xa0; i ++) { if (i== 0x8d) { @@ -727,8 +729,10 @@ MGA_NOT_HAL( continue; } outMGAdac(i, mgaReg->dac2[ i - 0x80]); - } - } /* endif pMga->SecondCrtc */ + } +); /* MGA_NOT_HAL */ + + } #ifdef DEBUG ErrorF("Setting DAC:"); @@ -797,7 +801,7 @@ MGAGSave(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, MGARegPtr mgaReg, mgaReg->Option = pciReadLong(pMga->PciTag, PCI_OPTION_REG); mgaReg->Option2 = pciReadLong(pMga->PciTag, PCI_MGA_OPTION2); - if (pMga->Chipset == PCI_CHIP_MGAG400) + if (pMga->Chipset == PCI_CHIP_MGAG400 || pMga->Chipset == PCI_CHIP_MGAG550) mgaReg->Option3 = pciReadLong(pMga->PciTag, PCI_MGA_OPTION3); ); /* MGA_NOT_HAL */ @@ -850,6 +854,14 @@ MGAGShowCursor(ScrnInfoPtr pScrn) outMGAdac(MGA1064_CURSOR_CTL, 0x03); } +static void +MGAGShowCursorG100(ScrnInfoPtr pScrn) +{ + MGAPtr pMga = MGAPTR(pScrn); + /* Enable cursor - X-Windows mode */ + outMGAdac(MGA1064_CURSOR_CTL, 0x01); +} + static void MGAGHideCursor(ScrnInfoPtr pScrn) { @@ -875,6 +887,7 @@ MGAGSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) OUTREG8( RAMDAC_OFFSET + MGA1064_CUR_YHI, (y & 0xF00) >> 8); } + static void MGAGSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) { @@ -891,6 +904,22 @@ MGAGSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) outMGAdac(MGA1064_CURSOR_COL1_BLUE, (fg & 0x000000FF)); } +static void +MGAGSetCursorColorsG100(ScrnInfoPtr pScrn, int bg, int fg) +{ + MGAPtr pMga = MGAPTR(pScrn); + + /* Background color */ + outMGAdac(MGA1064_CURSOR_COL1_RED, (bg & 0x00FF0000) >> 16); + outMGAdac(MGA1064_CURSOR_COL1_GREEN, (bg & 0x0000FF00) >> 8); + outMGAdac(MGA1064_CURSOR_COL1_BLUE, (bg & 0x000000FF)); + + /* Foreground color */ + outMGAdac(MGA1064_CURSOR_COL2_RED, (fg & 0x00FF0000) >> 16); + outMGAdac(MGA1064_CURSOR_COL2_GREEN, (fg & 0x0000FF00) >> 8); + outMGAdac(MGA1064_CURSOR_COL2_BLUE, (fg & 0x000000FF)); +} + static Bool MGAGUseHWCursor(ScreenPtr pScrn, CursorPtr pCurs) { @@ -998,6 +1027,7 @@ MGAG_i2cInit(ScrnInfoPtr pScrn) /* * MGAGRamdacInit + * Handle broken G100 special. */ static void MGAGRamdacInit(ScrnInfoPtr pScrn) @@ -1009,11 +1039,17 @@ MGAGRamdacInit(ScrnInfoPtr pScrn) MGAdac->CursorOffscreenMemSize = 1024; MGAdac->CursorMaxWidth = 64; MGAdac->CursorMaxHeight = 64; - MGAdac->SetCursorColors = MGAGSetCursorColors; MGAdac->SetCursorPosition = MGAGSetCursorPosition; MGAdac->LoadCursorImage = MGAGLoadCursorImage; MGAdac->HideCursor = MGAGHideCursor; - MGAdac->ShowCursor = MGAGShowCursor; + if ((pMga->Chipset == PCI_CHIP_MGAG100) + || (pMga->Chipset == PCI_CHIP_MGAG100)) { + MGAdac->SetCursorColors = MGAGSetCursorColorsG100; + MGAdac->ShowCursor = MGAGShowCursorG100; + } else { + MGAdac->SetCursorColors = MGAGSetCursorColors; + MGAdac->ShowCursor = MGAGShowCursor; + } MGAdac->UseHWCursor = MGAGUseHWCursor; MGAdac->CursorFlags = #if X_BYTE_ORDER == X_LITTLE_ENDIAN @@ -1040,6 +1076,7 @@ MGAGRamdacInit(ScrnInfoPtr pScrn) MGAdac->maxPixelClock = 220000; break; case PCI_CHIP_MGAG400: + case PCI_CHIP_MGAG550: /* We don't know the new pins format but we know that the maxclock / 4 is where the RamdacType was in the old pins format */ 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 c05c5c91d..3d7df452b 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.21 2001/05/02 15:06:09 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dri.c,v 1.22 2001/09/26 12:59:17 alanh Exp $ */ /* * Copyright 2000 VA Linux Systems Inc., Fremont, California. @@ -849,6 +849,7 @@ static Bool MGADRIKernelInit( ScreenPtr pScreen ) init.sarea_priv_offset = sizeof(XF86DRISAREARec); switch ( pMga->Chipset ) { + case PCI_CHIP_MGAG550: case PCI_CHIP_MGAG400: init.chipset = MGA_CARD_TYPE_G400; break; @@ -933,7 +934,8 @@ Bool MGADRIScreenInit( ScreenPtr pScreen ) MGADRIPtr pMGADRI; MGADRIServerPrivatePtr pMGADRIServer; - switch ( pMga->Chipset ) { + switch(pMga->Chipset) { + case PCI_CHIP_MGAG550: case PCI_CHIP_MGAG400: case PCI_CHIP_MGAG200: #if 0 @@ -941,8 +943,7 @@ Bool MGADRIScreenInit( ScreenPtr pScreen ) #endif break; default: - xf86DrvMsg( pScrn->scrnIndex, X_ERROR, - "[drm] Direct rendering only supported with AGP G200/G400 cards!\n" ); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] Direct rendering only supported with G200/G400/G550 AGP\n"); return FALSE; } @@ -1191,7 +1192,8 @@ Bool MGADRIFinishScreenInit( ScreenPtr pScreen ) return FALSE; } - switch ( pMga->Chipset ) { + switch(pMga->Chipset) { + case PCI_CHIP_MGAG550: case PCI_CHIP_MGAG400: pMGADRI->chipset = MGA_CARD_TYPE_G400; break; 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 a5cc7a16c..084e3f16f 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c @@ -45,7 +45,7 @@ * Added digital screen option for first head */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c,v 1.207 2001/08/07 07:04:47 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c,v 1.214 2002/01/07 21:50:11 dawes Exp $ */ /* * This is a first cut at a non-accelerated version to work with the @@ -174,6 +174,7 @@ static SymTabRec MGAChipsets[] = { { PCI_CHIP_MGAG200, "mgag200" }, { PCI_CHIP_MGAG200_PCI, "mgag200 PCI" }, { PCI_CHIP_MGAG400, "mgag400" }, + { PCI_CHIP_MGAG550, "mgag550" }, {-1, NULL } }; @@ -187,6 +188,7 @@ static PciChipsets MGAPciChipsets[] = { { 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 }, + { PCI_CHIP_MGAG550, PCI_CHIP_MGAG550, RES_SHARED_VGA }, { -1, -1, RES_UNDEFINED } }; @@ -662,7 +664,7 @@ MGAProbe(DriverPtr drv, int flags) * as sharable. */ pEnt = xf86GetEntityInfo(usedChips[i]); - if (pEnt->chipset == PCI_CHIP_MGAG400) { + if (pEnt->chipset == PCI_CHIP_MGAG400 || pEnt->chipset == PCI_CHIP_MGAG550) { MGAEntPtr pMgaEnt = NULL; DevUnion *pPriv; @@ -739,6 +741,9 @@ MGAReadBios(ScrnInfoPtr pScrn) pMga = MGAPTR(pScrn); pBios = &pMga->Bios; pBios2 = &pMga->Bios2; + + /* Get the output mode set by the BIOS */ + xf86ReadBIOS(pMga->BiosAddress, 0x7ff1, &pMga->BiosOutputMode, sizeof(CARD8)); /* * If the BIOS address was probed, it was found from the PCI config @@ -921,6 +926,7 @@ MGACountRam(ScrnInfoPtr pScrn) "Assuming 4096 KB\n"); return 4096; case PCI_CHIP_MGAG400: + case PCI_CHIP_MGAG550: if(biosInfo) { switch((biosInfo >> 10) & 0x07) { case 0: @@ -1294,54 +1300,39 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) /* Set pScrn->monitor */ pScrn->monitor = pScrn->confScreen->monitor; -#if 1 /* - * XXX This assumes that the lower number screen is always the "master" - * head, and that the "master" is the first CRTC. This can result in - * unexpected behaviour when the config file marks the primary CRTC - * as the second screen. + * In case of DualHead, we need to determine if we are the 'master' head or the 'slave' + * head. In order to do that, at the end of the first initialisation, PrimInit is set as + * DONE to the shared entity. So that the second initialisation knows that something has + * been done before it. This always assume that the first device initialised is the master + * head, and the second the slave. + * */ - if(xf86IsEntityShared(pScrn->entityList[0]) && - xf86IsPrimInitDone(pScrn->entityList[0])) { - /* This is the second crtc */ - pMga->SecondCrtc = TRUE; - pMga->HWCursor = FALSE; - pScrn->AdjustFrame = MGAAdjustFrameCrtc2; - pMgaEnt->pScrn_2 = pScrn; + if (xf86IsEntityShared(pScrn->entityList[0])) { /* dual-head mode */ + + if (!xf86IsPrimInitDone(pScrn->entityList[0])) { /* Is it the first initialisation? */ + /* First CRTC */ + pMga->SecondCrtc = FALSE; + pMga->HWCursor = TRUE; + pMgaEnt->pScrn_1 = pScrn; + } + else { + /* Second CRTC */ + pMga->SecondCrtc = TRUE; + pMga->HWCursor = FALSE; + pMgaEnt->pScrn_2 = pScrn; + pScrn->AdjustFrame = MGAAdjustFrameCrtc2; + } #ifdef XF86DRI pMga->GetQuiescence = MGAGetQuiescenceShared; #endif - } else { + } else { /* single-head mode */ pMga->SecondCrtc = FALSE; pMga->HWCursor = TRUE; - if (xf86IsEntityShared(pScrn->entityList[0])) { - pMgaEnt->pScrn_1 = pScrn; -#ifdef XF86DRI - pMga->GetQuiescence = MGAGetQuiescenceShared; -#endif - } else { #ifdef XF86DRI - pMga->GetQuiescence = MGAGetQuiescence; + pMga->GetQuiescence = MGAGetQuiescence; #endif - } - } -#else - /* - * This is an alternative version that determines which is the secondary - * CRTC from the screen field in pMga->device. It doesn't currently - * work becasue there are things that assume the primary CRTC is - * initialised first. - */ - if (pMga->device->screen == 1) { - /* This is the second CRTC */ - pMga->SecondCrtc = TRUE; - pMga->HWCursor = FALSE; - pScrn->AdjustFrame = MGAAdjustFrameCrtc2; - } else { - pMga->SecondCrtc = FALSE; - pMga->HWCursor = TRUE; } -#endif /* * The first thing we should figure out is the depth, bpp, etc. @@ -1402,7 +1393,7 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) bytesPerPixel = pScrn->bitsPerPixel / 8; - /* We use a programamble clock */ + /* We use a programmable clock */ pScrn->progClock = TRUE; /* Collect all of the relevant option flags (fill in pScrn->options) */ @@ -1460,15 +1451,18 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) } #ifdef USEMGAHAL - if (HAL_CHIPSETS && !xf86ReturnOptValBool(pMga->Options, OPTION_NOHAL, FALSE) - && xf86LoadSubModule(pScrn, "mga_hal")) { - xf86LoaderReqSymLists(halSymbols, NULL); - xf86DrvMsg(pScrn->scrnIndex, X_INFO,"Matrox HAL module used\n"); - pMga->HALLoaded = TRUE; - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Matrox HAL module not found - using builtin mode setup instead\n"); - pMga->HALLoaded = FALSE; - } + if (HAL_CHIPSETS) { + if (!xf86ReturnOptValBool(pMga->Options, OPTION_NOHAL, FALSE) + && xf86LoadSubModule(pScrn, "mga_hal")) { + xf86LoaderReqSymLists(halSymbols, NULL); + xf86DrvMsg(pScrn->scrnIndex, X_INFO,"Matrox HAL module used\n"); + pMga->HALLoaded = TRUE; + } else { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Matrox HAL module not loaded " + "- using builtin mode setup instead\n"); + pMga->HALLoaded = FALSE; + } + } #endif /* @@ -1645,6 +1639,7 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) case PCI_CHIP_MGAG200: case PCI_CHIP_MGAG200_PCI: case PCI_CHIP_MGAG400: + case PCI_CHIP_MGAG550: MGAGSetupFuncs(pScrn); break; } @@ -1729,7 +1724,6 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) } } - #if !defined(__powerpc__) /* * Find the BIOS base. Get it from the PCI config if possible. Otherwise @@ -1767,8 +1761,38 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) * Read the BIOS data struct */ +#if defined(__alpha__) + /* + * Some old Digital-OEMed Matrox Millennium I cards have a VGA + * disable switch. If the disable is on, we can't read the BIOS, + * and pMga->BiosAddress = 0x0. The disable switch is needed to + * allow multi-head operation with brain-dead console code... ;-} + */ + + if ((pMga->BiosAddress == 0) && !xf86IsPrimaryPci(pMga->PciInfo)) + xf86DrvMsg(pScrn->scrnIndex, pMga->BiosFrom, + "BIOS not found, skipping read\n"); + else +#endif MGAReadBios(pScrn); + /* Since the BIOS can swap DACs during the initialisation of G550, we need to + * store which DAC this instance of the driver is taking care of. This is done + * by checking a flag stored in the ROM by the BIOS at a fixed address. */ + + if (!pMga->SecondCrtc) + pMga->SecondOutput = FALSE; + else + pMga->SecondOutput = TRUE; + + if (pMga->Chipset == PCI_CHIP_MGAG550) { + if (!pMga->SecondCrtc) { + pMga->SecondOutput = (pMga->BiosOutputMode & 0x1) ? TRUE : FALSE; + } else { + pMga->SecondOutput = (pMga->BiosOutputMode & 0x1) ? FALSE : TRUE; + } + } + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 2, "MGABios.RamdacType = 0x%x\n", pMga->Bios.RamdacType); #endif /* !__powerpc__ */ @@ -1841,6 +1865,7 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) /* Normal Handling of video ram etc */ pMga->FbMapSize = pScrn->videoRam * 1024; switch(pMga->Chipset) { + case PCI_CHIP_MGAG550: case PCI_CHIP_MGAG400: case PCI_CHIP_MGAG200: case PCI_CHIP_MGAG200_PCI: @@ -1925,7 +1950,8 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) if(pMga->SecondCrtc == TRUE) { /* Override on 2nd crtc */ - if (pMga->ChipRev >= 0x80) { /* G450 */ + if ((pMga->ChipRev >= 0x80) || (pMga->Chipset == PCI_CHIP_MGAG550)) { + /* G450, G550 */ pMga->MaxClock = 234000; } else { pMga->MaxClock = 135000; @@ -2005,6 +2031,7 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) case PCI_CHIP_MGAG200: case PCI_CHIP_MGAG200_PCI: case PCI_CHIP_MGAG400: + case PCI_CHIP_MGAG550: maxPitch = 4096; break; } @@ -2068,7 +2095,7 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags) if (digital1) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Digital screen detected on first head.\n"); - mgaModeInfo.flOutput = MGAMODEINFO_DIGITAL2; + mgaModeInfo.flOutput = MGAMODEINFO_DIGITAL1; } else if (tv1) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV detected on first head.\n"); @@ -2411,14 +2438,6 @@ MGAMapMem(ScrnInfoPtr pScrn) if (pMga->IOBase == NULL) return FALSE; -#ifdef __alpha__ - pMga->IOBaseDense = xf86MapPciMem(pScrn->scrnIndex, - VIDMEM_MMIO | VIDMEM_MMIO_32BIT, - pMga->PciTag, pMga->IOAddress, 0x4000); - if (pMga->IOBaseDense == NULL) - return FALSE; -#endif - pMga->FbBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, pMga->PciTag, pMga->FbAddress, pMga->FbMapSize); @@ -2674,7 +2693,7 @@ MGAModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) } else { pMga->pMgaModeInfo->flOutput = MGAMODEINFO_FORCE_PITCH; if (digital1) { - pMga->pMgaModeInfo->flOutput |= MGAMODEINFO_DIGITAL2; + pMga->pMgaModeInfo->flOutput |= MGAMODEINFO_DIGITAL1; } else if (tv1) { pMga->pMgaModeInfo->flOutput |= MGAMODEINFO_TV; } else { @@ -2722,13 +2741,36 @@ MGAModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) " Make sure to validate the mode before.\n"); return FALSE; } + ); /* MGA_HAL */ + /* getting around bugs in the HAL lib. MATROX: hint, hint */ MGA_HAL( - if(pMga->SecondCrtc == FALSE && pMga->HWCursor == TRUE) { - outMGAdac(MGA1064_CURSOR_BASE_ADR_LOW, pMga->FbCursorOffset >> 10); - outMGAdac(MGA1064_CURSOR_BASE_ADR_HI, pMga->FbCursorOffset >> 18); - } + switch (pMga->Chipset) { + 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: + if(pMga->SecondCrtc == FALSE && pMga->HWCursor == TRUE) { + outMGAdac(MGA1064_CURSOR_BASE_ADR_LOW, + pMga->FbCursorOffset >> 10); + outMGAdac(MGA1064_CURSOR_BASE_ADR_HI, + pMga->FbCursorOffset >> 18); + outMGAdac(MGA1064_CURSOR_CTL, 0x00); + } + if (pMga->Overlay8Plus24 == TRUE) { + outMGAdac(MGA1064_MUL_CTL, MGA1064_MUL_CTL_32bits); + outMGAdac(MGA1064_COL_KEY_MSK_LSB,0xFF); + outMGAdac(MGA1064_COL_KEY_LSB,pMga->colorKey); + outMGAdac(MGA1064_COL_KEY_MSK_MSB,0xFF); + outMGAdac(MGA1064_COL_KEY_MSB,0xFF); + } + break; + default: + break; + } ); /* MGA_HAL */ #endif MGA_NOT_HAL((*pMga->Restore)(pScrn, vgaReg, mgaReg, FALSE)); @@ -2754,6 +2796,45 @@ MGAModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) return TRUE; } +static +void MGARestoreSecondCrtc(ScrnInfoPtr pScrn) +{ + MGAPtr pMga = MGAPTR(pScrn); + + if (MGAISGx50(pMga)) { + /* Force to return in clone mode */ + if (pMga->SecondOutput) { + CARD8 ucXDispCtrl = inMGAdac(MGA1064_DISP_CTL); + + ucXDispCtrl &= ~0x0c; /* dac2outsel mask */ + ucXDispCtrl |= 0x04; /* dac2 -> crtc1 */ + + outMGAdac(MGA1064_DISP_CTL, ucXDispCtrl); + + } else { + CARD8 ucXDispCtrl = inMGAdac(MGA1064_DISP_CTL); + CARD32 ulC2CTL = INREG(MGAREG_C2CTL); + + ucXDispCtrl &= ~0x0c; /* dac2outsel mask */ + ucXDispCtrl |= 0x5; /* dac1outsel -> crtcdacsel, dac2 -> crtc1 */ + ulC2CTL &= ~0x00100000; /* crtcdacsel -> crtc1 */ + + outMGAdac(MGA1064_DISP_CTL, ucXDispCtrl); + OUTREG(MGAREG_C2CTL, ulC2CTL); + } + + } else { + /* Force to close second crtc */ + CARD32 ulC2CTL = INREG(MGAREG_C2CTL); + + ulC2CTL &= ~0x1; /* crtc2 disabled */ + + OUTREG(MGAREG_C2CTL, ulC2CTL); + } + + return; +} + /* * Restore the initial (text) mode. */ @@ -2768,7 +2849,10 @@ MGARestore(ScrnInfoPtr pScrn) if (pScrn->pScreen != NULL) MGAStormSync(pScrn); - if(pMga->SecondCrtc == TRUE) return; + if(pMga->SecondCrtc) { + MGARestoreSecondCrtc(pScrn); + return; + } /* Only restore text mode fonts/text for the primary card */ vgaHWProtect(pScrn, TRUE); @@ -2828,7 +2912,9 @@ MGAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) int width, height, displayWidth; MGAEntPtr pMgaEnt = NULL; int f; +#ifdef XF86DRI MessageType driFrom = X_DEFAULT; +#endif /* * First get the ScrnInfoRec @@ -2910,6 +2996,7 @@ MGAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) #ifdef USEMGAHAL MGA_HAL( /* There is a problem in the HALlib: set soft reset bit */ + /* MATROX: hint, hint */ if (!pMga->Primary && !pMga->FBDev && (pMga->PciInfo->subsysCard == PCI_CARD_MILL_G200_SG) ) { OUTREG(MGAREG_Reset, 1); @@ -2944,6 +3031,7 @@ MGAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) case PCI_CHIP_MGAG200: case PCI_CHIP_MGAG200_PCI: case PCI_CHIP_MGAG400: + case PCI_CHIP_MGAG550: outMGAdac(MGA1064_CURSOR_BASE_ADR_LOW, pMga->FbCursorOffset >> 10); outMGAdac(MGA1064_CURSOR_BASE_ADR_HI, pMga->FbCursorOffset >> 18); break; @@ -3227,9 +3315,6 @@ MGAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) /* For the second head, work around display problem. */ if (pMga->SecondCrtc) { MGACrtc2FillStrip(pScrn); - } else { - /* shut second head */ - outMGAdac(0xa0,0x08); } /* Done */ @@ -3270,7 +3355,7 @@ MGAAdjustFrame(int scrnIndex, int x, int y, int flags) (3 - pMga->BppShifts[(pLayout->bitsPerPixel >> 3) - 1]); if (pLayout->bitsPerPixel == 24) { - if (pMga->Chipset == PCI_CHIP_MGAG400) + if (pMga->Chipset == PCI_CHIP_MGAG400 || pMga->Chipset == PCI_CHIP_MGAG550) Base &= ~1; /* Not sure why */ Base *= 3; } @@ -3344,10 +3429,6 @@ MGAEnterVT(int scrnIndex, int flags) } #endif - if (!pMga->SecondCrtc) { - outMGAdac(0xa0,0x08); - } - if (!MGAModeInit(pScrn, pScrn->currentMode)) return FALSE; MGAAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); @@ -3380,6 +3461,16 @@ MGAEnterVTFBDev(int scrnIndex, int flags) return TRUE; } +#define RESTORE_TEXTMODE_ON_DVI(x) \ + if (MGAISGx50(x) && \ + (ISDIGITAL1(x) || ISDIGITAL2(x))) { \ + /* Reset DUALDVI register */ \ + outMGAdac(MGA1064_DVI_PIPE_CTL, 0x0); \ + /* Set Panel mode between 20 and 54 MHz */ \ + outMGAdac(MGA1064_PAN_CTL, 0x7); \ + } + + /* * This is called when VT switching away from the X server. Its job is * to restore the previous (text) mode. @@ -3393,14 +3484,11 @@ MGALeaveVT(int scrnIndex, int flags) { ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; vgaHWPtr hwp = VGAHWPTR(pScrn); - MGAPtr pMga = MGAPTR(pScrn); #ifdef XF86DRI + MGAPtr pMga = MGAPTR(pScrn); ScreenPtr pScreen; #endif - /* Close second Crtc */ - outMGAdac(0xa0, 0x08); - MGARestore(pScrn); vgaHWLock(hwp); @@ -3412,7 +3500,9 @@ MGALeaveVT(int scrnIndex, int flags) DRILock(pScreen, 0); } #endif - +#ifdef USEMGAHAL + MGA_HAL( RESTORE_TEXTMODE_ON_DVI(pMga); ); +#endif } @@ -3431,9 +3521,9 @@ MGACloseScreen(int scrnIndex, ScreenPtr pScreen) vgaHWPtr hwp = VGAHWPTR(pScrn); MGAPtr pMga = MGAPTR(pScrn); MGAEntPtr pMgaEnt = NULL; - - MGA_NOT_HAL(outMGAdac(0xa0, 0x08)); - +#ifdef USEMGAHAL + MGA_HAL( RESTORE_TEXTMODE_ON_DVI(pMga); ); +#endif if (pScrn->vtSema) { if (pMga->FBDev) { fbdevHWRestore(pScrn); 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 f8907bc6b..5a04684a9 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.20 2001/03/21 17:02:24 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_macros.h,v 1.21 2001/09/26 12:59:17 alanh Exp $ */ #ifndef _MGA_MACROS_H_ #define _MGA_MACROS_H_ @@ -94,7 +94,9 @@ while(INREG(MGAREG_DWGSYNC) != MGA_SYNC_XTAG) ; \ #ifdef USEMGAHAL #define HAL_CHIPSETS ((pMga->Chipset == PCI_CHIP_MGAG200_PCI) || \ (pMga->Chipset == PCI_CHIP_MGAG200) || \ - (pMga->Chipset == PCI_CHIP_MGAG400)) + (pMga->Chipset == PCI_CHIP_MGAG400) || \ + (pMga->Chipset == PCI_CHIP_MGAG550)) + #define MGA_HAL(x) { \ MGAPtr pMga = MGAPTR(pScrn); \ if (pMga->HALLoaded && HAL_CHIPSETS) { x; } \ @@ -107,6 +109,7 @@ while(INREG(MGAREG_DWGSYNC) != MGA_SYNC_XTAG) ; \ #define MGA_NOT_HAL(x) { x; } #endif -#define MGAISG450(x) ( ((x)->Chipset == PCI_CHIP_MGAG400) && ((x)->ChipRev >= 0x80) ) +#define MGAISGx50(x) ( (((x)->Chipset == PCI_CHIP_MGAG400) && ((x)->ChipRev >= 0x80)) || \ + ((x)->Chipset == PCI_CHIP_MGAG550) ) #endif /* _MGA_MACROS_H_ */ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_reg.h b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_reg.h index 7b2dcb9dc..0d6a20ba0 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_reg.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_reg.h @@ -2,7 +2,7 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_reg.h,v 1.17 2001/04/25 14:23:00 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_reg.h,v 1.18 2001/09/26 12:59:18 alanh Exp $ */ @@ -317,6 +317,7 @@ #define MGA1064_CUR_YHI 0x0f /* MGA1064 indirect registers */ +#define MGA1064_DVI_PIPE_CTL 0x03 #define MGA1064_CURSOR_BASE_ADR_LOW 0x04 #define MGA1064_CURSOR_BASE_ADR_HI 0x05 #define MGA1064_CURSOR_CTL 0x06 @@ -403,6 +404,8 @@ #define MGA1064_DISP_CTL 0x8a #define MGA1064_SYNC_CTL 0x8b #define MGA1064_PWR_CTL 0xa0 +#define MGA1064_PAN_CTL 0xa2 + /* Using crtc2 */ #define MGAREG2_C2CTL 0x10 #define MGAREG2_C2HPARAM 0x14 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 d11ab6bf0..44dec0f49 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.91 2001/05/10 21:53:48 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c,v 1.96 2001/12/06 15:54:52 keithp Exp $ */ /* All drivers should typically include these */ @@ -102,12 +102,14 @@ static void MGANAME(SetupForScreenToScreenColorExpandFill)(ScrnInfoPtr pScrn, static void MGANAME(SubsequentScreenToScreenColorExpandFill)(ScrnInfoPtr pScrn, int x, int y, int w, int h, int srcx, int srcy, int skipleft); +#if X_BYTE_ORDER == X_LITTLE_ENDIAN static void MGANAME(SetupForDashedLine)(ScrnInfoPtr pScrn, int fg, int bg, int rop, unsigned int planemask, int length, unsigned char *pattern); static void MGANAME(SubsequentDashedTwoPointLine)(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2, int flags, int phase); +#endif void MGANAME(RestoreAccelState)(ScrnInfoPtr pScrn); #if PSZ == 8 void Mga16RestoreAccelState(ScrnInfoPtr pScrn); @@ -582,6 +584,9 @@ MGANAME(AccelInit)(ScreenPtr pScreen) pMga->AccelInfoRec = infoPtr = XAACreateInfoRec(); if(!infoPtr) return FALSE; + pMga->RenderTime = 0; + pMga->LinearScratch = 0; + pMga->MaxFastBlitY = 0; pMga->MaxBlitDWORDS = 0x40000 >> 5; @@ -596,6 +601,7 @@ MGANAME(AccelInit)(ScreenPtr pScreen) USE_RECTS_FOR_LINES; break; case PCI_CHIP_MGAG400: + case PCI_CHIP_MGAG550: if(pMga->SecondCrtc == TRUE) { pMga->HasFBitBlt = FALSE; } @@ -603,7 +609,8 @@ MGANAME(AccelInit)(ScreenPtr pScreen) /* fallthrough */ case PCI_CHIP_MGAG200: case PCI_CHIP_MGAG200_PCI: - doRender = TRUE; + if (pMga->SecondCrtc == FALSE) + doRender = TRUE; pMga->AccelFlags = TRANSC_SOLID_FILL | TWO_PASS_COLOR_EXPAND; @@ -712,11 +719,7 @@ MGANAME(AccelInit)(ScreenPtr pScreen) if(pMga->ILOADBase) { pMga->ColorExpandBase = pMga->ILOADBase; } else { -#ifdef __alpha__ - pMga->ColorExpandBase = pMga->IOBaseDense; -#else pMga->ColorExpandBase = pMga->IOBase; -#endif } infoPtr->SetupForScanlineCPUToScreenColorExpandFill = MGANAME(SetupForScanlineCPUToScreenColorExpandFill); @@ -794,7 +797,9 @@ MGANAME(AccelInit)(ScreenPtr pScreen) infoPtr->ScanlineCPUToScreenColorExpandFillFlags |= NO_PLANEMASK; infoPtr->SolidFillFlags |= NO_PLANEMASK; infoPtr->SolidLineFlags |= NO_PLANEMASK; +#if X_BYTE_ORDER == X_LITTLE_ENDIAN infoPtr->DashedLineFlags |= NO_PLANEMASK; +#endif infoPtr->Mono8x8PatternFillFlags |= NO_PLANEMASK; infoPtr->ScreenToScreenColorExpandFillFlags |= NO_PLANEMASK; infoPtr->FillSolidRectsFlags |= NO_PLANEMASK; @@ -951,7 +956,7 @@ MGANAME(AccelInit)(ScreenPtr pScreen) #ifdef RENDER if(doRender && ((pScrn->bitsPerPixel == 32) || (pScrn->bitsPerPixel == 16))) { - if(pMga->Chipset == PCI_CHIP_MGAG400) { + if(pMga->Chipset == PCI_CHIP_MGAG400 || pMga->Chipset == PCI_CHIP_MGAG550) { infoPtr->CPUToScreenAlphaTextureFlags = XAA_RENDER_NO_TILE; infoPtr->SetupForCPUToScreenAlphaTexture = MGASetupForCPUToScreenAlphaTexture; @@ -1161,6 +1166,7 @@ MGAStormEngineInit(ScrnInfoPtr pScrn) pMga->AccelFlags &= ~CLIPPER_ON; switch(pMga->Chipset) { + case PCI_CHIP_MGAG550: case PCI_CHIP_MGAG400: case PCI_CHIP_MGAG200: case PCI_CHIP_MGAG200_PCI: @@ -1861,6 +1867,7 @@ static void MGANAME(SubsequentImageWriteScanline)( } } +#if X_BYTE_ORDER == X_LITTLE_ENDIAN /***************************\ | Dashed Lines | @@ -1971,6 +1978,7 @@ MGANAME(SubsequentDashedTwoPointLine)( } } +#endif /* X_BYTE_ORDER == X_LITTLE_ENDIAN */ #if PSZ != 24 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 6631e384b..d2e98a326 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.25 2001/06/01 02:10:06 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_video.c,v 1.29 2001/12/26 14:54:04 dawes Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -63,7 +63,7 @@ static void MGAVideoTimerCallback(ScrnInfoPtr pScrn, Time time); #define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) -static Atom xvBrightness, xvContrast, xvColorKey; +static Atom xvBrightness, xvContrast, xvColorKey, xvDoubleBuffer; void MGAInitVideo(ScreenPtr pScreen) { @@ -77,7 +77,8 @@ void MGAInitVideo(ScreenPtr pScreen) (pMga->SecondCrtc == FALSE) && ((pMga->Chipset == PCI_CHIP_MGAG200) || (pMga->Chipset == PCI_CHIP_MGAG200_PCI) || - (pMga->Chipset == PCI_CHIP_MGAG400))) + (pMga->Chipset == PCI_CHIP_MGAG400) || + (pMga->Chipset == PCI_CHIP_MGAG550))) { if((pMga->Overlay8Plus24 || pMga->TexturedVideo) && (pScrn->bitsPerPixel != 24)) @@ -145,13 +146,14 @@ static XF86VideoFormatRec Formats[NUM_FORMATS] = {15, DirectColor}, {16, DirectColor}, {24, DirectColor} }; -#define NUM_ATTRIBUTES_OVERLAY 3 +#define NUM_ATTRIBUTES_OVERLAY 4 static XF86AttributeRec Attributes[NUM_ATTRIBUTES_OVERLAY] = { {XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"}, {XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"}, - {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"} + {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"}, + {XvSettable | XvGettable, 0, 1, "XV_DOUBLE_BUFFER"} }; #define NUM_IMAGES 4 @@ -190,7 +192,7 @@ MGAResetVideoOverlay(ScrnInfoPtr pScrn) static XF86VideoAdaptorPtr -MGAAllocAdaptor(ScrnInfoPtr pScrn) +MGAAllocAdaptor(ScrnInfoPtr pScrn, Bool doublebuffer) { XF86VideoAdaptorPtr adapt; MGAPtr pMga = MGAPTR(pScrn); @@ -215,12 +217,15 @@ MGAAllocAdaptor(ScrnInfoPtr pScrn) xvBrightness = MAKE_ATOM("XV_BRIGHTNESS"); xvContrast = MAKE_ATOM("XV_CONTRAST"); xvColorKey = MAKE_ATOM("XV_COLORKEY"); + xvDoubleBuffer = MAKE_ATOM("XV_DOUBLE_BUFFER"); pPriv->colorKey = pMga->videoKey; pPriv->videoStatus = 0; pPriv->brightness = 0; pPriv->contrast = 128; pPriv->lastPort = -1; + pPriv->doubleBuffer = doublebuffer; + pPriv->currentBuffer = 0; pMga->adaptor = adapt; pMga->portPrivate = pPriv; @@ -235,7 +240,7 @@ MGASetupImageVideoOverlay(ScreenPtr pScreen) MGAPtr pMga = MGAPTR(pScrn); XF86VideoAdaptorPtr adapt; - adapt = MGAAllocAdaptor(pScrn); + adapt = MGAAllocAdaptor(pScrn, TRUE); adapt->type = XvWindowMask | XvInputMask | XvImageMask; adapt->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; @@ -246,9 +251,10 @@ MGASetupImageVideoOverlay(ScreenPtr pScreen) adapt->pFormats = Formats; adapt->nPorts = 1; adapt->pAttributes = Attributes; - if (pMga->Chipset == PCI_CHIP_MGAG400) { + if (pMga->Chipset == PCI_CHIP_MGAG400 || + pMga->Chipset == PCI_CHIP_MGAG550) { adapt->nImages = 4; - adapt->nAttributes = 3; + adapt->nAttributes = 4; } else { adapt->nImages = 3; adapt->nAttributes = 1; @@ -281,7 +287,7 @@ MGASetupImageVideoTexture(ScreenPtr pScreen) XF86VideoAdaptorPtr adapt; MGAPtr pMga = MGAPTR(pScrn); - adapt = MGAAllocAdaptor(pScrn); + adapt = MGAAllocAdaptor(pScrn, FALSE); adapt->type = XvWindowMask | XvInputMask | XvImageMask; adapt->flags = 0; @@ -294,7 +300,8 @@ MGASetupImageVideoTexture(ScreenPtr pScreen) adapt->pAttributes = NULL; adapt->nAttributes = 0; adapt->pImages = Images; - if (pMga->Chipset == PCI_CHIP_MGAG400) + if (pMga->Chipset == PCI_CHIP_MGAG400 || + pMga->Chipset == PCI_CHIP_MGAG550) adapt->nImages = 4; else adapt->nImages = 3; @@ -495,6 +502,11 @@ MGASetPortAttributeOverlay( outMGAdac(0x57, (pPriv->colorKey & pScrn->mask.blue) >> pScrn->offset.blue); REGION_EMPTY(pScrn->pScreen, &pPriv->clip); + } else + if(attribute == xvDoubleBuffer) { + if((value < 0) || (value > 1)) + return BadValue; + pPriv->doubleBuffer = value; } else return BadMatch; return Success; @@ -516,6 +528,9 @@ MGAGetPortAttributeOverlay( if(attribute == xvContrast) { *value = pPriv->contrast; } else + if(attribute == xvDoubleBuffer) { + *value = pPriv->doubleBuffer ? 1 : 0; + } else if(attribute == xvColorKey) { *value = pPriv->colorKey; } else return BadMatch; @@ -681,11 +696,15 @@ MGADisplayVideoOverlay( CHECK_DMA_QUIESCENT(pMga, pScrn); - /* got 64 scanlines to do it in */ - tmp = INREG(MGAREG_VCOUNT) + 64; - if(tmp > pScrn->currentMode->VDisplay) - tmp -= pScrn->currentMode->VDisplay; + /* got 48 scanlines to do it in */ + tmp = INREG(MGAREG_VCOUNT) + 48; + /* FIXME always change it in vertical retrace use CrtcV ?*/ + if(tmp > pScrn->currentMode->CrtcVTotal) + tmp -= 49; /* too bad */ + else + tmp = pScrn->currentMode->CrtcVTotal -1; + tmp = pScrn->currentMode->VDisplay +1; /* enable accelerated 2x horizontal zoom when pixelclock >135MHz */ hzoom = (pScrn->currentMode->Clock > 135000) ? 1 : 0; @@ -883,8 +902,12 @@ MGAPutImage( break; } - if(!(pPriv->linear = MGAAllocateMemory(pScrn, pPriv->linear, new_size))) + if(!(pPriv->linear = MGAAllocateMemory(pScrn, pPriv->linear, + pPriv->doubleBuffer ? (new_size << 1) : new_size))) + { return BadAlloc; + } + pPriv->currentBuffer ^= 1; /* copy data */ top = y1 >> 16; @@ -893,6 +916,8 @@ MGAPutImage( left <<= 1; offset = pPriv->linear->offset * bpp; + if(pPriv->doubleBuffer) + offset += pPriv->currentBuffer * new_size * bpp; dst_start = pMga->FbStart + offset + left + (top * dstPitch); if(pMga->TexturedVideo && pMga->AccelInfoRec->NeedToSync && @@ -1212,7 +1237,7 @@ MGAInitOffscreenImages(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; MGAPtr pMga = MGAPTR(pScrn); - int num = (pMga->Chipset == PCI_CHIP_MGAG400) ? 2 : 1; + int num = (pMga->Chipset == PCI_CHIP_MGAG400 || pMga->Chipset == PCI_CHIP_MGAG550) ? 2 : 1; XF86OffscreenImagePtr offscreenImages; /* need to free this someplace */ @@ -1230,7 +1255,7 @@ MGAInitOffscreenImages(ScreenPtr pScreen) offscreenImages[0].getAttribute = MGAGetSurfaceAttribute; offscreenImages[0].max_width = 1024; offscreenImages[0].max_height = 1024; - offscreenImages[0].num_attributes = (num == 1) ? 1 : 3; + offscreenImages[0].num_attributes = (num == 1) ? 1 : 4; offscreenImages[0].attributes = Attributes; if(num == 2) { @@ -1245,7 +1270,7 @@ MGAInitOffscreenImages(ScreenPtr pScreen) offscreenImages[1].getAttribute = MGAGetSurfaceAttribute; offscreenImages[1].max_width = 1024; offscreenImages[1].max_height = 1024; - offscreenImages[1].num_attributes = 3; + offscreenImages[1].num_attributes = 4; offscreenImages[1].attributes = Attributes; } 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 6124f86c2..c679c4d30 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.3 2000/10/17 21:36:15 mvojkovi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_dga.c,v 1.4 2001/10/01 13:44:07 eich Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -76,7 +76,7 @@ NEODGAInit(ScreenPtr pScreen) imlines = (pScrn->videoRam * 1024) / (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3)); - pixlines = (imlines > 1024) ? 1024 : imlines; + pixlines = (imlines > 1024 && !pNEO->noAccel) ? 1024 : imlines; pMode = firstMode = pScrn->modes; @@ -95,7 +95,8 @@ NEODGAInit(ScreenPtr pScreen) currentMode->mode = pMode; currentMode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE; - currentMode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT; + if (!pNEO->noAccel) + currentMode->flags |= (DGA_FILL_RECT | DGA_BLIT_RECT); if(pMode->Flags & V_DBLSCAN) currentMode->flags |= DGA_DOUBLESCAN; if(pMode->Flags & V_INTERLACE) diff --git a/xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h b/xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h index 34e15014a..177119499 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h @@ -1,7 +1,7 @@ /* * Id: newport.h,v 1.4 2000/11/29 20:58:10 agx Exp $ */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h,v 1.3 2001/05/04 19:05:42 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h,v 1.8 2001/12/19 21:31:21 dawes Exp $ */ #ifndef __NEWPORT_H__ #define __NEWPORT_H__ @@ -12,6 +12,7 @@ #include "xf86.h" #include "xf86_OSproc.h" #include "xf86_ansic.h" +#include "compiler.h" #include "xf86Resources.h" #include "xf86cmap.h" @@ -27,6 +28,20 @@ #define NEWPORT_BASE_OFFSET 0x0040000 #define NEWPORT_MAX_BOARDS 4 +#if 0 +# define DEBUG 1 +#endif + +#ifdef DEBUG +# define TRACE_ENTER(str) ErrorF("newport: " str " %d\n",pScrn->scrnIndex) +# define TRACE_EXIT(str) ErrorF("newport: " str " done\n") +# define TRACE(str) ErrorF("newport trace: " str "\n") +#else +# define TRACE_ENTER(str) +# define TRACE_EXIT(str) +# define TRACE(str) +#endif + typedef struct { unsigned busID; int bitplanes; @@ -44,11 +59,20 @@ typedef struct { CloseScreenProcPtr CloseScreen; /* newport register backups: */ + npireg_t txt_drawmode0; /* Rex3 drawmode0 register */ npireg_t txt_drawmode1; /* Rex3 drawmode1 register */ + npireg_t txt_wrmask; /* Rex3 write mask register */ + npireg_t txt_smask1x; /* Rex3 screen mask 1 registers */ + npireg_t txt_smask1y; + npireg_t txt_smask2x; /* Rex3 screen mask 2 registers */ + npireg_t txt_smask2y; + npireg_t txt_clipmode; /* Rex3 clip mode register */ + unsigned short txt_vc2ctrl; /* VC2 control register */ - CARD8 txt_xmap9_cfg0; /* 0. Xmap9's control register */ - CARD8 txt_xmap9_cfg1; /* 1. Xmap9's control register */ - CARD8 txt_xmap9_mi; /* Xmap9's mode index register */ + CARD8 txt_xmap9_cfg0; /* 0. Xmap9's control register */ + CARD8 txt_xmap9_cfg1; /* 1. Xmap9's control register */ + CARD8 txt_xmap9_mi; /* Xmap9s' mode index register */ + CARD32 txt_xmap9_mod0; /* Xmap9s' mode 0 register */ LOCO txt_colormap[256]; OptionInfoPtr Options; } NewportRec, *NewportPtr; @@ -62,6 +86,11 @@ void NewportVc2Set(NewportRegsPtr pNewportRegs, unsigned char vc2Ireg, unsigned void NewportWait(NewportRegsPtr pNewportRegs); void NewportBfwait(NewportRegsPtr pNewportRegs); void NewportXmap9SetModeRegister(NewportRegsPtr pNewportRegs, CARD8 address, CARD32 mode); +CARD32 NewportXmap9GetModeRegister(NewportRegsPtr pNewportRegs, unsigned chip, CARD8 address); +void NewportBackupRex3( ScrnInfoPtr pScrn); +void NewportRestoreRex3( ScrnInfoPtr pScrn); +void NewportBackupXmap9s( ScrnInfoPtr pScrn); +void NewportRestoreXmap9s( ScrnInfoPtr pScrn); /* newort_cmap.c */ void NewportLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, @@ -71,5 +100,6 @@ void NewportBackupPalette(ScrnInfoPtr pScrn); /* newport_shadow.c */ void NewportRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox); +void NewportRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox); #endif /* __NEWPORT_H__ */ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c index 7137bb496..909c97b13 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c @@ -5,7 +5,7 @@ * * This driver is based on the newport.c & newport_con.c kernel code * - * (c) 2000 Guido Guenther <guido.guenther@gmx.net> + * (c) 2000,2001 Guido Guenther <agx@sigxcpu.org> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -30,7 +30,7 @@ * Project. * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c,v 1.12 2001/08/07 07:04:48 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c,v 1.19 2002/01/04 21:22:33 tsi Exp $ */ /* function prototypes, common data structures & generic includes */ #include "newport.h" @@ -53,11 +53,11 @@ #include "Xv.h" #define VERSION 4000 -#define NEWPORT_NAME "Newport" +#define NEWPORT_NAME "NEWPORT" #define NEWPORT_DRIVER_NAME "newport" #define NEWPORT_MAJOR_VERSION 0 #define NEWPORT_MINOR_VERSION 1 -#define NEWPORT_PATCHLEVEL 1 +#define NEWPORT_PATCHLEVEL 3 /* Prototypes ------------------------------------------------------- */ @@ -296,6 +296,7 @@ NewportPreInit(ScrnInfoPtr pScrn, int flags) switch( pScrn->depth ) { /* check if the returned depth is one we support */ case 8: + case 24: /* OK */ break; default: @@ -343,7 +344,7 @@ NewportPreInit(ScrnInfoPtr pScrn, int flags) pNewport = NEWPORTPTR(pScrn); pNewport->busID = busID; - /* We use a programamble clock */ + /* We use a programmable clock */ pScrn->progClock = TRUE; /* Fill in pScrn->options) */ @@ -364,7 +365,7 @@ NewportPreInit(ScrnInfoPtr pScrn, int flags) from=X_PROBED; xf86DrvMsg(pScrn->scrnIndex, from, - "Newport Graphics Revisions: Board: %d, Rex3: %d, Cmap: %c, Xmap9: %d\n", + "Newport Graphics Revisions: Board: %d, Rex3: %c, Cmap: %c, Xmap9: %c\n", pNewport->board_rev, pNewport->rex3_rev, pNewport->cmap_rev, pNewport->xmap9_rev); @@ -386,7 +387,8 @@ NewportPreInit(ScrnInfoPtr pScrn, int flags) } /* Set up clock ranges that are alway ok */ - /* XXX: Should use the correct data from the specs(which specs?) here */ + + /* XXX: Use information from VC2 here */ clockRanges = xnfalloc(sizeof(ClockRange)); clockRanges->next = NULL; clockRanges->minClock = 10000; @@ -526,7 +528,8 @@ NewportScreenInit(int index, ScreenPtr pScreen, int argc, char **argv) return FALSE; /* Initialise shadow frame buffer */ - ShadowFBInit(pScreen, &NewportRefreshArea8); + ShadowFBInit(pScreen, (pNewport->Bpp == 1) ? &NewportRefreshArea8 : + &NewportRefreshArea24); #ifdef XvExtension { @@ -632,29 +635,76 @@ NewportModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) if (width != 1280 || height != 1024) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ "Width = %d and height = %d is not supported by by this driver\n", width, height); + return FALSE; } - pScrn->vtSema=TRUE; + pScrn->vtSema = TRUE; /* first backup the necessary registers... */ - pNewport->txt_drawmode1 = pNewportRegs->set.drawmode1; + NewportBackupRex3(pScrn); pNewport->txt_vc2ctrl = NewportVc2Get( pNewportRegs, VC2_IREG_CONTROL); NewportBackupPalette(pScrn); - + if( pNewport->Bpp == 3) { /* at 24bpp we have to backup some more registers */ + NewportBackupXmap9s( pScrn ); + } /* ...then setup the hardware */ - /* - * XXX: set the frambuffer layout to either 24 or 8 bpp here - more specs needed - * XXX: Lazy mode on: simply rely on the prom since it does such a good job - */ - if( pNewport->Bpp == 1) { - pNewport->drawmode1 = pNewport->txt_drawmode1; - } - + pNewport->drawmode1 = DM1_RGBPLANES | + NPORT_DMODE1_CCLT | + NPORT_DMODE1_CCEQ | + NPORT_DMODE1_CCGT | + NPORT_DMODE1_LOSRC; + if( pNewport->Bpp == 1) { /* 8bpp */ + pNewport->drawmode1 |= NPORT_DMODE1_DD8 | + NPORT_DMODE1_HD8 | + NPORT_DMODE1_RWPCKD; + } else { /* 24bpp */ + CARD32 mode = 0L; + + /* tell the xmap9s that we are using 24bpp */ + NewportBfwait(pNewport->pNewportRegs); + pNewportRegs->set.dcbmode = (DCB_XMAP_ALL | R_DCB_XMAP9_PROTOCOL | + XM9_CRS_CONFIG | NPORT_DMODE_W1 ); + pNewportRegs->set.dcbdata0.bytes.b3 &= ~(XM9_8_BITPLANES | XM9_PUPMODE); + NewportBfwait(pNewport->pNewportRegs); + /* set up the mode register for 24bpp */ + mode = XM9_MREG_PIX_SIZE_24BPP | XM9_MREG_PIX_MODE_RGB1 + | XM9_MREG_GAMMA_BYPASS; + NewportXmap9SetModeRegister( pNewportRegs , 0, mode); + /* select the set up mode register */ + NewportBfwait(pNewport->pNewportRegs); + pNewportRegs->set.dcbmode = (DCB_XMAP_ALL | W_DCB_XMAP9_PROTOCOL | + XM9_CRS_MODE_REG_INDEX | NPORT_DMODE_W1 ); + pNewportRegs->set.dcbdata0.bytes.b3 = 0; + + pNewport->drawmode1 |= + /* set drawdepth to 24 bit */ + NPORT_DMODE1_DD24 | + /* turn on RGB mode */ + NPORT_DMODE1_RGBMD | + /* turn on 8888 = RGBA pixel packing */ + NPORT_DMODE1_HD32 | NPORT_DMODE1_RWPCKD; + } + /* blank the framebuffer */ + NewportWait(pNewportRegs); + pNewportRegs->set.drawmode0 = (NPORT_DMODE0_DRAW | NPORT_DMODE0_DOSETUP | + NPORT_DMODE0_STOPX | NPORT_DMODE0_STOPY | + NPORT_DMODE0_BLOCK); + pNewportRegs->set.drawmode1 = pNewport->drawmode1 | + NPORT_DMODE1_FCLR | + NPORT_DMODE1_RGBMD; + pNewportRegs->set.colorvram = 0; + pNewportRegs->set.xystarti = 0; + pNewportRegs->go.xyendi = ( (1279+64) << 16) | 1023; + + /* default drawmode */ + NewportWait(pNewportRegs); + pNewportRegs->set.drawmode1 = pNewport->drawmode1; + return TRUE; } /* - * This will acutally restore the saved state + * This will actually restore the saved state * (either when switching back to a VT or when the server is going down) * Closing is true if the X server is really going down */ @@ -665,9 +715,12 @@ NewportRestore(ScrnInfoPtr pScrn, Bool Closing) NewportRegsPtr pNewportRegs = pNewport->pNewportRegs; /* Restore backed up registers */ - pNewportRegs->set.drawmode1 = pNewport->txt_drawmode1; - NewportVc2Set( pNewportRegs, VC2_IREG_CONTROL, pNewport->txt_vc2ctrl); - NewportRestorePalette(pScrn); + NewportRestoreRex3( pScrn ); + NewportVc2Set( pNewportRegs, VC2_IREG_CONTROL, pNewport->txt_vc2ctrl ); + NewportRestorePalette( pScrn ); + if( pNewport->Bpp == 3) { + NewportRestoreXmap9s( pScrn); + } } @@ -679,14 +732,15 @@ NewportHWProbe(unsigned probedIDs[]) FILE* cpuinfo; char line[80]; unsigned hasNewport = 0; - cpuinfo = fopen("/proc/cpuinfo","r"); - while(fgets(line,80,cpuinfo) != NULL) { - if(strstr(line, "SGI Indy") != NULL) { - hasNewport = 1; - break; + if ((cpuinfo = fopen("/proc/cpuinfo", "r"))) { + while(fgets(line, 80, cpuinfo) != NULL) { + if(strstr(line, "SGI Indy") != NULL) { + hasNewport = 1; + break; + } } + fclose(cpuinfo); } - fclose(cpuinfo); probedIDs[0] = 0; return hasNewport; @@ -707,12 +761,13 @@ static Bool NewportProbeCardInfo(ScrnInfoPtr pScrn) pNewport->bitplanes = ((pNewport->board_rev > 1) && (tmp & 0x80)) ? 8 : 24; cmap_rev = tmp & 7; pNewport->cmap_rev = (char)('A'+(cmap_rev ? (cmap_rev+1):0)); - pNewport->rex3_rev = (pNewportRegs->cset.ustat) & 7; + pNewport->rex3_rev = (char)('A'+(pNewportRegs->cset.ustat & 7)); pNewportRegs->set.dcbmode = (DCB_XMAP0 | R_DCB_XMAP9_PROTOCOL | XM9_CRS_REVISION | NPORT_DMODE_W1); - pNewport->xmap9_rev = (pNewportRegs->set.dcbdata0.bytes.b3) & 7; + pNewport->xmap9_rev = (char)('A'+(pNewportRegs->set.dcbdata0.bytes.b3 & 7)); + /* XXX: read possible modes from VC2 here */ return TRUE; } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/s3virge/s3v_xv.c b/xc/programs/Xserver/hw/xfree86/drivers/s3virge/s3v_xv.c index 8973dfec5..1729ca81c 100755 --- a/xc/programs/Xserver/hw/xfree86/drivers/s3virge/s3v_xv.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/s3virge/s3v_xv.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/s3virge/s3v_xv.c,v 1.4 2001/06/15 21:22:56 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/s3virge/s3v_xv.c,v 1.5 2001/11/21 22:43:00 dawes Exp $ */ /* Copyright (C) 2000 The XFree86 Project, Inc. All Rights Reserved. @@ -106,11 +106,13 @@ void S3VInitVideo(ScreenPtr pScreen) (pScrn->bitsPerPixel == 16) ) && - ((ps3v->Chipset == S3_ViRGE_DXGX) /* || */ - /* S3_ViRGE_GX2_SERIES(ps3v->Chipset) || */ + ((ps3v->Chipset == S3_ViRGE_DXGX) || + S3_ViRGE_MX_SERIES(ps3v->Chipset) || + S3_ViRGE_GX2_SERIES(ps3v->Chipset) /* || */ /* (ps3v->Chipset == S3_ViRGE) */ ) && !ps3v->NoAccel + && ps3v->XVideo ) { #if 0 @@ -649,25 +651,18 @@ S3VStopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown) if(shutdown) { if(pPriv->videoStatus & CLIENT_VIDEO_ON) { -#if 0 - /*OUTREG(MGAREG_BESCTL, 0);*/ - /*OUTREG(SSTREAM_CONTROL_REG, 0x02000000);*/ - - OUTREG(SSTREAM_CONTROL_REG, 0); - /*OUTREG(SSTREAM_STRIDE_REG, 0 );*/ - - /*OUTREG(K1_VSCALE_REG, 0 ); - OUTREG(K2_VSCALE_REG, 0 ); - */ - OUTREG(DDA_VERT_REG, 0 ); - - /*OUTREG(SSTREAM_START_REG, ((dstBox->x1 +1) << 16) | (dstBox->y1 +1)); - OUTREG(SSTREAM_WINDOW_SIZE_REG, 0); - */ -#endif - if ( S3_ViRGE_GX2_SERIES(ps3v->Chipset) ) + if ( S3_ViRGE_GX2_SERIES(ps3v->Chipset) || + S3_ViRGE_MX_SERIES(ps3v->Chipset) + ) { - OUTREG(SSTREAM_CONTROL_REG, 0); + /* Aaarg... It .. won't.. go .. away! */ + /* So let's be creative, make the overlay really */ + /* small and near an edge. */ + /* Size of 0 leaves a window sized vertical stripe */ + /* Size of 1 leaves a single pixel.. */ + OUTREG(SSTREAM_WINDOW_SIZE_REG, 1); + /* And hide it at 0,0 */ + OUTREG(SSTREAM_START_REG, 0 ); } else { @@ -839,30 +834,27 @@ S3VDisplayVideoOverlay( else tmp =2; /* YCbCr-16 */ - if ( S3_ViRGE_GX2_SERIES(ps3v->Chipset) ) - { - OUTREG(SSTREAM_CONTROL_REG, - tmp << 28 | 0x05000000 | 0x800000 | - ((((src_w-1)<<1)-(drw_w-1)) & 0xfff) - ); - } - else - { - OUTREG(SSTREAM_CONTROL_REG, - tmp << 28 | 0x01000000 | - ((((src_w-1)<<1)-(drw_w-1)) & 0xfff) - ); - } + OUTREG(SSTREAM_CONTROL_REG, + tmp << 28 | 0x01000000 | + ((((src_w-1)<<1)-(drw_w-1)) & 0xfff) + ); OUTREG(SSTREAM_STRETCH_REG, - ((src_w - 1) & 0x7ff) | (((src_w-drw_w) & 0x7ff) << 16) + ((src_w - 1) & 0x7ff) | (((src_w-drw_w-1) & 0x7ff) << 16) ); /* Color key on primary */ - if ( S3_ViRGE_GX2_SERIES(ps3v->Chipset) ) + if ( S3_ViRGE_GX2_SERIES(ps3v->Chipset) || + S3_ViRGE_MX_SERIES(ps3v->Chipset) + ) { - /*OUTREG(BLEND_CONTROL_REG, 0x00000000)*/ - ; + /* 100% of secondary, no primary */ + /* gx2/mx can both blend while keying, need to */ + /* select secondary here, otherwise all you'll get */ + /* from the primary is the color key. (And setting */ + /* 0 here gives you black... no primary or secondary. */ + /* Discovered that the hard way!) */ + OUTREG(BLEND_CONTROL_REG, 0x20 ); } else { @@ -875,7 +867,8 @@ S3VDisplayVideoOverlay( OUTREG(K1_VSCALE_REG, src_h-1 ); OUTREG(K2_VSCALE_REG, (src_h - drw_h) & 0x7ff ); - if ( S3_ViRGE_GX2_SERIES(ps3v->Chipset) ) + if ( S3_ViRGE_GX2_SERIES(ps3v->Chipset) || + S3_ViRGE_MX_SERIES(ps3v->Chipset) ) { /* enable vert interp. & bandwidth saving - gx2 */ OUTREG(DDA_VERT_REG, (((~drw_h)-1) & 0xfff ) | @@ -894,14 +887,13 @@ S3VDisplayVideoOverlay( ( ((drw_w-1) << 16) | (drw_h ) ) & 0x7ff07ff ); - /*cep*/ - if ( S3_ViRGE_GX2_SERIES(ps3v->Chipset) ) + if ( S3_ViRGE_GX2_SERIES(ps3v->Chipset) || + S3_ViRGE_MX_SERIES(ps3v->Chipset) + ) { OUTREG(COL_CHROMA_KEY_CONTROL_REG, - /* color key ON */ - /*0xc0000000 | */ - /*0x40000000 | */ - 0x40000000 | + /* color key ON - keying on primary */ + 0x40000000 | /* # bits to compare */ ((pScrn->weight.red-1) << 24) | @@ -934,7 +926,8 @@ S3VDisplayVideoOverlay( ); } - if ( S3_ViRGE_GX2_SERIES(ps3v->Chipset) ) + if ( S3_ViRGE_GX2_SERIES(ps3v->Chipset) || + S3_ViRGE_MX_SERIES(ps3v->Chipset) ) { VGAOUT8(vgaCRIndex, 0x92); VGAOUT8(vgaCRReg, (((pitch + 7) / 8) >> 8) | 0x80); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_accel.c index 70e45b3ec..72db37ec0 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_accel.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/savage/savage_accel.c,v 1.11 2001/08/09 19:14:13 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/savage/savage_accel.c,v 1.14 2001/12/13 18:01:50 eich Exp $ */ /* * @@ -261,6 +261,7 @@ SavageInitialize2DEngine(ScrnInfoPtr pScrn) case S3_SAVAGE4: case S3_PROSAVAGE: + case S3_SUPERSAVAGE: /* Disable BCI */ OUTREG(0x48C18, INREG(0x48C18) & 0x3FF0); /* Program shadow status update */ @@ -435,7 +436,7 @@ SavageInitAccel(ScreenPtr pScreen) xaaptr->Mono8x8PatternFillFlags = 0 | HARDWARE_PATTERN_PROGRAMMED_BITS | HARDWARE_PATTERN_SCREEN_ORIGIN - | BIT_ORDER_IN_BYTE_LSBFIRST + | BIT_ORDER_IN_BYTE_MSBFIRST ; if( psav->Chipset == S3_SAVAGE4 ) xaaptr->Mono8x8PatternFillFlags |= NO_TRANSPARENCY; @@ -508,11 +509,9 @@ SavageInitAccel(ScreenPtr pScreen) | SCANLINE_PAD_DWORD | BIT_ORDER_IN_BYTE_MSBFIRST | LEFT_EDGE_CLIPPING + | ROP_NEEDS_SOURCE ; - if( psav->Chipset == S3_SAVAGE4 ) - xaaptr->ScanlineCPUToScreenColorExpandFillFlags |= ROP_NEEDS_SOURCE; - xaaptr->SetupForScanlineCPUToScreenColorExpandFill = SavageSetupForCPUToScreenColorExpandFill; xaaptr->SubsequentScanlineCPUToScreenColorExpandFill = @@ -913,10 +912,10 @@ SavageSetupForMono8x8PatternFill( mix = XAAHelpPatternROP( pScrn, &fg, &bg, planemask, &rop ); cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP - | BCI_CMD_DEST_GBD | BCI_CMD_PAT_MONO; + | BCI_CMD_DEST_GBD; if( mix & ROP_PAT ) - cmd |= BCI_CMD_SEND_COLOR; + cmd |= BCI_CMD_SEND_COLOR | BCI_CMD_PAT_MONO; if (bg == -1) cmd |= BCI_CMD_PAT_TRANSPARENT; @@ -959,8 +958,11 @@ SavageSubsequentMono8x8PatternFillRect( BCI_SEND(psav->SavedBgColor); BCI_SEND(BCI_X_Y(x, y)); BCI_SEND(BCI_W_H(w, h)); - BCI_SEND(pattern0); - BCI_SEND(pattern1); + if( psav->SavedBciCmd & BCI_CMD_PAT_MONO ) + { + BCI_SEND(pattern0); + BCI_SEND(pattern1); + } } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c index 70ac35563..b058e76ff 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c,v 1.22 2001/08/09 19:14:13 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c,v 1.24 2001/11/02 16:24:51 alanh Exp $ */ /* * vim: sw=4 ts=8 ai ic: * @@ -80,10 +80,10 @@ extern ScrnInfoPtr gpScrn; #define iabs(a) ((int)(a)>0?(a):(-(a))) #define DRIVER_NAME "savage" -#define DRIVER_VERSION "1.1.16" +#define DRIVER_VERSION "1.1.20" #define VERSION_MAJOR 1 #define VERSION_MINOR 1 -#define PATCHLEVEL 16 +#define PATCHLEVEL 20 #define SAVAGE_VERSION ((VERSION_MAJOR << 24) | \ (VERSION_MINOR << 16) | \ PATCHLEVEL) @@ -121,9 +121,17 @@ static SymTabRec SavageChips[] = { { PCI_CHIP_SAVAGE_IX, "Savage/IX" }, { PCI_CHIP_PROSAVAGE_PM, "ProSavage PM133" }, { PCI_CHIP_PROSAVAGE_KM, "ProSavage KM133" }, - /* Twister is a code name; hope I get the real name soon. */ - { PCI_CHIP_S3TWISTER_P, "Twister" }, - { PCI_CHIP_S3TWISTER_K, "TwisterK" }, + { PCI_CHIP_S3TWISTER_P, "ProSavage PN133" }, + { PCI_CHIP_S3TWISTER_K, "ProSavage KN133" }, + { PCI_CHIP_SUPSAV_MX128, "SuperSavage/MX 128" }, + { PCI_CHIP_SUPSAV_MX64, "SuperSavage/MX 64" }, + { PCI_CHIP_SUPSAV_MX64C, "SuperSavage/MX 64C" }, + { PCI_CHIP_SUPSAV_IX128SDR, "SuperSavage/IX 128" }, + { PCI_CHIP_SUPSAV_IX128DDR, "SuperSavage/IX 128" }, + { PCI_CHIP_SUPSAV_IX64SDR, "SuperSavage/IX 64" }, + { PCI_CHIP_SUPSAV_IX64DDR, "SuperSavage/IX 64" }, + { PCI_CHIP_SUPSAV_IXCSDR, "SuperSavage/IXC 64" }, + { PCI_CHIP_SUPSAV_IXCDDR, "SuperSavage/IXC 64" }, { -1, NULL } }; @@ -132,7 +140,8 @@ static SymTabRec SavageChipsets[] = { { S3_SAVAGE4, "Savage4" }, { S3_SAVAGE2000, "Savage2000" }, { S3_SAVAGE_MX, "MobileSavage" }, - { S3_PROSAVAGE, "ProSavage/Twister" }, + { S3_PROSAVAGE, "ProSavage" }, + { S3_SUPERSAVAGE, "SuperSavage" }, { -1, NULL } }; @@ -151,6 +160,15 @@ static PciChipsets SavagePciChipsets[] = { { S3_PROSAVAGE, PCI_CHIP_PROSAVAGE_KM, RES_SHARED_VGA }, { S3_PROSAVAGE, PCI_CHIP_S3TWISTER_P, RES_SHARED_VGA }, { S3_PROSAVAGE, PCI_CHIP_S3TWISTER_K, RES_SHARED_VGA }, + { S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_MX128, RES_SHARED_VGA }, + { S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_MX64, RES_SHARED_VGA }, + { S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_MX64C, RES_SHARED_VGA }, + { S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_IX128SDR, RES_SHARED_VGA }, + { S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_IX128DDR, RES_SHARED_VGA }, + { S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_IX64SDR, RES_SHARED_VGA }, + { S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_IX64DDR, RES_SHARED_VGA }, + { S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_IXCSDR, RES_SHARED_VGA }, + { S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_IXCDDR, RES_SHARED_VGA }, { -1, -1, RES_UNDEFINED } }; @@ -168,7 +186,8 @@ typedef enum { OPTION_SHADOW_FB, OPTION_ROTATE, OPTION_USEBIOS, - OPTION_SHADOW_STATUS + OPTION_SHADOW_STATUS, + OPTION_VIDEORAM } SavageOpts; @@ -182,6 +201,7 @@ static const OptionInfoRec SavageOptions[] = { OPTION_USEBIOS, "UseBIOS", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_LCDCLOCK, "LCDClock", OPTV_FREQ, {0}, FALSE }, { OPTION_SHADOW_STATUS, "ShadowStatus", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_VIDEORAM, "VideoRAM", OPTV_INTEGER, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -231,6 +251,8 @@ static const char *vbeSymbols[] = { static const char *vbeOptSymbols[] = { "vbeModeInit", "VBESetVBEMode", + "VBEGetVBEInfo", + "VBEFreeVBEInfo", NULL }; @@ -841,6 +863,13 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) xf86DrvMsg(pScrn->scrnIndex, from, "%ssing video BIOS to set modes\n", psav->UseBIOS ? "U" : "Not u" ); + pScrn->videoRam = 0; + if( xf86GetOptValInteger(psav->Options, OPTION_VIDEORAM, &pScrn->videoRam ) ) + { + xf86DrvMsg( pScrn->scrnIndex, X_CONFIG, + "Option: VideoRAM %dkB\n", pScrn->videoRam ); + } + psav->LCDClock = 0.0; if( xf86GetOptValFreq( psav->Options, OPTION_LCDCLOCK, OPTUNITS_MHZ, &psav->LCDClock ) ) xf86DrvMsg( pScrn->scrnIndex, X_CONFIG, @@ -925,8 +954,10 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) hwp = VGAHWPTR(pScrn); - if (!SavageMapMMIO(pScrn)) + if (!SavageMapMMIO(pScrn)) { + vbeFree(psav->pVbe); return FALSE; + } vgaHWGetIOBase(hwp); vgaIOBase = hwp->IOBase; @@ -955,8 +986,10 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) { Gamma zeros = {0.0, 0.0, 0.0}; - if (!xf86SetGamma(pScrn, zeros)) + if (!xf86SetGamma(pScrn, zeros)) { + vbeFree(psav->pVbe); return FALSE; + } } /* Unlock system registers. */ @@ -970,11 +1003,23 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) /* Compute the amount of video memory and offscreen memory. */ psav->MemOffScreen = 0; + + if( psav->pVbe ) + { + /* If VBE is available, it is the best judge of onboard memory. */ + + VbeInfoBlock* vib; + + vib = VBEGetVBEInfo( psav->pVbe ); + pScrn->videoRam = vib->TotalMemory * 64; + VBEFreeVBEInfo( vib ); + } + if (!pScrn->videoRam) { static unsigned char RamSavage3D[] = { 8, 4, 4, 2 }; static unsigned char RamSavage4[] = { 2, 4, 8, 12, 16, 32, 64, 32 }; static unsigned char RamSavageMX[] = { 2, 8, 4, 16, 8, 16, 4, 16 }; - static unsigned char RamSavageNB[] = { 0, 2, 4, 8, 16, 32, 2, 2 }; + static unsigned char RamSavageNB[] = { 0, 2, 4, 8, 16, 32, 16, 2 }; switch( psav->Chipset ) { case S3_SAVAGE3D: @@ -1002,6 +1047,14 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) pScrn->videoRam = RamSavageMX[ (config1 & 0x0E) >> 1 ] * 1024; break; + case S3_SUPERSAVAGE: + vbeFree(psav->pVbe); + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Cannot determine video RAM for SuperSavage chips.\n"); + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Please set Option \"VideoRAM\" \"xxxxx\" in XF86Config.\n"); + return FALSE; + case S3_PROSAVAGE: pScrn->videoRam = RamSavageNB[ (config1 & 0xE0) >> 5 ] * 1024; break; @@ -1091,6 +1144,7 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) case S3_SAVAGE4: case S3_PROSAVAGE: + case S3_SUPERSAVAGE: psav->WaitQueue = WaitQueue4; psav->WaitIdle = WaitIdle4; psav->WaitIdleEmpty = WaitIdleEmpty4; @@ -1105,36 +1159,38 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) /* Do the DDC dance. */ - ddc = xf86LoadSubModule(pScrn, "ddc"); - if (ddc) { + if( psav->Chipset != S3_PROSAVAGE ) { + ddc = xf86LoadSubModule(pScrn, "ddc"); + if (ddc) { #if 0 - xf86MonPtr pMon = NULL; + xf86MonPtr pMon = NULL; #endif - - xf86LoaderReqSymLists(ddcSymbols, NULL); + + xf86LoaderReqSymLists(ddcSymbols, NULL); #if 0 /* * On many machines, the attempt to read DDC information via VBE puts the * BIOS access into a state which prevents me from reading mode information. * This is a complete mystery to me. */ - if ((psav->pVbe) - && ((pMon = xf86PrintEDID(vbeDoEDID(psav->pVbe, ddc))) != NULL)) - xf86SetDDCproperties(pScrn,pMon); - else + if ((psav->pVbe) + && ((pMon = xf86PrintEDID(vbeDoEDID(psav->pVbe, ddc))) != NULL)) + xf86SetDDCproperties(pScrn,pMon); + else #endif - if (!SavageDDC1(pScrn->scrnIndex)) { - if ( xf86LoadSubModule(pScrn, "i2c") ) { - xf86LoaderReqSymLists(i2cSymbols,NULL); - if (SavageI2CInit(pScrn)) { - CARD32 temp = (INREG(DDC_REG)); - OUTREG(DDC_REG,(temp | 0x13)); - xf86SetDDCproperties(pScrn,xf86PrintEDID( - xf86DoEDID_DDC2(pScrn->scrnIndex,psav->I2C))); - OUTREG(DDC_REG,temp); - } + if (!SavageDDC1(pScrn->scrnIndex)) { + if ( xf86LoadSubModule(pScrn, "i2c") ) { + xf86LoaderReqSymLists(i2cSymbols,NULL); + if (SavageI2CInit(pScrn)) { + CARD32 temp = (INREG(DDC_REG)); + OUTREG(DDC_REG,(temp | 0x13)); + xf86SetDDCproperties(pScrn,xf86PrintEDID( + xf86DoEDID_DDC2(pScrn->scrnIndex,psav->I2C))); + OUTREG(DDC_REG,temp); + } + } } - } + } } /* Savage ramdac speeds */ @@ -1184,7 +1240,7 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) /* Check LCD panel information */ - if( psav->Chipset == S3_SAVAGE_MX ) + if( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ) { unsigned char cr6b = hwp->readCrtc( hwp, 0x6b ); @@ -1271,6 +1327,7 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) if (i == -1) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86ValidateModes failure\n"); SavageFreeRec(pScrn); + vbeFree(psav->pVbe); return FALSE; } @@ -1279,6 +1336,7 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) if (i == 0 || pScrn->modes == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n"); SavageFreeRec(pScrn); + vbeFree(psav->pVbe); return FALSE; } @@ -1331,6 +1389,7 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) if (xf86LoadSubModule(pScrn, "fb") == NULL) { SavageFreeRec(pScrn); + vbeFree(psav->pVbe); return FALSE; } @@ -1339,6 +1398,7 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) if( !psav->NoAccel ) { if( !xf86LoadSubModule(pScrn, "xaa") ) { SavageFreeRec(pScrn); + vbeFree(psav->pVbe); return FALSE; } xf86LoaderReqSymLists(xaaSymbols, NULL ); @@ -1347,6 +1407,7 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) if (psav->hwcursor) { if (!xf86LoadSubModule(pScrn, "ramdac")) { SavageFreeRec(pScrn); + vbeFree(psav->pVbe); return FALSE; } xf86LoaderReqSymLists(ramdacSymbols, NULL); @@ -1355,11 +1416,13 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) if (psav->shadowFB) { if (!xf86LoadSubModule(pScrn, "shadowfb")) { SavageFreeRec(pScrn); + vbeFree(psav->pVbe); return FALSE; } xf86LoaderReqSymLists(shadowSymbols, NULL); } - + vbeFree(psav->pVbe); + return TRUE; } @@ -1529,7 +1592,7 @@ static void SavageSave(ScrnInfoPtr pScrn) /* Save flat panel expansion regsters. */ - if( psav->Chipset == S3_SAVAGE_MX ) { + if( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ) { int i; for( i = 0; i < 8; i++ ) { VGAOUT8(0x3c4, 0x54+i); @@ -1545,7 +1608,7 @@ static void SavageSave(ScrnInfoPtr pScrn) VGAOUT8(vgaCRReg, cr3a | 0x80); /* now save MIU regs */ - if( psav->Chipset != S3_SAVAGE_MX ) { + if( ! S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ) { save->MMPR0 = INREG(FIFO_CONTROL_REG); save->MMPR1 = INREG(MIU_CONTROL_REG); save->MMPR2 = INREG(STREAMS_TIMEOUT_REG); @@ -1642,7 +1705,7 @@ static void SavageWriteMode(ScrnInfoPtr pScrn, vgaRegPtr vgaSavePtr, /* Patch CR79. These values are magical. */ - if( psav->Chipset != S3_SAVAGE_MX ) + if( !S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ) { VGAOUT8(vgaCRIndex, 0x6d); cr6d = VGAIN8(vgaCRReg); @@ -1689,7 +1752,7 @@ static void SavageWriteMode(ScrnInfoPtr pScrn, vgaRegPtr vgaSavePtr, } if( (psav->Chipset != S3_SAVAGE2000) && - (psav->Chipset != S3_SAVAGE_MX) ) + !S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ) VGAOUT16(vgaCRIndex, (cr79 << 8) | 0x79); /* Make sure 16-bit memory access is enabled. */ @@ -1798,7 +1861,7 @@ static void SavageWriteMode(ScrnInfoPtr pScrn, vgaRegPtr vgaSavePtr, VGAOUT8(0x3c5, restore->SR15); /* Restore flat panel expansion regsters. */ - if( psav->Chipset == S3_SAVAGE_MX ) { + if( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ) { int i; for( i = 0; i < 8; i++ ) { VGAOUT8(0x3c4, 0x54+i); @@ -1941,7 +2004,7 @@ static void SavageWriteMode(ScrnInfoPtr pScrn, vgaRegPtr vgaSavePtr, if (Entering) SavageGEReset(pScrn,0,__LINE__,__FILE__); - if( psav->Chipset != S3_SAVAGE_MX ) + if( !S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ) { VerticalRetraceWait(); OUTREG(FIFO_CONTROL_REG, restore->MMPR0); @@ -2093,6 +2156,7 @@ static Bool SavageScreenInit(int scrnIndex, ScreenPtr pScreen, { ScrnInfoPtr pScrn; SavagePtr psav; + EntityInfoPtr pEnt; int ret; TRACE(("SavageScreenInit()\n")); @@ -2100,6 +2164,9 @@ static Bool SavageScreenInit(int scrnIndex, ScreenPtr pScreen, pScrn = xf86Screens[pScreen->myNum]; psav = SAVPTR(pScrn); + pEnt = xf86GetEntityInfo(pScrn->entityList[0]); + psav->pVbe = VBEInit(NULL, pEnt->index); + SavageEnableMMIO(pScrn); if (!SavageMapFB(pScrn)) @@ -2386,7 +2453,7 @@ static Bool SavageModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) break; case 15: if( - (psav->Chipset == S3_SAVAGE_MX) || + S3_SAVAGE_MOBILE_SERIES(psav->Chipset) || ((psav->Chipset == S3_SAVAGE2000) && (dclk >= 230000)) ) new->CR67 = 0x30; /* 15bpp, 2 pixel/clock */ @@ -2395,7 +2462,7 @@ static Bool SavageModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) break; case 16: if( - (psav->Chipset == S3_SAVAGE_MX) || + S3_SAVAGE_MOBILE_SERIES(psav->Chipset) || ((psav->Chipset == S3_SAVAGE2000) && (dclk >= 230000)) ) new->CR67 = 0x50; /* 16bpp, 2 pixel/clock */ @@ -2604,7 +2671,7 @@ static Bool SavageModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) else new->CR50 |= 0xc1; /* Use GBD */ - if( psav->Chipset == S3_SAVAGE_MX ) + if( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ) new->CR33 = 0x00; else new->CR33 = 0x08; @@ -2646,6 +2713,10 @@ static Bool SavageCloseScreen(int scrnIndex, ScreenPtr pScreen) TRACE(("SavageCloseScreen\n")); + if (psav->pVbe) + vbeFree(psav->pVbe); + psav->pVbe = NULL; + if( psav->AccelInfoRec ) { XAADestroyInfoRec( psav->AccelInfoRec ); psav->AccelInfoRec = NULL; @@ -2902,7 +2973,7 @@ void SavageGEReset(ScrnInfoPtr pScrn, int from_timeout, int line, char *file) } else psav->WaitIdleEmpty(psav); - if (from_timeout && (psav->Chipset != S3_SAVAGE_MX) ) { + if (from_timeout && !S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ) { fifo_control = INREG(FIFO_CONTROL_REG); miu_control = INREG(MIU_CONTROL_REG); streams_timeout = INREG(STREAMS_TIMEOUT_REG); @@ -2931,6 +3002,7 @@ void SavageGEReset(ScrnInfoPtr pScrn, int from_timeout, int line, char *file) break; case S3_SAVAGE4: case S3_PROSAVAGE: + case S3_SUPERSAVAGE: success = (ALT_STATUS_WORD0 & 0x0081ffff) == 0x00800000; break; case S3_SAVAGE2000: @@ -2948,7 +3020,7 @@ void SavageGEReset(ScrnInfoPtr pScrn, int from_timeout, int line, char *file) /* At this point, the FIFO is empty and the engine is idle. */ - if (from_timeout && (psav->Chipset != S3_SAVAGE_MX) ) { + if (from_timeout && !S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ) { OUTREG(FIFO_CONTROL_REG, fifo_control); OUTREG(MIU_CONTROL_REG, miu_control); OUTREG(STREAMS_TIMEOUT_REG, streams_timeout); @@ -3085,6 +3157,7 @@ SavageProbeDDC(ScrnInfoPtr pScrn, int index) if (xf86LoadSubModule(pScrn, "vbe")) { pVbe = VBEInit(NULL,index); ConfiguredMonitor = vbeDoEDID(pVbe, NULL); + vbeFree(pVbe); } } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_regs.h b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_regs.h index e3c896055..27cb69a6d 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_regs.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_regs.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/savage/savage_regs.h,v 1.8 2001/05/15 10:19:39 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/savage/savage_regs.h,v 1.10 2001/11/04 22:17:48 alanh Exp $ */ #ifndef _SAVAGE_REGS_H #define _SAVAGE_REGS_H @@ -11,11 +11,24 @@ #ifndef PCI_CHIP_S3TWISTER_K #define PCI_CHIP_S3TWISTER_K 0x8d02 #endif +#ifndef PCI_CHIP_SUPSAV_MX128 +#define PCI_CHIP_SUPSAV_MX128 0x8c22 +#define PCI_CHIP_SUPSAV_MX64 0x8c24 +#define PCI_CHIP_SUPSAV_MX64C 0x8c26 +#define PCI_CHIP_SUPSAV_IX128SDR 0x8c2a +#define PCI_CHIP_SUPSAV_IX128DDR 0x8c2b +#define PCI_CHIP_SUPSAV_IX64SDR 0x8c2c +#define PCI_CHIP_SUPSAV_IX64DDR 0x8c2d +#define PCI_CHIP_SUPSAV_IXCSDR 0x8c2e +#define PCI_CHIP_SUPSAV_IXCDDR 0x8c2f +#endif #define S3_SAVAGE3D_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE_MX)) #define S3_SAVAGE4_SERIES(chip) ((chip==S3_SAVAGE4) || (chip==S3_PROSAVAGE)) +#define S3_SAVAGE_MOBILE_SERIES(chip) ((chip==S3_SAVAGE_MX) || (chip==S3_SUPERSAVAGE)) + #define S3_SAVAGE_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE2000)) @@ -29,6 +42,7 @@ enum S3CHIPTAGS { S3_SAVAGE_MX, S3_SAVAGE4, S3_PROSAVAGE, + S3_SUPERSAVAGE, S3_SAVAGE2000, S3_LAST }; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/Release.txt b/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/Release.txt index af828eb31..204dba7bd 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/Release.txt +++ b/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/Release.txt @@ -1,3 +1,45 @@ +-------------------------------------------------------------------------------- + Silicon Motion Driver for XFree86 4.1.0 + Alpha Release 1.3.1cz, 11/12/2001 +------------------------------------------------------------------------------- + +Extensions: + +- gamma correction for 24 bit true color mode. + +Known problems: + +- gamma correction does not work for 16 bit true color mode: + LoadPalette gets a gamma correction color table for 5:6:5 RGB, + whereas the SMI RAMDAC wants a 8:8:8 RGB color table. + +- gamma correction only implemented for the Lynx3DM + +- StopVideo don't work. The graphics controller continues to write + into the capture buffer + +Fixed bugs (or new bugs :) ): + +- in SMI_ScreenInit frame buffer size calculation for video changed. + + +-------------------------------------------------------------------------------- + Silicon Motion Driver for XFree86 4.1.0 + Alpha Release 1.3.0cz, 10/26/2001 +------------------------------------------------------------------------------- + +Fixed bugs: + +- XAA: clipping rectangle was clipped to visible screen, so offscreen + pixmaps could not been drawn at with accelerated drawing functions. + +Extensions: + +- smi_video: partly rewritten. + - Support for 7111 + - interlaced video via + - XF86Config Option "Interlaced" or + - attribute XV_INTERLACED -------------------------------------------------------------------------------- Silicon Motion Driver for XFree86 4.0.2 @@ -68,7 +110,7 @@ Fixed bugs: Fixed bugs: -#640 - X Windows shift to the right when start X Windows or apply Rotation. +#640 - X windows shift to the right when start X or apply Rotation. -------------------------------------------------------------------------------- Silicon Motion Driver for XFree86 4.0.1 @@ -89,7 +131,7 @@ Fixed bugs: Fixed bugs: #687 - Blue rectangle appears when video is clipped on thr right edge of screen. -#735 - When resume from sleep, X Windows does not wake up. +#735 - When resume from sleep, X does not wake up. -------------------------------------------------------------------------------- Silicon Motion Driver for XFree86 4.0.1 @@ -186,4 +228,4 @@ frido@siliconmotion.com. Header: //Mercury/Projects/archives/XFree86/4.0/Release.txt-arc 1.33 13 Dec 2000 09:52:48 Frido $ -$XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/Release.txt,v 1.5 2001/02/15 18:20:33 dawes Exp $ +$XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/Release.txt,v 1.7 2001/12/20 21:35:37 eich Exp $ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi.h b/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi.h index c2b6f18c0..e20793f51 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi.h @@ -26,7 +26,7 @@ Silicon Motion shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the XFree86 Project and Silicon Motion. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi.h,v 1.6 2001/05/15 10:19:40 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi.h,v 1.8 2001/12/20 21:35:38 eich Exp $ */ #ifndef _SMI_H #define _SMI_H @@ -95,6 +95,9 @@ typedef struct CARD8 CR90[16], CR9F_2; CARD8 CRA0[14]; CARD8 smiDACMask, smiDacRegs[256][3]; + /* CZ 2.11.2001: for gamma correction */ + CARD8 CCR66; + /* end CZ */ CARD8 smiFont[8192]; CARD32 DPR10, DPR1C, DPR20, DPR24, DPR28, DPR2C, DPR30, DPR3C, DPR40, DPR44; @@ -240,11 +243,13 @@ typedef struct #ifdef XvExtension int videoKey; /* Video chroma key */ Bool ByteSwap; /* Byte swap for ZV port */ + Bool interlaced; /* True: Interlaced Video */ /* XvExtension */ XF86VideoAdaptorPtr ptrAdaptor; /* Pointer to VideoAdapter structure */ void (*BlockHandler)(int i, pointer blockData, pointer pTimeout, pointer pReadMask); + GCPtr videoGC; #endif OptionInfoPtr Options; CARD8 DACmask; @@ -266,7 +271,7 @@ typedef struct "(%d)\n", __LINE__); xf86Break1() #define DEBUG(arg) xf86ErrorFVerb arg #else - #define VERBLEV 2 + #define VERBLEV 4 #define ENTER_PROC(PROCNAME) #define DEBUG_PROC(PROCNAME) #define LEAVE_PROC(PROCNAME) @@ -322,9 +327,10 @@ do \ /******************************************************************************/ /* smi_dac.c */ -void SMI_CommonCalcClock(long freq, int min_m, int min_n1, int max_n1, - int min_n2, int max_n2, long freq_min, long freq_max, - unsigned char * mdiv, unsigned char * ndiv); +void SMI_CommonCalcClock(int scrnIndex, long freq, int min_m, int min_n1, + int max_n1, int min_n2, int max_n2, long freq_min, + long freq_max, unsigned char * mdiv, + unsigned char * ndiv); /* smi_i2c */ Bool SMI_I2CInit(ScrnInfoPtr pScrn); @@ -333,6 +339,7 @@ Bool SMI_I2CInit(ScrnInfoPtr pScrn); Bool SMI_AccelInit(ScreenPtr pScrn); void SMI_AccelSync(ScrnInfoPtr pScrn); void SMI_GEReset(ScrnInfoPtr pScrn, int from_timeout, int line, char *file); +void SMI_EngineReset(ScrnInfoPtr); /* smi_hwcurs.c */ Bool SMI_HWCursorInit(ScreenPtr pScrn); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_accel.c index 7712742a3..59097d610 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_accel.c @@ -26,7 +26,7 @@ Silicon Motion shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the XFree86 Project and silicon Motion. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_accel.c,v 1.4 2001/02/15 18:20:33 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_accel.c,v 1.6 2001/12/20 21:35:38 eich Exp $ */ #include "smi.h" @@ -35,7 +35,6 @@ authorization from the XFree86 Project and silicon Motion. #include "xaarop.h" #include "servermd.h" -static void SMI_EngineReset(ScrnInfoPtr); static void SMI_SetupForScreenToScreenCopy(ScrnInfoPtr, int, int, int, unsigned int, int); @@ -73,9 +72,9 @@ SMI_AccelInit(ScreenPtr pScreen) XAAInfoRecPtr infoPtr; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; SMIPtr pSmi = SMIPTR(pScrn); - BoxRec AvailFBArea; + /*BoxRec AvailFBArea;*/ Bool ret; - int numLines, maxLines; + /*int numLines, maxLines;*/ ENTER_PROC("SMI_AccelInit"); @@ -197,6 +196,10 @@ SMI_AccelInit(ScreenPtr pScreen) SMI_EngineReset(pScrn); + + /* CZ 18.06.2001: moved to smi_driver.c before the NoAccel question + to have offscreen framebuffer in NoAccel mode */ +#if 0 maxLines = pSmi->FBReserved / (pSmi->width * pSmi->Bpp); if (pSmi->rotate) { @@ -221,6 +224,7 @@ SMI_AccelInit(ScreenPtr pScreen) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FrameBuffer Box: %d,%d - %d,%d\n", AvailFBArea.x1, AvailFBArea.y1, AvailFBArea.x2, AvailFBArea.y2); xf86InitFBManager(pScreen, &AvailFBArea); +#endif ret = XAAInit(pScreen, infoPtr); if (ret && pSmi->shadowFB) /* #671 */ @@ -245,7 +249,7 @@ SMI_GEReset(ScrnInfoPtr pScrn, int from_timeout, int line, char *file) { if (pSmi->GEResetCnt++ < 10 || xf86GetVerbosity() > 1) { - ErrorF("\tSMI_GEReset called from %s line %d\n", file, line); + xf86DrvMsg(pScrn->scrnIndex,X_INFO,"\tSMI_GEReset called from %s line %d\n", file, line); } } else @@ -277,7 +281,7 @@ SMI_AccelSync(ScrnInfoPtr pScrn) LEAVE_PROC("SMI_AccelSync"); } -static void +void SMI_EngineReset(ScrnInfoPtr pScrn) { SMIPtr pSmi = SMIPTR(pScrn); @@ -878,10 +882,12 @@ SMI_SetClippingRectangle(ScrnInfoPtr pScrn, int left, int top, int right, DEBUG((VERBLEV, "left=%d top=%d right=%d bottom=%d\n", left, top, right, bottom)); + /* CZ 26.10.2001: this code prevents offscreen pixmaps being drawn ??? left = max(left, 0); top = max(top, 0); right = min(right, pSmi->width); bottom = min(bottom, pSmi->height); + */ if (pScrn->bitsPerPixel == 24) { diff --git a/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_driver.c index 528bbc1d1..328dd7eed 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_driver.c @@ -26,7 +26,7 @@ Silicon Motion shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The XFree86 Project or Silicon Motion. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_driver.c,v 1.15 2001/08/07 07:04:50 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_driver.c,v 1.20 2002/01/04 21:22:34 tsi Exp $ */ #include "xf86Resources.h" #include "xf86RAC.h" @@ -82,12 +82,12 @@ static void SMI_FreeScreen(int ScrnIndex, int flags); static void SMI_ProbeDDC(ScrnInfoPtr pScrn, int index); -#define SILICONMOTION_NAME "Silicon Motion" +#define SILICONMOTION_NAME "Silicon Motion" #define SILICONMOTION_DRIVER_NAME "siliconmotion" -#define SILICONMOTION_VERSION_NAME "1.2.2" +#define SILICONMOTION_VERSION_NAME "1.3.1" #define SILICONMOTION_VERSION_MAJOR 1 -#define SILICONMOTION_VERSION_MINOR 2 -#define SILICONMOTION_PATCHLEVEL 2 +#define SILICONMOTION_VERSION_MINOR 3 +#define SILICONMOTION_PATCHLEVEL 1 #define SILICONMOTION_DRIVER_VERSION ( (SILICONMOTION_VERSION_MAJOR << 24) \ | (SILICONMOTION_VERSION_MINOR << 16) \ | (SILICONMOTION_PATCHLEVEL) \ @@ -153,6 +153,9 @@ typedef enum #ifdef XvExtension OPTION_VIDEOKEY, OPTION_BYTESWAP, + /* CZ 26.10.2001: interlaced video */ + OPTION_INTERLACED, + /* end CZ */ #endif OPTION_USEBIOS, OPTION_ZOOMONLCD, @@ -177,6 +180,9 @@ static const OptionInfoRec SMIOptions[] = #ifdef XvExtension { OPTION_VIDEOKEY, "VideoKey", OPTV_INTEGER, {0}, FALSE }, { OPTION_BYTESWAP, "ByteSwap", OPTV_BOOLEAN, {0}, FALSE }, + /* CZ 26.10.2001: interlaced video */ + { OPTION_INTERLACED, "Interlaced", OPTV_BOOLEAN, {0}, FALSE }, + /* end CZ */ #endif { OPTION_USEBIOS, "UseBIOS", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_ZOOMONLCD, "ZoomOnLCD", OPTV_BOOLEAN, {0}, FALSE }, @@ -621,7 +627,7 @@ SMI_PreInit(ScrnInfoPtr pScrn, int flags) return(FALSE); } - /* We use a programamble clock */ + /* We use a programmable clock */ pScrn->progClock = TRUE; /* Collect all of the relevant option flags (fill in pScrn->options) */ @@ -808,6 +814,18 @@ SMI_PreInit(ScrnInfoPtr pScrn, int flags) { pSmi->ByteSwap = FALSE; } + + /* CZ 26.10.2001: interlaced video */ + if (xf86ReturnOptValBool(pSmi->Options, OPTION_INTERLACED, FALSE)) + { + pSmi->interlaced = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: Interlaced enabled.\n"); + } + else + { + pSmi->interlaced = FALSE; + } + /* end CZ */ #endif if (xf86GetOptValBool(pSmi->Options, OPTION_USEBIOS, &pSmi->useBIOS)) @@ -841,13 +859,7 @@ SMI_PreInit(ScrnInfoPtr pScrn, int flags) LEAVE_PROC("SMI_PreInit"); return(FALSE); } - - if (xf86LoadSubModule(pScrn, "int10")) - { - xf86LoaderReqSymLists(int10Symbols, NULL); - pSmi->pInt = xf86InitInt10(pEnt->index); - } - + if (xf86LoadSubModule(pScrn, "vbe")) { xf86LoaderReqSymLists(vbeSymbols, NULL); @@ -1309,6 +1321,10 @@ SMI_EnterVT(int scrnIndex, int flags) SMI_RefreshArea(pScrn, 1, &box); } + /* Reset the grapics engine */ + if (!pSmi->NoAccel) + SMI_EngineReset(pScrn); + LEAVE_PROC("SMI_EnterVT"); return(ret); } @@ -1462,6 +1478,12 @@ SMI_Save(ScrnInfoPtr pScrn) } } + /* CZ 2.11.2001: for gamma correction (TODO: other chipsets?) */ + if (pSmi->Chipset == SMI_LYNX3DM) { + save->CCR66 = VGAIN8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x66); + } + /* end CZ */ + save->DPR10 = READ_DPR(pSmi, 0x10); save->DPR1C = READ_DPR(pSmi, 0x1C); save->DPR20 = READ_DPR(pSmi, 0x20); @@ -1487,12 +1509,12 @@ SMI_Save(ScrnInfoPtr pScrn) pSmi->ModeStructInit = TRUE; } - if (pSmi->useBIOS && (pSmi->pInt != NULL)) + if (pSmi->useBIOS && (pSmi->pVbe != NULL)) { - pSmi->pInt->num = 0x10; - pSmi->pInt->ax = 0x0F00; - xf86ExecX86int10(pSmi->pInt); - save->mode = pSmi->pInt->ax & 0x007F; + pSmi->pVbe->pInt10->num = 0x10; + pSmi->pVbe->pInt10->ax = 0x0F00; + xf86ExecX86int10(pSmi->pVbe->pInt10); + save->mode = pSmi->pVbe->pInt10->ax & 0x007F; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Current mode 0x%02X.\n", save->mode); } @@ -1532,13 +1554,14 @@ SMI_WriteMode(ScrnInfoPtr pScrn, vgaRegPtr vgaSavePtr, SMIRegPtr restore) /* Wait for engine to become idle */ WaitIdle(); - if (pSmi->useBIOS && (pSmi->pInt != NULL) && (restore->mode != 0)) + if (pSmi->useBIOS && (pSmi->pVbe->pInt10 != NULL) + && (restore->mode != 0)) { - pSmi->pInt->num = 0x10; - pSmi->pInt->ax = restore->mode | 0x80; + pSmi->pVbe->pInt10->num = 0x10; + pSmi->pVbe->pInt10->ax = restore->mode | 0x80; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Setting mode 0x%02X\n", restore->mode); - xf86ExecX86int10(pSmi->pInt); + xf86ExecX86int10(pSmi->pVbe->pInt10); /* Enable linear mode. */ outb(VGA_SEQ_INDEX, 0x18); @@ -1660,6 +1683,12 @@ SMI_WriteMode(ScrnInfoPtr pScrn, vgaRegPtr vgaSavePtr, SMIRegPtr restore) } } + /* CZ 2.11.2001: for gamma correction (TODO: other chipsets?) */ + if (pSmi->Chipset == SMI_LYNX3DM) { + VGAOUT8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x66, restore->CCR66); + } + /* end CZ */ + VGAOUT8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x81, 0x00); WRITE_DPR(pSmi, 0x10, restore->DPR10); @@ -1939,7 +1968,8 @@ SMI_ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; SMIPtr pSmi = SMIPTR(pScrn); - + EntityInfoPtr pEnt; + ENTER_PROC("SMI_ScreenInit"); /* Map MMIO regs and framebuffer */ @@ -1949,9 +1979,14 @@ SMI_ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) return(FALSE); } + pEnt = xf86GetEntityInfo(pScrn->entityList[0]); + /* Save the chip/graphics state */ SMI_Save(pScrn); - + + if (!pSmi->pVbe) { + pSmi->pVbe = VBEInit(NULL, pEnt->index); + } /* Zero the frame buffer, #258 */ memset(pSmi->FBBase, 0, pSmi->videoRAMBytes); @@ -2042,20 +2077,55 @@ SMI_ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) /* must be after RGB ordering fixed */ fbPictureInit(pScreen, 0, 0); #endif + + /* CZ 18.06.2001: moved here from smi_accel.c to have offscreen + framebuffer in NoAccel mode */ + { + int numLines, maxLines; + BoxRec AvailFBArea; + + maxLines = pSmi->FBReserved / (pSmi->width * pSmi->Bpp); + if (pSmi->rotate) { + numLines = maxLines; + } else { + /* CZ 3.11.2001: What does the following code? see also smi_video.c aaa line 1226 */ +/*#if defined(XvExtension) && SMI_USE_VIDEO */ +#if 0 + numLines = ((pSmi->FBReserved - pSmi->width * pSmi->Bpp + * pSmi->height) * 25 / 100 + pSmi->width + * pSmi->Bpp - 1) / (pSmi->width * pSmi->Bpp); + numLines += pSmi->height; +#else + numLines = maxLines; +#endif + } + + AvailFBArea.x1 = 0; + AvailFBArea.y1 = 0; + AvailFBArea.x2 = pSmi->width; + AvailFBArea.y2 = numLines; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FrameBuffer Box: %d,%d - %d,%d\n", + AvailFBArea.x1, AvailFBArea.y1, AvailFBArea.x2, + AvailFBArea.y2); + xf86InitFBManager(pScreen, &AvailFBArea); + } + /* end CZ */ + + /* Initialize acceleration layer */ - if (!pSmi->NoAccel) - { - if (!SMI_AccelInit(pScreen)) - { - LEAVE_PROC("SMI_ScreenInit"); - return(FALSE); + if (!pSmi->NoAccel) { + if (!SMI_AccelInit(pScreen)) { + LEAVE_PROC("SMI_ScreenInit"); + return(FALSE); } } + miInitializeBackingStore(pScreen); - + /* hardware cursor needs to wrap this layer */ - SMI_DGAInit(pScreen); - + SMI_DGAInit(pScreen); + /* Initialise cursor functions */ miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); @@ -2097,8 +2167,9 @@ SMI_ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) /* Initialize colormap layer. Must follow initialization of the default * colormap. And SetGamma call, else it will load palette with solid white. */ - if (!xf86HandleColormaps(pScreen, 256, 6, SMI_LoadPalette, NULL, - CMAP_RELOAD_ON_MODE_SWITCH)) + /* CZ 2.11.2001: CMAP_PALETTED_TRUECOLOR for gamma correction */ + if (!xf86HandleColormaps(pScreen, 256, pScrn->rgbBits, SMI_LoadPalette, NULL, + CMAP_RELOAD_ON_MODE_SWITCH | CMAP_PALETTED_TRUECOLOR)) { LEAVE_PROC("SMI_ScreenInit"); return(FALSE); @@ -2113,14 +2184,14 @@ SMI_ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "DPMS initialization failed!\n"); } - SMI_InitVideo(pScreen); + SMI_InitVideo(pScreen); /* Report any unused options (only for the first generation) */ if (serverGeneration == 1) { xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); } - + LEAVE_PROC("SMI_ScreenInit"); return(TRUE); } @@ -2468,6 +2539,29 @@ SMI_ModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) } } + + /* CZ 2.11.2001: for gamma correction (TODO: other chipsets?) */ + new->CCR66 = VGAIN8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x66); + if (pSmi->Chipset == SMI_LYNX3DM) { + switch (pScrn->bitsPerPixel) { + case 8: + new->CCR66 = (new->CCR66 & 0xF3) | 0x00; /* 6 bits-RAM */ + break; + case 16: + new->CCR66 = (new->CCR66 & 0xF3) | 0x00; /* 6 bits-RAM */ + /* no Gamma correction in 16 Bit mode (s. Release.txt 1.3.1) */ + break; + case 24: + case 32: + new->CCR66 = (new->CCR66 & 0xF3) | 0x04; /* Gamma correct ON */ + break; + default: + LEAVE_PROC("SMI_ModeInit"); + return(FALSE); + } + } + /* end CZ */ + outb(VGA_SEQ_INDEX, 0x30); if (inb(VGA_SEQ_DATA) & 0x01) { @@ -2476,8 +2570,9 @@ SMI_ModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) if (pSmi->MCLK > 0) { - SMI_CommonCalcClock(pSmi->MCLK, 1, 1, 31, 0, 2, pSmi->minClock, - pSmi->maxClock, &new->SR6A, &new->SR6B); + SMI_CommonCalcClock(pScrn->scrnIndex,pSmi->MCLK, + 1, 1, 31, 0, 2, pSmi->minClock, + pSmi->maxClock, &new->SR6A, &new->SR6B); } else { @@ -2682,9 +2777,10 @@ SMI_CloseScreen(int scrnIndex, ScreenPtr pScreen) { xfree(pSmi->DGAModes); } - if (pSmi->pInt != NULL) + if (pSmi->pVbe != NULL) { - xf86FreeInt10(pSmi->pInt); + vbeFree(pSmi->pVbe); + pSmi->pVbe = NULL; } #ifdef XvExtension if (pSmi->ptrAdaptor != NULL) @@ -2698,7 +2794,9 @@ SMI_CloseScreen(int scrnIndex, ScreenPtr pScreen) #endif if (pSmi->I2C != NULL) { - xf86DestroyI2CBusRec(pSmi->I2C, TRUE, TRUE); + xf86DestroyI2CBusRec(pSmi->I2C, FALSE, TRUE); + xfree(pSmi->I2C); + pSmi->I2C = NULL; } /* #670 */ if (pSmi->pSaveBuffer) @@ -2803,6 +2901,8 @@ SMI_LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies, LOCO *colors, for(i = 0; i < numColors; i++) { + DEBUG((VERBLEV, "pal[%d] = %d %d %d\n", indicies[i], + colors[indicies[i]].red, colors[indicies[i]].green, colors[indicies[i]].blue)); VGAOUT8(pSmi, VGA_DAC_WRITE_ADDR, indicies[i]); VGAOUT8(pSmi, VGA_DAC_DATA, colors[indicies[i]].red); VGAOUT8(pSmi, VGA_DAC_DATA, colors[indicies[i]].green); @@ -2994,31 +3094,31 @@ SMI_DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, } #if 1 /* PDR#735 */ - if (pSmi->pInt != NULL) + if (pSmi->pVbe->pInt10 != NULL) { - pSmi->pInt->ax = 0x4F10; + pSmi->pVbe->pInt10->ax = 0x4F10; switch (PowerManagementMode) { case DPMSModeOn: - pSmi->pInt->bx = 0x0001; + pSmi->pVbe->pInt10->bx = 0x0001; break; case DPMSModeStandby: - pSmi->pInt->bx = 0x0101; + pSmi->pVbe->pInt10->bx = 0x0101; break; case DPMSModeSuspend: - pSmi->pInt->bx = 0x0201; + pSmi->pVbe->pInt10->bx = 0x0201; break; case DPMSModeOff: - pSmi->pInt->bx = 0x0401; + pSmi->pVbe->pInt10->bx = 0x0401; break; } - pSmi->pInt->cx = 0x0000; - pSmi->pInt->num = 0x10; - xf86ExecX86int10(pSmi->pInt); - if (pSmi->pInt->ax == 0x004F) + pSmi->pVbe->pInt10->cx = 0x0000; + pSmi->pVbe->pInt10->num = 0x10; + xf86ExecX86int10(pSmi->pVbe->pInt10); + if (pSmi->pVbe->pInt10->ax == 0x004F) { pSmi->CurrentDPMS = PowerManagementMode; #if 1 /* PDR#835 */ @@ -3139,6 +3239,7 @@ SMI_ProbeDDC(ScrnInfoPtr pScrn, int index) { pVbe = VBEInit(NULL, index); ConfiguredMonitor = vbeDoEDID(pVbe, NULL); + vbeFree(pVbe); } } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_video.c b/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_video.c index fce6644db..23e7cfc23 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_video.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_video.c @@ -3,6 +3,7 @@ /* Copyright (C) 1994-1999 The XFree86 Project, Inc. All Rights Reserved. Copyright (C) 2000 Silicon Motion, Inc. All Rights Reserved. +Copyright (C) 2001 Corvin Zahn. 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 @@ -26,25 +27,83 @@ Silicon Motion shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the XFree86 Project and silicon Motion. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_video.c,v 1.5 2001/06/15 21:22:58 dawes Exp $ */ + +/* +this is a heavy modified version of the V1.2.2 original siliconmotion driver. +- SAA7111 support +- supports attributes: XV_ENCODING, XV_BRIGHTNESS, XV_CONTRAST, + XV_SATURATION, XV_HUE, XV_COLORKEY, XV_INTERLACED +- bug fixes +- tries not to use acceleration functions (if USE_XAA = 0) +- interlaced video for double vertical resolution + +Author of changes: Corvin Zahn <zahn@zac.de> +Date: 2.11.2001 +*/ + +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_video.c,v 1.6 2001/12/20 21:35:39 eich Exp $ */ #include "smi.h" #include "smi_video.h" + +/* + +new attribute: + +XV_INTERLACED = 0: only one field of an interlaced video signal is displayed: + -> half vertical resolution, but no comb like artifacts from + moving vertical edges +XV_INTERLACED = 1: both fields of an interlaced video signal are displayed: + -> full vertical resolution, but comb like artifacts from + moving vertical edges + +The default value can be set with the driver option Interlaced + +*/ + + + + +#undef MIN +#undef ABS +#undef CLAMP +#undef ENTRIES + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define ABS(n) (((n) < 0) ? -(n) : (n)) +#define CLAMP(v, min, max) (((v) < (min)) ? (min) : MIN(v, max)) + +#define ENTRIES(array) (sizeof(array) / sizeof((array)[0])) #define nElems(x) (sizeof(x) / sizeof(x[0])) + #define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) #if defined(XvExtension) && SMI_USE_VIDEO +/* USE_XAA = 1: use XAA functions for color key rectangle fill, + USE_XAA = 0: use xf86XVFillKeyHelper for color key rectangle fill, + needs common/xf86xv.c >= 1.30, + common/xf86xv.h >= 1.22, + loader/xf86sym.c >= 1.194 */ +#define USE_XAA 1 + #include "dixstruct.h" +#if USE_XAA #include "xaa.h" #include "xaalocal.h" +#endif + + +static int SMI_AddEncoding(XF86VideoEncodingPtr enc, int i, + int norm, int input, int channel); +static void SMI_BuildEncodings(SMI_PortPtr p); static XF86VideoAdaptorPtr SMI_SetupVideo(ScreenPtr pScreen); static void SMI_ResetVideo(ScrnInfoPtr pScrn); #if SMI_USE_CAPTURE -static int SMI_GetVideo(ScrnInfoPtr pScrn, +static int SMI_PutVideo(ScrnInfoPtr pScrn, short vid_x, short vid_y, short drw_x, short drw_y, short vid_w, short vid_h, short drw_w, short drw_h, RegionPtr clipBoxes, pointer data); @@ -76,8 +135,8 @@ static void SMI_DisplayVideo(ScrnInfoPtr pScrn, int id, int offset, static void SMI_BlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadMask); static void SMI_WaitForSync(ScrnInfoPtr pScrn); -static int SMI_SendI2C(ScrnInfoPtr pScrn, CARD8 device, char *devName, - SMI_I2CDataPtr i2cData); +/*static int SMI_SendI2C(ScrnInfoPtr pScrn, CARD8 device, char *devName, + SMI_I2CDataPtr i2cData);*/ static void SMI_InitOffscreenImages(ScreenPtr pScreen); static FBAreaPtr SMI_AllocateMemory(ScrnInfoPtr pScrn, FBAreaPtr area, @@ -100,92 +159,86 @@ static int SMI_StopSurface(XF86SurfacePtr surface); static int SMI_GetSurfaceAttribute(ScrnInfoPtr pScrn, Atom attr, INT32 *value); static int SMI_SetSurfaceAttribute(ScrnInfoPtr pScrn, Atom attr, INT32 value); -static Atom xvColorKey, xvBrightness; +static int SetAttr(ScrnInfoPtr pScrn, int i, int value); +static int SetAttrSAA7110(ScrnInfoPtr pScrn, int i, int value); +static int SetAttrSAA7111(ScrnInfoPtr pScrn, int i, int value); + +/** + * Atoms + */ + +static Atom xvColorKey; +static Atom xvEncoding; +static Atom xvBrightness, xvContrast, xvSaturation, xvHue; +static Atom xvInterlaced; + /******************************************************************************\ ** ** -** X V E X T E N S I O N I N T E R F A C E ** +** C A P A B I L I T I E S ** ** ** \******************************************************************************/ -void SMI_InitVideo(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - SMIPtr psmi = SMIPTR(pScrn); - XF86VideoAdaptorPtr *ptrAdaptors, *newAdaptors = NULL; - XF86VideoAdaptorPtr newAdaptor = NULL; - int numAdaptors; - ENTER_PROC("SMI_InitVideo"); +/**************************************************************************/ +/* input channels */ - numAdaptors = xf86XVListGenericAdaptors(pScrn, &ptrAdaptors); +#define N_COMPOSITE_CHANNELS 4 +#define N_SVIDEO_CHANNELS 2 - if ( (psmi->rotate == 0) - && !psmi->NoAccel - ) - { - newAdaptor = SMI_SetupVideo(pScreen); - SMI_InitOffscreenImages(pScreen); - } +#define N_VIDEO_INPUTS 2 +typedef enum _VideoInput { COMPOSITE, SVIDEO } VideoInput; - if (newAdaptor != NULL) - { - if (numAdaptors == 0) - { - numAdaptors = 1; - ptrAdaptors = &newAdaptor; - } - else - { - newAdaptors = xalloc((numAdaptors + 1) * - sizeof(XF86VideoAdaptorPtr*)); - if (newAdaptors != NULL) - { - memcpy(newAdaptors, ptrAdaptors, - numAdaptors * sizeof(XF86VideoAdaptorPtr)); - newAdaptors[numAdaptors++] = newAdaptor; - ptrAdaptors = newAdaptors; - } - } - } - if (numAdaptors != 0) - { - xf86XVScreenInit(pScreen, ptrAdaptors, numAdaptors); - } +/**************************************************************************/ +/* video input formats */ - if (newAdaptors != NULL) - { - xfree(newAdaptors); - } +typedef struct _VideoInputDataRec { + char* name; +} VideoInputDataRec; - LEAVE_PROC("SMI_InitVideo"); -} +static VideoInputDataRec VideoInputs[] = { + { "composite" }, + { "svideo" } +}; -/******************************************************************************\ -** ** -** C A P A B I L I T I E S ** -** ** -\******************************************************************************/ -static XF86VideoEncodingRec SMI_VideoEncodings[] = +/**************************************************************************/ +/* video norms */ + +#define N_VIDEO_NORMS 3 +typedef enum _VideoNorm { PAL, NTSC, SECAM } VideoNorm; + +typedef struct _VideoNormDataRec { + char* name; + unsigned long Wt; + unsigned long Wa; + unsigned long Ht; + unsigned long Ha; + unsigned long HStart; + unsigned long VStart; + XvRationalRec rate; +} VideoNormDataRec; + + +static VideoNormDataRec VideoNorms[] = { -#if SMI_USE_CAPTURE - { - SMI_VIDEO_VIDEO, /* id */ - "XV_VIDEO", /* name */ - 1024, 1024, /* width, height */ - {1, 1} /* rate */ - }, -#endif - { - SMI_VIDEO_IMAGE, /* id */ - "XV_IMAGE", /* name */ - 1024, 1024, /* width, height */ - {1, 1} /* rate */ - }, + /* PAL-BDGHI */ + {"pal", 864, 704, 625, 576, 16, 16, { 1, 50 }}, + /* NTSC */ + {"ntsc", 858, 704, 525, 480, 21, 8, { 1001, 60000 }}, + /* SECAM (not tested) */ + {"secam", 864, 7040, 625, 576, 31, 16, { 1, 50 }}, }; + +/**************************************************************************/ +/* number of (generated) XV_ENCODING vaulues */ +#define N_ENCODINGS ((N_VIDEO_NORMS) * (N_COMPOSITE_CHANNELS + N_SVIDEO_CHANNELS)) + + +/**************************************************************************/ + static XF86VideoFormatRec SMI_VideoFormats[] = { { 15, TrueColor }, /* depth, class */ @@ -193,20 +246,35 @@ static XF86VideoFormatRec SMI_VideoFormats[] = { 24, TrueColor }, /* depth, class */ }; -static XF86AttributeRec SMI_VideoAttributes[] = -{ - { - XvSettable | XvGettable, /* flags */ - 0x000000, 0xFFFFFF, /* min_value, max_value */ - "XV_COLORKEY" /* name */ - }, - { - XvSettable | XvGettable, /* flags */ - -128, 127, /* min_value, max_value */ - "XV_BRIGHTNESS" /* name */ - }, + +/**************************************************************************/ + +/** + * Attributes + */ + +#define XV_ENCODING_NAME "XV_ENCODING" +#define XV_BRIGHTNESS_NAME "XV_BRIGHTNESS" +#define XV_CONTRAST_NAME "XV_CONTRAST" +#define XV_SATURATION_NAME "XV_SATURATION" +#define XV_HUE_NAME "XV_HUE" +#define XV_COLORKEY_NAME "XV_COLORKEY" +#define XV_INTERLACED_NAME "XV_INTERLACED" + + +/* fixed order! */ +static XF86AttributeRec SMI_VideoAttributes[N_ATTRS] = { + {XvSettable | XvGettable, 0, N_ENCODINGS-1, XV_ENCODING_NAME}, + {XvSettable | XvGettable, 0, 255, XV_BRIGHTNESS_NAME}, + {XvSettable | XvGettable, 0, 127, XV_CONTRAST_NAME}, + {XvSettable | XvGettable, 0, 127, XV_SATURATION_NAME}, + {XvSettable | XvGettable, -128, 127, XV_HUE_NAME}, + {XvSettable | XvGettable, 0x000000, 0xFFFFFF, XV_COLORKEY_NAME}, + {XvSettable | XvGettable, 0, 1, XV_INTERLACED_NAME}, }; + +/**************************************************************************/ static XF86ImageRec SMI_VideoImages[] = { XVIMAGE_YUY2, @@ -290,32 +358,430 @@ static XF86ImageRec SMI_VideoImages[] = }, }; -SMI_I2CDataRec data_SAA7110[] = + +/**************************************************************************/ + +/** + * SAA7111 video decoder register values + */ + + +/** SAA7111 control sequences for selecting one out of four + composite input channels */ +static I2CByte SAA7111CompositeChannelSelect[N_COMPOSITE_CHANNELS][4] = { + { 0x02, 0xC0, 0x09, 0x4A}, /* CVBS AI11 */ + { 0x02, 0xC1, 0x09, 0x4A}, /* CVBS AI12 */ + { 0x02, 0xC2, 0x09, 0x4A}, /* CVBS AI21 */ + { 0x02, 0xC3, 0x09, 0x4A}, /* CVBS AI22 */ +}; + + +/** SAA7111 control sequences for selecting one out of two + s-video input channels */ +static I2CByte SAA7111SVideoChannelSelect[N_SVIDEO_CHANNELS][4] = { + { 0x02, 0xC6, 0x09, 0xCA}, /* Y/C AI11/AI21 */ + { 0x02, 0xC7, 0x09, 0xCA}, /* Y/C AI12/AI22 */ +}; + + +/** SAA7111 control sequences for selecting one out of three + video norms */ +static I2CByte SAA7111VideoStd[3][8] = { + {0x06, 108, 0x07, 108, 0x08, 0x09, 0x0E, 0x01}, /* PAL */ + {0x06, 107, 0x07, 107, 0x08, 0x49, 0x0E, 0x01}, /* NTSC */ + {0x06, 108, 0x07, 108, 0x08, 0x01, 0x0E, 0x51} /* SECAM */ +}; + + + +static I2CByte SAA7110InitData[] = { /* Configuration */ - { 0x00, 0x4C }, { 0x01, 0x3C }, { 0x02, 0x00 }, { 0x03, 0xEF }, - { 0x04, 0xBD }, { 0x05, 0xE2 }, { 0x06, 0x00 }, { 0x07, 0x00 }, - { 0x08, 0xF8 }, { 0x09, 0xF8 }, { 0x0A, 0x60 }, { 0x0B, 0x60 }, - { 0x0C, 0x00 }, { 0x0D, 0x80 }, { 0x0E, 0x18 }, { 0x0F, 0xD9 }, - { 0x10, 0x00 }, { 0x11, 0x2B }, { 0x12, 0x40 }, { 0x13, 0x40 }, - { 0x14, 0x42 }, { 0x15, 0x1A }, { 0x16, 0xFF }, { 0x17, 0xDA }, - { 0x18, 0xE6 }, { 0x19, 0x90 }, { 0x20, 0xD9 }, { 0x21, 0x16 }, - { 0x22, 0x40 }, { 0x23, 0x40 }, { 0x24, 0x80 }, { 0x25, 0x40 }, - { 0x26, 0x80 }, { 0x27, 0x4F }, { 0x28, 0xFE }, { 0x29, 0x01 }, - { 0x2A, 0xCF }, { 0x2B, 0x0F }, { 0x2C, 0x03 }, { 0x2D, 0x01 }, - { 0x2E, 0x83 }, { 0x2F, 0x03 }, { 0x30, 0x40 }, { 0x31, 0x35 }, - { 0x32, 0x02 }, { 0x33, 0x8C }, { 0x34, 0x03 }, + 0x00, 0x4C, 0x01, 0x3C, 0x02, 0x00, 0x03, 0xEF, + 0x04, 0xBD, 0x05, 0xE2, 0x06, 0x00, 0x07, 0x00, + 0x08, 0xF8, 0x09, 0xF8, 0x0A, 0x60, 0x0B, 0x60, + 0x0C, 0x00, 0x0D, 0x80, 0x0E, 0x18, 0x0F, 0xD9, + 0x10, 0x00, 0x11, 0x2B, 0x12, 0x40, 0x13, 0x40, + 0x14, 0x42, 0x15, 0x1A, 0x16, 0xFF, 0x17, 0xDA, + 0x18, 0xE6, 0x19, 0x90, 0x20, 0xD9, 0x21, 0x16, + 0x22, 0x40, 0x23, 0x40, 0x24, 0x80, 0x25, 0x40, + 0x26, 0x80, 0x27, 0x4F, 0x28, 0xFE, 0x29, 0x01, + 0x2A, 0xCF, 0x2B, 0x0F, 0x2C, 0x03, 0x2D, 0x01, + 0x2E, 0x83, 0x2F, 0x03, 0x30, 0x40, 0x31, 0x35, + 0x32, 0x02, 0x33, 0x8C, 0x34, 0x03, /* NTSC */ - { 0x11, 0x2B }, { 0x0F, 0xD9 }, + 0x11, 0x2B, 0x0F, 0xD9, /* RCA input connector */ - { 0x06, 0x00 }, { 0x0E, 0x18 }, { 0x20, 0xD9 }, { 0x21, 0x16 }, - { 0x22, 0x40 }, { 0x2C, 0x03 }, + 0x06, 0x00, 0x0E, 0x18, 0x20, 0xD9, 0x21, 0x16, + 0x22, 0x40, 0x2C, 0x03, - { 0xFF, 0xFF } }; + +static I2CByte SAA7111InitData[] = +{ + 0x11, 0x1D, /* 0D D0=1: automatic colour killer off + D1=0: DMSD data to YUV output + D2=1: output enable H/V sync on + D3=1: output enable YUV data on */ + 0x02, 0xC0, /* Mode 0 */ + 0x03, 0x23, /* automatic gain */ + 0x04, 0x00, /* */ + 0x05, 0x00, /* */ + 0x06, 108, /* hor sync begin */ + 0x07, 108, /* hor sync stop */ + 0x08, 0x88, /* sync control: + D1-0=00: VNOI = normal mode + D2=0: PLL closed + D3=1: VTR mode + D7=1: automatic field detection */ + 0x09, 0x41, /* 4A luminance control */ + 0x0A, 0x80, /* brightness = 128 (CCIR level) */ + 0x0B, 0x40, /* contrast = 1.0 */ + 0x0C, 0x40, /* crominance = 1.0 (CCIR level) */ + 0x0D, 0x00, /* hue = 0 */ + 0x0E, 0x01, /* chroma bandwidth = nominal + fast colour time constant = nominal + chrom comp filter on + colour standard PAL BGHI, NTSC M */ + 0x10, 0x48, /* luminance delay compensation = 0 + VRLN = 1 + fine pos of hs = 0 + output format = YUV 422 */ + 0x12, 0x00, /* 20 D5=1: VPO in tristate */ + 0x13, 0x00, + 0x15, 0x00, + 0x16, 0x00, + 0x17, 0x00, + +}; + + +/**************************************************************************/ + +/** + * generates XF86VideoEncoding[i] with video norm norm, video input format + * input and video input channel channel + */ +static int +SMI_AddEncoding(XF86VideoEncodingPtr enc, int i, + int norm, int input, int channel) +{ + char* norm_string; + char* input_string; + char channel_string[20]; + + ENTER_PROC("SMI_AddEncoding"); + + norm_string = VideoNorms[norm].name; + input_string = VideoInputs[input].name; + sprintf(channel_string, "%d", channel); + enc[i].id = i; + enc[i].name = xalloc(strlen(norm_string) + + strlen(input_string) + + strlen(channel_string)+3); + if (NULL == enc[i].name) { + LEAVE_PROC("SMI_AddEncoding"); + return -1; + } + enc[i].width = VideoNorms[norm].Wa; + enc[i].height = VideoNorms[norm].Ha; + enc[i].rate = VideoNorms[norm].rate; + sprintf(enc[i].name,"%s-%s-%s", norm_string, input_string, channel_string); + + LEAVE_PROC("SMI_AddEncoding"); + return 0; +} + + +/** + * builds XF86VideoEncodings with all legal combinations of video norm, + * video input format and video input channel + */ +static void +SMI_BuildEncodings(SMI_PortPtr p) +{ + int ch, n; + + ENTER_PROC("SMI_BuildEncodings"); + + /* allocate memory for encoding array */ + p->enc = xalloc(sizeof(XF86VideoEncodingRec) * N_ENCODINGS); + if (NULL == p->enc) + goto fail; + memset(p->enc,0,sizeof(XF86VideoEncodingRec) * N_ENCODINGS); + /* allocate memory for video norm array */ + p->norm = xalloc(sizeof(int) * N_ENCODINGS); + if (NULL == p->norm) + goto fail; + memset(p->norm,0,sizeof(int) * N_ENCODINGS); + /* allocate memory for video input format array */ + p->input = xalloc(sizeof(int) * N_ENCODINGS); + if (NULL == p->input) + goto fail; + memset(p->input,0,sizeof(int) * N_ENCODINGS); + /* allocate memory for video channel number array */ + p->channel = xalloc(sizeof(int) * N_ENCODINGS); + if (NULL == p->channel) + goto fail; + memset(p->channel,0,sizeof(int) * N_ENCODINGS); + + /* fill arrays */ + p->nenc = 0; + for (ch = 0; ch < N_COMPOSITE_CHANNELS; ch++) { + for (n = 0; n < N_VIDEO_NORMS; n++) { + SMI_AddEncoding(p->enc, p->nenc, n, COMPOSITE, ch); + p->norm[p->nenc] = n; + p->input[p->nenc] = COMPOSITE; + p->channel[p->nenc] = ch; + p->nenc++; + } + } + for (ch = 0; ch < N_SVIDEO_CHANNELS; ch++) { + for (n = 0; n < N_VIDEO_NORMS; n++) { + SMI_AddEncoding(p->enc, p->nenc, n, SVIDEO, ch); + p->norm[p->nenc] = n; + p->input[p->nenc] = SVIDEO; + p->channel[p->nenc] = ch; + p->nenc++; + } + } + LEAVE_PROC("SMI_BuildEncodings"); + return; + + fail: + if (p->input) xfree(p->input); + p->input = NULL; + if (p->norm) xfree(p->norm); + p->norm = NULL; + if (p->channel) xfree(p->channel); + p->channel = NULL; + if (p->enc) xfree(p->enc); + p->enc = NULL; + p->nenc = 0; + LEAVE_PROC("SMI_BuildEncodings"); +} + + +/******************************************************************************\ +** ** +** X V E X T E N S I O N I N T E R F A C E ** +** ** +\******************************************************************************/ + +void +SMI_InitVideo(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + SMIPtr psmi = SMIPTR(pScrn); + XF86VideoAdaptorPtr *ptrAdaptors, *newAdaptors = NULL; + XF86VideoAdaptorPtr newAdaptor = NULL; + int numAdaptors; + + ENTER_PROC("SMI_InitVideo"); + + numAdaptors = xf86XVListGenericAdaptors(pScrn, &ptrAdaptors); + + DEBUG((VERBLEV, "numAdaptors=%d\n", numAdaptors)); + + if (psmi->rotate == 0) + { + newAdaptor = SMI_SetupVideo(pScreen); + DEBUG((VERBLEV, "newAdaptor=%p\n", newAdaptor)); + SMI_InitOffscreenImages(pScreen); + } + + if (newAdaptor != NULL) + { + if (numAdaptors == 0) + { + numAdaptors = 1; + ptrAdaptors = &newAdaptor; + } + else + { + newAdaptors = xalloc((numAdaptors + 1) * + sizeof(XF86VideoAdaptorPtr*)); + if (newAdaptors != NULL) + { + memcpy(newAdaptors, ptrAdaptors, + numAdaptors * sizeof(XF86VideoAdaptorPtr)); + newAdaptors[numAdaptors++] = newAdaptor; + ptrAdaptors = newAdaptors; + } + } + } + + if (numAdaptors != 0) + { + DEBUG((VERBLEV, "ScreenInit\n")); + xf86XVScreenInit(pScreen, ptrAdaptors, numAdaptors); + } + + if (newAdaptors != NULL) + { + xfree(newAdaptors); + } + + LEAVE_PROC("SMI_InitVideo"); +} + + +/*************************************************************************/ + +/* + * Video codec controls + */ + +/** + * scales value value of attribute i to range min, max + */ +static int +Scale(int i, int value, int min, int max) +{ + return min + (value - SMI_VideoAttributes[i].min_value) * (max - min) / + (SMI_VideoAttributes[i].max_value - SMI_VideoAttributes[i].min_value); +} + +/** + * sets video decoder attributes channel, encoding, brightness, contrast, saturation, hue + */ +static int +SetAttr(ScrnInfoPtr pScrn, int i, int value) +{ + if (i < XV_ENCODING || i > XV_HUE) + return BadMatch; + + /* clamps value to attribute range */ + value = CLAMP(value, SMI_VideoAttributes[i].min_value, + SMI_VideoAttributes[i].max_value); + +#if 0 + if (pPPriv->I2CDev == SAA7110) { + return SetAttrSAA7110(pScrn, i, value); + } + else if (pPPriv->I2CDev == SAA7111) { +#endif + return SetAttrSAA7111(pScrn, i, value); +#if 0 + } + else { + return XvBadAlloc; + } +#endif + + return Success; +} + + +/** + * sets SAA7110 video decoder attributes channel, encoding, brightness, contrast, saturation, hue + */ +static int +SetAttrSAA7110(ScrnInfoPtr pScrn, int i, int value) +{ + /* not supported */ + return XvBadAlloc; +} + + +/** + * sets SAA7111 video decoder attributes channel, encoding, + * brightness, contrast, saturation, hue + */ +static int +SetAttrSAA7111(ScrnInfoPtr pScrn, int i, int value) +{ + SMIPtr pSmi = SMIPTR(pScrn); + SMI_PortPtr pPort = (SMI_PortPtr) pSmi->ptrAdaptor->pPortPrivates[0].ptr; + + if (i == XV_ENCODING) { + int norm; + int input; + int channel; + norm = pPort->norm[value]; + input = pPort->input[value]; + channel = pPort->channel[value]; + + DEBUG((VERBLEV, "SetAttribute XV_ENCODING: %d. norm=%d input=%d channel=%d\n", + value, norm, input, channel)); + + /* set video norm */ + if (!xf86I2CWriteVec(&(pPort->I2CDev), SAA7111VideoStd[norm], + ENTRIES(SAA7111VideoStd[norm]) / 2)) { + return XvBadAlloc; + } + /* set video input format and channel */ + if (input == COMPOSITE) { + if (!xf86I2CWriteVec(&(pPort->I2CDev), + SAA7111CompositeChannelSelect[channel], + ENTRIES(SAA7111CompositeChannelSelect[channel]) / 2)) { + return XvBadAlloc; + } + } + else { + if (!xf86I2CWriteVec(&(pPort->I2CDev), + SAA7111SVideoChannelSelect[channel], + ENTRIES(SAA7111SVideoChannelSelect[channel]) / 2)) { + return XvBadAlloc; + } + } + } + else if (i >= XV_BRIGHTNESS && i <= XV_HUE) { + int slave_adr = 0; + + switch (i) { + + case XV_BRIGHTNESS: + DEBUG((VERBLEV, "SetAttribute XV_BRIGHTNESS: %d\n", value)); + slave_adr = 0x0a; + break; + + case XV_CONTRAST: + DEBUG((VERBLEV, "SetAttribute XV_CONTRAST: %d\n", value)); + slave_adr = 0x0b; + break; + + case XV_SATURATION: + DEBUG((VERBLEV, "SetAttribute XV_SATURATION: %d\n", value)); + slave_adr = 0x0c; + break; + + case XV_HUE: + DEBUG((VERBLEV, "SetAttribute XV_HUE: %d\n", value)); + slave_adr = 0x0d; + break; + + default: + return XvBadAlloc; + } + if (!xf86I2CWriteByte(&(pPort->I2CDev), slave_adr, (value & 0xff))) + return XvBadAlloc; + } + else { + return BadMatch; + } + + pPort->Attribute[i] = value; + + /* debug: show registers */ + { + I2CByte i2c_bytes[32]; + int i; + xf86I2CReadBytes(&(pPort->I2CDev), 0, i2c_bytes, 32); + DEBUG((VERBLEV, "SAA7111 Registers\n")); + for (i=0; i<32; i++) { + DEBUG((VERBLEV, "%02X=%02X ", i, i2c_bytes[i])); + if ((i&7) == 7) DEBUG((VERBLEV, "\n")); + } + } + + return Success; +} + + /******************************************************************************\ ** ** ** V I D E O M A N A G E M E N T ** @@ -331,7 +797,6 @@ SMI_SetupVideo( SMIPtr pSmi = SMIPTR(pScrn); SMI_PortPtr smiPortPtr; XF86VideoAdaptorPtr ptrAdaptor; - int i; ENTER_PROC("SMI_SetupVideo"); @@ -358,21 +823,27 @@ SMI_SetupVideo( ptrAdaptor->name = "Silicon Motion Lynx Series Video Engine"; - ptrAdaptor->nEncodings = nElems(SMI_VideoEncodings); - ptrAdaptor->pEncodings = SMI_VideoEncodings; + ptrAdaptor->nPorts = 1; + ptrAdaptor->pPortPrivates = (DevUnion*) &ptrAdaptor[1]; + ptrAdaptor->pPortPrivates[0].ptr = (pointer) &ptrAdaptor->pPortPrivates[1]; + + smiPortPtr = (SMI_PortPtr) ptrAdaptor->pPortPrivates[0].ptr; + + SMI_BuildEncodings(smiPortPtr); + ptrAdaptor->nEncodings = smiPortPtr->nenc; + ptrAdaptor->pEncodings = smiPortPtr->enc; +#if 0 + /* aaa whats this? */ for (i = 0; i < nElems(SMI_VideoEncodings); i++) { SMI_VideoEncodings[i].width = pSmi->lcdWidth; SMI_VideoEncodings[i].height = pSmi->lcdHeight; } +#endif ptrAdaptor->nFormats = nElems(SMI_VideoFormats); ptrAdaptor->pFormats = SMI_VideoFormats; - ptrAdaptor->nPorts = 1; - ptrAdaptor->pPortPrivates = (DevUnion*) &ptrAdaptor[1]; - ptrAdaptor->pPortPrivates[0].ptr = (pointer) &ptrAdaptor->pPortPrivates[1]; - ptrAdaptor->nAttributes = nElems(SMI_VideoAttributes); ptrAdaptor->pAttributes = SMI_VideoAttributes; @@ -380,9 +851,9 @@ SMI_SetupVideo( ptrAdaptor->pImages = SMI_VideoImages; #if SMI_USE_CAPTURE - ptrAdaptor->PutVideo = NULL; + ptrAdaptor->PutVideo = SMI_PutVideo; ptrAdaptor->PutStill = NULL; - ptrAdaptor->GetVideo = SMI_GetVideo; + ptrAdaptor->GetVideo = NULL; ptrAdaptor->GetStill = NULL; #else ptrAdaptor->PutVideo = NULL; @@ -397,18 +868,51 @@ SMI_SetupVideo( ptrAdaptor->PutImage = SMI_PutImage; ptrAdaptor->QueryImageAttributes = SMI_QueryImageAttributes; - smiPortPtr = (SMI_PortPtr) ptrAdaptor->pPortPrivates[0].ptr; - smiPortPtr->colorKey = pSmi->videoKey; + smiPortPtr->Attribute[XV_COLORKEY] = pSmi->videoKey; + smiPortPtr->Attribute[XV_INTERLACED] = pSmi->interlaced; smiPortPtr->videoStatus = 0; - smiPortPtr->brightness = 0; + +#if 0 + /* aaa does not work ? */ + if (xf86I2CProbeAddress(pSmi->I2C, SAA7111)) + { + LEAVE_PROC("SMI_SetupVideo"); + return(NULL); + } + DEBUG((VERBLEV, "SAA7111 detected\n")); +#endif + + smiPortPtr->I2CDev.DevName = "SAA 7111A"; + smiPortPtr->I2CDev.SlaveAddr = SAA7111; + smiPortPtr->I2CDev.pI2CBus = pSmi->I2C; + + if (!xf86I2CDevInit(&(smiPortPtr->I2CDev))) + { + LEAVE_PROC("SMI_SetupVideo"); + return(NULL); + } + DEBUG((VERBLEV, "SAA7111 intialized\n")); + + if (!xf86I2CWriteVec(&(smiPortPtr->I2CDev), SAA7111InitData, ENTRIES(SAA7111InitData) / 2)) + { + LEAVE_PROC("SMI_SetupVideo"); + return(NULL); + } + REGION_INIT(pScreen, &smiPortPtr->clip, NullBox, 0); pSmi->ptrAdaptor = ptrAdaptor; pSmi->BlockHandler = pScreen->BlockHandler; pScreen->BlockHandler = SMI_BlockHandler; - xvBrightness = MAKE_ATOM("XV_BRIGHTNESS"); - xvColorKey = MAKE_ATOM("XV_COLORKEY"); + xvEncoding = MAKE_ATOM(XV_ENCODING_NAME); + xvHue = MAKE_ATOM(XV_HUE_NAME); + xvSaturation = MAKE_ATOM(XV_SATURATION_NAME); + xvBrightness = MAKE_ATOM(XV_BRIGHTNESS_NAME); + xvContrast = MAKE_ATOM(XV_CONTRAST_NAME); + + xvColorKey = MAKE_ATOM(XV_COLORKEY_NAME); + xvInterlaced = MAKE_ATOM(XV_INTERLACED_NAME); SMI_ResetVideo(pScrn); @@ -416,47 +920,55 @@ SMI_SetupVideo( return(ptrAdaptor); } + static void SMI_ResetVideo( ScrnInfoPtr pScrn ) { SMIPtr pSmi = SMIPTR(pScrn); - SMI_PortPtr ptrPort = (SMI_PortPtr) pSmi->ptrAdaptor->pPortPrivates[0].ptr; + SMI_PortPtr pPort = (SMI_PortPtr) pSmi->ptrAdaptor->pPortPrivates[0].ptr; int r, g, b; ENTER_PROC("SMI_ResetVideo"); + SetAttr(pScrn, XV_ENCODING, 0); /* Encoding = pal-composite-0 */ + SetAttr(pScrn, XV_BRIGHTNESS, 128); /* Brightness = 128 (CCIR level) */ + SetAttr(pScrn, XV_CONTRAST, 71); /* Contrast = 71 (CCIR level) */ + SetAttr(pScrn, XV_SATURATION, 64); /* Color saturation = 64 (CCIR level) */ + SetAttr(pScrn, XV_HUE, 0); /* Hue = 0 */ + switch (pScrn->depth) { case 8: - WRITE_VPR(pSmi, 0x04, ptrPort->colorKey & 0x00FF); + WRITE_VPR(pSmi, 0x04, pPort->Attribute[XV_COLORKEY] & 0x00FF); WRITE_VPR(pSmi, 0x08, 0); break; case 15: case 16: - WRITE_VPR(pSmi, 0x04, ptrPort->colorKey & 0xFFFF); + WRITE_VPR(pSmi, 0x04, pPort->Attribute[XV_COLORKEY] & 0xFFFF); WRITE_VPR(pSmi, 0x08, 0); break; default: - r = (ptrPort->colorKey & pScrn->mask.red) >> pScrn->offset.red; - g = (ptrPort->colorKey & pScrn->mask.green) >> pScrn->offset.green; - b = (ptrPort->colorKey & pScrn->mask.blue) >> pScrn->offset.blue; + r = (pPort->Attribute[XV_COLORKEY] & pScrn->mask.red) >> pScrn->offset.red; + g = (pPort->Attribute[XV_COLORKEY] & pScrn->mask.green) >> pScrn->offset.green; + b = (pPort->Attribute[XV_COLORKEY] & pScrn->mask.blue) >> pScrn->offset.blue; WRITE_VPR(pSmi, 0x04, ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3)); WRITE_VPR(pSmi, 0x08, 0); break; } - WRITE_VPR(pSmi, 0x5C, 0xEDEDED | (ptrPort->brightness << 24)); + WRITE_VPR(pSmi, 0x5C, 0xEDEDED | (pPort->Attribute[XV_BRIGHTNESS] << 24)); LEAVE_PROC("SMI_ResetVideo"); } + #if SMI_USE_CAPTURE static int -SMI_GetVideo( +SMI_PutVideo( ScrnInfoPtr pScrn, short vid_x, short vid_y, @@ -470,17 +982,36 @@ SMI_GetVideo( pointer data ) { - SMI_PortPtr ptrPort = (SMI_PortPtr) data; + SMI_PortPtr pPort = (SMI_PortPtr) data; SMIPtr pSmi = SMIPTR(pScrn); CARD32 vid_pitch, vid_address; CARD32 vpr00, cpr00; int xscale, yscale; BoxRec dstBox; INT32 x1, y1, x2, y2; + int norm; int areaHeight, width, height, fbPitch; int top, left; - ENTER_PROC("SMI_GetVideo"); + ENTER_PROC("SMI_PutVideo"); + + DEBUG((VERBLEV, "Interlaced Video %d\n", pPort->Attribute[XV_INTERLACED])); + + if (!pPort->Attribute[XV_INTERLACED]) { + /* no interlace: lines will be doubled */ + vid_h /= 2; + } + + /* field start aaa*/ + norm = pPort->norm[pPort->Attribute[XV_ENCODING]]; + vid_x += VideoNorms[norm].HStart; + vid_y += VideoNorms[norm].VStart; + /* only even values allowed (UV-phase) */ + vid_x &= ~1; + + DEBUG((VERBLEV, "vid_x=%d vid_y=%d drw_x=%d drw_y=%d " + "vid_w=%d vid_h=%d drw_w=%d drw_h=%d\n", + vid_x, vid_y, drw_x, drw_y, vid_w, vid_h, drw_w, drw_h)); x1 = vid_x; y1 = vid_y; @@ -495,40 +1026,96 @@ SMI_GetVideo( dstBox.x2 = drw_x + drw_w; dstBox.y2 = drw_y + drw_h; +#if 1 if (!SMI_ClipVideo(pScrn, &dstBox, &x1, &y1, &x2, &y2, clipBoxes, width, height)) +#else + if (!xf86XVClipVideoHelper(&dstBox, &x1, &y1, &x2, &y2, clipBoxes, width, + height)) +#endif { - LEAVE_PROC("SMI_GetVideo"); + LEAVE_PROC("SMI_PutVideo"); return(Success); } + DEBUG((VERBLEV, "Clip: x1=%d y1=%d x2=%d y2=%d\n", x1 >> 16, y1 >> 16, x2 >> 16, y2 >> 16)); + dstBox.x1 -= pScrn->frameX0; dstBox.y1 -= pScrn->frameY0; dstBox.x2 -= pScrn->frameX0; dstBox.y2 -= pScrn->frameY0; - if (ptrPort->i2cDevice == 0) - { - if (SMI_SendI2C(pScrn, SAA7110, "SAA7110", data_SAA7110) == Success) - { - ptrPort->i2cDevice = SAA7110; - } - else - { - xf86FreeOffscreenArea(ptrPort->area); - ptrPort->area = NULL; - LEAVE_PROC("SMI_GetVideo"); - return(BadAlloc); - } - } - vid_pitch = (vid_w * 2 + 7) & ~7; vpr00 = READ_VPR(pSmi, 0x00) & ~0x0FF000FF; cpr00 = READ_CPR(pSmi, 0x00) & ~0x000FFF00; - vpr00 |= 0x0110000E; - cpr00 |= 0x00000001; + /* vpr00: + Bit 2..0 = 6: Video Window I Format = YUV4:2:2 + Bit 3 = 1: Video Window I Enable = enabled + Bit 4 = 0: Video Window I YUV Averaging = disabled + Bit 5 = 0: Video Window I Hor. Replication = disabled + Bit 6 = 0: Video Window I data doubling = disabled + Bit 14..8 = 0: Video Window II = disabled + Bit 18..16 = 0: Graphics Data Format = 8-bit index + Bit 19 = 0: Top Video Window Select = window I + Bit 20 = 1: Color Key for Window I = enabled + Bit 21 = 0: Vertical Interpolation = s. below + Bit 22 = 0: Flicker Reduction for TV Modes = disabled + Bit 23 = 0: Fixed Vertical Interpolation = disabled + Bit 24 = 1: Select Video Window I Source Addr = + Bit 25 = 0: Enable V0FIFO to fetch 8-Bit color data = disabled + Bit 26 = 0: + Bit 27 = 1: Color Key for Window II = disabled + Bit 31..28 = reserved + */ + if (pPort->Attribute[XV_INTERLACED]) { + /* + Bit 21 = 0: Vertical Interpolation = disabled + Bit 24 = 0: Select Video Window I Source Addr = 0 + */ + vpr00 |= 0x0010000E; + } + else { + /* + Bit 21 = 10: Vertical Interpolation = enabled + Bit 24 = 1: Select Video Window I Source Addr = 1 + 1= Video window I source addr = capture port buffer ? + */ + vpr00 |= 0x0130000E; + } + + /* cpr00: + Bit 0 = 1: Video Capture Enable = enabled + Bit 8 = 0: Capture Control = continous + Bit 9 = 0: Double Buffer Enable = s. below + Bit 10 = 0: Interlace Data Capture = s. below + Bit 13..11 = 0: Frame Skip Enable = s. below + Bit 15..14 = 0: Video Capture Input Format = YUV4:2:2 + Bit 17..16 = 0: Enable Hor. Reduction = s. below + Bit 19..18 = 0: Enable Vert. Reduction = s. below + Bit 21..20 = 0: Enable Hor. Filtering = s. below + Bit 22 = 0: HREF Polarity = high active + Bit 23 = 0: VREF Polarity = high active + Bit 24 = 1: Field Detection Method VSYNC edge = rising + */ + if (pPort->Attribute[XV_INTERLACED]) { + /* + Bit 9 = 1: Double Buffer Enable = enabled + Bit 10 = 1: Interlace Data Capture = enabled + Bit 13..11 = 0: Frame Skip Enable = no skip + */ + cpr00 |= 0x01000601; + } + else { + /* + Bit 9 = 0: Double Buffer Enable = disabled + Bit 10 = 0: Interlace Data Capture = disabled + Bit 13..11 = 010: Frame Skip Enable = skip every other frame + */ + cpr00 |= 0x01000801; + } + if (pSmi->ByteSwap) cpr00 |= 0x00004000; @@ -590,8 +1177,10 @@ SMI_GetVideo( do { areaHeight = (vid_pitch * height + fbPitch - 1) / fbPitch; - ptrPort->area = SMI_AllocateMemory(pScrn, ptrPort->area, areaHeight); - if (ptrPort->area == NULL) + DEBUG((VERBLEV, "SMI_AllocateMemory: vid_pitch=%d height=%d fbPitch=%d areaHeight=%d\n", + vid_pitch, height, fbPitch, areaHeight)); + pPort->area = SMI_AllocateMemory(pScrn, pPort->area, areaHeight); + if (pPort->area == NULL) { if ((cpr00 & 0x000C0000) == 0) { @@ -626,58 +1215,111 @@ SMI_GetVideo( } else { - LEAVE_PROC("SMI_GetVideo"); + DEBUG((VERBLEV, "allocate error\n")); + LEAVE_PROC("SMI_PutVideo"); return(BadAlloc); } } } } - while (ptrPort->area == NULL); + while (pPort->area == NULL); - vid_address = (ptrPort->area->box.y1 * fbPitch) + ((y1 >> 16) * vid_pitch); + DEBUG((VERBLEV, "xscale==%d yscale=%d width=%d height=%d\n", + xscale, yscale, width, height)); - if (!RegionsEqual(&ptrPort->clip, clipBoxes)) - { - REGION_COPY(pScreen, &ptrPort->clip, clipBoxes); - XAAFillSolidRects(pScrn, ptrPort->colorKey, GXcopy, ~0, + /* aaa whats this ----------------------v ? + vid_address = (pPort->area->box.y1 * fbPitch) + ((y1 >> 16) * vid_pitch);*/ + vid_address = (pPort->area->box.y1 * fbPitch); + + DEBUG((VERBLEV, "test RegionsEqual\n")); + if (!RegionsEqual(&pPort->clip, clipBoxes)) + { + DEBUG((VERBLEV, "RegionCopy\n")); + REGION_COPY(pScreen, &pPort->clip, clipBoxes); +#if USE_XAA + XAAFillSolidRects(pScrn, pPort->Attribute[XV_COLORKEY], GXcopy, ~0, REGION_NUM_RECTS(clipBoxes), REGION_RECTS(clipBoxes)); +#else + DEBUG((VERBLEV, "FillKey\n")); + xf86XVFillKeyHelper(pScrn->pScreen, pPort->Attribute[XV_COLORKEY], clipBoxes); +#endif + } left = x1 >> 16; top = y1 >> 16; width = (x2 - x1) >> 16; height = (y2 - y1) >> 16; - if (ptrPort->i2cDevice == SAA7110) - { - left += 79; - top += 12; - } OUT_SEQ(pSmi, 0x21, IN_SEQ(pSmi, 0x21) & ~0x04); WRITE_VPR(pSmi, 0x54, READ_VPR(pSmi, 0x54) | 0x00200000); SMI_WaitForSync(pScrn); + /* Video Window I Left and Top Boundaries */ WRITE_VPR(pSmi, 0x14, dstBox.x1 + (dstBox.y1 << 16)); + /* Video Window I Right and Bottom Boundaries */ WRITE_VPR(pSmi, 0x18, dstBox.x2 + (dstBox.y2 << 16)); + /* Video Window I Source Width and Offset */ WRITE_VPR(pSmi, 0x20, (vid_pitch / 8) + ((vid_pitch / 8) << 16)); + /* Video Window I Stretch Factor */ WRITE_VPR(pSmi, 0x24, (xscale << 8) + yscale); + if (pPort->Attribute[XV_INTERLACED]) { + /* Video Window II Left and Top Boundaries */ + WRITE_VPR(pSmi, 0x28, dstBox.x1 + (dstBox.y1 << 16)); + /* Video Window II Right and Bottom Boundaries */ + WRITE_VPR(pSmi, 0x2C, dstBox.x2 + (dstBox.y2 << 16)); + /* Video Window II Source Width and Offset */ + WRITE_VPR(pSmi, 0x34, (vid_pitch / 8) + ((vid_pitch / 8) << 16)); + /* Video Window II Stretch Factor */ + WRITE_VPR(pSmi, 0x38, (xscale << 8) + yscale); + + /* Video Window I Source Start Address */ + WRITE_VPR(pSmi, 0x1C, vid_address / 8); + /* Video Window II Source Start Address */ + WRITE_VPR(pSmi, 0x30, vid_address / 8); + + /* Video Window I Source Start Address */ + WRITE_VPR(pSmi, 0x48, vid_address / 8); + /* Video Window II Source Start Address */ + WRITE_VPR(pSmi, 0x4C, vid_address / 8 + vid_pitch / 8); + + /* Video Source Clipping Control */ + WRITE_CPR(pSmi, 0x04, left + ((top/2) << 16)); + /* Video Source Capture Size Control */ + WRITE_CPR(pSmi, 0x08, width + ((height/2) << 16)); + /* Capture Port Buffer I Source Start Address */ + WRITE_CPR(pSmi, 0x0C, vid_address / 8); + /* Capture Port Buffer II Source Start Address */ + WRITE_CPR(pSmi, 0x10, vid_address / 8 + vid_pitch / 8); + /* Capture Port Source Offset Address */ + WRITE_CPR(pSmi, 0x14, 2*(vid_pitch / 8) + ((2*(vid_pitch / 8)) << 16)); + } + else { + /* Video Source Clipping Control */ WRITE_CPR(pSmi, 0x04, left + (top << 16)); + /* Video Source Capture Size Control */ WRITE_CPR(pSmi, 0x08, width + (height << 16)); + /* Capture Port Buffer I Source Start Address */ WRITE_CPR(pSmi, 0x0C, vid_address / 8); + /* Capture Port Buffer II Source Start Address */ WRITE_CPR(pSmi, 0x10, vid_address / 8); + /* Capture Port Source Offset Address */ WRITE_CPR(pSmi, 0x14, (vid_pitch / 8) + ((vid_pitch / 8) << 16)); + } WRITE_CPR(pSmi, 0x00, cpr00); WRITE_VPR(pSmi, 0x00, vpr00); - ptrPort->videoStatus = CLIENT_VIDEO_ON; - LEAVE_PROC("SMI_GetVideo"); + pPort->videoStatus = CLIENT_VIDEO_ON; + DEBUG((VERBLEV, "SMI_PutVideo success\n")); + LEAVE_PROC("SMI_PutVideo"); return(Success); } #endif + static void SMI_StopVideo( ScrnInfoPtr pScrn, @@ -685,16 +1327,16 @@ SMI_StopVideo( Bool shutdown ) { - SMI_PortPtr ptrPort = (SMI_PortPtr) data; + SMI_PortPtr pPort = (SMI_PortPtr) data; SMIPtr pSmi = SMIPTR(pScrn); ENTER_PROC("SMI_StopVideo"); - REGION_EMPTY(pScrn->pScreen, &ptrPort->clip); + REGION_EMPTY(pScrn->pScreen, &pPort->clip); if (shutdown) { - if (ptrPort->videoStatus & CLIENT_VIDEO_ON) + if (pPort->videoStatus & CLIENT_VIDEO_ON) { WRITE_VPR(pSmi, 0x00, READ_VPR(pSmi, 0x00) & ~0x01000008); #if SMI_USE_CAPTURE @@ -703,26 +1345,27 @@ SMI_StopVideo( /* #864 OUT_SEQ(pSmi, 0x21, IN_SEQ(pSmi, 0x21) | 0x04); */ #endif } - if (ptrPort->area != NULL) + if (pPort->area != NULL) { - xf86FreeOffscreenArea(ptrPort->area); - ptrPort->area = NULL; + xf86FreeOffscreenArea(pPort->area); + pPort->area = NULL; } - ptrPort->videoStatus = 0; - ptrPort->i2cDevice = 0; + pPort->videoStatus = 0; + /* pPort->i2cDevice = 0;aaa*/ } else { - if (ptrPort->videoStatus & CLIENT_VIDEO_ON) + if (pPort->videoStatus & CLIENT_VIDEO_ON) { - ptrPort->videoStatus |= OFF_TIMER; - ptrPort->offTime = currentTime.milliseconds + OFF_DELAY; + pPort->videoStatus |= OFF_TIMER; + pPort->offTime = currentTime.milliseconds + OFF_DELAY; } } LEAVE_PROC("SMI_StopVideo"); } + static int SMI_SetPortAttribute( ScrnInfoPtr pScrn, @@ -731,16 +1374,16 @@ SMI_SetPortAttribute( pointer data ) { - SMI_PortPtr ptrPort = (SMI_PortPtr) data; + int res; + SMI_PortPtr pPort = (SMI_PortPtr) data; SMIPtr pSmi = SMIPTR(pScrn); ENTER_PROC("SMI_SetPortAttribute"); - if (attribute == xvColorKey) - { + if (attribute == xvColorKey) { int r, g, b; - ptrPort->colorKey = value; + pPort->Attribute[XV_COLORKEY] = value; switch (pScrn->depth) { case 8: @@ -760,29 +1403,36 @@ SMI_SetPortAttribute( ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3)); break; } + res = Success; } - - else if (attribute == xvBrightness) - { - if ((value < -128) || (value > 127)) - { - LEAVE_PROC("SMI_SetPortAttribute"); - return(BadValue); + else if (attribute == xvInterlaced) { + pPort->Attribute[XV_INTERLACED] = (value != 0); + res = Success; } - ptrPort->brightness = value; - WRITE_VPR(pSmi, 0x5C, 0xEDEDED | (value << 24)); - } - - else - { - LEAVE_PROC("SMI_SetPortAttribute"); - return(BadMatch); + else if (attribute == xvEncoding) { + res = SetAttr(pScrn, XV_ENCODING, value); + } + else if (attribute == xvBrightness) { + res = SetAttr(pScrn, XV_BRIGHTNESS, value); + } + else if (attribute == xvContrast) { + res = SetAttr(pScrn, XV_CONTRAST, value); + } + else if (attribute == xvSaturation) { + res = SetAttr(pScrn, XV_SATURATION, value); + } + else if (attribute == xvHue) { + res = SetAttr(pScrn, XV_HUE, value); + } + else { + res = BadMatch; } LEAVE_PROC("SMI_SetPortAttribute"); - return(Success); + return(res); } + static int SMI_GetPortAttribute( ScrnInfoPtr pScrn, @@ -791,19 +1441,22 @@ SMI_GetPortAttribute( pointer data ) { - SMI_PortPtr ptrPort = (SMI_PortPtr) data; + SMI_PortPtr pPort = (SMI_PortPtr) data; ENTER_PROC("SMI_GetPortAttribute"); - if (attribute == xvColorKey) - { - *value = ptrPort->colorKey; - } - + if (attribute == xvEncoding) + *value = pPort->Attribute[XV_ENCODING]; else if (attribute == xvBrightness) - { - *value = ptrPort->brightness; - } + *value = pPort->Attribute[XV_BRIGHTNESS]; + else if (attribute == xvContrast) + *value = pPort->Attribute[XV_CONTRAST]; + else if (attribute == xvSaturation) + *value = pPort->Attribute[XV_SATURATION]; + else if (attribute == xvHue) + *value = pPort->Attribute[XV_HUE]; + else if (attribute == xvColorKey) + *value = pPort->Attribute[XV_COLORKEY]; else { @@ -815,6 +1468,7 @@ SMI_GetPortAttribute( return(Success); } + static void SMI_QueryBestSize( ScrnInfoPtr pScrn, @@ -838,6 +1492,7 @@ SMI_QueryBestSize( LEAVE_PROC("SMI_QueryBestSize"); } + static int SMI_PutImage( ScrnInfoPtr pScrn, @@ -859,7 +1514,7 @@ SMI_PutImage( ) { SMIPtr pSmi = SMIPTR(pScrn); - SMI_PortPtr ptrPort = (SMI_PortPtr) pSmi->ptrAdaptor->pPortPrivates[0].ptr; + SMI_PortPtr pPort = (SMI_PortPtr) pSmi->ptrAdaptor->pPortPrivates[0].ptr; INT32 x1, y1, x2, y2; int bpp = 0; int fbPitch, srcPitch, srcPitch2 = 0, dstPitch, areaHeight; @@ -942,8 +1597,8 @@ SMI_PutImage( } areaHeight = ((dstPitch * height) + fbPitch - 1) / fbPitch; - ptrPort->area = SMI_AllocateMemory(pScrn, ptrPort->area, areaHeight); - if (ptrPort->area == NULL) + pPort->area = SMI_AllocateMemory(pScrn, pPort->area, areaHeight); + if (pPort->area == NULL) { LEAVE_PROC("SMI_PutImage"); return(BadAlloc); @@ -954,7 +1609,7 @@ SMI_PutImage( nPixels = ((((x2 + 0xFFFF) >> 16) + 1) & ~1) - left; left *= bpp; - offset = (ptrPort->area->box.y1 * fbPitch) + (top * dstPitch); + offset = (pPort->area->box.y1 * fbPitch) + (top * dstPitch); dstStart = pSmi->FBBase + offset + left; switch (id) @@ -979,22 +1634,28 @@ SMI_PutImage( break; } - if (!RegionsEqual(&ptrPort->clip, clipBoxes)) + if (!RegionsEqual(&pPort->clip, clipBoxes)) { - REGION_COPY(pScreen, &ptrPort->clip, clipBoxes); - XAAFillSolidRects(pScrn, ptrPort->colorKey, GXcopy, ~0, + REGION_COPY(pScreen, &pPort->clip, clipBoxes); +#if USE_XAA + XAAFillSolidRects(pScrn, pPort->Attribute[XV_COLORKEY], GXcopy, ~0, REGION_NUM_RECTS(clipBoxes), REGION_RECTS(clipBoxes)); +#else + /*aaa*/ + return(BadAlloc); +#endif } SMI_DisplayVideo(pScrn, id, offset, width, height, dstPitch, x1, y1, x2, y2, &dstBox, src_w, src_h, drw_w, drw_h); - ptrPort->videoStatus = CLIENT_VIDEO_ON; + pPort->videoStatus = CLIENT_VIDEO_ON; LEAVE_PROC("SMI_PutImage"); return(Success); } + static int SMI_QueryImageAttributes( ScrnInfoPtr pScrn, @@ -1089,6 +1750,7 @@ SMI_QueryImageAttributes( return(size); } + /******************************************************************************\ ** ** ** S U P P O R T F U N C T I O N S ** @@ -1167,12 +1829,13 @@ SMI_ClipVideo( INT32 height ) { - INT32 vscale, hscale, delta; + INT32 vscale, hscale; BoxPtr extents = REGION_EXTENTS(pScrn, reg); int diff; ENTER_PROC("SMI_ClipVideo"); + DEBUG((VERBLEV, "ClipVideo(%d): x1=%d y1=%d x2=%d y2=%d\n", __LINE__, *x1 >> 16, *y1 >> 16, *x2 >> 16, *y2 >> 16)); /* PDR#941 */ extents->x1 = max(extents->x1, pScrn->frameX0); extents->y1 = max(extents->y1, pScrn->frameY0); @@ -1183,6 +1846,8 @@ SMI_ClipVideo( *x1 <<= 16; *y1 <<= 16; *x2 <<= 16; *y2 <<= 16; + DEBUG((VERBLEV, "ClipVideo(%d): x1=%d y1=%d x2=%d y2=%d\n", __LINE__, *x1 >> 16, *y1 >> 16, *x2 >> 16, *y2 >> 16)); + diff = extents->x1 - dst->x1; if (diff > 0) { @@ -1211,6 +1876,8 @@ SMI_ClipVideo( *y2 -= diff * vscale; } + DEBUG((VERBLEV, "ClipVideo(%d): x1=%d y1=%d x2=%d y2=%d\n", __LINE__, *x1 >> 16, *y1 >> 16, *x2 >> 16, *y2 >> 16)); + if (*x1 < 0) { diff = (-*x1 + hscale - 1) / hscale; @@ -1225,6 +1892,9 @@ SMI_ClipVideo( *y1 += diff * vscale; } + DEBUG((VERBLEV, "ClipVideo(%d): x1=%d y1=%d x2=%d y2=%d\n", __LINE__, *x1 >> 16, *y1 >> 16, *x2 >> 16, *y2 >> 16)); + +#if 0 /* aaa was macht dieser code? */ delta = *x2 - (width << 16); if (delta > 0) { @@ -1240,6 +1910,9 @@ SMI_ClipVideo( dst->y2 -= diff; *y2 -= diff * vscale; } +#endif + + DEBUG((VERBLEV, "ClipVideo(%d): x1=%d y1=%d x2=%d y2=%d\n", __LINE__, *x1 >> 16, *y1 >> 16, *x2 >> 16, *y2 >> 16)); if ((*x1 >= *x2) || (*y1 >= *y2)) { @@ -1257,6 +1930,8 @@ SMI_ClipVideo( REGION_UNINIT(pScrn, &clipReg); } + DEBUG((VERBLEV, "ClipVideo(%d): x1=%d y1=%d x2=%d y2=%d\n", __LINE__, *x1 >> 16, *y1 >> 16, *x2 >> 16, *y2 >> 16)); + LEAVE_PROC("SMI_ClipVideo"); return(TRUE); } @@ -1356,36 +2031,37 @@ SMI_BlockHandler( ScreenPtr pScreen = screenInfo.screens[i]; ScrnInfoPtr pScrn = xf86Screens[i]; SMIPtr pSmi = SMIPTR(pScrn); - SMI_PortPtr ptrPort = (SMI_PortPtr) pSmi->ptrAdaptor->pPortPrivates[0].ptr; + SMI_PortPtr pPort = (SMI_PortPtr) pSmi->ptrAdaptor->pPortPrivates[0].ptr; pScreen->BlockHandler = pSmi->BlockHandler; (*pScreen->BlockHandler)(i, blockData, pTimeout, pReadMask); pScreen->BlockHandler = SMI_BlockHandler; - if (ptrPort->videoStatus & TIMER_MASK) + if (pPort->videoStatus & TIMER_MASK) { UpdateCurrentTime(); - if (ptrPort->videoStatus & OFF_TIMER) + if (pPort->videoStatus & OFF_TIMER) { - if (ptrPort->offTime < currentTime.milliseconds) + if (pPort->offTime < currentTime.milliseconds) { WRITE_VPR(pSmi, 0x00, READ_VPR(pSmi, 0x00) & ~0x00000008); - ptrPort->videoStatus = FREE_TIMER; - ptrPort->freeTime = currentTime.milliseconds + FREE_DELAY; + pPort->videoStatus = FREE_TIMER; + pPort->freeTime = currentTime.milliseconds + FREE_DELAY; } } else { - if (ptrPort->freeTime < currentTime.milliseconds) + if (pPort->freeTime < currentTime.milliseconds) { - xf86FreeOffscreenArea(ptrPort->area); - ptrPort->area = NULL; + xf86FreeOffscreenArea(pPort->area); + pPort->area = NULL; } - ptrPort->videoStatus = 0; + pPort->videoStatus = 0; } } } +#if 0 static int SMI_SendI2C( ScrnInfoPtr pScrn, @@ -1407,6 +2083,7 @@ SMI_SendI2C( } dev = xf86CreateI2CDevRec(); + ErrorF("zz %x\n",dev); if (dev == NULL) { LEAVE_PROC("SMI_SendI2C"); @@ -1437,6 +2114,7 @@ SMI_SendI2C( LEAVE_PROC("SMI_SendI2C"); return(status); } +#endif /******************************************************************************\ ** ** @@ -1496,13 +2174,13 @@ SMI_AllocateMemory( { if ((area->box.y2 - area->box.y1) >= numLines) { - LEAVE_PROC("SMI_AllocateMemory"); + LEAVE_PROC("SMI_AllocateMemory (area->box.y2 - area->box.y1) >= numLines ok"); return(area); } if (xf86ResizeOffscreenArea(area, pScrn->displayWidth, numLines)) { - LEAVE_PROC("SMI_AllocateMemory"); + LEAVE_PROC("SMI_AllocateMemory xf86ResizeOffscreenArea ok"); return(area); } @@ -1519,9 +2197,11 @@ SMI_AllocateMemory( xf86QueryLargestOffscreenArea(pScreen, &maxW, &maxH, 0, FAVOR_WIDTH_THEN_AREA, PRIORITY_EXTREME); + DEBUG((VERBLEV, "QueryLargestOffscreenArea maxW=%d maxH=%d displayWidth=%d numlines=%d\n", + maxW, maxH, pScrn->displayWidth, numLines)); if ((maxW < pScrn->displayWidth) || (maxH < numLines)) { - LEAVE_PROC("SMI_AllocateMemory"); + LEAVE_PROC("SMI_AllocateMemory (maxW < pScrn->displayWidth) || (maxH < numLines)"); return(NULL); } @@ -1530,6 +2210,7 @@ SMI_AllocateMemory( 0, NULL, NULL, NULL); } + DEBUG((VERBLEV, "area = %p\n", area)); LEAVE_PROC("SMI_AllocateMemory"); return(area); } @@ -1738,7 +2419,7 @@ SMI_DisplaySurface( { SMI_OffscreenPtr ptrOffscreen = (SMI_OffscreenPtr) surface->devPrivate.ptr; SMIPtr pSmi = SMIPTR(surface->pScrn); - SMI_PortPtr ptrPort = pSmi->ptrAdaptor->pPortPrivates[0].ptr; + SMI_PortPtr pPort = pSmi->ptrAdaptor->pPortPrivates[0].ptr; INT32 x1, y1, x2, y2; BoxRec dstBox; @@ -1766,8 +2447,13 @@ SMI_DisplaySurface( dstBox.x2 -= surface->pScrn->frameX0; dstBox.y2 -= surface->pScrn->frameY0; - XAAFillSolidRects(surface->pScrn, ptrPort->colorKey, GXcopy, ~0, +#if USE_XAA + XAAFillSolidRects(surface->pScrn, pPort->Attribute[XV_COLORKEY], GXcopy, ~0, REGION_NUM_RECTS(clipBoxes), REGION_RECTS(clipBoxes)); +#else + /*aaa*/ + return(BadAlloc); +#endif SMI_ResetVideo(surface->pScrn); SMI_DisplayVideo(surface->pScrn, surface->id, surface->offsets[0], @@ -1775,12 +2461,12 @@ SMI_DisplaySurface( y2, &dstBox, vid_w, vid_h, drw_w, drw_h); ptrOffscreen->isOn = TRUE; - if (ptrPort->videoStatus & CLIENT_VIDEO_ON) + if (pPort->videoStatus & CLIENT_VIDEO_ON) { - REGION_EMPTY(pScrn->pScreen, &ptrPort->clip); + REGION_EMPTY(pScrn->pScreen, &pPort->clip); UpdateCurrentTime(); - ptrPort->videoStatus = FREE_TIMER; - ptrPort->freeTime = currentTime.milliseconds + FREE_DELAY; + pPort->videoStatus = FREE_TIMER; + pPort->freeTime = currentTime.milliseconds + FREE_DELAY; } LEAVE_PROC("SMI_DisplaySurface"); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.c index df71e66a2..333065ea1 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.c @@ -1,14 +1,17 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.c,v 1.9 2001/06/15 21:22:59 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.c,v 1.15 2002/01/17 10:49:35 eich Exp $ */ #include "xf86.h" #include "xf86PciInfo.h" +#include "xf86_OSproc.h" #include "sis.h" #include "sis_regs.h" #include "sis_bios.h" +PDEBUG(static int scrnidx;) -UShort DRAMType[17][5]={{0x0C,0x0A,0x02,0x40,0x39},{0x0D,0x0A,0x01,0x40,0x48}, +#if 0 +static UShort DRAMType[17][5]={{0x0C,0x0A,0x02,0x40,0x39},{0x0D,0x0A,0x01,0x40,0x48}, {0x0C,0x09,0x02,0x20,0x35},{0x0D,0x09,0x01,0x20,0x44}, {0x0C,0x08,0x02,0x10,0x31},{0x0D,0x08,0x01,0x10,0x40}, {0x0C,0x0A,0x01,0x20,0x34},{0x0C,0x09,0x01,0x08,0x32}, @@ -17,8 +20,9 @@ UShort DRAMType[17][5]={{0x0C,0x0A,0x02,0x40,0x39},{0x0D,0x0A,0x01,0x40,0x48}, {0x09,0x08,0x02,0x02,0x01},{0x0B,0x09,0x01,0x08,0x24}, {0x0B,0x08,0x01,0x04,0x20},{0x0A,0x08,0x01,0x02,0x10}, {0x09,0x08,0x01,0x01,0x00}}; +#endif -UShort MDA_DAC[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +static UShort MDA_DAC[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, @@ -27,7 +31,7 @@ UShort MDA_DAC[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F}; -UShort CGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, +static UShort CGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, 0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F, 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F, @@ -36,7 +40,7 @@ UShort CGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F, 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F}; -UShort EGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x05,0x15, +static UShort EGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x05,0x15, 0x20,0x30,0x24,0x34,0x21,0x31,0x25,0x35, 0x08,0x18,0x0C,0x1C,0x09,0x19,0x0D,0x1D, 0x28,0x38,0x2C,0x3C,0x29,0x39,0x2D,0x3D, @@ -45,7 +49,7 @@ UShort EGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x05,0x15, 0x0A,0x1A,0x0E,0x1E,0x0B,0x1B,0x0F,0x1F, 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F}; -UShort VGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, +static UShort VGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, 0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F, 0x00,0x05,0x08,0x0B,0x0E,0x11,0x14,0x18, 0x1C,0x20,0x24,0x28,0x2D,0x32,0x38,0x3F, @@ -57,30 +61,33 @@ UShort VGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15, 0x08,0x0C,0x10,0x08,0x0A,0x0C,0x0E,0x10, 0x0B,0x0C,0x0D,0x0F,0x10}; -UShort ModeIndex_640x480[] = {0x2E, 0x44, 0x45, 0x62}; -UShort ModeIndex_720x480[] = {0x31, 0x33, 0x00, 0x35}; -UShort ModeIndex_720x576[] = {0x32, 0x34, 0x00, 0x36}; -UShort ModeIndex_800x600[] = {0x30, 0x47, 0x48, 0x63}; -UShort ModeIndex_1024x768[] = {0x38, 0x4A, 0x4B, 0x64}; -UShort ModeIndex_1280x1024[] = {0x3A, 0x4D, 0x4E, 0x65}; -UShort ModeIndex_1600x1200[] = {0x3C, 0x3D, 0x3E, 0x66}; -UShort RefreshRate[7][8] = { - {60, 72, 75, 85, 100, 120, 160, 200}, - {56, 60, 72, 75, 85, 100, 120, 160}, - {43, 60, 70, 75, 85, 100, 120, 0}, - {43, 60, 75, 85, 0, 0, 0, 0}, - {60, 65, 70, 75, 85, 0, 0, 0}, - {60, 0 , 0 , 0 , 0 , 0 , 0 , 0 }, - {60, 0 , 0 , 0 , 0 , 0 , 0 , 0 }}; - -UShort StResInfo[5][2]={{640,400},{640,350},{720,400},{720,350},{640,480}}; -UShort ModeResInfo[15][4]={{320,200,8,8},{320,240,8,8},{320,400,8,8}, +static UShort ModeIndex_640x480[] = {0x2E, 0x44, 0x45, 0x62}; +static UShort ModeIndex_720x480[] = {0x31, 0x33, 0x00, 0x35}; +static UShort ModeIndex_720x576[] = {0x32, 0x34, 0x00, 0x36}; +static UShort ModeIndex_800x600[] = {0x30, 0x47, 0x48, 0x63}; +static UShort ModeIndex_1024x768[] = {0x38, 0x4A, 0x4B, 0x64}; +static UShort ModeIndex_1280x1024[] = {0x3A, 0x4D, 0x4E, 0x65}; +static UShort ModeIndex_1600x1200[] = {0x3C, 0x3D, 0x3E, 0x66}; +static UShort ModeIndex_1920x1440[] = {0x68, 0x69, 0x6A, 0x6B}; +static UShort RefreshRate[8][8] = { + {60, 72, 75, 85, 100, 120, 160, 200}, /* 640x480 */ + {56, 60, 72, 75, 85, 100, 120, 160}, /* 800x600 */ + {43, 60, 70, 75, 85, 100, 120, 0}, /* 1024x768 */ + {43, 60, 75, 85, 0, 0, 0, 0}, /* 1280x1024 */ + {60, 65, 70, 75, 85, 0, 0, 0}, /* 1600x1200 */ + {60, 0 , 0 , 0 , 0 , 0 , 0 , 0 }, /* 720x480 */ + {50, 0 , 0 , 0 , 0 , 0 , 0 , 0 }, /* 720x576 */ + {60, 0 , 0 , 0 , 0 , 0 , 0 , 0 }}; /* 1920x1440 */ +#define MODEID_OFF 0x449 + +static UShort StResInfo[5][2]={{640,400},{640,350},{720,400},{720,350},{640,480}}; +static UShort ModeResInfo[15][4]={{320,200,8,8},{320,240,8,8},{320,400,8,8}, {400,300,8,8},{512,384,8,8},{640,400,8,16}, {640,480,8,16},{800,600,8,16},{1024,768,8,16}, {1280,1024,8,16},{1600,1200,8,16},{1920,1440,8,16}, {720,480,8,16},{720,576,8,16},{1280,960,8,16}}; -UShort HiTVExtTiming[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x64, +static UShort HiTVExtTiming[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x64, 0x28,0x02,0x01,0x3D,0x06,0x3E,0x35,0x6D, 0x06,0x14,0x3E,0x35,0x6D,0x00,0xC5,0x3F, 0x64,0x90,0x33,0x8C,0x18,0x36,0x3E,0x13, @@ -90,7 +97,7 @@ UShort HiTVExtTiming[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x64, 0x60,0x14,0x3D,0x63,0x4F, 0x027,0xFFFC,0x6A}; -UShort HiTVSt1Timing[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x65, +static UShort HiTVSt1Timing[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x65, 0x28,0x02,0x01,0x3D,0x06,0x3E,0x35,0x6D, 0x06,0x14,0x3E,0x35,0x6D,0x00,0xC5,0x3F, 0x65,0x90,0x7B,0xA8,0x03,0xF0,0x87,0x03, @@ -100,7 +107,7 @@ UShort HiTVSt1Timing[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x65, 0x60,0x04,0x86,0xAF,0x5D, 0xE,0xFFFC,0x2D}; -UShort HiTVSt2Timing[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x64, +static UShort HiTVSt2Timing[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x64, 0x28,0x02,0x01,0x3D,0x06,0x3E,0x35,0x6D, 0x06,0x14,0x3E,0x35,0x6D,0x00,0xC5,0x3F, 0x64,0x90,0x33,0x8C,0x18,0x36,0x3E,0x13, @@ -110,7 +117,7 @@ UShort HiTVSt2Timing[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x64, 0x60,0x14,0x3D,0x63,0x4F, 0x27,0xFFFC,0x6A}; -UShort HiTVTextTiming[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x65, +static UShort HiTVTextTiming[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x65, 0x28,0x02,0x01,0x3D,0x06,0x3E,0x35,0x6D, 0x06,0x14,0x3E,0x35,0x6D,0x00,0xC5,0x3F, 0x65,0x90,0xE7,0xBC,0x03,0x0C,0x97,0x03, @@ -120,7 +127,7 @@ UShort HiTVTextTiming[61]={0x32,0x65,0x2C,0x5F,0x08,0x31,0x3A,0x65, 0x60,0x04,0x96,0x72,0x5C, 0x11,0xFFFC,0x32}; -UShort HiTVGroup3Data[63]={0x00,0x1A,0x22,0x63,0x62,0x22,0x08,0x5F, +static UShort HiTVGroup3Data[63]={0x00,0x1A,0x22,0x63,0x62,0x22,0x08,0x5F, 0x05,0x21,0xB2,0xB2,0x55,0x77,0x2A,0xA6, 0x25,0x2F,0x47,0xFA,0xC8,0xFF,0x8E,0x20, 0x8C,0x6E,0x60,0x2E,0x58,0x48,0x72,0x44, @@ -129,7 +136,7 @@ UShort HiTVGroup3Data[63]={0x00,0x1A,0x22,0x63,0x62,0x22,0x08,0x5F, 0x14,0x05,0x03,0x7E,0x64,0x31,0x14,0x75, 0x18,0x05,0x18,0x05,0x4C,0xA8,0x01}; -UShort HiTVGroup3Simu[63]={0x00,0x1A,0x22,0x63,0x62,0x22,0x08,0x95, +static UShort HiTVGroup3Simu[63]={0x00,0x1A,0x22,0x63,0x62,0x22,0x08,0x95, 0xDB,0x20,0xB8,0xB8,0x55,0x47,0x2A,0xA6, 0x25,0x2F,0x47,0xFA,0xC8,0xFF,0x8E,0x20, 0x8C,0x6E,0x60,0x15,0x26,0xD3,0xE4,0x11, @@ -138,7 +145,7 @@ UShort HiTVGroup3Simu[63]={0x00,0x1A,0x22,0x63,0x62,0x22,0x08,0x95, 0x01,0x05,0x03,0x7E,0x65,0x31,0x14,0x75, 0x18,0x05,0x18,0x05,0x4C,0xA8,0x01}; -UShort HiTVGroup3Text[63]={0x00,0x1A,0x22,0x63,0x62,0x22,0x08,0xA7, +static UShort HiTVGroup3Text[63]={0x00,0x1A,0x22,0x63,0x62,0x22,0x08,0xA7, 0xF5,0x20,0xCE,0xCE,0x55,0x47,0x2A,0xA6, 0x25,0x2F,0x47,0xFA,0xC8,0xFF,0x8E,0x20, 0x8C,0x6E,0x60,0x18,0x2C,0x0C,0x20,0x22, @@ -148,7 +155,7 @@ UShort HiTVGroup3Text[63]={0x00,0x1A,0x22,0x63,0x62,0x22,0x08,0xA7, 0x18,0x05,0x18,0x05,0x4C,0xA8,0x01}; -UShort NTSCTiming[61]={0x017,0x01D,0x003,0x009,0x005,0x006,0x00C,0x00C, +static UShort NTSCTiming[61]={0x017,0x01D,0x003,0x009,0x005,0x006,0x00C,0x00C, 0x094,0x049,0x001,0x00A,0x006,0x00D,0x004,0x00A, 0x006,0x014,0x00D,0x004,0x00A,0x000,0x085,0x01B, 0x00C,0x050,0x000,0x099,0x000,0x0EC,0x04A,0x017, @@ -158,7 +165,7 @@ UShort NTSCTiming[61]={0x017,0x01D,0x003,0x009,0x005,0x006,0x00C,0x00C, 0x060,0x014,0x050,0x000,0x040, 0x00044,0x002DB,0x0003B}; /* Ajust xxx */ -UShort PALTiming[61]={ 0x019,0x052,0x035,0x06E,0x004,0x038,0x03D,0x070, +static UShort PALTiming[61]={ 0x019,0x052,0x035,0x06E,0x004,0x038,0x03D,0x070, 0x094,0x049,0x001,0x012,0x006,0x03E,0x035,0x06D, 0x006,0x014,0x03E,0x035,0x06D,0x000,0x045,0x02B, 0x070,0x050,0x000,0x097,0x000,0x0D7,0x05D,0x017, @@ -168,7 +175,8 @@ UShort PALTiming[61]={ 0x019,0x052,0x035,0x06E,0x004,0x038,0x03D,0x070, 0x060,0x014,0x063,0x000,0x040, 0x0003E,0x002E1,0x00028}; /* Ajust xxx */ -UShort NTSCGroup3Data[63]= {0x000,0x014,0x015,0x025,0x055,0x015,0x00B,0x089, +#if 0 +static UShort NTSCGroup3Data[63]= {0x000,0x014,0x015,0x025,0x055,0x015,0x00B,0x089, 0x0D7,0x040,0x0B0,0x0B0,0x0FF,0x0C4,0x045,0x0A6, 0x025,0x02F,0x067,0x0F6,0x0BF,0x0FF,0x08E,0x020, 0x08C,0x0DA,0x060,0x092,0x0C8,0x055,0x08B,0x000, @@ -177,7 +185,7 @@ UShort NTSCGroup3Data[63]= {0x000,0x014,0x015,0x025,0x055,0x015,0x00B,0x089, 0x000,0x051,0x00F,0x00F,0x008,0x00F,0x008,0x06F, 0x018,0x005,0x005,0x005,0x04C,0x0AA,0x001}; -UShort PALGroup3Data[63]={0x000,0x01A,0x022,0x063,0x062,0x022,0x008,0x085, +static UShort PALGroup3Data[63]={0x000,0x01A,0x022,0x063,0x062,0x022,0x008,0x085, 0x0C3,0x020,0x0A4,0x0A4,0x055,0x047,0x02A,0x0A6, 0x025,0x02F,0x047,0x0FA,0x0C8,0x0FF,0x08E,0x020, 0x08C,0x0DC,0x060,0x092,0x0C8,0x04F,0x085,0x000, @@ -185,33 +193,43 @@ UShort PALGroup3Data[63]={0x000,0x01A,0x022,0x063,0x062,0x022,0x008,0x085, 0x030,0x030,0x000,0x0F3,0x0F3,0x000,0x0A2,0x0A2, 0x000,0x048,0x0FE,0x07E,0x008,0x040,0x008,0x091, 0x018,0x005,0x018,0x005,0x04C,0x0A8,0x001}; -UShort Part1[41]={0x30, 0x16, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, +static UShort Part1[41]={0x30, 0x16, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x8c, 0xbc, 0x22, 0x1c, 0x05, 0xdf, 0xf3, 0x16, 0x0a, 0x20, 0x89, 0x93, 0x00, 0x80, 0x14, 0xf7, 0x58, 0x00, 0x00, 0x18, 0x28, 0x32, 0x15, 0xff, 0xa0, 0x00, 0x01, 0x03, 0x2c, 0x11, 0x92}; +#endif -UShort P3c4,P3d4,P3c0,P3ce,P3c2,P3ca,P3c6,P3c7,P3c8,P3c9,P3da; -UShort CRT1VCLKLen; /*VCLKData table length of bytes of each entry*/ -UShort flag_clearbuffer; /*0: no clear frame buffer 1:clear frame buffer*/ -int RAMType; -int ModeIDOffset,StandTable,CRT1Table,ScreenOffset,VCLKData,MCLKData, ECLKData; -int REFIndex,ModeType; -UShort IF_DEF_LVDS; -UShort IF_DEF_HiVision; -UShort IF_DEF_CH7005; -UShort VBInfo, SetFlag,RVBHCFACT,RVBHCMAX,VGAVT,VGAHT,VT,HT,VGAVDE,VGAHDE; -UShort VDE,HDE,RVBHRS,NewFlickerMode,RY1COE,RY2COE,RY3COE,RY4COE; -UShort LCDResInfo,LCDTypeInfo,LCDInfo,VCLKLen; -UShort LCDHDES,LCDVDES; -UShort DDC_Port; -UShort DDC_Index; -UShort DDC_DataShift; -UShort DDC_DeviceAddr; -UShort DDC_Flag; -UShort DDC_ReadAddr; -UShort DDC_Buffer; +static UShort P3c4,P3d4,P3c0,P3ce,P3c2,P3ca,P3c6,P3c7,P3c8,P3c9,P3da; +static UShort CRT1VCLKLen; /*VCLKData table length of bytes of each entry*/ +#if 0 +static UShort flag_clearbuffer; /*0: no clear frame buffer 1:clear frame buffer*/ +static int RAMType; +#endif +static int ModeIDOffset,StandTable,CRT1Table,ScreenOffset,VCLKData; +#if 0 +static int MCLKData, ECLKData; +#endif +static int REFIndex,ModeType; +static UShort IF_DEF_LVDS; +static UShort IF_DEF_HiVision; +static UShort IF_DEF_CH7005; +static UShort VBInfo, SetFlag,RVBHCFACT,RVBHCMAX,VGAVT,VGAHT,VT,HT,VGAVDE,VGAHDE; +static UShort VDE,HDE,RVBHRS,NewFlickerMode,RY1COE,RY2COE,RY3COE,RY4COE; +static UShort LCDResInfo,LCDTypeInfo,LCDInfo,VCLKLen; +static UShort LCDHDES,LCDVDES; +static UShort DDC_Port; +static UShort DDC_Index; +static UShort DDC_DataShift; +static UShort DDC_DeviceAddr; +#if 0 +static UShort DDC_Flag; +#endif +static UShort DDC_ReadAddr; +#if 0 +static UShort DDC_Buffer; +#endif static Bool SearchModeID(ULong ROMAddr, UShort ModeNo); static Bool CheckMemorySize(ULong ROMAddr); @@ -234,7 +252,7 @@ static void WriteDAC(UShort dl, UShort ah, UShort al, UShort dh); static void DisplayOn(void); static void DisplayOff(void); static void SetReg3(UShort port, UShort data); -static UShort GetReg1(UShort port, UShort index); +/* static UShort SiSGetReg1(UShort port, UShort index); */ static UShort GetReg2(UShort port); static UShort GetModeIDLength(ULong ROMAddr, UShort ModeNo); static UShort GetRefindexLength(ULong ROMAddr, UShort ModeNo); @@ -246,7 +264,6 @@ static UShort CalcDelay2(ULong ROMAddr,UShort key); static void SetReg4(UShort port, ULong data); static ULong GetReg3(UShort port); static void SetPitch(ScrnInfoPtr pScrn, UShort BaseAddr); -static UShort CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode); static UShort CalcRefreshRate(ScrnInfoPtr pScrn, DisplayModePtr mode); static void WaitVertical(void); static Bool SetCRT2Group(UShort BaseAddr,ULong ROMAddr,UShort ModeNo, ScrnInfoPtr pScrn); @@ -287,6 +304,8 @@ static UShort GetVCLKLen(ULong ROMAddr); static void SetCRT2Sync(UShort BaseAddr,ULong ROMAddr,UShort ModeNo); static void GetCRT1Ptr(ULong ROMAddr); static void SetRegANDOR(UShort Port,UShort Index,UShort DataAND,UShort DataOR); +static void SetRegAND (UShort Port,UShort Index,UShort DataAND); +static void SetRegOR (UShort Port,UShort Index,UShort DataOR); static UShort GetVGAHT2(void); static void SetGroup2(UShort BaseAddr,ULong ROMAddr, UShort ModeNo); static void SetGroup3(UShort BaseAddr,ULong ROMAddr); @@ -296,17 +315,19 @@ static void SetGroup5(UShort BaseAddr,ULong ROMAddr); static void EnableCRT2(void); static void LoadDAC2(ULong ROMAddr,UShort Part5Port); static void WriteDAC2(UShort Pdata,UShort dl, UShort ah, UShort al, UShort dh); -static void SetLockRegs(void); +/* static void SetLockRegs(void); */ static void GetVBInfo(UShort BaseAddr,ULong ROMAddr); static Bool BridgeIsEnable(UShort BaseAddr); static Bool BridgeInSlave(void); +static Bool IsDualEdge301B(UShort BaseAddr); +static Bool IsVAMode301B (UShort BaseAddr); static Bool GetLCDResInfo(ULong ROMAddr,UShort P3d4Reg); static void PresetScratchregister(UShort P3d4Reg); -static Bool GetLCDDDCInfo(ScrnInfoPtr pScrn); -static void SetTVSystem(void); +/* static Bool GetLCDDDCInfo(ScrnInfoPtr pScrn); */ +/* static void SetTVSystem(void); */ static void LongWait(void); -static void VBLongWait(void); -static Bool WaitVBRetrace(UShort BaseAddr); +/* static void VBLongWait(void); */ +/* static Bool WaitVBRetrace(UShort BaseAddr); */ static void ModCRT1CRTC(ULong ROMAddr,UShort ModeNo); static void SetCRT2ECLK(ULong ROMAddr, UShort ModeNo); static UShort GetLVDSDesPtr(ULong ROMAddr,UShort ModeNo); @@ -324,16 +345,8 @@ static void SetSCLKHigh(void); static void DDC2Delay(void); static UShort CheckACK(void); -Bool SiSSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) +void SiSRegInit(UShort BaseAddr) { - SISPtr pSiS = SISPTR(pScrn); - ULong temp; - UShort cr30flag,cr31flag; - ULong ROMAddr = (ULong) SISPTR(pScrn)->BIOS; - UShort BaseAddr = (UShort) (SISPTR(pScrn)->RelIO +0x30); - UShort ModeNo=0; - UShort Rate; - P3c4=BaseAddr+0x14; P3d4=BaseAddr+0x24; P3c0=BaseAddr+0x10; @@ -345,13 +358,36 @@ Bool SiSSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) P3c8=BaseAddr+0x18; P3c9=BaseAddr+0x19; P3da=BaseAddr+0x2A; +} + +Bool SiSBIOSSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + SISPtr pSiS = SISPTR(pScrn); + ULong temp; + UShort cr30flag,cr31flag; + ULong ROMAddr = (ULong) SISPTR(pScrn)->BIOS; + UShort BaseAddr = (UShort) (SISPTR(pScrn)->RelIO +0x30); + UShort ModeNo=0; + UShort Rate; + + SiSRegInit(BaseAddr); /* TW: Set global SiS Regs definitions */ + - ModeNo = CalcModeIndex(pScrn, mode); + ModeNo = SiSCalcModeIndex(pScrn, mode); + if (!ModeNo) return FALSE; + xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Mode # 0x%2.2x\n",ModeNo); + + SiSSetReg1(P3c4,0x05,0x86); /* TW: Unlock regs */ + + PDEBUG(scrnidx = pScrn->scrnIndex); + Rate = CalcRefreshRate(pScrn, mode); - SetReg1(P3d4, 0x33, Rate); + SiSSetReg1(P3d4, 0x33, Rate); - SetReg1(P3c4, 0x20, 0xa1); - SetReg1(P3c4, 0x1E, 0x5A); + /* TW: Enable PCI adressing (0x80) & MMIO enable (0x1) & ? (0x40) */ + SiSSetReg1(P3c4, 0x20, 0xa1); + /* TW: Enable 2D (0x42) & 3D accelerator (0x18) */ + SiSSetReg1(P3c4, 0x1E, 0x5A); if(pSiS->VBFlags & VB_LVDS) IF_DEF_LVDS = 1; @@ -362,7 +398,6 @@ Bool SiSSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) else IF_DEF_CH7005 = 0; - /* ynlai begin */ IF_DEF_HiVision=0; /* ynlai end */ @@ -371,7 +406,7 @@ Bool SiSSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) /* replace GetSenseStatus,SetTVSystem,SetDisplayInfo */ DisplayOff(); - SetReg1(P3c4,0x05,0x86); /* 1.Openkey */ + SiSSetReg1(P3c4,0x05,0x86); /* 1.Openkey */ temp=SearchModeID(ROMAddr,ModeNo); /* 2.Get ModeID Table */ if(temp==0) return(0); @@ -382,10 +417,13 @@ Bool SiSSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) temp=CheckMemorySize(ROMAddr); /* 3.Check memory size */ if(temp==0) return(0); - cr30flag=(UChar)GetReg1(P3d4,0x30); + + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "VBInfo = 0x%x\n", VBInfo)); + + cr30flag=(UChar)SiSGetReg1(P3d4,0x30); if(((cr30flag&0x01)==1)||((cr30flag&0x02)==0)){ /* if cr30 d[0]=1 or d[1]=0 set crt1 */ - SetReg1(P3d4,0x34,ModeNo); + SiSSetReg1(P3d4,0x34,ModeNo); /* set CR34->CRT1 ModeNofor CRT2 FIFO */ GetModePtr(ROMAddr,ModeNo); /* 4.GetModePtr */ SetSeqRegs(ROMAddr); /* 5.SetSeqRegs */ @@ -407,11 +445,13 @@ Bool SiSSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) SetCRT1FIFO(ROMAddr); } SetCRT1ModeRegs(ROMAddr, ModeNo); - if( (pSiS->Chipset == PCI_CHIP_SIS630) || (pSiS->Chipset == PCI_CHIP_SIS540) ) - SetInterlace(ROMAddr,ModeNo); + /* if( (pSiS->Chipset == PCI_CHIP_SIS630) || (pSiS->Chipset == PCI_CHIP_SIS540) ) */ /* TW: wrong */ + if( (pSiS->Chipset != PCI_CHIP_SIS630) && (pSiS->Chipset != PCI_CHIP_SIS540) && + (pSiS->Chipset != PCI_CHIP_SIS300) ) + SetInterlace(ROMAddr,ModeNo); LoadDAC(ROMAddr); } - cr31flag=(UChar)GetReg1(P3d4,0x31); + cr31flag=(UChar)SiSGetReg1(P3d4,0x31); if(((cr30flag&0x01)==1)||((cr30flag&0x03)==0x02)|| (((cr30flag&0x03)==0x00)&&((cr31flag&0x20)==0x20))) { /* if CR30 d[0]=1 or d[1:0]=10, set CRT2 or cr30 cr31== 0x00 0x20 */ @@ -424,6 +464,8 @@ Bool SiSSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) SetPitch(pScrn, BaseAddr); /* 16.SetPitch */ WaitVertical(); DisplayOn(); /* 17.DisplayOn */ + SiSGetSetModeID(pScrn,ModeNo); + return TRUE; } @@ -457,7 +499,7 @@ static Bool CheckMemorySize(ULong ROMAddr) memorysize=memorysize>MemorySizeShift; memorysize++; /* Get memory size */ - temp=GetReg1(P3c4,0x14); /* Get DRAM Size */ + temp=SiSGetReg1(P3c4,0x14); /* Get DRAM Size */ temp=temp&0x3F; temp++; @@ -471,7 +513,7 @@ static void GetModePtr(ULong ROMAddr, UShort ModeNo) StandTable=*((UShort *)(ROMAddr+0x202)); /* Get First 0x202 */ /* StandTable Offset */ - if(ModeNo<=13) { + if(ModeNo<=0x13) { /* TW: this was decimal 13, which is definitely wrong! */ index=*((UChar *)(ROMAddr+ModeIDOffset+0x03)); /* si+St_ModeFlag */ } else { @@ -486,7 +528,7 @@ static void SetSeqRegs(ULong ROMAddr) UChar SRdata; UShort i; - SetReg1(P3c4,0x00,0x03); /* Set SR0 */ + SiSSetReg1(P3c4,0x00,0x03); /* Set SR0 */ StandTable=StandTable+0x05; SRdata=*((UChar *)(ROMAddr+StandTable)); /* Get SR01 from file */ if(IF_DEF_LVDS==1){ @@ -506,11 +548,13 @@ static void SetSeqRegs(ULong ROMAddr) } } SRdata=SRdata|0x20; - SetReg1(P3c4,0x01,SRdata); /* Set SR1 */ + SiSSetReg1(P3c4,0x01,SRdata); /* Set SR1 */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "SeqReg 1 -> 0x%x\n", SRdata)); for(i=02;i<=04;i++) { StandTable++; SRdata=*((UChar *)(ROMAddr+StandTable)); /* Get SR2,3,4 from file */ - SetReg1(P3c4,i,SRdata); /* Set SR2 3 4 */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "SeqReg %x -> 0x%x\n", i, SRdata)); + SiSSetReg1(P3c4,i,SRdata); /* Set SR2 3 4 */ } } @@ -521,6 +565,7 @@ static void SetMiscRegs(ULong ROMAddr) StandTable++; Miscdata=*((UChar *)(ROMAddr+StandTable)); /* Get Misc from file */ SetReg3(P3c2,Miscdata); /* Set Misc(3c2) */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "MiscReg -> 0x%x\n", Miscdata)); } static void SetCRTCRegs(ULong ROMAddr) @@ -528,14 +573,15 @@ static void SetCRTCRegs(ULong ROMAddr) UChar CRTCdata; UShort i; - CRTCdata=(UChar)GetReg1(P3d4,0x11); + CRTCdata=(UChar)SiSGetReg1(P3d4,0x11); CRTCdata=CRTCdata&0x7f; - SetReg1(P3d4,0x11,CRTCdata); /* Unlock CRTC */ + SiSSetReg1(P3d4,0x11,CRTCdata); /* Unlock CRTC */ for(i=0;i<=0x18;i++) { StandTable++; CRTCdata=*((UChar *)(ROMAddr+StandTable)); /* Get CRTC from file */ - SetReg1(P3d4,i,CRTCdata); /* Set CRTC(3d4) */ + SiSSetReg1(P3d4,i,CRTCdata); /* Set CRTC(3d4) */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "CRTReg %x -> 0x%x\n", i, CRTCdata)); } } @@ -564,6 +610,7 @@ static void SetATTRegs(ULong ROMAddr) GetReg2(P3da); /* reset 3da */ SetReg3(P3c0,i); /* set index */ SetReg3(P3c0,ARdata); /* set data */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "AttReg index %d -> 0x%x\n", i, ARdata)); } GetReg2(P3da); /* reset 3da */ @@ -581,12 +628,13 @@ static void SetGRCRegs(ULong ROMAddr) for(i=0;i<=0x08;i++) { StandTable++; GRdata=*((UChar *)(ROMAddr+StandTable)); /* Get GR from file */ - SetReg1(P3ce,i,GRdata); /* Set GR(3ce) */ + SiSSetReg1(P3ce,i,GRdata); /* Set GR(3ce) */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "GRCReg %x -> 0x%x\n", i, GRdata)); } if(ModeType>ModeVGA){ - GRdata=(UChar)GetReg1(P3ce,0x05); + GRdata=(UChar)SiSGetReg1(P3ce,0x05); GRdata=GRdata&0xBF; - SetReg1(P3ce,0x05,GRdata); + SiSSetReg1(P3ce,0x05,GRdata); } } @@ -594,7 +642,7 @@ static void ClearExt1Regs() { UShort i; - for(i=0x0A;i<=0x0E;i++) SetReg1(P3c4,i,0x00); /* Clear SR0A-SR0E */ + for(i=0x0A;i<=0x0E;i++) SiSSetReg1(P3c4,i,0x00); /* Clear SR0A-SR0E */ } @@ -606,7 +654,7 @@ static Bool GetRatePtr(ULong ROMAddr, UShort ModeNo) if(ModeNo<0x14) return(FALSE); /* Mode No <= 13h then return */ - index=GetReg1(P3d4,0x33); /* Get 3d4 CRTC33 */ + index=SiSGetReg1(P3d4,0x33); /* Get 3d4 CRTC33 */ index=index&0x0F; /* Frame rate index */ if(index!=0) index--; REFIndex=*((UShort *)(ROMAddr+ModeIDOffset+0x04)); /* si+Ext_point */ @@ -636,6 +684,7 @@ static void SetSync(ULong ROMAddr) temp=0x2F; temp=temp|sync; SetReg3(P3c2,temp); /* Set Misc(3c2) */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "Setsync 0x%x\n", temp)); } static void SetCRT1CRTC(ULong ROMAddr) @@ -648,43 +697,46 @@ static void SetCRT1CRTC(ULong ROMAddr) CRT1Table=*((UShort *)(ROMAddr+0x204)); /* Get CRT1Table */ CRT1Table=CRT1Table+index*CRT1Len; - data=(UChar)GetReg1(P3d4,0x11); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "CRT1CRT: CRT1Table %x index %d CRT1Len %d REFIndex %x", + CRT1Table, index, CRT1Len, REFIndex)); + + data=(UChar)SiSGetReg1(P3d4,0x11); data=data&0x7F; - SetReg1(P3d4,0x11,data); /* Unlock CRTC */ + SiSSetReg1(P3d4,0x11,data); /* Unlock CRTC */ CRT1Table--; for(i=0;i<=0x05;i++) { CRT1Table++; data=*((UChar *)(ROMAddr+CRT1Table)); - SetReg1(P3d4,i,data); + SiSSetReg1(P3d4,i,data); } for(i=0x06;i<=0x07;i++) { CRT1Table++; data=*((UChar *)(ROMAddr+CRT1Table)); - SetReg1(P3d4,i,data); + SiSSetReg1(P3d4,i,data); } for(i=0x10;i<=0x12;i++) { CRT1Table++; data=*((UChar *)(ROMAddr+CRT1Table)); - SetReg1(P3d4,i,data); + SiSSetReg1(P3d4,i,data); } for(i=0x15;i<=0x16;i++) { CRT1Table++; data=*((UChar *)(ROMAddr+CRT1Table)); - SetReg1(P3d4,i,data); + SiSSetReg1(P3d4,i,data); } for(i=0x0A;i<=0x0C;i++) { CRT1Table++; data=*((UChar *)(ROMAddr+CRT1Table)); - SetReg1(P3c4,i,data); + SiSSetReg1(P3c4,i,data); } CRT1Table++; - data=*((UChar *)(ROMAddr+CRT1Table)); + data=*((UChar *)(ROMAddr+CRT1Table)); data=data&0xE0; - SetReg1(P3c4,0x0E,data); + SiSSetReg1(P3c4,0x0E,data); - data=(UChar)GetReg1(P3d4,0x09); + data=(UChar)SiSGetReg1(P3d4,0x09); data=data&0xDF; i=*((UChar *)(ROMAddr+CRT1Table)); i=i&0x01; @@ -693,9 +745,9 @@ static void SetCRT1CRTC(ULong ROMAddr) i=*((UShort *)(ROMAddr+ModeIDOffset+0x01)); i=i&DoubleScanMode; if(i) data=data|0x80; - SetReg1(P3d4,0x09,data); + SiSSetReg1(P3d4,0x09,data); - if(ModeType>0x03) SetReg1(P3d4,0x14,0x4F); + if(ModeType>0x03) SiSSetReg1(P3d4,0x14,0x4F); } static void SetCRT1Offset(ULong ROMAddr) @@ -705,11 +757,13 @@ static void SetCRT1Offset(ULong ROMAddr) UShort DisplayUnit; temp=*((UChar *)(ROMAddr+ModeIDOffset+0x03)); /* si+Ext_ModeInfo */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(offset) ModeInfo %x\n", temp)); temp=temp>>4; /* index */ ScreenOffset=*((UShort *)(ROMAddr+0x206)); /* ScreenOffset */ temp=*((UChar *)(ROMAddr+ScreenOffset+temp)); /* data */ temp2=*((UShort *)(ROMAddr+REFIndex+0x00)); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(offset) Infoflag %x\n", temp2)); temp2=temp2&InterlaceMode; if(temp2) temp=temp<<1; temp2=ModeType-ModeEGA; @@ -727,14 +781,16 @@ static void SetCRT1Offset(ULong ROMAddr) temp2=temp; temp=temp>>8; /* ah */ temp=temp&0x0F; - i=GetReg1(P3c4,0x0E); + i=SiSGetReg1(P3c4,0x0E); i=i&0xF0; i=i|temp; - SetReg1(P3c4,0x0E,i); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(CRT1Offset) 0e = 0x%x\n", i)); + SiSSetReg1(P3c4,0x0E,i); temp=(UChar)temp2; temp=temp&0xFF; /* al */ - SetReg1(P3d4,0x13,temp); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(CRT1Offset) 13 = 0x%x\n", temp)); + SiSSetReg1(P3d4,0x13,temp); temp2=*((UShort *)(ROMAddr+REFIndex+0x00)); temp2=temp2&InterlaceMode; @@ -745,7 +801,8 @@ static void SetCRT1Offset(ULong ROMAddr) al=DisplayUnit&0x00ff; if(al==0) ah=ah+1; else ah=ah+2; - SetReg1(P3c4,0x10,ah); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(CRT1Offset) 10 = 0x%x\n", ah)); + SiSSetReg1(P3c4,0x10,ah); } static void SetCRT1VCLK(ULong ROMAddr) @@ -753,19 +810,22 @@ static void SetCRT1VCLK(ULong ROMAddr) UShort i; UChar index,data; - index=*((UChar *)(ROMAddr+REFIndex+0x03)) & 0x3F; + index=*((UChar *)(ROMAddr+REFIndex+0x03)) & 0x3F; CRT1VCLKLen=GetVCLKLen(ROMAddr); data=index*CRT1VCLKLen; VCLKData=*((UShort *)(ROMAddr+0x208)); VCLKData=VCLKData+data; + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "VCLKData %x CRT1VCLKLen %x index %x data %x SiS_BIOS_REFIndex %x\n", + VCLKData, CRT1VCLKLen, index, data, REFIndex)); - SetReg1(P3c4,0x31,0); + SiSSetReg1(P3c4,0x31,0); for(i=0x2B;i<=0x2C;i++) { data=*((UChar *)(ROMAddr+VCLKData)); - SetReg1(P3c4,i,data); + SiSSetReg1(P3c4,i,data); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(CRT1VCLK) Reg %x -> 0x%x\n", i, data)); VCLKData++; } - SetReg1(P3c4,0x2D,0x80); + SiSSetReg1(P3c4,0x2D,0x80); } @@ -786,30 +846,33 @@ static void SetCRT1ModeRegs(ULong ROMAddr, UShort ModeNo) data=data&InterlaceMode; if(data) data2=data2|0x20; - SetReg1(P3c4,0x06,data2); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(CRT1ModeRegs) 06 -> 0x%x\n", data2)); + SiSSetReg1(P3c4,0x06,data2); - data=GetReg1(P3c4,0x01); + data=SiSGetReg1(P3c4,0x01); data=data&0xF7; data2=*((UShort *)(ROMAddr+ModeIDOffset+0x01)); data2=data2&HalfDCLK; if(data2) data=data|0x08; - SetReg1(P3c4,0x01,data); + SiSSetReg1(P3c4,0x01,data); - data=GetReg1(P3c4,0x0F); + data=SiSGetReg1(P3c4,0x0F); data=data&0xF7; data2=*((UShort *)(ROMAddr+ModeIDOffset+0x01)); data2=data2&LineCompareOff; if(data2) data=data|0x08; - SetReg1(P3c4,0x0F,data); + SiSSetReg1(P3c4,0x0F,data); - data=GetReg1(P3c4,0x21); + data=SiSGetReg1(P3c4,0x21); data=data&0x1F; if(ModeType==0x00) data=data|0x60; /* Text Mode */ else if(ModeType<=0x02) data=data|0x00; /* EGA Mode */ else data=data|0xA0; /* VGA Mode */ - SetReg1(P3c4,0x21,data); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(CRT1ModeRegs) 21 -> 0x%x\n", data)); + SiSSetReg1(P3c4,0x21,data); } +/* TW: values identical to sisfb */ static void SetVCLKState(ULong ROMAddr, UShort ModeNo) { UShort data,data2; @@ -822,26 +885,28 @@ static void SetVCLKState(ULong ROMAddr, UShort ModeNo) VCLKData=*((UShort *)(ROMAddr+0x208)); VCLKData=VCLKData+data+(CRT1VCLKLen-2); VCLK=*((UShort *)(ROMAddr+VCLKData)); + if(ModeNo<=0x13) VCLK=0; - data=GetReg1(P3c4,0x07); - data=data&0x7B; - if(VCLK>=150) data=data|0x80; /* VCLK > 150 */ - SetReg1(P3c4,0x07,data); - - data=GetReg1(P3c4,0x32); - data=data&0xD7; - if(VCLK>=150) data=data|0x08; /* VCLK > 150 */ - SetReg1(P3c4,0x32,data); - - data2=0x03; - if(VCLK>135) data2=0x02; - if(VCLK>160) data2=0x01; - if(VCLK>260) data2=0x00; - data=GetReg1(P3c4,0x07); - data=data&0xFC; - data=data|data2; - SetReg1(P3c4,0x07,data); + data=SiSGetReg1(P3c4,0x07); + data=data&0x7B; + if(VCLK>150) data=data|0x80; /* VCLK > 150; TW: was >= */ + SiSSetReg1(P3c4,0x07,data); + + data=SiSGetReg1(P3c4,0x32); + data=data&0xD7; + if(VCLK>=150) data=data|0x08; /* VCLK > 150 */ + SiSSetReg1(P3c4,0x32,data); + + data2=0x03; + if(VCLK>=135) data2=0x02; /* TW: was > */ + if(VCLK>=160) data2=0x01; /* TW: was > */ + if(VCLK>260) data2=0x00; + + data=SiSGetReg1(P3c4,0x07); + data=data&0xFC; + data=data|data2; + SiSSetReg1(P3c4,0x07,data); } static void LoadDAC(ULong ROMAddr) @@ -944,21 +1009,21 @@ static void DisplayOn(void) { UShort data; - data=GetReg1(P3c4,0x01); + data=SiSGetReg1(P3c4,0x01); data=data&0xDF; - SetReg1(P3c4,0x01,data); + SiSSetReg1(P3c4,0x01,data); } static void DisplayOff(void) { UShort data; - data=GetReg1(P3c4,0x01); + data=SiSGetReg1(P3c4,0x01); data=data|0x20; - SetReg1(P3c4,0x01,data); + SiSSetReg1(P3c4,0x01,data); } -void SetReg1(UShort port, UShort index, UShort data) +void SiSSetReg1(UShort port, UShort index, UShort data) { outb(port ,(UChar)(index & 0xff)); port++; @@ -970,7 +1035,7 @@ static void SetReg3(UShort port, UShort data) outb(port, (UChar)(data & 0xff)); } -static UShort GetReg1(UShort port, UShort index) +UShort SiSGetReg1(UShort port, UShort index) { UChar data; @@ -1041,7 +1106,7 @@ static void SetInterlace(ULong ROMAddr, UShort ModeNo) ULong Temp; UShort data,Temp2; - Temp = (ULong)GetReg1(P3d4, 0x01); + Temp = (ULong)SiSGetReg1(P3d4, 0x01); Temp++; Temp=Temp*8; @@ -1053,16 +1118,16 @@ static void SetInterlace(ULong ROMAddr, UShort ModeNo) Temp2 &= InterlaceMode; if(Temp2 == 0) data=0x0000; - SetReg1(P3d4,0x19,data); + SiSSetReg1(P3d4,0x19,data); - Temp = (ULong)GetReg1(P3d4, 0x1A); + Temp = (ULong)SiSGetReg1(P3d4, 0x1A); Temp2= (UShort)(Temp & 0xFC); - SetReg1(P3d4,0x1A,(UShort)Temp); + SiSSetReg1(P3d4,0x1A,(UShort)Temp); - Temp = (ULong)GetReg1(P3c4, 0x0f); + Temp = (ULong)SiSGetReg1(P3c4, 0x0f); Temp2= (UShort)Temp & 0xBF; if(ModeNo==0x37) Temp2=Temp2|0x40; - SetReg1(P3d4,0x1A,(UShort)Temp2); + SiSSetReg1(P3d4,0x1A,(UShort)Temp2); } static void SetCRT1FIFO(ULong ROMAddr) @@ -1078,7 +1143,7 @@ static void SetCRT1FIFO(ULong ROMAddr) VCLK=*((UShort *)(ROMAddr+VCLKData)); /* Get VCLK */ MCLKOffset=*((UShort *)(ROMAddr+0x20C)); - index=GetReg1(P3c4,0x3A); + index=SiSGetReg1(P3c4,0x1A); /* TW: was 0x3A - WRONG! */ index=index&07; MCLKOffset=MCLKOffset+index*5; MCLK=*((UChar *)(ROMAddr+MCLKOffset+0x03)); /* Get MCLK */ @@ -1111,14 +1176,14 @@ static void SetCRT1FIFO(ULong ROMAddr) bl++; if(bl>0x13) { - data=GetReg1(P3c4,0x16); + data=SiSGetReg1(P3c4,0x16); data=data>>6; if(data!=0) { data--; data=data<<6; - data2=GetReg1(P3c4,0x16); + data2=SiSGetReg1(P3c4,0x16); data2=(data2&0x3f)|data; - SetReg1(P3c4,0x16,data2); + SiSSetReg1(P3c4,0x16,data2); } else bl=0x13; } @@ -1128,23 +1193,23 @@ static void SetCRT1FIFO(ULong ROMAddr) ah=bl; ah=ah<<4; ah=ah|0x0f; - SetReg1(P3c4,0x08,ah); + SiSSetReg1(P3c4,0x08,ah); data=bl; data=data&0x10; data=data<<1; - data2=GetReg1(P3c4,0x0F); + data2=SiSGetReg1(P3c4,0x0F); data2=data2&0x9f; data2=data2|data; - SetReg1(P3c4,0x0F,data2); + SiSSetReg1(P3c4,0x0F,data2); data=bl+3; if(data>0x0f) data=0x0f; - SetReg1(P3c4,0x3b,0x00); - data2=GetReg1(P3c4,0x09); + SiSSetReg1(P3c4,0x3b,0x00); + data2=SiSGetReg1(P3c4,0x09); data2=data2&0xF0; data2=data2|data; - SetReg1(P3c4,0x09,data2); + SiSSetReg1(P3c4,0x09,data2); } static UShort CalcDelay(ULong ROMAddr,UShort key) @@ -1158,9 +1223,9 @@ static UShort CalcDelay(ULong ROMAddr,UShort key) 42,4,45,6,55,8, 75,12}; UChar ThTiming[]= {1,2,2,3,0,1,1,2}; - data=GetReg1(P3c4,0x16); + data=SiSGetReg1(P3c4,0x16); data=data>>6; - data2=GetReg1(P3c4,0x14); + data2=SiSGetReg1(P3c4,0x14); data2=(data2>>4)&0x0C; data=data|data2; data=data<1; @@ -1174,7 +1239,7 @@ static UShort CalcDelay(ULong ROMAddr,UShort key) } data2=0; - data=GetReg1(P3c4,0x18); + data=SiSGetReg1(P3c4,0x18); if(data&0x02) data2=data2|0x01; if(data&0x20) data2=data2|0x02; if(data&0x40) data2=data2|0x04; @@ -1186,7 +1251,7 @@ static UShort CalcDelay(ULong ROMAddr,UShort key) static void SetCRT1FIFO2(ULong ROMAddr) { UShort index,data,VCLK,data2,MCLKOffset,MCLK,colorth=0; - UShort ah,bl,B; + UShort ah,bl=0,B; ULong eax; index=*((UChar *)(ROMAddr+REFIndex+0x03)); @@ -1197,24 +1262,27 @@ static void SetCRT1FIFO2(ULong ROMAddr) VCLK=*((UShort *)(ROMAddr+VCLKData)); /* Get VCLK */ MCLKOffset=*((UShort *)(ROMAddr+0x20C)); - index=GetReg1(P3c4,0x1A); + index=SiSGetReg1(P3c4,0x1A); index=index&07; MCLKOffset=MCLKOffset+index*5; MCLK=*((UShort *)(ROMAddr+MCLKOffset+0x03)); /* Get MCLK */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(FIFO2) VCLK %x MCLK %x ModeType %x\n", VCLK, MCLK, ModeType)); + data2=ModeType-0x02; switch (data2) { - case 0 : colorth=1; break; - case 1 : colorth=1; break; - case 2 : colorth=2; break; - case 3 : colorth=2; break; - case 4 : colorth=3; break; - case 5 : colorth=4; break; + case 0 : colorth=1; break; /* TW: was 1 - WRONG */ + case 1 : colorth=2; break; /* TW: was 1 - WRONG */ + case 2 : colorth=4; break; /* TW: was 2 - WRONG */ + case 3 : colorth=4; break; /* TW: was 2 - WRONG */ + case 4 : colorth=6; break; /* TW: was 3 - WRONG */ + case 5 : colorth=8; break; /* TW: was 4 - WRONG */ } do{ /*==============*/ B=(CalcDelay2(ROMAddr,0)*VCLK*colorth); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(CRT1FIFO2) CalcDelay returned %x\n", B)); if (B%(16*MCLK) == 0) { B=B/(16*MCLK); @@ -1227,22 +1295,24 @@ static void SetCRT1FIFO2(ULong ROMAddr) } if(bl>0x13) { - data=GetReg1(P3c4,0x15); + data=SiSGetReg1(P3c4,0x15); data=data&0xf0; if(data!=0xb0) { data=data+0x20; if(data==0xa0) data=0x30; - data2=GetReg1(P3c4,0x15); + data2=SiSGetReg1(P3c4,0x15); data2=(data2&0x0f)|data; - SetReg1(P3c4,0x15,data2); + SiSSetReg1(P3c4,0x15,data2); } else bl=0x13; } /*==============*/ } while(bl>0x13); - data2=GetReg1(P3c4,0x15); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(CRT1FIFO2) Threshold %x\n", bl)); + + data2=SiSGetReg1(P3c4,0x15); data2=(data2&0xf0)>>4; data2=data2<<24; @@ -1251,44 +1321,60 @@ static void SetCRT1FIFO2(ULong ROMAddr) eax=GetReg3(0xcfc); eax=eax&0x0f0ffffff; eax=eax|data2; + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED,"(CRT1FIFO2) Reg 4 cfc -> 0x%x\n", eax)); SetReg4(0xcfc,eax); /* ========================*/ ah=bl; ah=ah<<4; ah=ah|0x0f; - SetReg1(P3c4,0x08,ah); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED,"(CRT1FIFO2) 08 -> 0x%x\n", ah)); + SiSSetReg1(P3c4,0x08,ah); data=bl; data=data&0x10; data=data<<1; - data2=GetReg1(P3c4,0x0F); - data2=data2&0x9f; + data2=SiSGetReg1(P3c4,0x0F); + data2=data2&0x9f; /* TW: x: 0x9f (works) sisfb: 0xdf */ data2=data2|data; - SetReg1(P3c4,0x0F,data2); - + SiSSetReg1(P3c4,0x0F,data2); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED,"(CRT1FIFO2) 0f -> | 0x%x\n", data)); + + SiSSetReg1(P3c4,0x3b,0x09); /* TW: x: 00 sisfb: 09 (works) */ + data=bl+3; if(data>0x0f) data=0x0f; - SetReg1(P3c4,0x3b,0x00); - data2=GetReg1(P3c4,0x09); - data2=data2&0xF0; + data2=SiSGetReg1(P3c4,0x09); + data2=data2&0xF0; /* TW: x: 0xf0 (works) sisfb: 0x80 */ data2=data2|data; - SetReg1(P3c4,0x09,data2); + SiSSetReg1(P3c4,0x09,data2); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED,"(CRT1FIFO2) 09 -> | 0x%x\n", data)); } static UShort CalcDelay2(ULong ROMAddr,UShort key) { UShort data,index; +#if 0 /* x driver values */ UChar LatencyFactor[]={88,80,78,72,70,00, 00,79,77,71,69,49, 88,80,78,72,70,00, 00,72,70,64,62,44}; +#endif + +#if 1 /* TW: sisfb values - better */ + static UChar LatencyFactor[] = + { 97, 88, 86, 79, 77, 00, + 00, 87, 85, 78, 76, 54, + 97, 88, 86, 79, 77, 00, + 00, 79, 77, 70, 68, 48, + }; +#endif index=0; - data=GetReg1(P3c4,0x14); + data=SiSGetReg1(P3c4,0x14); if(data&0x80) index=index+12; - data=GetReg1(P3c4,0x15); + data=SiSGetReg1(P3c4,0x15); data=(data&0xf0)>>4; if(data&0x01) index=index+6; @@ -1320,18 +1406,18 @@ static void SetPitch(ScrnInfoPtr pScrn, UShort BaseAddr) UShort Port = BaseAddr + IND_SIS_CRT2_PORT_04; HDisplay = pSiS->scrnOffset / 8; - SetReg1(P3d4, 0x13, HDisplay); - temp = (GetReg1(P3c4, 0x0E) & 0xF0) | (HDisplay>>8); - SetReg1(P3c4, 0x0E, temp); + SiSSetReg1(P3d4, 0x13, HDisplay); + temp = (SiSGetReg1(P3c4, 0x0E) & 0xF0) | (HDisplay>>8); + SiSSetReg1(P3c4, 0x0E, temp); - SetReg1(Port, 0x24, 1); - SetReg1(Port, 0x07, HDisplay); - temp = (GetReg1(Port, 0x09) & 0xF0) | (HDisplay>>8); - SetReg1(Port, 0x09, temp); - + SiSSetReg1(Port, 0x24, 1); + SiSSetReg1(Port, 0x07, HDisplay); + temp = (SiSGetReg1(Port, 0x09) & 0xF0) | (HDisplay>>8); + SiSSetReg1(Port, 0x09, temp); } -static UShort CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) + +UShort SiSCalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) { UShort i = (pScrn->bitsPerPixel+7)/8 - 1; UShort ModeIndex = 0; @@ -1358,11 +1444,15 @@ static UShort CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) case 1600: ModeIndex = ModeIndex_1600x1200[i]; break; + case 1920: + ModeIndex = ModeIndex_1920x1440[i]; + break; } return(ModeIndex); } +/* TW: Calc CRT1 Refresh Rate (to be written to CR33) */ static UShort CalcRefreshRate(ScrnInfoPtr pScrn, DisplayModePtr mode) { SISPtr pSiS = SISPTR(pScrn); @@ -1390,6 +1480,9 @@ static UShort CalcRefreshRate(ScrnInfoPtr pScrn, DisplayModePtr mode) case 1600: Index = 4; break; + case 1920: + Index = 7; + break; case 720: if(mode->VDisplay == 480) Index = 5; @@ -1401,7 +1494,7 @@ static UShort CalcRefreshRate(ScrnInfoPtr pScrn, DisplayModePtr mode) while(RefreshRate[Index][i] != 0) { if(temp == RefreshRate[Index][i]) - { + { Rate=i+1; break; } @@ -1410,6 +1503,8 @@ static UShort CalcRefreshRate(ScrnInfoPtr pScrn, DisplayModePtr mode) } if(pSiS->VBFlags & CRT2_VGA) Rate |= Rate << 4; + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, + "(CalcRate) temp=%d, Index=%d, Rate=%d\n", temp, Index, Rate)); return(Rate); } @@ -1439,38 +1534,38 @@ static Bool SetCRT2Group(UShort BaseAddr,ULong ROMAddr,UShort ModeNo, ScrnInfoPt if(((temp&0x02)==0) && ((VBInfo&CRT2DisplayFlag)==0)) return(FALSE); SaveCRT2Info(ModeNo); - DisableBridge(BaseAddr); - UnLockCRT2(BaseAddr); - SetDefCRT2ExtRegs(BaseAddr); + SiSDisableBridge(BaseAddr); + SiSUnLockCRT2(BaseAddr); + SetDefCRT2ExtRegs(BaseAddr); SetCRT2ModeRegs(BaseAddr,ModeNo); if(IF_DEF_LVDS==0) { if(VBInfo&CRT2DisplayFlag){ - LockCRT2(BaseAddr); + SiSLockCRT2(BaseAddr); return 0; } } GetCRT2Data(ROMAddr,ModeNo); if(IF_DEF_LVDS==1) { - GetLVDSDesData(ROMAddr,ModeNo); + GetLVDSDesData(ROMAddr,ModeNo); } SetGroup1(BaseAddr,ROMAddr,ModeNo,pScrn); if(IF_DEF_LVDS==0) { - SetGroup2(BaseAddr,ROMAddr,ModeNo); + SetGroup2(BaseAddr,ROMAddr,ModeNo); SetGroup3(BaseAddr,ROMAddr); SetGroup4(BaseAddr,ROMAddr,ModeNo); SetGroup5(BaseAddr,ROMAddr); } else { - if(IF_DEF_CH7005==1) SetCHTVReg(ROMAddr,ModeNo); + if(IF_DEF_CH7005==1) SetCHTVReg(ROMAddr,ModeNo); ModCRT1CRTC(ROMAddr,ModeNo); SetCRT2ECLK(ROMAddr,ModeNo); } EnableCRT2(); - EnableBridge(BaseAddr); + SiSEnableBridge(BaseAddr); if(IF_DEF_LVDS==0) { /* SetLockRegs(); */ } - LockCRT2(BaseAddr); + SiSLockCRT2(BaseAddr); return 1; } @@ -1482,15 +1577,17 @@ static void SetDefCRT2ExtRegs(UShort BaseAddr) Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10; Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14; if(IF_DEF_LVDS==0) { - SetReg1(Part1Port,0x02,0x40); - SetReg1(Part4Port,0x10,0x80); - temp=(UChar)GetReg1(P3c4,0x16); + SiSSetReg1(Part1Port,0x02,0x40); + SiSSetReg1(Part4Port,0x10,0x80); + temp=(UChar)SiSGetReg1(P3c4,0x16); temp=temp&0xC3; - SetReg1(P3d4,0x35,temp); + SiSSetReg1(P3d4,0x35,temp); } else { - SetReg1(P3d4,0x32,0x02); - SetReg1(Part1Port,0x02,0x00); + /* TW: Set VB to SVIDEO and clear eg. CRT1 and LCD ?! */ + /* Why touch this? CR32 should be read only */ + /* SiSSetReg1(P3d4,0x32,0x02); */ + SiSSetReg1(Part1Port,0x02,0x00); } } @@ -1510,7 +1607,7 @@ static UShort GetRatePtrCRT2(ULong ROMAddr, UShort ModeNo) } if(ModeNo<0x14) return(0); /* Mode No <= 13h then return */ - index=GetReg1(P3d4,0x33); /* Get 3d4 CRTC33 */ + index=SiSGetReg1(P3d4,0x33); /* Get 3d4 CRTC33 */ index=index>>SelectCRT2Rate; /* For CRT2,cl=SelectCRT2Rate=4, shr ah,cl */ index=index&0x0F; /* Frame rate index */ if(index!=0) index--; @@ -1560,9 +1657,10 @@ static UShort GetRatePtrCRT2(ULong ROMAddr, UShort ModeNo) } } while(index>=0); REFIndex=REFIndex-ulRefIndexLength; /* rate size */ - + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "RefIndex after GetRatePtrCRT2: %x\n", REFIndex)); if((SetFlag&ProgrammingCRT2)){ temp1=AjustCRT2Rate(ROMAddr); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "RefIndex after AdjustCRT2Rate: %x\n", REFIndex)); }else{ temp1=0; } @@ -1658,61 +1756,118 @@ static void SaveCRT2Info(UShort ModeNo) UShort temp1,temp2,temp3; temp1=(VBInfo&SetInSlaveMode)>>8; temp2=~(SetInSlaveMode>>8); - temp3=(UChar)GetReg1(P3d4,0x31); + temp3=(UChar)SiSGetReg1(P3d4,0x31); temp3=((temp3&temp2)|temp1); - SetReg1(P3d4,0x31,(UShort)temp3); - temp3=(UChar)GetReg1(P3d4,0x35); + SiSSetReg1(P3d4,0x31,(UShort)temp3); + temp3=(UChar)SiSGetReg1(P3d4,0x35); temp3=temp3&0xF3; - SetReg1(P3d4,0x35,(UShort)temp3); + SiSSetReg1(P3d4,0x35,(UShort)temp3); } static void DisableLockRegs(void) { UChar temp3; - temp3=(UChar)GetReg1(P3c4,0x32); + temp3=(UChar)SiSGetReg1(P3c4,0x32); temp3=temp3&0xDF; - SetReg1(P3c4,0x32,(UShort)temp3); + SiSSetReg1(P3c4,0x32,(UShort)temp3); } static void DisableCRT2(void) { UChar temp3; - temp3=(UChar)GetReg1(P3c4,0x1E); + temp3=(UChar)SiSGetReg1(P3c4,0x1E); temp3=temp3&0xDF; - SetReg1(P3c4,0x1E,(UShort)temp3); + SiSSetReg1(P3c4,0x1E,(UShort)temp3); +} + +void SiSDisableBridge(UShort BaseAddr) +{ + if(IF_DEF_LVDS==0) { + SiSDisableBridge301(BaseAddr); + } else { + SiSDisableBridgeLVDS(BaseAddr); + } } -void DisableBridge(UShort BaseAddr) +void SiSDisableBridge301(UShort BaseAddr) /* TW: needed for external X driver using VESA */ { UChar temp3,part2_02,part2_05; - UShort Part2Port,Part1Port=0; + UShort Part2Port; Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10; - if(IF_DEF_LVDS==0) { - part2_02=(UChar)GetReg1(Part2Port,0x02); - part2_05=(UChar)GetReg1(Part2Port,0x05); + part2_02=(UChar)SiSGetReg1(Part2Port,0x02); + part2_05=(UChar)SiSGetReg1(Part2Port,0x05); /* if(!WaitVBRetrace(BaseAddr)) */ /* return 0:no enable read dram */ { LongWait(); DisableLockRegs(); } - SetReg1(Part2Port,0x02,0x38); - SetReg1(Part2Port,0x05,0xFF); - temp3=(UChar)GetReg1(Part2Port,0x00); + SiSSetReg1(Part2Port,0x02,0x38); + SiSSetReg1(Part2Port,0x05,0xFF); + temp3=(UChar)SiSGetReg1(Part2Port,0x00); temp3=temp3&0xDF; - SetReg1(Part2Port,0x00,(UShort)temp3); - SetReg1(Part2Port,0x02,part2_02); - SetReg1(Part2Port,0x05,part2_05); + SiSSetReg1(Part2Port,0x00,(UShort)temp3); + SiSSetReg1(Part2Port,0x02,part2_02); + SiSSetReg1(Part2Port,0x05,part2_05); DisableCRT2(); - } - else { +} + +void SiSDisableBridge301B(UShort BaseAddr) /* TW: needed for external X driver using VESA */ +{ + UChar temp3; + UShort Part4Port,Part2Port=0; + Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10; + Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14; + + SetRegANDOR (P3c4,0x11,0xF7,0x08); + + SetRegAND(P3c4, 0x32, 0xDF); + if ((!(IsDualEdge301B(BaseAddr))) && (!(IsVAMode301B(BaseAddr)))) + temp3 = 0x7F; + else if ((!(IsDualEdge301B(BaseAddr))) && (IsVAMode301B(BaseAddr))) + temp3 = 0xBF; + else temp3 = 0x3F; + SetRegAND (Part4Port,0x1F,temp3); +} + +void SiSDisableBridgeLVDS(UShort BaseAddr) /* TW: needed for external X driver using VESA */ +{ + UShort Part2Port,Part1Port=0; + Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10; + Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; + DisableLockRegs(); DisableCRT2(); - UnLockCRT2(BaseAddr); + SiSUnLockCRT2(BaseAddr); SetRegANDOR(Part1Port,0x02,0xFF,0x40); /*et Part1Port ,index 2, D6=1, */ - } } +static Bool IsDualEdge301B(UShort BaseAddr) +{ +#if 0 /* TW: This is only for SiS315 */ + UShort flag; + flag = SiSGetReg1(P3d4,0x38); + if (flag & EnableDualEdge) + return (0); + else +#endif + return (1); +} + +static Bool IsVAMode301B (UShort BaseAddr) +{ +#if 0 /* TW: This is only for SiS315 */ + UShort flag; + + flag = SiSGetReg1(P3d4,0x38); + if ((flag & EnableDualEdge) && (flag & SetToLCDA)) + return (0); + else +#endif + return (1); +} + + static void GetCRT2Data(ULong ROMAddr,UShort ModeNo) { if(IF_DEF_LVDS==0){ /*301 */ @@ -1732,15 +1887,18 @@ static void GetCRT2DataLVDS(ULong ROMAddr,UShort ModeNo) GetResInfo(ROMAddr,ModeNo); GetCRT2Ptr(ROMAddr,ModeNo); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "BIOSIndex: 0x%x, ModeNo 0x%x\n", REFIndex, ModeNo)); + tempax=*((UShort *)(ROMAddr+REFIndex)); tempax=tempax&0x0FFF; VGAHT=tempax; + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDS VGAHT: 0x%x\n", tempax)); tempax=*((UShort *)(ROMAddr+REFIndex+1)); tempax=tempax>>4; tempax=tempax&0x07FF; VGAVT=tempax; -/* VGAVT=518; */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDS VGAVT: 0x%x\n", tempax)); tempax=*((UShort *)(ROMAddr+REFIndex+3)); tempax=tempax&0x0FFF; @@ -1749,7 +1907,9 @@ static void GetCRT2DataLVDS(ULong ROMAddr,UShort ModeNo) tempbx=tempbx&0x07FF; HT=tempax; + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDS LCDHT: 0x%x\n", tempax)); VT=tempbx; + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDS LCDVT: 0x%x\n", tempbx)); if(IF_DEF_TRUMPION==0){ if(VBInfo&SetCRT2ToLCD){ @@ -1763,7 +1923,7 @@ static void GetCRT2DataLVDS(ULong ROMAddr,UShort ModeNo) }else{ tempax=1280; tempbx=1024; - } + } HDE=tempax; VDE=tempbx; } @@ -1944,8 +2104,10 @@ static void GetLVDSDesData(ULong ROMAddr,UShort ModeNo) REFIndex=GetLVDSDesPtr(ROMAddr,ModeNo); tempax=*((UShort *)(ROMAddr+REFIndex)); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDSDes ROMData 1: %x\n", tempax)); tempax=tempax&0x0FFF; LCDHDES=tempax; + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDSDes LCDHDES: %x\n", tempax)); if(LCDInfo&LCDNonExpanding){ /*hw walk-a-round */ if(LCDResInfo>=Panel1024x768){ @@ -1956,9 +2118,11 @@ static void GetLVDSDesData(ULong ROMAddr,UShort ModeNo) } tempax=*((UShort *)(ROMAddr+REFIndex+1)); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDSDes ROMData 2: %x\n", tempax)); tempax=tempax>>4; tempax=tempax&0x07FF; LCDVDES=tempax; + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDSDes LCDVDES: %x\n", tempax)); REFIndex=old_REFIndex; /*pop di */ return; @@ -2081,14 +2245,14 @@ static void GetCRT2Ptr(ULong ROMAddr,UShort ModeNo) } } -void UnLockCRT2(UShort BaseAddr) +void SiSUnLockCRT2(UShort BaseAddr) { UChar temp3; UShort Part1Port; Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; - temp3=(UChar)GetReg1(Part1Port,0x24); + temp3=(UChar)SiSGetReg1(Part1Port,0x24); temp3=temp3|0x01; - SetReg1(Part1Port,0x24,(UShort)temp3); + SiSSetReg1(Part1Port,0x24,(UShort)temp3); } static void SetCRT2ModeRegs(UShort BaseAddr,UShort ModeNo) @@ -2100,7 +2264,7 @@ static void SetCRT2ModeRegs(UShort BaseAddr,UShort ModeNo) Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14; Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; for(i=0,j=4;i<3;i++,j++){ - SetReg1(Part1Port,j,0); + SiSSetReg1(Part1Port,j,0); } tempcl=ModeType; @@ -2119,10 +2283,10 @@ static void SetCRT2ModeRegs(UShort BaseAddr,UShort ModeNo) if(VBInfo&CRT2DisplayFlag){ tempah=0; } - SetReg1(Part1Port,0,tempah); + SiSSetReg1(Part1Port,0,tempah); - if(IF_DEF_LVDS==0) { + if(IF_DEF_LVDS==0) { /* (TW) 301 */ tempah=0x01; if(!(VBInfo&SetInSlaveMode)){ tempah=(tempah|0x02); @@ -2137,7 +2301,7 @@ static void SetCRT2ModeRegs(UShort BaseAddr,UShort ModeNo) if(VBInfo&CRT2DisplayFlag){ tempah=0; } - SetReg1(Part1Port,0x01,tempah); + SiSSetReg1(Part1Port,0x01,tempah); tempah=tempah>>5; if((ModeType==ModeVGA)&&(!(VBInfo&SetInSlaveMode))){ @@ -2152,10 +2316,10 @@ static void SetCRT2ModeRegs(UShort BaseAddr,UShort ModeNo) } } - temp3=(UChar)GetReg1(Part4Port,0x0D); + temp3=(UChar)SiSGetReg1(Part4Port,0x0D); temp3=temp3&(~0x0BF); temp3=temp3|tempah; - SetReg1(Part4Port,0x0D,(UShort)temp3); + SiSSetReg1(Part4Port,0x0D,(UShort)temp3); /* ynlai begin */ tempah=0; @@ -2175,10 +2339,10 @@ static void SetCRT2ModeRegs(UShort BaseAddr,UShort ModeNo) } if(LCDResInfo==Panel1280x1024) tempah=tempah|0x80; if(LCDResInfo==Panel1280x960) tempah=tempah|0x80; - SetReg1(Part4Port,0x0C,(UShort)temp3); + SiSSetReg1(Part4Port,0x0C,(UShort)temp3); /* ynlai end */ } - else { + else { /* (TW) - LVDS */ tempah=0; if(!(VBInfo&SetInSlaveMode)){ tempah=tempah|0x02; @@ -2187,7 +2351,22 @@ static void SetCRT2ModeRegs(UShort BaseAddr,UShort ModeNo) if(VBInfo&CRT2DisplayFlag){ tempah=0; } - SetReg1(Part1Port,0x01,tempah); + + /* + * @@@ bits 5,6,7 cause my display to go goofy. This cannot be + * correct. Therefore we leave it as it is. I need to get in touch + * with somebody at SiS who can explain to me how to set up + * this register. + */ +#if 0 + SiSSetReg1(Part1Port,0x01,tempah); +#endif + +/* TW start */ +/* In kernel sisfb, the following is done instead of the line "#if 0"-ed above: + (has no visual effect, therefore I assume it's good for something) */ + SetRegANDOR(Part1Port, 0x2e, 0xF0, tempah); +/* TW end */ } } @@ -2218,54 +2397,85 @@ static void SetGroup1_LVDS(UShort BaseAddr,ULong ROMAddr,UShort ModeNo, SetCRT2Sync(BaseAddr,ROMAddr,ModeNo); temp1=(VGAHT-1)&0x0FF; /*BTVGA2HT 0x08,0x09 */ - SetReg1(Part1Port,0x08,temp1); + SiSSetReg1(Part1Port,0x08,temp1); temp1=(((VGAHT-1)&0xFF00)>>8)<<4; SetRegANDOR(Part1Port,0x09,~0x0F0,temp1); - - + temp1=(VGAHDE+12)&0x0FF; /*BTVGA2HDEE 0x0A,0x0C */ - SetReg1(Part1Port,0x0A,temp1); + SiSSetReg1(Part1Port,0x0A,temp1); /*temp1=((VGAHDE+12)&0xFF00)>>8; Wrong */ - /*SetReg1(Part1Port,0x0C,temp1); */ - + /*SiSSetReg1(Part1Port,0x0C,temp1); */ + temp1=VGAHDE+12; /*bx BTVGA@HRS 0x0B,0x0C */ temp2=(VGAHT-VGAHDE)>>2; /* */ temp1=temp1+temp2; temp2=(temp2<<1)+temp1; tempcl=temp2&0x0FF; + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 0b -> 0x%x\n", temp1)); + SiSSetReg1(Part1Port,0x0B,(UShort)(temp1&0x0FF)); - SetReg1(Part1Port,0x0B,(UShort)(temp1&0x0FF)); tempah=(temp1&0xFF00)>>8; tempbh=((((VGAHDE+12)&0xFF00)>>8)<<4)&0x0FF; tempah=tempah|tempbh; - SetReg1(Part1Port,0x0C,tempah); - SetReg1(Part1Port,0x0D,tempcl); /*BTVGA2HRE 0x0D */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 0c -> 0x%x\n", tempah)); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 0d -> 0x%x\n", tempcl)); + SiSSetReg1(Part1Port,0x0C,tempah); + SiSSetReg1(Part1Port,0x0D,tempcl); /*BTVGA2HRE 0x0D */ tempcx=(VGAVT-1); tempah=tempcx&0x0FF; if(IF_DEF_CH7005==1) { if(VBInfo&0x0C) tempah=tempah-1; - } - SetReg1(Part1Port,0x0E,tempah); /*BTVGA2TV 0x0E,0x12 */ + } + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 0e -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x0E,tempah); /*BTVGA2TV 0x0E,0x12 */ tempbx=VGAVDE-1; tempah=tempbx&0x0FF; if(IF_DEF_CH7005==1) { if(VBInfo&0x0C) tempah=tempah-1; - } - SetReg1(Part1Port,0x0F,tempah); /*BTVGA2VDEE 0x0F,0x12 */ + } + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 0f -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x0F,tempah); /*BTVGA2VDEE 0x0F,0x12 */ tempah=((tempbx&0xFF00)<<3)>>8; tempah=tempah|((tempcx&0xFF00)>>8); - SetReg1(Part1Port,0x12,tempah); - + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 12 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x12,tempah); + tempbx=(VGAVT+VGAVDE)>>1; /*BTVGA2VRS 0x10,0x11 */ tempcx=((VGAVT-VGAVDE)>>4)+tempbx+1; /*BTVGA2VRE 0x11 */ tempah=tempbx&0x0FF; - SetReg1(Part1Port,0x10,tempah); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 10 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x10,tempah); tempbh=(tempbx&0xFF00)>>8; tempah=((tempbh<<4)&0x0FF)|(tempcx&0x0F); - SetReg1(Part1Port,0x11,tempah); - + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 11 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x11,tempah); + + /* TW: new */ + if (IF_DEF_LVDS==0) { + tempah = 0x20; + if (LCDResInfo == Panel1280x1024) + tempah = 0x20; + if (LCDResInfo == Panel1280x960) + tempah = 0x24; + if (VBInfo & SetCRT2ToTV) + tempah = 0x08; + if (VBInfo & SetCRT2ToHiVisionTV) { + if (VBInfo & SetInSlaveMode) + tempah = 0x2c; + else + tempah = 0x20; + } + } else { + tempah = 0x20; + } + /* TW end */ + /* TW: old comment: */ + /* @@@ This can't be right! For now we just leave it as it is */ + /* TW: This is right - with the new code above! */ +#if 1 SetRegANDOR(Part1Port,0x13,~0x03C,tempah); +#endif /*lines below are newly added for LVDS */ tempax=LCDHDES; @@ -2289,25 +2499,32 @@ static void SetGroup1_LVDS(UShort BaseAddr,ULong ROMAddr,UShort ModeNo, tempax=tempcx; tempax=tempax>>3; /*BPLHRS */ tempah=tempax&0x0FF; - SetReg1(Part1Port,0x14,tempah); /*Part1_14h */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 14 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x14,tempah); /*Part1_14h */ tempah=tempah+2; tempah=tempah+0x01F; tempcl=tempcx&0x0FF; tempcl=tempcl&0x07; tempcl=(tempcl<<5)&0xFF; /* PHLHSKEW */ tempah=tempah|tempcl; - SetReg1(Part1Port,0x15,tempah); /*Part1_15h */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 15 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x15,tempah); /*Part1_15h */ tempbx=lcdhdee; /*lcdhdee */ tempcx=LCDHDES; /*lcdhdes */ tempah=(tempcx&0xFF); tempah=tempah&0x07; /*BPLHDESKEW */ - SetReg1(Part1Port,0x1A,tempah); /*Part1_1Ah */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 1a -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x1A,tempah); /*Part1_1Ah */ tempcx=tempcx>>3; /*BPLHDES */ tempah=(tempcx&0xFF); - SetReg1(Part1Port,0x16,tempah); /*Part1_16h */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 16 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x16,tempah); /*Part1_16h */ + if (tempbx&0x07) + tempbx=tempbx+8; tempbx=tempbx>>3; /*BPLHDEE */ tempah=tempbx&0xFF; - SetReg1(Part1Port,0x17,tempah); /*Part1_17h */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 17 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x17,tempah); /*Part1_17h */ tempcx=VGAVT; tempbx=VGAVDE; @@ -2335,13 +2552,15 @@ static void SetGroup1_LVDS(UShort BaseAddr,ULong ROMAddr,UShort ModeNo, tempbx=tempbx-tempax; } tempah=tempbx&0xFF; - SetReg1(Part1Port,0x18,tempah); /*Part1_18h */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 18 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x18,tempah); /*Part1_18h */ tempcx=tempcx>>3; tempcx=tempcx+tempbx; tempcx++; /*BPLVRE */ tempah=tempcx&0xFF; tempah=tempah&0x0F; tempah=tempah|0x030; + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 19 -> 0x%x\n", tempah)); SetRegANDOR(Part1Port,0x19,~0x03F,tempah); /*Part1_19h */ tempbh=(tempbx&0xFF00)>>8; tempbh=tempbh&0x07; @@ -2352,7 +2571,9 @@ static void SetGroup1_LVDS(UShort BaseAddr,ULong ROMAddr,UShort ModeNo, if(tempbx!=VDE){ tempah=tempah|0x40; } + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 1a -> 0x%x\n", tempah)); SetRegANDOR(Part1Port,0x1A,0x07,tempah); /*Part1_1Ah */ + tempecx=VGAVT; tempebx=VDE; tempeax=VGAVDE; @@ -2367,7 +2588,9 @@ static void SetGroup1_LVDS(UShort BaseAddr,ULong ROMAddr,UShort ModeNo, tempebx=tempebx&0x03F; } tempah=(UShort)(tempebx&0x0FF); - SetReg1(Part1Port,0x1E,tempah); /*Part1_1Eh */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 1e -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x1E,tempah); /*Part1_1Eh */ + tempbx=temppush2; /* p bx temppush2 BPLVDEE */ tempcx=temppush1; /*pop cx temppush1 NPLVDES */ tempbh=(tempbx&0xFF00)>>8; @@ -2377,11 +2600,14 @@ static void SetGroup1_LVDS(UShort BaseAddr,ULong ROMAddr,UShort ModeNo, tempch=(tempcx&0xFF00)>>8; tempch=tempch&0x07; tempah=tempah|tempch; - SetReg1(Part1Port,0x1D,tempah); /*Part1_1Dh */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 1d -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x1D,tempah); /*Part1_1Dh */ tempah=tempbx&0xFF; - SetReg1(Part1Port,0x1C,tempah); /*Part1_1Ch */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 1c -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x1C,tempah); /*Part1_1Ch */ tempah=tempcx&0xFF; - SetReg1(Part1Port,0x1B,tempah); /*Part1_1Bh */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 1b -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x1B,tempah); /*Part1_1Bh */ tempecx=VGAHDE; tempebx=HDE; @@ -2402,7 +2628,8 @@ static void SetGroup1_LVDS(UShort BaseAddr,ULong ROMAddr,UShort ModeNo, tempax=(UShort)(tempeax&0x00FFFF); tempcx=tempax; tempah=tempcx&0x0FF; - SetReg1(Part1Port,0x1F,tempah); /*Part1_1Fh */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 1f -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x1F,tempah); /*Part1_1Fh */ tempbx=VDE; tempbx--; /*BENPLACCEND */ if(SetFlag&EnableLVDSDDA){ @@ -2413,9 +2640,11 @@ static void SetGroup1_LVDS(UShort BaseAddr,ULong ROMAddr,UShort ModeNo, tempch=(tempcx&0xFF00)>>8; tempch=tempch&0x07; tempah=tempah|tempch; - SetReg1(Part1Port,0x20,tempah); /*Part1_20h */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 20 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x20,tempah); /*Part1_20h */ tempah=tempbx&0xFF; - SetReg1(Part1Port,0x21,tempah); /*Part1_21h */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 21 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x21,tempah); /*Part1_21h */ tempecx=tempecx>>16; /*BPLHCFACT */ temp1=*((UShort *)(ROMAddr+ModeIDOffset+0x01)); /* si+St_ModeFlag */ if(temp1&HalfDCLK){ @@ -2423,9 +2652,11 @@ static void SetGroup1_LVDS(UShort BaseAddr,ULong ROMAddr,UShort ModeNo, } tempcx=(UShort)(tempecx&0x0FFFF); tempah=(tempcx&0xFF00)>>8; - SetReg1(Part1Port,0x22,tempah); /*Part1_22h */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 22 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x22,tempah); /*Part1_22h */ tempah=tempcx&0x0FF; - SetReg1(Part1Port,0x23,tempah); /*Part1_23h */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(grp1) 23 -> 0x%x\n", tempah)); + SiSSetReg1(Part1Port,0x23,tempah); /*Part1_23h */ if(IF_DEF_TRUMPION==1){ tempal=(UShort)*((UChar *)(ROMAddr+ModeIDOffset+0x05)); /* si+St_ResInfo */ if(ModeNo>0x13){ @@ -2468,12 +2699,12 @@ static void SetGroup1_301(UShort BaseAddr,ULong ROMAddr,UShort ModeNo,ScrnInfoPt GetCRT1Ptr(ROMAddr); temp1=(VGAHT-1)&0x0FF; /* BTVGA2HT 0x08,0x09 */ - SetReg1(Part1Port,0x08,temp1); + SiSSetReg1(Part1Port,0x08,temp1); temp1=(((VGAHT-1)&0xFF00)>>8)<<4; SetRegANDOR(Part1Port,0x09,~0x0F0,temp1); temp1=(VGAHDE+12)&0x0FF; /* BTVGA2HDEE 0x0A,0x0C */ - SetReg1(Part1Port,0x0A,temp1); + SiSSetReg1(Part1Port,0x0A,temp1); temp1=VGAHDE+12; /* bx BTVGA@HRS 0x0B,0x0C */ temp2=(VGAHT-VGAHDE)>>2; /* cx */ @@ -2491,21 +2722,21 @@ static void SetGroup1_301(UShort BaseAddr,ULong ROMAddr,UShort ModeNo,ScrnInfoPt tempch=(tempch&0x04)<<(6-2); tempcl=((tempcl|tempch)-1)<<3; } - SetReg1(Part1Port,0x0B,(UShort)(temp1&0x0FF)); + SiSSetReg1(Part1Port,0x0B,(UShort)(temp1&0x0FF)); tempah=(temp1&0xFF00)>>8; tempbh=((((VGAHDE+12)&0xFF00)>>8)<<4)&0x0FF; tempah=tempah|tempbh; - SetReg1(Part1Port,0x0C,tempah); - SetReg1(Part1Port,0x0D,tempcl); /* BTVGA2HRE 0x0D */ + SiSSetReg1(Part1Port,0x0C,tempah); + SiSSetReg1(Part1Port,0x0D,tempcl); /* BTVGA2HRE 0x0D */ tempcx=(VGAVT-1); tempah=tempcx&0x0FF; - SetReg1(Part1Port,0x0E,tempah); /* BTVGA2TV 0x0E,0x12 */ + SiSSetReg1(Part1Port,0x0E,tempah); /* BTVGA2TV 0x0E,0x12 */ tempbx=VGAVDE-1; tempah=tempbx&0x0FF; - SetReg1(Part1Port,0x0F,tempah); /* BTVGA2VDEE 0x0F,0x12 */ + SiSSetReg1(Part1Port,0x0F,tempah); /* BTVGA2VDEE 0x0F,0x12 */ tempah=((tempbx&0xFF00)<<3)>>8; tempah=tempah|((tempcx&0xFF00)>>8); - SetReg1(Part1Port,0x12,tempah); + SiSSetReg1(Part1Port,0x12,tempah); tempbx=(VGAVT+VGAVDE)>>1; /* BTVGA2VRS 0x10,0x11 */ tempcx=((VGAVT-VGAVDE)>>4)+tempbx+1; /* BTVGA2VRE 0x11 */ @@ -2526,10 +2757,10 @@ static void SetGroup1_301(UShort BaseAddr,ULong ROMAddr,UShort ModeNo,ScrnInfoPt tempcx=(tempcx&0xFF00)|(tempcl&0x00FF); } tempah=tempbx&0x0FF; - SetReg1(Part1Port,0x10,tempah); + SiSSetReg1(Part1Port,0x10,tempah); tempbh=(tempbx&0xFF00)>>8; tempah=((tempbh<<4)&0x0FF)|(tempcx&0x0F); - SetReg1(Part1Port,0x11,tempah); + SiSSetReg1(Part1Port,0x11,tempah); if( pSiS->Chipset == PCI_CHIP_SIS300 ){ tempah=0x10; @@ -2568,7 +2799,7 @@ static void SetGroup1_301(UShort BaseAddr,ULong ROMAddr,UShort ModeNo,ScrnInfoPt tempax=(tempax/tempcl)-5; tempbl=tempax; tempah=0xFF; /* set MAX HT */ - SetReg1(Part1Port,0x03,tempah); + SiSSetReg1(Part1Port,0x03,tempah); tempax=VGAHDE; /* 0x04 Horizontal Display End */ if(temp1&HalfDCLK){ @@ -2576,7 +2807,7 @@ static void SetGroup1_301(UShort BaseAddr,ULong ROMAddr,UShort ModeNo,ScrnInfoPt } tempax=(tempax/tempcl)-1; tempbh=tempax; - SetReg1(Part1Port,0x04,tempax); + SiSSetReg1(Part1Port,0x04,tempax); tempah=tempbh; if(VBInfo&SetCRT2ToTV){ @@ -2588,8 +2819,8 @@ static void SetGroup1_301(UShort BaseAddr,ULong ROMAddr,UShort ModeNo,ScrnInfoPt if(resinfo==7) tempah=tempah-2; } /* ynlai end */ - SetReg1(Part1Port,0x05,tempah); /* 0x05 Horizontal Display Start */ - SetReg1(Part1Port,0x06,0x03); /* 0x06 Horizontal Blank end */ + SiSSetReg1(Part1Port,0x05,tempah); /* 0x05 Horizontal Display Start */ + SiSSetReg1(Part1Port,0x06,0x03); /* 0x06 Horizontal Blank end */ /* 0x07 horizontal Retrace Start */ /* ynlai begin */ if(IF_DEF_HiVision==1) { @@ -2638,12 +2869,12 @@ static void SetGroup1_301(UShort BaseAddr,ULong ROMAddr,UShort ModeNo,ScrnInfoPt } } } - SetReg1(Part1Port,0x07,tempah); /* 0x07 Horizontal Retrace Start */ + SiSSetReg1(Part1Port,0x07,tempah); /* 0x07 Horizontal Retrace Start */ - SetReg1(Part1Port,0x08,0); /* 0x08 Horizontal Retrace End */ - SetReg1(Part1Port,0x18,0x03); /* 0x18 SR08 */ - SetReg1(Part1Port,0x19,0); /* 0x19 SR0C */ - SetReg1(Part1Port,0x09,0xFF); /* 0x09 Set Max VT */ + SiSSetReg1(Part1Port,0x08,0); /* 0x08 Horizontal Retrace End */ + SiSSetReg1(Part1Port,0x18,0x03); /* 0x18 SR08 */ + SiSSetReg1(Part1Port,0x19,0); /* 0x19 SR0C */ + SiSSetReg1(Part1Port,0x09,0xFF); /* 0x09 Set Max VT */ tempcx=0x121; tempcl=0x21; @@ -2654,8 +2885,8 @@ static void SetGroup1_301(UShort BaseAddr,ULong ROMAddr,UShort ModeNo,ScrnInfoPt if(tempbx==405) tempbx=400; tempbx--; tempah=tempbx&0x0FF; - SetReg1(Part1Port,0x0E,tempah); - SetReg1(Part1Port,0x10,tempah); /* 0x10 vertical Blank Start */ + SiSSetReg1(Part1Port,0x0E,tempah); + SiSSetReg1(Part1Port,0x10,tempah); /* 0x10 vertical Blank Start */ tempbh=(tempbx&0xFF00)>>8; if(tempbh&0x01){ tempcl=tempcl|0x0A; @@ -2668,12 +2899,12 @@ static void SetGroup1_301(UShort BaseAddr,ULong ROMAddr,UShort ModeNo,ScrnInfoPt tempcl=tempcl|0x040; tempah=tempah|0x020; } - SetReg1(Part1Port,0x0B,tempah); + SiSSetReg1(Part1Port,0x0B,tempah); if(tempbh&0x04){ tempch=tempch|0x06; } - SetReg1(Part1Port,0x11,0); /* 0x11 Vertival Blank End */ + SiSSetReg1(Part1Port,0x11,0); /* 0x11 Vertival Blank End */ tempax=VGAVT-tempbx; /* 0x0C Vertical Retrace Start */ tempax=tempax>>2; @@ -2686,7 +2917,7 @@ static void SetGroup1_301(UShort BaseAddr,ULong ROMAddr,UShort ModeNo,ScrnInfoPt tempbx=tempbx+40; } tempah=(tempbx&0x0FF); - SetReg1(Part1Port,0x0C,tempah); + SiSSetReg1(Part1Port,0x0C,tempah); tempbh=(tempbx&0xFF00)>>8; if(tempbh&0x01){ tempcl=tempcl|0x04; @@ -2702,23 +2933,23 @@ static void SetGroup1_301(UShort BaseAddr,ULong ROMAddr,UShort ModeNo,ScrnInfoPt tempax=(tempax>>2)+1; tempbx=tempbx+tempax; tempah=(tempbx&0x0FF)&0x0F; - SetReg1(Part1Port,0x0D,tempah); /* 0x0D vertical Retrace End */ + SiSSetReg1(Part1Port,0x0D,tempah); /* 0x0D vertical Retrace End */ tempbl=tempbx&0x0FF; if(tempbl&0x10){ tempch=tempch|0x020; } tempah=tempcl; - SetReg1(Part1Port,0x0A,tempah); /* 0x0A CR07 */ + SiSSetReg1(Part1Port,0x0A,tempah); /* 0x0A CR07 */ tempah=tempch; - SetReg1(Part1Port,0x17,tempah); /* 0x17 SR0A */ + SiSSetReg1(Part1Port,0x17,tempah); /* 0x17 SR0A */ tempax=*((UShort *)(ROMAddr+ModeIDOffset+0x01)); /* si+St_ModeFlag */ tempah=(tempax&0xFF00)>>8; tempah=(tempah>>1)&0x09; - SetReg1(Part1Port,0x16,tempah); /* 0x16 SR01 */ - SetReg1(Part1Port,0x0F,0); /* 0x0F CR14 */ - SetReg1(Part1Port,0x12,0); /* 0x12 CR17 */ - SetReg1(Part1Port,0x1A,0); /* 0x1A SR0E */ + SiSSetReg1(Part1Port,0x16,tempah); /* 0x16 SR01 */ + SiSSetReg1(Part1Port,0x0F,0); /* 0x0F CR14 */ + SiSSetReg1(Part1Port,0x12,0); /* 0x12 CR17 */ + SiSSetReg1(Part1Port,0x1A,0); /* 0x1A SR0E */ REFIndex=OldREFIndex; /* pop di */ } @@ -2730,9 +2961,10 @@ static void SetCRT2Offset(UShort Part1Port,ULong ROMAddr) return; } offset=GetOffset(ROMAddr); - SetReg1(Part1Port,0x07,(UShort)(offset&0xFF)); - SetReg1(Part1Port,0x09,(UShort)((offset&0xFF00)>>8)); - SetReg1(Part1Port,0x03,(UShort)(((offset>>3)&0xFF)+1)); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(CRT2Offset) offset %x\n", offset)); + SiSSetReg1(Part1Port,0x07,(UShort)(offset&0xFF)); + SiSSetReg1(Part1Port,0x09,(UShort)((offset&0xFF00)>>8)); + SiSSetReg1(Part1Port,0x03,(UShort)(((offset>>3)&0xFF)+1)); } static UShort GetOffset(ULong ROMAddr) @@ -2770,6 +3002,19 @@ static void SetCRT2FIFO(UShort Part1Port,ULong ROMAddr,UShort ModeNo,ScrnInfoPt UShort oldREFIndex,CRT1ModeNo,oldModeIDOffset; long int longtemp; +#if 1 /* TW: sisfb values - better */ + static UShort LatencyFactor[] = { 97, 88, 86, 79, 77, 00, /*; 64 bit BQ=2 */ + 00, 87, 85, 78, 76, 54, /*; 64 bit BQ=1 */ + 97, 88, 86, 79, 77, 00, /*; 128 bit BQ=2 */ + 00, 79, 77, 70, 68, 48, /*; 128 bit BQ=1 */ + 80, 72, 69, 63, 61, 00, /*; 64 bit BQ=2 */ + 00, 70, 68, 61, 59, 37, /*; 64 bit BQ=1 */ + 86, 77, 75, 68, 66, 00, /*; 128 bit BQ=2 */ + 00, 68, 66, 59, 57, 37 /*; 128 bit BQ=1 */ + }; +#endif + +#if 0 /* TW: x driver values */ static UShort LatencyFactor[48]={ 88, 80, 78, 72, 70, 00, /* 64 bit BQ=2 */ 00, 79, 77, 71, 69, 49, /* 64 bit BQ=1 */ 88, 80, 78, 72, 70, 00, /* 128 bit BQ=2 */ @@ -2778,19 +3023,22 @@ static void SetCRT2FIFO(UShort Part1Port,ULong ROMAddr,UShort ModeNo,ScrnInfoPt 00, 64, 62, 56, 54, 34, /* 64 bit BQ=1 */ 78, 70, 68, 62, 60, 00, /* 128 bit BQ=2 */ 00, 62, 60, 54, 52, 34}; /* 128 bit BQ=1 */ +#endif oldREFIndex=REFIndex; /* push REFIndex(CRT2 now) */ oldModeIDOffset=ModeIDOffset; /* push ModeIDOffset */ - CRT1ModeNo=(UChar)GetReg1(P3d4,0x34); /* get CRT1 ModeNo */ + CRT1ModeNo=(UChar)SiSGetReg1(P3d4,0x34); /* get CRT1 ModeNo */ SearchModeID(ROMAddr,CRT1ModeNo); /* Get ModeID Table */ GetRatePtr(ROMAddr,CRT1ModeNo); /* Set REFIndex-> for crt1 refreshrate */ temp1=GetVCLK(ROMAddr,CRT1ModeNo); temp2=GetColorTh(ROMAddr); temp3=GetMCLK(ROMAddr); + PDEBUG(xf86DrvMsg(0, X_PROBED, + "(FIFO) VCLK %x MCLK %x Colorth=%d\n", temp1, temp3, temp2)); temp=((UShort)(temp1*temp2)/temp3); /* temp->bx */ - temp1=(UChar)GetReg1(P3c4,0x14); /* SR_14 */ + temp1=(UChar)SiSGetReg1(P3c4,0x14); /* SR_14 */ temp1=temp1>>6; temp1=temp1<<1; if(temp1==0) temp1=1; @@ -2798,13 +3046,18 @@ static void SetCRT2FIFO(UShort Part1Port,ULong ROMAddr,UShort ModeNo,ScrnInfoPt longtemp=temp1-temp; +#if 1 /* X driver code */ temp2=(UShort)((28*16)/(int)longtemp); /* temp2->cx */ if(!((temp2*(int)longtemp)==(28*16))) temp2++; +#else /* sisfb code - WRONG! */ + temp2=(UShort)((int)longtemp/(28*16)); /* temp2->cx */ + if(!((temp2*(28*16)==(int)longtemp))) temp2++; +#endif if( pSiS->Chipset == PCI_CHIP_SIS300 ){ temp1=CalcDelayVB(); }else{ /* for Trojan and Spartan */ - flag=(UChar)GetReg1(P3c4,0x14); /* SR_14 */ + flag=(UChar)SiSGetReg1(P3c4,0x14); /* SR_14 */ if(flag&0x80){ latencyindex=12; /* 128 bit */ }else{ @@ -2820,38 +3073,47 @@ static void SetCRT2FIFO(UShort Part1Port,ULong ROMAddr,UShort ModeNo,ScrnInfoPt latencyindex=latencyindex + (flag>>5); temp1= LatencyFactor[latencyindex]; temp1=temp1+15; - flag=(UChar)GetReg1(P3c4,0x14); /* SR_14 */ + flag=(UChar)SiSGetReg1(P3c4,0x14); /* SR_14 */ if(!(flag&0x80)){ temp1=temp1+5; /* 64 bit */ } } temp2=temp2+temp1; + REFIndex=oldREFIndex; /* pop REFIndex(CRT2) */ ModeIDOffset=oldModeIDOffset; /* pop ModeIDOffset */ - + vclk2ptr=GetVCLK2Ptr(ROMAddr,ModeNo); temp1=*((UShort *)(ROMAddr+vclk2ptr+(VCLKLen-2))); temp3=GetColorTh(ROMAddr); + longtemp=temp1*temp2*temp3; + temp3=GetMCLK(ROMAddr); temp3=temp3<<4; temp2=(int)(longtemp/temp3); - if((long int)temp2*(long int)temp3<(long int)longtemp) + if((long int)temp2*(long int)temp3<(long int)longtemp) { temp2++; /* temp2->cx */ - - temp1=(UChar)GetReg1(Part1Port,0x01); /* part1port index 01 */ - temp1=(temp1&(~0x1F))|0x16; - SetReg1(Part1Port,0x01,temp1); - -/* ynlai begin */ - if(IF_DEF_HiVision==1) { if(temp2<=10) temp2=10; } - else { if(temp2<=6) temp2=6; } -/* ynlai end */ + } + + /* ynlai begin */ + if(IF_DEF_HiVision==1) { if(temp2<10) temp2=10; } + else { if(IF_DEF_LVDS==1) { if(temp2<8) temp2=8; } + /* TW: LVDS doesn't like values < 8 */ + else { if(temp2<6) temp2=6;} } + /* ynlai end */ + if(temp2>0x14) temp2=0x14; - temp1=(UChar)GetReg1(Part1Port,0x02); /* part1port index 02 */ + + temp1=(UChar)SiSGetReg1(Part1Port,0x01); /* part1port index 01 */ temp1=(temp1&(~0x1F))|temp2; - SetReg1(Part1Port,0x02,temp1); + /* TW: temp2 was 0x16 and made calculations void! */ + SiSSetReg1(Part1Port,0x01,temp1); + + temp1=(UChar)SiSGetReg1(Part1Port,0x02); /* part1port index 02 */ + temp1=(temp1&(~0x1F))|temp2; + SiSSetReg1(Part1Port,0x02,temp1); } static UShort GetVCLK(ULong ROMAddr,UShort ModeNo) @@ -2944,7 +3206,8 @@ static UShort GetDRAMType(ULong ROMAddr) UShort tsoftsetting,temp3; tsoftsetting=*((UChar *)(ROMAddr+0x52)); if(!(tsoftsetting&SoftDramType)){ - temp3=(UChar)GetReg1(P3c4,0x3A); + temp3=(UChar)SiSGetReg1(P3c4,0x1A); + /* TW: 0x1A was 0x3A = POWER_ON_TRAP_III ? WRONG! */ tsoftsetting=temp3; } tsoftsetting=tsoftsetting&0x07; @@ -2959,7 +3222,7 @@ static UShort CalcDelayVB(void) 55,4,54,6,66,8,90,12, 42,4,45,6,55,8,75,12}; - tempah=(UChar)GetReg1(P3c4,0x18); /* SR_18 */ + tempah=(UChar)SiSGetReg1(P3c4,0x18); /* SR_18 */ tempah=tempah&0x62; tempah=tempah>>1; tempal=tempah; @@ -2969,9 +3232,9 @@ static UShort CalcDelayVB(void) temp1=ThTiming[tempal]; /* temp1->cl */ - tempbx=(UChar)GetReg1(P3c4,0x16); /* SR_16 */ + tempbx=(UChar)SiSGetReg1(P3c4,0x16); /* SR_16 */ tempbx=tempbx>>6; - tempah=(UChar)GetReg1(P3c4,0x14); /* SR_14 */ + tempah=(UChar)SiSGetReg1(P3c4,0x14); /* SR_14 */ tempah=((tempah>>4)&0x0C); tempbx=((tempbx|tempah)<<1); @@ -3037,10 +3300,20 @@ static UShort GetVCLK2Ptr(ULong ROMAddr,UShort ModeNo) else { /* LVDS */ if(ModeNo<=0x13) tempal=*((UChar *)(ROMAddr+ModeIDOffset+0x04)); else tempal=*((UChar *)(ROMAddr+REFIndex+0x04)); - if(IF_DEF_CH7005==1) { + +/* TW: The following looks like nonsense: + * First, check if system HAS as CHRONTEL, then check if CRT2 is LCD + * if CRT2 is LCD, do NOTHING and accept tempal as index. + * Otherwise (if no CHRONTEL _exists_), read index from tables. + * What's the difference between a system that has CHRONTEL but CRT2 is LCD and + * a machine without CHRONTEL but with CRT2 = LCD, too? + * (If the first 2 ifs are put together with &&, return value is wrong.) + */ + if ((IF_DEF_CH7005==1)) { if(!(VBInfo&SetCRT2ToLCD)) { + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "VCLK (CH) tempal = %x\n", tempal)); tempal=tempal&0x1f; - tempbx=0; + tempbx=0; if(VBInfo&SetPALTV) tempbx=tempbx+2; if(VBInfo&SetCHTVOverScan) tempbx=tempbx+1; tempbx=tempbx<<1; @@ -3051,15 +3324,19 @@ static UShort GetVCLK2Ptr(ULong ROMAddr,UShort ModeNo) } } else { + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "VCLK (else) tempal = %x (%x %x %x)\n", + tempal, LCDResInfo, Panel800x600, Panel1024x768)); tempal=tempal>>6; if(LCDResInfo==Panel800x600) tempal=LVDSXlat1VCLK[tempal]; else if(LCDResInfo==Panel1024x768) tempal=LVDSXlat2VCLK[tempal]; else tempal=LVDSXlat3VCLK[tempal]; } } + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "VCLK tempal = %x, REFIndex=%d\n", tempal, REFIndex)); VCLKLen=GetVCLKLen(ROMAddr); tempal=tempal*VCLKLen; tempal=tempal+(*((UShort *)(ROMAddr+0x208))); /* VCLKData */ + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "VCLKData = %x\n", tempal)); return ((UShort)tempal); } @@ -3083,7 +3360,9 @@ static void SetCRT2Sync(UShort BaseAddr,ULong ROMAddr,UShort ModeNo) UShort temp1,tempah=0; UShort temp; UShort Part1Port; + Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; + if(IF_DEF_LVDS==1){ if(VBInfo&SetCRT2ToLCD){ tempah=LCDInfo; @@ -3099,9 +3378,10 @@ static void SetCRT2Sync(UShort BaseAddr,ULong ROMAddr,UShort ModeNo) temp=*((UShort *)(ROMAddr+REFIndex)); /* di+Ext_InfoFlag */ tempah=(temp>>8)&0x0C0; } - temp1=(UChar)GetReg1(Part1Port,0x19); /* part1port index 02 */ + temp1=(UChar)SiSGetReg1(Part1Port,0x19); /* part1port index 02 */ temp1=(temp1&(~0x0C0))|tempah; - SetReg1(Part1Port,0x19,temp1); + SiSSetReg1(Part1Port,0x19,temp1); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "(CRT2Sync) 19 -> | %x\n", tempah)); } static void GetCRT1Ptr(ULong ROMAddr) @@ -3117,9 +3397,27 @@ static void GetCRT1Ptr(ULong ROMAddr) static void SetRegANDOR(UShort Port,UShort Index,UShort DataAND,UShort DataOR) { UShort temp1; - temp1=GetReg1(Port,Index); /* part1port index 02 */ + temp1=SiSGetReg1(Port,Index); /* part1port index 02 */ temp1=(temp1&(DataAND))|DataOR; - SetReg1(Port,Index,temp1); + SiSSetReg1(Port,Index,temp1); +} + +static void SetRegAND (UShort Port, UShort Index, UShort DataAND) +{ + UShort temp; + + temp=SiSGetReg1(Port,Index); /* Part1Port index 02 */ + temp=temp&DataAND; + SiSSetReg1(Port,Index,temp); +} + +static void SetRegOR (UShort Port, UShort Index, UShort DataOR) +{ + UShort temp; + + temp=SiSGetReg1(Port,Index); /* Part1Port index 02 */ + temp=temp|DataOR; + SiSSetReg1(Port,Index,temp); } static UShort GetVGAHT2(void) @@ -3182,25 +3480,25 @@ static void SetGroup2(UShort BaseAddr,ULong ROMAddr, UShort ModeNo) temp2=NTSCTiming; } } - SetReg1(Part2Port,0x0,tempah); + SiSSetReg1(Part2Port,0x0,tempah); for(i=0x31;i<=0x34;i++,temp1++){ - SetReg1(Part2Port,i,*(UChar *)temp1); + SiSSetReg1(Part2Port,i,*(UChar *)temp1); } for(i=0x01,j=0;i<=0x2D;i++,j++){ - SetReg1(Part2Port,i,temp2[j]); + SiSSetReg1(Part2Port,i,temp2[j]); } for(i=0x39;i<=0x45;i++,j++){ - SetReg1(Part2Port,i,temp2[j]); /* di->temp2[j] */ + SiSSetReg1(Part2Port,i,temp2[j]); /* di->temp2[j] */ } - tempah=GetReg1(Part2Port,0x0A); + tempah=SiSGetReg1(Part2Port,0x0A); tempah=tempah|NewFlickerMode; - SetReg1(Part2Port,0x0A,tempah); + SiSSetReg1(Part2Port,0x0A,tempah); - SetReg1(Part2Port,0x35,RY1COE); - SetReg1(Part2Port,0x36,RY2COE); - SetReg1(Part2Port,0x37,RY3COE); - SetReg1(Part2Port,0x38,RY4COE); + SiSSetReg1(Part2Port,0x35,RY1COE); + SiSSetReg1(Part2Port,0x36,RY2COE); + SiSSetReg1(Part2Port,0x37,RY3COE); + SiSSetReg1(Part2Port,0x38,RY4COE); /* ynlai begin */ if(IF_DEF_HiVision==1) tempax=950; @@ -3213,16 +3511,16 @@ static void SetGroup2(UShort BaseAddr,ULong ROMAddr, UShort ModeNo) tempax=tempax>>2; tempah=(tempax&0xFF00)>>8; tempah=tempah+temp2[0]; - SetReg1(Part2Port,0x01,tempah); + SiSSetReg1(Part2Port,0x01,tempah); tempah=tempax&0x00FF; tempah=tempah+temp2[1]; - SetReg1(Part2Port,0x02,tempah); + SiSSetReg1(Part2Port,0x02,tempah); } /* begin end */ tempcx=HT-1; tempah=tempcx&0xFF; - SetReg1(Part2Port,0x1B,tempah); + SiSSetReg1(Part2Port,0x1B,tempah); tempah=(tempcx&0xFF00)>>8; SetRegANDOR(Part2Port,0x1D,~0x0F,(UChar)tempah); @@ -3241,7 +3539,7 @@ static void SetGroup2(UShort BaseAddr,ULong ROMAddr, UShort ModeNo) tempbx=temp2[j]; tempbx=tempbx+tempcx; tempah=tempbx&0xFF; - SetReg1(Part2Port,0x24,tempah); + SiSSetReg1(Part2Port,0x24,tempah); tempah=(tempbx&0xFF00)>>8; tempah=(tempah<<4)&0xFF; SetRegANDOR(Part2Port,0x25,~0x0F0,tempah); @@ -3258,7 +3556,7 @@ static void SetGroup2(UShort BaseAddr,ULong ROMAddr, UShort ModeNo) tempcx=tempcx+temp2[++j]; tempah=tempcx&0xFF; - SetReg1(Part2Port,0x27,tempah); + SiSSetReg1(Part2Port,0x27,tempah); tempah=(((tempcx&0xFF00)>>8)<<4)&0xFF; SetRegANDOR(Part2Port,0x28,~0x0F0,tempah); @@ -3282,7 +3580,7 @@ static void SetGroup2(UShort BaseAddr,ULong ROMAddr, UShort ModeNo) tempcx=tempax-1; } tempah=tempcx&0xFF; - SetReg1(Part2Port,0x2E,tempah); + SiSSetReg1(Part2Port,0x2E,tempah); tempbx=VDE; if(VGAVDE==360){ @@ -3306,7 +3604,7 @@ static void SetGroup2(UShort BaseAddr,ULong ROMAddr, UShort ModeNo) if(VBInfo&SetInSlaveMode) if(ModeNo==0x2f) tempah=tempah+1; /* ynlai end */ - SetReg1(Part2Port,0x2F,tempah); + SiSSetReg1(Part2Port,0x2F,tempah); tempah=(tempcx&0xFF00)>>8; tempbh=(tempbx&0xFF00)>>8; @@ -3321,7 +3619,7 @@ static void SetGroup2(UShort BaseAddr,ULong ROMAddr, UShort ModeNo) } } /* ynlai end */ - SetReg1(Part2Port,0x30,tempah); + SiSSetReg1(Part2Port,0x30,tempah); tempbh=0; tempbx=tempbx&0xFF; @@ -3369,13 +3667,13 @@ static void SetGroup2(UShort BaseAddr,ULong ROMAddr, UShort ModeNo) tempah=tempax&0xFF; } - SetReg1(Part2Port,0x44,tempah); + SiSSetReg1(Part2Port,0x44,tempah); tempah=tempbh; SetRegANDOR(Part2Port,0x45,~0x03F,tempah); if(IF_DEF_HiVision==1) { if(!(VBInfo&SetInSlaveMode)) { - SetReg1(Part2Port,0x0B,0x00); + SiSSetReg1(Part2Port,0x0B,0x00); } } @@ -3390,30 +3688,30 @@ static void SetGroup2(UShort BaseAddr,ULong ROMAddr, UShort ModeNo) } } } - SetReg1(Part2Port,0x0B,tempah); + SiSSetReg1(Part2Port,0x0B,tempah); tempbx=HDE-1; /* RHACTE=HDE-1 */ tempah=tempbx&0xFF; - SetReg1(Part2Port,0x2C,tempah); + SiSSetReg1(Part2Port,0x2C,tempah); tempah=(tempbx&0xFF00)>>8; tempah=(tempah<<4)&0xFF; SetRegANDOR(Part2Port,0x2B,~0x0F0,tempah); tempbx=VDE-1; /* RTVACTEO=(VDE-1)&0xFF */ tempah=tempbx&0xFF; - SetReg1(Part2Port,0x03,tempah); + SiSSetReg1(Part2Port,0x03,tempah); tempah=((tempbx&0xFF00)>>8)&0x07; SetRegANDOR(Part2Port,0x0C,~0x07,tempah); tempcx=VT-1; tempah=tempcx&0xFF; /* RVTVT=VT-1 */ - SetReg1(Part2Port,0x19,tempah); + SiSSetReg1(Part2Port,0x19,tempah); tempah=(tempcx&0xFF00)>>8; tempah=(tempah<<5)&0xFF; if(LCDInfo&LCDRGB18Bit){ tempah=tempah|0x10; } - SetReg1(Part2Port,0x1A,tempah); + SiSSetReg1(Part2Port,0x1A,tempah); tempcx++; if(LCDResInfo==Panel1024x768){ @@ -3432,65 +3730,65 @@ static void SetGroup2(UShort BaseAddr,ULong ROMAddr, UShort ModeNo) tempbx=tempbx-tempax; /* lcdvdee */ tempah=tempcx&0xFF; /* RVEQ1EQ=lcdvdes */ - SetReg1(Part2Port,0x05,tempah); + SiSSetReg1(Part2Port,0x05,tempah); tempah=tempbx&0xFF; /* RVEQ2EQ=lcdvdee */ - SetReg1(Part2Port,0x06,tempah); + SiSSetReg1(Part2Port,0x06,tempah); tempah=(tempbx&0xFF00)>>8; tempah=(tempah<<3)&0xFF; tempah=tempah|((tempcx&0xFF00)>>8); - SetReg1(Part2Port,0x02,tempah); + SiSSetReg1(Part2Port,0x02,tempah); tempcx=(VT-VDE)>>4; /* (VT-VDE)>>4 */ tempbx=(VT+VDE)>>1; tempah=tempbx&0xFF; /* RTVACTEE=lcdvrs */ - SetReg1(Part2Port,0x04,tempah); + SiSSetReg1(Part2Port,0x04,tempah); tempah=(tempbx&0xFF00)>>8; tempah=(tempah<<4)&0xFF; tempbx=tempbx+tempcx+1; tempbl=(tempbx&0x0F); tempah=tempah|tempbl; /* RTVACTSO=lcdvrs&0x700>>4+lcdvre */ - SetReg1(Part2Port,0x01,tempah); + SiSSetReg1(Part2Port,0x01,tempah); - tempah=GetReg1(Part2Port,0x09); + tempah=SiSGetReg1(Part2Port,0x09); tempah=tempah&0xF0; - SetReg1(Part2Port,0x09,tempah); + SiSSetReg1(Part2Port,0x09,tempah); - tempah=GetReg1(Part2Port,0x0A); + tempah=SiSGetReg1(Part2Port,0x0A); tempah=tempah&0xF0; - SetReg1(Part2Port,0x0A,tempah); + SiSSetReg1(Part2Port,0x0A,tempah); tempcx=(HT-HDE)>>2; /* (HT-HDE)>>2 */ tempbx=(HDE+7); /* lcdhdee */ tempah=tempbx&0xFF; /* RHEQPLE=lcdhdee */ - SetReg1(Part2Port,0x23,tempah); + SiSSetReg1(Part2Port,0x23,tempah); tempah=(tempbx&0xFF00)>>8; SetRegANDOR(Part2Port,0x25,~0x0F,tempah); - SetReg1(Part2Port,0x1F,0x07); /* RHBLKE=lcdhdes */ - tempah=GetReg1(Part2Port,0x20); + SiSSetReg1(Part2Port,0x1F,0x07); /* RHBLKE=lcdhdes */ + tempah=SiSGetReg1(Part2Port,0x20); tempah=tempah&0x0F; - SetReg1(Part2Port,0x20,tempah); + SiSSetReg1(Part2Port,0x20,tempah); tempbx=tempbx+tempcx; tempah=tempbx&0xFF; /* RHBURSTS=lcdhrs */ - SetReg1(Part2Port,0x1C,tempah); + SiSSetReg1(Part2Port,0x1C,tempah); tempah=(tempbx&0xFF00)>>8; tempah=(tempah<<4)&0xFF; SetRegANDOR(Part2Port,0x1D,~0x0F0,tempah); tempbx=tempbx+tempcx; tempah=tempbx&0xFF; /* RHSYEXP2S=lcdhre */ - SetReg1(Part2Port,0x21,tempah); + SiSSetReg1(Part2Port,0x21,tempah); - tempah=GetReg1(Part2Port,0x17); + tempah=SiSGetReg1(Part2Port,0x17); tempah=tempah&0xFB; - SetReg1(Part2Port,0x17,tempah); + SiSSetReg1(Part2Port,0x17,tempah); - tempah=GetReg1(Part2Port,0x18); + tempah=SiSGetReg1(Part2Port,0x18); tempah=tempah&0xDF; - SetReg1(Part2Port,0x18,tempah); + SiSSetReg1(Part2Port,0x18,tempah); return; } @@ -3502,14 +3800,14 @@ static void SetGroup3(UShort BaseAddr,ULong ROMAddr) UShort modeflag; Part3Port=BaseAddr+IND_SIS_CRT2_PORT_12; /* ynlai begin */ - SetReg1(Part3Port,0x00,0x00); + SiSSetReg1(Part3Port,0x00,0x00); if(VBInfo&SetPALTV){ - SetReg1(Part3Port,0x13,0xFA); - SetReg1(Part3Port,0x14,0xC8); + SiSSetReg1(Part3Port,0x13,0xFA); + SiSSetReg1(Part3Port,0x14,0xC8); } else { - SetReg1(Part3Port,0x13,0xF6); - SetReg1(Part3Port,0x14,0xBF); + SiSSetReg1(Part3Port,0x13,0xF6); + SiSSetReg1(Part3Port,0x14,0xBF); } if(IF_DEF_HiVision==1) { tempdi=HiTVGroup3Data; @@ -3521,7 +3819,7 @@ static void SetGroup3(UShort BaseAddr,ULong ROMAddr) } } for(i=0;i<=0x3E;i++){ - SetReg1(Part3Port,i,tempdi[i]); + SiSSetReg1(Part3Port,i,tempdi[i]); } } /* ynlai end */ @@ -3552,19 +3850,19 @@ static void SetGroup4(UShort BaseAddr,ULong ROMAddr,UShort ModeNo) tempax=tempax|0x08000; } tempah=(tempax&0xFF00)>>8; - SetReg1(Part4Port,0x0C,tempah); + SiSSetReg1(Part4Port,0x0C,tempah); tempah=RVBHCFACT; - SetReg1(Part4Port,0x13,tempah); + SiSSetReg1(Part4Port,0x13,tempah); tempbx=RVBHCMAX; tempah=tempbx&0xFF; - SetReg1(Part4Port,0x14,tempah); + SiSSetReg1(Part4Port,0x14,tempah); tempbh=(((tempbx&0xFF00)>>8)<<7)&0xFF; tempcx=VGAHT-1; tempah=tempcx&0xFF; - SetReg1(Part4Port,0x16,tempah); + SiSSetReg1(Part4Port,0x16,tempah); tempch=(((tempcx&0xFF00)>>8)<<3)&0xFF; tempbh=tempbh|tempch; @@ -3573,10 +3871,10 @@ static void SetGroup4(UShort BaseAddr,ULong ROMAddr,UShort ModeNo) tempcx=tempcx-5; } tempah=tempcx&0xFF; - SetReg1(Part4Port,0x17,tempah); + SiSSetReg1(Part4Port,0x17,tempah); tempbh=tempbh|((tempcx&0xFF00)>>8); tempah=tempbh; - SetReg1(Part4Port,0x15,tempah); + SiSSetReg1(Part4Port,0x15,tempah); tempcx=VBInfo; tempbx=VGAHDE; @@ -3620,7 +3918,7 @@ static void SetGroup4(UShort BaseAddr,ULong ROMAddr,UShort ModeNo) tempcx=RVBHRS; tempah=tempcx&0xFF; - SetReg1(Part4Port,0x18,tempah); + SiSSetReg1(Part4Port,0x18,tempah); tempeax=VGAVDE; tempcx=tempcx|0x04000; @@ -3639,14 +3937,14 @@ static void SetGroup4(UShort BaseAddr,ULong ROMAddr,UShort ModeNo) tempah=tempebx&0xFF; - SetReg1(Part4Port,0x1B,tempah); + SiSSetReg1(Part4Port,0x1B,tempah); tempah=(tempebx&0xFF00)>>8; - SetReg1(Part4Port,0x1A,tempah); + SiSSetReg1(Part4Port,0x1A,tempah); tempebx=tempebx>>16; tempah=tempebx&0xFF; tempah=(tempah<<4)&0xFF; tempah=tempah|((tempcx&0xFF00)>>8); - SetReg1(Part4Port,0x19,tempah); + SiSSetReg1(Part4Port,0x19,tempah); SetCRT2VCLK(BaseAddr,ROMAddr,ModeNo); } @@ -3659,19 +3957,19 @@ static void SetCRT2VCLK(UShort BaseAddr,ULong ROMAddr,UShort ModeNo) Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14; vclk2ptr=GetVCLK2Ptr(ROMAddr,ModeNo); - SetReg1(Part4Port,0x0A,0x01); + SiSSetReg1(Part4Port,0x0A,0x01); tempah=*((UChar *)(ROMAddr+vclk2ptr+0x01)); /* di+1 */ - SetReg1(Part4Port,0x0B,tempah); + SiSSetReg1(Part4Port,0x0B,tempah); tempah=*((UChar *)(ROMAddr+vclk2ptr+0x00)); /* di */ - SetReg1(Part4Port,0x0A,tempah); - SetReg1(Part4Port,0x12,0x00); + SiSSetReg1(Part4Port,0x0A,tempah); + SiSSetReg1(Part4Port,0x12,0x00); tempah=0x08; if(VBInfo&SetCRT2ToRAMDAC){ tempah=tempah|0x020; } - temp1=GetReg1(Part4Port,0x12); + temp1=SiSGetReg1(Part4Port,0x12); tempah=tempah|temp1; - SetReg1(Part4Port,0x12,tempah); + SiSSetReg1(Part4Port,0x12,tempah); } static void SetGroup5(UShort BaseAddr,ULong ROMAddr) @@ -3693,9 +3991,9 @@ static void SetGroup5(UShort BaseAddr,ULong ROMAddr) static void EnableCRT2(void) { UShort temp1; - temp1=GetReg1(P3c4,0x1E); + temp1=SiSGetReg1(P3c4,0x1E); temp1=temp1|0x20; - SetReg1(P3c4,0x1E,temp1); /* SR 1E */ + SiSSetReg1(P3c4,0x1E,temp1); /* SR 1E */ } static void LoadDAC2(ULong ROMAddr,UShort Part5Port) @@ -3795,53 +4093,104 @@ static void WriteDAC2(UShort Pdata,UShort dl, UShort ah, UShort al, UShort dh) SetReg3(Pdata,(UShort)bl); } -void LockCRT2(UShort BaseAddr) +void SiSLockCRT2(UShort BaseAddr) { UShort Part1Port; UShort Part4Port; UShort temp1; Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14; - temp1=GetReg1(Part1Port,0x24); + temp1=SiSGetReg1(Part1Port,0x24); temp1=temp1&0xFE; - SetReg1(Part1Port,0x24,temp1); + SiSSetReg1(Part1Port,0x24,temp1); } +#if 0 static void SetLockRegs(void) { UShort temp1; if((VBInfo&SetInSlaveMode)&&(!(VBInfo&SetCRT2ToRAMDAC))){ - VBLongWait(); - temp1=GetReg1(P3c4,0x32); + VBLongWait(); + temp1=SiSGetReg1(P3c4,0x32); temp1=temp1|0x20; - SetReg1(P3c4,0x32,temp1); - VBLongWait(); + SiSSetReg1(P3c4,0x32,temp1); + VBLongWait(); + } +} +#endif + +void SiSEnableBridge(UShort BaseAddr) +{ + UShort Part1Port; + Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; + + if(IF_DEF_LVDS==0) { + SiSEnableBridge301(BaseAddr); + } else { + SiSEnableBridgeLVDS(BaseAddr); + } } -void EnableBridge(UShort BaseAddr) +void SiSEnableBridge301(UShort BaseAddr) { UShort part2_02,part2_05; - UShort Part2Port; + UShort Part2Port, Part1Port; Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10; + Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; - if(IF_DEF_LVDS==0) { - part2_02=(UChar)GetReg1(Part2Port,0x02); - part2_05=(UChar)GetReg1(Part2Port,0x05); - SetReg1(Part2Port,0x02,0x38); - SetReg1(Part2Port,0x05,0xFF); + part2_02=(UChar)SiSGetReg1(Part2Port,0x02); + part2_05=(UChar)SiSGetReg1(Part2Port,0x05); + SiSSetReg1(Part2Port,0x02,0x38); + SiSSetReg1(Part2Port,0x05,0xFF); LongWait(); SetRegANDOR(Part2Port,0x00,~0x0E0,0x020); /* WaitVBRetrace(BaseAddr); */ - SetReg1(Part2Port,0x02,part2_02); - SetReg1(Part2Port,0x05,part2_05); + SiSSetReg1(Part2Port,0x02,part2_02); + SiSSetReg1(Part2Port,0x05,part2_05); } - else { + +/* TW: New for 301b (used externally only yet) */ +void SiSEnableBridge301B(UShort BaseAddr) +{ + UShort temp, tempah; + UShort Part4Port,Part2Port,Part1Port; + Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10; + Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; + Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14; + + SetRegANDOR(P3c4,0x11,0xFB,0x00); + + SetRegANDOR(Part2Port,0x00,0x1F,0x20); + LongWait(); + + temp=SiSGetReg1(Part1Port,0x2E); + if (!(temp&0x80)) SetRegOR(Part1Port,0x2E,0x80); + if ((!(IsDualEdge301B(BaseAddr))) && (!(IsVAMode301B(BaseAddr)))) + tempah=0x80; + else if ((!(IsDualEdge301B(BaseAddr))) && (IsVAMode301B(BaseAddr))) + tempah=0x40; + else tempah=0xC0; + SetRegOR(Part4Port,0x1F,tempah); +} + +void SiSEnableBridgeLVDS(UShort BaseAddr) +{ + UShort Part2Port, Part1Port; + Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10; + Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; + EnableCRT2(); - UnLockCRT2(BaseAddr); -/* SetRegANDOR(Part1Port,0x02,~0x040,0x0); */ - } + SiSUnLockCRT2(BaseAddr); + /* TW: new 10/2/01 */ + SetRegANDOR(Part1Port,0x02,~0x040,0x0); + if (BridgeInSlave ()) { + SetRegANDOR (Part1Port, 0x01, 0x1F, 0x00); + } else { + SetRegANDOR (Part1Port, 0x01, 0x1F, 0x40); + } + /* TW end */ } static void GetVBInfo(UShort BaseAddr,ULong ROMAddr) @@ -3853,15 +4202,15 @@ static void GetVBInfo(UShort BaseAddr,ULong ROMAddr) tempbl=tempbx&ModeInfoFlag; ModeType=tempbl; tempbx=0; - flag1=GetReg1(P3c4,0x38); /* call BridgeisOn */ + flag1=SiSGetReg1(P3c4,0x38); /* call BridgeisOn */ if(IF_DEF_LVDS==0) { /* for 301 */ if(!(flag1&0x20)){ VBInfo=CRT2DisplayFlag; return; } } - tempbl=GetReg1(P3d4,0x30); - tempbh=GetReg1(P3d4,0x31); + tempbl=SiSGetReg1(P3d4,0x30); + tempbh=SiSGetReg1(P3d4,0x31); tempah=((SetCHTVOverScan>>8)|(SetInSlaveMode>>8)|(DisableCRT2Display>>8)); tempah=tempah^0xFF; @@ -3903,7 +4252,7 @@ static void GetVBInfo(UShort BaseAddr,ULong ROMAddr) if(tempbl&SetCRT2ToLCD) tempbl=tempbl&(SetCRT2ToLCD|SwitchToCRT2|SetSimuScanMode); } - tempah=GetReg1(P3d4,0x31); + tempah=SiSGetReg1(P3d4,0x31); if(tempah&(CRT2DisplayFlag>>8)){ if(!(tempbl&(SwitchToCRT2|SetSimuScanMode))){ tempbx=SetSimuScanMode|CRT2DisplayFlag; @@ -3949,7 +4298,7 @@ static void GetVBInfo(UShort BaseAddr,ULong ROMAddr) } } if(IF_DEF_CH7005==1) { - tempah=GetReg1(P3d4,0x35); + tempah=SiSGetReg1(P3d4,0x35); if(tempah&TVOverScan) VBInfo=VBInfo|SetCHTVOverScan; } } @@ -3963,9 +4312,9 @@ static Bool BridgeIsEnable(UShort BaseAddr) if(IF_DEF_LVDS==1){ return 1; } - flag1=GetReg1(P3c4,0x38); /* call BridgeisOn */ + flag1=SiSGetReg1(P3c4,0x38); /* call BridgeisOn */ if(!(flag1&0x20)){ return 0;} - flag1=GetReg1(Part1Port,0x0); + flag1=SiSGetReg1(Part1Port,0x0); if(flag1&0x0a0){ return 1; }else{ @@ -3976,7 +4325,7 @@ static Bool BridgeIsEnable(UShort BaseAddr) static Bool BridgeInSlave(void) { UShort flag1; - flag1=GetReg1(P3d4,0x31); + flag1=SiSGetReg1(P3d4,0x31); if(flag1&(SetInSlaveMode>>8)){ return 1; }else{ @@ -3988,7 +4337,7 @@ static Bool GetLCDResInfo(ULong ROMAddr,UShort P3d4Reg) { UShort tempah,tempbh,tempflag; - tempah=(UChar)GetReg1(P3d4Reg,0x36); + tempah=(UChar)SiSGetReg1(P3d4Reg,0x36); tempbh=tempah; tempah=tempah&0x0F; /* if(tempah!=0) tempah--; */ @@ -3997,7 +4346,7 @@ static Bool GetLCDResInfo(ULong ROMAddr,UShort P3d4Reg) tempbh=tempbh>>4; LCDTypeInfo=tempbh; - tempah=(UChar)GetReg1(P3d4Reg,0x37); + tempah=(UChar)SiSGetReg1(P3d4Reg,0x37); LCDInfo=tempah; if(IF_DEF_LVDS==1){ @@ -4040,54 +4389,66 @@ static Bool GetLCDResInfo(ULong ROMAddr,UShort P3d4Reg) }else{ SetFlag=SetFlag|LCDVESATiming; } + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "SetFlag=0x%x, LCDTypeInfo=%d, LCDResInfo=%d, LCDInfo=0x%x\n", + SetFlag, LCDTypeInfo, LCDResInfo, LCDInfo)); + return 1; } static void PresetScratchregister(UShort P3d4Reg) { - SetReg1(P3d4Reg,0x37,0x00); + SiSSetReg1(P3d4Reg,0x37,0x00); } +#if 0 static Bool GetLCDDDCInfo(ScrnInfoPtr pScrn) { UShort tempah; /*tempah=(HwDeviceExtension->usLCDType);// set in sisv.c */ tempah=1; - SetReg1(P3d4,0x36,tempah); /* cr 36 0:no LCD 1:1024x768 2:1280x1024 */ + SiSSetReg1(P3d4,0x36,tempah); /* cr 36 0:no LCD 1:1024x768 2:1280x1024 */ if(tempah>0) return 1; else return 0; } +#endif +#if 0 static void SetTVSystem(void) { UShort tempah; - tempah=GetReg1(P3c4,0x38); /* SR 38 */ + tempah=SiSGetReg1(P3c4,0x38); /* SR 38 */ tempah=tempah&0x01; /* get SR 38 D0 TV Type Selection */ /* 0:NTSC 1:PAL */ SetRegANDOR(P3d4,0x31,~0x01,tempah); /* set CR 31 D0= SR 38 D0 */ - return; } +#endif static void LongWait(void) { UShort i; - for(i=0; i<0xFFFF; i++) { - if(!(inSISREG(P3da) & 0x08)) - break; + + i = SiSGetReg1(P3c4, 0x1F); + if (!(i & 0xC0)) { + + for(i=0; i<0xFFFF; i++) { + if(!(inSISREG(P3da) & 0x08)) + break; + } + for(i=0; i<0xFFFF; i++) { + if((inSISREG(P3da) & 0x08)) + break; + } } - for(i=0; i<0xFFFF; i++) { - if((inSISREG(P3da) & 0x09) == 9) - break; - } } +#if 0 static void VBLongWait(void) { UShort regsr1f,tempah,temp; - regsr1f=GetReg1(P3c4,0x1F); + regsr1f=SiSGetReg1(P3c4,0x1F); tempah=regsr1f&(~0xC0); - SetReg1(P3c4,0x1F,tempah); + SiSSetReg1(P3c4,0x1F,tempah); for(temp=1;temp>0;){ temp=GetReg2(P3da); @@ -4098,31 +4459,33 @@ static void VBLongWait(void) temp=temp&0x08; } - SetReg1(P3c4,0x1F,regsr1f); + SiSSetReg1(P3c4,0x1F,regsr1f); return; } +#endif +#if 0 static Bool WaitVBRetrace(UShort BaseAddr) { UShort temp; UShort Part1Port; Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04; - temp=GetReg1(Part1Port,0x00); + temp=SiSGetReg1(Part1Port,0x00); if(!(temp&0x80)){ return 0; } for(temp=0;temp==0;){ - temp=GetReg1(Part1Port,0x25); + temp=SiSGetReg1(Part1Port,0x25); temp=temp&0x01; } for(;temp>0;){ - temp=GetReg1(Part1Port,0x25); + temp=SiSGetReg1(Part1Port,0x25); temp=temp&0x01; } return 1; } - +#endif static void ModCRT1CRTC(ULong ROMAddr,UShort ModeNo) { @@ -4134,36 +4497,43 @@ static void ModCRT1CRTC(ULong ROMAddr,UShort ModeNo) REFIndex=OldREFIndex; return; } - tempah=(UChar)GetReg1(P3d4,0x11);/*unlock cr0-7 */ + tempah=(UChar)SiSGetReg1(P3d4,0x11);/*unlock cr0-7 */ tempah=tempah&0x7F; - SetReg1(P3d4,0x11,tempah); + SiSSetReg1(P3d4,0x11,tempah); tempah=*((UChar *)(ROMAddr+REFIndex)); - SetReg1(P3d4,0x0,tempah); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDS Data 0: %x\n", tempah)); + SiSSetReg1(P3d4,0x0,tempah); REFIndex++; for(i=0x02;i<=0x05;REFIndex++,i++){ tempah=*((UChar *)(ROMAddr+REFIndex)); - SetReg1(P3d4,i,tempah); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDS Data: %x\n", tempah)); + SiSSetReg1(P3d4,i,tempah); } for(i=0x06;i<=0x07;REFIndex++,i++){ tempah=*((UChar *)(ROMAddr+REFIndex)); - SetReg1(P3d4,i,tempah); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDS Data: %x\n", tempah)); + SiSSetReg1(P3d4,i,tempah); } for(i=0x10;i<=0x11;REFIndex++,i++){ tempah=*((UChar *)(ROMAddr+REFIndex)); - SetReg1(P3d4,i,tempah); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDS Data: %x\n", tempah)); + SiSSetReg1(P3d4,i,tempah); } for(i=0x15;i<=0x16;REFIndex++,i++){ tempah=*((UChar *)(ROMAddr+REFIndex)); - SetReg1(P3d4,i,tempah); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDS Data: %x\n", tempah)); + SiSSetReg1(P3d4,i,tempah); } for(i=0x0A;i<=0x0C;REFIndex++,i++){ tempah=*((UChar *)(ROMAddr+REFIndex)); - SetReg1(P3c4,i,tempah); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDS Data: %x\n", tempah)); + SiSSetReg1(P3c4,i,tempah); } tempah=*((UChar *)(ROMAddr+REFIndex)); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "LVDS Data: %x\n", tempah)); tempah=tempah&0x0E0; - SetReg1(P3c4,0x0E,tempah); + SiSSetReg1(P3c4,0x0E,tempah); tempah=*((UChar *)(ROMAddr+REFIndex)); tempah=tempah&0x01; @@ -4199,16 +4569,18 @@ static void SetCRT2ECLK(ULong ROMAddr, UShort ModeNo) } tempal=0x02B; if(!(VBInfo&SetInSlaveMode)){ - tempal=tempal+3; + tempal=tempal+3; } - SetReg1(P3c4,0x05,0x86); - tempah=*((UChar *)(ROMAddr+REFIndex)); - SetReg1(P3c4,tempal,tempah); + SiSSetReg1(P3c4,0x05,0x86); + tempah=*((UChar *)(ROMAddr+REFIndex)); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "SetCRT2ECLK: Reg %x -> 0x%x\n", tempal, tempah)); + SiSSetReg1(P3c4,tempal,tempah); tempah=*((UChar *)(ROMAddr+REFIndex+1)); - tempal++; - SetReg1(P3c4,tempal,tempah); tempal++; - SetReg1(P3c4,tempal,0x80); + PDEBUG(xf86DrvMsg(scrnidx, X_PROBED, "SetCRT2ECLK: Reg %x -> 0x%x\n", tempal, tempah)); + SiSSetReg1(P3c4,tempal,tempah); + tempal++; + SiSSetReg1(P3c4,tempal,0x80); REFIndex=OldREFIndex; return; } @@ -4227,14 +4599,14 @@ static UShort GetLVDSDesPtr(ULong ROMAddr,UShort ModeNo) if(VBInfo&SetPALTV) tempbx=tempbx+2; if(VBInfo&SetCHTVOverScan) tempbx=tempbx+1; } - } + } tempcl=LVDSDesDataLen; if(Flag) { tempbx=LCDTypeInfo; if(LCDInfo&LCDNonExpanding){ tempbx=tempbx+16; } - } + } if(ModeNo<=0x13) tempal=*((UChar *)(ROMAddr+ModeIDOffset+0x04)); /* si+St_CRT2CRTC */ else tempal=*((UChar *)(ROMAddr+REFIndex+4)); /*di+Ext_CRT2CRTC */ tempal=tempal&0x1F; @@ -4244,13 +4616,13 @@ static UShort GetLVDSDesPtr(ULong ROMAddr,UShort ModeNo) tempptr=*((UShort *)(ROMAddr+LVDSDesPtrData+tempbx)); tempptr=tempptr+tempal; return(tempptr); - + } static Bool GetLVDSCRT1Ptr(ULong ROMAddr,UShort ModeNo) { - UShort tempal,tempbx,modeflag1; - UShort LVDSCRT1DataPtr,Flag; + UShort tempal,tempbx,modeflag1; + UShort LVDSCRT1DataPtr,Flag; if(!(VBInfo&SetInSlaveMode)){ /* return 0; */ @@ -4262,7 +4634,7 @@ static Bool GetLVDSCRT1Ptr(ULong ROMAddr,UShort ModeNo) Flag=0; tempbx=12; if(VBInfo&SetPALTV) tempbx=tempbx+2; - if(VBInfo&SetCHTVOverScan) tempbx=tempbx+1; + if(VBInfo&SetCHTVOverScan) tempbx=tempbx+1; } } if(Flag) { @@ -4285,7 +4657,7 @@ static Bool GetLVDSCRT1Ptr(ULong ROMAddr,UShort ModeNo) } -static void SetCHTVReg(ULong ROMAddr,UShort ModeNo) +static void SetCHTVReg(ULong ROMAddr,UShort ModeNo) { UShort old_REFIndex,temp,tempbx,tempcl; @@ -4293,84 +4665,84 @@ static void SetCHTVReg(ULong ROMAddr,UShort ModeNo) GetCHTVRegPtr(ROMAddr,ModeNo); if(VBInfo&SetPALTV) { - SetCH7005(0x4304); - SetCH7005(0x6909); - } + SiSSetCH7005(0x4304); + SiSSetCH7005(0x6909); + } else { - SetCH7005(0x0304); - SetCH7005(0x7109); + SiSSetCH7005(0x0304); + SiSSetCH7005(0x7109); } temp=*((UShort *)(ROMAddr+REFIndex+0x00)); tempbx=((temp&0x00FF)<<8)|0x00; - SetCH7005(tempbx); + SiSSetCH7005(tempbx); temp=*((UShort *)(ROMAddr+REFIndex+0x01)); tempbx=((temp&0x00FF)<<8)|0x07; - SetCH7005(tempbx); + SiSSetCH7005(tempbx); temp=*((UShort *)(ROMAddr+REFIndex+0x02)); tempbx=((temp&0x00FF)<<8)|0x08; - SetCH7005(tempbx); + SiSSetCH7005(tempbx); temp=*((UShort *)(ROMAddr+REFIndex+0x03)); tempbx=((temp&0x00FF)<<8)|0x0A; - SetCH7005(tempbx); + SiSSetCH7005(tempbx); temp=*((UShort *)(ROMAddr+REFIndex+0x04)); tempbx=((temp&0x00FF)<<8)|0x0B; - SetCH7005(tempbx); + SiSSetCH7005(tempbx); - SetCH7005(0x2801); - SetCH7005(0x3103); - SetCH7005(0x003D); - SetCHTVRegANDOR(0x0010,0x1F); + SiSSetCH7005(0x2801); + SiSSetCH7005(0x3103); + SiSSetCH7005(0x003D); + SetCHTVRegANDOR(0x0010,0x1F); SetCHTVRegANDOR(0x0211,0xF8); SetCHTVRegANDOR(0x001C,0xEF); - + if(!(VBInfo&SetPALTV)) { if(ModeNo<=0x13) tempcl=*((UChar *)(ROMAddr+ModeIDOffset+0x04)); /* si+St_CRT2CRTC */ else tempcl=*((UChar *)(ROMAddr+REFIndex+4)); /* di+Ext_CRT2CRTC */ tempcl=tempcl&0x3F; if(VBInfo&SetCHTVOverScan) { if(tempcl==0x04) { /* 640x480 underscan */ - SetCHTVRegANDOR(0x0020,0xEF); - SetCHTVRegANDOR(0x0121,0xFE); + SetCHTVRegANDOR(0x0020,0xEF); + SetCHTVRegANDOR(0x0121,0xFE); } else { - if(tempcl==0x05) { /* 800x600 underscan */ - SetCHTVRegANDOR(0x0118,0xF0); - SetCHTVRegANDOR(0x0C19,0xF0); - SetCHTVRegANDOR(0x001A,0xF0); - SetCHTVRegANDOR(0x001B,0xF0); - SetCHTVRegANDOR(0x001C,0xF0); - SetCHTVRegANDOR(0x001D,0xF0); - SetCHTVRegANDOR(0x001E,0xF0); - SetCHTVRegANDOR(0x001F,0xF0); - SetCHTVRegANDOR(0x0120,0xEF); - SetCHTVRegANDOR(0x0021,0xFE); + if(tempcl==0x05) { /* 800x600 underscan */ + SetCHTVRegANDOR(0x0118,0xF0); + SetCHTVRegANDOR(0x0C19,0xF0); + SetCHTVRegANDOR(0x001A,0xF0); + SetCHTVRegANDOR(0x001B,0xF0); + SetCHTVRegANDOR(0x001C,0xF0); + SetCHTVRegANDOR(0x001D,0xF0); + SetCHTVRegANDOR(0x001E,0xF0); + SetCHTVRegANDOR(0x001F,0xF0); + SetCHTVRegANDOR(0x0120,0xEF); + SetCHTVRegANDOR(0x0021,0xFE); } } } else { if(tempcl==0x04) { /* 640x480 overscan */ - SetCHTVRegANDOR(0x0020,0xEF); - SetCHTVRegANDOR(0x0121,0xFE); + SetCHTVRegANDOR(0x0020,0xEF); + SetCHTVRegANDOR(0x0121,0xFE); } else { if(tempcl==0x05) { /* 800x600 overscan */ - SetCHTVRegANDOR(0x0118,0xF0); - SetCHTVRegANDOR(0x0F19,0xF0); - SetCHTVRegANDOR(0x011A,0xF0); - SetCHTVRegANDOR(0x0C1B,0xF0); - SetCHTVRegANDOR(0x071C,0xF0); - SetCHTVRegANDOR(0x011D,0xF0); - SetCHTVRegANDOR(0x0C1E,0xF0); - SetCHTVRegANDOR(0x071F,0xF0); - SetCHTVRegANDOR(0x0120,0xEF); - SetCHTVRegANDOR(0x0021,0xFE); + SetCHTVRegANDOR(0x0118,0xF0); + SetCHTVRegANDOR(0x0F19,0xF0); + SetCHTVRegANDOR(0x011A,0xF0); + SetCHTVRegANDOR(0x0C1B,0xF0); + SetCHTVRegANDOR(0x071C,0xF0); + SetCHTVRegANDOR(0x011D,0xF0); + SetCHTVRegANDOR(0x0C1E,0xF0); + SetCHTVRegANDOR(0x071F,0xF0); + SetCHTVRegANDOR(0x0120,0xEF); + SetCHTVRegANDOR(0x0021,0xFE); } } } } - REFIndex=old_REFIndex; + REFIndex=old_REFIndex; } static void SetCHTVRegANDOR(UShort tempax,UShort tempbh) @@ -4379,12 +4751,12 @@ static void SetCHTVRegANDOR(UShort tempax,UShort tempbh) tempal=tempax&0x00FF; tempah=(tempax>>8)&0x00FF; - tempbl=GetCH7005(tempal); - tempbl=(((tempbl&tempbh)|tempah)<<8|tempal); - SetCH7005(tempbl); + tempbl=SiSGetCH7005(tempal); + tempbl=(((tempbl&tempbh)|tempah)<<8|tempal); + SiSSetCH7005(tempbl); } -static void GetCHTVRegPtr(ULong ROMAddr,UShort ModeNo) +static void GetCHTVRegPtr(ULong ROMAddr,UShort ModeNo) { UShort tempbx,tempal,tempcl,CHTVRegDataPtr; @@ -4396,7 +4768,7 @@ static void GetCHTVRegPtr(ULong ROMAddr,UShort ModeNo) if(ModeNo<=0x13) tempal=*((UChar *)(ROMAddr+ModeIDOffset+0x04)); /* si+St_CRT2CRTC */ else tempal=*((UChar *)(ROMAddr+REFIndex+4)); /* di+Ext_CRT2CRTC */ tempal=tempal&0x3F; - + tempcl=CHTVRegDataLen; tempal=tempal*tempcl; tempbx=tempbx<<1; @@ -4404,10 +4776,10 @@ static void GetCHTVRegPtr(ULong ROMAddr,UShort ModeNo) CHTVRegDataPtr=*((UShort *)(ROMAddr+ADR_CHTVRegDataPtr)); REFIndex=*((UShort *)(ROMAddr+CHTVRegDataPtr+tempbx)); REFIndex=REFIndex+tempal; - } + } } -void SetCH7005(UShort tempbx) +void SiSSetCH7005(UShort tempbx) { UShort tempah,temp; @@ -4416,18 +4788,18 @@ void SetCH7005(UShort tempbx) DDC_DataShift=0x00; DDC_DeviceAddr=0xEA; - SetSwitchDDC2(); + SetSwitchDDC2(); SetStart(); tempah=DDC_DeviceAddr; - temp=WriteDDC2Data(tempah); - tempah=tempbx&0x00FF; - temp=WriteDDC2Data(tempah); - tempah=(tempbx&0xFF00)>>8; - temp=WriteDDC2Data(tempah); - SetStop(); + temp=WriteDDC2Data(tempah); + tempah=tempbx&0x00FF; + temp=WriteDDC2Data(tempah); + tempah=(tempbx&0xFF00)>>8; + temp=WriteDDC2Data(tempah); + SetStop(); } -UShort GetCH7005(UShort tempbx) +UShort SiSGetCH7005(UShort tempbx) { UShort tempah; @@ -4437,7 +4809,7 @@ UShort GetCH7005(UShort tempbx) DDC_DeviceAddr=0xEA; DDC_ReadAddr=tempbx; - SetSwitchDDC2(); + SetSwitchDDC2(); SetStart(); tempah=DDC_DeviceAddr; WriteDDC2Data(tempah); @@ -4449,8 +4821,8 @@ UShort GetCH7005(UShort tempbx) tempah=tempah|0x01; if(WriteDDC2Data(tempah)) { } - tempah=ReadDDC2Data(tempah); - SetStop(); + tempah=ReadDDC2Data(tempah); + SetStop(); return(tempah); } @@ -4460,72 +4832,72 @@ static void SetSwitchDDC2(void) SetSCLKHigh(); for(i=0;i<1000;i++) { - GetReg1(DDC_Port,0x05); + SiSGetReg1(DDC_Port,0x05); } SetSCLKLow(); for(i=0;i<1000;i++) { - GetReg1(DDC_Port,0x05); + SiSGetReg1(DDC_Port,0x05); } } static void SetStart(void) { - SetSCLKLow(); + SetSCLKLow(); SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x02); /* SetSDA(0x01); */ - SetSCLKHigh(); + SetSCLKHigh(); SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x00); /* SetSDA(0x00); */ - SetSCLKHigh(); + SetSCLKHigh(); } static void SetStop(void) { - SetSCLKLow(); + SetSCLKLow(); SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x00); /* SetSDA(0x00); */ - SetSCLKHigh(); + SetSCLKHigh(); SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x02); /* SetSDA(0x01); */ - SetSCLKHigh(); + SetSCLKHigh(); } static UShort WriteDDC2Data(UShort tempax) -{ +{ UShort i,flag; flag=0x80; - for(i=0;i<8;i++) { - SetSCLKLow(); + for(i=0;i<8;i++) { + SetSCLKLow(); if(tempax&flag) { - SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x02); + SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x02); } else { - SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x00); + SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x00); } - SetSCLKHigh(); + SetSCLKHigh(); flag=flag>>1; } return(CheckACK()); } static UShort ReadDDC2Data(UShort tempax) -{ +{ UShort i,temp,getdata; getdata=0; - for(i=0;i<8;i++) { + for(i=0;i<8;i++) { getdata=getdata<<1; SetSCLKLow(); - SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x02); + SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x02); SetSCLKHigh(); - temp=GetReg1(DDC_Port,DDC_Index); + temp=SiSGetReg1(DDC_Port,DDC_Index); if(temp&0x02) getdata=getdata|0x01; - } + } return(getdata); -} +} static void SetSCLKLow(void) { SetRegANDOR(DDC_Port,DDC_Index,0xFE,0x00); /* SetSCLKLow() */ - DDC2Delay(); + DDC2Delay(); } @@ -4535,17 +4907,17 @@ static void SetSCLKHigh(void) SetRegANDOR(DDC_Port,DDC_Index,0xFE,0x01); /* SetSCLKLow() */ do { - temp=GetReg1(DDC_Port,DDC_Index); + temp=SiSGetReg1(DDC_Port,DDC_Index); } while(!(temp&0x01)); - DDC2Delay(); -} + DDC2Delay(); +} static void DDC2Delay(void) { UShort i; - for(i=0;i<DDC2DelayTime;i++) { - GetReg1(P3c4,0x05); + for(i=0;i<DDC2DelayTime;i++) { + SiSGetReg1(P3c4,0x05); } } @@ -4554,10 +4926,26 @@ static UShort CheckACK(void) UShort tempah; SetSCLKLow(); - SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x02); + SetRegANDOR(DDC_Port,DDC_Index,0xFD,0x02); SetSCLKHigh(); - tempah=GetReg1(DDC_Port,DDC_Index); + tempah=SiSGetReg1(DDC_Port,DDC_Index); SetSCLKLow(); if(tempah&0x01) return(1); else return(0); } + +unsigned char SiSGetSetModeID(ScrnInfoPtr pScrn, unsigned char id) +{ + unsigned char ret; + + unsigned char* base = xf86MapVidMem(pScrn->scrnIndex, + VIDMEM_MMIO, 0, 0x2000); + ret = *(base + MODEID_OFF); + + /* id != 0xff means: set mode */ + if (id != 0xff) + *(base + MODEID_OFF) = id; + xf86UnMapVidMem(pScrn->scrnIndex,base,0x2000); + + return ret; +} diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.h b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.h index 91ab62d2b..a4cf2a101 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.h,v 1.4 2001/04/19 14:11:37 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_bios.h,v 1.8 2002/01/17 09:57:29 eich Exp $ */ typedef unsigned long ULong; typedef unsigned short UShort; @@ -52,7 +52,7 @@ typedef unsigned char UChar; #define ECLKindex3 0x0300 #define ECLKindex4 0x0400 -#define SetSimuScanMode 0x0001 +#define SetSimuScanMode 0x0001 /* CR 30 */ #define SwitchToCRT2 0x0002 #define SetCRT2ToTV 0x009C #define SetCRT2ToAVIDEO 0x0004 @@ -61,7 +61,7 @@ typedef unsigned char UChar; #define SetCRT2ToLCD 0x0020 #define SetCRT2ToRAMDAC 0x0040 #define SetCRT2ToHiVisionTV 0x0080 -#define SetNTSCTV 0x0000 +#define SetNTSCTV 0x0000 /* CR 31 */ #define SetPALTV 0x0100 #define SetInSlaveMode 0x0200 #define SetNotSimuMode 0x0400 @@ -198,11 +198,21 @@ typedef unsigned char UChar; #define PanelType0E 0x70 #define PanelType0F 0x78 -Bool SiSSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode); -void SetReg1(UShort port, UShort index, UShort data); -void DisableBridge(UShort BaseAddr); -void UnLockCRT2(UShort BaseAddr); -void LockCRT2(UShort BaseAddr); -void EnableBridge(UShort BaseAddr); -void SetCH7005(UShort tempbx); -UShort GetCH7005(UShort tempbx); +Bool SiSBIOSSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode); +void SiSRegInit(UShort BaseAddr); +UShort SiSCalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode); +void SiSSetReg1(UShort port, UShort index, UShort data); +UShort SiSGetReg1(UShort port, UShort index); +void SiSDisableBridge(UShort BaseAddr); +void SiSDisableBridgeLVDS(UShort BaseAddr); +void SiSDisableBridge301(UShort BaseAddr); +void SiSDisableBridge301B(UShort BaseAddr); +void SiSUnLockCRT2(UShort BaseAddr); +void SiSLockCRT2(UShort BaseAddr); +void SiSEnableBridge(UShort BaseAddr); +void SiSEnableBridgeLVDS(UShort BaseAddr); +void SiSEnableBridge301(UShort BaseAddr); +void SiSEnableBridge301B(UShort BaseAddr); +void SiSSetCH7005(UShort tempbx); +UShort SiSGetCH7005(UShort tempbx); +unsigned char SiSGetSetModeID(ScrnInfoPtr pScrn, unsigned char id); 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 4af718de2..3ca0943f8 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.18 2001/08/18 02:51:13 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c,v 1.20 2001/12/15 00:59:11 dawes Exp $ */ /* modified from tdfx_dri.c, mga_dri.c */ @@ -15,6 +15,7 @@ #include "sis.h" #include "sis_dri.h" +#include "xf86drmSiS.h" #define BR(x) (0x8200 | (x) << 2) #define SiSIdle \ @@ -22,8 +23,6 @@ while((MMIO_IN16(pSiS->IOBase, BR(16)+2) & 0xE000) != 0xE000){}; \ MMIO_IN16(pSiS->IOBase, 0x8240); -extern Bool drmSiSAgpInit(int driSubFD, int offset, int size); - extern void GlxSetVisualConfigs( int nconfigs, __GLXvisualConfig *configs, @@ -180,7 +179,9 @@ Bool SISDRIScreenInit(ScreenPtr pScreen) SISPtr pSIS = SISPTR(pScrn); DRIInfoPtr pDRIInfo; SISDRIPtr pSISDRI; +#if 000 drmVersionPtr version; +#endif /* Check that the GLX, DRI, and DRM modules have been loaded by testing * for canonical symbols in each module. */ @@ -454,7 +455,6 @@ SISDRIFinishScreenInit(ScreenPtr pScreen) ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; SISPtr pSiS = SISPTR(pScrn); SISDRIPtr pSISDRI; - drmVersionPtr version; pSiS->pDRIInfo->driverSwapMethod = DRI_HIDE_X_CONTEXT; /* pSiS->pDRIInfo->driverSwapMethod = DRI_SERVER_SWAP; */ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c index 588b8b18e..c5cbad927 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c @@ -24,8 +24,10 @@ * Juanjo Santamarta <santamarta@ctv.es>, * Mitani Hiroshi <hmitani@drl.mei.co.jp> * David Thomas <davtom@dream.org.uk>. + * + * Fixes for 630 chipsets: Thomas Winischhofer. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c,v 1.67 2001/08/07 07:04:51 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c,v 1.78 2002/01/17 10:49:35 eich Exp $ */ #include "fb.h" #include "xf1bpp.h" @@ -96,9 +98,17 @@ static Bool SISMapMem(ScrnInfoPtr pScrn); static Bool SISUnmapMem(ScrnInfoPtr pScrn); static void SISSave(ScrnInfoPtr pScrn); static void SISRestore(ScrnInfoPtr pScrn); +static void SISVESARestore(ScrnInfoPtr pScrn); static Bool SISModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode); static void SISModifyModeInfo(DisplayModePtr mode); -static void SiSPreSetMode(ScrnInfoPtr pScrn); +static void SiSPreSetMode(ScrnInfoPtr pScrn, int LockAfterwards); +static void SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg, int LockAfterwards); +static Bool SiSSetVESAMode(ScrnInfoPtr pScrn, DisplayModePtr pMode); +static void SiSBuildVesaModeList(ScrnInfoPtr pScrn, vbeInfoPtr pVbe, VbeInfoBlock *vbe); +static UShort CalcVESAModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode); +static void SISBridgeRestore(ScrnInfoPtr pScrn); +unsigned char SISSearchCRT1Rate(DisplayModePtr mode); +static void SISVESASaveRestore(ScrnInfoPtr pScrn, vbeSaveRestoreFunction function); void SiSOptions(ScrnInfoPtr pScrn); const OptionInfoRec * SISAvailableOptions(int chipid, int busid); @@ -150,7 +160,6 @@ static SymTabRec SISChipsets[] = { { PCI_CHIP_SG86C225, "SIS86c225" }, #endif { PCI_CHIP_SIS5597, "SIS5597" }, - { PCI_CHIP_SIS5597, "SIS5598" }, { PCI_CHIP_SIS530, "SIS530" }, { PCI_CHIP_SIS6326, "SIS6326" }, { PCI_CHIP_SIS300, "SIS300" }, @@ -183,6 +192,44 @@ int sis2Reg32MMIO[]={0x8200,0x8204,0x8208,0x820C,0x8210,0x8214,0x8218,0x821C, 0x8220,0x8224,0x8228,0x822C,0x8230,0x8234,0x8238,0x823C, 0x8240, 0x8300}; +/* TW: The following was re-included because there are BIOSes out there that + * report incomplete mode lists. These are BIOS versions <2.01.2x + * NOTE: Mode numbers for 1280, 1600 and 1920 are unofficial but they work here! + * TW: VBE 3.0 on SiS630 does not support 24 fpp modes (only 32fpp when depth = 24); + */ + /* 8 16 24 32 */ +static UShort VESAModeIndex_640x480[] = {0x100, 0x111, 0x112, 0x13a}; +static UShort VESAModeIndex_720x480[] = {0x000, 0x000, 0x000, 0x000}; +static UShort VESAModeIndex_720x576[] = {0x000, 0x000, 0x000, 0x000}; +static UShort VESAModeIndex_800x600[] = {0x103, 0x114, 0x115, 0x13b}; +static UShort VESAModeIndex_1024x768[] = {0x105, 0x117, 0x118, 0x13c}; +static UShort VESAModeIndex_1280x1024[] = {0x107, 0x11a, 0x11b, 0x13d}; +static UShort VESAModeIndex_1600x1200[] = {0x13e, 0x13f, 0x000, 0x140}; +static UShort VESAModeIndex_1920x1440[] = {0x141, 0x142, 0x000, 0x143}; + +static struct _sis_vrate { + CARD16 idx; + CARD16 xres; + CARD16 yres; + CARD16 refresh; +} sisx_vrate[] = { + {1, 640, 480, 60}, {2, 640, 480, 72}, {3, 640, 480, 75}, {4, 640, 480, 85}, + {5, 640, 480, 100}, {6, 640, 480, 120}, {7, 640, 480, 160}, {8, 640, 480, 200}, + {1, 720, 480, 60}, {1, 720, 576, 50}, + {1, 800, 600, 56}, {2, 800, 600, 60}, {3, 800, 600, 72}, {4, 800, 600, 75}, + {5, 800, 600, 85}, {6, 800, 600, 100}, {7, 800, 600, 120}, {8, 800, 600, 160}, + {1, 1024, 768, 43}, {2, 1024, 768, 60}, {3, 1024, 768, 70}, {4, 1024, 768, 75}, + {5, 1024, 768, 85}, {6, 1024, 768, 100}, {7, 1024, 768, 120}, + {1, 1280, 1024, 43}, {2, 1280, 1024, 60}, {3, 1280, 1024, 75}, {4, 1280, 1024, 85}, + {1, 1600, 1200, 60}, {2, 1600, 1200, 65}, {3, 1600, 1200, 70}, {4, 1600, 1200, 75}, + {5, 1600, 1200, 85}, + {1, 1920, 1440, 60}, + {0, 0, 0, 0} +}; + + +sisModeInfoPtr SISVesaModeList = NULL; + static const char *xaaSymbols[] = { "XAACopyROP", "XAACreateInfoRec", @@ -349,6 +396,12 @@ SISGetRec(ScrnInfoPtr pScrn) static void SISFreeRec(ScrnInfoPtr pScrn) { + SISPtr pSiS = SISPTR(pScrn); + + if (pSiS->pstate) xfree(pSiS->pstate); + pSiS->pstate = NULL; + if (pSiS->pVbe) vbeFree(pSiS->pVbe); + pSiS->pVbe = NULL; if (pScrn->driverPrivate == NULL) return; xfree(pScrn->driverPrivate); @@ -358,37 +411,54 @@ SISFreeRec(ScrnInfoPtr pScrn) static void SISDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags) { + SISPtr pSiS = SISPTR(pScrn); unsigned char extDDC_PCR; unsigned char crtc17 = 0; - unsigned char seq1 = 0 ; + unsigned char seq1 = 0; int vgaIOBase = VGAHWPTR(pScrn)->IOBase; - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,"SISDisplayPowerManagementSet(%d)\n",PowerManagementMode); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, + "SISDisplayPowerManagementSet(%d)\n",PowerManagementMode); + outb(vgaIOBase + 4, 0x17); crtc17 = inb(vgaIOBase + 5); + /* enable access to extended sequencer registers */ + outw(VGA_SEQ_INDEX, 0x8605); outb(VGA_SEQ_INDEX, 0x11); - extDDC_PCR = inb(VGA_SEQ_DATA) & ~0xC0; + extDDC_PCR = inb(VGA_SEQ_DATA); + /* if not blanked obtain state of LCD blank flags set by BIOS */ + if (!pSiS->Blank) + pSiS->LCDon = extDDC_PCR; + /* erase LCD blank flags */ + extDDC_PCR &= ~0xC; + switch (PowerManagementMode) { case DPMSModeOn: /* HSync: On, VSync: On */ seq1 = 0x00 ; + /* don't just unblanking; use LCD state set by BIOS */ + extDDC_PCR |= (pSiS->LCDon & 0x0C); + pSiS->Blank = FALSE; crtc17 |= 0x80; break; case DPMSModeStandby: /* HSync: Off, VSync: On */ seq1 = 0x20 ; - extDDC_PCR |= 0x40; + extDDC_PCR |= 0x8; + pSiS->Blank = TRUE; break; case DPMSModeSuspend: /* HSync: On, VSync: Off */ seq1 = 0x20 ; - extDDC_PCR |= 0x80; + extDDC_PCR |= 0x8; + pSiS->Blank = TRUE; break; case DPMSModeOff: /* HSync: Off, VSync: Off */ seq1 = 0x20 ; - extDDC_PCR |= 0xC0; + extDDC_PCR |= 0xC; + pSiS->Blank = TRUE; /* DPMSModeOff is not supported with ModeStandby | ModeSuspend */ /* need same as the generic VGA function */ crtc17 &= ~0x80; @@ -557,14 +627,15 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) SISPtr pSiS; MessageType from; int vgaIOBase; - int i; unsigned char unlock; + unsigned long int i; ClockRangePtr clockRanges; char *mod = NULL; const char *Sym = NULL; int pix24flags; vbeInfoPtr pVbe; + VbeInfoBlock *vbe; if (flags & PROBE_DETECT) { if (xf86LoadSubModule(pScrn, "vbe")) { @@ -656,6 +727,10 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) /* Set pScrn->monitor */ pScrn->monitor = pScrn->confScreen->monitor; + /* TW: ---EGBERT: Remove this before committing !*/ + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Unofficial driver (16.01.02) by Thomas Winischhofer\n"); + /* * Set the Chipset and ChipRev, allowing config file entries to * override. @@ -705,13 +780,24 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) * Our default depth is 8, so pass it to the helper function. * Our preference for depth 24 is 24bpp, so tell it that too. */ - pix24flags = Support32bppFb | Support24bppFb | + switch (pSiS->Chipset) { + case PCI_CHIP_SIS530: + pix24flags = Support32bppFb | Support24bppFb | SupportConvert24to32 | SupportConvert32to24; - if (pSiS->Chipset == PCI_CHIP_SIS6326) - pix24flags |= PreferConvert32to24; + break; + case PCI_CHIP_SIS300: + case PCI_CHIP_SIS630: + case PCI_CHIP_SIS540: + pix24flags = Support32bppFb | SupportConvert24to32; + break; + default: + pix24flags = Support24bppFb | + SupportConvert32to24 | PreferConvert32to24; + break; + } if (!xf86SetDepthBpp(pScrn, 8, 8, 8, pix24flags)) - return FALSE; + return FALSE; /* Check that the returned depth is one we support */ switch (pScrn->depth) { @@ -774,7 +860,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) } } - /* We use a programamble clock */ + /* We use a programmable clock */ pScrn->progClock = TRUE; /* Set the bits per RGB for 8bpp mode */ @@ -829,6 +915,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) pSiS->IOAddress = pSiS->PciInfo->memBase[1] & 0xFFFFFFF0; } + from = X_PROBED; xf86DrvMsg(pScrn->scrnIndex, from, "MMIO registers at 0x%lX\n", (unsigned long)pSiS->IOAddress); @@ -855,50 +942,100 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) pScrn->videoRam = 4096; xf86DrvMsg(pScrn->scrnIndex, from, "Limiting VideoRAM to %d KB\n", pScrn->videoRam); - } else + } else xf86DrvMsg(pScrn->scrnIndex, from, "VideoRAM: %d KB\n", pScrn->videoRam); + /* + * TW: New option: limit size of framebuffer memory for avoiding + * clash with DRI: + * Kernel framebuffer driver (sisfb) starts its memory heap + * at 8MB if it detects more VideoRAM than that(otherwise at 4MB). + * Therefore a setting of 8192 is recommended if DRI is + * to be used when there's more than 8MB video RAM available. + * This option can be left out if DRI is not to be used. + * Attention: TurboQueue and HWCursor should use videoRam value, + * not FbMapSize; these two are always located at the very top + * of the videoRAM. Both are already initialized by framebuffer + * driver, so they should not wander around while starting X. + */ + pSiS->FbMapSize = pScrn->videoRam * 1024; + /* TW: Touching FbMapSize doesn't work; now use maxxfbmem in accel*.c */ + if (pSiS->maxxfbmem) { + if (pSiS->maxxfbmem > pSiS->FbMapSize) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Invalid MaxXFBMem setting. Using all VideoRAM for framebuffer\n"); + pSiS->maxxfbmem = pSiS->FbMapSize; + } + } else pSiS->maxxfbmem = pSiS->FbMapSize; + + /* TW: Detect video bridge */ SISVGAPreInit(pScrn); + /* TW: Detect CRT2-LCD and LCD size */ SISLCDPreInit(pScrn); + /* TW: Detect CRT2-TV and PAL/NTSC mode */ SISTVPreInit(pScrn); - SISCRT2PreInit(pScrn); + /* TW: Detect CRT2-VGA */ + SISCRT2PreInit(pScrn); + /* TW: Eventually overrule detected CRT2 type */ if (pSiS->ForceCRT2Type == CRT2_DEFAULT) - { if (pSiS->VBFlags & CRT2_VGA) - pSiS->ForceCRT2Type = CRT2_VGA; - else if (pSiS->VBFlags & CRT2_LCD) - pSiS->ForceCRT2Type = CRT2_LCD; - else if (pSiS->VBFlags & CRT2_TV) - pSiS->ForceCRT2Type = CRT2_TV; - } + { + if (pSiS->VBFlags & CRT2_VGA) + pSiS->ForceCRT2Type = CRT2_VGA; + else if (pSiS->VBFlags & CRT2_LCD) + pSiS->ForceCRT2Type = CRT2_LCD; + else if (pSiS->VBFlags & CRT2_TV) + pSiS->ForceCRT2Type = CRT2_TV; + } switch (pSiS->ForceCRT2Type) - { case CRT2_TV: - pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_LCD | CRT2_VGA); - if (pSiS->VBFlags & (VB_301|VB_302|VB_303|VB_LVDS|VB_CHRONTEL)) - pSiS->VBFlags = pSiS->VBFlags | CRT2_TV; + { + case CRT2_TV: + pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_LCD | CRT2_VGA); + if (pSiS->VBFlags & VB_VIDEOBRIDGE) + pSiS->VBFlags = pSiS->VBFlags | CRT2_TV; else - pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_TV); + pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_TV); break; case CRT2_LCD: - pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_TV | CRT2_VGA); - if (pSiS->VBFlags & (VB_301|VB_302|VB_303|VB_LVDS|VB_CHRONTEL)) - pSiS->VBFlags = pSiS->VBFlags | CRT2_LCD; + pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_TV | CRT2_VGA); + if (pSiS->VBFlags & VB_VIDEOBRIDGE) + pSiS->VBFlags = pSiS->VBFlags | CRT2_LCD; else - pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_LCD); + pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_LCD); break; case CRT2_VGA: - pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_TV | CRT2_LCD); - if (pSiS->VBFlags & (VB_301|VB_302|VB_303|VB_LVDS|VB_CHRONTEL)) - pSiS->VBFlags = pSiS->VBFlags | CRT2_VGA; + pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_TV | CRT2_LCD); + if (pSiS->VBFlags & VB_VIDEOBRIDGE) + pSiS->VBFlags = pSiS->VBFlags | CRT2_VGA; else - pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_VGA); + pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_VGA); break; - } + default: + pSiS->VBFlags &= ~(CRT2_TV | CRT2_LCD | CRT2_VGA); + } + + /* TW: Check if CRT1 used (or needed; this if no CRT2 detected) */ + if (pSiS->VBFlags & VB_VIDEOBRIDGE) { + if (!(pSiS->VBFlags & (CRT2_VGA | CRT2_LCD | CRT2_TV))) + pSiS->CRT1off = 0; + } + else /* TW: no video bridge? Then we NEED CRT1! */ + pSiS->CRT1off = 0; + + /* TW: Determine CRT1<>CRT2 mode */ + if (pSiS->VBFlags & DISPTYPE_DISP2) { + if (pSiS->CRT1off) /* TW: CRT2 only */ + pSiS->VBFlags |= VB_DISPMODE_SINGLE; + else /* TW: CRT1 and CRT2 - mirror image */ + pSiS->VBFlags |= (VB_DISPMODE_MIRROR | DISPTYPE_CRT1); + } else /* TW: CRT1 only */ + pSiS->VBFlags |= (VB_DISPMODE_SINGLE | DISPTYPE_CRT1); SISDACPreInit(pScrn); + /* Lock extended registers */ outw(VGA_SEQ_INDEX, (unlock << 8) | 0x05); /* Set the min pixel clock */ @@ -933,7 +1070,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) else pSiS->MaxClock = speed; from = X_CONFIG; - } + } xf86DrvMsg(pScrn->scrnIndex, from, "Max pixel clock is %d MHz\n", pSiS->MaxClock / 1000); @@ -967,7 +1104,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) pScrn->bitsPerPixel * 8, 128, 4096, pScrn->display->virtualX, pScrn->display->virtualY, - pSiS->FbMapSize, + pSiS->maxxfbmem, LOOKUP_BEST_REFRESH); if (i == -1) { @@ -1061,18 +1198,39 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) } xf86LoaderReqSymLists(ddcSymbols, NULL); +/* TW: Now load and initialize VBE module. The default behavior + * for SiS630 with SiS301B, SiS302 or LVDS/CHRONTEL bridge + * is to use VESA for mode switching. This can be overruled + * with the option "VESA". + */ + { - Bool ret; - if (xf86LoadSubModule(pScrn, "vbe")) { - xf86LoaderReqSymLists(vbeSymbols, NULL); - if ((pVbe = VBEInit(NULL,pSiS->pEnt->index))) { - ret = xf86SetDDCproperties(pScrn, - xf86PrintEDID(vbeDoEDID(pVbe,NULL))); - vbeFree(pVbe); - } - } + Bool ret; + pSiS->UseVESA=0; + if (xf86LoadSubModule(pScrn, "vbe")) { + xf86LoaderReqSymLists(vbeSymbols, NULL); + if ((pSiS->pVbe = VBEInit(NULL,pSiS->pEnt->index))) { + ret = xf86SetDDCproperties(pScrn, + xf86PrintEDID(vbeDoEDID(pSiS->pVbe,NULL))); + if ( (pSiS->VESA == 1) + || ( (pSiS->VESA != 0) + && (pSiS->Chipset == PCI_CHIP_SIS630) + && (pSiS->VBFlags & (VB_301B|VB_302|VB_LVDS|VB_CHRONTEL))) ) { + vbe = VBEGetVBEInfo(pSiS->pVbe); + pSiS->vesamajor = (unsigned)(vbe->VESAVersion >> 8); + pSiS->vesaminor = vbe->VESAVersion & 0xff; + pSiS->vbeInfo = vbe; + SiSBuildVesaModeList(pScrn, pSiS->pVbe, vbe); + VBEFreeVBEInfo(vbe); + pSiS->UseVESA = 1; + /* TW: from now, use VESA functions for mode switching */ + } + } } - + vbeFree(pSiS->pVbe); + pSiS->pVbe = NULL; + } + #if 0 if (!ret && pSiS->ddc1Read) xf86SetDDCProperties(xf86PrintEDID(xf86DoEDID_DDC1( @@ -1097,7 +1255,7 @@ SISMapMem(ScrnInfoPtr pScrn) /* * Map IO registers to virtual address space - */ + */ #if !defined(__alpha__) mmioFlags = VIDMEM_MMIO; #else @@ -1162,7 +1320,6 @@ SISUnmapMem(ScrnInfoPtr pScrn) return TRUE; } - /* * This function saves the video state. */ @@ -1180,12 +1337,47 @@ SISSave(ScrnInfoPtr pScrn) vgaHWSave(pScrn, vgaReg, VGA_SR_ALL); (*pSiS->SiSSave)(pScrn, sisReg); + if(pSiS->UseVESA) SISVESASaveRestore(pScrn, MODE_SAVE); +} + +static void +SISVESASaveRestore(ScrnInfoPtr pScrn, vbeSaveRestoreFunction function) +{ + SISPtr pSiS; + + pSiS = SISPTR(pScrn); + + if (pSiS->vesamajor > 1 + && (function == MODE_SAVE || pSiS->pstate)) { + if (function == MODE_RESTORE) + memcpy(pSiS->state, pSiS->pstate, pSiS->stateSize); + ErrorF("VBESaveRestore\n"); + if ((VBESaveRestore(pSiS->pVbe,function, + (pointer)&pSiS->state, + &pSiS->stateSize,&pSiS->statePage))) { + if (function == MODE_SAVE) { + /* don't rely on the memory not being touched */ + if (pSiS->pstate == NULL) + pSiS->pstate = xalloc(pSiS->stateSize); + memcpy(pSiS->pstate, pSiS->state, pSiS->stateSize); + } + ErrorF("VBESaveRestore done with success\n"); + return; + } + ErrorF("VBESaveRestore done\n"); + } else { + if (function == MODE_SAVE) + (void)VBEGetVBEMode(pSiS->pVbe, &pSiS->stateMode); + else + VBESetVBEMode(pSiS->pVbe, pSiS->stateMode, NULL); + } } /* * Initialise a new mode. This is currently still using the old * "initialise struct, restore/write struct to HW" model. That could * be changed. + * TW: Why? */ static Bool @@ -1197,41 +1389,81 @@ SISModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) SISRegPtr sisReg; vgaHWUnlock(hwp); - + SISModifyModeInfo(mode); - /* Initialise the ModeReg values */ - if (!vgaHWInit(pScrn, mode)) - return FALSE; - pScrn->vtSema = TRUE; + /* TW: Initialize SiS Port Reg definitions for externally used + * sis_bios functions. + */ + SiSRegInit(pSiS->RelIO+0x30); + + if (pSiS->UseVESA) { /* With VESA: */ + /* + * This order is required: + * The video bridge needs to be adjusted before the + * BIOS is run as the BIOS sets up CRT2 according to + * these register settings. + * After the BIOS is run, the bridges and turboqueue + * registers need to be readjusted as the BIOS may + * very probably have messed them up. + */ + SiSPreSetMode(pScrn, 1); + /* TW: mode was pScrn->currentMode - VidModeExt did not work! */ + if (!SiSSetVESAMode(pScrn, mode)) + return FALSE; + SiSPreSetMode(pScrn, 1); + SiSPostSetMode(pScrn, &pSiS->ModeReg, 1); + + /* Prepare the register contents */ + if (!(*pSiS->ModeInit)(pScrn, mode)) + return FALSE; + + pScrn->vtSema = TRUE; + + /* Program the registers */ + vgaHWProtect(pScrn, TRUE); + (*pSiS->SiSRestore)(pScrn, &pSiS->ModeReg); + vgaHWProtect(pScrn, FALSE); + PDEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "HDisplay: %d, VDisplay: %d \n", + mode->HDisplay, mode->VDisplay)); + + } else { /* Without VESA: */ + /* Initialise the ModeReg values */ + if (!vgaHWInit(pScrn, mode)) + return FALSE; - if (!(*pSiS->ModeInit)(pScrn, mode)) - return FALSE; + if (!(*pSiS->ModeInit)(pScrn, mode)) + return FALSE; - PDEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "HDisplay: %d, VDisplay: %d \n", - mode->HDisplay, mode->VDisplay)); + pScrn->vtSema = TRUE; - /* Program the registers */ - vgaHWProtect(pScrn, TRUE); - vgaReg = &hwp->ModeReg; - sisReg = &pSiS->ModeReg; + PDEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "HDisplay: %d, VDisplay: %d \n", + mode->HDisplay, mode->VDisplay)); - vgaReg->Attribute[0x10] = 0x01; - if (pScrn->bitsPerPixel > 8) - vgaReg->Graphics[0x05] = 0x00; + /* Program the registers */ + vgaHWProtect(pScrn, TRUE); + vgaReg = &hwp->ModeReg; + sisReg = &pSiS->ModeReg; - vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE); + vgaReg->Attribute[0x10] = 0x01; + if (pScrn->bitsPerPixel > 8) + vgaReg->Graphics[0x05] = 0x00; - if ((pSiS->Chipset == PCI_CHIP_SIS300) || - (pSiS->Chipset == PCI_CHIP_SIS630) || - (pSiS->Chipset == PCI_CHIP_SIS540)) { - SiSPreSetMode(pScrn); - SiSSetMode(pScrn, pScrn->currentMode); - } else - (*pSiS->SiSRestore)(pScrn, sisReg); + vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE); - vgaHWProtect(pScrn, FALSE); + if ( (pSiS->Chipset == PCI_CHIP_SIS300) || + (pSiS->Chipset == PCI_CHIP_SIS630) || + (pSiS->Chipset == PCI_CHIP_SIS540) ) { + SiSPreSetMode(pScrn, 0); + if (!SiSBIOSSetMode(pScrn, mode)) + return FALSE; + } + else (*pSiS->SiSRestore)(pScrn, sisReg); + + vgaHWProtect(pScrn, FALSE); + } /* Reserved for debug * @@ -1241,11 +1473,40 @@ SISModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) return TRUE; } +static Bool +SiSSetVESAMode(ScrnInfoPtr pScrn, DisplayModePtr pMode) +{ + SISPtr pSiS; + int mode; + + pSiS = SISPTR(pScrn); + + if (!(mode = CalcVESAModeIndex(pScrn, pMode))) return FALSE; + ErrorF("mode: %x\n",mode); + + mode |= 1 << 15; /* TW: Don't clear framebuffer */ + mode |= 1 << 14; /* TW: always use linear adressing */ + + if (VBESetVBEMode(pSiS->pVbe, mode, NULL) == FALSE) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Setting mode 0x%x failed\n", + mode & 0x0fff); + return (FALSE); + } + + if (pMode->HDisplay != pScrn->virtualX) + VBESetLogicalScanline(pSiS->pVbe, pScrn->virtualX); + + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Setting mode 0x%x succeeded\n", + mode & 0x0fff); + + return (TRUE); +} + /* * Restore the initial (text) mode. */ -static void +static void SISRestore(ScrnInfoPtr pScrn) { vgaHWPtr hwp; @@ -1267,8 +1528,29 @@ SISRestore(ScrnInfoPtr pScrn) vgaHWProtect(pScrn, FALSE); } +static void +SISVESARestore(ScrnInfoPtr pScrn) +{ + SISPtr pSiS = SISPTR(pScrn); + + if(pSiS->UseVESA) SISVESASaveRestore(pScrn, MODE_RESTORE); +} + +/* TW: Restore bridge output registers - to be called BEFORE VESARestore */ +static void +SISBridgeRestore(ScrnInfoPtr pScrn) +{ + SISPtr pSiS = SISPTR(pScrn); + + if ( (pSiS->Chipset == PCI_CHIP_SIS300) || + (pSiS->Chipset == PCI_CHIP_SIS630) || + (pSiS->Chipset == PCI_CHIP_SIS540) ) { + + SiSRestoreBridge(pScrn, &pSiS->SavedReg); + } +} -/* Mandatory +/* Mandatory * This gets called at the start of each server generation */ static Bool SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) @@ -1284,8 +1566,7 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) int height, width, displayWidth; unsigned char *FBStart; - - /* + /* * First get the ScrnInfoRec */ pScrn = xf86Screens[pScreen->myNum]; @@ -1296,6 +1577,9 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pSiS = SISPTR(pScrn); + if (pSiS->UseVESA) + pSiS->pVbe = VBEInit(NULL,pSiS->pEnt->index); + /* Map the VGA memory and get the VGA IO base */ if (!vgaHWMapMem(pScrn)) return FALSE; @@ -1348,12 +1632,13 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) if (pScrn->bitsPerPixel > 8) { if (!miSetVisualTypes(pScrn->depth, TrueColorMask, pScrn->rgbBits, pScrn->defaultVisual)) - return FALSE; + return FALSE; + } else { if (!miSetVisualTypes(pScrn->depth, miGetDefaultVisualMask(pScrn->depth), pScrn->rgbBits, pScrn->defaultVisual)) - return FALSE; + return FALSE; } width = pScrn->virtualX; @@ -1376,8 +1661,8 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) } if (!miSetPixmapDepths()) - return FALSE; - + return FALSE; + { static int GlobalHWQueueLength = 0; @@ -1428,7 +1713,6 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) return FALSE; } - if (pScrn->bitsPerPixel > 8) { /* Fixup RGB ordering */ visual = pScreen->visuals + pScreen->numVisuals; @@ -1505,7 +1789,7 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) ShadowFBInit(pScreen, refreshArea); } - + xf86DPMSInit(pScreen, (DPMSSetProcPtr)SISDisplayPowerManagementSet, 0); #ifdef XvExtension @@ -1565,14 +1849,7 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) Bool SISSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) { - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; - SISPtr pSiS = SISPTR(pScrn); - if ((pSiS->Chipset == PCI_CHIP_SIS300) || - (pSiS->Chipset == PCI_CHIP_SIS630) || - (pSiS->Chipset == PCI_CHIP_SIS540)) - return SiSSetMode(xf86Screens[scrnIndex], mode); - else - return SISModeInit(xf86Screens[scrnIndex], mode); + return SISModeInit(xf86Screens[scrnIndex], mode); } /* @@ -1580,7 +1857,7 @@ SISSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) * displayed location in the video memory. */ /* Usually mandatory */ -void +void SISAdjustFrame(int scrnIndex, int x, int y, int flags) { ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; @@ -1594,6 +1871,11 @@ SISAdjustFrame(int scrnIndex, int x, int y, int flags) pSiS = SISPTR(pScrn); vgaIOBase = VGAHWPTR(pScrn)->IOBase; + if (pSiS->UseVESA) { + /* TW: Let BIOS adjust frame if using VESA */ + VBESetDisplayStart(pSiS->pVbe, x, y, TRUE); + } + else { outb(VGA_SEQ_INDEX, 0x05); /* Unlock Registers */ SR5State = inb(VGA_SEQ_DATA); outw(VGA_SEQ_INDEX, 0x8605); @@ -1631,13 +1913,13 @@ SISAdjustFrame(int scrnIndex, int x, int y, int flags) "3C5/0Dh set to hex %2X, base 0x%x\n", temp, base)); outb(VGA_SEQ_DATA, temp); if (pSiS->VBFlags) { -/* UnLockCRT2(pSiS->RelIO); */ - UnLockCRT2(pSiS->RelIO+0x30); +/* SiSUnLockCRT2(pSiS->RelIO); */ + SiSUnLockCRT2(pSiS->RelIO+0x30); outSISIDXREG(pSiS->RelIO+4, 6, GETVAR8(base)); outSISIDXREG(pSiS->RelIO+4, 5, GETBITS(base, 15:8)); outSISIDXREG(pSiS->RelIO+4, 4, GETBITS(base, 23:16)); -/* LockCRT2(pSiS->RelIO); */ - LockCRT2(pSiS->RelIO+0x30); +/* SiSLockCRT2(pSiS->RelIO); */ + SiSLockCRT2(pSiS->RelIO+0x30); } break; default: @@ -1650,6 +1932,9 @@ SISAdjustFrame(int scrnIndex, int x, int y, int flags) } outw(VGA_SEQ_INDEX, (SR5State << 8) | 0x05); /* Relock Registers */ + + } /* if not VESA */ + } /* @@ -1657,6 +1942,7 @@ SISAdjustFrame(int scrnIndex, int x, int y, int flags) * to reinitialise the video mode. * * We may wish to unmap video/MMIO memory too. + * (TW: This might be dangerous with TQ) */ /* Mandatory */ @@ -1664,37 +1950,23 @@ static Bool SISEnterVT(int scrnIndex, int flags) { ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; - SISPtr pSiS = SISPTR(pScrn); - #ifdef XF86DRI - ScreenPtr pScreen; + SISPtr pSiS = SISPTR(pScrn); #endif -#ifdef XF86DRI - if (pSiS->directRenderingEnabled) { - pScreen = screenInfo.screens[scrnIndex]; - DRIUnlock(pScreen); - } -#endif + if (!SISModeInit(pScrn, pScrn->currentMode)) + return FALSE; - /* Should we re-save the text mode on each VT enter? */ - if((pSiS->Chipset == PCI_CHIP_SIS300) || - (pSiS->Chipset == PCI_CHIP_SIS630) || - (pSiS->Chipset == PCI_CHIP_SIS540)) { - SiSPreSetMode(pScrn); - if (!SiSSetMode(pScrn, pScrn->currentMode)) - return FALSE; - } - else - if (!SISModeInit(pScrn, pScrn->currentMode)) - return FALSE; - SISAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); - + +#ifdef XF86DRI /* TW: this is to be done AFTER switching the mode */ + if (pSiS->directRenderingEnabled) + DRIUnlock(screenInfo.screens[scrnIndex]); +#endif + return TRUE; } - /* * This is called when VT switching away from the X server. Its job is * to restore the previous (text) mode. @@ -1708,22 +1980,37 @@ SISLeaveVT(int scrnIndex, int flags) { ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; vgaHWPtr hwp = VGAHWPTR(pScrn); + SISPtr pSiS; #ifdef XF86DRI ScreenPtr pScreen; - SISPtr pSiS; #endif - SISRestore(pScrn); - vgaHWLock(hwp); - -#ifdef XF86DRI pSiS = SISPTR(pScrn); + +#ifdef XF86DRI /* TW: to be done before mode change */ if (pSiS->directRenderingEnabled) { pScreen = screenInfo.screens[scrnIndex]; DRILock(pScreen, 0); } #endif + + SISBridgeRestore(pScrn); + + if (pSiS->UseVESA) { + /* TW: This is a q&d work-around for a BIOS bug. In case we disabled CRT2, + * VBESaveRestore() does not re-enable CRT1. So we set any mode now, + * because VBESetVBEMode correctly restores CRT1. Afterwards, we + * can call VBESaveRestore to restore original mode. + */ + if ( (pSiS->VBFlags & VB_VIDEOBRIDGE) && (!(pSiS->VBFlags & DISPTYPE_DISP2)) ) + VBESetVBEMode(pSiS->pVbe, (SISVesaModeList->n) | 0xc000, NULL); + SISVESARestore(pScrn); + } + + SISRestore(pScrn); + + vgaHWLock(hwp); } @@ -1749,9 +2036,20 @@ SISCloseScreen(int scrnIndex, ScreenPtr pScreen) #endif if (pScrn->vtSema) { - if (pCursorInfo) + if (pCursorInfo) pCursorInfo->HideCursor(pScrn); - SISRestore(pScrn); + SISBridgeRestore(pScrn); + if (pSiS->UseVESA) { + /* TW: This is a q&d work-around for a BIOS bug. In case we disabled CRT2, + * VBESaveRestore() does not re-enable CRT1. So we set any mode now, + * because VBESetVBEMode correctly restores CRT1. Afterwards, we + * can call VBESaveRestore to restore original mode. + */ + if ( (pSiS->VBFlags & VB_VIDEOBRIDGE) && (!(pSiS->VBFlags & DISPTYPE_DISP2))) + VBESetVBEMode(pSiS->pVbe, (SISVesaModeList->n) | 0xc000, NULL); + SISVESARestore(pScrn); + } + SISRestore(pScrn); vgaHWLock(hwp); SISUnmapMem(pScrn); } @@ -1784,6 +2082,22 @@ SISFreeScreen(int scrnIndex, int flags) static int SISValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) { + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + SISPtr pSiS = SISPTR(pScrn); + + if (pSiS->UseVESA) { + if (CalcVESAModeIndex(pScrn, mode)) + return (MODE_OK); + else + return (MODE_BAD); + } + if ((pSiS->Chipset == PCI_CHIP_SIS300) || + (pSiS->Chipset == PCI_CHIP_SIS630) || + (pSiS->Chipset == PCI_CHIP_SIS540)) { + if (SiSCalcModeIndex(pScrn, mode) < 0x14) + return (MODE_BAD); + } + return(MODE_OK); } @@ -1793,6 +2107,29 @@ SISValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) static Bool SISSaveScreen(ScreenPtr pScreen, int mode) { + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + if ((pScrn != NULL) && pScrn->vtSema) { + + SISPtr pSiS = SISPTR(pScrn); + /* enable access to extended sequencer registers */ + outw(VGA_SEQ_INDEX, 0x8605); + outb(VGA_SEQ_INDEX, 0x11); + /* if not blanked obtain state of LCD blank flags set by BIOS */ + if (!pSiS->Blank) { + unsigned char val; + val = inb(VGA_SEQ_DATA); + pSiS->LCDon = val; + } + if (!xf86IsUnblank(mode)) { + pSiS->Blank = TRUE; + outb(VGA_SEQ_DATA, (pSiS->LCDon | 0x8)); + } else { + pSiS->Blank = FALSE; + /* don't just unblanking; use LCD state set by BIOS */ + outb(VGA_SEQ_DATA, (pSiS->LCDon)); + } + } + return vgaHWSaveScreen(pScreen, mode); } @@ -1863,52 +2200,292 @@ SISModifyModeInfo(DisplayModePtr mode) mode->CrtcVBlankEnd--; } -void SiSPreSetMode(ScrnInfoPtr pScrn) +void SiSPreSetMode(ScrnInfoPtr pScrn, int LockAfterwards) { - SISPtr pSiS = SISPTR(pScrn); - unsigned char usScratchCR30, usScratchCR31; - unsigned short SR26, SR27; - unsigned long temp; - int vbflag; - - usScratchCR30 = usScratchCR31 = 0; + SISPtr pSiS = SISPTR(pScrn); + unsigned char usScratchCR30, usScratchCR31; + unsigned char usScratchCR32, usScratchCR33; + unsigned short SR26, SR27; + unsigned char SR5State; + unsigned long temp; + int vbflag; + + outb(VGA_SEQ_INDEX, 0x05); /* Unlock Registers */ + SR5State = inb(VGA_SEQ_DATA); + outw(VGA_SEQ_INDEX, 0x8605); + + usScratchCR30 = usScratchCR31 = usScratchCR33 = 0; outb(SISCR, 0x31); - usScratchCR31 = inb(SISCR+1) & 0x06; - vbflag=pSiS->VBFlags; + usScratchCR31 = inb(SISCR+1); + outb(SISCR, 0x33); /* TW: CRT1 refresh rate index */ + usScratchCR33 = inb(SISCR+1); + outb(SISCR, 0x32); /* TW: Bridge connection info */ + usScratchCR32 = inb(SISCR+1); + outb(SISCR, 0x30); + usScratchCR30 = inb(SISCR+1); + + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Bridge registers were 30=0x%02x, 31=0x%02x, 32=0x%02x, 33=0x%02x (VBFlags = 0x%x)\n", + usScratchCR30, usScratchCR31, usScratchCR32, usScratchCR33, pSiS->VBFlags); + usScratchCR30 = 0; + usScratchCR31 &= ~0x60; /* TW: clear VB_Drivermode & VB_OutputDisable */ + + vbflag=pSiS->VBFlags; switch (vbflag & (CRT2_TV|CRT2_LCD|CRT2_VGA)) { case CRT2_TV: - if (vbflag & TV_HIVISION) usScratchCR30 |= 0x80; - else if (vbflag & TV_PAL) usScratchCR31 |= 0x01; - - if (vbflag & TV_AVIDEO) usScratchCR30 |= 0x04; - else if (vbflag & TV_SVIDEO) usScratchCR30 |= 0x08; - else if (vbflag & TV_SCART) usScratchCR30 |= 0x10; - usScratchCR30 |= 0x01; - usScratchCR31 |= 0x40; - break; - case CRT2_LCD: - usScratchCR30 |= 0x21; - usScratchCR31 |= 0x40; - break; - case CRT2_VGA: - usScratchCR30 |= 0x41; - usScratchCR31 |= 0x40; - break; - default: - usScratchCR30 |= 0x00; - usScratchCR31 |= 0x60; - } - SetReg1(SISCR, 0x30, usScratchCR30); - SetReg1(SISCR, 0x31, usScratchCR31); - - /* Set Turbo Queue as 512K */ - if (!pSiS->NoAccel) { + if (vbflag & TV_HIVISION) + usScratchCR30 |= 0x80; + else if (vbflag & TV_SVIDEO) + usScratchCR30 |= 0x08; + else if (vbflag & TV_AVIDEO) + usScratchCR30 |= 0x04; + else if (vbflag & TV_SCART) + usScratchCR30 |= 0x10; + if (vbflag & TV_PAL) + usScratchCR31 |= 0x01; + else + usScratchCR31 &= ~0x01; +#if 0 /* TW: Old code */ + if (vbflag & TV_HIVISION) usScratchCR30 |= 0x80; + else if (vbflag & TV_PAL) usScratchCR31 |= 0x01; + + if (vbflag & TV_AVIDEO) usScratchCR30 |= 0x04; + else if (vbflag & TV_SVIDEO) usScratchCR30 |= 0x08; + else if (vbflag & TV_SCART) usScratchCR30 |= 0x10; +#endif + usScratchCR30 |= 0x01; + usScratchCR31 &= ~0x04; + break; + case CRT2_LCD: + usScratchCR30 |= 0x21; + usScratchCR31 |= 0x02; + break; + case CRT2_VGA: + usScratchCR30 |= 0x41; + break; + default: /* TW: When CRT2Type is NONE, we can calculate a proper rate for CRT1 */ + usScratchCR30 |= 0x00; + usScratchCR31 |= 0x20; /* TW: VB_OUTPUT_DISABLE */ + if (pSiS->UseVESA) + usScratchCR33 = SISSearchCRT1Rate(pScrn->currentMode); + } + /* + * TW: for VESA: no DRIVERMODE, otherwise + * -) CRT2 will not be initialized correctly when using mode + * where LCD has to scale + * -) CRT1 will have too low rate + */ + if (pSiS->UseVESA) usScratchCR31 &= ~0x40; + else usScratchCR31 |= 0x40; /* 0x40=drivermode */ + + SiSSetReg1(SISCR, 0x30, usScratchCR30); + SiSSetReg1(SISCR, 0x31, usScratchCR31); + SiSSetReg1(SISCR, 0x33, usScratchCR33); + + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Bridge registers set to 30=0x%02x, 31=0x%02x, 33=0x%02x\n", + usScratchCR30, usScratchCR31, usScratchCR33); + + /* Set Turbo Queue as 512K */ + /* TW: This is done here _and_ in SiS300Init() because SiS300Init() only + * sets up structure but structure is not written to hardware (using + * SiS300Restore) on SiS630, 300, 540 (unless VESA is used). + */ + if (!pSiS->NoAccel) { if (pSiS->TurboQueue) { - temp = (pScrn->videoRam/64) - 8; - SR26 = temp & 0xFF; - SR27 = ((temp >> 8) & 3) | 0xF0; - SetReg1(SISSR, 0x26, SR26); - SetReg1(SISSR, 0x27, SR27); - } - } + temp = (pScrn->videoRam/64) - 8; + SR26 = temp & 0xFF; + SR27 = ((temp >> 8) & 3) | 0xF0; + SiSSetReg1(SISSR, 0x26, SR26); + SiSSetReg1(SISSR, 0x27, SR27); + } + } + + if (LockAfterwards) + outw(VGA_SEQ_INDEX, (SR5State << 8) | 0x05); /* Relock Registers */ } + +/* TW: This doesn't work yet. Switching CRT1 off this way causes a white screen on CRT2 */ +void SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg, int LockAfterwards) +{ +#if 0 + SISPtr pSiS = SISPTR(pScrn); + unsigned char usScratchCR17; + unsigned char SR5State; + + outb(VGA_SEQ_INDEX, 0x05); /* Unlock Registers */ + SR5State = inb(VGA_SEQ_DATA); + outw(VGA_SEQ_INDEX, 0x8605); + + if ((pSiS->VBFlags & (VB_LVDS | VB_CHRONTEL)) && + pScrn->bitsPerPixel == 8) + pSiS->CRT1off = 0; + + xf86DrvMsg(0, X_PROBED, "CRT1off %d\n", pSiS->CRT1off); + + outb(SISCR, 0x17); + usScratchCR17 = inb(SISCR+1); + + xf86DrvMsg(0, X_PROBED, "CR17 was 0x%2x\n", usScratchCR17); + if (pSiS->CRT1off) + usScratchCR17 &= ~0x80; /* sisReg->sisRegs3D4[0x17] &= ~0x80; */ + else + usScratchCR17 |= 0x80; /* sisReg->sisRegs3D4[0x17] |= 0x80; */ + + xf86DrvMsg(0, X_PROBED, "CR17 set to 0x%2x\n", usScratchCR17); + /*SiSSetReg1(SISCR, 0x17, usScratchCR17); */ + + if (LockAfterwards) + outw(VGA_SEQ_INDEX, (SR5State << 8) | 0x05); /* Relock Registers */ +#endif +} + +static void +SiSBuildVesaModeList(ScrnInfoPtr pScrn, vbeInfoPtr pVbe, VbeInfoBlock *vbe) +{ + int i = 0; + while (vbe->VideoModePtr[i] != 0xffff) { + sisModeInfoPtr m; + VbeModeInfoBlock *mode; + int id = vbe->VideoModePtr[i++]; + int bpp; + + if ((mode = VBEGetModeInfo(pVbe, id)) == NULL) + continue; + + bpp = mode->BitsPerPixel; + /* TW: Doesn't work on SiS630 VBE 3.0: */ + /* mode->GreenMaskSize + mode->BlueMaskSize + + mode->RedMaskSize; */ + + m = xnfcalloc(sizeof(sisModeInfoRec),1); + m->width = mode->XResolution; + m->height = mode->YResolution; + m->bpp = bpp; + m->n = id; + m->next = SISVesaModeList; + + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "BIOS reported VESA mode 0x%x: x:%i y:%i bpp:%i\n", + m->n, m->width, m->height, m->bpp); + + SISVesaModeList = m; + + VBEFreeModeInfo(mode); + } +} + +static UShort CalcVESAModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + sisModeInfoPtr m = SISVesaModeList; + UShort i = (pScrn->bitsPerPixel+7)/8 - 1; /* bitsperpixel was depth */ + UShort ModeIndex = 0; + + while (m) { + if (pScrn->bitsPerPixel == m->bpp + && mode->HDisplay == m->width + && mode->VDisplay == m->height) + return m->n; + m = m->next; + } + + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "No valid BIOS VESA mode found for %dx%dx%d; searching built-in table.\n", + mode->HDisplay, mode->VDisplay, pScrn->bitsPerPixel); + + switch(mode->HDisplay) + { + case 640: + ModeIndex = VESAModeIndex_640x480[i]; + break; + case 720: + if(mode->VDisplay == 480) + ModeIndex = VESAModeIndex_720x480[i]; + else + ModeIndex = VESAModeIndex_720x576[i]; + break; + case 800: + ModeIndex = VESAModeIndex_800x600[i]; + break; + case 1024: + ModeIndex = VESAModeIndex_1024x768[i]; + break; + case 1280: + ModeIndex = VESAModeIndex_1280x1024[i]; + break; + case 1600: + ModeIndex = VESAModeIndex_1600x1200[i]; + break; + case 1920: + ModeIndex = VESAModeIndex_1920x1440[i]; + break; + } + + if (!ModeIndex) xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "No valid mode found for %dx%dx%d in built-in table either.", + mode->HDisplay, mode->VDisplay, pScrn->bitsPerPixel); + + return(ModeIndex); +} + +/* TW: Calculate CR33 (rate index) for CRT1 if CRT2 is disabled. + Calculation is done using currentmode structure, therefore + it is recommended to set VertRefresh and HorizSync to correct + values in Config file. + */ +unsigned char SISSearchCRT1Rate(DisplayModePtr mode) +{ + float hsync, refresh = 0; + int i = 0; + unsigned short xres=mode->HDisplay; + unsigned short yres=mode->VDisplay; + unsigned char index; + + if (mode->HSync > 0.0) + hsync = mode->HSync; + else if (mode->HTotal > 0) + hsync = (float)mode->Clock / (float)mode->HTotal; + else + hsync = 0.0; + if (mode->VTotal > 0) + refresh = hsync * 1000.0 / mode->VTotal; + if (mode->Flags & V_INTERLACE) { + refresh *= 2.0; + } + if (mode->Flags & V_DBLSCAN) { + refresh /= 2.0; + } + if (mode->VScan > 1) { + refresh /= mode->VScan; + } + if (mode->VRefresh > 0.0) + refresh = mode->VRefresh; + if (hsync == 0 || refresh == 0) + return 0x02; /* TW: Default mode index */ + else { + index = 0; + while ((sisx_vrate[i].idx != 0) && (sisx_vrate[i].xres <= xres)) { + if ((sisx_vrate[i].xres == xres) + && (sisx_vrate[i].yres == yres)) { + if (sisx_vrate[i].refresh == refresh) { + index = sisx_vrate[i].idx; + break; + } else if (sisx_vrate[i].refresh > refresh) { + if ((sisx_vrate[i].refresh - refresh) <= 2) { + index = sisx_vrate[i].idx; + } else if (((refresh - sisx_vrate[i - 1].refresh) <= 2) + && (sisx_vrate[i].idx != 1)) { + index = sisx_vrate[i - 1].idx; + } + break; + } + } + i++; + } + if (index > 0) + return index; + else + return 0x02; /* TW: Default Rate index */ + } +} + diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.c index beb712fac..d02ba59fd 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.c,v 1.3 2001/04/19 12:40:33 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.c,v 1.6 2002/01/17 09:57:30 eich Exp $ */ #include "xf86.h" #include "xf86_ansic.h" @@ -9,66 +9,148 @@ #include "sis_regs.h" #include "sis_vb.h" +/* TW: Detect CRT2-LCD and LCD size */ void SISLCDPreInit(ScrnInfoPtr pScrn) { SISPtr pSiS = SISPTR(pScrn); - int temp; - - - if (!(pSiS->VBFlags & (VB_301|VB_302|VB_303|VB_LVDS|VB_CHRONTEL))) - return; - - inSISIDXREG(pSiS->RelIO+CROFFSET, 0x32, temp); - if (temp & 0x08) - pSiS->VBFlags |= CRT2_LCD; - - inSISIDXREG(pSiS->RelIO+CROFFSET, 0x36, temp); - if (temp == 1) - pSiS->VBFlags |= LCD_800x600; - if (temp == 2) - pSiS->VBFlags |= LCD_1024x768; - if (temp == 3) - pSiS->VBFlags |= LCD_1280x1024; + int CR32, SR17, CR36; + + if (!(pSiS->VBFlags & VB_VIDEOBRIDGE)) + return; + + inSISIDXREG(pSiS->RelIO+CROFFSET, 0x32, CR32); + inSISIDXREG(pSiS->RelIO+SROFFSET, 0x17, SR17); + + if ( (SR17 & 0x0F) && (pSiS->Chipset != PCI_CHIP_SIS300) ) { + if ( (SR17 & 0x01) && (!pSiS->CRT1off) ) + pSiS->CRT1off = 0; + else { + if (SR17 & 0x0E) + pSiS->CRT1off = 1; + else + pSiS->CRT1off = 0; + } + if (SR17 & 0x02) + pSiS->VBFlags |= CRT2_LCD; + } else { + if ( (CR32 & 0x20) && (!pSiS->CRT1off) ) + pSiS->CRT1off = 0; + else { + if (CR32 & 0x5F) + pSiS->CRT1off = 1; + else + pSiS->CRT1off = 0; + } + if (CR32 & 0x08) + pSiS->VBFlags |= CRT2_LCD; + } + + if (pSiS->VBFlags & CRT2_LCD) { + inSISIDXREG(pSiS->RelIO+CROFFSET, 0x36, CR36); + switch (CR36) { + case 1: + pSiS->VBFlags |= LCD_800x600; + pSiS->LCDheight = 600; + break; + case 2: + pSiS->VBFlags |= LCD_1024x768; + pSiS->LCDheight = 768; + break; + case 3: + pSiS->VBFlags |= LCD_1280x1024; + pSiS->LCDheight = 1024; + break; + case 4: + pSiS->VBFlags |= LCD_1280x960; /* TW */ + pSiS->LCDheight = 960; + break; + case 5: + pSiS->VBFlags |= LCD_640x480; /* TW */ + pSiS->LCDheight = 480; + break; + default: + pSiS->VBFlags |= LCD_1024x768; /* TW */ + pSiS->LCDheight = 768; + break; + } + } } - + +/* TW: Detect CRT2-TV connector type and PAL/NTSC flag */ void SISTVPreInit(ScrnInfoPtr pScrn) { SISPtr pSiS = SISPTR(pScrn); - int temp; - - if (!(pSiS->VBFlags & (VB_301|VB_302|VB_303|VB_LVDS|VB_CHRONTEL))) - return; - - inSISIDXREG(pSiS->RelIO+CROFFSET, 0x32, temp); - if (temp & 0x04) - pSiS->VBFlags |= (CRT2_TV | TV_SCART); - else if (temp & 0x02) - pSiS->VBFlags |= (CRT2_TV | TV_SVIDEO); - else if (temp & 0x01) - pSiS->VBFlags |= (CRT2_TV | TV_AVIDEO); - else if (temp & 0x40) - pSiS->VBFlags |= (CRT2_TV | TV_HIVISION); - return; - + int CR32, CR38, SR16, SR17; + + if (!(pSiS->VBFlags & VB_VIDEOBRIDGE)) + return; + + inSISIDXREG(pSiS->RelIO+CROFFSET, 0x32, CR32); + inSISIDXREG(pSiS->RelIO+SROFFSET, 0x17, SR17); + + if ( (SR17 & 0x0F) && (pSiS->Chipset != PCI_CHIP_SIS300) ) { + if (SR17 & 0x04) /* { */ /* TW: Determine TV type even if not using TV output */ + pSiS->VBFlags |= CRT2_TV; + + if (SR17 & 0x20) + pSiS->VBFlags |= TV_SVIDEO; + else if (SR17 & 0x10) + pSiS->VBFlags |= TV_AVIDEO; + inSISIDXREG(pSiS->RelIO+SROFFSET, 0x16, SR16); + if (SR16 & 0x20) + pSiS->VBFlags |= TV_PAL; + else + pSiS->VBFlags |= TV_NTSC; + /* } */ + } else { + if (CR32 & 0x47) /* { */ + pSiS->VBFlags |= CRT2_TV; + if (CR32 & 0x04) + pSiS->VBFlags |= TV_SCART; + else if (CR32 & 0x02) + pSiS->VBFlags |= TV_SVIDEO; + else if (CR32 & 0x01) + pSiS->VBFlags |= TV_AVIDEO; + else if (CR32 & 0x40) + pSiS->VBFlags |= (TV_SVIDEO | TV_HIVISION); + inSISIDXREG(pSiS->RelIO+SROFFSET, 0x38, CR38); + if (CR38 & 0x01) + pSiS->VBFlags |= TV_PAL; + else + pSiS->VBFlags |= TV_NTSC; + /* } */ + } + + /* TW: This is old code: */ + + /* TW: Reading PAL/NTSC flag from 0x31 is not a good idea. We'd + * better read this from POWER_ON_TRAP (0x38) some day. */ +#if 0 inSISIDXREG(pSiS->RelIO+CROFFSET, 0x31, temp); if (temp & 0x01) - pSiS->VBFlags |= TV_PAL; + pSiS->VBFlags |= TV_PAL; else - pSiS->VBFlags |= TV_NTSC; + pSiS->VBFlags |= TV_NTSC; +#endif } - -void SISCRT2PreInit(ScrnInfoPtr pScrn) + + /* TW: Detect CRT2-VGA */ + void SISCRT2PreInit(ScrnInfoPtr pScrn) { SISPtr pSiS = SISPTR(pScrn); - int temp; - - if (!(pSiS->VBFlags & (VB_301|VB_302|VB_303|VB_LVDS|VB_CHRONTEL))) - return; - - inSISIDXREG(pSiS->RelIO+CROFFSET, 0x32, temp); - if (temp & 0x10) - pSiS->VBFlags |= CRT2_VGA; - - return; - + int SR17, CR32; + + if (!(pSiS->VBFlags & VB_VIDEOBRIDGE)) + return; + + inSISIDXREG(pSiS->RelIO+CROFFSET, 0x32, CR32); + inSISIDXREG(pSiS->RelIO+SROFFSET, 0x17, SR17); + + if ( (SR17 & 0x0F) && (pSiS->Chipset != PCI_CHIP_SIS300) ) { + if (SR17 & 0x08) + pSiS->VBFlags |= CRT2_VGA; + } else { + if (CR32 & 0x10) + pSiS->VBFlags |= CRT2_VGA; + } } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.h b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.h index a47cc5446..b78af5477 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.h,v 1.4 2001/04/19 12:40:33 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.h,v 1.5 2002/01/17 09:57:30 eich Exp $ */ /* CR30 VBInfo = CR31:CR30 */ #define SET_SIMU_SCAN_MODE 0x0001 @@ -12,13 +12,13 @@ #define SET_CRT2_TO_TV (SET_CRT2_TO_AVIDEO | SET_CRT2_TO_SVIDEO | \ SET_CRT2_TO_SCART | SET_CRT2_TO_HIVISION_TV) /* CR31 */ -#define SET_PAL_TV 0x0100 +#define SET_PAL_TV 0x0100 #define SET_IN_SLAVE_MODE 0x0200 #define SET_NO_SIMU_ON_LOCK 0x0400 #define SET_NO_SIMU_TV_ON_LOCK SET_NO_SIMU_ON_LOCK #define DISABLE_LOAD_CRT2DAC 0x1000 #define DISABLE_CRT2_DISPLAY 0x2000 -#define DRIVER_MODE 0x4000 +#define DRIVER_MODE 0x4000 typedef struct _SiS301Reg { CARD8 *VBPart1; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/suncg14/cg14_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/suncg14/cg14_driver.c index 5989ae07d..18e7304bd 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/suncg14/cg14_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/suncg14/cg14_driver.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/drivers/suncg14/cg14_driver.c,v 1.5 2001/08/07 07:04:51 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/suncg14/cg14_driver.c,v 1.6 2001/10/01 13:44:10 eich Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -323,7 +323,7 @@ CG14PreInit(ScrnInfoPtr pScrn, int flags) deal with depth *********************/ - if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support32bppFb)) { + if (!xf86SetDepthBpp(pScrn, 32, 0, 32, Support32bppFb)) { return FALSE; } else { /* Check that the returned depth is one we support */ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sunleo/leo_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/sunleo/leo_driver.c index 768461f8f..e5f402a97 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sunleo/leo_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sunleo/leo_driver.c @@ -21,7 +21,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/drivers/sunleo/leo_driver.c,v 1.7 2001/05/18 16:03:13 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sunleo/leo_driver.c,v 1.8 2001/10/01 13:44:10 eich Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -332,7 +332,7 @@ LeoPreInit(ScrnInfoPtr pScrn, int flags) deal with depth *********************/ - if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support32bppFb)) { + if (!xf86SetDepthBpp(pScrn, 32, 0, 32, Support32bppFb)) { return FALSE; } else { /* Check that the returned depth is one we support */ 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 ce9f18de1..d7c11b7af 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.19 2001/04/05 21:29:17 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c,v 1.20 2001/10/28 03:33:49 tsi Exp $ */ /* All drivers should typically include these */ #include "xf86.h" @@ -897,9 +897,9 @@ TDFXSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int x, int y, TDFXWriteLong(pTDFX, SST_2D_CLIP1MAX, (((y+h)&0x1FFF)<<16)|((x+w)&0x1FFF)); #if X_BYTE_ORDER == X_BIG_ENDIAN /* bit 20 byte swizzle */ - TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, (((w+31)/32)*4) & 0x3FFF | BIT(20)); + TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, ((((w+31)/32)*4) & 0x3FFF) | BIT(20)); #else - TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, (((w+31)/32)*4) & 0x3FFF); + TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, (((w+31)/32)*4) & 0x3FFF); #endif pTDFX->sst2DSrcFmtShadow = (((w+31)/32)*4) & 0x3FFF; TDFXWriteLong(pTDFX, SST_2D_SRCXY, skipleft&0x1F); 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 62c611315..73a764b1b 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c @@ -27,7 +27,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.85 2001/08/18 02:51:13 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c,v 1.87 2002/01/04 21:22:35 tsi Exp $ */ /* * Authors: @@ -806,7 +806,7 @@ TDFXPreInit(ScrnInfoPtr pScrn, int flags) } } - /* We use a programamble clock */ + /* We use a programmable clock */ pScrn->progClock = TRUE; pTDFX->cpp = pScrn->bitsPerPixel/8; @@ -2018,7 +2018,9 @@ TDFXScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) { TDFXPtr pTDFX; VisualPtr visual; BoxRec MemBox; +#ifdef XF86DRI MessageType driFrom = X_DEFAULT; +#endif int scanlines; TDFXTRACE("TDFXScreenInit start\n"); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_hwcurs.c b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_hwcurs.c index 1cf277289..637ece49a 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_hwcurs.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_hwcurs.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_hwcurs.c,v 1.4 2001/04/05 21:29:17 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_hwcurs.c,v 1.5 2001/10/28 03:33:50 tsi Exp $ */ /* Voodoo Banshee driver version 1.0.2 @@ -60,7 +60,7 @@ HARDWARE_CURSOR_BIT_ORDER_MSBFIRST | #if X_BYTE_ORDER == X_BIG_ENDIAN static unsigned int TDFXSwap(TDFXPtr pTDFX, unsigned int val) { switch (pTDFX->cpp) { - case 1: + default: return val; case 2: return ((val & 0x00ff00ff) << 8) | 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 efa4eab96..b00596df8 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.14 2001/08/01 00:44:54 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tga/tga_accel.c,v 1.15 2001/11/21 22:32:59 alanh Exp $ */ /* * Copyright 1996,1997 by Alan Hourihane, Wigan, England. @@ -53,7 +53,7 @@ #define CE_BUFSIZE 256 -#define FB_OFFSET(x, y) (((y) * pScrn->displayWidth * (pTga->Bpp)) + (x) * pTga->Bpp) +#define FB_OFFSET(x, y) (((long)(y) * pScrn->displayWidth * (pTga->Bpp)) + (long)(x) * pTga->Bpp) /* prototypes */ @@ -617,14 +617,10 @@ TGASubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, 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) { @@ -657,7 +653,8 @@ 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 cando; + unsigned int cando_mask; int source_align, destination_align; int pixel_shift; #ifdef PROFILE @@ -754,7 +751,8 @@ 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 cando; + unsigned int cando_mask; int source_align, destination_align; int pixel_shift; int read; @@ -814,7 +812,7 @@ TGACopyLineBackwards(ScrnInfoPtr pScrn, int x1, int y1, int x2, 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", + ErrorF("CPY-BWD - preliminary copy: sa = %d, da = %d, ps =%d\n", source_align, destination_align, pixel_shift); #endif TGA_FAST_WRITE_REG(pixel_shift, TGA_PIXELSHIFT_REG); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/vesa/vesa.c b/xc/programs/Xserver/hw/xfree86/drivers/vesa/vesa.c index bc74043d6..9e949b192 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/vesa/vesa.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/vesa/vesa.c @@ -27,7 +27,7 @@ * * Authors: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/drivers/vesa/vesa.c,v 1.23 2001/08/07 07:04:53 keithp Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/drivers/vesa/vesa.c,v 1.24 2001/10/01 13:44:12 eich Exp $ */ #include "vesa.h" @@ -183,6 +183,7 @@ static const char *vbeSymbols[] = { "VBESetGetPaletteData", "VBESetVBEMode", "vbeDoEDID", + "vbeFree", NULL }; @@ -480,8 +481,10 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) pScrn->progClock = TRUE; pScrn->rgbBits = 8; - if (!xf86SetDepthBpp(pScrn, 8, 8, 8, Support24bppFb)) + if (!xf86SetDepthBpp(pScrn, 8, 8, 8, Support24bppFb)) { + vbeFree(pVesa->pVbe); return (FALSE); + } xf86PrintDepthBpp(pScrn); /* Get the depth24 pixmap format */ @@ -489,12 +492,15 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) pVesa->pix24bpp = xf86GetBppFromDepth(pScrn, 24); /* color weight */ - if (pScrn->depth > 8 && !xf86SetWeight(pScrn, rzeros, rzeros)) + if (pScrn->depth > 8 && !xf86SetWeight(pScrn, rzeros, rzeros)) { + vbeFree(pVesa->pVbe); return (FALSE); - + } /* visual init */ - if (!xf86SetDefaultVisual(pScrn, -1)) + if (!xf86SetDefaultVisual(pScrn, -1)) { + vbeFree(pVesa->pVbe); return (FALSE); + } xf86SetGamma(pScrn, gzeros); @@ -506,8 +512,10 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) if (pVesa->major >= 2) { /* Load ddc module */ - if ((pDDCModule = xf86LoadSubModule(pScrn, "ddc")) == NULL) + if ((pDDCModule = xf86LoadSubModule(pScrn, "ddc")) == NULL) { + vbeFree(pVesa->pVbe); return (FALSE); + } if ((pVesa->monitor = vbeDoEDID(pVesa->pVbe, pDDCModule)) != NULL) { xf86PrintEDID(pVesa->monitor); @@ -677,6 +685,7 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) pVesa->mapSize = vbe->TotalMemory * 65536; if (pScrn->modePool == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No matching modes\n"); + vbeFree(pVesa->pVbe); return (FALSE); } for (i = 0; pScrn->modePool != NULL && pScrn->display->modes[i] != NULL; i++) { @@ -791,18 +800,21 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) if (pScrn->modes == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No modes\n"); + vbeFree(pVesa->pVbe); return (FALSE); } /* options */ xf86CollectOptions(pScrn, NULL); - if (!(pVesa->Options = xalloc(sizeof(VESAOptions)))) + if (!(pVesa->Options = xalloc(sizeof(VESAOptions)))) { + vbeFree(pVesa->pVbe); return FALSE; + } memcpy(pVesa->Options, VESAOptions, sizeof(VESAOptions)); xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pVesa->Options); /* Use shadow by default */ - if (xf86ReturnOptValBool(pVesa->Options, OPTION_SHADOW_FB, TRUE)) + if (xf86ReturnOptValBool(pVesa->Options, OPTION_SHADOW_FB, TRUE)) pVesa->shadowFB = TRUE; mode = ((ModeInfoData*)pScrn->modes->Private)->data; @@ -858,6 +870,7 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unsupported bpp: %d", pScrn->bitsPerPixel); + vbeFree(pVesa->pVbe); return FALSE; } break; @@ -869,13 +882,16 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) mod = "mfb"; reqSym = "mfbScreenInit"; } - if (!xf86LoadSubModule(pScrn, "shadow")) + if (!xf86LoadSubModule(pScrn, "shadow")) { + vbeFree(pVesa->pVbe); return (FALSE); + } xf86LoaderReqSymLists(shadowSymbols, NULL); } if (mod && xf86LoadSubModule(pScrn, mod) == NULL) { VESAFreeRec(pScrn); + vbeFree(pVesa->pVbe); return (FALSE); } @@ -887,6 +903,8 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) } } + vbeFree(pVesa->pVbe); + return (TRUE); } @@ -900,6 +918,9 @@ VESAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) int flags; int init_picture = 0; + if ((pVesa->pVbe = VBEInit(NULL, pVesa->pEnt->index)) == NULL) + return (FALSE); + if (pVesa->mapPhys == 0) { mode = ((ModeInfoData*)(pScrn->currentMode->Private))->data; pScrn->videoRam = pVesa->mapSize; diff --git a/xc/programs/Xserver/hw/xfree86/etc/Xinstall.sh b/xc/programs/Xserver/hw/xfree86/etc/Xinstall.sh index 80fc88ea2..7d8027689 100644 --- a/xc/programs/Xserver/hw/xfree86/etc/Xinstall.sh +++ b/xc/programs/Xserver/hw/xfree86/etc/Xinstall.sh @@ -1,13 +1,13 @@ #!/bin/sh # -# $XFree86: xc/programs/Xserver/hw/xfree86/etc/Xinstall.sh,v 1.28 2001/07/02 09:37:18 alanh Exp $ +# $XFree86: xc/programs/Xserver/hw/xfree86/etc/Xinstall.sh,v 1.37 2002/01/17 20:54:23 dawes Exp $ # # Copyright © 2000 by Precision Insight, Inc. # Copyright © 2000, 2001 by VA Linux Systems, Inc. -# Portions Copyright © 1996-2000 by The XFree86 Project, Inc. +# Copyright © 1996-2002 by The XFree86 Project, Inc. # -# This script should be used to install XFree86 4.1.0. +# This script should be used to install XFree86 4.2.0. # # Parts of this script are based on the old preinst.sh and postinst.sh # scripts. @@ -20,12 +20,16 @@ # Fallbacks for when the bindist version can't be auto-detected. # These should be updated for each release. -FULLPREFIX=4.1 +FULLPREFIX=4.2 PATCHLEVEL=0 VERSION=$FULLPREFIX.$PATCHLEVEL FULLVERSION=$FULLPREFIX.0 SCRIPTVERSION=$VERSION +# XXX Could get this (and above) version info from imake... +FreetypeCurrent=8 +FreetypeAge=2 + BINDISTFULLPREFIX= BINDISTPATCHLEVEL= BINDISTVERSION= @@ -36,10 +40,26 @@ ROOTDIR= TESTROOT=/home1/test if [ X"$1" = "X-test" -o X"$XINST_TEST" != X ]; then - ROOTDIR=$TESTROOT if [ X"$1" = "X-test" ]; then shift + case "$1" in + /*) + TESTROOT="$1" + shift + ;; + esac + else + case "$XINST_TEST" in + /*) + TESTROOT="$XINST_TEST" + ;; + esac fi + ROOTDIR=$TESTROOT + echo "" + echo "Running in test mode, with root set to $TESTROOT" + sleep 2 + echo "" if [ ! -d $TESTROOT ]; then echo "$TESTROOT doesn't exist (for test mode)" exit 1 @@ -50,8 +70,6 @@ if [ X"$1" = "X-test" -o X"$XINST_TEST" != X ]; then mkdir $TESTROOT/$i fi done - echo "" - echo "Running in test mode" fi RUNDIR=$ROOTDIR/usr/X11R6 @@ -222,7 +240,7 @@ Description() Xfnon*) echo "Some large fonts";; Xfscl*) - echo "Scaled fonts (Speedo and Type1)";; + echo "Scaled fonts (Speedo, Type1 and TTF)";; Xhtml*) echo "Docs in HTML";; Xjdoc*) @@ -414,8 +432,14 @@ FindDistName() case "$OsArch" in Power*) case "$OsVersion" in - 1.[2-9]*) - DistName="Darwin-ppc" + 1.[2-3]*) + DistName="Darwin-ppc-1.x" + ;; + 1.4.* | 5.*) + DistName="Darwin-ppc-5.x" + ;; + [6-9].*) + Message="No Darwin/ppc binaries available for this OS version. Try Darwin-ppc-5.x" ;; *) Message="No Darwin/ppc binaries available for this OS version" @@ -424,8 +448,11 @@ FindDistName() ;; x86*) case "$OsVersion" in - 1.[3-9]*) - DistName="Darwin-ix86" + 1.4.* | 5.*) + DistName="Darwin-ix86-5.x" + ;; + [6-9].*) + Message="No Darwin/ix86 binaries available for this OS version. Try Darwin-ix86-5.x" ;; *) Message="No Darwin/ix86 binaries available for this OS version" @@ -467,6 +494,9 @@ FindDistName() 4.*) DistName="FreeBSD-4.x" ;; + 5.*) + DistName="FreeBSD-5.x" + ;; *) Message="FreeBSD/i386 binaries are not available for this version" ;; @@ -480,6 +510,9 @@ FindDistName() 4.*) DistName="FreeBSD-alpha-4.x" ;; + 5.*) + DistName="FreeBSD-alpha-5.x" + ;; *) Message="FreeBSD/alpha binaries are not available for this version" ;; @@ -556,7 +589,7 @@ FindDistName() 6.0) DistName="Linux-mips-glibc20" ;; - *) + *) Message="No Linux/Mips binaries for this libc version" ;; esac @@ -597,8 +630,8 @@ FindDistName() case "$OsArch" in i386) case "$OsVersion" in - 2.9*) # Check this - DistName="OpenBSD-2.9" + 3.0*) # Check this + DistName="OpenBSD-3.0" ;; *) Message="No OpenBSD/i386 binaries available for this version" @@ -656,10 +689,13 @@ FindDistName() if [ X"$DistName" != X ]; then echo "Binary distribution name is '$DistName'" echo "" + echo "If you don't find a binary distribution with this name, then" + echo "binaries for your platform are not available from XFree86.org." + echo "" else if [ X"$Message" = X ]; then echo "Can't find which binary distribution you should use." - echo "Please send the output of this script to XFree86@XFree86.org" + echo "Please send the output of this script to XFree86@XFree86.org." echo "" else echo "$Message" @@ -718,7 +754,7 @@ CheckInstallType() ;; esac fi - + # Auto-detect based on what files are present if [ X"$DOUPDATE" = X ]; then @@ -803,6 +839,8 @@ InstallUpdate() FreeBSD|NetBSD|OpenBSD) echo "" echo "Running ldconfig" + # Make sure the directory isn't group-writable + chmod g-w $RUNDIR/lib /sbin/ldconfig -m $RUNDIR/lib ;; Linux) @@ -822,7 +860,7 @@ InstallUpdate() echo "" fi done - + echo "" echo "Update installation complete." } @@ -871,9 +909,14 @@ CYGWIN*) SERVDIST="Xxserv.tgz" ;; Darwin) - SERVDIST="Xxserv.tgz" - EXTRAOPTDIST="Xquartz.tgz" UPDATEDIST="Xupdate.tgz Xdocupd.tgz" + # On Mac OS X, we require Quartz support + if [ -d /System/Library/Frameworks/ApplicationServices.framework ]; then + SERVDIST="Xxserv.tgz Xquartz.tgz" + else + SERVDIST="Xxserv.tgz" + EXTRAOPTDIST="Xquartz.tgz" + fi ;; FreeBSD|NetBSD|OpenBSD) VARDIST="Xvar.tgz" @@ -1284,31 +1327,6 @@ for i in $OPTDIST $EXTRAOPTDIST; do fi done -# Need to run ldconfig on some OSs -case "$OsName" in -FreeBSD|NetBSD|OpenBSD) - echo "" - echo "Running ldconfig" - /sbin/ldconfig -m $RUNDIR/lib - ;; -Linux) - echo "" - echo "Running ldconfig" - /sbin/ldconfig $RUNDIR/lib - ;; -esac - -# Run mkfontdir in the local and misc directories to make sure that -# the fonts.dir files are up to date after the installation. -echo "" -for i in $FONTDIRS $EXTRAFONTDIRS; do - if [ -d $RUNDIR/lib/X11/fonts/$i ]; then - Echo "Updating the fonts.dir file in $RUNDIR/lib/X11/fonts/$i..." - $RUNDIR/bin/mkfontdir $RUNDIR/lib/X11/fonts/$i - echo "" - fi -done - # Check if the system has a termcap file TERMCAP1DIR=$ROOTDIR/usr/share TERMCAP2=$ROOTDIR/etc/termcap @@ -1361,7 +1379,7 @@ OLDTINFO=" \ x/xterm-old \ x/xterm-r5 \ v/vs100" - + if [ -d $TINFODIR ]; then echo "" echo "You appear to have a terminfo directory: $TINFODIR" @@ -1472,6 +1490,64 @@ if [ -f $RUNDIR/lib/libGL.so ]; then esac fi +# Create compatibility links for the freetype library on systems where the +# major version gets incremented even though the library is compatible with +# older versions. + +echo "" +echo "Checking if compatibility links for the FreeType2 library are needed ..." +if [ -f $RUNDIR/lib/libfreetype.so.$FreetypeCurrent ]; then + v=`expr $FreetypeCurrent - $FreetypeAge` + while [ $v != $FreetypeCurrent ]; do + if [ ! -f $RUNDIR/lib/libfreetype.so.$v ]; then + rm -f $RUNDIR/lib/libfreetype.so.$v + ln -s libfreetype.so.$FreetypeCurrent $RUNDIR/lib/libfreetype.so.$v + echo "Linking libfreetype.so.$FreetypeCurrent to $RUNDIR/lib/libfreetype.so.$v" + fi + v=`expr $v + 1` + done +fi + +if [ -f $RUNDIR/lib/libfreetype.so.$FreetypeCurrent.0 ]; then + v=`expr $FreetypeCurrent - $FreetypeAge` + while [ $v != $FreetypeCurrent ]; do + if [ ! -f $RUNDIR/lib/libfreetype.so.$v.0 ]; then + rm -f $RUNDIR/lib/libfreetype.so.$v.0 + ln -s libfreetype.so.$FreetypeCurrent.0 $RUNDIR/lib/libfreetype.so.$v.0 + echo "Linking libfreetype.so.$FreetypeCurrent.0 to $RUNDIR/lib/libfreetype.so.$v".0 + fi + v=`expr $v + 1` + done +fi + +# Need to run ldconfig on some OSs +case "$OsName" in +FreeBSD|NetBSD|OpenBSD) + echo "" + echo "Running ldconfig" + # Make sure the directory isn't group-writable + chmod g-w $RUNDIR/lib + /sbin/ldconfig -m $RUNDIR/lib + ;; +Linux) + echo "" + echo "Running ldconfig" + /sbin/ldconfig $RUNDIR/lib + ;; +esac + +# Run mkfontdir in the local and misc directories to make sure that +# the fonts.dir files are up to date after the installation. +echo "" +for i in $FONTDIRS $EXTRAFONTDIRS; do + if [ -d $RUNDIR/lib/X11/fonts/$i ]; then + Echo "Updating the fonts.dir file in $RUNDIR/lib/X11/fonts/$i..." + $RUNDIR/bin/mkfontdir $RUNDIR/lib/X11/fonts/$i + echo "" + fi +done + + if [ -f $RUNDIR/bin/rstartd ]; then echo "" echo "If you are going to use rstart and $RUNDIR/bin isn't in the" @@ -1493,6 +1569,7 @@ if [ -f $RUNDIR/bin/rstartd ]; then esac fi + # Finally, check for old 3.3.x modules that will conflict with 4.x if [ -d $RUNDIR/lib/modules ]; then for i in $OLDMODULES; do diff --git a/xc/programs/Xserver/hw/xfree86/etc/bindist/Linux-mips/bin-list b/xc/programs/Xserver/hw/xfree86/etc/bindist/Linux-mips/bin-list index 0b402b073..c04fdd8e8 100644 --- a/xc/programs/Xserver/hw/xfree86/etc/bindist/Linux-mips/bin-list +++ b/xc/programs/Xserver/hw/xfree86/etc/bindist/Linux-mips/bin-list @@ -12,18 +12,15 @@ lib/libICE.so lib/libOSMesa.so.3.3 lib/libOSMesa.so.3 lib/libOSMesa.so -lib/libPEX5.so.6.0 -lib/libPEX5.so.6 -lib/libPEX5.so lib/libSM.so.6.0 lib/libSM.so.6 lib/libSM.so lib/libX11.so.6.2 lib/libX11.so.6 lib/libX11.so -lib/libXIE.so.6.0 -lib/libXIE.so.6 -lib/libXIE.so +lib/libXTrap.so.6.4 +lib/libXTrap.so.6 +lib/libXTrap.so lib/libXaw.so.6.1 lib/libXaw.so.6 lib/libXaw.so.7.0 @@ -32,10 +29,10 @@ lib/libXaw.so lib/libXext.so.6.4 lib/libXext.so.6 lib/libXext.so -lib/libXfont.so.1.3 +lib/libXfont.so.1.4 lib/libXfont.so.1 lib/libXfont.so -lib/libXft.so.1.0 +lib/libXft.so.1.1 lib/libXft.so.1 lib/libXft.so lib/libXi.so.6.0 @@ -53,7 +50,10 @@ lib/libXp.so lib/libXpm.so.4.11 lib/libXpm.so.4 lib/libXpm.so -lib/libXrender.so.1.0 +lib/libXrandr.so.1.0 +lib/libXrandr.so.1 +lib/libXrandr.so +lib/libXrender.so.1.1 lib/libXrender.so.1 lib/libXrender.so lib/libXt.so.6.0 @@ -68,7 +68,7 @@ lib/libdps.so lib/libdpstk.so.1.0 lib/libdpstk.so.1 lib/libdpstk.so -lib/libfreetype.so.6.0 +lib/libfreetype.so.6.2 lib/libfreetype.so.6 lib/libfreetype.so lib/libpsres.so.1.0 diff --git a/xc/programs/Xserver/hw/xfree86/etc/bindist/common/host.def b/xc/programs/Xserver/hw/xfree86/etc/bindist/common/host.def index d8853c1a5..c12dfc608 100644 --- a/xc/programs/Xserver/hw/xfree86/etc/bindist/common/host.def +++ b/xc/programs/Xserver/hw/xfree86/etc/bindist/common/host.def @@ -6,7 +6,7 @@ * - XFree86 doctools package (requires groff) * - nroff/troff or groff * - * $XFree86: xc/programs/Xserver/hw/xfree86/etc/bindist/common/host.def,v 1.9 2001/04/23 15:54:04 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/etc/bindist/common/host.def,v 1.11 2002/01/16 18:36:01 dawes Exp $ */ #define HasSgmlFmt YES @@ -15,10 +15,7 @@ #define HasLatex YES #define BuildSpecsDocs YES -#define SpecsDocDirs BDF CTEXT FSProtocol GL ICCCM ICE \ - /*PEX5*/ PM Render SM X11 XDMCP XIM XLFD \ - XProtocol Xaw Xext Xi Xmu Xserver Xt Xv \ - i18n programs rstart xfs xterm xtrans +#define BuildAllSpecsDocs YES #define InstallHardcopyDocs YES #define HardcopyDocDirs RX XIE XKB XPRINT diff --git a/xc/programs/Xserver/hw/xfree86/loader/extsym.c b/xc/programs/Xserver/hw/xfree86/loader/extsym.c index 46ad232f4..62a5ea98a 100644 --- a/xc/programs/Xserver/hw/xfree86/loader/extsym.c +++ b/xc/programs/Xserver/hw/xfree86/loader/extsym.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/loader/extsym.c,v 1.5 2000/11/01 22:50:04 anderson Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/loader/extsym.c,v 1.6 2001/11/17 16:05:59 dawes Exp $ */ /* * @@ -30,6 +30,7 @@ #ifdef PANORAMIX #include "panoramiX.h" #endif +#include "sleepuntil.h" #ifdef HAS_SHM extern int ShmCompletionCode; @@ -52,6 +53,8 @@ extern int XineramaDeleteResource(pointer, XID); LOOKUP extLookupTab[] = { + SYMFUNC(ClientSleepUntil) + #ifdef HAS_SHM SYMVAR(ShmCompletionCode) SYMVAR(BadShmSegCode) diff --git a/xc/programs/Xserver/hw/xfree86/loader/xf86sym.c b/xc/programs/Xserver/hw/xfree86/loader/xf86sym.c index 68a5f6450..a270617f2 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.197 2001/08/15 19:08:55 herrb Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/loader/xf86sym.c,v 1.202 2002/01/14 18:16:52 dawes Exp $ */ /* * @@ -47,6 +47,7 @@ #include "xf86cmap.h" #include "xf86fbman.h" #include "dgaproc.h" +#include "dpmsproc.h" #include "vidmodeproc.h" #include "xf86miscproc.h" #include "loader.h" @@ -103,6 +104,17 @@ extern long __udivdi3(long, long); extern long __umoddi3(long, long); #endif +#if defined(__arm__) +#if defined(__linux__) +#include <sys/io.h> +#endif + +extern long __divsi3(long, long); +extern long __modsi3(long, long); +extern long __udivsi3(long, long); +extern long __umodsi3(long, long); +#endif + #if defined(__powerpc__) && (defined(Lynx) || defined(linux)) void _restf14(); void _restf17(); @@ -157,8 +169,6 @@ extern int testinx2(unsigned short, unsigned char, unsigned char); extern int testinx(unsigned short, unsigned char); #endif -extern void DPMSSet(CARD16); - /* XFree86 things */ LOOKUP xfree86LookupTab[] = { @@ -494,6 +504,7 @@ LOOKUP xfree86LookupTab[] = { /* xf86fbman.c */ SYMFUNC(xf86InitFBManager) + SYMFUNC(xf86InitFBManagerArea) SYMFUNC(xf86InitFBManagerRegion) SYMFUNC(xf86RegisterFreeBoxCallback) SYMFUNC(xf86FreeOffscreenArea) @@ -594,7 +605,9 @@ LOOKUP xfree86LookupTab[] = { SYMFUNC(xf86XInputSetSendCoreEvents) /* End merged segment */ #endif + SYMFUNC(DPMSGet) SYMFUNC(DPMSSet) + SYMFUNC(DPMSSupported) /* xf86Debug.c */ #ifdef BUILDDEBUG SYMFUNC(xf86Break1) @@ -711,6 +724,7 @@ LOOKUP xfree86LookupTab[] = { SYMFUNC(xf86fgetc) SYMFUNC(xf86fgetpos) SYMFUNC(xf86fgets) + SYMFUNC(xf86finite) SYMFUNC(xf86floor) SYMFUNC(xf86fmod) SYMFUNC(xf86fopen) @@ -981,6 +995,18 @@ LOOKUP xfree86LookupTab[] = { SYMFUNC(_inw) SYMFUNC(_inl) #endif +#if defined(__arm__) + SYMFUNC(__divsi3) + SYMFUNC(__udivsi3) + SYMFUNC(__modsi3) + SYMFUNC(__umodsi3) + SYMFUNC(outw) + SYMFUNC(outb) + SYMFUNC(outl) + SYMFUNC(inb) + SYMFUNC(inw) + SYMFUNC(inl) +#endif #ifdef __FreeBSD__ SYMFUNC(sysctlbyname) @@ -1002,9 +1028,12 @@ LOOKUP xfree86LookupTab[] = { SYMVAR(xf86Screens) SYMVAR(byte_reversed) /* debugging variables */ +#ifdef BUILDDEBUG + SYMVAR(xf86p8bit) SYMVAR(xf86DummyVar1) SYMVAR(xf86DummyVar2) SYMVAR(xf86DummyVar3) +#endif /* variables for PCI devices and cards from xf86Bus.c */ SYMVAR(xf86PCICardInfo) diff --git a/xc/programs/Xserver/hw/xfree86/os-support/Imakefile b/xc/programs/Xserver/hw/xfree86/os-support/Imakefile index d6488a304..f5a938af4 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/os-support/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/Imakefile,v 3.48 2001/08/17 22:08:14 tsi Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/Imakefile,v 3.52 2001/12/27 20:07:05 dawes Exp $ @@ -11,12 +11,11 @@ XCOMM $XConsortium: Imakefile /main/9 1996/10/25 15:38:46 kaleb $ #define IHaveSubdirs #if defined(i386Architecture) || defined(ia64Architecture) || \ - (defined(LinuxArchitecture) && defined(AlphaArchitecture)) || \ + (defined(SunArchitecture) && defined(SparcArchitecture)) || \ (defined(FreeBSDArchitecture) && defined(AlphaArchitecture)) || \ - defined(PpcArchitecture) || defined(SparcArchitecture) || \ - (defined(LinuxArchitecture) && defined(MipsArchitecture)) || \ - (defined(LinuxArchitecture) && defined(SuperHArchitecture)) || \ - (defined(LinuxArchitecture) && defined(SuperHebArchitecture)) + (defined(OpenBSDArchitecture) && defined(PpcArchitecture)) || \ + (defined(LynxOSArchitecture) && defined(PpcArchitecture)) || \ + defined(LinuxArchitecture) BUS_SUBDIR = bus #endif @@ -82,12 +81,12 @@ OS_SUBDIR = sco #if BuildXF86DRI DRM_SRC = $(OS_SUBDIR)/drm/?*.c DRM_OBJ = $(OS_SUBDIR)/drm/?*.o -DRMDONE = $(OS_SUBDIR)/drm/DONE +DRM_DONES = $(OS_SUBDIR)/drm/DONE #endif VBE_SRC = vbe/?*.c VBE_OBJ = vbe/?*.o -VBEDONE = vbe/DONE +VBE_DONES = vbe/DONE #endif @@ -96,7 +95,7 @@ SUBDIRS = $(OS_SUBDIR) $(BUS_SUBDIR) misc vbe SRCS = $(OS_SUBDIR)/?*.c $(BUS_SUBDIR)/?*.c misc/?*.c $(VBE_SRC) $(DRM_SRC) OBJS = $(OS_SUBDIR)/?*.o $(BUS_SUBDIR)/?*.o misc/?*.o $(VBE_OBJ) $(DRM_OBJ) -DONES = $(OS_SUBDIR)/DONE $(BUS_SUBDIR)/DONE misc/DONE $(VBEDONE) $(DRMDONE) +DONES = $(OS_SUBDIR)/DONE $(BUS_SUBDIR)/DONE misc/DONE $(VBE_DONES) $(DRM_DONES) #if HasParallelMake MakeMutex($(SUBDIRS) $(OBJS) $(DONES)) diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/Imakefile b/xc/programs/Xserver/hw/xfree86/os-support/bsd/Imakefile index ef8f8dad6..747c5b135 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/Imakefile @@ -4,7 +4,7 @@ XCOMM $XConsortium: Imakefile /main/12 1996/10/27 11:06:35 kaleb $ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/Imakefile,v 3.47 2001/02/15 19:34:20 eich Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/Imakefile,v 3.50 2001/12/31 18:18:49 herrb Exp $ #include <Server.tmpl> @@ -58,20 +58,32 @@ MOUSEOBJ = bsd_mouse.o MTRRDEFINES = -DHAS_MTRR_SUPPORT #endif +#if defined(NetBSDArchitecture) && defined(HasMTRRBuiltin) +MTRRDEFINES = -DHAS_MTRR_BUILTIN +#endif + #if UsbMouseSupport -USBMOUSEDEFINES = -DUSBMOUSE_SUPPORT +USBMOUSEDEFINES1 = -DUSBMOUSE_SUPPORT #if !HasLibUsb LIBUSBINCLUDES = -Ilibusb #define IHaveSubdirs SUBDIRS = libusb +#else +#if HasLibUsbHid +USBMOUSEDEFINES2 = -DHAS_LIB_USB_HID #endif #endif +#endif +USBMOUSEDEFINES = $(USBMOUSEDEFINES1) $(USBMOUSEDEFINES2) - -#if (defined(NetBSDArchitecture) || defined(OpenBSDArchitecture)) \ - && defined(i386Architecture) +#if (defined(OpenBSDArchitecture) || defined(NetBSDArchitecture)) && defined(i386Architecture) +# if !defined(HasApmKqueue) || !HasApmKqueue APMSRC = bsd_apm.c APMOBJ = bsd_apm.o +# else +APMSRC = bsd_kqueue_apm.c +APMOBJ = bsd_kqueue_apm.o +# endif #else APMSRC = pm_noop.c APMOBJ = pm_noop.o @@ -98,7 +110,7 @@ AXP_SRC=bsd_ev56.c xf86Axp.c bsd_axp.c AXP_OBJ=bsd_ev56.o xf86Axp.o bsd_axp.o #endif -#if defined(FreeBSDArchitecture) && HasAgpGart +#if (defined(FreeBSDArchitecture) || defined(NetBSDArchitecture)) && HasAgpGart AGP_SRC=lnx_agp.c AGP_OBJ=lnx_agp.o #else @@ -171,7 +183,7 @@ LinkSourceFile(stdPci.c,../shared) LinkSourceFile(vidmem.c,../shared) LinkSourceFile(sigio.c,../shared) LinkSourceFile(kmod_noop.c,../shared) -#if defined(FreeBSDArchitecture) && HasAgpGart +#if (defined(FreeBSDArchitecture) || defined(NetBSDArchitecture)) && HasAgpGart LinkSourceFile(lnx_agp.c,../linux) #else LinkSourceFile(agp_noop.c,../shared) 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 d28ff8a48..d9fc90cf1 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.5 2001/04/10 18:42:58 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/Imakefile,v 1.9 2001/12/16 19:45:01 alanh 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 @@ -19,6 +19,7 @@ MTRR_DEFINES = -DHAS_MTRR_SUPPORT xf86drmRandom.c \ xf86drmSL.c \ xf86drmI810.c \ + xf86drmI830.c \ xf86drmMga.c \ xf86drmR128.c \ xf86drmRadeon.c \ @@ -30,6 +31,7 @@ MTRR_DEFINES = -DHAS_MTRR_SUPPORT xf86drmRandom.o \ xf86drmSL.o \ xf86drmI810.o \ + xf86drmI830.o \ xf86drmMga.o \ xf86drmR128.o \ xf86drmRadeon.o \ @@ -61,6 +63,7 @@ LinkSourceFile(drmmodule.c,$(XF86OSSRC)/linux/drm) LinkSourceFile(xf86drm.c,$(XF86OSSRC)/linux/drm) LinkSourceFile(xf86drmHash.c,$(XF86OSSRC)/linux/drm) LinkSourceFile(xf86drmI810.c,$(XF86OSSRC)/linux/drm) +LinkSourceFile(xf86drmI830.c,$(XF86OSSRC)/linux/drm) LinkSourceFile(xf86drmMga.c,$(XF86OSSRC)/linux/drm) LinkSourceFile(xf86drmR128.c,$(XF86OSSRC)/linux/drm) LinkSourceFile(xf86drmRandom.c,$(XF86OSSRC)/linux/drm) 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 0e11ec504..d18f18732 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,28 +1,4 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile,v 1.6 2001/04/18 14:52:43 dawes Exp $ - -#include <Server.tmpl> - -#if 0 -LinkSourceFile(xf86drm.c,..) -LinkSourceFile(xf86drmHash.c,..) -LinkSourceFile(xf86drmRandom.c,..) -LinkSourceFile(xf86drmSL.c,..) -LinkSourceFile(xf86drm.h,$(XF86OSSRC)) -LinkSourceFile(xf86_OSproc.h,$(XF86OSSRC)) -LinkSourceFile(sigio.c,$(XF86OSSRC)/shared) -#endif - -XCOMM Try to use the Linux version of the DRM headers. This avoids skew -XCOMM and missing headers. If there's a need to break them out, they -XCOMM can be re-added later. If not, they can be moved to somewhere more -XCOMM OS-independent and referenced from there. -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(radeon_drm.h,$(XF86OSSRC)/linux/drm/kernel) -LinkSourceFile(sis_drm.h,$(XF86OSSRC)/linux/drm/kernel) - +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile,v 1.8 2001/12/13 00:24:45 alanh Exp $ XCOMM This is a kludge until we determine how best to build the XCOMM kernel-specific device driver. This allows us to continue @@ -37,7 +13,7 @@ install:: $(MAKE) -f Makefile.bsd install #else all:: - @echo 'Use "make -f Makefile.bsd" to manually build drm.o' + @echo 'Use "make -f Makefile.bsd" to manually build the modules' #endif clean:: diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Makefile.bsd b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Makefile.bsd index 61cba175f..9c87d963d 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Makefile.bsd +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Makefile.bsd @@ -1,5 +1,6 @@ # $FreeBSD$ -SUBDIR = drm tdfx mga gamma +# i810, i830 & sis are not complete +SUBDIR = tdfx mga r128 radeon gamma # i810 sis i830 .include <bsd.subdir.mk> diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm.h b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm.h new file mode 100644 index 000000000..688769409 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm.h @@ -0,0 +1,501 @@ +/* drm.h -- Header for Direct Rendering Manager -*- linux-c -*- + * Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com + * + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 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 + * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS 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: + * Rickard E. (Rik) Faith <faith@valinux.com> + * + * Acknowledgements: + * Dec 1999, Richard Henderson <rth@twiddle.net>, move to generic cmpxchg. + * + */ + +#ifndef _DRM_H_ +#define _DRM_H_ + +#include <sys/ioccom.h> +#define DRM_IOCTL_NR(n) ((n) & 0xff) + +#define XFREE86_VERSION(major,minor,patch,snap) \ + ((major << 16) | (minor << 8) | patch) + +#ifndef CONFIG_XFREE86_VERSION +#define CONFIG_XFREE86_VERSION XFREE86_VERSION(4,1,0,0) +#endif + +#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0) +#define DRM_PROC_DEVICES "/proc/devices" +#define DRM_PROC_MISC "/proc/misc" +#define DRM_PROC_DRM "/proc/drm" +#define DRM_DEV_DRM "/dev/drm" +#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) +#define DRM_DEV_UID 0 +#define DRM_DEV_GID 0 +#endif + +#if CONFIG_XFREE86_VERSION >= XFREE86_VERSION(4,1,0,0) +#define DRM_MAJOR 226 +#define DRM_MAX_MINOR 15 +#endif +#define DRM_NAME "drm" /* Name in kernel, /dev, and /proc */ +#define DRM_MIN_ORDER 5 /* At least 2^5 bytes = 32 bytes */ +#define DRM_MAX_ORDER 22 /* Up to 2^22 bytes = 4MB */ +#define DRM_RAM_PERCENT 50 /* How much system ram can we lock? */ + +#define _DRM_LOCK_HELD 0x80000000 /* Hardware lock is held */ +#define _DRM_LOCK_CONT 0x40000000 /* Hardware lock is contended */ +#define _DRM_LOCK_IS_HELD(lock) ((lock) & _DRM_LOCK_HELD) +#define _DRM_LOCK_IS_CONT(lock) ((lock) & _DRM_LOCK_CONT) +#define _DRM_LOCKING_CONTEXT(lock) ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT)) + +typedef unsigned long drm_handle_t; +typedef unsigned int drm_context_t; +typedef unsigned int drm_drawable_t; +typedef unsigned int drm_magic_t; + +/* Warning: If you change this structure, make sure you change + * XF86DRIClipRectRec in the server as well */ + +typedef struct drm_clip_rect { + unsigned short x1; + unsigned short y1; + unsigned short x2; + unsigned short y2; +} drm_clip_rect_t; + +typedef struct drm_tex_region { + unsigned char next; + unsigned char prev; + unsigned char in_use; + unsigned char padding; + unsigned int age; +} drm_tex_region_t; + +/* Seperate include files for the driver specific structures */ +#include "mga_drm.h" +#include "i810_drm.h" +#include "i830_drm.h" +#include "r128_drm.h" +#include "radeon_drm.h" +#include "sis_drm.h" + +typedef struct drm_version { + int version_major; /* Major version */ + int version_minor; /* Minor version */ + int version_patchlevel;/* Patch level */ + size_t name_len; /* Length of name buffer */ + char *name; /* Name of driver */ + size_t date_len; /* Length of date buffer */ + char *date; /* User-space buffer to hold date */ + size_t desc_len; /* Length of desc buffer */ + char *desc; /* User-space buffer to hold desc */ +} drm_version_t; + +typedef struct drm_unique { + size_t unique_len; /* Length of unique */ + char *unique; /* Unique name for driver instantiation */ +} drm_unique_t; + +typedef struct drm_list { + int count; /* Length of user-space structures */ + drm_version_t *version; +} drm_list_t; + +typedef struct drm_block { + int unused; +} drm_block_t; + +typedef struct drm_control { + enum { + DRM_ADD_COMMAND, + DRM_RM_COMMAND, + DRM_INST_HANDLER, + DRM_UNINST_HANDLER + } func; + int irq; +} drm_control_t; + +typedef enum drm_map_type { + _DRM_FRAME_BUFFER = 0, /* WC (no caching), no core dump */ + _DRM_REGISTERS = 1, /* no caching, no core dump */ + _DRM_SHM = 2, /* shared, cached */ + _DRM_AGP = 3, /* AGP/GART */ + _DRM_SCATTER_GATHER = 4 /* Scatter/gather memory for PCI DMA */ +} drm_map_type_t; + +typedef enum drm_map_flags { + _DRM_RESTRICTED = 0x01, /* Cannot be mapped to user-virtual */ + _DRM_READ_ONLY = 0x02, + _DRM_LOCKED = 0x04, /* shared, cached, locked */ + _DRM_KERNEL = 0x08, /* kernel requires access */ + _DRM_WRITE_COMBINING = 0x10, /* use write-combining if available */ + _DRM_CONTAINS_LOCK = 0x20, /* SHM page that contains lock */ + _DRM_REMOVABLE = 0x40 /* Removable mapping */ +} drm_map_flags_t; + +typedef struct drm_ctx_priv_map { + unsigned int ctx_id; /* Context requesting private mapping */ + void *handle; /* Handle of map */ +} drm_ctx_priv_map_t; + +typedef struct drm_map { + unsigned long offset; /* Requested physical address (0 for SAREA)*/ + unsigned long size; /* Requested physical size (bytes) */ + drm_map_type_t type; /* Type of memory to map */ + drm_map_flags_t flags; /* Flags */ + void *handle; /* User-space: "Handle" to pass to mmap */ + /* Kernel-space: kernel-virtual address */ + int mtrr; /* MTRR slot used */ + /* Private data */ +} drm_map_t; + +typedef struct drm_client { + int idx; /* Which client desired? */ + int auth; /* Is client authenticated? */ + unsigned long pid; /* Process id */ + unsigned long uid; /* User id */ + unsigned long magic; /* Magic */ + unsigned long iocs; /* Ioctl count */ +} drm_client_t; + +typedef enum { + _DRM_STAT_LOCK, + _DRM_STAT_OPENS, + _DRM_STAT_CLOSES, + _DRM_STAT_IOCTLS, + _DRM_STAT_LOCKS, + _DRM_STAT_UNLOCKS, + _DRM_STAT_VALUE, /* Generic value */ + _DRM_STAT_BYTE, /* Generic byte counter (1024bytes/K) */ + _DRM_STAT_COUNT, /* Generic non-byte counter (1000/k) */ + + _DRM_STAT_IRQ, /* IRQ */ + _DRM_STAT_PRIMARY, /* Primary DMA bytes */ + _DRM_STAT_SECONDARY, /* Secondary DMA bytes */ + _DRM_STAT_DMA, /* DMA */ + _DRM_STAT_SPECIAL, /* Special DMA (e.g., priority or polled) */ + _DRM_STAT_MISSED /* Missed DMA opportunity */ + + /* Add to the *END* of the list */ +} drm_stat_type_t; + +typedef struct drm_stats { + unsigned long count; + struct { + unsigned long value; + drm_stat_type_t type; + } data[15]; +} drm_stats_t; + +typedef enum drm_lock_flags { + _DRM_LOCK_READY = 0x01, /* Wait until hardware is ready for DMA */ + _DRM_LOCK_QUIESCENT = 0x02, /* Wait until hardware quiescent */ + _DRM_LOCK_FLUSH = 0x04, /* Flush this context's DMA queue first */ + _DRM_LOCK_FLUSH_ALL = 0x08, /* Flush all DMA queues first */ + /* These *HALT* flags aren't supported yet + -- they will be used to support the + full-screen DGA-like mode. */ + _DRM_HALT_ALL_QUEUES = 0x10, /* Halt all current and future queues */ + _DRM_HALT_CUR_QUEUES = 0x20 /* Halt all current queues */ +} drm_lock_flags_t; + +typedef struct drm_lock { + int context; + drm_lock_flags_t flags; +} drm_lock_t; + +typedef enum drm_dma_flags { /* These values *MUST* match xf86drm.h */ + /* Flags for DMA buffer dispatch */ + _DRM_DMA_BLOCK = 0x01, /* Block until buffer dispatched. + Note, the buffer may not yet have + been processed by the hardware -- + getting a hardware lock with the + hardware quiescent will ensure + that the buffer has been + processed. */ + _DRM_DMA_WHILE_LOCKED = 0x02, /* Dispatch while lock held */ + _DRM_DMA_PRIORITY = 0x04, /* High priority dispatch */ + + /* Flags for DMA buffer request */ + _DRM_DMA_WAIT = 0x10, /* Wait for free buffers */ + _DRM_DMA_SMALLER_OK = 0x20, /* Smaller-than-requested buffers ok */ + _DRM_DMA_LARGER_OK = 0x40 /* Larger-than-requested buffers ok */ +} drm_dma_flags_t; + +typedef struct drm_buf_desc { + int count; /* Number of buffers of this size */ + int size; /* Size in bytes */ + int low_mark; /* Low water mark */ + int high_mark; /* High water mark */ + enum { + _DRM_PAGE_ALIGN = 0x01, /* Align on page boundaries for DMA */ + _DRM_AGP_BUFFER = 0x02, /* Buffer is in agp space */ + _DRM_SG_BUFFER = 0x04 /* Scatter/gather memory buffer */ + } flags; + unsigned long agp_start; /* Start address of where the agp buffers + * are in the agp aperture */ +} drm_buf_desc_t; + +typedef struct drm_buf_info { + int count; /* Entries in list */ + drm_buf_desc_t *list; +} drm_buf_info_t; + +typedef struct drm_buf_free { + int count; + int *list; +} drm_buf_free_t; + +typedef struct drm_buf_pub { + int idx; /* Index into master buflist */ + int total; /* Buffer size */ + int used; /* Amount of buffer in use (for DMA) */ + void *address; /* Address of buffer */ +} drm_buf_pub_t; + +typedef struct drm_buf_map { + int count; /* Length of buflist */ + void *virtual; /* Mmaped area in user-virtual */ + drm_buf_pub_t *list; /* Buffer information */ +} drm_buf_map_t; + +typedef struct drm_dma { + /* Indices here refer to the offset into + buflist in drm_buf_get_t. */ + int context; /* Context handle */ + int send_count; /* Number of buffers to send */ + int *send_indices; /* List of handles to buffers */ + int *send_sizes; /* Lengths of data to send */ + drm_dma_flags_t flags; /* Flags */ + int request_count; /* Number of buffers requested */ + int request_size; /* Desired size for buffers */ + int *request_indices; /* Buffer information */ + int *request_sizes; + int granted_count; /* Number of buffers granted */ +} drm_dma_t; + +typedef enum { + _DRM_CONTEXT_PRESERVED = 0x01, + _DRM_CONTEXT_2DONLY = 0x02 +} drm_ctx_flags_t; + +typedef struct drm_ctx { + drm_context_t handle; + drm_ctx_flags_t flags; +} drm_ctx_t; + +typedef struct drm_ctx_res { + int count; + drm_ctx_t *contexts; +} drm_ctx_res_t; + +typedef struct drm_draw { + drm_drawable_t handle; +} drm_draw_t; + +typedef struct drm_auth { + drm_magic_t magic; +} drm_auth_t; + +typedef struct drm_irq_busid { + int irq; + int busnum; + int devnum; + int funcnum; +} drm_irq_busid_t; + +typedef struct drm_agp_mode { + unsigned long mode; +} drm_agp_mode_t; + + /* For drm_agp_alloc -- allocated a buffer */ +typedef struct drm_agp_buffer { + unsigned long size; /* In bytes -- will round to page boundary */ + unsigned long handle; /* Used for BIND/UNBIND ioctls */ + unsigned long type; /* Type of memory to allocate */ + unsigned long physical; /* Physical used by i810 */ +} drm_agp_buffer_t; + + /* For drm_agp_bind */ +typedef struct drm_agp_binding { + unsigned long handle; /* From drm_agp_buffer */ + unsigned long offset; /* In bytes -- will round to page boundary */ +} drm_agp_binding_t; + +typedef struct drm_agp_info { + int agp_version_major; + int agp_version_minor; + unsigned long mode; + unsigned long aperture_base; /* physical address */ + unsigned long aperture_size; /* bytes */ + unsigned long memory_allowed; /* bytes */ + unsigned long memory_used; + + /* PCI information */ + unsigned short id_vendor; + unsigned short id_device; +} drm_agp_info_t; + +typedef struct drm_scatter_gather { + unsigned long size; /* In bytes -- will round to page boundary */ + unsigned long handle; /* Used for mapping / unmapping */ +} drm_scatter_gather_t; + +#define DRM_IOCTL_BASE 'd' +#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr) +#define DRM_IOR(nr,size) _IOR(DRM_IOCTL_BASE,nr,size) +#define DRM_IOW(nr,size) _IOW(DRM_IOCTL_BASE,nr,size) +#define DRM_IOWR(nr,size) _IOWR(DRM_IOCTL_BASE,nr,size) + + +#define DRM_IOCTL_VERSION DRM_IOWR(0x00, drm_version_t) +#define DRM_IOCTL_GET_UNIQUE DRM_IOWR(0x01, drm_unique_t) +#define DRM_IOCTL_GET_MAGIC DRM_IOR( 0x02, drm_auth_t) +#define DRM_IOCTL_IRQ_BUSID DRM_IOWR(0x03, drm_irq_busid_t) +#define DRM_IOCTL_GET_MAP DRM_IOWR(0x04, drm_map_t) +#define DRM_IOCTL_GET_CLIENT DRM_IOWR(0x05, drm_client_t) +#define DRM_IOCTL_GET_STATS DRM_IOR( 0x06, drm_stats_t) + +#define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, drm_unique_t) +#define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, drm_auth_t) +#define DRM_IOCTL_BLOCK DRM_IOWR(0x12, drm_block_t) +#define DRM_IOCTL_UNBLOCK DRM_IOWR(0x13, drm_block_t) +#define DRM_IOCTL_CONTROL DRM_IOW( 0x14, drm_control_t) +#define DRM_IOCTL_ADD_MAP DRM_IOWR(0x15, drm_map_t) +#define DRM_IOCTL_ADD_BUFS DRM_IOWR(0x16, drm_buf_desc_t) +#define DRM_IOCTL_MARK_BUFS DRM_IOW( 0x17, drm_buf_desc_t) +#define DRM_IOCTL_INFO_BUFS DRM_IOWR(0x18, drm_buf_info_t) +#define DRM_IOCTL_MAP_BUFS DRM_IOWR(0x19, drm_buf_map_t) +#define DRM_IOCTL_FREE_BUFS DRM_IOW( 0x1a, drm_buf_free_t) + +#define DRM_IOCTL_RM_MAP DRM_IOW( 0x1b, drm_map_t) + +#define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, drm_ctx_priv_map_t) +#define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, drm_ctx_priv_map_t) + +#define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, drm_ctx_t) +#define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, drm_ctx_t) +#define DRM_IOCTL_MOD_CTX DRM_IOW( 0x22, drm_ctx_t) +#define DRM_IOCTL_GET_CTX DRM_IOWR(0x23, drm_ctx_t) +#define DRM_IOCTL_SWITCH_CTX DRM_IOW( 0x24, drm_ctx_t) +#define DRM_IOCTL_NEW_CTX DRM_IOW( 0x25, drm_ctx_t) +#define DRM_IOCTL_RES_CTX DRM_IOWR(0x26, drm_ctx_res_t) +#define DRM_IOCTL_ADD_DRAW DRM_IOWR(0x27, drm_draw_t) +#define DRM_IOCTL_RM_DRAW DRM_IOWR(0x28, drm_draw_t) +#define DRM_IOCTL_DMA DRM_IOWR(0x29, drm_dma_t) +#define DRM_IOCTL_LOCK DRM_IOW( 0x2a, drm_lock_t) +#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, drm_lock_t) +#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, drm_lock_t) + +#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30) +#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31) +#define DRM_IOCTL_AGP_ENABLE DRM_IOW( 0x32, drm_agp_mode_t) +#define DRM_IOCTL_AGP_INFO DRM_IOR( 0x33, drm_agp_info_t) +#define DRM_IOCTL_AGP_ALLOC DRM_IOWR(0x34, drm_agp_buffer_t) +#define DRM_IOCTL_AGP_FREE DRM_IOW( 0x35, drm_agp_buffer_t) +#define DRM_IOCTL_AGP_BIND DRM_IOW( 0x36, drm_agp_binding_t) +#define DRM_IOCTL_AGP_UNBIND DRM_IOW( 0x37, drm_agp_binding_t) + +#define DRM_IOCTL_SG_ALLOC DRM_IOW( 0x38, drm_scatter_gather_t) +#define DRM_IOCTL_SG_FREE DRM_IOW( 0x39, drm_scatter_gather_t) + +/* MGA specific ioctls */ +#define DRM_IOCTL_MGA_INIT DRM_IOW( 0x40, drm_mga_init_t) +#define DRM_IOCTL_MGA_FLUSH DRM_IOW( 0x41, drm_lock_t) +#define DRM_IOCTL_MGA_RESET DRM_IO( 0x42) +#define DRM_IOCTL_MGA_SWAP DRM_IO( 0x43) +#define DRM_IOCTL_MGA_CLEAR DRM_IOW( 0x44, drm_mga_clear_t) +#define DRM_IOCTL_MGA_VERTEX DRM_IOW( 0x45, drm_mga_vertex_t) +#define DRM_IOCTL_MGA_INDICES DRM_IOW( 0x46, drm_mga_indices_t) +#define DRM_IOCTL_MGA_ILOAD DRM_IOW( 0x47, drm_mga_iload_t) +#define DRM_IOCTL_MGA_BLIT DRM_IOW( 0x48, drm_mga_blit_t) + +/* i810 specific ioctls */ +#define DRM_IOCTL_I810_INIT DRM_IOW( 0x40, drm_i810_init_t) +#define DRM_IOCTL_I810_VERTEX DRM_IOW( 0x41, drm_i810_vertex_t) +#define DRM_IOCTL_I810_CLEAR DRM_IOW( 0x42, drm_i810_clear_t) +#define DRM_IOCTL_I810_FLUSH DRM_IO( 0x43) +#define DRM_IOCTL_I810_GETAGE DRM_IO( 0x44) +#define DRM_IOCTL_I810_GETBUF DRM_IOWR(0x45, drm_i810_dma_t) +#define DRM_IOCTL_I810_SWAP DRM_IO( 0x46) +#define DRM_IOCTL_I810_COPY DRM_IOW( 0x47, drm_i810_copy_t) +#define DRM_IOCTL_I810_DOCOPY DRM_IO( 0x48) + +/* Rage 128 specific ioctls */ +#define DRM_IOCTL_R128_INIT DRM_IOW( 0x40, drm_r128_init_t) +#define DRM_IOCTL_R128_CCE_START DRM_IO( 0x41) +#define DRM_IOCTL_R128_CCE_STOP DRM_IOW( 0x42, drm_r128_cce_stop_t) +#define DRM_IOCTL_R128_CCE_RESET DRM_IO( 0x43) +#define DRM_IOCTL_R128_CCE_IDLE DRM_IO( 0x44) +#define DRM_IOCTL_R128_RESET DRM_IO( 0x46) +#define DRM_IOCTL_R128_SWAP DRM_IO( 0x47) +#define DRM_IOCTL_R128_CLEAR DRM_IOW( 0x48, drm_r128_clear_t) +#define DRM_IOCTL_R128_VERTEX DRM_IOW( 0x49, drm_r128_vertex_t) +#define DRM_IOCTL_R128_INDICES DRM_IOW( 0x4a, drm_r128_indices_t) +#define DRM_IOCTL_R128_BLIT DRM_IOW( 0x4b, drm_r128_blit_t) +#define DRM_IOCTL_R128_DEPTH DRM_IOW( 0x4c, drm_r128_depth_t) +#define DRM_IOCTL_R128_STIPPLE DRM_IOW( 0x4d, drm_r128_stipple_t) +#define DRM_IOCTL_R128_INDIRECT DRM_IOWR(0x4f, drm_r128_indirect_t) +#define DRM_IOCTL_R128_FULLSCREEN DRM_IOW( 0x50, drm_r128_fullscreen_t) + +/* Radeon specific ioctls */ +#define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( 0x40, drm_radeon_init_t) +#define DRM_IOCTL_RADEON_CP_START DRM_IO( 0x41) +#define DRM_IOCTL_RADEON_CP_STOP DRM_IOW( 0x42, drm_radeon_cp_stop_t) +#define DRM_IOCTL_RADEON_CP_RESET DRM_IO( 0x43) +#define DRM_IOCTL_RADEON_CP_IDLE DRM_IO( 0x44) +#define DRM_IOCTL_RADEON_RESET DRM_IO( 0x45) +#define DRM_IOCTL_RADEON_FULLSCREEN DRM_IOW( 0x46, drm_radeon_fullscreen_t) +#define DRM_IOCTL_RADEON_SWAP DRM_IO( 0x47) +#define DRM_IOCTL_RADEON_CLEAR DRM_IOW( 0x48, drm_radeon_clear_t) +#define DRM_IOCTL_RADEON_VERTEX DRM_IOW( 0x49, drm_radeon_vertex_t) +#define DRM_IOCTL_RADEON_INDICES DRM_IOW( 0x4a, drm_radeon_indices_t) +#define DRM_IOCTL_RADEON_STIPPLE DRM_IOW( 0x4c, drm_radeon_stipple_t) +#define DRM_IOCTL_RADEON_INDIRECT DRM_IOWR(0x4d, drm_radeon_indirect_t) +#define DRM_IOCTL_RADEON_TEXTURE DRM_IOWR(0x4e, drm_radeon_texture_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) + +/* I830 specific ioctls */ +#define DRM_IOCTL_I830_INIT DRM_IOW( 0x40, drm_i830_init_t) +#define DRM_IOCTL_I830_VERTEX DRM_IOW( 0x41, drm_i830_vertex_t) +#define DRM_IOCTL_I830_CLEAR DRM_IOW( 0x42, drm_i830_clear_t) +#define DRM_IOCTL_I830_FLUSH DRM_IO ( 0x43) +#define DRM_IOCTL_I830_GETAGE DRM_IO ( 0x44) +#define DRM_IOCTL_I830_GETBUF DRM_IOWR(0x45, drm_i830_dma_t) +#define DRM_IOCTL_I830_SWAP DRM_IO ( 0x46) +#define DRM_IOCTL_I830_COPY DRM_IOW( 0x47, drm_i830_copy_t) +#define DRM_IOCTL_I830_DOCOPY DRM_IO ( 0x48) + +#endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/Makefile b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/Makefile deleted file mode 100644 index d9c4a3715..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# $FreeBSD$ - -KMOD = drm -SRCS = init.c memory.c auth.c context.c drawable.c bufs.c \ - lists.c lock.c ioctl.c fops.c vm.c dma.c sysctl.c \ - agpsupport.c ctxbitmap.c -SRCS += device_if.h bus_if.h pci_if.h -CFLAGS += ${DEBUG_FLAGS} -I.. - -@: - ln -sf /sys @ - -machine: - ln -sf /sys/i386/include machine - -.include <bsd.kmod.mk> diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/auth.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/auth.c deleted file mode 100644 index 37d17be54..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/auth.c +++ /dev/null @@ -1,168 +0,0 @@ -/* auth.c -- IOCTLs for authentication -*- c -*- - * Created: Tue Feb 2 08:37:54 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" - -static int drm_hash_magic(drm_magic_t magic) -{ - return magic & (DRM_HASH_SIZE-1); -} - -static drm_file_t *drm_find_file(drm_device_t *dev, drm_magic_t magic) -{ - drm_file_t *retval = NULL; - drm_magic_entry_t *pt; - int hash = drm_hash_magic(magic); - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - for (pt = dev->magiclist[hash].head; pt; pt = pt->next) { - if (pt->priv->authenticated) continue; - if (pt->magic == magic) { - retval = pt->priv; - break; - } - } - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - return retval; -} - -int drm_add_magic(drm_device_t *dev, drm_file_t *priv, drm_magic_t magic) -{ - int hash; - drm_magic_entry_t *entry; - - DRM_DEBUG("%d\n", magic); - - hash = drm_hash_magic(magic); - entry = drm_alloc(sizeof(*entry), DRM_MEM_MAGIC); - if (!entry) return ENOMEM; - entry->magic = magic; - entry->priv = priv; - entry->next = NULL; - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - if (dev->magiclist[hash].tail) { - dev->magiclist[hash].tail->next = entry; - dev->magiclist[hash].tail = entry; - } else { - dev->magiclist[hash].head = entry; - dev->magiclist[hash].tail = entry; - } - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - return 0; -} - -int drm_remove_magic(drm_device_t *dev, drm_magic_t magic) -{ - drm_magic_entry_t *prev = NULL; - drm_magic_entry_t *pt; - int hash; - - DRM_DEBUG("%d\n", magic); - hash = drm_hash_magic(magic); - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - for (pt = dev->magiclist[hash].head; pt; prev = pt, pt = pt->next) { - if (pt->magic == magic) { - if (dev->magiclist[hash].head == pt) { - dev->magiclist[hash].head = pt->next; - } - if (dev->magiclist[hash].tail == pt) { - dev->magiclist[hash].tail = prev; - } - if (prev) { - prev->next = pt->next; - } - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - return 0; - } - } - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC); - - return EINVAL; -} - -int drm_getmagic(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - static drm_magic_t sequence = 0; -#if 0 - static struct simplelock lock; /* XXX */ -#endif - drm_device_t *dev = kdev->si_drv1; - drm_file_t *priv; - drm_auth_t auth; - - /* Find unique magic */ - priv = drm_find_file_by_proc(dev, p); - if (!priv) { - DRM_DEBUG("can't find file structure\n"); - return EINVAL; - } - if (priv->magic) { - auth.magic = priv->magic; - } else { - do { - simple_lock(&lock); - if (!sequence) ++sequence; /* reserve 0 */ - auth.magic = sequence++; - simple_unlock(&lock); - } while (drm_find_file(dev, auth.magic)); - priv->magic = auth.magic; - drm_add_magic(dev, priv, auth.magic); - } - - DRM_DEBUG("%u\n", auth.magic); - *(drm_auth_t *) data = auth; - return 0; -} - -int drm_authmagic(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_auth_t auth; - drm_file_t *file; - - auth = *(drm_auth_t *) data; - DRM_DEBUG("%u\n", auth.magic); - if ((file = drm_find_file(dev, auth.magic))) { - file->authenticated = 1; - drm_remove_magic(dev, auth.magic); - return 0; - } - return EINVAL; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/bufs.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/bufs.c deleted file mode 100644 index f283bab21..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/bufs.c +++ /dev/null @@ -1,500 +0,0 @@ -/* bufs.c -- IOCTLs to manage buffers -*- c -*- - * Created: Tue Feb 2 08:37:54 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" -#include <sys/mman.h> -#include <vm/vm.h> -#include <vm/pmap.h> -#include <vm/vm_extern.h> -#include <vm/vm_map.h> - - /* Compute order. Can be made faster. */ -int drm_order(unsigned long size) -{ - int order; - unsigned long tmp; - - for (order = 0, tmp = size; tmp >>= 1; ++order); - if (size & ~(1 << order)) ++order; - return order; -} - -int drm_addmap(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_map_t *map; - - if (!(dev->flags & (FREAD|FWRITE))) - return EACCES; /* Require read/write */ - - map = drm_alloc(sizeof(*map), DRM_MEM_MAPS); - if (!map) return ENOMEM; - *map = *(drm_map_t *) data; - - DRM_DEBUG("offset = 0x%08lx, size = 0x%08lx, type = %d\n", - map->offset, map->size, map->type); - if ((map->offset & (PAGE_SIZE-1)) || (map->size & (PAGE_SIZE-1))) { - drm_free(map, sizeof(*map), DRM_MEM_MAPS); - DRM_DEBUG("offset or size not page aligned\n"); - return EINVAL; - } - map->mtrr = -1; - map->handle = 0; - - switch (map->type) { - case _DRM_REGISTERS: - case _DRM_FRAME_BUFFER: - if (map->offset + map->size < map->offset - /* || map->offset < virt_to_phys(high_memory) */) { - drm_free(map, sizeof(*map), DRM_MEM_MAPS); - DRM_DEBUG("bad frame buffer size\n"); - return EINVAL; - } -#ifdef CONFIG_MTRR - if (map->type == _DRM_FRAME_BUFFER - || (map->flags & _DRM_WRITE_COMBINING)) { - map->mtrr = mtrr_add(map->offset, map->size, - MTRR_TYPE_WRCOMB, 1); - } -#endif - map->handle = drm_ioremap(map->offset, map->size); - break; - - - case _DRM_SHM: - DRM_DEBUG("%ld %d\n", map->size, drm_order(map->size)); - map->handle = (void *)drm_alloc_pages(drm_order(map->size) - - PAGE_SHIFT, - DRM_MEM_SAREA); - if (!map->handle) { - drm_free(map, sizeof(*map), DRM_MEM_MAPS); - return ENOMEM; - } - map->offset = (unsigned long)map->handle; - if (map->flags & _DRM_CONTAINS_LOCK) { - dev->lock.hw_lock = map->handle; /* Pointer to lock */ - } - break; -#ifdef DRM_AGP - case _DRM_AGP: - map->offset = map->offset + dev->agp->base; - break; -#endif - default: - drm_free(map, sizeof(*map), DRM_MEM_MAPS); - DRM_DEBUG("bad type\n"); - return EINVAL; - } - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - if (dev->maplist) { - ++dev->map_count; - dev->maplist = drm_realloc(dev->maplist, - (dev->map_count-1) - * sizeof(*dev->maplist), - dev->map_count - * sizeof(*dev->maplist), - DRM_MEM_MAPS); - } else { - dev->map_count = 1; - dev->maplist = drm_alloc(dev->map_count*sizeof(*dev->maplist), - DRM_MEM_MAPS); - } - dev->maplist[dev->map_count-1] = map; - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - *(drm_map_t *) data = *map; - if (map->type != _DRM_SHM) - ((drm_map_t *)data)->handle = (void *) map->offset; - - return 0; -} - -int drm_addbufs(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - drm_buf_desc_t request; - int count; - int order; - int size; - int total; - int page_order; - drm_buf_entry_t *entry; - unsigned long page; - drm_buf_t *buf; - int alignment; - unsigned long offset; - int i; - int byte_count; - int page_count; - - if (!dma) return EINVAL; - - request = *(drm_buf_desc_t *) data; - - count = request.count; - order = drm_order(request.size); - size = 1 << order; - - DRM_DEBUG("count = %d, size = %d (%d), order = %d, queue_count = %d\n", - request.count, request.size, size, order, dev->queue_count); - - if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) return EINVAL; - if (dev->queue_count) return EBUSY; /* Not while in use */ - - alignment = (request.flags & _DRM_PAGE_ALIGN) ? round_page(size) :size; - page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0; - total = PAGE_SIZE << page_order; - - simple_lock(&dev->count_lock); - if (dev->buf_use) { - simple_unlock(&dev->count_lock); - return EBUSY; - } - atomic_inc(&dev->buf_alloc); - simple_unlock(&dev->count_lock); - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - entry = &dma->bufs[order]; - if (entry->buf_count) { - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - atomic_dec(&dev->buf_alloc); - return ENOMEM; /* May only call once for each order */ - } - - entry->buflist = drm_alloc(count * sizeof(*entry->buflist), - DRM_MEM_BUFS); - if (!entry->buflist) { - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - atomic_dec(&dev->buf_alloc); - return ENOMEM; - } - memset(entry->buflist, 0, count * sizeof(*entry->buflist)); - - entry->seglist = drm_alloc(count * sizeof(*entry->seglist), - DRM_MEM_SEGS); - if (!entry->seglist) { - drm_free(entry->buflist, - count * sizeof(*entry->buflist), - DRM_MEM_BUFS); - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - atomic_dec(&dev->buf_alloc); - return ENOMEM; - } - memset(entry->seglist, 0, count * sizeof(*entry->seglist)); - - dma->pagelist = drm_realloc(dma->pagelist, - dma->page_count * sizeof(*dma->pagelist), - (dma->page_count + (count << page_order)) - * sizeof(*dma->pagelist), - DRM_MEM_PAGES); - DRM_DEBUG("pagelist: %d entries\n", - dma->page_count + (count << page_order)); - - - entry->buf_size = size; - entry->page_order = page_order; - byte_count = 0; - page_count = 0; - while (entry->buf_count < count) { - if (!(page = drm_alloc_pages(page_order, DRM_MEM_DMA))) break; - entry->seglist[entry->seg_count++] = page; - for (i = 0; i < (1 << page_order); i++) { - DRM_DEBUG("page %d @ 0x%08lx\n", - dma->page_count + page_count, - page + PAGE_SIZE * i); - dma->pagelist[dma->page_count + page_count++] - = page + PAGE_SIZE * i; - } - for (offset = 0; - offset + size <= total && entry->buf_count < count; - offset += alignment, ++entry->buf_count) { - buf = &entry->buflist[entry->buf_count]; - buf->idx = dma->buf_count + entry->buf_count; - buf->total = alignment; - buf->order = order; - buf->used = 0; - buf->offset = (dma->byte_count + byte_count + offset); - buf->address = (void *)(page + offset); - buf->next = NULL; - buf->waiting = 0; - buf->pending = 0; - buf->dma_wait = 0; - buf->pid = 0; -#if DRM_DMA_HISTOGRAM - timespecclear(&buf->time_queued); - timespecclear(&buf->time_dispatched); - timespecclear(&buf->time_completed); - timespecclear(&buf->time_freed); -#endif - DRM_DEBUG("buffer %d @ %p\n", - entry->buf_count, buf->address); - } - byte_count += PAGE_SIZE << page_order; - } - - dma->buflist = drm_realloc(dma->buflist, - dma->buf_count * sizeof(*dma->buflist), - (dma->buf_count + entry->buf_count) - * sizeof(*dma->buflist), - DRM_MEM_BUFS); - for (i = dma->buf_count; i < dma->buf_count + entry->buf_count; i++) - dma->buflist[i] = &entry->buflist[i - dma->buf_count]; - - dma->buf_count += entry->buf_count; - dma->seg_count += entry->seg_count; - dma->page_count += entry->seg_count << page_order; - dma->byte_count += PAGE_SIZE * (entry->seg_count << page_order); - - drm_freelist_create(&entry->freelist, entry->buf_count); - for (i = 0; i < entry->buf_count; i++) { - drm_freelist_put(dev, &entry->freelist, &entry->buflist[i]); - } - - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - request.count = entry->buf_count; - request.size = size; - - *(drm_buf_desc_t *) data = request; - - atomic_dec(&dev->buf_alloc); - return 0; -} - -int drm_infobufs(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - drm_buf_info_t request; - int i; - int count; - - if (!dma) return EINVAL; - - simple_lock(&dev->count_lock); - if (atomic_read(&dev->buf_alloc)) { - simple_unlock(&dev->count_lock); - return EBUSY; - } - ++dev->buf_use; /* Can't allocate more after this call */ - simple_unlock(&dev->count_lock); - - request = *(drm_buf_info_t *) data; - - for (i = 0, count = 0; i < DRM_MAX_ORDER+1; i++) { - if (dma->bufs[i].buf_count) ++count; - } - - DRM_DEBUG("count = %d\n", count); - - if (request.count >= count) { - for (i = 0, count = 0; i < DRM_MAX_ORDER+1; i++) { - if (dma->bufs[i].buf_count) { - int error; - error = copyout(&dma->bufs[i].buf_count, - &request.list[count].count, - sizeof(dma->bufs[0] - .buf_count)); - if (error) return error; - error = copyout(&dma->bufs[i].buf_size, - &request.list[count].size, - sizeof(dma->bufs[0].buf_size)); - if (error) return error; - error = copyout(&dma->bufs[i] - .freelist.low_mark, - &request.list[count].low_mark, - sizeof(dma->bufs[0] - .freelist.low_mark)); - if (error) return error; - error = copyout(&dma->bufs[i] - .freelist.high_mark, - &request.list[count].high_mark, - sizeof(dma->bufs[0] - .freelist.high_mark)); - if (error) return error; - DRM_DEBUG("%d %d %d %d %d\n", - i, - dma->bufs[i].buf_count, - dma->bufs[i].buf_size, - dma->bufs[i].freelist.low_mark, - dma->bufs[i].freelist.high_mark); - ++count; - } - } - } - request.count = count; - - *(drm_buf_info_t *) data = request; - - return 0; -} - -int drm_markbufs(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - drm_buf_desc_t request; - int order; - drm_buf_entry_t *entry; - - if (!dma) return EINVAL; - - request = *(drm_buf_desc_t *) data; - - DRM_DEBUG("%d, %d, %d\n", - request.size, request.low_mark, request.high_mark); - order = drm_order(request.size); - if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) return EINVAL; - entry = &dma->bufs[order]; - - if (request.low_mark < 0 || request.low_mark > entry->buf_count) - return EINVAL; - if (request.high_mark < 0 || request.high_mark > entry->buf_count) - return EINVAL; - - entry->freelist.low_mark = request.low_mark; - entry->freelist.high_mark = request.high_mark; - - return 0; -} - -int drm_freebufs(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - drm_buf_free_t request; - int i; - int idx; - int error; - drm_buf_t *buf; - - if (!dma) return EINVAL; - - request = *(drm_buf_free_t *) data; - - DRM_DEBUG("%d\n", request.count); - for (i = 0; i < request.count; i++) { - error = copyin(&request.list[i], &idx, sizeof(idx)); - if (error) - return error; - if (idx < 0 || idx >= dma->buf_count) { - DRM_ERROR("Index %d (of %d max)\n", - idx, dma->buf_count - 1); - return EINVAL; - } - buf = dma->buflist[idx]; - if (buf->pid != p->p_pid) { - DRM_ERROR("Process %d freeing buffer owned by %d\n", - p->p_pid, buf->pid); - return EINVAL; - } - drm_free_buffer(dev, buf); - } - - return 0; -} - -int drm_mapbufs(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - int retcode = 0; - const int zero = 0; - vm_offset_t virtual; - vm_offset_t address; - drm_buf_map_t request; - int i; - - if (!dma) return EINVAL; - - DRM_DEBUG("\n"); - - simple_lock(&dev->count_lock); - if (atomic_read(&dev->buf_alloc)) { - simple_unlock(&dev->count_lock); - return EBUSY; - } - ++dev->buf_use; /* Can't allocate more after this call */ - simple_unlock(&dev->count_lock); - - request = *(drm_buf_map_t *) data; - - if (request.count >= dma->buf_count) { - virtual = 0; - retcode = vm_mmap(&p->p_vmspace->vm_map, - &virtual, - round_page(dma->byte_count), - PROT_READ|PROT_WRITE, VM_PROT_ALL, - MAP_SHARED, - SLIST_FIRST(&kdev->si_hlist), - 0); - if (retcode) - goto done; - - request.virtual = (void *)virtual; - - for (i = 0; i < dma->buf_count; i++) { - retcode = copyout(&dma->buflist[i]->idx, - &request.list[i].idx, - sizeof(request.list[0].idx)); - if (retcode) goto done; - retcode = copyout(&dma->buflist[i]->total, - &request.list[i].total, - sizeof(request.list[0].total)); - if (retcode) goto done; - retcode = copyout(&zero, - &request.list[i].used, - sizeof(request.list[0].used)); - if (retcode) goto done; - address = virtual + dma->buflist[i]->offset; - retcode = copyout(&address, - &request.list[i].address, - sizeof(address)); - if (retcode) goto done; - } - } -done: - request.count = dma->buf_count; - DRM_DEBUG("%d buffers, retcode = %d\n", request.count, retcode); - - *(drm_buf_map_t *) data = request; - - return retcode; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/context.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/context.c deleted file mode 100644 index 70510f006..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/context.c +++ /dev/null @@ -1,297 +0,0 @@ -/* context.c -- IOCTLs for contexts and DMA queues -*- c -*- - * Created: Tue Feb 2 08:37:54 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" - -static int drm_init_queue(drm_device_t *dev, drm_queue_t *q, drm_ctx_t *ctx) -{ - DRM_DEBUG("\n"); - - if (atomic_read(&q->use_count) != 1 - || atomic_read(&q->finalization) - || atomic_read(&q->block_count)) { - DRM_ERROR("New queue is already in use: u%d f%d b%d\n", - atomic_read(&q->use_count), - atomic_read(&q->finalization), - atomic_read(&q->block_count)); - } - - atomic_set(&q->finalization, 0); - atomic_set(&q->block_count, 0); - atomic_set(&q->block_read, 0); - atomic_set(&q->block_write, 0); - atomic_set(&q->total_queued, 0); - atomic_set(&q->total_flushed, 0); - atomic_set(&q->total_locks, 0); - - q->write_queue = 0; - q->read_queue = 0; - q->flush_queue = 0; - - q->flags = ctx->flags; - - drm_waitlist_create(&q->waitlist, dev->dma->buf_count); - - return 0; -} - - -/* drm_alloc_queue: -PRE: 1) dev->queuelist[0..dev->queue_count] is allocated and will not - disappear (so all deallocation must be done after IOCTLs are off) - 2) dev->queue_count < dev->queue_slots - 3) dev->queuelist[i].use_count == 0 and - dev->queuelist[i].finalization == 0 if i not in use -POST: 1) dev->queuelist[i].use_count == 1 - 2) dev->queue_count < dev->queue_slots */ - -static int drm_alloc_queue(drm_device_t *dev) -{ - int i; - drm_queue_t *queue; - int oldslots; - int newslots; - /* Check for a free queue */ - for (i = 0; i < dev->queue_count; i++) { - atomic_inc(&dev->queuelist[i]->use_count); - if (atomic_read(&dev->queuelist[i]->use_count) == 1 - && !atomic_read(&dev->queuelist[i]->finalization)) { - DRM_DEBUG("%d (free)\n", i); - return i; - } - atomic_dec(&dev->queuelist[i]->use_count); - } - /* Allocate a new queue */ - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - - queue = drm_alloc(sizeof(*queue), DRM_MEM_QUEUES); - memset(queue, 0, sizeof(*queue)); - atomic_set(&queue->use_count, 1); - - ++dev->queue_count; - if (dev->queue_count >= dev->queue_slots) { - oldslots = dev->queue_slots * sizeof(*dev->queuelist); - if (!dev->queue_slots) dev->queue_slots = 1; - dev->queue_slots *= 2; - newslots = dev->queue_slots * sizeof(*dev->queuelist); - - dev->queuelist = drm_realloc(dev->queuelist, - oldslots, - newslots, - DRM_MEM_QUEUES); - if (!dev->queuelist) { - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - DRM_DEBUG("out of memory\n"); - return -ENOMEM; - } - } - dev->queuelist[dev->queue_count-1] = queue; - - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - DRM_DEBUG("%d (new)\n", dev->queue_count - 1); - return dev->queue_count - 1; -} - -int drm_resctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_ctx_res_t res; - drm_ctx_t ctx; - int i; - int error; - - DRM_DEBUG("%d\n", DRM_RESERVED_CONTEXTS); - res = *(drm_ctx_res_t *) data; - if (res.count >= DRM_RESERVED_CONTEXTS) { - memset(&ctx, 0, sizeof(ctx)); - for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) { - ctx.handle = i; - error = copyout(&i, &res.contexts[i], - sizeof(i)); - if (error) return error; - } - } - res.count = DRM_RESERVED_CONTEXTS; - *(drm_ctx_res_t *) data = res; - return 0; -} - - -int drm_addctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - if ((ctx.handle = drm_alloc_queue(dev)) == DRM_KERNEL_CONTEXT) { - /* Init kernel's context and get a new one. */ - drm_init_queue(dev, dev->queuelist[ctx.handle], &ctx); - ctx.handle = drm_alloc_queue(dev); - } - drm_init_queue(dev, dev->queuelist[ctx.handle], &ctx); - DRM_DEBUG("%d\n", ctx.handle); - *(drm_ctx_t *) data = ctx; - return 0; -} - -int drm_modctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - drm_queue_t *q; - - ctx = *(drm_ctx_t *) data; - - DRM_DEBUG("%d\n", ctx.handle); - - if (ctx.handle < 0 || ctx.handle >= dev->queue_count) return -EINVAL; - q = dev->queuelist[ctx.handle]; - - atomic_inc(&q->use_count); - if (atomic_read(&q->use_count) == 1) { - /* No longer in use */ - atomic_dec(&q->use_count); - return -EINVAL; - } - - if (DRM_BUFCOUNT(&q->waitlist)) { - atomic_dec(&q->use_count); - return -EBUSY; - } - - q->flags = ctx.flags; - - atomic_dec(&q->use_count); - return 0; -} - -int drm_getctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - drm_queue_t *q; - - ctx = *(drm_ctx_t *) data; - - DRM_DEBUG("%d\n", ctx.handle); - - if (ctx.handle >= dev->queue_count) return -EINVAL; - q = dev->queuelist[ctx.handle]; - - atomic_inc(&q->use_count); - if (atomic_read(&q->use_count) == 1) { - /* No longer in use */ - atomic_dec(&q->use_count); - return -EINVAL; - } - - ctx.flags = q->flags; - atomic_dec(&q->use_count); - - *(drm_ctx_t *) data = ctx; - - return 0; -} - -int drm_switchctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - DRM_DEBUG("%d\n", ctx.handle); - return drm_context_switch(dev, dev->last_context, ctx.handle); -} - -int drm_newctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - DRM_DEBUG("%d\n", ctx.handle); - drm_context_switch_complete(dev, ctx.handle); - - return 0; -} - -int drm_rmctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - drm_queue_t *q; - drm_buf_t *buf; - - ctx = *(drm_ctx_t *) data; - DRM_DEBUG("%d\n", ctx.handle); - - if (ctx.handle >= dev->queue_count) return -EINVAL; - q = dev->queuelist[ctx.handle]; - - atomic_inc(&q->use_count); - if (atomic_read(&q->use_count) == 1) { - /* No longer in use */ - atomic_dec(&q->use_count); - return -EINVAL; - } - - atomic_inc(&q->finalization); /* Mark queue in finalization state */ - atomic_sub(2, &q->use_count); /* Mark queue as unused (pending - finalization) */ - - /* Wait while interrupt servicing is in progress */ - while (test_and_set_bit(0, &dev->interrupt_flag)) { - int never; - int error = tsleep(&never, PZERO|PCATCH, "drmrc", 1); - if (error) { - clear_bit(0, &dev->interrupt_flag); - return error; - } - } - /* Remove queued buffers */ - while ((buf = drm_waitlist_get(&q->waitlist))) { - drm_free_buffer(dev, buf); - } - clear_bit(0, &dev->interrupt_flag); - - /* Wakeup blocked processes */ - wakeup(&q->read_queue); - wakeup(&q->write_queue); - wakeup(&q->flush_queue); - - /* Finalization over. Queue is made - available when both use_count and - finalization become 0, which won't - happen until all the waiting processes - stop waiting. */ - atomic_dec(&q->finalization); - return 0; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/ctxbitmap.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/ctxbitmap.c deleted file mode 100644 index 851b75827..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/ctxbitmap.c +++ /dev/null @@ -1,85 +0,0 @@ -/* ctxbitmap.c -- Context bitmap management - * Created: Thu Jan 6 03:56:42 2000 by jhartmann@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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. - * - * Author: Jeff Hartmann <jhartmann@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" - -void drm_ctxbitmap_free(drm_device_t *dev, int ctx_handle) -{ - if (ctx_handle < 0) goto failed; - - if (ctx_handle < DRM_MAX_CTXBITMAP) { - clear_bit(ctx_handle, dev->ctx_bitmap); - return; - } -failed: - DRM_ERROR("Attempt to free invalid context handle: %d\n", - ctx_handle); - return; -} - -int drm_ctxbitmap_next(drm_device_t *dev) -{ - int bit; - - bit = find_first_zero_bit(dev->ctx_bitmap, DRM_MAX_CTXBITMAP); - if (bit < DRM_MAX_CTXBITMAP) { - set_bit(bit, dev->ctx_bitmap); - DRM_DEBUG("drm_ctxbitmap_next bit : %d\n", bit); - return bit; - } - return -1; -} - -int drm_ctxbitmap_init(drm_device_t *dev) -{ - int i; - int temp; - - dev->ctx_bitmap = (u_int32_t *) drm_alloc(PAGE_SIZE, - DRM_MEM_CTXBITMAP); - if(dev->ctx_bitmap == NULL) { - return -ENOMEM; - } - memset((void *) dev->ctx_bitmap, 0, PAGE_SIZE); - for(i = 0; i < DRM_RESERVED_CONTEXTS; i++) { - temp = drm_ctxbitmap_next(dev); - DRM_DEBUG("drm_ctxbitmap_init : %d\n", temp); - } - - return 0; -} - -void drm_ctxbitmap_cleanup(drm_device_t *dev) -{ - drm_free((void *)dev->ctx_bitmap, PAGE_SIZE, - DRM_MEM_CTXBITMAP); -} - diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/dma.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/dma.c deleted file mode 100644 index 93b0d0c78..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/dma.c +++ /dev/null @@ -1,543 +0,0 @@ -/* dma.c -- DMA IOCTL and function support -*- c -*- - * Created: Fri Mar 19 14:30:16 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinuxa.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" - -void drm_dma_setup(drm_device_t *dev) -{ - int i; - - dev->dma = drm_alloc(sizeof(*dev->dma), DRM_MEM_DRIVER); - memset(dev->dma, 0, sizeof(*dev->dma)); - for (i = 0; i <= DRM_MAX_ORDER; i++) - memset(&dev->dma->bufs[i], 0, sizeof(dev->dma->bufs[0])); -} - -void drm_dma_takedown(drm_device_t *dev) -{ - drm_device_dma_t *dma = dev->dma; - int i, j; - - if (!dma) return; - - /* Clear dma buffers */ - for (i = 0; i <= DRM_MAX_ORDER; i++) { - if (dma->bufs[i].seg_count) { - DRM_DEBUG("order %d: buf_count = %d," - " seg_count = %d\n", - i, - dma->bufs[i].buf_count, - dma->bufs[i].seg_count); - for (j = 0; j < dma->bufs[i].seg_count; j++) { - drm_free_pages(dma->bufs[i].seglist[j], - dma->bufs[i].page_order, - DRM_MEM_DMA); - } - drm_free(dma->bufs[i].seglist, - dma->bufs[i].seg_count - * sizeof(*dma->bufs[0].seglist), - DRM_MEM_SEGS); - } - if(dma->bufs[i].buf_count) { - for(j = 0; j < dma->bufs[i].buf_count; j++) { - if(dma->bufs[i].buflist[j].dev_private) { - drm_free(dma->bufs[i].buflist[j].dev_private, - dma->bufs[i].buflist[j].dev_priv_size, - DRM_MEM_BUFS); - } - } - drm_free(dma->bufs[i].buflist, - dma->bufs[i].buf_count * - sizeof(*dma->bufs[0].buflist), - DRM_MEM_BUFS); - drm_freelist_destroy(&dma->bufs[i].freelist); - } - } - - if (dma->buflist) { - drm_free(dma->buflist, - dma->buf_count * sizeof(*dma->buflist), - DRM_MEM_BUFS); - } - - if (dma->pagelist) { - drm_free(dma->pagelist, - dma->page_count * sizeof(*dma->pagelist), - DRM_MEM_PAGES); - } - drm_free(dev->dma, sizeof(*dev->dma), DRM_MEM_DRIVER); - dev->dma = NULL; -} - -#if DRM_DMA_HISTOGRAM -/* This is slow, but is useful for debugging. */ -int drm_histogram_slot(struct timespec *ts) -{ - long count = ts->tv_sec * 1000 + ts->tv_nsec / 1000000; - int value = DRM_DMA_HISTOGRAM_INITIAL; - int slot; - - for (slot = 0; - slot < DRM_DMA_HISTOGRAM_SLOTS; - ++slot, value = DRM_DMA_HISTOGRAM_NEXT(value)) { - if (count < value) return slot; - } - return DRM_DMA_HISTOGRAM_SLOTS - 1; -} - -void drm_histogram_compute(drm_device_t *dev, drm_buf_t *buf) -{ - struct timespec queued_to_dispatched; - struct timespec dispatched_to_completed; - struct timespec completed_to_freed; - int q2d, d2c, c2f, q2c, q2f; - - if (timespecisset(&buf->time_queued)) { - queued_to_dispatched = buf->time_dispatched; - timespecsub(&queued_to_dispatched, &buf->time_queued); - dispatched_to_completed = buf->time_completed; - timespecsub(&dispatched_to_completed, &buf->time_dispatched); - completed_to_freed = buf->time_freed; - timespecsub(&completed_to_freed, &buf->time_completed); - - q2d = drm_histogram_slot(&queued_to_dispatched); - d2c = drm_histogram_slot(&dispatched_to_completed); - c2f = drm_histogram_slot(&completed_to_freed); - - timespecadd(&queued_to_dispatched, &dispatched_to_completed); - q2c = drm_histogram_slot(&queued_to_dispatched); - timespecadd(&queued_to_dispatched, &completed_to_freed); - q2f = drm_histogram_slot(&queued_to_dispatched); - - atomic_inc(&dev->histo.total); - atomic_inc(&dev->histo.queued_to_dispatched[q2d]); - atomic_inc(&dev->histo.dispatched_to_completed[d2c]); - atomic_inc(&dev->histo.completed_to_freed[c2f]); - - atomic_inc(&dev->histo.queued_to_completed[q2c]); - atomic_inc(&dev->histo.queued_to_freed[q2f]); - - } - timespecclear(&buf->time_queued); - timespecclear(&buf->time_dispatched); - timespecclear(&buf->time_completed); - timespecclear(&buf->time_freed); -} -#endif - -void drm_free_buffer(drm_device_t *dev, drm_buf_t *buf) -{ - drm_device_dma_t *dma = dev->dma; - - if (!buf) return; - - buf->waiting = 0; - buf->pending = 0; - buf->pid = 0; - buf->used = 0; -#if DRM_DMA_HISTOGRAMxx - buf->time_completed = get_cycles(); -#endif - if (buf->dma_wait) { - buf->dma_wait = 0; - wakeup(&buf->dma_wait); - } else { - /* If processes are waiting, the last one - to wake will put the buffer on the free - list. If no processes are waiting, we - put the buffer on the freelist here. */ - drm_freelist_put(dev, &dma->bufs[buf->order].freelist, buf); - } -} - -void drm_reclaim_buffers(drm_device_t *dev, pid_t pid) -{ - drm_device_dma_t *dma = dev->dma; - int i; - - if (!dma) return; - for (i = 0; i < dma->buf_count; i++) { - if (dma->buflist[i]->pid == pid) { - switch (dma->buflist[i]->list) { - case DRM_LIST_NONE: - drm_free_buffer(dev, dma->buflist[i]); - break; - case DRM_LIST_WAIT: - dma->buflist[i]->list = DRM_LIST_RECLAIM; - break; - default: - /* Buffer already on hardware. */ - break; - } - } - } -} - -int drm_context_switch(drm_device_t *dev, int old, int new) -{ - char buf[64]; - drm_queue_t *q; - - atomic_inc(&dev->total_ctx); - - if (test_and_set_bit(0, &dev->context_flag)) { - DRM_ERROR("Reentering -- FIXME\n"); - return EBUSY; - } - -#if DRM_DMA_HISTOGRAM - getnanotime(&dev->ctx_start); -#endif - - DRM_DEBUG("Context switch from %d to %d\n", old, new); - - if (new >= dev->queue_count) { - clear_bit(0, &dev->context_flag); - return EINVAL; - } - - if (new == dev->last_context) { - clear_bit(0, &dev->context_flag); - return 0; - } - - q = dev->queuelist[new]; - atomic_inc(&q->use_count); - if (atomic_read(&q->use_count) == 1) { - atomic_dec(&q->use_count); - clear_bit(0, &dev->context_flag); - return EINVAL; - } - - if (drm_flags & DRM_FLAG_NOCTX) { - drm_context_switch_complete(dev, new); - } else { - sprintf(buf, "C %d %d\n", old, new); - drm_write_string(dev, buf); - } - - atomic_dec(&q->use_count); - - return 0; -} - -int drm_context_switch_complete(drm_device_t *dev, int new) -{ - drm_device_dma_t *dma = dev->dma; - - dev->last_context = new; /* PRE/POST: This is the _only_ writer. */ - dev->last_switch = ticks; - - if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("Lock isn't held after context switch\n"); - } - - if (!dma || !(dma->next_buffer && dma->next_buffer->while_locked)) { - if (drm_lock_free(dev, &dev->lock.hw_lock->lock, - DRM_KERNEL_CONTEXT)) { - DRM_ERROR("Cannot free lock\n"); - } - } - -#if DRM_DMA_HISTOGRAM - { - struct timespec ts; - getnanotime(&ts); - timespecsub(&ts, &dev->ctx_start); - atomic_inc(&dev->histo.ctx[drm_histogram_slot(&ts)]); - } -#endif - clear_bit(0, &dev->context_flag); - wakeup(&dev->context_wait); - - return 0; -} - -void drm_clear_next_buffer(drm_device_t *dev) -{ - drm_device_dma_t *dma = dev->dma; - - dma->next_buffer = NULL; - if (dma->next_queue && !DRM_BUFCOUNT(&dma->next_queue->waitlist)) { - wakeup(&dma->next_queue->flush_queue); - } - dma->next_queue = NULL; -} - - -int drm_select_queue(drm_device_t *dev, void (*wrapper)(void *)) -{ - int i; - int candidate = -1; - int j = ticks; - - if (!dev) { - DRM_ERROR("No device\n"); - return -1; - } - if (!dev->queuelist || !dev->queuelist[DRM_KERNEL_CONTEXT]) { - /* This only happens between the time the - interrupt is initialized and the time - the queues are initialized. */ - return -1; - } - - /* Doing "while locked" DMA? */ - if (DRM_WAITCOUNT(dev, DRM_KERNEL_CONTEXT)) { - return DRM_KERNEL_CONTEXT; - } - - /* If there are buffers on the last_context - queue, and we have not been executing - this context very long, continue to - execute this context. */ - if (dev->last_switch <= j - && dev->last_switch + DRM_TIME_SLICE > j - && DRM_WAITCOUNT(dev, dev->last_context)) { - return dev->last_context; - } - - /* Otherwise, find a candidate */ - for (i = dev->last_checked + 1; i < dev->queue_count; i++) { - if (DRM_WAITCOUNT(dev, i)) { - candidate = dev->last_checked = i; - break; - } - } - - if (candidate < 0) { - for (i = 0; i < dev->queue_count; i++) { - if (DRM_WAITCOUNT(dev, i)) { - candidate = dev->last_checked = i; - break; - } - } - } - - if (wrapper - && candidate >= 0 - && candidate != dev->last_context - && dev->last_switch <= j - && dev->last_switch + DRM_TIME_SLICE > j) { - int s = splclock(); - if (dev->timer.c_time != dev->last_switch + DRM_TIME_SLICE) { - callout_reset(&dev->timer, - dev->last_switch + DRM_TIME_SLICE - j, - wrapper, - dev); - } - splx(s); - return -1; - } - - return candidate; -} - - -int drm_dma_enqueue(drm_device_t *dev, drm_dma_t *d) -{ - int i; - drm_queue_t *q; - drm_buf_t *buf; - int idx; - int while_locked = 0; - drm_device_dma_t *dma = dev->dma; - int error; - - DRM_DEBUG("%d\n", d->send_count); - - if (d->flags & _DRM_DMA_WHILE_LOCKED) { - int context = dev->lock.hw_lock->lock; - - if (!_DRM_LOCK_IS_HELD(context)) { - DRM_ERROR("No lock held during \"while locked\"" - " request\n"); - return EINVAL; - } - if (d->context != _DRM_LOCKING_CONTEXT(context) - && _DRM_LOCKING_CONTEXT(context) != DRM_KERNEL_CONTEXT) { - DRM_ERROR("Lock held by %d while %d makes" - " \"while locked\" request\n", - _DRM_LOCKING_CONTEXT(context), - d->context); - return EINVAL; - } - q = dev->queuelist[DRM_KERNEL_CONTEXT]; - while_locked = 1; - } else { - q = dev->queuelist[d->context]; - } - - - atomic_inc(&q->use_count); - if (atomic_read(&q->block_write)) { - atomic_inc(&q->block_count); - for (;;) { - if (!atomic_read(&q->block_write)) break; - error = tsleep(&q->block_write, PZERO|PCATCH, - "dmawr", 0); - if (error) { - atomic_dec(&q->use_count); - return error; - } - } - atomic_dec(&q->block_count); - } - - for (i = 0; i < d->send_count; i++) { - idx = d->send_indices[i]; - if (idx < 0 || idx >= dma->buf_count) { - atomic_dec(&q->use_count); - DRM_ERROR("Index %d (of %d max)\n", - d->send_indices[i], dma->buf_count - 1); - return EINVAL; - } - buf = dma->buflist[ idx ]; - if (buf->pid != curproc->p_pid) { - atomic_dec(&q->use_count); - DRM_ERROR("Process %d using buffer owned by %d\n", - curproc->p_pid, buf->pid); - return EINVAL; - } - if (buf->list != DRM_LIST_NONE) { - atomic_dec(&q->use_count); - DRM_ERROR("Process %d using buffer %d on list %d\n", - curproc->p_pid, buf->idx, buf->list); - } - buf->used = d->send_sizes[i]; - buf->while_locked = while_locked; - buf->context = d->context; - if (!buf->used) { - DRM_ERROR("Queueing 0 length buffer\n"); - } - if (buf->pending) { - atomic_dec(&q->use_count); - DRM_ERROR("Queueing pending buffer:" - " buffer %d, offset %d\n", - d->send_indices[i], i); - return EINVAL; - } - if (buf->waiting) { - atomic_dec(&q->use_count); - DRM_ERROR("Queueing waiting buffer:" - " buffer %d, offset %d\n", - d->send_indices[i], i); - return EINVAL; - } - buf->waiting = 1; - if (atomic_read(&q->use_count) == 1 - || atomic_read(&q->finalization)) { - drm_free_buffer(dev, buf); - } else { - drm_waitlist_put(&q->waitlist, buf); - atomic_inc(&q->total_queued); - } - } - atomic_dec(&q->use_count); - - return 0; -} - -static int drm_dma_get_buffers_of_order(drm_device_t *dev, drm_dma_t *d, - int order) -{ - int i; - int error; - drm_buf_t *buf; - drm_device_dma_t *dma = dev->dma; - - for (i = d->granted_count; i < d->request_count; i++) { - buf = drm_freelist_get(&dma->bufs[order].freelist, - d->flags & _DRM_DMA_WAIT); - if (!buf) break; - if (buf->pending || buf->waiting) { - DRM_ERROR("Free buffer %d in use by %d (w%d, p%d)\n", - buf->idx, - buf->pid, - buf->waiting, - buf->pending); - } - buf->pid = curproc->p_pid; - error = copyout(&buf->idx, - &d->request_indices[i], - sizeof(buf->idx)); - if (error) - return error; - error = copyout(&buf->total, - &d->request_sizes[i], - sizeof(buf->total)); - if (error) - return error; - ++d->granted_count; - } - return 0; -} - - -int drm_dma_get_buffers(drm_device_t *dev, drm_dma_t *dma) -{ - int order; - int retcode = 0; - int tmp_order; - - order = drm_order(dma->request_size); - - dma->granted_count = 0; - retcode = drm_dma_get_buffers_of_order(dev, dma, order); - - if (dma->granted_count < dma->request_count - && (dma->flags & _DRM_DMA_SMALLER_OK)) { - for (tmp_order = order - 1; - !retcode - && dma->granted_count < dma->request_count - && tmp_order >= DRM_MIN_ORDER; - --tmp_order) { - - retcode = drm_dma_get_buffers_of_order(dev, dma, - tmp_order); - } - } - - if (dma->granted_count < dma->request_count - && (dma->flags & _DRM_DMA_LARGER_OK)) { - for (tmp_order = order + 1; - !retcode - && dma->granted_count < dma->request_count - && tmp_order <= DRM_MAX_ORDER; - ++tmp_order) { - - retcode = drm_dma_get_buffers_of_order(dev, dma, - tmp_order); - } - } - return 0; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/drawable.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/drawable.c deleted file mode 100644 index d15ea617d..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/drawable.c +++ /dev/null @@ -1,50 +0,0 @@ -/* drawable.c -- IOCTLs for drawables -*- c -*- - * Created: Tue Feb 2 08:37:54 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" - -int drm_adddraw(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - drm_draw_t draw; - - draw.handle = 0; /* NOOP */ - DRM_DEBUG("%d\n", draw.handle); - *(drm_draw_t *) data = draw; - return 0; -} - -int drm_rmdraw(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - return 0; /* NOOP */ -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/drmstat.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/drmstat.c deleted file mode 100644 index 48fb1b161..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/drmstat.c +++ /dev/null @@ -1,418 +0,0 @@ -/* drmstat.c -- DRM device status and testing program - * Created: Tue Jan 5 08:19:24 1999 by faith@precisioninsight.com - * Revised: Sun Aug 1 11:02:00 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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. - * - * $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmstat.c,v 1.28 1999/08/04 18:12:11 faith Exp $ - * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/drmstat.c,v 1.1 2000/06/17 00:03:30 martin Exp $ - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/time.h> -#include <sys/mman.h> -#include <strings.h> -#include <errno.h> -#include <signal.h> -#include <fcntl.h> -#include "xf86drm.h" - -int sigio_fd; - -static double usec(struct timeval *end, struct timeval *start) -{ - double e = end->tv_sec * 1000000 + end->tv_usec; - double s = start->tv_sec * 1000000 + start->tv_usec; - - return e - s; -} - -static void getversion(int fd) -{ - drmVersionPtr version; - - version = drmGetVersion(fd); - if (version) { - printf( "Name: %s\n", version->name ? version->name : "?" ); - printf( " Version: %d.%d.%d\n", - version->version_major, - version->version_minor, - version->version_patchlevel ); - printf( " Date: %s\n", version->date ? version->date : "?" ); - printf( " Desc: %s\n", version->desc ? version->desc : "?" ); - drmFreeVersion(version); - } else { - printf( "No driver available\n" ); - } -} - -void handler(int fd, void *oldctx, void *newctx) -{ - printf("Got fd %d\n", fd); -} - -void process_sigio(char *device) -{ - int fd; - -printf("%s\n", device); - if ((fd = open(device, 0)) < 0) { -printf("%d\n", errno); - drmError(-errno, __FUNCTION__); - exit(1); - } - - sigio_fd = fd; - drmInstallSIGIOHandler(fd, handler); - for (;;) sleep(60); -} - -int main(int argc, char **argv) -{ - int c; - int r = 0; - int fd = -1; - drmHandle handle; - void *address; - char *pt; - unsigned long count; - unsigned long offset; - unsigned long size; - drmContext context; - int loops; - char buf[1024]; - int i; - drmBufInfoPtr info; - drmBufMapPtr bufs; - drmLockPtr lock; - int secs; - - while ((c = getopt(argc, argv, - "lc:vo:O:f:s:w:W:b:r:R:P:L:C:XS:B:F:")) != EOF) - switch (c) { - case 'F': - count = strtoul(optarg, NULL, 0); - if (!fork()) { - dup(fd); - sleep(count); - } - close(fd); - break; - case 'v': getversion(fd); break; - case 'X': - if ((r = drmCreateContext(fd, &context))) { - drmError(r, argv[0]); - return 1; - } - printf( "Got %d\n", context); - break; - case 'S': - process_sigio(optarg); - break; - case 'C': - if ((r = drmSwitchToContext(fd, strtoul(optarg, NULL, 0)))) { - drmError(r, argv[0]); - return 1; - } - break; - case 'c': - if ((r = drmSetBusid(fd,optarg))) { - drmError(r, argv[0]); - return 1; - } - break; - case 'o': - if ((fd = drmOpen(optarg, NULL)) < 0) { - drmError(fd, argv[0]); - return 1; - } - break; - case 'O': - if ((fd = drmOpen(NULL, optarg)) < 0) { - drmError(fd, argv[0]); - return 1; - } - break; - case 'B': /* Test buffer allocation */ - count = strtoul(optarg, &pt, 0); - size = strtoul(pt+1, &pt, 0); - secs = strtoul(pt+1, NULL, 0); - { - drmDMAReq dma; - int *indices, *sizes; - - indices = alloca(sizeof(*indices) * count); - sizes = alloca(sizeof(*sizes) * count); - dma.context = context; - dma.send_count = 0; - dma.request_count = count; - dma.request_size = size; - dma.request_list = indices; - dma.request_sizes = sizes; - dma.flags = DRM_DMA_WAIT; - if ((r = drmDMA(fd, &dma))) { - drmError(r, argv[0]); - return 1; - } - for (i = 0; i < dma.granted_count; i++) { - printf("%5d: index = %d, size = %d\n", - i, dma.request_list[i], dma.request_sizes[i]); - } - sleep(secs); - drmFreeBufs(fd, dma.granted_count, indices); - } - break; - case 'b': - count = strtoul(optarg, &pt, 0); - size = strtoul(pt+1, NULL, 0); - if ((r = drmAddBufs(fd, count, size, 0, 0)) < 0) { - drmError(r, argv[0]); - return 1; - } - if (!(info = drmGetBufInfo(fd))) { - drmError(0, argv[0]); - return 1; - } - for (i = 0; i < info->count; i++) { - printf("%5d buffers of size %6d (low = %d, high = %d)\n", - info->list[i].count, - info->list[i].size, - info->list[i].low_mark, - info->list[i].high_mark); - } - if ((r = drmMarkBufs(fd, 0.50, 0.80))) { - drmError(r, argv[0]); - return 1; - } - if (!(info = drmGetBufInfo(fd))) { - drmError(0, argv[0]); - return 1; - } - for (i = 0; i < info->count; i++) { - printf("%5d buffers of size %6d (low = %d, high = %d)\n", - info->list[i].count, - info->list[i].size, - info->list[i].low_mark, - info->list[i].high_mark); - } - printf("===== /proc/drm/1/meminfo =====\n"); - sprintf(buf, "cat /proc/drm/1/meminfo"); - system(buf); -#if 1 - if (!(bufs = drmMapBufs(fd))) { - drmError(0, argv[0]); - return 1; - } - printf("===============================\n"); - printf( "%d bufs\n", bufs->count); - for (i = 0; i < bufs->count; i++) { - printf( " %4d: %8d bytes at %p\n", - i, - bufs->list[i].total, - bufs->list[i].address); - } - printf("===== /proc/drm/1/vmainfo =====\n"); - sprintf(buf, "cat /proc/drm/1/vmainfo"); - system(buf); -#endif - break; - case 'f': - offset = strtoul(optarg, &pt, 0); - size = strtoul(pt+1, NULL, 0); - handle = 0; - if ((r = drmAddMap(fd, offset, size, - DRM_FRAME_BUFFER, 0, &handle))) { - drmError(r, argv[0]); - return 1; - } - printf("0x%08lx:0x%04lx added\n", offset, size); - printf("===== /proc/drm/1/meminfo =====\n"); - sprintf(buf, "cat /proc/drm/1/meminfo"); - system(buf); - break; - case 'r': - case 'R': - offset = strtoul(optarg, &pt, 0); - size = strtoul(pt+1, NULL, 0); - handle = 0; - if ((r = drmAddMap(fd, offset, size, - DRM_REGISTERS, - c == 'R' ? DRM_READ_ONLY : 0, - &handle))) { - drmError(r, argv[0]); - return 1; - } - printf("0x%08lx:0x%04lx added\n", offset, size); - printf("===== /proc/drm/1/meminfo =====\n"); - sprintf(buf, "cat /proc/drm/1/meminfo"); - system(buf); - break; - case 's': - size = strtoul(optarg, &pt, 0); - handle = 0; - if ((r = drmAddMap(fd, 0, size, - DRM_SHM, DRM_CONTAINS_LOCK, - &handle))) { - drmError(r, argv[0]); - return 1; - } - printf("0x%04lx byte shm added at 0x%08lx\n", size, handle); - sprintf(buf, "sysctl hw.graphics.0.vm"); - system(buf); - break; - case 'P': - offset = strtoul(optarg, &pt, 0); - size = strtoul(pt+1, NULL, 0); - address = NULL; - if ((r = drmMap(fd, offset, size, &address))) { - drmError(r, argv[0]); - return 1; - } - printf("0x%08lx:0x%04lx mapped at %p for pid %d\n", - offset, size, address, getpid()); - printf("===== hw.graphics.0.vma =====\n"); - sprintf(buf, "sysctl hw.graphics.0.vma"); - system(buf); - mprotect((void *)offset, size, PROT_READ); - printf("===== hw.graphics.0.vma =====\n"); - sprintf(buf, "sysctl hw.graphics.0.vma"); - system(buf); - break; - case 'w': - case 'W': - offset = strtoul(optarg, &pt, 0); - size = strtoul(pt+1, NULL, 0); - address = NULL; - if ((r = drmMap(fd, offset, size, &address))) { - drmError(r, argv[0]); - return 1; - } - printf("0x%08lx:0x%04lx mapped at %p for pid %d\n", - offset, size, address, getpid()); - printf("===== /proc/%d/maps =====\n", getpid()); - sprintf(buf, "cat /proc/%d/maps", getpid()); - system(buf); - printf("===== /proc/drm/1/meminfo =====\n"); - sprintf(buf, "cat /proc/drm/1/meminfo"); - system(buf); - printf("===== /proc/drm/1/vmainfo =====\n"); - sprintf(buf, "cat /proc/drm/1/vmainfo"); - system(buf); - printf("===== READING =====\n"); - for (i = 0; i < 0x10; i++) - printf("%02x ", (unsigned int)((unsigned char *)address)[i]); - printf("\n"); - if (c == 'w') { - printf("===== WRITING =====\n"); - for (i = 0; i < size; i+=2) { - ((char *)address)[i] = i & 0xff; - ((char *)address)[i+1] = i & 0xff; - } - } - printf("===== READING =====\n"); - for (i = 0; i < 0x10; i++) - printf("%02x ", (unsigned int)((unsigned char *)address)[i]); - printf("\n"); - printf("===== /proc/drm/1/vmainfo =====\n"); - sprintf(buf, "cat /proc/drm/1/vmainfo"); - system(buf); - break; - case 'L': - context = strtoul(optarg, &pt, 0); - offset = strtoul(pt+1, &pt, 0); - size = strtoul(pt+1, &pt, 0); - loops = strtoul(pt+1, NULL, 0); - address = NULL; - if ((r = drmMap(fd, offset, size, &address))) { - drmError(r, argv[0]); - return 1; - } - lock = address; -#if 1 - { - int counter = 0; - struct timeval loop_start, loop_end; - struct timeval lock_start, lock_end; - double wt; -#define HISTOSIZE 9 - int histo[HISTOSIZE]; - int output = 0; - int fast = 0; - - if (loops < 0) { - loops = -loops; - ++output; - } - - for (i = 0; i < HISTOSIZE; i++) histo[i] = 0; - - gettimeofday(&loop_start, NULL); - for (i = 0; i < loops; i++) { - gettimeofday(&lock_start, NULL); - DRM_LIGHT_LOCK_COUNT(fd,lock,context,fast); - gettimeofday(&lock_end, NULL); - DRM_UNLOCK(fd,lock,context); - ++counter; - wt = usec(&lock_end, &lock_start); - if (wt <= 2.5) ++histo[8]; - if (wt < 5.0) ++histo[0]; - else if (wt < 50.0) ++histo[1]; - else if (wt < 500.0) ++histo[2]; - else if (wt < 5000.0) ++histo[3]; - else if (wt < 50000.0) ++histo[4]; - else if (wt < 500000.0) ++histo[5]; - else if (wt < 5000000.0) ++histo[6]; - else ++histo[7]; - if (output) printf( "%.2f uSec, %d fast\n", wt, fast); - } - gettimeofday(&loop_end, NULL); - printf( "Average wait time = %.2f usec, %d fast\n", - usec(&loop_end, &loop_start) / counter, fast); - printf( "%9d <= 2.5 uS\n", histo[8]); - printf( "%9d < 5 uS\n", histo[0]); - printf( "%9d < 50 uS\n", histo[1]); - printf( "%9d < 500 uS\n", histo[2]); - printf( "%9d < 5000 uS\n", histo[3]); - printf( "%9d < 50000 uS\n", histo[4]); - printf( "%9d < 500000 uS\n", histo[5]); - printf( "%9d < 5000000 uS\n", histo[6]); - printf( "%9d >= 5000000 uS\n", histo[7]); - } -#else - printf( "before lock: 0x%08x\n", lock->lock); - printf( "lock: 0x%08x\n", lock->lock); - sleep(5); - printf( "unlock: 0x%08x\n", lock->lock); -#endif - break; - default: - fprintf( stderr, "Usage: drmstat [options]\n" ); - return 1; - } - - return r; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/fops.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/fops.c deleted file mode 100644 index ad8c86a68..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/fops.c +++ /dev/null @@ -1,261 +0,0 @@ -/* fops.c -- File operations for DRM -*- c -*- - * Created: Mon Jan 4 08:58:31 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * Daryll Strauss <daryll@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" -#include <sys/signalvar.h> -#include <sys/poll.h> - -drm_file_t *drm_find_file_by_proc(drm_device_t *dev, struct proc *p) -{ - uid_t uid = p->p_cred->p_svuid; - pid_t pid = p->p_pid; - drm_file_t *priv; - - TAILQ_FOREACH(priv, &dev->files, link) - if (priv->pid == pid && priv->uid == uid) - return priv; - return NULL; -} - - -/* drm_open is called whenever a process opens /dev/drm. */ - -int drm_open_helper(dev_t kdev, int flags, int fmt, struct proc *p, - drm_device_t *dev) -{ - int m = minor(kdev); - drm_file_t *priv; - - if (flags & O_EXCL) - return EBUSY; /* No exclusive opens */ - - dev->flags = flags; - - DRM_DEBUG("pid = %d, device = %p, minor = %d\n", - p->p_pid, dev->device, m); - - priv = drm_find_file_by_proc(dev, p); - if (priv) { - priv->refs++; - } else { - priv = drm_alloc(sizeof(*priv), DRM_MEM_FILES); - memset(priv, 0, sizeof(*priv)); - priv->uid = p->p_cred->p_svuid; - priv->pid = p->p_pid; - priv->refs = 1; - priv->minor = m; - priv->devXX = dev; - priv->ioctl_count = 0; - priv->authenticated = !suser(p); - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, p); - TAILQ_INSERT_TAIL(&dev->files, priv, link); - lockmgr(&dev->dev_lock, LK_RELEASE, 0, p); - } - - kdev->si_drv1 = dev; - - return 0; -} - -int drm_write(dev_t kdev, struct uio *uio, int ioflag) -{ - struct proc *p = curproc; - drm_device_t *dev = kdev->si_drv1; - - DRM_DEBUG("pid = %d, device = %p, open_count = %d\n", - p->p_pid, dev->device, dev->open_count); - return 0; -} - -/* drm_release is called whenever a process closes /dev/drm*. */ - -int drm_close(dev_t kdev, int fflag, int devtype, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_file_t *priv; - - DRM_DEBUG("pid = %d, device = %p, open_count = %d\n", - p->p_pid, dev->device, dev->open_count); - - priv = drm_find_file_by_proc(dev, p); - if (!priv) { - DRM_DEBUG("can't find authenticator\n"); - return EINVAL; - } - - if (dev->lock.hw_lock && _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) - && dev->lock.pid == p->p_pid) { - DRM_ERROR("Process %d dead, freeing lock for context %d\n", - p->p_pid, - _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); - drm_lock_free(dev, - &dev->lock.hw_lock->lock, - _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); - - /* FIXME: may require heavy-handed reset of - hardware at this point, possibly - processed via a callback to the X - server. */ - } - drm_reclaim_buffers(dev, priv->pid); - - funsetown(dev->buf_sigio); - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, p); - priv = drm_find_file_by_proc(dev, p); - if (priv) { - priv->refs--; - if (!priv->refs) { - TAILQ_REMOVE(&dev->files, priv, link); - drm_free(priv, sizeof(*priv), DRM_MEM_FILES); - } - } - lockmgr(&dev->dev_lock, LK_RELEASE, 0, p); - - return 0; -} - -/* The drm_read and drm_write_string code (especially that which manages - the circular buffer), is based on Alessandro Rubini's LINUX DEVICE - DRIVERS (Cambridge: O'Reilly, 1998), pages 111-113. */ - -ssize_t drm_read(dev_t kdev, struct uio *uio, int ioflag) -{ - drm_device_t *dev = kdev->si_drv1; - int left; - int avail; - int send; - int cur; - int error = 0; - - DRM_DEBUG("%p, %p\n", dev->buf_rp, dev->buf_wp); - - while (dev->buf_rp == dev->buf_wp) { - DRM_DEBUG(" sleeping\n"); - if (dev->flags & FASYNC) { - return EWOULDBLOCK; - } - error = tsleep(&dev->buf_rp, PZERO|PCATCH, "drmrd", 0); - if (error) { - DRM_DEBUG(" interrupted\n"); - return error; - } - DRM_DEBUG(" awake\n"); - } - - left = (dev->buf_rp + DRM_BSZ - dev->buf_wp) % DRM_BSZ; - avail = DRM_BSZ - left; - send = DRM_MIN(avail, uio->uio_resid); - - while (send) { - if (dev->buf_wp > dev->buf_rp) { - cur = DRM_MIN(send, dev->buf_wp - dev->buf_rp); - } else { - cur = DRM_MIN(send, dev->buf_end - dev->buf_rp); - } - error = uiomove(dev->buf_rp, cur, uio); - if (error) - break; - dev->buf_rp += cur; - if (dev->buf_rp == dev->buf_end) dev->buf_rp = dev->buf; - send -= cur; - } - - wakeup(&dev->buf_wp); - - return error; -} - -int drm_write_string(drm_device_t *dev, const char *s) -{ - int left = (dev->buf_rp + DRM_BSZ - dev->buf_wp) % DRM_BSZ; - int send = strlen(s); - int count; - - DRM_DEBUG("%d left, %d to send (%p, %p)\n", - left, send, dev->buf_rp, dev->buf_wp); - - if (left == 1 || dev->buf_wp != dev->buf_rp) { - DRM_ERROR("Buffer not empty (%d left, wp = %p, rp = %p)\n", - left, - dev->buf_wp, - dev->buf_rp); - } - - while (send) { - if (dev->buf_wp >= dev->buf_rp) { - count = DRM_MIN(send, dev->buf_end - dev->buf_wp); - if (count == left) --count; /* Leave a hole */ - } else { - count = DRM_MIN(send, dev->buf_rp - dev->buf_wp - 1); - } - strncpy(dev->buf_wp, s, count); - dev->buf_wp += count; - if (dev->buf_wp == dev->buf_end) dev->buf_wp = dev->buf; - send -= count; - } - - if (dev->buf_selecting) { - dev->buf_selecting = 0; - selwakeup(&dev->buf_sel); - } - - DRM_DEBUG("dev->buf_sigio=%p\n", dev->buf_sigio); - if (dev->buf_sigio) { - DRM_DEBUG("dev->buf_sigio->sio_pgid=%d\n", dev->buf_sigio->sio_pgid); - pgsigio(dev->buf_sigio, SIGIO, 0); - } - - DRM_DEBUG("waking\n"); - wakeup(&dev->buf_rp); - return 0; -} - -int drm_poll(dev_t kdev, int events, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - int s; - int revents = 0; - - s = spldrm(); - if (events & (POLLIN | POLLRDNORM)) { - int left = (dev->buf_rp + DRM_BSZ - dev->buf_wp) % DRM_BSZ; - if (left > 0) - revents |= events & (POLLIN | POLLRDNORM); - else - selrecord(p, &dev->buf_sel); - } - splx(s); - - return revents; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/init.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/init.c deleted file mode 100644 index 99ff70c01..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/init.c +++ /dev/null @@ -1,100 +0,0 @@ -/* init.c -- Setup/Cleanup for DRM -*- c -*- - * Created: Mon Jan 4 08:58:31 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" - -MODULE_VERSION(drm, 1); - -int drm_flags = 0; - -/* drm_parse_option parses a single option. See description for - drm_parse_drm for details. */ - -static void drm_parse_option(char *s) -{ - char *c, *r; - - DRM_DEBUG("\"%s\"\n", s); - if (!s || !*s) return; - for (c = s; *c && *c != ':'; c++); /* find : or \0 */ - if (*c) r = c + 1; else r = NULL; /* remember remainder */ - *c = '\0'; /* terminate */ - if (!strcmp(s, "noctx")) { - drm_flags |= DRM_FLAG_NOCTX; - DRM_INFO("Server-mediated context switching OFF\n"); - return; - } - if (!strcmp(s, "debug")) { - drm_flags |= DRM_FLAG_DEBUG; - DRM_INFO("Debug messages ON\n"); - return; - } - DRM_ERROR("\"%s\" is not a valid option\n", s); - return; -} - -/* drm_parse_options parse the insmod "drm=" options, or the command-line - * options passed to the kernel via LILO. The grammar of the format is as - * follows: - * - * drm ::= 'drm=' option_list - * option_list ::= option [ ';' option_list ] - * option ::= 'device:' major - * | 'debug' - * | 'noctx' - * major ::= INTEGER - * - * Note that 's' contains option_list without the 'drm=' part. - * - * device=major,minor specifies the device number used for /dev/drm - * if major == 0 then the misc device is used - * if major == 0 and minor == 0 then dynamic misc allocation is used - * debug=on specifies that debugging messages will be printk'd - * debug=trace specifies that each function call will be logged via printk - * debug=off turns off all debugging options - * - */ - -void drm_parse_options(char *s) -{ - char *h, *t, *n; - - DRM_DEBUG("\"%s\"\n", s ?: ""); - if (!s || !*s) return; - - for (h = t = n = s; h && *h; h = n) { - for (; *t && *t != ';'; t++); /* find ; or \0 */ - if (*t) n = t + 1; else n = NULL; /* remember next */ - *t = '\0'; /* terminate */ - drm_parse_option(h); /* parse */ - } -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/ioctl.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/ioctl.c deleted file mode 100644 index 656baffd8..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/ioctl.c +++ /dev/null @@ -1,120 +0,0 @@ -/* ioctl.c -- IOCTL processing for DRM -*- c -*- - * Created: Fri Jan 8 09:01:26 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" -#include <sys/bus.h> -#include <pci/pcivar.h> - -int -drm_irq_busid(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_irq_busid_t id; - devclass_t pci; - device_t bus, dev; - device_t *kids; - int error, i, num_kids; - - id = *(drm_irq_busid_t *) data; - pci = devclass_find("pci"); - if (!pci) - return ENOENT; - bus = devclass_get_device(pci, id.busnum); - if (!bus) - return ENOENT; - error = device_get_children(bus, &kids, &num_kids); - if (error) - return error; - - dev = 0; - for (i = 0; i < num_kids; i++) { - dev = kids[i]; - if (pci_get_slot(dev) == id.devnum - && pci_get_function(dev) == id.funcnum) - break; - } - - free(kids, M_TEMP); - - if (i != num_kids) - id.irq = pci_get_irq(dev); - else - id.irq = 0; - - DRM_DEBUG("%d:%d:%d => IRQ %d\n", - id.busnum, id.devnum, id.funcnum, id.irq); - *(drm_irq_busid_t *) data = id; - - return 0; -} - -int -drm_getunique(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_unique_t u; - int error; - - u = *(drm_unique_t *) data; - if (u.unique_len >= dev->unique_len) { - error = copyout(dev->unique, u.unique, dev->unique_len); - if (error) - return error; - } - u.unique_len = dev->unique_len; - *(drm_unique_t *) data = u; - return 0; -} - -int -drm_setunique(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_unique_t u; - int error; - - if (dev->unique_len || dev->unique) return EBUSY; - - u = *(drm_unique_t *) data; - - dev->unique_len = u.unique_len; - dev->unique = drm_alloc(u.unique_len + 1, DRM_MEM_DRIVER); - error = copyin(u.unique, dev->unique, dev->unique_len); - if (error) - return error; - dev->unique[dev->unique_len] = '\0'; - - dev->devname = drm_alloc(strlen(dev->name) + strlen(dev->unique) + 2, - DRM_MEM_DRIVER); - sprintf(dev->devname, "%s@%s", dev->name, dev->unique); - - return 0; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/lists.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/lists.c deleted file mode 100644 index b9722973e..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/lists.c +++ /dev/null @@ -1,278 +0,0 @@ -/* lists.c -- Buffer list handling routines -*- c -*- - * Created: Mon Apr 19 20:54:22 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" - -int drm_waitlist_create(drm_waitlist_t *bl, int count) -{ - DRM_DEBUG("%d\n", count); - if (bl->count) return EINVAL; - - bl->count = count; - bl->bufs = drm_alloc((bl->count + 2) * sizeof(*bl->bufs), - DRM_MEM_BUFLISTS); - bl->rp = bl->bufs; - bl->wp = bl->bufs; - bl->end = &bl->bufs[bl->count+1]; - simple_lock_init(&bl->write_lock); - simple_lock_init(&bl->read_lock); - return 0; -} - -int drm_waitlist_destroy(drm_waitlist_t *bl) -{ - DRM_DEBUG("\n"); - if (bl->rp != bl->wp) return EINVAL; - if (bl->bufs) drm_free(bl->bufs, - (bl->count + 2) * sizeof(*bl->bufs), - DRM_MEM_BUFLISTS); - bl->count = 0; - bl->bufs = NULL; - bl->rp = NULL; - bl->wp = NULL; - bl->end = NULL; - return 0; -} - -int drm_waitlist_put(drm_waitlist_t *bl, drm_buf_t *buf) -{ - int left; - int s; - - left = DRM_LEFTCOUNT(bl); - DRM_DEBUG("put %d (%d left, rp = %p, wp = %p)\n", - buf->idx, left, bl->rp, bl->wp); - if (!left) { - DRM_ERROR("Overflow while adding buffer %d from pid %d\n", - buf->idx, buf->pid); - return EINVAL; - } -#if DRM_DMA_HISTOGRAM - getnanotime(&buf->time_queued); -#endif - buf->list = DRM_LIST_WAIT; - - simple_lock(&bl->write_lock); - s = spldrm(); - *bl->wp = buf; - if (++bl->wp >= bl->end) bl->wp = bl->bufs; - splx(s); - simple_unlock(&bl->write_lock); - - return 0; -} - -drm_buf_t *drm_waitlist_get(drm_waitlist_t *bl) -{ - drm_buf_t *buf; - int s; - - simple_lock(&bl->read_lock); - s = spldrm(); - buf = *bl->rp; - if (bl->rp == bl->wp) { - splx(s); - simple_unlock(&bl->read_lock); - return NULL; - } - if (++bl->rp >= bl->end) bl->rp = bl->bufs; - splx(s); - simple_unlock(&bl->read_lock); - - DRM_DEBUG("get %d\n", buf->idx); - return buf; -} - -int drm_freelist_create(drm_freelist_t *bl, int count) -{ - DRM_DEBUG("\n"); - atomic_set(&bl->count, 0); - bl->next = NULL; - bl->waiting = 0; - bl->low_mark = 0; - bl->high_mark = 0; - atomic_set(&bl->wfh, 0); -/* bl->lock = SPIN_LOCK_UNLOCKED; */ - ++bl->initialized; - return 0; -} - -int drm_freelist_destroy(drm_freelist_t *bl) -{ - DRM_DEBUG("\n"); - atomic_set(&bl->count, 0); - bl->next = NULL; - return 0; -} - -int drm_freelist_put(drm_device_t *dev, drm_freelist_t *bl, drm_buf_t *buf) -{ - unsigned int old; - unsigned int new; - char failed; - int count = 0; - drm_device_dma_t *dma = dev->dma; - - if (!dma) { - DRM_ERROR("No DMA support\n"); - return 1; - } - - if (buf->waiting || buf->pending || buf->list == DRM_LIST_FREE) { - DRM_ERROR("Freed buffer %d: w%d, p%d, l%d\n", - buf->idx, buf->waiting, buf->pending, buf->list); - } - DRM_DEBUG("%d, count = %d, wfh = %d, w%d, p%d\n", - buf->idx, atomic_read(&bl->count), atomic_read(&bl->wfh), - buf->waiting, buf->pending); - if (!bl) return 1; -#if DRM_DMA_HISTOGRAM - getnanotime(&buf->time_freed); - drm_histogram_compute(dev, buf); -#endif - buf->list = DRM_LIST_FREE; -/* - do { - old = (unsigned long)bl->next; - buf->next = (void *)old; - new = (unsigned long)buf; - _DRM_CAS(&bl->next, old, new, failed); - if (++count > DRM_LOOPING_LIMIT) { - DRM_ERROR("Looping\n"); - return 1; - } - } while (failed); -*/ - - simple_lock(&bl->lock); - buf->next = bl->next; - bl->next = buf; - simple_unlock(&bl->lock); - - atomic_inc(&bl->count); - if (atomic_read(&bl->count) > dma->buf_count) { - DRM_ERROR("%d of %d buffers free after addition of %d\n", - atomic_read(&bl->count), dma->buf_count, buf->idx); - return 1; - } - /* Check for high water mark */ - if (atomic_read(&bl->wfh) && atomic_read(&bl->count)>=bl->high_mark) { - atomic_set(&bl->wfh, 0); - if (bl->waiting) - wakeup(&bl->waiting); - } - return 0; -} - -static drm_buf_t *drm_freelist_try(drm_freelist_t *bl) -{ - unsigned int old; - unsigned int new; - char failed; - drm_buf_t *buf; - int count = 0; - - if (!bl) return NULL; - - /* Get buffer */ -/* - do { - old = (unsigned int)bl->next; - if (!old) { - return NULL; - } - new = (unsigned long)bl->next->next; - _DRM_CAS(&bl->next, old, new, failed); - if (++count > DRM_LOOPING_LIMIT) { - DRM_ERROR("Looping\n"); - return NULL; - } - } while (failed); - atomic_dec(&bl->count); - - buf = (drm_buf_t *)old; -*/ - simple_lock(&bl->lock); - if(!bl->next){ - simple_unlock(&bl->lock); - return NULL; - } - buf = bl->next; - bl->next = bl->next->next; - simple_unlock(&bl->lock); - atomic_dec(&bl->count); - buf->next = NULL; - buf->list = DRM_LIST_NONE; - DRM_DEBUG("%d, count = %d, wfh = %d, w%d, p%d\n", - buf->idx, atomic_read(&bl->count), atomic_read(&bl->wfh), - buf->waiting, buf->pending); - if (buf->waiting || buf->pending) { - DRM_ERROR("Free buffer %d: w%d, p%d, l%d\n", - buf->idx, buf->waiting, buf->pending, buf->list); - } - - return buf; -} - -drm_buf_t *drm_freelist_get(drm_freelist_t *bl, int block) -{ - drm_buf_t *buf = NULL; - int error; - - if (!bl || !bl->initialized) return NULL; - - /* Check for low water mark */ - if (atomic_read(&bl->count) <= bl->low_mark) /* Became low */ - atomic_set(&bl->wfh, 1); - if (atomic_read(&bl->wfh)) { - DRM_DEBUG("Block = %d, count = %d, wfh = %d\n", - block, atomic_read(&bl->count), - atomic_read(&bl->wfh)); - if (block) { - atomic_inc(&bl->waiting); - for (;;) { - if (!atomic_read(&bl->wfh) - && (buf = drm_freelist_try(bl))) break; - error = tsleep(&bl->waiting, PZERO|PCATCH, - "drmfg", 0); - if (error) - break; - } - atomic_dec(&bl->waiting); - } - return buf; - } - - DRM_DEBUG("Count = %d, wfh = %d\n", - atomic_read(&bl->count), atomic_read(&bl->wfh)); - return drm_freelist_try(bl); -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/lock.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/lock.c deleted file mode 100644 index ec295b2b2..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/lock.c +++ /dev/null @@ -1,223 +0,0 @@ -/* lock.c -- IOCTLs for locking -*- c -*- - * Created: Tue Feb 2 08:37:54 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" - -int -drm_block(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - DRM_DEBUG("\n"); - return 0; -} - -int -drm_unblock(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - DRM_DEBUG("\n"); - return 0; -} - -int drm_lock_take(__volatile__ unsigned int *lock, unsigned int context) -{ - unsigned int old; - unsigned int new; - char failed; - - DRM_DEBUG("%d attempts\n", context); - do { - old = *lock; - if (old & _DRM_LOCK_HELD) new = old | _DRM_LOCK_CONT; - else new = context | _DRM_LOCK_HELD; - _DRM_CAS(lock, old, new, failed); - } while (failed); - if (_DRM_LOCKING_CONTEXT(old) == context) { - if (old & _DRM_LOCK_HELD) { - if (context != DRM_KERNEL_CONTEXT) { - DRM_ERROR("%d holds heavyweight lock\n", - context); - } - return 0; - } - } - if (new == (context | _DRM_LOCK_HELD)) { - /* Have lock */ - DRM_DEBUG("%d\n", context); - return 1; - } - DRM_DEBUG("%d unable to get lock held by %d\n", - context, _DRM_LOCKING_CONTEXT(old)); - return 0; -} - -/* This takes a lock forcibly and hands it to context. Should ONLY be used - inside *_unlock to give lock to kernel before calling *_dma_schedule. */ -int drm_lock_transfer(drm_device_t *dev, - __volatile__ unsigned int *lock, unsigned int context) -{ - unsigned int old; - unsigned int new; - char failed; - - dev->lock.pid = 0; - do { - old = *lock; - new = context | _DRM_LOCK_HELD; - _DRM_CAS(lock, old, new, failed); - } while (failed); - DRM_DEBUG("%d => %d\n", _DRM_LOCKING_CONTEXT(old), context); - return 1; -} - -int drm_lock_free(drm_device_t *dev, - __volatile__ unsigned int *lock, unsigned int context) -{ - unsigned int old; - unsigned int new; - char failed; - pid_t pid = dev->lock.pid; - - DRM_DEBUG("%d\n", context); - dev->lock.pid = 0; - do { - old = *lock; - new = 0; - _DRM_CAS(lock, old, new, failed); - } while (failed); - if (_DRM_LOCK_IS_HELD(old) && _DRM_LOCKING_CONTEXT(old) != context) { - DRM_ERROR("%d freed heavyweight lock held by %d (pid %d)\n", - context, - _DRM_LOCKING_CONTEXT(old), - pid); - return 1; - } - wakeup(&dev->lock.lock_queue); - return 0; -} - -static int drm_flush_queue(drm_device_t *dev, int context) -{ - int ret = 0; - int error; - drm_queue_t *q = dev->queuelist[context]; - - DRM_DEBUG("\n"); - - atomic_inc(&q->use_count); - if (atomic_read(&q->use_count) > 1) { - atomic_inc(&q->block_write); - atomic_inc(&q->block_count); - for (;;) { - if (!DRM_BUFCOUNT(&q->waitlist)) break; - error = tsleep(&q->flush_queue, PCATCH|PZERO, "drmfq", 0); - if (error) - return error; - } - atomic_dec(&q->block_count); - } - atomic_dec(&q->use_count); - atomic_inc(&q->total_flushed); - - /* NOTE: block_write is still incremented! - Use drm_flush_unlock_queue to decrement. */ - return ret; -} - -static int drm_flush_unblock_queue(drm_device_t *dev, int context) -{ - drm_queue_t *q = dev->queuelist[context]; - - DRM_DEBUG("\n"); - - atomic_inc(&q->use_count); - if (atomic_read(&q->use_count) > 1) { - if (atomic_read(&q->block_write)) { - atomic_dec(&q->block_write); - wakeup(&q->write_queue); - } - } - atomic_dec(&q->use_count); - return 0; -} - -int drm_flush_block_and_flush(drm_device_t *dev, int context, - drm_lock_flags_t flags) -{ - int ret = 0; - int i; - - DRM_DEBUG("\n"); - - if (flags & _DRM_LOCK_FLUSH) { - ret = drm_flush_queue(dev, DRM_KERNEL_CONTEXT); - if (!ret) ret = drm_flush_queue(dev, context); - } - if (flags & _DRM_LOCK_FLUSH_ALL) { - for (i = 0; !ret && i < dev->queue_count; i++) { - ret = drm_flush_queue(dev, i); - } - } - return ret; -} - -int drm_flush_unblock(drm_device_t *dev, int context, drm_lock_flags_t flags) -{ - int ret = 0; - int i; - - DRM_DEBUG("\n"); - - if (flags & _DRM_LOCK_FLUSH) { - ret = drm_flush_unblock_queue(dev, DRM_KERNEL_CONTEXT); - if (!ret) ret = drm_flush_unblock_queue(dev, context); - } - if (flags & _DRM_LOCK_FLUSH_ALL) { - for (i = 0; !ret && i < dev->queue_count; i++) { - ret = drm_flush_unblock_queue(dev, i); - } - } - - return ret; -} - -int drm_finish(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - int ret = 0; - drm_lock_t lock; - - DRM_DEBUG("\n"); - - lock = *(drm_lock_t *) data; - ret = drm_flush_block_and_flush(dev, lock.context, lock.flags); - drm_flush_unblock(dev, lock.context, lock.flags); - return ret; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/memory.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/memory.c deleted file mode 100644 index f60e21289..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/memory.c +++ /dev/null @@ -1,458 +0,0 @@ -/* memory.c -- Memory management wrappers for DRM -*- c -*- - * Created: Thu Feb 4 14:00:34 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" - -#include <vm/vm.h> -#include <vm/pmap.h> -#ifdef DRM_AGP -#include <sys/agpio.h> -#endif - -MALLOC_DEFINE(M_DRM, "drm", "DRM Data Structures"); - -typedef struct drm_mem_stats { - const char *name; - int succeed_count; - int free_count; - int fail_count; - unsigned long bytes_allocated; - unsigned long bytes_freed; -} drm_mem_stats_t; - -#ifdef SMP -static struct simplelock drm_mem_lock; -#endif -static unsigned long drm_ram_available = 0; -static unsigned long drm_ram_used = 0; -static drm_mem_stats_t drm_mem_stats[] = { - [DRM_MEM_DMA] = { "dmabufs" }, - [DRM_MEM_SAREA] = { "sareas" }, - [DRM_MEM_DRIVER] = { "driver" }, - [DRM_MEM_MAGIC] = { "magic" }, - [DRM_MEM_IOCTLS] = { "ioctltab" }, - [DRM_MEM_MAPS] = { "maplist" }, - [DRM_MEM_VMAS] = { "vmalist" }, - [DRM_MEM_BUFS] = { "buflist" }, - [DRM_MEM_SEGS] = { "seglist" }, - [DRM_MEM_PAGES] = { "pagelist" }, - [DRM_MEM_FILES] = { "files" }, - [DRM_MEM_QUEUES] = { "queues" }, - [DRM_MEM_CMDS] = { "commands" }, - [DRM_MEM_MAPPINGS] = { "mappings" }, - [DRM_MEM_BUFLISTS] = { "buflists" }, - [DRM_MEM_AGPLISTS] = { "agplist" }, - [DRM_MEM_TOTALAGP] = { "totalagp" }, - [DRM_MEM_BOUNDAGP] = { "boundagp" }, - [DRM_MEM_CTXBITMAP] = { "ctxbitmap"}, - { NULL, 0, } /* Last entry must be null */ -}; - -void drm_mem_init(void) -{ - drm_mem_stats_t *mem; - - for (mem = drm_mem_stats; mem->name; ++mem) { - mem->succeed_count = 0; - mem->free_count = 0; - mem->fail_count = 0; - mem->bytes_allocated = 0; - mem->bytes_freed = 0; - } - - drm_ram_available = 0; /* si.totalram; */ - drm_ram_used = 0; -} - -/* drm_mem_info is called whenever a process reads /dev/drm/mem. */ - -static int _drm_mem_info DRM_SYSCTL_HANDLER_ARGS -{ - drm_mem_stats_t *pt; - char buf[128]; - int error; - - DRM_SYSCTL_PRINT(" total counts " - " | outstanding \n"); - DRM_SYSCTL_PRINT("type alloc freed fail bytes freed" - " | allocs bytes\n\n"); - DRM_SYSCTL_PRINT("%-9.9s %5d %5d %4d %10lu |\n", - "system", 0, 0, 0, drm_ram_available); - DRM_SYSCTL_PRINT("%-9.9s %5d %5d %4d %10lu |\n", - "locked", 0, 0, 0, drm_ram_used); - DRM_SYSCTL_PRINT("\n"); - for (pt = drm_mem_stats; pt->name; pt++) { - DRM_SYSCTL_PRINT("%-9.9s %5d %5d %4d %10lu %10lu | %6d %10ld\n", - pt->name, - pt->succeed_count, - pt->free_count, - pt->fail_count, - pt->bytes_allocated, - pt->bytes_freed, - pt->succeed_count - pt->free_count, - (long)pt->bytes_allocated - - (long)pt->bytes_freed); - } - SYSCTL_OUT(req, "", 1); - - return 0; -} - -int drm_mem_info DRM_SYSCTL_HANDLER_ARGS -{ - int ret; - - simple_lock(&drm_mem_lock); - ret = _drm_mem_info(oidp, arg1, arg2, req); - simple_unlock(&drm_mem_lock); - return ret; -} - -void *drm_alloc(size_t size, int area) -{ - void *pt; - - if (!size) { - DRM_MEM_ERROR(area, "Allocating 0 bytes\n"); - return NULL; - } - - if (!(pt = malloc(size, M_DRM, M_NOWAIT))) { - simple_lock(&drm_mem_lock); - ++drm_mem_stats[area].fail_count; - simple_unlock(&drm_mem_lock); - return NULL; - } - simple_lock(&drm_mem_lock); - ++drm_mem_stats[area].succeed_count; - drm_mem_stats[area].bytes_allocated += size; - simple_unlock(&drm_mem_lock); - return pt; -} - -void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area) -{ - void *pt; - - if (!(pt = drm_alloc(size, area))) return NULL; - if (oldpt && oldsize) { - memcpy(pt, oldpt, oldsize); - drm_free(oldpt, oldsize, area); - } - return pt; -} - -char *drm_strdup(const char *s, int area) -{ - char *pt; - int length = s ? strlen(s) : 0; - - if (!(pt = drm_alloc(length+1, area))) return NULL; - strcpy(pt, s); - return pt; -} - -void drm_strfree(char *s, int area) -{ - unsigned int size; - - if (!s) return; - - size = 1 + (s ? strlen(s) : 0); - drm_free((void *)s, size, area); -} - -void drm_free(void *pt, size_t size, int area) -{ - int alloc_count; - int free_count; - - if (!pt) DRM_MEM_ERROR(area, "Attempt to free NULL pointer\n"); - else free(pt, M_DRM); - simple_lock(&drm_mem_lock); - drm_mem_stats[area].bytes_freed += size; - free_count = ++drm_mem_stats[area].free_count; - alloc_count = drm_mem_stats[area].succeed_count; - simple_unlock(&drm_mem_lock); - if (free_count > alloc_count) { - DRM_MEM_ERROR(area, "Excess frees: %d frees, %d allocs\n", - free_count, alloc_count); - } -} - -unsigned long drm_alloc_pages(int order, int area) -{ - vm_offset_t address; - unsigned long bytes = PAGE_SIZE << order; - unsigned long addr; - unsigned int sz; - - simple_lock(&drm_mem_lock); - if (drm_ram_used > +(DRM_RAM_PERCENT * drm_ram_available) / 100) { - simple_unlock(&drm_mem_lock); - return 0; - } - simple_unlock(&drm_mem_lock); - - address = (vm_offset_t) contigmalloc(1<<order, M_DRM, M_WAITOK, 0, ~0, 1, 0); - if (!address) { - simple_lock(&drm_mem_lock); - ++drm_mem_stats[area].fail_count; - simple_unlock(&drm_mem_lock); - return 0; - } - simple_lock(&drm_mem_lock); - ++drm_mem_stats[area].succeed_count; - drm_mem_stats[area].bytes_allocated += bytes; - drm_ram_used += bytes; - simple_unlock(&drm_mem_lock); - - - /* Zero outside the lock */ - memset((void *)address, 0, bytes); - - /* Reserve */ - for (addr = address, sz = bytes; - sz > 0; - addr += PAGE_SIZE, sz -= PAGE_SIZE) { - /* mem_map_reserve(MAP_NR(addr));*/ - } - - return address; -} - -void drm_free_pages(unsigned long address, int order, int area) -{ - unsigned long bytes = PAGE_SIZE << order; - int alloc_count; - int free_count; - unsigned long addr; - unsigned int sz; - - if (!address) { - DRM_MEM_ERROR(area, "Attempt to free address 0\n"); - } else { - /* Unreserve */ - for (addr = address, sz = bytes; - sz > 0; - addr += PAGE_SIZE, sz -= PAGE_SIZE) { - /* mem_map_unreserve(MAP_NR(addr));*/ - } - contigfree((void *) address, bytes, M_DRM); - } - - simple_lock(&drm_mem_lock); - free_count = ++drm_mem_stats[area].free_count; - alloc_count = drm_mem_stats[area].succeed_count; - drm_mem_stats[area].bytes_freed += bytes; - drm_ram_used -= bytes; - simple_unlock(&drm_mem_lock); - if (free_count > alloc_count) { - DRM_MEM_ERROR(area, - "Excess frees: %d frees, %d allocs\n", - free_count, alloc_count); - } -} - -void *drm_ioremap(unsigned long offset, unsigned long size) -{ - void *pt; - - if (!size) { - DRM_MEM_ERROR(DRM_MEM_MAPPINGS, - "Mapping 0 bytes at 0x%08lx\n", offset); - return NULL; - } - - if (!(pt = pmap_mapdev(offset, size))) { - simple_lock(&drm_mem_lock); - ++drm_mem_stats[DRM_MEM_MAPPINGS].fail_count; - simple_unlock(&drm_mem_lock); - return NULL; - } - simple_lock(&drm_mem_lock); - ++drm_mem_stats[DRM_MEM_MAPPINGS].succeed_count; - drm_mem_stats[DRM_MEM_MAPPINGS].bytes_allocated += size; - simple_unlock(&drm_mem_lock); - return pt; -} - -void drm_ioremapfree(void *pt, unsigned long size) -{ - int alloc_count; - int free_count; - - if (!pt) - DRM_MEM_ERROR(DRM_MEM_MAPPINGS, - "Attempt to free NULL pointer\n"); - else - pmap_unmapdev((vm_offset_t) pt, size); - - simple_lock(&drm_mem_lock); - drm_mem_stats[DRM_MEM_MAPPINGS].bytes_freed += size; - free_count = ++drm_mem_stats[DRM_MEM_MAPPINGS].free_count; - alloc_count = drm_mem_stats[DRM_MEM_MAPPINGS].succeed_count; - simple_unlock(&drm_mem_lock); - if (free_count > alloc_count) { - DRM_MEM_ERROR(DRM_MEM_MAPPINGS, - "Excess frees: %d frees, %d allocs\n", - free_count, alloc_count); - } -} - -#ifdef DRM_AGP -void *drm_alloc_agp(int pages, u_int32_t type) -{ - device_t dev = agp_find_device(); - void *handle; - - if (!dev) - return NULL; - - if (!pages) { - DRM_MEM_ERROR(DRM_MEM_TOTALAGP, "Allocating 0 pages\n"); - return NULL; - } - - if ((handle = agp_alloc_memory(dev, type, pages << AGP_PAGE_SHIFT))) { - simple_lock(&drm_mem_lock); - ++drm_mem_stats[DRM_MEM_TOTALAGP].succeed_count; - drm_mem_stats[DRM_MEM_TOTALAGP].bytes_allocated - += pages << PAGE_SHIFT; - simple_unlock(&drm_mem_lock); - return handle; - } - simple_lock(&drm_mem_lock); - ++drm_mem_stats[DRM_MEM_TOTALAGP].fail_count; - simple_unlock(&drm_mem_lock); - return NULL; -} - -int drm_free_agp(void *handle, int pages) -{ - device_t dev = agp_find_device(); - int alloc_count; - int free_count; - int retval = EINVAL; - - if (!dev) - return EINVAL; - - if (!handle) { - DRM_MEM_ERROR(DRM_MEM_TOTALAGP, - "Attempt to free NULL AGP handle\n"); - return retval; - } - - agp_free_memory(dev, handle); - simple_lock(&drm_mem_lock); - free_count = ++drm_mem_stats[DRM_MEM_TOTALAGP].free_count; - alloc_count = drm_mem_stats[DRM_MEM_TOTALAGP].succeed_count; - drm_mem_stats[DRM_MEM_TOTALAGP].bytes_freed - += pages << PAGE_SHIFT; - simple_unlock(&drm_mem_lock); - if (free_count > alloc_count) { - DRM_MEM_ERROR(DRM_MEM_TOTALAGP, - "Excess frees: %d frees, %d allocs\n", - free_count, alloc_count); - } - return 0; -} - -int drm_bind_agp(void *handle, unsigned int start) -{ - device_t dev = agp_find_device(); - int retcode = EINVAL; - struct agp_memory_info info; - - DRM_DEBUG("drm_bind_agp called\n"); - - if (!dev) - return EINVAL; - - if (!handle) { - DRM_MEM_ERROR(DRM_MEM_BOUNDAGP, - "Attempt to bind NULL AGP handle\n"); - return retcode; - } - - if (!(retcode = agp_bind_memory(dev, handle, - start << AGP_PAGE_SHIFT))) { - simple_lock(&drm_mem_lock); - ++drm_mem_stats[DRM_MEM_BOUNDAGP].succeed_count; - agp_memory_info(dev, handle, &info); - drm_mem_stats[DRM_MEM_BOUNDAGP].bytes_allocated - += info.ami_size; - simple_unlock(&drm_mem_lock); - DRM_DEBUG("drm_agp.bind_memory: retcode %d\n", retcode); - return retcode; - } - simple_lock(&drm_mem_lock); - ++drm_mem_stats[DRM_MEM_BOUNDAGP].fail_count; - simple_unlock(&drm_mem_lock); - return retcode; -} - -int drm_unbind_agp(void *handle) -{ - device_t dev = agp_find_device(); - int alloc_count; - int free_count; - int retcode = EINVAL; - struct agp_memory_info info; - - if (!dev) - return EINVAL; - - if (!handle) { - DRM_MEM_ERROR(DRM_MEM_BOUNDAGP, - "Attempt to unbind NULL AGP handle\n"); - return retcode; - } - - - agp_memory_info(dev, handle, &info); - if ((retcode = agp_unbind_memory(dev, handle))) - return retcode; - simple_lock(&drm_mem_lock); - free_count = ++drm_mem_stats[DRM_MEM_BOUNDAGP].free_count; - alloc_count = drm_mem_stats[DRM_MEM_BOUNDAGP].succeed_count; - drm_mem_stats[DRM_MEM_BOUNDAGP].bytes_freed += info.ami_size; - simple_unlock(&drm_mem_lock); - if (free_count > alloc_count) { - DRM_MEM_ERROR(DRM_MEM_BOUNDAGP, - "Excess frees: %d frees, %d allocs\n", - free_count, alloc_count); - } - return retcode; -} -#endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/proc.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/proc.c deleted file mode 100644 index 6ca3fabc1..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/proc.c +++ /dev/null @@ -1,568 +0,0 @@ -/* proc.c -- /proc support for DRM -*- c -*- - * Created: Mon Jan 11 09:48:47 1999 by faith@precisioninsight.com - * Revised: Fri Aug 20 11:31:48 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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. - * - * $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/proc.c,v 1.4 1999/08/20 15:36:46 faith Exp $ - * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/proc.c,v 1.2 2001/03/02 02:45:38 dawes Exp $ - * - */ - -#define __NO_VERSION__ -#include "drmP.h" - -static struct proc_dir_entry *drm_root = NULL; -static struct proc_dir_entry *drm_dev_root = NULL; -static char drm_slot_name[64]; - -static int drm_name_info(char *buf, char **start, off_t offset, - int len, int *eof, void *data); -static int drm_vm_info(char *buf, char **start, off_t offset, - int len, int *eof, void *data); -static int drm_clients_info(char *buf, char **start, off_t offset, - int len, int *eof, void *data); -static int drm_queues_info(char *buf, char **start, off_t offset, - int len, int *eof, void *data); -static int drm_bufs_info(char *buf, char **start, off_t offset, - int len, int *eof, void *data); -#if DRM_DEBUG_CODE -static int drm_vma_info(char *buf, char **start, off_t offset, - int len, int *eof, void *data); -#endif -#if DRM_DMA_HISTOGRAM -static int drm_histo_info(char *buf, char **start, off_t offset, - int len, int *eof, void *data); -#endif - -struct drm_proc_list { - const char *name; - int (*f)(char *, char **, off_t, int, int *, void *); -} drm_proc_list[] = { - { "name", drm_name_info }, - { "mem", drm_mem_info }, - { "vm", drm_vm_info }, - { "clients", drm_clients_info }, - { "queues", drm_queues_info }, - { "bufs", drm_bufs_info }, -#if DRM_DEBUG_CODE - { "vma", drm_vma_info }, -#endif -#if DRM_DMA_HISTOGRAM - { "histo", drm_histo_info }, -#endif -}; -#define DRM_PROC_ENTRIES (sizeof(drm_proc_list)/sizeof(drm_proc_list[0])) - -int drm_proc_init(drm_device_t *dev) -{ - struct proc_dir_entry *ent; - int i, j; - - drm_root = create_proc_entry("graphics", S_IFDIR, NULL); - if (!drm_root) { - DRM_ERROR("Cannot create /proc/graphics\n"); - return -1; - } - - /* Instead of doing this search, we should - add some global support for /proc/graphics. */ - for (i = 0; i < 8; i++) { - sprintf(drm_slot_name, "graphics/%d", i); - drm_dev_root = create_proc_entry(drm_slot_name, S_IFDIR, NULL); - if (!drm_dev_root) { - DRM_ERROR("Cannot create /proc/%s\n", drm_slot_name); - remove_proc_entry("graphics", NULL); - } - if (drm_dev_root->nlink == 2) break; - drm_dev_root = NULL; - } - if (!drm_dev_root) { - DRM_ERROR("Cannot find slot in /proc/graphics\n"); - return -1; - } - - for (i = 0; i < DRM_PROC_ENTRIES; i++) { - ent = create_proc_entry(drm_proc_list[i].name, - S_IFREG|S_IRUGO, drm_dev_root); - if (!ent) { - DRM_ERROR("Cannot create /proc/%s/%s\n", - drm_slot_name, drm_proc_list[i].name); - for (j = 0; j < i; j++) - remove_proc_entry(drm_proc_list[i].name, - drm_dev_root); - remove_proc_entry(drm_slot_name, NULL); - remove_proc_entry("graphics", NULL); - return -1; - } - ent->read_proc = drm_proc_list[i].f; - ent->data = dev; - } - - return 0; -} - - -int drm_proc_cleanup(void) -{ - int i; - - if (drm_root) { - if (drm_dev_root) { - for (i = 0; i < DRM_PROC_ENTRIES; i++) { - remove_proc_entry(drm_proc_list[i].name, - drm_dev_root); - } - remove_proc_entry(drm_slot_name, NULL); - } - remove_proc_entry("graphics", NULL); - remove_proc_entry(DRM_NAME, NULL); - } - drm_root = drm_dev_root = NULL; - return 0; -} - -static int drm_name_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - - if (offset > 0) return 0; /* no partial requests */ - len = 0; - *eof = 1; - - if (dev->unique) { - DRM_PROC_PRINT("%s 0x%x %s\n", - dev->name, dev->device, dev->unique); - } else { - DRM_PROC_PRINT("%s 0x%x\n", dev->name, dev->device); - } - return len; -} - -static int _drm_vm_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - drm_map_t *map; - const char *types[] = { "FB", "REG", "SHM", "AGP" }; - const char *type; - int i; - - if (offset > 0) return 0; /* no partial requests */ - len = 0; - *eof = 1; - DRM_PROC_PRINT("slot offset size type flags " - "address mtrr\n\n"); - for (i = 0; i < dev->map_count; i++) { - map = dev->maplist[i]; - if (map->type < 0 || map->type > 3) type = "??"; - else type = types[map->type]; - DRM_PROC_PRINT("%4d 0x%08lx 0x%08lx %4.4s 0x%02x 0x%08lx ", - i, - map->offset, - map->size, - type, - map->flags, - (unsigned long)map->handle); - if (map->mtrr < 0) { - DRM_PROC_PRINT("none\n"); - } else { - DRM_PROC_PRINT("%4d\n", map->mtrr); - } - } - - return len; -} - -static int drm_vm_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - int ret; - - down(&dev->struct_sem); - ret = _drm_vm_info(buf, start, offset, len, eof, data); - up(&dev->struct_sem); - return ret; -} - - -static int _drm_queues_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - int i; - drm_queue_t *q; - - if (offset > 0) return 0; /* no partial requests */ - len = 0; - *eof = 1; - DRM_PROC_PRINT(" ctx/flags use fin" - " blk/rw/rwf wait flushed queued" - " locks\n\n"); - for (i = 0; i < dev->queue_count; i++) { - q = dev->queuelist[i]; - atomic_inc(&q->use_count); - DRM_PROC_PRINT_RET(atomic_dec(&q->use_count), - "%5d/0x%03x %5d %5d" - " %5d/%c%c/%c%c%c %5Zd %10d %10d %10d\n", - i, - q->flags, - atomic_read(&q->use_count), - atomic_read(&q->finalization), - atomic_read(&q->block_count), - atomic_read(&q->block_read) ? 'r' : '-', - atomic_read(&q->block_write) ? 'w' : '-', - waitqueue_active(&q->read_queue) ? 'r':'-', - waitqueue_active(&q->write_queue) ? 'w':'-', - waitqueue_active(&q->flush_queue) ? 'f':'-', - DRM_BUFCOUNT(&q->waitlist), - atomic_read(&q->total_flushed), - atomic_read(&q->total_queued), - atomic_read(&q->total_locks)); - atomic_dec(&q->use_count); - } - - return len; -} - -static int drm_queues_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - int ret; - - down(&dev->struct_sem); - ret = _drm_queues_info(buf, start, offset, len, eof, data); - up(&dev->struct_sem); - return ret; -} - -/* drm_bufs_info is called whenever a process reads - /dev/drm/<dev>/bufs. */ - -static int _drm_bufs_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - drm_device_dma_t *dma = dev->dma; - int i; - - if (!dma) return 0; - if (offset > 0) return 0; /* no partial requests */ - len = 0; - *eof = 1; - DRM_PROC_PRINT(" o size count free segs pages kB\n\n"); - for (i = 0; i <= DRM_MAX_ORDER; i++) { - if (dma->bufs[i].buf_count) - DRM_PROC_PRINT("%2d %8d %5d %5d %5d %5d %5ld\n", - i, - dma->bufs[i].buf_size, - dma->bufs[i].buf_count, - atomic_read(&dma->bufs[i] - .freelist.count), - dma->bufs[i].seg_count, - dma->bufs[i].seg_count - *(1 << dma->bufs[i].page_order), - (dma->bufs[i].seg_count - * (1 << dma->bufs[i].page_order)) - * PAGE_SIZE / 1024); - } - DRM_PROC_PRINT("\n"); - for (i = 0; i < dma->buf_count; i++) { - if (i && !(i%32)) DRM_PROC_PRINT("\n"); - DRM_PROC_PRINT(" %d", dma->buflist[i]->list); - } - DRM_PROC_PRINT("\n"); - - return len; -} - -static int drm_bufs_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - int ret; - - down(&dev->struct_sem); - ret = _drm_bufs_info(buf, start, offset, len, eof, data); - up(&dev->struct_sem); - return ret; -} - - -static int _drm_clients_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - drm_file_t *priv; - - if (offset > 0) return 0; /* no partial requests */ - len = 0; - *eof = 1; - DRM_PROC_PRINT("a dev pid uid magic ioctls\n\n"); - for (priv = dev->file_first; priv; priv = priv->next) { - DRM_PROC_PRINT("%c %3d %5d %5d %10u %10lu\n", - priv->authenticated ? 'y' : 'n', - priv->minor, - priv->pid, - priv->uid, - priv->magic, - priv->ioctl_count); - } - - return len; -} - -static int drm_clients_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - int ret; - - down(&dev->struct_sem); - ret = _drm_clients_info(buf, start, offset, len, eof, data); - up(&dev->struct_sem); - return ret; -} - -#if DRM_DEBUG_CODE - -static int _drm_vma_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - drm_vma_entry_t *pt; - pgd_t *pgd; - pmd_t *pmd; - pte_t *pte; - unsigned long i; - struct vm_area_struct *vma; - unsigned long address; -#if defined(__i386__) - unsigned int pgprot; -#endif - - if (offset > 0) return 0; /* no partial requests */ - len = 0; - *eof = 1; - DRM_PROC_PRINT("vma use count: %d, high_memory = %p, 0x%08lx\n", - atomic_read(&dev->vma_count), - high_memory, virt_to_phys(high_memory)); - for (pt = dev->vmalist; pt; pt = pt->next) { - if (!(vma = pt->vma)) continue; - DRM_PROC_PRINT("\n%5d 0x%08lx-0x%08lx %c%c%c%c%c%c 0x%08lx", - pt->pid, - vma->vm_start, - vma->vm_end, - vma->vm_flags & VM_READ ? 'r' : '-', - vma->vm_flags & VM_WRITE ? 'w' : '-', - vma->vm_flags & VM_EXEC ? 'x' : '-', - vma->vm_flags & VM_MAYSHARE ? 's' : 'p', - vma->vm_flags & VM_LOCKED ? 'l' : '-', - vma->vm_flags & VM_IO ? 'i' : '-', - vma->vm_offset ); -#if defined(__i386__) - pgprot = pgprot_val(vma->vm_page_prot); - DRM_PROC_PRINT(" %c%c%c%c%c%c%c%c%c", - pgprot & _PAGE_PRESENT ? 'p' : '-', - pgprot & _PAGE_RW ? 'w' : 'r', - pgprot & _PAGE_USER ? 'u' : 's', - pgprot & _PAGE_PWT ? 't' : 'b', - pgprot & _PAGE_PCD ? 'u' : 'c', - pgprot & _PAGE_ACCESSED ? 'a' : '-', - pgprot & _PAGE_DIRTY ? 'd' : '-', - pgprot & _PAGE_4M ? 'm' : 'k', - pgprot & _PAGE_GLOBAL ? 'g' : 'l' ); -#endif - DRM_PROC_PRINT("\n"); - for (i = vma->vm_start; i < vma->vm_end; i += PAGE_SIZE) { - pgd = pgd_offset(vma->vm_mm, i); - pmd = pmd_offset(pgd, i); - pte = pte_offset(pmd, i); - if (pte_present(*pte)) { - address = __pa(pte_page(*pte)) - + (i & (PAGE_SIZE-1)); - DRM_PROC_PRINT(" 0x%08lx -> 0x%08lx" - " %c%c%c%c%c\n", - i, - address, - pte_read(*pte) ? 'r' : '-', - pte_write(*pte) ? 'w' : '-', - pte_exec(*pte) ? 'x' : '-', - pte_dirty(*pte) ? 'd' : '-', - pte_young(*pte) ? 'a' : '-' ); - } else { - DRM_PROC_PRINT(" 0x%08lx\n", i); - } - } - } - - return len; -} - -static int drm_vma_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - int ret; - - down(&dev->struct_sem); - ret = _drm_vma_info(buf, start, offset, len, eof, data); - up(&dev->struct_sem); - return ret; -} -#endif - - -#if DRM_DMA_HISTOGRAM -static int _drm_histo_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - drm_device_dma_t *dma = dev->dma; - int i; - unsigned long slot_value = DRM_DMA_HISTOGRAM_INITIAL; - unsigned long prev_value = 0; - drm_buf_t *buffer; - - if (offset > 0) return 0; /* no partial requests */ - len = 0; - *eof = 1; - - DRM_PROC_PRINT("general statistics:\n"); - DRM_PROC_PRINT("total %10u\n", atomic_read(&dev->histo.total)); - DRM_PROC_PRINT("open %10u\n", atomic_read(&dev->total_open)); - DRM_PROC_PRINT("close %10u\n", atomic_read(&dev->total_close)); - DRM_PROC_PRINT("ioctl %10u\n", atomic_read(&dev->total_ioctl)); - DRM_PROC_PRINT("irq %10u\n", atomic_read(&dev->total_irq)); - DRM_PROC_PRINT("ctx %10u\n", atomic_read(&dev->total_ctx)); - - DRM_PROC_PRINT("\nlock statistics:\n"); - DRM_PROC_PRINT("locks %10u\n", atomic_read(&dev->total_locks)); - DRM_PROC_PRINT("unlocks %10u\n", atomic_read(&dev->total_unlocks)); - DRM_PROC_PRINT("contends %10u\n", atomic_read(&dev->total_contends)); - DRM_PROC_PRINT("sleeps %10u\n", atomic_read(&dev->total_sleeps)); - - - if (dma) { - DRM_PROC_PRINT("\ndma statistics:\n"); - DRM_PROC_PRINT("prio %10u\n", - atomic_read(&dma->total_prio)); - DRM_PROC_PRINT("bytes %10u\n", - atomic_read(&dma->total_bytes)); - DRM_PROC_PRINT("dmas %10u\n", - atomic_read(&dma->total_dmas)); - DRM_PROC_PRINT("missed:\n"); - DRM_PROC_PRINT(" dma %10u\n", - atomic_read(&dma->total_missed_dma)); - DRM_PROC_PRINT(" lock %10u\n", - atomic_read(&dma->total_missed_lock)); - DRM_PROC_PRINT(" free %10u\n", - atomic_read(&dma->total_missed_free)); - DRM_PROC_PRINT(" sched %10u\n", - atomic_read(&dma->total_missed_sched)); - DRM_PROC_PRINT("tried %10u\n", - atomic_read(&dma->total_tried)); - DRM_PROC_PRINT("hit %10u\n", - atomic_read(&dma->total_hit)); - DRM_PROC_PRINT("lost %10u\n", - atomic_read(&dma->total_lost)); - - buffer = dma->next_buffer; - if (buffer) { - DRM_PROC_PRINT("next_buffer %7d\n", buffer->idx); - } else { - DRM_PROC_PRINT("next_buffer none\n"); - } - buffer = dma->this_buffer; - if (buffer) { - DRM_PROC_PRINT("this_buffer %7d\n", buffer->idx); - } else { - DRM_PROC_PRINT("this_buffer none\n"); - } - } - - - DRM_PROC_PRINT("\nvalues:\n"); - if (dev->lock.hw_lock) { - DRM_PROC_PRINT("lock 0x%08x\n", - dev->lock.hw_lock->lock); - } else { - DRM_PROC_PRINT("lock none\n"); - } - DRM_PROC_PRINT("context_flag 0x%08x\n", dev->context_flag); - DRM_PROC_PRINT("interrupt_flag 0x%08x\n", dev->interrupt_flag); - DRM_PROC_PRINT("dma_flag 0x%08x\n", dev->dma_flag); - - DRM_PROC_PRINT("queue_count %10d\n", dev->queue_count); - DRM_PROC_PRINT("last_context %10d\n", dev->last_context); - DRM_PROC_PRINT("last_switch %10lu\n", dev->last_switch); - DRM_PROC_PRINT("last_checked %10d\n", dev->last_checked); - - - DRM_PROC_PRINT("\n q2d d2c c2f" - " q2c q2f dma sch" - " ctx lacq lhld\n\n"); - for (i = 0; i < DRM_DMA_HISTOGRAM_SLOTS; i++) { - DRM_PROC_PRINT("%s %10lu %10u %10u %10u %10u %10u" - " %10u %10u %10u %10u %10u\n", - i == DRM_DMA_HISTOGRAM_SLOTS - 1 ? ">=" : "< ", - i == DRM_DMA_HISTOGRAM_SLOTS - 1 - ? prev_value : slot_value , - - atomic_read(&dev->histo - .queued_to_dispatched[i]), - atomic_read(&dev->histo - .dispatched_to_completed[i]), - atomic_read(&dev->histo - .completed_to_freed[i]), - - atomic_read(&dev->histo - .queued_to_completed[i]), - atomic_read(&dev->histo - .queued_to_freed[i]), - atomic_read(&dev->histo.dma[i]), - atomic_read(&dev->histo.schedule[i]), - atomic_read(&dev->histo.ctx[i]), - atomic_read(&dev->histo.lacq[i]), - atomic_read(&dev->histo.lhld[i])); - prev_value = slot_value; - slot_value = DRM_DMA_HISTOGRAM_NEXT(slot_value); - } - return len; -} - -static int drm_histo_info(char *buf, char **start, off_t offset, int len, - int *eof, void *data) -{ - drm_device_t *dev = (drm_device_t *)data; - int ret; - - down(&dev->struct_sem); - ret = _drm_histo_info(buf, start, offset, len, eof, data); - up(&dev->struct_sem); - return ret; -} -#endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/vm.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/vm.c deleted file mode 100644 index 00e66f3ef..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/vm.c +++ /dev/null @@ -1,104 +0,0 @@ -/* vm.c -- Memory mapping for DRM -*- c -*- - * Created: Mon Jan 4 08:58:31 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" - -#include <vm/vm.h> -#include <vm/pmap.h> - -static int drm_dma_mmap(dev_t kdev, vm_offset_t offset, int prot) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - unsigned long physical; - unsigned long page; - - if (!dma) return -1; /* Error */ - if (!dma->pagelist) return -1; /* Nothing allocated */ - - page = offset >> PAGE_SHIFT; - physical = dma->pagelist[page]; - - DRM_DEBUG("0x%08x (page %lu) => 0x%08lx\n", offset, page, physical); - return atop(physical); -} - -int drm_mmap(dev_t kdev, vm_offset_t offset, int prot) -{ - drm_device_t *dev = kdev->si_drv1; - drm_map_t *map = NULL; - int i; - - /* DRM_DEBUG("offset = 0x%x\n", offset); */ - - if (dev->dma - && offset >= 0 - && offset < ptoa(dev->dma->page_count)) - return drm_dma_mmap(kdev, offset, prot); - - /* A sequential search of a linked list is - fine here because: 1) there will only be - about 5-10 entries in the list and, 2) a - DRI client only has to do this mapping - once, so it doesn't have to be optimized - for performance, even if the list was a - bit longer. */ - for (i = 0; i < dev->map_count; i++) { - map = dev->maplist[i]; - /* DRM_DEBUG("considering 0x%x..0x%x\n", map->offset, map->offset + map->size - 1); */ - if (offset >= map->offset - && offset < map->offset + map->size) break; - } - - if (i >= dev->map_count) { - DRM_DEBUG("can't find map\n"); - return -1; - } - if (!map || ((map->flags&_DRM_RESTRICTED) && suser(curproc))) { - DRM_DEBUG("restricted map\n"); - return -1; - } - - switch (map->type) { - case _DRM_FRAME_BUFFER: - case _DRM_REGISTERS: - case _DRM_AGP: - return atop(offset); - case _DRM_SHM: - return atop(vtophys(offset)); - default: - return -1; /* This should never happen. */ - } - DRM_DEBUG("bailing out\n"); - - return -1; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drmP.h b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drmP.h index 7a1159c78..ead40f86b 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drmP.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drmP.h @@ -1,8 +1,8 @@ -/* drmP.h -- Private header for Direct Rendering Manager -*- c -*- +/* drmP.h -- Private header for Direct Rendering Manager -*- linux-c -*- * Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com - * Revised: Tue Oct 12 08:51:07 1999 by faith@precisioninsight.com * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. * All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a @@ -11,225 +11,119 @@ * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * VA LINUX SYSTEMS AND/OR ITS 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. - * - * $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmP.h,v 1.58 1999/08/30 13:05:00 faith Exp $ - * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drmP.h,v 1.3 2001/03/06 16:45:26 dawes Exp $ - * + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Rickard E. (Rik) Faith <faith@valinux.com> + * Gareth Hughes <gareth@valinux.com> */ #ifndef _DRM_P_H_ #define _DRM_P_H_ -#ifdef _KERNEL -#include <sys/param.h> -#include <sys/queue.h> -#include <sys/malloc.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/systm.h> -#include <sys/conf.h> -#include <sys/stat.h> -#include <sys/proc.h> -#include <sys/lock.h> -#include <sys/fcntl.h> -#include <sys/uio.h> -#include <sys/filio.h> -#include <sys/sysctl.h> -#include <sys/select.h> -#include <sys/bus.h> -#if __FreeBSD_version >= 400005 -#include <sys/taskqueue.h> -#endif +#if defined(_KERNEL) || defined(__KERNEL__) -#if __FreeBSD_version >= 400006 -#define DRM_AGP +/* DRM template customization defaults + */ +#ifndef __HAVE_AGP +#define __HAVE_AGP 0 #endif - -#ifdef DRM_AGP -#include <pci/agpvar.h> +#ifndef __HAVE_MTRR +#define __HAVE_MTRR 0 +#endif +#ifndef __HAVE_CTX_BITMAP +#define __HAVE_CTX_BITMAP 0 +#endif +#ifndef __HAVE_DMA +#define __HAVE_DMA 0 +#endif +#ifndef __HAVE_DMA_IRQ +#define __HAVE_DMA_IRQ 0 +#endif +#ifndef __HAVE_DMA_WAITLIST +#define __HAVE_DMA_WAITLIST 0 +#endif +#ifndef __HAVE_DMA_FREELIST +#define __HAVE_DMA_FREELIST 0 +#endif +#ifndef __HAVE_DMA_HISTOGRAM +#define __HAVE_DMA_HISTOGRAM 0 #endif -#include "drm.h" +#define DRM_DEBUG_CODE 0 /* Include debugging code (if > 1, then + also include looping detection. */ -typedef u_int32_t atomic_t; -typedef u_int32_t cycles_t; -typedef u_int32_t spinlock_t; -#define atomic_set(p, v) (*(p) = (v)) -#define atomic_read(p) (*(p)) -#define atomic_inc(p) atomic_add_int(p, 1) -#define atomic_dec(p) atomic_subtract_int(p, 1) -#define atomic_add(n, p) atomic_add_int(p, n) -#define atomic_sub(n, p) atomic_subtract_int(p, n) - -/* The version number here is a guess */ -#if __FreeBSD_version >= 500010 -#define callout_init(a) callout_init(a, 0) -#endif +typedef struct drm_device drm_device_t; +typedef struct drm_file drm_file_t; -/* Fake this */ -static __inline u_int32_t -test_and_set_bit(int b, volatile u_int32_t *p) -{ - int s = splhigh(); - u_int32_t m = 1<<b; - u_int32_t r = *p & m; - *p |= m; - splx(s); - return r; -} - -static __inline void -clear_bit(int b, volatile u_int32_t *p) -{ - atomic_clear_int(p + (b >> 5), 1 << (b & 0x1f)); -} - -static __inline void -set_bit(int b, volatile u_int32_t *p) -{ - atomic_set_int(p + (b >> 5), 1 << (b & 0x1f)); -} - -static __inline int -test_bit(int b, volatile u_int32_t *p) -{ - return p[b >> 5] & (1 << (b & 0x1f)); -} - -static __inline int -find_first_zero_bit(volatile u_int32_t *p, int max) -{ - int b; - - for (b = 0; b < max; b += 32) { - if (p[b >> 5] != ~0) { - for (;;) { - if ((p[b >> 5] & (1 << (b & 0x1f))) == 0) - return b; - b++; - } - } - } - return max; -} - -#define spldrm() spltty() - -#define memset(p, v, s) bzero(p, s) - -/* - * Fake out the module macros for versions of FreeBSD where they don't - * exist. - */ -#if __FreeBSD_version < 400002 +/* There's undoubtably more of this file to go into these OS dependent ones. */ -#define MODULE_VERSION(a,b) struct __hack -#define MODULE_DEPEND(a,b,c,d,e) struct __hack +#include "drm_os_freebsd.h" -#endif +#include "drm.h" -#define DRM_DEBUG_CODE 0 /* Include debugging code (if > 1, then - also include looping detection. */ -#define DRM_DMA_HISTOGRAM 1 /* Make histogram of DMA latency. */ +/* Begin the DRM... */ #define DRM_HASH_SIZE 16 /* Size of key hash table */ #define DRM_KERNEL_CONTEXT 0 /* Change drm_resctx if changed */ #define DRM_RESERVED_CONTEXTS 1 /* Change drm_resctx if changed */ #define DRM_LOOPING_LIMIT 5000000 #define DRM_BSZ 1024 /* Buffer size for /dev/drm? output */ -#define DRM_TIME_SLICE (hz/20) /* Time slice for GLXContexts */ #define DRM_LOCK_SLICE 1 /* Time slice for lock, in jiffies */ #define DRM_FLAG_DEBUG 0x01 #define DRM_FLAG_NOCTX 0x02 -#define DRM_MEM_DMA 0 -#define DRM_MEM_SAREA 1 -#define DRM_MEM_DRIVER 2 -#define DRM_MEM_MAGIC 3 -#define DRM_MEM_IOCTLS 4 -#define DRM_MEM_MAPS 5 -#define DRM_MEM_VMAS 6 -#define DRM_MEM_BUFS 7 -#define DRM_MEM_SEGS 8 -#define DRM_MEM_PAGES 9 -#define DRM_MEM_FILES 10 -#define DRM_MEM_QUEUES 11 -#define DRM_MEM_CMDS 12 -#define DRM_MEM_MAPPINGS 13 -#define DRM_MEM_BUFLISTS 14 +#define DRM_MEM_DMA 0 +#define DRM_MEM_SAREA 1 +#define DRM_MEM_DRIVER 2 +#define DRM_MEM_MAGIC 3 +#define DRM_MEM_IOCTLS 4 +#define DRM_MEM_MAPS 5 +#define DRM_MEM_VMAS 6 +#define DRM_MEM_BUFS 7 +#define DRM_MEM_SEGS 8 +#define DRM_MEM_PAGES 9 +#define DRM_MEM_FILES 10 +#define DRM_MEM_QUEUES 11 +#define DRM_MEM_CMDS 12 +#define DRM_MEM_MAPPINGS 13 +#define DRM_MEM_BUFLISTS 14 #define DRM_MEM_AGPLISTS 15 #define DRM_MEM_TOTALAGP 16 #define DRM_MEM_BOUNDAGP 17 #define DRM_MEM_CTXBITMAP 18 +#define DRM_MEM_STUB 19 +#define DRM_MEM_SGLISTS 20 #define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8) /* Backward compatibility section */ + /* _PAGE_WT changed to _PAGE_PWT in 2.2.6 */ #ifndef _PAGE_PWT - /* The name of _PAGE_WT was changed to - _PAGE_PWT in Linux 2.2.6 */ #define _PAGE_PWT _PAGE_WT #endif -#define __drm_dummy_lock(lock) (*(__volatile__ unsigned int *)lock) -#define _DRM_CAS(lock,old,new,__ret) \ - do { \ - int __dummy; /* Can't mark eax as clobbered */ \ - __asm__ __volatile__( \ - "lock ; cmpxchg %4,%1\n\t" \ - "setnz %0" \ - : "=d" (__ret), \ - "=m" (__drm_dummy_lock(lock)), \ - "=a" (__dummy) \ - : "2" (old), \ - "r" (new)); \ - } while (0) - + /* Mapping helper macros */ +#define DRM_IOREMAP(map) \ + (map)->handle = DRM(ioremap)( (map)->offset, (map)->size ) - - /* Macros to make printk easier */ -#define DRM_ERROR(fmt, arg...) \ - printf("error: " "[" DRM_NAME ":" __FUNCTION__ "] *ERROR* " fmt , ##arg) -#define DRM_MEM_ERROR(area, fmt, arg...) \ - printf("error: " "[" DRM_NAME ":" __FUNCTION__ ":%s] *ERROR* " fmt , \ - drm_mem_stats[area].name , ##arg) -#define DRM_INFO(fmt, arg...) printf("info: " "[" DRM_NAME "] " fmt , ##arg) - -#if DRM_DEBUG_CODE -#define DRM_DEBUG(fmt, arg...) \ - do { \ - if (drm_flags&DRM_FLAG_DEBUG) \ - printf("[" DRM_NAME ":" __FUNCTION__ "] " fmt , \ - ##arg); \ +#define DRM_IOREMAPFREE(map) \ + do { \ + if ( (map)->handle && (map)->size ) \ + DRM(ioremapfree)( (map)->handle, (map)->size ); \ } while (0) -#else -#define DRM_DEBUG(fmt, arg...) do { } while (0) -#endif - -#define DRM_PROC_LIMIT (PAGE_SIZE-80) - -#define DRM_SYSCTL_PRINT(fmt, arg...) \ - snprintf(buf, sizeof(buf), fmt, ##arg); \ - error = SYSCTL_OUT(req, buf, strlen(buf)); \ - if (error) return error; - -#define DRM_SYSCTL_PRINT_RET(ret, fmt, arg...) \ - snprintf(buf, sizeof(buf), fmt, ##arg); \ - error = SYSCTL_OUT(req, buf, strlen(buf)); \ - if (error) { ret; return error; } /* Internal types and structures */ #define DRM_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) @@ -240,15 +134,25 @@ find_first_zero_bit(volatile u_int32_t *p, int max) #define DRM_BUFCOUNT(x) ((x)->count - DRM_LEFTCOUNT(x)) #define DRM_WAITCOUNT(dev,idx) DRM_BUFCOUNT(&dev->queuelist[idx]->waitlist) +#define DRM_GET_PRIV_SAREA(_dev, _ctx, _map) do { \ + (_map) = (_dev)->context_sareas[_ctx]; \ +} while(0) + + +typedef struct drm_pci_list { + u16 vendor; + u16 device; +} drm_pci_list_t; + typedef struct drm_ioctl_desc { - d_ioctl_t *func; + d_ioctl_t *func; int auth_needed; int root_only; } drm_ioctl_desc_t; typedef struct drm_devstate { pid_t owner; /* X server pid holding x_lock */ - + } drm_devstate_t; typedef struct drm_magic_entry { @@ -258,8 +162,8 @@ typedef struct drm_magic_entry { } drm_magic_entry_t; typedef struct drm_magic_head { - struct drm_magic_entry *head; - struct drm_magic_entry *tail; + struct drm_magic_entry *head; + struct drm_magic_entry *tail; } drm_magic_head_t; typedef struct drm_vma_entry { @@ -279,7 +183,7 @@ typedef struct drm_buf { struct drm_buf *next; /* Kernel-only: used for free list */ __volatile__ int waiting; /* On kernel DMA queue */ __volatile__ int pending; /* On hardware DMA queue */ - int dma_wait; /* Processes waiting */ + wait_queue_head_t dma_wait; /* Processes waiting */ pid_t pid; /* PID of holding process */ int context; /* Kernel queue for this buffer */ int while_locked;/* Dispatch this buffer while locked */ @@ -292,15 +196,15 @@ typedef struct drm_buf { DRM_LIST_RECLAIM = 5 } list; /* Which list we're on */ - void *dev_private; - int dev_priv_size; - #if DRM_DMA_HISTOGRAM - struct timespec time_queued; /* Queued to kernel DMA queue */ - struct timespec time_dispatched; /* Dispatched to hardware */ - struct timespec time_completed; /* Completed by hardware */ - struct timespec time_freed; /* Back on freelist */ + cycles_t time_queued; /* Queued to kernel DMA queue */ + cycles_t time_dispatched; /* Dispatched to hardware */ + cycles_t time_completed; /* Completed by hardware */ + cycles_t time_freed; /* Back on freelist */ #endif + + int dev_priv_size; /* Size of buffer private stoarge */ + void *dev_private; /* Per-buffer private storage */ } drm_buf_t; #if DRM_DMA_HISTOGRAM @@ -309,14 +213,14 @@ typedef struct drm_buf { #define DRM_DMA_HISTOGRAM_NEXT(current) ((current)*10) typedef struct drm_histogram { atomic_t total; - + atomic_t queued_to_dispatched[DRM_DMA_HISTOGRAM_SLOTS]; atomic_t dispatched_to_completed[DRM_DMA_HISTOGRAM_SLOTS]; atomic_t completed_to_freed[DRM_DMA_HISTOGRAM_SLOTS]; - + atomic_t queued_to_completed[DRM_DMA_HISTOGRAM_SLOTS]; atomic_t queued_to_freed[DRM_DMA_HISTOGRAM_SLOTS]; - + atomic_t dma[DRM_DMA_HISTOGRAM_SLOTS]; atomic_t schedule[DRM_DMA_HISTOGRAM_SLOTS]; atomic_t ctx[DRM_DMA_HISTOGRAM_SLOTS]; @@ -332,20 +236,20 @@ typedef struct drm_waitlist { drm_buf_t **rp; /* Read pointer */ drm_buf_t **wp; /* Write pointer */ drm_buf_t **end; /* End pointer */ - spinlock_t read_lock; - spinlock_t write_lock; + DRM_OS_SPINTYPE read_lock; + DRM_OS_SPINTYPE write_lock; } drm_waitlist_t; typedef struct drm_freelist { int initialized; /* Freelist in use */ atomic_t count; /* Number of free buffers */ drm_buf_t *next; /* End pointer */ - - int waiting; /* Processes waiting on free bufs */ + + wait_queue_head_t waiting; /* Processes waiting on free bufs */ int low_mark; /* Low water mark */ int high_mark; /* High water mark */ atomic_t wfh; /* If waiting for high mark */ - struct simplelock lock; /* hope this doesn't need to be linux compatible */ + DRM_OS_SPINTYPE lock; } drm_freelist_t; typedef struct drm_buf_entry { @@ -365,7 +269,7 @@ typedef struct drm_hw_lock { } drm_hw_lock_t; typedef TAILQ_HEAD(drm_file_list, drm_file) drm_file_list_t; -typedef struct drm_file { +struct drm_file { TAILQ_ENTRY(drm_file) link; int authenticated; int minor; @@ -375,38 +279,40 @@ typedef struct drm_file { drm_magic_t magic; unsigned long ioctl_count; struct drm_device *devXX; -} drm_file_t; - +}; typedef struct drm_queue { atomic_t use_count; /* Outstanding uses (+1) */ atomic_t finalization; /* Finalization in progress */ atomic_t block_count; /* Count of processes waiting */ atomic_t block_read; /* Queue blocked for reads */ - int read_queue; /* Processes waiting on block_read */ + wait_queue_head_t read_queue; /* Processes waiting on block_read */ atomic_t block_write; /* Queue blocked for writes */ - int write_queue; /* Processes waiting on block_write */ + wait_queue_head_t write_queue; /* Processes waiting on block_write */ +#if 1 atomic_t total_queued; /* Total queued statistic */ atomic_t total_flushed;/* Total flushes statistic */ atomic_t total_locks; /* Total locks statistics */ +#endif drm_ctx_flags_t flags; /* Context preserving and 2D-only */ drm_waitlist_t waitlist; /* Pending buffers */ - int flush_queue; /* Processes waiting until flush */ + wait_queue_head_t flush_queue; /* Processes waiting until flush */ } drm_queue_t; typedef struct drm_lock_data { drm_hw_lock_t *hw_lock; /* Hardware lock */ pid_t pid; /* PID of lock holder (0=kernel) */ - int lock_queue; /* Queue of blocked processes */ + wait_queue_head_t lock_queue; /* Queue of blocked processes */ unsigned long lock_time; /* Time of last lock in jiffies */ } drm_lock_data_t; typedef struct drm_device_dma { +#if 0 /* Performance Counters */ atomic_t total_prio; /* Total DRM_DMA_PRIORITY */ atomic_t total_bytes; /* Total bytes DMA'd */ atomic_t total_dmas; /* Total DMA buffers dispatched */ - + atomic_t total_missed_dma; /* Missed drm_do_dma */ atomic_t total_missed_lock; /* Missed lock in drm_do_dma */ atomic_t total_missed_free; /* Missed drm_free_this_buffer */ @@ -415,27 +321,28 @@ typedef struct drm_device_dma { atomic_t total_tried; /* Tried next_buffer */ atomic_t total_hit; /* Sent next_buffer */ atomic_t total_lost; /* Lost interrupt */ +#endif drm_buf_entry_t bufs[DRM_MAX_ORDER+1]; int buf_count; drm_buf_t **buflist; /* Vector of pointers info bufs */ - int seg_count; + int seg_count; int page_count; - vm_offset_t *pagelist; + unsigned long *pagelist; unsigned long byte_count; enum { - _DRM_DMA_USE_AGP = 0x01 + _DRM_DMA_USE_AGP = 0x01, + _DRM_DMA_USE_SG = 0x02 } flags; /* DMA support */ drm_buf_t *this_buffer; /* Buffer being sent */ drm_buf_t *next_buffer; /* Selected buffer to send */ drm_queue_t *next_queue; /* Queue from which buffer selected*/ - int waiting; /* Processes waiting on free bufs */ + wait_queue_head_t waiting; /* Processes waiting on free bufs */ } drm_device_dma_t; -#ifdef DRM_AGP - +#if __REALLY_HAVE_AGP typedef struct drm_agp_mem { void *handle; unsigned long bound; /* address */ @@ -454,27 +361,45 @@ typedef struct drm_agp_head { int acquired; unsigned long base; int agp_mtrr; + int cant_use_aperture; + unsigned long page_mask; } drm_agp_head_t; - #endif -typedef struct drm_device { +typedef struct drm_sg_mem { + unsigned long handle; + void *virtual; + int pages; + struct page **pagelist; +} drm_sg_mem_t; + +typedef struct drm_sigdata { + int context; + drm_hw_lock_t *lock; +} drm_sigdata_t; + +typedef TAILQ_HEAD(drm_map_list, drm_map_list_entry) drm_map_list_t; +typedef struct drm_map_list_entry { + TAILQ_ENTRY(drm_map_list_entry) link; + drm_map_t *map; +} drm_map_list_entry_t; + +struct drm_device { const char *name; /* Simple driver name */ char *unique; /* Unique identifier: e.g., busid */ int unique_len; /* Length of unique field */ device_t device; /* Device instance from newbus */ dev_t devnode; /* Device number for mknod */ char *devname; /* For /proc/interrupts */ - + int blocked; /* Blocked due to VC switch? */ int flags; /* Flags to open(2) */ int writable; /* Opened with FWRITE */ struct proc_dir_entry *root; /* Root for this device's entries */ /* Locks */ - struct simplelock count_lock; /* For inuse, open_count, buf_use */ - struct lock dev_lock; /* For others */ - + DRM_OS_SPINTYPE count_lock; /* For inuse, open_count, buf_use */ + struct lock dev_lock; /* For others */ /* Usage Counters */ int open_count; /* Outstanding files open */ atomic_t ioctl_count; /* Outstanding IOCTLs pending */ @@ -482,26 +407,22 @@ typedef struct drm_device { int buf_use; /* Buffers in use -- cannot alloc */ atomic_t buf_alloc; /* Buffer allocation in progress */ - /* Performance Counters */ - atomic_t total_open; - atomic_t total_close; - atomic_t total_ioctl; - atomic_t total_irq; /* Total interruptions */ - atomic_t total_ctx; /* Total context switches */ - - atomic_t total_locks; - atomic_t total_unlocks; - atomic_t total_contends; - atomic_t total_sleeps; + /* Performance counters */ + unsigned long counters; + drm_stat_type_t types[15]; + atomic_t counts[15]; /* Authentication */ drm_file_list_t files; drm_magic_head_t magiclist[DRM_HASH_SIZE]; /* Memory management */ - drm_map_t **maplist; /* Vector of pointers to regions */ + drm_map_list_t *maplist; /* Linked list of regions */ int map_count; /* Number of mappable regions */ + drm_map_t **context_sareas; + int max_context; + drm_vma_entry_t *vmalist; /* List of vmas (for debugging) */ drm_lock_data_t lock; /* Information on hardware lock */ @@ -513,223 +434,199 @@ typedef struct drm_device { drm_device_dma_t *dma; /* Optional pointer for DMA support */ /* Context support */ - struct resource *irq; /* Interrupt used by board */ + int irq; /* Interrupt used by board */ + struct resource *irqr; /* Resource for interrupt used by board */ void *irqh; /* Handle from bus_setup_intr */ - __volatile__ long context_flag; /* Context swapping flag */ - __volatile__ long interrupt_flag;/* Interruption handler flag */ - __volatile__ long dma_flag; /* DMA dispatch flag */ - struct callout timer; /* Timer for delaying ctx switch */ - int context_wait; /* Processes waiting on ctx switch */ + __volatile__ long context_flag; /* Context swapping flag */ + __volatile__ long interrupt_flag; /* Interruption handler flag */ + __volatile__ long dma_flag; /* DMA dispatch flag */ + struct callout timer; /* Timer for delaying ctx switch */ + wait_queue_head_t context_wait; /* Processes waiting on ctx switch */ int last_checked; /* Last context checked for DMA */ int last_context; /* Last current context */ - int last_switch; /* Time at last context switch */ + unsigned long last_switch; /* jiffies at last context switch */ #if __FreeBSD_version >= 400005 - struct task task; + struct task task; #endif - struct timespec ctx_start; - struct timespec lck_start; -#if DRM_DMA_HISTOGRAM + cycles_t ctx_start; + cycles_t lck_start; +#if __HAVE_DMA_HISTOGRAM drm_histogram_t histo; #endif - + /* Callback to X server for context switch and for heavy-handed reset. */ char buf[DRM_BSZ]; /* Output buffer */ char *buf_rp; /* Read pointer */ char *buf_wp; /* Write pointer */ char *buf_end; /* End pointer */ - struct sigio *buf_sigio; /* Processes waiting for SIGIO */ + struct sigio *buf_sigio; /* Processes waiting for SIGIO */ struct selinfo buf_sel; /* Workspace for select/poll */ - int buf_readers; /* Processes waiting to read */ - int buf_writers; /* Processes waiting to ctx switch */ - int buf_selecting; /* True if poll sleeper */ + int buf_selecting;/* True if poll sleeper */ + wait_queue_head_t buf_readers; /* Processes waiting to read */ + wait_queue_head_t buf_writers; /* Processes waiting to ctx switch */ /* Sysctl support */ struct drm_sysctl_info *sysctl; -#ifdef DRM_AGP +#if __REALLY_HAVE_AGP drm_agp_head_t *agp; #endif - u_int32_t *ctx_bitmap; + struct pci_dev *pdev; +#ifdef __alpha__ +#if LINUX_VERSION_CODE < 0x020403 + struct pci_controler *hose; +#else + struct pci_controller *hose; +#endif +#endif + drm_sg_mem_t *sg; /* Scatter gather memory */ + unsigned long *ctx_bitmap; void *dev_private; -} drm_device_t; - - - /* Internal function definitions */ - - /* Misc. support (init.c) */ -extern int drm_flags; -extern void drm_parse_options(char *s); - - - /* Device support (fops.c) */ -extern drm_file_t *drm_find_file_by_proc(drm_device_t *dev, struct proc *p); -extern int drm_open_helper(dev_t kdev, int flags, int fmt, struct proc *p, - drm_device_t *dev); -extern d_close_t drm_close; -extern d_read_t drm_read; -extern d_write_t drm_write; -extern d_poll_t drm_poll; -extern int drm_fsetown(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p); -extern int drm_fgetown(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p); -extern int drm_write_string(drm_device_t *dev, const char *s); - -#if 0 - /* Mapping support (vm.c) */ -extern unsigned long drm_vm_nopage(struct vm_area_struct *vma, - unsigned long address, - int write_access); -extern unsigned long drm_vm_shm_nopage(struct vm_area_struct *vma, - unsigned long address, - int write_access); -extern unsigned long drm_vm_dma_nopage(struct vm_area_struct *vma, - unsigned long address, - int write_access); -extern void drm_vm_open(struct vm_area_struct *vma); -extern void drm_vm_close(struct vm_area_struct *vma); -extern int drm_mmap_dma(struct file *filp, - struct vm_area_struct *vma); + drm_sigdata_t sigdata; /* For block_all_signals */ + sigset_t sigmask; +}; + +extern int DRM(flags); +extern void DRM(parse_options)( char *s ); +extern int DRM(cpu_valid)( void ); + + /* Authentication (drm_auth.h) */ +extern int DRM(add_magic)(drm_device_t *dev, drm_file_t *priv, + drm_magic_t magic); +extern int DRM(remove_magic)(drm_device_t *dev, drm_magic_t magic); + + /* Driver support (drm_drv.h) */ +extern int DRM(version)( DRM_OS_IOCTL ); +extern int DRM(write_string)(drm_device_t *dev, const char *s); + + /* Memory management support (drm_memory.h) */ +extern void DRM(mem_init)(void); +extern void *DRM(alloc)(size_t size, int area); +extern void *DRM(realloc)(void *oldpt, size_t oldsize, size_t size, + int area); +extern char *DRM(strdup)(const char *s, int area); +extern void DRM(strfree)(char *s, int area); +extern void DRM(free)(void *pt, size_t size, int area); +extern unsigned long DRM(alloc_pages)(int order, int area); +extern void DRM(free_pages)(unsigned long address, int order, + int area); +extern void *DRM(ioremap)(unsigned long offset, unsigned long size); +extern void DRM(ioremapfree)(void *pt, unsigned long size); + +#if __REALLY_HAVE_AGP +extern agp_memory *DRM(alloc_agp)(int pages, u32 type); +extern int DRM(free_agp)(agp_memory *handle, int pages); +extern int DRM(bind_agp)(agp_memory *handle, unsigned int start); +extern int DRM(unbind_agp)(agp_memory *handle); #endif -extern d_mmap_t drm_mmap; - /* Proc support (proc.c) */ -extern int drm_sysctl_init(drm_device_t *dev); -extern int drm_sysctl_cleanup(drm_device_t *dev); +extern int DRM(context_switch)(drm_device_t *dev, int old, int new); +extern int DRM(context_switch_complete)(drm_device_t *dev, int new); - /* Memory management support (memory.c) */ -extern void drm_mem_init(void); +#if __HAVE_CTX_BITMAP +extern int DRM(ctxbitmap_init)( drm_device_t *dev ); +extern void DRM(ctxbitmap_cleanup)( drm_device_t *dev ); +extern void DRM(ctxbitmap_free)( drm_device_t *dev, int ctx_handle ); +extern int DRM(ctxbitmap_next)( drm_device_t *dev ); +#endif -#if __FreeBSD_version < 411000 -#define DRM_SYSCTL_HANDLER_ARGS SYSCTL_HANDLER_ARGS -#else -#define DRM_SYSCTL_HANDLER_ARGS (SYSCTL_HANDLER_ARGS) + /* Locking IOCTL support (drm_lock.h) */ +extern int DRM(lock_take)(__volatile__ unsigned int *lock, + unsigned int context); +extern int DRM(lock_transfer)(drm_device_t *dev, + __volatile__ unsigned int *lock, + unsigned int context); +extern int DRM(lock_free)(drm_device_t *dev, + __volatile__ unsigned int *lock, + unsigned int context); +extern int DRM(flush_unblock)(drm_device_t *dev, int context, + drm_lock_flags_t flags); +extern int DRM(flush_block_and_flush)(drm_device_t *dev, int context, + drm_lock_flags_t flags); +extern int DRM(notifier)(void *priv); + + /* Buffer management support (drm_bufs.h) */ +extern int DRM(order)( unsigned long size ); + +#if __HAVE_DMA + /* DMA support (drm_dma.h) */ +extern int DRM(dma_setup)(drm_device_t *dev); +extern void DRM(dma_takedown)(drm_device_t *dev); +extern void DRM(free_buffer)(drm_device_t *dev, drm_buf_t *buf); +extern void DRM(reclaim_buffers)(drm_device_t *dev, pid_t pid); +#if __HAVE_OLD_DMA +/* GH: This is a dirty hack for now... + */ +extern void DRM(clear_next_buffer)(drm_device_t *dev); +extern int DRM(select_queue)(drm_device_t *dev, + void (*wrapper)(unsigned long)); +extern int DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *dma); +extern int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma); +#endif +#if __HAVE_DMA_IRQ +extern int DRM(irq_install)( drm_device_t *dev, int irq ); +extern int DRM(irq_uninstall)( drm_device_t *dev ); +extern void DRM(dma_service)( DRM_OS_IRQ_ARGS ); +#if __HAVE_DMA_IRQ_BH +extern void DRM(dma_immediate_bh)( DRM_OS_TASKQUEUE_ARGS ); #endif -extern int drm_mem_info DRM_SYSCTL_HANDLER_ARGS; -extern void *drm_alloc(size_t size, int area); -extern void *drm_realloc(void *oldpt, size_t oldsize, size_t size, - int area); -extern char *drm_strdup(const char *s, int area); -extern void drm_strfree(char *s, int area); -extern void drm_free(void *pt, size_t size, int area); -extern unsigned long drm_alloc_pages(int order, int area); -extern void drm_free_pages(unsigned long address, int order, - int area); -extern void *drm_ioremap(unsigned long offset, unsigned long size); -extern void drm_ioremapfree(void *pt, unsigned long size); - -#ifdef DRM_AGP -extern void *drm_alloc_agp(int pages, u_int32_t type); -extern int drm_free_agp(void *handle, int pages); -extern int drm_bind_agp(void *handle, unsigned int start); -extern int drm_unbind_agp(void *handle); #endif - - /* Buffer management support (bufs.c) */ -extern int drm_order(unsigned long size); -extern d_ioctl_t drm_addmap; -extern d_ioctl_t drm_addbufs; -extern d_ioctl_t drm_infobufs; -extern d_ioctl_t drm_markbufs; -extern d_ioctl_t drm_freebufs; -extern d_ioctl_t drm_mapbufs; - - - /* Buffer list management support (lists.c) */ -extern int drm_waitlist_create(drm_waitlist_t *bl, int count); -extern int drm_waitlist_destroy(drm_waitlist_t *bl); -extern int drm_waitlist_put(drm_waitlist_t *bl, drm_buf_t *buf); -extern drm_buf_t *drm_waitlist_get(drm_waitlist_t *bl); - -extern int drm_freelist_create(drm_freelist_t *bl, int count); -extern int drm_freelist_destroy(drm_freelist_t *bl); -extern int drm_freelist_put(drm_device_t *dev, drm_freelist_t *bl, - drm_buf_t *buf); -extern drm_buf_t *drm_freelist_get(drm_freelist_t *bl, int block); - - /* DMA support (gen_dma.c) */ -extern void drm_dma_setup(drm_device_t *dev); -extern void drm_dma_takedown(drm_device_t *dev); -extern void drm_free_buffer(drm_device_t *dev, drm_buf_t *buf); -extern void drm_reclaim_buffers(drm_device_t *dev, pid_t pid); -extern int drm_context_switch(drm_device_t *dev, int old, int new); -extern int drm_context_switch_complete(drm_device_t *dev, int new); -extern void drm_wakeup(drm_device_t *dev, drm_buf_t *buf); -extern void drm_clear_next_buffer(drm_device_t *dev); -extern int drm_select_queue(drm_device_t *dev, - void (*wrapper)(void *)); -extern int drm_dma_enqueue(drm_device_t *dev, drm_dma_t *dma); -extern int drm_dma_get_buffers(drm_device_t *dev, drm_dma_t *dma); #if DRM_DMA_HISTOGRAM -extern int drm_histogram_slot(struct timespec *ts); -extern void drm_histogram_compute(drm_device_t *dev, drm_buf_t *buf); +extern int DRM(histogram_slot)(unsigned long count); +extern void DRM(histogram_compute)(drm_device_t *dev, drm_buf_t *buf); #endif + /* Buffer list support (drm_lists.h) */ +#if __HAVE_DMA_WAITLIST +extern int DRM(waitlist_create)(drm_waitlist_t *bl, int count); +extern int DRM(waitlist_destroy)(drm_waitlist_t *bl); +extern int DRM(waitlist_put)(drm_waitlist_t *bl, drm_buf_t *buf); +extern drm_buf_t *DRM(waitlist_get)(drm_waitlist_t *bl); +#endif +#if __HAVE_DMA_FREELIST +extern int DRM(freelist_create)(drm_freelist_t *bl, int count); +extern int DRM(freelist_destroy)(drm_freelist_t *bl); +extern int DRM(freelist_put)(drm_device_t *dev, drm_freelist_t *bl, + drm_buf_t *buf); +extern drm_buf_t *DRM(freelist_get)(drm_freelist_t *bl, int block); +#endif +#endif /* __HAVE_DMA */ + +#if __REALLY_HAVE_AGP + /* AGP/GART support (drm_agpsupport.h) */ +extern drm_agp_head_t *DRM(agp_init)(void); +extern void DRM(agp_uninit)(void); +extern void DRM(agp_do_release)(void); +extern agp_memory *DRM(agp_allocate_memory)(size_t pages, u32 type); +extern int DRM(agp_free_memory)(agp_memory *handle); +extern int DRM(agp_bind_memory)(agp_memory *handle, off_t start); +extern int DRM(agp_unbind_memory)(agp_memory *handle); +#endif - /* Misc. IOCTL support (ioctl.c) */ -extern d_ioctl_t drm_irq_busid; -extern d_ioctl_t drm_getunique; -extern d_ioctl_t drm_setunique; - - - /* Context IOCTL support (context.c) */ -extern d_ioctl_t drm_resctx; -extern d_ioctl_t drm_addctx; -extern d_ioctl_t drm_modctx; -extern d_ioctl_t drm_getctx; -extern d_ioctl_t drm_switchctx; -extern d_ioctl_t drm_newctx; -extern d_ioctl_t drm_rmctx; - - - /* Drawable IOCTL support (drawable.c) */ -extern d_ioctl_t drm_adddraw; -extern d_ioctl_t drm_rmdraw; - - - /* Authentication IOCTL support (auth.c) */ -extern int drm_add_magic(drm_device_t *dev, drm_file_t *priv, - drm_magic_t magic); -extern int drm_remove_magic(drm_device_t *dev, drm_magic_t magic); -extern d_ioctl_t drm_getmagic; -extern d_ioctl_t drm_authmagic; - - - /* Locking IOCTL support (lock.c) */ -extern d_ioctl_t drm_block; -extern d_ioctl_t drm_unblock; -extern int drm_lock_take(__volatile__ unsigned int *lock, - unsigned int context); -extern int drm_lock_transfer(drm_device_t *dev, - __volatile__ unsigned int *lock, - unsigned int context); -extern int drm_lock_free(drm_device_t *dev, - __volatile__ unsigned int *lock, - unsigned int context); -extern d_ioctl_t drm_finish; -extern int drm_flush_unblock(drm_device_t *dev, int context, - drm_lock_flags_t flags); -extern int drm_flush_block_and_flush(drm_device_t *dev, int context, - drm_lock_flags_t flags); - - /* Context Bitmap support (ctxbitmap.c) */ -extern int drm_ctxbitmap_init(drm_device_t *dev); -extern void drm_ctxbitmap_cleanup(drm_device_t *dev); -extern int drm_ctxbitmap_next(drm_device_t *dev); -extern void drm_ctxbitmap_free(drm_device_t *dev, int ctx_handle); - -#ifdef DRM_AGP - /* AGP/GART support (agpsupport.c) */ -extern drm_agp_head_t *drm_agp_init(void); -extern d_ioctl_t drm_agp_acquire; -extern d_ioctl_t drm_agp_release; -extern d_ioctl_t drm_agp_enable; -extern d_ioctl_t drm_agp_info; -extern d_ioctl_t drm_agp_alloc; -extern d_ioctl_t drm_agp_free; -extern d_ioctl_t drm_agp_unbind; -extern d_ioctl_t drm_agp_bind; + /* Proc support (drm_proc.h) */ +extern struct proc_dir_entry *DRM(proc_init)(drm_device_t *dev, + int minor, + struct proc_dir_entry *root, + struct proc_dir_entry **dev_root); +extern int DRM(proc_cleanup)(int minor, + struct proc_dir_entry *root, + struct proc_dir_entry *dev_root); + +#if __HAVE_SG + /* Scatter Gather Support (drm_scatter.h) */ +extern void DRM(sg_cleanup)(drm_sg_mem_t *entry); #endif + +#if __REALLY_HAVE_SG + /* ATI PCIGART support (ati_pcigart.h) */ +extern int DRM(ati_pcigart_init)(drm_device_t *dev, + unsigned long *addr, + dma_addr_t *bus_addr); +extern int DRM(ati_pcigart_cleanup)(drm_device_t *dev, + unsigned long addr, + dma_addr_t bus_addr); #endif + +#endif /* __KERNEL__ */ #endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/agpsupport.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_agpsupport.h index f399171e1..ac12c867a 100644..100755 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/agpsupport.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_agpsupport.h @@ -1,4 +1,4 @@ -/* agpsupport.c -- DRM support for AGP/GART backend +/* drm_agpsupport.h -- DRM support for AGP/GART backend -*- linux-c -*- * Created: Mon Dec 13 09:56:45 1999 by faith@precisioninsight.com * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. @@ -11,41 +11,39 @@ * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * VA LINUX SYSTEMS AND/OR ITS 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. - * - * Author: Rickard E. (Rik) Faith <faith@valinux.com> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. * + * Author: + * Rickard E. (Rik) Faith <faith@valinux.com> + * Gareth Hughes <gareth@valinux.com> */ -#define __NO_VERSION__ #include "drmP.h" -#ifdef DRM_AGP - -#include <pci/agpvar.h> - -MODULE_DEPEND(drm, agp, 1, 1, 1); +#include <vm/vm.h> +#include <vm/pmap.h> +#if __REALLY_HAVE_AGP +#include <sys/agpio.h> +#endif -int -drm_agp_info(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int DRM(agp_info)(DRM_OS_IOCTL) { drm_device_t *dev = kdev->si_drv1; struct agp_info *kern; drm_agp_info_t info; - if (!dev->agp->acquired) return EINVAL; + if (!dev->agp || !dev->agp->acquired) return EINVAL; kern = &dev->agp->info; agp_get_info(dev->agp->agpdev, kern); @@ -63,41 +61,45 @@ drm_agp_info(dev_t kdev, u_long cmd, caddr_t data, return 0; } -int -drm_agp_acquire(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int DRM(agp_acquire)(DRM_OS_IOCTL) { drm_device_t *dev = kdev->si_drv1; int retcode; - if (dev->agp->acquired) return EINVAL; + if (!dev->agp || dev->agp->acquired) return EINVAL; retcode = agp_acquire(dev->agp->agpdev); if (retcode) return retcode; dev->agp->acquired = 1; return 0; } -int -drm_agp_release(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int DRM(agp_release)(DRM_OS_IOCTL) { drm_device_t *dev = kdev->si_drv1; - if (!dev->agp->acquired) return EINVAL; + if (!dev->agp || !dev->agp->acquired) + return EINVAL; agp_release(dev->agp->agpdev); dev->agp->acquired = 0; return 0; } -int -drm_agp_enable(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +void DRM(agp_do_release)(void) +{ + device_t agpdev; + + agpdev = agp_find_device(); + if (agpdev) + agp_release(agpdev); +} + +int DRM(agp_enable)(DRM_OS_IOCTL) { drm_device_t *dev = kdev->si_drv1; drm_agp_mode_t mode; - if (!dev->agp->acquired) return EINVAL; + if (!dev->agp || !dev->agp->acquired) return EINVAL; mode = *(drm_agp_mode_t *) data; @@ -108,8 +110,7 @@ drm_agp_enable(dev_t kdev, u_long cmd, caddr_t data, return 0; } -int drm_agp_alloc(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int DRM(agp_alloc)(DRM_OS_IOCTL) { drm_device_t *dev = kdev->si_drv1; drm_agp_buffer_t request; @@ -119,20 +120,20 @@ int drm_agp_alloc(dev_t kdev, u_long cmd, caddr_t data, u_int32_t type; struct agp_memory_info info; - if (!dev->agp->acquired) return EINVAL; + if (!dev->agp || !dev->agp->acquired) return EINVAL; request = *(drm_agp_buffer_t *) data; - if (!(entry = drm_alloc(sizeof(*entry), DRM_MEM_AGPLISTS))) + if (!(entry = DRM(alloc)(sizeof(*entry), DRM_MEM_AGPLISTS))) return ENOMEM; - memset(entry, 0, sizeof(*entry)); + bzero(entry, sizeof(*entry)); pages = (request.size + PAGE_SIZE - 1) / PAGE_SIZE; type = (u_int32_t) request.type; - if (!(handle = drm_alloc_agp(pages, type))) { - drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS); + if (!(handle = DRM(alloc_agp)(pages, type))) { + DRM(free)(entry, sizeof(*entry), DRM_MEM_AGPLISTS); return ENOMEM; } @@ -154,8 +155,7 @@ int drm_agp_alloc(dev_t kdev, u_long cmd, caddr_t data, return 0; } -static drm_agp_mem_t * -drm_agp_lookup_entry(drm_device_t *dev, void *handle) +static drm_agp_mem_t * DRM(agp_lookup_entry)(drm_device_t *dev, void *handle) { drm_agp_mem_t *entry; @@ -165,24 +165,29 @@ drm_agp_lookup_entry(drm_device_t *dev, void *handle) return NULL; } -int -drm_agp_unbind(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int DRM(agp_unbind)(DRM_OS_IOCTL) { drm_device_t *dev = kdev->si_drv1; drm_agp_binding_t request; drm_agp_mem_t *entry; + int retcode; - if (!dev->agp->acquired) return EINVAL; + if (!dev->agp || !dev->agp->acquired) return EINVAL; request = *(drm_agp_binding_t *) data; - if (!(entry = drm_agp_lookup_entry(dev, (void *) request.handle))) + if (!(entry = DRM(agp_lookup_entry)(dev, (void *) request.handle))) return EINVAL; if (!entry->bound) return EINVAL; - return drm_unbind_agp(entry->handle); + retcode=DRM(unbind_agp)(entry->handle); + if (!retcode) + { + entry->bound=0; + return 0; + } + else + return retcode; } -int drm_agp_bind(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int DRM(agp_bind)(DRM_OS_IOCTL) { drm_device_t *dev = kdev->si_drv1; drm_agp_binding_t request; @@ -190,39 +195,41 @@ int drm_agp_bind(dev_t kdev, u_long cmd, caddr_t data, int retcode; int page; - if (!dev->agp->acquired) return EINVAL; + DRM_DEBUG("agp_bind, page_size=%x\n", PAGE_SIZE); + if (!dev->agp || !dev->agp->acquired) + return EINVAL; request = *(drm_agp_binding_t *) data; - if (!(entry = drm_agp_lookup_entry(dev, (void *) request.handle))) + if (!(entry = DRM(agp_lookup_entry)(dev, (void *) request.handle))) return EINVAL; if (entry->bound) return EINVAL; page = (request.offset + PAGE_SIZE - 1) / PAGE_SIZE; - if ((retcode = drm_bind_agp(entry->handle, page))) return retcode; + if ((retcode = DRM(bind_agp)(entry->handle, page))) + return retcode; entry->bound = dev->agp->base + (page << PAGE_SHIFT); return 0; } -int drm_agp_free(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int DRM(agp_free)(DRM_OS_IOCTL) { drm_device_t *dev = kdev->si_drv1; drm_agp_buffer_t request; drm_agp_mem_t *entry; - if (!dev->agp->acquired) return EINVAL; + if (!dev->agp || !dev->agp->acquired) return EINVAL; request = *(drm_agp_buffer_t *) data; - if (!(entry = drm_agp_lookup_entry(dev, (void*) request.handle))) + if (!(entry = DRM(agp_lookup_entry)(dev, (void*) request.handle))) return EINVAL; - if (entry->bound) drm_unbind_agp(entry->handle); + if (entry->bound) DRM(unbind_agp)(entry->handle); if (entry->prev) entry->prev->next = entry->next; else dev->agp->memory = entry->next; if (entry->next) entry->next->prev = entry->prev; - drm_free_agp(entry->handle, entry->pages); - drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS); + DRM(free_agp)(entry->handle, entry->pages); + DRM(free)(entry, sizeof(*entry), DRM_MEM_AGPLISTS); return 0; } -drm_agp_head_t *drm_agp_init(void) +drm_agp_head_t *DRM(agp_init)(void) { device_t agpdev; drm_agp_head_t *head = NULL; @@ -235,9 +242,9 @@ drm_agp_head_t *drm_agp_init(void) DRM_DEBUG("agp_available = %d\n", agp_available); if (agp_available) { - if (!(head = drm_alloc(sizeof(*head), DRM_MEM_AGPLISTS))) + if (!(head = DRM(alloc)(sizeof(*head), DRM_MEM_AGPLISTS))) return NULL; - memset((void *)head, 0, sizeof(*head)); + bzero((void *)head, sizeof(*head)); head->agpdev = agpdev; agp_get_info(agpdev, &head->info); head->memory = NULL; @@ -267,4 +274,53 @@ drm_agp_head_t *drm_agp_init(void) return head; } -#endif /* DRM_AGP */ +void DRM(agp_uninit)(void) +{ +/* FIXME: What goes here */ +} + + +agp_memory *DRM(agp_allocate_memory)(size_t pages, u32 type) +{ + device_t agpdev; + + agpdev = agp_find_device(); + if (!agpdev) + return NULL; + + return agp_alloc_memory(agpdev, type, pages << AGP_PAGE_SHIFT); +} + +int DRM(agp_free_memory)(agp_memory *handle) +{ + device_t agpdev; + + agpdev = agp_find_device(); + if (!agpdev || !handle) + return 0; + + agp_free_memory(agpdev, handle); + return 1; +} + +int DRM(agp_bind_memory)(agp_memory *handle, off_t start) +{ + device_t agpdev; + + agpdev = agp_find_device(); + if (!agpdev || !handle) + return EINVAL; + + return agp_bind_memory(agpdev, handle, start * PAGE_SIZE); +} + +int DRM(agp_unbind_memory)(agp_memory *handle) +{ + device_t agpdev; + + agpdev = agp_find_device(); + if (!agpdev || !handle) + return EINVAL; + + return agp_unbind_memory(agpdev, handle); +} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_linux.h b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_linux.h new file mode 100644 index 000000000..9e6f644b8 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_linux.h @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2000 by Coleman Kane <cokane@FreeBSD.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Gardner Buchanan. + * 4. The name of Gardner Buchanan may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD: src/sys/dev/tdfx/tdfx_linux.h,v 1.4 2000/08/22 05:57:55 marcel Exp $ + */ + +/* FIXME: There are IOCTLS to merge in here, see drm.h*/ + +/* Query IOCTLs */ +/* XFree86 4.1.x DRI support */ + +#define LINUX_DRM_IOCTL_VERSION 0x6400 +#define LINUX_DRM_IOCTL_GET_UNIQUE 0x6401 +#define LINUX_DRM_IOCTL_GET_MAGIC 0x6402 +#define LINUX_DRM_IOCTL_IRQ_BUSID 0x6403 +#define LINUX_DRM_IOCTL_GET_MAP 0x6404 +#define LINUX_DRM_IOCTL_GET_CLIENT 0x6405 +#define LINUX_DRM_IOCTL_GET_STATS 0x6406 + +#define LINUX_DRM_IOCTL_SET_UNIQUE 0x6410 +#define LINUX_DRM_IOCTL_AUTH_MAGIC 0x6411 +#define LINUX_DRM_IOCTL_BLOCK 0x6412 +#define LINUX_DRM_IOCTL_UNBLOCK 0x6413 +#define LINUX_DRM_IOCTL_CONTROL 0x6414 +#define LINUX_DRM_IOCTL_ADD_MAP 0x6415 +#define LINUX_DRM_IOCTL_ADD_BUFS 0x6416 +#define LINUX_DRM_IOCTL_MARK_BUFS 0x6417 +#define LINUX_DRM_IOCTL_INFO_BUFS 0x6418 +#define LINUX_DRM_IOCTL_MAP_BUFS 0x6419 +#define LINUX_DRM_IOCTL_FREE_BUFS 0x641a + +#define LINUX_DRM_IOCTL_RM_MAP 0x641b + +#define LINUX_DRM_IOCTL_SET_SAREA_CTX 0x641c +#define LINUX_DRM_IOCTL_GET_SAREA_CTX 0x641d + +#define LINUX_DRM_IOCTL_ADD_CTX 0x6420 +#define LINUX_DRM_IOCTL_RM_CTX 0x6421 +#define LINUX_DRM_IOCTL_MOD_CTX 0x6422 +#define LINUX_DRM_IOCTL_GET_CTX 0x6423 +#define LINUX_DRM_IOCTL_SWITCH_CTX 0x6424 +#define LINUX_DRM_IOCTL_NEW_CTX 0x6425 +#define LINUX_DRM_IOCTL_RES_CTX 0x6426 +#define LINUX_DRM_IOCTL_ADD_DRAW 0x6427 +#define LINUX_DRM_IOCTL_RM_DRAW 0x6428 +#define LINUX_DRM_IOCTL_DMA 0x6429 +#define LINUX_DRM_IOCTL_LOCK 0x642a +#define LINUX_DRM_IOCTL_UNLOCK 0x642b +#define LINUX_DRM_IOCTL_FINISH 0x642c + +#define LINUX_DRM_IOCTL_AGP_ACQUIRE 0x6430 +#define LINUX_DRM_IOCTL_AGP_RELEASE 0x6431 +#define LINUX_DRM_IOCTL_AGP_ENABLE 0x6432 +#define LINUX_DRM_IOCTL_AGP_INFO 0x6433 +#define LINUX_DRM_IOCTL_AGP_ALLOC 0x6434 +#define LINUX_DRM_IOCTL_AGP_FREE 0x6435 +#define LINUX_DRM_IOCTL_AGP_BIND 0x6436 +#define LINUX_DRM_IOCTL_AGP_UNBIND 0x6437 + +#define LINUX_DRM_IOCTL_SG_ALLOC 0x6438 +#define LINUX_DRM_IOCTL_SG_FREE 0x6439 + +/* MGA specific ioctls */ +#define LINUX_DRM_IOCTL_MGA_INIT 0x6440 +#define LINUX_DRM_IOCTL_MGA_FLUSH 0x6441 +#define LINUX_DRM_IOCTL_MGA_RESET 0x6442 +#define LINUX_DRM_IOCTL_MGA_SWAP 0x6443 +#define LINUX_DRM_IOCTL_MGA_CLEAR 0x6444 +#define LINUX_DRM_IOCTL_MGA_VERTEX 0x6445 +#define LINUX_DRM_IOCTL_MGA_INDICES 0x6446 +#define LINUX_DRM_IOCTL_MGA_ILOAD 0x6447 +#define LINUX_DRM_IOCTL_MGA_BLIT 0x6448 + +/* i810 specific ioctls */ +#define LINUX_DRM_IOCTL_I810_INIT 0x6440 +#define LINUX_DRM_IOCTL_I810_VERTEX 0x6441 +#define LINUX_DRM_IOCTL_I810_CLEAR 0x6442 +#define LINUX_DRM_IOCTL_I810_FLUSH 0x6443 +#define LINUX_DRM_IOCTL_I810_GETAGE 0x6444 +#define LINUX_DRM_IOCTL_I810_GETBUF 0x6445 +#define LINUX_DRM_IOCTL_I810_SWAP 0x6446 +#define LINUX_DRM_IOCTL_I810_COPY 0x6447 +#define LINUX_DRM_IOCTL_I810_DOCOPY 0x6448 + +/* I830 specific ioctls */ +#define LINUX_DRM_IOCTL_I830_INIT 0x6440 +#define LINUX_DRM_IOCTL_I830_VERTEX 0x6441 +#define LINUX_DRM_IOCTL_I830_CLEAR 0x6442 +#define LINUX_DRM_IOCTL_I830_FLUSH 0x6443 +#define LINUX_DRM_IOCTL_I830_GETAGE 0x6444 +#define LINUX_DRM_IOCTL_I830_GETBUF 0x6445 +#define LINUX_DRM_IOCTL_I830_SWAP 0x6446 +#define LINUX_DRM_IOCTL_I830_COPY 0x6447 +#define LINUX_DRM_IOCTL_I830_DOCOPY 0x6448 + +/* Rage 128 specific ioctls */ +#define LINUX_DRM_IOCTL_R128_INIT 0x6440 +#define LINUX_DRM_IOCTL_R128_CCE_START 0x6441 +#define LINUX_DRM_IOCTL_R128_CCE_STOP 0x6442 +#define LINUX_DRM_IOCTL_R128_CCE_RESET 0x6443 +#define LINUX_DRM_IOCTL_R128_CCE_IDLE 0x6444 +#define LINUX_DRM_IOCTL_R128_RESET 0x6446 +#define LINUX_DRM_IOCTL_R128_SWAP 0x6447 +#define LINUX_DRM_IOCTL_R128_CLEAR 0x6448 +#define LINUX_DRM_IOCTL_R128_VERTEX 0x6449 +#define LINUX_DRM_IOCTL_R128_INDICES 0x644a +#define LINUX_DRM_IOCTL_R128_BLIT 0x644b +#define LINUX_DRM_IOCTL_R128_DEPTH 0x644c +#define LINUX_DRM_IOCTL_R128_STIPPLE 0x644d +#define LINUX_DRM_IOCTL_R128_INDIRECT 0x644f +#define LINUX_DRM_IOCTL_R128_FULLSCREEN 0x6450 + +/* Radeon specific ioctls */ +#define LINUX_DRM_IOCTL_RADEON_CP_INIT 0x6440 +#define LINUX_DRM_IOCTL_RADEON_CP_START 0x6441 +#define LINUX_DRM_IOCTL_RADEON_CP_STOP 0x6442 +#define LINUX_DRM_IOCTL_RADEON_CP_RESET 0x6443 +#define LINUX_DRM_IOCTL_RADEON_CP_IDLE 0x6444 +#define LINUX_DRM_IOCTL_RADEON_RESET 0x6445 +#define LINUX_DRM_IOCTL_RADEON_FULLSCREEN 0x6446 +#define LINUX_DRM_IOCTL_RADEON_SWAP 0x6447 +#define LINUX_DRM_IOCTL_RADEON_CLEAR 0x6448 +#define LINUX_DRM_IOCTL_RADEON_VERTEX 0x6449 +#define LINUX_DRM_IOCTL_RADEON_INDICES 0x644a +#define LINUX_DRM_IOCTL_RADEON_STIPPLE 0x644c +#define LINUX_DRM_IOCTL_RADEON_INDIRECT 0x644d +#define LINUX_DRM_IOCTL_RADEON_TEXTURE 0x644e + +/* card specific ioctls may increase the DRM_MAX */ +#define LINUX_IOCTL_DRM_MIN LINUX_DRM_IOCTL_VERSION +#define LINUX_IOCTL_DRM_MAX LINUX_DRM_IOCTL_R128_FULLSCREEN diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_os_freebsd.h b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_os_freebsd.h new file mode 100644 index 000000000..72c5baf6d --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_os_freebsd.h @@ -0,0 +1,375 @@ +#include <sys/param.h> +#include <sys/queue.h> +#include <sys/malloc.h> +#include <sys/kernel.h> +#include <sys/module.h> +#include <sys/systm.h> +#include <sys/conf.h> +#include <sys/stat.h> +#include <sys/proc.h> +#include <sys/lock.h> +#include <sys/fcntl.h> +#include <sys/uio.h> +#include <sys/filio.h> +#include <sys/sysctl.h> +#include <sys/select.h> +#include <vm/vm.h> +#include <vm/pmap.h> +#include <machine/pmap.h> +#if __FreeBSD_version >= 500000 +#include <sys/selinfo.h> +#endif +#include <sys/bus.h> +#if __FreeBSD_version >= 400005 +#include <sys/taskqueue.h> +#endif +#if __FreeBSD_version >= 500000 +#include <sys/mutex.h> +#endif + +#if __FreeBSD_version >= 400006 +#define __REALLY_HAVE_AGP __HAVE_AGP +#endif + +#define __REALLY_HAVE_MTRR 0 +#define __REALLY_HAVE_SG 0 + +#if __REALLY_HAVE_AGP +#include <pci/agpvar.h> +#endif + +#define DRM_TIME_SLICE (hz/20) /* Time slice for GLXContexts */ + +#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) +#define DRM_DEV_UID 0 +#define DRM_DEV_GID 0 + + +#if __FreeBSD_version >= 500000 +#define DRM_OS_SPINTYPE struct mtx +#define DRM_OS_SPININIT(l,name) mtx_init(&l, name, MTX_DEF) +#define DRM_OS_SPINLOCK(l) mtx_lock(l) +#define DRM_OS_SPINUNLOCK(u) mtx_unlock(u); +#define DRM_OS_LOCK lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curthread) +#define DRM_OS_UNLOCK lockmgr(&dev->dev_lock, LK_RELEASE, 0, curthread) +#define DRM_OS_CURPROC curthread +#define DRM_OS_STRUCTPROC struct thread +#define DRM_OS_CURRENTPID curthread->td_proc->p_pid +#define DRM_OS_IOCTL dev_t kdev, u_long cmd, caddr_t data, int flags, struct thread *p +#define DRM_OS_CHECKSUSER suser(p->td_proc) +#else +#define DRM_OS_CURPROC curproc +#define DRM_OS_STRUCTPROC struct proc +#define DRM_OS_SPINTYPE struct simplelock +#define DRM_OS_SPININIT(l,name) simple_lock_init(&l) +#define DRM_OS_SPINLOCK(l) simple_lock(l) +#define DRM_OS_SPINUNLOCK(u) simple_unlock(u); +#define DRM_OS_IOCTL dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p +#define DRM_OS_LOCK lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc) +#define DRM_OS_UNLOCK lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc) +#define DRM_OS_CURRENTPID curproc->p_pid +#define DRM_OS_CHECKSUSER suser(p) +#endif + +#define DRM_OS_TASKQUEUE_ARGS void *dev, int pending +#define DRM_OS_IRQ_ARGS void *device +#define DRM_OS_DEVICE drm_device_t *dev = kdev->si_drv1 +#define DRM_OS_MALLOC(size) malloc( size, DRM(M_DRM), M_NOWAIT ) +#define DRM_OS_FREE(pt) free( pt, DRM(M_DRM) ) +#define DRM_OS_VTOPHYS(addr) vtophys(addr) + +#define DRM_OS_PRIV \ + drm_file_t *priv = (drm_file_t *) DRM(find_file_by_proc)(dev, p); \ + if (!priv) { \ + DRM_DEBUG("can't find authenticator\n"); \ + return EINVAL; \ + } + +#define DRM_OS_DELAY( udelay ) \ +do { \ + struct timeval tv1, tv2; \ + microtime(&tv1); \ + do { \ + microtime(&tv2); \ + } \ + while (((tv2.tv_sec-tv1.tv_sec)*1000000 + tv2.tv_usec - tv1.tv_usec) < udelay ); \ +} while (0) + +#define DRM_OS_RETURN(v) return v; + + +#define DRM_OS_KRNTOUSR(arg1, arg2, arg3) \ + *arg1 = arg2 +#define DRM_OS_KRNFROMUSR(arg1, arg2, arg3) \ + arg1 = *arg2 +#define DRM_OS_COPYTOUSR(arg1, arg2, arg3) \ + copyout(arg2, arg1, arg3) +#define DRM_OS_COPYFROMUSR(arg1, arg2, arg3) \ + copyin(arg2, arg1, arg3) + +#define DRM_OS_READMEMORYBARRIER \ +{ \ + int xchangeDummy; \ + DRM_DEBUG("%s\n", __FUNCTION__); \ + __asm__ volatile(" push %%eax ; xchg %%eax, %0 ; pop %%eax" : : "m" (xchangeDummy)); \ + __asm__ volatile(" push %%eax ; push %%ebx ; push %%ecx ; push %%edx ;" \ + " movl $0,%%eax ; cpuid ; pop %%edx ; pop %%ecx ; pop %%ebx ;" \ + " pop %%eax" : /* no outputs */ : /* no inputs */ ); \ +} while (0); + +#define DRM_OS_WRITEMEMORYBARRIER DRM_OS_READMEMORYBARRIER + +#define DRM_OS_WAKEUP(w) wakeup(w) +#define DRM_OS_WAKEUP_INT(w) wakeup(w) + +#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) + +#define malloctype DRM(M_DRM) +/* The macros confliced in the MALLOC_DEFINE */ +MALLOC_DECLARE(malloctype); +#undef malloctype + +typedef struct drm_chipinfo +{ + int vendor; + int device; + int supported; + char *name; +} drm_chipinfo_t; + +typedef unsigned long atomic_t; +typedef u_int32_t cycles_t; +typedef u_int32_t spinlock_t; +typedef u_int32_t u32; +typedef u_int16_t u16; +typedef u_int8_t u8; +#define atomic_set(p, v) (*(p) = (v)) +#define atomic_read(p) (*(p)) +#define atomic_inc(p) atomic_add_long(p, 1) +#define atomic_dec(p) atomic_subtract_long(p, 1) +#define atomic_add(n, p) atomic_add_long(p, n) +#define atomic_sub(n, p) atomic_subtract_long(p, n) + +/* Fake this */ +static __inline unsigned int +test_and_set_bit(int b, volatile unsigned long *p) +{ + int s = splhigh(); + unsigned int m = 1<<b; + unsigned int r = *p & m; + *p |= m; + splx(s); + return r; +} + +static __inline void +clear_bit(int b, volatile unsigned long *p) +{ + atomic_clear_long(p + (b >> 5), 1 << (b & 0x1f)); +} + +static __inline void +set_bit(int b, volatile unsigned long *p) +{ + atomic_set_long(p + (b >> 5), 1 << (b & 0x1f)); +} + +static __inline int +test_bit(int b, volatile unsigned long *p) +{ + return p[b >> 5] & (1 << (b & 0x1f)); +} + +static __inline int +find_first_zero_bit(volatile unsigned long *p, int max) +{ + int b; + + for (b = 0; b < max; b += 32) { + if (p[b >> 5] != ~0) { + for (;;) { + if ((p[b >> 5] & (1 << (b & 0x1f))) == 0) + return b; + b++; + } + } + } + return max; +} + +#define spldrm() spltty() + +#define memset(p, v, s) bzero(p, s) + +/* + * Fake out the module macros for versions of FreeBSD where they don't + * exist. + */ +#if (__FreeBSD_version < 500002 && __FreeBSD_version > 500000) || __FreeBSD_version < 420000 +/* FIXME: again, what's the exact date? */ +#define MODULE_VERSION(a,b) struct __hack +#define MODULE_DEPEND(a,b,c,d,e) struct __hack + +#endif + +#define __drm_dummy_lock(lock) (*(__volatile__ unsigned int *)lock) +#define _DRM_CAS(lock,old,new,__ret) \ + do { \ + int __dummy; /* Can't mark eax as clobbered */ \ + __asm__ __volatile__( \ + "lock ; cmpxchg %4,%1\n\t" \ + "setnz %0" \ + : "=d" (__ret), \ + "=m" (__drm_dummy_lock(lock)), \ + "=a" (__dummy) \ + : "2" (old), \ + "r" (new)); \ + } while (0) + +/* Redefinitions to make templating easy */ +#define wait_queue_head_t long +#define agp_memory void +#define jiffies ticks + + /* Macros to make printf easier */ +#define DRM_ERROR(fmt, arg...) \ + printf("error: " "[" DRM_NAME ":" __FUNCTION__ "] *ERROR* " fmt , ##arg) +#define DRM_MEM_ERROR(area, fmt, arg...) \ + printf("error: " "[" DRM_NAME ":" __FUNCTION__ ":%s] *ERROR* " fmt , \ + DRM(mem_stats)[area].name , ##arg) +#define DRM_INFO(fmt, arg...) printf("info: " "[" DRM_NAME "] " fmt , ##arg) + +#if DRM_DEBUG_CODE +#define DRM_DEBUG(fmt, arg...) \ + do { \ + if (DRM(flags) & DRM_FLAG_DEBUG) \ + printf("[" DRM_NAME ":" __FUNCTION__ "] " fmt , \ + ##arg); \ + } while (0) +#else +#define DRM_DEBUG(fmt, arg...) do { } while (0) +#endif + +#define DRM_PROC_LIMIT (PAGE_SIZE-80) + +#if (__FreeBSD_version >= 500000) || ((__FreeBSD_version < 500000) && (__FreeBSD_version >= 410002)) +#define DRM_SYSCTL_HANDLER_ARGS (SYSCTL_HANDLER_ARGS) +#else +#define DRM_SYSCTL_HANDLER_ARGS SYSCTL_HANDLER_ARGS +#endif + +#define DRM_SYSCTL_PRINT(fmt, arg...) \ + snprintf(buf, sizeof(buf), fmt, ##arg); \ + error = SYSCTL_OUT(req, buf, strlen(buf)); \ + if (error) return error; + +#define DRM_SYSCTL_PRINT_RET(ret, fmt, arg...) \ + snprintf(buf, sizeof(buf), fmt, ##arg); \ + error = SYSCTL_OUT(req, buf, strlen(buf)); \ + if (error) { ret; return error; } + + +#define DRM_FIND_MAP(dest, o) \ + do { \ + drm_map_list_entry_t *listentry; \ + TAILQ_FOREACH(listentry, dev->maplist, link) { \ + if ( listentry->map->offset == o ) { \ + dest = listentry->map; \ + break; \ + } \ + } \ + } while (0) + + +/* Internal functions */ + +/* drm_drv.h */ +extern d_ioctl_t DRM(ioctl); +extern d_ioctl_t DRM(lock); +extern d_ioctl_t DRM(unlock); +extern d_open_t DRM(open); +extern d_close_t DRM(close); +extern d_read_t DRM(read); +extern d_write_t DRM(write); +extern d_poll_t DRM(poll); +extern d_mmap_t DRM(mmap); +extern int DRM(open_helper)(dev_t kdev, int flags, int fmt, + DRM_OS_STRUCTPROC *p, drm_device_t *dev); +extern drm_file_t *DRM(find_file_by_proc)(drm_device_t *dev, + DRM_OS_STRUCTPROC *p); + +/* Misc. IOCTL support (drm_ioctl.h) */ +extern d_ioctl_t DRM(irq_busid); +extern d_ioctl_t DRM(getunique); +extern d_ioctl_t DRM(setunique); +extern d_ioctl_t DRM(getmap); +extern d_ioctl_t DRM(getclient); +extern d_ioctl_t DRM(getstats); + +/* Context IOCTL support (drm_context.h) */ +extern d_ioctl_t DRM(resctx); +extern d_ioctl_t DRM(addctx); +extern d_ioctl_t DRM(modctx); +extern d_ioctl_t DRM(getctx); +extern d_ioctl_t DRM(switchctx); +extern d_ioctl_t DRM(newctx); +extern d_ioctl_t DRM(rmctx); +extern d_ioctl_t DRM(setsareactx); +extern d_ioctl_t DRM(getsareactx); + +/* Drawable IOCTL support (drm_drawable.h) */ +extern d_ioctl_t DRM(adddraw); +extern d_ioctl_t DRM(rmdraw); + +/* Authentication IOCTL support (drm_auth.h) */ +extern d_ioctl_t DRM(getmagic); +extern d_ioctl_t DRM(authmagic); + +/* Locking IOCTL support (drm_lock.h) */ +extern d_ioctl_t DRM(block); +extern d_ioctl_t DRM(unblock); +extern d_ioctl_t DRM(finish); + +/* Buffer management support (drm_bufs.h) */ +extern d_ioctl_t DRM(addmap); +extern d_ioctl_t DRM(rmmap); +#if __HAVE_DMA +extern d_ioctl_t DRM(addbufs_agp); +extern d_ioctl_t DRM(addbufs_pci); +extern d_ioctl_t DRM(addbufs_sg); +extern d_ioctl_t DRM(addbufs); +extern d_ioctl_t DRM(infobufs); +extern d_ioctl_t DRM(markbufs); +extern d_ioctl_t DRM(freebufs); +extern d_ioctl_t DRM(mapbufs); +#endif + +/* Memory management support (drm_memory.h) */ +extern int DRM(mem_info) DRM_SYSCTL_HANDLER_ARGS; + +/* DMA support (drm_dma.h) */ +#if __HAVE_DMA_IRQ +extern d_ioctl_t DRM(control); +#endif + +/* AGP/GART support (drm_agpsupport.h) */ +#if __REALLY_HAVE_AGP +extern d_ioctl_t DRM(agp_acquire); +extern d_ioctl_t DRM(agp_release); +extern d_ioctl_t DRM(agp_enable); +extern d_ioctl_t DRM(agp_info); +extern d_ioctl_t DRM(agp_alloc); +extern d_ioctl_t DRM(agp_free); +extern d_ioctl_t DRM(agp_unbind); +extern d_ioctl_t DRM(agp_bind); +#endif + +/* Scatter Gather Support (drm_scatter.h) */ +#if __HAVE_SG +extern d_ioctl_t DRM(sg_alloc); +extern d_ioctl_t DRM(sg_free); +#endif + +/* SysCtl Support (drm_sysctl.h) */ +extern int DRM(sysctl_init)(drm_device_t *dev); +extern int DRM(sysctl_cleanup)(drm_device_t *dev); diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/sysctl.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_sysctl.h index 0bc04d222..02e4b28da 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/sysctl.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_sysctl.h @@ -1,70 +1,35 @@ -/* proc.c -- /proc support for DRM -*- c -*- - * Created: Mon Jan 11 09:48:47 1999 by faith@precisioninsight.com - * Revised: Fri Aug 20 11:31:48 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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. - * - * $PI$ - * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm/sysctl.c,v 1.2 2001/03/02 02:45:38 dawes Exp $ - * - */ - -#define __NO_VERSION__ -#include "drmP.h" -#include <sys/sysctl.h> - SYSCTL_NODE(_hw, OID_AUTO, dri, CTLFLAG_RW, 0, "DRI Graphics"); -static int drm_name_info DRM_SYSCTL_HANDLER_ARGS; -static int drm_vm_info DRM_SYSCTL_HANDLER_ARGS; -static int drm_clients_info DRM_SYSCTL_HANDLER_ARGS; -static int drm_queues_info DRM_SYSCTL_HANDLER_ARGS; -static int drm_bufs_info DRM_SYSCTL_HANDLER_ARGS; +static int DRM(name_info)DRM_SYSCTL_HANDLER_ARGS; +static int DRM(vm_info)DRM_SYSCTL_HANDLER_ARGS; +static int DRM(clients_info)DRM_SYSCTL_HANDLER_ARGS; +static int DRM(queues_info)DRM_SYSCTL_HANDLER_ARGS; +static int DRM(bufs_info)DRM_SYSCTL_HANDLER_ARGS; #if DRM_DEBUG_CODExx -static int drm_vma_info DRM_SYSCTL_HANDLER_ARGS; +static int DRM(vma_info)DRM_SYSCTL_HANDLER_ARGS; #endif #if DRM_DMA_HISTOGRAM -static int drm_histo_info DRM_SYSCTL_HANDLER_ARGS; +static int DRM(histo_info)DRM_SYSCTL_HANDLER_ARGS; #endif -struct drm_sysctl_list { +struct DRM(sysctl_list) { const char *name; int (*f) DRM_SYSCTL_HANDLER_ARGS; -} drm_sysctl_list[] = { - { "name", drm_name_info }, - { "mem", drm_mem_info }, - { "vm", drm_vm_info }, - { "clients", drm_clients_info }, - { "queues", drm_queues_info }, - { "bufs", drm_bufs_info }, +} DRM(sysctl_list)[] = { + { "name", DRM(name_info) }, + { "mem", DRM(mem_info) }, + { "vm", DRM(vm_info) }, + { "clients", DRM(clients_info) }, + { "queues", DRM(queues_info) }, + { "bufs", DRM(bufs_info) }, #if DRM_DEBUG_CODExx - { "vma", drm_vma_info }, + { "vma", DRM(vma_info) }, #endif #if DRM_DMA_HISTOGRAM - { "histo", drm_histo_info }, + { "histo", drm_histo_info) }, #endif }; -#define DRM_SYSCTL_ENTRIES (sizeof(drm_sysctl_list)/sizeof(drm_sysctl_list[0])) +#define DRM_SYSCTL_ENTRIES (sizeof(DRM(sysctl_list))/sizeof(DRM(sysctl_list)[0])) struct drm_sysctl_info { struct sysctl_oid oids[DRM_SYSCTL_ENTRIES + 1]; @@ -72,7 +37,7 @@ struct drm_sysctl_info { char name[2]; }; -int drm_sysctl_init(drm_device_t *dev) +int DRM(sysctl_init)(drm_device_t *dev) { struct drm_sysctl_info *info; struct sysctl_oid *oid; @@ -86,7 +51,7 @@ int drm_sysctl_init(drm_device_t *dev) i = oid->oid_arg2 + 1; } - info = drm_alloc(sizeof *info, DRM_MEM_DRIVER); + info = DRM(alloc)(sizeof *info, DRM_MEM_DRIVER); dev->sysctl = info; /* Construct the node under hw.graphics */ @@ -114,8 +79,8 @@ int drm_sysctl_init(drm_device_t *dev) oid->oid_kind = CTLTYPE_INT | CTLFLAG_RD; oid->oid_arg1 = dev; oid->oid_arg2 = 0; - oid->oid_name = drm_sysctl_list[i].name; - oid->oid_handler = drm_sysctl_list[i].f; + oid->oid_name = DRM(sysctl_list)[i].name; + oid->oid_handler = DRM(sysctl_list[)i].f; oid->oid_fmt = "A"; sysctl_register_oid(oid); } @@ -123,7 +88,7 @@ int drm_sysctl_init(drm_device_t *dev) return 0; } -int drm_sysctl_cleanup(drm_device_t *dev) +int DRM(sysctl_cleanup)(drm_device_t *dev) { int i; @@ -131,13 +96,13 @@ int drm_sysctl_cleanup(drm_device_t *dev) for (i = 0; i < DRM_SYSCTL_ENTRIES + 1; i++) sysctl_unregister_oid(&dev->sysctl->oids[i]); - drm_free(dev->sysctl, sizeof *dev->sysctl, DRM_MEM_DRIVER); + DRM(free)(dev->sysctl, sizeof *dev->sysctl, DRM_MEM_DRIVER); dev->sysctl = NULL; return 0; } -static int drm_name_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(name_info)DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; char buf[128]; @@ -155,13 +120,14 @@ static int drm_name_info DRM_SYSCTL_HANDLER_ARGS return 0; } -static int _drm_vm_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(_vm_info)DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_map_t *map; - const char *types[] = { "FB", "REG", "SHM", "AGP" }; + drm_map_list_entry_t *listentry; + const char *types[] = { "FB", "REG", "SHM" }; const char *type; - int i; + int i=0; char buf[128]; int error; @@ -170,21 +136,24 @@ static int _drm_vm_info DRM_SYSCTL_HANDLER_ARGS error = SYSCTL_OUT(req, buf, strlen(buf)); if (error) return error; - for (i = 0; i < dev->map_count; i++) { - map = dev->maplist[i]; - if (map->type < 0 || map->type > 3) type = "??"; - else type = types[map->type]; - DRM_SYSCTL_PRINT("%4d 0x%08lx 0x%08lx %4.4s 0x%02x 0x%08lx ", - i, - map->offset, - map->size, - type, - map->flags, - (unsigned long)map->handle); - if (map->mtrr < 0) { - DRM_SYSCTL_PRINT("none\n"); - } else { - DRM_SYSCTL_PRINT("%4d\n", map->mtrr); + if (dev->maplist != NULL) { + TAILQ_FOREACH(listentry, dev->maplist, link) { + map = listentry->map; + if (map->type < 0 || map->type > 2) type = "??"; + else type = types[map->type]; + DRM_SYSCTL_PRINT("%4d 0x%08lx 0x%08lx %4.4s 0x%02x 0x%08lx ", + i, + map->offset, + map->size, + type, + map->flags, + (unsigned long)map->handle); + if (map->mtrr < 0) { + DRM_SYSCTL_PRINT("none\n"); + } else { + DRM_SYSCTL_PRINT("%4d\n", map->mtrr); + } + i++; } } SYSCTL_OUT(req, "", 1); @@ -192,20 +161,20 @@ static int _drm_vm_info DRM_SYSCTL_HANDLER_ARGS return 0; } -static int drm_vm_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(vm_info)DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - ret = _drm_vm_info(oidp, arg1, arg2, req); - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); + DRM_OS_LOCK; + ret = DRM(_vm_info)(oidp, arg1, arg2, req); + DRM_OS_UNLOCK; return ret; } -static int _drm_queues_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(_queues_info)DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int i; @@ -220,8 +189,8 @@ static int _drm_queues_info DRM_SYSCTL_HANDLER_ARGS q = dev->queuelist[i]; atomic_inc(&q->use_count); DRM_SYSCTL_PRINT_RET(atomic_dec(&q->use_count), - "%5d/0x%03x %5d %5d" - " %5d/%c%c/%c%c%c %5Zd %10d %10d %10d\n", + "%5d/0x%03x %5ld %5ld" + " %5ld/%c%c/%c%c%c %5d %10ld %10ld %10ld\n", i, q->flags, atomic_read(&q->use_count), @@ -243,21 +212,21 @@ static int _drm_queues_info DRM_SYSCTL_HANDLER_ARGS return 0; } -static int drm_queues_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(queues_info) DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - ret = _drm_queues_info(oidp, arg1, arg2, req); - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); + DRM_OS_LOCK; + ret = DRM(_queues_info)(oidp, arg1, arg2, req); + DRM_OS_UNLOCK; return ret; } /* drm_bufs_info is called whenever a process reads hw.dri.0.bufs. */ -static int _drm_bufs_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(_bufs_info) DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_device_dma_t *dma = dev->dma; @@ -269,7 +238,7 @@ static int _drm_bufs_info DRM_SYSCTL_HANDLER_ARGS DRM_SYSCTL_PRINT(" o size count free segs pages kB\n\n"); for (i = 0; i <= DRM_MAX_ORDER; i++) { if (dma->bufs[i].buf_count) - DRM_SYSCTL_PRINT("%2d %8d %5d %5d %5d %5d %5d\n", + DRM_SYSCTL_PRINT("%2d %8d %5d %5ld %5d %5d %5d\n", i, dma->bufs[i].buf_size, dma->bufs[i].buf_count, @@ -293,19 +262,19 @@ static int _drm_bufs_info DRM_SYSCTL_HANDLER_ARGS return 0; } -static int drm_bufs_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(bufs_info) DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - ret = _drm_bufs_info(oidp, arg1, arg2, req); - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); + DRM_OS_LOCK; + ret = DRM(_bufs_info)(oidp, arg1, arg2, req); + DRM_OS_UNLOCK; return ret; } -static int _drm_clients_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(_clients_info) DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_file_t *priv; @@ -327,20 +296,20 @@ static int _drm_clients_info DRM_SYSCTL_HANDLER_ARGS return 0; } -static int drm_clients_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(clients_info)DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - ret = _drm_clients_info(oidp, arg1, arg2, req); - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); + DRM_OS_LOCK; + ret = DRM(_clients_info)(oidp, arg1, arg2, req); + DRM_OS_UNLOCK; return ret; } #if DRM_DEBUG_CODExx -static int _drm_vma_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(_vma_info)DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_vma_entry_t *pt; @@ -412,21 +381,21 @@ static int _drm_vma_info DRM_SYSCTL_HANDLER_ARGS return 0; } -static int drm_vma_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(vma_info)DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - ret = _drm_vma_info(oidp, arg1, arg2, req); - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); + DRM_OS_LOCK; + ret = DRM(_vma_info)(oidp, arg1, arg2, req); + DRM_OS_UNLOCK; return ret; } #endif #if DRM_DMA_HISTOGRAM -static int _drm_histo_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(_histo_info)DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_device_dma_t *dma = dev->dma; @@ -498,9 +467,9 @@ static int _drm_histo_info DRM_SYSCTL_HANDLER_ARGS } else { DRM_SYSCTL_PRINT("lock none\n"); } - DRM_SYSCTL_PRINT("context_flag 0x%08lx\n", dev->context_flag); - DRM_SYSCTL_PRINT("interrupt_flag 0x%08lx\n", dev->interrupt_flag); - DRM_SYSCTL_PRINT("dma_flag 0x%08lx\n", dev->dma_flag); + DRM_SYSCTL_PRINT("context_flag 0x%08x\n", dev->context_flag); + DRM_SYSCTL_PRINT("interrupt_flag 0x%08x\n", dev->interrupt_flag); + DRM_SYSCTL_PRINT("dma_flag 0x%08x\n", dev->dma_flag); DRM_SYSCTL_PRINT("queue_count %10d\n", dev->queue_count); DRM_SYSCTL_PRINT("last_context %10d\n", dev->last_context); @@ -541,14 +510,14 @@ static int _drm_histo_info DRM_SYSCTL_HANDLER_ARGS return 0; } -static int drm_histo_info DRM_SYSCTL_HANDLER_ARGS +static int DRM(histo_info)DRM_SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); + DRM_OS_LOCK; ret = _drm_histo_info(oidp, arg1, arg2, req); - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); + DRM_OS_UNLOCK; return ret; } #endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_vm.h b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_vm.h new file mode 100644 index 000000000..a06fb448a --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/drm_vm.h @@ -0,0 +1,81 @@ +#include <vm/vm.h> +#include <vm/pmap.h> + +static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) +{ + drm_device_t *dev = kdev->si_drv1; + drm_device_dma_t *dma = dev->dma; + unsigned long physical; + unsigned long page; + + if (!dma) return -1; /* Error */ + if (!dma->pagelist) return -1; /* Nothing allocated */ + + page = offset >> PAGE_SHIFT; + physical = dma->pagelist[page]; + + DRM_DEBUG("0x%08x (page %lu) => 0x%08lx\n", offset, page, physical); + return atop(physical); +} + +int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot) +{ + drm_device_t *dev = kdev->si_drv1; + drm_map_t *map = NULL; + drm_map_list_entry_t *listentry=NULL; + /*drm_file_t *priv;*/ + +/* DRM_DEBUG("offset = 0x%x\n", offset);*/ + + /*XXX Fixme */ + /*priv = DRM(find_file_by_proc)(dev, p); + if (!priv) { + DRM_DEBUG("can't find authenticator\n"); + return EINVAL; + } + + if (!priv->authenticated) DRM_OS_RETURN(EACCES);*/ + + if (dev->dma + && offset >= 0 + && offset < ptoa(dev->dma->page_count)) + return DRM(dma_mmap)(kdev, offset, prot); + + /* A sequential search of a linked list is + fine here because: 1) there will only be + about 5-10 entries in the list and, 2) a + DRI client only has to do this mapping + once, so it doesn't have to be optimized + for performance, even if the list was a + bit longer. */ + TAILQ_FOREACH(listentry, dev->maplist, link) { + map = listentry->map; +/* DRM_DEBUG("considering 0x%x..0x%x\n", map->offset, map->offset + map->size - 1);*/ + if (offset >= map->offset + && offset < map->offset + map->size) break; + } + + if (!listentry) { + DRM_DEBUG("can't find map\n"); + return -1; + } + if (((map->flags&_DRM_RESTRICTED) && suser(curproc))) { + DRM_DEBUG("restricted map\n"); + return -1; + } + + switch (map->type) { + case _DRM_FRAME_BUFFER: + case _DRM_REGISTERS: + case _DRM_AGP: + return atop(offset); + case _DRM_SHM: + return atop(vtophys(offset)); + default: + return -1; /* This should never happen. */ + } + DRM_DEBUG("bailing out\n"); + + return -1; +} + diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/Makefile b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/Makefile index 37f3f5e7b..97bb1b69c 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/Makefile +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/Makefile @@ -1,10 +1,10 @@ # $FreeBSD$ KMOD = gamma +NOMAN= YES SRCS = gamma_drv.c gamma_dma.c -SRCS += device_if.h bus_if.h pci_if.h +SRCS += device_if.h bus_if.h pci_if.h opt_drm_linux.h CFLAGS += ${DEBUG_FLAGS} -I. -I.. -KMODDEPS = drm @: ln -sf /sys @ @@ -12,4 +12,14 @@ KMODDEPS = drm machine: ln -sf /sys/i386/include machine +.if ${MACHINE_ARCH} == "i386" +# This line enables linux ioctl handling +# If you want support for this uncomment this line +#TDFX_OPTS= "\#define DRM_LINUX" 1 +.endif + +opt_drm_linux.h: + touch opt_drm_linux.h + echo $(TDFX_OPTS) >> opt_drm_linux.h + .include <bsd.kmod.mk> diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_dma.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_dma.c index 07d8248b1..fd0da710a 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_dma.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_dma.c @@ -1,4 +1,4 @@ -/* gamma_dma.c -- DMA support for GMX 2000 -*- c -*- +/* gamma_dma.c -- DMA support for GMX 2000 -*- linux-c -*- * Created: Fri Mar 19 14:30:16 1999 by faith@precisioninsight.com * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. @@ -11,11 +11,11 @@ * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL @@ -23,77 +23,36 @@ * 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: * Rickard E. (Rik) Faith <faith@valinux.com> * */ -#define __NO_VERSION__ + + +#include "gamma.h" #include "drmP.h" #include "gamma_drv.h" -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> -#include <vm/vm.h> -#include <vm/pmap.h> - -/* WARNING!!! MAGIC NUMBER!!! The number of regions already added to the - kernel must be specified here. Currently, the number is 2. This must - match the order the X server uses for instantiating register regions , - or must be passed in a new ioctl. */ -#define GAMMA_REG(reg) \ - (2 \ - + ((reg < 0x1000) \ - ? 0 \ - : ((reg < 0x10000) ? 1 : ((reg < 0x11000) ? 2 : 3)))) - -#define GAMMA_OFF(reg) \ - ((reg < 0x1000) \ - ? reg \ - : ((reg < 0x10000) \ - ? (reg - 0x1000) \ - : ((reg < 0x11000) \ - ? (reg - 0x10000) \ - : (reg - 0x11000)))) - -#define GAMMA_BASE(reg) ((unsigned long)dev->maplist[GAMMA_REG(reg)]->handle) -#define GAMMA_ADDR(reg) (GAMMA_BASE(reg) + GAMMA_OFF(reg)) -#define GAMMA_DEREF(reg) *(__volatile__ int *)GAMMA_ADDR(reg) -#define GAMMA_READ(reg) GAMMA_DEREF(reg) -#define GAMMA_WRITE(reg,val) do { GAMMA_DEREF(reg) = val; } while (0) - -#define GAMMA_BROADCASTMASK 0x9378 -#define GAMMA_COMMANDINTENABLE 0x0c48 -#define GAMMA_DMAADDRESS 0x0028 -#define GAMMA_DMACOUNT 0x0030 -#define GAMMA_FILTERMODE 0x8c00 -#define GAMMA_GCOMMANDINTFLAGS 0x0c50 -#define GAMMA_GCOMMANDMODE 0x0c40 -#define GAMMA_GCOMMANDSTATUS 0x0c60 -#define GAMMA_GDELAYTIMER 0x0c38 -#define GAMMA_GDMACONTROL 0x0060 -#define GAMMA_GINTENABLE 0x0808 -#define GAMMA_GINTFLAGS 0x0810 -#define GAMMA_INFIFOSPACE 0x0018 -#define GAMMA_OUTFIFOWORDS 0x0020 -#define GAMMA_OUTPUTFIFO 0x2000 -#define GAMMA_SYNC 0x8c40 -#define GAMMA_SYNC_TAG 0x0188 - -static __inline void gamma_dma_dispatch(drm_device_t *dev, - vm_offset_t address, - vm_size_t length) + +static __inline__ void gamma_dma_dispatch(drm_device_t *dev, unsigned long address, + unsigned long length) { - GAMMA_WRITE(GAMMA_DMAADDRESS, vtophys(address)); + drm_gamma_private_t *dev_priv = + (drm_gamma_private_t *)dev->dev_private; + + GAMMA_WRITE(GAMMA_DMAADDRESS, DRM_OS_VTOPHYS((void *)address)); while (GAMMA_READ(GAMMA_GCOMMANDSTATUS) != 4) ; GAMMA_WRITE(GAMMA_DMACOUNT, length / 4); } -static __inline void gamma_dma_quiescent_single(drm_device_t *dev) +void gamma_dma_quiescent_single(drm_device_t *dev) { + drm_gamma_private_t *dev_priv = + (drm_gamma_private_t *)dev->dev_private; + while (GAMMA_READ(GAMMA_DMACOUNT)) ; while (GAMMA_READ(GAMMA_INFIFOSPACE) < 3) @@ -101,15 +60,18 @@ static __inline void gamma_dma_quiescent_single(drm_device_t *dev) GAMMA_WRITE(GAMMA_FILTERMODE, 1 << 10); GAMMA_WRITE(GAMMA_SYNC, 0); - + do { while (!GAMMA_READ(GAMMA_OUTFIFOWORDS)) ; } while (GAMMA_READ(GAMMA_OUTPUTFIFO) != GAMMA_SYNC_TAG); } -static __inline void gamma_dma_quiescent_dual(drm_device_t *dev) +void gamma_dma_quiescent_dual(drm_device_t *dev) { + drm_gamma_private_t *dev_priv = + (drm_gamma_private_t *)dev->dev_private; + while (GAMMA_READ(GAMMA_DMACOUNT)) ; while (GAMMA_READ(GAMMA_INFIFOSPACE) < 3) @@ -119,7 +81,7 @@ static __inline void gamma_dma_quiescent_dual(drm_device_t *dev) GAMMA_WRITE(GAMMA_FILTERMODE, 1 << 10); GAMMA_WRITE(GAMMA_SYNC, 0); - + /* Read from first MX */ do { while (!GAMMA_READ(GAMMA_OUTFIFOWORDS)) @@ -133,43 +95,43 @@ static __inline void gamma_dma_quiescent_dual(drm_device_t *dev) } while (GAMMA_READ(GAMMA_OUTPUTFIFO + 0x10000) != GAMMA_SYNC_TAG); } -static __inline void gamma_dma_ready(drm_device_t *dev) +void gamma_dma_ready(drm_device_t *dev) { + drm_gamma_private_t *dev_priv = + (drm_gamma_private_t *)dev->dev_private; + while (GAMMA_READ(GAMMA_DMACOUNT)) ; } -static __inline int gamma_dma_is_ready(drm_device_t *dev) +static __inline__ int gamma_dma_is_ready(drm_device_t *dev) { + drm_gamma_private_t *dev_priv = + (drm_gamma_private_t *)dev->dev_private; + return !GAMMA_READ(GAMMA_DMACOUNT); } -static void gamma_dma_service(void *arg) +void gamma_dma_service( DRM_OS_IRQ_ARGS) { - drm_device_t *dev = (drm_device_t *)arg; - drm_device_dma_t *dma = dev->dma; - - atomic_inc(&dev->total_irq); + drm_device_t *dev = (drm_device_t *)device; + drm_device_dma_t *dma = dev->dma; + drm_gamma_private_t *dev_priv = + (drm_gamma_private_t *)dev->dev_private; + + atomic_inc(&dev->counts[6]); /* _DRM_STAT_IRQ */ GAMMA_WRITE(GAMMA_GDELAYTIMER, 0xc350/2); /* 0x05S */ GAMMA_WRITE(GAMMA_GCOMMANDINTFLAGS, 8); GAMMA_WRITE(GAMMA_GINTFLAGS, 0x2001); if (gamma_dma_is_ready(dev)) { /* Free previous buffer */ - if (test_and_set_bit(0, &dev->dma_flag)) { - atomic_inc(&dma->total_missed_free); - return; - } + if (test_and_set_bit(0, &dev->dma_flag)) return; if (dma->this_buffer) { - drm_free_buffer(dev, dma->this_buffer); + gamma_free_buffer(dev, dma->this_buffer); dma->this_buffer = NULL; } clear_bit(0, &dev->dma_flag); -#if 0 - /* Dispatch new buffer */ - queue_task(&dev->tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); -#endif } } @@ -182,22 +144,19 @@ static int gamma_do_dma(drm_device_t *dev, int locked) int retcode = 0; drm_device_dma_t *dma = dev->dma; #if DRM_DMA_HISTOGRAM - struct timespec dma_start, dma_stop; + cycles_t dma_start, dma_stop; #endif - if (test_and_set_bit(0, &dev->dma_flag)) { - atomic_inc(&dma->total_missed_dma); - return EBUSY; - } - + if (test_and_set_bit(0, &dev->dma_flag)) DRM_OS_RETURN( EBUSY ); + #if DRM_DMA_HISTOGRAM - getnanotime(&dma_start); + dma_start = get_cycles(); #endif if (!dma->next_buffer) { DRM_ERROR("No next_buffer\n"); clear_bit(0, &dev->dma_flag); - return EINVAL; + DRM_OS_RETURN( EINVAL ); } buf = dma->next_buffer; @@ -208,23 +167,23 @@ static int gamma_do_dma(drm_device_t *dev, int locked) buf->context, buf->idx, length); if (buf->list == DRM_LIST_RECLAIM) { - drm_clear_next_buffer(dev); - drm_free_buffer(dev, buf); + gamma_clear_next_buffer(dev); + gamma_free_buffer(dev, buf); clear_bit(0, &dev->dma_flag); - return EINVAL; + DRM_OS_RETURN( EINVAL ); } if (!length) { DRM_ERROR("0 length buffer\n"); - drm_clear_next_buffer(dev); - drm_free_buffer(dev, buf); + gamma_clear_next_buffer(dev); + gamma_free_buffer(dev, buf); clear_bit(0, &dev->dma_flag); return 0; } - + if (!gamma_dma_is_ready(dev)) { clear_bit(0, &dev->dma_flag); - return EBUSY; + DRM_OS_RETURN( EBUSY ); } if (buf->while_locked) { @@ -234,11 +193,10 @@ static int gamma_do_dma(drm_device_t *dev, int locked) buf->idx, buf->pid); } } else { - if (!locked && !drm_lock_take(&dev->lock.hw_lock->lock, + if (!locked && !gamma_lock_take(&dev->lock.hw_lock->lock, DRM_KERNEL_CONTEXT)) { - atomic_inc(&dma->total_missed_lock); clear_bit(0, &dev->dma_flag); - return EBUSY; + DRM_OS_RETURN( EBUSY ); } } @@ -246,13 +204,14 @@ static int gamma_do_dma(drm_device_t *dev, int locked) && !(dev->queuelist[buf->context]->flags & _DRM_CONTEXT_PRESERVED)) { /* PRE: dev->last_context != buf->context */ - if (drm_context_switch(dev, dev->last_context, buf->context)) { - drm_clear_next_buffer(dev); - drm_free_buffer(dev, buf); + if (DRM(context_switch)(dev, dev->last_context, + buf->context)) { + DRM(clear_next_buffer)(dev); + DRM(free_buffer)(dev, buf); } retcode = EBUSY; goto cleanup; - + /* POST: we will wait for the context switch and will dispatch on a later call when dev->last_context == buf->context. @@ -260,23 +219,23 @@ static int gamma_do_dma(drm_device_t *dev, int locked) TIME! */ } - drm_clear_next_buffer(dev); + gamma_clear_next_buffer(dev); buf->pending = 1; buf->waiting = 0; buf->list = DRM_LIST_PEND; #if DRM_DMA_HISTOGRAM - getnanotime(&buf->time_dispatched); + buf->time_dispatched = get_cycles(); #endif gamma_dma_dispatch(dev, address, length); - drm_free_buffer(dev, dma->this_buffer); + gamma_free_buffer(dev, dma->this_buffer); dma->this_buffer = buf; - atomic_add(length, &dma->total_bytes); - atomic_inc(&dma->total_dmas); + atomic_inc(&dev->counts[7]); /* _DRM_STAT_DMA */ + atomic_add(length, &dev->counts[8]); /* _DRM_STAT_PRIMARY */ if (!buf->while_locked && !dev->context_flag && !locked) { - if (drm_lock_free(dev, &dev->lock.hw_lock->lock, + if (gamma_lock_free(dev, &dev->lock.hw_lock->lock, DRM_KERNEL_CONTEXT)) { DRM_ERROR("\n"); } @@ -286,15 +245,19 @@ cleanup: clear_bit(0, &dev->dma_flag); #if DRM_DMA_HISTOGRAM - getnanotime(&dma_stop); - timespecsub(&dma_stop, &dma_start); - atomic_inc(&dev->histo.ctx[drm_histogram_slot(&dma_stop)]); + dma_stop = get_cycles(); + atomic_inc(&dev->histo.dma[gamma_histogram_slot(dma_stop - dma_start)]); #endif - return retcode; + DRM_OS_RETURN( retcode ); } -static void gamma_dma_schedule_wrapper(void *dev) +static void gamma_dma_timer_bh(unsigned long dev) +{ + gamma_dma_schedule((drm_device_t *)dev, 0); +} + +void gamma_dma_immediate_bh(DRM_OS_TASKQUEUE_ARGS) { gamma_dma_schedule(dev, 0); } @@ -310,24 +273,24 @@ int gamma_dma_schedule(drm_device_t *dev, int locked) int expire = 20; drm_device_dma_t *dma = dev->dma; #if DRM_DMA_HISTOGRAM - struct timespec schedule_start; + cycles_t schedule_start; #endif if (test_and_set_bit(0, &dev->interrupt_flag)) { /* Not reentrant */ - atomic_inc(&dma->total_missed_sched); - return EBUSY; + atomic_inc(&dev->counts[10]); /* _DRM_STAT_MISSED */ + DRM_OS_RETURN( EBUSY ); } - missed = atomic_read(&dma->total_missed_sched); + missed = atomic_read(&dev->counts[10]); #if DRM_DMA_HISTOGRAM - getnanotime(&schedule_start); + schedule_start = get_cycles(); #endif again: if (dev->context_flag) { clear_bit(0, &dev->interrupt_flag); - return EBUSY; + DRM_OS_RETURN( EBUSY ); } if (dma->next_buffer) { /* Unsent buffer that was previously @@ -335,23 +298,18 @@ again: because the lock could not be obtained or the DMA engine wasn't ready. Try again. */ - atomic_inc(&dma->total_tried); - if (!(retcode = gamma_do_dma(dev, locked))) { - atomic_inc(&dma->total_hit); - ++processed; - } + if (!(retcode = gamma_do_dma(dev, locked))) ++processed; } else { do { - next = drm_select_queue(dev, - gamma_dma_schedule_wrapper); + next = gamma_select_queue(dev, gamma_dma_timer_bh); if (next >= 0) { q = dev->queuelist[next]; - buf = drm_waitlist_get(&q->waitlist); + buf = gamma_waitlist_get(&q->waitlist); dma->next_buffer = buf; dma->next_queue = q; if (buf && buf->list == DRM_LIST_RECLAIM) { - drm_clear_next_buffer(dev); - drm_free_buffer(dev, buf); + gamma_clear_next_buffer(dev); + gamma_free_buffer(dev, buf); } } } while (next >= 0 && !dma->next_buffer); @@ -363,33 +321,26 @@ again: } if (--expire) { - if (missed != atomic_read(&dma->total_missed_sched)) { - atomic_inc(&dma->total_lost); + if (missed != atomic_read(&dev->counts[10])) { if (gamma_dma_is_ready(dev)) goto again; } if (processed && gamma_dma_is_ready(dev)) { - atomic_inc(&dma->total_lost); processed = 0; goto again; } } - + clear_bit(0, &dev->interrupt_flag); - + #if DRM_DMA_HISTOGRAM - { - struct timespec ts; - getnanotime(&ts); - timespecsub(&ts, &schedule_start); - atomic_inc(&dev->histo.schedule[drm_histogram_slot(&ts)]); - } + atomic_inc(&dev->histo.schedule[gamma_histogram_slot(get_cycles() + - schedule_start)]); #endif return retcode; } static int gamma_dma_priority(drm_device_t *dev, drm_dma_t *d) { - struct proc *p = curproc; unsigned long address; unsigned long length; int must_free = 0; @@ -399,7 +350,7 @@ static int gamma_dma_priority(drm_device_t *dev, drm_dma_t *d) drm_buf_t *buf; drm_buf_t *last_buf = NULL; drm_device_dma_t *dma = dev->dma; - static int never; + static int never; /* Turn off interrupt handling */ while (test_and_set_bit(0, &dev->interrupt_flag)) { @@ -408,7 +359,7 @@ static int gamma_dma_priority(drm_device_t *dev, drm_dma_t *d) return retcode; } if (!(d->flags & _DRM_DMA_WHILE_LOCKED)) { - while (!drm_lock_take(&dev->lock.hw_lock->lock, + while (!gamma_lock_take(&dev->lock.hw_lock->lock, DRM_KERNEL_CONTEXT)) { retcode = tsleep(&never, PZERO|PCATCH, "gamp2", 1); if (retcode) @@ -416,7 +367,6 @@ static int gamma_dma_priority(drm_device_t *dev, drm_dma_t *d) } ++must_free; } - atomic_inc(&dma->total_prio); for (i = 0; i < d->send_count; i++) { idx = d->send_indices[i]; @@ -426,15 +376,15 @@ static int gamma_dma_priority(drm_device_t *dev, drm_dma_t *d) continue; } buf = dma->buflist[ idx ]; - if (buf->pid != p->p_pid) { + if (buf->pid != DRM_OS_CURRENTPID) { DRM_ERROR("Process %d using buffer owned by %d\n", - p->p_pid, buf->pid); + DRM_OS_CURRENTPID, buf->pid); retcode = EINVAL; goto cleanup; } if (buf->list != DRM_LIST_NONE) { DRM_ERROR("Process %d using %d's buffer on list %d\n", - p->p_pid, buf->pid, buf->list); + DRM_OS_CURRENTPID, buf->pid, buf->list); retcode = EINVAL; goto cleanup; } @@ -467,14 +417,13 @@ static int gamma_dma_priority(drm_device_t *dev, drm_dma_t *d) goto cleanup; } buf->pending = 1; - + if (dev->last_context != buf->context && !(dev->queuelist[buf->context]->flags & _DRM_CONTEXT_PRESERVED)) { - atomic_inc(&dev->context_wait); - /* PRE: dev->last_context != buf->context */ - drm_context_switch(dev, dev->last_context, - buf->context); + /* PRE: dev->last_context != buf->context */ + DRM(context_switch)(dev, dev->last_context, + buf->context); /* POST: we will wait for the context switch and will dispatch on a later call when dev->last_context == buf->context. @@ -482,7 +431,6 @@ static int gamma_dma_priority(drm_device_t *dev, drm_dma_t *d) TIME! */ retcode = tsleep(&dev->context_wait, PZERO|PCATCH, "gamctx", 0); - atomic_dec(&dev->context_wait); if (retcode) goto cleanup; if (dev->last_context != buf->context) { @@ -493,15 +441,15 @@ static int gamma_dma_priority(drm_device_t *dev, drm_dma_t *d) } #if DRM_DMA_HISTOGRAM - getnanotime(&buf->time_queued); + buf->time_queued = get_cycles(); buf->time_dispatched = buf->time_queued; #endif gamma_dma_dispatch(dev, address, length); - atomic_add(length, &dma->total_bytes); - atomic_inc(&dma->total_dmas); - + atomic_inc(&dev->counts[9]); /* _DRM_STAT_SPECIAL */ + atomic_add(length, &dev->counts[8]); /* _DRM_STAT_PRIMARY */ + if (last_buf) { - drm_free_buffer(dev, last_buf); + gamma_free_buffer(dev, last_buf); } last_buf = buf; } @@ -510,40 +458,40 @@ static int gamma_dma_priority(drm_device_t *dev, drm_dma_t *d) cleanup: if (last_buf) { gamma_dma_ready(dev); - drm_free_buffer(dev, last_buf); + gamma_free_buffer(dev, last_buf); } - + if (must_free && !dev->context_flag) { - if (drm_lock_free(dev, &dev->lock.hw_lock->lock, + if (gamma_lock_free(dev, &dev->lock.hw_lock->lock, DRM_KERNEL_CONTEXT)) { DRM_ERROR("\n"); } } clear_bit(0, &dev->interrupt_flag); - return retcode; + DRM_OS_RETURN( retcode ); } static int gamma_dma_send_buffers(drm_device_t *dev, drm_dma_t *d) { - struct proc *p = curproc; drm_buf_t *last_buf = NULL; int retcode = 0; drm_device_dma_t *dma = dev->dma; - - if ((retcode = drm_dma_enqueue(dev, d))) { - return retcode; - } - - gamma_dma_schedule(dev, 0); - if (d->flags & _DRM_DMA_BLOCK) { last_buf = dma->buflist[d->send_indices[d->send_count-1]]; atomic_inc(&last_buf->dma_wait); } + if ((retcode = gamma_dma_enqueue(dev, d))) { + if (d->flags & _DRM_DMA_BLOCK) + atomic_dec(&last_buf->dma_wait); + return retcode; + } + + gamma_dma_schedule(dev, 0); + if (d->flags & _DRM_DMA_BLOCK) { - DRM_DEBUG("%d waiting\n", p->p_pid); + DRM_DEBUG("%d waiting\n", DRM_OS_CURRENTPID); for (;;) { retcode = tsleep(&last_buf->dma_wait, PZERO|PCATCH, "gamdw", 0); @@ -553,13 +501,12 @@ static int gamma_dma_send_buffers(drm_device_t *dev, drm_dma_t *d) if (retcode) break; } - - DRM_DEBUG("%d running\n", p->p_pid); atomic_dec(&last_buf->dma_wait); + DRM_DEBUG("%d running\n", DRM_OS_CURRENTPID); if (!retcode || (last_buf->list==DRM_LIST_PEND && !last_buf->pending)) { if (!last_buf->dma_wait) { - drm_free_buffer(dev, last_buf); + gamma_free_buffer(dev, last_buf); } } if (retcode) { @@ -571,254 +518,49 @@ static int gamma_dma_send_buffers(drm_device_t *dev, drm_dma_t *d) last_buf->idx, last_buf->list, last_buf->pid, - p->p_pid); + DRM_OS_CURRENTPID); } } - return retcode; + DRM_OS_RETURN( retcode ); } -int gamma_dma(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) +int gamma_dma( DRM_OS_IOCTL ) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_device_dma_t *dma = dev->dma; int retcode = 0; drm_dma_t d; - d = *(drm_dma_t *) data; - DRM_DEBUG("%d %d: %d send, %d req\n", - p->p_pid, d.context, d.send_count, d.request_count); + DRM_OS_KRNFROMUSR(d, (drm_dma_t *) data, sizeof(d)); - if (d.context == DRM_KERNEL_CONTEXT || d.context >= dev->queue_slots) { - DRM_ERROR("Process %d using context %d\n", - p->p_pid, d.context); - return EINVAL; - } if (d.send_count < 0 || d.send_count > dma->buf_count) { DRM_ERROR("Process %d trying to send %d buffers (of %d max)\n", - p->p_pid, d.send_count, dma->buf_count); - return EINVAL; + DRM_OS_CURRENTPID, d.send_count, dma->buf_count); + DRM_OS_RETURN( EINVAL ); } + if (d.request_count < 0 || d.request_count > dma->buf_count) { DRM_ERROR("Process %d trying to get %d buffers (of %d max)\n", - p->p_pid, d.request_count, dma->buf_count); - return EINVAL; + DRM_OS_CURRENTPID, d.request_count, dma->buf_count); + DRM_OS_RETURN( EINVAL ); } if (d.send_count) { if (d.flags & _DRM_DMA_PRIORITY) retcode = gamma_dma_priority(dev, &d); - else + else retcode = gamma_dma_send_buffers(dev, &d); } d.granted_count = 0; if (!retcode && d.request_count) { - retcode = drm_dma_get_buffers(dev, &d); + retcode = gamma_dma_get_buffers(dev, &d); } DRM_DEBUG("%d returning, granted = %d\n", - p->p_pid, d.granted_count); - *(drm_dma_t *) data = d; + DRM_OS_CURRENTPID, d.granted_count); + DRM_OS_KRNTOUSR((drm_dma_t *) data, d, sizeof(d)); return retcode; } - -int gamma_irq_install(drm_device_t *dev, int irq) -{ - int rid; - int retcode; - - if (!irq) return EINVAL; - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - if (dev->irq) { - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - return EBUSY; - } - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - DRM_DEBUG("%d\n", irq); - - dev->context_flag = 0; - dev->interrupt_flag = 0; - dev->dma_flag = 0; - - dev->dma->next_buffer = NULL; - dev->dma->next_queue = NULL; - dev->dma->this_buffer = NULL; - -#if 0 - dev->tq.next = NULL; - dev->tq.sync = 0; - dev->tq.routine = gamma_dma_schedule_tq_wrapper; - dev->tq.data = dev; -#endif - /* Before installing handler */ - GAMMA_WRITE(GAMMA_GCOMMANDMODE, 0); - GAMMA_WRITE(GAMMA_GDMACONTROL, 0); - - /* Install handler */ - rid = 0; - dev->irq = bus_alloc_resource(dev->device, SYS_RES_IRQ, &rid, - 0, ~0, 1, RF_SHAREABLE); - if (!dev->irq) - return ENOENT; - - retcode = bus_setup_intr(dev->device, dev->irq, INTR_TYPE_TTY, - gamma_dma_service, dev, &dev->irqh); - if (retcode) { - bus_release_resource(dev->device, SYS_RES_IRQ, 0, dev->irq); - dev->irq = 0; - return retcode; - } - - /* After installing handler */ - GAMMA_WRITE(GAMMA_GINTENABLE, 0x2001); - GAMMA_WRITE(GAMMA_COMMANDINTENABLE, 0x0008); - GAMMA_WRITE(GAMMA_GDELAYTIMER, 0x39090); - - return 0; -} - -int gamma_irq_uninstall(drm_device_t *dev) -{ - if (!dev->irq) - return EINVAL; - - DRM_DEBUG("%ld\n", rman_get_start(dev->irq)); - - GAMMA_WRITE(GAMMA_GDELAYTIMER, 0); - GAMMA_WRITE(GAMMA_COMMANDINTENABLE, 0); - GAMMA_WRITE(GAMMA_GINTENABLE, 0); - - bus_teardown_intr(dev->device, dev->irq, dev->irqh); - bus_release_resource(dev->device, SYS_RES_IRQ, 0, dev->irq); - dev->irq = 0; - - return 0; -} - - -int gamma_control(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_control_t ctl; - int retcode; - - ctl = *(drm_control_t *) data; - - switch (ctl.func) { - case DRM_INST_HANDLER: - if ((retcode = gamma_irq_install(dev, ctl.irq))) - return retcode; - break; - case DRM_UNINST_HANDLER: - if ((retcode = gamma_irq_uninstall(dev))) - return retcode; - break; - default: - return EINVAL; - } - return 0; -} - -int gamma_lock(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - int ret = 0; - drm_lock_t lock; - drm_queue_t *q; -#if DRM_DMA_HISTOGRAM - struct timespec start; - - getnanotime(&start); - dev->lck_start = start; -#endif - - lock = *(drm_lock_t *) data; - - if (lock.context == DRM_KERNEL_CONTEXT) { - DRM_ERROR("Process %d using kernel context %d\n", - p->p_pid, lock.context); - return EINVAL; - } - - DRM_DEBUG("%d (pid %d) requests lock (0x%08x), flags = 0x%08x\n", - lock.context, p->p_pid, dev->lock.hw_lock->lock, - lock.flags); - - if (lock.context < 0 || lock.context >= dev->queue_count) - return EINVAL; - q = dev->queuelist[lock.context]; - - ret = drm_flush_block_and_flush(dev, lock.context, lock.flags); - - if (!ret) { - if (_DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) - != lock.context) { - long j = ticks - dev->lock.lock_time; - - if (j > 0 && j <= DRM_LOCK_SLICE) { - /* Can't take lock if we just had it and - there is contention. */ - static int never; - ret = tsleep(&never, PZERO|PCATCH, - "gaml1", j); - if (ret) - return ret; - } - } - atomic_inc(&dev->lock.lock_queue); - for (;;) { - if (!dev->lock.hw_lock) { - /* Device has been unregistered */ - ret = EINTR; - break; - } - if (drm_lock_take(&dev->lock.hw_lock->lock, - lock.context)) { - dev->lock.pid = p->p_pid; - dev->lock.lock_time = ticks; - atomic_inc(&dev->total_locks); - atomic_inc(&q->total_locks); - break; /* Got lock */ - } - - /* Contention */ - atomic_inc(&dev->total_sleeps); - ret = tsleep(&dev->lock.lock_queue, PZERO|PCATCH, - "gaml2", 0); - if (ret) - break; - } - atomic_dec(&dev->lock.lock_queue); - } - - drm_flush_unblock(dev, lock.context, lock.flags); /* cleanup phase */ - - if (!ret) { - if (lock.flags & _DRM_LOCK_READY) - gamma_dma_ready(dev); - if (lock.flags & _DRM_LOCK_QUIESCENT) { - if (gamma_found() == 1) { - gamma_dma_quiescent_single(dev); - } else { - gamma_dma_quiescent_dual(dev); - } - } - } - DRM_DEBUG("%d %s\n", lock.context, ret ? "interrupted" : "has lock"); - -#if DRM_DMA_HISTOGRAM - { - struct timespec ts; - getnanotime(&ts); - timespecsub(&ts, &start); - atomic_inc(&dev->histo.lacq[drm_histogram_slot(&ts)]); - } -#endif - - return ret; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_drv.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_drv.c index 8663a2ac0..e58d853c9 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_drv.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_drv.c @@ -1,4 +1,4 @@ -/* gamma.c -- 3dlabs GMX 2000 driver -*- c -*- +/* gamma.c -- 3dlabs GMX 2000 driver -*- linux-c -*- * Created: Mon Jan 4 08:58:31 1999 by faith@precisioninsight.com * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. @@ -11,11 +11,11 @@ * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL @@ -23,607 +23,65 @@ * 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: * Rickard E. (Rik) Faith <faith@valinux.com> - * + * Gareth Hughes <gareth@valinux.com> */ +#include <sys/types.h> +#include <sys/bus.h> +#include <pci/pcivar.h> +#include <opt_drm_linux.h> +#include "gamma.h" #include "drmP.h" #include "gamma_drv.h" -#include <pci/pcivar.h> - -MODULE_DEPEND(gamma, drm, 1, 1, 1); - -#ifndef PCI_DEVICE_ID_3DLABS_GAMMA -#define PCI_DEVICE_ID_3DLABS_GAMMA 0x0008 -#endif -#ifndef PCI_DEVICE_ID_3DLABS_MX -#define PCI_DEVICE_ID_3DLABS_MX 0x0006 -#endif -#ifndef PCI_VENDOR_ID_3DLABS -#define PCI_VENDOR_ID_3DLABS 0x3d3d -#endif - -static int gamma_init(device_t nbdev); -static void gamma_cleanup(device_t nbdev); - -static int gamma_probe(device_t dev) -{ - const char *s = 0; - - switch (pci_get_devid(dev)) { - case 0x00083d3d: - s = "3D Labs Gamma graphics accelerator"; - break; - - case 0x00063d3d: - s = "3D Labs MX graphics accelerator"; - break; - } - - if (s) { - device_set_desc(dev, s); - return 0; - } - - return ENXIO; -} - -static int gamma_attach(device_t dev) -{ - gamma_init(dev); - return 0; -} - -static int gamma_detach(device_t dev) -{ - gamma_cleanup(dev); - return 0; -} - -static device_method_t gamma_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, gamma_probe), - DEVMETHOD(device_attach, gamma_attach), - DEVMETHOD(device_detach, gamma_detach), - - { 0, 0 } -}; - -static driver_t gamma_driver = { - "drm", - gamma_methods, - sizeof(drm_device_t), -}; - -static devclass_t gamma_devclass; -#define GAMMA_SOFTC(unit) \ - ((drm_device_t *) devclass_get_softc(gamma_devclass, unit)) - -DRIVER_MODULE(if_gamma, pci, gamma_driver, gamma_devclass, 0, 0); - -#define GAMMA_NAME "gamma" -#define GAMMA_DESC "3dlabs GMX 2000" -#define GAMMA_DATE "20000606" -#define GAMMA_MAJOR 1 -#define GAMMA_MINOR 0 -#define GAMMA_PATCHLEVEL 0 +#define DRIVER_AUTHOR "VA Linux Systems Inc." -#define CDEV_MAJOR 200 +#define DRIVER_NAME "gamma" +#define DRIVER_DESC "3DLabs gamma" +#define DRIVER_DATE "20010216" -static struct cdevsw gamma_cdevsw = { - /* open */ gamma_open, - /* close */ gamma_close, - /* read */ drm_read, - /* write */ drm_write, - /* ioctl */ gamma_ioctl, - /* poll */ nopoll, - /* mmap */ drm_mmap, - /* strategy */ nostrategy, - /* name */ "gamma", - /* maj */ CDEV_MAJOR, - /* dump */ nodump, - /* psize */ nopsize, - /* flags */ D_TTY | D_TRACKCLOSE, - /* bmaj */ -1 -}; +#define DRIVER_MAJOR 1 +#define DRIVER_MINOR 0 +#define DRIVER_PATCHLEVEL 0 -static drm_ioctl_desc_t gamma_ioctls[] = { - [DRM_IOCTL_NR(DRM_IOCTL_VERSION)] = { gamma_version, 0, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE)] = { drm_getunique, 0, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_GET_MAGIC)] = { drm_getmagic, 0, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_IRQ_BUSID)] = { drm_irq_busid, 0, 1 }, +#define DRIVER_IOCTLS \ + [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { gamma_dma, 1, 0 } - [DRM_IOCTL_NR(DRM_IOCTL_SET_UNIQUE)] = { drm_setunique, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_BLOCK)] = { drm_block, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_UNBLOCK)] = { drm_unblock, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_CONTROL)] = { gamma_control, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_AUTH_MAGIC)] = { drm_authmagic, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP)] = { drm_addmap, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_ADD_BUFS)] = { drm_addbufs, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_MARK_BUFS)] = { drm_markbufs, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_INFO_BUFS)] = { drm_infobufs, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_MAP_BUFS)] = { drm_mapbufs, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_FREE_BUFS)] = { drm_freebufs, 1, 0 }, - - [DRM_IOCTL_NR(DRM_IOCTL_ADD_CTX)] = { drm_addctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_RM_CTX)] = { drm_rmctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_MOD_CTX)] = { drm_modctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_GET_CTX)] = { drm_getctx, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_SWITCH_CTX)] = { drm_switchctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_NEW_CTX)] = { drm_newctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_RES_CTX)] = { drm_resctx, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_ADD_DRAW)] = { drm_adddraw, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_RM_DRAW)] = { drm_rmdraw, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { gamma_dma, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_LOCK)] = { gamma_lock, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_UNLOCK)] = { gamma_unlock, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_FINISH)] = { drm_finish, 1, 0 }, +/* List acquired from http://www.yourvote.com/pci/pcihdr.h and xc/xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h + * Please report to anholt@teleport.com inaccuracies or if a chip you have works that is marked unsupported here. + */ +drm_chipinfo_t DRM(devicelist)[] = { + {0x3d3d, 0x0008, 1, "3DLabs Gamma"}, + {0, 0, 0, NULL} }; -#define GAMMA_IOCTL_COUNT DRM_ARRAY_SIZE(gamma_ioctls) - -static int devices = 0; - -static int gamma_setup(drm_device_t *dev) -{ - int i; - - device_busy(dev->device); - - atomic_set(&dev->ioctl_count, 0); - atomic_set(&dev->vma_count, 0); - dev->buf_use = 0; - atomic_set(&dev->buf_alloc, 0); - - drm_dma_setup(dev); - - atomic_set(&dev->total_open, 0); - atomic_set(&dev->total_close, 0); - atomic_set(&dev->total_ioctl, 0); - atomic_set(&dev->total_irq, 0); - atomic_set(&dev->total_ctx, 0); - atomic_set(&dev->total_locks, 0); - atomic_set(&dev->total_unlocks, 0); - atomic_set(&dev->total_contends, 0); - atomic_set(&dev->total_sleeps, 0); - - for (i = 0; i < DRM_HASH_SIZE; i++) { - dev->magiclist[i].head = NULL; - dev->magiclist[i].tail = NULL; - } - dev->maplist = NULL; - dev->map_count = 0; - dev->vmalist = NULL; - dev->lock.hw_lock = NULL; - dev->lock.lock_queue = 0; - dev->queue_count = 0; - dev->queue_reserved = 0; - dev->queue_slots = 0; - dev->queuelist = NULL; - dev->irq = 0; - dev->context_flag = 0; - dev->interrupt_flag = 0; - dev->dma_flag = 0; - dev->last_context = 0; - dev->last_switch = 0; - dev->last_checked = 0; - callout_init(&dev->timer); - dev->context_wait = 0; -#if DRM_DMA_HISTO - memset(&dev->histo, 0, sizeof(dev->histo)); -#endif - timespecclear(&dev->ctx_start); - timespecclear(&dev->lck_start); - - dev->buf_rp = dev->buf; - dev->buf_wp = dev->buf; - dev->buf_end = dev->buf + DRM_BSZ; - dev->buf_sigio = NULL; - - DRM_DEBUG("\n"); - - /* The kernel's context could be created here, but is now created - in drm_dma_enqueue. This is more resource-efficient for - hardware that does not do DMA, but may mean that - drm_select_queue fails between the time the interrupt is - initialized and the time the queues are initialized. */ - - return 0; -} - - -static int -gamma_takedown(drm_device_t *dev) -{ - int i; - drm_magic_entry_t *pt, *next; - drm_map_t *map; - drm_vma_entry_t *vma, *vma_next; - - DRM_DEBUG("\n"); - - if (dev->irq) gamma_irq_uninstall(dev); - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - callout_stop(&dev->timer); - - if (dev->devname) { - drm_free(dev->devname, strlen(dev->devname)+1, DRM_MEM_DRIVER); - dev->devname = NULL; - } - - if (dev->unique) { - drm_free(dev->unique, strlen(dev->unique)+1, DRM_MEM_DRIVER); - dev->unique = NULL; - dev->unique_len = 0; - } - /* Clear pid list */ - for (i = 0; i < DRM_HASH_SIZE; i++) { - for (pt = dev->magiclist[i].head; pt; pt = next) { - next = pt->next; - drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC); - } - dev->magiclist[i].head = dev->magiclist[i].tail = NULL; - } - - /* Clear vma list (only built for debugging) */ - if (dev->vmalist) { - for (vma = dev->vmalist; vma; vma = vma_next) { - vma_next = vma->next; - drm_free(vma, sizeof(*vma), DRM_MEM_VMAS); - } - dev->vmalist = NULL; - } - - /* Clear map area and mtrr information */ - if (dev->maplist) { - for (i = 0; i < dev->map_count; i++) { - map = dev->maplist[i]; - switch (map->type) { - case _DRM_REGISTERS: - case _DRM_FRAME_BUFFER: -#ifdef CONFIG_MTRR - if (map->mtrr >= 0) { - int retcode; - retcode = mtrr_del(map->mtrr, - map->offset, - map->size); - DRM_DEBUG("mtrr_del = %d\n", retcode); - } -#endif - drm_ioremapfree(map->handle, map->size); - break; - case _DRM_SHM: - drm_free_pages((unsigned long)map->handle, - drm_order(map->size) - - PAGE_SHIFT, - DRM_MEM_SAREA); - break; - case _DRM_AGP: - /* Do nothing here, because this is all - handled in the AGP/GART driver. */ - break; - } - drm_free(map, sizeof(*map), DRM_MEM_MAPS); - } - drm_free(dev->maplist, - dev->map_count * sizeof(*dev->maplist), - DRM_MEM_MAPS); - dev->maplist = NULL; - dev->map_count = 0; - } - - if (dev->queuelist) { - for (i = 0; i < dev->queue_count; i++) { - drm_waitlist_destroy(&dev->queuelist[i]->waitlist); - if (dev->queuelist[i]) { - drm_free(dev->queuelist[i], - sizeof(*dev->queuelist[0]), - DRM_MEM_QUEUES); - dev->queuelist[i] = NULL; - } - } - drm_free(dev->queuelist, - dev->queue_slots * sizeof(*dev->queuelist), - DRM_MEM_QUEUES); - dev->queuelist = NULL; - } - - drm_dma_takedown(dev); - - dev->queue_count = 0; - if (dev->lock.hw_lock) { - dev->lock.hw_lock = NULL; /* SHM removed */ - dev->lock.pid = 0; - wakeup(&dev->lock.lock_queue); - } - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - device_unbusy(dev->device); - - return 0; -} - -int gamma_found(void) -{ - return devices; -} - -static int -gamma_find_devices(device_t dev) -{ - device_t *children, child; - int nchildren, i; - int count = 0; - - if (device_get_children(device_get_parent(dev), &children, &nchildren)) - return 0; - - for (i = 0; i < nchildren; i++) { - child = children[i]; - - if (pci_get_slot(dev) == pci_get_slot(child) && - pci_get_vendor(child) == PCI_VENDOR_ID_3DLABS && - pci_get_device(child) == PCI_DEVICE_ID_3DLABS_MX) { - count++; - } - } - free(children, M_TEMP); - - /* we don't currently support more than two */ - if (count > 2) count = 2; - - return count; -} - -/* gamma_init is called via gamma_attach at module load time */ - -static int -gamma_init(device_t nbdev) -{ - drm_device_t *dev = device_get_softc(nbdev); - - DRM_DEBUG("\n"); - - memset((void *)dev, 0, sizeof(*dev)); - simple_lock_init(&dev->count_lock); - lockinit(&dev->dev_lock, PZERO, "drmlk", 0, 0); - -#if 0 /* XXX use getenv I guess */ - drm_parse_options(gamma); -#endif - devices = gamma_find_devices(nbdev); - if (devices == 0) return -1; - -#if 0 - if ((retcode = misc_register(&gamma_misc))) { - DRM_ERROR("Cannot register \"%s\"\n", GAMMA_NAME); - return retcode; - } -#endif - dev->device = nbdev; - dev->devnode = make_dev(&gamma_cdevsw, - device_get_unit(nbdev), - DRM_DEV_UID, - DRM_DEV_GID, - DRM_DEV_MODE, - GAMMA_NAME); - dev->name = GAMMA_NAME; - - drm_mem_init(); - drm_sysctl_init(dev); - - DRM_INFO("Initialized %s %d.%d.%d %s on minor %d with %d MX devices\n", - GAMMA_NAME, - GAMMA_MAJOR, - GAMMA_MINOR, - GAMMA_PATCHLEVEL, - GAMMA_DATE, - device_get_unit(nbdev), - devices); - - return 0; -} - -/* gamma_cleanup is called via gamma_detach at module unload time. */ - -static void -gamma_cleanup(device_t nbdev) -{ - drm_device_t *dev = device_get_softc(nbdev); - - DRM_DEBUG("\n"); - - drm_sysctl_cleanup(dev); -#if 0 - if (misc_deregister(&gamma_misc)) { - DRM_ERROR("Cannot unload module\n"); - } else { - DRM_INFO("Module unloaded\n"); - } -#endif - device_busy(dev->device); - gamma_takedown(dev); -} - -SYSUNINIT(gamma_cleanup, SI_SUB_DRIVERS, SI_ORDER_ANY, gamma_cleanup, 0); - -#if 0 -int gamma_version(struct inode *inode, struct file *filp, unsigned int cmd, - unsigned long arg) -{ - drm_version_t version; - int len; - - copy_from_user_ret(&version, - (drm_version_t *)arg, - sizeof(version), - -EFAULT); - -#define DRM_COPY(name,value) \ - len = strlen(value); \ - if (len > name##_len) len = name##_len; \ - name##_len = strlen(value); \ - if (len && name) { \ - copy_to_user_ret(name, value, len, -EFAULT); \ - } - - version.version_major = GAMMA_MAJOR; - version.version_minor = GAMMA_MINOR; - version.version_patchlevel = GAMMA_PATCHLEVEL; - - DRM_COPY(version.name, GAMMA_NAME); - DRM_COPY(version.date, GAMMA_DATE); - DRM_COPY(version.desc, GAMMA_DESC); - - copy_to_user_ret((drm_version_t *)arg, - &version, - sizeof(version), - -EFAULT); - return 0; -} -#endif - -int -gamma_open(dev_t kdev, int flags, int fmt, struct proc *p) -{ - drm_device_t *dev = GAMMA_SOFTC(minor(kdev)); - int retcode = 0; - - DRM_DEBUG("open_count = %d\n", dev->open_count); - - device_busy(dev->device); - if (!(retcode = drm_open_helper(kdev, flags, fmt, p, dev))) { - atomic_inc(&dev->total_open); - simple_lock(&dev->count_lock); - if (!dev->open_count++) { - simple_unlock(&dev->count_lock); - retcode = gamma_setup(dev); - } - simple_unlock(&dev->count_lock); - } - device_unbusy(dev->device); - - return retcode; -} - -int -gamma_close(dev_t kdev, int flags, int fmt, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - int retcode = 0; - - DRM_DEBUG("open_count = %d\n", dev->open_count); - if (!(retcode = drm_close(kdev, flags, fmt, p))) { - atomic_inc(&dev->total_close); - simple_lock(&dev->count_lock); - if (!--dev->open_count) { - if (atomic_read(&dev->ioctl_count) || dev->blocked) { - DRM_ERROR("Device busy: %d %d\n", - atomic_read(&dev->ioctl_count), - dev->blocked); - simple_unlock(&dev->count_lock); - return EBUSY; - } - simple_unlock(&dev->count_lock); - return gamma_takedown(dev); - } - simple_unlock(&dev->count_lock); - } - return retcode; -} - -/* drm_ioctl is called whenever a process performs an ioctl on /dev/drm. */ - -int -gamma_ioctl(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - int nr = DRM_IOCTL_NR(cmd); - drm_device_t *dev = kdev->si_drv1; - drm_file_t *priv; - int retcode = 0; - drm_ioctl_desc_t *ioctl; - d_ioctl_t *func; - - priv = drm_find_file_by_proc(dev, p); - if (!priv) { - DRM_DEBUG("can't find authenticator\n"); - return EINVAL; - } - - atomic_inc(&dev->ioctl_count); - atomic_inc(&dev->total_ioctl); - ++priv->ioctl_count; - - DRM_DEBUG("pid = %d, cmd = 0x%02lx, nr = 0x%02x, auth = %d\n", - p->p_pid, cmd, nr, priv->authenticated); - - switch (cmd) { - case FIOSETOWN: - return fsetown(*(int *)data, &dev->buf_sigio); - case FIOGETOWN: - *(int *) data = fgetown(dev->buf_sigio); - return 0; - } - if (nr >= GAMMA_IOCTL_COUNT) { - retcode = EINVAL; - } else { - ioctl = &gamma_ioctls[nr]; - func = ioctl->func; +#define __HAVE_COUNTERS 5 +#define __HAVE_COUNTER6 _DRM_STAT_IRQ +#define __HAVE_COUNTER7 _DRM_STAT_DMA +#define __HAVE_COUNTER8 _DRM_STAT_PRIMARY +#define __HAVE_COUNTER9 _DRM_STAT_SPECIAL +#define __HAVE_COUNTER10 _DRM_STAT_MISSED - if (!func) { - DRM_DEBUG("no function\n"); - retcode = EINVAL; - } else if ((ioctl->root_only && suser(p)) - || (ioctl->auth_needed && !priv->authenticated)) { - retcode = EACCES; - } else { - retcode = (func)(kdev, cmd, data, flags, p); - } - } - - atomic_dec(&dev->ioctl_count); - return retcode; -} -int gamma_unlock(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_lock_t *lockp = (drm_lock_t *) data; +#include "drm_auth.h" +#include "drm_bufs.h" +#include "drm_context.h" +#include "drm_dma.h" +#include "drm_drawable.h" +#include "drm_drv.h" - if (lockp->context == DRM_KERNEL_CONTEXT) { - DRM_ERROR("Process %d using kernel context %d\n", - p->p_pid, lockp->context); - return -EINVAL; - } - DRM_DEBUG("%d frees lock (%d holds)\n", - lockp->context, - _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); - atomic_inc(&dev->total_unlocks); - if (_DRM_LOCK_IS_CONT(dev->lock.hw_lock->lock)) - atomic_inc(&dev->total_contends); - drm_lock_transfer(dev, &dev->lock.hw_lock->lock, DRM_KERNEL_CONTEXT); - gamma_dma_schedule(dev, 1); - if (!dev->context_flag) { - if (drm_lock_free(dev, &dev->lock.hw_lock->lock, - DRM_KERNEL_CONTEXT)) { - DRM_ERROR("\n"); - } - } +#include "drm_fops.h" +#include "drm_init.h" +#include "drm_ioctl.h" +#include "drm_lists.h" +#include "drm_lock.h" +#include "drm_memory.h" +#include "drm_vm.h" +#include "drm_sysctl.h" -#if DRM_DMA_HISTOGRAM - { - struct timespec ts; - getnanotime(&ts); - timespecsub(&ts, &dev->lck_start); - atomic_inc(&dev->histo.lhld[drm_histogram_slot(&ts)]); - } -#endif - - return 0; -} +DRIVER_MODULE(gamma, pci, gamma_driver, gamma_devclass, 0, 0); diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_drv.h b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_drv.h index b7c6df5dc..f86655164 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_drv.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/gamma/gamma_drv.h @@ -1,4 +1,4 @@ -/* gamma_drv.h -- Private header for 3dlabs GMX 2000 driver -*- c -*- +/* gamma_drv.h -- Private header for 3dlabs GMX 2000 driver -*- linux-c -*- * Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. @@ -11,11 +11,11 @@ * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL @@ -23,26 +23,82 @@ * 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: + * Rickard E. (Rik) Faith <faith@valinux.com> + * */ #ifndef _GAMMA_DRV_H_ #define _GAMMA_DRV_H_ - /* gamma_drv.c */ -extern d_open_t gamma_open; -extern d_close_t gamma_close; -extern d_ioctl_t gamma_ioctl; -extern d_ioctl_t gamma_version; -extern d_ioctl_t gamma_dma; -extern d_ioctl_t gamma_lock; -extern d_ioctl_t gamma_unlock; -extern d_ioctl_t gamma_control; + +typedef struct drm_gamma_private { + drm_map_t *buffers; + drm_map_t *mmio0; + drm_map_t *mmio1; + drm_map_t *mmio2; + drm_map_t *mmio3; +} drm_gamma_private_t; + +#define LOCK_TEST_WITH_RETURN( dev ) \ +do { \ + if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) || \ + dev->lock.pid != DRM_OS_CURRENTPID ) { \ + DRM_ERROR( "%s called without lock held\n", \ + __FUNCTION__ ); \ + DRM_OS_RETURN( EINVAL ); \ + } \ +} while (0) + + +extern void gamma_dma_ready(drm_device_t *dev); +extern void gamma_dma_quiescent_single(drm_device_t *dev); +extern void gamma_dma_quiescent_dual(drm_device_t *dev); /* gamma_dma.c */ extern int gamma_dma_schedule(drm_device_t *dev, int locked); -extern int gamma_irq_install(drm_device_t *dev, int irq); -extern int gamma_irq_uninstall(drm_device_t *dev); +extern int gamma_dma( DRM_OS_IOCTL ); +extern int gamma_find_devices(void); extern int gamma_found(void); + +#define GAMMA_OFF(reg) \ + ((reg < 0x1000) \ + ? reg \ + : ((reg < 0x10000) \ + ? (reg - 0x1000) \ + : ((reg < 0x11000) \ + ? (reg - 0x10000) \ + : (reg - 0x11000)))) + +#define GAMMA_BASE(reg) ((unsigned long) \ + ((reg < 0x1000) ? dev_priv->mmio0->handle : \ + ((reg < 0x10000) ? dev_priv->mmio1->handle : \ + ((reg < 0x11000) ? dev_priv->mmio2->handle : \ + dev_priv->mmio3->handle)))) + +#define GAMMA_ADDR(reg) (GAMMA_BASE(reg) + GAMMA_OFF(reg)) +#define GAMMA_DEREF(reg) *(__volatile__ int *)GAMMA_ADDR(reg) +#define GAMMA_READ(reg) GAMMA_DEREF(reg) +#define GAMMA_WRITE(reg,val) do { GAMMA_DEREF(reg) = val; } while (0) + +#define GAMMA_BROADCASTMASK 0x9378 +#define GAMMA_COMMANDINTENABLE 0x0c48 +#define GAMMA_DMAADDRESS 0x0028 +#define GAMMA_DMACOUNT 0x0030 +#define GAMMA_FILTERMODE 0x8c00 +#define GAMMA_GCOMMANDINTFLAGS 0x0c50 +#define GAMMA_GCOMMANDMODE 0x0c40 +#define GAMMA_GCOMMANDSTATUS 0x0c60 +#define GAMMA_GDELAYTIMER 0x0c38 +#define GAMMA_GDMACONTROL 0x0060 +#define GAMMA_GINTENABLE 0x0808 +#define GAMMA_GINTFLAGS 0x0810 +#define GAMMA_INFIFOSPACE 0x0018 +#define GAMMA_OUTFIFOWORDS 0x0020 +#define GAMMA_OUTPUTFIFO 0x2000 +#define GAMMA_SYNC 0x8c40 +#define GAMMA_SYNC_TAG 0x0188 + #endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/i810/Makefile b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/i810/Makefile new file mode 100644 index 000000000..c518c7ef5 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/i810/Makefile @@ -0,0 +1,25 @@ +# $FreeBSD$ + +KMOD= i810 +NOMAN= YES +SRCS= i810_drv.c i810_dma.c +SRCS+= device_if.h bus_if.h pci_if.h opt_drm_linux.h +CFLAGS+= ${DEBUG_FLAGS} -I. -I.. + +@: + ln -sf /sys @ + +machine: + ln -sf /sys/i386/include machine + +.if ${MACHINE_ARCH} == "i386" +# This line enables linux ioctl handling +# If you want support for this uncomment this line +#I810_OPTS= "\#define DRM_LINUX" 1 +.endif + +opt_drm_linux.h: + touch opt_drm_linux.h + echo $(I810_OPTS) >> opt_drm_linux.h + +.include <bsd.kmod.mk> diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/i810_drm.h b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/i810_drm.h new file mode 100644 index 000000000..f2114dd15 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/i810_drm.h @@ -0,0 +1,201 @@ +#ifndef _I810_DRM_H_ +#define _I810_DRM_H_ + +/* WARNING: These defines must be the same as what the Xserver uses. + * if you change them, you must change the defines in the Xserver. + */ + +#ifndef _I810_DEFINES_ +#define _I810_DEFINES_ + +#define I810_DMA_BUF_ORDER 12 +#define I810_DMA_BUF_SZ (1<<I810_DMA_BUF_ORDER) +#define I810_DMA_BUF_NR 256 +#define I810_NR_SAREA_CLIPRECTS 8 + +/* Each region is a minimum of 64k, and there are at most 64 of them. + */ +#define I810_NR_TEX_REGIONS 64 +#define I810_LOG_MIN_TEX_REGION_SIZE 16 +#endif + +#define I810_UPLOAD_TEX0IMAGE 0x1 /* handled clientside */ +#define I810_UPLOAD_TEX1IMAGE 0x2 /* handled clientside */ +#define I810_UPLOAD_CTX 0x4 +#define I810_UPLOAD_BUFFERS 0x8 +#define I810_UPLOAD_TEX0 0x10 +#define I810_UPLOAD_TEX1 0x20 +#define I810_UPLOAD_CLIPRECTS 0x40 + + +/* Indices into buf.Setup where various bits of state are mirrored per + * context and per buffer. These can be fired at the card as a unit, + * or in a piecewise fashion as required. + */ + +/* Destbuffer state + * - backbuffer linear offset and pitch -- invarient in the current dri + * - zbuffer linear offset and pitch -- also invarient + * - drawing origin in back and depth buffers. + * + * Keep the depth/back buffer state here to acommodate private buffers + * in the future. + */ +#define I810_DESTREG_DI0 0 /* CMD_OP_DESTBUFFER_INFO (2 dwords) */ +#define I810_DESTREG_DI1 1 +#define I810_DESTREG_DV0 2 /* GFX_OP_DESTBUFFER_VARS (2 dwords) */ +#define I810_DESTREG_DV1 3 +#define I810_DESTREG_DR0 4 /* GFX_OP_DRAWRECT_INFO (4 dwords) */ +#define I810_DESTREG_DR1 5 +#define I810_DESTREG_DR2 6 +#define I810_DESTREG_DR3 7 +#define I810_DESTREG_DR4 8 +#define I810_DEST_SETUP_SIZE 10 + +/* Context state + */ +#define I810_CTXREG_CF0 0 /* GFX_OP_COLOR_FACTOR */ +#define I810_CTXREG_CF1 1 +#define I810_CTXREG_ST0 2 /* GFX_OP_STIPPLE */ +#define I810_CTXREG_ST1 3 +#define I810_CTXREG_VF 4 /* GFX_OP_VERTEX_FMT */ +#define I810_CTXREG_MT 5 /* GFX_OP_MAP_TEXELS */ +#define I810_CTXREG_MC0 6 /* GFX_OP_MAP_COLOR_STAGES - stage 0 */ +#define I810_CTXREG_MC1 7 /* GFX_OP_MAP_COLOR_STAGES - stage 1 */ +#define I810_CTXREG_MC2 8 /* GFX_OP_MAP_COLOR_STAGES - stage 2 */ +#define I810_CTXREG_MA0 9 /* GFX_OP_MAP_ALPHA_STAGES - stage 0 */ +#define I810_CTXREG_MA1 10 /* GFX_OP_MAP_ALPHA_STAGES - stage 1 */ +#define I810_CTXREG_MA2 11 /* GFX_OP_MAP_ALPHA_STAGES - stage 2 */ +#define I810_CTXREG_SDM 12 /* GFX_OP_SRC_DEST_MONO */ +#define I810_CTXREG_FOG 13 /* GFX_OP_FOG_COLOR */ +#define I810_CTXREG_B1 14 /* GFX_OP_BOOL_1 */ +#define I810_CTXREG_B2 15 /* GFX_OP_BOOL_2 */ +#define I810_CTXREG_LCS 16 /* GFX_OP_LINEWIDTH_CULL_SHADE_MODE */ +#define I810_CTXREG_PV 17 /* GFX_OP_PV_RULE -- Invarient! */ +#define I810_CTXREG_ZA 18 /* GFX_OP_ZBIAS_ALPHAFUNC */ +#define I810_CTXREG_AA 19 /* GFX_OP_ANTIALIAS */ +#define I810_CTX_SETUP_SIZE 20 + +/* Texture state (per tex unit) + */ +#define I810_TEXREG_MI0 0 /* GFX_OP_MAP_INFO (4 dwords) */ +#define I810_TEXREG_MI1 1 +#define I810_TEXREG_MI2 2 +#define I810_TEXREG_MI3 3 +#define I810_TEXREG_MF 4 /* GFX_OP_MAP_FILTER */ +#define I810_TEXREG_MLC 5 /* GFX_OP_MAP_LOD_CTL */ +#define I810_TEXREG_MLL 6 /* GFX_OP_MAP_LOD_LIMITS */ +#define I810_TEXREG_MCS 7 /* GFX_OP_MAP_COORD_SETS ??? */ +#define I810_TEX_SETUP_SIZE 8 + +#define I810_FRONT 0x1 +#define I810_BACK 0x2 +#define I810_DEPTH 0x4 + + +typedef struct _drm_i810_init { + enum { + I810_INIT_DMA = 0x01, + I810_CLEANUP_DMA = 0x02 + } func; +#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0) + int ring_map_idx; + int buffer_map_idx; +#else + unsigned int mmio_offset; + unsigned int buffers_offset; +#endif + int sarea_priv_offset; + unsigned int ring_start; + unsigned int ring_end; + unsigned int ring_size; + unsigned int front_offset; + unsigned int back_offset; + unsigned int depth_offset; + unsigned int overlay_offset; + unsigned int overlay_physical; + unsigned int w; + unsigned int h; + unsigned int pitch; + unsigned int pitch_bits; +} drm_i810_init_t; + +/* Warning: If you change the SAREA structure you must change the Xserver + * structure as well */ + +typedef struct _drm_i810_tex_region { + unsigned char next, prev; /* indices to form a circular LRU */ + unsigned char in_use; /* owned by a client, or free? */ + int age; /* tracked by clients to update local LRU's */ +} drm_i810_tex_region_t; + +typedef struct _drm_i810_sarea { + unsigned int ContextState[I810_CTX_SETUP_SIZE]; + unsigned int BufferState[I810_DEST_SETUP_SIZE]; + unsigned int TexState[2][I810_TEX_SETUP_SIZE]; + unsigned int dirty; + + unsigned int nbox; + drm_clip_rect_t boxes[I810_NR_SAREA_CLIPRECTS]; + + /* Maintain an LRU of contiguous regions of texture space. If + * you think you own a region of texture memory, and it has an + * age different to the one you set, then you are mistaken and + * it has been stolen by another client. If global texAge + * hasn't changed, there is no need to walk the list. + * + * These regions can be used as a proxy for the fine-grained + * texture information of other clients - by maintaining them + * in the same lru which is used to age their own textures, + * clients have an approximate lru for the whole of global + * texture space, and can make informed decisions as to which + * areas to kick out. There is no need to choose whether to + * kick out your own texture or someone else's - simply eject + * them all in LRU order. + */ + + drm_i810_tex_region_t texList[I810_NR_TEX_REGIONS+1]; + /* Last elt is sentinal */ + int texAge; /* last time texture was uploaded */ + int last_enqueue; /* last time a buffer was enqueued */ + int last_dispatch; /* age of the most recently dispatched buffer */ + int last_quiescent; /* */ + int ctxOwner; /* last context to upload state */ + + int vertex_prim; + +} drm_i810_sarea_t; + +typedef struct _drm_i810_clear { + int clear_color; + int clear_depth; + int flags; +} drm_i810_clear_t; + + + +/* These may be placeholders if we have more cliprects than + * I810_NR_SAREA_CLIPRECTS. In that case, the client sets discard to + * false, indicating that the buffer will be dispatched again with a + * new set of cliprects. + */ +typedef struct _drm_i810_vertex { + int idx; /* buffer index */ + int used; /* nr bytes in use */ + int discard; /* client is finished with the buffer? */ +} drm_i810_vertex_t; + +typedef struct _drm_i810_copy_t { + int idx; /* buffer index */ + int used; /* nr bytes in use */ + void *address; /* Address to copy from */ +} drm_i810_copy_t; + +typedef struct drm_i810_dma { + void *virtual; + int request_idx; + int request_size; + int granted; +} drm_i810_dma_t; + +#endif /* _I810_DRM_H_ */ diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/Makefile b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/Makefile index 226728b5f..bbaeaa567 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/Makefile +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/Makefile @@ -1,11 +1,10 @@ # $FreeBSD$ -KMOD = mga -SRCS = mga_drv.c mga_context.c mga_state.c mga_bufs.c mga_dma.c -SRCS += device_if.h bus_if.h pci_if.h -CFLAGS += ${DEBUG_FLAGS} -I.. -KERN = /usr/src/sys -KMODDEPS = drm +KMOD= mga +NOMAN= YES +SRCS= mga_drv.c mga_state.c mga_warp.c mga_dma.c +SRCS+= device_if.h bus_if.h pci_if.h opt_drm_linux.h +CFLAGS+= ${DEBUG_FLAGS} -I. -I.. @: ln -sf /sys @ @@ -13,4 +12,14 @@ KMODDEPS = drm machine: ln -sf /sys/i386/include machine +.if ${MACHINE_ARCH} == "i386" +# This line enables linux ioctl handling +# If you want support for this uncomment this line +#MGA_OPTS= "\#define DRM_LINUX" 1 +.endif + +opt_drm_linux.h: + touch opt_drm_linux.h + echo $(MGA_OPTS) >> opt_drm_linux.h + .include <bsd.kmod.mk> diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_bufs.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_bufs.c deleted file mode 100644 index 4ae05181b..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_bufs.c +++ /dev/null @@ -1,604 +0,0 @@ -/* mga_bufs.c -- IOCTLs to manage buffers - * Created: Thu Jan 6 01:47:26 2000 by jhartmann@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: Rickard E. (Rik) Faith <faith@valinux.com> - * Jeff Hartmann <jhartmann@valinux.com> - * - * - */ - -#define __NO_VERSION__ -#include "drmP.h" -#include "mga_drv.h" -#include <sys/mman.h> -#include <vm/vm.h> -#include <vm/pmap.h> -#include <vm/vm_extern.h> -#include <vm/vm_map.h> - - -static int -mga_addbufs_agp(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - drm_buf_desc_t request; - drm_buf_entry_t *entry; - drm_buf_t *buf; - unsigned long offset; - unsigned long agp_offset; - int count; - int order; - int size; - int alignment; - int page_order; - int total; - int byte_count; - int i; - - if (!dma) return EINVAL; - - request = *(drm_buf_desc_t *) data; - - count = request.count; - order = drm_order(request.size); - size = 1 << order; - agp_offset = request.agp_start; - alignment = (request.flags & _DRM_PAGE_ALIGN) ? round_page(size) :size; - page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0; - total = PAGE_SIZE << page_order; - byte_count = 0; - - DRM_DEBUG("count: %d\n", count); - DRM_DEBUG("order: %d\n", order); - DRM_DEBUG("size: %d\n", size); - DRM_DEBUG("agp_offset: %ld\n", agp_offset); - DRM_DEBUG("alignment: %d\n", alignment); - DRM_DEBUG("page_order: %d\n", page_order); - DRM_DEBUG("total: %d\n", total); - DRM_DEBUG("byte_count: %d\n", byte_count); - - if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) return EINVAL; - if (dev->queue_count) return EBUSY; /* Not while in use */ - simple_lock(&dev->count_lock); - if (dev->buf_use) { - simple_unlock(&dev->count_lock); - return EBUSY; - } - atomic_inc(&dev->buf_alloc); - simple_unlock(&dev->count_lock); - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - entry = &dma->bufs[order]; - if (entry->buf_count) { - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - atomic_dec(&dev->buf_alloc); - return ENOMEM; /* May only call once for each order */ - } - - entry->buflist = drm_alloc(count * sizeof(*entry->buflist), - DRM_MEM_BUFS); - if (!entry->buflist) { - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - atomic_dec(&dev->buf_alloc); - return ENOMEM; - } - memset(entry->buflist, 0, count * sizeof(*entry->buflist)); - - entry->buf_size = size; - entry->page_order = page_order; - offset = 0; - - - while(entry->buf_count < count) { - buf = &entry->buflist[entry->buf_count]; - buf->idx = dma->buf_count + entry->buf_count; - buf->total = alignment; - buf->order = order; - buf->used = 0; - - DRM_DEBUG("offset : %ld\n", offset); - - buf->offset = offset; /* Hrm */ - buf->bus_address = dev->agp->base + agp_offset + offset; - buf->address = (void *)(agp_offset + offset + dev->agp->base); - buf->next = NULL; - buf->waiting = 0; - buf->pending = 0; - buf->dma_wait = 0; - buf->pid = 0; - - buf->dev_private = drm_alloc(sizeof(drm_mga_buf_priv_t), DRM_MEM_BUFS); - buf->dev_priv_size = sizeof(drm_mga_buf_priv_t); - -#if DRM_DMA_HISTOGRAM - timespecclear(&buf->time_queued); - timespecclear(&buf->time_dispatched); - timespecclear(&buf->time_completed); - timespecclear(&buf->time_freed); -#endif - offset = offset + alignment; - entry->buf_count++; - byte_count += PAGE_SIZE << page_order; - - DRM_DEBUG("buffer %d @ %p\n", - entry->buf_count, buf->address); - } - - dma->buflist = drm_realloc(dma->buflist, - dma->buf_count * sizeof(*dma->buflist), - (dma->buf_count + entry->buf_count) - * sizeof(*dma->buflist), - DRM_MEM_BUFS); - for (i = dma->buf_count; i < dma->buf_count + entry->buf_count; i++) - dma->buflist[i] = &entry->buflist[i - dma->buf_count]; - - dma->buf_count += entry->buf_count; - - DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); - - dma->byte_count += byte_count; - - DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count); - - drm_freelist_create(&entry->freelist, entry->buf_count); - for (i = 0; i < entry->buf_count; i++) { - drm_freelist_put(dev, &entry->freelist, &entry->buflist[i]); - } - - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - request.count = entry->buf_count; - request.size = size; - - *(drm_buf_desc_t *) data = request; - - atomic_dec(&dev->buf_alloc); - - DRM_DEBUG("count: %d\n", count); - DRM_DEBUG("order: %d\n", order); - DRM_DEBUG("size: %d\n", size); - DRM_DEBUG("agp_offset: %ld\n", agp_offset); - DRM_DEBUG("alignment: %d\n", alignment); - DRM_DEBUG("page_order: %d\n", page_order); - DRM_DEBUG("total: %d\n", total); - DRM_DEBUG("byte_count: %d\n", byte_count); - - dma->flags = _DRM_DMA_USE_AGP; - - DRM_DEBUG("dma->flags : %x\n", dma->flags); - - return 0; -} - -static int -mga_addbufs_pci(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - drm_buf_desc_t request; - int count; - int order; - int size; - int total; - int page_order; - drm_buf_entry_t *entry; - unsigned long page; - drm_buf_t *buf; - int alignment; - unsigned long offset; - int i; - int byte_count; - int page_count; - - if (!dma) return EINVAL; - - request = *(drm_buf_desc_t *) data; - - count = request.count; - order = drm_order(request.size); - size = 1 << order; - - DRM_DEBUG("count = %d, size = %d (%d), order = %d, queue_count = %d\n", - request.count, request.size, size, order, dev->queue_count); - - if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) return EINVAL; - if (dev->queue_count) return EBUSY; /* Not while in use */ - - alignment = (request.flags & _DRM_PAGE_ALIGN) ? round_page(size) :size; - page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0; - total = PAGE_SIZE << page_order; - - simple_lock(&dev->count_lock); - if (dev->buf_use) { - simple_unlock(&dev->count_lock); - return EBUSY; - } - atomic_inc(&dev->buf_alloc); - simple_unlock(&dev->count_lock); - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - entry = &dma->bufs[order]; - if (entry->buf_count) { - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - atomic_dec(&dev->buf_alloc); - return ENOMEM; /* May only call once for each order */ - } - - entry->buflist = drm_alloc(count * sizeof(*entry->buflist), - DRM_MEM_BUFS); - if (!entry->buflist) { - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - atomic_dec(&dev->buf_alloc); - return ENOMEM; - } - memset(entry->buflist, 0, count * sizeof(*entry->buflist)); - - entry->seglist = drm_alloc(count * sizeof(*entry->seglist), - DRM_MEM_SEGS); - if (!entry->seglist) { - drm_free(entry->buflist, - count * sizeof(*entry->buflist), - DRM_MEM_BUFS); - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - atomic_dec(&dev->buf_alloc); - return ENOMEM; - } - memset(entry->seglist, 0, count * sizeof(*entry->seglist)); - - dma->pagelist = drm_realloc(dma->pagelist, - dma->page_count * sizeof(*dma->pagelist), - (dma->page_count + (count << page_order)) - * sizeof(*dma->pagelist), - DRM_MEM_PAGES); - DRM_DEBUG("pagelist: %d entries\n", - dma->page_count + (count << page_order)); - - - entry->buf_size = size; - entry->page_order = page_order; - byte_count = 0; - page_count = 0; - while (entry->buf_count < count) { - if (!(page = drm_alloc_pages(page_order, DRM_MEM_DMA))) break; - entry->seglist[entry->seg_count++] = page; - for (i = 0; i < (1 << page_order); i++) { - DRM_DEBUG("page %d @ 0x%08lx\n", - dma->page_count + page_count, - page + PAGE_SIZE * i); - dma->pagelist[dma->page_count + page_count++] - = page + PAGE_SIZE * i; - } - for (offset = 0; - offset + size <= total && entry->buf_count < count; - offset += alignment, ++entry->buf_count) { - buf = &entry->buflist[entry->buf_count]; - buf->idx = dma->buf_count + entry->buf_count; - buf->total = alignment; - buf->order = order; - buf->used = 0; - buf->offset = (dma->byte_count + byte_count + offset); - buf->address = (void *)(page + offset); - buf->next = NULL; - buf->waiting = 0; - buf->pending = 0; - buf->dma_wait = 0; - buf->pid = 0; -#if DRM_DMA_HISTOGRAM - timespecclear(&buf->time_queued); - timespecclear(&buf->time_dispatched); - timespecclear(&buf->time_completed); - timespecclear(&buf->time_freed); -#endif - DRM_DEBUG("buffer %d @ %p\n", - entry->buf_count, buf->address); - } - byte_count += PAGE_SIZE << page_order; - } - - dma->buflist = drm_realloc(dma->buflist, - dma->buf_count * sizeof(*dma->buflist), - (dma->buf_count + entry->buf_count) - * sizeof(*dma->buflist), - DRM_MEM_BUFS); - for (i = dma->buf_count; i < dma->buf_count + entry->buf_count; i++) - dma->buflist[i] = &entry->buflist[i - dma->buf_count]; - - dma->buf_count += entry->buf_count; - dma->seg_count += entry->seg_count; - dma->page_count += entry->seg_count << page_order; - dma->byte_count += PAGE_SIZE * (entry->seg_count << page_order); - - drm_freelist_create(&entry->freelist, entry->buf_count); - for (i = 0; i < entry->buf_count; i++) { - drm_freelist_put(dev, &entry->freelist, &entry->buflist[i]); - } - - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - request.count = entry->buf_count; - request.size = size; - - *(drm_buf_desc_t *) data = request; - - atomic_dec(&dev->buf_alloc); - return 0; -} - -int -mga_addbufs(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_buf_desc_t request; - - request = *(drm_buf_desc_t *) data; - - if(request.flags & _DRM_AGP_BUFFER) - return mga_addbufs_agp(kdev, cmd, data, flags, p); - else - return mga_addbufs_pci(kdev, cmd, data, flags, p); -} - -int -mga_infobufs(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - drm_buf_info_t request; - int i; - int count; - int error; - - if (!dma) return EINVAL; - - simple_lock(&dev->count_lock); - if (atomic_read(&dev->buf_alloc)) { - simple_unlock(&dev->count_lock); - return EBUSY; - } - ++dev->buf_use; /* Can't allocate more after this call */ - simple_unlock(&dev->count_lock); - - request = *(drm_buf_info_t *) data; - - for (i = 0, count = 0; i < DRM_MAX_ORDER+1; i++) { - if (dma->bufs[i].buf_count) ++count; - } - - DRM_DEBUG("count = %d\n", count); - - if (request.count >= count) { - for (i = 0, count = 0; i < DRM_MAX_ORDER+1; i++) { - if (dma->bufs[i].buf_count) { - error = copyout(&dma->bufs[i].buf_count, - &request.list[count].count, - sizeof(dma->bufs[0] - .buf_count)); - if (error) return error; - error = copyout(&dma->bufs[i].buf_size, - &request.list[count].size, - sizeof(dma->bufs[0] - .buf_size)); - if (error) return error; - error = copyout(&dma->bufs[i] - .freelist.low_mark, - &request.list[count].low_mark, - sizeof(dma->bufs[0] - .freelist.low_mark)); - if (error) return error; - error = copyout(&dma->bufs[i] - .freelist.high_mark, - &request.list[count].high_mark, - sizeof(dma->bufs[0] - .freelist.high_mark)); - if (error) return error; - DRM_DEBUG("%d %d %d %d %d\n", - i, - dma->bufs[i].buf_count, - dma->bufs[i].buf_size, - dma->bufs[i].freelist.low_mark, - dma->bufs[i].freelist.high_mark); - ++count; - } - } - } - request.count = count; - - *(drm_buf_info_t *) data = request; - - return 0; -} - -int -mga_markbufs(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - drm_buf_desc_t request; - int order; - drm_buf_entry_t *entry; - - if (!dma) return EINVAL; - - request = *(drm_buf_desc_t *) data; - - DRM_DEBUG("%d, %d, %d\n", - request.size, request.low_mark, request.high_mark); - order = drm_order(request.size); - if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) return EINVAL; - entry = &dma->bufs[order]; - - if (request.low_mark < 0 || request.low_mark > entry->buf_count) - return EINVAL; - if (request.high_mark < 0 || request.high_mark > entry->buf_count) - return EINVAL; - - entry->freelist.low_mark = request.low_mark; - entry->freelist.high_mark = request.high_mark; - - return 0; -} - -int -mga_freebufs(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - drm_buf_free_t request; - int i; - int error; - int idx; - drm_buf_t *buf; - - if (!dma) return EINVAL; - - request = *(drm_buf_free_t *) data; - - DRM_DEBUG("%d\n", request.count); - for (i = 0; i < request.count; i++) { - error = copyin(&request.list[i], - &idx, - sizeof(idx)); - if (error) return error; - if (idx < 0 || idx >= dma->buf_count) { - DRM_ERROR("Index %d (of %d max)\n", - idx, dma->buf_count - 1); - return EINVAL; - } - buf = dma->buflist[idx]; - if (buf->pid != p->p_pid) { - DRM_ERROR("Process %d freeing buffer owned by %d\n", - p->p_pid, buf->pid); - return EINVAL; - } - drm_free_buffer(dev, buf); - } - - return 0; -} - -int -mga_mapbufs(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - int retcode = 0; - const int zero = 0; - vm_offset_t virtual; - vm_offset_t address; - drm_buf_map_t request; - int i; - - if (!dma) return EINVAL; - - DRM_DEBUG("\n"); - - simple_lock(&dev->count_lock); - if (atomic_read(&dev->buf_alloc)) { - simple_unlock(&dev->count_lock); - DRM_DEBUG("Busy\n"); - return EBUSY; - } - ++dev->buf_use; /* Can't allocate more after this call */ - simple_unlock(&dev->count_lock); - - request = *(drm_buf_map_t *) data; - - DRM_DEBUG("mga_mapbufs\n"); - DRM_DEBUG("dma->flags : %x\n", dma->flags); - - if (request.count >= dma->buf_count) { - if(dma->flags & _DRM_DMA_USE_AGP) { - drm_mga_private_t *dev_priv = dev->dev_private; - drm_map_t *map = NULL; - - map = dev->maplist[dev_priv->buffer_map_idx]; - if (!map) { - DRM_DEBUG("map is null\n"); - retcode = EINVAL; - goto done; - } - - DRM_DEBUG("map->offset : %lx\n", map->offset); - DRM_DEBUG("map->size : %lx\n", map->size); - DRM_DEBUG("map->type : %d\n", map->type); - DRM_DEBUG("map->flags : %x\n", map->flags); - DRM_DEBUG("map->handle : %p\n", map->handle); - DRM_DEBUG("map->mtrr : %d\n", map->mtrr); - virtual = 0; - retcode = vm_mmap(&p->p_vmspace->vm_map, - &virtual, - map->size, - PROT_READ|PROT_WRITE, VM_PROT_ALL, - MAP_SHARED, - SLIST_FIRST(&kdev->si_hlist), - map->offset); - } else { - virtual = 0; - retcode = vm_mmap(&p->p_vmspace->vm_map, - &virtual, - round_page(dma->byte_count), - PROT_READ|PROT_WRITE, VM_PROT_ALL, - MAP_SHARED, - SLIST_FIRST(&kdev->si_hlist), - 0); - } - if (retcode) { - /* Real error */ - DRM_DEBUG("mmap error\n"); - goto done; - } - request.virtual = (void *)virtual; - - for (i = 0; i < dma->buf_count; i++) { - retcode = copyout(&dma->buflist[i]->idx, - &request.list[i].idx, - sizeof(request.list[0].idx)); - if (retcode) goto done; - retcode = copyout(&dma->buflist[i]->total, - &request.list[i].total, - sizeof(request.list[0].total)); - if (retcode) goto done; - retcode = copyout(&zero, - &request.list[i].used, - sizeof(request.list[0].used)); - if (retcode) goto done; - address = virtual + dma->buflist[i]->offset; - retcode = copyout(&address, - &request.list[i].address, - sizeof(address)); - if (retcode) goto done; - } - } - done: - request.count = dma->buf_count; - DRM_DEBUG("%d buffers, retcode = %d\n", request.count, retcode); - - *(drm_buf_map_t *) data = request; - - DRM_DEBUG("retcode : %d\n", retcode); - - return retcode; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_context.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_context.c deleted file mode 100644 index 63515bab3..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_context.c +++ /dev/null @@ -1,200 +0,0 @@ -/* mga_context.c -- IOCTLs for mga contexts - * Created: Mon Dec 13 09:51:35 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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. - * - * Author: Rickard E. (Rik) Faith <faith@valinux.com> - * Jeff Hartmann <jhartmann@valinux.com> - * - */ - -#define __NO_VERSION__ -#include "drmP.h" -#include "mga_drv.h" - -static int mga_alloc_queue(drm_device_t *dev) -{ - int temp = drm_ctxbitmap_next(dev); - DRM_DEBUG("mga_alloc_queue: %d\n", temp); - return temp; -} - -int mga_context_switch(drm_device_t *dev, int old, int new) -{ - char buf[64]; - - atomic_inc(&dev->total_ctx); - - if (test_and_set_bit(0, &dev->context_flag)) { - DRM_ERROR("Reentering -- FIXME\n"); - return EBUSY; - } - -#if DRM_DMA_HISTOGRAM - getnanotime(&dev->ctx_start); -#endif - - DRM_DEBUG("Context switch from %d to %d\n", old, new); - - if (new == dev->last_context) { - clear_bit(0, &dev->context_flag); - return 0; - } - - if (drm_flags & DRM_FLAG_NOCTX) { - mga_context_switch_complete(dev, new); - } else { - sprintf(buf, "C %d %d\n", old, new); - drm_write_string(dev, buf); - } - - return 0; -} - -int mga_context_switch_complete(drm_device_t *dev, int new) -{ - dev->last_context = new; /* PRE/POST: This is the _only_ writer. */ - dev->last_switch = ticks; - - if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("Lock isn't held after context switch\n"); - } - - /* If a context switch is ever initiated - when the kernel holds the lock, release - that lock here. */ -#if DRM_DMA_HISTOGRAM - { - struct timespec ts; - getnanotime(&ts); - timespecsub(&ts, &dev->lck_start); - atomic_inc(&dev->histo.ctx[drm_histogram_slot(&ts)]); - } -#endif - clear_bit(0, &dev->context_flag); - wakeup(&dev->context_wait); - - return 0; -} - -int -mga_resctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_ctx_res_t res; - drm_ctx_t ctx; - int i, error; - - DRM_DEBUG("%d\n", DRM_RESERVED_CONTEXTS); - res = *(drm_ctx_res_t *) data; - if (res.count >= DRM_RESERVED_CONTEXTS) { - memset(&ctx, 0, sizeof(ctx)); - for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) { - ctx.handle = i; - error = copyout(&i, &res.contexts[i], sizeof(i)); - if (error) return error; - } - } - res.count = DRM_RESERVED_CONTEXTS; - *(drm_ctx_res_t *) data = res; - return 0; -} - -int -mga_addctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - if ((ctx.handle = mga_alloc_queue(dev)) == DRM_KERNEL_CONTEXT) { - /* Skip kernel's context and get a new one. */ - ctx.handle = mga_alloc_queue(dev); - } - if (ctx.handle == -1) { - DRM_DEBUG("Not enough free contexts.\n"); - /* Should this return EBUSY instead? */ - return ENOMEM; - } - DRM_DEBUG("%d\n", ctx.handle); - *(drm_ctx_t *) data = ctx; - return 0; -} - -int -mga_modctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - /* This does nothing for the mga */ - return 0; -} - -int mga_getctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - /* This is 0, because we don't hanlde any context flags */ - ctx.flags = 0; - *(drm_ctx_t *) data = ctx; - return 0; -} - -int mga_switchctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - DRM_DEBUG("%d\n", ctx.handle); - return mga_context_switch(dev, dev->last_context, ctx.handle); -} - -int mga_newctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - DRM_DEBUG("%d\n", ctx.handle); - mga_context_switch_complete(dev, ctx.handle); - - return 0; -} - -int mga_rmctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - DRM_DEBUG("%d\n", ctx.handle); -/* - if(ctx.handle == DRM_KERNEL_CONTEXT+1) - priv->remove_auth_on_close = 1; -*/ - if(ctx.handle != DRM_KERNEL_CONTEXT ) { - drm_ctxbitmap_free(dev, ctx.handle); - } - - return 0; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_dma.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_dma.c index 85c29df7e..9ed5d0950 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_dma.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_dma.c @@ -1,4 +1,4 @@ -/* mga_dma.c -- DMA support for mga g200/g400 +/* mga_dma.c -- DMA support for mga g200/g400 -*- linux-c -*- * Created: Mon Dec 13 01:50:01 1999 by jhartmann@precisioninsight.com * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. @@ -11,11 +11,11 @@ * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL @@ -24,1054 +24,796 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * - * Authors: Rickard E. (Rik) Faith <faith@valinux.com> - * Jeff Hartmann <jhartmann@valinux.com> - * Keith Whitwell <keithw@valinux.com> + * Authors: + * Rickard E. (Rik) Faith <faith@valinux.com> + * Jeff Hartmann <jhartmann@valinux.com> + * Keith Whitwell <keithw@valinux.com> * + * Rewritten by: + * Gareth Hughes <gareth@valinux.com> */ #define __NO_VERSION__ +#include "mga.h" #include "drmP.h" #include "mga_drv.h" -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> -#include <vm/vm.h> -#include <vm/pmap.h> -#define MGA_REG(reg) 2 -#define MGA_BASE(reg) ((unsigned long) \ - ((drm_device_t *)dev)->maplist[MGA_REG(reg)]->handle) -#define MGA_ADDR(reg) (MGA_BASE(reg) + reg) -#define MGA_DEREF(reg) *(__volatile__ int *)MGA_ADDR(reg) -#define MGA_READ(reg) MGA_DEREF(reg) -#define MGA_WRITE(reg,val) do { MGA_DEREF(reg) = val; } while (0) +#define MGA_DEFAULT_USEC_TIMEOUT 10000 +#define MGA_FREELIST_DEBUG 0 -#define PDEA_pagpxfer_enable 0x2 -static int mga_flush_queue(drm_device_t *dev); +/* ================================================================ + * Engine control + */ -static unsigned long mga_alloc_page(drm_device_t *dev) +int mga_do_wait_for_idle( drm_mga_private_t *dev_priv ) { - unsigned long address; - - DRM_DEBUG("%s\n", __FUNCTION__); + u32 status = 0; + int i; + DRM_DEBUG( "%s\n", __FUNCTION__ ); - address = (unsigned long) drm_alloc(PAGE_SIZE, DRM_MEM_DMA); - if(address == 0UL) { - return 0; + for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { + status = MGA_READ( MGA_STATUS ) & MGA_ENGINE_IDLE_MASK; + if ( status == MGA_ENDPRDMASTS ) { + MGA_WRITE8( MGA_CRTC_INDEX, 0 ); + return 0; + } + DRM_OS_DELAY( 1 ); } - - return address; + +#if MGA_DMA_DEBUG + DRM_ERROR( "failed!\n" ); + DRM_INFO( " status=0x%08x\n", status ); +#endif + DRM_OS_RETURN(EBUSY); } -static void mga_free_page(drm_device_t *dev, unsigned long page) +int mga_do_dma_idle( drm_mga_private_t *dev_priv ) { - DRM_DEBUG("%s\n", __FUNCTION__); + u32 status = 0; + int i; + DRM_DEBUG( "%s\n", __FUNCTION__ ); - if(page == 0UL) { - return; + for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { + status = MGA_READ( MGA_STATUS ) & MGA_DMA_IDLE_MASK; + if ( status == MGA_ENDPRDMASTS ) return 0; + DRM_OS_DELAY( 1 ); } - drm_free((void *) page, PAGE_SIZE, DRM_MEM_DMA); - return; -} -static void mga_delay(void) -{ - return; +#if MGA_DMA_DEBUG + DRM_ERROR( "failed! status=0x%08x\n", status ); +#endif + DRM_OS_RETURN(EBUSY); } -void mga_flush_write_combine(void) +int mga_do_dma_reset( drm_mga_private_t *dev_priv ) { - int xchangeDummy; - DRM_DEBUG("%s\n", __FUNCTION__); + drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; + drm_mga_primary_buffer_t *primary = &dev_priv->prim; - __asm__ volatile(" push %%eax ; xchg %%eax, %0 ; pop %%eax" : : "m" (xchangeDummy)); - __asm__ volatile(" push %%eax ; push %%ebx ; push %%ecx ; push %%edx ;" - " movl $0,%%eax ; cpuid ; pop %%edx ; pop %%ecx ; pop %%ebx ;" - " pop %%eax" : /* no outputs */ : /* no inputs */ ); -} + DRM_DEBUG( "%s\n", __FUNCTION__ ); -/* These are two age tags that will never be sent to - * the hardware */ -#define MGA_BUF_USED 0xffffffff -#define MGA_BUF_FREE 0 + /* The primary DMA stream should look like new right about now. + */ + primary->tail = 0; + primary->space = primary->size; + primary->last_flush = 0; -static int mga_freelist_init(drm_device_t *dev) -{ - drm_device_dma_t *dma = dev->dma; - drm_buf_t *buf; - drm_mga_buf_priv_t *buf_priv; - drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; - drm_mga_freelist_t *item; - int i; - - DRM_DEBUG("%s\n", __FUNCTION__); - - dev_priv->head = drm_alloc(sizeof(drm_mga_freelist_t), DRM_MEM_DRIVER); - if(dev_priv->head == NULL) return ENOMEM; - memset(dev_priv->head, 0, sizeof(drm_mga_freelist_t)); - dev_priv->head->age = MGA_BUF_USED; - - for (i = 0; i < dma->buf_count; i++) { - buf = dma->buflist[ i ]; - buf_priv = buf->dev_private; - item = drm_alloc(sizeof(drm_mga_freelist_t), - DRM_MEM_DRIVER); - if(item == NULL) return ENOMEM; - memset(item, 0, sizeof(drm_mga_freelist_t)); - item->age = MGA_BUF_FREE; - item->prev = dev_priv->head; - item->next = dev_priv->head->next; - if(dev_priv->head->next != NULL) - dev_priv->head->next->prev = item; - if(item->next == NULL) dev_priv->tail = item; - item->buf = buf; - buf_priv->my_freelist = item; - buf_priv->discard = 0; - dev_priv->head->next = item; - } - - return 0; -} + sarea_priv->last_wrap = 0; -static void mga_freelist_cleanup(drm_device_t *dev) -{ - drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; - drm_mga_freelist_t *item; - drm_mga_freelist_t *prev; + /* FIXME: Reset counters, buffer ages etc... + */ - DRM_DEBUG("%s\n", __FUNCTION__); + /* FIXME: What else do we need to reinitialize? WARP stuff? + */ - item = dev_priv->head; - while(item) { - prev = item; - item = item->next; - drm_free(prev, sizeof(drm_mga_freelist_t), DRM_MEM_DRIVER); - } - - dev_priv->head = dev_priv->tail = NULL; + return 0; } -/* Frees dispatch lock */ -static __inline void mga_dma_quiescent(drm_device_t *dev) +int mga_do_engine_reset( drm_mga_private_t *dev_priv ) { - drm_device_dma_t *dma = dev->dma; - drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; - drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned long end; - int i; + DRM_DEBUG( "%s\n", __FUNCTION__ ); - DRM_DEBUG("%s\n", __FUNCTION__); - end = ticks + (hz*3); - while(1) { - if(!test_and_set_bit(MGA_IN_DISPATCH, - &dev_priv->dispatch_status)) { - break; - } - if((signed)(end - ticks) <= 0) { - DRM_ERROR("irqs: %d wanted %d\n", - atomic_read(&dev->total_irq), - atomic_read(&dma->total_lost)); - DRM_ERROR("lockup\n"); - return; - } - for (i = 0 ; i < 2000 ; i++) mga_delay(); - } - end = ticks + (hz*3); - DRM_DEBUG("quiescent status : %x\n", MGA_READ(MGAREG_STATUS)); - while((MGA_READ(MGAREG_STATUS) & 0x00030001) != 0x00020000) { - if((signed)(end - ticks) <= 0) { - DRM_ERROR("irqs: %d wanted %d\n", - atomic_read(&dev->total_irq), - atomic_read(&dma->total_lost)); - DRM_ERROR("lockup\n"); - clear_bit(MGA_IN_DISPATCH, &dev_priv->dispatch_status); - return; - } - for (i = 0 ; i < 2000 ; i++) mga_delay(); - } - sarea_priv->dirty |= MGA_DMA_FLUSH; + /* Okay, so we've completely screwed up and locked the engine. + * How about we clean up after ourselves? + */ + MGA_WRITE( MGA_RST, MGA_SOFTRESET ); + DRM_OS_DELAY( 15 ); /* Wait at least 10 usecs */ + MGA_WRITE( MGA_RST, 0 ); + + /* Initialize the registers that get clobbered by the soft + * reset. Many of the core register values survive a reset, + * but the drawing registers are basically all gone. + * + * 3D clients should probably die after calling this. The X + * server should reset the engine state to known values. + */ +#if 0 + MGA_WRITE( MGA_PRIMPTR, + virt_to_bus((void *)dev_priv->prim.status_page) | + MGA_PRIMPTREN0 | + MGA_PRIMPTREN1 ); +#endif - clear_bit(MGA_IN_DISPATCH, &dev_priv->dispatch_status); - DRM_DEBUG("exit, dispatch_status = 0x%02x\n",dev_priv->dispatch_status); -} + MGA_WRITE( MGA_ICLEAR, MGA_SOFTRAPICLR ); + MGA_WRITE( MGA_IEN, MGA_SOFTRAPIEN ); -static void mga_reset_freelist(drm_device_t *dev) -{ - drm_device_dma_t *dma = dev->dma; - drm_buf_t *buf; - drm_mga_buf_priv_t *buf_priv; - int i; + /* The primary DMA stream should look like new right about now. + */ + mga_do_dma_reset( dev_priv ); - for (i = 0; i < dma->buf_count; i++) { - buf = dma->buflist[ i ]; - buf_priv = buf->dev_private; - buf_priv->my_freelist->age = MGA_BUF_FREE; - } + /* This bad boy will never fail. + */ + return 0; } -/* Least recently used : - * These operations are not atomic b/c they are protected by the - * hardware lock */ -drm_buf_t *mga_freelist_get(drm_device_t *dev) +/* ================================================================ + * Primary DMA stream + */ + +void mga_do_dma_flush( drm_mga_private_t *dev_priv ) { - drm_mga_private_t *dev_priv = - (drm_mga_private_t *) dev->dev_private; - drm_mga_freelist_t *prev; - drm_mga_freelist_t *next; - static int failed = 0; - int ret, s; - - DRM_DEBUG("%s : tail->age : %d last_prim_age : %d\n", __FUNCTION__, - dev_priv->tail->age, dev_priv->last_prim_age); - - if(failed >= 1000 && dev_priv->tail->age >= dev_priv->last_prim_age) { - DRM_DEBUG("I'm waiting on the freelist!!! %d\n", - dev_priv->last_prim_age); - s = splsofttq(); - set_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status); - for (;;) { - mga_dma_schedule(dev, 0); -/* if(!test_bit(MGA_IN_GETBUF, - &dev_priv->dispatch_status)) */ - if(dev_priv->tail->age < dev_priv->last_prim_age) - break; - atomic_inc(&dev->total_sleeps); - ret = tsleep(&dev_priv->buf_queue, PZERO|PCATCH, - "mgafg", 0); - if (ret == EINTR) { - clear_bit(MGA_IN_GETBUF, - &dev_priv->dispatch_status); - break; - } - } - splx(s); - clear_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status); - if (ret) return NULL; - } - - if(dev_priv->tail->age < dev_priv->last_prim_age) { - prev = dev_priv->tail->prev; - next = dev_priv->tail; - prev->next = NULL; - next->prev = next->next = NULL; - dev_priv->tail = prev; - next->age = MGA_BUF_USED; - failed = 0; - return next->buf; + drm_mga_primary_buffer_t *primary = &dev_priv->prim; + u32 head, tail; + DMA_LOCALS; + DRM_DEBUG( "%s:\n", __FUNCTION__ ); + + if ( primary->tail == primary->last_flush ) { + DRM_DEBUG( " bailing out...\n" ); + return; } - failed++; - return NULL; -} + tail = primary->tail + dev_priv->primary->offset; -int mga_freelist_put(drm_device_t *dev, drm_buf_t *buf) -{ - drm_mga_private_t *dev_priv = - (drm_mga_private_t *) dev->dev_private; - drm_mga_buf_priv_t *buf_priv = buf->dev_private; - drm_mga_freelist_t *prev; - drm_mga_freelist_t *head; - drm_mga_freelist_t *next; + /* We need to pad the stream between flushes, as the card + * actually (partially?) reads the first of these commands. + * See page 4-16 in the G400 manual, middle of the page or so. + */ + BEGIN_DMA( 1 ); - DRM_DEBUG("%s\n", __FUNCTION__); + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000 ); - if(buf_priv->my_freelist->age == MGA_BUF_USED) { - /* Discarded buffer, put it on the tail */ - next = buf_priv->my_freelist; - next->age = MGA_BUF_FREE; - prev = dev_priv->tail; - prev->next = next; - next->prev = prev; - next->next = NULL; - dev_priv->tail = next; - DRM_DEBUG("Discarded\n"); + ADVANCE_DMA(); + + primary->last_flush = primary->tail; + + head = MGA_READ( MGA_PRIMADDRESS ); + + if ( head <= tail ) { + primary->space = primary->size - primary->tail; } else { - /* Normally aged buffer, put it on the head + 1, - * as the real head is a sentinal element - */ - next = buf_priv->my_freelist; - head = dev_priv->head; - prev = head->next; - head->next = next; - prev->prev = next; - next->prev = head; - next->next = prev; + primary->space = head - tail; } - - return 0; -} -static int mga_init_primary_bufs(drm_device_t *dev, drm_mga_init_t *init) -{ - drm_mga_private_t *dev_priv = dev->dev_private; - drm_mga_prim_buf_t *prim_buffer; - int i, temp, size_of_buf; - int offset = init->reserved_map_agpstart; - - DRM_DEBUG("%s\n", __FUNCTION__); - dev_priv->primary_size = ((init->primary_size + PAGE_SIZE - 1) / - PAGE_SIZE) * PAGE_SIZE; - size_of_buf = dev_priv->primary_size / MGA_NUM_PRIM_BUFS; - dev_priv->warp_ucode_size = init->warp_ucode_size; - dev_priv->prim_bufs = drm_alloc(sizeof(drm_mga_prim_buf_t *) * - (MGA_NUM_PRIM_BUFS + 1), - DRM_MEM_DRIVER); - if(dev_priv->prim_bufs == NULL) { - DRM_ERROR("Unable to allocate memory for prim_buf\n"); - return ENOMEM; - } - memset(dev_priv->prim_bufs, - 0, sizeof(drm_mga_prim_buf_t *) * (MGA_NUM_PRIM_BUFS + 1)); - - temp = init->warp_ucode_size + dev_priv->primary_size; - temp = ((temp + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE; - - dev_priv->ioremap = drm_ioremap(dev->agp->base + offset, - temp); - if(dev_priv->ioremap == NULL) { - DRM_DEBUG("Ioremap failed\n"); - return ENOMEM; - } - dev_priv->wait_queue = 0; - - for(i = 0; i < MGA_NUM_PRIM_BUFS; i++) { - prim_buffer = drm_alloc(sizeof(drm_mga_prim_buf_t), - DRM_MEM_DRIVER); - if(prim_buffer == NULL) return ENOMEM; - memset(prim_buffer, 0, sizeof(drm_mga_prim_buf_t)); - prim_buffer->phys_head = offset + dev->agp->base; - prim_buffer->current_dma_ptr = - prim_buffer->head = - (u_int32_t *) (dev_priv->ioremap + - offset - - init->reserved_map_agpstart); - prim_buffer->num_dwords = 0; - prim_buffer->max_dwords = size_of_buf / sizeof(u_int32_t); - prim_buffer->max_dwords -= 5; /* Leave room for the softrap */ - prim_buffer->sec_used = 0; - prim_buffer->idx = i; - prim_buffer->prim_age = i + 1; - offset = offset + size_of_buf; - dev_priv->prim_bufs[i] = prim_buffer; - } - dev_priv->current_prim_idx = 0; - dev_priv->next_prim = - dev_priv->last_prim = - dev_priv->current_prim = - dev_priv->prim_bufs[0]; - dev_priv->next_prim_age = 2; - dev_priv->last_prim_age = 1; - set_bit(MGA_BUF_IN_USE, &dev_priv->current_prim->buffer_status); - return 0; + DRM_DEBUG( " head = 0x%06lx\n", head - dev_priv->primary->offset ); + DRM_DEBUG( " tail = 0x%06lx\n", tail - dev_priv->primary->offset ); + DRM_DEBUG( " space = 0x%06x\n", primary->space ); + + mga_flush_write_combine(); + MGA_WRITE( MGA_PRIMEND, tail | MGA_PAGPXFER ); + + DRM_DEBUG( "%s: done.\n", __FUNCTION__ ); } -static void mga_fire_primary(drm_device_t *dev, drm_mga_prim_buf_t *prim) +void mga_do_dma_wrap_start( drm_mga_private_t *dev_priv ) { - drm_mga_private_t *dev_priv = dev->dev_private; - drm_device_dma_t *dma = dev->dma; - drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - int use_agp = PDEA_pagpxfer_enable; - unsigned long end; - int i; - int next_idx; - PRIMLOCALS; - - DRM_DEBUG("%s\n", __FUNCTION__); - dev_priv->last_prim = prim; - - /* We never check for overflow, b/c there is always room */ - PRIMPTR(prim); - if(num_dwords <= 0) { - DRM_DEBUG("num_dwords == 0 when dispatched\n"); - goto out_prim_wait; - } - PRIMOUTREG( MGAREG_DMAPAD, 0); - PRIMOUTREG( MGAREG_DMAPAD, 0); - PRIMOUTREG( MGAREG_DMAPAD, 0); - PRIMOUTREG( MGAREG_SOFTRAP, 0); - PRIMFINISH(prim); - - end = ticks + (hz*3); - if(sarea_priv->dirty & MGA_DMA_FLUSH) { - DRM_DEBUG("Dma top flush\n"); - while((MGA_READ(MGAREG_STATUS) & 0x00030001) != 0x00020000) { - if((signed)(end - ticks) <= 0) { - DRM_ERROR("irqs: %d wanted %d\n", - atomic_read(&dev->total_irq), - atomic_read(&dma->total_lost)); - DRM_ERROR("lockup in fire primary " - "(Dma Top Flush)\n"); - goto out_prim_wait; - } - - for (i = 0 ; i < 4096 ; i++) mga_delay(); - } - sarea_priv->dirty &= ~(MGA_DMA_FLUSH); + drm_mga_primary_buffer_t *primary = &dev_priv->prim; + u32 head, tail; + DMA_LOCALS; + DRM_DEBUG( "%s:\n", __FUNCTION__ ); + + BEGIN_DMA_WRAP(); + + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000 ); + + ADVANCE_DMA(); + + tail = primary->tail + dev_priv->primary->offset; + + primary->tail = 0; + primary->last_flush = 0; + primary->last_wrap++; + + head = MGA_READ( MGA_PRIMADDRESS ); + + if ( head == dev_priv->primary->offset ) { + primary->space = primary->size; } else { - DRM_DEBUG("Status wait\n"); - while((MGA_READ(MGAREG_STATUS) & 0x00020001) != 0x00020000) { - if((signed)(end - ticks) <= 0) { - DRM_ERROR("irqs: %d wanted %d\n", - atomic_read(&dev->total_irq), - atomic_read(&dma->total_lost)); - DRM_ERROR("lockup in fire primary " - "(Status Wait)\n"); - goto out_prim_wait; - } - - for (i = 0 ; i < 4096 ; i++) mga_delay(); - } + primary->space = head - dev_priv->primary->offset; } - mga_flush_write_combine(); - atomic_inc(&dev_priv->pending_bufs); - MGA_WRITE(MGAREG_PRIMADDRESS, phys_head | TT_GENERAL); - MGA_WRITE(MGAREG_PRIMEND, (phys_head + num_dwords * 4) | use_agp); - prim->num_dwords = 0; - sarea_priv->last_enqueue = prim->prim_age; - - next_idx = prim->idx + 1; - if(next_idx >= MGA_NUM_PRIM_BUFS) - next_idx = 0; - - dev_priv->next_prim = dev_priv->prim_bufs[next_idx]; - return; - - out_prim_wait: - prim->num_dwords = 0; - prim->sec_used = 0; - clear_bit(MGA_BUF_IN_USE, &prim->buffer_status); - wakeup(&dev_priv->wait_queue); - clear_bit(MGA_BUF_SWAP_PENDING, &prim->buffer_status); - clear_bit(MGA_IN_DISPATCH, &dev_priv->dispatch_status); + DRM_DEBUG( " head = 0x%06lx\n", + head - dev_priv->primary->offset ); + DRM_DEBUG( " tail = 0x%06x\n", primary->tail ); + DRM_DEBUG( " wrap = %d\n", primary->last_wrap ); + DRM_DEBUG( " space = 0x%06x\n", primary->space ); + + mga_flush_write_combine(); + MGA_WRITE( MGA_PRIMEND, tail | MGA_PAGPXFER ); + + set_bit( 0, &primary->wrapped ); + DRM_DEBUG( "%s: done.\n", __FUNCTION__ ); } -int mga_advance_primary(drm_device_t *dev) +void mga_do_dma_wrap_end( drm_mga_private_t *dev_priv ) { - drm_mga_private_t *dev_priv = dev->dev_private; - drm_mga_prim_buf_t *prim_buffer; - drm_device_dma_t *dma = dev->dma; - int next_prim_idx; - int ret = 0; - int s; - - /* This needs to reset the primary buffer if available, - * we should collect stats on how many times it bites - * it's tail */ - DRM_DEBUG("%s\n", __FUNCTION__); - - next_prim_idx = dev_priv->current_prim_idx + 1; - if(next_prim_idx >= MGA_NUM_PRIM_BUFS) - next_prim_idx = 0; - prim_buffer = dev_priv->prim_bufs[next_prim_idx]; - set_bit(MGA_IN_WAIT, &dev_priv->dispatch_status); - - /* In use is cleared in interrupt handler */ - - s = splsofttq(); - if(test_and_set_bit(MGA_BUF_IN_USE, &prim_buffer->buffer_status)) { - for (;;) { - mga_dma_schedule(dev, 0); - if(!test_and_set_bit(MGA_BUF_IN_USE, - &prim_buffer->buffer_status)) - break; - atomic_inc(&dev->total_sleeps); - atomic_inc(&dma->total_missed_sched); - ret = tsleep(&dev_priv->wait_queue, PZERO|PCATCH, - "mgaap", 0); - if (ret) - break; - } - if(ret) { - splx(s); - return ret; - } - } - clear_bit(MGA_IN_WAIT, &dev_priv->dispatch_status); - splx(s); - - /* This primary buffer is now free to use */ - prim_buffer->current_dma_ptr = prim_buffer->head; - prim_buffer->num_dwords = 0; - prim_buffer->sec_used = 0; - prim_buffer->prim_age = dev_priv->next_prim_age++; - if(prim_buffer->prim_age == 0 || prim_buffer->prim_age == 0xffffffff) { - mga_flush_queue(dev); - mga_dma_quiescent(dev); - mga_reset_freelist(dev); - prim_buffer->prim_age = (dev_priv->next_prim_age += 2); - } + drm_mga_primary_buffer_t *primary = &dev_priv->prim; + drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; + u32 head = dev_priv->primary->offset; + DRM_DEBUG( "%s:\n", __FUNCTION__ ); + + sarea_priv->last_wrap++; + DRM_DEBUG( " wrap = %d\n", sarea_priv->last_wrap ); - /* Reset all buffer status stuff */ - clear_bit(MGA_BUF_NEEDS_OVERFLOW, &prim_buffer->buffer_status); - clear_bit(MGA_BUF_FORCE_FIRE, &prim_buffer->buffer_status); - clear_bit(MGA_BUF_SWAP_PENDING, &prim_buffer->buffer_status); + mga_flush_write_combine(); + MGA_WRITE( MGA_PRIMADDRESS, head | MGA_DMA_GENERAL ); - dev_priv->current_prim = prim_buffer; - dev_priv->current_prim_idx = next_prim_idx; - return 0; + clear_bit( 0, &primary->wrapped ); + DRM_DEBUG( "%s: done.\n", __FUNCTION__ ); } -/* More dynamic performance decisions */ -static __inline int mga_decide_to_fire(drm_device_t *dev) + +/* ================================================================ + * Freelist management + */ + +#define MGA_BUFFER_USED ~0 +#define MGA_BUFFER_FREE 0 + +#if MGA_FREELIST_DEBUG +static void mga_freelist_print( drm_device_t *dev ) { - drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; + drm_mga_private_t *dev_priv = dev->dev_private; + drm_mga_freelist_t *entry; + + DRM_INFO( "\n" ); + DRM_INFO( "current dispatch: last=0x%x done=0x%x\n", + dev_priv->sarea_priv->last_dispatch, + (unsigned int)(MGA_READ( MGA_PRIMADDRESS ) - + dev_priv->primary->offset) ); + DRM_INFO( "current freelist:\n" ); + + for ( entry = dev_priv->head->next ; entry ; entry = entry->next ) { + DRM_INFO( " %p idx=%2d age=0x%x 0x%06lx\n", + entry, entry->buf->idx, entry->age.head, + entry->age.head - dev_priv->primary->offset ); + } + DRM_INFO( "\n" ); +} +#endif - DRM_DEBUG("%s\n", __FUNCTION__); +static int mga_freelist_init( drm_device_t *dev, drm_mga_private_t *dev_priv ) +{ + drm_device_dma_t *dma = dev->dma; + drm_buf_t *buf; + drm_mga_buf_priv_t *buf_priv; + drm_mga_freelist_t *entry; + int i; + DRM_DEBUG( "%s: count=%d\n", + __FUNCTION__, dma->buf_count ); - if(test_bit(MGA_BUF_FORCE_FIRE, &dev_priv->next_prim->buffer_status)) { - return 1; - } + dev_priv->head = DRM(alloc)( sizeof(drm_mga_freelist_t), + DRM_MEM_DRIVER ); + if ( dev_priv->head == NULL ) + DRM_OS_RETURN(ENOMEM); - if (test_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status) && - dev_priv->next_prim->num_dwords) { - return 1; - } + memset( dev_priv->head, 0, sizeof(drm_mga_freelist_t) ); + SET_AGE( &dev_priv->head->age, MGA_BUFFER_USED, 0 ); - if (test_bit(MGA_IN_FLUSH, &dev_priv->dispatch_status) && - dev_priv->next_prim->num_dwords) { - return 1; - } - - if(atomic_read(&dev_priv->pending_bufs) <= MGA_NUM_PRIM_BUFS - 1) { - if(test_bit(MGA_BUF_SWAP_PENDING, - &dev_priv->next_prim->buffer_status)) { - return 1; - } - } + for ( i = 0 ; i < dma->buf_count ; i++ ) { + buf = dma->buflist[i]; + buf_priv = buf->dev_private; - if(atomic_read(&dev_priv->pending_bufs) <= MGA_NUM_PRIM_BUFS / 2) { - if(dev_priv->next_prim->sec_used >= MGA_DMA_BUF_NR / 8) { - return 1; - } - } + entry = DRM(alloc)( sizeof(drm_mga_freelist_t), + DRM_MEM_DRIVER ); + if ( entry == NULL ) + DRM_OS_RETURN(ENOMEM); - if(atomic_read(&dev_priv->pending_bufs) >= MGA_NUM_PRIM_BUFS / 2) { - if(dev_priv->next_prim->sec_used >= MGA_DMA_BUF_NR / 4) { - return 1; - } - } + memset( entry, 0, sizeof(drm_mga_freelist_t) ); - return 0; -} + entry->next = dev_priv->head->next; + entry->prev = dev_priv->head; + SET_AGE( &entry->age, MGA_BUFFER_FREE, 0 ); + entry->buf = buf; -int mga_dma_schedule(drm_device_t *dev, int locked) -{ - drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; - int retval =0 ; + if ( dev_priv->head->next != NULL ) + dev_priv->head->next->prev = entry; + if ( entry->next == NULL ) + dev_priv->tail = entry; - if (!dev_priv) return EBUSY; + buf_priv->list_entry = entry; + buf_priv->discard = 0; + buf_priv->dispatched = 0; - if (test_and_set_bit(0, &dev->dma_flag)) { - retval = EBUSY; - goto sch_out_wakeup; - } - - DRM_DEBUG("%s\n", __FUNCTION__); - if (!dev_priv) { - DRM_DEBUG("dev_priv is not set\n"); - return (0); + dev_priv->head->next = entry; } - if(test_bit(MGA_IN_FLUSH, &dev_priv->dispatch_status) || - test_bit(MGA_IN_WAIT, &dev_priv->dispatch_status) || - test_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status)) { - locked = 1; - } - - if (!locked && - !drm_lock_take(&dev->lock.hw_lock->lock, DRM_KERNEL_CONTEXT)) { - clear_bit(0, &dev->dma_flag); - DRM_DEBUG("Not locked\n"); - retval = EBUSY; - goto sch_out_wakeup; - } + return 0; +} - if(!test_and_set_bit(MGA_IN_DISPATCH, &dev_priv->dispatch_status)) { - /* Fire dma buffer */ - if(mga_decide_to_fire(dev)) { - clear_bit(MGA_BUF_FORCE_FIRE, - &dev_priv->next_prim->buffer_status); - if(dev_priv->current_prim == dev_priv->next_prim) { - /* Schedule overflow for a later time */ - set_bit(MGA_BUF_NEEDS_OVERFLOW, - &dev_priv->next_prim->buffer_status); - } - mga_fire_primary(dev, dev_priv->next_prim); - } else { - clear_bit(MGA_IN_DISPATCH, &dev_priv->dispatch_status); - } - } - - if (!locked) { - if (drm_lock_free(dev, &dev->lock.hw_lock->lock, - DRM_KERNEL_CONTEXT)) { - DRM_ERROR("\n"); - } - } - clear_bit(0, &dev->dma_flag); -sch_out_wakeup: - if(test_bit(MGA_IN_FLUSH, &dev_priv->dispatch_status) && - atomic_read(&dev_priv->pending_bufs) == 0) { - /* Everything has been processed by the hardware */ - clear_bit(MGA_IN_FLUSH, &dev_priv->dispatch_status); - wakeup(&dev_priv->flush_queue); - } +static void mga_freelist_cleanup( drm_device_t *dev ) +{ + drm_mga_private_t *dev_priv = dev->dev_private; + drm_mga_freelist_t *entry; + drm_mga_freelist_t *next; + DRM_DEBUG( "%s\n", __FUNCTION__ ); - if(test_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status) && - dev_priv->tail->age < dev_priv->last_prim_age) - wakeup(&dev_priv->buf_queue); + entry = dev_priv->head; + while ( entry ) { + next = entry->next; + DRM(free)( entry, sizeof(drm_mga_freelist_t), DRM_MEM_DRIVER ); + entry = next; + } - return retval; + dev_priv->head = dev_priv->tail = NULL; } -static void mga_dma_service(void *arg) +#if 0 +/* FIXME: Still needed? + */ +static void mga_freelist_reset( drm_device_t *dev ) { - drm_device_t *dev = (drm_device_t *)arg; - drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; - drm_mga_prim_buf_t *last_prim_buffer; - - atomic_inc(&dev->total_irq); - if((MGA_READ(MGAREG_STATUS) & 0x00000001) != 0x00000001) return; - MGA_WRITE(MGAREG_ICLEAR, 0x00000001); - last_prim_buffer = dev_priv->last_prim; - last_prim_buffer->num_dwords = 0; - last_prim_buffer->sec_used = 0; - dev_priv->sarea_priv->last_dispatch = - dev_priv->last_prim_age = last_prim_buffer->prim_age; - clear_bit(MGA_BUF_IN_USE, &last_prim_buffer->buffer_status); - clear_bit(MGA_BUF_SWAP_PENDING, &last_prim_buffer->buffer_status); - clear_bit(MGA_IN_DISPATCH, &dev_priv->dispatch_status); - atomic_dec(&dev_priv->pending_bufs); - taskqueue_enqueue(taskqueue_swi, &dev->task); - wakeup(&dev_priv->wait_queue); + drm_device_dma_t *dma = dev->dma; + drm_buf_t *buf; + drm_mga_buf_priv_t *buf_priv; + int i; + + for ( i = 0 ; i < dma->buf_count ; i++ ) { + buf = dma->buflist[i]; + buf_priv = buf->dev_private; + SET_AGE( &buf_priv->list_entry->age, + MGA_BUFFER_FREE, 0 ); + } } +#endif -static void mga_dma_task_queue(void *device, int pending) +static drm_buf_t *mga_freelist_get( drm_device_t *dev ) { - DRM_DEBUG("%s\n", __FUNCTION__); - mga_dma_schedule((drm_device_t *)device, 0); + drm_mga_private_t *dev_priv = dev->dev_private; + drm_mga_freelist_t *next; + drm_mga_freelist_t *prev; + drm_mga_freelist_t *tail = dev_priv->tail; + u32 head, wrap; + DRM_DEBUG( "%s:\n", __FUNCTION__ ); + + head = MGA_READ( MGA_PRIMADDRESS ); + wrap = dev_priv->sarea_priv->last_wrap; + + DRM_DEBUG( " tail=0x%06lx %d\n", + tail->age.head ? + tail->age.head - dev_priv->primary->offset : 0, + tail->age.wrap ); + DRM_DEBUG( " head=0x%06lx %d\n", + head - dev_priv->primary->offset, wrap ); + + if ( TEST_AGE( &tail->age, head, wrap ) ) { + prev = dev_priv->tail->prev; + next = dev_priv->tail; + prev->next = NULL; + next->prev = next->next = NULL; + dev_priv->tail = prev; + SET_AGE( &next->age, MGA_BUFFER_USED, 0 ); + return next->buf; + } + + DRM_DEBUG( "returning NULL!\n" ); + return NULL; } -int mga_dma_cleanup(drm_device_t *dev) +int mga_freelist_put( drm_device_t *dev, drm_buf_t *buf ) { - DRM_DEBUG("%s\n", __FUNCTION__); - - if(dev->dev_private) { - drm_mga_private_t *dev_priv = - (drm_mga_private_t *) dev->dev_private; - - if (dev->irq) mga_flush_queue(dev); - mga_dma_quiescent(dev); - if(dev_priv->ioremap) { - int temp = (dev_priv->warp_ucode_size + - dev_priv->primary_size + - PAGE_SIZE - 1) / PAGE_SIZE * PAGE_SIZE; - - drm_ioremapfree((void *) dev_priv->ioremap, temp); - } - if(dev_priv->real_status_page != 0UL) { - mga_free_page(dev, dev_priv->real_status_page); - } - if(dev_priv->prim_bufs != NULL) { - int i; - for(i = 0; i < MGA_NUM_PRIM_BUFS; i++) { - if(dev_priv->prim_bufs[i] != NULL) { - drm_free(dev_priv->prim_bufs[i], - sizeof(drm_mga_prim_buf_t), - DRM_MEM_DRIVER); - } - } - drm_free(dev_priv->prim_bufs, sizeof(void *) * - (MGA_NUM_PRIM_BUFS + 1), - DRM_MEM_DRIVER); - } - if(dev_priv->head != NULL) { - mga_freelist_cleanup(dev); - } + drm_mga_private_t *dev_priv = dev->dev_private; + drm_mga_buf_priv_t *buf_priv = buf->dev_private; + drm_mga_freelist_t *head, *entry, *prev; + DRM_DEBUG( "%s: age=0x%06lx wrap=%d\n", + __FUNCTION__, + buf_priv->list_entry->age.head - + dev_priv->primary->offset, + buf_priv->list_entry->age.wrap ); - drm_free(dev->dev_private, sizeof(drm_mga_private_t), - DRM_MEM_DRIVER); - dev->dev_private = NULL; + entry = buf_priv->list_entry; + head = dev_priv->head; + + if ( buf_priv->list_entry->age.head == MGA_BUFFER_USED ) { + SET_AGE( &entry->age, MGA_BUFFER_FREE, 0 ); + prev = dev_priv->tail; + prev->next = entry; + entry->prev = prev; + entry->next = NULL; + } else { + prev = head->next; + head->next = entry; + prev->prev = entry; + entry->prev = head; + entry->next = prev; } return 0; } -static int mga_dma_initialize(drm_device_t *dev, drm_mga_init_t *init) { + +/* ================================================================ + * DMA initialization, cleanup + */ + +static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) +{ drm_mga_private_t *dev_priv; - drm_map_t *sarea_map = NULL; + drm_map_list_entry_t *listentry; + int ret; + DRM_DEBUG( "%s\n", __FUNCTION__ ); - dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); - if(dev_priv == NULL) return ENOMEM; - dev->dev_private = (void *) dev_priv; + dev_priv = DRM(alloc)( sizeof(drm_mga_private_t), DRM_MEM_DRIVER ); + if ( !dev_priv ) + DRM_OS_RETURN(ENOMEM); - memset(dev_priv, 0, sizeof(drm_mga_private_t)); + memset( dev_priv, 0, sizeof(drm_mga_private_t) ); - if((init->reserved_map_idx >= dev->map_count) || - (init->buffer_map_idx >= dev->map_count)) { - mga_dma_cleanup(dev); - DRM_DEBUG("reserved_map or buffer_map are invalid\n"); - return EINVAL; - } - - dev_priv->reserved_map_idx = init->reserved_map_idx; - dev_priv->buffer_map_idx = init->buffer_map_idx; - sarea_map = dev->maplist[0]; - dev_priv->sarea_priv = (drm_mga_sarea_t *) - ((u_int8_t *)sarea_map->handle + - init->sarea_priv_offset); - - /* Scale primary size to the next page */ dev_priv->chipset = init->chipset; - dev_priv->frontOffset = init->frontOffset; - dev_priv->backOffset = init->backOffset; - dev_priv->depthOffset = init->depthOffset; - dev_priv->textureOffset = init->textureOffset; - dev_priv->textureSize = init->textureSize; - dev_priv->cpp = init->cpp; - dev_priv->sgram = init->sgram; - dev_priv->stride = init->stride; - - dev_priv->mAccess = init->mAccess; - dev_priv->flush_queue = 0; - dev_priv->WarpPipe = 0xff000000; - dev_priv->vertexsize = 0; - - DRM_DEBUG("chipset: %d ucode_size: %d backOffset: %x depthOffset: %x\n", - dev_priv->chipset, dev_priv->warp_ucode_size, - dev_priv->backOffset, dev_priv->depthOffset); - DRM_DEBUG("cpp: %d sgram: %d stride: %d maccess: %x\n", - dev_priv->cpp, dev_priv->sgram, dev_priv->stride, - dev_priv->mAccess); - - memcpy(&dev_priv->WarpIndex, &init->WarpIndex, - sizeof(drm_mga_warp_index_t) * MGA_MAX_WARP_PIPES); - - if(mga_init_primary_bufs(dev, init) != 0) { - DRM_ERROR("Can not initialize primary buffers\n"); - mga_dma_cleanup(dev); - return ENOMEM; + + dev_priv->usec_timeout = MGA_DEFAULT_USEC_TIMEOUT; + + if ( init->sgram ) { + dev_priv->clear_cmd = MGA_DWGCTL_CLEAR | MGA_ATYPE_BLK; + } else { + dev_priv->clear_cmd = MGA_DWGCTL_CLEAR | MGA_ATYPE_RSTR; } - dev_priv->real_status_page = mga_alloc_page(dev); - if(dev_priv->real_status_page == 0UL) { - mga_dma_cleanup(dev); - DRM_ERROR("Can not allocate status page\n"); - return ENOMEM; + dev_priv->maccess = init->maccess; + + dev_priv->fb_cpp = init->fb_cpp; + dev_priv->front_offset = init->front_offset; + dev_priv->front_pitch = init->front_pitch; + dev_priv->back_offset = init->back_offset; + dev_priv->back_pitch = init->back_pitch; + + dev_priv->depth_cpp = init->depth_cpp; + dev_priv->depth_offset = init->depth_offset; + dev_priv->depth_pitch = init->depth_pitch; + + /* FIXME: Need to support AGP textures... + */ + dev_priv->texture_offset = init->texture_offset[0]; + dev_priv->texture_size = init->texture_size[0]; + + TAILQ_FOREACH(listentry, dev->maplist, link) { + drm_map_t *map = listentry->map; + if (map->type == _DRM_SHM && + map->flags & _DRM_CONTAINS_LOCK) { + dev_priv->sarea = map; + break; + } } - dev_priv->status_page = (void*)dev_priv->real_status_page; /* XXX wants nocache */ + if(!dev_priv->sarea) { + DRM_ERROR( "failed to find sarea!\n" ); + /* Assign dev_private so we can do cleanup. */ + dev->dev_private = (void *)dev_priv; + mga_do_cleanup_dma( dev ); + DRM_OS_RETURN(EINVAL); + } + + + DRM_FIND_MAP( dev_priv->fb, init->fb_offset ); + if(!dev_priv->fb) { + DRM_ERROR( "failed to find framebuffer!\n" ); + /* Assign dev_private so we can do cleanup. */ + dev->dev_private = (void *)dev_priv; + mga_do_cleanup_dma( dev ); + DRM_OS_RETURN(EINVAL); + } + DRM_FIND_MAP( dev_priv->mmio, init->mmio_offset ); + if(!dev_priv->mmio) { + DRM_ERROR( "failed to find mmio region!\n" ); + /* Assign dev_private so we can do cleanup. */ + dev->dev_private = (void *)dev_priv; + mga_do_cleanup_dma( dev ); + DRM_OS_RETURN(EINVAL); + } + DRM_FIND_MAP( dev_priv->status, init->status_offset ); + if(!dev_priv->status) { + DRM_ERROR( "failed to find status page!\n" ); + /* Assign dev_private so we can do cleanup. */ + dev->dev_private = (void *)dev_priv; + mga_do_cleanup_dma( dev ); + DRM_OS_RETURN(EINVAL); + } + DRM_FIND_MAP( dev_priv->warp, init->warp_offset ); + if(!dev_priv->warp) { + DRM_ERROR( "failed to find warp microcode region!\n" ); + /* Assign dev_private so we can do cleanup. */ + dev->dev_private = (void *)dev_priv; + mga_do_cleanup_dma( dev ); + DRM_OS_RETURN(EINVAL); + } + DRM_FIND_MAP( dev_priv->primary, init->primary_offset ); + if(!dev_priv->primary) { + DRM_ERROR( "failed to find primary dma region!\n" ); + /* Assign dev_private so we can do cleanup. */ + dev->dev_private = (void *)dev_priv; + mga_do_cleanup_dma( dev ); + DRM_OS_RETURN(EINVAL); + } + DRM_FIND_MAP( dev_priv->buffers, init->buffers_offset ); + if(!dev_priv->buffers) { + DRM_ERROR( "failed to find dma buffer region!\n" ); + /* Assign dev_private so we can do cleanup. */ + dev->dev_private = (void *)dev_priv; + mga_do_cleanup_dma( dev ); + DRM_OS_RETURN(EINVAL); + } + + dev_priv->sarea_priv = + (drm_mga_sarea_t *)((u8 *)dev_priv->sarea->handle + + init->sarea_priv_offset); + + DRM_IOREMAP( dev_priv->warp ); + DRM_IOREMAP( dev_priv->primary ); + DRM_IOREMAP( dev_priv->buffers ); + + if(!dev_priv->warp->handle || + !dev_priv->primary->handle || + !dev_priv->buffers->handle ) { + DRM_ERROR( "failed to ioremap agp regions!\n" ); + /* Assign dev_private so we can do cleanup. */ + dev->dev_private = (void *)dev_priv; + mga_do_cleanup_dma( dev ); + DRM_OS_RETURN(ENOMEM); + } + + ret = mga_warp_install_microcode( dev_priv ); + if ( ret < 0 ) { + DRM_ERROR( "failed to install WARP ucode!\n" ); + /* Assign dev_private so we can do cleanup. */ + dev->dev_private = (void *)dev_priv; + mga_do_cleanup_dma( dev ); + DRM_OS_RETURN(ret); + } + + ret = mga_warp_init( dev_priv ); + if ( ret < 0 ) { + DRM_ERROR( "failed to init WARP engine!\n" ); + /* Assign dev_private so we can do cleanup. */ + dev->dev_private = (void *)dev_priv; + mga_do_cleanup_dma( dev ); + DRM_OS_RETURN(ret); + } + + dev_priv->prim.status = (u32 *)dev_priv->status->handle; + + mga_do_wait_for_idle( dev_priv ); + + /* Init the primary DMA registers. + */ + MGA_WRITE( MGA_PRIMADDRESS, + dev_priv->primary->offset | MGA_DMA_GENERAL ); #if 0 - dev_priv->status_page = - ioremap_nocache(virt_to_bus((void *)dev_priv->real_status_page), - PAGE_SIZE); - - if(dev_priv->status_page == NULL) { - mga_dma_cleanup(dev); - DRM_ERROR("Can not remap status page\n"); - return ENOMEM; - } + MGA_WRITE( MGA_PRIMPTR, + virt_to_bus((void *)dev_priv->prim.status) | + MGA_PRIMPTREN0 | /* Soft trap, SECEND, SETUPEND */ + MGA_PRIMPTREN1 ); /* DWGSYNC */ #endif - /* Write status page when secend or softrap occurs */ - MGA_WRITE(MGAREG_PRIMPTR, - vtophys((void *)dev_priv->real_status_page) | 0x00000003); - - - /* Private is now filled in, initialize the hardware */ - { - PRIMLOCALS; - PRIMGETPTR( dev_priv ); - - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DWGSYNC, 0x0100); - PRIMOUTREG(MGAREG_SOFTRAP, 0); - /* Poll for the first buffer to insure that - * the status register will be correct - */ - - mga_flush_write_combine(); - MGA_WRITE(MGAREG_PRIMADDRESS, phys_head | TT_GENERAL); - - MGA_WRITE(MGAREG_PRIMEND, ((phys_head + num_dwords * 4) | - PDEA_pagpxfer_enable)); - - while(MGA_READ(MGAREG_DWGSYNC) != 0x0100) ; + dev_priv->prim.start = (u8 *)dev_priv->primary->handle; + dev_priv->prim.end = ((u8 *)dev_priv->primary->handle + + dev_priv->primary->size); + dev_priv->prim.size = dev_priv->primary->size; + + dev_priv->prim.tail = 0; + dev_priv->prim.space = dev_priv->prim.size; + dev_priv->prim.wrapped = 0; + + dev_priv->prim.last_flush = 0; + dev_priv->prim.last_wrap = 0; + + dev_priv->prim.high_mark = 256 * DMA_BLOCK_SIZE; + + + dev_priv->prim.status[0] = dev_priv->primary->offset; + dev_priv->prim.status[1] = 0; + + dev_priv->sarea_priv->last_wrap = 0; + dev_priv->sarea_priv->last_frame.head = 0; + dev_priv->sarea_priv->last_frame.wrap = 0; + + if ( mga_freelist_init( dev, dev_priv ) < 0 ) { + DRM_ERROR( "could not initialize freelist\n" ); + /* Assign dev_private so we can do cleanup. */ + dev->dev_private = (void *)dev_priv; + mga_do_cleanup_dma( dev ); + DRM_OS_RETURN(ENOMEM); } - if(mga_freelist_init(dev) != 0) { - DRM_ERROR("Could not initialize freelist\n"); - mga_dma_cleanup(dev); - return ENOMEM; + /* Make dev_private visable to others. */ + dev->dev_private = (void *)dev_priv; + return 0; +} + +int mga_do_cleanup_dma( drm_device_t *dev ) +{ + DRM_DEBUG( "%s\n", __FUNCTION__ ); + + if ( dev->dev_private ) { + drm_mga_private_t *dev_priv = dev->dev_private; + + DRM_IOREMAPFREE( dev_priv->warp ); + DRM_IOREMAPFREE( dev_priv->primary ); + DRM_IOREMAPFREE( dev_priv->buffers ); + + if ( dev_priv->head != NULL ) { + mga_freelist_cleanup( dev ); + } + + DRM(free)( dev->dev_private, sizeof(drm_mga_private_t), + DRM_MEM_DRIVER ); + dev->dev_private = NULL; } + return 0; } -int -mga_dma_init(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) +int mga_dma_init( DRM_OS_IOCTL ) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_mga_init_t init; - - DRM_DEBUG("%s\n", __FUNCTION__); - init = *(drm_mga_init_t *) data; - - switch(init.func) { + DRM_OS_KRNFROMUSR( init, (drm_mga_init_t *) data, sizeof(init) ); + + switch ( init.func ) { case MGA_INIT_DMA: - return mga_dma_initialize(dev, &init); + return mga_do_init_dma( dev, &init ); case MGA_CLEANUP_DMA: - return mga_dma_cleanup(dev); + return mga_do_cleanup_dma( dev ); } - return EINVAL; + DRM_OS_RETURN( EINVAL ); } -int mga_irq_install(drm_device_t *dev, int irq) + +/* ================================================================ + * Primary DMA stream management + */ + +int mga_dma_flush( DRM_OS_IOCTL ) { - int rid; - int retcode; + DRM_OS_DEVICE; + drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; + drm_lock_t lock; - if (!irq) return EINVAL; - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - if (dev->irq) { - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - return EBUSY; - } - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - DRM_DEBUG("install irq handler %d\n", irq); - - dev->context_flag = 0; - dev->interrupt_flag = 0; - dev->dma_flag = 0; - dev->dma->next_buffer = NULL; - dev->dma->next_queue = NULL; - dev->dma->this_buffer = NULL; - TASK_INIT(&dev->task, 0, mga_dma_task_queue, dev); - - /* Before installing handler */ - MGA_WRITE(MGAREG_IEN, 0); - /* Install handler */ - rid = 0; - dev->irq = bus_alloc_resource(dev->device, SYS_RES_IRQ, &rid, - 0, ~0, 1, RF_SHAREABLE); - if (!dev->irq) - return ENOENT; - - retcode = bus_setup_intr(dev->device, dev->irq, INTR_TYPE_TTY, - mga_dma_service, dev, &dev->irqh); - if (retcode) { - bus_release_resource(dev->device, SYS_RES_IRQ, 0, dev->irq); - dev->irq = 0; - return retcode; - } + LOCK_TEST_WITH_RETURN( dev ); - /* After installing handler */ - MGA_WRITE(MGAREG_ICLEAR, 0x00000001); - MGA_WRITE(MGAREG_IEN, 0x00000001); - return 0; -} + DRM_OS_KRNFROMUSR( lock, (drm_lock_t *) data, sizeof(lock) ); -int mga_irq_uninstall(drm_device_t *dev) -{ - if (!dev->irq) - return EINVAL; - - DRM_DEBUG("remove irq handler %ld\n", rman_get_start(dev->irq)); - MGA_WRITE(MGAREG_ICLEAR, 0x00000001); - MGA_WRITE(MGAREG_IEN, 0); + DRM_DEBUG( "%s: %s%s%s\n", + __FUNCTION__, + (lock.flags & _DRM_LOCK_FLUSH) ? "flush, " : "", + (lock.flags & _DRM_LOCK_FLUSH_ALL) ? "flush all, " : "", + (lock.flags & _DRM_LOCK_QUIESCENT) ? "idle, " : "" ); - bus_teardown_intr(dev->device, dev->irq, dev->irqh); - bus_release_resource(dev->device, SYS_RES_IRQ, 0, dev->irq); - dev->irq = 0; + WRAP_WAIT_WITH_RETURN( dev_priv ); - return 0; -} + if ( lock.flags & (_DRM_LOCK_FLUSH | _DRM_LOCK_FLUSH_ALL) ) { + mga_do_dma_flush( dev_priv ); + } -int mga_control(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_control_t ctl; - - ctl = *(drm_control_t *) data; - - DRM_DEBUG("%s\n", __FUNCTION__); - - switch (ctl.func) { - case DRM_INST_HANDLER: - return mga_irq_install(dev, ctl.irq); - case DRM_UNINST_HANDLER: - return mga_irq_uninstall(dev); - default: - return EINVAL; + if ( lock.flags & _DRM_LOCK_QUIESCENT ) { +#if MGA_DMA_DEBUG + int ret = mga_do_wait_for_idle( dev_priv ); + if ( ret ) + DRM_INFO( __FUNCTION__": -EBUSY\n" ); + return ret; +#else + return mga_do_wait_for_idle( dev_priv ); +#endif + } else { + return 0; } } -static int mga_flush_queue(drm_device_t *dev) +int mga_dma_reset( DRM_OS_IOCTL ) { - drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; - int ret = 0; - int s; - - DRM_DEBUG("%s\n", __FUNCTION__); - - if(!dev_priv) return 0; - - if(dev_priv->next_prim->num_dwords != 0) { - s = splsofttq(); - set_bit(MGA_IN_FLUSH, &dev_priv->dispatch_status); - for (;;) { - mga_dma_schedule(dev, 0); - if (!test_bit(MGA_IN_FLUSH, - &dev_priv->dispatch_status)) - break; - atomic_inc(&dev->total_sleeps); - ret = tsleep(&dev_priv->flush_queue, PZERO|PCATCH, - "mgafq", 0); - if (ret) { - clear_bit(MGA_IN_FLUSH, - &dev_priv->dispatch_status); - break; - } - } - splx(s); - } - return ret; + DRM_OS_DEVICE; + drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; + + LOCK_TEST_WITH_RETURN( dev ); + + return mga_do_dma_reset( dev_priv ); } -/* Must be called with the lock held */ -void mga_reclaim_buffers(drm_device_t *dev, pid_t pid) + +/* ================================================================ + * DMA buffer management + */ + +#if 0 +static int mga_dma_get_buffers( drm_device_t *dev, drm_dma_t *d ) { - drm_device_dma_t *dma = dev->dma; - int i; + drm_buf_t *buf; + int i; - if (!dma) return; - if(dev->dev_private == NULL) return; - if(dma->buflist == NULL) return; + for ( i = d->granted_count ; i < d->request_count ; i++ ) { + buf = mga_freelist_get( dev ); + if ( !buf ) + DRM_OS_RETURN( EAGAIN ); - DRM_DEBUG("%s\n", __FUNCTION__); - mga_flush_queue(dev); + buf->pid = current->pid; - for (i = 0; i < dma->buf_count; i++) { - drm_buf_t *buf = dma->buflist[ i ]; - drm_mga_buf_priv_t *buf_priv = buf->dev_private; + if ( DRM_OS_COPYTOUSR( &d->request_indices[i], + &buf->idx, sizeof(buf->idx) ) ) + DRM_OS_RETURN( EFAULT ); + if ( DRM_OS_COPYTOUSR( &d->request_sizes[i], + &buf->total, sizeof(buf->total) ) ) + DRM_OS_RETURN( EFAULT ); - /* Only buffers that need to get reclaimed ever - * get set to free - */ - if (buf->pid == pid && buf_priv) { - if(buf_priv->my_freelist->age == MGA_BUF_USED) - buf_priv->my_freelist->age = MGA_BUF_FREE; - } + d->granted_count++; } + return 0; } +#endif /* 0 */ -int mga_lock(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int mga_dma_buffers( DRM_OS_IOCTL ) { - drm_device_t *dev = kdev->si_drv1; - int ret = 0; - drm_lock_t lock; + DRM_OS_DEVICE; + drm_device_dma_t *dma = dev->dma; + drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; + drm_dma_t d; + drm_buf_t *buf; + int i; + int ret = 0; - DRM_DEBUG("%s\n", __FUNCTION__); - lock = *(drm_lock_t *) data; + LOCK_TEST_WITH_RETURN( dev ); - if (lock.context == DRM_KERNEL_CONTEXT) { - DRM_ERROR("Process %d using kernel context %d\n", - p->p_pid, lock.context); - return EINVAL; - } - - DRM_DEBUG("%d (pid %d) requests lock (0x%08x), flags = 0x%08x\n", - lock.context, p->p_pid, dev->lock.hw_lock->lock, - lock.flags); + DRM_OS_KRNFROMUSR( d, (drm_dma_t *) data, sizeof(d) ); - if (lock.context < 0) { - return EINVAL; - } - - /* Only one queue: + /* Please don't send us buffers. */ - - if (!ret) { - atomic_inc(&dev->lock.lock_queue); - for (;;) { - if (!dev->lock.hw_lock) { - /* Device has been unregistered */ - ret = EINTR; - break; - } - if (drm_lock_take(&dev->lock.hw_lock->lock, - lock.context)) { - dev->lock.pid = p->p_pid; - dev->lock.lock_time = ticks; - atomic_inc(&dev->total_locks); - break; /* Got lock */ - } - - /* Contention */ - atomic_inc(&dev->total_sleeps); - ret = tsleep(&dev->lock.lock_queue, PZERO|PCATCH, - "mgal2", 0); - if (ret) - break; - } - atomic_dec(&dev->lock.lock_queue); + if ( d.send_count != 0 ) { + DRM_ERROR( "Process %d trying to send %d buffers via drmDMA\n", + DRM_OS_CURRENTPID, d.send_count ); + DRM_OS_RETURN( EINVAL ); } - - if (!ret) { - if (lock.flags & _DRM_LOCK_QUIESCENT) { - DRM_DEBUG("_DRM_LOCK_QUIESCENT\n"); - mga_flush_queue(dev); - mga_dma_quiescent(dev); - } + + /* We'll send you buffers. + */ + if ( d.request_count < 0 || d.request_count > dma->buf_count ) { + DRM_ERROR( "Process %d trying to get %d buffers (of %d max)\n", + DRM_OS_CURRENTPID, d.request_count, dma->buf_count ); + DRM_OS_RETURN( EINVAL ); } - - if (ret) DRM_DEBUG("%d %s\n", lock.context, ret ? "interrupted" : "has lock"); - return ret; -} - -int mga_flush_ioctl(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_lock_t lock; - drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private; - int s; - DRM_DEBUG("%s\n", __FUNCTION__); - lock = *(drm_lock_t *) data; + WRAP_TEST_WITH_RETURN( dev_priv ); - if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("mga_flush_ioctl called without lock held\n"); - return EINVAL; - } + d.granted_count = 0; - if(lock.flags & _DRM_LOCK_FLUSH || lock.flags & _DRM_LOCK_FLUSH_ALL) { - drm_mga_prim_buf_t *temp_buf; - temp_buf = dev_priv->current_prim; - - s = splsofttq(); - if(temp_buf && temp_buf->num_dwords) { - set_bit(MGA_BUF_FORCE_FIRE, &temp_buf->buffer_status); - mga_advance_primary(dev); - } - mga_dma_schedule(dev, 1); - splx(s); - } - if(lock.flags & _DRM_LOCK_QUIESCENT) { - mga_flush_queue(dev); - mga_dma_quiescent(dev); + if ( d.request_count ) { + for ( i = d.granted_count ; i < d.request_count ; i++ ) { + buf = mga_freelist_get( dev ); + if ( !buf ) + DRM_OS_RETURN( EAGAIN ); + + buf->pid = DRM_OS_CURRENTPID; + + if ( DRM_OS_COPYTOUSR( &d.request_indices[i], + &buf->idx, sizeof(buf->idx) ) ) + DRM_OS_RETURN( EFAULT ); + if ( DRM_OS_COPYTOUSR( &d.request_sizes[i], + &buf->total, sizeof(buf->total) ) ) + DRM_OS_RETURN( EFAULT ); + + d.granted_count++; + } + ret = 0; } - return 0; + DRM_OS_KRNTOUSR( (drm_dma_t *) data, d, sizeof(d) ); + + return ret; } diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_drv.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_drv.c index 77d7c4409..206a77dc0 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_drv.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_drv.c @@ -1,6 +1,6 @@ -/* mga_drv.c -- Matrox g200/g400 driver +/* mga_drv.c -- Matrox G200/G400 driver -*- linux-c -*- * Created: Mon Dec 13 01:56:22 1999 by jhartmann@precisioninsight.com - * + * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. * All Rights Reserved. @@ -11,704 +11,88 @@ * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * VA LINUX SYSTEMS AND/OR ITS 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: Rickard E. (Rik) Faith <faith@valinux.com> - * Jeff Hartmann <jhartmann@valinux.com> - * + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. * + * Authors: + * Rickard E. (Rik) Faith <faith@valinux.com> + * Gareth Hughes <gareth@valinux.com> */ -#include "drmP.h" -#include "mga_drv.h" +#include <sys/types.h> +#include <sys/bus.h> #include <pci/pcivar.h> +#include <opt_drm_linux.h> -MODULE_DEPEND(mga, drm, 1, 1, 1); -MODULE_DEPEND(mga, agp, 1, 1, 1); - -#define MGA_NAME "mga" -#define MGA_DESC "Matrox g200/g400" -#define MGA_DATE "20000928" -#define MGA_MAJOR 2 -#define MGA_MINOR 0 -#define MGA_PATCHLEVEL 0 - -drm_ctx_t mga_res_ctx; - -static int mga_probe(device_t dev) -{ - const char *s = 0; - - switch (pci_get_devid(dev)) { - case 0x0525102b: - s = "Matrox MGA G400 AGP graphics accelerator"; - break; - - case 0x0521102b: - s = "Matrox MGA G200 AGP graphics accelerator"; - break; - } - - if (s) { - device_set_desc(dev, s); - return 0; - } - - return ENXIO; -} - -static int mga_attach(device_t dev) -{ - return mga_init(dev); -} - -static int mga_detach(device_t dev) -{ - mga_cleanup(dev); - return 0; -} - -static device_method_t mga_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, mga_probe), - DEVMETHOD(device_attach, mga_attach), - DEVMETHOD(device_detach, mga_detach), - - { 0, 0 } -}; - -static driver_t mga_driver = { - "drm", - mga_methods, - sizeof(drm_device_t), -}; - -static devclass_t mga_devclass; -#define MGA_SOFTC(unit) \ - ((drm_device_t *) devclass_get_softc(mga_devclass, unit)) - -DRIVER_MODULE(if_mga, pci, mga_driver, mga_devclass, 0, 0); - -#define CDEV_MAJOR 145 - /* mga_drv.c */ -static struct cdevsw mga_cdevsw = { - /* open */ mga_open, - /* close */ mga_close, - /* read */ drm_read, - /* write */ drm_write, - /* ioctl */ mga_ioctl, - /* poll */ drm_poll, - /* mmap */ drm_mmap, - /* strategy */ nostrategy, - /* name */ "mga", - /* maj */ CDEV_MAJOR, - /* dump */ nodump, - /* psize */ nopsize, - /* flags */ D_TTY | D_TRACKCLOSE, - /* bmaj */ -1 -}; - -static drm_ioctl_desc_t mga_ioctls[] = { - [DRM_IOCTL_NR(DRM_IOCTL_VERSION)] = { mga_version, 0, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE)] = { drm_getunique, 0, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_GET_MAGIC)] = { drm_getmagic, 0, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_IRQ_BUSID)] = { drm_irq_busid, 0, 1 }, - - [DRM_IOCTL_NR(DRM_IOCTL_SET_UNIQUE)] = { drm_setunique, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_BLOCK)] = { drm_block, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_UNBLOCK)] = { drm_unblock, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_CONTROL)] = { mga_control, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_AUTH_MAGIC)] = { drm_authmagic, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP)] = { drm_addmap, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_ADD_BUFS)] = { mga_addbufs, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_MARK_BUFS)] = { mga_markbufs, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_INFO_BUFS)] = { mga_infobufs, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_MAP_BUFS)] = { mga_mapbufs, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_FREE_BUFS)] = { mga_freebufs, 1, 0 }, +#include "mga.h" +#include "drmP.h" +#include "mga_drv.h" - [DRM_IOCTL_NR(DRM_IOCTL_ADD_CTX)] = { mga_addctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_RM_CTX)] = { mga_rmctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_MOD_CTX)] = { mga_modctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_GET_CTX)] = { mga_getctx, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_SWITCH_CTX)] = { mga_switchctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_NEW_CTX)] = { mga_newctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_RES_CTX)] = { mga_resctx, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_ADD_DRAW)] = { drm_adddraw, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_RM_DRAW)] = { drm_rmdraw, 1, 1 }, +#define DRIVER_AUTHOR "Gareth Hughes, VA Linux Systems Inc." - [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { mga_dma, 1, 0 }, +#define DRIVER_NAME "mga" +#define DRIVER_DESC "Matrox G200/G400" +#define DRIVER_DATE "20010321" - [DRM_IOCTL_NR(DRM_IOCTL_LOCK)] = { mga_lock, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_UNLOCK)] = { mga_unlock, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_FINISH)] = { drm_finish, 1, 0 }, +#define DRIVER_MAJOR 3 +#define DRIVER_MINOR 0 +#define DRIVER_PATCHLEVEL 2 - [DRM_IOCTL_NR(DRM_IOCTL_AGP_ACQUIRE)] = { drm_agp_acquire, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_RELEASE)] = { drm_agp_release, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_ENABLE)] = { drm_agp_enable, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_INFO)] = { drm_agp_info, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_ALLOC)] = { drm_agp_alloc, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_FREE)] = { drm_agp_free, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND)] = { drm_agp_bind, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND)] = { drm_agp_unbind, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_MGA_INIT)] = { mga_dma_init, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_MGA_SWAP)] = { mga_swap_bufs, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_MGA_CLEAR)] = { mga_clear_bufs, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_MGA_ILOAD)] = { mga_iload, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_MGA_VERTEX)] = { mga_vertex, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_MGA_FLUSH)] = { mga_flush_ioctl, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_MGA_INDICES)] = { mga_indices, 1, 0 }, +/* List acquired from http://www.yourvote.com/pci/pcihdr.h and xc/xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h + * Please report to anholt@teleport.com inaccuracies or if a chip you have works that is marked unsupported here. + */ +drm_chipinfo_t DRM(devicelist)[] = { + {0x102b, 0x0520, 0, "Matrox G200 (PCI)"}, + {0x102b, 0x0521, 1, "Matrox G200 (AGP)"}, + {0x102b, 0x0525, 1, "Matrox G400 (AGP)"}, + {0, 0, 0, NULL} }; -#define MGA_IOCTL_COUNT DRM_ARRAY_SIZE(mga_ioctls) - -static int mga_setup(drm_device_t *dev) -{ - int i; - - device_busy(dev->device); - - atomic_set(&dev->ioctl_count, 0); - atomic_set(&dev->vma_count, 0); - dev->buf_use = 0; - atomic_set(&dev->buf_alloc, 0); - - drm_dma_setup(dev); - - atomic_set(&dev->total_open, 0); - atomic_set(&dev->total_close, 0); - atomic_set(&dev->total_ioctl, 0); - atomic_set(&dev->total_irq, 0); - atomic_set(&dev->total_ctx, 0); - atomic_set(&dev->total_locks, 0); - atomic_set(&dev->total_unlocks, 0); - atomic_set(&dev->total_contends, 0); - atomic_set(&dev->total_sleeps, 0); - - for (i = 0; i < DRM_HASH_SIZE; i++) { - dev->magiclist[i].head = NULL; - dev->magiclist[i].tail = NULL; - } - dev->maplist = NULL; - dev->map_count = 0; - dev->vmalist = NULL; - dev->lock.hw_lock = NULL; - dev->lock.lock_queue = 0; - dev->queue_count = 0; - dev->queue_reserved = 0; - dev->queue_slots = 0; - dev->queuelist = NULL; - dev->irq = 0; - dev->context_flag = 0; - dev->interrupt_flag = 0; - dev->dma_flag = 0; - dev->last_context = 0; - dev->last_switch = 0; - dev->last_checked = 0; - callout_init(&dev->timer); - dev->context_wait = 0; - - timespecclear(&dev->ctx_start); - timespecclear(&dev->lck_start); - - dev->buf_rp = dev->buf; - dev->buf_wp = dev->buf; - dev->buf_end = dev->buf + DRM_BSZ; - bzero(&dev->buf_sel, sizeof dev->buf_sel); - dev->buf_sigio = NULL; - dev->buf_readers = 0; - dev->buf_writers = 0; - dev->buf_selecting = 0; - - DRM_DEBUG("\n"); - - /* The kernel's context could be created here, but is now created - in drm_dma_enqueue. This is more resource-efficient for - hardware that does not do DMA, but may mean that - drm_select_queue fails between the time the interrupt is - initialized and the time the queues are initialized. */ - - return 0; -} - - -static int mga_takedown(drm_device_t *dev) -{ - int i; - drm_magic_entry_t *pt, *next; - drm_map_t *map; - drm_vma_entry_t *vma, *vma_next; - - DRM_DEBUG("\n"); - - if (dev->irq) mga_irq_uninstall(dev); - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - callout_stop(&dev->timer); - - if (dev->devname) { - drm_free(dev->devname, strlen(dev->devname)+1, DRM_MEM_DRIVER); - dev->devname = NULL; - } - - if (dev->unique) { - drm_free(dev->unique, strlen(dev->unique)+1, DRM_MEM_DRIVER); - dev->unique = NULL; - dev->unique_len = 0; - } - /* Clear pid list */ - for (i = 0; i < DRM_HASH_SIZE; i++) { - for (pt = dev->magiclist[i].head; pt; pt = next) { - next = pt->next; - drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC); - } - dev->magiclist[i].head = dev->magiclist[i].tail = NULL; - } - /* Clear AGP information */ - if (dev->agp) { - drm_agp_mem_t *entry; - drm_agp_mem_t *nexte; - - /* Remove AGP resources, but leave dev->agp - intact until cleanup is called. */ - for (entry = dev->agp->memory; entry; entry = nexte) { - nexte = entry->next; - if (entry->bound) drm_unbind_agp(entry->handle); - drm_free_agp(entry->handle, entry->pages); - drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS); - } - dev->agp->memory = NULL; - - if (dev->agp->acquired) - agp_release(dev->agp->agpdev); - - dev->agp->acquired = 0; - dev->agp->enabled = 0; - } - /* Clear vma list (only built for debugging) */ - if (dev->vmalist) { - for (vma = dev->vmalist; vma; vma = vma_next) { - vma_next = vma->next; - drm_free(vma, sizeof(*vma), DRM_MEM_VMAS); - } - dev->vmalist = NULL; - } - - /* Clear map area and mtrr information */ - if (dev->maplist) { - for (i = 0; i < dev->map_count; i++) { - map = dev->maplist[i]; - switch (map->type) { - case _DRM_REGISTERS: - case _DRM_FRAME_BUFFER: -#ifdef CONFIG_MTRR - if (map->mtrr >= 0) { - int retcode; - retcode = mtrr_del(map->mtrr, - map->offset, - map->size); - DRM_DEBUG("mtrr_del = %d\n", retcode); - } -#endif - drm_ioremapfree(map->handle, map->size); - break; - case _DRM_SHM: - drm_free_pages((unsigned long)map->handle, - drm_order(map->size) - - PAGE_SHIFT, - DRM_MEM_SAREA); - break; - case _DRM_AGP: - break; - } - drm_free(map, sizeof(*map), DRM_MEM_MAPS); - } - drm_free(dev->maplist, - dev->map_count * sizeof(*dev->maplist), - DRM_MEM_MAPS); - dev->maplist = NULL; - dev->map_count = 0; - } - - if (dev->queuelist) { - for (i = 0; i < dev->queue_count; i++) { - drm_waitlist_destroy(&dev->queuelist[i]->waitlist); - if (dev->queuelist[i]) { - drm_free(dev->queuelist[i], - sizeof(*dev->queuelist[0]), - DRM_MEM_QUEUES); - dev->queuelist[i] = NULL; - } - } - drm_free(dev->queuelist, - dev->queue_slots * sizeof(*dev->queuelist), - DRM_MEM_QUEUES); - dev->queuelist = NULL; - } - - drm_dma_takedown(dev); - - dev->queue_count = 0; - if (dev->lock.hw_lock) { - dev->lock.hw_lock = NULL; /* SHM removed */ - dev->lock.pid = 0; - wakeup(&dev->lock.lock_queue); - } - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - return 0; -} - -/* mga_init is called via mga_attach at module load time, */ - -int -mga_init(device_t nbdev) -{ - int retcode; - drm_device_t *dev = device_get_softc(nbdev); - - DRM_DEBUG("\n"); - - memset((void *)dev, 0, sizeof(*dev)); - simple_lock_init(&dev->count_lock); - lockinit(&dev->dev_lock, PZERO, "drmlk", 0, 0); - -#if 0 - drm_parse_options(mga); -#endif - dev->device = nbdev; - dev->devnode = make_dev(&mga_cdevsw, - device_get_unit(nbdev), - DRM_DEV_UID, - DRM_DEV_GID, - DRM_DEV_MODE, - MGA_NAME); - dev->name = MGA_NAME; - - DRM_DEBUG("doing mem init\n"); - drm_mem_init(); - DRM_DEBUG("doing proc init\n"); - drm_sysctl_init(dev); - TAILQ_INIT(&dev->files); - DRM_DEBUG("doing agp init\n"); - dev->agp = drm_agp_init(); - if(dev->agp == NULL) { - DRM_INFO("The mga drm module requires the agp module" - " to function correctly\nPlease load the agp" - " module before you load the mga module\n"); - drm_sysctl_cleanup(dev); - mga_takedown(dev); - return ENOMEM; - } -#if 0 - dev->agp->agp_mtrr = mtrr_add(dev->agp->agp_info.aper_base, - dev->agp->agp_info.aper_size * 1024 * 1024, - MTRR_TYPE_WRCOMB, - 1); -#endif - DRM_DEBUG("doing ctxbitmap init\n"); - if((retcode = drm_ctxbitmap_init(dev))) { - DRM_ERROR("Cannot allocate memory for context bitmap.\n"); - drm_sysctl_cleanup(dev); - mga_takedown(dev); - return retcode; - } - - DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n", - MGA_NAME, - MGA_MAJOR, - MGA_MINOR, - MGA_PATCHLEVEL, - MGA_DATE, - device_get_unit(nbdev)); - - return 0; -} - -/* mga_cleanup is called via cleanup_module at module unload time. */ - -void mga_cleanup(device_t nbdev) -{ - drm_device_t *dev = device_get_softc(nbdev); - - DRM_DEBUG("\n"); - - drm_sysctl_cleanup(dev); - destroy_dev(dev->devnode); - - DRM_INFO("Module unloaded\n"); - drm_ctxbitmap_cleanup(dev); - mga_dma_cleanup(dev); -#if 0 - if(dev->agp && dev->agp->agp_mtrr) { - int retval; - retval = mtrr_del(dev->agp->agp_mtrr, - dev->agp->agp_info.aper_base, - dev->agp->agp_info.aper_size * 1024*1024); - DRM_DEBUG("mtrr_del = %d\n", retval); - } -#endif - - mga_takedown(dev); - if (dev->agp) { - drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS); - dev->agp = NULL; - } -} - -int -mga_version(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_version_t version; - int len; - - version = *(drm_version_t *) data; - -#define DRM_COPY(name,value) \ - len = strlen(value); \ - if (len > name##_len) len = name##_len; \ - name##_len = strlen(value); \ - if (len && name) { \ - int error = copyout(value, name, len); \ - if (error) return error; \ - } - - version.version_major = MGA_MAJOR; - version.version_minor = MGA_MINOR; - version.version_patchlevel = MGA_PATCHLEVEL; - - DRM_COPY(version.name, MGA_NAME); - DRM_COPY(version.date, MGA_DATE); - DRM_COPY(version.desc, MGA_DESC); - - *(drm_version_t *) data = version; - return 0; -} - -int -mga_open(dev_t kdev, int flags, int fmt, struct proc *p) -{ - drm_device_t *dev = MGA_SOFTC(minor(kdev)); - int retcode = 0; - - DRM_DEBUG("open_count = %d\n", dev->open_count); - - device_busy(dev->device); - if (!(retcode = drm_open_helper(kdev, flags, fmt, p, dev))) { - atomic_inc(&dev->total_open); - simple_lock(&dev->count_lock); - if (!dev->open_count++) { - simple_unlock(&dev->count_lock); - retcode = mga_setup(dev); - } - simple_unlock(&dev->count_lock); - } - device_unbusy(dev->device); - - return retcode; -} - -int -mga_close(dev_t kdev, int flags, int fmt, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_file_t *priv; - int retcode = 0; - - DRM_DEBUG("pid = %d, open_count = %d\n", - p->p_pid, dev->open_count); - - priv = drm_find_file_by_proc(dev, p); - if (!priv) { - DRM_DEBUG("can't find authenticator\n"); - return EINVAL; - } - - if (dev->lock.hw_lock && _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) - && dev->lock.pid == p->p_pid) { - mga_reclaim_buffers(dev, priv->pid); - DRM_ERROR("Process %d dead, freeing lock for context %d\n", - p->p_pid, - _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); - drm_lock_free(dev, - &dev->lock.hw_lock->lock, - _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); - - /* FIXME: may require heavy-handed reset of - hardware at this point, possibly - processed via a callback to the X - server. */ - } else if (dev->lock.hw_lock) { - /* The lock is required to reclaim buffers */ - for (;;) { - if (!dev->lock.hw_lock) { - /* Device has been unregistered */ - retcode = EINTR; - break; - } - if (drm_lock_take(&dev->lock.hw_lock->lock, - DRM_KERNEL_CONTEXT)) { - dev->lock.pid = p->p_pid; - dev->lock.lock_time = ticks; - atomic_inc(&dev->total_locks); - break; /* Got lock */ - } - /* Contention */ - atomic_inc(&dev->total_sleeps); - retcode = tsleep(&dev->lock.lock_queue, - PZERO|PCATCH, - "drmlk2", - 0); - if (retcode) - break; - } - if(!retcode) { - mga_reclaim_buffers(dev, priv->pid); - drm_lock_free(dev, &dev->lock.hw_lock->lock, - DRM_KERNEL_CONTEXT); - } - } - funsetown(dev->buf_sigio); - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, p); - priv = drm_find_file_by_proc(dev, p); - if (priv) { - priv->refs--; - if (!priv->refs) { - TAILQ_REMOVE(&dev->files, priv, link); - drm_free(priv, sizeof(*priv), DRM_MEM_FILES); - } - } - lockmgr(&dev->dev_lock, LK_RELEASE, 0, p); - - atomic_inc(&dev->total_close); - simple_lock(&dev->count_lock); - if (!--dev->open_count) { - if (atomic_read(&dev->ioctl_count) || dev->blocked) { - DRM_ERROR("Device busy: %d %d\n", - atomic_read(&dev->ioctl_count), - dev->blocked); - simple_unlock(&dev->count_lock); - return EBUSY; - } - simple_unlock(&dev->count_lock); - device_unbusy(dev->device); - return mga_takedown(dev); - } - simple_unlock(&dev->count_lock); - return retcode; -} - - -/* mga_ioctl is called whenever a process performs an ioctl on /dev/drm. */ - -int -mga_ioctl(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - int nr = DRM_IOCTL_NR(cmd); - drm_device_t *dev = kdev->si_drv1; - drm_file_t *priv; - int retcode = 0; - drm_ioctl_desc_t *ioctl; - d_ioctl_t *func; - - DRM_DEBUG("dev=%p\n", dev); - priv = drm_find_file_by_proc(dev, p); - if (!priv) { - DRM_DEBUG("can't find authenticator\n"); - return EINVAL; - } - - atomic_inc(&dev->ioctl_count); - atomic_inc(&dev->total_ioctl); - ++priv->ioctl_count; - - DRM_DEBUG("pid = %d, cmd = 0x%02lx, nr = 0x%02x, auth = %d\n", - p->p_pid, cmd, nr, priv->authenticated); - - switch (cmd) { - case FIONBIO: - atomic_dec(&dev->ioctl_count); - return 0; - - case FIOASYNC: - atomic_dec(&dev->ioctl_count); - dev->flags |= FASYNC; - return 0; - - case FIOSETOWN: - atomic_dec(&dev->ioctl_count); - return fsetown(*(int *)data, &dev->buf_sigio); - - case FIOGETOWN: - atomic_dec(&dev->ioctl_count); - *(int *) data = fgetown(dev->buf_sigio); - return 0; - } - - if (nr >= MGA_IOCTL_COUNT) { - retcode = EINVAL; - } else { - ioctl = &mga_ioctls[nr]; - func = ioctl->func; - - if (!func) { - DRM_DEBUG("no function\n"); - retcode = EINVAL; - } else if ((ioctl->root_only && suser(p)) - || (ioctl->auth_needed && !priv->authenticated)) { - retcode = EACCES; - } else { - retcode = (func)(kdev, cmd, data, flags, p); - } - } - - atomic_dec(&dev->ioctl_count); - return retcode; -} - -int -mga_unlock(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_lock_t lock; - int s; - - lock = *(drm_lock_t *) data; - - if (lock.context == DRM_KERNEL_CONTEXT) { - DRM_ERROR("Process %d using kernel context %d\n", - p->p_pid, lock.context); - return EINVAL; - } - - DRM_DEBUG("%d frees lock (%d holds)\n", - lock.context, - _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); - atomic_inc(&dev->total_unlocks); - if (_DRM_LOCK_IS_CONT(dev->lock.hw_lock->lock)) - atomic_inc(&dev->total_contends); - drm_lock_transfer(dev, &dev->lock.hw_lock->lock, DRM_KERNEL_CONTEXT); - - s = splsofttq(); - mga_dma_schedule(dev, 1); - splx(s); - - if (drm_lock_free(dev, &dev->lock.hw_lock->lock, - DRM_KERNEL_CONTEXT)) { - DRM_ERROR("\n"); - } - - return 0; -} +#define DRIVER_IOCTLS \ + [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { mga_dma_buffers, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_INIT)] = { mga_dma_init, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_FLUSH)] = { mga_dma_flush, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_RESET)] = { mga_dma_reset, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_SWAP)] = { mga_dma_swap, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_CLEAR)] = { mga_dma_clear, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_VERTEX)] = { mga_dma_vertex, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_INDICES)] = { mga_dma_indices, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_ILOAD)] = { mga_dma_iload, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_BLIT)] = { mga_dma_blit, 1, 0 }, + + +#define __HAVE_COUNTERS 3 +#define __HAVE_COUNTER6 _DRM_STAT_IRQ +#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY +#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY + + +#include "drm_agpsupport.h" +#include "drm_auth.h" +#include "drm_bufs.h" +#include "drm_context.h" +#include "drm_dma.h" +#include "drm_drawable.h" +#include "drm_drv.h" + + +#include "drm_fops.h" +#include "drm_init.h" +#include "drm_ioctl.h" +#include "drm_lock.h" +#include "drm_memory.h" +#include "drm_vm.h" +#include "drm_sysctl.h" + +DRIVER_MODULE(mga, pci, mga_driver, mga_devclass, 0, 0); diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_drv.h b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_drv.h index 9e51a20d0..be207e304 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_drv.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_drv.h @@ -1,4 +1,4 @@ -/* mga_drv.h -- Private header for the Matrox g200/g400 driver +/* mga_drv.h -- Private header for the Matrox G200/G400 driver -*- linux-c -*- * Created: Mon Dec 13 01:50:01 1999 by jhartmann@precisioninsight.com * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. @@ -11,163 +11,157 @@ * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * VA LINUX SYSTEMS AND/OR ITS 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: Rickard E. (Rik) Faith <faith@valinux.com> - * Jeff Hartmann <jhartmann@valinux.com> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. * + * Authors: + * Gareth Hughes <gareth@valinux.com> */ -#ifndef _MGA_DRV_H_ -#define _MGA_DRV_H_ +#ifndef __MGA_DRV_H__ +#define __MGA_DRV_H__ -#define MGA_BUF_IN_USE 0 -#define MGA_BUF_SWAP_PENDING 1 -#define MGA_BUF_FORCE_FIRE 2 -#define MGA_BUF_NEEDS_OVERFLOW 3 +#ifndef u8 +#define u8 u_int8_t +#define u16 u_int16_t +#define u32 u_int32_t +#endif -typedef struct { - u_int32_t buffer_status; - int num_dwords; - int max_dwords; - u_int32_t *current_dma_ptr; - u_int32_t *head; - u_int32_t phys_head; - unsigned int prim_age; - int sec_used; - int idx; -} drm_mga_prim_buf_t; - -typedef struct _drm_mga_freelist { - __volatile__ unsigned int age; +typedef struct drm_mga_primary_buffer { + u8 *start; + u8 *end; + int size; + + u32 tail; + int space; + volatile long wrapped; + + volatile u32 *status; + + u32 last_flush; + u32 last_wrap; + + u32 high_mark; + + spinlock_t list_lock; +} drm_mga_primary_buffer_t; + +typedef struct drm_mga_freelist { + struct drm_mga_freelist *next; + struct drm_mga_freelist *prev; + drm_mga_age_t age; drm_buf_t *buf; - struct _drm_mga_freelist *next; - struct _drm_mga_freelist *prev; } drm_mga_freelist_t; -#define MGA_IN_DISPATCH 0 -#define MGA_IN_FLUSH 1 -#define MGA_IN_WAIT 2 -#define MGA_IN_GETBUF 3 - -typedef struct _drm_mga_private { - u_int32_t dispatch_status; - unsigned int next_prim_age; - __volatile__ unsigned int last_prim_age; - int reserved_map_idx; - int buffer_map_idx; - drm_mga_sarea_t *sarea_priv; - int primary_size; - int warp_ucode_size; - int chipset; - unsigned int frontOffset; - unsigned int backOffset; - unsigned int depthOffset; - unsigned int textureOffset; - unsigned int textureSize; - int cpp; - unsigned int stride; - int sgram; - int use_agp; - drm_mga_warp_index_t WarpIndex[MGA_MAX_G400_PIPES]; - unsigned int WarpPipe; - unsigned int vertexsize; - atomic_t pending_bufs; - void *status_page; - unsigned long real_status_page; - u_int8_t *ioremap; - drm_mga_prim_buf_t **prim_bufs; - drm_mga_prim_buf_t *next_prim; - drm_mga_prim_buf_t *last_prim; - drm_mga_prim_buf_t *current_prim; - int current_prim_idx; +typedef struct { + drm_mga_freelist_t *list_entry; + int discard; + int dispatched; +} drm_mga_buf_priv_t; + +typedef struct drm_mga_private { + drm_mga_primary_buffer_t prim; + drm_mga_sarea_t *sarea_priv; + drm_mga_freelist_t *head; drm_mga_freelist_t *tail; - int flush_queue; /* Processes waiting until flush */ - int wait_queue; /* Processes waiting until interrupt */ - int buf_queue; /* Processes waiting for a free buf */ - /* Some validated register values: - */ - u_int32_t mAccess; -} drm_mga_private_t; - /* mga_drv.c */ -extern int mga_init(device_t); -extern void mga_cleanup(device_t); -extern d_ioctl_t mga_version; -extern d_open_t mga_open; -extern d_close_t mga_close; -extern d_ioctl_t mga_ioctl; -extern d_ioctl_t mga_unlock; + unsigned int warp_pipe; + unsigned long warp_pipe_phys[MGA_MAX_WARP_PIPES]; + + int chipset; + int usec_timeout; + + u32 clear_cmd; + u32 maccess; + + unsigned int fb_cpp; + unsigned int front_offset; + unsigned int front_pitch; + unsigned int back_offset; + unsigned int back_pitch; + + unsigned int depth_cpp; + unsigned int depth_offset; + unsigned int depth_pitch; + + unsigned int texture_offset; + unsigned int texture_size; + + drm_map_t *sarea; + drm_map_t *fb; + drm_map_t *mmio; + drm_map_t *status; + drm_map_t *warp; + drm_map_t *primary; + drm_map_t *buffers; + drm_map_t *agp_textures; +} drm_mga_private_t; /* mga_dma.c */ -extern int mga_dma_schedule(drm_device_t *dev, int locked); -extern int mga_irq_install(drm_device_t *dev, int irq); -extern int mga_irq_uninstall(drm_device_t *dev); -extern d_ioctl_t mga_dma; -extern d_ioctl_t mga_control; -extern d_ioctl_t mga_lock; - -/* mga_dma_init does init and release */ -extern int mga_dma_cleanup(drm_device_t *dev); -extern d_ioctl_t mga_dma_init; -extern d_ioctl_t mga_flush_ioctl; -extern void mga_flush_write_combine(void); -extern unsigned int mga_create_sync_tag(drm_device_t *dev); -extern drm_buf_t *mga_freelist_get(drm_device_t *dev); -extern int mga_freelist_put(drm_device_t *dev, drm_buf_t *buf); -extern int mga_advance_primary(drm_device_t *dev); -extern void mga_reclaim_buffers(drm_device_t *dev, pid_t pid); - - /* mga_bufs.c */ -extern d_ioctl_t mga_addbufs; -extern d_ioctl_t mga_infobufs; -extern d_ioctl_t mga_markbufs; -extern d_ioctl_t mga_freebufs; -extern d_ioctl_t mga_mapbufs; -extern d_ioctl_t mga_addmap; - /* mga_state.c */ -extern d_ioctl_t mga_clear_bufs; -extern d_ioctl_t mga_swap_bufs; -extern d_ioctl_t mga_iload; -extern d_ioctl_t mga_vertex; -extern d_ioctl_t mga_indices; - /* mga_context.c */ -extern d_ioctl_t mga_resctx; -extern d_ioctl_t mga_addctx; -extern d_ioctl_t mga_modctx; -extern d_ioctl_t mga_getctx; -extern d_ioctl_t mga_switchctx; -extern d_ioctl_t mga_newctx; -extern d_ioctl_t mga_rmctx; - -extern int mga_context_switch(drm_device_t *dev, int old, int new); -extern int mga_context_switch_complete(drm_device_t *dev, int new); - - -typedef enum { - TT_GENERAL, - TT_BLIT, - TT_VECTOR, - TT_VERTEX -} transferType_t; +extern int mga_dma_init( DRM_OS_IOCTL ); +extern int mga_dma_flush( DRM_OS_IOCTL ); +extern int mga_dma_reset( DRM_OS_IOCTL ); +extern int mga_dma_buffers( DRM_OS_IOCTL ); -typedef struct { - drm_mga_freelist_t *my_freelist; - int discard; - int dispatched; -} drm_mga_buf_priv_t; +extern int mga_do_wait_for_idle( drm_mga_private_t *dev_priv ); +extern int mga_do_dma_idle( drm_mga_private_t *dev_priv ); +extern int mga_do_dma_reset( drm_mga_private_t *dev_priv ); +extern int mga_do_engine_reset( drm_mga_private_t *dev_priv ); +extern int mga_do_cleanup_dma( drm_device_t *dev ); + +extern void mga_do_dma_flush( drm_mga_private_t *dev_priv ); +extern void mga_do_dma_wrap_start( drm_mga_private_t *dev_priv ); +extern void mga_do_dma_wrap_end( drm_mga_private_t *dev_priv ); + +extern int mga_freelist_put( drm_device_t *dev, drm_buf_t *buf ); + + /* mga_state.c */ +extern int mga_dma_clear( DRM_OS_IOCTL ); +extern int mga_dma_swap( DRM_OS_IOCTL ); +extern int mga_dma_vertex( DRM_OS_IOCTL ); +extern int mga_dma_indices( DRM_OS_IOCTL ); +extern int mga_dma_iload( DRM_OS_IOCTL ); +extern int mga_dma_blit( DRM_OS_IOCTL ); + + /* mga_warp.c */ +extern int mga_warp_install_microcode( drm_mga_private_t *dev_priv ); +extern int mga_warp_init( drm_mga_private_t *dev_priv ); + +#define mga_flush_write_combine() DRM_OS_READMEMORYBARRIER + +#define MGA_BASE( reg ) ((unsigned long)(dev_priv->mmio->handle)) +#define MGA_ADDR( reg ) (MGA_BASE(reg) + reg) + +#define MGA_DEREF( reg ) *(volatile u32 *)MGA_ADDR( reg ) +#define MGA_DEREF8( reg ) *(volatile u8 *)MGA_ADDR( reg ) + +#ifdef __alpha__ +#define MGA_READ( reg ) (_MGA_READ((u32 *)MGA_ADDR(reg))) +#define MGA_WRITE( reg, val ) do { wmb(); MGA_DEREF( reg ) = val; } while (0) +#define MGA_WRITE8( reg, val ) do { wmb(); MGA_DEREF8( reg ) = val; } while (0) + +static inline u32 _MGA_READ(u32 *addr) +{ + mb(); + return *(volatile u32 *)addr; +} + +#else +#define MGA_READ( reg ) MGA_DEREF( reg ) +#define MGA_WRITE( reg, val ) do { MGA_DEREF( reg ) = val; } while (0) +#define MGA_WRITE8( reg, val ) do { MGA_DEREF8( reg ) = val; } while (0) +#endif #define DWGREG0 0x1c00 #define DWGREG0_END 0x1dff @@ -175,322 +169,470 @@ typedef struct { #define DWGREG1_END 0x2dff #define ISREG0(r) (r >= DWGREG0 && r <= DWGREG0_END) -#define ADRINDEX0(r) (u_int8_t)((r - DWGREG0) >> 2) -#define ADRINDEX1(r) (u_int8_t)(((r - DWGREG1) >> 2) | 0x80) -#define ADRINDEX(r) (ISREG0(r) ? ADRINDEX0(r) : ADRINDEX1(r)) - -#define MGA_VERBOSE 0 -#define MGA_NUM_PRIM_BUFS 8 - -#define PRIMLOCALS u_int8_t tempIndex[4]; u_int32_t *dma_ptr; u_int32_t phys_head; \ - int outcount, num_dwords - -#define PRIM_OVERFLOW(dev, dev_priv, length) do { \ - drm_mga_prim_buf_t *tmp_buf = \ - dev_priv->prim_bufs[dev_priv->current_prim_idx]; \ - if( test_bit(MGA_BUF_NEEDS_OVERFLOW, \ - &tmp_buf->buffer_status)) { \ - mga_advance_primary(dev); \ - mga_dma_schedule(dev, 1); \ - tmp_buf = dev_priv->prim_bufs[dev_priv->current_prim_idx]; \ - } else if( tmp_buf->max_dwords - tmp_buf->num_dwords < length ||\ - tmp_buf->sec_used > MGA_DMA_BUF_NR/2) { \ - set_bit(MGA_BUF_FORCE_FIRE, &tmp_buf->buffer_status); \ - mga_advance_primary(dev); \ - mga_dma_schedule(dev, 1); \ - tmp_buf = dev_priv->prim_bufs[dev_priv->current_prim_idx]; \ +#define DMAREG0(r) (u8)((r - DWGREG0) >> 2) +#define DMAREG1(r) (u8)(((r - DWGREG1) >> 2) | 0x80) +#define DMAREG(r) (ISREG0(r) ? DMAREG0(r) : DMAREG1(r)) + + + +/* ================================================================ + * Helper macross... + */ + +#define MGA_EMIT_STATE( dev_priv, dirty ) \ +do { \ + if ( (dirty) & ~MGA_UPLOAD_CLIPRECTS ) { \ + if ( dev_priv->chipset == MGA_CARD_TYPE_G400 ) { \ + mga_g400_emit_state( dev_priv ); \ + } else { \ + mga_g200_emit_state( dev_priv ); \ + } \ } \ - if(MGA_VERBOSE) \ - DRM_DEBUG("PRIMGETPTR in %s\n", __FUNCTION__); \ - dma_ptr = tmp_buf->current_dma_ptr; \ - num_dwords = tmp_buf->num_dwords; \ - phys_head = tmp_buf->phys_head; \ - outcount = 0; \ -} while(0) - -#define PRIMGETPTR(dev_priv) do { \ - drm_mga_prim_buf_t *tmp_buf = \ - dev_priv->prim_bufs[dev_priv->current_prim_idx]; \ - if(MGA_VERBOSE) \ - DRM_DEBUG("PRIMGETPTR in %s\n", __FUNCTION__); \ - dma_ptr = tmp_buf->current_dma_ptr; \ - num_dwords = tmp_buf->num_dwords; \ - phys_head = tmp_buf->phys_head; \ - outcount = 0; \ -} while(0) - -#define PRIMPTR(prim_buf) do { \ - if(MGA_VERBOSE) \ - DRM_DEBUG("PRIMPTR in %s\n", __FUNCTION__); \ - dma_ptr = prim_buf->current_dma_ptr; \ - num_dwords = prim_buf->num_dwords; \ - phys_head = prim_buf->phys_head; \ - outcount = 0; \ -} while(0) - -#define PRIMFINISH(prim_buf) do { \ - if (MGA_VERBOSE) { \ - DRM_DEBUG( "PRIMFINISH in %s\n", __FUNCTION__); \ - if (outcount & 3) \ - DRM_DEBUG(" --- truncation\n"); \ - } \ - prim_buf->num_dwords = num_dwords; \ - prim_buf->current_dma_ptr = dma_ptr; \ -} while(0) - -#define PRIMADVANCE(dev_priv) do { \ -drm_mga_prim_buf_t *tmp_buf = \ - dev_priv->prim_bufs[dev_priv->current_prim_idx]; \ - if (MGA_VERBOSE) { \ - DRM_DEBUG("PRIMADVANCE in %s\n", __FUNCTION__); \ - if (outcount & 3) \ - DRM_DEBUG(" --- truncation\n"); \ - } \ - tmp_buf->num_dwords = num_dwords; \ - tmp_buf->current_dma_ptr = dma_ptr; \ } while (0) -#define PRIMUPDATE(dev_priv) do { \ - drm_mga_prim_buf_t *tmp_buf = \ - dev_priv->prim_bufs[dev_priv->current_prim_idx]; \ - tmp_buf->sec_used++; \ +#define LOCK_TEST_WITH_RETURN( dev ) \ +do { \ + if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) || \ + dev->lock.pid != DRM_OS_CURRENTPID ) { \ + DRM_ERROR( "%s called without lock held\n", \ + __FUNCTION__ ); \ + DRM_OS_RETURN( EINVAL ); \ + } \ } while (0) -#define AGEBUF(dev_priv, buf_priv) do { \ - drm_mga_prim_buf_t *tmp_buf = \ - dev_priv->prim_bufs[dev_priv->current_prim_idx]; \ - buf_priv->my_freelist->age = tmp_buf->prim_age; \ +#define WRAP_TEST_WITH_RETURN( dev_priv ) \ +do { \ + if ( test_bit( 0, &dev_priv->prim.wrapped ) ) { \ + if ( mga_is_idle( dev_priv ) ) { \ + mga_do_dma_wrap_end( dev_priv ); \ + } else if ( dev_priv->prim.space < \ + dev_priv->prim.high_mark ) { \ + if ( MGA_DMA_DEBUG ) \ + DRM_INFO( __FUNCTION__": wrap...\n" ); \ + DRM_OS_RETURN( EBUSY); \ + } \ + } \ } while (0) +#define WRAP_WAIT_WITH_RETURN( dev_priv ) \ +do { \ + if ( test_bit( 0, &dev_priv->prim.wrapped ) ) { \ + if ( mga_do_wait_for_idle( dev_priv ) ) { \ + if ( MGA_DMA_DEBUG ) \ + DRM_INFO( __FUNCTION__": wrap...\n" ); \ + DRM_OS_RETURN( EBUSY); \ + } \ + mga_do_dma_wrap_end( dev_priv ); \ + } \ +} while (0) + + +/* ================================================================ + * Primary DMA command stream + */ + +#define MGA_VERBOSE 0 -#define PRIMOUTREG(reg, val) do { \ - tempIndex[outcount]=ADRINDEX(reg); \ - dma_ptr[1+outcount] = val; \ - if (MGA_VERBOSE) \ - DRM_DEBUG(" PRIMOUT %d: 0x%x -- 0x%x\n", \ - num_dwords + 1 + outcount, ADRINDEX(reg), val); \ - if( ++outcount == 4) { \ - outcount = 0; \ - dma_ptr[0] = *(u_int32_t *)tempIndex; \ - dma_ptr+=5; \ - num_dwords += 5; \ +#define DMA_LOCALS unsigned int write; volatile u8 *prim; + +#define DMA_BLOCK_SIZE (5 * sizeof(u32)) + +#define BEGIN_DMA( n ) \ +do { \ + if ( MGA_VERBOSE ) { \ + DRM_INFO( "BEGIN_DMA( %d ) in %s\n", \ + (n), __FUNCTION__ ); \ + DRM_INFO( " space=0x%x req=0x%x\n", \ + dev_priv->prim.space, (n) * DMA_BLOCK_SIZE ); \ } \ -}while (0) + prim = dev_priv->prim.start; \ + write = dev_priv->prim.tail; \ +} while (0) + +#define BEGIN_DMA_WRAP() \ +do { \ + if ( MGA_VERBOSE ) { \ + DRM_INFO( "BEGIN_DMA() in %s\n", __FUNCTION__ ); \ + DRM_INFO( " space=0x%x\n", dev_priv->prim.space ); \ + } \ + prim = dev_priv->prim.start; \ + write = dev_priv->prim.tail; \ +} while (0) + +#define ADVANCE_DMA() \ +do { \ + dev_priv->prim.tail = write; \ + if ( MGA_VERBOSE ) { \ + DRM_INFO( "ADVANCE_DMA() tail=0x%05x sp=0x%x\n", \ + write, dev_priv->prim.space ); \ + } \ +} while (0) + +#define FLUSH_DMA() \ +do { \ + if ( 0 ) { \ + DRM_INFO( __FUNCTION__ ":\n" ); \ + DRM_INFO( " tail=0x%06x head=0x%06lx\n", \ + dev_priv->prim.tail, \ + MGA_READ( MGA_PRIMADDRESS ) - \ + dev_priv->primary->offset ); \ + } \ + if ( !test_bit( 0, &dev_priv->prim.wrapped ) ) { \ + if ( dev_priv->prim.space < \ + dev_priv->prim.high_mark ) { \ + mga_do_dma_wrap_start( dev_priv ); \ + } else { \ + mga_do_dma_flush( dev_priv ); \ + } \ + } \ +} while (0) + +/* Never use this, always use DMA_BLOCK(...) for primary DMA output. + */ +#define DMA_WRITE( offset, val ) \ +do { \ + if ( MGA_VERBOSE ) { \ + DRM_INFO( " DMA_WRITE( 0x%08x ) at 0x%04x\n", \ + (u32)(val), write + (offset) * sizeof(u32) ); \ + } \ + *(volatile u32 *)(prim + write + (offset) * sizeof(u32)) = val; \ +} while (0) + +#define DMA_BLOCK( reg0, val0, reg1, val1, reg2, val2, reg3, val3 ) \ +do { \ + DMA_WRITE( 0, ((DMAREG( reg0 ) << 0) | \ + (DMAREG( reg1 ) << 8) | \ + (DMAREG( reg2 ) << 16) | \ + (DMAREG( reg3 ) << 24)) ); \ + DMA_WRITE( 1, val0 ); \ + DMA_WRITE( 2, val1 ); \ + DMA_WRITE( 3, val2 ); \ + DMA_WRITE( 4, val3 ); \ + write += DMA_BLOCK_SIZE; \ +} while (0) + + +/* Buffer aging via primary DMA stream head pointer. + */ + +#define SET_AGE( age, h, w ) \ +do { \ + (age)->head = h; \ + (age)->wrap = w; \ +} while (0) + +#define TEST_AGE( age, h, w ) ( (age)->wrap < w || \ + ( (age)->wrap == w && \ + (age)->head < h ) ) + +#define AGE_BUFFER( buf_priv ) \ +do { \ + drm_mga_freelist_t *entry = (buf_priv)->list_entry; \ + if ( (buf_priv)->dispatched ) { \ + entry->age.head = (dev_priv->prim.tail + \ + dev_priv->primary->offset); \ + entry->age.wrap = dev_priv->sarea_priv->last_wrap; \ + } else { \ + entry->age.head = 0; \ + entry->age.wrap = 0; \ + } \ +} while (0) + + +#define MGA_ENGINE_IDLE_MASK (MGA_SOFTRAPEN | \ + MGA_DWGENGSTS | \ + MGA_ENDPRDMASTS) +#define MGA_DMA_IDLE_MASK (MGA_SOFTRAPEN | \ + MGA_ENDPRDMASTS) + +#define MGA_DMA_DEBUG 0 + + /* A reduced set of the mga registers. */ +#define MGA_CRTC_INDEX 0x1fd4 + +#define MGA_ALPHACTRL 0x2c7c +#define MGA_AR0 0x1c60 +#define MGA_AR1 0x1c64 +#define MGA_AR2 0x1c68 +#define MGA_AR3 0x1c6c +#define MGA_AR4 0x1c70 +#define MGA_AR5 0x1c74 +#define MGA_AR6 0x1c78 + +#define MGA_CXBNDRY 0x1c80 +#define MGA_CXLEFT 0x1ca0 +#define MGA_CXRIGHT 0x1ca4 + +#define MGA_DMAPAD 0x1c54 +#define MGA_DSTORG 0x2cb8 +#define MGA_DWGCTL 0x1c00 +# define MGA_OPCOD_MASK (15 << 0) +# define MGA_OPCOD_TRAP (4 << 0) +# define MGA_OPCOD_TEXTURE_TRAP (6 << 0) +# define MGA_OPCOD_BITBLT (8 << 0) +# define MGA_OPCOD_ILOAD (9 << 0) +# define MGA_ATYPE_MASK (7 << 4) +# define MGA_ATYPE_RPL (0 << 4) +# define MGA_ATYPE_RSTR (1 << 4) +# define MGA_ATYPE_ZI (3 << 4) +# define MGA_ATYPE_BLK (4 << 4) +# define MGA_ATYPE_I (7 << 4) +# define MGA_LINEAR (1 << 7) +# define MGA_ZMODE_MASK (7 << 8) +# define MGA_ZMODE_NOZCMP (0 << 8) +# define MGA_ZMODE_ZE (2 << 8) +# define MGA_ZMODE_ZNE (3 << 8) +# define MGA_ZMODE_ZLT (4 << 8) +# define MGA_ZMODE_ZLTE (5 << 8) +# define MGA_ZMODE_ZGT (6 << 8) +# define MGA_ZMODE_ZGTE (7 << 8) +# define MGA_SOLID (1 << 11) +# define MGA_ARZERO (1 << 12) +# define MGA_SGNZERO (1 << 13) +# define MGA_SHIFTZERO (1 << 14) +# define MGA_BOP_MASK (15 << 16) +# define MGA_BOP_ZERO (0 << 16) +# define MGA_BOP_DST (10 << 16) +# define MGA_BOP_SRC (12 << 16) +# define MGA_BOP_ONE (15 << 16) +# define MGA_TRANS_SHIFT 20 +# define MGA_TRANS_MASK (15 << 20) +# define MGA_BLTMOD_MASK (15 << 25) +# define MGA_BLTMOD_BMONOLEF (0 << 25) +# define MGA_BLTMOD_BMONOWF (4 << 25) +# define MGA_BLTMOD_PLAN (1 << 25) +# define MGA_BLTMOD_BFCOL (2 << 25) +# define MGA_BLTMOD_BU32BGR (3 << 25) +# define MGA_BLTMOD_BU32RGB (7 << 25) +# define MGA_BLTMOD_BU24BGR (11 << 25) +# define MGA_BLTMOD_BU24RGB (15 << 25) +# define MGA_PATTERN (1 << 29) +# define MGA_TRANSC (1 << 30) +# define MGA_CLIPDIS (1 << 31) +#define MGA_DWGSYNC 0x2c4c + +#define MGA_FCOL 0x1c24 +#define MGA_FIFOSTATUS 0x1e10 +#define MGA_FOGCOL 0x1cf4 +#define MGA_FXBNDRY 0x1c84 +#define MGA_FXLEFT 0x1ca8 +#define MGA_FXRIGHT 0x1cac + +#define MGA_ICLEAR 0x1e18 +# define MGA_SOFTRAPICLR (1 << 0) +#define MGA_IEN 0x1e1c +# define MGA_SOFTRAPIEN (1 << 0) + +#define MGA_LEN 0x1c5c + +#define MGA_MACCESS 0x1c04 + +#define MGA_PITCH 0x1c8c +#define MGA_PLNWT 0x1c1c +#define MGA_PRIMADDRESS 0x1e58 +# define MGA_DMA_GENERAL (0 << 0) +# define MGA_DMA_BLIT (1 << 0) +# define MGA_DMA_VECTOR (2 << 0) +# define MGA_DMA_VERTEX (3 << 0) +#define MGA_PRIMEND 0x1e5c +# define MGA_PRIMNOSTART (1 << 0) +# define MGA_PAGPXFER (1 << 1) +#define MGA_PRIMPTR 0x1e50 +# define MGA_PRIMPTREN0 (1 << 0) +# define MGA_PRIMPTREN1 (1 << 1) + +#define MGA_RST 0x1e40 +# define MGA_SOFTRESET (1 << 0) +# define MGA_SOFTEXTRST (1 << 1) + +#define MGA_SECADDRESS 0x2c40 +#define MGA_SECEND 0x2c44 +#define MGA_SETUPADDRESS 0x2cd0 +#define MGA_SETUPEND 0x2cd4 +#define MGA_SGN 0x1c58 +#define MGA_SOFTRAP 0x2c48 +#define MGA_SRCORG 0x2cb4 +# define MGA_SRMMAP_MASK (1 << 0) +# define MGA_SRCMAP_FB (0 << 0) +# define MGA_SRCMAP_SYSMEM (1 << 0) +# define MGA_SRCACC_MASK (1 << 1) +# define MGA_SRCACC_PCI (0 << 1) +# define MGA_SRCACC_AGP (1 << 1) +#define MGA_STATUS 0x1e14 +# define MGA_SOFTRAPEN (1 << 0) +# define MGA_DWGENGSTS (1 << 16) +# define MGA_ENDPRDMASTS (1 << 17) +#define MGA_STENCIL 0x2cc8 +#define MGA_STENCILCTL 0x2ccc + +#define MGA_TDUALSTAGE0 0x2cf8 +#define MGA_TDUALSTAGE1 0x2cfc +#define MGA_TEXBORDERCOL 0x2c5c +#define MGA_TEXCTL 0x2c30 +#define MGA_TEXCTL2 0x2c3c +# define MGA_DUALTEX (1 << 7) +# define MGA_G400_TC2_MAGIC (1 << 15) +# define MGA_MAP1_ENABLE (1 << 31) +#define MGA_TEXFILTER 0x2c58 +#define MGA_TEXHEIGHT 0x2c2c +#define MGA_TEXORG 0x2c24 +# define MGA_TEXORGMAP_MASK (1 << 0) +# define MGA_TEXORGMAP_FB (0 << 0) +# define MGA_TEXORGMAP_SYSMEM (1 << 0) +# define MGA_TEXORGACC_MASK (1 << 1) +# define MGA_TEXORGACC_PCI (0 << 1) +# define MGA_TEXORGACC_AGP (1 << 1) +#define MGA_TEXORG1 0x2ca4 +#define MGA_TEXORG2 0x2ca8 +#define MGA_TEXORG3 0x2cac +#define MGA_TEXORG4 0x2cb0 +#define MGA_TEXTRANS 0x2c34 +#define MGA_TEXTRANSHIGH 0x2c38 +#define MGA_TEXWIDTH 0x2c28 + +#define MGA_WACCEPTSEQ 0x1dd4 +#define MGA_WCODEADDR 0x1e6c +#define MGA_WFLAG 0x1dc4 +#define MGA_WFLAG1 0x1de0 +#define MGA_WFLAGNB 0x1e64 +#define MGA_WFLAGNB1 0x1e08 +#define MGA_WGETMSB 0x1dc8 +#define MGA_WIADDR 0x1dc0 +#define MGA_WIADDR2 0x1dd8 +# define MGA_WMODE_SUSPEND (0 << 0) +# define MGA_WMODE_RESUME (1 << 0) +# define MGA_WMODE_JUMP (2 << 0) +# define MGA_WMODE_START (3 << 0) +# define MGA_WAGP_ENABLE (1 << 2) +#define MGA_WMISC 0x1e70 +# define MGA_WUCODECACHE_ENABLE (1 << 0) +# define MGA_WMASTER_ENABLE (1 << 1) +# define MGA_WCACHEFLUSH_ENABLE (1 << 3) +#define MGA_WVRTXSZ 0x1dcc + +#define MGA_YBOT 0x1c9c +#define MGA_YDST 0x1c90 +#define MGA_YDSTLEN 0x1c88 +#define MGA_YDSTORG 0x1c94 +#define MGA_YTOP 0x1c98 + +#define MGA_ZORG 0x1c0c + +/* This finishes the current batch of commands + */ +#define MGA_EXEC 0x0100 -#define MGAREG_MGA_EXEC 0x0100 -#define MGAREG_ALPHACTRL 0x2c7c -#define MGAREG_AR0 0x1c60 -#define MGAREG_AR1 0x1c64 -#define MGAREG_AR2 0x1c68 -#define MGAREG_AR3 0x1c6c -#define MGAREG_AR4 0x1c70 -#define MGAREG_AR5 0x1c74 -#define MGAREG_AR6 0x1c78 -#define MGAREG_CXBNDRY 0x1c80 -#define MGAREG_CXLEFT 0x1ca0 -#define MGAREG_CXRIGHT 0x1ca4 -#define MGAREG_DMAPAD 0x1c54 -#define MGAREG_DSTORG 0x2cb8 -#define MGAREG_DWGCTL 0x1c00 -#define MGAREG_DWGSYNC 0x2c4c -#define MGAREG_FCOL 0x1c24 -#define MGAREG_FIFOSTATUS 0x1e10 -#define MGAREG_FOGCOL 0x1cf4 -#define MGAREG_FXBNDRY 0x1c84 -#define MGAREG_FXLEFT 0x1ca8 -#define MGAREG_FXRIGHT 0x1cac -#define MGAREG_ICLEAR 0x1e18 -#define MGAREG_IEN 0x1e1c -#define MGAREG_LEN 0x1c5c -#define MGAREG_MACCESS 0x1c04 -#define MGAREG_PITCH 0x1c8c -#define MGAREG_PLNWT 0x1c1c -#define MGAREG_PRIMADDRESS 0x1e58 -#define MGAREG_PRIMEND 0x1e5c -#define MGAREG_PRIMPTR 0x1e50 -#define MGAREG_SECADDRESS 0x2c40 -#define MGAREG_SECEND 0x2c44 -#define MGAREG_SETUPADDRESS 0x2cd0 -#define MGAREG_SETUPEND 0x2cd4 -#define MGAREG_SOFTRAP 0x2c48 -#define MGAREG_SRCORG 0x2cb4 -#define MGAREG_STATUS 0x1e14 -#define MGAREG_STENCIL 0x2cc8 -#define MGAREG_STENCILCTL 0x2ccc -#define MGAREG_TDUALSTAGE0 0x2cf8 -#define MGAREG_TDUALSTAGE1 0x2cfc -#define MGAREG_TEXBORDERCOL 0x2c5c -#define MGAREG_TEXCTL 0x2c30 -#define MGAREG_TEXCTL2 0x2c3c -#define MGAREG_TEXFILTER 0x2c58 -#define MGAREG_TEXHEIGHT 0x2c2c -#define MGAREG_TEXORG 0x2c24 -#define MGAREG_TEXORG1 0x2ca4 -#define MGAREG_TEXORG2 0x2ca8 -#define MGAREG_TEXORG3 0x2cac -#define MGAREG_TEXORG4 0x2cb0 -#define MGAREG_TEXTRANS 0x2c34 -#define MGAREG_TEXTRANSHIGH 0x2c38 -#define MGAREG_TEXWIDTH 0x2c28 -#define MGAREG_WACCEPTSEQ 0x1dd4 -#define MGAREG_WCODEADDR 0x1e6c -#define MGAREG_WFLAG 0x1dc4 -#define MGAREG_WFLAG1 0x1de0 -#define MGAREG_WFLAGNB 0x1e64 -#define MGAREG_WFLAGNB1 0x1e08 -#define MGAREG_WGETMSB 0x1dc8 -#define MGAREG_WIADDR 0x1dc0 -#define MGAREG_WIADDR2 0x1dd8 -#define MGAREG_WMISC 0x1e70 -#define MGAREG_WVRTXSZ 0x1dcc -#define MGAREG_YBOT 0x1c9c -#define MGAREG_YDST 0x1c90 -#define MGAREG_YDSTLEN 0x1c88 -#define MGAREG_YDSTORG 0x1c94 -#define MGAREG_YTOP 0x1c98 -#define MGAREG_ZORG 0x1c0c - -/* Warp registers */ -#define MGAREG_WR0 0x2d00 -#define MGAREG_WR1 0x2d04 -#define MGAREG_WR2 0x2d08 -#define MGAREG_WR3 0x2d0c -#define MGAREG_WR4 0x2d10 -#define MGAREG_WR5 0x2d14 -#define MGAREG_WR6 0x2d18 -#define MGAREG_WR7 0x2d1c -#define MGAREG_WR8 0x2d20 -#define MGAREG_WR9 0x2d24 -#define MGAREG_WR10 0x2d28 -#define MGAREG_WR11 0x2d2c -#define MGAREG_WR12 0x2d30 -#define MGAREG_WR13 0x2d34 -#define MGAREG_WR14 0x2d38 -#define MGAREG_WR15 0x2d3c -#define MGAREG_WR16 0x2d40 -#define MGAREG_WR17 0x2d44 -#define MGAREG_WR18 0x2d48 -#define MGAREG_WR19 0x2d4c -#define MGAREG_WR20 0x2d50 -#define MGAREG_WR21 0x2d54 -#define MGAREG_WR22 0x2d58 -#define MGAREG_WR23 0x2d5c -#define MGAREG_WR24 0x2d60 -#define MGAREG_WR25 0x2d64 -#define MGAREG_WR26 0x2d68 -#define MGAREG_WR27 0x2d6c -#define MGAREG_WR28 0x2d70 -#define MGAREG_WR29 0x2d74 -#define MGAREG_WR30 0x2d78 -#define MGAREG_WR31 0x2d7c -#define MGAREG_WR32 0x2d80 -#define MGAREG_WR33 0x2d84 -#define MGAREG_WR34 0x2d88 -#define MGAREG_WR35 0x2d8c -#define MGAREG_WR36 0x2d90 -#define MGAREG_WR37 0x2d94 -#define MGAREG_WR38 0x2d98 -#define MGAREG_WR39 0x2d9c -#define MGAREG_WR40 0x2da0 -#define MGAREG_WR41 0x2da4 -#define MGAREG_WR42 0x2da8 -#define MGAREG_WR43 0x2dac -#define MGAREG_WR44 0x2db0 -#define MGAREG_WR45 0x2db4 -#define MGAREG_WR46 0x2db8 -#define MGAREG_WR47 0x2dbc -#define MGAREG_WR48 0x2dc0 -#define MGAREG_WR49 0x2dc4 -#define MGAREG_WR50 0x2dc8 -#define MGAREG_WR51 0x2dcc -#define MGAREG_WR52 0x2dd0 -#define MGAREG_WR53 0x2dd4 -#define MGAREG_WR54 0x2dd8 -#define MGAREG_WR55 0x2ddc -#define MGAREG_WR56 0x2de0 -#define MGAREG_WR57 0x2de4 -#define MGAREG_WR58 0x2de8 -#define MGAREG_WR59 0x2dec -#define MGAREG_WR60 0x2df0 -#define MGAREG_WR61 0x2df4 -#define MGAREG_WR62 0x2df8 -#define MGAREG_WR63 0x2dfc - - -#define PDEA_pagpxfer_enable 0x2 - -#define WIA_wmode_suspend 0x0 -#define WIA_wmode_start 0x3 -#define WIA_wagp_agp 0x4 - -#define DC_opcod_line_open 0x0 -#define DC_opcod_autoline_open 0x1 -#define DC_opcod_line_close 0x2 -#define DC_opcod_autoline_close 0x3 -#define DC_opcod_trap 0x4 -#define DC_opcod_texture_trap 0x6 -#define DC_opcod_bitblt 0x8 -#define DC_opcod_iload 0x9 -#define DC_atype_rpl 0x0 -#define DC_atype_rstr 0x10 -#define DC_atype_zi 0x30 -#define DC_atype_blk 0x40 -#define DC_atype_i 0x70 -#define DC_linear_xy 0x0 -#define DC_linear_linear 0x80 -#define DC_zmode_nozcmp 0x0 -#define DC_zmode_ze 0x200 -#define DC_zmode_zne 0x300 -#define DC_zmode_zlt 0x400 -#define DC_zmode_zlte 0x500 -#define DC_zmode_zgt 0x600 -#define DC_zmode_zgte 0x700 -#define DC_solid_disable 0x0 -#define DC_solid_enable 0x800 -#define DC_arzero_disable 0x0 -#define DC_arzero_enable 0x1000 -#define DC_sgnzero_disable 0x0 -#define DC_sgnzero_enable 0x2000 -#define DC_shftzero_disable 0x0 -#define DC_shftzero_enable 0x4000 -#define DC_bop_SHIFT 16 -#define DC_trans_SHIFT 20 -#define DC_bltmod_bmonolef 0x0 -#define DC_bltmod_bmonowf 0x8000000 -#define DC_bltmod_bplan 0x2000000 -#define DC_bltmod_bfcol 0x4000000 -#define DC_bltmod_bu32bgr 0x6000000 -#define DC_bltmod_bu32rgb 0xe000000 -#define DC_bltmod_bu24bgr 0x16000000 -#define DC_bltmod_bu24rgb 0x1e000000 -#define DC_pattern_disable 0x0 -#define DC_pattern_enable 0x20000000 -#define DC_transc_disable 0x0 -#define DC_transc_enable 0x40000000 -#define DC_clipdis_disable 0x0 -#define DC_clipdis_enable 0x80000000 - -#define SETADD_mode_vertlist 0x0 - - -#define MGA_CLEAR_CMD (DC_opcod_trap | DC_arzero_enable | \ - DC_sgnzero_enable | DC_shftzero_enable | \ - (0xC << DC_bop_SHIFT) | DC_clipdis_enable | \ - DC_solid_enable | DC_transc_enable) - - -#define MGA_COPY_CMD (DC_opcod_bitblt | DC_atype_rpl | DC_linear_xy | \ - DC_solid_disable | DC_arzero_disable | \ - DC_sgnzero_enable | DC_shftzero_enable | \ - (0xC << DC_bop_SHIFT) | DC_bltmod_bfcol | \ - DC_pattern_disable | DC_transc_disable | \ - DC_clipdis_enable) \ - -#define MGA_FLUSH_CMD (DC_opcod_texture_trap | (0xF << DC_trans_SHIFT) |\ - DC_arzero_enable | DC_sgnzero_enable | \ - DC_atype_i) +/* Warp registers + */ +#define MGA_WR0 0x2d00 +#define MGA_WR1 0x2d04 +#define MGA_WR2 0x2d08 +#define MGA_WR3 0x2d0c +#define MGA_WR4 0x2d10 +#define MGA_WR5 0x2d14 +#define MGA_WR6 0x2d18 +#define MGA_WR7 0x2d1c +#define MGA_WR8 0x2d20 +#define MGA_WR9 0x2d24 +#define MGA_WR10 0x2d28 +#define MGA_WR11 0x2d2c +#define MGA_WR12 0x2d30 +#define MGA_WR13 0x2d34 +#define MGA_WR14 0x2d38 +#define MGA_WR15 0x2d3c +#define MGA_WR16 0x2d40 +#define MGA_WR17 0x2d44 +#define MGA_WR18 0x2d48 +#define MGA_WR19 0x2d4c +#define MGA_WR20 0x2d50 +#define MGA_WR21 0x2d54 +#define MGA_WR22 0x2d58 +#define MGA_WR23 0x2d5c +#define MGA_WR24 0x2d60 +#define MGA_WR25 0x2d64 +#define MGA_WR26 0x2d68 +#define MGA_WR27 0x2d6c +#define MGA_WR28 0x2d70 +#define MGA_WR29 0x2d74 +#define MGA_WR30 0x2d78 +#define MGA_WR31 0x2d7c +#define MGA_WR32 0x2d80 +#define MGA_WR33 0x2d84 +#define MGA_WR34 0x2d88 +#define MGA_WR35 0x2d8c +#define MGA_WR36 0x2d90 +#define MGA_WR37 0x2d94 +#define MGA_WR38 0x2d98 +#define MGA_WR39 0x2d9c +#define MGA_WR40 0x2da0 +#define MGA_WR41 0x2da4 +#define MGA_WR42 0x2da8 +#define MGA_WR43 0x2dac +#define MGA_WR44 0x2db0 +#define MGA_WR45 0x2db4 +#define MGA_WR46 0x2db8 +#define MGA_WR47 0x2dbc +#define MGA_WR48 0x2dc0 +#define MGA_WR49 0x2dc4 +#define MGA_WR50 0x2dc8 +#define MGA_WR51 0x2dcc +#define MGA_WR52 0x2dd0 +#define MGA_WR53 0x2dd4 +#define MGA_WR54 0x2dd8 +#define MGA_WR55 0x2ddc +#define MGA_WR56 0x2de0 +#define MGA_WR57 0x2de4 +#define MGA_WR58 0x2de8 +#define MGA_WR59 0x2dec +#define MGA_WR60 0x2df0 +#define MGA_WR61 0x2df4 +#define MGA_WR62 0x2df8 +#define MGA_WR63 0x2dfc +# define MGA_G400_WR_MAGIC (1 << 6) +# define MGA_G400_WR56_MAGIC 0x46480000 /* 12800.0f */ + + +#define MGA_ILOAD_ALIGN 64 +#define MGA_ILOAD_MASK (MGA_ILOAD_ALIGN - 1) + +#define MGA_DWGCTL_FLUSH (MGA_OPCOD_TEXTURE_TRAP | \ + MGA_ATYPE_I | \ + MGA_ZMODE_NOZCMP | \ + MGA_ARZERO | \ + MGA_SGNZERO | \ + MGA_BOP_SRC | \ + (15 << MGA_TRANS_SHIFT)) + +#define MGA_DWGCTL_CLEAR (MGA_OPCOD_TRAP | \ + MGA_ZMODE_NOZCMP | \ + MGA_SOLID | \ + MGA_ARZERO | \ + MGA_SGNZERO | \ + MGA_SHIFTZERO | \ + MGA_BOP_SRC | \ + (0 << MGA_TRANS_SHIFT) | \ + MGA_BLTMOD_BMONOLEF | \ + MGA_TRANSC | \ + MGA_CLIPDIS) + +#define MGA_DWGCTL_COPY (MGA_OPCOD_BITBLT | \ + MGA_ATYPE_RPL | \ + MGA_SGNZERO | \ + MGA_SHIFTZERO | \ + MGA_BOP_SRC | \ + (0 << MGA_TRANS_SHIFT) | \ + MGA_BLTMOD_BFCOL | \ + MGA_CLIPDIS) + +/* Simple idle test. + */ +static __inline__ int mga_is_idle( drm_mga_private_t *dev_priv ) +{ + u32 status = MGA_READ( MGA_STATUS ) & MGA_ENGINE_IDLE_MASK; + return ( status == MGA_ENDPRDMASTS ); +} #endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_state.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_state.c index fb3656310..320e2b3e9 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_state.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga/mga_state.c @@ -1,4 +1,4 @@ -/* mga_state.c -- State support for mga g200/g400 +/* mga_state.c -- State support for MGA G200/G400 -*- linux-c -*- * Created: Thu Jan 27 02:53:43 2000 by jhartmann@precisioninsight.com * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. @@ -11,431 +11,408 @@ * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * VA LINUX SYSTEMS AND/OR ITS 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. + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. * - * Authors: Jeff Hartmann <jhartmann@precisioninsight.com> - * Keith Whitwell <keithw@precisioninsight.com> + * Authors: + * Jeff Hartmann <jhartmann@valinux.com> + * Keith Whitwell <keithw@valinux.com> * + * Rewritten by: + * Gareth Hughes <gareth@valinux.com> */ #define __NO_VERSION__ +#include "mga.h" #include "drmP.h" #include "mga_drv.h" #include "drm.h" -typedef u_int16_t u16; -typedef u_int32_t u32; - -#define MGAEMITCLIP_SIZE 10 -#define MGAEMITCTX_SIZE 20 -#define MGAG200EMITTEX_SIZE 20 -#define MGAG400EMITTEX0_SIZE 30 -#define MGAG400EMITTEX1_SIZE 25 -#define MGAG400EMITPIPE_SIZE 50 -#define MGAG200EMITPIPE_SIZE 15 - -#define MAX_STATE_SIZE ((MGAEMITCLIP_SIZE * MGA_NR_SAREA_CLIPRECTS) + \ - MGAEMITCTX_SIZE + MGAG400EMITTEX0_SIZE + \ - MGAG400EMITTEX1_SIZE + MGAG400EMITPIPE_SIZE) - +/* ================================================================ + * DMA hardware state programming functions + */ -static void mgaEmitClipRect(drm_mga_private_t * dev_priv, - drm_clip_rect_t * box) +static void mga_emit_clip_rect( drm_mga_private_t *dev_priv, + drm_clip_rect_t *box ) { drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int *regs = sarea_priv->ContextState; - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); + drm_mga_context_regs_t *ctx = &sarea_priv->context_state; + unsigned int pitch = dev_priv->front_pitch; + DMA_LOCALS; - /* This takes 10 dwords */ - PRIMGETPTR(dev_priv); + BEGIN_DMA( 2 ); - /* Force reset of dwgctl (eliminates clip disable) */ - if (dev_priv->chipset == MGA_CARD_TYPE_G400) { -#if 0 - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DWGSYNC, 0); - PRIMOUTREG(MGAREG_DWGSYNC, 0); - PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]); -#else - PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]); - PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0x80000000); - PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]); - PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0x80000000); -#endif + /* Force reset of DWGCTL on G400 (eliminates clip disable bit). + */ + if ( dev_priv->chipset == MGA_CARD_TYPE_G400 ) { + DMA_BLOCK( MGA_DWGCTL, ctx->dwgctl, + MGA_LEN + MGA_EXEC, 0x80000000, + MGA_DWGCTL, ctx->dwgctl, + MGA_LEN + MGA_EXEC, 0x80000000 ); } - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_CXBNDRY, ((box->x2) << 16) | (box->x1)); - PRIMOUTREG(MGAREG_YTOP, box->y1 * dev_priv->stride / dev_priv->cpp); - PRIMOUTREG(MGAREG_YBOT, box->y2 * dev_priv->stride / dev_priv->cpp); + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_CXBNDRY, (box->x2 << 16) | box->x1, + MGA_YTOP, box->y1 * pitch, + MGA_YBOT, box->y2 * pitch ); - PRIMADVANCE(dev_priv); + ADVANCE_DMA(); } -static void mgaEmitContext(drm_mga_private_t * dev_priv) +static __inline__ void mga_g200_emit_context( drm_mga_private_t *dev_priv ) { drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int *regs = sarea_priv->ContextState; - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); - - /* This takes a max of 20 dwords */ - PRIMGETPTR(dev_priv); - - PRIMOUTREG(MGAREG_DSTORG, regs[MGA_CTXREG_DSTORG]); - PRIMOUTREG(MGAREG_MACCESS, regs[MGA_CTXREG_MACCESS]); - PRIMOUTREG(MGAREG_PLNWT, regs[MGA_CTXREG_PLNWT]); - PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]); - - PRIMOUTREG(MGAREG_ALPHACTRL, regs[MGA_CTXREG_ALPHACTRL]); - PRIMOUTREG(MGAREG_FOGCOL, regs[MGA_CTXREG_FOGCOLOR]); - PRIMOUTREG(MGAREG_WFLAG, regs[MGA_CTXREG_WFLAG]); - PRIMOUTREG(MGAREG_ZORG, dev_priv->depthOffset); /* invarient */ - - if (dev_priv->chipset == MGA_CARD_TYPE_G400) { - PRIMOUTREG(MGAREG_WFLAG1, regs[MGA_CTXREG_WFLAG]); - PRIMOUTREG(MGAREG_TDUALSTAGE0, regs[MGA_CTXREG_TDUAL0]); - PRIMOUTREG(MGAREG_TDUALSTAGE1, regs[MGA_CTXREG_TDUAL1]); - PRIMOUTREG(MGAREG_FCOL, regs[MGA_CTXREG_FCOL]); - - PRIMOUTREG(MGAREG_STENCIL, regs[MGA_CTXREG_STENCIL]); - PRIMOUTREG(MGAREG_STENCILCTL, regs[MGA_CTXREG_STENCILCTL]); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); + drm_mga_context_regs_t *ctx = &sarea_priv->context_state; + DMA_LOCALS; - } else { - PRIMOUTREG(MGAREG_FCOL, regs[MGA_CTXREG_FCOL]); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - } + BEGIN_DMA( 3 ); + + DMA_BLOCK( MGA_DSTORG, ctx->dstorg, + MGA_MACCESS, ctx->maccess, + MGA_PLNWT, ctx->plnwt, + MGA_DWGCTL, ctx->dwgctl ); - PRIMADVANCE(dev_priv); + DMA_BLOCK( MGA_ALPHACTRL, ctx->alphactrl, + MGA_FOGCOL, ctx->fogcolor, + MGA_WFLAG, ctx->wflag, + MGA_ZORG, dev_priv->depth_offset ); + + DMA_BLOCK( MGA_FCOL, ctx->fcol, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000 ); + + ADVANCE_DMA(); } -static void mgaG200EmitTex(drm_mga_private_t * dev_priv) +static __inline__ void mga_g400_emit_context( drm_mga_private_t *dev_priv ) { drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int *regs = sarea_priv->TexState[0]; - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); - - PRIMGETPTR(dev_priv); + drm_mga_context_regs_t *ctx = &sarea_priv->context_state; + DMA_LOCALS; - /* This takes 20 dwords */ + BEGIN_DMA( 4 ); - PRIMOUTREG(MGAREG_TEXCTL2, regs[MGA_TEXREG_CTL2]); - PRIMOUTREG(MGAREG_TEXCTL, regs[MGA_TEXREG_CTL]); - PRIMOUTREG(MGAREG_TEXFILTER, regs[MGA_TEXREG_FILTER]); - PRIMOUTREG(MGAREG_TEXBORDERCOL, regs[MGA_TEXREG_BORDERCOL]); + DMA_BLOCK( MGA_DSTORG, ctx->dstorg, + MGA_MACCESS, ctx->maccess, + MGA_PLNWT, ctx->plnwt, + MGA_DWGCTL, ctx->dwgctl ); - PRIMOUTREG(MGAREG_TEXORG, regs[MGA_TEXREG_ORG]); - PRIMOUTREG(MGAREG_TEXORG1, regs[MGA_TEXREG_ORG1]); - PRIMOUTREG(MGAREG_TEXORG2, regs[MGA_TEXREG_ORG2]); - PRIMOUTREG(MGAREG_TEXORG3, regs[MGA_TEXREG_ORG3]); + DMA_BLOCK( MGA_ALPHACTRL, ctx->alphactrl, + MGA_FOGCOL, ctx->fogcolor, + MGA_WFLAG, ctx->wflag, + MGA_ZORG, dev_priv->depth_offset ); - PRIMOUTREG(MGAREG_TEXORG4, regs[MGA_TEXREG_ORG4]); - PRIMOUTREG(MGAREG_TEXWIDTH, regs[MGA_TEXREG_WIDTH]); - PRIMOUTREG(MGAREG_TEXHEIGHT, regs[MGA_TEXREG_HEIGHT]); - PRIMOUTREG(MGAREG_WR24, regs[MGA_TEXREG_WIDTH]); + DMA_BLOCK( MGA_WFLAG1, ctx->wflag, + MGA_TDUALSTAGE0, ctx->tdualstage0, + MGA_TDUALSTAGE1, ctx->tdualstage1, + MGA_FCOL, ctx->fcol ); - PRIMOUTREG(MGAREG_WR34, regs[MGA_TEXREG_HEIGHT]); - PRIMOUTREG(MGAREG_TEXTRANS, 0xffff); - PRIMOUTREG(MGAREG_TEXTRANSHIGH, 0xffff); - PRIMOUTREG(MGAREG_DMAPAD, 0); + DMA_BLOCK( MGA_STENCIL, ctx->stencil, + MGA_STENCILCTL, ctx->stencilctl, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000 ); - PRIMADVANCE(dev_priv); + ADVANCE_DMA(); } -#define TMC_dualtex_enable 0x80 - -static void mgaG400EmitTex0(drm_mga_private_t * dev_priv) +static __inline__ void mga_g200_emit_tex0( drm_mga_private_t *dev_priv ) { drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int *regs = sarea_priv->TexState[0]; - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); - - PRIMGETPTR(dev_priv); - - /* This takes a max of 30 dwords */ - - PRIMOUTREG(MGAREG_TEXCTL2, regs[MGA_TEXREG_CTL2] | 0x00008000); - PRIMOUTREG(MGAREG_TEXCTL, regs[MGA_TEXREG_CTL]); - PRIMOUTREG(MGAREG_TEXFILTER, regs[MGA_TEXREG_FILTER]); - PRIMOUTREG(MGAREG_TEXBORDERCOL, regs[MGA_TEXREG_BORDERCOL]); + drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[0]; + DMA_LOCALS; - PRIMOUTREG(MGAREG_TEXORG, regs[MGA_TEXREG_ORG]); - PRIMOUTREG(MGAREG_TEXORG1, regs[MGA_TEXREG_ORG1]); - PRIMOUTREG(MGAREG_TEXORG2, regs[MGA_TEXREG_ORG2]); - PRIMOUTREG(MGAREG_TEXORG3, regs[MGA_TEXREG_ORG3]); + BEGIN_DMA( 4 ); - PRIMOUTREG(MGAREG_TEXORG4, regs[MGA_TEXREG_ORG4]); - PRIMOUTREG(MGAREG_TEXWIDTH, regs[MGA_TEXREG_WIDTH]); - PRIMOUTREG(MGAREG_TEXHEIGHT, regs[MGA_TEXREG_HEIGHT]); - PRIMOUTREG(MGAREG_WR49, 0); + DMA_BLOCK( MGA_TEXCTL2, tex->texctl2, + MGA_TEXCTL, tex->texctl, + MGA_TEXFILTER, tex->texfilter, + MGA_TEXBORDERCOL, tex->texbordercol ); - PRIMOUTREG(MGAREG_WR57, 0); - PRIMOUTREG(MGAREG_WR53, 0); - PRIMOUTREG(MGAREG_WR61, 0); - PRIMOUTREG(MGAREG_WR52, 0x40); + DMA_BLOCK( MGA_TEXORG, tex->texorg, + MGA_TEXORG1, tex->texorg1, + MGA_TEXORG2, tex->texorg2, + MGA_TEXORG3, tex->texorg3 ); - PRIMOUTREG(MGAREG_WR60, 0x40); - PRIMOUTREG(MGAREG_WR54, regs[MGA_TEXREG_WIDTH] | 0x40); - PRIMOUTREG(MGAREG_WR62, regs[MGA_TEXREG_HEIGHT] | 0x40); - PRIMOUTREG(MGAREG_DMAPAD, 0); + DMA_BLOCK( MGA_TEXORG4, tex->texorg4, + MGA_TEXWIDTH, tex->texwidth, + MGA_TEXHEIGHT, tex->texheight, + MGA_WR24, tex->texwidth ); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); + DMA_BLOCK( MGA_WR34, tex->texheight, + MGA_TEXTRANS, 0x0000ffff, + MGA_TEXTRANSHIGH, 0x0000ffff, + MGA_DMAPAD, 0x00000000 ); - PRIMOUTREG(MGAREG_TEXTRANS, 0xffff); - PRIMOUTREG(MGAREG_TEXTRANSHIGH, 0xffff); - - PRIMADVANCE(dev_priv); + ADVANCE_DMA(); } -#define TMC_map1_enable 0x80000000 - -static void mgaG400EmitTex1(drm_mga_private_t * dev_priv) +static __inline__ void mga_g400_emit_tex0( drm_mga_private_t *dev_priv ) { drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int *regs = sarea_priv->TexState[1]; - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); - - PRIMGETPTR(dev_priv); - - /* This takes 25 dwords */ - - PRIMOUTREG(MGAREG_TEXCTL2, - regs[MGA_TEXREG_CTL2] | TMC_map1_enable | 0x00008000); - PRIMOUTREG(MGAREG_TEXCTL, regs[MGA_TEXREG_CTL]); - PRIMOUTREG(MGAREG_TEXFILTER, regs[MGA_TEXREG_FILTER]); - PRIMOUTREG(MGAREG_TEXBORDERCOL, regs[MGA_TEXREG_BORDERCOL]); + drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[0]; + DMA_LOCALS; + + BEGIN_DMA( 6 ); + + DMA_BLOCK( MGA_TEXCTL2, tex->texctl2 | MGA_G400_TC2_MAGIC, + MGA_TEXCTL, tex->texctl, + MGA_TEXFILTER, tex->texfilter, + MGA_TEXBORDERCOL, tex->texbordercol ); + + DMA_BLOCK( MGA_TEXORG, tex->texorg, + MGA_TEXORG1, tex->texorg1, + MGA_TEXORG2, tex->texorg2, + MGA_TEXORG3, tex->texorg3 ); + + DMA_BLOCK( MGA_TEXORG4, tex->texorg4, + MGA_TEXWIDTH, tex->texwidth, + MGA_TEXHEIGHT, tex->texheight, + MGA_WR49, 0x00000000 ); + + DMA_BLOCK( MGA_WR57, 0x00000000, + MGA_WR53, 0x00000000, + MGA_WR61, 0x00000000, + MGA_WR52, MGA_G400_WR_MAGIC ); + + DMA_BLOCK( MGA_WR60, MGA_G400_WR_MAGIC, + MGA_WR54, tex->texwidth | MGA_G400_WR_MAGIC, + MGA_WR62, tex->texheight | MGA_G400_WR_MAGIC, + MGA_DMAPAD, 0x00000000 ); + + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_TEXTRANS, 0x0000ffff, + MGA_TEXTRANSHIGH, 0x0000ffff ); + + ADVANCE_DMA(); +} - PRIMOUTREG(MGAREG_TEXORG, regs[MGA_TEXREG_ORG]); - PRIMOUTREG(MGAREG_TEXORG1, regs[MGA_TEXREG_ORG1]); - PRIMOUTREG(MGAREG_TEXORG2, regs[MGA_TEXREG_ORG2]); - PRIMOUTREG(MGAREG_TEXORG3, regs[MGA_TEXREG_ORG3]); +static __inline__ void mga_g400_emit_tex1( drm_mga_private_t *dev_priv ) +{ + drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; + drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[1]; + DMA_LOCALS; + + BEGIN_DMA( 5 ); + + DMA_BLOCK( MGA_TEXCTL2, (tex->texctl2 | + MGA_MAP1_ENABLE | + MGA_G400_TC2_MAGIC), + MGA_TEXCTL, tex->texctl, + MGA_TEXFILTER, tex->texfilter, + MGA_TEXBORDERCOL, tex->texbordercol ); + + DMA_BLOCK( MGA_TEXORG, tex->texorg, + MGA_TEXORG1, tex->texorg1, + MGA_TEXORG2, tex->texorg2, + MGA_TEXORG3, tex->texorg3 ); + + DMA_BLOCK( MGA_TEXORG4, tex->texorg4, + MGA_TEXWIDTH, tex->texwidth, + MGA_TEXHEIGHT, tex->texheight, + MGA_WR49, 0x00000000 ); + + DMA_BLOCK( MGA_WR57, 0x00000000, + MGA_WR53, 0x00000000, + MGA_WR61, 0x00000000, + MGA_WR52, tex->texwidth | MGA_G400_WR_MAGIC ); + + DMA_BLOCK( MGA_WR60, tex->texheight | MGA_G400_WR_MAGIC, + MGA_TEXTRANS, 0x0000ffff, + MGA_TEXTRANSHIGH, 0x0000ffff, + MGA_TEXCTL2, tex->texctl2 | MGA_G400_TC2_MAGIC ); + + ADVANCE_DMA(); +} - PRIMOUTREG(MGAREG_TEXORG4, regs[MGA_TEXREG_ORG4]); - PRIMOUTREG(MGAREG_TEXWIDTH, regs[MGA_TEXREG_WIDTH]); - PRIMOUTREG(MGAREG_TEXHEIGHT, regs[MGA_TEXREG_HEIGHT]); - PRIMOUTREG(MGAREG_WR49, 0); +static __inline__ void mga_g200_emit_pipe( drm_mga_private_t *dev_priv ) +{ + drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; + unsigned int pipe = sarea_priv->warp_pipe; + DMA_LOCALS; - PRIMOUTREG(MGAREG_WR57, 0); - PRIMOUTREG(MGAREG_WR53, 0); - PRIMOUTREG(MGAREG_WR61, 0); - PRIMOUTREG(MGAREG_WR52, regs[MGA_TEXREG_WIDTH] | 0x40); + BEGIN_DMA( 3 ); - PRIMOUTREG(MGAREG_WR60, regs[MGA_TEXREG_HEIGHT] | 0x40); + DMA_BLOCK( MGA_WIADDR, MGA_WMODE_SUSPEND, + MGA_WVRTXSZ, 0x00000007, + MGA_WFLAG, 0x00000000, + MGA_WR24, 0x00000000 ); - PRIMOUTREG(MGAREG_TEXTRANS, 0xffff); - PRIMOUTREG(MGAREG_TEXTRANSHIGH, 0xffff); - PRIMOUTREG(MGAREG_TEXCTL2, regs[MGA_TEXREG_CTL2] | 0x00008000); + DMA_BLOCK( MGA_WR25, 0x00000100, + MGA_WR34, 0x00000000, + MGA_WR42, 0x0000ffff, + MGA_WR60, 0x0000ffff ); - PRIMADVANCE(dev_priv); + /* Padding required to to hardware bug. + */ + DMA_BLOCK( MGA_DMAPAD, 0xffffffff, + MGA_DMAPAD, 0xffffffff, + MGA_DMAPAD, 0xffffffff, + MGA_WIADDR, (dev_priv->warp_pipe_phys[pipe] | + MGA_WMODE_START | + MGA_WAGP_ENABLE) ); + + ADVANCE_DMA(); } -#define MAGIC_FPARAM_HEX_VALUE 0x46480000 -/* This is the hex value of 12800.0f which is a magic value we must - * set in wr56. - */ - - -#define EMIT_PIPE 50 -static void mgaG400EmitPipe(drm_mga_private_t * dev_priv) +static __inline__ void mga_g400_emit_pipe( drm_mga_private_t *dev_priv ) { drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int pipe = sarea_priv->WarpPipe; - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); - - PRIMGETPTR(dev_priv); - - /* This takes 50 dwords */ - - /* Establish vertex size. - */ - PRIMOUTREG(MGAREG_WIADDR2, WIA_wmode_suspend); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - - if (pipe & MGA_T2) { - PRIMOUTREG(MGAREG_WVRTXSZ, 0x00001e09); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - - PRIMOUTREG(MGAREG_WACCEPTSEQ, 0); - PRIMOUTREG(MGAREG_WACCEPTSEQ, 0); - PRIMOUTREG(MGAREG_WACCEPTSEQ, 0); - PRIMOUTREG(MGAREG_WACCEPTSEQ, 0x1e000000); + unsigned int pipe = sarea_priv->warp_pipe; + DMA_LOCALS; + + BEGIN_DMA( 10 ); + + DMA_BLOCK( MGA_WIADDR2, MGA_WMODE_SUSPEND, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000 ); + + if ( pipe & MGA_T2 ) { + DMA_BLOCK( MGA_WVRTXSZ, 0x00001e09, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000 ); + + DMA_BLOCK( MGA_WACCEPTSEQ, 0x00000000, + MGA_WACCEPTSEQ, 0x00000000, + MGA_WACCEPTSEQ, 0x00000000, + MGA_WACCEPTSEQ, 0x1e000000 ); } else { - if (dev_priv->WarpPipe & MGA_T2) { + if ( dev_priv->warp_pipe & MGA_T2 ) { /* Flush the WARP pipe */ - PRIMOUTREG(MGAREG_YDST, 0); - PRIMOUTREG(MGAREG_FXLEFT, 0); - PRIMOUTREG(MGAREG_FXRIGHT, 1); - PRIMOUTREG(MGAREG_DWGCTL, MGA_FLUSH_CMD); - - PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 1); - PRIMOUTREG(MGAREG_DWGSYNC, 0x7000); - PRIMOUTREG(MGAREG_TEXCTL2, 0x00008000); - PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0); - - PRIMOUTREG(MGAREG_TEXCTL2, 0x80 | 0x00008000); - PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0); - PRIMOUTREG(MGAREG_TEXCTL2, 0x00008000); - PRIMOUTREG(MGAREG_DMAPAD, 0); + DMA_BLOCK( MGA_YDST, 0x00000000, + MGA_FXLEFT, 0x00000000, + MGA_FXRIGHT, 0x00000001, + MGA_DWGCTL, MGA_DWGCTL_FLUSH ); + + DMA_BLOCK( MGA_LEN + MGA_EXEC, 0x00000001, + MGA_DWGSYNC, 0x00007000, + MGA_TEXCTL2, MGA_G400_TC2_MAGIC, + MGA_LEN + MGA_EXEC, 0x00000000 ); + + DMA_BLOCK( MGA_TEXCTL2, (MGA_DUALTEX | + MGA_G400_TC2_MAGIC), + MGA_LEN + MGA_EXEC, 0x00000000, + MGA_TEXCTL2, MGA_G400_TC2_MAGIC, + MGA_DMAPAD, 0x00000000 ); } - PRIMOUTREG(MGAREG_WVRTXSZ, 0x00001807); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); + DMA_BLOCK( MGA_WVRTXSZ, 0x00001807, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000 ); - PRIMOUTREG(MGAREG_WACCEPTSEQ, 0); - PRIMOUTREG(MGAREG_WACCEPTSEQ, 0); - PRIMOUTREG(MGAREG_WACCEPTSEQ, 0); - PRIMOUTREG(MGAREG_WACCEPTSEQ, 0x18000000); + DMA_BLOCK( MGA_WACCEPTSEQ, 0x00000000, + MGA_WACCEPTSEQ, 0x00000000, + MGA_WACCEPTSEQ, 0x00000000, + MGA_WACCEPTSEQ, 0x18000000 ); } - PRIMOUTREG(MGAREG_WFLAG, 0); - PRIMOUTREG(MGAREG_WFLAG1, 0); - PRIMOUTREG(MGAREG_WR56, MAGIC_FPARAM_HEX_VALUE); - PRIMOUTREG(MGAREG_DMAPAD, 0); - - PRIMOUTREG(MGAREG_WR49, 0); /* Tex stage 0 */ - PRIMOUTREG(MGAREG_WR57, 0); /* Tex stage 0 */ - PRIMOUTREG(MGAREG_WR53, 0); /* Tex stage 1 */ - PRIMOUTREG(MGAREG_WR61, 0); /* Tex stage 1 */ - - - PRIMOUTREG(MGAREG_WR54, 0x40); /* Tex stage 0 : w */ - PRIMOUTREG(MGAREG_WR62, 0x40); /* Tex stage 0 : h */ - PRIMOUTREG(MGAREG_WR52, 0x40); /* Tex stage 1 : w */ - PRIMOUTREG(MGAREG_WR60, 0x40); /* Tex stage 1 : h */ - - - /* Dma pading required due to hw bug */ - PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff); - PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff); - PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff); - PRIMOUTREG(MGAREG_WIADDR2, - (u32) (dev_priv->WarpIndex[pipe]. - phys_addr | WIA_wmode_start | WIA_wagp_agp)); - PRIMADVANCE(dev_priv); + DMA_BLOCK( MGA_WFLAG, 0x00000000, + MGA_WFLAG1, 0x00000000, + MGA_WR56, MGA_G400_WR56_MAGIC, + MGA_DMAPAD, 0x00000000 ); + + DMA_BLOCK( MGA_WR49, 0x00000000, /* tex0 */ + MGA_WR57, 0x00000000, /* tex0 */ + MGA_WR53, 0x00000000, /* tex1 */ + MGA_WR61, 0x00000000 ); /* tex1 */ + + DMA_BLOCK( MGA_WR54, MGA_G400_WR_MAGIC, /* tex0 width */ + MGA_WR62, MGA_G400_WR_MAGIC, /* tex0 height */ + MGA_WR52, MGA_G400_WR_MAGIC, /* tex1 width */ + MGA_WR60, MGA_G400_WR_MAGIC ); /* tex1 height */ + + /* Padding required to to hardware bug */ + DMA_BLOCK( MGA_DMAPAD, 0xffffffff, + MGA_DMAPAD, 0xffffffff, + MGA_DMAPAD, 0xffffffff, + MGA_WIADDR2, (dev_priv->warp_pipe_phys[pipe] | + MGA_WMODE_START | + MGA_WAGP_ENABLE) ); + + ADVANCE_DMA(); } -static void mgaG200EmitPipe(drm_mga_private_t * dev_priv) +static void mga_g200_emit_state( drm_mga_private_t *dev_priv ) { drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int pipe = sarea_priv->WarpPipe; - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); - - PRIMGETPTR(dev_priv); - - /* This takes 15 dwords */ - - PRIMOUTREG(MGAREG_WIADDR, WIA_wmode_suspend); - PRIMOUTREG(MGAREG_WVRTXSZ, 7); - PRIMOUTREG(MGAREG_WFLAG, 0); - PRIMOUTREG(MGAREG_WR24, 0); /* tex w/h */ + unsigned int dirty = sarea_priv->dirty; - PRIMOUTREG(MGAREG_WR25, 0x100); - PRIMOUTREG(MGAREG_WR34, 0); /* tex w/h */ - PRIMOUTREG(MGAREG_WR42, 0xFFFF); - PRIMOUTREG(MGAREG_WR60, 0xFFFF); + if ( sarea_priv->warp_pipe != dev_priv->warp_pipe ) { + mga_g200_emit_pipe( dev_priv ); + dev_priv->warp_pipe = sarea_priv->warp_pipe; + } - /* Dma pading required due to hw bug */ - PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff); - PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff); - PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff); - PRIMOUTREG(MGAREG_WIADDR, - (u32) (dev_priv->WarpIndex[pipe]. - phys_addr | WIA_wmode_start | WIA_wagp_agp)); + if ( dirty & MGA_UPLOAD_CONTEXT ) { + mga_g200_emit_context( dev_priv ); + sarea_priv->dirty &= ~MGA_UPLOAD_CONTEXT; + } - PRIMADVANCE(dev_priv); + if ( dirty & MGA_UPLOAD_TEX0 ) { + mga_g200_emit_tex0( dev_priv ); + sarea_priv->dirty &= ~MGA_UPLOAD_TEX0; + } } -static void mgaEmitState(drm_mga_private_t * dev_priv) +static void mga_g400_emit_state( drm_mga_private_t *dev_priv ) { drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; unsigned int dirty = sarea_priv->dirty; - DRM_DEBUG("%s\n", __FUNCTION__); - - if (dev_priv->chipset == MGA_CARD_TYPE_G400) { - int multitex = sarea_priv->WarpPipe & MGA_T2; - - if (sarea_priv->WarpPipe != dev_priv->WarpPipe) { - mgaG400EmitPipe(dev_priv); - dev_priv->WarpPipe = sarea_priv->WarpPipe; - } - - if (dirty & MGA_UPLOAD_CTX) { - mgaEmitContext(dev_priv); - sarea_priv->dirty &= ~MGA_UPLOAD_CTX; - } + int multitex = sarea_priv->warp_pipe & MGA_T2; - if (dirty & MGA_UPLOAD_TEX0) { - mgaG400EmitTex0(dev_priv); - sarea_priv->dirty &= ~MGA_UPLOAD_TEX0; - } + if ( sarea_priv->warp_pipe != dev_priv->warp_pipe ) { + mga_g400_emit_pipe( dev_priv ); + dev_priv->warp_pipe = sarea_priv->warp_pipe; + } - if ((dirty & MGA_UPLOAD_TEX1) && multitex) { - mgaG400EmitTex1(dev_priv); - sarea_priv->dirty &= ~MGA_UPLOAD_TEX1; - } - } else { - if (sarea_priv->WarpPipe != dev_priv->WarpPipe) { - mgaG200EmitPipe(dev_priv); - dev_priv->WarpPipe = sarea_priv->WarpPipe; - } + if ( dirty & MGA_UPLOAD_CONTEXT ) { + mga_g400_emit_context( dev_priv ); + sarea_priv->dirty &= ~MGA_UPLOAD_CONTEXT; + } - if (dirty & MGA_UPLOAD_CTX) { - mgaEmitContext(dev_priv); - sarea_priv->dirty &= ~MGA_UPLOAD_CTX; - } + if ( dirty & MGA_UPLOAD_TEX0 ) { + mga_g400_emit_tex0( dev_priv ); + sarea_priv->dirty &= ~MGA_UPLOAD_TEX0; + } - if (dirty & MGA_UPLOAD_TEX0) { - mgaG200EmitTex(dev_priv); - sarea_priv->dirty &= ~MGA_UPLOAD_TEX0; - } + if ( (dirty & MGA_UPLOAD_TEX1) && multitex ) { + mga_g400_emit_tex1( dev_priv ); + sarea_priv->dirty &= ~MGA_UPLOAD_TEX1; } } +/* ================================================================ + * SAREA state verification + */ + /* Disallow all write destinations except the front and backbuffer. */ -static int mgaVerifyContext(drm_mga_private_t * dev_priv) +static int mga_verify_context( drm_mga_private_t *dev_priv ) { drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int *regs = sarea_priv->ContextState; - - DRM_DEBUG("%s\n", __FUNCTION__); - - if (regs[MGA_CTXREG_DSTORG] != dev_priv->frontOffset && - regs[MGA_CTXREG_DSTORG] != dev_priv->backOffset) { - DRM_DEBUG("BAD DSTORG: %x (front %x, back %x)\n\n", - regs[MGA_CTXREG_DSTORG], dev_priv->frontOffset, - dev_priv->backOffset); - regs[MGA_CTXREG_DSTORG] = 0; - return -1; + drm_mga_context_regs_t *ctx = &sarea_priv->context_state; + + if ( ctx->dstorg != dev_priv->front_offset && + ctx->dstorg != dev_priv->back_offset ) { + DRM_ERROR( "*** bad DSTORG: %x (front %x, back %x)\n\n", + ctx->dstorg, dev_priv->front_offset, + dev_priv->back_offset ); + ctx->dstorg = 0; + DRM_OS_RETURN( EINVAL ); } return 0; @@ -443,667 +420,647 @@ static int mgaVerifyContext(drm_mga_private_t * dev_priv) /* Disallow texture reads from PCI space. */ -static int mgaVerifyTex(drm_mga_private_t * dev_priv, int unit) +static int mga_verify_tex( drm_mga_private_t *dev_priv, int unit ) { drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; + drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[unit]; + unsigned int org; - DRM_DEBUG("%s\n", __FUNCTION__); + org = tex->texorg & (MGA_TEXORGMAP_MASK | MGA_TEXORGACC_MASK); - if ((sarea_priv->TexState[unit][MGA_TEXREG_ORG] & 0x3) == 0x1) { - DRM_DEBUG("BAD TEXREG_ORG: %x, unit %d\n", - sarea_priv->TexState[unit][MGA_TEXREG_ORG], - unit); - sarea_priv->TexState[unit][MGA_TEXREG_ORG] = 0; - return -1; + if ( org == (MGA_TEXORGMAP_SYSMEM | MGA_TEXORGACC_PCI) ) { + DRM_ERROR( "*** bad TEXORG: 0x%x, unit %d\n", + tex->texorg, unit ); + tex->texorg = 0; + DRM_OS_RETURN( EINVAL ); } return 0; } -static int mgaVerifyState(drm_mga_private_t * dev_priv) +static int mga_verify_state( drm_mga_private_t *dev_priv ) { drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; unsigned int dirty = sarea_priv->dirty; - int rv = 0; - - DRM_DEBUG("%s\n", __FUNCTION__); + int ret = 0; - if (sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS) + if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS ) sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS; - if (dirty & MGA_UPLOAD_CTX) - rv |= mgaVerifyContext(dev_priv); + if ( dirty & MGA_UPLOAD_CONTEXT ) + ret |= mga_verify_context( dev_priv ); - if (dirty & MGA_UPLOAD_TEX0) - rv |= mgaVerifyTex(dev_priv, 0); + if ( dirty & MGA_UPLOAD_TEX0 ) + ret |= mga_verify_tex( dev_priv, 0 ); - if (dev_priv->chipset == MGA_CARD_TYPE_G400) { - if (dirty & MGA_UPLOAD_TEX1) - rv |= mgaVerifyTex(dev_priv, 1); + if ( dev_priv->chipset == MGA_CARD_TYPE_G400 ) { + if ( dirty & MGA_UPLOAD_TEX1 ) + ret |= mga_verify_tex( dev_priv, 1 ); - if (dirty & MGA_UPLOAD_PIPE) - rv |= (sarea_priv->WarpPipe > MGA_MAX_G400_PIPES); + if ( dirty & MGA_UPLOAD_PIPE ) + ret |= ( sarea_priv->warp_pipe > MGA_MAX_G400_PIPES ); } else { - if (dirty & MGA_UPLOAD_PIPE) - rv |= (sarea_priv->WarpPipe > MGA_MAX_G200_PIPES); + if ( dirty & MGA_UPLOAD_PIPE ) + ret |= ( sarea_priv->warp_pipe > MGA_MAX_G200_PIPES ); } - return rv == 0; + return ( ret == 0 ); } -static int mgaVerifyIload(drm_mga_private_t * dev_priv, - unsigned long bus_address, - unsigned int dstOrg, int length) +static int mga_verify_iload( drm_mga_private_t *dev_priv, + unsigned int dstorg, unsigned int length ) { - DRM_DEBUG("%s\n", __FUNCTION__); + if ( dstorg < dev_priv->texture_offset || + dstorg + length > (dev_priv->texture_offset + + dev_priv->texture_size) ) { + DRM_ERROR( "*** bad iload DSTORG: 0x%x\n", dstorg ); + DRM_OS_RETURN( EINVAL ); + } - if (dstOrg < dev_priv->textureOffset || - dstOrg + length > - (dev_priv->textureOffset + dev_priv->textureSize)) { - return EINVAL; + if ( length & MGA_ILOAD_MASK ) { + DRM_ERROR( "*** bad iload length: 0x%x\n", + length & MGA_ILOAD_MASK ); + DRM_OS_RETURN( EINVAL ); } - if (length % 64) { - return EINVAL; + + return 0; +} + +static int mga_verify_blit( drm_mga_private_t *dev_priv, + unsigned int srcorg, unsigned int dstorg ) +{ + if ( (srcorg & 0x3) == (MGA_SRCACC_PCI | MGA_SRCMAP_SYSMEM) || + (dstorg & 0x3) == (MGA_SRCACC_PCI | MGA_SRCMAP_SYSMEM) ) { + DRM_ERROR( "*** bad blit: src=0x%x dst=0x%x\n", + srcorg, dstorg ); + DRM_OS_RETURN( EINVAL ); } return 0; } -/* This copies a 64 byte aligned agp region to the frambuffer - * with a standard blit, the ioctl needs to do checking */ -static void mga_dma_dispatch_tex_blit(drm_device_t * dev, - unsigned long bus_address, - int length, unsigned int destOrg) +/* ================================================================ + * + */ + +static void mga_dma_dispatch_clear( drm_device_t *dev, + drm_mga_clear_t *clear ) { drm_mga_private_t *dev_priv = dev->dev_private; - int use_agp = PDEA_pagpxfer_enable | 0x00000001; - u16 y2; - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); + drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; + drm_mga_context_regs_t *ctx = &sarea_priv->context_state; + drm_clip_rect_t *pbox = sarea_priv->boxes; + int nbox = sarea_priv->nbox; + int i; + DMA_LOCALS; + DRM_DEBUG( __FUNCTION__ ":\n" ); - y2 = length / 64; + BEGIN_DMA( 1 ); - PRIM_OVERFLOW(dev, dev_priv, 30); + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DWGSYNC, 0x00007100, + MGA_DWGSYNC, 0x00007000 ); - PRIMOUTREG(MGAREG_DSTORG, destOrg); - PRIMOUTREG(MGAREG_MACCESS, 0x00000000); - DRM_DEBUG("srcorg : %lx\n", bus_address | use_agp); - PRIMOUTREG(MGAREG_SRCORG, (u32) bus_address | use_agp); - PRIMOUTREG(MGAREG_AR5, 64); + ADVANCE_DMA(); - PRIMOUTREG(MGAREG_PITCH, 64); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DWGCTL, MGA_COPY_CMD); + for ( i = 0 ; i < nbox ; i++ ) { + drm_clip_rect_t *box = &pbox[i]; + u32 height = box->y2 - box->y1; - PRIMOUTREG(MGAREG_AR0, 63); - PRIMOUTREG(MGAREG_AR3, 0); - PRIMOUTREG(MGAREG_FXBNDRY, (63 << 16)); - PRIMOUTREG(MGAREG_YDSTLEN + MGAREG_MGA_EXEC, y2); + DRM_DEBUG( " from=%d,%d to=%d,%d\n", + box->x1, box->y1, box->x2, box->y2 ); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_SRCORG, 0); - PRIMOUTREG(MGAREG_PITCH, dev_priv->stride / dev_priv->cpp); - PRIMOUTREG(MGAREG_DWGSYNC, 0x7000); + if ( clear->flags & MGA_FRONT ) { + BEGIN_DMA( 2 ); - PRIMADVANCE(dev_priv); -} + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_PLNWT, clear->color_mask, + MGA_YDSTLEN, (box->y1 << 16) | height, + MGA_FXBNDRY, (box->x2 << 16) | box->x1 ); -static void mga_dma_dispatch_vertex(drm_device_t * dev, drm_buf_t * buf) -{ - drm_mga_private_t *dev_priv = dev->dev_private; - drm_mga_buf_priv_t *buf_priv = buf->dev_private; - drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned long address = (unsigned long) buf->bus_address; - int length = buf->used; - int use_agp = PDEA_pagpxfer_enable; - int i = 0; - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_FCOL, clear->clear_color, + MGA_DSTORG, dev_priv->front_offset, + MGA_DWGCTL + MGA_EXEC, + dev_priv->clear_cmd ); - DRM_DEBUG("dispatch vertex %d addr 0x%lx, " - "length 0x%x nbox %d dirty %x\n", - buf->idx, address, length, - sarea_priv->nbox, sarea_priv->dirty); + ADVANCE_DMA(); + } - DRM_DEBUG("used : %d, total : %d\n", buf->used, buf->total); - if (buf->used) { - /* WARNING: if you change any of the state functions verify - * these numbers (Overestimating this doesn't hurt). - */ - buf_priv->dispatched = 1; - PRIM_OVERFLOW(dev, dev_priv, - (MAX_STATE_SIZE + (5 * MGA_NR_SAREA_CLIPRECTS))); - mgaEmitState(dev_priv); + if ( clear->flags & MGA_BACK ) { + BEGIN_DMA( 2 ); -#if 0 - length = dev_priv->vertexsize * 3 * 4; -#endif + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_PLNWT, clear->color_mask, + MGA_YDSTLEN, (box->y1 << 16) | height, + MGA_FXBNDRY, (box->x2 << 16) | box->x1 ); + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_FCOL, clear->clear_color, + MGA_DSTORG, dev_priv->back_offset, + MGA_DWGCTL + MGA_EXEC, + dev_priv->clear_cmd ); + ADVANCE_DMA(); + } - do { - if (i < sarea_priv->nbox) { - DRM_DEBUG("idx %d Emit box %d/%d:" - "%d,%d - %d,%d\n", - buf->idx, - i, sarea_priv->nbox, - sarea_priv->boxes[i].x1, - sarea_priv->boxes[i].y1, - sarea_priv->boxes[i].x2, - sarea_priv->boxes[i].y2); - - mgaEmitClipRect(dev_priv, - &sarea_priv->boxes[i]); - } + if ( clear->flags & MGA_DEPTH ) { + BEGIN_DMA( 2 ); - PRIMGETPTR(dev_priv); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_SECADDRESS, - ((u32) address) | TT_VERTEX); - PRIMOUTREG(MGAREG_SECEND, - (((u32) (address + length)) | use_agp)); - PRIMADVANCE(dev_priv); - } while (++i < sarea_priv->nbox); - } + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_PLNWT, clear->depth_mask, + MGA_YDSTLEN, (box->y1 << 16) | height, + MGA_FXBNDRY, (box->x2 << 16) | box->x1 ); + + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_FCOL, clear->clear_depth, + MGA_DSTORG, dev_priv->depth_offset, + MGA_DWGCTL + MGA_EXEC, + dev_priv->clear_cmd ); + + ADVANCE_DMA(); + } - if (buf_priv->discard) { - if (buf_priv->dispatched == 1) - AGEBUF(dev_priv, buf_priv); - buf_priv->dispatched = 0; - mga_freelist_put(dev, buf); } + BEGIN_DMA( 1 ); + + /* Force reset of DWGCTL */ + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_PLNWT, ctx->plnwt, + MGA_DWGCTL, ctx->dwgctl ); + + ADVANCE_DMA(); + FLUSH_DMA(); } +static void mga_dma_dispatch_swap( drm_device_t *dev ) +{ + drm_mga_private_t *dev_priv = dev->dev_private; + drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; + drm_mga_context_regs_t *ctx = &sarea_priv->context_state; + drm_clip_rect_t *pbox = sarea_priv->boxes; + int nbox = sarea_priv->nbox; + int i; + DMA_LOCALS; + DRM_DEBUG( __FUNCTION__ ":\n" ); + + sarea_priv->last_frame.head = dev_priv->prim.tail; + sarea_priv->last_frame.wrap = dev_priv->prim.last_wrap; + + BEGIN_DMA( 4 + nbox ); + + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DWGSYNC, 0x00007100, + MGA_DWGSYNC, 0x00007000 ); + + DMA_BLOCK( MGA_DSTORG, dev_priv->front_offset, + MGA_MACCESS, dev_priv->maccess, + MGA_SRCORG, dev_priv->back_offset, + MGA_AR5, dev_priv->front_pitch ); + + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_PLNWT, 0xffffffff, + MGA_DWGCTL, MGA_DWGCTL_COPY ); + + for ( i = 0 ; i < nbox ; i++ ) { + drm_clip_rect_t *box = &pbox[i]; + u32 height = box->y2 - box->y1; + u32 start = box->y1 * dev_priv->front_pitch; + + DRM_DEBUG( " from=%d,%d to=%d,%d\n", + box->x1, box->y1, box->x2, box->y2 ); + + DMA_BLOCK( MGA_AR0, start + box->x2 - 1, + MGA_AR3, start + box->x1, + MGA_FXBNDRY, ((box->x2 - 1) << 16) | box->x1, + MGA_YDSTLEN + MGA_EXEC, + (box->y1 << 16) | height ); + } -static void mga_dma_dispatch_indices(drm_device_t * dev, - drm_buf_t * buf, - unsigned int start, unsigned int end) + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_PLNWT, ctx->plnwt, + MGA_SRCORG, dev_priv->front_offset, + MGA_DWGCTL, ctx->dwgctl ); + + ADVANCE_DMA(); + + FLUSH_DMA(); + + DRM_DEBUG( "%s... done.\n", __FUNCTION__ ); +} + +static void mga_dma_dispatch_vertex( drm_device_t *dev, drm_buf_t *buf ) { drm_mga_private_t *dev_priv = dev->dev_private; drm_mga_buf_priv_t *buf_priv = buf->dev_private; drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int address = (unsigned int) buf->bus_address; - int use_agp = PDEA_pagpxfer_enable; + u32 address = (u32) buf->bus_address; + u32 length = (u32) buf->used; int i = 0; - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); - - DRM_DEBUG("dispatch indices %d addr 0x%x, " - "start 0x%x end 0x%x nbox %d dirty %x\n", - buf->idx, address, start, end, - sarea_priv->nbox, sarea_priv->dirty); - - if (start != end) { - /* WARNING: if you change any of the state functions verify - * these numbers (Overestimating this doesn't hurt). - */ + DMA_LOCALS; + DRM_DEBUG( "vertex: buf=%d used=%d\n", buf->idx, buf->used ); + + if ( buf->used ) { buf_priv->dispatched = 1; - PRIM_OVERFLOW(dev, dev_priv, - (MAX_STATE_SIZE + (5 * MGA_NR_SAREA_CLIPRECTS))); - mgaEmitState(dev_priv); + MGA_EMIT_STATE( dev_priv, sarea_priv->dirty ); do { - if (i < sarea_priv->nbox) { - DRM_DEBUG("idx %d Emit box %d/%d:" - "%d,%d - %d,%d\n", - buf->idx, - i, sarea_priv->nbox, - sarea_priv->boxes[i].x1, - sarea_priv->boxes[i].y1, - sarea_priv->boxes[i].x2, - sarea_priv->boxes[i].y2); - - mgaEmitClipRect(dev_priv, - &sarea_priv->boxes[i]); + if ( i < sarea_priv->nbox ) { + mga_emit_clip_rect( dev_priv, + &sarea_priv->boxes[i] ); } - PRIMGETPTR(dev_priv); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_SETUPADDRESS, - ((address + start) | - SETADD_mode_vertlist)); - PRIMOUTREG(MGAREG_SETUPEND, - ((address + end) | use_agp)); - - PRIMADVANCE(dev_priv); - } while (++i < sarea_priv->nbox); + BEGIN_DMA( 1 ); + + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_SECADDRESS, (address | + MGA_DMA_VERTEX), + MGA_SECEND, ((address + length) | + MGA_PAGPXFER) ); + + ADVANCE_DMA(); + } while ( ++i < sarea_priv->nbox ); } - if (buf_priv->discard) { - if (buf_priv->dispatched == 1) - AGEBUF(dev_priv, buf_priv); + + if ( buf_priv->discard ) { + AGE_BUFFER( buf_priv ); + buf->pending = 0; + buf->used = 0; buf_priv->dispatched = 0; - mga_freelist_put(dev, buf); - } -} + mga_freelist_put( dev, buf ); + } -static void mga_dma_dispatch_clear(drm_device_t * dev, int flags, - unsigned int clear_color, - unsigned int clear_zval, - unsigned int clear_colormask, - unsigned int clear_depthmask) + FLUSH_DMA(); +} +static void mga_dma_dispatch_indices( drm_device_t *dev, drm_buf_t *buf, + unsigned int start, unsigned int end ) { drm_mga_private_t *dev_priv = dev->dev_private; + drm_mga_buf_priv_t *buf_priv = buf->dev_private; drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int *regs = sarea_priv->ContextState; - int nbox = sarea_priv->nbox; - drm_clip_rect_t *pbox = sarea_priv->boxes; - unsigned int cmd; - int i; - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); - - if (dev_priv->sgram) - cmd = MGA_CLEAR_CMD | DC_atype_blk; - else - cmd = MGA_CLEAR_CMD | DC_atype_rstr; - - PRIM_OVERFLOW(dev, dev_priv, 35 * MGA_NR_SAREA_CLIPRECTS); - - for (i = 0; i < nbox; i++) { - unsigned int height = pbox[i].y2 - pbox[i].y1; - - DRM_DEBUG("dispatch clear %d,%d-%d,%d flags %x!\n", - pbox[i].x1, pbox[i].y1, pbox[i].x2, - pbox[i].y2, flags); - - if (flags & MGA_FRONT) { - DRM_DEBUG("clear front\n"); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_PLNWT, clear_colormask); - PRIMOUTREG(MGAREG_YDSTLEN, - (pbox[i].y1 << 16) | height); - PRIMOUTREG(MGAREG_FXBNDRY, - (pbox[i].x2 << 16) | pbox[i].x1); - - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_FCOL, clear_color); - PRIMOUTREG(MGAREG_DSTORG, dev_priv->frontOffset); - PRIMOUTREG(MGAREG_DWGCTL + MGAREG_MGA_EXEC, cmd); - } + u32 address = (u32) buf->bus_address; + int i = 0; + DMA_LOCALS; + DRM_DEBUG( "indices: buf=%d start=%d end=%d\n", buf->idx, start, end ); - if (flags & MGA_BACK) { - DRM_DEBUG("clear back\n"); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_PLNWT, clear_colormask); - PRIMOUTREG(MGAREG_YDSTLEN, - (pbox[i].y1 << 16) | height); - PRIMOUTREG(MGAREG_FXBNDRY, - (pbox[i].x2 << 16) | pbox[i].x1); - - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_FCOL, clear_color); - PRIMOUTREG(MGAREG_DSTORG, dev_priv->backOffset); - PRIMOUTREG(MGAREG_DWGCTL + MGAREG_MGA_EXEC, cmd); - } + if ( start != end ) { + buf_priv->dispatched = 1; - if (flags & MGA_DEPTH) { - DRM_DEBUG("clear depth\n"); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_PLNWT, clear_depthmask); - PRIMOUTREG(MGAREG_YDSTLEN, - (pbox[i].y1 << 16) | height); - PRIMOUTREG(MGAREG_FXBNDRY, - (pbox[i].x2 << 16) | pbox[i].x1); - - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_FCOL, clear_zval); - PRIMOUTREG(MGAREG_DSTORG, dev_priv->depthOffset); - PRIMOUTREG(MGAREG_DWGCTL + MGAREG_MGA_EXEC, cmd); - } + MGA_EMIT_STATE( dev_priv, sarea_priv->dirty ); + + do { + if ( i < sarea_priv->nbox ) { + mga_emit_clip_rect( dev_priv, + &sarea_priv->boxes[i] ); + } + + BEGIN_DMA( 1 ); + + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_SETUPADDRESS, address + start, + MGA_SETUPEND, ((address + end) | + MGA_PAGPXFER) ); + + ADVANCE_DMA(); + } while ( ++i < sarea_priv->nbox ); } - /* Force reset of DWGCTL */ - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]); - PRIMADVANCE(dev_priv); + if ( buf_priv->discard ) { + AGE_BUFFER( buf_priv ); + buf->pending = 0; + buf->used = 0; + buf_priv->dispatched = 0; + + mga_freelist_put( dev, buf ); + } + + FLUSH_DMA(); } -static void mga_dma_dispatch_swap(drm_device_t * dev) +/* This copies a 64 byte aligned agp region to the frambuffer with a + * standard blit, the ioctl needs to do checking. + */ +static void mga_dma_dispatch_iload( drm_device_t *dev, drm_buf_t *buf, + unsigned int dstorg, unsigned int length ) { drm_mga_private_t *dev_priv = dev->dev_private; - drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int *regs = sarea_priv->ContextState; - int nbox = sarea_priv->nbox; - drm_clip_rect_t *pbox = sarea_priv->boxes; - int i; - int pixel_stride = dev_priv->stride / dev_priv->cpp; + drm_mga_buf_priv_t *buf_priv = buf->dev_private; + drm_mga_context_regs_t *ctx = &dev_priv->sarea_priv->context_state; + u32 srcorg = buf->bus_address | MGA_SRCACC_AGP | MGA_SRCMAP_SYSMEM; + u32 y2; + DMA_LOCALS; + DRM_DEBUG( "%s: buf=%d used=%d\n", + __FUNCTION__, buf->idx, buf->used ); - PRIMLOCALS; - DRM_DEBUG("%s\n", __FUNCTION__); + y2 = length / 64; - PRIM_OVERFLOW(dev, dev_priv, (MGA_NR_SAREA_CLIPRECTS * 5) + 20); + BEGIN_DMA( 5 ); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DWGSYNC, 0x7100); - PRIMOUTREG(MGAREG_DWGSYNC, 0x7000); + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DWGSYNC, 0x00007100, + MGA_DWGSYNC, 0x00007000 ); - PRIMOUTREG(MGAREG_DSTORG, dev_priv->frontOffset); - PRIMOUTREG(MGAREG_MACCESS, dev_priv->mAccess); - PRIMOUTREG(MGAREG_SRCORG, dev_priv->backOffset); - PRIMOUTREG(MGAREG_AR5, pixel_stride); + DMA_BLOCK( MGA_DSTORG, dstorg, + MGA_MACCESS, 0x00000000, + MGA_SRCORG, srcorg, + MGA_AR5, 64 ); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DWGCTL, MGA_COPY_CMD); + DMA_BLOCK( MGA_PITCH, 64, + MGA_PLNWT, 0xffffffff, + MGA_DMAPAD, 0x00000000, + MGA_DWGCTL, MGA_DWGCTL_COPY ); + DMA_BLOCK( MGA_AR0, 63, + MGA_AR3, 0, + MGA_FXBNDRY, (63 << 16) | 0, + MGA_YDSTLEN + MGA_EXEC, y2 ); - for (i = 0; i < nbox; i++) { - unsigned int h = pbox[i].y2 - pbox[i].y1; - unsigned int start = pbox[i].y1 * pixel_stride; + DMA_BLOCK( MGA_PLNWT, ctx->plnwt, + MGA_SRCORG, dev_priv->front_offset, + MGA_PITCH, dev_priv->front_pitch, + MGA_DWGSYNC, 0x00007000 ); - PRIMOUTREG(MGAREG_AR0, start + pbox[i].x2 - 1); - PRIMOUTREG(MGAREG_AR3, start + pbox[i].x1); - PRIMOUTREG(MGAREG_FXBNDRY, - pbox[i].x1 | ((pbox[i].x2 - 1) << 16)); - PRIMOUTREG(MGAREG_YDSTLEN + MGAREG_MGA_EXEC, - (pbox[i].y1 << 16) | h); - } + ADVANCE_DMA(); - /* Force reset of DWGCTL */ - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_SRCORG, 0); - PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]); + AGE_BUFFER( buf_priv ); + + buf->pending = 0; + buf->used = 0; + buf_priv->dispatched = 0; - PRIMADVANCE(dev_priv); + mga_freelist_put( dev, buf ); + + FLUSH_DMA(); } -int mga_clear_bufs(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +static void mga_dma_dispatch_blit( drm_device_t *dev, + drm_mga_blit_t *blit ) { - drm_device_t *dev = kdev->si_drv1; - drm_mga_private_t *dev_priv = - (drm_mga_private_t *) dev->dev_private; + drm_mga_private_t *dev_priv = dev->dev_private; drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_mga_clear_t clear; - int s; + drm_mga_context_regs_t *ctx = &sarea_priv->context_state; + drm_clip_rect_t *pbox = sarea_priv->boxes; + int nbox = sarea_priv->nbox; + u32 scandir = 0, i; + DMA_LOCALS; + DRM_DEBUG( __FUNCTION__ ":\n" ); + + BEGIN_DMA( 4 + nbox ); + + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_DMAPAD, 0x00000000, + MGA_DWGSYNC, 0x00007100, + MGA_DWGSYNC, 0x00007000 ); + + DMA_BLOCK( MGA_DWGCTL, MGA_DWGCTL_COPY, + MGA_PLNWT, blit->planemask, + MGA_SRCORG, blit->srcorg, + MGA_DSTORG, blit->dstorg ); + + DMA_BLOCK( MGA_SGN, scandir, + MGA_MACCESS, dev_priv->maccess, + MGA_AR5, blit->ydir * blit->src_pitch, + MGA_PITCH, blit->dst_pitch ); + + for ( i = 0 ; i < nbox ; i++ ) { + int srcx = pbox[i].x1 + blit->delta_sx; + int srcy = pbox[i].y1 + blit->delta_sy; + int dstx = pbox[i].x1 + blit->delta_dx; + int dsty = pbox[i].y1 + blit->delta_dy; + int h = pbox[i].y2 - pbox[i].y1; + int w = pbox[i].x2 - pbox[i].x1 - 1; + int start; + + if ( blit->ydir == -1 ) { + srcy = blit->height - srcy - 1; + } - clear = *(drm_mga_clear_t *) data; - DRM_DEBUG("%s\n", __FUNCTION__); + start = srcy * blit->src_pitch + srcx; - if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("mga_clear_bufs called without lock held\n"); - return EINVAL; + DMA_BLOCK( MGA_AR0, start + w, + MGA_AR3, start, + MGA_FXBNDRY, ((dstx + w) << 16) | (dstx & 0xffff), + MGA_YDSTLEN + MGA_EXEC, (dsty << 16) | h ); } - if (sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS) - sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS; - - /* Make sure we restore the 3D state next time. + /* Do something to flush AGP? */ - dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CTX; - mga_dma_dispatch_clear(dev, clear.flags, - clear.clear_color, - clear.clear_depth, - clear.clear_color_mask, - clear.clear_depth_mask); - PRIMUPDATE(dev_priv); - mga_flush_write_combine(); - s = splsofttq(); - mga_dma_schedule(dev, 1); - splx(s); - return 0; + + /* Force reset of DWGCTL */ + DMA_BLOCK( MGA_DMAPAD, 0x00000000, + MGA_PLNWT, ctx->plnwt, + MGA_PITCH, dev_priv->front_pitch, + MGA_DWGCTL, ctx->dwgctl ); + + ADVANCE_DMA(); } -int mga_swap_bufs(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) + +/* ================================================================ + * + */ + +int mga_dma_clear( DRM_OS_IOCTL ) { - drm_device_t *dev = kdev->si_drv1; - drm_mga_private_t *dev_priv = - (drm_mga_private_t *) dev->dev_private; + DRM_OS_DEVICE; + drm_mga_private_t *dev_priv = dev->dev_private; drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - int s; + drm_mga_clear_t clear; - DRM_DEBUG("%s\n", __FUNCTION__); + LOCK_TEST_WITH_RETURN( dev ); - if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("mga_swap_bufs called without lock held\n"); - return EINVAL; - } + DRM_OS_KRNFROMUSR( clear, (drm_mga_clear_t *) data, sizeof(clear) ); - if (sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS) + if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS ) sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS; + WRAP_TEST_WITH_RETURN( dev_priv ); + + mga_dma_dispatch_clear( dev, &clear ); + /* Make sure we restore the 3D state next time. */ - dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CTX; - mga_dma_dispatch_swap(dev); - PRIMUPDATE(dev_priv); - set_bit(MGA_BUF_SWAP_PENDING, - &dev_priv->current_prim->buffer_status); - mga_flush_write_combine(); - s = splsofttq(); - mga_dma_schedule(dev, 1); - splx(s); + dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT; + return 0; } -int mga_iload(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int mga_dma_swap( DRM_OS_IOCTL ) { - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - drm_mga_private_t *dev_priv = - (drm_mga_private_t *) dev->dev_private; + DRM_OS_DEVICE; + drm_mga_private_t *dev_priv = dev->dev_private; drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_buf_t *buf; - drm_mga_buf_priv_t *buf_priv; - drm_mga_iload_t iload; - unsigned long bus_address; - int s; - DRM_DEBUG("%s\n", __FUNCTION__); + LOCK_TEST_WITH_RETURN( dev ); - DRM_DEBUG("Starting Iload\n"); - iload = *(drm_mga_iload_t *) data; + if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS ) + sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS; - if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("mga_iload called without lock held\n"); - return EINVAL; - } + WRAP_TEST_WITH_RETURN( dev_priv ); - buf = dma->buflist[iload.idx]; - buf_priv = buf->dev_private; - bus_address = buf->bus_address; - DRM_DEBUG("bus_address %lx, length %d, destorg : %x\n", - bus_address, iload.length, iload.destOrg); - - if (mgaVerifyIload(dev_priv, - bus_address, iload.destOrg, iload.length)) { - mga_freelist_put(dev, buf); - return EINVAL; - } + mga_dma_dispatch_swap( dev ); + + /* Make sure we restore the 3D state next time. + */ + dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT; - sarea_priv->dirty |= MGA_UPLOAD_CTX; - - mga_dma_dispatch_tex_blit(dev, bus_address, iload.length, - iload.destOrg); - AGEBUF(dev_priv, buf_priv); - buf_priv->discard = 1; - mga_freelist_put(dev, buf); - mga_flush_write_combine(); - s = splsofttq(); - mga_dma_schedule(dev, 1); - splx(s); return 0; } -int mga_vertex(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int mga_dma_vertex( DRM_OS_IOCTL ) { - drm_device_t *dev = kdev->si_drv1; - drm_mga_private_t *dev_priv = - (drm_mga_private_t *) dev->dev_private; + DRM_OS_DEVICE; + drm_mga_private_t *dev_priv = dev->dev_private; drm_device_dma_t *dma = dev->dma; drm_buf_t *buf; drm_mga_buf_priv_t *buf_priv; drm_mga_vertex_t vertex; - DRM_DEBUG("%s\n", __FUNCTION__); + LOCK_TEST_WITH_RETURN( dev ); - vertex = *(drm_mga_vertex_t *) data; - - if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("mga_vertex called without lock held\n"); - return EINVAL; - } - - DRM_DEBUG("mga_vertex\n"); + DRM_OS_KRNFROMUSR( vertex, (drm_mga_vertex_t *) data, sizeof(vertex) ); + if(vertex.idx < 0 || vertex.idx > dma->buf_count) DRM_OS_RETURN( EINVAL ); buf = dma->buflist[vertex.idx]; buf_priv = buf->dev_private; buf->used = vertex.used; buf_priv->discard = vertex.discard; - if (!mgaVerifyState(dev_priv)) { - if (vertex.discard) { - if (buf_priv->dispatched == 1) - AGEBUF(dev_priv, buf_priv); + if ( !mga_verify_state( dev_priv ) ) { + if ( vertex.discard ) { + if ( buf_priv->dispatched == 1 ) + AGE_BUFFER( buf_priv ); buf_priv->dispatched = 0; - mga_freelist_put(dev, buf); + mga_freelist_put( dev, buf ); } - DRM_DEBUG("bad state\n"); - return EINVAL; + DRM_OS_RETURN( EINVAL ); } - mga_dma_dispatch_vertex(dev, buf); + WRAP_TEST_WITH_RETURN( dev_priv ); + + mga_dma_dispatch_vertex( dev, buf ); - PRIMUPDATE(dev_priv); - mga_flush_write_combine(); - mga_dma_schedule(dev, 1); return 0; } - -int mga_indices(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int mga_dma_indices( DRM_OS_IOCTL ) { - drm_device_t *dev = kdev->si_drv1; - drm_mga_private_t *dev_priv = - (drm_mga_private_t *) dev->dev_private; + DRM_OS_DEVICE; + drm_mga_private_t *dev_priv = dev->dev_private; drm_device_dma_t *dma = dev->dma; drm_buf_t *buf; drm_mga_buf_priv_t *buf_priv; drm_mga_indices_t indices; - DRM_DEBUG("%s\n", __FUNCTION__); - indices = *(drm_mga_indices_t *) data; + LOCK_TEST_WITH_RETURN( dev ); - if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("mga_indices called without lock held\n"); - return EINVAL; - } + DRM_OS_KRNFROMUSR( indices, (drm_mga_indices_t *) data, sizeof(indices) ); - DRM_DEBUG("mga_indices\n"); + if(indices.idx < 0 || indices.idx > dma->buf_count) DRM_OS_RETURN( EINVAL ); buf = dma->buflist[indices.idx]; buf_priv = buf->dev_private; buf_priv->discard = indices.discard; - if (!mgaVerifyState(dev_priv)) { - if (indices.discard) { - if (buf_priv->dispatched == 1) - AGEBUF(dev_priv, buf_priv); + if ( !mga_verify_state( dev_priv ) ) { + if ( indices.discard ) { + if ( buf_priv->dispatched == 1 ) + AGE_BUFFER( buf_priv ); buf_priv->dispatched = 0; - mga_freelist_put(dev, buf); + mga_freelist_put( dev, buf ); } - return EINVAL; + DRM_OS_RETURN( EINVAL ); } - mga_dma_dispatch_indices(dev, buf, indices.start, indices.end); + WRAP_TEST_WITH_RETURN( dev_priv ); + + mga_dma_dispatch_indices( dev, buf, indices.start, indices.end ); - PRIMUPDATE(dev_priv); - mga_flush_write_combine(); - mga_dma_schedule(dev, 1); return 0; } - - -static int -mga_dma_get_buffers(drm_device_t * dev, drm_dma_t * d, struct proc *p) +int mga_dma_iload( DRM_OS_IOCTL ) { - int i, error; + DRM_OS_DEVICE; + drm_device_dma_t *dma = dev->dma; + drm_mga_private_t *dev_priv = dev->dev_private; drm_buf_t *buf; - DRM_DEBUG("%s\n", __FUNCTION__); - - for (i = d->granted_count; i < d->request_count; i++) { - buf = mga_freelist_get(dev); - if (!buf) - break; - buf->pid = p->p_pid; - error = copyout(&buf->idx, - &d->request_indices[i], - sizeof(buf->idx)); - if (error) return error; - error = copyout(&buf->total, - &d->request_sizes[i], - sizeof(buf->total)); - if (error) return error; - ++d->granted_count; + drm_mga_buf_priv_t *buf_priv; + drm_mga_iload_t iload; + DRM_DEBUG( __FUNCTION__ ":\n" ); + + LOCK_TEST_WITH_RETURN( dev ); + + DRM_OS_KRNFROMUSR( iload, (drm_mga_iload_t *) data, sizeof(iload) ); + +#if 0 + if ( mga_do_wait_for_idle( dev_priv ) ) { + if ( MGA_DMA_DEBUG ) + DRM_INFO( __FUNCTION__": -EBUSY\n" ); + DRM_OS_RETURN( EBUSY ); } +#endif + if(iload.idx < 0 || iload.idx > dma->buf_count) DRM_OS_RETURN( EINVAL ); + + buf = dma->buflist[iload.idx]; + buf_priv = buf->dev_private; + + if ( mga_verify_iload( dev_priv, iload.dstorg, iload.length ) ) { + mga_freelist_put( dev, buf ); + DRM_OS_RETURN( EINVAL ); + } + + WRAP_TEST_WITH_RETURN( dev_priv ); + + mga_dma_dispatch_iload( dev, buf, iload.dstorg, iload.length ); + + /* Make sure we restore the 3D state next time. + */ + dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT; + return 0; } -int mga_dma(dev_t kdev, u_long cmd, caddr_t data, - int flags, struct proc *p) +int mga_dma_blit( DRM_OS_IOCTL ) { - drm_device_t *dev = kdev->si_drv1; - drm_device_dma_t *dma = dev->dma; - int retcode = 0; - drm_dma_t d; - DRM_DEBUG("%s\n", __FUNCTION__); + DRM_OS_DEVICE; + drm_mga_private_t *dev_priv = dev->dev_private; + drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; + drm_mga_blit_t blit; + DRM_DEBUG( "%s\n", __FUNCTION__ ); - d = *(drm_dma_t *) data; - DRM_DEBUG("%d %d: %d send, %d req\n", - p->p_pid, d.context, d.send_count, d.request_count); + LOCK_TEST_WITH_RETURN( dev ); - if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("mga_dma called without lock held\n"); - return EINVAL; - } + DRM_OS_KRNFROMUSR( blit, (drm_mga_blit_t *) data, sizeof(blit) ); - /* Please don't send us buffers. - */ - if (d.send_count != 0) { - DRM_ERROR - ("Process %d trying to send %d buffers via drmDMA\n", - p->p_pid, d.send_count); - return EINVAL; - } + if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS ) + sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS; - /* We'll send you buffers. - */ - if (d.request_count < 0 || d.request_count > dma->buf_count) { - DRM_ERROR - ("Process %d trying to get %d buffers (of %d max)\n", - p->p_pid, d.request_count, dma->buf_count); - return EINVAL; - } + if ( mga_verify_blit( dev_priv, blit.srcorg, blit.dstorg ) ) + DRM_OS_RETURN( EINVAL ); - d.granted_count = 0; + WRAP_TEST_WITH_RETURN( dev_priv ); - if (d.request_count) { - retcode = mga_dma_get_buffers(dev, &d, p); - } + mga_dma_dispatch_blit( dev, &blit ); - DRM_DEBUG("%d returning, granted = %d\n", - p->p_pid, d.granted_count); - *(drm_dma_t *) data = d; - return retcode; + /* Make sure we restore the 3D state next time. + */ + dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT; + + return 0; } diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga_drm.h b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga_drm.h new file mode 100644 index 000000000..4af2ca2e8 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/mga_drm.h @@ -0,0 +1,310 @@ +/* mga_drm.h -- Public header for the Matrox g200/g400 driver -*- linux-c -*- + * Created: Tue Jan 25 01:50:01 1999 by jhartmann@precisioninsight.com + * + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 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 + * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEMS AND/OR ITS 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: + * Jeff Hartmann <jhartmann@valinux.com> + * Keith Whitwell <keithw@valinux.com> + * + * Rewritten by: + * Gareth Hughes <gareth@valinux.com> + */ + +#ifndef __MGA_DRM_H__ +#define __MGA_DRM_H__ + +/* WARNING: If you change any of these defines, make sure to change the + * defines in the Xserver file (mga_sarea.h) + */ +#ifndef __MGA_SAREA_DEFINES__ +#define __MGA_SAREA_DEFINES__ + +/* WARP pipe flags + */ +#define MGA_F 0x1 /* fog */ +#define MGA_A 0x2 /* alpha */ +#define MGA_S 0x4 /* specular */ +#define MGA_T2 0x8 /* multitexture */ + +#define MGA_WARP_TGZ 0 +#define MGA_WARP_TGZF (MGA_F) +#define MGA_WARP_TGZA (MGA_A) +#define MGA_WARP_TGZAF (MGA_F|MGA_A) +#define MGA_WARP_TGZS (MGA_S) +#define MGA_WARP_TGZSF (MGA_S|MGA_F) +#define MGA_WARP_TGZSA (MGA_S|MGA_A) +#define MGA_WARP_TGZSAF (MGA_S|MGA_F|MGA_A) +#define MGA_WARP_T2GZ (MGA_T2) +#define MGA_WARP_T2GZF (MGA_T2|MGA_F) +#define MGA_WARP_T2GZA (MGA_T2|MGA_A) +#define MGA_WARP_T2GZAF (MGA_T2|MGA_A|MGA_F) +#define MGA_WARP_T2GZS (MGA_T2|MGA_S) +#define MGA_WARP_T2GZSF (MGA_T2|MGA_S|MGA_F) +#define MGA_WARP_T2GZSA (MGA_T2|MGA_S|MGA_A) +#define MGA_WARP_T2GZSAF (MGA_T2|MGA_S|MGA_F|MGA_A) + +#define MGA_MAX_G200_PIPES 8 /* no multitex */ +#define MGA_MAX_G400_PIPES 16 +#define MGA_MAX_WARP_PIPES MGA_MAX_G400_PIPES +#define MGA_WARP_UCODE_SIZE 32768 /* in bytes */ + +#define MGA_CARD_TYPE_G200 1 +#define MGA_CARD_TYPE_G400 2 + + +#define MGA_FRONT 0x1 +#define MGA_BACK 0x2 +#define MGA_DEPTH 0x4 + +/* What needs to be changed for the current vertex dma buffer? + */ +#define MGA_UPLOAD_CONTEXT 0x1 +#define MGA_UPLOAD_TEX0 0x2 +#define MGA_UPLOAD_TEX1 0x4 +#define MGA_UPLOAD_PIPE 0x8 +#define MGA_UPLOAD_TEX0IMAGE 0x10 /* handled client-side */ +#define MGA_UPLOAD_TEX1IMAGE 0x20 /* handled client-side */ +#define MGA_UPLOAD_2D 0x40 +#define MGA_WAIT_AGE 0x80 /* handled client-side */ +#define MGA_UPLOAD_CLIPRECTS 0x100 /* handled client-side */ +#if 0 +#define MGA_DMA_FLUSH 0x200 /* set when someone gets the lock + quiescent */ +#endif + +/* 32 buffers of 64k each, total 2 meg. + */ +#define MGA_BUFFER_SIZE (1 << 16) +#define MGA_NUM_BUFFERS 128 + +/* Keep these small for testing. + */ +#define MGA_NR_SAREA_CLIPRECTS 8 + +/* 2 heaps (1 for card, 1 for agp), each divided into upto 128 + * regions, subject to a minimum region size of (1<<16) == 64k. + * + * Clients may subdivide regions internally, but when sharing between + * clients, the region size is the minimum granularity. + */ + +#define MGA_CARD_HEAP 0 +#define MGA_AGP_HEAP 1 +#define MGA_NR_TEX_HEAPS 2 +#define MGA_NR_TEX_REGIONS 16 +#define MGA_LOG_MIN_TEX_REGION_SIZE 16 + +#endif /* __MGA_SAREA_DEFINES__ */ + + +/* Setup registers for 3D context + */ +typedef struct { + unsigned int dstorg; + unsigned int maccess; + unsigned int plnwt; + unsigned int dwgctl; + unsigned int alphactrl; + unsigned int fogcolor; + unsigned int wflag; + unsigned int tdualstage0; + unsigned int tdualstage1; + unsigned int fcol; + unsigned int stencil; + unsigned int stencilctl; +} drm_mga_context_regs_t; + +/* Setup registers for 2D, X server + */ +typedef struct { + unsigned int pitch; +} drm_mga_server_regs_t; + +/* Setup registers for each texture unit + */ +typedef struct { + unsigned int texctl; + unsigned int texctl2; + unsigned int texfilter; + unsigned int texbordercol; + unsigned int texorg; + unsigned int texwidth; + unsigned int texheight; + unsigned int texorg1; + unsigned int texorg2; + unsigned int texorg3; + unsigned int texorg4; +} drm_mga_texture_regs_t; + +/* General aging mechanism + */ +typedef struct { + unsigned int head; /* Position of head pointer */ + unsigned int wrap; /* Primary DMA wrap count */ +} drm_mga_age_t; + +typedef struct _drm_mga_sarea { + /* The channel for communication of state information to the kernel + * on firing a vertex dma buffer. + */ + drm_mga_context_regs_t context_state; + drm_mga_server_regs_t server_state; + drm_mga_texture_regs_t tex_state[2]; + unsigned int warp_pipe; + unsigned int dirty; + unsigned int vertsize; + + /* The current cliprects, or a subset thereof. + */ + drm_clip_rect_t boxes[MGA_NR_SAREA_CLIPRECTS]; + unsigned int nbox; + + /* Information about the most recently used 3d drawable. The + * client fills in the req_* fields, the server fills in the + * exported_ fields and puts the cliprects into boxes, above. + * + * The client clears the exported_drawable field before + * clobbering the boxes data. + */ + unsigned int req_drawable; /* the X drawable id */ + unsigned int req_draw_buffer; /* MGA_FRONT or MGA_BACK */ + + unsigned int exported_drawable; + unsigned int exported_index; + unsigned int exported_stamp; + unsigned int exported_buffers; + unsigned int exported_nfront; + unsigned int exported_nback; + int exported_back_x, exported_front_x, exported_w; + int exported_back_y, exported_front_y, exported_h; + drm_clip_rect_t exported_boxes[MGA_NR_SAREA_CLIPRECTS]; + + /* Counters for aging textures and for client-side throttling. + */ + unsigned int status[4]; + unsigned int last_wrap; + + drm_mga_age_t last_frame; + unsigned int last_enqueue; /* last time a buffer was enqueued */ + unsigned int last_dispatch; /* age of the most recently dispatched buffer */ + unsigned int last_quiescent; /* */ + + /* LRU lists for texture memory in agp space and on the card. + */ + drm_tex_region_t texList[MGA_NR_TEX_HEAPS][MGA_NR_TEX_REGIONS+1]; + unsigned int texAge[MGA_NR_TEX_HEAPS]; + + /* Mechanism to validate card state. + */ + int ctxOwner; +} drm_mga_sarea_t; + + +/* WARNING: If you change any of these defines, make sure to change the + * defines in the Xserver file (xf86drmMga.h) + */ +typedef struct _drm_mga_warp_index { + int installed; + unsigned long phys_addr; + int size; +} drm_mga_warp_index_t; + +typedef struct drm_mga_init { + enum { + MGA_INIT_DMA = 0x01, + MGA_CLEANUP_DMA = 0x02 + } func; + + unsigned long sarea_priv_offset; + + int chipset; + int sgram; + + unsigned int maccess; + + unsigned int fb_cpp; + unsigned int front_offset, front_pitch; + unsigned int back_offset, back_pitch; + + unsigned int depth_cpp; + unsigned int depth_offset, depth_pitch; + + unsigned int texture_offset[MGA_NR_TEX_HEAPS]; + unsigned int texture_size[MGA_NR_TEX_HEAPS]; + + unsigned long fb_offset; + unsigned long mmio_offset; + unsigned long status_offset; + unsigned long warp_offset; + unsigned long primary_offset; + unsigned long buffers_offset; +} drm_mga_init_t; + +typedef struct drm_mga_fullscreen { + enum { + MGA_INIT_FULLSCREEN = 0x01, + MGA_CLEANUP_FULLSCREEN = 0x02 + } func; +} drm_mga_fullscreen_t; + +typedef struct drm_mga_clear { + unsigned int flags; + unsigned int clear_color; + unsigned int clear_depth; + unsigned int color_mask; + unsigned int depth_mask; +} drm_mga_clear_t; + +typedef struct drm_mga_vertex { + int idx; /* buffer to queue */ + int used; /* bytes in use */ + int discard; /* client finished with buffer? */ +} drm_mga_vertex_t; + +typedef struct drm_mga_indices { + int idx; /* buffer to queue */ + unsigned int start; + unsigned int end; + int discard; /* client finished with buffer? */ +} drm_mga_indices_t; + +typedef struct drm_mga_iload { + int idx; + unsigned int dstorg; + unsigned int length; +} drm_mga_iload_t; + +typedef struct _drm_mga_blit { + unsigned int planemask; + unsigned int srcorg; + unsigned int dstorg; + int src_pitch, dst_pitch; + int delta_sx, delta_sy; + int delta_dx, delta_dy; + int height, ydir; /* flip image vertically */ + int source_pitch, dest_pitch; +} drm_mga_blit_t; + +#endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/r128/Makefile b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/r128/Makefile new file mode 100644 index 000000000..ae5622ed3 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/r128/Makefile @@ -0,0 +1,25 @@ +# $FreeBSD$ + +KMOD = r128 +NOMAN= YES +SRCS = r128_cce.c r128_drv.c r128_state.c +SRCS += device_if.h bus_if.h pci_if.h opt_drm_linux.h +CFLAGS += ${DEBUG_FLAGS} -I. -I.. + +@: + ln -sf /sys @ + +machine: + ln -sf /sys/i386/include machine + +.if ${MACHINE_ARCH} == "i386" +# This line enables linux ioctl handling +# If you want support for this uncomment this line +#R128_OPTS= "\#define DRM_LINUX" 1 +.endif + +opt_drm_linux.h: + touch opt_drm_linux.h + echo $(R128_OPTS) >> opt_drm_linux.h + +.include <bsd.kmod.mk> diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/r128_drm.h b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/r128_drm.h new file mode 100644 index 000000000..0fc6a6cd1 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/r128_drm.h @@ -0,0 +1,287 @@ +/* r128_drm.h -- Public header for the r128 driver -*- linux-c -*- + * Created: Wed Apr 5 19:24:19 2000 by kevin@precisioninsight.com + * + * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 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 + * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL + * PRECISION INSIGHT AND/OR ITS 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: + * Gareth Hughes <gareth@valinux.com> + * Kevin E. Martin <martin@valinux.com> + */ + +#ifndef __R128_DRM_H__ +#define __R128_DRM_H__ + +/* WARNING: If you change any of these defines, make sure to change the + * defines in the X server file (r128_sarea.h) + */ +#ifndef __R128_SAREA_DEFINES__ +#define __R128_SAREA_DEFINES__ + +/* What needs to be changed for the current vertex buffer? + */ +#define R128_UPLOAD_CONTEXT 0x001 +#define R128_UPLOAD_SETUP 0x002 +#define R128_UPLOAD_TEX0 0x004 +#define R128_UPLOAD_TEX1 0x008 +#define R128_UPLOAD_TEX0IMAGES 0x010 +#define R128_UPLOAD_TEX1IMAGES 0x020 +#define R128_UPLOAD_CORE 0x040 +#define R128_UPLOAD_MASKS 0x080 +#define R128_UPLOAD_WINDOW 0x100 +#define R128_UPLOAD_CLIPRECTS 0x200 /* handled client-side */ +#define R128_REQUIRE_QUIESCENCE 0x400 +#define R128_UPLOAD_ALL 0x7ff + +#define R128_FRONT 0x1 +#define R128_BACK 0x2 +#define R128_DEPTH 0x4 + +/* Primitive types + */ +#define R128_POINTS 0x1 +#define R128_LINES 0x2 +#define R128_LINE_STRIP 0x3 +#define R128_TRIANGLES 0x4 +#define R128_TRIANGLE_FAN 0x5 +#define R128_TRIANGLE_STRIP 0x6 + +/* Vertex/indirect buffer size + */ +#define R128_BUFFER_SIZE 16384 + +/* Byte offsets for indirect buffer data + */ +#define R128_INDEX_PRIM_OFFSET 20 +#define R128_HOSTDATA_BLIT_OFFSET 32 + +/* Keep these small for testing. + */ +#define R128_NR_SAREA_CLIPRECTS 12 + +/* There are 2 heaps (local/AGP). Each region within a heap is a + * minimum of 64k, and there are at most 64 of them per heap. + */ +#define R128_LOCAL_TEX_HEAP 0 +#define R128_AGP_TEX_HEAP 1 +#define R128_NR_TEX_HEAPS 2 +#define R128_NR_TEX_REGIONS 64 +#define R128_LOG_TEX_GRANULARITY 16 + +#define R128_NR_CONTEXT_REGS 12 + +#define R128_MAX_TEXTURE_LEVELS 11 +#define R128_MAX_TEXTURE_UNITS 2 + +#endif /* __R128_SAREA_DEFINES__ */ + +typedef struct { + /* Context state - can be written in one large chunk */ + unsigned int dst_pitch_offset_c; + unsigned int dp_gui_master_cntl_c; + unsigned int sc_top_left_c; + unsigned int sc_bottom_right_c; + unsigned int z_offset_c; + unsigned int z_pitch_c; + unsigned int z_sten_cntl_c; + unsigned int tex_cntl_c; + unsigned int misc_3d_state_cntl_reg; + unsigned int texture_clr_cmp_clr_c; + unsigned int texture_clr_cmp_msk_c; + unsigned int fog_color_c; + + /* Texture state */ + unsigned int tex_size_pitch_c; + unsigned int constant_color_c; + + /* Setup state */ + unsigned int pm4_vc_fpu_setup; + unsigned int setup_cntl; + + /* Mask state */ + unsigned int dp_write_mask; + unsigned int sten_ref_mask_c; + unsigned int plane_3d_mask_c; + + /* Window state */ + unsigned int window_xy_offset; + + /* Core state */ + unsigned int scale_3d_cntl; +} drm_r128_context_regs_t; + +/* Setup registers for each texture unit + */ +typedef struct { + unsigned int tex_cntl; + unsigned int tex_combine_cntl; + unsigned int tex_size_pitch; + unsigned int tex_offset[R128_MAX_TEXTURE_LEVELS]; + unsigned int tex_border_color; +} drm_r128_texture_regs_t; + + +typedef struct drm_r128_sarea { + /* The channel for communication of state information to the kernel + * on firing a vertex buffer. + */ + drm_r128_context_regs_t context_state; + drm_r128_texture_regs_t tex_state[R128_MAX_TEXTURE_UNITS]; + unsigned int dirty; + unsigned int vertsize; + unsigned int vc_format; + + /* The current cliprects, or a subset thereof. + */ + drm_clip_rect_t boxes[R128_NR_SAREA_CLIPRECTS]; + unsigned int nbox; + + /* Counters for client-side throttling of rendering clients. + */ + unsigned int last_frame; + unsigned int last_dispatch; + + drm_tex_region_t tex_list[R128_NR_TEX_HEAPS][R128_NR_TEX_REGIONS+1]; + int tex_age[R128_NR_TEX_HEAPS]; + int ctx_owner; +} drm_r128_sarea_t; + + +/* WARNING: If you change any of these defines, make sure to change the + * defines in the Xserver file (xf86drmR128.h) + */ +typedef struct drm_r128_init { + enum { + R128_INIT_CCE = 0x01, + R128_CLEANUP_CCE = 0x02 + } func; +#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0) + int sarea_priv_offset; +#else + unsigned long sarea_priv_offset; +#endif + int is_pci; + int cce_mode; + int cce_secure; + int ring_size; + int usec_timeout; + + unsigned int fb_bpp; + unsigned int front_offset, front_pitch; + unsigned int back_offset, back_pitch; + unsigned int depth_bpp; + unsigned int depth_offset, depth_pitch; + unsigned int span_offset; + +#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0) + unsigned int fb_offset; + unsigned int mmio_offset; + unsigned int ring_offset; + unsigned int ring_rptr_offset; + unsigned int buffers_offset; + unsigned int agp_textures_offset; +#else + unsigned long fb_offset; + unsigned long mmio_offset; + unsigned long ring_offset; + unsigned long ring_rptr_offset; + unsigned long buffers_offset; + unsigned long agp_textures_offset; +#endif +} drm_r128_init_t; + +typedef struct drm_r128_cce_stop { + int flush; + int idle; +} drm_r128_cce_stop_t; + +typedef struct drm_r128_clear { + unsigned int flags; +#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0) + int x, y, w, h; +#endif + unsigned int clear_color; + unsigned int clear_depth; +#if CONFIG_XFREE86_VERSION >= XFREE86_VERSION(4,1,0,0) + unsigned int color_mask; + unsigned int depth_mask; +#endif +} drm_r128_clear_t; + +typedef struct drm_r128_vertex { + int prim; + int idx; /* Index of vertex buffer */ + int count; /* Number of vertices in buffer */ + int discard; /* Client finished with buffer? */ +} drm_r128_vertex_t; + +typedef struct drm_r128_indices { + int prim; + int idx; + int start; + int end; + int discard; /* Client finished with buffer? */ +} drm_r128_indices_t; + +typedef struct drm_r128_blit { + int idx; + int pitch; + int offset; + int format; + unsigned short x, y; + unsigned short width, height; +} drm_r128_blit_t; + +typedef struct drm_r128_depth { + enum { + R128_WRITE_SPAN = 0x01, + R128_WRITE_PIXELS = 0x02, + R128_READ_SPAN = 0x03, + R128_READ_PIXELS = 0x04 + } func; + int n; + int *x; + int *y; + unsigned int *buffer; + unsigned char *mask; +} drm_r128_depth_t; + +typedef struct drm_r128_stipple { + unsigned int *mask; +} drm_r128_stipple_t; + +typedef struct drm_r128_indirect { + int idx; + int start; + int end; + int discard; +} drm_r128_indirect_t; + +typedef struct drm_r128_fullscreen { + enum { + R128_INIT_FULLSCREEN = 0x01, + R128_CLEANUP_FULLSCREEN = 0x02 + } func; +} drm_r128_fullscreen_t; + +#endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/radeon/Makefile b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/radeon/Makefile new file mode 100644 index 000000000..b1d77bf40 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/radeon/Makefile @@ -0,0 +1,25 @@ +# $FreeBSD$ + +KMOD = radeon +NOMAN= YES +SRCS = radeon_cp.c radeon_drv.c radeon_state.c +SRCS += device_if.h bus_if.h pci_if.h opt_drm_linux.h +CFLAGS += ${DEBUG_FLAGS} -I. -I.. + +@: + ln -sf /sys @ + +machine: + ln -sf /sys/i386/include machine + +.if ${MACHINE_ARCH} == "i386" +# This line enables linux ioctl handling +# If you want support for this uncomment this line +#RADEON_OPTS= "\#define DRM_LINUX" 1 +.endif + +opt_drm_linux.h: + touch opt_drm_linux.h + echo $(RADEON_OPTS) >> opt_drm_linux.h + +.include <bsd.kmod.mk> diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/sis/Makefile b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/sis/Makefile new file mode 100644 index 000000000..07b41caa6 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/sis/Makefile @@ -0,0 +1,25 @@ +# $FreeBSD$ + +KMOD= sis +NOMAN= YES +SRCS= sis_drv.c sis_ds.c sis_mm.c +SRCS+= device_if.h bus_if.h pci_if.h opt_drm_linux.h +CFLAGS+= ${DEBUG_FLAGS} -I. -I.. + +@: + ln -sf /sys @ + +machine: + ln -sf /sys/i386/include machine + +.if ${MACHINE_ARCH} == "i386" +# This line enables linux ioctl handling +# If you want support for this uncomment this line +#SIS_OPTS= "\#define DRM_LINUX" 1 +.endif + +opt_drm_linux.h: + touch opt_drm_linux.h + echo $(SIS_OPTS) >> opt_drm_linux.h + +.include <bsd.kmod.mk> diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/Makefile b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/Makefile index 4362a5ba4..d177ff602 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/Makefile +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/Makefile @@ -1,10 +1,10 @@ # $FreeBSD$ -KMOD = tdfx -SRCS = tdfx_drv.c tdfx_context.c -SRCS += device_if.h bus_if.h pci_if.h -CFLAGS += ${DEBUG_FLAGS} -I. -I.. -KMODDEPS = drm +KMOD= tdfx +NOMAN= YES +SRCS= tdfx_drv.c +SRCS+= device_if.h bus_if.h pci_if.h opt_drm_linux.h +CFLAGS+= ${DEBUG_FLAGS} -I. -I.. @: ln -sf /sys @ @@ -12,4 +12,14 @@ KMODDEPS = drm machine: ln -sf /sys/i386/include machine +.if ${MACHINE_ARCH} == "i386" +# This line enables linux ioctl handling +# If you want support for this uncomment this line +#TDFX_OPTS= "\#define DRM_LINUX" 1 +.endif + +opt_drm_linux.h: + touch opt_drm_linux.h + echo $(TDFX_OPTS) >> opt_drm_linux.h + .include <bsd.kmod.mk> diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/tdfx_context.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/tdfx_context.c deleted file mode 100644 index 5a334058b..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/tdfx_context.c +++ /dev/null @@ -1,204 +0,0 @@ -/* tdfx_context.c -- IOCTLs for tdfx contexts -*- c -*- - * Created: Thu Oct 7 10:50:22 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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: - * Rickard E. (Rik) Faith <faith@valinux.com> - * Daryll Strauss <daryll@valinux.com> - * - */ - -#include "drmP.h" -#include "tdfx_drv.h" - -extern drm_ctx_t tdfx_res_ctx; - -static int tdfx_alloc_queue(drm_device_t *dev) -{ - return drm_ctxbitmap_next(dev); -} - -int tdfx_context_switch(drm_device_t *dev, int old, int new) -{ - char buf[64]; - - atomic_inc(&dev->total_ctx); - - if (test_and_set_bit(0, &dev->context_flag)) { - DRM_ERROR("Reentering -- FIXME\n"); - return -EBUSY; - } - -#if DRM_DMA_HISTOGRAM - getnanotime(&dev->ctx_start); -#endif - - DRM_DEBUG("Context switch from %d to %d\n", old, new); - - if (new == dev->last_context) { - clear_bit(0, &dev->context_flag); - return 0; - } - - if (drm_flags & DRM_FLAG_NOCTX) { - tdfx_context_switch_complete(dev, new); - } else { - sprintf(buf, "C %d %d\n", old, new); - drm_write_string(dev, buf); - } - - return 0; -} - -int tdfx_context_switch_complete(drm_device_t *dev, int new) -{ - dev->last_context = new; /* PRE/POST: This is the _only_ writer. */ - dev->last_switch = ticks; - - if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("Lock isn't held after context switch\n"); - } - - /* If a context switch is ever initiated - when the kernel holds the lock, release - that lock here. */ -#if DRM_DMA_HISTOGRAM - { - struct timespec ts; - getnanotime(&ts); - timespecsub(&ts, &dev->lck_start); - atomic_inc(&dev->histo.ctx[drm_histogram_slot(&ts)]); - } -#endif - clear_bit(0, &dev->context_flag); - wakeup(&dev->context_wait); - - return 0; -} - - -int -tdfx_resctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_ctx_res_t res; - drm_ctx_t ctx; - int i, error; - - DRM_DEBUG("%d\n", DRM_RESERVED_CONTEXTS); - res = *(drm_ctx_res_t *) data; - if (res.count >= DRM_RESERVED_CONTEXTS) { - memset(&ctx, 0, sizeof(ctx)); - for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) { - ctx.handle = i; - error = copyout(&i, &res.contexts[i], sizeof(i)); - if (error) return error; - } - } - res.count = DRM_RESERVED_CONTEXTS; - *(drm_ctx_res_t *) data = res; - return 0; -} - - -int -tdfx_addctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - if ((ctx.handle = tdfx_alloc_queue(dev)) == DRM_KERNEL_CONTEXT) { - /* Skip kernel's context and get a new one. */ - ctx.handle = tdfx_alloc_queue(dev); - } - DRM_DEBUG("%d\n", ctx.handle); - if (ctx.handle == -1) { - DRM_DEBUG("Not enough free contexts.\n"); - /* Should this return -EBUSY instead? */ - return ENOMEM; - } - - *(drm_ctx_t *) data = ctx; - return 0; -} - -int -tdfx_modctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - if (ctx.flags==_DRM_CONTEXT_PRESERVED) - tdfx_res_ctx.handle=ctx.handle; - return 0; -} - -int -tdfx_getctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - /* This is 0, because we don't hanlde any context flags */ - ctx.flags = 0; - *(drm_ctx_t *) data = ctx; - return 0; -} - -int -tdfx_switchctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - DRM_DEBUG("%d\n", ctx.handle); - return tdfx_context_switch(dev, dev->last_context, ctx.handle); -} - -int -tdfx_newctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - DRM_DEBUG("%d\n", ctx.handle); - tdfx_context_switch_complete(dev, ctx.handle); - - return 0; -} - -int -tdfx_rmctx(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_ctx_t ctx; - - ctx = *(drm_ctx_t *) data; - drm_ctxbitmap_free(dev, ctx.handle); - - return 0; -} diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/tdfx_drv.c b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/tdfx_drv.c index 202df7c34..29d195584 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/tdfx_drv.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/tdfx_drv.c @@ -1,4 +1,4 @@ -/* tdfx.c -- tdfx driver -*- c -*- +/* tdfx_drv.c -- tdfx driver -*- linux-c -*- * Created: Thu Oct 7 10:38:32 1999 by faith@precisioninsight.com * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. @@ -11,11 +11,11 @@ * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL @@ -23,719 +23,78 @@ * 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: * Rickard E. (Rik) Faith <faith@valinux.com> * Daryll Strauss <daryll@valinux.com> - * + * Gareth Hughes <gareth@valinux.com> */ -#include "drmP.h" -#include "tdfx_drv.h" +#include <sys/types.h> +#include <sys/bus.h> #include <pci/pcivar.h> +#include <opt_drm_linux.h> -MODULE_DEPEND(tdfx, drm, 1, 1, 1); -#ifdef DRM_AGP -MODULE_DEPEND(tdfx, agp, 1, 1, 1); -#endif - -#define TDFX_NAME "tdfx" -#define TDFX_DESC "tdfx" -#define TDFX_DATE "20000928" -#define TDFX_MAJOR 1 -#define TDFX_MINOR 0 -#define TDFX_PATCHLEVEL 0 - -static int tdfx_init(device_t nbdev); -static void tdfx_cleanup(device_t nbdev); - -drm_ctx_t tdfx_res_ctx; - -static int tdfx_probe(device_t dev) -{ - const char *s = 0; - - switch (pci_get_devid(dev)) { - case 0x0003121a: - s = "3Dfx Voodoo Banshee graphics accelerator"; - break; - - case 0x0005121a: - s = "3Dfx Voodoo 3 graphics accelerator"; - break; - case 0x0009121a: - s = "3Dfx Voodoo 5 graphics accelerator"; - break; - } - - if (s) { - device_set_desc(dev, s); - return 0; - } - - return ENXIO; -} - -static int tdfx_attach(device_t dev) -{ - tdfx_init(dev); - return 0; -} - -static int tdfx_detach(device_t dev) -{ - tdfx_cleanup(dev); - return 0; -} - -static device_method_t tdfx_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, tdfx_probe), - DEVMETHOD(device_attach, tdfx_attach), - DEVMETHOD(device_detach, tdfx_detach), - - { 0, 0 } -}; - -static driver_t tdfx_driver = { - "drm", - tdfx_methods, - sizeof(drm_device_t), -}; - -static devclass_t tdfx_devclass; -#define TDFX_SOFTC(unit) \ - ((drm_device_t *) devclass_get_softc(tdfx_devclass, unit)) - -DRIVER_MODULE(if_tdfx, pci, tdfx_driver, tdfx_devclass, 0, 0); - -#define CDEV_MAJOR 145 - /* tdfx_drv.c */ -static d_open_t tdfx_open; -static d_close_t tdfx_close; -static d_ioctl_t tdfx_version; -static d_ioctl_t tdfx_ioctl; -static d_ioctl_t tdfx_lock; -static d_ioctl_t tdfx_unlock; - -static struct cdevsw tdfx_cdevsw = { - /* open */ tdfx_open, - /* close */ tdfx_close, - /* read */ drm_read, - /* write */ drm_write, - /* ioctl */ tdfx_ioctl, - /* poll */ drm_poll, - /* mmap */ drm_mmap, - /* strategy */ nostrategy, - /* name */ "tdfx", - /* maj */ CDEV_MAJOR, - /* dump */ nodump, - /* psize */ nopsize, - /* flags */ D_TTY | D_TRACKCLOSE, - /* bmaj */ -1 -}; - -static drm_ioctl_desc_t tdfx_ioctls[] = { - [DRM_IOCTL_NR(DRM_IOCTL_VERSION)] = { tdfx_version, 0, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE)] = { drm_getunique, 0, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_GET_MAGIC)] = { drm_getmagic, 0, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_IRQ_BUSID)] = { drm_irq_busid, 0, 1 }, - - [DRM_IOCTL_NR(DRM_IOCTL_SET_UNIQUE)] = { drm_setunique, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_BLOCK)] = { drm_block, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_UNBLOCK)] = { drm_unblock, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_AUTH_MAGIC)] = { drm_authmagic, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP)] = { drm_addmap, 1, 1 }, - - [DRM_IOCTL_NR(DRM_IOCTL_ADD_CTX)] = { tdfx_addctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_RM_CTX)] = { tdfx_rmctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_MOD_CTX)] = { tdfx_modctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_GET_CTX)] = { tdfx_getctx, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_SWITCH_CTX)] = { tdfx_switchctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_NEW_CTX)] = { tdfx_newctx, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_RES_CTX)] = { tdfx_resctx, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_ADD_DRAW)] = { drm_adddraw, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_RM_DRAW)] = { drm_rmdraw, 1, 1 }, - [DRM_IOCTL_NR(DRM_IOCTL_LOCK)] = { tdfx_lock, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_UNLOCK)] = { tdfx_unlock, 1, 0 }, - [DRM_IOCTL_NR(DRM_IOCTL_FINISH)] = { drm_finish, 1, 0 }, -#ifdef DRM_AGP - [DRM_IOCTL_NR(DRM_IOCTL_AGP_ACQUIRE)] = {drm_agp_acquire, 1, 1}, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_RELEASE)] = {drm_agp_release, 1, 1}, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_ENABLE)] = {drm_agp_enable, 1, 1}, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_INFO)] = {drm_agp_info, 1, 1}, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_ALLOC)] = {drm_agp_alloc, 1, 1}, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_FREE)] = {drm_agp_free, 1, 1}, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND)] = {drm_agp_unbind, 1, 1}, - [DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND)] = {drm_agp_bind, 1, 1}, -#endif -}; -#define TDFX_IOCTL_COUNT DRM_ARRAY_SIZE(tdfx_ioctls) - -static int -tdfx_setup(drm_device_t *dev) -{ - int i; - - device_busy(dev->device); - - atomic_set(&dev->ioctl_count, 0); - atomic_set(&dev->vma_count, 0); - dev->buf_use = 0; - atomic_set(&dev->buf_alloc, 0); - - atomic_set(&dev->total_open, 0); - atomic_set(&dev->total_close, 0); - atomic_set(&dev->total_ioctl, 0); - atomic_set(&dev->total_irq, 0); - atomic_set(&dev->total_ctx, 0); - atomic_set(&dev->total_locks, 0); - atomic_set(&dev->total_unlocks, 0); - atomic_set(&dev->total_contends, 0); - atomic_set(&dev->total_sleeps, 0); - - for (i = 0; i < DRM_HASH_SIZE; i++) { - dev->magiclist[i].head = NULL; - dev->magiclist[i].tail = NULL; - } - dev->maplist = NULL; - dev->map_count = 0; - dev->vmalist = NULL; - dev->lock.hw_lock = NULL; - dev->lock.lock_queue = 0; - dev->queue_count = 0; - dev->queue_reserved = 0; - dev->queue_slots = 0; - dev->queuelist = NULL; - dev->irq = 0; - dev->context_flag = 0; - dev->interrupt_flag = 0; - dev->dma = 0; - dev->dma_flag = 0; - dev->last_context = 0; - dev->last_switch = 0; - dev->last_checked = 0; - callout_init(&dev->timer); - dev->context_wait = 0; - - timespecclear(&dev->ctx_start); - timespecclear(&dev->lck_start); - - dev->buf_rp = dev->buf; - dev->buf_wp = dev->buf; - dev->buf_end = dev->buf + DRM_BSZ; - bzero(&dev->buf_sel, sizeof dev->buf_sel); - dev->buf_sigio = NULL; - dev->buf_readers = 0; - dev->buf_writers = 0; - dev->buf_selecting = 0; - - tdfx_res_ctx.handle=-1; - - DRM_DEBUG("\n"); - - /* The kernel's context could be created here, but is now created - in drm_dma_enqueue. This is more resource-efficient for - hardware that does not do DMA, but may mean that - drm_select_queue fails between the time the interrupt is - initialized and the time the queues are initialized. */ - - return 0; -} - - -static int -tdfx_takedown(drm_device_t *dev) -{ - int i; - drm_magic_entry_t *pt, *next; - drm_map_t *map; - drm_vma_entry_t *vma, *vma_next; - - DRM_DEBUG("\n"); - - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, curproc); - callout_stop(&dev->timer); - - if (dev->devname) { - drm_free(dev->devname, strlen(dev->devname)+1, DRM_MEM_DRIVER); - dev->devname = NULL; - } - - if (dev->unique) { - drm_free(dev->unique, strlen(dev->unique)+1, DRM_MEM_DRIVER); - dev->unique = NULL; - dev->unique_len = 0; - } - /* Clear pid list */ - for (i = 0; i < DRM_HASH_SIZE; i++) { - for (pt = dev->magiclist[i].head; pt; pt = next) { - next = pt->next; - drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC); - } - dev->magiclist[i].head = dev->magiclist[i].tail = NULL; - } -#ifdef DRM_AGP - /* Clear AGP information */ - if (dev->agp) { - drm_agp_mem_t *temp; - drm_agp_mem_t *temp_next; - - temp = dev->agp->memory; - while(temp != NULL) { - temp_next = temp->next; - drm_free_agp(temp->handle, temp->pages); - drm_free(temp, sizeof(*temp), DRM_MEM_AGPLISTS); - temp = temp_next; - } - - if (dev->agp->acquired) - agp_release(dev->agp->agpdev); - drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS); - dev->agp = NULL; - } -#endif - - /* Clear vma list (only built for debugging) */ - if (dev->vmalist) { - for (vma = dev->vmalist; vma; vma = vma_next) { - vma_next = vma->next; - drm_free(vma, sizeof(*vma), DRM_MEM_VMAS); - } - dev->vmalist = NULL; - } - - /* Clear map area and mtrr information */ - if (dev->maplist) { - for (i = 0; i < dev->map_count; i++) { - map = dev->maplist[i]; - switch (map->type) { - case _DRM_REGISTERS: - case _DRM_FRAME_BUFFER: -#ifdef CONFIG_MTRR - if (map->mtrr >= 0) { - int retcode; - retcode = mtrr_del(map->mtrr, - map->offset, - map->size); - DRM_DEBUG("mtrr_del = %d\n", retcode); - } -#endif - drm_ioremapfree(map->handle, map->size); - break; - case _DRM_SHM: - drm_free_pages((unsigned long)map->handle, - drm_order(map->size) - - PAGE_SHIFT, - DRM_MEM_SAREA); - break; - case _DRM_AGP: - break; /* XXX */ - } - drm_free(map, sizeof(*map), DRM_MEM_MAPS); - } - drm_free(dev->maplist, - dev->map_count * sizeof(*dev->maplist), - DRM_MEM_MAPS); - dev->maplist = NULL; - dev->map_count = 0; - } - - if (dev->lock.hw_lock) { - dev->lock.hw_lock = NULL; /* SHM removed */ - dev->lock.pid = 0; - wakeup(&dev->lock.lock_queue); - } - lockmgr(&dev->dev_lock, LK_RELEASE, 0, curproc); - - return 0; -} - -/* tdfx_init is called via tdfx_attach at module load time, */ - -static int -tdfx_init(device_t nbdev) -{ - drm_device_t *dev = device_get_softc(nbdev); - int retcode; - - DRM_DEBUG("\n"); - - memset((void *)dev, 0, sizeof(*dev)); - simple_lock_init(&dev->count_lock); - lockinit(&dev->dev_lock, PZERO, "drmlk", 0, 0); - -#if 0 - drm_parse_options(tdfx); -#endif - - dev->device = nbdev; - dev->devnode = make_dev(&tdfx_cdevsw, - device_get_unit(nbdev), - DRM_DEV_UID, - DRM_DEV_GID, - DRM_DEV_MODE, - TDFX_NAME); - dev->name = TDFX_NAME; - - drm_mem_init(); - drm_sysctl_init(dev); - TAILQ_INIT(&dev->files); - -#ifdef DRM_AGP - dev->agp = drm_agp_init(); -#endif - if((retcode = drm_ctxbitmap_init(dev))) { - DRM_ERROR("Cannot allocate memory for context bitmap.\n"); - drm_sysctl_cleanup(dev); - tdfx_takedown(dev); - return retcode; - } - - DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n", - TDFX_NAME, - TDFX_MAJOR, - TDFX_MINOR, - TDFX_PATCHLEVEL, - TDFX_DATE, - device_get_unit(nbdev)); - - return 0; -} - -/* tdfx_cleanup is called via tdfx_detach at module unload time. */ - -static void -tdfx_cleanup(device_t nbdev) -{ - drm_device_t *dev = device_get_softc(nbdev); - - DRM_DEBUG("\n"); - - drm_sysctl_cleanup(dev); - destroy_dev(dev->devnode); - - DRM_INFO("Module unloaded\n"); - - drm_ctxbitmap_cleanup(dev); - tdfx_takedown(dev); -} - -static int -tdfx_version(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_version_t version; - int len; - - version = *(drm_version_t *) data; - -#define DRM_COPY(name,value) \ - len = strlen(value); \ - if (len > name##_len) len = name##_len; \ - name##_len = strlen(value); \ - if (len && name) { \ - int error = copyout(value, name, len); \ - if (error) return error; \ - } - - version.version_major = TDFX_MAJOR; - version.version_minor = TDFX_MINOR; - version.version_patchlevel = TDFX_PATCHLEVEL; - - DRM_COPY(version.name, TDFX_NAME); - DRM_COPY(version.date, TDFX_DATE); - DRM_COPY(version.desc, TDFX_DESC); - - *(drm_version_t *) data = version; - return 0; -} - -static int -tdfx_open(dev_t kdev, int flags, int fmt, struct proc *p) -{ - drm_device_t *dev = TDFX_SOFTC(minor(kdev)); - int retcode = 0; - - DRM_DEBUG("open_count = %d\n", dev->open_count); - - device_busy(dev->device); - if (!(retcode = drm_open_helper(kdev, flags, fmt, p, dev))) { - atomic_inc(&dev->total_open); - simple_lock(&dev->count_lock); - if (!dev->open_count++) { - simple_unlock(&dev->count_lock); - retcode = tdfx_setup(dev); - } - simple_unlock(&dev->count_lock); - } - device_unbusy(dev->device); - - return retcode; -} - -static int -tdfx_close(dev_t kdev, int flags, int fmt, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - int retcode = 0; - - DRM_DEBUG("open_count = %d\n", dev->open_count); - if (!(retcode = drm_close(kdev, flags, fmt, p))) { - atomic_inc(&dev->total_close); - simple_lock(&dev->count_lock); - if (!--dev->open_count) { - if (atomic_read(&dev->ioctl_count) || dev->blocked) { - DRM_ERROR("Device busy: %d %d\n", - atomic_read(&dev->ioctl_count), - dev->blocked); - simple_unlock(&dev->count_lock); - return EBUSY; - } - simple_unlock(&dev->count_lock); - device_unbusy(dev->device); - return tdfx_takedown(dev); - } - simple_unlock(&dev->count_lock); - } - - return retcode; -} - -/* tdfx_ioctl is called whenever a process performs an ioctl on /dev/drm. */ - -static int -tdfx_ioctl(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - int nr = DRM_IOCTL_NR(cmd); - drm_device_t *dev = kdev->si_drv1; - drm_file_t *priv; - int retcode = 0; - drm_ioctl_desc_t *ioctl; - d_ioctl_t *func; - - DRM_DEBUG("dev=%p\n", dev); - priv = drm_find_file_by_proc(dev, p); - if (!priv) { - DRM_DEBUG("can't find authenticator\n"); - return EINVAL; - } - - atomic_inc(&dev->ioctl_count); - atomic_inc(&dev->total_ioctl); - ++priv->ioctl_count; - - DRM_DEBUG("pid = %d, cmd = 0x%02lx, nr = 0x%02x, auth = %d\n", - p->p_pid, cmd, nr, priv->authenticated); - - switch (cmd) { - case FIONBIO: - atomic_dec(&dev->ioctl_count); - return 0; - - case FIOASYNC: - atomic_dec(&dev->ioctl_count); - dev->flags |= FASYNC; - return 0; - - case FIOSETOWN: - atomic_dec(&dev->ioctl_count); - return fsetown(*(int *)data, &dev->buf_sigio); - - case FIOGETOWN: - atomic_dec(&dev->ioctl_count); - *(int *) data = fgetown(dev->buf_sigio); - return 0; - } - - if (nr >= TDFX_IOCTL_COUNT) { - retcode = EINVAL; - } else { - ioctl = &tdfx_ioctls[nr]; - func = ioctl->func; - - if (!func) { - DRM_DEBUG("no function\n"); - retcode = EINVAL; - } else if ((ioctl->root_only && suser(p)) - || (ioctl->auth_needed && !priv->authenticated)) { - retcode = EACCES; - } else { - retcode = (func)(kdev, cmd, data, flags, p); - } - } - - atomic_dec(&dev->ioctl_count); - return retcode; -} - -static int -tdfx_lock(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - int ret = 0; - drm_lock_t lock; -#if DRM_DMA_HISTOGRAM - - getnanotime(&dev->lck_start); -#endif +#include "tdfx.h" +#include "drmP.h" - lock = *(drm_lock_t *) data; +#define DRIVER_AUTHOR "VA Linux Systems Inc." - if (lock.context == DRM_KERNEL_CONTEXT) { - DRM_ERROR("Process %d using kernel context %d\n", - p->p_pid, lock.context); - return EINVAL; - } +#define DRIVER_NAME "tdfx" +#define DRIVER_DESC "3dfx Banshee/Voodoo3+" +#define DRIVER_DATE "20010216" - DRM_DEBUG("%d (pid %d) requests lock (0x%08x), flags = 0x%08x\n", - lock.context, p->p_pid, dev->lock.hw_lock->lock, - lock.flags); +#define DRIVER_MAJOR 1 +#define DRIVER_MINOR 0 +#define DRIVER_PATCHLEVEL 0 -#if 0 - /* dev->queue_count == 0 right now for - tdfx. FIXME? */ - if (lock.context < 0 || lock.context >= dev->queue_count) - return EINVAL; +#ifndef PCI_VENDOR_ID_3DFX +#define PCI_VENDOR_ID_3DFX 0x121A #endif - - if (!ret) { -#if 0 - if (_DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) - != lock.context) { - long j = ticks - dev->lock.lock_time; - - if (lock.context == tdfx_res_ctx.handle && - j >= 0 && j < DRM_LOCK_SLICE) { - /* Can't take lock if we just had it and - there is contention. */ - DRM_DEBUG("%d (pid %d) delayed j=%d dev=%d ticks=%d\n", - lock.context, p->p_pid, j, - dev->lock.lock_time, ticks); - ret = tsleep(&never, PZERO|PCATCH, "drmlk1", - DRM_LOCK_SLICE - j); - if (ret) - return ret; - DRM_DEBUG("ticks=%d\n", ticks); - } - } +#ifndef PCI_DEVICE_ID_3DFX_VOODOO5 +#define PCI_DEVICE_ID_3DFX_VOODOO5 0x0009 #endif - for (;;) { - if (!dev->lock.hw_lock) { - /* Device has been unregistered */ - ret = EINTR; - break; - } - if (drm_lock_take(&dev->lock.hw_lock->lock, - lock.context)) { - dev->lock.pid = p->p_pid; - dev->lock.lock_time = ticks; - atomic_inc(&dev->total_locks); - break; /* Got lock */ - } - - /* Contention */ - atomic_inc(&dev->total_sleeps); - ret = tsleep(&dev->lock.lock_queue, - PZERO|PCATCH, - "drmlk2", - 0); - if (ret) - break; - } - } - -#if 0 - if (!ret && dev->last_context != lock.context && - lock.context != tdfx_res_ctx.handle && - dev->last_context != tdfx_res_ctx.handle) { - add_wait_queue(&dev->context_wait, &entry); - current->state = TASK_INTERRUPTIBLE; - /* PRE: dev->last_context != lock.context */ - tdfx_context_switch(dev, dev->last_context, lock.context); - /* POST: we will wait for the context - switch and will dispatch on a later call - when dev->last_context == lock.context - NOTE WE HOLD THE LOCK THROUGHOUT THIS - TIME! */ - current->policy |= SCHED_YIELD; - schedule(); - current->state = TASK_RUNNING; - remove_wait_queue(&dev->context_wait, &entry); - if (signal_pending(current)) { - ret = EINTR; - } else if (dev->last_context != lock.context) { - DRM_ERROR("Context mismatch: %d %d\n", - dev->last_context, lock.context); - } - } +#ifndef PCI_DEVICE_ID_3DFX_VOODOO4 +#define PCI_DEVICE_ID_3DFX_VOODOO4 0x0007 #endif - - if (!ret) { - if (lock.flags & _DRM_LOCK_READY) { - /* Wait for space in DMA/FIFO */ - } - if (lock.flags & _DRM_LOCK_QUIESCENT) { - /* Make hardware quiescent */ -#if 0 - tdfx_quiescent(dev); +#ifndef PCI_DEVICE_ID_3DFX_VOODOO3_3000 /* Voodoo3 3000 */ +#define PCI_DEVICE_ID_3DFX_VOODOO3_3000 0x0005 #endif - } - } - -#if 0 - DRM_ERROR("pid = %5d, old counter = %5ld\n", - p->p_pid, current->counter); +#ifndef PCI_DEVICE_ID_3DFX_VOODOO3_2000 /* Voodoo3 3000 */ +#define PCI_DEVICE_ID_3DFX_VOODOO3_2000 0x0004 #endif -#if 0 - while (current->counter > 25) - current->counter >>= 1; /* decrease time slice */ - DRM_ERROR("pid = %5d, new counter = %5ld\n", - p->p_pid, current->counter); +#ifndef PCI_DEVICE_ID_3DFX_BANSHEE +#define PCI_DEVICE_ID_3DFX_BANSHEE 0x0003 #endif - DRM_DEBUG("%d %s\n", lock.context, ret ? "interrupted" : "has lock"); -#if DRM_DMA_HISTOGRAM - { - struct timespec ts; - getnanotime(&ts); - timespecsub(&ts, &dev->lck_start); - atomic_inc(&dev->histo.lhld[drm_histogram_slot(&ts)]); - } -#endif - - return ret; -} +/* List acquired from http://www.yourvote.com/pci/pcihdr.h and xc/xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h + * Please report to anholt@teleport.com inaccuracies or if a chip you have works that is marked unsupported here. + */ +drm_chipinfo_t DRM(devicelist)[] = { + {0x121a, 0x0003, 1, "3dfx Voodoo Banshee"}, + {0x121a, 0x0004, 1, "3dfx Voodoo3 2000"}, + {0x121a, 0x0005, 1, "3dfx Voodoo3 3000"}, + {0x121a, 0x0007, 1, "3dfx Voodoo4"}, + {0x121a, 0x0009, 1, "3dfx Voodoo5"}, + {0, 0, 0, NULL} +}; -static int -tdfx_unlock(dev_t kdev, u_long cmd, caddr_t data, int flags, struct proc *p) -{ - drm_device_t *dev = kdev->si_drv1; - drm_lock_t lock; +#include "drm_auth.h" +#include "drm_bufs.h" +#include "drm_context.h" +#include "drm_dma.h" +#include "drm_drawable.h" +#include "drm_drv.h" - lock = *(drm_lock_t *) data; - - if (lock.context == DRM_KERNEL_CONTEXT) { - DRM_ERROR("Process %d using kernel context %d\n", - p->p_pid, lock.context); - return EINVAL; - } - DRM_DEBUG("%d frees lock (%d holds)\n", - lock.context, - _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); - atomic_inc(&dev->total_unlocks); - if (_DRM_LOCK_IS_CONT(dev->lock.hw_lock->lock)) - atomic_inc(&dev->total_contends); - drm_lock_transfer(dev, &dev->lock.hw_lock->lock, DRM_KERNEL_CONTEXT); - /* FIXME: Try to send data to card here */ - if (!dev->context_flag) { - if (drm_lock_free(dev, &dev->lock.hw_lock->lock, - DRM_KERNEL_CONTEXT)) { - DRM_ERROR("\n"); - } - } +#include "drm_fops.h" +#include "drm_init.h" +#include "drm_ioctl.h" +#include "drm_lock.h" +#include "drm_memory.h" +#include "drm_vm.h" +#include "drm_sysctl.h" - return 0; -} +DRIVER_MODULE(tdfx, pci, tdfx_driver, tdfx_devclass, 0, 0); diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/tdfx_drv.h b/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/tdfx_drv.h deleted file mode 100644 index 5b27e0521..000000000 --- a/xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/tdfx/tdfx_drv.h +++ /dev/null @@ -1,45 +0,0 @@ -/* tdfx_drv.h -- Private header for tdfx driver -*- c -*- - * Created: Thu Oct 7 10:40:04 1999 by faith@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 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 - * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL - * PRECISION INSIGHT AND/OR ITS 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. - * - * - */ - -#ifndef _TDFX_DRV_H_ -#define _TDFX_DRV_H_ - - /* tdfx_context.c */ - -extern d_ioctl_t tdfx_resctx; -extern d_ioctl_t tdfx_addctx; -extern d_ioctl_t tdfx_modctx; -extern d_ioctl_t tdfx_getctx; -extern d_ioctl_t tdfx_switchctx; -extern d_ioctl_t tdfx_newctx; -extern d_ioctl_t tdfx_rmctx; - -extern int tdfx_context_switch(drm_device_t *dev, int old, int new); -extern int tdfx_context_switch_complete(drm_device_t *dev, int new); -#endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.c b/xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.c index b1dfcc685..27e44d6c9 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.c,v 1.49 2001/05/21 03:45:31 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.c,v 1.51 2001/10/28 03:34:00 tsi Exp $ */ /* * Pci.c - New server PCI access functions * @@ -24,7 +24,7 @@ * pciBusAddrToHostAddr() - Convert a PCI address to a host address * pciHostAddrToBusAddr() - Convert a host address to a PCI address * pciGetBaseSize - Returns the number of bits in a PCI base addr mapping - * xf86MapPciMem() - Like xf86MapVidMem() expect function expects + * xf86MapPciMem() - Like xf86MapVidMem() except function expects * a PCI address and PCITAG (identifies PCI domain) * xf86ReadPciBIOS() - Like xf86ReadBIOS, except that it handles PCI/host * address translation and BIOS decode enabling. @@ -60,9 +60,6 @@ * Of course, if you choose not to use one of the generic * functions, you will need to provide a platform specifc replacement. * - * See xc/programs/Xserver/hw/xfree86/os-support/pmax/pmax_pci.c for an example - * of how to extend this framework to other platforms/OSes. - * * Gary Barton * Concurrent Computer Corporation * garyb@gate.net @@ -211,9 +208,6 @@ int pciNumBuses = 0; /* Actual number of PCI buses */ static Bool inProbe = FALSE; static pciConfigPtr pci_devp[MAX_PCI_DEVICES + 1] = {NULL, }; -#ifdef INCLUDE_LOCKPCI -static pciConfigPtr pci_locked_devp[MAX_PCI_DEVICES + 1] = {NULL, }; -#endif /* * Platform specific PCI function pointers. @@ -255,10 +249,9 @@ PCITAG pciFindFirst(CARD32 id, CARD32 mask) { #ifdef DEBUGPCI -ErrorF("pciFindFirst(0x%lx, 0x%lx), pciInit = %d\n", id, mask, pciInitialized); + ErrorF("pciFindFirst(0x%lx, 0x%lx), pciInit = %d\n", id, mask, pciInitialized); #endif - if (!pciInitialized) - pciInit(); + pciInit(); pciDevid = id & mask; pciDevidMask = mask; @@ -270,10 +263,9 @@ PCITAG pciFindNext(void) { #ifdef DEBUGPCI -ErrorF("pciFindNext(), pciInit = %d\n", pciInitialized); + ErrorF("pciFindNext(), pciInit = %d\n", pciInitialized); #endif - if (!pciInitialized) - pciInit(); + pciInit(); return((*pciFindNextFP)()); } @@ -284,10 +276,9 @@ pciReadLong(PCITAG tag, int offset) int bus = PCI_BUS_FROM_TAG(tag); #ifdef DEBUGPCI -ErrorF("pciReadLong(0x%lx, %d)\n", tag, offset); + ErrorF("pciReadLong(0x%lx, %d)\n", tag, offset); #endif - if (!pciInitialized) - pciInit(); + pciInit(); if ((bus < pciNumBuses || inProbe) && pciBusInfo[bus] && pciBusInfo[bus]->funcs.pciReadLong) { @@ -334,8 +325,7 @@ pciWriteLong(PCITAG tag, int offset, CARD32 val) { int bus = PCI_BUS_FROM_TAG(tag); - if (!pciInitialized) - pciInit(); + pciInit(); if (bus < pciNumBuses && pciBusInfo[bus] && pciBusInfo[bus]->funcs.pciWriteLong) @@ -384,8 +374,7 @@ pciSetBitsLong(PCITAG tag, int offset, CARD32 mask, CARD32 val) #ifdef DEBUGPCI ErrorF("pciReadLong(0x%lx, %d)\n", tag, offset); #endif - if (!pciInitialized) - pciInit(); + pciInit(); if (bus < pciNumBuses && pciBusInfo[bus] && pciBusInfo[bus]->funcs.pciReadLong) { @@ -411,8 +400,7 @@ pciLongFunc(PCITAG tag, pciFunc func) { int bus = PCI_BUS_FROM_TAG(tag); - if (!pciInitialized) - pciInit(); + pciInit(); if (bus > pciNumBuses || !pciBusInfo[bus] || !pciBusInfo[bus]->funcs.pciReadLong) return NULL; @@ -433,8 +421,7 @@ pciBusAddrToHostAddr(PCITAG tag, PciAddrType type, ADDRESS addr) { int bus = PCI_BUS_FROM_TAG(tag); - if (!pciInitialized) - pciInit(); + pciInit(); if (bus < pciNumBuses && pciBusInfo[bus] && pciBusInfo[bus]->funcs.pciAddrBusToHost) @@ -448,8 +435,7 @@ pciHostAddrToBusAddr(PCITAG tag, PciAddrType type, ADDRESS addr) { int bus = PCI_BUS_FROM_TAG(tag); - if (!pciInitialized) - pciInit(); + pciInit(); if (bus < pciNumBuses && pciBusInfo[bus] && pciBusInfo[bus]->funcs.pciAddrHostToBus) @@ -494,8 +480,7 @@ pciGetBaseSize(PCITAG tag, int index, Bool destructive, Bool *min) if (index < 0 || index > 6) return 0; - if (!pciInitialized) - pciInit(); + pciInit(); if (xf86GetPciSizeFromOS(tag, index, &bits)) { if (min) @@ -629,8 +614,10 @@ PCITAG pciGenFindNext(void) { unsigned long devid, tmp; - unsigned char base_class, sub_class, sec_bus, pri_bus; + unsigned int sec_bus, pri_bus; + static int previousBus = 0; Bool speculativeProbe = FALSE; + unsigned char base_class, sub_class; #ifdef DEBUGPCI ErrorF("pciGenFindNext\n"); @@ -648,7 +635,8 @@ pciGenFindNext(void) if (pciNumBuses == 0) return(PCI_NOT_FOUND); - pciBusNum = 0; + /* Skip ahead to the first bus defined by pciInit() */ + for (pciBusNum = 0; !pciBusInfo[pciBusNum]; ++pciBusNum); pciFuncNum = 0; pciDevNum = 0; } else { @@ -664,7 +652,7 @@ pciGenFindNext(void) /* * Is current dev a multifunction device? */ - if (pciMfDev(pciBusNum, pciDevNum)) + if (!speculativeProbe && pciMfDev(pciBusNum, pciDevNum)) /* Probe for other functions */ pciFuncNum = 1; else @@ -713,7 +701,7 @@ pciGenFindNext(void) #endif if (!pciBusInfo[pciBusNum]) { pciBusInfo[pciBusNum] = xnfalloc(sizeof(pciBusInfo_t)); - *pciBusInfo[pciBusNum] = *pciBusInfo[0]; + *pciBusInfo[pciBusNum] = *pciBusInfo[previousBus]; speculativeProbe = TRUE; } @@ -733,13 +721,15 @@ pciGenFindNext(void) #ifdef DEBUGPCI ErrorF("pciGenFindNext: pciDeviceTag = 0x%lx, devid = 0x%lx\n", pciDeviceTag, devid); #endif - if (devid == 0xffffffff) + if ((devid == 0xffffffff) || (devid == 0x00000000) || + (devid == 0xffff0000) || (devid == 0x0000ffff)) continue; /* Nobody home. Next device please */ - if (speculativeProbe && (pciNumBuses <= pciBusNum)) + if (pciNumBuses <= pciBusNum) pciNumBuses = pciBusNum + 1; speculativeProbe = FALSE; + previousBus = pciBusNum; /* * Before checking for a specific devid, look for enabled @@ -827,7 +817,7 @@ pciCfgMech1Read(PCITAG tag, int offset) rv = inl(0xCFC); #if defined(__powerpc__) - signal(SIGBUS,SIG_DFL); + signal(SIGBUS, SIG_DFL); if (buserr_detected) return(0xffffffff); else @@ -870,7 +860,7 @@ pciCfgMech1SetBits(PCITAG tag, int offset, CARD32 mask, CARD32 val) outl(0xCFC, rv); #if defined(__powerpc__) - signal(SIGBUS,SIG_DFL); + signal(SIGBUS, SIG_DFL); #endif } @@ -926,8 +916,9 @@ pciAddrNOOP(PCITAG tag, PciAddrType type, ADDRESS addr) pciConfigPtr * xf86scanpci(int flags) { - int idx = 0; - PCITAG tag; + pciConfigPtr devp; + int idx = 0; + PCITAG tag; if (pci_devp[0]) return pci_devp; @@ -940,65 +931,99 @@ xf86scanpci(int flags) return NULL; #ifdef DEBUGPCI -ErrorF("xf86scanpci: tag = 0x%lx\n", tag); + ErrorF("xf86scanpci: tag = 0x%lx\n", tag); #endif #ifndef OLD_FORMAT xf86MsgVerb(X_INFO, 2, "PCI: PCI scan (all values are in hex)\n"); #endif + while (idx < MAX_PCI_DEVICES && tag != PCI_NOT_FOUND) { - pciConfigPtr devp; - int i; - - devp = xalloc(sizeof(pciDevice)); - if (!devp) { - xf86Msg(X_ERROR, - "xf86scanpci: Out of memory after %d devices!!\n", - idx); - return (pciConfigPtr *)NULL; - } + int i; + + devp = xalloc(sizeof(pciDevice)); + if (!devp) { + xf86Msg(X_ERROR, + "xf86scanpci: Out of memory after %d devices!!\n", idx); + return (pciConfigPtr *)NULL; + } + + /* Identify pci device by bus, dev, func, and tag */ + devp->tag = tag; + devp->busnum = PCI_BUS_FROM_TAG(tag); + devp->devnum = PCI_DEV_FROM_TAG(tag); + devp->funcnum = PCI_FUNC_FROM_TAG(tag); - /* Identify pci device by bus, dev, func, and tag */ - devp->tag = tag; - devp->busnum = PCI_BUS_FROM_TAG(tag); - devp->devnum = PCI_DEV_FROM_TAG(tag); - devp->funcnum = PCI_FUNC_FROM_TAG(tag); - - /* Read config space for this device */ - for (i = 0; i < 17; i++) /* PCI hdr plus 1st dev spec dword */ - devp->cfgspc.dwords[i] = - pciReadLong(tag, i * sizeof(CARD32)); + /* Read config space for this device */ + for (i = 0; i < 17; i++) /* PCI hdr plus 1st dev spec dword */ + devp->cfgspc.dwords[i] = pciReadLong(tag, i * sizeof(CARD32)); + switch (devp->pci_header_type & 0x7f) { + case 0: /* Get base address sizes for type 0 headers */ - if ((devp->pci_header_type & 0x7f) == 0) - for (i = 0; i < 7; i++) - devp->basesize[i] = pciGetBaseSize(tag, i, FALSE, - &devp->minBasesize); - devp->listed_class = 0; + for (i = 0; i < 7; i++) + devp->basesize[i] = + pciGetBaseSize(tag, i, FALSE, &devp->minBasesize); + break; + + case 1: + /* Allow master aborts to complete normally on secondary buses */ + if (!(devp->pci_bridge_control & PCI_PCI_BRIDGE_MASTER_ABORT_EN)) + break; + pciWriteByte(tag, PCI_PCI_BRIDGE_CONTROL_REG, + devp->pci_bridge_control & ~PCI_PCI_BRIDGE_MASTER_ABORT_EN); + break; + + default: + break; + } + + devp->listed_class = 0; #ifdef OLD_FORMAT - xf86MsgVerb(X_INFO, 2, "PCI: BusID 0x%02x,0x%02x,0x%1x " - "ID 0x%04x,0x%04x Rev 0x%02x Class 0x%02x,0x%02x\n", - devp->busnum, devp->devnum, devp->funcnum, - devp->pci_vendor, devp->pci_device, devp->pci_rev_id, - devp->pci_base_class, devp->pci_sub_class); + xf86MsgVerb(X_INFO, 2, "PCI: BusID 0x%.2x,0x%02x,0x%1x " + "ID 0x%04x,0x%04x Rev 0x%02x Class 0x%02x,0x%02x\n", + devp->busnum, devp->devnum, devp->funcnum, + devp->pci_vendor, devp->pci_device, devp->pci_rev_id, + devp->pci_base_class, devp->pci_sub_class); #else - xf86MsgVerb(X_INFO, 2, "PCI: %02x:%02x:%1x: chip %04x,%04x" - " card %04x,%04x rev %02x class %02x,%02x,%02x" - " hdr %02x\n", - devp->busnum, devp->devnum, devp->funcnum, - devp->pci_vendor, devp->pci_device, - devp->pci_subsys_vendor, devp->pci_subsys_card, - devp->pci_rev_id, devp->pci_base_class, - devp->pci_sub_class, devp->pci_prog_if, - devp->pci_header_type); + xf86MsgVerb(X_INFO, 2, "PCI: %.2x:%02x:%1x: chip %04x,%04x" + " card %04x,%04x rev %02x class %02x,%02x,%02x hdr %02x\n", + devp->busnum, devp->devnum, devp->funcnum, + devp->pci_vendor, devp->pci_device, + devp->pci_subsys_vendor, devp->pci_subsys_card, + devp->pci_rev_id, devp->pci_base_class, + devp->pci_sub_class, devp->pci_prog_if, + devp->pci_header_type); #endif - pci_devp[idx++] = devp; - tag = pciFindNext(); + pci_devp[idx++] = devp; + tag = pciFindNext(); + #ifdef DEBUGPCI -ErrorF("xf86scanpci: tag = pciFindNext = 0x%lx\n", tag); + ErrorF("xf86scanpci: tag = pciFindNext = 0x%lx\n", tag); #endif + + } + + /* Restore modified data (in reverse order) */ + while (--idx >= 0) { + devp = pci_devp[idx]; + switch (devp->pci_header_type & 0x7f) { + case 0: + break; + + case 1: + if (!(devp->pci_bridge_control & PCI_PCI_BRIDGE_MASTER_ABORT_EN)) + break; + pciWriteByte(devp->tag, PCI_PCI_BRIDGE_CONTROL_REG, + devp->pci_bridge_control); + break; + + default: + break; + } } + #ifndef OLD_FORMAT xf86MsgVerb(X_INFO, 2, "PCI: End of PCI scan\n"); #endif @@ -1050,18 +1075,14 @@ xf86MapPciMem(int ScreenNum, int Flags, PCITAG Tag, ADDRESS Base, } static int -readPciBIOS(unsigned long Offset, PCITAG Tag, int basereg, - unsigned char *Buf, int Len) +handlePciBIOS(PCITAG Tag, int basereg, int (*func)(CARD8*,ADDRESS,pointer), pointer args) { CARD32 romsave = 0; int i; romBaseSource b_reg; ADDRESS hostbase; CARD8 tmp[64]; - CARD8 *image; - - unsigned long offset; - int ret, length, len, rlength; + int ret = 0; romsave = pciReadLong(Tag, PCI_MAP_ROM_REG); @@ -1084,7 +1105,7 @@ readPciBIOS(unsigned long Offset, PCITAG Tag, int basereg, /* if we use a mem base save it and move it out of the way */ if (b_reg >= 0 && b_reg <= 5) { - savebase = pciReadLong(Tag, PCI_MAP_REG_START+(basereg<<2)); + savebase = pciReadLong(Tag, PCI_MAP_REG_START+(b_reg<<2)); xf86MsgVerb(X_INFO,5,"xf86ReadPciBios: modifying membase[%i]" " for device %i:%i:%i\n", basereg, PCI_BUS_FROM_TAG(Tag), PCI_DEV_FROM_TAG(Tag), @@ -1105,52 +1126,19 @@ readPciBIOS(unsigned long Offset, PCITAG Tag, int basereg, /* Restore the base register if it was changed. */ if (savebase) pciWriteLong(Tag, PCI_MAP_REG_START + (b_reg << 2), (CARD32) savebase); + /* No BIOS found: try another address */ continue; } -#if 0 - /* - * Currently this is only good for PC style BIOSes. - * This code needs to be revistited after 4.1 is out. - * We need to pass an argument for the BIOS type to - * look for. Then we can pick the correct BIOS. - * Combine this with the code in int10/pci.c. - */ - if ((Offset) > (tmp[2] << 9)) { - xf86Msg(X_WARNING,"xf86ReadPciBios: requesting data past " - "end of BIOS %i > %i\n",(Offset) , (tmp[2] << 9)); - } else { - if ((Offset + Len) > (tmp[2] << 9)) { - Len = (tmp[2] << 9) - Offset; - xf86Msg(X_INFO,"Truncating PCI BIOS Length to %i\n",Len); - } - } -#endif + ret = func(tmp,hostbase,args); - /* Read BIOS in 64kB chunks */ - ret = 0; - offset = Offset; - image = Buf; - len = Len; - while ((length = len) > 0) { - if (length > 0x10000) length = 0x10000; - rlength = xf86ReadBIOS(hostbase, offset, image, length); - if (rlength < 0) { - ret = rlength; - break; - } - ret += rlength; - if (rlength < length) break; - offset += length; - image += length; - len -= length; - } /* Restore the base register if it was changed. */ if (savebase) pciWriteLong(Tag, PCI_MAP_REG_START + (b_reg << 2), (CARD32) savebase); /* Restore ROM address decoding */ pciWriteLong(Tag, PCI_MAP_ROM_REG, romsave); + return ret; } @@ -1159,134 +1147,176 @@ readPciBIOS(unsigned long Offset, PCITAG Tag, int basereg, return 0; } -#if 0 +typedef struct { + unsigned long Offset; + int Len; + unsigned char *Buf; + PciBiosType BiosType; +} readBios, *readBiosPtr; + static int -readPciBIOS(unsigned long Offset, PCITAG Tag, int basereg, - unsigned char *Buf, int Len) -{ - ADDRESS hostbase; - CARD8 *image = Buf; +readPciBios(CARD8* tmp, ADDRESS hostbase, pointer args) +{ + CARD8 *image; + unsigned int image_length = 0; + readBiosPtr rd = args; unsigned long offset; - CARD32 romaddr, savebase = 0, romsave = 0, newbase = 0; - int ret, tmpLen, length, rlength, n; - /* XXX This assumes that memory access is enabled */ + int ret, length, len, rlength; - /* - * Check if the rom base address is assigned. If it isn't, and if - * a basereg was supplied, temporarily map the rom at that base - * address. - */ - romsave = pciReadLong(Tag, PCI_MAP_ROM_REG); - romaddr = PCIGETROM(romsave); - if ((newbase = getValidBIOSBase(Tag, &basereg)) != romaddr) { -RetryWithBase: - romaddr = PCIGETROM(newbase); - if (romaddr) { - /* move mem base out of the way if in conflicts with ROM */ - if ((basereg >= 0) && (basereg <= 5)) { - if (!savebase) - savebase = pciReadLong(Tag, PCI_MAP_REG_START+(basereg<<2)); - if (PCIGETROM(savebase) == romaddr) { - xf86MsgVerb(X_INFO,5,"xf86ReadPciBIOS: modifying membase[%i]" - " for device %i:%i:%i\n", basereg, - PCI_BUS_FROM_TAG(Tag), PCI_DEV_FROM_TAG(Tag), - PCI_FUNC_FROM_TAG(Tag)); - pciWriteLong(Tag, PCI_MAP_REG_START + (basereg << 2), - (CARD32)~0); - } - } - } + /* We found a PCI BIOS Image. Now we look for the correct type */ + while ((tmp[0] == 0x55) && (tmp[1] == 0xAA)) { + unsigned short data_off = tmp[0x18] | (tmp[0x19] << 8); + unsigned char data[0x18]; + unsigned char type; + + if ((xf86ReadBIOS(hostbase + data_off, 0, data, sizeof(data)) + != sizeof(data)) || + (data[0] != 'P') || + (data[1] != 'C') || + (data[2] != 'I') || + (data[3] != 'R')) + break; + type = data[0x14]; +#ifdef PRINT_PCI + ErrorF("data segment in BIOS: 0x%x, type: 0x%x\n", data_off, type); +#endif + if (type != rd->BiosType) { /* not correct image: find next one */ + unsigned char indicator = data[0x15]; + unsigned int i_length; + if (indicator & 0x80) /* last image */ + break; + i_length = (data[0x10] | (data[0x11] << 8)) << 9; +#ifdef PRINT_PCI + ErrorF("data image length: 0x%x, ind: 0x%x\n", + image_length, indicator); +#endif + hostbase += i_length; + if (xf86ReadBIOS(hostbase, 0, tmp, sizeof(tmp)) + != sizeof(tmp)) + break; + continue; } - - - if (romaddr == 0) { - xf86Msg(X_WARNING, "xf86ReadPciBIOS: cannot locate a BIOS address\n"); - return -1; - } - xf86MsgVerb(X_INFO, 5, - "xf86ReadPciBIOS: found ValidBIOSBase for %i:%i:%i: %x\n", - PCI_BUS_FROM_TAG(Tag), PCI_DEV_FROM_TAG(Tag), PCI_FUNC_FROM_TAG(Tag), - newbase); - - hostbase = pciBusAddrToHostAddr(Tag, PCI_MEM, PCIGETROM(romaddr)); - xf86MsgVerb(X_INFO, 5, "ReadPciBIOS: base = 0x%x\n",romaddr); - /* Enable ROM address decoding */ - pciWriteLong(Tag, PCI_MAP_ROM_REG, romaddr | PCI_MAP_ROM_DECODE_ENABLE); - - /* Check to see if we really have a PCI BIOS image */ - rlength = xf86ReadBIOS(hostbase, 0, tmp_buf, sizeof(tmp_buf)); - if (rlength < 0) return rlength; - /* If we found a BIOS image we read the requested data */ - if ((rlength == sizeof(tmp_buf)) && (tmp_buf[0] == 0x55) - && (tmp_buf[1] == 0xaa) && tmp_buf[2] ) { + /* OK, we have a PCI BIOS Image of the correct type */ - /* Read BIOS in 64kB chunks */ - ret = 0; - offset = Offset; - tmpLen = Len; - image = Buf; - - while ((length = tmpLen) > 0) { - if (length > 0x10000) length = 0x10000; - rlength = xf86ReadBIOS(hostbase, offset, image, length); - if (rlength < 0) { - ret = rlength; - break; - } - ret += rlength; - if (rlength < length) break; - offset += length; - image += length; - tmpLen -= length; - } + if (rd->BiosType == PCI_BIOS_PC) + image_length = tmp[2] << 9; + else + image_length = (data[0x10] | (data[0x11] << 8)) << 9; +#ifdef PRINT_PCI + ErrorF("BIOS length: 0x%x\n", image_length); +#endif + break; + } + + ret = 0; + if (image_length) { + + /* + * if no length is given return the full lenght, + * Offset 0. Beware: Area pointed to by Buf must + * be large enough! + */ + if (rd->Len == 0) { + rd->Len = image_length; + rd->Offset = 0; + } + if ((rd->Offset) > (image_length)) { + xf86Msg(X_WARNING,"xf86ReadPciBios: requesting data past " + "end of BIOS %i > %i\n",(rd->Offset) , (image_length)); } else { - /* If we don't have a PCI BIOS image we look further */ - n = 0; - if ((basereg >= 0) && (basereg <= 5) && xf86PciVideoInfo) do { - pciVideoPtr pvp; - - if (!(pvp = xf86PciVideoInfo[n++])) break; - if (pciTag(pvp->bus, pvp->device, pvp->func) == Tag) { - if (newbase == pvp->memBase[basereg]) break; - newbase = pvp->memBase[basereg]; - goto RetryWithBase; - } - } while (1); + if ((rd->Offset + rd->Len) > (image_length)) { + rd->Len = (image_length) - rd->Offset; + xf86MsgVerb(X_INFO,3,"Truncating PCI BIOS Length to %i\n",rd->Len); + } } + + /* Read BIOS in 64kB chunks */ + offset = rd->Offset; + image = rd->Buf; + len = rd->Len; + while ((length = len) > 0) { + if (length > 0x10000) length = 0x10000; + rlength = xf86ReadBIOS(hostbase, offset, image, length); + if (rlength < 0) { + ret = rlength; + break; + } + ret += rlength; + if (rlength < length) break; + offset += length; + image += length; + len -= length; + } + } - /* Restore ROM address decoding */ - pciWriteLong(Tag, PCI_MAP_ROM_REG, romsave); - /* Restore the base register if it was changed. */ - if (savebase) - pciWriteLong(Tag, PCI_MAP_REG_START + (basereg << 2), savebase); - - return ret; + return ret; } + +static int +getPciBIOSTypes(CARD8* tmp, ADDRESS hostbase, pointer arg) +{ + int n = 0; + PciBiosType *Buf = arg; + + /* We found a PCI BIOS Image. Now we collect the types type */ + do { + unsigned short data_off = tmp[0x18] | (tmp[0x19] << 8); + unsigned char data[16]; + unsigned int i_length; + + if ((xf86ReadBIOS(hostbase + data_off, 0, data, sizeof(data)) + != sizeof(data)) || + (data[0] != 'P') || + (data[1] != 'C') || + (data[2] != 'I') || + (data[3] != 'R')) + break; + + if (data[0x14] >= PCI_BIOS_OTHER) + *Buf++ = PCI_BIOS_OTHER; + else + *Buf++ = data[0x14]; + + n++; + if (data[0x15] & 0x80) /* last image */ + break; +#ifdef PRINT_PCI + ErrorF("data segment in BIOS: 0x%x, type: 0x%x\n", data_off, type); +#endif + i_length = (data[0x10] | (data[0x11] << 8)) << 9; +#ifdef PRINT_PCI + ErrorF("data image length: 0x%x, ind: 0x%x\n", + image_length, indicator); #endif + hostbase += i_length; + if (xf86ReadBIOS(hostbase, 0, tmp, sizeof(tmp)) + != sizeof(tmp)) + break; + continue; + } while ((tmp[0] == 0x55) && (tmp[1] == 0xAA)); + return n; +} typedef CARD32 (*ReadProcPtr)(PCITAG, int); typedef void (*WriteProcPtr)(PCITAG, int, CARD32); -int -xf86ReadPciBIOS(unsigned long Offset, PCITAG Tag, int basereg, - unsigned char *Buf, int Len) +static int +HandlePciBios(PCITAG Tag, int basereg, int (*func)(CARD8*,ADDRESS,pointer), pointer ptr) { - int size, num; + int n, num; CARD32 Acc1, Acc2; PCITAG *pTag; int i; - size = readPciBIOS(Offset,Tag,basereg,Buf,Len); + n = handlePciBIOS(Tag,basereg,func,ptr); + if (n) + return n; - if ((size == Len) && (Buf[0] == 0x55) && (Buf[1] == 0xaa) && Buf[2] && - (Len >= (Buf[2] << 9))) - return size; - num = pciTestMultiDeviceCard(PCI_BUS_FROM_TAG(Tag), PCI_DEV_FROM_TAG(Tag), PCI_FUNC_FROM_TAG(Tag),&pTag); - if (!num) return size; + if (!num) return 0; #define PCI_ENA (PCI_CMD_MEM_ENABLE | PCI_CMD_IO_ENABLE) Acc1 = ((ReadProcPtr)(pciLongFunc(Tag,READ)))(Tag,PCI_CMD_STAT_REG); @@ -1297,15 +1327,43 @@ xf86ReadPciBIOS(unsigned long Offset, PCITAG Tag, int basereg, Acc2 = ((ReadProcPtr)(pciLongFunc(pTag[i],READ)))(pTag[i],PCI_CMD_STAT_REG); ((WriteProcPtr)(pciLongFunc(pTag[i],WRITE)))(pTag[i], PCI_CMD_STAT_REG,(Acc2 | PCI_ENA)); - size = readPciBIOS(Offset,pTag[i],0,Buf,Len); + + n = handlePciBIOS(pTag[i],0,func,ptr); + ((WriteProcPtr)(pciLongFunc(pTag[i],WRITE)))(pTag[i],PCI_CMD_STAT_REG,Acc2); - if ((size == Len) && (Buf[0] == 0x55) && (Buf[1] == 0xaa) && Buf[2] && - (Len >= (Buf[2] << 9))) + if (n) break; } ((WriteProcPtr)(pciLongFunc(Tag,WRITE)))(Tag,PCI_CMD_STAT_REG,Acc1); - return size; + return n; } +int +xf86ReadPciBIOS(unsigned long Offset, PCITAG Tag, int basereg, + unsigned char *Buf, int Len) +{ + return xf86ReadPciBIOSByType(Offset, Tag, basereg, Buf, Len, PCI_BIOS_PC); +} + +int +xf86ReadPciBIOSByType(unsigned long Offset, PCITAG Tag, int basereg, + unsigned char *Buf, int Len, PciBiosType Type) +{ + + readBios rb; + rb.Offset = Offset; + rb.Len = Len; + rb.Buf = Buf; + rb.BiosType = Type; + + return HandlePciBios(Tag, basereg, readPciBios, &rb); +} + +int +xf86GetAvailablePciBIOSTypes(PCITAG Tag, int basereg, PciBiosType *Buf) +{ + return HandlePciBios(Tag, basereg, getPciBIOSTypes, (pointer) Buf); +} + #endif /* INCLUDE_XF86_MAP_PCI_MEM */ diff --git a/xc/programs/Xserver/hw/xfree86/os-support/bus/xf86Pci.h b/xc/programs/Xserver/hw/xfree86/os-support/bus/xf86Pci.h index cdf8e7b83..a53932767 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/bus/xf86Pci.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/bus/xf86Pci.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bus/xf86Pci.h,v 1.28 2001/06/12 04:27:15 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bus/xf86Pci.h,v 1.30 2001/10/28 03:34:01 tsi Exp $ */ /* * Copyright 1998 by Concurrent Computer Corporation * @@ -354,7 +354,8 @@ */ /* Primitive Types */ -typedef unsigned long ADDRESS; /* Memory/PCI address */ +typedef unsigned long ADDRESS; /* Memory/PCI address */ +typedef unsigned long IOADDRESS; /* Must be large enough for a pointer */ typedef unsigned long PCITAG; /* @@ -630,6 +631,13 @@ typedef enum { #define pci_user_config_2 cfgspc.regs.devspf.bytes[2] #define pci_user_config_3 cfgspc.regs.devspf.bytes[3] +typedef enum { + PCI_BIOS_PC = 0, + PCI_BIOS_OPEN_FIRMARE, + PCI_BIOS_HP_PA_RISC, + PCI_BIOS_OTHER +} PciBiosType; + /* Public PCI access functions */ void pciInit(void); PCITAG pciFindFirst(CARD32 id, CARD32 mask); @@ -652,13 +660,13 @@ pointer xf86MapPciMem(int ScreenNum, int Flags, PCITAG Tag, ADDRESS Base, unsigned long Size); int xf86ReadPciBIOS(unsigned long Offset, PCITAG Tag, int basereg, unsigned char *Buf, int Len); +int xf86ReadPciBIOSByType(unsigned long Offset, PCITAG Tag, + int basereg, unsigned char *Buf, + int Len, PciBiosType Type); +int xf86GetAvailablePciBIOSTypes(PCITAG Tag, int basereg, + PciBiosType *Buf); pciConfigPtr *xf86scanpci(int flags); -/* Old sytle PCI access functions (for compatibility) */ -#if 0 -void xf86writepci(int, int, int, int, int, CARD32, CARD32); -#endif - extern int pciNumBuses; typedef enum { @@ -674,5 +682,3 @@ typedef enum { } romBaseSource; #endif /* _XF86PCI_H */ - - 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 23d886fe8..36957fabf 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.9 2001/01/19 08:08:41 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/Imakefile,v 1.10 2001/10/04 18:28:22 alanh Exp $ #define IHaveModules #include <Server.tmpl> @@ -22,6 +22,7 @@ MTRR_DEFINES = -DHAS_MTRR_SUPPORT xf86drmR128.c \ xf86drmRadeon.c \ xf86drmSiS.c \ + xf86drmI830.c \ $(MSRC) OBJS = xf86drm.o \ @@ -33,6 +34,7 @@ MTRR_DEFINES = -DHAS_MTRR_SUPPORT xf86drmR128.o \ xf86drmRadeon.o \ xf86drmSiS.o \ + xf86drmI830.o \ $(MOBJ) INCLUDES = -I$(XF86COMSRC) -I$(XF86OSSRC) -I. -I$(SERVERSRC)/include \ diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Config.in b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Config.in index 4936c6b3f..5cc13e84d 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Config.in +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Config.in @@ -1,5 +1,5 @@ # -# drm device configuration +# Drm device configuration # # This driver provides support for the # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. @@ -12,5 +12,6 @@ if [ "$CONFIG_DRM" != "n" ]; then tristate ' ATI Rage 128' CONFIG_DRM_R128 dep_tristate ' ATI Radeon' CONFIG_DRM_RADEON $CONFIG_AGP dep_tristate ' Intel I810' CONFIG_DRM_I810 $CONFIG_AGP + dep_tristate ' Intel 830M' CONFIG_DRM_I830 $CONFIG_AGP dep_tristate ' Matrox g200/g400' CONFIG_DRM_MGA $CONFIG_AGP fi diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Makefile.kernel b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Makefile.kernel index e2630989e..1060d4cba 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Makefile.kernel +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/Makefile.kernel @@ -3,13 +3,14 @@ # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. O_TARGET := drm.o -list-multi := gamma.o tdfx.o r128.o mga.o i810.o ffb.o radeon.o +list-multi := gamma.o tdfx.o r128.o mga.o i810.o i830.o ffb.o radeon.o gamma-objs := gamma_drv.o gamma_dma.o tdfx-objs := tdfx_drv.o r128-objs := r128_drv.o r128_cce.o r128_state.o mga-objs := mga_drv.o mga_dma.o mga_state.o mga_warp.o i810-objs := i810_drv.o i810_dma.o +i830-objs := i830_drv.o i830_dma.o radeon-objs := radeon_drv.o radeon_cp.o radeon_state.o ffb-objs := ffb_drv.o ffb_context.o @@ -19,6 +20,7 @@ obj-$(CONFIG_DRM_R128) += r128.o obj-$(CONFIG_DRM_RADEON)+= radeon.o obj-$(CONFIG_DRM_MGA) += mga.o obj-$(CONFIG_DRM_I810) += i810.o +obj-$(CONFIG_DRM_I830) += i830.o obj-$(CONFIG_DRM_FFB) += ffb.o include $(TOPDIR)/Rules.make @@ -35,6 +37,9 @@ mga.o: $(mga-objs) $(lib) i810.o: $(i810-objs) $(lib) $(LD) -r -o $@ $(i810-objs) $(lib) +i830.o: $(i830-objs) $(lib) + $(LD) -r -o $@ $(i830-objs) $(lib) + r128.o: $(r128-objs) $(lib) $(LD) -r -o $@ $(r128-objs) $(lib) 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 d68057c18..893d49855 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 @@ -31,15 +31,6 @@ # like this: # make TREE=/usr/my-kernel-tree/include # -# -# ***** NOTE NOTE NOTE NOTE NOTE ***** -# Because some distributions patch 2.2.x kernels to make kill_fasync have -# three parameters, this script tries to determine, via the examination of -# header files, if your kernel has been patched. If this detection is -# incorrect, you can override the value on the command line, like this: -# make PARAMS=2 -# or -# make PARAMS=3 .SUFFIXES: @@ -132,10 +123,6 @@ 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 2>/dev/null \ - | egrep -q '(band|int, int)'; then echo 3; else echo 2; fi) MACHINE := $(shell echo `uname -m`) ifeq ($(AGP),0) AGP := $(shell gcc -E -nostdinc -I$(TREE) picker.c 2>/dev/null \ @@ -148,9 +135,11 @@ DRMTEMPLATES += drm_agpsupport.h MODS += mga.o ifeq ($(MACHINE),i386) MODS += i810.o +MODS += i830.o endif ifeq ($(MACHINE),i686) MODS += i810.o +MODS += i830.o endif MGAOBJS = mga_drv.o mga_dma.o mga_state.o mga_warp.o @@ -159,29 +148,23 @@ MGAHEADERS = mga.h mga_drv.h mga_drm.h $(DRMHEADERS) $(DRMTEMPLATES) I810OBJS = i810_drv.o i810_dma.o I810HEADERS = i810.h i810_drv.h i810_drm.h $(DRMHEADERS) $(DRMTEMPLATES) +I830OBJS = i830_drv.o i830_dma.o +I830HEADERS = i830.h i830_drv.h i830_drm.h $(DRMHEADERS) $(DRMTEMPLATES) + endif ifeq ($(MACHINE),alpha) MODCFLAGS+= -ffixed-8 -mno-fp-regs -mcpu=ev56 -Wa,-mev6 endif -ifeq ($(SIS),1) -# It appears that the SiS driver makes calls to sis_malloc and sis_free, and -# that these calls are only defined if CONFIG_FB_SIS is selected. So, key -# off that to determine if we should attempt to build the SiS driver. -# -# A better way would be to detect the appropriate definitions in the header -# file to see if we can, at least, compile the driver. MODS += sis.o SISOBJS= sis_drv.o sis_mm.o sis_ds.o SISHEADERS= sis_drv.h sis_drm.h $(DRMHEADERS) MODCFLAGS += -DCONFIG_DRM_SIS -endif all::;@echo === KERNEL HEADERS IN $(TREE) all::;@echo === SMP=${SMP} MODULES=${MODULES} MODVERSIONS=${MODVERSIONS} AGP=${AGP} -all::;@echo === kill_fasync has $(PARAMS) parameters all::;@echo === Compiling for machine $(MACHINE) all::;@echo === WARNING all::;@echo === WARNING Use 2.4.x kernels ONLY ! @@ -206,9 +189,6 @@ endif ifeq ($(MODVERSIONS),1) MODCFLAGS += -DMODVERSIONS -include $(TREE)/linux/modversions.h endif -ifeq ($(PARAMS),3) -MODCFLAGS += -DKILLFASYNCHASTHREEPARAMETERS -endif # **** End of configuration @@ -252,6 +232,11 @@ i810_drv.o: i810_drv.c i810.o: $(I810OBJS) $(LIBS) $(LD) -r $^ -o $@ +i830_drv.o: i830_drv.c + $(CC) $(MODCFLAGS) -DEXPORT_SYMTAB -I$(TREE) -c $< -o $@ +i830.o: $(I830OBJS) $(LIBS) + $(LD) -r $^ -o $@ + endif .PHONY: ChangeLog @@ -272,6 +257,7 @@ $(TDFXOBJS): $(TDFXHEADERS) ifeq ($(AGP),1) $(MGAOBJS): $(MGAHEADERS) $(I810OBJS): $(I810HEADERS) +$(I830OBJS): $(I830HEADERS) $(R128OBJS): $(R128HEADERS) $(RADEONOBJS): $(RADEONHEADERS) endif 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 ac9f407a7..0db586fc5 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 @@ -104,9 +104,8 @@ typedef struct drm_tex_region { #include "i810_drm.h" #include "r128_drm.h" #include "radeon_drm.h" -#ifdef CONFIG_DRM_SIS #include "sis_drm.h" -#endif +#include "i830_drm.h" typedef struct drm_version { int version_major; /* Major version */ @@ -449,6 +448,12 @@ typedef struct drm_scatter_gather { #define DRM_IOCTL_I810_SWAP DRM_IO( 0x46) #define DRM_IOCTL_I810_COPY DRM_IOW( 0x47, drm_i810_copy_t) #define DRM_IOCTL_I810_DOCOPY DRM_IO( 0x48) +#define DRM_IOCTL_I810_OV0INFO DRM_IOR( 0x49, drm_i810_overlay_t) +#define DRM_IOCTL_I810_FSTATUS DRM_IO ( 0x4a) +#define DRM_IOCTL_I810_OV0FLIP DRM_IO ( 0x4b) +#define DRM_IOCTL_I810_MC DRM_IOW( 0x4c, drm_i810_mc_t) +#define DRM_IOCTL_I810_RSTATUS DRM_IO ( 0x4d ) + /* Rage 128 specific ioctls */ #define DRM_IOCTL_R128_INIT DRM_IOW( 0x40, drm_r128_init_t) @@ -483,7 +488,6 @@ typedef struct drm_scatter_gather { #define DRM_IOCTL_RADEON_INDIRECT DRM_IOWR(0x4d, drm_radeon_indirect_t) #define DRM_IOCTL_RADEON_TEXTURE DRM_IOWR(0x4e, drm_radeon_texture_t) -#ifdef CONFIG_DRM_SIS /* 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) @@ -493,6 +497,16 @@ typedef struct drm_scatter_gather { #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 + +/* I830 specific ioctls */ +#define DRM_IOCTL_I830_INIT DRM_IOW( 0x40, drm_i830_init_t) +#define DRM_IOCTL_I830_VERTEX DRM_IOW( 0x41, drm_i830_vertex_t) +#define DRM_IOCTL_I830_CLEAR DRM_IOW( 0x42, drm_i830_clear_t) +#define DRM_IOCTL_I830_FLUSH DRM_IO ( 0x43) +#define DRM_IOCTL_I830_GETAGE DRM_IO ( 0x44) +#define DRM_IOCTL_I830_GETBUF DRM_IOWR(0x45, drm_i830_dma_t) +#define DRM_IOCTL_I830_SWAP DRM_IO ( 0x46) +#define DRM_IOCTL_I830_COPY DRM_IOW( 0x47, drm_i830_copy_t) +#define DRM_IOCTL_I830_DOCOPY DRM_IO ( 0x48) #endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_context.h b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_context.h index 33d6112e3..e155946dc 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_context.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_context.h @@ -27,6 +27,10 @@ * Authors: * Rickard E. (Rik) Faith <faith@valinux.com> * Gareth Hughes <gareth@valinux.com> + * ChangeLog: + * 2001-11-16 Torsten Duwe <duwe@caldera.de> + * added context constructor/destructor hooks, + * needed by SiS driver's memory management. */ #define __NO_VERSION__ @@ -316,6 +320,10 @@ int DRM(addctx)( struct inode *inode, struct file *filp, /* Should this return -EBUSY instead? */ return -ENOMEM; } +#ifdef DRIVER_CTX_CTOR + if ( ctx.handle != DRM_KERNEL_CONTEXT ) + DRIVER_CTX_CTOR(ctx.handle); /* XXX: also pass dev ? */ +#endif if ( copy_to_user( (drm_ctx_t *)arg, &ctx, sizeof(ctx) ) ) return -EFAULT; @@ -390,6 +398,9 @@ int DRM(rmctx)( struct inode *inode, struct file *filp, priv->remove_auth_on_close = 1; } if ( ctx.handle != DRM_KERNEL_CONTEXT ) { +#ifdef DRIVER_CTX_DTOR + DRIVER_CTX_DTOR(ctx.handle); /* XXX: also pass dev ? */ +#endif DRM(ctxbitmap_free)( dev, ctx.handle ); } diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_fops.h b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_fops.h index d8e9112fd..9c2135fed 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_fops.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_fops.h @@ -125,21 +125,31 @@ ssize_t DRM(read)(struct file *filp, char *buf, size_t count, loff_t *off) int avail; int send; int cur; + DECLARE_WAITQUEUE(wait, current); DRM_DEBUG("%p, %p\n", dev->buf_rp, dev->buf_wp); + add_wait_queue(&dev->buf_readers, &wait); + set_current_state(TASK_INTERRUPTIBLE); while (dev->buf_rp == dev->buf_wp) { DRM_DEBUG(" sleeping\n"); if (filp->f_flags & O_NONBLOCK) { + remove_wait_queue(&dev->buf_readers, &wait); + set_current_state(TASK_RUNNING); return -EAGAIN; } - interruptible_sleep_on(&dev->buf_readers); + schedule(); /* wait for dev->buf_readers */ if (signal_pending(current)) { DRM_DEBUG(" interrupted\n"); + remove_wait_queue(&dev->buf_readers, &wait); + set_current_state(TASK_RUNNING); return -ERESTARTSYS; } DRM_DEBUG(" awake\n"); + set_current_state(TASK_INTERRUPTIBLE); } + remove_wait_queue(&dev->buf_readers, &wait); + set_current_state(TASK_RUNNING); left = (dev->buf_rp + DRM_BSZ - dev->buf_wp) % DRM_BSZ; avail = DRM_BSZ - left; diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_dma.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_dma.c index e9b0e8078..ae0a36169 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_dma.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_dma.c @@ -86,6 +86,7 @@ static inline void i810_print_status_page(drm_device_t *dev) DRM_DEBUG( "hw_status: LpRing Head ptr : %x\n", temp[1]); DRM_DEBUG( "hw_status: IRing Head ptr : %x\n", temp[2]); DRM_DEBUG( "hw_status: Reserved : %x\n", temp[3]); + DRM_DEBUG( "hw_status: Last Render: %x\n", temp[4]); DRM_DEBUG( "hw_status: Driver Counter : %d\n", temp[5]); for(i = 6; i < dma->buf_count + 6; i++) { DRM_DEBUG( "buffer status idx : %d used: %d\n", i - 6, temp[i]); @@ -471,6 +472,9 @@ static int i810_dma_initialize(drm_device_t *dev, dev_priv->back_offset = init->back_offset; dev_priv->depth_offset = init->depth_offset; + dev_priv->overlay_offset = init->overlay_offset; + dev_priv->overlay_physical = init->overlay_physical; + dev_priv->front_di1 = init->front_offset | init->pitch_bits; dev_priv->back_di1 = init->back_offset | init->pitch_bits; dev_priv->zi1 = init->depth_offset | init->pitch_bits; @@ -1259,3 +1263,156 @@ int i810_docopy(struct inode *inode, struct file *filp, unsigned int cmd, if(VM_DONTCOPY == 0) return 1; return 0; } + +static void i810_dma_dispatch_mc(drm_device_t *dev, drm_buf_t *buf, int used, + unsigned int last_render) +{ + drm_i810_private_t *dev_priv = dev->dev_private; + drm_i810_buf_priv_t *buf_priv = buf->dev_private; + drm_i810_sarea_t *sarea_priv = dev_priv->sarea_priv; + unsigned long address = (unsigned long)buf->bus_address; + unsigned long start = address - dev->agp->base; + int u; + RING_LOCALS; + + i810_kernel_lost_context(dev); + + u = cmpxchg(buf_priv->in_use, I810_BUF_CLIENT, + I810_BUF_HARDWARE); + if(u != I810_BUF_CLIENT) { + DRM_DEBUG("MC found buffer that isn't mine!\n"); + } + + if (used > 4*1024) + used = 0; + + sarea_priv->dirty = 0x7f; + + DRM_DEBUG("dispatch mc addr 0x%lx, used 0x%x\n", + address, used); + + dev_priv->counter++; + DRM_DEBUG("dispatch counter : %ld\n", dev_priv->counter); + DRM_DEBUG("i810_dma_dispatch_mc\n"); + DRM_DEBUG("start : %lx\n", start); + DRM_DEBUG("used : %d\n", used); + DRM_DEBUG("start + used - 4 : %ld\n", start + used - 4); + + if (buf_priv->currently_mapped == I810_BUF_MAPPED) { + if (used & 4) { + *(u32 *)((u32)buf_priv->virtual + used) = 0; + used += 4; + } + + i810_unmap_buffer(buf); + } + BEGIN_LP_RING(4); + OUT_RING( CMD_OP_BATCH_BUFFER ); + OUT_RING( start | BB1_PROTECTED ); + OUT_RING( start + used - 4 ); + OUT_RING( 0 ); + ADVANCE_LP_RING(); + + + BEGIN_LP_RING(8); + OUT_RING( CMD_STORE_DWORD_IDX ); + OUT_RING( buf_priv->my_use_idx ); + OUT_RING( I810_BUF_FREE ); + OUT_RING( 0 ); + + OUT_RING( CMD_STORE_DWORD_IDX ); + OUT_RING( 16 ); + OUT_RING( last_render ); + OUT_RING( 0 ); + ADVANCE_LP_RING(); +} + +int i810_dma_mc(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_device_dma_t *dma = dev->dma; + drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; + u32 *hw_status = (u32 *)dev_priv->hw_status_page; + drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *) + dev_priv->sarea_priv; + drm_i810_mc_t mc; + + if (copy_from_user(&mc, (drm_i810_mc_t *)arg, sizeof(mc))) + return -EFAULT; + + + if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { + DRM_ERROR("i810_dma_mc called without lock held\n"); + return -EINVAL; + } + + i810_dma_dispatch_mc(dev, dma->buflist[mc.idx], mc.used, + mc.last_render ); + + atomic_add(mc.used, &dev->counts[_DRM_STAT_SECONDARY]); + atomic_inc(&dev->counts[_DRM_STAT_DMA]); + sarea_priv->last_enqueue = dev_priv->counter-1; + sarea_priv->last_dispatch = (int) hw_status[5]; + + return 0; +} + +int i810_rstatus(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; + + return (int)(((u32 *)(dev_priv->hw_status_page))[4]); +} + +int i810_ov0_info(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; + drm_i810_overlay_t data; + + data.offset = dev_priv->overlay_offset; + data.physical = dev_priv->overlay_physical; + copy_to_user((drm_i810_overlay_t *)arg,&data,sizeof(data)); + return 0; +} + +int i810_fstatus(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; + + if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { + DRM_ERROR("i810_fstatus called without lock held\n"); + return -EINVAL; + } + return I810_READ(0x30008); +} + +int i810_ov0_flip(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; + + if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { + DRM_ERROR("i810_ov0_flip called without lock held\n"); + return -EINVAL; + } + + //Tell the overlay to update + I810_WRITE(0x30000,dev_priv->overlay_physical | 0x80000000); + + return 0; +} + + diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drm.h b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drm.h index 5d47adda2..8413293b3 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drm.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drm.h @@ -112,6 +112,8 @@ typedef struct _drm_i810_init { unsigned int front_offset; unsigned int back_offset; unsigned int depth_offset; + unsigned int overlay_offset; + unsigned int overlay_physical; unsigned int w; unsigned int h; unsigned int pitch; @@ -196,4 +198,18 @@ typedef struct drm_i810_dma { int granted; } drm_i810_dma_t; +typedef struct _drm_i810_overlay_t { + unsigned int offset; /* Address of the Overlay Regs */ + unsigned int physical; +} drm_i810_overlay_t; + +typedef struct _drm_i810_mc { + int idx; /* buffer index */ + int used; /* nr bytes in use */ + int num_blocks; /* number of GFXBlocks */ + int *length; /* List of lengths for GFXBlocks (FUTURE)*/ + unsigned int last_render; /* Last Render Request */ +} drm_i810_mc_t; + + #endif /* _I810_DRM_H_ */ diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drv.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drv.c index 1a200e0c4..559b2617b 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drv.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drv.c @@ -39,10 +39,10 @@ #define DRIVER_NAME "i810" #define DRIVER_DESC "Intel i810" -#define DRIVER_DATE "20010917" +#define DRIVER_DATE "20010920" #define DRIVER_MAJOR 1 -#define DRIVER_MINOR 1 +#define DRIVER_MINOR 2 #define DRIVER_PATCHLEVEL 0 #define DRIVER_IOCTLS \ @@ -54,7 +54,12 @@ [DRM_IOCTL_NR(DRM_IOCTL_I810_GETBUF)] = { i810_getbuf, 1, 0 }, \ [DRM_IOCTL_NR(DRM_IOCTL_I810_SWAP)] = { i810_swap_bufs, 1, 0 }, \ [DRM_IOCTL_NR(DRM_IOCTL_I810_COPY)] = { i810_copybuf, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_DOCOPY)] = { i810_docopy, 1, 0 }, + [DRM_IOCTL_NR(DRM_IOCTL_I810_DOCOPY)] = { i810_docopy, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_OV0INFO)] = { i810_ov0_info, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_FSTATUS)] = { i810_fstatus, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_OV0FLIP)] = { i810_ov0_flip, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_MC)] = { i810_dma_mc, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_RSTATUS)] = { i810_rstatus, 1, 0 } #define __HAVE_COUNTERS 4 diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drv.h b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drv.h index e1b17148e..a27384d41 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drv.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drv.h @@ -73,6 +73,8 @@ typedef struct drm_i810_private { int back_offset; int depth_offset; + int overlay_offset; + int overlay_physical; int w, h; int pitch; } drm_i810_private_t; @@ -94,6 +96,18 @@ extern int i810_copybuf(struct inode *inode, struct file *filp, extern int i810_docopy(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); +extern int i810_rstatus(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg); +extern int i810_ov0_info(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg); +extern int i810_fstatus(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg); +extern int i810_ov0_flip(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg); +extern int i810_dma_mc(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg); + + extern void i810_dma_quiescent(drm_device_t *dev); #define I810_VERBOSE 0 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 4b4fbe90c..6c228dfc3 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 @@ -22,14 +22,9 @@ #define CONFIG_AGP 0 #endif -#ifndef CONFIG_FB_SIS -#define CONFIG_FB_SIS 0 -#endif - SMP = CONFIG_SMP MODULES = CONFIG_MODULES MODVERSIONS = CONFIG_MODVERSIONS AGP = CONFIG_AGP AGP_MODULE = CONFIG_AGP_MODULE RELEASE = UTS_RELEASE -SIS = CONFIG_FB_SIS diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c index 0a209245b..9322292a4 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c @@ -1058,7 +1058,7 @@ static int radeon_cp_dispatch_texture( drm_device_t *dev, DRM_ERROR( "EFAULT on tex->image\n" ); return -EFAULT; } - } else if ( size < 4 ) { + } else if ( size < 4 && size > 0 ) { size = 4; } diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis.h b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis.h index 2e5f7bb3e..02f03086f 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis.h @@ -24,7 +24,7 @@ * DEALINGS IN THE SOFTWARE. * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis.h,v 1.1 2001/05/19 18:29:22 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis.h,v 1.2 2001/12/19 21:25:59 dawes Exp $ */ #ifndef __SIS_H__ #define __SIS_H__ @@ -47,4 +47,10 @@ #define DRIVER_AGP_BUFFERS_MAP( dev ) \ ((drm_sis_private_t *)((dev)->dev_private))->buffers +extern int sis_init_context(int context); +extern int sis_final_context(int context); + +#define DRIVER_CTX_CTOR sis_init_context +#define DRIVER_CTX_DTOR sis_final_context + #endif diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_drv.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_drv.c index 3dd83fd7e..2d9612f52 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_drv.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_drv.c @@ -40,12 +40,12 @@ #define DRIVER_PATCHLEVEL 0 #define DRIVER_IOCTLS \ - [DRM_IOCTL_NR(SIS_IOCTL_FB_ALLOC)] = { sis_fb_alloc, 1, 1 }, \ - [DRM_IOCTL_NR(SIS_IOCTL_FB_FREE)] = { sis_fb_free, 1, 1 }, \ + [DRM_IOCTL_NR(SIS_IOCTL_FB_ALLOC)] = { sis_fb_alloc, 1, 0 }, \ + [DRM_IOCTL_NR(SIS_IOCTL_FB_FREE)] = { sis_fb_free, 1, 0 }, \ /* AGP Memory Management */ \ - [DRM_IOCTL_NR(SIS_IOCTL_AGP_INIT)] = { sisp_agp_init, 1, 1 }, \ - [DRM_IOCTL_NR(SIS_IOCTL_AGP_ALLOC)] = { sisp_agp_alloc, 1, 1 }, \ - [DRM_IOCTL_NR(SIS_IOCTL_AGP_FREE)] = { sisp_agp_free, 1, 1 } + [DRM_IOCTL_NR(SIS_IOCTL_AGP_INIT)] = { sisp_agp_init, 1, 0 }, \ + [DRM_IOCTL_NR(SIS_IOCTL_AGP_ALLOC)] = { sisp_agp_alloc, 1, 0 }, \ + [DRM_IOCTL_NR(SIS_IOCTL_AGP_FREE)] = { sisp_agp_free, 1, 0 } #if 0 /* these don't appear to be defined */ /* SIS Stereo */ [DRM_IOCTL_NR(DRM_IOCTL_CONTROL)] = { sis_control, 1, 1 }, diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_ds.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_ds.c index 6143ad83a..95880a482 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_ds.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis_ds.c @@ -33,7 +33,7 @@ #include <linux/delay.h> #include <linux/errno.h> #include <linux/kernel.h> -#include <linux/malloc.h> +#include <linux/slab.h> #include <linux/poll.h> #include <asm/io.h> #include <linux/pci.h> 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 2c2e0d95a..81832769d 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 @@ -72,7 +72,7 @@ static int del_alloc_set(int context, int type, unsigned int val) } /* fb management via fb device */ -#if 0 +#if 1 int sis_fb_alloc(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { @@ -90,7 +90,7 @@ int sis_fb_alloc(struct inode *inode, struct file *filp, unsigned int cmd, fb.offset = req.offset; fb.free = req.offset; if(!add_alloc_set(fb.context, VIDEO_TYPE, fb.free)){ - DRM_DEBUG("adding to allocation set fails"); + DRM_DEBUG("adding to allocation set fails\n"); sis_free(req.offset); retval = -1; } @@ -185,7 +185,7 @@ int sisp_agp_alloc(struct inode *inode, struct file *filp, unsigned int cmd, agp.offset = block->ofs; agp.free = (unsigned int)block; if(!add_alloc_set(agp.context, AGP_TYPE, agp.free)){ - DRM_DEBUG("adding to allocation set fails"); + DRM_DEBUG("adding to allocation set fails\n"); mmFreeMem((PMemBlock)agp.free); retval = -1; } @@ -279,9 +279,7 @@ int sis_final_context(int context) retval = setFirst(set, &item); while(retval){ DRM_DEBUG("free video memory 0x%x\n", item); -#if 0 sis_free(item); -#endif retval = setNext(set, &item); } setDestroy(set); 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 b5aa6f73f..1d26b6e63 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.24 2001/08/18 02:51:13 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.25 2001/08/27 17:40:59 dawes Exp $ * */ diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmI810.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmI810.c index bcbadc30c..f702d8488 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmI810.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmI810.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmI810.c,v 1.5 2001/04/10 16:08:04 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmI810.c,v 1.7 2001/09/27 08:25:04 alanh Exp $ */ #ifdef XFree86Server # include "xf86.h" @@ -76,6 +76,8 @@ Bool drmI810InitDma(int driSubFD, drmI810Init *info) init.front_offset = info->front_offset; init.back_offset = info->back_offset; init.depth_offset = info->depth_offset; + init.overlay_offset = info->overlay_offset; + init.overlay_physical = info->overlay_physical; init.w = info->w; init.h = info->h; init.pitch = info->pitch; diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmMga.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmMga.c index fc8bbdd8a..2910da192 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmMga.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmMga.c @@ -27,7 +27,7 @@ * Gareth Hughes <gareth@valinux.com> * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmMga.c,v 1.5 2001/04/10 16:08:04 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmMga.c,v 1.6 2001/08/27 17:40:59 dawes Exp $ */ #ifdef XFree86Server # include "xf86.h" diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmR128.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmR128.c index 730dadd2b..b65597e99 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmR128.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmR128.c @@ -26,7 +26,7 @@ * Author: Kevin E. Martin <martin@valinux.com> * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmR128.c,v 1.10 2001/05/23 16:03:50 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmR128.c,v 1.11 2001/08/27 17:40:59 dawes Exp $ */ #ifdef XFree86Server # include "xf86.h" diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmRadeon.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmRadeon.c index 0da6a5b4e..8c9f24305 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmRadeon.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmRadeon.c @@ -27,7 +27,7 @@ * Kevin E. Martin <martin@valinux.com> * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmRadeon.c,v 1.3 2001/04/10 16:08:04 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmRadeon.c,v 1.4 2001/08/27 17:40:59 dawes Exp $ */ #ifdef XFree86Server # include "xf86.h" diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmSiS.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmSiS.c index 47b7e1463..d59220540 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmSiS.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmSiS.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmSiS.c,v 1.8 2001/08/01 00:44:56 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmSiS.c,v 1.10 2001/12/15 00:59:12 dawes Exp $ */ #ifdef XFree86Server # include "xf86.h" @@ -43,6 +43,7 @@ extern int xf86RemoveSIGIOHandler(int fd); #include <sys/sysmacros.h> /* for makedev() */ #endif #include "xf86drm.h" +#include "xf86drmSiS.h" #define CONFIG_DRM_SIS #include "drm.h" #undef CONFIG_DRM_SIS 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 f4c5f1b75..14af61417 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.16 2001/08/06 20:51:11 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnxResource.c,v 3.17 2001/11/01 23:35:33 dawes Exp $ */ /* Resource information code */ @@ -165,7 +165,7 @@ xf86AccResFromOS(resPtr ret) return ret; } -#elif defined(__powerpc__) || defined(__sparc__) || defined(__mips__) || defined(__sh__) +#elif defined(__powerpc__) || defined(__sparc__) || defined(__mips__) || defined(__sh__) || defined(__mc68000__) || defined(__arm__) || defined(__s390__) || defined(__hppa__) /* XXX this isn't exactly correct but it will get the server working * for now until we get something better. diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_agp.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_agp.c index b66bb0329..5de1089af 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_agp.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_agp.c @@ -4,9 +4,10 @@ * This version is for both Linux and FreeBSD. * * Copyright © 2000 VA Linux Systems, Inc. + * Copyright © 2001 The XFree86 Project, Inc. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_agp.c,v 3.5 2001/05/19 00:26:45 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_agp.c,v 3.8 2001/11/26 19:02:02 dawes Exp $ */ #include "X.h" #include "xf86.h" @@ -17,7 +18,7 @@ #if defined(linux) #include <asm/ioctl.h> #include <linux/agpgart.h> -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(__NetBSD__) #include <sys/ioctl.h> #include <sys/agpio.h> #endif @@ -55,7 +56,7 @@ xf86GARTCloseScreen(int screenNum) * Open /dev/agpgart. Keep it open until xf86GARTCloseScreen is called. */ static Bool -GARTInit() +GARTInit(int screenNum) { struct _agp_info agpinf; @@ -70,16 +71,17 @@ GARTInit() return FALSE; if (gartFd == -1) { - xf86Msg(X_ERROR, "Unable to open " AGP_DEVICE " (%s)\n", - strerror(errno)); - return FALSE; + xf86DrvMsg(screenNum, X_ERROR, + "GARTInit: Unable to open " AGP_DEVICE " (%s)\n", + strerror(errno)); + return FALSE; } xf86AcquireGART(-1); /* Check the kernel driver version. */ if (ioctl(gartFd, AGPIOC_INFO, &agpinf) != 0) { - xf86Msg(X_ERROR, "GARTInit: AGPIOC_INFO failed (%s)\n", - strerror(errno)); + xf86DrvMsg(screenNum, X_ERROR, + "GARTInit: AGPIOC_INFO failed (%s)\n", strerror(errno)); close(gartFd); gartFd = -1; return FALSE; @@ -90,8 +92,8 @@ GARTInit() /* Should this look for version >= rather than version == ? */ if (agpinf.version.major != AGPGART_MAJOR_VERSION && agpinf.version.minor != AGPGART_MINOR_VERSION) { - xf86Msg(X_ERROR, - "Kernel agpgart driver version is not current" + xf86DrvMsg(screenNum, X_ERROR, + "GARTInit: Kernel agpgart driver version is not current" " (%d.%d vs %d.%d)\n", agpinf.version.major, agpinf.version.minor, AGPGART_MAJOR_VERSION, AGPGART_MINOR_VERSION); @@ -107,7 +109,7 @@ GARTInit() Bool xf86AgpGARTSupported() { - return GARTInit(); + return GARTInit(-1); } AgpInfoPtr @@ -116,12 +118,13 @@ xf86GetAGPInfo(int screenNum) struct _agp_info agpinf; AgpInfoPtr info; - if (!GARTInit()) + if (!GARTInit(screenNum)) return NULL; if ((info = xcalloc(sizeof(AgpInfo), 1)) == NULL) { - xf86DrvMsg(screenNum, X_ERROR, "Failed to allocate AgpInfo\n"); + xf86DrvMsg(screenNum, X_ERROR, + "xf86GetAGPInfo: Failed to allocate AgpInfo\n"); return NULL; } @@ -151,14 +154,14 @@ xf86GetAGPInfo(int screenNum) Bool xf86AcquireGART(int screenNum) { - if (screenNum != -1 && !GARTInit()) + if (screenNum != -1 && !GARTInit(screenNum)) return FALSE; if (screenNum == -1 || acquiredScreen != screenNum) { if (ioctl(gartFd, AGPIOC_ACQUIRE, 0) != 0) { xf86DrvMsg(screenNum, X_WARNING, - "AGPIOC_ACQUIRE failed (%s)\n", - strerror(errno)); + "xf86AcquireGART: AGPIOC_ACQUIRE failed (%s)\n", + strerror(errno)); return FALSE; } acquiredScreen = screenNum; @@ -169,18 +172,29 @@ xf86AcquireGART(int screenNum) Bool xf86ReleaseGART(int screenNum) { - if (screenNum != -1 && !GARTInit()) + if (screenNum != -1 && !GARTInit(screenNum)) return FALSE; if (acquiredScreen == screenNum) { + /* + * The FreeBSD agp driver removes allocations on release. + * The Linux driver doesn't. xf86ReleaseGART() is expected + * to give up access to the GART, but not to remove any + * allocations. + */ +#if !defined(linux) + if (screenNum == -1) +#endif + { if (ioctl(gartFd, AGPIOC_RELEASE, 0) != 0) { xf86DrvMsg(screenNum, X_WARNING, - "AGPIOC_RELEASE failed (%s)\n", - strerror(errno)); + "xf86ReleaseGART: AGPIOC_RELEASE failed (%s)\n", + strerror(errno)); return FALSE; } acquiredScreen = -1; - return TRUE; + } + return TRUE; } return FALSE; } @@ -198,7 +212,7 @@ xf86AllocateGARTMemory(int screenNum, unsigned long size, int type, * memory is returned. On error, the return value is -1. */ - if (!GARTInit() || acquiredScreen != screenNum) + if (!GARTInit(screenNum) || acquiredScreen != screenNum) return -1; pages = (size / AGP_PAGE_SIZE); @@ -231,12 +245,12 @@ xf86BindGARTMemory(int screenNum, int key, unsigned long offset) struct _agp_bind bind; int pageOffset; - if (!GARTInit() || acquiredScreen != screenNum) + if (!GARTInit(screenNum) || acquiredScreen != screenNum) return FALSE; if (acquiredScreen != screenNum) { xf86DrvMsg(screenNum, X_ERROR, - "AGP not acquired by this screen\n"); + "xf86BindGARTMemory: AGP not acquired by this screen\n"); return FALSE; } @@ -269,12 +283,12 @@ xf86UnbindGARTMemory(int screenNum, int key) { struct _agp_unbind unbind; - if (!GARTInit() || acquiredScreen != screenNum) + if (!GARTInit(screenNum) || acquiredScreen != screenNum) return FALSE; if (acquiredScreen != screenNum) { xf86DrvMsg(screenNum, X_ERROR, - "AGP not acquired by this screen\n"); + "xf86UnbindGARTMemory: AGP not acquired by this screen\n"); return FALSE; } @@ -298,7 +312,7 @@ xf86EnableAGP(int screenNum, CARD32 mode) { agp_setup setup; - if (!GARTInit() || acquiredScreen != screenNum) + if (!GARTInit(screenNum) || acquiredScreen != screenNum) return FALSE; setup.agp_mode = mode; diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kmod.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kmod.c index 81616fab6..0cb69b209 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kmod.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kmod.c @@ -1,11 +1,12 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kmod.c,v 3.4 2001/04/01 14:00:15 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kmod.c,v 3.6 2001/10/31 22:50:30 tsi Exp $ */ #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h> -#include "xf86_OSproc.h" +#include "xf86_OSlib.h" +#include "xf86.h" #define MODPROBE_PATH_FILE "/proc/sys/kernel/modprobe" @@ -66,7 +67,16 @@ xf86LoadKernelModule(const char *modName) */ switch (pid = fork()) { case 0: /* child */ + /* change real/effective user ID to 0/0 as we need to + * preinstall agpgart module for some DRM modules + */ + if (setreuid(0,0)) { + xf86Msg(X_WARNING,"LoadKernelModule: " + "Setting of real/effective user Id to 0/0 failed"); + } + setenv("PATH","/sbin",1); n = execl(mpPath, "modprobe", modName, NULL); + xf86Msg(X_WARNING,"LoadKernelModule %s\n",strerror(errno)); exit(EXIT_FAILURE); /* if we get here the child's exec failed */ break; case -1: /* fork failed */ diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_video.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_video.c index be4074f7f..9e0ecbaa2 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_video.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_video.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_video.c,v 3.58 2001/08/06 20:51:11 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_video.c,v 3.60 2001/11/01 23:35:33 dawes Exp $ */ /* * Copyright 1992 by Orest Zborowski <obz@Kodak.com> * Copyright 1993 by David Wexelblat <dwex@goblin.org> @@ -42,6 +42,8 @@ #include <asm/mtrr.h> #endif +extern int ioperm(unsigned long from, unsigned long num, int turn_on); + #ifndef MAP_FAILED #define MAP_FAILED ((void *)-1) #endif @@ -257,52 +259,41 @@ mtrr_add_wc_region(int screenNum, unsigned long base, unsigned long size, wcr->next = NULL; #if SPLIT_WC_REGIONS - /*********************************** by _usul ********************/ /* * Splits up the write-combining region if it is not aligned on a * size boundary. */ - if (base % size) { - struct mtrr_wc_region *wcrc = wcr; - int rgs = 1; - unsigned long srem, sdiv, bcurr; + + { + unsigned long last, lbase, d_size; + unsigned long n_size = size; + unsigned long n_base = base; - xf86DrvMsgVerb(screenNum, X_INFO, 2, - "WC region has to be split (0x%lx,0x%lx)\n", base, size); - - bcurr = base; - srem = size; - - do { - for (sdiv = (0x1 << 31); sdiv; sdiv = sdiv >> 1) { - while(sdiv > srem) { - sdiv >>= 1; - } - if (!(bcurr % sdiv)) { - mtrr_add_wc_region(screenNum, bcurr, - sdiv, from); - break; - } - } - if (!sdiv) { - xf86DrvMsg(screenNum, X_ERROR, - "Serious error in region splitting!\n"); - } - wcrc->sentry.base = bcurr; - wcrc->sentry.size = sdiv; - wcrc->sentry.type = MTRR_TYPE_WRCOMB; - wcrc->added = TRUE; - if ((srem - sdiv)) { - wcrc->next = xalloc(sizeof(*wcrc)); - wcrc = wcrc->next; - } else { - wcrc->next = NULL; - } - srem -= sdiv; - bcurr += sdiv; - } while (srem); - return wcr; - } + int i = 0; + last = n_base + n_size - 1; + for (lbase = n_base; !(lbase & 1) && (last & 1); + lbase = lbase >> 1, last = last >> 1, i++) + if (lbase != last) { + while((lbase & 1) == (last & 1)) { + i++; + lbase >>= 1; + last >>= 1; + } + } + d_size = 1 << i; +#ifdef DEBUG + ErrorF("WC_BASE: 0x%lx WC_END: 0x%lx\n",base,base+d_size-1); +#endif + n_base += d_size; + n_size -= d_size; + if (n_size) { + xf86DrvMsgVerb(screenNum,X_INFO,3,"Splitting WC range: " + "base: 0x%lx, size: 0x%lx\n",base,size); + wcr->next = mtrr_add_wc_region(screenNum, n_base, n_size,from); + } + wcr->sentry.size = d_size; + } + /*****************************************************************/ #endif /* SPLIT_WC_REGIONS */ @@ -372,7 +363,7 @@ xf86OSInitVidMem(VidMemInfoPtr pVidMem) #ifdef __alpha__ if (axpSystem == -1) { axpSystem = lnxGetAXP(); - if (needSparse = (_bus_base_sparse() > 0)) { + if ((needSparse = (_bus_base_sparse() > 0))) { hae_thresh = xf86AXPParams[axpSystem].hae_thresh; hae_mask = xf86AXPParams[axpSystem].hae_mask; sparse_size = xf86AXPParams[axpSystem].size; @@ -531,7 +522,7 @@ xf86EnableIO(void) #endif } close(fd); -#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) +#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__hppa__) if (ioperm(0, 1024, 1) || iopl(3)) FatalError("xf86EnableIOPorts: Failed to set IOPL for I/O\n"); # if !defined(__alpha__) @@ -552,7 +543,7 @@ xf86DisableIO(void) #if defined(__powerpc__) munmap(ioBase, 0x20000); ioBase = NULL; -#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) +#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__hppa__) iopl(0); ioperm(0, 1024, 0); #endif @@ -566,29 +557,31 @@ xf86DisableIO(void) /* Interrupt Handling section */ /***************************************************************************/ +/* XXX The #ifdefs should be made simpler. */ + Bool xf86DisableInterrupts() { +#if !defined(__mc68000__) && !defined(__powerpc__) && !defined(__sparc__) && !defined(__mips__) && !defined(__ia64__) && !defined(__sh__) && !defined(__hppa__) if (!ExtendedEnabled) -#if !defined(__mc68000__) && !defined(__powerpc__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) if (iopl(3) || ioperm(0, 1024, 1)) return (FALSE); #endif -#if defined(__alpha__) || defined(__mc68000__) || defined(__powerpc__) || defined(__sparc__) || defined(__mips__) || defined(__sh__) +#if defined(__alpha__) || defined(__mc68000__) || defined(__powerpc__) || defined(__sparc__) || defined(__mips__) || defined(__arm__) || defined(__sh__) || defined(__ia64__) || defined(__hppa__) #else -#ifdef __GNUC__ -#if defined(__ia64__) -#if 0 +# ifdef __GNUC__ +# if defined(__ia64__) +# if 0 __asm__ __volatile__ (";; rsm psr.i;; srlz.d" ::: "memory"); -#endif -#else +# endif +# else __asm__ __volatile__("cli"); -#endif -#else +# endif +# else asm("cli"); +# endif #endif -#endif -#if !defined(__mc68000__) && !defined(__powerpc__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) +#if !defined(__mc68000__) && !defined(__powerpc__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__ia64__) && !defined(__hppa__) if (!ExtendedEnabled) { iopl(0); ioperm(0, 1024, 0); @@ -601,26 +594,26 @@ xf86DisableInterrupts() void xf86EnableInterrupts() { +#if !defined(__mc68000__) && !defined(__powerpc__) && !defined(__sparc__) && !defined(__mips__) && !defined(__ia64__) && !defined(__sh__) && !defined(__hppa__) if (!ExtendedEnabled) -#if !defined(__mc68000__) && !defined(__powerpc__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) if (iopl(3) || ioperm(0, 1024, 1)) return; #endif -#if defined(__alpha__) || defined(__mc68000__) || defined(__powerpc__) || defined(__sparc__) || defined(__mips__) || defined(__sh__) +#if defined(__alpha__) || defined(__mc68000__) || defined(__powerpc__) || defined(__sparc__) || defined(__mips__) || defined(__arm__) || defined(__sh__) || defined(__ia64__) || defined(__hppa__) #else -#ifdef __GNUC__ -#if defined(__ia64__) -#if 0 +# ifdef __GNUC__ +# if defined(__ia64__) +# if 0 __asm__ __volatile__ (";; ssm psr.i;; srlz.d" ::: "memory"); -#endif -#else +# endif +# else __asm__ __volatile__("sti"); -#endif -#else +# endif +# else asm("sti"); +# endif #endif -#endif -#if !defined(__mc68000__) && !defined(__powerpc__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) +#if !defined(__mc68000__) && !defined(__powerpc__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__ia64__) && !defined(__hppa__) if (!ExtendedEnabled) { iopl(0); ioperm(0, 1024, 0); @@ -633,10 +626,6 @@ xf86EnableInterrupts() #define vuip volatile unsigned int * -static unsigned long msb_set = 0; -static pointer lnxSBase = 0; -static pointer lnxBase = 0; - extern int readDense8(pointer Base, register unsigned long Offset); extern int readDense16(pointer Base, register unsigned long Offset); extern int readDense32(pointer Base, register unsigned long Offset); @@ -669,10 +658,17 @@ writeSparse16(int Value, pointer Base, register unsigned long Offset); static void writeSparse32(int Value, pointer Base, register unsigned long Offset); +#define DENSE_BASE 0x2ff00000000UL +#define SPARSE_BASE 0x30000000000UL + +static unsigned long msb_set = 0; + static pointer mapVidMemSparse(int ScreenNum, unsigned long Base, unsigned long Size, int flags) { int fd; + unsigned long ret, rets = 0; + static Bool was_here = FALSE; if (!was_here) { @@ -687,34 +683,89 @@ mapVidMemSparse(int ScreenNum, unsigned long Base, unsigned long Size, int flags xf86ReadMmio8 = readSparse8; xf86ReadMmio16 = readSparse16; xf86ReadMmio32 = readSparse32; + } - if ((fd = open(DEV_MEM, O_RDWR)) < 0) { - FatalError("xf86MapVidMem: failed to open " DEV_MEM " (%s)\n", + if ((fd = open(DEV_MEM, O_RDWR)) < 0) { + FatalError("xf86MapVidMem: failed to open " DEV_MEM " (%s)\n", strerror(errno)); - } - /* This requirers linux-0.99.pl10 or above */ - lnxBase = mmap((caddr_t)0, 0x100000000, - PROT_READ | PROT_WRITE, - MAP_SHARED, fd, - (off_t) bus_base); - lnxSBase = mmap((caddr_t)0, 0x400000000, - PROT_READ | PROT_WRITE, - MAP_SHARED, fd, - (off_t) _bus_base_sparse()); - - close(fd); + } + +#if 0 + xf86Msg(X_INFO,"mapVidMemSparse: try Base 0x%lx size 0x%lx flags 0x%x\n", + Base, Size, flags); +#endif + + /* This requirers linux-0.99.pl10 or above */ + + /* + * Always do DENSE mmap, since read32/write32 currently require it. + */ + ret = (unsigned long)mmap((caddr_t)(DENSE_BASE + Base), Size, + PROT_READ | PROT_WRITE, + MAP_SHARED, fd, + (off_t) (bus_base + Base)); + + /* + * Do SPARSE mmap only when MMIO and not MMIO_32BIT, or FRAMEBUFFER + * and SPARSE (which should require the use of read/write macros). + * + * By not SPARSE mmapping an 8MB framebuffer, we can save approx. 256K + * bytes worth of pagetable (32 pages). + */ + if (((flags & VIDMEM_MMIO) && !(flags & VIDMEM_MMIO_32BIT)) || + ((flags & VIDMEM_FRAMEBUFFER) && (flags & VIDMEM_SPARSE))) + { + rets = (unsigned long)mmap((caddr_t)(SPARSE_BASE + (Base << 5)), + Size << 5, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, + (off_t) _bus_base_sparse() + (Base << 5)); + } + + close(fd); - if (lnxSBase == MAP_FAILED || lnxBase == MAP_FAILED) { - FatalError("xf86MapVidMem: Could not mmap framebuffer (%s)\n", + if (ret == (unsigned long)MAP_FAILED || ret != (DENSE_BASE + Base)) { + FatalError("xf86MapVidMemSparse: Could not (dense) mmap fb (%s)\n", strerror(errno)); - } } - return (pointer)((unsigned long)lnxBase + Base); + + if (((flags & VIDMEM_MMIO) && !(flags & VIDMEM_MMIO_32BIT)) || + ((flags & VIDMEM_FRAMEBUFFER) && (flags & VIDMEM_SPARSE))) + { + if (rets == (unsigned long)MAP_FAILED || + rets != (SPARSE_BASE + (Base << 5))) + { + FatalError("mapVidMemSparse: Could not (sparse) mmap fb (%s)\n", + strerror(errno)); + } + } + +#if 1 + if (rets) + xf86Msg(X_INFO,"mapVidMemSparse: mapped Base 0x%lx size 0x%lx" + " to DENSE at 0x%lx and SPARSE at 0x%lx\n", + Base, Size, ret, rets); + else + xf86Msg(X_INFO,"mapVidMemSparse: mapped Base 0x%lx size 0x%lx" + " to DENSE only at 0x%lx\n", + Base, Size, ret); + +#endif + return (pointer)(DENSE_BASE + Base); } static void unmapVidMemSparse(int ScreenNum, pointer Base, unsigned long Size) { + unsigned long Offset = (unsigned long)Base - DENSE_BASE; +#if 1 + xf86Msg(X_INFO,"unmapVidMemSparse: unmapping Base 0x%lx Size 0x%lx\n", + Base, Size); +#endif + /* Unmap DENSE always. */ + munmap((caddr_t)Base, Size); + + /* Unmap SPARSE always, and ignore error in case we did not map it. */ + munmap((caddr_t)(SPARSE_BASE + (Offset << 5)), Size << 5); } static int @@ -724,7 +775,7 @@ readSparse8(pointer Base, register unsigned long Offset) register unsigned long msb; mem_barrier(); - Offset += (unsigned long)Base - (unsigned long)lnxBase; + Offset += (unsigned long)Base - DENSE_BASE; shift = (Offset & 0x3) << 3; if (Offset >= (hae_thresh)) { msb = Offset & hae_mask; @@ -736,7 +787,7 @@ readSparse8(pointer Base, register unsigned long Offset) } mem_barrier(); - result = *(vuip) ((unsigned long)lnxSBase + (Offset << 5)); + result = *(vuip) (SPARSE_BASE + (Offset << 5)); result >>= shift; return 0xffUL & result; } @@ -748,7 +799,7 @@ readSparse16(pointer Base, register unsigned long Offset) register unsigned long msb; mem_barrier(); - Offset += (unsigned long)Base - (unsigned long)lnxBase; + Offset += (unsigned long)Base - DENSE_BASE; shift = (Offset & 0x2) << 3; if (Offset >= hae_thresh) { msb = Offset & hae_mask; @@ -760,7 +811,7 @@ readSparse16(pointer Base, register unsigned long Offset) } mem_barrier(); - result = *(vuip)((unsigned long)lnxSBase+(Offset<<5)+(1<<(5-2))); + result = *(vuip)(SPARSE_BASE + (Offset<<5) + (1<<(5-2))); result >>= shift; return 0xffffUL & result; } @@ -768,6 +819,7 @@ readSparse16(pointer Base, register unsigned long Offset) static int readSparse32(pointer Base, register unsigned long Offset) { + /* NOTE: this is really using DENSE. */ mem_barrier(); return *(vuip)((unsigned long)Base+(Offset)); } @@ -779,7 +831,7 @@ writeSparse8(int Value, pointer Base, register unsigned long Offset) register unsigned int b = Value & 0xffU; write_mem_barrier(); - Offset += (unsigned long)Base - (unsigned long)lnxBase; + Offset += (unsigned long)Base - DENSE_BASE; if (Offset >= hae_thresh) { msb = Offset & hae_mask; Offset -= msb; @@ -790,7 +842,7 @@ writeSparse8(int Value, pointer Base, register unsigned long Offset) } write_mem_barrier(); - *(vuip) ((unsigned long)lnxSBase + (Offset << 5)) = b * 0x01010101; + *(vuip) (SPARSE_BASE + (Offset << 5)) = b * 0x01010101; } static void @@ -800,7 +852,7 @@ writeSparse16(int Value, pointer Base, register unsigned long Offset) register unsigned int w = Value & 0xffffU; write_mem_barrier(); - Offset += (unsigned long)Base - (unsigned long)lnxBase; + Offset += (unsigned long)Base - DENSE_BASE; if (Offset >= hae_thresh) { msb = Offset & hae_mask; Offset -= msb; @@ -811,13 +863,13 @@ writeSparse16(int Value, pointer Base, register unsigned long Offset) } write_mem_barrier(); - *(vuip)((unsigned long)lnxSBase+(Offset<<5)+(1<<(5-2))) = - w * 0x00010001; + *(vuip)(SPARSE_BASE + (Offset<<5) + (1<<(5-2))) = w * 0x00010001; } static void writeSparse32(int Value, pointer Base, register unsigned long Offset) { + /* NOTE: this is really using DENSE. */ write_mem_barrier(); *(vuip)((unsigned long)Base + (Offset)) = Value; return; @@ -829,7 +881,7 @@ writeSparseNB8(int Value, pointer Base, register unsigned long Offset) register unsigned long msb; register unsigned int b = Value & 0xffU; - Offset += (unsigned long)Base - (unsigned long)lnxBase; + Offset += (unsigned long)Base - DENSE_BASE; if (Offset >= hae_thresh) { msb = Offset & hae_mask; Offset -= msb; @@ -838,7 +890,7 @@ writeSparseNB8(int Value, pointer Base, register unsigned long Offset) msb_set = msb; } } - *(vuip) ((unsigned long)lnxSBase + (Offset << 5)) = b * 0x01010101; + *(vuip) (SPARSE_BASE + (Offset << 5)) = b * 0x01010101; } static void @@ -847,7 +899,7 @@ writeSparseNB16(int Value, pointer Base, register unsigned long Offset) register unsigned long msb; register unsigned int w = Value & 0xffffU; - Offset += (unsigned long)Base - (unsigned long)lnxBase; + Offset += (unsigned long)Base - DENSE_BASE; if (Offset >= hae_thresh) { msb = Offset & hae_mask; Offset -= msb; @@ -856,13 +908,13 @@ writeSparseNB16(int Value, pointer Base, register unsigned long Offset) msb_set = msb; } } - *(vuip)((unsigned long)lnxSBase+(Offset<<5)+(1<<(5-2))) = - w * 0x00010001; + *(vuip)(SPARSE_BASE+(Offset<<5)+(1<<(5-2))) = w * 0x00010001; } static void writeSparseNB32(int Value, pointer Base, register unsigned long Offset) { + /* NOTE: this is really using DENSE. */ *(vuip)((unsigned long)Base + (Offset)) = Value; return; } diff --git a/xc/programs/Xserver/hw/xfree86/os-support/nto/Imakefile b/xc/programs/Xserver/hw/xfree86/os-support/nto/Imakefile index a7e2b2d4c..b724a381c 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/nto/Imakefile +++ b/xc/programs/Xserver/hw/xfree86/os-support/nto/Imakefile @@ -1,27 +1,36 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/nto/Imakefile,v 1.5 2000/08/15 16:05:38 dawes Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/nto/Imakefile,v 1.6 2001/11/16 16:47:56 dawes Exp $ XCOMM #include <Server.tmpl> SRCS = nto_io.c nto_init.c nto_kbdEv.c nto_ioperm.c nto_video.c \ - VTsw_noop.c posix_tty.c std_mseEv.c std_mouse.c kmod_noop.c agp_noop.c + VTsw_noop.c posix_tty.c kmod_noop.c agp_noop.c stdResource.c \ + stdPci.c libc_wrapper.c sigiostubs.c pm_noop.c nto_mouse.c OBJS = nto_io.o nto_init.o nto_kbdEv.o nto_ioperm.o nto_video.o \ - VTsw_noop.o posix_tty.o std_mseEv.o std_mouse.o kmod_noop.o agp_noop.o + VTsw_noop.o posix_tty.o kmod_noop.o agp_noop.o stdResource.o \ + stdPci.o libc_wrapper.o sigiostubs.o pm_noop.o nto_mouse.o INCLUDES = -I$(XF86COMSRC) -I$(XF86OSSRC) -I. -I$(SERVERSRC)/include \ -I$(XINCLUDESRC) +RESDEFINES = -DUSESTDRES + +DEFINES = $(RESDEFINES) + SubdirLibraryRule($(OBJS)) NormalLibraryObjectRule() -LinkSourceFile(IO_utils.c,../shared) +LinkSourceFile(libc_wrapper.c,../shared) +LinkSourceFile(sigiostubs.c,../shared) +LinkSourceFile(pm_noop.c,../shared) +LinkSourceFile(stdResource.c,../shared) +LinkSourceFile(stdPci.c,../shared) + LinkSourceFile(VTsw_noop.c,../shared) LinkSourceFile(posix_tty.c,../shared) -LinkSourceFile(std_mseEv.c,../shared) -LinkSourceFile(std_mouse.c,../shared) LinkSourceFile(kmod_noop.c,../shared) LinkSourceFile(agp_noop.c,../shared) 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 ac9f407a7..0db586fc5 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 @@ -104,9 +104,8 @@ typedef struct drm_tex_region { #include "i810_drm.h" #include "r128_drm.h" #include "radeon_drm.h" -#ifdef CONFIG_DRM_SIS #include "sis_drm.h" -#endif +#include "i830_drm.h" typedef struct drm_version { int version_major; /* Major version */ @@ -449,6 +448,12 @@ typedef struct drm_scatter_gather { #define DRM_IOCTL_I810_SWAP DRM_IO( 0x46) #define DRM_IOCTL_I810_COPY DRM_IOW( 0x47, drm_i810_copy_t) #define DRM_IOCTL_I810_DOCOPY DRM_IO( 0x48) +#define DRM_IOCTL_I810_OV0INFO DRM_IOR( 0x49, drm_i810_overlay_t) +#define DRM_IOCTL_I810_FSTATUS DRM_IO ( 0x4a) +#define DRM_IOCTL_I810_OV0FLIP DRM_IO ( 0x4b) +#define DRM_IOCTL_I810_MC DRM_IOW( 0x4c, drm_i810_mc_t) +#define DRM_IOCTL_I810_RSTATUS DRM_IO ( 0x4d ) + /* Rage 128 specific ioctls */ #define DRM_IOCTL_R128_INIT DRM_IOW( 0x40, drm_r128_init_t) @@ -483,7 +488,6 @@ typedef struct drm_scatter_gather { #define DRM_IOCTL_RADEON_INDIRECT DRM_IOWR(0x4d, drm_radeon_indirect_t) #define DRM_IOCTL_RADEON_TEXTURE DRM_IOWR(0x4e, drm_radeon_texture_t) -#ifdef CONFIG_DRM_SIS /* 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) @@ -493,6 +497,16 @@ typedef struct drm_scatter_gather { #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 + +/* I830 specific ioctls */ +#define DRM_IOCTL_I830_INIT DRM_IOW( 0x40, drm_i830_init_t) +#define DRM_IOCTL_I830_VERTEX DRM_IOW( 0x41, drm_i830_vertex_t) +#define DRM_IOCTL_I830_CLEAR DRM_IOW( 0x42, drm_i830_clear_t) +#define DRM_IOCTL_I830_FLUSH DRM_IO ( 0x43) +#define DRM_IOCTL_I830_GETAGE DRM_IO ( 0x44) +#define DRM_IOCTL_I830_GETBUF DRM_IOWR(0x45, drm_i830_dma_t) +#define DRM_IOCTL_I830_SWAP DRM_IO ( 0x46) +#define DRM_IOCTL_I830_COPY DRM_IOW( 0x47, drm_i830_copy_t) +#define DRM_IOCTL_I830_DOCOPY DRM_IO ( 0x48) #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 2f2f44a69..dd75087f9 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.79 2001/08/17 22:08:14 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/libc_wrapper.c,v 1.83 2002/01/14 18:34:34 dawes Exp $ */ /* * Copyright 1997 by The XFree86 Project, Inc. * @@ -37,6 +37,9 @@ #endif #include <sys/time.h> #include <math.h> +#ifdef sun +#include <ieeefp.h> +#endif #include <stdarg.h> #include <fcntl.h> #include "Xfuncproto.h" @@ -79,11 +82,6 @@ extern int mmapFd; #include <stdlib.h> #endif -#ifdef __CYGWIN__ -#define vsscanf sscanf -#define vfscanf fscanf -#endif - #define NEED_XF86_TYPES #define NEED_XF86_PROTOTYPES #define DONT_DEFINE_WRAPPERS @@ -1539,6 +1537,17 @@ xf86fabs(double x) return(fabs(x)); } +int +xf86finite(double x) +{ +#ifndef QNX4 + return(finite(x)); +#else + /* XXX Replace this with something that really works. */ + return 1; +#endif +} + double xf86floor(double x) { diff --git a/xc/programs/Xserver/hw/xfree86/os-support/shared/sigio.c b/xc/programs/Xserver/hw/xfree86/os-support/shared/sigio.c index 7f8cbc1db..1c8df4f9c 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/shared/sigio.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/shared/sigio.c @@ -25,7 +25,7 @@ * * Authors: Rickard E. (Rik) Faith <faith@valinux.com> * - * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/sigio.c,v 1.12 2000/11/14 21:59:24 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/sigio.c,v 1.13 2001/12/24 22:30:45 dawes Exp $ * */ @@ -107,7 +107,7 @@ xf86SIGIO (int sig) #endif } -int +static int xf86IsPipe (int fd) { struct stat buf; @@ -123,6 +123,7 @@ xf86InstallSIGIOHandler(int fd, void (*f)(int, void *), void *closure) struct sigaction sa; struct sigaction osa; int i; + int blocked; for (i = 0; i < MAX_FUNCS; i++) { @@ -140,6 +141,7 @@ xf86InstallSIGIOHandler(int fd, void (*f)(int, void *), void *closure) #endif return 0; } + blocked = xf86BlockSIGIO(); if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_ASYNC) == -1) { #ifdef XFree86Server xf86Msg(X_WARNING, "fcntl(%d, O_ASYNC): %s\n", @@ -148,6 +150,7 @@ xf86InstallSIGIOHandler(int fd, void (*f)(int, void *), void *closure) fprintf(stderr,"fcntl(%d, O_ASYNC): %s\n", fd, strerror(errno)); #endif + xf86UnblockSIGIO(blocked); return 0; } sigemptyset(&sa.sa_mask); @@ -163,6 +166,7 @@ xf86InstallSIGIOHandler(int fd, void (*f)(int, void *), void *closure) if (fd >= xf86SigIOMaxFd) xf86SigIOMaxFd = fd + 1; FD_SET (fd, &xf86SigIOMask); + xf86UnblockSIGIO(blocked); return 1; } /* Allow overwriting of the closure and callback */ 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 392ffef15..f24033739 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.17 2001/07/14 19:38:29 paulo Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/vbe/vbe.c,v 1.19 2001/11/16 19:17:27 dawes Exp $ */ /* * XFree86 vbe module @@ -166,6 +166,7 @@ vbeProbeDDC(vbeInfoPtr pVbe) xf86ExecX86int10(pVbe->pInt10); if ((pVbe->pInt10->ax & 0xff) != 0x4f) { + xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC not supported\n"); pVbe->ddc = DDC_NONE; return FALSE; } @@ -691,7 +692,7 @@ VBEBankSwitch(vbeInfoPtr pVbe, unsigned int iBank, int window) if (pVbe->pInt10->ax != 0x4f) return (FALSE); - return (0); + return (TRUE); } Bool diff --git a/xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h b/xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h index ebc19bf54..c29eb3b9c 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h @@ -64,7 +64,7 @@ * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h,v 3.52 2001/05/19 00:26:45 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h,v 3.54 2001/11/08 21:49:43 herrb Exp $ */ #ifndef _XF86_OSPROC_H #define _XF86_OSPROC_H @@ -93,6 +93,9 @@ * assumed when VIDMEM_MMIO is * set. May be used with * VIDMEM_FRAMEBUFFER) */ +#define VIDMEM_READONLY 0x20 /* read-only mapping + * used when reading BIOS images + * through xf86MapVidMem() */ /* * OS-independent modem state flags for xf86SetSerialModemState() and @@ -229,6 +232,9 @@ extern void xf86KbdEvents(void); extern int xf86XqueKbdProc(DeviceIntPtr, int); extern void xf86XqueEvents(void); #endif +#ifdef WSCONS_SUPPORT +extern void xf86WSKbdEvents(void); +#endif extern PMClose xf86OSPMOpen(void); #ifdef NEED_OS_RAC_PROTOS @@ -246,7 +252,10 @@ resPtr xf86IsaBusAccWindowsFromOS(void); resPtr xf86AccResFromOS(resPtr ret); #endif /* NEED_OS_RAC_PROTOS */ -Bool xf86GetPciSizeFromOS(PCITAG tag, int indx, int* bits); +extern Bool xf86GetPciSizeFromOS(PCITAG tag, int indx, int* bits); + +extern void xf86MakeNewMapping(int, int, unsigned long, unsigned long, pointer); +extern void xf86InitVidMem(void); #endif /* XF86_OS_PRIVS */ 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 1756eacff..e7514001d 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.47 2001/05/18 20:22:30 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_ansic.h,v 3.48 2001/12/31 18:13:37 herrb Exp $ */ #ifndef _XF86_ANSIC_H #define _XF86_ANSIC_H @@ -168,6 +168,7 @@ extern int xf86fgetc(XF86FILE*); extern int xf86getc(XF86FILE*); extern int xf86fgetpos(XF86FILE*,XF86fpos_t*); extern char* xf86fgets(char*,INT32,XF86FILE*); +extern int xf86finite(double); extern double xf86floor(double); extern double xf86fmod(double,double); extern XF86FILE* xf86fopen(const char*,const char*); diff --git a/xc/programs/Xserver/hw/xfree86/os-support/xf86_libc.h b/xc/programs/Xserver/hw/xfree86/os-support/xf86_libc.h index 7c9de85db..3b7738191 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/xf86_libc.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/xf86_libc.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_libc.h,v 3.50 2001/04/10 16:08:03 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_libc.h,v 3.51 2001/12/31 18:13:37 herrb Exp $ */ @@ -229,6 +229,8 @@ typedef int xf86jmp_buf[20]; #define fgetpos(FP,fpp) xf86fgetpos(FP,fpp) #undef fgets #define fgets(cp,i,FP) xf86fgets(cp,i,FP) +#undef finite +#define finite(d) xf86finite(d) #undef floor #define floor(d) xf86floor(d) #undef fmod diff --git a/xc/programs/Xserver/hw/xfree86/os-support/xf86drmI810.h b/xc/programs/Xserver/hw/xfree86/os-support/xf86drmI810.h index 8c8368877..0fba844ba 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/xf86drmI810.h +++ b/xc/programs/Xserver/hw/xfree86/os-support/xf86drmI810.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86drmI810.h,v 3.3 2001/04/01 14:00:14 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86drmI810.h,v 3.4 2001/09/27 08:25:04 alanh Exp $ */ /* WARNING: If you change any of these defines, make sure to change * the kernel include file as well (i810_drm.h) @@ -34,6 +34,8 @@ typedef struct _drmI810Init { unsigned int front_offset; unsigned int back_offset; unsigned int depth_offset; + unsigned int overlay_offset; + unsigned int overlay_physical; unsigned int w; unsigned int h; unsigned int pitch; diff --git a/xc/programs/Xserver/hw/xfree86/vgahw/vgaHW.c b/xc/programs/Xserver/hw/xfree86/vgahw/vgaHW.c index d49540c51..9a03b3e79 100644 --- a/xc/programs/Xserver/hw/xfree86/vgahw/vgaHW.c +++ b/xc/programs/Xserver/hw/xfree86/vgahw/vgaHW.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/vgahw/vgaHW.c,v 1.52 2001/08/18 02:51:21 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/vgahw/vgaHW.c,v 1.53 2001/09/18 21:23:23 herrb Exp $ */ /* * @@ -46,7 +46,7 @@ #define TEXT_AMOUNT 16384 /* bytes per plane to save for font data */ -#define FONT_AMOUNT 8192 +#define FONT_AMOUNT (8*8192) #if 0 /* Override all of these for now */ diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c index 3802131cf..a96797f1c 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c,v 1.10 2001/07/06 19:35:10 paulo Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/card-cfg.c,v 1.11 2001/11/01 19:08:58 paulo Exp $ */ #include "xf86config.h" @@ -258,9 +258,8 @@ CardModelCallback(Widget w, XtPointer user_data, XtPointer call_data) { Arg args[1]; XawListReturnStruct *info = (XawListReturnStruct *)call_data; - char tip[4096], *str; + char tip[4096]; int len; - static int first = 1; XtSetArg(args[0], XtNstring, info->string); XtSetValues(filter, args, 1); @@ -300,23 +299,13 @@ CardModelCallback(Widget w, XtPointer user_data, XtPointer call_data) len += XmuSnprintf(tip + len, sizeof(tip) - len, "\n%s\n", card_entry->lines); - /* the first tip memory, if any, cannot be released */ - if (!first) { - XtSetArg(args[0], XtNtip, &str); - XtGetValues(filter, args, 1); - XtFree(str); - } - else - first = 0; - #ifndef USE_MODULES XtSetArg(args[0], XtNstring, card_entry->driver ? card_entry->driver : "vga"); XtSetValues(driver, args, 1); #endif - str = XtNewString(tip); - XtSetArg(args[0], XtNtip, str); + XtSetArg(args[0], XtNtip, tip); XtSetValues(filter, args, 1); } diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/config.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/config.c index e628c8dbc..c67c747d1 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.6 2000/12/08 21:51:04 paulo Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/config.c,v 1.7 2001/10/01 13:44:15 eich Exp $ */ #include "config.h" @@ -116,7 +116,7 @@ StartConfig(void) /* Read initial configuration */ if ((filename = xf86openConfigFile(getuid() == 0 ? CONFPATH : USER_CONFPATH, XF86Config_path, NULL)) == NULL) { - fprintf(stderr, "Cannot to open config file.\n"); + fprintf(stderr, "Cannot open config file.\n"); exit(1); } XF86Config_path = (char *)filename; diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/help.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/help.c index 8006933a8..ebd3ecffa 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.5 2001/07/25 15:05:08 dawes Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/help.c,v 1.6 2001/10/28 03:34:06 tsi Exp $ */ #include <X11/IntrinsicP.h> @@ -1240,9 +1240,9 @@ Html_Puts(Html_Parser *parser, char *str) static void Html_FormatTag(Html_Parser *parser) { - int ch, sz = 0; + int ch = 0, sz = 0; char buf[32]; - Html_TagInfo *info; + Html_TagInfo *info = NULL; switch (Html_Peek(parser)) { case '!': @@ -1684,7 +1684,7 @@ Html_FontArgs(Html_Parser *parser, Html_Item *item) } } else if (strcmp(name, "size") == 0) { - int size, sign; + int size, sign = 0; if (isalnum(*value)) { size = atoi(value); diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/interface.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/interface.c index d50f8e2eb..b6f661f29 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.29 2001/07/08 00:44:33 paulo Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/interface.c,v 1.33 2001/11/30 12:12:04 eich Exp $ */ #include <X11/IntrinsicP.h> @@ -220,7 +220,7 @@ Usage(void) " -nomodules Use this option if xf86cfg is slow to start.\n" " -verbose <number> Verbosity used in the loader (default 1).\n" #endif -" -noverify Do not verify modules/options integrity.\n" +" -verify Verify modules/options integrity.\n" ); exit(1); @@ -250,6 +250,7 @@ main(int argc, char *argv[]) #ifdef USE_MODULES xf86Verbose = 1; #endif + noverify = True; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-xf86config") == 0) { @@ -282,8 +283,8 @@ main(int argc, char *argv[]) xf86Verbose = atoi(argv[++i]); } #endif - else if (strcmp(argv[i], "-noverify") == 0) - noverify = True; + else if (strcmp(argv[i], "-verify") == 0) + noverify = False; else Usage(); } @@ -493,8 +494,8 @@ main(int argc, char *argv[]) SelectLayoutCallback(layoutsme, XF86Config->conf_layout_lst, NULL); + startaccessx(); if (startedx) { - startaccessx(); switch (fork()) { case 0: { char path[PATH_MAX]; @@ -1270,8 +1271,6 @@ SetTip(xf86cfgDevice *device) XtSetArg(args[0], XtNtip, &tip); XtGetValues(device->widget, args, 1); - if (tip) - XtFree((XtPointer)tip); switch (device->type) { case MOUSE: { @@ -1359,7 +1358,7 @@ SetTip(xf86cfgDevice *device) option = (XF86OptionPtr)(option->list.next); } - tip = XtNewString(buffer); + tip = buffer; XtSetArg(args[0], XtNtip, tip); XtSetValues(device->widget, args, 1); } @@ -1577,7 +1576,7 @@ OptionsCallback(Widget w, XtPointer user_data, XtPointer call_data) #endif if (config_mode == CONFIG_SCREEN) { XF86OptionPtr option, options; - int rotate; + int rotate = 0; options = computer.screens[i]->screen->scrn_option_lst; if ((option = xf86findOption(options, "Rotate")) != NULL) { diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/keyboard-cfg.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/keyboard-cfg.c index 7a65545bf..32a8cac6c 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.14 2001/03/29 16:54:30 paulo Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/keyboard-cfg.c,v 1.17 2001/11/30 12:12:04 eich Exp $ */ #include "xf86config.h" @@ -771,7 +771,9 @@ WriteXKBConfiguration(char *filename, XkbConfigRtrnPtr conf) conf->mk_max_speed); fprintf(fp, "MouseKeysCurve = %d\n", conf->mk_curve); - fprintf(fp, "AccessXTimeout = %d\n", conf->ax_timeout); + if (conf->ax_timeout) + fprintf(fp, "AccessXTimeout = %d\n", + conf->ax_timeout); if (conf->initial_ctrls != 0) { fprintf(fp, "Controls %c= ", conf->replace_initial_ctrls ? ' ' : '+'); @@ -979,7 +981,7 @@ KeyboardRulesCallback(Widget w, XtPointer user_data, XtPointer call_data) model = xkb_info->defs.model = omodel; layout = xkb_info->defs.layout = olayout; variant = xkb_info->defs.variant = ovariant; - options = xkb_info->defs.options = ooptions; + options = XtNewString(xkb_info->defs.options = ooptions); xkb_rules = oxkb_rules; rules = xkb_rules->rules; @@ -1160,7 +1162,7 @@ UpdateRulesPopups(void) { int i; char *optname; - Widget sme, optpopup, optparent; + Widget sme, optpopup = NULL, optparent; /* MODEL */ if (modelp) diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/loader.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/loader.c index 2624096d0..d6cac2924 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/loader.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/loader.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/loader.c,v 1.15 2001/08/17 22:08:15 tsi Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/loader.c,v 1.18 2001/11/03 20:32:31 paulo Exp $ */ #include "config.h" @@ -42,6 +42,7 @@ #include <string.h> #include <setjmp.h> #include <signal.h> +#include <ctype.h> #include <stdarg.h> @@ -55,7 +56,7 @@ static Bool EnumDatabase(XrmDatabase*, XrmBindingList, XrmQuarkList, XrmRepresentation*, XrmValue*, XPointer); extern void CheckChipsets(xf86cfgModuleOptions*, int*); -static jmp_buf jmp; +static sigjmp_buf jmp; int signal_caught; int error_level; char *loaderPath, **loaderList, **ploaderList; @@ -108,8 +109,9 @@ sig_handler(int sig) abort(); ++signal_caught; ErrorF(" ERROR SIG%s caught!\n", str); - error_level += 50; - longjmp(jmp, 1); + if (!noverify) + error_level += 50; + siglongjmp(jmp, 1); /*NOTREACHED*/ } @@ -132,16 +134,18 @@ EnumDatabase(XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks, { char *res = XrmQuarkToString(quarks[1]); - option = module_options->option; - while (option->name) { - if (strcmp(option->name, res) == 0) - return (False); - ++option; + if (res) { + option = module_options->option; + while (option->name) { + if (strcasecmp(option->name, res) == 0) + return (False); + ++option; + } + CheckMsg(CHECKER_OPTION_UNUSED, + "WARNING %s.%s is not used\n", + XrmQuarkToString(quarks[0]), res); + ++error_level; } - CheckMsg(CHECKER_OPTION_UNUSED, - "WARNING %s.%s is not used\n", - XrmQuarkToString(quarks[0]), res); - ++error_level; return (False); } @@ -151,13 +155,14 @@ LoaderInitializeOptions(void) { static int first = 1; static char *modules = "lib/modules"; - Bool options_ok = False; - char query[256]; + volatile Bool options_ok = False; + char *ptr, query[256]; + char *ptr2, query2[256]; char *type; XrmValue value; XrmQuark names[2]; XrmQuark classes[2]; - int i; + volatile int i; static ModuleType module_types[] = { GenericModule, FontRendererModule, InputModule, VideoModule, NullModule }; @@ -251,18 +256,18 @@ LoaderInitializeOptions(void) if (loaderList) { for (ploaderList = loaderList; *ploaderList; ploaderList++) { - if (!noverify) { - if (setjmp(jmp) == 0) { + signal_caught = 0; + signal(SIGTRAP, sig_handler); + signal(SIGBUS, sig_handler); + signal(SIGSEGV, sig_handler); + signal(SIGILL, sig_handler); + signal(SIGFPE, sig_handler); + if (sigsetjmp(jmp, 1) == 0) { + if (!noverify) { int ok, nfont_modules; nfont_modules = numFontModules; error_level = 0; - signal_caught = 0; - signal(SIGTRAP, sig_handler); - signal(SIGBUS, sig_handler); - signal(SIGSEGV, sig_handler); - signal(SIGILL, sig_handler); - signal(SIGFPE, sig_handler); ErrorF("CHECK MODULE %s\n", *ploaderList); if ((ok = xf86cfgCheckModule()) == 0) { CheckMsg(CHECKER_LOAD_FAILED, @@ -275,11 +280,6 @@ LoaderInitializeOptions(void) module_strs[module_type]); ++error_level; } - signal(SIGTRAP, SIG_DFL); - signal(SIGBUS, SIG_DFL); - signal(SIGSEGV, SIG_DFL); - signal(SIGILL, SIG_DFL); - signal(SIGFPE, SIG_DFL); if (ok) { if (options_ok) { if ((module_options == NULL || module_options->option == NULL) && @@ -294,7 +294,13 @@ LoaderInitializeOptions(void) while (option->name) { XmuSnprintf(query, sizeof(query), "%s.%s", *ploaderList, option->name); - if (!XrmGetResource(options_xrm, query, "Module.Option", &type, &value) || + for (ptr = query, ptr2 = query2; *ptr; ptr++) { + if (*ptr != '_' && *ptr != ' ' && *ptr != '\t') + *ptr2 = tolower(*ptr); + } + *ptr2 = '\0'; + /* all resources are in lowercase */ + if (!XrmGetResource(options_xrm, query2, "Module.Option", &type, &value) || value.addr == NULL) { CheckMsg(CHECKER_OPTION_DESCRIPTION_MISSING, "WARNING no description for %s\n", query); @@ -358,11 +364,16 @@ LoaderInitializeOptions(void) ++error_level; } } + ErrorF(" SUMMARY error_level set to %d.\n\n", error_level); } - ErrorF(" SUMMARY error_level set to %d.\n\n", error_level); + else + (void)xf86cfgCheckModule(); } - else - (void)xf86cfgCheckModule(); + signal(SIGTRAP, SIG_DFL); + signal(SIGBUS, SIG_DFL); + signal(SIGSEGV, SIG_DFL); + signal(SIGILL, SIG_DFL); + signal(SIGFPE, SIG_DFL); } xf86cfgLoaderFreeList(); } diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/options.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/options.c index 00724873c..10828a94a 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.10 2001/07/06 02:04:10 paulo Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/options.c,v 1.12 2001/11/03 20:32:31 paulo Exp $ */ #include "options.h" @@ -41,6 +41,7 @@ #include <X11/Xaw/SimpleMenP.h> #include <X11/Xaw/SmeBSB.h> #include <X11/Xaw/Viewport.h> +#include <ctype.h> /* * Prototypes @@ -57,6 +58,8 @@ static void SelectModuleCallback(Widget, XtPointer, XtPointer); static void SelectModuleOptionCallback(Widget, XtPointer, XtPointer); static void ModuleOptionsPopdown(Widget, XtPointer, XtPointer); #endif +static Bool EnumDatabase(XrmDatabase*, XrmBindingList, XrmQuarkList, + XrmRepresentation*, XrmValue*, XPointer); /* * Initialization @@ -68,6 +71,10 @@ static char *option_str; static int option_index, popped = False; static char *Options = "lib/X11/Options"; XrmDatabase options_xrm; +struct { + char *string; + int offset; +} rebuild_xrm; #ifdef USE_MODULES static Widget modList, optList, desc, modOptionsShell, labelType; static char *module_sel; @@ -242,7 +249,7 @@ OptionsPopup(XF86OptionPtr *opts) option_str = NULL; options = opts; if (first) { - Widget pane, form, viewport, bottom, popdown, command; + Widget pane, form, viewport, bottom, popdown; first = 0; @@ -264,6 +271,8 @@ OptionsPopup(XF86OptionPtr *opts) XtAddCallback(update, XtNcallback, UpdateOption, NULL); #ifdef USE_MODULES if (!nomodules) { + Widget command; + command = XtCreateManagedWidget("help", commandWidgetClass, form, NULL, 0); XtAddCallback(command, XtNcallback, ModuleOptionsPopup, NULL); @@ -583,7 +592,7 @@ SelectModuleOptionCallback(Widget w, XtPointer user_data, XtPointer call_data) OptionInfoPtr opts = mod->option; while (opts && opts->name) { - if (strcmp(info->string, opts->name) == 0) + if (strcasecmp(opts->name, info->string) == 0) break; ++opts; } @@ -648,6 +657,71 @@ UpdateOption(Widget w, XtPointer user_data, XtPointer call_data) XtSetSensitive(update, True); } +/*ARGUSED*/ +static Bool +EnumDatabase(XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks, + XrmRepresentation *type, XrmValue *value, XPointer closure) +{ + char *module = XrmQuarkToString(quarks[0]), + *option = XrmQuarkToString(quarks[1]); + + /* handle *.Option: value */ + if (module && option == NULL) { + option = module; + module = "*"; + } + + /* + * NOTE: If the Options file is changed to support any other format than + * + * Module.Option: description text + * + * this code will also need to be updated. + */ + + if (module) { + XrmValue xrm; + char *type, *value, query[256]; + + XmuSnprintf(query, sizeof(query), "%s.%s", module, option); + if (XrmGetResource(options_xrm, query, "Module.Option", &type, &xrm)) + value = (char*)xrm.addr; + else + value = NULL; + + if (value) { + char *norm; + unsigned char *ptr; + int position; + int length = strlen(module) + strlen(option) + strlen(value) + 4; + + rebuild_xrm.string = XtRealloc(rebuild_xrm.string, + rebuild_xrm.offset + length); + position = rebuild_xrm.offset + + sprintf(rebuild_xrm.string + rebuild_xrm.offset, "%s.%s:", + module, option); + + /* removes underlines and spaces */ + norm = strchr(rebuild_xrm.string + rebuild_xrm.offset, '.') + 1; + for (; *norm; norm++) { + if (*norm == '_' || *norm == ' ' || *norm == '\t') { + memmove(norm, norm + 1, strlen(norm) + 1); + --position; + --length; + } + } + + for (ptr = (unsigned char*)rebuild_xrm.string + rebuild_xrm.offset; + *ptr; ptr++) + *ptr = tolower(*ptr); + sprintf(rebuild_xrm.string + position, "%s\n", value); + rebuild_xrm.offset += length - 1; + } + } + + return (False); +} + Bool InitializeOptionsDatabase(void) { @@ -655,12 +729,35 @@ InitializeOptionsDatabase(void) static Bool result = True; if (first) { + XrmQuark names[2]; + XrmQuark classes[2]; + first = 0; XrmInitialize(); if ((options_xrm = XrmGetFileDatabase(Options)) == (XrmDatabase)0) { fprintf(stderr, "Cannot open '%s' database.\n", Options); - return (result = False); + return (False); + } + + /* rebuild database, using only lowercase characters */ + names[0] = classes[0] = names[1] = classes[1] = NULLQUARK; + (void)XrmEnumerateDatabase(options_xrm, (XrmNameList)&names, + (XrmClassList)&classes, XrmEnumAllLevels, + EnumDatabase, NULL); + + /* free previous database, as it is not guaranteed to be + * "case insensitive" */ + XrmDestroyDatabase(options_xrm); + + /* create case insensitive database by making everything lowercase */ + if (rebuild_xrm.string == NULL || + (options_xrm = XrmGetStringDatabase(rebuild_xrm.string)) == + (XrmDatabase)0) { + fprintf(stderr, "Cannot rebuild '%s' database.\n", Options); + XtFree(rebuild_xrm.string); + return (False); } + XtFree(rebuild_xrm.string); } return (result); @@ -672,10 +769,18 @@ GetOptionDescription(char *module, char *option) char *type; XrmValue value; char query[256]; + unsigned char *ptr; InitializeOptionsDatabase(); XmuSnprintf(query, sizeof(query), "%s.%s", module, option); + ptr = (unsigned char*)strchr(query, '.') + 1; + for (; *ptr; ptr++) { + if (*ptr == '_' || *ptr == ' ' || *ptr == '\t') + memmove(ptr, ptr + 1, strlen((char*)ptr) + 1); + } + for (ptr = (unsigned char*)query; *ptr; ptr++) + *ptr = tolower(*ptr); if (XrmGetResource(options_xrm, query, "Module.Option", &type, &value)) return ((char*)value.addr); diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/screen-cfg.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/screen-cfg.c index 36f40828e..4ca9e8373 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.9 2001/05/21 22:21:57 paulo Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/screen-cfg.c,v 1.10 2001/10/28 03:34:08 tsi Exp $ */ #include "xf86config.h" @@ -146,7 +146,7 @@ ScreenConfig(XtPointer conf) (&xf86info); if (ConfigLoop(NULL) == True) { - XF86ModePtr prev, mod; + XF86ModePtr prev = NULL, mod; /* user may have changed the default depth, read variables again */ disp = screen->scrn_display_lst; diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/screen.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/screen.c index 3b2f194f6..0179dbba6 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.7 2001/07/08 05:46:35 paulo Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/screen.c,v 1.8 2001/10/28 03:34:08 tsi Exp $ */ #include <X11/IntrinsicP.h> @@ -563,7 +563,7 @@ DrawScreenMask(Display *dpy, Drawable win, GC gc, int xs, int ys, int xe, int ye { double xfact, yfact; XPoint points[(sizeof(lin) / sizeof(lin[0])) >> 1]; - int i, x, y, width, height; + int i = 0, x = 0, y = 0, width, height; if (rotate) { xfact = (xe - xs) / 80.0; @@ -923,7 +923,7 @@ UpdateScreenUI(void) qsort(computer.screens, computer.num_screens, sizeof(xf86cfgScreen*), qcmp_screen); - adj = prev, base = NULL; + adj = prev = left = base = NULL; for (i = p = scrno = 0; i < computer.num_screens; i++) { XF86ConfScreenPtr scr = computer.screens[i]->screen; diff --git a/xc/programs/Xserver/hw/xfree86/xf86cfg/startx.c b/xc/programs/Xserver/hw/xfree86/xf86cfg/startx.c index b5199c00a..5d82d2741 100644 --- a/xc/programs/Xserver/hw/xfree86/xf86cfg/startx.c +++ b/xc/programs/Xserver/hw/xfree86/xf86cfg/startx.c @@ -26,7 +26,7 @@ * * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> * - * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/startx.c,v 1.6 2000/12/06 15:35:34 eich Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/xf86cfg/startx.c,v 1.7 2002/01/07 20:38:29 dawes Exp $ */ #include "config.h" @@ -86,7 +86,12 @@ startx(void) if ((home = getenv("HOME")) == NULL) home = "/"; +#ifndef QNX4 XmuSnprintf(filename, sizeof(filename), "%s/XF86Config.new", home); +#else + XmuSnprintf(filename, sizeof(filename), "//%d%s/XF86Config.new", + getnid(), home); +#endif /* this memory is never released, even if the value of XF86Config_path is * changed. diff --git a/xc/programs/Xserver/hw/xnest/Display.c b/xc/programs/Xserver/hw/xnest/Display.c index 660f89817..d8cefcc6f 100644 --- a/xc/programs/Xserver/hw/xnest/Display.c +++ b/xc/programs/Xserver/hw/xnest/Display.c @@ -12,7 +12,7 @@ the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. */ -/* $XFree86: xc/programs/Xserver/hw/xnest/Display.c,v 3.2 2001/01/17 22:36:55 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xnest/Display.c,v 3.4 2001/10/28 03:34:10 tsi Exp $ */ #include <X11/X.h> @@ -185,8 +185,6 @@ void xnestOpenDisplay(argc, argv) void xnestCloseDisplay() { - int i; - if (!xnestDoFullGeneration || !xnestDisplay) return; /* diff --git a/xc/programs/Xserver/hw/xnest/TestExt.c b/xc/programs/Xserver/hw/xnest/TestExt.c index b29c7564c..7f5a5907d 100644 --- a/xc/programs/Xserver/hw/xnest/TestExt.c +++ b/xc/programs/Xserver/hw/xnest/TestExt.c @@ -12,7 +12,7 @@ the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. */ -/* $XFree86: xc/programs/Xserver/hw/xnest/TestExt.c,v 3.4 2001/08/01 00:44:57 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xnest/TestExt.c,v 3.5 2001/08/27 17:41:00 dawes Exp $ */ #include <X11/X.h> #include <X11/Xproto.h> diff --git a/xc/programs/Xserver/hw/xnest/Xnest.h b/xc/programs/Xserver/hw/xnest/Xnest.h index fe8ac62df..64b09de7e 100644 --- a/xc/programs/Xserver/hw/xnest/Xnest.h +++ b/xc/programs/Xserver/hw/xnest/Xnest.h @@ -28,6 +28,7 @@ other dealings in this Software without prior written authorization from the X Consortium. */ +/* $XFree86: xc/programs/Xserver/hw/xnest/Xnest.h,v 1.3 2001/08/28 16:48:08 tsi Exp $ */ /* ** Machines with a 64 bit library interface and a 32 bit server require diff --git a/xc/programs/Xserver/hw/xwin/Imakefile b/xc/programs/Xserver/hw/xwin/Imakefile index dd7017f63..2e6df3f83 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.10 2001/07/02 09:37:16 alanh Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/xwin/Imakefile,v 1.12 2001/11/11 22:45:57 alanh Exp $ #include <Server.tmpl> @@ -38,7 +38,10 @@ SRCS = InitInput.c \ winmouse.c \ wincutpaste.c \ winnativegdi.c \ - winlayer.c + winlayer.c \ + winerror.c \ + winengine.c \ + wincreatewnd.c OBJS = InitInput.o \ InitOutput.o \ @@ -69,7 +72,10 @@ OBJS = InitInput.o \ winmouse.o \ wincutpaste.o \ winnativegdi.o \ - winlayer.o + winlayer.o \ + winerror.o \ + winengine.o \ + wincreatewnd.o INCLUDES = -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ -I$(SERVERSRC)/fb -I$(SERVERSRC)/mi \ diff --git a/xc/programs/Xserver/hw/xwin/InitOutput.c b/xc/programs/Xserver/hw/xwin/InitOutput.c index 68b4c3dc2..9f548db28 100644 --- a/xc/programs/Xserver/hw/xwin/InitOutput.c +++ b/xc/programs/Xserver/hw/xwin/InitOutput.c @@ -3,7 +3,11 @@ Copyright 1993, 1998 The Open Group -All Rights Reserved. +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. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -22,7 +26,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/programs/Xserver/hw/xwin/InitOutput.c,v 1.17 2001/08/06 11:02:30 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xwin/InitOutput.c,v 1.27 2001/12/14 19:59:53 dawes Exp $ */ #include "win.h" @@ -35,8 +39,10 @@ int g_iCmapPrivateIndex = -1; int g_iGCPrivateIndex = -1; int g_iPixmapPrivateIndex = -1; unsigned long g_ulServerGeneration = 0; -HBITMAP g_hbmpGarbage = NULL; -static Bool g_fScreenInfoInitialized = FALSE; +Bool g_fInitializedDefaultScreens = FALSE; +FILE *g_pfLog = NULL; + +extern void OsVendorVErrorF (const char *pszFormat, va_list va_args); static PixmapFormatRec g_PixmapFormats[] = { { 1, 1, BITMAP_SCANLINE_PAD }, @@ -50,11 +56,26 @@ static PixmapFormatRec g_PixmapFormats[] = { const int NUMFORMATS = sizeof (g_PixmapFormats) / sizeof (g_PixmapFormats[0]); + void winInitializeDefaultScreens (void) { int i; - + DWORD dwWidth, dwHeight; + + /* Bail out early if default screens have already been initialized */ + if (g_fInitializedDefaultScreens) + return; + + /* Zero the memory used for storing the screen info */ + ZeroMemory (g_ScreenInfo, MAXSCREENS * sizeof (winScreenInfo)); + + /* Get default width and height */ + dwWidth = GetSystemMetrics (SM_CXSCREEN); + dwHeight = GetSystemMetrics (SM_CYSCREEN); + + ErrorF ("winInitializeDefaultScreens () - w %d h %d\n", dwWidth, dwHeight); + /* Set a default DPI, if no parameter was passed */ if (monitorResolution == 0) monitorResolution = WIN_DEFAULT_DPI; @@ -62,22 +83,27 @@ winInitializeDefaultScreens (void) for (i = 0; i < MAXSCREENS; ++i) { g_ScreenInfo[i].dwScreen = i; - g_ScreenInfo[i].dwWidth = WIN_DEFAULT_WIDTH; - g_ScreenInfo[i].dwHeight = WIN_DEFAULT_HEIGHT; + g_ScreenInfo[i].dwWidth = dwWidth; + g_ScreenInfo[i].dwHeight = dwHeight; g_ScreenInfo[i].dwDepth = WIN_DEFAULT_DEPTH; g_ScreenInfo[i].dwRefreshRate = WIN_DEFAULT_REFRESH; g_ScreenInfo[i].pfb = NULL; g_ScreenInfo[i].fFullScreen = FALSE; g_ScreenInfo[i].iE3BTimeout = WIN_E3B_OFF; - g_ScreenInfo[i].dwWidth_mm = (WIN_DEFAULT_WIDTH / WIN_DEFAULT_DPI) + g_ScreenInfo[i].dwWidth_mm = (dwWidth / WIN_DEFAULT_DPI) * 25.4; - g_ScreenInfo[i].dwHeight_mm = (WIN_DEFAULT_HEIGHT / WIN_DEFAULT_DPI) + g_ScreenInfo[i].dwHeight_mm = (dwHeight / WIN_DEFAULT_DPI) * 25.4; g_ScreenInfo[i].fUseWinKillKey = WIN_DEFAULT_WIN_KILL; g_ScreenInfo[i].fUseUnixKillKey = WIN_DEFAULT_UNIX_KILL; + g_ScreenInfo[i].fIgnoreInput = FALSE; } + + /* Signal that the default screens have been initialized */ + g_fInitializedDefaultScreens = TRUE; } + DWORD winBitsPerPixel (DWORD dwDepth) { @@ -87,6 +113,7 @@ winBitsPerPixel (DWORD dwDepth) else return 32; } + /* See Porting Layer Definition - p. 57 */ void ddxGiveUp() @@ -105,10 +132,21 @@ ddxGiveUp() g_fdMessageQueue = WIN_FD_INVALID; } + /* Close the log file handle */ + if (g_pfLog != NULL) + { + /* Close log file */ + fclose (g_pfLog); + + /* Set the file handle to invalid */ + g_pfLog = NULL; + } + /* Tell Windows that we want to end the app */ PostQuitMessage (0); } + /* See Porting Layer Definition - p. 57 */ void AbortDDX (void) @@ -119,55 +157,77 @@ AbortDDX (void) ddxGiveUp (); } + void OsVendorInit (void) { -#if CYGDEBUG - ErrorF ("OsVendorInit ()\n"); +#ifdef DDXOSVERRORF + if (!OsVendorVErrorFProc) + OsVendorVErrorFProc = OsVendorVErrorF; + + /* Open log file if not yet open */ + if (g_pfLog == NULL) + g_pfLog = fopen (WIN_LOG_FNAME, "w"); #endif /* Add a default screen if no screens were specified */ if (g_iNumScreens == 0) { - if (!g_fScreenInfoInitialized) - winInitializeDefaultScreens (); + /* + * We need to initialize default screens if no arguments + * were processed. Otherwise, the default screens would + * already have been initialized by ddxProcessArgument (). + */ + winInitializeDefaultScreens (); + /* + * Add a screen 0 using the defaults set by + * winInitializeDefaultScreens () and any additional parameters + * processed by ddxProcessArgument (). + */ g_iNumScreens = 1; g_iLastScreen = 0; - - g_ScreenInfo[0].dwWidth = GetSystemMetrics (SM_CXSCREEN); - g_ScreenInfo[0].dwHeight = GetSystemMetrics (SM_CYSCREEN); } } + /* See Porting Layer Definition - p. 57 */ void ddxUseMsg (void) { - ErrorF ("-screen scr_num width height\n" - "\tSet screen scr_num's width and height\n"); + ErrorF ("-depth bits_per_pixel\n" + "\tSpecify an optional bitdepth to use in fullscreen mode\n" + "\twith a DirectDraw engine.\n"); + + ErrorF ("-emulate3buttons [timeout]\n" + "\tEmulate 3 button mouse with an optional timeout in " + "milliseconds\n"); + ErrorF ("-engine engine_type_id\n" "\tOverride the server's automatically selected engine type:\n" - "\t\t1 - GDI blitter\t\t1\n" - "\t\t2 - DirectDraw blitter\t2\n" - "\t\t4 - DirectDraw4 blitter\t4\n"); + "\t\t1 - Shadow GDI\n" + "\t\t2 - Shadow DirectDraw\n" + "\t\t4 - Shadow DirectDraw4\n" + "\t\t16 - Native GDI - experimental\n"); + ErrorF ("-fullscreen\n" "\tRun the server in fullscreen mode\n"); - ErrorF ("-depth bits_per_pixel\n" - "\tSpecify an optional bitdepth to use in fullscreen mode\n" - "\twith a DirectDraw engine.\n"); + ErrorF ("-refresh rate_in_Hz\n" "\tSpecify an optional refresh rate to use in fullscreen mode\n" "\twith a DirectDraw engine.\n"); - ErrorF ("-emulate3buttons [timeout]\n" - "\tEmulate 3 button mouse with an optional timeout in " - "milliseconds\n"); - ErrorF ("-[no]winkill\n" - "\tAlt+F4 exits the XServer\n"); + + ErrorF ("-screen scr_num width height\n" + "\tSet screen scr_num's width and height\n"); + ErrorF ("-[no]unixkill\n" - "\tCtrl+Alt+Backspace exits the XServer\n"); + "\tCtrl+Alt+Backspace exits the X Server\n"); + + ErrorF ("-[no]winkill\n" + "\tAlt+F4 exits the X Server\n"); } + /* See Porting Layer Definition - p. 57 */ /* * INPUT @@ -186,22 +246,45 @@ ddxUseMsg (void) * you may check if i is greater than or equal to argc, in which case * you should display the UseMsg () and return 0. */ + int ddxProcessArgument (int argc, char *argv[], int i) { - ErrorF ("ddxProcessArgument ()\n"); + static Bool beenHere = FALSE; - /* Run some initialization procedures the first time through */ - if (!g_fScreenInfoInitialized) + /* Initialize once */ + if (!beenHere) { +#ifdef DDXOSVERRORF + /* + * This initialises our hook into VErrorF () for catching log messages + * that are generated before OsInit () is called. + */ + OsVendorVErrorFProc = OsVendorVErrorF; + + /* Open log file if not yet open */ + if (g_pfLog == NULL) + g_pfLog = fopen (WIN_LOG_FNAME, "w"); +#endif + + beenHere = TRUE; + + /* Detach from any console we are connected to */ + FreeConsole (); + + /* + * Initialize default screen settings. We have to do this before + * OsVendorInit () gets called, otherwise we will overwrite + * settings changed by parameters such as -fullscreen, etc. + */ + ErrorF ("ddxProcessArgument () - Initializing default screens\n"); winInitializeDefaultScreens (); - g_fScreenInfoInitialized = TRUE; - } - - /* Set a default DPI */ - if (monitorResolution == 0) - monitorResolution = WIN_DEFAULT_DPI; + } +#if CYGDEBUG + ErrorF ("ddxProcessArgument ()\n"); +#endif + /* * Look for the '-screen scr_num width height' argument */ @@ -353,6 +436,32 @@ ddxProcessArgument (int argc, char *argv[], int i) } /* + * Look for the '-ignoreinput' argument + */ + if (strcmp(argv[i], "-ignoreinput") == 0) + { + /* Is this parameter attached to a screen or is it global? */ + if (-1 == g_iLastScreen) + { + int j; + + /* Parameter is for all screens */ + for (j = 0; j < MAXSCREENS; j++) + { + g_ScreenInfo[j].fIgnoreInput = TRUE; + } + } + else + { + /* Parameter is for a single screen */ + g_ScreenInfo[g_iLastScreen].fIgnoreInput = TRUE; + } + + /* Indicate that we have processed this argument */ + return 1; + } + + /* * Look for the '-emulate3buttons' argument */ if (strcmp(argv[i], "-emulate3buttons") == 0) @@ -583,6 +692,7 @@ ddxProcessArgument (int argc, char *argv[], int i) return 0; } + #ifdef DDXTIME /* from ServerOSDefines */ CARD32 GetTimeInMillis (void) @@ -591,6 +701,7 @@ GetTimeInMillis (void) } #endif /* DDXTIME */ + /* See Porting Layer Definition - p. 20 */ /* We use ddxProcessArgument, so we don't need to touch argc and argv */ void diff --git a/xc/programs/Xserver/mi/miinitext.c b/xc/programs/Xserver/mi/miinitext.c index cbb8454fb..cf24b02ea 100644 --- a/xc/programs/Xserver/mi/miinitext.c +++ b/xc/programs/Xserver/mi/miinitext.c @@ -1,9 +1,13 @@ -/* $XFree86: xc/programs/Xserver/mi/miinitext.c,v 3.60 2001/08/06 20:51:18 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/mi/miinitext.c,v 3.63 2001/12/14 20:00:23 dawes Exp $ */ /*********************************************************** Copyright 1987, 1998 The Open Group -All Rights Reserved. +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. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -41,7 +45,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ -/* $Xorg: miinitext.c,v 1.3 2000/08/17 19:53:38 cpqbld Exp $ */ +/* $Xorg: miinitext.c,v 1.4 2001/02/09 02:05:21 xorgcvs Exp $ */ #include "misc.h" #include "extension.h" @@ -441,9 +445,6 @@ static ExtensionModule staticExtensions[] = { #ifdef XIDLE { XIdleExtensionInit, "XIDLE", NULL, NULL, NULL }, #endif -#ifdef XTRAP - { DEC_XTRAPInit, "XTRAP", &noTestExtensions, NULL, NULL }, -#endif #ifdef XKB { XkbExtensionInit, XkbName, &noXkbExtension, NULL, NULL }, #endif diff --git a/xc/programs/Xserver/os/Imakefile b/xc/programs/Xserver/os/Imakefile index e1c371146..3e6e495a0 100644 --- a/xc/programs/Xserver/os/Imakefile +++ b/xc/programs/Xserver/os/Imakefile @@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:53:40 cpqbld Exp $ -XCOMM $XFree86: xc/programs/Xserver/os/Imakefile,v 3.33 2001/08/01 00:44:59 tsi Exp $ +XCOMM $XFree86: xc/programs/Xserver/os/Imakefile,v 3.34 2001/10/28 03:34:16 tsi Exp $ #include <Server.tmpl> @@ -109,9 +109,14 @@ BOOTSTRAPCFLAGS = #if HasPam && HasPamMisc PAM_DEFINES = -DUSE_PAM #endif - DEFINES = -DXSERV_t -DTRANS_SERVER $(CONNECTION_FLAGS) $(MEM_DEFINES) $(XDMAUTHDEFS) $(RPCDEFS) $(SIGNAL_DEFINES) $(OS_DEFINES) $(KRB5_DEFINES) $(RGB_DEFINES) - INCLUDES = -I. -I../include -I$(XINCLUDESRC) -I$(EXTINCSRC) -I$(FONTINCSRC) -I$(TOP)/lib/Xau -I../lbx Krb5Includes - DEPEND_DEFINES = $(DBM_DEFINES) $(XDMCP_DEFINES) $(EXT_DEFINES) $(TRANS_INCLUDES) $(CONNECTION_FLAGS) DependDefines + DEFINES = -DXSERV_t -DTRANS_SERVER $(CONNECTION_FLAGS) $(MEM_DEFINES) \ + $(XDMAUTHDEFS) $(RPCDEFS) $(SIGNAL_DEFINES) $(OS_DEFINES) \ + $(KRB5_DEFINES) $(RGB_DEFINES) + INCLUDES = -I. -I../include -I$(XINCLUDESRC) -I$(EXTINCSRC) \ + -I$(SERVERSRC)/Xext -I$(FONTINCSRC) \ + -I$(TOP)/lib/Xau -I../lbx Krb5Includes + DEPEND_DEFINES = $(DBM_DEFINES) $(XDMCP_DEFINES) $(EXT_DEFINES) \ + $(TRANS_INCLUDES) $(CONNECTION_FLAGS) DependDefines LINTLIBS = ../dix/llib-ldix.ln #ifdef NEED_ALLOCA_FROM_LIBPW diff --git a/xc/programs/Xserver/os/auth.c b/xc/programs/Xserver/os/auth.c index f482c5c1f..25955b933 100644 --- a/xc/programs/Xserver/os/auth.c +++ b/xc/programs/Xserver/os/auth.c @@ -1,9 +1,13 @@ -/* $Xorg: auth.c,v 1.3 2000/08/17 19:53:40 cpqbld Exp $ */ +/* $Xorg: auth.c,v 1.5 2001/02/09 02:05:23 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group -All Rights Reserved. +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. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -22,7 +26,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/programs/Xserver/os/auth.c,v 1.6 2001/01/17 22:37:10 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/os/auth.c,v 1.10 2001/12/14 20:00:33 dawes Exp $ */ /* * authorization hooks for the server @@ -204,8 +208,10 @@ CheckAuthorization ( if (!authorization_file || stat(authorization_file, &buf)) { - lastmod = 0; - ShouldLoadAuth = TRUE; /* stat lost, so force reload */ + if (lastmod != 0) { + lastmod = 0; + ShouldLoadAuth = TRUE; /* stat lost, so force reload */ + } } else if (buf.st_mtime > lastmod) { @@ -219,14 +225,16 @@ CheckAuthorization ( else EnableLocalHost (); } - if (name_length) + if (name_length) { for (i = 0; i < NUM_AUTHORIZATION; i++) { if (protocols[i].name_length == name_length && memcmp (protocols[i].name, name, (int) name_length) == 0) { return (*protocols[i].Check) (data_length, data, client, reason); } + *reason = "Protocol not supported by server\n"; } + } else *reason = "No protocol specified\n"; return (XID) ~0L; } diff --git a/xc/programs/Xserver/os/xdmcp.c b/xc/programs/Xserver/os/xdmcp.c index 04d6e9241..175310df1 100644 --- a/xc/programs/Xserver/os/xdmcp.c +++ b/xc/programs/Xserver/os/xdmcp.c @@ -1,4 +1,4 @@ -/* $Xorg: xdmcp.c,v 1.3 2000/08/17 19:53:42 cpqbld Exp $ */ +/* $Xorg: xdmcp.c,v 1.4 2001/01/31 13:37:19 pookie Exp $ */ /* * Copyright 1989 Network Computing Devices, Inc., Mountain View, California. * @@ -13,7 +13,7 @@ * without express or implied warranty. * */ -/* $XFree86: xc/programs/Xserver/os/xdmcp.c,v 3.16 2001/07/23 13:15:50 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/os/xdmcp.c,v 3.20 2001/11/19 20:44:18 tsi Exp $ */ #ifdef WIN32 /* avoid conflicting definitions */ @@ -67,9 +67,9 @@ #undef REQUEST #include <X11/Xdmcp.h> -extern char *display; -extern fd_set EnabledDevices; -extern fd_set AllClients; +#define X_INCLUDE_NETDB_H +#include <X11/Xos_r.h> + extern char *defaultDisplayClass; static int xdmcpSocket, sessionSocket; @@ -1363,13 +1363,16 @@ get_manager_by_name( int i) { struct hostent *hep; +#ifdef XTHREADS_NEEDS_BYNAMEPARAMS + _Xgethostbynameparams hparams; +#endif if (i == argc) { ErrorF("Xserver: missing host name in command line\n"); exit(1); } - if (!(hep = gethostbyname(argv[i]))) + if (!(hep = _XGethostbyname(argv[i], hparams))) { ErrorF("Xserver: unknown host: %s\n", argv[i]); exit(1); @@ -1397,13 +1400,16 @@ get_fromaddr_by_name( int i) { struct hostent *hep; +#ifdef XTHREADS_NEEDS_BYNAMEPARAMS + _Xgethostbynameparams hparams; +#endif if (i == argc) { ErrorF("Xserver: missing -from host name in command line\n"); exit(1); } - if (!(hep = gethostbyname(argv[i]))) + if (!(hep = _XGethostbyname(argv[i], hparams))) { ErrorF("Xserver: unknown host: %s\n", argv[i]); exit(1); diff --git a/xc/programs/Xserver/render/picture.c b/xc/programs/Xserver/render/picture.c index 1eabd4f27..a764628f2 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.18 2001/08/10 22:25:59 keithp Exp $ + * $XFree86: xc/programs/Xserver/render/picture.c,v 1.20 2001/12/13 04:35:41 keithp Exp $ * * Copyright © 2000 SuSE, Inc. * @@ -159,7 +159,6 @@ PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp) FormatInitRec formats[1024]; CARD32 format; CARD8 depth; - int i; VisualPtr pVisual; int v; int bpp; @@ -170,20 +169,20 @@ PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp) nformats = 0; /* formats required by protocol */ - formats[nformats].format = PICT_a8r8g8b8; - formats[nformats].depth = 32; - nformats++; - formats[nformats].format = PICT_x8r8g8b8; - formats[nformats].depth = 32; - nformats++; formats[nformats].format = PICT_a1; formats[nformats].depth = 1; nformats++; + formats[nformats].format = PICT_a8; + formats[nformats].depth = 8; + nformats++; formats[nformats].format = PICT_a4; formats[nformats].depth = 4; nformats++; - formats[nformats].format = PICT_a8; - formats[nformats].depth = 8; + formats[nformats].format = PICT_a8r8g8b8; + formats[nformats].depth = 32; + nformats++; + formats[nformats].format = PICT_x8r8g8b8; + formats[nformats].depth = 32; nformats++; /* now look through the depths and visuals adding other formats */ diff --git a/xc/programs/Xserver/render/render.c b/xc/programs/Xserver/render/render.c index dd37f8f25..c7cf12555 100644 --- a/xc/programs/Xserver/render/render.c +++ b/xc/programs/Xserver/render/render.c @@ -1,5 +1,5 @@ /* - * $XFree86: xc/programs/Xserver/render/render.c,v 1.12 2001/08/16 08:03:25 keithp Exp $ + * $XFree86: xc/programs/Xserver/render/render.c,v 1.13 2001/12/13 04:35:41 keithp Exp $ * * Copyright © 2000 SuSE, Inc. * |