From: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
Date: Fri, 18 Jul 2008 21:27:26 +0000 (-0300)
Subject: Add libpciaccess and remove xf1bpp and xf4bpp support.
X-Git-Url: http://gitweb.freedesktop.org/?p=xorg/driver/xf86-video-vga.git;a=commitdiff;h=97e2d12548921d92b6dc2dcce8abee48f25981d2

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".
---

--- a/configure.ac
+++ b/configure.ac
@@ -57,6 +57,22 @@ PKG_CHECK_MODULES(XORG, [xorg-server >= 
 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
--- 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 <pciaccess.h>
+#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                 GenericMapMe
 
 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 Opt
     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 Opt
 #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 
  * 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, 
 
     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, 
     /* 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, 
 		   "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, 
 	    "  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, ScreenP
 #endif
 		ShadowFBInit(pScreen, GenericRefreshArea1bpp);
 	    }
+#if HAVE_XF1BPP
 	    else
 	    {
 		Inited = xf1bppScreenInit(pScreen, pvgaHW->Base,
@@ -1386,6 +1480,7 @@ GenericScreenInit(int scrnIndex, ScreenP
 					  pScreenInfo->xDpi, pScreenInfo->yDpi,
 					  pScreenInfo->displayWidth);
 	    }
+#endif
 	    break;
 	case 4:
 	    if (pGenericPriv->ShadowFB)
@@ -1410,6 +1505,7 @@ GenericScreenInit(int scrnIndex, ScreenP
 #endif
 		ShadowFBInit(pScreen, GenericRefreshArea4bpp);
 	    }
+#if HAVE_XF4BPP
 	    else
 	    {
 		Inited = xf4bppScreenInit(pScreen, pvgaHW->Base,
@@ -1418,6 +1514,7 @@ GenericScreenInit(int scrnIndex, ScreenP
 					  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;
 }