diff options
Diffstat (limited to 'xc/programs/Xserver/hw/xfree86/drivers/glint')
4 files changed, 111 insertions, 5 deletions
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_common.h b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_common.h new file mode 100644 index 000000000..71f6f6d48 --- /dev/null +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_common.h @@ -0,0 +1,63 @@ +/* glint_common.h -- common header definitions for Gamma 2D/3D/DRM suite + * + * Copyright 2002 Tungsten Graphics, 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. + * + * Converted to common header format: + * Jens Owen <jens@tungstengraphics.com> + * + * $XFree86$ + * + */ + +#ifndef _GLINT_COMMON_H_ +#define _GLINT_COMMON_H_ + +/* + * WARNING: If you change any of these defines, make sure to change + * the kernel include file as well (gamma_drm.h) + */ + +/* Driver specific DRM command indices + * NOTE: these are not OS specific, but they are driver specific + */ +#define DRM_GAMMA_INIT 0x00 +#define DRM_GAMMA_COPY 0x01 + +typedef struct { + enum { + GAMMA_INIT_DMA = 0x01, + GAMMA_CLEANUP_DMA = 0x02 + } func; + int sarea_priv_offset; + int pcimode; + unsigned int mmio0; + unsigned int mmio1; + unsigned int mmio2; + unsigned int mmio3; + unsigned int buffers_offset; +} drmGAMMAInit; + +extern int drmGAMMAInitDMA( int fd, drmGAMMAInit *info ); +extern int drmGAMMACleanupDMA( int fd ); + +#endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dri.c index 1b16da6ba..e6a25cfd1 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dri.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dri.c @@ -406,6 +406,7 @@ static Bool GLINTDRIKernelInit( ScreenPtr pScreen ) memset( &init, 0, sizeof(drmGAMMAInit) ); + init.func = GAMMA_INIT_DMA; init.sarea_priv_offset = sizeof(XF86DRISAREARec); init.mmio0 = pGlintDRI->registers0.handle; @@ -420,7 +421,8 @@ static Bool GLINTDRIKernelInit( ScreenPtr pScreen ) init.pcimode = 1; } - ret = drmGAMMAInitDMA( pGlint->drmSubFD, &init ); + ret = drmCommandWrite( pGlint->drmSubFD, DRM_GAMMA_INIT, + &init, sizeof(drmGAMMAInit) ); if ( ret < 0 ) { xf86DrvMsg( pScrn->scrnIndex, X_ERROR, @@ -553,9 +555,48 @@ GLINTDRIScreenInit(ScreenPtr pScreen) return FALSE; } - /* Check the GLINT DRM version */ + /* Check the DRM versioning */ { - drmVersionPtr version = drmGetVersion(pGlint->drmSubFD); + drmVersionPtr version; + + /* Check the DRM lib version. + drmGetLibVersion was not supported in version 1.0, so check for + symbol first to avoid possible crash or hang. + */ + if (xf86LoaderCheckSymbol("drmGetLibVersion")) { + version = drmGetLibVersion(pGlint->drmSubFD); + } + else { + /* drmlib version 1.0.0 didn't have the drmGetLibVersion + entry point. Fake it by allocating a version record + via drmGetVersion and changing it to version 1.0.0 + */ + version = drmGetVersion(pGlint->drmSubFD); + version->version_major = 1; + version->version_minor = 0; + version->version_patchlevel = 0; + } + + if (version) { + if (version->version_major != 1 || + version->version_minor < 1) { + /* incompatible drm library version */ + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] GLINTDRIScreenInit failed because of a version mismatch.\n" + "[dri] libdrm.a module version is %d.%d.%d but version 1.1.x is needed.\n" + "[dri] Disabling DRI.\n", + version->version_major, + version->version_minor, + version->version_patchlevel); + drmFreeVersion(version); + GLINTDRICloseScreen(pScreen); + return FALSE; + } + drmFreeVersion(version); + } + + /* Check the GLINT DRM version */ + version = drmGetVersion(pGlint->drmSubFD); if (version) { if (version->version_major != 2 || version->version_minor < 0) { diff --git a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dri.h b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dri.h index 5558110e6..8285f17fb 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dri.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_dri.h @@ -36,8 +36,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef _GLINT_DRI_H_ #define _GLINT_DRI_H_ -#include <xf86drm.h> -#include <xf86drmGamma.h> +#include "xf86drm.h" +#include "glint_common.h" typedef struct { unsigned int GDeltaMode; 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 3377d3a0a..4633d2df6 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/glint/glint_driver.c @@ -341,9 +341,11 @@ const char *GLINTint10Symbols[] = { static const char *drmSymbols[] = { "drmAddBufs", "drmAddMap", + "drmCommandWrite", "drmCtlInstHandler", "drmFreeVersion", "drmGetInterruptFromBusID", + "drmGetLibVersion", "drmGetVersion", "drmMapBufs", "drmUnmapBufs", |