From 15560b021316214b3f86507a42f4e8539cff25a0 Mon Sep 17 00:00:00 2001 From: Paulo Cesar Pereira de Andrade Date: Fri, 18 Jul 2008 18:27:26 -0300 Subject: [PATCH] Add libpciaccess and remove xf1bpp and xf4bpp support. The driver is not fully functional, starts at 320x200, but may require running something like vbetool post before starting the X Server, and does not restore console as usually linux consoles use vesafb, but should work correctly if console is in a "standard vga mode". --- configure.ac | 16 ++++++ src/generic.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 146 insertions(+), 25 deletions(-) diff --git a/configure.ac b/configure.ac index 39e2a3d..be83b67 100644 --- a/configure.ac +++ b/configure.ac @@ -57,6 +57,22 @@ PKG_CHECK_MODULES(XORG, [xorg-server >= 1.0.99.901 xproto fontsproto $REQUIRED_M sdkdir=$(pkg-config --variable=sdkdir xorg-server) # Checks for libraries. +SAVE_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $XORG_CFLAGS" +AC_CHECK_DECL(XSERVER_LIBPCIACCESS, + [XSERVER_LIBPCIACCESS=yes], [XSERVER_LIBPCIACCESS=no], + [#include "xorg-server.h"]) +AC_CHECK_HEADER(xf1bpp.h,[AC_DEFINE(HAVE_XF1BPP, 1, [Have 1bpp support])],[]) +AC_CHECK_HEADER(xf4bpp.h,[AC_DEFINE(HAVE_XF4BPP, 1, [Have 4bpp support])],[]) +CPPFLAGS="$SAVE_CPPFLAGS" + +if test "x$XSERVER_LIBPCIACCESS" = xyes; then + PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.8.0]) + XORG_CFLAGS="$XORG_CFLAGS $PCIACCESS_CFLAGS" +fi +AM_CONDITIONAL(XSERVER_LIBPCIACCESS, test "x$XSERVER_LIBPCIACCESS" = xyes) + +# Checks for libraries. # Checks for header files. AC_HEADER_STDC diff --git a/src/generic.c b/src/generic.c index 4be7c39..8fd788f 100644 --- a/src/generic.c +++ b/src/generic.c @@ -50,8 +50,13 @@ #include "fb.h" +#if HAVE_XF4BPP #include "xf4bpp.h" +#endif + +#if HAVE_XF1BPP #include "xf1bpp.h" +#endif #include "shadowfb.h" @@ -62,6 +67,10 @@ #include "xf86Resources.h" #include "xf86int10.h" +#ifdef XSERVER_LIBPCIACCESS +#include +#endif + /* Some systems #define VGA for their own purposes */ #undef VGA @@ -79,10 +88,31 @@ #define CLOCK_TOLERANCE 2000 /* Clock matching tolerance (2MHz) */ #endif +/* + * This structure is used to wrap the screen's CloseScreen vector. + */ +typedef struct _GenericRec +{ + Bool ShadowFB; + Bool KGAUniversal; + CARD8 * ShadowPtr; + CARD32 ShadowPitch; + CloseScreenProcPtr CloseScreen; + OptionInfoPtr Options; +#ifdef XSERVER_LIBPCIACCESS + struct pci_device *pciInfo; +#endif +} GenericRec, *GenericPtr; + + /* Forward definitions */ static const OptionInfoRec *GenericAvailableOptions(int chipid, int busid); static void GenericIdentify(int); static Bool GenericProbe(DriverPtr, int); +#ifdef XSERVER_LIBPCIACCESS +static Bool GenericPciProbe(DriverPtr drv, int entity_num, + struct pci_device *dev, intptr_t match_data); +#endif static Bool GenericPreInit(ScrnInfoPtr, int); static Bool GenericScreenInit(int, ScreenPtr, int, char **); static Bool GenericSwitchMode(int, DisplayModePtr, int); @@ -97,6 +127,24 @@ static Bool GenericMapMem(ScrnInfoPtr scrp); static ModeStatus GenericValidMode(int, DisplayModePtr, Bool, int); +static GenericPtr GenericGetRec(ScrnInfoPtr pScreenInfo); + +enum GenericTypes +{ + CHIP_VGA_GENERIC +}; + +#ifdef XSERVER_LIBPCIACCESS +static const struct pci_id_match generic_device_match[] = { + { + PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, + 0x00030000, 0x00ffffff, CHIP_VGA_GENERIC + }, + + { 0, 0, 0 }, +}; +#endif + /* The root of all evil... */ _X_EXPORT DriverRec VGA = { @@ -106,7 +154,13 @@ _X_EXPORT DriverRec VGA = GenericProbe, GenericAvailableOptions, NULL, - 0 + 0, + NULL, + +#ifdef XSERVER_LIBPCIACCESS + generic_device_match, + GenericPciProbe +#endif }; typedef enum @@ -146,8 +200,12 @@ static const char *vgahwSymbols[] = #ifdef XFree86LOADER static const char *miscfbSymbols[] = { +#if HAVE_XF1BPP "xf1bppScreenInit", +#endif +#if HAVE_XF4BPP "xf4bppScreenInit", +#endif NULL }; #endif @@ -210,7 +268,13 @@ GenericSetup(pointer Module, pointer Options, int *ErrorMajor, int *ErrorMinor) if (!Initialised) { Initialised = TRUE; - xf86AddDriver(&VGA, Module, 0); + xf86AddDriver(&VGA, Module, +#ifdef XSERVER_LIBPCIACCESS + HaveDriverFuncs +#else + 0 +#endif + ); LoaderRefSymLists(vgahwSymbols, miscfbSymbols, fbSymbols, shadowfbSymbols, int10Symbols, NULL); return (pointer)TRUE; @@ -224,11 +288,6 @@ GenericSetup(pointer Module, pointer Options, int *ErrorMajor, int *ErrorMinor) #endif -enum GenericTypes -{ - CHIP_VGA_GENERIC -}; - /* Supported chipsets */ static SymTabRec GenericChipsets[] = { @@ -236,11 +295,13 @@ static SymTabRec GenericChipsets[] = {-1, NULL} }; +#ifndef XSERVER_LIBPCIACCESS static PciChipsets GenericPCIchipsets[] = { {CHIP_VGA_GENERIC, PCI_CHIP_VGA, RES_SHARED_VGA}, {-1, -1, RES_UNDEFINED}, }; +#endif static IsaChipsets GenericISAchipsets[] = { @@ -267,6 +328,37 @@ GenericAvailableOptions(int chipid, int busid) * do a minimal probe for supported hardware. */ +#ifdef XSERVER_LIBPCIACCESS +static Bool +GenericPciProbe(DriverPtr drv, int entity_num, struct pci_device *dev, + intptr_t match_data) +{ + ScrnInfoPtr pScrn; + + pScrn = xf86ConfigPciEntity(NULL, 0, entity_num, NULL, + NULL, NULL, NULL, NULL, NULL); + if (pScrn != NULL) { + GenericPtr pGeneric = GenericGetRec(pScrn); + + pScrn->driverVersion = VGA_VERSION_CURRENT; + pScrn->driverName = VGA_DRIVER_NAME; + pScrn->name = VGA_NAME; + pScrn->Probe = GenericProbe; + pScrn->PreInit = GenericPreInit; + pScrn->ScreenInit = GenericScreenInit; + pScrn->SwitchMode = GenericSwitchMode; + pScrn->AdjustFrame = GenericAdjustFrame; + pScrn->EnterVT = GenericEnterVT; + pScrn->LeaveVT = GenericLeaveVT; + pScrn->FreeScreen = GenericFreeScreen; + + pGeneric->pciInfo = dev; + } + + return (pScrn != NULL); +} +#endif + static Bool GenericProbe(DriverPtr drv, int flags) { @@ -283,6 +375,7 @@ GenericProbe(DriverPtr drv, int flags) if ((numDevSections = xf86MatchDevice(VGA_NAME, &devSections)) <= 0) return FALSE; +#ifndef XSERVER_LIBPCIACCESS /* PCI BUS */ if (xf86GetPciVideoInfo()) { @@ -324,6 +417,7 @@ GenericProbe(DriverPtr drv, int flags) xfree(usedChips); } } +#endif /* Isa Bus */ numUsed = xf86MatchIsaInstances(VGA_NAME, GenericChipsets, @@ -391,20 +485,6 @@ VGAFindIsaDevice(GDevPtr dev) return (int)CHIP_VGA_GENERIC; } -/* - * This structure is used to wrap the screen's CloseScreen vector. - */ -typedef struct _GenericRec -{ - Bool ShadowFB; - Bool KGAUniversal; - CARD8 * ShadowPtr; - CARD32 ShadowPitch; - CloseScreenProcPtr CloseScreen; - OptionInfoPtr Options; -} GenericRec, *GenericPtr; - - static GenericPtr GenericGetRec(ScrnInfoPtr pScreenInfo) { @@ -509,8 +589,14 @@ GenericPreInit(ScrnInfoPtr pScreenInfo, int flags) switch (pScreenInfo->depth) { - case 1: Module = "xf1bpp"; Sym = "xf1bppScreenInit"; break; - case 4: Module = "xf4bpp"; Sym = "xf4bppScreenInit"; break; + case 1: +#if HAVE_XF1BPP + Module = "xf1bpp"; Sym = "xf1bppScreenInit"; break; +#endif + case 4: +#if HAVE_XF4BPP + Module = "xf4bpp"; Sym = "xf4bppScreenInit"; break; +#endif case 8: Module = "fb"; break; default: @@ -673,6 +759,8 @@ GenericPreInit(ScrnInfoPtr pScreenInfo, int flags) /* Set display resolution */ xf86SetDpi(pScreenInfo, 0, 0); + +#if HAVE_XF1BPP && HAVE_XF4BPP if (xf86ReturnOptValBool(pGenericPriv->Options, OPTION_SHADOW_FB, FALSE)) { pGenericPriv->ShadowFB = TRUE; @@ -688,7 +776,7 @@ GenericPreInit(ScrnInfoPtr pScreenInfo, int flags) "Enabling universal \"KGA\" treatment.\n"); } -#ifdef SPECIAL_FB_BYTE_ACCESS +# ifdef SPECIAL_FB_BYTE_ACCESS if (!pGenericPriv->ShadowFB && (pScreenInfo->depth == 4)) { xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, @@ -696,8 +784,13 @@ GenericPreInit(ScrnInfoPtr pScreenInfo, int flags) " ShadowFB enabled.\n"); pGenericPriv->ShadowFB = TRUE; } +# endif + +#else + pGenericPriv->ShadowFB = TRUE; #endif + if (pGenericPriv->ShadowFB) { pScreenInfo->bitmapBitOrder = BITMAP_BIT_ORDER; @@ -1378,6 +1471,7 @@ GenericScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) #endif ShadowFBInit(pScreen, GenericRefreshArea1bpp); } +#if HAVE_XF1BPP else { Inited = xf1bppScreenInit(pScreen, pvgaHW->Base, @@ -1386,6 +1480,7 @@ GenericScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pScreenInfo->xDpi, pScreenInfo->yDpi, pScreenInfo->displayWidth); } +#endif break; case 4: if (pGenericPriv->ShadowFB) @@ -1410,6 +1505,7 @@ GenericScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) #endif ShadowFBInit(pScreen, GenericRefreshArea4bpp); } +#if HAVE_XF4BPP else { Inited = xf4bppScreenInit(pScreen, pvgaHW->Base, @@ -1418,6 +1514,7 @@ GenericScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pScreenInfo->xDpi, pScreenInfo->yDpi, pScreenInfo->displayWidth); } +#endif break; case 8: Inited = fbScreenInit(pScreen, pvgaHW->Base, @@ -1579,6 +1676,9 @@ GenericMapMem(ScrnInfoPtr scrp) { vgaHWPtr hwp = VGAHWPTR(scrp); int scr_index = scrp->scrnIndex; +#ifdef XSERVER_LIBPCIACCESS + GenericPtr pPriv = GenericGetRec(scrp); +#endif if (hwp->Base) return TRUE; @@ -1589,7 +1689,12 @@ GenericMapMem(ScrnInfoPtr scrp) if (hwp->MapPhys == 0) hwp->MapPhys = VGA_DEFAULT_PHYS_ADDR; - hwp->Base = xf86MapDomainMemory(scr_index, VIDMEM_MMIO, hwp->Tag, + hwp->Base = xf86MapDomainMemory(scr_index, VIDMEM_MMIO, +#ifdef XSERVER_LIBPCIACCESS + pPriv->pciInfo, +#else + hwp->Tag, +#endif hwp->MapPhys, hwp->MapSize); return hwp->Base != NULL; } -- 1.5.6