Blob Blame Raw
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 <pcpa@conectiva.com.br>
- *
- * $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;