.cvsignore | 19 - .gitignore | 20 + COPYING | 30 ++ configure.ac | 28 +- man/.cvsignore | 2 man/.gitignore | 2 man/Makefile.am | 1 src/.cvsignore | 6 src/.gitignore | 6 src/vesa.c | 571 ++++++++++++++++++++++++-------------------------------- src/vesa.h | 23 -- 11 files changed, 322 insertions(+), 386 deletions(-)
New commits: commit c7f6d282ccbe1931f5ae6472cbfb4f80fc749525 Author: Dave Airlie <airl...@redhat.com> Date: Mon Dec 22 12:36:21 2008 +1000 vesa 2.1.0 diff --git a/configure.ac b/configure.ac index de2456a..62e710f 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ AC_PREREQ(2.57) AC_INIT([xf86-video-vesa], - 2.0.0, + 2.1.0, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-video-vesa) commit d994a9abbda582ccd6d38447ca2201de10cc36a5 Author: Adam Jackson <a...@redhat.com> Date: Sun Nov 23 17:28:33 2008 -0500 Make ISA support optional. diff --git a/configure.ac b/configure.ac index 027a5cf..de2456a 100644 --- a/configure.ac +++ b/configure.ac @@ -58,6 +58,14 @@ sdkdir=$(pkg-config --variable=sdkdir xorg-server) save_CFLAGS="$CFLAGS" CFLAGS="$XORG_CFLAGS" +AC_CHECK_DECL(xf86ConfigIsaEntity, + [AC_DEFINE(HAVE_ISA, 1, [Have ISA support])], + [], + [#include "xf86.h"]) +CFLAGS="$save_CFLAGS" + +save_CFLAGS="$CFLAGS" +CFLAGS="$XORG_CFLAGS" AC_CHECK_DECL(XSERVER_LIBPCIACCESS, [XSERVER_LIBPCIACCESS=yes], [XSERVER_LIBPCIACCESS=no], [#include "xorg-server.h"]) diff --git a/src/vesa.c b/src/vesa.c index 61461ab..2e1b2f7 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -138,10 +138,12 @@ static PciChipsets VESAPCIchipsets[] = { }; #endif +#ifdef HAVE_ISA static IsaChipsets VESAISAchipsets[] = { {CHIP_VESA_GENERIC, RES_EXCLUSIVE_VGA}, {-1, 0 } }; +#endif /* @@ -446,6 +448,7 @@ VESAProbe(DriverPtr drv, int flags) } #endif +#ifdef HAVE_ISA /* Isa Bus */ numUsed = xf86MatchIsaInstances(VESA_NAME,VESAChipsets, VESAISAchipsets, drv, @@ -465,12 +468,14 @@ VESAProbe(DriverPtr drv, int flags) } xfree(usedChips); } +#endif xfree(devSections); return (foundScreen); } +#ifdef HAVE_ISA static int VESAFindIsaDevice(GDevPtr dev) { @@ -495,6 +500,7 @@ VESAFindIsaDevice(GDevPtr dev) #endif return (int)CHIP_VESA_GENERIC; } +#endif static void VESAFreeRec(ScrnInfoPtr pScrn) commit 38431c99ccb625d0fd784f86f6a8a9cdbfbf872e Author: Luc Verhaegen <lverhae...@ridcully.suse.de> Date: Thu Sep 18 16:58:59 2008 +0200 VESASetMode: be verbose about the mode that's being set. diff --git a/src/vesa.c b/src/vesa.c index 2efe2d5..61461ab 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -1099,6 +1099,10 @@ VESASetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode) data = (VbeModeInfoData*)pMode->Private; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Setting up VESA Mode 0x%X (%dx%d)\n", + data->mode & 0x7FF, pMode->HDisplay, pMode->VDisplay); + /* careful, setting the bit means don't clear the screen */ mode = data->mode | (pVesa->ModeSetClearScreen ? 0 : (1U << 15)); commit e670b3e4a1102a36a01edf1fd38676b9b13fb957 Author: Julien Cristau <jcris...@debian.org> Date: Tue Jul 15 00:26:12 2008 +0200 Properly define the driver version Define VESA_VERSION_MAJOR/MINOR/PATCHLEVEL using the version from configure.ac. diff --git a/src/vesa.h b/src/vesa.h index 562cd76..1b8f4e5 100644 --- a/src/vesa.h +++ b/src/vesa.h @@ -78,9 +78,9 @@ #define VESA_VERSION 4000 #define VESA_NAME "VESA" #define VESA_DRIVER_NAME "vesa" -#define VESA_MAJOR_VERSION 1 -#define VESA_MINOR_VERSION 3 -#define VESA_PATCHLEVEL 0 +#define VESA_MAJOR_VERSION PACKAGE_VERSION_MAJOR +#define VESA_MINOR_VERSION PACKAGE_VERSION_MINOR +#define VESA_PATCHLEVEL PACKAGE_VERSION_PATCHLEVEL /*XXX*/ commit 4939ada882feeafe4b2f233a4a27d6ad38d5bf99 Author: Adam Jackson <a...@redhat.com> Date: Tue Jul 1 14:27:48 2008 -0400 Default VESAValidMode to returning MODE_BAD. diff --git a/src/vesa.c b/src/vesa.c index ffe40c5..2efe2d5 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -286,7 +286,7 @@ VESAValidMode(int scrn, DisplayModePtr p, Bool flag, int pass) ScrnInfoPtr pScrn = xf86Screens[scrn]; VESAPtr pVesa = VESAGetRec(pScrn); MonPtr mon = pScrn->monitor; - ModeStatus ret; + ModeStatus ret = MODE_BAD; DisplayModePtr mode; float v; commit 9d27e31dca8e0bddbf82ef2f19064160cff3a59e Author: Adam Jackson <a...@redhat.com> Date: Tue Jul 1 14:19:04 2008 -0400 Add a TODO list. diff --git a/src/vesa.c b/src/vesa.c index b23a04e..ffe40c5 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -31,6 +31,14 @@ * Adam Jackson <a...@redhat.com> */ +/* + * TODO: + * - PanelID might give us useful size hints. + * - Port to RANDR 1.2 setup to make mode selection slightly better + * - Port to RANDR 1.2 to drop the old-school DGA junk + * - VBE/SCI for secondary DDC method? + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif commit bcf3514b99431b6935ea568b59d94f266ccd7aeb Author: Adam Jackson <a...@redhat.com> Date: Tue Jul 1 14:09:00 2008 -0400 Warning cleanup. diff --git a/src/vesa.c b/src/vesa.c index 865bdb0..b23a04e 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -93,8 +93,6 @@ static void RestoreFonts(ScrnInfoPtr pScrn); static Bool VESASaveRestore(ScrnInfoPtr pScrn, vbeSaveRestoreFunction function); -static void *VESAWindowPlanar(ScreenPtr pScrn, CARD32 row, CARD32 offset, - int mode, CARD32 *size, void *closure); static void *VESAWindowLinear(ScreenPtr pScrn, CARD32 row, CARD32 offset, int mode, CARD32 *size, void *closure); static void *VESAWindowWindowed(ScreenPtr pScrn, CARD32 row, CARD32 offset, @@ -125,10 +123,12 @@ static SymTabRec VESAChipsets[] = {-1, NULL} }; +#ifndef XSERVER_LIBPCIACCESS static PciChipsets VESAPCIchipsets[] = { { CHIP_VESA_GENERIC, PCI_CHIP_VGA, RES_SHARED_VGA }, { -1, -1, RES_UNDEFINED }, }; +#endif static IsaChipsets VESAISAchipsets[] = { {CHIP_VESA_GENERIC, RES_EXCLUSIVE_VGA}, @@ -1232,28 +1232,6 @@ VESAUnmapVidMem(ScrnInfoPtr pScrn) pVesa->base = NULL; } -void * -VESAWindowPlanar(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, - CARD32 *size, void *closure) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - VESAPtr pVesa = VESAGetRec(pScrn); - VbeModeInfoBlock *data = ((VbeModeInfoData*)(pScrn->currentMode->Private))->data; - int window; - int mask = 1 << (offset & 3); - - outb(pVesa->ioBase + VGA_SEQ_INDEX, 2); - outb(pVesa->ioBase + VGA_SEQ_DATA, mask); - offset = (offset >> 2) + pVesa->maxBytesPerScanline * row; - window = offset / (data->WinGranularity * 1024); - pVesa->windowAoffset = window * data->WinGranularity * 1024; - VESABankSwitch(pScreen, window); - *size = data->WinSize * 1024 - (offset - pVesa->windowAoffset); - - return (void *)((unsigned long)pVesa->base + - (offset - pVesa->windowAoffset)); -} - static void * VESAWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, CARD32 *size, void *closure) @@ -1393,13 +1371,6 @@ ReadGr(VESAPtr pVesa, int index) outb(pVesa->ioBase + (VGA_IOBASE_COLOR + VGA_CRTC_INDEX_OFFSET), index); \ outb(pVesa->ioBase + (VGA_IOBASE_COLOR + VGA_CRTC_DATA_OFFSET), value) -static int -ReadCrtc(VESAPtr pVesa, int index) -{ - outb(pVesa->ioBase + (VGA_IOBASE_COLOR + VGA_CRTC_INDEX_OFFSET), index); - return inb(pVesa->ioBase + (VGA_IOBASE_COLOR + VGA_CRTC_DATA_OFFSET)); -} - static void SeqReset(VESAPtr pVesa, Bool start) { commit ea57dcf423ebc3cb24060eebfc1943703448c320 Author: Adam Jackson <a...@redhat.com> Date: Tue Jul 1 14:07:15 2008 -0400 Use VBE services for DPMS instead of banging VGA registers manually. diff --git a/src/vesa.c b/src/vesa.c index f0f2522..865bdb0 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -1656,45 +1656,13 @@ VESADisplayPowerManagementSet(ScrnInfoPtr pScrn, int mode, int flags) { VESAPtr pVesa = VESAGetRec(pScrn); - unsigned char seq1 = 0, crtc17 = 0; if (!pScrn->vtSema) return; - switch (mode) { - case DPMSModeOn: - /* Screen: On; HSync: On, VSync: On */ - seq1 = 0x00; - crtc17 = 0x80; - break; - case DPMSModeStandby: - /* Screen: Off; HSync: Off, VSync: On -- Not Supported */ - seq1 = 0x20; - crtc17 = 0x80; - break; - case DPMSModeSuspend: - /* Screen: Off; HSync: On, VSync: Off -- Not Supported */ - seq1 = 0x20; - crtc17 = 0x80; - break; - case DPMSModeOff: - /* Screen: Off; HSync: Off, VSync: Off */ - seq1 = 0x20; - crtc17 = 0x00; - break; - } - WriteSeq(0x00, 0x01); /* Synchronous Reset */ - seq1 |= ReadSeq(pVesa, 0x01) & ~0x20; - WriteSeq(0x01, seq1); - crtc17 |= ReadCrtc(pVesa, 0x17) & ~0x80; - usleep(10000); - WriteCrtc(0x17, crtc17); - WriteSeq(0x00, 0x03); /* End Reset */ + VBEDPMSSet(pVesa->pVbe, mode); } - - - /*********************************************************************** * DGA stuff ***********************************************************************/ commit 3631892e0c53568b9f6b0c4aeacd2354305376e6 Author: Adam Jackson <a...@redhat.com> Date: Tue Jul 1 13:41:07 2008 -0400 vesa 2.0.0 diff --git a/configure.ac b/configure.ac index 84d19b0..027a5cf 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ AC_PREREQ(2.57) AC_INIT([xf86-video-vesa], - 1.99.1, + 2.0.0, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-video-vesa) commit eb4216dbb392a78d15cde8232d4d951ad876518e Author: Adam Jackson <a...@redhat.com> Date: Tue Jul 1 13:40:16 2008 -0400 Un-duplicate some init code. diff --git a/src/vesa.c b/src/vesa.c index fbaad21..f0f2522 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -352,6 +352,23 @@ VESAValidMode(int scrn, DisplayModePtr p, Bool flag, int pass) return ret; } +static void +VESAInitScrn(ScrnInfoPtr pScrn) +{ + pScrn->driverVersion = VESA_VERSION; + pScrn->driverName = VESA_DRIVER_NAME; + pScrn->name = VESA_NAME; + pScrn->Probe = VESAProbe; + pScrn->PreInit = VESAPreInit; + pScrn->ScreenInit = VESAScreenInit; + pScrn->SwitchMode = VESASwitchMode; + pScrn->ValidMode = VESAValidMode; + pScrn->AdjustFrame = VESAAdjustFrame; + pScrn->EnterVT = VESAEnterVT; + pScrn->LeaveVT = VESALeaveVT; + pScrn->FreeScreen = VESAFreeScreen; +} + /* * This function is called once, at the start of the first server generation to * do a minimal probe for supported hardware. @@ -369,22 +386,10 @@ VESAPciProbe(DriverPtr drv, int entity_num, struct pci_device *dev, if (pScrn != NULL) { VESAPtr pVesa = VESAGetRec(pScrn); - pScrn->driverVersion = VESA_VERSION; - pScrn->driverName = VESA_DRIVER_NAME; - pScrn->name = VESA_NAME; - pScrn->Probe = VESAProbe; - pScrn->PreInit = VESAPreInit; - pScrn->ScreenInit = VESAScreenInit; - pScrn->SwitchMode = VESASwitchMode; - pScrn->ValidMode = VESAValidMode; - pScrn->AdjustFrame = VESAAdjustFrame; - pScrn->EnterVT = VESAEnterVT; - pScrn->LeaveVT = VESALeaveVT; - pScrn->FreeScreen = VESAFreeScreen; - + VESAInitScrn(pScrn); pVesa->pciInfo = dev; } - + return (pScrn != NULL); } #endif @@ -423,18 +428,7 @@ VESAProbe(DriverPtr drv, int flags) if ((pScrn = xf86ConfigPciEntity(pScrn,0,usedChips[i], VESAPCIchipsets,NULL, NULL,NULL,NULL,NULL))) { - pScrn->driverVersion = VESA_VERSION; - pScrn->driverName = VESA_DRIVER_NAME; - pScrn->name = VESA_NAME; - pScrn->Probe = VESAProbe; - pScrn->PreInit = VESAPreInit; - pScrn->ScreenInit = VESAScreenInit; - pScrn->SwitchMode = VESASwitchMode; - pScrn->ValidMode = VESAValidMode; - pScrn->AdjustFrame = VESAAdjustFrame; - pScrn->EnterVT = VESAEnterVT; - pScrn->LeaveVT = VESALeaveVT; - pScrn->FreeScreen = VESAFreeScreen; + VESAInitScrn(pScrn); foundScreen = TRUE; } } @@ -457,19 +451,7 @@ VESAProbe(DriverPtr drv, int flags) if ((pScrn = xf86ConfigIsaEntity(pScrn, 0,usedChips[i], VESAISAchipsets, NULL, NULL, NULL, NULL, NULL))) { - - pScrn->driverVersion = VESA_VERSION; - pScrn->driverName = VESA_DRIVER_NAME; - pScrn->name = VESA_NAME; - pScrn->Probe = VESAProbe; - pScrn->PreInit = VESAPreInit; - pScrn->ScreenInit = VESAScreenInit; - pScrn->SwitchMode = VESASwitchMode; - pScrn->ValidMode = VESAValidMode; - pScrn->AdjustFrame = VESAAdjustFrame; - pScrn->EnterVT = VESAEnterVT; - pScrn->LeaveVT = VESALeaveVT; - pScrn->FreeScreen = VESAFreeScreen; + VESAInitScrn(pScrn); foundScreen = TRUE; } } commit 8ec1f02475bc4267050239c6840fa6738b0caefb Author: Adam Jackson <a...@redhat.com> Date: Tue Jul 1 13:23:31 2008 -0400 Remove unused ->device diff --git a/src/vesa.c b/src/vesa.c index bcde762..fbaad21 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -565,8 +565,6 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) pVesa = VESAGetRec(pScrn); pVesa->pEnt = xf86GetEntityInfo(pScrn->entityList[0]); - pVesa->device = xf86GetDevFromEntity(pScrn->entityList[0], - pScrn->entityInstanceList[0]); /* Load vbe module */ if (!xf86LoadSubModule(pScrn, "vbe")) diff --git a/src/vesa.h b/src/vesa.h index f6a03fb..562cd76 100644 --- a/src/vesa.h +++ b/src/vesa.h @@ -90,7 +90,6 @@ typedef struct _VESARec EntityInfoPtr pEnt; CARD16 major, minor; VbeInfoBlock *vbeInfo; - GDevPtr device; #ifdef XSERVER_LIBPCIACCESS struct pci_device *pciInfo; #else commit 1f1e72fd965443e61ec10442044f554afd77db36 Author: Adam Jackson <a...@redhat.com> Date: Thu Jun 12 15:22:14 2008 -0400 vesa 1.99.1 diff --git a/configure.ac b/configure.ac index 876bc07..84d19b0 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ AC_PREREQ(2.57) AC_INIT([xf86-video-vesa], - 1.3.0, + 1.99.1, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-video-vesa) commit 419b7d46f2abab5506c89f3b2b3e7a50a5dbf3a7 Author: Adam Jackson <a...@redhat.com> Date: Thu Jun 12 14:30:51 2008 -0400 Update copyright. diff --git a/src/vesa.c b/src/vesa.c index cb1be0d..bcde762 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -1,6 +1,7 @@ #define DEBUG_VERB 2 /* * 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"), @@ -27,7 +28,7 @@ * * Authors: Paulo César Pereira de Andrade <p...@conectiva.com.br> * David Dawes <da...@xfree86.org> - * + * Adam Jackson <a...@redhat.com> */ #ifdef HAVE_CONFIG_H commit f807c82506f42c1e1fa63cfa56d7c79b653e46f8 Author: Adam Jackson <a...@redhat.com> Date: Thu Jun 12 14:19:12 2008 -0400 Clean up memory model checking, and properly refuse unsupported models. diff --git a/src/vesa.c b/src/vesa.c index 974a94d..cb1be0d 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -764,17 +764,8 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) mode = ((VbeModeInfoData*)pScrn->modes->Private)->data; switch (mode->MemoryModel) { - case 0x0: /* Text mode */ - case 0x1: /* CGA graphics */ - case 0x2: /* Hercules graphics */ - case 0x3: /* Planar */ - case 0x5: /* Non-chain 4, 256 color */ - case 0x7: /* YUV */ - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Unsupported Memory Model: %d", mode->MemoryModel); - break; case 0x4: /* Packed pixel */ - case 0x6: /* Direct Color */ + case 0x6: /* Direct Color */ pScrn->bitmapBitOrder = BITMAP_BIT_ORDER; switch (pScrn->bitsPerPixel) { @@ -790,6 +781,10 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) return FALSE; } break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unsupported Memory Model: %d", mode->MemoryModel); + return FALSE; } if (pVesa->shadowFB) { @@ -925,17 +920,8 @@ VESAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) mode = ((VbeModeInfoData*)pScrn->modes->Private)->data; switch (mode->MemoryModel) { - case 0x0: /* Text mode */ - case 0x1: /* CGA graphics */ - case 0x2: /* Hercules graphics */ - case 0x3: /* Planar */ - case 0x5: /* Non-chain 4, 256 color */ - case 0x7: /* YUV */ - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Unsupported Memory Model: %d", mode->MemoryModel); - return (FALSE); case 0x4: /* Packed pixel */ - case 0x6: /* Direct Color */ + case 0x6: /* Direct Color */ switch (pScrn->bitsPerPixel) { case 8: case 16: @@ -955,6 +941,10 @@ VESAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) return (FALSE); } break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unsupported Memory Model: %d", mode->MemoryModel); + return (FALSE); } commit 99d2cc8676a93ec21f5ca1cec3525a8dff8a6acd Author: Adam Jackson <a...@redhat.com> Date: Thu Jun 12 14:16:52 2008 -0400 Add semi-reasonable mode validation. diff --git a/src/vesa.c b/src/vesa.c index 8595798..974a94d 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -47,6 +47,7 @@ /* Colormap handling */ #include "micmap.h" #include "xf86cmap.h" +#include "xf86Modes.h" /* DPMS */ #define DPMS_SERVER @@ -228,6 +229,128 @@ VESAIdentify(int flags) xf86PrintChipsets(VESA_NAME, "driver for VESA chipsets", VESAChipsets); } +static VESAPtr +VESAGetRec(ScrnInfoPtr pScrn) +{ + if (!pScrn->driverPrivate) + pScrn->driverPrivate = xcalloc(sizeof(VESARec), 1); + + return ((VESAPtr)pScrn->driverPrivate); +} + +/* Only a little like VBESetModeParameters */ +static void +VESASetModeParameters(vbeInfoPtr pVbe, DisplayModePtr vbemode, + DisplayModePtr ddcmode) +{ + VbeModeInfoData *data; + int clock; + + data = (VbeModeInfoData *)vbemode->Private; + + data->block = xcalloc(sizeof(VbeCRTCInfoBlock), 1); + data->block->HorizontalTotal = ddcmode->HTotal; + data->block->HorizontalSyncStart = ddcmode->HSyncStart; + data->block->HorizontalSyncEnd = ddcmode->HSyncEnd; + data->block->VerticalTotal = ddcmode->VTotal; + data->block->VerticalSyncStart = ddcmode->VSyncStart; + data->block->VerticalSyncEnd = ddcmode->VSyncEnd; + data->block->Flags = ((ddcmode->Flags & V_NHSYNC) ? CRTC_NHSYNC : 0) | + ((ddcmode->Flags & V_NVSYNC) ? CRTC_NVSYNC : 0); + data->block->PixelClock = ddcmode->Clock * 1000; + + /* ask the BIOS to figure out the real clock */ + clock = VBEGetPixelClock(pVbe, data->mode, data->block->PixelClock); + if (clock) + data->block->PixelClock = clock; + + data->mode |= (1 << 11); + data->block->RefreshRate = 100 * ((double)(data->block->PixelClock) / + (double)(ddcmode->HTotal * ddcmode->VTotal)); +} + +static ModeStatus +VESAValidMode(int scrn, DisplayModePtr p, Bool flag, int pass) +{ + static int warned = 0; + int found = 0; + ScrnInfoPtr pScrn = xf86Screens[scrn]; + VESAPtr pVesa = VESAGetRec(pScrn); + MonPtr mon = pScrn->monitor; + ModeStatus ret; + DisplayModePtr mode; + float v; + + pVesa = VESAGetRec(pScrn); + + if (pass != MODECHECK_FINAL) { + if (!warned) { + xf86DrvMsg(scrn, X_WARNING, "VESAValidMode called unexpectedly\n"); + warned = 1; + } + return MODE_OK; + } + + /* + * This is suboptimal. We pass in just the barest description of a mode + * we can get away with to VBEValidateModes, so it can't really throw + * out anything we give it. But we need to filter the list so that we + * don't populate the mode list with things the monitor can't do. + * + * So first off, if this isn't a mode we handed to the server (ie, + * M_T_BUILTIN), then we know we can't do it. + */ + if (!(p->type & M_T_BUILTIN)) + return MODE_NOMODE; + + if (pVesa->strict_validation) { + /* + * If it's our first pass at mode validation, we'll try for a strict + * intersection between the VBE and DDC mode lists. + */ + 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 (xf86CheckModeForMonitor(mode, mon) == MODE_OK) { + found = 1; + break; + } + } + if (mode == pScrn->monitor->Last) + break; + } + if (!found) + return MODE_NOMODE; + + /* having found a matching mode, stash the CRTC values aside */ + VESASetModeParameters(pVesa->pVbe, p, mode); + return MODE_OK; + } + + /* No DDC and no modes make Homer something something... */ + return MODE_NOMODE; + } + + /* + * Finally, walk through the vsync rates 1Hz at a time looking for a mode + * that will fit. This is assuredly a terrible way to do this, but + * there's no obvious method for computing a mode of a given size that + * will pass xf86CheckModeForMonitor. XXX this path is terrible, but + * then, by this point, you're well into despair territory. + */ + 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); + if (ret == MODE_OK) + break; + } + + return ret; +} + /* * This function is called once, at the start of the first server generation to * do a minimal probe for supported hardware. @@ -252,6 +375,7 @@ VESAPciProbe(DriverPtr drv, int entity_num, struct pci_device *dev, pScrn->PreInit = VESAPreInit; pScrn->ScreenInit = VESAScreenInit; pScrn->SwitchMode = VESASwitchMode; + pScrn->ValidMode = VESAValidMode; pScrn->AdjustFrame = VESAAdjustFrame; pScrn->EnterVT = VESAEnterVT; pScrn->LeaveVT = VESALeaveVT; @@ -305,6 +429,7 @@ VESAProbe(DriverPtr drv, int flags) pScrn->PreInit = VESAPreInit; pScrn->ScreenInit = VESAScreenInit; pScrn->SwitchMode = VESASwitchMode; + pScrn->ValidMode = VESAValidMode; pScrn->AdjustFrame = VESAAdjustFrame; pScrn->EnterVT = VESAEnterVT; pScrn->LeaveVT = VESALeaveVT; @@ -339,6 +464,7 @@ VESAProbe(DriverPtr drv, int flags) pScrn->PreInit = VESAPreInit; pScrn->ScreenInit = VESAScreenInit; pScrn->SwitchMode = VESASwitchMode; + pScrn->ValidMode = VESAValidMode; pScrn->AdjustFrame = VESAAdjustFrame; pScrn->EnterVT = VESAEnterVT; pScrn->LeaveVT = VESALeaveVT; @@ -379,15 +505,6 @@ VESAFindIsaDevice(GDevPtr dev) return (int)CHIP_VESA_GENERIC; } -static VESAPtr -VESAGetRec(ScrnInfoPtr pScrn) -{ - if (!pScrn->driverPrivate) - pScrn->driverPrivate = xcalloc(sizeof(VESARec), 1); - - return ((VESAPtr)pScrn->driverPrivate); -} - static void VESAFreeRec(ScrnInfoPtr pScrn) { @@ -569,6 +686,7 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) VBESetModeNames(pScrn->modePool); + pVesa->strict_validation = TRUE; i = VBEValidateModes(pScrn, NULL, pScrn->display->modes, NULL, NULL, 0, 2048, 1, 0, 2048, pScrn->display->virtualX, @@ -576,6 +694,20 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) pVesa->mapSize, LOOKUP_BEST_REFRESH); if (i <= 0) { + DisplayModePtr mode; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "No valid modes left. Trying less strict filter...\n"); + for (mode = pScrn->monitor->Modes; mode; mode = mode->next) + mode->status = MODE_OK; + pVesa->strict_validation = FALSE; + i = VBEValidateModes(pScrn, NULL, pScrn->display->modes, + NULL, NULL, 0, 2048, 1, 0, 2048, + pScrn->display->virtualX, + pScrn->display->virtualY, + pVesa->mapSize, LOOKUP_BEST_REFRESH); + } + + if (i <= 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes\n"); vbeFree(pVesa->pVbe); return (FALSE); @@ -627,7 +759,7 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) FALSE)) pVesa->ModeSetClearScreen = TRUE; - if (!pVesa->defaultRefresh) + if (!pVesa->defaultRefresh && !pVesa->strict_validation) VBESetModeParameters(pScrn, pVesa->pVbe); mode = ((VbeModeInfoData*)pScrn->modes->Private)->data; diff --git a/src/vesa.h b/src/vesa.h index 6c5b8c0..f6a03fb 100644 --- a/src/vesa.h +++ b/src/vesa.h @@ -108,7 +108,7 @@ typedef struct _VESARec CARD32 *pal, *savedPal; CARD8 *fonts; xf86MonPtr monitor; - Bool shadowFB; + Bool shadowFB, strict_validation; CARD32 windowAoffset; /* Don't override the default refresh rate. */ Bool defaultRefresh; commit 1a256385169d61c6f42cb6f6d0eb1688570fd79e Author: Adam Jackson <a...@redhat.com> Date: Thu Jun 12 12:06:04 2008 -0400 Prefer a more modern depth/bpp selection. 24+32, then 24+24, then 16, 15, 8, 4, 1. See also Red Hat bugs #427383, #445566. diff --git a/src/vesa.c b/src/vesa.c index 3ac47e2..8595798 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -439,6 +439,7 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) int i; int flags24 = 0; int defaultDepth = 0; + int defaultBpp = 0; int depths = 0; if (flags & PROBE_DETECT) @@ -485,31 +486,29 @@ VESAPreInit(ScrnInfoPtr pScrn, int flags) V_MODETYPE_VBE); /* Preferred order for default depth selection. */ - if (depths & V_DEPTH_16) + if (depths & V_DEPTH_24) + defaultDepth = 24; + else if (depths & V_DEPTH_16) defaultDepth = 16; else if (depths & V_DEPTH_15) defaultDepth = 15; else if (depths & V_DEPTH_8) defaultDepth = 8; - else if (depths & V_DEPTH_24) - defaultDepth = 24; else if (depths & V_DEPTH_4) defaultDepth = 4; else if (depths & V_DEPTH_1) defaultDepth = 1; - /* - * Setting this avoids a "Driver can't support depth 24" message, - * which could be misleading. - */ - if (!flags24) - flags24 = Support24bppFb; + if (defaultDepth == 24 && !(flags24 & Support32bppFb)) + defaultBpp = 24; - /* Prefer 24bpp for fb since it potentially allows larger modes. */ + /* Prefer 32bpp because 1999 called and wants its packed pixels back */ + if (flags24 & Support32bppFb) + flags24 |= SupportConvert24to32 | PreferConvert24to32; if (flags24 & Support24bppFb) - flags24 |= SupportConvert32to24 | PreferConvert32to24; + flags24 |= SupportConvert32to24; - if (!xf86SetDepthBpp(pScrn, defaultDepth, 0, 0, flags24)) { + if (!xf86SetDepthBpp(pScrn, defaultDepth, 0, defaultBpp, flags24)) { vbeFree(pVesa->pVbe); return (FALSE); } commit 2760e3e9163768aea85d188ae23b7d9e4e89944b Author: Adam Jackson <a...@redhat.com> Date: Thu Jun 12 11:31:00 2008 -0400 Remove some useless module loading cruft. diff --git a/src/vesa.c b/src/vesa.c index 42eb3bd..3ac47e2 100644 --- a/src/vesa.c +++ b/src/vesa.c @@ -28,7 +28,6 @@ * Authors: Paulo César Pereira de Andrade <p...@conectiva.com.br> * David Dawes <da...@xfree86.org> * - * $XFree86: xc/programs/Xserver/hw/xfree86/drivers/vesa/vesa.c,v 1.40 2003/11/03 05:11:45 tsi Exp $ */ #ifdef HAVE_CONFIG_H @@ -173,57 +172,7 @@ static const OptionInfoRec VESAOptions[] = { { -1, NULL, OPTV_NONE, {0}, FALSE } }; -/* - * List of symbols from other modules that this module references. This - * list is used to tell the loader that it is OK for symbols here to be - * unresolved providing that it hasn't been told that they haven't been - * told that they are essential via a call to xf86LoaderReqSymbols() or - * xf86LoaderReqSymLists(). The purpose is this is to avoid warnings about - * unresolved symbols that are not required. - */ -static const char *fbSymbols[] = { - "fbPictureInit", - "fbScreenInit", - NULL -}; - -static const char *shadowSymbols[] = { - "shadowInit", - "shadowUpdatePackedWeak", - "shadowUpdatePlanar4Weak", - "shadowUpdatePlanar4x8Weak", - NULL -}; - -static const char *vbeSymbols[] = { - "VBEBankSwitch", - "VBEExtendedInit", - "VBEFindSupportedDepths", - "VBEGetModeInfo", - "VBEGetVBEInfo", - "VBEGetVBEMode", - "VBEPrintModes", - "VBESaveRestore", - "VBESetDisplayStart", - "VBESetGetDACPaletteFormat", - "VBESetGetLogicalScanlineLength", - "VBESetGetPaletteData", - "VBESetModeNames", - "VBESetModeParameters", - "VBESetVBEMode", - "VBEValidateModes", - "vbeDoEDID", - "vbeFree", - NULL -}; - #ifdef XFree86LOADER -static const char *ddcSymbols[] = { - "xf86PrintEDID", - "xf86SetDDCproperties", - NULL -}; - /* Module loader interface */ static MODULESETUPPROTO(vesaSetup); @@ -257,11 +206,6 @@ vesaSetup(pointer Module, pointer Options, int *ErrorMajor, int *ErrorMinor) { Initialised = TRUE; xf86AddDriver(&VESA, Module, 1); - LoaderRefSymLists(fbSymbols, - shadowSymbols, - vbeSymbols, - ddcSymbols, - NULL); return (pointer)TRUE; } -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org