diff --git a/COPYING b/COPYING index 22b4b13..f101fb8 100644 --- a/COPYING +++ b/COPYING @@ -1,4 +1,5 @@ Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com) +Copyright 2008 Red Hat, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/configure.ac b/configure.ac index ff4713d..5d39bbc 100644 --- a/configure.ac +++ b/configure.ac @@ -20,45 +20,44 @@ # # Process this file with autoconf to produce a configure script -AC_PREREQ(2.57) +# Initialize Autoconf +AC_PREREQ([2.60]) AC_INIT([xf86-video-vesa], - 2.3.0, + [2.3.0], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], - xf86-video-vesa) - + [xf86-video-vesa]) AC_CONFIG_SRCDIR([Makefile.am]) -AM_CONFIG_HEADER([config.h]) +AC_CONFIG_HEADERS([config.h]) AC_CONFIG_AUX_DIR(.) +# Initialize Automake AM_INIT_AUTOMAKE([foreign dist-bzip2]) - AM_MAINTAINER_MODE -# Require xorg-macros: XORG_DEFAULT_OPTIONS +# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS m4_ifndef([XORG_MACROS_VERSION], - [m4_fatal([must install xorg-macros 1.3 or later before running autoconf/autogen])]) -XORG_MACROS_VERSION(1.3) + [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])]) +XORG_MACROS_VERSION(1.8) XORG_DEFAULT_OPTIONS -# Checks for programs. +# Initialize libtool AC_DISABLE_STATIC AC_PROG_LIBTOOL -AC_PROG_CC AH_TOP([#include "xorg-server.h"]) +# Define a configure option for an alternate module directory AC_ARG_WITH(xorg-module-dir, [ --with-xorg-module-dir=DIR ], [ moduledir="$withval" ], [ moduledir="$libdir/xorg/modules" ]) AC_SUBST(moduledir) - -# Checks for extensions +# Store the list of server defined optional extensions in REQUIRED_MODULES XORG_DRIVER_CHECK_EXT(RANDR, randrproto) XORG_DRIVER_CHECK_EXT(RENDER, renderproto) XORG_DRIVER_CHECK_EXT(DPMSExtension, xextproto) -# Checks for pkg-config packages +# Obtain compiler/linker options for the driver dependencies PKG_CHECK_MODULES(XORG, xorg-server >= 1.0.99.901 xproto fontsproto $REQUIRED_MODULES) PKG_CHECK_MODULES(XEXT, [xextproto >= 7.0.99.1], HAVE_XEXTPROTO_71="yes"; AC_DEFINE(HAVE_XEXTPROTO_71, 1, [xextproto 7.1 available]), @@ -89,25 +88,18 @@ AC_CHECK_DECL(XSERVER_LIBPCIACCESS, CFLAGS="$save_CFLAGS" if test "x$XSERVER_LIBPCIACCESS" = xyes; then - PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.10]) + PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.12.901]) fi AM_CONDITIONAL(XSERVER_LIBPCIACCESS, test "x$XSERVER_LIBPCIACCESS" = xyes) -CFLAGS="$CFLAGS $XORG_CFLAGS "' -I$(top_srcdir)/src' -INCLUDES="$XORG_INCS "'-I$(top_srcdir)/src' -AC_SUBST([CFLAGS]) -AC_SUBST([INCLUDES]) - # Checks for libraries. -# Checks for header files. -AC_HEADER_STDC - DRIVER_NAME=vesa AC_SUBST([DRIVER_NAME]) -AC_OUTPUT([ - Makefile - src/Makefile - man/Makefile +AC_CONFIG_FILES([ + Makefile + src/Makefile + man/Makefile ]) +AC_OUTPUT diff --git a/man/Makefile.am b/man/Makefile.am index f0eb29b..b3688ce 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -1,27 +1,24 @@ # # Copyright 2005 Sun Microsystems, Inc. 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. -# -# 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 THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the copyright holders 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 copyright holders. +# +# 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 +# THE AUTHORS OR COPYRIGHT HOLDERS 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. # drivermandir = $(DRIVER_MAN_DIR) @@ -34,25 +31,11 @@ EXTRA_DIST = @DRIVER_NAME@.man CLEANFILES = $(driverman_DATA) -SED = sed -# Strings to replace in man pages -XORGRELSTRING = @PACKAGE_STRING@ - XORGMANNAME = X Version 11 +# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure -MAN_SUBSTS = \ - -e 's|__vendorversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \ - -e 's|__xorgversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \ - -e 's|__xservername__|Xorg|g' \ - -e 's|__xconfigfile__|xorg.conf|g' \ - -e 's|__projectroot__|$(prefix)|g' \ - -e 's|__appmansuffix__|$(APP_MAN_SUFFIX)|g' \ - -e 's|__drivermansuffix__|$(DRIVER_MAN_SUFFIX)|g' \ - -e 's|__adminmansuffix__|$(ADMIN_MAN_SUFFIX)|g' \ - -e 's|__miscmansuffix__|$(MISC_MAN_SUFFIX)|g' \ - -e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g' SUFFIXES = .$(DRIVER_MAN_SUFFIX) .man .man.$(DRIVER_MAN_SUFFIX): - sed $(MAN_SUBSTS) < $< > $@ + $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@ diff --git a/man/vesa.man b/man/vesa.man index 19cb766..ce4b369 100644 --- a/man/vesa.man +++ b/man/vesa.man @@ -1,4 +1,3 @@ -.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/vesa/vesa.man,v 1.2 2001/01/27 18:20:56 dawes Exp $ .\" shorthand for double quote that works everywhere. .ds q \N'34' .TH VESA __drivermansuffix__ __vendorversion__ diff --git a/src/Makefile.am b/src/Makefile.am index 88da8a2..dc702f0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -24,6 +24,9 @@ # -avoid-version prevents gratuitous .0.0.0 version numbers on the end # _ladir passes a dummy rpath to libtool so the thing will actually link # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc. + +AM_CFLAGS = $(XORG_CFLAGS) $(PCIACCESS_CFLAGS) + vesa_drv_la_LTLIBRARIES = vesa_drv.la vesa_drv_la_LDFLAGS = -module -avoid-version vesa_drv_ladir = @moduledir@/drivers diff --git a/src/vesa.c b/src/vesa.c index 034a019..23d9e14 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -281,7 +281,7 @@ static VESAPtr VESAGetRec(ScrnInfoPtr pScrn) { if (!pScrn->driverPrivate) - pScrn->driverPrivate = xcalloc(sizeof(VESARec), 1); + pScrn->driverPrivate = calloc(sizeof(VESARec), 1); return ((VESAPtr)pScrn->driverPrivate); } @@ -296,7 +296,7 @@ VESASetModeParameters(vbeInfoPtr pVbe, DisplayModePtr vbemode, data = (VbeModeInfoData *)vbemode->Private; - data->block = xcalloc(sizeof(VbeCRTCInfoBlock), 1); + data->block = calloc(sizeof(VbeCRTCInfoBlock), 1); data->block->HorizontalTotal = ddcmode->HTotal; data->block->HorizontalSyncStart = ddcmode->HSyncStart; data->block->HorizontalSyncEnd = ddcmode->HSyncEnd; @@ -317,6 +317,30 @@ VESASetModeParameters(vbeInfoPtr pVbe, DisplayModePtr vbemode, (double)(ddcmode->HTotal * ddcmode->VTotal)); } +/* + * Despite that VBE gives you pixel granularity for mode sizes, some BIOSes + * think they can only give sizes in multiples of character cells; and + * indeed, the reference CVT and GTF formulae only give results where + * (h % 8) == 0. Whatever, let's just try to cope. What we're looking for + * here is cases where the display says 1366x768 and the BIOS says 1360x768. + */ +static Bool +vesaModesCloseEnough(DisplayModePtr edid, DisplayModePtr vbe) +{ + if (!(edid->type & M_T_DRIVER)) + return FALSE; + + /* never seen a height granularity... */ + if (edid->VDisplay != vbe->VDisplay) + return FALSE; + + if (edid->HDisplay >= vbe->HDisplay && + (edid->HDisplay & ~7) == (vbe->HDisplay & ~7)) + return TRUE; + + return FALSE; +} + static ModeStatus VESAValidMode(int scrn, DisplayModePtr p, Bool flag, int pass) { @@ -358,9 +382,7 @@ VESAValidMode(int scrn, DisplayModePtr p, Bool flag, int pass) */ if (pScrn->monitor->DDC) { for (mode = pScrn->monitor->Modes; mode; mode = mode->next) { - if (mode->type & M_T_DRIVER && - mode->HDisplay == p->HDisplay && - mode->VDisplay == p->VDisplay) { + if (vesaModesCloseEnough(mode, p)) { if (xf86CheckModeForMonitor(mode, mon) == MODE_OK) { found = 1; break; @@ -391,7 +413,8 @@ VESAValidMode(int scrn, DisplayModePtr p, Bool flag, int pass) for (v = mon->vrefresh[0].lo; v <= mon->vrefresh[0].hi; v++) { mode = xf86GTFMode(p->HDisplay, p->VDisplay, v, 0, 0); ret = xf86CheckModeForMonitor(mode, mon); - xfree(mode); + free(mode->name); + free(mode); if (ret == MODE_OK) break; } @@ -431,8 +454,14 @@ VESAPciProbe(DriverPtr drv, int entity_num, struct pci_device *dev, pScrn = xf86ConfigPciEntity(NULL, 0, entity_num, NULL, NULL, NULL, NULL, NULL, NULL); if (pScrn != NULL) { - VESAPtr pVesa = VESAGetRec(pScrn); + VESAPtr pVesa; + + if (pci_device_has_kernel_driver(dev)) { + ErrorF("vesa: Ignoring device with a bound kernel driver\n"); + return FALSE; + } + pVesa = VESAGetRec(pScrn); VESAInitScrn(pScrn); pVesa->pciInfo = dev; } @@ -480,7 +509,7 @@ VESAProbe(DriverPtr drv, int flags) } } } - xfree(usedChips); + free(usedChips); } } #endif @@ -503,11 +532,11 @@ VESAProbe(DriverPtr drv, int flags) foundScreen = TRUE; } } - xfree(usedChips); + free(usedChips); } #endif - xfree(devSections); + free(devSections); return (foundScreen); } @@ -554,9 +583,9 @@ VESAFreeRec(ScrnInfoPtr pScrn) VbeModeInfoData *data = (VbeModeInfoData*)mode->Private; if (data->block) - xfree(data->block); + free(data->block); - xfree(data); + free(data); mode->Private = NULL; } @@ -564,12 +593,12 @@ VESAFreeRec(ScrnInfoPtr pScrn) } while (mode && mode != pScrn->modes); } #endif - xfree(pVesa->monitor); - xfree(pVesa->vbeInfo); - xfree(pVesa->pal); - xfree(pVesa->savedPal); - xfree(pVesa->fonts); - xfree(pScrn->driverPrivate); + free(pVesa->monitor); + free(pVesa->vbeInfo); + free(pVesa->pal); + free(pVesa->savedPal); + free(pVesa->fonts); + free(pScrn->driverPrivate); pScrn->driverPrivate = NULL; } @@ -712,7 +741,7 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) else { void *panelid = VBEReadPanelID(pVesa->pVbe); VBEInterpretPanelID(pScrn->scrnIndex, panelid); - xfree(panelid); + free(panelid); } #endif @@ -805,7 +834,7 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) /* options */ xf86CollectOptions(pScrn, NULL); - if (!(pVesa->Options = xalloc(sizeof(VESAOptions)))) { + if (!(pVesa->Options = malloc(sizeof(VESAOptions)))) { vbeFree(pVesa->pVbe); return FALSE; } @@ -940,7 +969,7 @@ VESAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pScrn->bitsPerPixel = 8; if (pVesa->shadowFB) { - pVesa->shadow = xcalloc(1, pScrn->displayWidth * pScrn->virtualY * + pVesa->shadow = calloc(1, pScrn->displayWidth * pScrn->virtualY * ((pScrn->bitsPerPixel + 7) / 8)); if (!pVesa->shadow) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, @@ -1119,10 +1148,10 @@ VESACloseScreen(int scrnIndex, ScreenPtr pScreen) } if (pVesa->shadowFB && pVesa->shadow) { shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen)); - xfree(pVesa->shadow); + free(pVesa->shadow); } if (pVesa->pDGAMode) { - xfree(pVesa->pDGAMode); + free(pVesa->pDGAMode); pVesa->pDGAMode = NULL; pVesa->nDGAMode = 0; } @@ -1180,7 +1209,7 @@ VESASetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode) * Free it as it will not be any longer useful */ xf86ErrorF(", mode set without customized refresh.\n"); - xfree(data->block); + free(data->block); data->block = NULL; data->mode &= ~(1 << 11); } @@ -1231,25 +1260,28 @@ VESAMapVidMem(ScrnInfoPtr pScrn) pScrn->fbOffset = pVesa->mapOff; #ifdef XSERVER_LIBPCIACCESS - if ((pVesa->mapPhys != 0xa0000) && (pVesa->pciInfo != NULL)) { - (void) pci_device_map_range(pVesa->pciInfo, pScrn->memPhysBase, - pVesa->mapSize, - (PCI_DEV_MAP_FLAG_WRITABLE - | PCI_DEV_MAP_FLAG_WRITE_COMBINE), - & pVesa->base); - } - else - pVesa->base = xf86MapDomainMemory(pScrn->scrnIndex, 0, pVesa->pciInfo, - pScrn->memPhysBase, pVesa->mapSize); - - if (pVesa->base) { - if (pVesa->mapPhys != 0xa0000) - pVesa->VGAbase = xf86MapDomainMemory(pScrn->scrnIndex, 0, - pVesa->pciInfo, - 0xa0000, 0x10000); - else - pVesa->VGAbase = pVesa->base; + if (pVesa->pciInfo != NULL) { + if (pVesa->mapPhys != 0xa0000) { + (void) pci_device_map_range(pVesa->pciInfo, pScrn->memPhysBase, + pVesa->mapSize, + (PCI_DEV_MAP_FLAG_WRITABLE + | PCI_DEV_MAP_FLAG_WRITE_COMBINE), + & pVesa->base); + + if (pVesa->base) + (void) pci_device_map_legacy(pVesa->pciInfo, 0xa0000, 0x10000, + PCI_DEV_MAP_FLAG_WRITABLE, + & pVesa->VGAbase); + } + else { + (void) pci_device_map_legacy(pVesa->pciInfo, pScrn->memPhysBase, + pVesa->mapSize, + PCI_DEV_MAP_FLAG_WRITABLE, + & pVesa->base); + if (pVesa->base) + pVesa->VGAbase = pVesa->base; + } } #else if (pVesa->mapPhys != 0xa0000 && pVesa->pEnt->location.type == BUS_PCI) @@ -1270,7 +1302,11 @@ VESAMapVidMem(ScrnInfoPtr pScrn) } #endif +#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 12 pVesa->ioBase = pScrn->domainIOBase; +#else + pVesa->ioBase = 0; +#endif xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DEBUG_VERB, "virtual address = %p,\n" @@ -1292,10 +1328,12 @@ VESAUnmapVidMem(ScrnInfoPtr pScrn) if (pVesa->mapPhys != 0xa0000) { (void) pci_device_unmap_range(pVesa->pciInfo, pVesa->base, pVesa->mapSize); - xf86UnMapVidMem(pScrn->scrnIndex, pVesa->VGAbase, 0x10000); + (void) pci_device_unmap_legacy(pVesa->pciInfo, pVesa->VGAbase, + 0x10000); } else { - xf86UnMapVidMem(pScrn->scrnIndex, pVesa->base, pVesa->mapSize); + (void) pci_device_unmap_legacy(pVesa->pciInfo, pVesa->base, + pVesa->mapSize); } #else xf86UnMapVidMem(pScrn->scrnIndex, pVesa->base, pVesa->mapSize); @@ -1315,7 +1353,7 @@ VESALoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, int base; if (pVesa->pal == NULL) - pVesa->pal = xcalloc(1, sizeof(CARD32) * 256); + pVesa->pal = calloc(1, sizeof(CARD32) * 256); for (i = 0, base = idx = indices[i]; i < numColors; i++, idx++) { int j = indices[i]; @@ -1414,7 +1452,7 @@ SaveFonts(ScrnInfoPtr pScrn) if (attr10 & 0x01) return; - pVesa->fonts = xalloc(16384); + pVesa->fonts = malloc(16384); /* save the registers that are needed here */ miscOut = ReadMiscOut(); @@ -1622,7 +1660,7 @@ VESASaveRestore(ScrnInfoPtr pScrn, vbeSaveRestoreFunction function) && function == MODE_SAVE) { /* don't rely on the memory not being touched */ if (pVesa->pstate == NULL) - pVesa->pstate = xalloc(pVesa->stateSize); + pVesa->pstate = malloc(pVesa->stateSize); memcpy(pVesa->pstate, pVesa->state, pVesa->stateSize); } } @@ -1737,7 +1775,7 @@ VESADGAAddModes(ScrnInfoPtr pScrn) DGAModePtr pDGAMode; do { - pDGAMode = xrealloc(pVesa->pDGAMode, + pDGAMode = realloc(pVesa->pDGAMode, (pVesa->nDGAMode + 1) * sizeof(DGAModeRec)); if (!pDGAMode) break; diff --git a/src/vesa.h b/src/vesa.h index 4656e4c..bcc9e37 100644 --- a/src/vesa.h +++ b/src/vesa.h @@ -25,8 +25,6 @@ * Conectiva Linux. * * Authors: Paulo César Pereira de Andrade - * - * $XFree86: xc/programs/Xserver/hw/xfree86/drivers/vesa/vesa.h,v 1.12 2002/08/06 13:46:27 dawes Exp $ */ #ifndef _VESA_H_ @@ -116,7 +114,7 @@ typedef struct _VESARec xf86EnableDisableFBAccessProc *EnableDisableFBAccess; Bool accessEnabled; OptionInfoPtr Options; - IOADDRESS ioBase; + unsigned long ioBase; Bool ModeSetClearScreen; void *shadow; ShadowUpdateProc update;