summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>2008-07-18 18:27:26 -0300
committerPaulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>2008-07-29 18:15:59 -0300
commit97e2d12548921d92b6dc2dcce8abee48f25981d2 (patch)
tree685970ba09ca5b85b535863b9324afa66215a74b
parentd26e92a803df594a18e3de491671cd9c2a83698f (diff)
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".
-rw-r--r--configure.ac16
-rw-r--r--src/generic.c155
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 <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 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;
}