summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Bachelot <xavier@bachelot.org>2008-03-13 20:49:48 +0000
committerXavier Bachelot <xavier@bachelot.org>2008-03-13 20:49:48 +0000
commit2cfabf3ca546726f14d717d906bef6fce54d932b (patch)
tree9558bfae05224b5625103407e565ae8113464aef
parent9f71d9fa4a96db3113ffd2a3787b69e080fbf274 (diff)
libpciaccess support
-rw-r--r--ChangeLog12
-rw-r--r--configure.ac25
-rw-r--r--src/via.h18
-rw-r--r--src/via_dri.c24
-rw-r--r--src/via_driver.c258
-rw-r--r--src/via_driver.h15
-rw-r--r--src/via_id.c11
-rw-r--r--src/via_memcpy.c6
8 files changed, 326 insertions, 43 deletions
diff --git a/ChangeLog b/ChangeLog
index 804719d02f47..00b2d5c833a2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-03-11 Xavier Bachelot <xavier-at-bachelot-dot-org>
+
+ * configure.ac:
+ * src/via.h:
+ * src/via_dri.c: (VIADRIIrqInit), (VIADRIScreenInit):
+ * src/via_driver.c: (via_pci_device), (via_host_bridge),
+ (viaPciDeviceVga), (if), (switch):
+ * src/via_driver.h:
+ * src/via_id.c: (ViaCheckCardId):
+
+ Merge changes from pciaccess branch.
+
2008-02-19 Benno Schulenberg <bensberg-at-justemail-dot-net>
* src/via_driver.c: (VIAPreInit):
diff --git a/configure.ac b/configure.ac
index ab31cbdcd8ad..84550cb2e380 100644
--- a/configure.ac
+++ b/configure.ac
@@ -77,6 +77,14 @@ sdkdir=$(pkg-config --variable=sdkdir xorg-server)
# Checks for header files.
AC_HEADER_STDC
+AC_CHECK_HEADER(xf86Modes.h,[XMODES=yes],[XMODES=no],[#include "xorg-server.h"])
+AC_CHECK_DECL(XSERVER_LIBPCIACCESS,
+ [XSERVER_LIBPCIACCESS=yes],[XSERVER_LIBPCIACCESS=no],
+ [#include "xorg/xorg-server.h"])
+
+if test x$XSERVER_LIBPCIACCESS = xyes; then
+ PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.8.0])
+fi
if test "$DRI" != no; then
AC_CHECK_FILE([${sdkdir}/dri.h],
@@ -129,16 +137,12 @@ AC_CHECK_FILE([${sdkdir}/xf86Module.h],
[have_xf86Module_h="yes"], [have_xf86Module_h="no"])
# Check the ABI_VIDEODRV_VERSION
-SAVE_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $XORG_CFLAGS"
+SAVE_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $XORG_CFLAGS"
if test "x$have_xf86Module_h" = xyes; then
AC_MSG_CHECKING([whether to use old Xv ABI])
AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[
-#include "xf86Module.h"
-#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 1
-#error Old Xv ABI
-#endif
]])],
[OLD_XVABI=no],
[OLD_XVABI=yes])
@@ -147,7 +151,9 @@ else
echo -n "xf86Module.h not found, "
fi
-CPPFLAGS="$SAVE_CPPFLAGS"
+CFLAGS="$SAVE_CFLAGS"
+
+
if test "x$OLD_XVABI" = xyes; then
echo "yes."
@@ -156,6 +162,11 @@ else
AC_DEFINE(USE_NEW_XVABI, 1, [Use new Xv ABI (7.1RC1+)])
fi
+AM_CONDITIONAL(XSERVER_LIBPCIACCESS, test x$XSERVER_LIBPCIACCESS = xyes)
+if test "$XSERVER_LIBPCIACCESS" = yes; then
+ AC_DEFINE(XSERVER_LIBPCIACCESS,1,[Enable libpciaccess])
+fi
+
AM_CONDITIONAL(DEBUG, test x$DEBUG = xyes)
if test "$DEBUG" = yes; then
AC_DEFINE(HAVE_DEBUG,1,[Enable debug support])
diff --git a/src/via.h b/src/via.h
index 9e9c105ac6ae..09476a507856 100644
--- a/src/via.h
+++ b/src/via.h
@@ -25,8 +25,6 @@
#ifndef _VIA_H_
#define _VIA_H_ 1
-#include "xorgVersion.h"
-
#include <errno.h>
#include <string.h>
#include <stdio.h>
@@ -664,4 +662,20 @@
#define VBE_DEFAULT_REFRESH 6000
+#ifdef XSERVER_LIBPCIACCESS
+#define VIA_MEMBASE(p,n) (p)->regions[(n)].base_addr
+#define VENDOR_ID(p) (p)->vendor_id
+#define DEVICE_ID(p) (p)->device_id
+#define SUBVENDOR_ID(p) (p)->subvendor_id
+#define SUBSYS_ID(p) (p)->subdevice_id
+#define CHIP_REVISION(p) (p)->revision
+#else
+#define VIA_MEMBASE(p,n) (p)->memBase[n]
+#define VENDOR_ID(p) (p)->vendor
+#define DEVICE_ID(p) (p)->chipType
+#define SUBVENDOR_ID(p) (p)->subsysVendor
+#define SUBSYS_ID(p) (p)->subsysCard
+#define CHIP_REVISION(p) (p)->chipRev
+#endif
+
#endif /* _VIA_H_ */
diff --git a/src/via_dri.c b/src/via_dri.c
index fff377fccc65..5b99247d62e8 100644
--- a/src/via_dri.c
+++ b/src/via_dri.c
@@ -112,9 +112,15 @@ VIADRIIrqInit(ScrnInfoPtr pScrn, VIADRIPtr pVIADRI)
pVIADRI->irqEnabled = drmGetInterruptFromBusID
(pVia->drmFD,
- ((pciConfigPtr) pVia->PciInfo->thisCard)->busnum,
- ((pciConfigPtr) pVia->PciInfo->thisCard)->devnum,
- ((pciConfigPtr) pVia->PciInfo->thisCard)->funcnum);
+#ifdef XSERVER_LIBPCIACCESS
+ ((pVia->PciInfo->domain << 8) | pVia->PciInfo->bus),
+ pVia->PciInfo->dev, pVia->PciInfo->func
+#else
+ ((pciConfigPtr)pVia->PciInfo->thisCard)->busnum,
+ ((pciConfigPtr)pVia->PciInfo->thisCard)->devnum,
+ ((pciConfigPtr)pVia->PciInfo->thisCard)->funcnum
+#endif
+ );
if ((drmCtlInstHandler(pVia->drmFD, pVIADRI->irqEnabled))) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"[drm] Failure adding IRQ handler. "
@@ -586,9 +592,15 @@ VIADRIScreenInit(ScreenPtr pScreen)
pDRIInfo->clientDriverName = VIAClientDriverName;
pDRIInfo->busIdString = xalloc(64);
sprintf(pDRIInfo->busIdString, "PCI:%d:%d:%d",
- ((pciConfigPtr) pVia->PciInfo->thisCard)->busnum,
- ((pciConfigPtr) pVia->PciInfo->thisCard)->devnum,
- ((pciConfigPtr) pVia->PciInfo->thisCard)->funcnum);
+#ifdef XSERVER_LIBPCIACCESS
+ ((pVia->PciInfo->domain << 8) | pVia->PciInfo->bus),
+ pVia->PciInfo->dev, pVia->PciInfo->func
+#else
+ ((pciConfigPtr)pVia->PciInfo->thisCard)->busnum,
+ ((pciConfigPtr)pVia->PciInfo->thisCard)->devnum,
+ ((pciConfigPtr)pVia->PciInfo->thisCard)->funcnum
+#endif
+ );
pDRIInfo->ddxDriverMajorVersion = VIA_DRIDDX_VERSION_MAJOR;
pDRIInfo->ddxDriverMinorVersion = VIA_DRIDDX_VERSION_MINOR;
pDRIInfo->ddxDriverPatchVersion = VIA_DRIDDX_VERSION_PATCH;
diff --git a/src/via_driver.c b/src/via_driver.c
index 27082028b4f0..a19e091b0e17 100644
--- a/src/via_driver.c
+++ b/src/via_driver.c
@@ -50,7 +50,43 @@
/* Prototypes. */
static void VIAIdentify(int flags);
+#ifdef XSERVER_LIBPCIACCESS
+struct pci_device*
+via_pci_device(const struct pci_slot_match *bridge_match) {
+ struct pci_device_iterator *slot_iterator;
+ struct pci_device *bridge;
+
+ slot_iterator = pci_slot_match_iterator_create (bridge_match);
+ bridge = pci_device_next (slot_iterator);
+ pci_iterator_destroy (slot_iterator);
+ return bridge;
+}
+
+struct pci_device *
+via_host_bridge (void)
+{
+ static const struct pci_slot_match bridge_match = {
+ 0, 0, 0, 0, 0
+ };
+ return via_pci_device(&bridge_match);
+}
+
+viaPciDeviceVga(void)
+{
+ static const struct pci_slot_match bridge_match = {
+ 0, 0, 0, 3, 0
+ };
+ return via_pci_device(&bridge_match);
+}
+
+static Bool via_pci_probe (DriverPtr drv,
+ int entity_num,
+ struct pci_device *dev,
+ intptr_t match_data);
+#else
static Bool VIAProbe(DriverPtr drv, int flags);
+#endif
+
static Bool VIASetupDefaultOptions(ScrnInfoPtr pScrn);
static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags);
static Bool VIAEnterVT(int scrnIndex, int flags);
@@ -75,16 +111,46 @@ static void VIAUnmapMem(ScrnInfoPtr pScrn);
static void VIALoadRgbLut(ScrnInfoPtr pScrn, int numColors, int *indices,
LOCO *colors, VisualPtr pVisual);
+#ifdef XSERVER_LIBPCIACCESS
+
+#define VIA_DEVICE_MATCH(d,i) \
+ { 0x1106, (d), PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, (i) }
+
+static const struct pci_id_match via_device_match[] = {
+ VIA_DEVICE_MATCH (PCI_CHIP_VT3204, 0 ),
+ VIA_DEVICE_MATCH (PCI_CHIP_VT3259, 0 ),
+ VIA_DEVICE_MATCH (PCI_CHIP_CLE3122, 0 ),
+ VIA_DEVICE_MATCH (PCI_CHIP_VT3205, 0 ),
+ VIA_DEVICE_MATCH (PCI_CHIP_VT3314, 0 ),
+ VIA_DEVICE_MATCH (PCI_CHIP_VT3336, 0 ),
+ VIA_DEVICE_MATCH (PCI_CHIP_VT3364, 0 ),
+ VIA_DEVICE_MATCH (PCI_CHIP_VT3324, 0 ),
+ VIA_DEVICE_MATCH (PCI_CHIP_VT3327, 0 ),
+ { 0, 0, 0 },
+};
-DriverRec VIA = {
+#endif /* XSERVER_LIBPCIACCESS */
+
+_X_EXPORT DriverRec VIA =
+ {
VIA_VERSION,
DRIVER_NAME,
VIAIdentify,
+#ifdef XSERVER_LIBPCIACCESS
+ NULL,
+#else
VIAProbe,
+#endif
VIAAvailableOptions,
NULL,
- 0
-};
+ 0,
+ NULL,
+#ifdef XSERVER_LIBPCIACCESS
+ via_device_match,
+ via_pci_probe
+#endif
+
+ };
/* Supported chipsets */
static SymTabRec VIAChipsets[] = {
@@ -398,8 +464,7 @@ static XF86ModuleVersionInfo VIAVersRec = {
{0, 0, 0, 0}
};
-XF86ModuleData openchromeModuleData = { &VIAVersRec, VIASetup, NULL };
-
+_X_EXPORT XF86ModuleData openchromeModuleData = { &VIAVersRec, VIASetup, NULL };
static pointer
VIASetup(pointer module, pointer opts, int *errmaj, int *errmin)
@@ -408,7 +473,13 @@ VIASetup(pointer module, pointer opts, int *errmaj, int *errmin)
if (!setupDone) {
setupDone = TRUE;
- xf86AddDriver(&VIA, module, 0);
+ xf86AddDriver(&VIA, module,
+#ifdef XSERVER_LIBPCIACCESS
+ HaveDriverFuncs
+#else
+ 0
+#endif
+ );
LoaderRefSymLists(vgaHWSymbols,
#ifdef USE_FB
fbSymbols,
@@ -498,6 +569,46 @@ VIAIdentify(int flags)
VIAChipsets);
}
+#ifdef XSERVER_LIBPCIACCESS
+static Bool via_pci_probe (DriverPtr driver,
+ int entity_num,
+ struct pci_device *device,
+ intptr_t match_data)
+{
+ ScrnInfoPtr scrn = NULL;
+ EntityInfoPtr entity;
+ DevUnion *private;
+
+ scrn = xf86ConfigPciEntity (scrn, 0, entity_num, VIAPciChipsets,
+ NULL,
+ NULL, NULL, NULL, NULL);
+
+ if (scrn != NULL)
+ {
+ scrn->driverVersion = VIA_VERSION;
+ scrn->driverName = DRIVER_NAME;
+ scrn->name = "CHROME";
+ scrn->Probe = NULL;
+
+ entity = xf86GetEntityInfo (entity_num);
+
+ scrn->PreInit = VIAPreInit;
+ scrn->ScreenInit = VIAScreenInit;
+ scrn->SwitchMode = VIASwitchMode;
+ scrn->AdjustFrame = VIAAdjustFrame;
+ scrn->EnterVT = VIAEnterVT;
+ scrn->LeaveVT = VIALeaveVT;
+ scrn->FreeScreen = VIAFreeScreen;
+ scrn->ValidMode = ViaValidMode;
+
+ xf86Msg(X_NOTICE, "VIA Technologies does not support or endorse this driver in any way.\n");
+ xf86Msg(X_NOTICE, "For support, please refer to http://www.openchrome.org/ or\n");
+ xf86Msg(X_NOTICE, "your X vendor.\n");
+ }
+ return scrn != NULL;
+}
+#else /* XSERVER_LIBPCIACCESS */
+
static Bool
VIAProbe(DriverPtr drv, int flags)
{
@@ -607,6 +718,7 @@ VIAProbe(DriverPtr drv, int flags)
return foundScreen;
} /* VIAProbe */
+#endif /* else XSERVER_LIBPCIACCESS */
#ifdef XF86DRI
static void
@@ -756,6 +868,10 @@ VIAPreInit(ScrnInfoPtr pScrn, int flags)
vgaHWPtr hwp;
int i, bMemSize = 0;
+#ifdef XSERVER_LIBPCIACCESS
+ struct pci_device *bridge = via_host_bridge ();
+#endif
+
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAPreInit\n"));
if (pScrn->numEntities > 1)
@@ -932,7 +1048,7 @@ VIAPreInit(ScrnInfoPtr pScrn, int flags)
pEnt->device->chipID);
} else {
from = X_PROBED;
- pVia->ChipId = pVia->PciInfo->chipType;
+ pVia->ChipId = DEVICE_ID(pVia->PciInfo);
pVia->Chipset = LookupChipID(VIAPciChipsets, pVia->ChipId);
pScrn->chipset = (char *)xf86TokenToString(VIAChipsets, pVia->Chipset);
}
@@ -945,7 +1061,13 @@ VIAPreInit(ScrnInfoPtr pScrn, int flags)
pVia->ChipRev);
} else {
/* Read PCI bus 0, dev 0, function 0, index 0xF6 to get chip revision */
+#ifdef XSERVER_LIBPCIACCESS
+ struct pci_device *bridge = via_host_bridge ();
+
+ pci_device_cfg_read_u32 (bridge, & pVia->ChipRev, 0xF6);
+#else
pVia->ChipRev = pciReadByte(pciTag(0, 0, 0), 0xF6);
+#endif
}
if (pVia->Chipset == VIA_CLE266)
@@ -957,24 +1079,41 @@ VIAPreInit(ScrnInfoPtr pScrn, int flags)
/* Detect the amount of installed RAM */
from = X_PROBED;
+ CARD8 videoRam ;
+#ifdef XSERVER_LIBPCIACCESS
+ struct pci_device *vgaDevice = viaPciDeviceVga() ;
+#endif
+
switch (pVia->Chipset) {
case VIA_CLE266:
case VIA_KM400:
- pScrn->videoRam = (1 << ((pciReadByte(pciTag(0, 0, 0), 0xE1)
- & 0x70) >> 4)) << 10;
+#ifdef XSERVER_LIBPCIACCESS
+ pci_device_cfg_read_u8(bridge, &videoRam, 0xE1);
+#else
+ videoRam = pciReadByte(pciTag(0, 0, 0), 0xE1) & 0x70 ;
+#endif
+ pScrn->videoRam = ( 1 << ((videoRam & 0x70) >> 4 )) << 10 ;
break;
case VIA_PM800:
case VIA_VM800:
case VIA_K8M800:
- pScrn->videoRam = (1 << ((pciReadByte(pciTag(0, 0, 3), 0xA1)
- & 0x70) >> 4)) << 10;
+#ifdef XSERVER_LIBPCIACCESS
+ pci_device_cfg_read_u8(vgaDevice, &videoRam, 0xA1);
+#else
+ videoRam = pciReadByte(pciTag(0, 0, 3), 0xA1) & 0x70;
+#endif
+ pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4)) << 10;
break;
case VIA_K8M890:
case VIA_P4M890:
case VIA_P4M900:
case VIA_CX700:
- pScrn->videoRam = (1 << ((pciReadByte(pciTag(0, 0, 3), 0xA1)
- & 0x70) >> 4)) << 12;
+#ifdef XSERVER_LIBPCIACCESS
+ pci_device_cfg_read_u8(vgaDevice, &videoRam, 0xA1);
+#else
+ videoRam = pciReadByte(pciTag(0, 0, 3), 0xA1) & 0x70;
+#endif
+ pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4 )) << 12;
break;
default:
if (pScrn->videoRam < 16384 || pScrn->videoRam > 65536) {
@@ -1350,8 +1489,10 @@ VIAPreInit(ScrnInfoPtr pScrn, int flags)
/* maybe throw in some more sanity checks here */
+#ifndef XSERVER_LIBPCIACCESS
pVia->PciTag = pciTag(pVia->PciInfo->bus, pVia->PciInfo->device,
pVia->PciInfo->func);
+#endif
if (!VIAMapMMIO(pScrn)) {
VIAFreeRec(pScrn);
@@ -2008,26 +2149,73 @@ static Bool
VIAMapMMIO(ScrnInfoPtr pScrn)
{
VIAPtr pVia = VIAPTR(pScrn);
+#ifdef XSERVER_LIBPCIACCESS
+ int err;
+#endif
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAMapMMIO\n"));
+#ifdef XSERVER_LIBPCIACCESS
+ pVia->FrameBufferBase = pVia->PciInfo->regions[0].base_addr;
+ pVia->MmioBase = pVia->PciInfo->regions[1].base_addr;
+#else
pVia->FrameBufferBase = pVia->PciInfo->memBase[0];
pVia->MmioBase = pVia->PciInfo->memBase[1];
+#endif
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
"mapping MMIO @ 0x%lx with size 0x%x\n",
pVia->MmioBase, VIA_MMIO_REGSIZE);
- pVia->MapBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag,
- pVia->MmioBase, VIA_MMIO_REGSIZE);
+#ifdef XSERVER_LIBPCIACCESS
+ err = pci_device_map_range (pVia->PciInfo,
+ pVia->MmioBase,
+ VIA_MMIO_REGSIZE,
+ PCI_DEV_MAP_FLAG_WRITABLE,
+ (void **) &pVia->MapBase);
+
+ if (err)
+ {
+ xf86DrvMsg (pScrn->scrnIndex, X_ERROR,
+ "Unable to map mmio BAR. %s (%d)\n",
+ strerror (err), err);
+ return FALSE;
+ }
+#else
+ pVia->MapBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO,
+ pVia->PciTag,
+ pVia->MmioBase, VIA_MMIO_REGSIZE);
+ if (!pVia->MapBase)
+ return FALSE;
+#endif
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
"mapping BitBlt MMIO @ 0x%lx with size 0x%x\n",
pVia->MmioBase + VIA_MMIO_BLTBASE, VIA_MMIO_BLTSIZE);
- pVia->BltBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag,
- pVia->MmioBase + VIA_MMIO_BLTBASE,
- VIA_MMIO_BLTSIZE);
+#ifdef XSERVER_LIBPCIACCESS
+ err = pci_device_map_range (pVia->PciInfo,
+ pVia->MmioBase + VIA_MMIO_BLTBASE,
+ VIA_MMIO_BLTSIZE,
+ (PCI_DEV_MAP_FLAG_WRITABLE
+ |PCI_DEV_MAP_FLAG_WRITE_COMBINE),
+ (void **) &pVia->BltBase);
+
+ if (err)
+ {
+ xf86DrvMsg (pScrn->scrnIndex, X_ERROR,
+ "Unable to map blt BAR. %s (%d)\n",
+ strerror (err), err);
+ return FALSE;
+ }
+#else
+ pVia->BltBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO,
+ pVia->PciTag,
+ pVia->MmioBase + VIA_MMIO_BLTBASE,
+ VIA_MMIO_BLTSIZE);
+ if (!pVia->BltBase)
+ return FALSE;
+#endif
if (!pVia->MapBase || !pVia->BltBase) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
@@ -2073,6 +2261,9 @@ static Bool
VIAMapFB(ScrnInfoPtr pScrn)
{
VIAPtr pVia = VIAPTR(pScrn);
+#ifdef XSERVER_LIBPCIACCESS
+ int err;
+#endif
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAMapFB\n"));
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
@@ -2087,6 +2278,7 @@ VIAMapFB(ScrnInfoPtr pScrn)
* in the OS support layer.
*/
+#ifndef XSERVER_LIBPCIACCESS
unsigned char *tmp;
tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO,
@@ -2104,10 +2296,24 @@ VIAMapFB(ScrnInfoPtr pScrn)
pVia->videoRambytes);
xf86UnMapVidMem(pScrn->scrnIndex, (pointer) tmp, pVia->videoRambytes);
+#endif
/*
* End of hack.
*/
+#ifdef XSERVER_LIBPCIACCESS
+ err = pci_device_map_range (pVia->PciInfo, pVia->FrameBufferBase,
+ pVia->videoRambytes,
+ PCI_DEV_MAP_FLAG_WRITABLE,
+ (void **) &pVia->FBBase);
+ if (err)
+ {
+ xf86DrvMsg (pScrn->scrnIndex, X_ERROR,
+ "Unable to map mmio BAR. %s (%d)\n",
+ strerror (err), err);
+ return FALSE;
+ }
+#else
pVia->FBBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER,
pVia->PciTag, pVia->FrameBufferBase,
pVia->videoRambytes);
@@ -2117,6 +2323,7 @@ VIAMapFB(ScrnInfoPtr pScrn)
"Internal error: could not map framebuffer\n");
return FALSE;
}
+#endif
pVia->FBFreeStart = (pScrn->displayWidth * pScrn->bitsPerPixel >> 3) *
pScrn->virtualY;
@@ -2127,7 +2334,11 @@ VIAMapFB(ScrnInfoPtr pScrn)
pVia->FBBase, pVia->FBFreeStart, pVia->FBFreeEnd);
}
+#ifdef XSERVER_LIBPCIACCESS
+ pScrn->memPhysBase = pVia->PciInfo->regions[0].base_addr;
+#else
pScrn->memPhysBase = pVia->PciInfo->memBase[0];
+#endif
pScrn->fbOffset = 0;
if (pVia->IsSecondary)
pScrn->fbOffset = pScrn->videoRam << 10;
@@ -2146,6 +2357,16 @@ VIAUnmapMem(ScrnInfoPtr pScrn)
/* Disable MMIO */
ViaSeqMask(VGAHWPTR(pScrn), 0x1A, 0x00, 0x60);
+#ifdef XSERVER_LIBPCIACCESS
+ if (pVia->MapBase)
+ pci_device_unmap_range(pVia->PciInfo, (pointer)pVia->MapBase, VIA_MMIO_REGSIZE);
+
+ if (pVia->BltBase)
+ pci_device_unmap_range(pVia->PciInfo, (pointer)pVia->BltBase, VIA_MMIO_BLTSIZE);
+
+ if (pVia->FBBase)
+ pci_device_unmap_range(pVia->PciInfo, (pointer)pVia->FBBase, pVia->videoRambytes);
+#else
if (pVia->MapBase)
xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->MapBase,
VIA_MMIO_REGSIZE);
@@ -2157,6 +2378,7 @@ VIAUnmapMem(ScrnInfoPtr pScrn)
if (pVia->FBBase)
xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->FBBase,
pVia->videoRambytes);
+#endif
}
static void
diff --git a/src/via_driver.h b/src/via_driver.h
index 113c7be6a197..00f60fde1aa0 100644
--- a/src/via_driver.h
+++ b/src/via_driver.h
@@ -66,6 +66,10 @@
#include "via_dmabuffer.h"
#include "via_3d.h"
+#ifdef XSERVER_LIBPCIACCESS
+#include <pciaccess.h>
+#endif
+
#ifdef XF86DRI
#define _XF86DRI_SERVER_
#include "sarea.h"
@@ -234,8 +238,15 @@ typedef struct _VIA {
int agpMem;
CloseScreenProcPtr CloseScreen;
- pciVideoPtr PciInfo;
- PCITAG PciTag;
+#ifdef XSERVER_LIBPCIACCESS
+ struct pci_device *PciInfo;
+ int mmio_bar;
+ int fb_bar;
+ PCITAG PciTag;
+#else
+ pciVideoPtr PciInfo;
+ PCITAG PciTag;
+#endif
int Chipset;
int ChipId;
int ChipRev;
diff --git a/src/via_id.c b/src/via_id.c
index 63a4631df82d..867290948f3d 100644
--- a/src/via_id.c
+++ b/src/via_id.c
@@ -30,6 +30,7 @@
#endif
#include "via_driver.h"
+#include "via.h"
#include "via_id.h"
/*
@@ -228,15 +229,15 @@ ViaCheckCardId(ScrnInfoPtr pScrn)
struct ViaCardIdStruct *Id;
VIAPtr pVia = VIAPTR(pScrn);
- if ((pVia->PciInfo->subsysVendor == pVia->PciInfo->vendor) &&
- (pVia->PciInfo->subsysCard == pVia->PciInfo->chipType))
+ if ((SUBVENDOR_ID(pVia->PciInfo) == VENDOR_ID(pVia->PciInfo)) &&
+ (SUBSYS_ID(pVia->PciInfo) == DEVICE_ID(pVia->PciInfo)))
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"Manufacturer plainly copied main PCI IDs to subsystem/card IDs.\n");
for (Id = ViaCardId; Id->String; Id++) {
if ((Id->Chip == pVia->Chipset) &&
- (Id->Vendor == pVia->PciInfo->subsysVendor) &&
- (Id->Device == pVia->PciInfo->subsysCard)) {
+ (Id->Vendor == SUBVENDOR_ID(pVia->PciInfo)) &&
+ (Id->Device == SUBSYS_ID(pVia->PciInfo))) {
xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected %s.\n", Id->String);
pVia->Id = Id;
return;
@@ -245,7 +246,7 @@ ViaCheckCardId(ScrnInfoPtr pScrn)
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Unknown Card-Ids (%4X|%4X|%4X); please report to openchrome-users@openchrome.org\n",
- pVia->PciInfo->chipType, pVia->PciInfo->subsysVendor, pVia->PciInfo->subsysCard);
+ DEVICE_ID(pVia->PciInfo), SUBVENDOR_ID(pVia->PciInfo), SUBSYS_ID(pVia->PciInfo));
pVia->Id = NULL;
}
diff --git a/src/via_memcpy.c b/src/via_memcpy.c
index a46ecc003fec..d933ba042ea3 100644
--- a/src/via_memcpy.c
+++ b/src/via_memcpy.c
@@ -322,7 +322,7 @@ libc_YUV42X(unsigned char *dst, const unsigned char *src,
if (dstPitch == w) {
int size = h * ((yuv422) ? w : (w + (w >> 1)));
- xf86memcpy(dst, src, size);
+ memcpy(dst, src, size);
return;
} else {
int count;
@@ -330,7 +330,7 @@ libc_YUV42X(unsigned char *dst, const unsigned char *src,
/* Copy Y component to video memory. */
count = h;
while (count--) {
- xf86memcpy(dst, src, w);
+ memcpy(dst, src, w);
src += w;
dst += dstPitch;
}
@@ -343,7 +343,7 @@ libc_YUV42X(unsigned char *dst, const unsigned char *src,
/* Copy V(Cr),U(Cb) components to video memory. */
count = h;
while (count--) {
- xf86memcpy(dst, src, w);
+ memcpy(dst, src, w);
src += w;
dst += dstPitch;
}