summaryrefslogtreecommitdiff
path: root/hw/xfree86/common
diff options
context:
space:
mode:
Diffstat (limited to 'hw/xfree86/common')
-rw-r--r--hw/xfree86/common/Makefile.am2
-rw-r--r--hw/xfree86/common/xf86.h27
-rw-r--r--hw/xfree86/common/xf86AutoConfig.c36
-rw-r--r--hw/xfree86/common/xf86Bus.c77
-rw-r--r--hw/xfree86/common/xf86Bus.h3
-rw-r--r--hw/xfree86/common/xf86Config.c17
-rw-r--r--hw/xfree86/common/xf86Config.h11
-rw-r--r--hw/xfree86/common/xf86Configure.c52
-rw-r--r--hw/xfree86/common/xf86DoProbe.c4
-rw-r--r--hw/xfree86/common/xf86DoScanPci.c95
-rw-r--r--hw/xfree86/common/xf86Globals.c5
-rw-r--r--hw/xfree86/common/xf86Helper.c121
-rw-r--r--hw/xfree86/common/xf86Init.c260
-rw-r--r--hw/xfree86/common/xf86Module.h2
-rw-r--r--hw/xfree86/common/xf86Priv.h9
-rw-r--r--hw/xfree86/common/xf86pciBus.c3020
-rw-r--r--hw/xfree86/common/xf86pciBus.h25
-rw-r--r--hw/xfree86/common/xf86str.h60
18 files changed, 764 insertions, 3062 deletions
diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
index d15e99a51..db726fea1 100644
--- a/hw/xfree86/common/Makefile.am
+++ b/hw/xfree86/common/Makefile.am
@@ -44,7 +44,7 @@ libinit_a_SOURCES = xf86Build.h xf86Init.c
INCLUDES = $(XORG_INCS) -I$(srcdir)/../ddc -I$(srcdir)/../i2c \
-I$(srcdir)/../loader -I$(srcdir)/../rac -I$(srcdir)/../parser \
- -I$(srcdir)/../scanpci -I$(srcdir)/../vbe -I$(srcdir)/../int10 \
+ -I$(srcdir)/../vbe -I$(srcdir)/../int10 \
-I$(srcdir)/../vgahw -I$(srcdir)/../dixmods/extmod
sdk_HEADERS = compiler.h fourcc.h xf86.h xf86Module.h xf86Opt.h \
diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
index f2cf78cf8..69d619e6f 100644
--- a/hw/xfree86/common/xf86.h
+++ b/hw/xfree86/common/xf86.h
@@ -42,6 +42,8 @@
#include <dix-config.h>
#endif
+#include <pciaccess.h>
+
#include "xf86str.h"
#include "xf86Opt.h"
#include <X11/Xfuncproto.h>
@@ -90,16 +92,13 @@ extern Bool xf86inSuspend;
/* xf86Bus.c */
-Bool xf86CheckPciSlot(int bus, int device, int func);
-int xf86ClaimPciSlot(int bus, int device, int func, DriverPtr drvp,
+Bool xf86CheckPciSlot( const struct pci_device * );
+int xf86ClaimPciSlot( struct pci_device *, DriverPtr drvp,
int chipset, GDevPtr dev, Bool active);
Bool xf86ParsePciBusString(const char *busID, int *bus, int *device,
int *func);
Bool xf86ComparePciBusString(const char *busID, int bus, int device, int func);
void xf86FormatPciBusNumber(int busnum, char *buffer);
-pciVideoPtr *xf86GetPciVideoInfo(void);
-pciConfigPtr *xf86GetPciConfigInfo(void);
-void xf86SetPciVideo(pciVideoPtr, resType);
void xf86PrintResList(int verb, resPtr list);
resPtr xf86AddRangesToList(resPtr list, resRange *pRange, int entityIndex);
int xf86ClaimIsaSlot(DriverPtr drvp, int chipset, GDevPtr dev, Bool active);
@@ -110,7 +109,7 @@ int xf86ClaimFbSlot(DriverPtr drvp, int chipset, GDevPtr dev, Bool active);
int xf86ClaimNoSlot(DriverPtr drvp, int chipset, GDevPtr dev, Bool active);
void xf86EnableAccess(ScrnInfoPtr pScrn);
void xf86SetCurrentAccess(Bool Enable, ScrnInfoPtr pScrn);
-Bool xf86IsPrimaryPci(pciVideoPtr pPci);
+Bool xf86IsPrimaryPci(struct pci_device * pPci);
Bool xf86IsPrimaryIsa(void);
/* new RAC */
resPtr xf86AddResToList(resPtr rlist, resRange *Range, int entityIndex);
@@ -126,19 +125,16 @@ int xf86GetNumEntityInstances(int entityIndex);
GDevPtr xf86GetDevFromEntity(int entityIndex, int instance);
void xf86RemoveEntityFromScreen(ScrnInfoPtr pScrn, int entityIndex);
EntityInfoPtr xf86GetEntityInfo(int entityIndex);
-pciVideoPtr xf86GetPciInfoForEntity(int entityIndex);
-int xf86GetPciEntity(int bus, int dev, int func);
+struct pci_device * xf86GetPciInfoForEntity(int entityIndex);
Bool xf86SetEntityFuncs(int entityIndex, EntityProc init,
EntityProc enter, EntityProc leave, pointer);
void xf86DeallocateResourcesForEntity(int entityIndex, unsigned long type);
resPtr xf86RegisterResources(int entityIndex, resList list,
unsigned long Access);
-Bool xf86CheckPciMemBase(pciVideoPtr pPci, memType base);
+Bool xf86CheckPciMemBase(struct pci_device * pPci, memType base);
void xf86SetAccessFuncs(EntityInfoPtr pEnt, xf86SetAccessFuncPtr funcs,
xf86SetAccessFuncPtr oldFuncs);
Bool xf86IsEntityPrimary(int entityIndex);
-Bool xf86FixPciResource(int entityIndex, int prt, memType alignment,
- unsigned long type);
resPtr xf86ReallocatePciResources(int entityIndex, resPtr pRes);
resPtr xf86SetOperatingState(resList list, int entityIndex, int mask);
void xf86EnterServerState(xf86State state);
@@ -149,14 +145,9 @@ resRange xf86GetSparse(unsigned long type, memType fixed_bits,
memType decode_mask, memType address_mask,
resPtr avoid);
memType xf86ChkConflict(resRange *rgp, int entityIndex);
-Bool xf86IsPciDevPresent(int bus, int dev, int func);
ScrnInfoPtr xf86FindScreenForEntity(int entityIndex);
Bool xf86NoSharedResources(int screenIndex, resType res);
resPtr xf86FindIntersectOfLists(resPtr l1, resPtr l2);
-pciVideoPtr xf86FindPciDeviceVendor(CARD16 vendorID, CARD16 deviceID,
- char n, pciVideoPtr pvp_exclude);
-pciVideoPtr xf86FindPciClass(CARD8 intf, CARD8 subClass, CARD16 class,
- char n, pciVideoPtr pvp_exclude);
void xf86RegisterStateChangeNotificationCallback(xf86StateChangeNotificationCallbackFunc func, pointer arg);
Bool xf86DeregisterStateChangeNotificationCallback(xf86StateChangeNotificationCallbackFunc func);
@@ -175,8 +166,8 @@ DevUnion *xf86GetEntityPrivate(int entityIndex, int privIndex);
/* xf86Configure.c */
GDevPtr xf86AddBusDeviceToConfigure(const char *driver, BusType bus,
void *busData, int chipset);
-GDevPtr xf86AddDeviceToConfigure(const char *driver, pciVideoPtr pVideo,
- int chipset);
+GDevPtr xf86AddDeviceToConfigure( const char *driver,
+ struct pci_device * pVideo, int chipset );
/* xf86Cursor.c */
diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c
index 4f6a98aef..4bdf1ceb8 100644
--- a/hw/xfree86/common/xf86AutoConfig.c
+++ b/hw/xfree86/common/xf86AutoConfig.c
@@ -48,7 +48,6 @@
"\tLoad\t\"dbe\"\n" \
"\tLoad\t\"glx\"\n" \
"\tLoad\t\"freetype\"\n" \
- "\tLoad\t\"type1\"\n" \
"\tLoad\t\"record\"\n" \
"\tLoad\t\"dri\"\n" \
"EndSection\n\n"
@@ -156,7 +155,7 @@ AppendToConfig(const char *s)
}
static const char *
-videoPtrToDriverName(pciVideoPtr info)
+videoPtrToDriverName(struct pci_device *dev)
{
/*
* things not handled yet:
@@ -164,7 +163,7 @@ videoPtrToDriverName(pciVideoPtr info)
* xgi
*/
- switch (info->vendor)
+ switch (dev->vendor_id)
{
case 0x1142: return "apm";
case 0xedd8: return "ark";
@@ -173,7 +172,7 @@ videoPtrToDriverName(pciVideoPtr info)
case 0x102c: return "chips";
case 0x1013: return "cirrus";
case 0x8086:
- if ((info->chipType == 0x00d1) || (info->chipType == 0x7800))
+ if ((dev->device_id == 0x00d1) || (dev->device_id == 0x7800))
return "i740";
else return "i810";
case 0x102b: return "mga";
@@ -182,7 +181,7 @@ videoPtrToDriverName(pciVideoPtr info)
case 0x10de: case 0x12d2: return "nv";
case 0x1163: return "rendition";
case 0x5333:
- switch (info->chipType)
+ switch (dev->device_id)
{
case 0x88d0: case 0x88d1: case 0x88f0: case 0x8811:
case 0x8812: case 0x8814: case 0x8901:
@@ -196,7 +195,7 @@ videoPtrToDriverName(pciVideoPtr info)
case 0x1039: return "sis";
case 0x126f: return "siliconmotion";
case 0x121a:
- if (info->chipType < 0x0003)
+ if (dev->device_id < 0x0003)
return "voodoo";
else
return "tdfx";
@@ -215,22 +214,23 @@ xf86AutoConfig(void)
{
const char **p;
char buf[1024];
- pciVideoPtr *pciptr, info = NULL;
- char *driver = NULL;
+ struct pci_device_iterator *iter;
+ struct pci_device * info = NULL;
+ const char *driver = NULL;
ConfigStatus ret;
/* Find the primary device, and get some information about it. */
- if (xf86PciVideoInfo) {
- for (pciptr = xf86PciVideoInfo; (info = *pciptr); pciptr++) {
- if (xf86IsPrimaryPci(info)) {
- break;
- }
- }
- if (!info) {
- ErrorF("Primary device is not PCI\n");
+ iter = pci_slot_match_iterator_create(NULL);
+ while ((info = pci_device_next(iter)) != NULL) {
+ if (xf86IsPrimaryPci(info)) {
+ break;
}
- } else {
- ErrorF("xf86PciVideoInfo is not set\n");
+ }
+
+ pci_iterator_destroy(iter);
+
+ if (!info) {
+ ErrorF("Primary device is not PCI\n");
}
if (info)
diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
index cd309a5a9..537ddf7a4 100644
--- a/hw/xfree86/common/xf86Bus.c
+++ b/hw/xfree86/common/xf86Bus.c
@@ -52,6 +52,7 @@
#include "xf86_OSproc.h"
#include "xf86RAC.h"
+#include "Pci.h"
/* Entity data */
EntityPtr *xf86Entities = NULL; /* Bus slots claimed by drivers */
@@ -253,9 +254,7 @@ xf86IsEntityPrimary(int entityIndex)
switch (pEnt->busType) {
case BUS_PCI:
- return (pEnt->pciBusId.bus == primaryBus.id.pci.bus &&
- pEnt->pciBusId.device == primaryBus.id.pci.device &&
- pEnt->pciBusId.func == primaryBus.id.pci.func);
+ return (pEnt->bus.id.pci == primaryBus.id.pci);
case BUS_ISA:
return TRUE;
case BUS_SBUS:
@@ -1361,7 +1360,9 @@ xf86AddRangesToList(resPtr list, resRange *pRange, int entityIndex)
void
xf86ResourceBrokerInit(void)
{
+#if 0
resPtr resPci;
+#endif
osRes = NULL;
@@ -1376,8 +1377,12 @@ xf86ResourceBrokerInit(void)
xf86PrintResList(3, osRes);
/* Bus dep initialization */
+#if 0
resPci = ResourceBrokerInitPci(&osRes);
Acc = xf86JoinResLists(xf86DupResList(osRes), resPci);
+#else
+ Acc = xf86DupResList( osRes );
+#endif
xf86MsgVerb(X_INFO, 3, "All system resource ranges:\n");
xf86PrintResList(3, Acc);
@@ -1765,7 +1770,7 @@ xf86GetResourcesImplicitly(int entityIndex)
case BUS_SBUS:
return NULL;
case BUS_PCI:
- return GetImplicitPciResources(entityIndex);
+ return NULL;
case BUS_last:
return NULL;
}
@@ -1856,31 +1861,34 @@ xf86RegisterResources(int entityIndex, resList list, unsigned long access)
}
static void
-busTypeSpecific(EntityPtr pEnt, xf86State state, xf86AccessPtr *acc_mem,
+busTypeSpecific(EntityPtr pEnt, xf86AccessPtr *acc_mem,
xf86AccessPtr *acc_io, xf86AccessPtr *acc_mem_io)
{
- pciAccPtr *ppaccp;
-
switch (pEnt->bus.type) {
case BUS_ISA:
case BUS_SBUS:
- *acc_mem = *acc_io = *acc_mem_io = &AccessNULL;
- break;
+ *acc_mem = *acc_io = *acc_mem_io = &AccessNULL;
break;
- case BUS_PCI:
- ppaccp = xf86PciAccInfo;
- while (*ppaccp) {
- if ((*ppaccp)->busnum == pEnt->pciBusId.bus
- && (*ppaccp)->devnum == pEnt->pciBusId.device
- && (*ppaccp)->funcnum == pEnt->pciBusId.func) {
- *acc_io = &(*ppaccp)->ioAccess;
- *acc_mem = &(*ppaccp)->memAccess;
- *acc_mem_io = &(*ppaccp)->io_memAccess;
- break;
- }
- ppaccp++;
+ case BUS_PCI: {
+ struct pci_device *const dev = pEnt->bus.id.pci;
+
+ if ((dev != NULL) && ((void *)dev->user_data != NULL)) {
+ pciAccPtr const paccp = (pciAccPtr) dev->user_data;
+
+ *acc_io = & paccp->ioAccess;
+ *acc_mem = & paccp->memAccess;
+ *acc_mem_io = & paccp->io_memAccess;
+ }
+ else {
+ /* FIXME: This is an error path. We should probably have an
+ * FIXME: assertion here or something.
+ */
+ *acc_io = NULL;
+ *acc_mem = NULL;
+ *acc_mem_io = NULL;
}
break;
+ }
default:
*acc_mem = *acc_io = *acc_mem_io = NULL;
break;
@@ -1896,7 +1904,7 @@ setAccess(EntityPtr pEnt, xf86State state)
xf86AccessPtr org_mem = NULL, org_io = NULL, org_mem_io = NULL;
int prop;
- busTypeSpecific(pEnt,state,&acc_mem,&acc_io,&acc_mem_io);
+ busTypeSpecific(pEnt, &acc_mem, &acc_io, &acc_mem_io);
/* The replacement function needs to handle _all_ shared resources */
/* unless they are handeled locally and disabled otherwise */
@@ -2449,15 +2457,6 @@ xf86PostProbe(void)
#endif
}
xf86FreeResList(acc);
-#if !(defined(__alpha__) && defined(linux)) && \
- !(defined(__ia64__) && defined(linux)) && \
- !(defined(__sparc64__) && defined(__OpenBSD__))
- /*
- * No need to validate on Alpha Linux or OpenBSD/sparc64,
- * trust the kernel.
- */
- ValidatePci();
-#endif
xf86MsgVerb(X_INFO, 3, "resource ranges after probing:\n");
xf86PrintResList(3, Acc);
@@ -2976,14 +2975,16 @@ xf86FindPrimaryDevice()
CheckGenericGA();
if (primaryBus.type != BUS_NONE) {
char *bus;
- char *loc = xnfcalloc(1,9);
- if (loc == NULL) return;
+ char loc[16];
switch (primaryBus.type) {
case BUS_PCI:
bus = "PCI";
- sprintf(loc," %2.2x:%2.2x:%1.1x",primaryBus.id.pci.bus,
- primaryBus.id.pci.device,primaryBus.id.pci.func);
+ snprintf(loc, sizeof(loc), " %2.2x@%2.2x:%2.2x:%1.1x",
+ primaryBus.id.pci->bus,
+ primaryBus.id.pci->domain,
+ primaryBus.id.pci->dev,
+ primaryBus.id.pci->func);
break;
case BUS_ISA:
bus = "ISA";
@@ -2991,17 +2992,15 @@ xf86FindPrimaryDevice()
break;
case BUS_SBUS:
bus = "SBUS";
- sprintf(loc," %2.2x",primaryBus.id.sbus.fbNum);
+ snprintf(loc, sizeof(loc), " %2.2x", primaryBus.id.sbus.fbNum);
break;
default:
bus = "";
loc[0] = '\0';
}
-
+
xf86MsgVerb(X_INFO, 2, "Primary Device is: %s%s\n",bus,loc);
- xfree(loc);
}
-
}
#if !defined(__sparc) && !defined(__sparc__) && !defined(__powerpc__) && !defined(__mips__) && !defined(__arm__)
diff --git a/hw/xfree86/common/xf86Bus.h b/hw/xfree86/common/xf86Bus.h
index 8d7195994..5ea5cc8e1 100644
--- a/hw/xfree86/common/xf86Bus.h
+++ b/hw/xfree86/common/xf86Bus.h
@@ -91,7 +91,6 @@ typedef struct {
#define NEED_SHARED (NEED_MEM_SHARED | NEED_IO_SHARED)
#define busType bus.type
-#define pciBusId bus.id.pci
#define isaBusId bus.id.isa
#define sbusBusId bus.id.sbus
@@ -114,7 +113,7 @@ typedef struct x_BusAccRec {
struct {
int bus;
int primary_bus;
- PCITAG acc;
+ struct pci_device * dev;
pciBridgesSave save;
} pci;
} busdep;
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 3c29497e3..71e008069 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -60,6 +60,7 @@
#include "configProcs.h"
#include "globals.h"
#include "extension.h"
+#include "Pci.h"
#ifdef XINPUT
#include "xf86Xinput.h"
@@ -114,6 +115,17 @@ extern DeviceAssocRec mouse_assoc;
static char *fontPath = NULL;
+static ModuleDefault ModuleDefaults[] = {
+ {.name = "extmod", .toLoad = TRUE, .load_opt=NULL},
+ {.name = "dbe", .toLoad = TRUE, .load_opt=NULL},
+ {.name = "glx", .toLoad = TRUE, .load_opt=NULL},
+ {.name = "freetype", .toLoad = TRUE, .load_opt=NULL},
+ {.name = "record", .toLoad = TRUE, .load_opt=NULL},
+ {.name = "dri", .toLoad = TRUE, .load_opt=NULL},
+ {.name = NULL, .toLoad = FALSE, .load_opt=NULL}
+};
+
+
/* Forward declarations */
static Bool configScreen(confScreenPtr screenp, XF86ConfScreenPtr conf_screen,
int scrnum, MessageType from);
@@ -2530,8 +2542,9 @@ xf86HandleConfigFile(Bool autoconfig)
xf86Msg(X_WARNING, "Bus types other than PCI not yet isolable.\n"
"\tIgnoring IsolateDevice option.\n");
} else if (sscanf(scanptr, "PCI:%d:%d:%d", &bus, &device, &func) == 3) {
- xf86IsolateDevice.bus = bus;
- xf86IsolateDevice.device = device;
+ xf86IsolateDevice.domain = PCI_DOM_FROM_BUS(bus);
+ xf86IsolateDevice.bus = PCI_BUS_NO_DOMAIN(bus);
+ xf86IsolateDevice.dev = device;
xf86IsolateDevice.func = func;
xf86Msg(X_INFO,
"Isolating PCI bus \"%d:%d:%d\"\n", bus, device, func);
diff --git a/hw/xfree86/common/xf86Config.h b/hw/xfree86/common/xf86Config.h
index 7fc161d49..b8b5fd42a 100644
--- a/hw/xfree86/common/xf86Config.h
+++ b/hw/xfree86/common/xf86Config.h
@@ -54,17 +54,6 @@ typedef struct _ModuleDefault {
XF86OptionPtr load_opt;
} ModuleDefault;
-static ModuleDefault ModuleDefaults[] = {
- {.name = "extmod", .toLoad = TRUE, .load_opt=NULL},
- {.name = "dbe", .toLoad = TRUE, .load_opt=NULL},
- {.name = "glx", .toLoad = TRUE, .load_opt=NULL},
- {.name = "freetype", .toLoad = TRUE, .load_opt=NULL},
- {.name = "type1", .toLoad = TRUE, .load_opt=NULL},
- {.name = "record", .toLoad = TRUE, .load_opt=NULL},
- {.name = "dri", .toLoad = TRUE, .load_opt=NULL},
- {.name = NULL, .toLoad = FALSE, .load_opt=NULL}
-};
-
/*
* prototypes
*/
diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c
index 19f040b03..4c980a291 100644
--- a/hw/xfree86/common/xf86Configure.c
+++ b/hw/xfree86/common/xf86Configure.c
@@ -35,13 +35,14 @@
#include <fcntl.h>
#include <X11/X.h>
#include <X11/Xmd.h>
+#include <pciaccess.h>
+#include "Pci.h"
#include "os.h"
#include "loaderProcs.h"
#include "xf86.h"
#include "xf86Config.h"
#include "xf86_OSlib.h"
#include "xf86Priv.h"
-#include "xf86PciData.h"
#define IN_XSERVER
#include "xf86Parser.h"
#include "xf86tokens.h"
@@ -56,7 +57,7 @@
typedef struct _DevToConfig {
GDevRec GDev;
- pciVideoPtr pVideo;
+ struct pci_device * pVideo;
#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
sbusDevicePtr sVideo;
#endif
@@ -101,7 +102,7 @@ GDevPtr
xf86AddBusDeviceToConfigure(const char *driver, BusType bus, void *busData, int chipset)
{
int i, j;
- pciVideoPtr pVideo = NULL;
+ struct pci_device * pVideo = NULL;
Bool isPrimary = FALSE;
if (xf86DoProbe || !xf86DoConfigure || !xf86DoConfigurePass1)
@@ -110,11 +111,12 @@ xf86AddBusDeviceToConfigure(const char *driver, BusType bus, void *busData, int
/* Check for duplicates */
switch (bus) {
case BUS_PCI:
- pVideo = (pciVideoPtr) busData;
+ pVideo = (struct pci_device *) busData;
for (i = 0; i < nDevToConfig; i++)
if (DevToConfig[i].pVideo &&
+ (DevToConfig[i].pVideo->domain == pVideo->domain) &&
(DevToConfig[i].pVideo->bus == pVideo->bus) &&
- (DevToConfig[i].pVideo->device == pVideo->device) &&
+ (DevToConfig[i].pVideo->dev == pVideo->dev) &&
(DevToConfig[i].pVideo->func == pVideo->func))
return NULL;
isPrimary = xf86IsPrimaryPci(pVideo);
@@ -173,9 +175,9 @@ xf86AddBusDeviceToConfigure(const char *driver, BusType bus, void *busData, int
char busnum[8];
NewDevice.pVideo = pVideo;
- xf86FindPciNamesByDevice(pVideo->vendor, pVideo->chipType,
- NOVENDOR, NOSUBSYS,
- &VendorName, &CardName, NULL, NULL);
+
+ VendorName = pci_device_get_vendor_name( pVideo );
+ CardName = pci_device_get_device_name( pVideo );
if (!VendorName) {
VendorName = xnfalloc(15);
@@ -197,13 +199,13 @@ xf86AddBusDeviceToConfigure(const char *driver, BusType bus, void *busData, int
NewDevice.GDev.busID = xnfalloc(16);
xf86FormatPciBusNumber(pVideo->bus, busnum);
sprintf(NewDevice.GDev.busID, "PCI:%s:%d:%d",
- busnum, pVideo->device, pVideo->func);
+ busnum, pVideo->dev, pVideo->func);
- NewDevice.GDev.chipID = pVideo->chipType;
- NewDevice.GDev.chipRev = pVideo->chipRev;
+ NewDevice.GDev.chipID = pVideo->device_id;
+ NewDevice.GDev.chipRev = pVideo->revision;
if (chipset < 0)
- chipset = (pVideo->vendor << 16) | pVideo->chipType;
+ chipset = (pVideo->vendor_id << 16) | pVideo->device_id;
}
break;
case BUS_ISA:
@@ -249,7 +251,8 @@ xf86AddBusDeviceToConfigure(const char *driver, BusType bus, void *busData, int
* Backwards compatibility
*/
_X_EXPORT GDevPtr
-xf86AddDeviceToConfigure(const char *driver, pciVideoPtr pVideo, int chipset)
+xf86AddDeviceToConfigure(const char *driver, struct pci_device * pVideo,
+ int chipset)
{
return xf86AddBusDeviceToConfigure(driver, pVideo ? BUS_PCI : BUS_ISA,
pVideo, chipset);
@@ -759,22 +762,20 @@ DoConfigure()
/* Call all of the probe functions, reporting the results. */
for (CurrentDriver = 0; CurrentDriver < xf86NumDrivers; CurrentDriver++) {
xorgHWFlags flags;
-
+ Bool found_screen;
+ DriverRec * const drv = xf86DriverList[CurrentDriver];
+
if (!xorgHWAccess) {
- if (!xf86DriverList[CurrentDriver]->driverFunc
- || !xf86DriverList[CurrentDriver]->driverFunc(NULL,
- GET_REQUIRED_HW_INTERFACES,
- &flags)
+ if (!drv->driverFunc
+ || !drv->driverFunc( NULL, GET_REQUIRED_HW_INTERFACES, &flags )
|| NEED_IO_ENABLED(flags))
continue;
}
- if (xf86DriverList[CurrentDriver]->Probe == NULL) continue;
-
- if ((*xf86DriverList[CurrentDriver]->Probe)(
- xf86DriverList[CurrentDriver], PROBE_DETECT) &&
- xf86DriverList[CurrentDriver]->Identify)
- (*xf86DriverList[CurrentDriver]->Identify)(0);
+ found_screen = xf86CallDriverProbe( drv, TRUE );
+ if ( found_screen && drv->Identify ) {
+ (*drv->Identify)(0);
+ }
}
if (nDevToConfig <= 0) {
@@ -860,7 +861,7 @@ DoConfigure()
oldNumScreens = xf86NumScreens;
- (*xf86DriverList[i]->Probe)(xf86DriverList[i], 0);
+ xf86CallDriverProbe( xf86DriverList[i], FALSE );
/* reorder */
k = screennum > 0 ? screennum : 1;
@@ -888,7 +889,6 @@ DoConfigure()
}
}
}
- xf86SetPciVideo(NULL,NONE);
}
xfree(driverProbed);
}
diff --git a/hw/xfree86/common/xf86DoProbe.c b/hw/xfree86/common/xf86DoProbe.c
index fc0a9f4eb..bba6ab7e8 100644
--- a/hw/xfree86/common/xf86DoProbe.c
+++ b/hw/xfree86/common/xf86DoProbe.c
@@ -92,9 +92,7 @@ DoProbe()
xf86MsgVerb(X_INFO, 3, "Probing in driver %s\n", drv->driverName);
- if (drv->Probe == NULL) continue;
-
- probeResult = (*drv->Probe)( drv, PROBE_DETECT );
+ probeResult = xf86CallDriverProbe( drv, TRUE );
if (!probeResult) {
xf86ErrorF("Probe in driver `%s' returns FALSE\n",
drv->driverName);
diff --git a/hw/xfree86/common/xf86DoScanPci.c b/hw/xfree86/common/xf86DoScanPci.c
index 0c6668a49..51892f041 100644
--- a/hw/xfree86/common/xf86DoScanPci.c
+++ b/hw/xfree86/common/xf86DoScanPci.c
@@ -38,20 +38,76 @@
#include <stdlib.h>
#include <X11/X.h>
#include <X11/Xmd.h>
+#include <pciaccess.h>
#include "os.h"
-#include "loaderProcs.h"
#include "xf86.h"
#include "xf86Priv.h"
#include "xf86Pci.h"
-#include "xf86ScanPci.h"
+#include "Pci.h"
+#include "xf86_OSproc.h"
+
+static void ScanPciDisplayPCICardInfo(void);
+
+void
+ScanPciDisplayPCICardInfo(void)
+{
+ struct pci_id_match match;
+ struct pci_device_iterator *iter;
+ const struct pci_device *dev;
+
+ xf86EnableIO();
+
+ if (! xf86scanpci()) {
+ xf86MsgVerb(X_NONE, 0, "No PCI info available\n");
+ return;
+ }
+ xf86MsgVerb(X_NONE, 0,
+ "Probing for PCI devices (Bus:Device:Function)\n\n");
+
+ iter = pci_id_match_iterator_create(NULL);
+ while ((dev = pci_device_next(iter)) != NULL) {
+ const char *svendorname = NULL, *subsysname = NULL;
+ const char *vendorname = NULL, *devicename = NULL;
+
+
+ xf86MsgVerb(X_NONE, 0, "(%d:%d:%d) ",
+ PCI_MAKE_BUS(dev->domain, dev->bus), dev->dev, dev->func);
+
+ /*
+ * Lookup as much as we can about the device.
+ */
+ match.vendor_id = dev->vendor_id;
+ match.device_id = dev->device_id;
+ match.subvendor_id = (dev->subvendor_id != 0)
+ ? dev->subvendor_id : PCI_MATCH_ANY;
+ match.subdevice_id = (dev->subdevice_id != 0)
+ ? dev->subdevice_id : PCI_MATCH_ANY;
+ match.device_class = 0;
+ match.device_class_mask = 0;
+
+ pci_get_strings(& match, & vendorname, & devicename,
+ & svendorname, & subsysname);
+
+ if ((dev->subvendor_id != 0) || (dev->subdevice_id != 0)) {
+ xf86MsgVerb(X_NONE, 0, "%s %s (0x%04x / 0x%04x) using ",
+ (svendorname == NULL) ? "unknown vendor" : svendorname,
+ (subsysname == NULL) ? "unknown card" : subsysname,
+ dev->subvendor_id, dev->subdevice_id);
+ }
+
+ xf86MsgVerb(X_NONE, 0, "%s %s (0x%04x / 0x%04x)\n",
+ (vendorname == NULL) ? "unknown vendor" : vendorname,
+ (devicename == NULL) ? "unknown chip" : devicename,
+ dev->vendor_id, dev->device_id);
+ }
+
+ pci_iterator_destroy(iter);
+}
void DoScanPci(int argc, char **argv, int i)
{
- int j,skip,globalVerbose,scanpciVerbose;
- ScanPciSetupProcPtr PciSetup;
- ScanPciDisplayCardInfoProcPtr DisplayPCICardInfo;
- int errmaj, errmin;
+ int j,skip,globalVerbose;
/*
* first we need to finish setup of the OS so that we can call other
@@ -81,32 +137,7 @@ void DoScanPci(int argc, char **argv, int i)
if (xf86Verbose > globalVerbose)
xf86SetVerbosity(globalVerbose);
- /*
- * Setting scanpciVerbose to 0 will ensure that the output will go to
- * stderr for all reasonable default stderr verbosity levels.
- */
- scanpciVerbose = 0;
-
- /*
- * now get the loader set up and load the scanpci module
- */
- /* Initialise the loader */
- LoaderInit();
- /* Tell the loader the default module search path */
- LoaderSetPath(xf86ModulePath);
-
- if (!LoadModule("scanpci", NULL, NULL, NULL, NULL, NULL,
- &errmaj, &errmin)) {
- LoaderErrorMsg(NULL, "scanpci", errmaj, errmin);
- exit(1);
- }
- PciSetup = (ScanPciSetupProcPtr)LoaderSymbol("ScanPciSetupPciIds");
- DisplayPCICardInfo =
- (ScanPciDisplayCardInfoProcPtr)LoaderSymbol("ScanPciDisplayPCICardInfo");
-
- if (!(*PciSetup)())
- FatalError("ScanPciSetupPciIds() failed\n");
- (*DisplayPCICardInfo)(scanpciVerbose);
+ ScanPciDisplayPCICardInfo();
/*
* That's it; we really should clean things up, but a simple
diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c
index b41fe6e5f..7dc45b75d 100644
--- a/hw/xfree86/common/xf86Globals.c
+++ b/hw/xfree86/common/xf86Globals.c
@@ -203,4 +203,7 @@ Bool xf86MiscModInDevAllowNonLocal = FALSE;
RootWinPropPtr *xf86RegisteredPropertiesTable = NULL;
_X_EXPORT Bool xf86inSuspend = FALSE;
Bool xorgHWAccess = FALSE;
-PciBusId xf86IsolateDevice;
+
+struct pci_slot_match xf86IsolateDevice = {
+ PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, 0
+};
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 4636af4e2..b6fc6b629 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -39,6 +39,9 @@
#include <xorg-config.h>
#endif
+#include <pciaccess.h>
+#include "Pci.h"
+
#include <X11/X.h>
#include "os.h"
#include "servermd.h"
@@ -1111,7 +1114,7 @@ xf86SetRootClip (ScreenPtr pScreen, Bool enable)
WindowPtr pChild;
Bool WasViewable = (Bool)(pWin->viewable);
Bool anyMarked = FALSE;
- RegionPtr pOldClip = NULL, bsExposed;
+ RegionPtr pOldClip = NULL;
#ifdef DO_SAVE_UNDERS
Bool dosave = FALSE;
#endif
@@ -1172,12 +1175,6 @@ xf86SetRootClip (ScreenPtr pScreen, Bool enable)
if (WasViewable)
{
- if (pWin->backStorage)
- {
- pOldClip = REGION_CREATE(pScreen, NullBox, 1);
- REGION_COPY(pScreen, pOldClip, &pWin->clipList);
- }
-
if (pWin->firstChild)
{
anyMarked |= (*pScreen->MarkOverlappedWindows)(pWin->firstChild,
@@ -1201,28 +1198,6 @@ xf86SetRootClip (ScreenPtr pScreen, Bool enable)
(*pScreen->ValidateTree)(pWin, NullWindow, VTOther);
}
- if (pWin->backStorage &&
- ((pWin->backingStore == Always) || WasViewable))
- {
- if (!WasViewable)
- pOldClip = &pWin->clipList; /* a convenient empty region */
- bsExposed = (*pScreen->TranslateBackingStore)
- (pWin, 0, 0, pOldClip,
- pWin->drawable.x, pWin->drawable.y);
- if (WasViewable)
- REGION_DESTROY(pScreen, pOldClip);
- if (bsExposed)
- {
- RegionPtr valExposed = NullRegion;
-
- if (pWin->valdata)
- valExposed = &pWin->valdata->after.exposed;
- (*pScreen->WindowExposures) (pWin, valExposed, bsExposed);
- if (valExposed)
- REGION_EMPTY(pScreen, valExposed);
- REGION_DESTROY(pScreen, bsExposed);
- }
- }
if (WasViewable)
{
if (anyMarked)
@@ -1595,7 +1570,7 @@ xf86MatchDevice(const char *drivername, GDevPtr **sectlist)
}
struct Inst {
- pciVideoPtr pci;
+ struct pci_device * pci;
GDevPtr dev;
Bool foundHW; /* PCIid in list of supported chipsets */
Bool claimed; /* BusID matches with a device section */
@@ -1643,7 +1618,8 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
int **foundEntities)
{
int i,j;
- pciVideoPtr pPci, *ppPci;
+ struct pci_device * pPci;
+ struct pci_device_iterator *iter;
struct Inst *instances = NULL;
int numClaimedInstances = 0;
int allocatedInstances = 0;
@@ -1654,8 +1630,6 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
*foundEntities = NULL;
- if (!xf86PciVideoInfo)
- return 0;
/* Each PCI device will contribute at least one entry. Each device
* section can contribute at most one entry. The sum of the two is
@@ -1665,21 +1639,22 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
*/
if ( !xf86DoProbe && !(xf86DoConfigure && xf86DoConfigurePass1) ) {
unsigned max_entries = numDevs;
- for (ppPci = xf86PciVideoInfo ; *ppPci != NULL ; ppPci++) {
+
+ iter = pci_slot_match_iterator_create(NULL);
+ while ((pPci = pci_device_next(iter)) != NULL) {
max_entries++;
}
- instances = xnfalloc( max_entries * sizeof(struct Inst) );
+ pci_iterator_destroy(iter);
+ instances = xnfalloc(max_entries * sizeof(struct Inst));
}
- for (ppPci = xf86PciVideoInfo; *ppPci != NULL; ppPci++) {
- unsigned device_class = ((*ppPci)->class << 16)
- | ((*ppPci)->subclass << 8) | ((*ppPci)->interface);
+ iter = pci_slot_match_iterator_create(NULL);
+ while ((pPci = pci_device_next(iter)) != NULL) {
+ unsigned device_class = pPci->device_class;
Bool foundVendor = FALSE;
- pPci = *ppPci;
-
/* Convert the pre-PCI 2.0 device class for a VGA adapter to the
* 2.0 version of the same class.
*/
@@ -1704,19 +1679,21 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
const unsigned device_id = (id->PCIid & 0x0000FFFF);
const unsigned match_class = 0x00030000 | id->PCIid;
- if ( (vendor_id == pPci->vendor)
- || ((vendorID == PCI_VENDOR_GENERIC) && (match_class == device_class)) ) {
- if ( !foundVendor && (instances != NULL) ) {
+ if ((vendor_id == pPci->vendor_id)
+ || ((vendorID == PCI_VENDOR_GENERIC) && (match_class == device_class))) {
+ if (!foundVendor && (instances != NULL)) {
++allocatedInstances;
- instances[allocatedInstances - 1].pci = *ppPci;
+ instances[allocatedInstances - 1].pci = pPci;
instances[allocatedInstances - 1].dev = NULL;
instances[allocatedInstances - 1].claimed = FALSE;
instances[allocatedInstances - 1].foundHW = FALSE;
instances[allocatedInstances - 1].screen = 0;
- foundVendor = TRUE;
}
- if ( (device_id == pPci->chipType)
- || ((vendorID == PCI_VENDOR_GENERIC)
+
+ foundVendor = TRUE;
+
+ if ( (device_id == pPci->device_id)
+ || ((vendorID == PCI_VENDOR_GENERIC)
&& (match_class == device_class)) ) {
if ( instances != NULL ) {
instances[allocatedInstances - 1].foundHW = TRUE;
@@ -1725,11 +1702,10 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
if ( xf86DoConfigure && xf86DoConfigurePass1 ) {
- if ( xf86CheckPciSlot(pPci->bus, pPci->device,
- pPci->func) ) {
- GDevPtr pGDev =
- xf86AddDeviceToConfigure( drvp->driverName,
- pPci, -1 );
+ if (xf86CheckPciSlot(pPci)) {
+ GDevPtr pGDev =
+ xf86AddDeviceToConfigure(drvp->driverName,
+ pPci, -1);
if (pGDev) {
/* After configure pass 1, chipID and chipRev
* are treated as over-rides, so clobber them
@@ -1752,6 +1728,8 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
}
}
+ pci_iterator_destroy(iter);
+
/* In "probe only" or "configure" mode (signaled by instances being NULL),
* our work is done. Return the number of detected devices.
@@ -1789,8 +1767,9 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
&& *devList[j]->busID) {
for (i = 0; i < allocatedInstances; i++) {
pPci = instances[i].pci;
- if (xf86ComparePciBusString(devList[j]->busID, pPci->bus,
- pPci->device,
+ if (xf86ComparePciBusString(devList[j]->busID,
+ PCI_MAKE_BUS( pPci->domain, pPci->bus ),
+ pPci->dev,
pPci->func)) {
allocatedInstances++;
instances[allocatedInstances - 1] = instances[i];
@@ -1810,9 +1789,10 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
pPci = instances[i].pci;
for (j = 0; j < numDevs; j++) {
if (devList[j]->busID && *devList[j]->busID) {
- if (xf86ComparePciBusString(devList[j]->busID, pPci->bus,
- pPci->device,
- pPci->func) &&
+ if (xf86ComparePciBusString(devList[j]->busID,
+ PCI_MAKE_BUS( pPci->domain, pPci->bus ),
+ pPci->dev,
+ pPci->func) &&
devList[j]->screen == instances[i].screen) {
if (devBus)
@@ -1843,10 +1823,11 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
}
if (devBus) dev = devBus; /* busID preferred */
if (!dev) {
- if (xf86CheckPciSlot(pPci->bus, pPci->device, pPci->func)) {
+ if ( xf86CheckPciSlot( pPci ) ) {
xf86MsgVerb(X_WARNING, 0, "%s: No matching Device section "
- "for instance (BusID PCI:%i:%i:%i) found\n",
- driverName, pPci->bus, pPci->device, pPci->func);
+ "for instance (BusID PCI:%u@%u:%u:%u) found\n",
+ driverName, pPci->domain, pPci->bus, pPci->dev,
+ pPci->func);
}
} else {
numClaimedInstances++;
@@ -1957,31 +1938,27 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
* XXX Need to make sure that two different drivers don't claim
* the same screen > 0 instance.
*/
- if (instances[i].screen == 0 &&
- !xf86CheckPciSlot(pPci->bus, pPci->device, pPci->func))
+ if (instances[i].screen == 0 && !xf86CheckPciSlot( pPci ))
continue;
#ifdef DEBUG
ErrorF("%s: card at %d:%d:%d is claimed by a Device section\n",
- driverName, pPci->bus, pPci->device, pPci->func);
+ driverName, pPci->bus, pPci->dev, pPci->func);
#endif
/* Allocate an entry in the lists to be returned */
numFound++;
retEntities = xnfrealloc(retEntities, numFound * sizeof(int));
- retEntities[numFound - 1]
- = xf86ClaimPciSlot(pPci->bus, pPci->device,
- pPci->func,drvp, instances[i].chip,
- instances[i].dev,instances[i].dev->active ?
- TRUE : FALSE);
+ retEntities[numFound - 1] = xf86ClaimPciSlot( pPci, drvp,
+ instances[i].chip,
+ instances[i].dev,
+ instances[i].dev->active);
if (retEntities[numFound - 1] == -1 && instances[i].screen > 0) {
for (j = 0; j < xf86NumEntities; j++) {
EntityPtr pEnt = xf86Entities[j];
- if (pEnt->busType != BUS_PCI)
+ if (pEnt->bus.type != BUS_PCI)
continue;
- if (pEnt->pciBusId.bus == pPci->bus &&
- pEnt->pciBusId.device == pPci->device &&
- pEnt->pciBusId.func == pPci->func) {
+ if (pEnt->bus.id.pci == pPci) {
retEntities[numFound - 1] = j;
xf86AddDevToEntity(j, instances[i].dev);
break;
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 27bc9ad0f..90f744c64 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -92,6 +92,9 @@
#include "dpmsproc.h"
#endif
+#include <pciaccess.h>
+#include "Pci.h"
+#include "xf86Bus.h"
/* forward declarations */
@@ -101,15 +104,14 @@ static void xf86PrintDefaultModulePath(void);
static void xf86PrintDefaultLibraryPath(void);
static void xf86RunVtInit(void);
+static Bool probe_devices_from_device_sections(DriverPtr drvp);
+static Bool add_matching_devices_to_configure_list(DriverPtr drvp);
+static Bool check_for_matching_devices(DriverPtr drvp);
+
#ifdef XF86PM
void (*xf86OSPMClose)(void) = NULL;
#endif
-static char *baseModules[] = {
- "pcidata",
- NULL
-};
-
/* Common pixmap formats */
static PixmapFormatRec formats[MAXFORMATS] = {
@@ -243,6 +245,233 @@ PostConfigInit(void)
OsInitColors();
}
+
+#define END_OF_MATCHES(m) \
+ (((m).vendor_id == 0) && ((m).device_id == 0) && ((m).subvendor_id == 0))
+
+Bool
+probe_devices_from_device_sections(DriverPtr drvp)
+{
+ int i, j;
+ struct pci_device * pPci;
+ Bool foundScreen = FALSE;
+ const struct pci_id_match * const devices = drvp->supported_devices;
+ GDevPtr *devList;
+ const unsigned numDevs = xf86MatchDevice(drvp->driverName, & devList);
+
+
+ for ( i = 0 ; i < numDevs ; i++ ) {
+ struct pci_device_iterator *iter;
+ unsigned device_id;
+
+
+ /* Find the pciVideoRec associated with this device section.
+ */
+ iter = pci_id_match_iterator_create(NULL);
+ while ((pPci = pci_device_next(iter)) != NULL) {
+ if (devList[i]->busID && *devList[i]->busID) {
+ if (xf86ComparePciBusString(devList[i]->busID,
+ ((pPci->domain << 8)
+ | pPci->bus),
+ pPci->dev,
+ pPci->func)) {
+ break;
+ }
+ }
+ else if (xf86IsPrimaryPci(pPci)) {
+ break;
+ }
+ }
+
+ pci_iterator_destroy(iter);
+
+ if (pPci == NULL) {
+ continue;
+ }
+
+ device_id = (devList[i]->chipID > 0)
+ ? devList[i]->chipID : pPci->device_id;
+
+
+ /* Once the pciVideoRec is found, determine if the device is supported
+ * by the driver. If it is, probe it!
+ */
+ for ( j = 0 ; ! END_OF_MATCHES( devices[j] ) ; j++ ) {
+ if ( PCI_ID_COMPARE( devices[j].vendor_id, pPci->vendor_id )
+ && PCI_ID_COMPARE( devices[j].device_id, device_id )
+ && ((devices[j].device_class_mask & pPci->device_class)
+ == devices[j].device_class) ) {
+ int entry;
+
+ /* Allow the same entity to be used more than once for
+ * devices with multiple screens per entity. This assumes
+ * implicitly that there will be a screen == 0 instance.
+ *
+ * FIXME Need to make sure that two different drivers don't
+ * FIXME claim the same screen > 0 instance.
+ */
+ if ( (devList[i]->screen == 0) && !xf86CheckPciSlot( pPci ) )
+ continue;
+
+#ifdef DEBUG
+ ErrorF("%s: card at %d:%d:%d is claimed by a Device section\n",
+ drvp->driverName, pPci->bus, pPci->dev, pPci->func);
+#endif
+
+ /* Allocate an entry in the lists to be returned */
+ entry = xf86ClaimPciSlot(pPci, drvp, device_id,
+ devList[i], devList[i]->active);
+
+ if ((entry == -1) && (devList[i]->screen > 0)) {
+ unsigned k;
+
+ for ( k = 0; k < xf86NumEntities; k++ ) {
+ EntityPtr pEnt = xf86Entities[k];
+ if (pEnt->busType != BUS_PCI)
+ continue;
+
+ if (pEnt->bus.id.pci == pPci) {
+ entry = k;
+ xf86AddDevToEntity(k, devList[i]);
+ break;
+ }
+ }
+ }
+
+ if (entry != -1) {
+ if ((*drvp->PciProbe)(drvp, entry, pPci,
+ devices[j].match_data)) {
+ foundScreen = TRUE;
+ }
+ }
+
+ break;
+ }
+ }
+ }
+
+
+ return foundScreen;
+}
+
+
+Bool
+add_matching_devices_to_configure_list(DriverPtr drvp)
+{
+ const struct pci_id_match * const devices = drvp->supported_devices;
+ int j;
+ struct pci_device *pPci;
+ struct pci_device_iterator *iter;
+ int numFound = 0;
+
+
+ iter = pci_id_match_iterator_create(NULL);
+ while ((pPci = pci_device_next(iter)) != NULL) {
+ /* Determine if this device is supported by the driver. If it is,
+ * add it to the list of devices to configure.
+ */
+ for (j = 0 ; ! END_OF_MATCHES(devices[j]) ; j++) {
+ if ( PCI_ID_COMPARE( devices[j].vendor_id, pPci->vendor_id )
+ && PCI_ID_COMPARE( devices[j].device_id, pPci->device_id )
+ && ((devices[j].device_class_mask & pPci->device_class)
+ == devices[j].device_class) ) {
+ if (xf86CheckPciSlot(pPci)) {
+ GDevPtr pGDev =
+ xf86AddDeviceToConfigure(drvp->driverName, pPci, -1);
+ if (pGDev != NULL) {
+ /* After configure pass 1, chipID and chipRev are
+ * treated as over-rides, so clobber them here.
+ */
+ pGDev->chipID = -1;
+ pGDev->chipRev = -1;
+ }
+
+ numFound++;
+ }
+
+ break;
+ }
+ }
+ }
+
+ pci_iterator_destroy(iter);
+
+
+ return (numFound != 0);
+}
+
+
+Bool
+check_for_matching_devices(DriverPtr drvp)
+{
+ const struct pci_id_match * const devices = drvp->supported_devices;
+ int j;
+
+
+ for (j = 0; ! END_OF_MATCHES(devices[j]); j++) {
+ struct pci_device_iterator *iter;
+ struct pci_device *dev;
+
+ iter = pci_id_match_iterator_create(& devices[j]);
+ dev = pci_device_next(iter);
+ pci_iterator_destroy(iter);
+
+ if (dev != NULL) {
+ return TRUE;
+ }
+ }
+
+
+ return FALSE;
+}
+
+
+/**
+ * Call the driver's correct probe function.
+ *
+ * If the driver implements the \c DriverRec::PciProbe entry-point and an
+ * appropriate PCI device (with matching Device section in the xorg.conf file)
+ * is found, it is called. If \c DriverRec::PciProbe or no devices can be
+ * successfully probed with it (e.g., only non-PCI devices are available),
+ * the driver's \c DriverRec::Probe function is called.
+ *
+ * \param drv Driver to probe
+ *
+ * \return
+ * If a device can be successfully probed by the driver, \c TRUE is
+ * returned. Otherwise, \c FALSE is returned.
+ */
+Bool
+xf86CallDriverProbe( DriverPtr drv, Bool detect_only )
+{
+ Bool foundScreen = FALSE;
+
+ if ( drv->PciProbe != NULL ) {
+ if ( xf86DoProbe ) {
+ assert( detect_only );
+ foundScreen = check_for_matching_devices( drv );
+ }
+ else if ( xf86DoConfigure && xf86DoConfigurePass1 ) {
+ assert( detect_only );
+ foundScreen = add_matching_devices_to_configure_list( drv );
+ }
+ else {
+ assert( ! detect_only );
+ foundScreen = probe_devices_from_device_sections( drv );
+ }
+ }
+
+ if ( ! foundScreen && (drv->Probe != NULL) ) {
+ xf86Msg( X_WARNING, "Falling back to old probe method for %s\n",
+ drv->driverName );
+ foundScreen = (*drv->Probe)( drv, (detect_only) ? PROBE_DETECT
+ : PROBE_DEFAULT );
+ }
+
+ return foundScreen;
+}
+
+
void
InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
{
@@ -313,10 +542,6 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
LoaderSetOptions(LDR_OPT_ABI_MISMATCH_NONFATAL);
}
- /* Force load mandatory base modules */
- if (!xf86LoadModules(baseModules, NULL))
- FatalError("Unable to load required base modules, Exiting...\n");
-
xf86OpenConsole();
/* Do a general bus probe. This will be a PCI probe for x86 platforms */
@@ -433,16 +658,8 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
|| NEED_IO_ENABLED(flags))
continue;
}
-
- if (xf86DriverList[i]->Probe != NULL)
- xf86DriverList[i]->Probe(xf86DriverList[i], PROBE_DEFAULT);
- else {
- xf86MsgVerb(X_WARNING, 0,
- "Driver `%s' has no Probe function (ignoring)\n",
- xf86DriverList[i]->driverName
- ? xf86DriverList[i]->driverName : "noname");
- }
- xf86SetPciVideo(NULL,NONE);
+
+ xf86CallDriverProbe( xf86DriverList[i], FALSE );
}
/*
@@ -1501,8 +1718,9 @@ ddxProcessArgument(int argc, char **argv, int i)
FatalError("Bus types other than PCI not yet isolable\n");
}
if (sscanf(argv[i], "PCI:%d:%d:%d", &bus, &device, &func) == 3) {
- xf86IsolateDevice.bus = bus;
- xf86IsolateDevice.device = device;
+ xf86IsolateDevice.domain = PCI_DOM_FROM_BUS(bus);
+ xf86IsolateDevice.bus = PCI_BUS_NO_DOMAIN(bus);
+ xf86IsolateDevice.dev = device;
xf86IsolateDevice.func = func;
return 2;
} else {
diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index 20d8b4413..852e51f43 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -83,7 +83,7 @@ typedef enum {
* mask is 0xFFFF0000.
*/
#define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 3)
-#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(2, 0)
+#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(3, 0)
#define ABI_XINPUT_VERSION SET_ABI_VERSION(2, 0)
#define ABI_EXTENSION_VERSION SET_ABI_VERSION(0, 3)
#define ABI_FONT_VERSION SET_ABI_VERSION(0, 5)
diff --git a/hw/xfree86/common/xf86Priv.h b/hw/xfree86/common/xf86Priv.h
index b6fbd3a41..3da102f5d 100644
--- a/hw/xfree86/common/xf86Priv.h
+++ b/hw/xfree86/common/xf86Priv.h
@@ -36,6 +36,8 @@
#ifndef _XF86PRIV_H
#define _XF86PRIV_H
+#include <pciaccess.h>
+
#include "xf86Privstr.h"
#include "propertyst.h"
@@ -76,7 +78,7 @@ extern Bool xf86BestRefresh;
extern Gamma xf86Gamma;
extern char *xf86ServerName;
extern Bool xf86ShowUnresolved;
-extern PciBusId xf86IsolateDevice;
+extern struct pci_slot_match xf86IsolateDevice;
/* Other parameters */
@@ -101,7 +103,6 @@ extern int xf86NumDrivers;
extern Bool xf86Resetting;
extern Bool xf86Initialising;
extern int xf86NumScreens;
-extern pciVideoPtr *xf86PciVideoInfo;
extern xf86CurrentAccessRec xf86CurrentAccess;
extern const char *xf86VisualNames[];
extern int xf86Verbose; /* verbosity level */
@@ -148,9 +149,6 @@ void xf86ClearEntityListForScreen(int scrnIndex);
void xf86AddDevToEntity(int entityIndex, GDevPtr dev);
extern void xf86PostPreInit(void);
extern void xf86PostScreenInit(void);
-extern memType getValidBIOSBase(PCITAG tag, int num);
-extern memType getEmptyPciRange(PCITAG tag, int base_reg);
-extern int pciTestMultiDeviceCard(int bus, int dev, int func, PCITAG** pTag);
/* xf86Config.c */
@@ -187,6 +185,7 @@ void xf86CloseLog(void);
Bool xf86LoadModules(char **list, pointer *optlist);
int xf86SetVerbosity(int verb);
int xf86SetLogVerbosity(int verb);
+Bool xf86CallDriverProbe( struct _DriverRec * drv, Bool detect_only );
/* xf86Lock.c */
diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c
index 096b78997..13e13e980 100644
--- a/hw/xfree86/common/xf86pciBus.c
+++ b/hw/xfree86/common/xf86pciBus.c
@@ -36,6 +36,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <X11/X.h>
+#include <pciaccess.h>
#include "os.h"
#include "Pci.h"
#include "xf86.h"
@@ -43,8 +44,6 @@
#include "xf86Resources.h"
/* Bus-specific headers */
-#include "xf86PciData.h"
-
#include "xf86Bus.h"
#define XF86_OS_PRIVS
@@ -55,96 +54,48 @@
/* Bus-specific globals */
Bool pciSlotClaimed = FALSE;
-pciConfigPtr *xf86PciInfo = NULL; /* Full PCI probe info */
-pciVideoPtr *xf86PciVideoInfo = NULL; /* PCI probe for video hw */
-pciAccPtr * xf86PciAccInfo = NULL; /* PCI access related */
-
-/* pcidata globals */
-ScanPciSetupProcPtr xf86SetupPciIds = NULL;
-ScanPciCloseProcPtr xf86ClosePciIds = NULL;
-ScanPciFindByDeviceProcPtr xf86FindPciNamesByDevice = NULL;
-ScanPciFindBySubsysProcPtr xf86FindPciNamesBySubsys = NULL;
-
-static resPtr pciAvoidRes = NULL;
+static struct pci_device ** xf86PciVideoInfo = NULL; /* PCI probe for video hw */
-/* PCI buses */
-static PciBusPtr xf86PciBus = NULL;
-/* Bus-specific probe/sorting functions */
/* PCI classes that get included in xf86PciVideoInfo */
-#define PCIINFOCLASSES(b,s) \
- (((b) == PCI_CLASS_PREHISTORIC) || \
- ((b) == PCI_CLASS_DISPLAY) || \
- ((b) == PCI_CLASS_MULTIMEDIA && (s) == PCI_SUBCLASS_MULTIMEDIA_VIDEO) || \
- ((b) == PCI_CLASS_PROCESSOR && (s) == PCI_SUBCLASS_PROCESSOR_COPROC))
+#define PCIINFOCLASSES(c) \
+ ( (((c) & 0x00ff0000) == (PCI_CLASS_PREHISTORIC << 16)) \
+ || (((c) & 0x00ff0000) == (PCI_CLASS_DISPLAY << 16)) \
+ || ((((c) & 0x00ffff00) \
+ == ((PCI_CLASS_MULTIMEDIA << 16) | (PCI_SUBCLASS_MULTIMEDIA_VIDEO << 8)))) \
+ || ((((c) & 0x00ffff00) \
+ == ((PCI_CLASS_PROCESSOR << 16) | (PCI_SUBCLASS_PROCESSOR_COPROC << 8)))) )
/*
* PCI classes that have messages printed always. The others are only
* have a message printed when the vendor/dev IDs are recognised.
*/
-#define PCIALWAYSPRINTCLASSES(b,s) \
- (((b) == PCI_CLASS_PREHISTORIC && (s) == PCI_SUBCLASS_PREHISTORIC_VGA) || \
- ((b) == PCI_CLASS_DISPLAY) || \
- ((b) == PCI_CLASS_MULTIMEDIA && (s) == PCI_SUBCLASS_MULTIMEDIA_VIDEO))
-
+#define PCIALWAYSPRINTCLASSES(c) \
+ ( (((c) & 0x00ffff00) \
+ == ((PCI_CLASS_PREHISTORIC << 16) | (PCI_SUBCLASS_PREHISTORIC_VGA << 8))) \
+ || (((c) & 0x00ff0000) == (PCI_CLASS_DISPLAY << 16)) \
+ || ((((c) & 0x00ffff00) \
+ == ((PCI_CLASS_MULTIMEDIA << 16) | (PCI_SUBCLASS_MULTIMEDIA_VIDEO << 8)))) )
+
+#define IS_VGA(c) \
+ (((c) & 0x00ffff00) \
+ == ((PCI_CLASS_DISPLAY << 16) | (PCI_SUBCLASS_DISPLAY_VGA << 8)))
+
/*
* PCI classes for which potentially destructive checking of the map sizes
* may be done. Any classes where this may be unsafe should be omitted
* from this list.
*/
-#define PCINONSYSTEMCLASSES(b,s) PCIALWAYSPRINTCLASSES(b,s)
+#define PCINONSYSTEMCLASSES(c) PCIALWAYSPRINTCLASSES(c)
/*
* PCI classes that use RAC
*/
-#define PCISHAREDIOCLASSES(b,s) \
- (((b) == PCI_CLASS_PREHISTORIC && (s) == PCI_SUBCLASS_PREHISTORIC_VGA) || \
- ((b) == PCI_CLASS_DISPLAY && (s) == PCI_SUBCLASS_DISPLAY_VGA))
-
-#define PCI_MEM32_LENGTH_MAX 0xFFFFFFFF
-
-#define B2M(tag,base) pciBusAddrToHostAddr(tag,PCI_MEM,base)
-#define B2I(tag,base) pciBusAddrToHostAddr(tag,PCI_IO,base)
-#define B2H(tag,base,type) (((type & ResPhysMask) == ResMem) ? \
- B2M(tag, base) : B2I(tag, base))
-#define M2B(tag,base) pciHostAddrToBusAddr(tag,PCI_MEM,base)
-#define I2B(tag,base) pciHostAddrToBusAddr(tag,PCI_IO,base)
-#define H2B(tag,base,type) (((type & ResPhysMask) == ResMem) ? \
- M2B(tag, base) : I2B(tag, base))
-#define TAG(pvp) (pciTag(pvp->bus,pvp->device,pvp->func))
-#define SIZE(size) ((1 << size) - 1)
-#define PCI_SIZE(type,tag,size) (((type & ResPhysMask) == ResMem) \
- ? pciBusAddrToHostAddr(tag,PCI_MEM_SIZE,size) \
- : pciBusAddrToHostAddr(tag,PCI_IO_SIZE,size))
-#define PCI_M_RANGE(range,tag,begin,end,type) \
- { \
- RANGE(range, B2M(tag, begin), B2M(tag, end), \
- RANGE_TYPE(type, xf86GetPciDomain(tag))); \
- }
-#define PCI_I_RANGE(range,tag,begin,end,type) \
- { \
- RANGE(range, B2I(tag, begin), B2I(tag, end), \
- RANGE_TYPE(type, xf86GetPciDomain(tag))); \
- }
-#define PCI_X_RANGE(range,tag,begin,end,type) \
-{ if ((type & ResPhysMask) == ResMem) PCI_M_RANGE(range,tag,begin,end,type); \
- else PCI_I_RANGE(range,tag,begin,end,type); }
-#define P_M_RANGE(range,tag,begin,size,type) \
- PCI_M_RANGE(range,tag,begin,(begin + SIZE(size)),type)
-#define P_I_RANGE(range,tag,begin,size,type) \
- PCI_I_RANGE(range,tag,begin,(begin + SIZE(size)),type)
-#define P_X_RANGE(range,tag,begin,size,type) \
-{ if ((type & ResPhysMask) == ResMem) P_M_RANGE(range,tag,begin,size,type); \
- else P_I_RANGE(range,tag,begin,size,type); }
-#define PV_M_RANGE(range,pvp,i,type) \
- P_M_RANGE(range,TAG(pvp),pvp->memBase[i],pvp->size[i],type)
-#define PV_B_RANGE(range,pvp,type) \
- P_M_RANGE(range,TAG(pvp),pvp->biosBase,pvp->biosSize,type)
-#define PV_I_RANGE(range,pvp,i,type) \
- P_I_RANGE(range,TAG(pvp),pvp->ioBase[i],pvp->size[i],type)
-
-static void pciConvertListToHost(int bus, int dev, int func, resPtr list);
-static PciBusPtr xf86GetPciBridgeInfo(void);
+#define PCISHAREDIOCLASSES(c) \
+ ( (((c) & 0x00ffff00) \
+ == ((PCI_CLASS_PREHISTORIC << 16) | (PCI_SUBCLASS_PREHISTORIC_VGA << 8))) \
+ || IS_VGA(c) )
+
_X_EXPORT void
xf86FormatPciBusNumber(int busnum, char *buffer)
@@ -156,212 +107,49 @@ xf86FormatPciBusNumber(int busnum, char *buffer)
sprintf(buffer, "%d@%d", busnum & 0x00ff, busnum >> 8);
}
-static Bool
-IsBaseUnassigned(CARD32 base)
-{
- CARD32 mask;
-
- if (base & PCI_MAP_IO)
- mask = ~PCI_MAP_IO_ATTR_MASK;
- else
- mask = ~PCI_MAP_MEMORY_ATTR_MASK;
-
- base &= mask;
- return (!base || (base == mask));
-}
-
-static Bool
-IsBaseUnassigned64(CARD32 base0, CARD32 base1)
-{
- base0 &= ~PCI_MAP_MEMORY_ATTR_MASK;
- base1 &= 0xffffffff;
-
- return ((!base0 && !base1)
- || ((base0 == ~PCI_MAP_MEMORY_ATTR_MASK)
- && (base1 == 0xffffffff)));
-}
-
static void
FindPCIVideoInfo(void)
{
- pciConfigPtr pcrp, *pcrpp;
- int i = 0, j, k;
+ int i = 0, k;
int num = 0;
- pciVideoPtr info;
- int DoIsolateDeviceCheck = 0;
+ struct pci_device *info;
+ struct pci_device_iterator *iter;
- if (xf86IsolateDevice.bus || xf86IsolateDevice.device || xf86IsolateDevice.func)
- DoIsolateDeviceCheck = 1;
- pcrpp = xf86PciInfo = xf86scanpci(0);
-
- if (pcrpp == NULL) {
+ if (!xf86scanpci()) {
xf86PciVideoInfo = NULL;
return;
}
- xf86PciBus = xf86GetPciBridgeInfo();
- while ((pcrp = pcrpp[i])) {
- const int baseclass = pcrp->pci_base_class;
- const int subclass = pcrp->pci_sub_class;
-
- if ( PCIINFOCLASSES(baseclass, subclass) &&
- (!DoIsolateDeviceCheck ||
- (xf86IsolateDevice.bus == pcrp->busnum &&
- xf86IsolateDevice.device == pcrp->devnum &&
- xf86IsolateDevice.func == pcrp->funcnum)) ) {
+ iter = pci_slot_match_iterator_create(& xf86IsolateDevice);
+ while ((info = pci_device_next(iter)) != NULL) {
+ if (PCIINFOCLASSES(info->device_class)) {
num++;
xf86PciVideoInfo = xnfrealloc(xf86PciVideoInfo,
- sizeof(pciVideoPtr) * (num + 1));
+ (sizeof(struct pci_device *)
+ * (num + 1)));
xf86PciVideoInfo[num] = NULL;
- info = xf86PciVideoInfo[num - 1] = xnfalloc(sizeof(pciVideoRec));
- info->validSize = FALSE;
- info->vendor = pcrp->pci_vendor;
- info->chipType = pcrp->pci_device;
- info->chipRev = pcrp->pci_rev_id;
- info->subsysVendor = pcrp->pci_subsys_vendor;
- info->subsysCard = pcrp->pci_subsys_card;
- info->bus = pcrp->busnum;
- info->device = pcrp->devnum;
- info->func = pcrp->funcnum;
- info->class = baseclass;
- info->subclass = pcrp->pci_sub_class;
- info->interface = pcrp->pci_prog_if;
- info->biosBase = PCIGETROM(pcrp->pci_baserom);
- info->biosSize = pciGetBaseSize(pcrp->tag, 6, TRUE, NULL);
- info->thisCard = pcrp;
- info->validate = FALSE;
-#ifdef INCLUDE_XF86_NO_DOMAIN
- if ((PCISHAREDIOCLASSES(baseclass, subclass))
- && (pcrp->pci_command & PCI_CMD_IO_ENABLE) &&
- (pcrp->pci_prog_if == 0)) {
-
- /*
- * Attempt to ensure that VGA is actually routed to this
- * adapter on entry. This needs to be fixed when we finally
- * grok host bridges (and multiple bus trees).
- */
- j = info->bus;
- while (TRUE) {
- PciBusPtr pBus = xf86PciBus;
- while (pBus && j != pBus->secondary)
- pBus = pBus->next;
- if (!pBus || !(pBus->brcontrol & PCI_PCI_BRIDGE_VGA_EN))
- break;
- if (j == pBus->primary) {
- if (primaryBus.type == BUS_NONE) {
- /* assumption: primary adapter is always VGA */
- primaryBus.type = BUS_PCI;
- primaryBus.id.pci.bus = pcrp->busnum;
- primaryBus.id.pci.device = pcrp->devnum;
- primaryBus.id.pci.func = pcrp->funcnum;
- } else if (primaryBus.type < BUS_last) {
- xf86Msg(X_NOTICE,
- "More than one primary device found\n");
- primaryBus.type ^= (BusType)(-1);
- }
- break;
- }
- j = pBus->primary;
- }
- }
-#endif
-
- for (j = 0; j < 6; j++) {
- info->memBase[j] = 0;
- info->ioBase[j] = 0;
- if (PCINONSYSTEMCLASSES(baseclass, subclass)) {
- info->size[j] =
- pciGetBaseSize(pcrp->tag, j, TRUE, &info->validSize);
- pcrp->minBasesize = info->validSize;
- } else {
- info->size[j] = pcrp->basesize[j];
- info->validSize = pcrp->minBasesize;
- }
- info->type[j] = 0;
- }
+ xf86PciVideoInfo[num - 1] = info;
- if (PCINONSYSTEMCLASSES(baseclass, subclass)) {
- /*
- * Check of a PCI base is unassigned. If so
- * attempt to fix it. Validation will determine
- * if the value was correct later on.
- */
- CARD32 *base = &pcrp->pci_base0;
-
- for (j = 0; j < 6; j++) {
- if (!PCI_MAP_IS64BITMEM(base[j])) {
- if (info->size[j] && IsBaseUnassigned(base[j]))
- base[j] = pciCheckForBrokenBase(pcrp->tag, j);
- } else {
- if (j == 5) /* bail out */
- break;
- if (info->size[j]
- && IsBaseUnassigned64(base[j],base[j+1])) {
- base[j] = pciCheckForBrokenBase(pcrp->tag, j);
- j++;
- base[j] = pciCheckForBrokenBase(pcrp->tag, j);
- }
- }
- }
- }
-
- /*
- * 64-bit base addresses are checked for and avoided on 32-bit
- * platforms.
- */
- for (j = 0; j < 6; ++j) {
- CARD32 bar = (&pcrp->pci_base0)[j];
-
- if (bar != 0) {
- if (bar & PCI_MAP_IO) {
- info->ioBase[j] = (memType)PCIGETIO(bar);
- info->type[j] = bar & PCI_MAP_IO_ATTR_MASK;
- } else {
- info->type[j] = bar & PCI_MAP_MEMORY_ATTR_MASK;
- info->memBase[j] = (memType)PCIGETMEMORY(bar);
- if (PCI_MAP_IS64BITMEM(bar)) {
- if (j == 5) {
- xf86MsgVerb(X_WARNING, 0,
- "****BAR5 specified as 64-bit wide, "
- "which is not possible. "
- "Ignoring BAR5.****\n");
- info->memBase[j] = 0;
- } else {
- CARD32 bar_hi = PCIGETMEMORY64HIGH((&pcrp->pci_base0)[j]);
-#if defined(LONG64) || defined(WORD64)
- /* 64 bit architecture */
- info->memBase[j] |=
- (memType)bar_hi << 32;
-#else
- if (bar_hi != 0)
- info->memBase[j] = 0;
-#endif
- ++j; /* Step over the next BAR */
- }
- }
- }
- }
- }
+ pci_device_probe(info);
+ info->user_data = 0;
}
- i++;
}
+
/* If we haven't found a primary device try a different heuristic */
if (primaryBus.type == BUS_NONE && num) {
- for (i = 0; i < num; i++) {
+ for (i = 0; i < num; i++) {
+ uint16_t command;
+
info = xf86PciVideoInfo[i];
- pcrp = info->thisCard;
-
- if ((pcrp->pci_command & PCI_CMD_MEM_ENABLE) &&
- (num == 1 ||
- ((info->class == PCI_CLASS_DISPLAY) &&
- (info->subclass == PCI_SUBCLASS_DISPLAY_VGA)))) {
+ pci_device_cfg_read_u16(info, & command, 4);
+
+ if ((command & PCI_CMD_MEM_ENABLE)
+ && ((num == 1) || IS_VGA(info->device_class))) {
if (primaryBus.type == BUS_NONE) {
primaryBus.type = BUS_PCI;
- primaryBus.id.pci.bus = pcrp->busnum;
- primaryBus.id.pci.device = pcrp->devnum;
- primaryBus.id.pci.func = pcrp->funcnum;
+ primaryBus.id.pci = info;
} else {
xf86Msg(X_NOTICE,
"More than one possible primary device found\n");
@@ -375,141 +163,71 @@ FindPCIVideoInfo(void)
for (k = 0; k < num; k++) {
const char *vendorname = NULL, *chipname = NULL;
const char *prim = " ";
- char busnum[8];
Bool memdone = FALSE, iodone = FALSE;
- i = 0;
+
info = xf86PciVideoInfo[k];
- xf86FormatPciBusNumber(info->bus, busnum);
- xf86FindPciNamesByDevice(info->vendor, info->chipType,
- NOVENDOR, NOSUBSYS,
- &vendorname, &chipname, NULL, NULL);
+
+ vendorname = pci_device_get_vendor_name( info );
+ chipname = pci_device_get_device_name( info );
+
if ((!vendorname || !chipname) &&
- !PCIALWAYSPRINTCLASSES(info->class, info->subclass))
+ !PCIALWAYSPRINTCLASSES(info->device_class))
continue;
+
if (xf86IsPrimaryPci(info))
prim = "*";
- xf86Msg(X_PROBED, "PCI:%s(%s:%d:%d) ", prim, busnum, info->device,
- info->func);
+ xf86Msg( X_PROBED, "PCI:%s(%u@%u:%u:%u) ", prim, info->domain,
+ info->bus, info->dev, info->func );
+
if (vendorname)
xf86ErrorF("%s ", vendorname);
else
- xf86ErrorF("unknown vendor (0x%04x) ", info->vendor);
+ xf86ErrorF("unknown vendor (0x%04x) ", info->vendor_id);
+
if (chipname)
xf86ErrorF("%s ", chipname);
else
- xf86ErrorF("unknown chipset (0x%04x) ", info->chipType);
- xf86ErrorF("rev %d", info->chipRev);
+ xf86ErrorF("unknown chipset (0x%04x) ", info->device_id);
+
+ xf86ErrorF("rev %d", info->revision);
+
for (i = 0; i < 6; i++) {
- if (info->memBase[i] &&
- (info->memBase[i] < (memType)(-1 << info->size[i]))) {
+ struct pci_mem_region * r = & info->regions[i];
+
+ if ( r->size && ! r->is_IO ) {
if (!memdone) {
xf86ErrorF(", Mem @ ");
memdone = TRUE;
} else
xf86ErrorF(", ");
- xf86ErrorF("0x%08lx/%d", info->memBase[i], info->size[i]);
+ xf86ErrorF("0x%08lx/%ld", r->base_addr, r->size);
}
}
+
for (i = 0; i < 6; i++) {
- if (info->ioBase[i] &&
- (info->ioBase[i] < (memType)(-1 << info->size[i]))) {
+ struct pci_mem_region * r = & info->regions[i];
+
+ if ( r->size && r->is_IO ) {
if (!iodone) {
xf86ErrorF(", I/O @ ");
iodone = TRUE;
} else
xf86ErrorF(", ");
- xf86ErrorF("0x%04lx/%d", info->ioBase[i], info->size[i]);
+ xf86ErrorF("0x%08lx/%ld", r->base_addr, r->size);
}
}
- if (info->biosBase &&
- (info->biosBase < (memType)(-1 << info->biosSize)))
- xf86ErrorF(", BIOS @ 0x%08lx/%d", info->biosBase, info->biosSize);
- xf86ErrorF("\n");
- }
-}
-/*
- * fixPciSizeInfo() -- fix pci size info by testing it destructively
- * (if not already done), fix pciVideoInfo and entry in the resource
- * list.
- */
-/*
- * Note: once we have OS support to read the sizes GetBaseSize() will
- * have to be wrapped by the OS layer. fixPciSizeInfo() should also
- * be wrapped by the OS layer to do nothing if the size is always
- * returned correctly by GetBaseSize(). It should however set validate
- * in pciVideoRec if validation is required. ValidatePci() also needs
- * to be wrapped by the OS layer. This may do nothing if the OS has
- * already taken care of validation. fixPciResource() may be moved to
- * OS layer with minimal changes. Once the wrapping layer is in place
- * the common level and drivers should not reference these functions
- * directly but thru the OS layer.
- */
-
-static void
-fixPciSizeInfo(int entityIndex)
-{
- pciVideoPtr pvp;
- resPtr pAcc;
- PCITAG tag;
- int j;
-
- if (! (pvp = xf86GetPciInfoForEntity(entityIndex))) return;
- if (pvp->validSize) return;
-
- tag = pciTag(pvp->bus,pvp->device,pvp->func);
-
- for (j = 0; j < 6; j++) {
- pAcc = Acc;
- if (pvp->memBase[j])
- while (pAcc) {
- if (((pAcc->res_type & (ResPhysMask | ResBlock))
- == (ResMem | ResBlock))
- && (pAcc->block_begin == B2M(TAG(pvp),pvp->memBase[j]))
- && (pAcc->block_end == B2M(TAG(pvp),pvp->memBase[j]
- + SIZE(pvp->size[j])))) break;
- pAcc = pAcc->next;
- }
- else if (pvp->ioBase[j])
- while (pAcc) {
- if (((pAcc->res_type & (ResPhysMask | ResBlock)) ==
- (ResIo | ResBlock))
- && (pAcc->block_begin == B2I(TAG(pvp),pvp->ioBase[j]))
- && (pAcc->block_end == B2I(TAG(pvp),pvp->ioBase[j]
- + SIZE(pvp->size[j])))) break;
- pAcc = pAcc->next;
- }
- else continue;
- pvp->size[j] = pciGetBaseSize(tag, j, TRUE, &pvp->validSize);
- if (pAcc) {
- pAcc->block_end = pvp->memBase[j] ?
- B2M(TAG(pvp),pvp->memBase[j] + SIZE(pvp->size[j]))
- : B2I(TAG(pvp),pvp->ioBase[j] + SIZE(pvp->size[j]));
- pAcc->res_type &= ~ResEstimated;
- pAcc->res_type |= ResBios;
- }
- }
- if (pvp->biosBase) {
- pAcc = Acc;
- while (pAcc) {
- if (((pAcc->res_type & (ResPhysMask | ResBlock)) ==
- (ResMem | ResBlock))
- && (pAcc->block_begin == B2M(TAG(pvp),pvp->biosBase))
- && (pAcc->block_end == B2M(TAG(pvp),pvp->biosBase
- + SIZE(pvp->biosSize)))) break;
- pAcc = pAcc->next;
- }
- pvp->biosSize = pciGetBaseSize(tag, 6, TRUE, &pvp->validSize);
- if (pAcc) {
- pAcc->block_end = B2M(TAG(pvp),pvp->biosBase+SIZE(pvp->biosSize));
- pAcc->res_type &= ~ResEstimated;
- pAcc->res_type |= ResBios;
+ if ( info->rom_size ) {
+ xf86ErrorF(", BIOS @ 0x\?\?\?\?\?\?\?\?/%ld", info->rom_size);
}
+
+ xf86ErrorF("\n");
}
}
+
/*
* IO enable/disable related routines for PCI
*/
@@ -518,21 +236,25 @@ fixPciSizeInfo(int entityIndex)
static void
pciIoAccessEnable(void* arg)
{
+#if 0
#ifdef DEBUG
ErrorF("pciIoAccessEnable: 0x%05lx\n", *(PCITAG *)arg);
#endif
pArg->ctrl |= SETBITS | PCI_CMD_MASTER_ENABLE;
- pciWriteLong(pArg->tag, PCI_CMD_STAT_REG, pArg->ctrl);
+ pci_device_cfg_write_u32(pArg->dev, pArg->ctrl, PCI_CMD_STAT_REG);
+#endif
}
static void
pciIoAccessDisable(void* arg)
{
+#if 0
#ifdef DEBUG
ErrorF("pciIoAccessDisable: 0x%05lx\n", *(PCITAG *)arg);
#endif
pArg->ctrl &= ~SETBITS;
- pciWriteLong(pArg->tag, PCI_CMD_STAT_REG, pArg->ctrl);
+ pci_device_cfg_write_u32(pArg->dev, pArg->ctrl, PCI_CMD_STAT_REG);
+#endif
}
#undef SETBITS
@@ -540,21 +262,25 @@ pciIoAccessDisable(void* arg)
static void
pciIo_MemAccessEnable(void* arg)
{
+#if 0
#ifdef DEBUG
ErrorF("pciIo_MemAccessEnable: 0x%05lx\n", *(PCITAG *)arg);
#endif
pArg->ctrl |= SETBITS | PCI_CMD_MASTER_ENABLE;
- pciWriteLong(pArg->tag, PCI_CMD_STAT_REG, pArg->ctrl);
+ pci_device_cfg_write_u32(pArg->dev, pArg->ctrl, PCI_CMD_STAT_REG);
+#endif
}
static void
pciIo_MemAccessDisable(void* arg)
{
+#if 0
#ifdef DEBUG
ErrorF("pciIo_MemAccessDisable: 0x%05lx\n", *(PCITAG *)arg);
#endif
pArg->ctrl &= ~SETBITS;
- pciWriteLong(pArg->tag, PCI_CMD_STAT_REG, pArg->ctrl);
+ pci_device_cfg_write_u32(pArg->dev, pArg->ctrl, PCI_CMD_STAT_REG);
+#endif
}
#undef SETBITS
@@ -562,21 +288,25 @@ pciIo_MemAccessDisable(void* arg)
static void
pciMemAccessEnable(void* arg)
{
+#if 0
#ifdef DEBUG
ErrorF("pciMemAccessEnable: 0x%05lx\n", *(PCITAG *)arg);
#endif
pArg->ctrl |= SETBITS | PCI_CMD_MASTER_ENABLE;
- pciWriteLong(pArg->tag, PCI_CMD_STAT_REG, pArg->ctrl);
+ pci_device_cfg_write_u32(pArg->dev, pArg->ctrl, PCI_CMD_STAT_REG);
+#endif
}
static void
pciMemAccessDisable(void* arg)
{
+#if 0
#ifdef DEBUG
ErrorF("pciMemAccessDisable: 0x%05lx\n", *(PCITAG *)arg);
#endif
pArg->ctrl &= ~SETBITS;
- pciWriteLong(pArg->tag, PCI_CMD_STAT_REG, pArg->ctrl);
+ pci_device_cfg_write_u32(pArg->dev, pArg->ctrl, PCI_CMD_STAT_REG);
+#endif
}
#undef SETBITS
#undef pArg
@@ -587,69 +317,46 @@ pciMemAccessDisable(void* arg)
static void
pciBusAccessEnable(BusAccPtr ptr)
{
- PCITAG tag = ptr->busdep.pci.acc;
- CARD16 ctrl;
+#if 0
+ struct pci_device * const dev = ptr->busdep.pci.dev;
+ uint16_t ctrl;
#ifdef DEBUG
ErrorF("pciBusAccessEnable: bus=%d\n", ptr->busdep.pci.bus);
#endif
- ctrl = pciReadWord(tag, PCI_PCI_BRIDGE_CONTROL_REG);
+ pci_device_cfg_read_u16( dev, & ctrl, PCI_PCI_BRIDGE_CONTROL_REG );
if ((ctrl & MASKBITS) != PCI_PCI_BRIDGE_VGA_EN) {
ctrl = (ctrl | PCI_PCI_BRIDGE_VGA_EN) &
~(PCI_PCI_BRIDGE_MASTER_ABORT_EN | PCI_PCI_BRIDGE_SECONDARY_RESET);
- pciWriteWord(tag, PCI_PCI_BRIDGE_CONTROL_REG, ctrl);
+ pci_device_cfg_write_u16(dev, ctrl, PCI_PCI_BRIDGE_CONTROL_REG);
}
+#endif
}
/* move to OS layer */
static void
pciBusAccessDisable(BusAccPtr ptr)
{
- PCITAG tag = ptr->busdep.pci.acc;
- CARD16 ctrl;
+#if 0
+ struct pci_device * const dev = ptr->busdep.pci.dev;
+ uint16_t ctrl;
#ifdef DEBUG
ErrorF("pciBusAccessDisable: bus=%d\n", ptr->busdep.pci.bus);
#endif
- ctrl = pciReadWord(tag, PCI_PCI_BRIDGE_CONTROL_REG);
+ pci_device_cfg_read_u16( dev, & ctrl, PCI_PCI_BRIDGE_CONTROL_REG );
if (ctrl & MASKBITS) {
ctrl &= ~(MASKBITS | PCI_PCI_BRIDGE_SECONDARY_RESET);
- pciWriteWord(tag, PCI_PCI_BRIDGE_CONTROL_REG, ctrl);
+ pci_device_cfg_write_u16(dev, ctrl, PCI_PCI_BRIDGE_CONTROL_REG);
}
-}
-#undef MASKBITS
-
-/* move to OS layer */
-static void
-pciDrvBusAccessEnable(BusAccPtr ptr)
-{
- int bus = ptr->busdep.pci.bus;
-
-#ifdef DEBUG
- ErrorF("pciDrvBusAccessEnable: bus=%d\n", bus);
-#endif
- (*pciBusInfo[bus]->funcs->pciControlBridge)(bus,
- PCI_PCI_BRIDGE_VGA_EN,
- PCI_PCI_BRIDGE_VGA_EN);
-}
-
-/* move to OS layer */
-static void
-pciDrvBusAccessDisable(BusAccPtr ptr)
-{
- int bus = ptr->busdep.pci.bus;
-
-#ifdef DEBUG
- ErrorF("pciDrvBusAccessDisable: bus=%d\n", bus);
#endif
- (*pciBusInfo[bus]->funcs->pciControlBridge)(bus,
- PCI_PCI_BRIDGE_VGA_EN, 0);
}
-
+#undef MASKBITS
static void
pciSetBusAccess(BusAccPtr ptr)
{
+#if 0
#ifdef DEBUG
ErrorF("pciSetBusAccess: route VGA to bus %d\n", ptr->busdep.pci.bus);
#endif
@@ -672,1010 +379,89 @@ pciSetBusAccess(BusAccPtr ptr)
}
ptr = ptr->primary;
}
+#endif
}
/* move to OS layer */
static void
-savePciState(PCITAG tag, pciSavePtr ptr)
+savePciState( struct pci_device * dev, pciSavePtr ptr )
{
+#if 0
int i;
-
- ptr->command = pciReadLong(tag, PCI_CMD_STAT_REG);
- for (i=0; i < 6; i++)
- ptr->base[i] = pciReadLong(tag, PCI_CMD_BASE_REG + i*4);
- ptr->biosBase = pciReadLong(tag, PCI_CMD_BIOS_REG);
-}
-/* move to OS layer */
-static void
-restorePciState(PCITAG tag, pciSavePtr ptr)
-{
- int i;
-
- /* disable card before setting anything */
- pciSetBitsLong(tag, PCI_CMD_STAT_REG,
- PCI_CMD_MEM_ENABLE | PCI_CMD_IO_ENABLE , 0);
- pciWriteLong(tag,PCI_CMD_BIOS_REG, ptr->biosBase);
- for (i=0; i<6; i++)
- pciWriteLong(tag, PCI_CMD_BASE_REG + i*4, ptr->base[i]);
- pciWriteLong(tag, PCI_CMD_STAT_REG, ptr->command);
-}
+ pci_device_cfg_read_u32( dev, & ptr->command, PCI_CMD_STAT_REG );
-/* move to OS layer */
-static void
-savePciBusState(BusAccPtr ptr)
-{
- PCITAG tag = ptr->busdep.pci.acc;
-
- ptr->busdep.pci.save.control =
- pciReadWord(tag, PCI_PCI_BRIDGE_CONTROL_REG) &
- ~PCI_PCI_BRIDGE_SECONDARY_RESET;
- /* Allow master aborts to complete normally on non-root buses */
- if (ptr->busdep.pci.save.control & PCI_PCI_BRIDGE_MASTER_ABORT_EN)
- pciWriteWord(tag, PCI_PCI_BRIDGE_CONTROL_REG,
- ptr->busdep.pci.save.control & ~PCI_PCI_BRIDGE_MASTER_ABORT_EN);
-}
-
-/* move to OS layer */
-#define MASKBITS (PCI_PCI_BRIDGE_VGA_EN | PCI_PCI_BRIDGE_MASTER_ABORT_EN)
-static void
-restorePciBusState(BusAccPtr ptr)
-{
- PCITAG tag = ptr->busdep.pci.acc;
- CARD16 ctrl;
-
- /* Only restore the bits we've changed (and don't cause resets) */
- ctrl = pciReadWord(tag, PCI_PCI_BRIDGE_CONTROL_REG);
- if ((ctrl ^ ptr->busdep.pci.save.control) & MASKBITS) {
- ctrl &= ~(MASKBITS | PCI_PCI_BRIDGE_SECONDARY_RESET);
- ctrl |= ptr->busdep.pci.save.control & MASKBITS;
- pciWriteWord(tag, PCI_PCI_BRIDGE_CONTROL_REG, ctrl);
+ for ( i = 0; i < 6; i++ ) {
+ pci_device_cfg_read_u32( dev, & ptr->base[i],
+ PCI_CMD_BASE_REG + (i * 4) );
}
-}
-#undef MASKBITS
-/* move to OS layer */
-static void
-savePciDrvBusState(BusAccPtr ptr)
-{
- int bus = ptr->busdep.pci.bus;
-
- ptr->busdep.pci.save.control =
- (*pciBusInfo[bus]->funcs->pciControlBridge)(bus, 0, 0);
- /* Allow master aborts to complete normally on this bus */
- (*pciBusInfo[bus]->funcs->pciControlBridge)(bus,
- PCI_PCI_BRIDGE_MASTER_ABORT_EN,
- 0);
+ pci_device_cfg_read_u32( dev, & ptr->biosBase, PCI_CMD_BIOS_REG );
+#endif
}
/* move to OS layer */
static void
-restorePciDrvBusState(BusAccPtr ptr)
-{
- int bus = ptr->busdep.pci.bus;
-
- (*pciBusInfo[bus]->funcs->pciControlBridge)(bus, (CARD16)(-1),
- ptr->busdep.pci.save.control);
-}
-
-
-static void
-disablePciBios(PCITAG tag)
-{
- pciSetBitsLong(tag, PCI_CMD_BIOS_REG, PCI_CMD_BIOS_ENABLE, 0);
-}
-
-/* ????? */
-static void
-correctPciSize(memType base, memType oldsize, memType newsize,
- unsigned long type)
+restorePciState( struct pci_device * dev, pciSavePtr ptr)
{
- pciConfigPtr pcrp, *pcrpp;
- pciVideoPtr pvp, *pvpp;
- CARD32 *basep;
+#if 0
int i;
- int old_bits = 0, new_bits = 0;
-
- if (oldsize + 1) while (oldsize & 1) {
- old_bits ++;
- oldsize >>= 1;
- }
- if (newsize + 1) while (newsize & 1) {
- new_bits ++;
- newsize >>= 1;
- }
- for (pcrpp = xf86PciInfo, pcrp = *pcrpp; pcrp; pcrp = *++(pcrpp)) {
-
- /* Only process devices with type 0 headers */
- if ((pcrp->pci_header_type & 0x7f) != 0)
- continue;
-
- basep = &pcrp->pci_base0;
- for (i = 0; i < 6; i++) {
- if (basep[i] && (pcrp->basesize[i] == old_bits)) {
- if ((((type & ResPhysMask) == ResIo) &&
- PCI_MAP_IS_IO(basep[i]) &&
- B2I(pcrp->tag,PCIGETIO(basep[i]) == base)) ||
- (((type & ResPhysMask) == ResMem) &&
- PCI_MAP_IS_MEM(basep[i]) &&
- (((!PCI_MAP_IS64BITMEM(basep[i])) &&
- (B2M(pcrp->tag,PCIGETMEMORY(basep[i])) == base))
-#if defined(LONG64) || defined(WORD64)
- ||
- (B2M(pcrp->tag,PCIGETMEMORY64(basep[i])) == base)
-#else
- ||
- (!basep[i+1]
- && (B2M(pcrp->tag,PCIGETMEMORY(basep[i])) == base))
-#endif
- ))) {
- pcrp->basesize[i] = new_bits;
- break; /* to next device */
- }
- }
- if (PCI_MAP_IS64BITMEM(basep[i])) i++;
- }
- }
-
- if (xf86PciVideoInfo) {
- for (pvpp = xf86PciVideoInfo, pvp = *pvpp; pvp; pvp = *(++pvpp)) {
-
- for (i = 0; i < 6; i++) {
- if (pvp->size[i] == old_bits) {
- if ((((type & ResPhysMask) == ResIo) && pvp->ioBase[i]
- && (B2I(TAG(pvp),pvp->ioBase[i]) == base)) ||
- (((type & ResPhysMask) == ResMem) && pvp->memBase[i]
- && (B2M(TAG(pvp),pvp->memBase[i]) == base))) {
- pvp->size[i] = new_bits;
- break; /* to next device */
- }
- }
- }
- }
- }
-}
-
-/* ????? */
-static void
-removeOverlapsWithBridges(int busIndex, resPtr target)
-{
- PciBusPtr pbp;
- resPtr tmp,bridgeRes = NULL;
- resRange range;
+ /* disable card before setting anything */
+ pci_device_cfg_write_bits(dev, PCI_CMD_MEM_ENABLE | PCI_CMD_IO_ENABLE, 0,
+ PCI_CMD_STAT_REG);
- if (!target)
- return;
-
- if (!ResCanOverlap(&target->val))
- return;
+ pci_device_cfg_write_u32(dev, ptr->biosBase, PCI_CMD_BIOS_REG);
- range = target->val;
-
- for (pbp=xf86PciBus; pbp; pbp = pbp->next) {
- if (pbp->primary == busIndex) {
- tmp = xf86DupResList(pbp->preferred_io);
- bridgeRes = xf86JoinResLists(tmp,bridgeRes);
- tmp = xf86DupResList(pbp->preferred_mem);
- bridgeRes = xf86JoinResLists(tmp,bridgeRes);
- tmp = xf86DupResList(pbp->preferred_pmem);
- bridgeRes = xf86JoinResLists(tmp,bridgeRes);
- }
+ for ( i = 0; i < 6; i++ ) {
+ pci_device_cfg_write_u32(dev, ptr->base[i],
+ PCI_CMD_BASE_REG + (i * 4));
}
-
- RemoveOverlaps(target, bridgeRes, TRUE, TRUE);
- if (range.rEnd > target->block_end) {
- correctPciSize(range.rBegin, range.rEnd - range.rBegin,
- target->block_end - target->block_begin,
- target->res_type);
- xf86MsgVerb(X_INFO, 3,
- "PCI %s resource overlap reduced 0x%08lx from 0x%08lx to 0x%08lx\n",
- ((target->res_type & ResPhysMask) == ResMem) ? "Memory" : "I/O",
- range.rBegin, range.rEnd, target->block_end);
- }
- xf86FreeResList(bridgeRes);
-}
-
-/* ????? */
-static void
-xf86GetPciRes(resPtr *activeRes, resPtr *inactiveRes)
-{
- pciConfigPtr pcrp, *pcrpp;
- pciVideoPtr pvp, *pvpp;
- CARD32 *basep;
- int i;
- resPtr pRes, tmp;
- resRange range;
- long resMisc;
-
- if (activeRes)
- *activeRes = NULL;
- if (inactiveRes)
- *inactiveRes = NULL;
-
- if (!activeRes || !inactiveRes || !xf86PciInfo)
- return;
-
- if (xf86PciVideoInfo)
- for (pvpp = xf86PciVideoInfo, pvp = *pvpp; pvp; pvp = *(++pvpp)) {
- resPtr *res;
-
- if (PCINONSYSTEMCLASSES(pvp->class, pvp->subclass))
- resMisc = ResBios;
- else
- resMisc = 0;
-
- if (((pciConfigPtr)pvp->thisCard)->pci_command
- & (PCI_CMD_IO_ENABLE | PCI_CMD_MEM_ENABLE))
- res = activeRes;
- else
- res = inactiveRes;
-
- if (!pvp->validSize)
- resMisc |= ResEstimated;
-
- for (i = 0; i < 6; i++) {
- if (pvp->ioBase[i] &&
- (pvp->ioBase[i] < (memType)(-1 << pvp->size[i]))) {
- PV_I_RANGE(range,pvp,i,ResExcIoBlock | resMisc);
- tmp = xf86AddResToList(NULL, &range, -1);
- removeOverlapsWithBridges(pvp->bus,tmp);
- *res = xf86JoinResLists(tmp,*res);
- } else if (pvp->memBase[i] &&
- (pvp->memBase[i] < (memType)(-1 << pvp->size[i]))) {
- PV_M_RANGE(range, pvp,i, ResExcMemBlock | resMisc);
- tmp = xf86AddResToList(NULL, &range, -1);
- removeOverlapsWithBridges(pvp->bus,tmp);
- *res = xf86JoinResLists(tmp,*res);
- }
- }
- /* FIXME!!!: Don't use BIOS resources for overlap
- * checking but reserve them!
- */
- if (pvp->biosBase &&
- (pvp->biosBase < (memType)(-1 << pvp->biosSize))) {
- PV_B_RANGE(range, pvp, ResExcMemBlock | resMisc);
- tmp = xf86AddResToList(NULL, &range, -1);
- removeOverlapsWithBridges(pvp->bus,tmp);
- *res = xf86JoinResLists(tmp,*res);
- }
- }
- for (pcrpp = xf86PciInfo, pcrp = *pcrpp; pcrp; pcrp = *++(pcrpp)) {
- resPtr *res;
- const CARD8 baseclass = pcrp->pci_base_class;
- const CARD8 subclass = pcrp->pci_sub_class;
-
-
- if (PCIINFOCLASSES(baseclass, subclass))
- continue;
-
- /* Only process devices with type 0 headers */
- if ((pcrp->pci_header_type & 0x7f) != 0)
- continue;
-
- if (!pcrp->minBasesize)
- resMisc = ResEstimated;
- else
- resMisc = 0;
-
- /*
- * Allow resources allocated to host bridges to overlap. Perhaps, this
- * needs to be specific to AGP-capable chipsets. AGP "memory"
- * sometimes gets allocated within the range routed to the AGP bus.
- */
- if ((baseclass == PCI_CLASS_BRIDGE) &&
- (subclass == PCI_SUBCLASS_BRIDGE_HOST))
- resMisc |= ResOverlap;
-
- basep = &pcrp->pci_base0;
- for (i = 0; i < 6; i++) {
- if (basep[i]) {
- if (PCI_MAP_IS_IO(basep[i])) {
- if (pcrp->pci_command & PCI_CMD_IO_ENABLE)
- res = activeRes;
- else
- res = inactiveRes;
- P_I_RANGE(range, pcrp->tag, PCIGETIO(basep[i]),
- pcrp->basesize[i], ResExcIoBlock | resMisc)
- } else if (!PCI_MAP_IS64BITMEM(basep[i])) {
- if (pcrp->pci_command & PCI_CMD_MEM_ENABLE)
- res = activeRes;
- else
- res = inactiveRes;
- P_M_RANGE(range, pcrp->tag, PCIGETMEMORY(basep[i]),
- pcrp->basesize[i], ResExcMemBlock | resMisc)
- } else {
- i++;
-#if defined(LONG64) || defined(WORD64)
- P_M_RANGE(range,pcrp->tag,PCIGETMEMORY64(basep[i - 1]),
- pcrp->basesize[i - 1], ResExcMemBlock | resMisc)
-#else
- if (basep[i])
- continue;
- P_M_RANGE(range, pcrp->tag, PCIGETMEMORY(basep[i - 1]),
- pcrp->basesize[i - 1], ResExcMemBlock | resMisc)
+ pci_device_cfg_write_u32(dev, ptr->command, PCI_CMD_STAT_REG);
#endif
- if (pcrp->pci_command & PCI_CMD_MEM_ENABLE)
- res = activeRes;
- else
- res = inactiveRes;
- }
- if (range.rBegin) { /* catch cases where PCI base is unset */
- tmp = xf86AddResToList(NULL, &range, -1);
- removeOverlapsWithBridges(pcrp->busnum,tmp);
- *res = xf86JoinResLists(tmp,*res);
- }
- }
- }
-
- /* Ignore disabled non-video ROMs */
- if ((pcrp->pci_command & PCI_CMD_MEM_ENABLE) &&
- (pcrp->pci_baserom & PCI_MAP_ROM_DECODE_ENABLE)) {
- P_M_RANGE(range,pcrp->tag,PCIGETROM(pcrp->pci_baserom),
- pcrp->basesize[6], ResExcMemBlock | resMisc);
- if (range.rBegin) {
- tmp = xf86AddResToList(NULL, &range, -1);
- removeOverlapsWithBridges(pcrp->busnum, tmp);
- *activeRes = xf86JoinResLists(tmp, *activeRes);
- }
- }
- }
-
- if (*activeRes) {
- xf86MsgVerb(X_INFO, 3, "Active PCI resource ranges:\n");
- xf86PrintResList(3, *activeRes);
- }
- if (*inactiveRes) {
- xf86MsgVerb(X_INFO, 3, "Inactive PCI resource ranges:\n");
- xf86PrintResList(3, *inactiveRes);
- }
-
- /*
- * Adjust ranges based on the assumption that there are no real
- * overlaps in the PCI base allocations. This assumption should be
- * reasonable in most cases. It may be possible to refine the
- * approximated PCI base sizes by considering bus mapping information
- * from PCI-PCI bridges.
- */
-
- if (*activeRes) {
- /* Check for overlaps */
- for (pRes = *activeRes; pRes; pRes = pRes->next) {
- if (ResCanOverlap(&pRes->val)) {
- range = pRes->val;
-
- RemoveOverlaps(pRes, *activeRes, TRUE, TRUE);
- RemoveOverlaps(pRes, *inactiveRes, TRUE,
- (xf86Info.estimateSizesAggressively > 0));
-
- if (range.rEnd > pRes->block_end) {
- correctPciSize(range.rBegin, range.rEnd - range.rBegin,
- pRes->block_end - pRes->block_begin,
- pRes->res_type);
- xf86MsgVerb(X_INFO, 3,
- "PCI %s resource overlap reduced 0x%08lx"
- " from 0x%08lx to 0x%08lx\n",
- ((pRes->res_type & ResPhysMask) == ResMem) ?
- "Memory" : "I/O",
- range.rBegin, range.rEnd, pRes->block_end);
- }
- }
- }
- xf86MsgVerb(X_INFO, 3,
- "Active PCI resource ranges after removing overlaps:\n");
- xf86PrintResList(3, *activeRes);
- }
-
- if (*inactiveRes) {
- /* Check for overlaps */
- for (pRes = *inactiveRes; pRes; pRes = pRes->next) {
- if (ResCanOverlap(&pRes->val)) {
- range = pRes->val;
-
- RemoveOverlaps(pRes, *activeRes, TRUE,
- (xf86Info.estimateSizesAggressively > 1));
- RemoveOverlaps(pRes, *inactiveRes, TRUE,
- (xf86Info.estimateSizesAggressively > 1));
-
- if (range.rEnd > pRes->block_end) {
- correctPciSize(range.rBegin, range.rEnd - range.rBegin,
- pRes->block_end - pRes->block_begin,
- pRes->res_type);
- xf86MsgVerb(X_INFO, 3,
- "PCI %s resource overlap reduced 0x%08lx"
- " from 0x%08lx to 0x%08lx\n",
- ((pRes->res_type & ResPhysMask) == ResMem) ?
- "Memory" : "I/O",
- range.rBegin, range.rEnd, pRes->block_end);
- }
-
- }
- }
- xf86MsgVerb(X_INFO, 3,
- "Inactive PCI resource ranges after removing overlaps:\n");
- xf86PrintResList(3, *inactiveRes);
- }
-}
-
-resPtr
-ResourceBrokerInitPci(resPtr *osRes)
-{
- resPtr activeRes, inactiveRes;
- resPtr tmp;
-
- /* Get bus-specific system resources (PCI) */
- xf86GetPciRes(&activeRes, &inactiveRes);
-
- /*
- * Adjust OS-reported resource ranges based on the assumption that there
- * are no overlaps with the PCI base allocations. This should be a good
- * assumption because writes to PCI address space won't be routed directly
- * to host memory.
- */
-
- for (tmp = *osRes; tmp; tmp = tmp->next)
- RemoveOverlaps(tmp, activeRes, FALSE, TRUE);
-
- xf86MsgVerb(X_INFO, 3, "OS-reported resource ranges after removing"
- " overlaps with PCI:\n");
- xf86PrintResList(3, *osRes);
-
- pciAvoidRes = xf86AddRangesToList(pciAvoidRes,PciAvoid,-1);
- for (tmp = pciAvoidRes; tmp; tmp = tmp->next)
- RemoveOverlaps(tmp, activeRes, FALSE, TRUE);
- tmp = xf86DupResList(*osRes);
- pciAvoidRes = xf86JoinResLists(pciAvoidRes,tmp);
-
- return (xf86JoinResLists(activeRes,inactiveRes));
}
-
-/*
- * PCI Resource modification
- */
-static Bool
-fixPciResource(int prt, memType alignment, pciVideoPtr pvp, unsigned long type)
+/* move to OS layer */
+static void
+savePciBusState(BusAccPtr ptr)
{
- int res_n;
- memType *p_base;
- int *p_size;
- unsigned char p_type;
- resPtr AccTmp = NULL;
- resPtr orgAcc = NULL;
- resPtr *pAcc = &AccTmp;
- resPtr avoid = NULL;
- resRange range;
- resPtr resSize = NULL;
- resPtr w_tmp, w = NULL, w_2nd = NULL;
- PCITAG tag;
- PciBusPtr pbp = xf86PciBus;
- pciConfigPtr pcp;
- resPtr tmp;
-
- if (!pvp) return FALSE;
- tag = pciTag(pvp->bus,pvp->device,pvp->func);
- pcp = pvp->thisCard;
-
- type &= ResAccMask;
- if (!type) type = ResShared;
- if (prt < 6) {
- if (pvp->memBase[prt]) {
- type |= ResMem;
- res_n = prt;
- p_base = &(pvp->memBase[res_n]);
- p_size = &(pvp->size[res_n]);
- p_type = pvp->type[res_n];
- if (!PCI_MAP_IS64BITMEM(pvp->type[res_n])) {
- PCI_M_RANGE(range,tag,0,0xffffffff,ResExcMemBlock);
- resSize = xf86AddResToList(resSize,&range,-1);
- }
- } else if (pvp->ioBase[prt]){
- type |= ResIo;
- res_n = prt;
- p_base = &(pvp->ioBase[res_n]);
- p_size = &(pvp->size[res_n]);
- p_type = pvp->type[res_n];
- PCI_I_RANGE(range, tag, 0, 0xffffffff, ResExcIoBlock);
- resSize = xf86AddResToList(resSize, &range, -1);
- } else return FALSE;
- } else if (prt == 6) {
- type |= ResMem;
- res_n = 0xff; /* special flag for bios rom */
- p_base = &(pvp->biosBase);
- p_size = &(pvp->biosSize);
- /* XXX This should also include the PCI_MAP_MEMORY_TYPE_MASK part */
- p_type = 0;
- PCI_M_RANGE(range,tag,0,0xffffffff,ResExcMemBlock);
- resSize = xf86AddResToList(resSize,&range,-1);
- } else return FALSE;
-
- if (! *p_base) return FALSE;
-
- type |= (range.type & ResDomain) | ResBlock;
-
- /* setup avoid: PciAvoid is bus range: convert later */
- avoid = xf86DupResList(pciAvoidRes);
-
- while (pbp) {
- if (pbp->secondary == pvp->bus) {
- if ((type & ResPhysMask) == ResMem) {
- if (((p_type & PCI_MAP_MEMORY_CACHABLE)
-#if 0 /*EE*/
- || (res_n == 0xff)/* bios should also be prefetchable */
-#endif
- )) {
- if (pbp->preferred_pmem)
- w = xf86FindIntersectOfLists(pbp->preferred_pmem,
- ResRange);
- else if (pbp->pmem)
- w = xf86FindIntersectOfLists(pbp->pmem,ResRange);
-
- if (pbp->preferred_mem)
- w_2nd = xf86FindIntersectOfLists(pbp->preferred_mem,
- ResRange);
- else if (pbp->mem)
- w_2nd = xf86FindIntersectOfLists(pbp->mem,
- ResRange);
- } else {
- if (pbp->preferred_mem)
- w = xf86FindIntersectOfLists(pbp->preferred_mem,
- ResRange);
- else if (pbp->mem)
- w = xf86FindIntersectOfLists(pbp->mem,ResRange);
- }
- } else {
- if (pbp->preferred_io)
- w = xf86FindIntersectOfLists(pbp->preferred_io,ResRange);
- if (pbp->io)
- w = xf86FindIntersectOfLists(pbp->io,ResRange);
- }
- } else if (pbp->primary == pvp->bus) {
- if ((type & ResPhysMask) == ResMem) {
- tmp = xf86DupResList(pbp->preferred_pmem);
- avoid = xf86JoinResLists(avoid, tmp);
- tmp = xf86DupResList(pbp->preferred_mem);
- avoid = xf86JoinResLists(avoid, tmp);
- } else {
- tmp = xf86DupResList(pbp->preferred_io);
- avoid = xf86JoinResLists(avoid, tmp);
- }
- }
- pbp = pbp->next;
- }
-
- /* convert bus based entries in avoid list to host base */
- pciConvertListToHost(pvp->bus,pvp->device,pvp->func, avoid);
-
- if (!w)
- w = xf86DupResList(ResRange);
- xf86MsgVerb(X_INFO, 3, "window:\n");
- xf86PrintResList(3, w);
- xf86MsgVerb(X_INFO, 3, "resSize:\n");
- xf86PrintResList(3, resSize);
-
- if (resSize) {
- w_tmp = w;
- w = xf86FindIntersectOfLists(w,resSize);
- xf86FreeResList(w_tmp);
- if (w_2nd) {
- w_tmp = w_2nd;
- w_2nd = xf86FindIntersectOfLists(w_2nd,resSize);
- xf86FreeResList(w_tmp);
- }
- xf86FreeResList(resSize);
- }
- xf86MsgVerb(X_INFO, 3, "window fixed:\n");
- xf86PrintResList(3, w);
+#if 0
+ struct pci_device * const dev = ptr->busdep.pci.dev;
+ uint16_t temp;
- if (!alignment)
- alignment = (1 << (*p_size)) - 1;
-
- /* Access list holds bios resources -- remove this one */
-#ifdef NOTYET
- AccTmp = xf86DupResList(Acc);
- while ((*pAcc)) {
- if ((((*pAcc)->res_type & (type & ~ResAccMask))
- == (type & ~ResAccMask))
- && ((*pAcc)->block_begin == (B2H(tag,(*p_base),type)))
- && ((*pAcc)->block_end == (B2H(tag,
- (*p_base)+SIZE(*p_size),type)))) {
- resPtr acc_tmp = (*pAcc)->next;
- xfree((*pAcc));
- (*pAcc) = acc_tmp;
- break;
- } else
- pAcc = &((*pAcc)->next);
- }
- /* check if we really need to fix anything */
- P_X_RANGE(range,tag,(*p_base),(*p_base) + SIZE((*p_size)),type);
- if (!ChkConflict(&range,avoid,SETUP)
- && !ChkConflict(&range,AccTmp,SETUP)
- && ((B2H(tag,(*p_base),type) & PCI_SIZE(type,tag,alignment)
- == range->block_begin)
- && ((xf86IsSubsetOf(range,w)
- || (w_2nd && xf86IsSubsetOf(range,w_2n))))) {
-#ifdef DEBUG
- ErrorF("nothing to fix\n");
-#endif
- xf86FreeResList(AccTmp);
- xf86FreeResList(w);
- xf86FreeResList(w_2nd);
- xf86FreeResList(avoid);
- return TRUE;
- }
-#ifdef DEBUG
- ErrorF("removing old resource\n");
-#endif
- orgAcc = Acc;
- Acc = AccTmp;
-#else
- orgAcc = xf86DupResList(Acc);
- pAcc = &Acc;
- while (*pAcc) {
- if ((((*pAcc)->res_type & (ResTypeMask|ResExtMask)) ==
- (type & ~ResAccMask))
- && ((*pAcc)->block_begin == B2H(tag,(*p_base),type))
- && ((*pAcc)->block_end == B2H(tag,(*p_base) + SIZE(*p_size),
- type))) {
-#ifdef DEBUG
- ErrorF("removing old resource\n");
-#endif
- tmp = *pAcc;
- *pAcc = (*pAcc)->next;
- tmp->next = NULL;
- xf86FreeResList(tmp);
- break;
- } else
- pAcc = &((*pAcc)->next);
- }
-#endif
-
-#ifdef DEBUG
- ErrorF("base: 0x%lx alignment: 0x%lx host alignment: 0x%lx size[bit]: 0x%x\n",
- (*p_base),alignment,PCI_SIZE(type,tag,alignment),(*p_size));
- xf86MsgVerb(X_INFO, 3, "window:\n");
- xf86PrintResList(3, w);
- if (w_2nd)
- xf86MsgVerb(X_INFO, 3, "2nd window:\n");
- xf86PrintResList(3, w_2nd);
- xf86ErrorFVerb(3,"avoid:\n");
- xf86PrintResList(3,avoid);
-#endif
- w_tmp = w;
- while (w) {
- if ((type & ResTypeMask) == (w->res_type & ResTypeMask)) {
-#ifdef DEBUG
- ErrorF("block_begin: 0x%lx block_end: 0x%lx\n",w->block_begin,
- w->block_end);
-#endif
- range = xf86GetBlock(type,PCI_SIZE(type,tag,alignment + 1),
- w->block_begin, w->block_end,
- PCI_SIZE(type,tag,alignment),avoid);
- if (range.type != ResEnd)
- break;
- }
- w = w->next;
- }
- xf86FreeResList(w_tmp);
- /* if unsuccessful and memory prefetchable try non-prefetchable */
- if (range.type == ResEnd && w_2nd) {
- w_tmp = w_2nd;
- while (w_2nd) {
- if ((type & ResTypeMask) == (w_2nd->res_type & ResTypeMask)) {
-#ifdef DEBUG
- ErrorF("block_begin: 0x%lx block_end: 0x%lx\n",w_2nd->block_begin,
- w_2nd->block_end);
-#endif
- range = xf86GetBlock(type,PCI_SIZE(type,tag,alignment + 1),
- w_2nd->block_begin, w_2nd->block_end,
- PCI_SIZE(type,tag,alignment),avoid);
- if (range.type != ResEnd)
- break;
- }
- w_2nd = w_2nd->next;
- }
- xf86FreeResList(w_tmp);
- }
- xf86FreeResList(avoid);
+ pci_device_cfg_read_u16( dev, & temp, PCI_PCI_BRIDGE_CONTROL_REG );
+ ptr->busdep.pci.save.control = temp & ~PCI_PCI_BRIDGE_SECONDARY_RESET;
- if (range.type == ResEnd) {
- xf86MsgVerb(X_ERROR,3,"Cannot find a replacement memory range\n");
- xf86FreeResList(Acc);
- Acc = orgAcc;
- return FALSE;
+ /* Allow master aborts to complete normally on non-root buses */
+ if ( ptr->busdep.pci.save.control & PCI_PCI_BRIDGE_MASTER_ABORT_EN ) {
+ temp = ptr->busdep.pci.save.control & ~PCI_PCI_BRIDGE_MASTER_ABORT_EN;
+ pci_device_cfg_read_u16( dev, & temp, PCI_PCI_BRIDGE_CONTROL_REG );
}
- xf86FreeResList(orgAcc);
-#ifdef DEBUG
- ErrorF("begin: 0x%lx, end: 0x%lx\n",range.a,range.b);
#endif
-
- (*p_size) = 0;
- while (alignment >> (*p_size))
- (*p_size)++;
- (*p_base) = H2B(tag,range.rBegin,type);
-#ifdef DEBUG
- ErrorF("New PCI res %i base: 0x%lx, size: 0x%lx, type %s\n",
- res_n,(*p_base),(1L << (*p_size)),
- ((type & ResPhysMask) == ResMem) ? "Mem" : "Io");
-#endif
- if (res_n != 0xff) {
- if ((type & ResPhysMask) == ResMem)
- pvp->memBase[prt] = range.rBegin;
- else
- pvp->ioBase[prt] = range.rBegin;
- ((CARD32 *)(&(pcp->pci_base0)))[res_n] =
- (CARD32)(*p_base) | (CARD32)(p_type);
- pciWriteLong(tag, PCI_CMD_BASE_REG + res_n * sizeof(CARD32),
- ((CARD32 *)(&(pcp->pci_base0)))[res_n]);
- if (PCI_MAP_IS64BITMEM(p_type)) {
-#if defined(LONG64) || defined(WORD64)
- ((CARD32 *)(&(pcp->pci_base0)))[res_n + 1] =
- (CARD32)(*p_base >> 32);
- pciWriteLong(tag, PCI_CMD_BASE_REG + (res_n + 1) * sizeof(CARD32),
- ((CARD32 *)(&(pcp->pci_base0)))[res_n + 1]);
-#else
- ((CARD32 *)(&(pcp->pci_base0)))[res_n + 1] = 0;
- pciWriteLong(tag, PCI_CMD_BASE_REG + (res_n + 1) * sizeof(CARD32),
- 0);
-#endif
- }
- } else {
- pvp->biosBase = range.rBegin;
- pcp->pci_baserom = (pciReadLong(tag,PCI_CMD_BIOS_REG) & 0x01) |
- (CARD32)(*p_base);
- pciWriteLong(tag, PCI_CMD_BIOS_REG, pcp->pci_baserom);
- }
- /* @@@ fake BIOS allocated resource */
- range.type |= ResBios;
- Acc = xf86AddResToList(Acc, &range,-1);
-
- return TRUE;
-
-}
-
-_X_EXPORT Bool
-xf86FixPciResource(int entityIndex, int prt, memType alignment,
- unsigned long type)
-{
- pciVideoPtr pvp = xf86GetPciInfoForEntity(entityIndex);
- return fixPciResource(prt, alignment, pvp, type);
-}
-
-_X_EXPORT resPtr
-xf86ReallocatePciResources(int entityIndex, resPtr pRes)
-{
- pciVideoPtr pvp = xf86GetPciInfoForEntity(entityIndex);
- resPtr pBad = NULL,pResTmp;
- unsigned int prt = 0;
- int i;
-
- if (!pvp) return pRes;
-
- while (pRes) {
- switch (pRes->res_type & ResPhysMask) {
- case ResMem:
- if (pRes->block_begin == B2M(TAG(pvp),pvp->biosBase) &&
- pRes->block_end == B2M(TAG(pvp),pvp->biosBase
- + SIZE(pvp->biosSize)))
- prt = 6;
- else for (i = 0 ; i < 6; i++)
- if ((pRes->block_begin == B2M(TAG(pvp),pvp->memBase[i]))
- && (pRes->block_end == B2M(TAG(pvp),pvp->memBase[i]
- + SIZE(pvp->size[i])))) {
- prt = i;
- break;
- }
- break;
- case ResIo:
- for (i = 0 ; i < 6; i++)
- if (pRes->block_begin == B2I(TAG(pvp),pvp->ioBase[i])
- && pRes->block_end == B2I(TAG(pvp),pvp->ioBase[i]
- + SIZE(pvp->size[i]))) {
- prt = i;
- break;
- }
- break;
- }
-
- if (!prt) return pRes;
-
- pResTmp = pRes->next;
- if (! fixPciResource(prt, 0, pvp, pRes->res_type)) {
- pRes->next = pBad;
- pBad = pRes;
- } else
- xfree(pRes);
-
- pRes = pResTmp;
- }
- return pBad;
-}
-
-/*
- * BIOS releated
- */
-static resPtr
-getOwnResources(pciVideoPtr pvp, resPtr mem)
-{
- resRange range;
- int i;
- /* Make sure we don't conflict with our own mem resources */
- for (i = 0; i < 6; i++) {
- if (!pvp->memBase[i])
- continue;
- P_M_RANGE(range,TAG(pvp),pvp->memBase[i],pvp->size[i],
- ResExcMemBlock);
- mem = xf86AddResToList(mem,&range,-1);
- }
- return mem;
}
+/* move to OS layer */
+#define MASKBITS (PCI_PCI_BRIDGE_VGA_EN | PCI_PCI_BRIDGE_MASTER_ABORT_EN)
static void
-getPciRangesForMapping(pciVideoPtr pvp, resPtr *map, resPtr *avoid)
-{
- PciBusPtr pbp;
- resPtr tmp;
-
- *avoid = xf86DupResList(pciAvoidRes);
-
- pbp = xf86PciBus;
- while (pbp) {
- if (pbp->secondary == pvp->bus) {
- if (pbp->preferred_pmem)
- tmp = xf86DupResList(pbp->preferred_pmem);
- else
- tmp = xf86DupResList(pbp->pmem);
- *map = xf86JoinResLists(*map,tmp);
- if (pbp->preferred_mem)
- tmp = xf86DupResList(pbp->preferred_mem);
- else
- tmp = xf86DupResList(pbp->mem);
- *map = xf86JoinResLists(*map,tmp);
- tmp = *map;
- while (tmp) {
- tmp->block_end = min(tmp->block_end,PCI_MEM32_LENGTH_MAX);
- tmp = tmp->next;
- }
- } else if ((pbp->primary == pvp->bus) &&
- (pbp->secondary >= 0) &&
- (pbp->primary != pbp->secondary)) {
- tmp = xf86DupResList(pbp->preferred_pmem);
- *avoid = xf86JoinResLists(*avoid, tmp);
- tmp = xf86DupResList(pbp->pmem);
- *avoid = xf86JoinResLists(*avoid, tmp);
- tmp = xf86DupResList(pbp->preferred_mem);
- *avoid = xf86JoinResLists(*avoid, tmp);
- tmp = xf86DupResList(pbp->mem);
- *avoid = xf86JoinResLists(*avoid, tmp);
- }
- pbp = pbp->next;
- }
- pciConvertListToHost(pvp->bus,pvp->device,pvp->func, *avoid);
- pciConvertListToHost(pvp->bus,pvp->device,pvp->func, *map);
-}
-
-static memType
-findPciRange(PCITAG tag, resPtr m, resPtr avoid, CARD32 size)
-{
- resRange range;
- CARD32 alignment = (1 << size) - 1;
-
- while (m) {
- range = xf86GetBlock(RANGE_TYPE(ResExcMemBlock, xf86GetPciDomain(tag)),
- PCI_SIZE(ResMem, tag, 1 << size),
- m->block_begin, m->block_end,
- PCI_SIZE(ResMem, tag, alignment),
- avoid);
- if (range.type != ResEnd) {
- return M2B(tag, range.rBase);
- }
- m = m->next;
- }
- return 0;
-}
-
-static pciVideoPtr
-getPciVideoPtr(PCITAG tag)
+restorePciBusState(BusAccPtr ptr)
{
- int n = 0;
-
- pciVideoPtr pvp = NULL;
- if (!xf86PciVideoInfo) return 0;
-
- while ((pvp = xf86PciVideoInfo[n++])) {
- if (pciTag(pvp->bus,pvp->device,pvp->func) == tag)
- return pvp;
- }
- return NULL;
-}
+#if 0
+ struct pci_device * const dev = ptr->busdep.pci.dev;
+ uint16_t ctrl;
-memType
-getValidBIOSBase(PCITAG tag, int num)
-{
- pciVideoPtr pvp = NULL;
- memType ret;
- CARD32 biosSize;
- resPtr mem = NULL;
- resPtr avoid = NULL, m = NULL;
- resRange range;
-
- pvp = getPciVideoPtr(tag);
-
- if (!pvp) return 0;
-
- biosSize = pvp->biosSize;
-
- if (biosSize > 24)
- biosSize = 24;
-
- switch ((romBaseSource)num) {
- case ROM_BASE_PRESET:
- return 0; /* This should not happen */
- case ROM_BASE_BIOS:
- /* In some cases the BIOS base register contains the size mask */
- if ((memType)(-1 << biosSize) == PCIGETROM(pvp->biosBase))
- return 0;
- mem = getOwnResources(pvp,mem);
- P_M_RANGE(range, tag, pvp->biosBase,biosSize,ResExcMemBlock);
- ret = pvp->biosBase;
- break;
- case ROM_BASE_MEM0:
- case ROM_BASE_MEM1:
- case ROM_BASE_MEM2:
- case ROM_BASE_MEM3:
- case ROM_BASE_MEM4:
- case ROM_BASE_MEM5:
- if (!pvp->memBase[num] || (pvp->size[num] < biosSize))
- return 0;
- P_M_RANGE(range, tag ,pvp->memBase[num],biosSize,
- ResExcMemBlock);
- ret = pvp->memBase[num];
- break;
- case ROM_BASE_FIND:
- ret = 0;
- break;
- default:
- return 0; /* This should not happen */
- }
+ /* Only restore the bits we've changed (and don't cause resets) */
+ pci_device_cfg_read_u16( dev, & ctrl, PCI_PCI_BRIDGE_CONTROL_REG );
- /* Now find the ranges for validation */
- getPciRangesForMapping(pvp,&m,&avoid);
-
- if (!ret) {
- /* Return a possible window */
- ret = findPciRange(tag,m,avoid,biosSize);
- } else {
-#if !defined(__ia64__) /* on ia64, trust the kernel, don't look for overlaps */
- if (mem)
- pciConvertListToHost(pvp->bus,pvp->device,pvp->func, mem);
- if (!xf86IsSubsetOf(range, m) ||
- ChkConflict(&range, avoid, SETUP)
- || (mem && ChkConflict(&range, mem, SETUP)))
- ret = 0;
-#endif
+ if ((ctrl ^ ptr->busdep.pci.save.control) & MASKBITS) {
+ ctrl &= ~(MASKBITS | PCI_PCI_BRIDGE_SECONDARY_RESET);
+ ctrl |= ptr->busdep.pci.save.control & MASKBITS;
+ pci_device_cfg_write_u16(dev, ctrl, PCI_PCI_BRIDGE_CONTROL_REG);
}
-
- xf86FreeResList(avoid);
- xf86FreeResList(m);
- return ret;
+#endif
}
+#undef MASKBITS
-memType
-getEmptyPciRange(PCITAG tag, int base_reg)
-{
- resPtr avoid = NULL, m = NULL;
- memType ret;
-
- pciVideoPtr pvp = getPciVideoPtr(tag);
- if (!pvp) return 0;
- getPciRangesForMapping(pvp,&m,&avoid);
- ret = findPciRange(tag,m,avoid,pvp->size[base_reg]);
- xf86FreeResList(avoid);
- xf86FreeResList(m);
-
- return ret;
-}
/*
* xf86Bus.c interface
@@ -1684,972 +470,42 @@ getEmptyPciRange(PCITAG tag, int base_reg)
void
xf86PciProbe(void)
{
- /*
- * Initialise the pcidata entry points.
- */
- xf86SetupPciIds = (ScanPciSetupProcPtr)LoaderSymbol("ScanPciSetupPciIds");
- xf86ClosePciIds = (ScanPciCloseProcPtr)LoaderSymbol("ScanPciClosePciIds");
- xf86FindPciNamesByDevice =
- (ScanPciFindByDeviceProcPtr)LoaderSymbol("ScanPciFindPciNamesByDevice");
- xf86FindPciNamesBySubsys =
- (ScanPciFindBySubsysProcPtr)LoaderSymbol("ScanPciFindPciNamesBySubsys");
-
- if (!xf86SetupPciIds())
- FatalError("xf86SetupPciIds() failed\n");
-
FindPCIVideoInfo();
}
-static void alignBridgeRanges(PciBusPtr PciBusBase, PciBusPtr primary);
-
-static void
-printBridgeInfo(PciBusPtr PciBus)
-{
- char primary[8], secondary[8], subordinate[8], brbus[8];
-
- xf86FormatPciBusNumber(PciBus->primary, primary);
- xf86FormatPciBusNumber(PciBus->secondary, secondary);
- xf86FormatPciBusNumber(PciBus->subordinate, subordinate);
- xf86FormatPciBusNumber(PciBus->brbus, brbus);
-
- xf86MsgVerb(X_INFO, 3, "Bus %s: bridge is at (%s:%d:%d), (%s,%s,%s),"
- " BCTRL: 0x%04x (VGA_EN is %s)\n",
- secondary, brbus, PciBus->brdev, PciBus->brfunc,
- primary, secondary, subordinate, PciBus->brcontrol,
- (PciBus->brcontrol & PCI_PCI_BRIDGE_VGA_EN) ?
- "set" : "cleared");
- if (PciBus->preferred_io) {
- xf86MsgVerb(X_INFO, 3,
- "Bus %s I/O range:\n", secondary);
- xf86PrintResList(3, PciBus->preferred_io);
- }
- if (PciBus->preferred_mem) {
- xf86MsgVerb(X_INFO, 3,
- "Bus %s non-prefetchable memory range:\n", secondary);
- xf86PrintResList(3, PciBus->preferred_mem);
- }
- if (PciBus->preferred_pmem) {
- xf86MsgVerb(X_INFO, 3,
- "Bus %s prefetchable memory range:\n", secondary);
- xf86PrintResList(3, PciBus->preferred_pmem);
- }
-}
-
-static PciBusPtr
-xf86GetPciBridgeInfo(void)
-{
- const pciConfigPtr *pcrpp;
- pciConfigPtr pcrp;
- pciBusInfo_t *pBusInfo;
- resRange range;
- PciBusPtr PciBus, PciBusBase = NULL;
- PciBusPtr *pnPciBus = &PciBusBase;
- int MaxBus = 0;
- int i, domain;
- int primary, secondary, subordinate;
- memType base, limit;
-
- resPtr pciBusAccWindows = xf86PciBusAccWindowsFromOS();
-
- if (xf86PciInfo == NULL)
- return NULL;
-
- /* Add each bridge */
- for (pcrpp = xf86PciInfo, pcrp = *pcrpp; pcrp; pcrp = *(++pcrpp)) {
- if (pcrp->busnum > MaxBus)
- MaxBus = pcrp->busnum;
- if ( pcrp->pci_base_class == PCI_CLASS_BRIDGE ) {
- const int sub_class = pcrp->pci_sub_class;
-
- domain = xf86GetPciDomain(pcrp->tag);
-
- switch (sub_class) {
- case PCI_SUBCLASS_BRIDGE_PCI:
- /* something fishy about the header? If so: just ignore! */
- if ((pcrp->pci_header_type & 0x7f) != 0x01) {
- xf86MsgVerb(X_WARNING, 3, "PCI-PCI bridge at %x:%x:%x has"
- " unexpected header: 0x%x",
- pcrp->busnum, pcrp->devnum,
- pcrp->funcnum, pcrp->pci_header_type);
- break;
- }
-
- domain = pcrp->busnum & 0x0000FF00;
- primary = pcrp->busnum;
- secondary = domain | pcrp->pci_secondary_bus_number;
- subordinate = domain | pcrp->pci_subordinate_bus_number;
-
- /* Is this the correct bridge? If not, ignore it */
- pBusInfo = pcrp->businfo;
- if (pBusInfo && (pcrp != pBusInfo->bridge)) {
- xf86MsgVerb(X_WARNING, 3, "PCI bridge mismatch for bus %x:"
- " %x:%x:%x and %x:%x:%x\n", secondary,
- pcrp->busnum, pcrp->devnum, pcrp->funcnum,
- pBusInfo->bridge->busnum,
- pBusInfo->bridge->devnum,
- pBusInfo->bridge->funcnum);
- break;
- }
-
- if (pBusInfo && pBusInfo->funcs->pciGetBridgeBuses)
- (*pBusInfo->funcs->pciGetBridgeBuses)(secondary,
- &primary,
- &secondary,
- &subordinate);
-
- if (!pcrp->fakeDevice && (primary >= secondary)) {
- xf86MsgVerb(X_WARNING, 3, "Misconfigured PCI bridge"
- " %x:%x:%x (%x,%x)\n",
- pcrp->busnum, pcrp->devnum, pcrp->funcnum,
- primary, secondary);
- break;
- }
-
- *pnPciBus = PciBus = xnfcalloc(1, sizeof(PciBusRec));
- pnPciBus = &PciBus->next;
-
- PciBus->primary = primary;
- PciBus->secondary = secondary;
- PciBus->subordinate = subordinate;
-
- PciBus->brbus = pcrp->busnum;
- PciBus->brdev = pcrp->devnum;
- PciBus->brfunc = pcrp->funcnum;
-
- PciBus->subclass = sub_class;
-
- /* The Intel bridges don't report as transparent
- but guess what they are - from Linux kernel - airlied */
- if ((pcrp->pci_vendor == PCI_VENDOR_INTEL) &&
- ((pcrp->pci_device & 0xff00) == 0x2400)) {
- xf86MsgVerb(X_INFO, 3, "Intel Bridge workaround enabled\n");
- PciBus->interface = PCI_IF_BRIDGE_PCI_SUBTRACTIVE;
- } else {
- PciBus->interface = pcrp->pci_prog_if;
- }
-
- if (pBusInfo && pBusInfo->funcs->pciControlBridge)
- PciBus->brcontrol =
- (*pBusInfo->funcs->pciControlBridge)(secondary, 0, 0);
- else
- PciBus->brcontrol = pcrp->pci_bridge_control;
-
- if (pBusInfo && pBusInfo->funcs->pciGetBridgeResources) {
- (*pBusInfo->funcs->pciGetBridgeResources)(secondary,
- (pointer *)&PciBus->preferred_io,
- (pointer *)&PciBus->preferred_mem,
- (pointer *)&PciBus->preferred_pmem);
- break;
- }
-
- if ((pcrp->pci_command & PCI_CMD_IO_ENABLE) &&
- (pcrp->pci_upper_io_base || pcrp->pci_io_base ||
- pcrp->pci_upper_io_limit || pcrp->pci_io_limit)) {
- base = (pcrp->pci_upper_io_base << 16) |
- ((pcrp->pci_io_base & 0xf0u) << 8);
- limit = (pcrp->pci_upper_io_limit << 16) |
- ((pcrp->pci_io_limit & 0xf0u) << 8) | 0x0fff;
- /*
- * Deal with bridge ISA mode (256 wide ranges spaced 1K
- * apart, but only in the first 64K).
- */
- if (pcrp->pci_bridge_control & PCI_PCI_BRIDGE_ISA_EN) {
- while ((base <= (CARD16)(-1)) && (base <= limit)) {
- PCI_I_RANGE(range, pcrp->tag,
- base, base + (CARD8)(-1),
- ResIo | ResBlock | ResExclusive);
- PciBus->preferred_io =
- xf86AddResToList(PciBus->preferred_io,
- &range, -1);
- base += 0x0400;
- }
- }
- if (base <= limit) {
- PCI_I_RANGE(range, pcrp->tag, base, limit,
- ResIo | ResBlock | ResExclusive);
- PciBus->preferred_io =
- xf86AddResToList(PciBus->preferred_io, &range, -1);
- }
- }
- if (pcrp->pci_command & PCI_CMD_MEM_ENABLE) {
- /*
- * The P2P spec requires these next two, but some bridges
- * don't comply. Err on the side of caution, making the not
- * so bold assumption that no bridge would ever re-route the
- * bottom megabyte.
- */
- if (pcrp->pci_mem_base || pcrp->pci_mem_limit) {
- base = pcrp->pci_mem_base & 0xfff0u;
- limit = pcrp->pci_mem_limit & 0xfff0u;
- if (base <= limit) {
- PCI_M_RANGE(range, pcrp->tag,
- base << 16, (limit << 16) | 0x0fffff,
- ResMem | ResBlock | ResExclusive);
- PciBus->preferred_mem =
- xf86AddResToList(PciBus->preferred_mem, &range, -1);
- }
- }
-
- if (pcrp->pci_prefetch_mem_base ||
- pcrp->pci_prefetch_mem_limit ||
- pcrp->pci_prefetch_upper_mem_base ||
- pcrp->pci_prefetch_upper_mem_limit) {
- base = pcrp->pci_prefetch_mem_base & 0xfff0u;
- limit = pcrp->pci_prefetch_mem_limit & 0xfff0u;
-#if defined(LONG64) || defined(WORD64)
- base |= (memType)pcrp->pci_prefetch_upper_mem_base << 16;
- limit |= (memType)pcrp->pci_prefetch_upper_mem_limit << 16;
-#endif
- if (base <= limit) {
- PCI_M_RANGE(range, pcrp->tag,
- base << 16, (limit << 16) | 0xfffff,
- ResMem | ResBlock | ResExclusive);
- PciBus->preferred_pmem =
- xf86AddResToList(PciBus->preferred_pmem,
- &range, -1);
- }
- }
- }
- break;
-
- case PCI_SUBCLASS_BRIDGE_CARDBUS:
- /* something fishy about the header? If so: just ignore! */
- if ((pcrp->pci_header_type & 0x7f) != 0x02) {
- xf86MsgVerb(X_WARNING, 3, "PCI-CardBus bridge at %x:%x:%x"
- " has unexpected header: 0x%x",
- pcrp->busnum, pcrp->devnum,
- pcrp->funcnum, pcrp->pci_header_type);
- break;
- }
-
- domain = pcrp->busnum & 0x0000FF00;
- primary = pcrp->busnum;
- secondary = domain | pcrp->pci_cb_cardbus_bus_number;
- subordinate = domain | pcrp->pci_subordinate_bus_number;
-
- /* Is this the correct bridge? If not, ignore it */
- pBusInfo = pcrp->businfo;
- if (pBusInfo && (pcrp != pBusInfo->bridge)) {
- xf86MsgVerb(X_WARNING, 3, "CardBus bridge mismatch for bus"
- " %x: %x:%x:%x and %x:%x:%x\n", secondary,
- pcrp->busnum, pcrp->devnum, pcrp->funcnum,
- pBusInfo->bridge->busnum,
- pBusInfo->bridge->devnum,
- pBusInfo->bridge->funcnum);
- break;
- }
-
- if (pBusInfo && pBusInfo->funcs->pciGetBridgeBuses)
- (*pBusInfo->funcs->pciGetBridgeBuses)(secondary,
- &primary,
- &secondary,
- &subordinate);
-
- if (primary >= secondary) {
- if (pcrp->pci_cb_cardbus_bus_number != 0)
- xf86MsgVerb(X_WARNING, 3, "Misconfigured CardBus"
- " bridge %x:%x:%x (%x,%x)\n",
- pcrp->busnum, pcrp->devnum, pcrp->funcnum,
- primary, secondary);
- break;
- }
-
- *pnPciBus = PciBus = xnfcalloc(1, sizeof(PciBusRec));
- pnPciBus = &PciBus->next;
-
- PciBus->primary = primary;
- PciBus->secondary = secondary;
- PciBus->subordinate = subordinate;
-
- PciBus->brbus = pcrp->busnum;
- PciBus->brdev = pcrp->devnum;
- PciBus->brfunc = pcrp->funcnum;
-
- PciBus->subclass = sub_class;
- PciBus->interface = pcrp->pci_prog_if;
-
- if (pBusInfo && pBusInfo->funcs->pciControlBridge)
- PciBus->brcontrol =
- (*pBusInfo->funcs->pciControlBridge)(secondary, 0, 0);
- else
- PciBus->brcontrol = pcrp->pci_bridge_control;
-
- if (pBusInfo && pBusInfo->funcs->pciGetBridgeResources) {
- (*pBusInfo->funcs->pciGetBridgeResources)(secondary,
- (pointer *)&PciBus->preferred_io,
- (pointer *)&PciBus->preferred_mem,
- (pointer *)&PciBus->preferred_pmem);
- break;
- }
-
- if (pcrp->pci_command & PCI_CMD_IO_ENABLE) {
- if (pcrp->pci_cb_iobase0) {
- base = PCI_CB_IOBASE(pcrp->pci_cb_iobase0);
- limit = PCI_CB_IOLIMIT(pcrp->pci_cb_iolimit0);
-
- /*
- * Deal with bridge ISA mode (256-wide ranges spaced 1K
- * apart (start to start), but only in the first 64K).
- */
- if (pcrp->pci_bridge_control & PCI_PCI_BRIDGE_ISA_EN) {
- while ((base <= (CARD16)(-1)) &&
- (base <= limit)) {
- PCI_I_RANGE(range, pcrp->tag,
- base, base + (CARD8)(-1),
- ResIo | ResBlock | ResExclusive);
- PciBus->preferred_io =
- xf86AddResToList(PciBus->preferred_io,
- &range, -1);
- base += 0x0400;
- }
- }
-
- if (base <= limit) {
- PCI_I_RANGE(range, pcrp->tag, base, limit,
- ResIo | ResBlock | ResExclusive);
- PciBus->preferred_io =
- xf86AddResToList(PciBus->preferred_io,
- &range, -1);
- }
- }
-
- if (pcrp->pci_cb_iobase1) {
- base = PCI_CB_IOBASE(pcrp->pci_cb_iobase1);
- limit = PCI_CB_IOLIMIT(pcrp->pci_cb_iolimit1);
-
- /*
- * Deal with bridge ISA mode (256-wide ranges spaced 1K
- * apart (start to start), but only in the first 64K).
- */
- if (pcrp->pci_bridge_control & PCI_PCI_BRIDGE_ISA_EN) {
- while ((base <= (CARD16)(-1)) &&
- (base <= limit)) {
- PCI_I_RANGE(range, pcrp->tag,
- base, base + (CARD8)(-1),
- ResIo | ResBlock | ResExclusive);
- PciBus->preferred_io =
- xf86AddResToList(PciBus->preferred_io,
- &range, -1);
- base += 0x0400;
- }
- }
-
- if (base <= limit) {
- PCI_I_RANGE(range, pcrp->tag, base, limit,
- ResIo | ResBlock | ResExclusive);
- PciBus->preferred_io =
- xf86AddResToList(PciBus->preferred_io,
- &range, -1);
- }
- }
- }
-
- if (pcrp->pci_command & PCI_CMD_MEM_ENABLE) {
- if ((pcrp->pci_cb_membase0) &&
- (pcrp->pci_cb_membase0 <= pcrp->pci_cb_memlimit0)) {
- PCI_M_RANGE(range, pcrp->tag,
- pcrp->pci_cb_membase0 & ~0x0fff,
- pcrp->pci_cb_memlimit0 | 0x0fff,
- ResMem | ResBlock | ResExclusive);
- if (pcrp->pci_bridge_control &
- PCI_CB_BRIDGE_CTL_PREFETCH_MEM0)
- PciBus->preferred_pmem =
- xf86AddResToList(PciBus->preferred_pmem,
- &range, -1);
- else
- PciBus->preferred_mem =
- xf86AddResToList(PciBus->preferred_mem,
- &range, -1);
- }
- if ((pcrp->pci_cb_membase1) &&
- (pcrp->pci_cb_membase1 <= pcrp->pci_cb_memlimit1)) {
- PCI_M_RANGE(range, pcrp->tag,
- pcrp->pci_cb_membase1 & ~0x0fff,
- pcrp->pci_cb_memlimit1 | 0x0fff,
- ResMem | ResBlock | ResExclusive);
- if (pcrp->pci_bridge_control &
- PCI_CB_BRIDGE_CTL_PREFETCH_MEM1)
- PciBus->preferred_pmem =
- xf86AddResToList(PciBus->preferred_pmem,
- &range, -1);
- else
- PciBus->preferred_mem =
- xf86AddResToList(PciBus->preferred_mem,
- &range, -1);
- }
- }
-
- break;
-
- case PCI_SUBCLASS_BRIDGE_ISA:
- case PCI_SUBCLASS_BRIDGE_EISA:
- case PCI_SUBCLASS_BRIDGE_MC:
- *pnPciBus = PciBus = xnfcalloc(1, sizeof(PciBusRec));
- pnPciBus = &PciBus->next;
- PciBus->primary = pcrp->busnum;
- PciBus->secondary = PciBus->subordinate = -1;
- PciBus->brbus = pcrp->busnum;
- PciBus->brdev = pcrp->devnum;
- PciBus->brfunc = pcrp->funcnum;
- PciBus->subclass = sub_class;
- PciBus->brcontrol = PCI_PCI_BRIDGE_VGA_EN;
- break;
-
- case PCI_SUBCLASS_BRIDGE_HOST:
- /* Is this the correct bridge? If not, ignore bus info */
- pBusInfo = pcrp->businfo;
-
- if (!pBusInfo || pBusInfo == HOST_NO_BUS)
- break;
-
- secondary = 0;
- /* Find "secondary" bus segment */
- while (pBusInfo != pciBusInfo[secondary])
- secondary++;
- if (pcrp != pBusInfo->bridge) {
- xf86MsgVerb(X_WARNING, 3, "Host bridge mismatch for"
- " bus %x: %x:%x:%x and %x:%x:%x\n",
- pBusInfo->primary_bus,
- pcrp->busnum, pcrp->devnum, pcrp->funcnum,
- pBusInfo->bridge->busnum,
- pBusInfo->bridge->devnum,
- pBusInfo->bridge->funcnum);
- pBusInfo = NULL;
- }
-
- *pnPciBus = PciBus = xnfcalloc(1, sizeof(PciBusRec));
- pnPciBus = &PciBus->next;
-
-
- PciBus->primary = PciBus->secondary = secondary;
- PciBus->subordinate = pciNumBuses - 1;
-
- if (pBusInfo->funcs->pciGetBridgeBuses)
- (*pBusInfo->funcs->pciGetBridgeBuses)
- (secondary,
- &PciBus->primary,
- &PciBus->secondary,
- &PciBus->subordinate);
-
- PciBus->brbus = pcrp->busnum;
- PciBus->brdev = pcrp->devnum;
- PciBus->brfunc = pcrp->funcnum;
-
- PciBus->subclass = sub_class;
-
- if (pBusInfo && pBusInfo->funcs->pciControlBridge)
- PciBus->brcontrol =
- (*pBusInfo->funcs->pciControlBridge)(secondary, 0, 0);
- else
- PciBus->brcontrol = PCI_PCI_BRIDGE_VGA_EN;
-
- if (pBusInfo && pBusInfo->funcs->pciGetBridgeResources) {
- (*pBusInfo->funcs->pciGetBridgeResources)
- (secondary,
- (pointer *)&PciBus->preferred_io,
- (pointer *)&PciBus->preferred_mem,
- (pointer *)&PciBus->preferred_pmem);
- break;
- }
-
- PciBus->preferred_io =
- xf86ExtractTypeFromList(pciBusAccWindows,
- RANGE_TYPE(ResIo, domain));
- PciBus->preferred_mem =
- xf86ExtractTypeFromList(pciBusAccWindows,
- RANGE_TYPE(ResMem, domain));
- PciBus->preferred_pmem =
- xf86ExtractTypeFromList(pciBusAccWindows,
- RANGE_TYPE(ResMem, domain));
- break;
-
- default:
- break;
- }
- }
- }
- for (i = 0; i <= MaxBus; i++) { /* find PCI buses not attached to bridge */
- if (!pciBusInfo[i])
- continue;
- for (PciBus = PciBusBase; PciBus; PciBus = PciBus->next)
- if (PciBus->secondary == i) break;
- if (!PciBus) { /* We assume it's behind a HOST-PCI bridge */
- /*
- * Find the 'smallest' free HOST-PCI bridge, where 'small' is in
- * the order of pciTag().
- */
- PCITAG minTag = 0xFFFFFFFF, tag;
- PciBusPtr PciBusFound = NULL;
- for (PciBus = PciBusBase; PciBus; PciBus = PciBus->next)
- if ((PciBus->subclass == PCI_SUBCLASS_BRIDGE_HOST) &&
- (PciBus->secondary == -1) &&
- ((tag = pciTag(PciBus->brbus,PciBus->brdev,PciBus->brfunc))
- < minTag) ) {
- minTag = tag;
- PciBusFound = PciBus;
- }
- if (PciBusFound)
- PciBusFound->secondary = i;
- else { /* if nothing found it may not be visible: create new */
- /* Find a device on this bus */
- domain = 0;
- for (pcrpp = xf86PciInfo; (pcrp = *pcrpp); pcrpp++) {
- if (pcrp->busnum == i) {
- domain = xf86GetPciDomain(pcrp->tag);
- break;
- }
- }
- *pnPciBus = PciBus = xnfcalloc(1, sizeof(PciBusRec));
- pnPciBus = &PciBus->next;
- PciBus->primary = PciBus->secondary = i;
- PciBus->subclass = PCI_SUBCLASS_BRIDGE_HOST;
- PciBus->brcontrol = PCI_PCI_BRIDGE_VGA_EN;
- PciBus->preferred_io =
- xf86ExtractTypeFromList(pciBusAccWindows,
- RANGE_TYPE(ResIo, domain));
- PciBus->preferred_mem =
- xf86ExtractTypeFromList(pciBusAccWindows,
- RANGE_TYPE(ResMem, domain));
- PciBus->preferred_pmem =
- xf86ExtractTypeFromList(pciBusAccWindows,
- RANGE_TYPE(ResMem, domain));
- }
- }
- }
-
- for (PciBus = PciBusBase; PciBus; PciBus = PciBus->next) {
- if (PciBus->primary == PciBus->secondary) {
- alignBridgeRanges(PciBusBase, PciBus);
- }
- }
-
- for (PciBus = PciBusBase; PciBus; PciBus = PciBus->next) {
- switch (PciBus->subclass) {
- case PCI_SUBCLASS_BRIDGE_PCI:
- if (PciBus->interface == PCI_IF_BRIDGE_PCI_SUBTRACTIVE)
- xf86MsgVerb(X_INFO, 3, "Subtractive PCI-to-PCI bridge:\n");
- else
- xf86MsgVerb(X_INFO, 3, "PCI-to-PCI bridge:\n");
- break;
- case PCI_SUBCLASS_BRIDGE_CARDBUS:
- xf86MsgVerb(X_INFO, 3, "PCI-to-CardBus bridge:\n");
- break;
- case PCI_SUBCLASS_BRIDGE_HOST:
- xf86MsgVerb(X_INFO, 3, "Host-to-PCI bridge:\n");
- break;
- case PCI_SUBCLASS_BRIDGE_ISA:
- xf86MsgVerb(X_INFO, 3, "PCI-to-ISA bridge:\n");
- break;
- case PCI_SUBCLASS_BRIDGE_EISA:
- xf86MsgVerb(X_INFO, 3, "PCI-to-EISA bridge:\n");
- break;
- case PCI_SUBCLASS_BRIDGE_MC:
- xf86MsgVerb(X_INFO, 3, "PCI-to-MCA bridge:\n");
- break;
- default:
- break;
- }
- printBridgeInfo(PciBus);
- }
- xf86FreeResList(pciBusAccWindows);
- return PciBusBase;
-}
-
-static void
-alignBridgeRanges(PciBusPtr PciBusBase, PciBusPtr primary)
-{
- PciBusPtr PciBus;
-
- for (PciBus = PciBusBase; PciBus; PciBus = PciBus->next) {
- if ((PciBus != primary) && (PciBus->primary != -1)
- && (PciBus->primary == primary->secondary)) {
- resPtr tmp;
- tmp = xf86FindIntersectOfLists(primary->preferred_io,
- PciBus->preferred_io);
- xf86FreeResList(PciBus->preferred_io);
- PciBus->preferred_io = tmp;
- tmp = xf86FindIntersectOfLists(primary->preferred_pmem,
- PciBus->preferred_pmem);
- xf86FreeResList(PciBus->preferred_pmem);
- PciBus->preferred_pmem = tmp;
- tmp = xf86FindIntersectOfLists(primary->preferred_mem,
- PciBus->preferred_mem);
- xf86FreeResList(PciBus->preferred_mem);
- PciBus->preferred_mem = tmp;
-
- /* Deal with subtractive decoding */
- switch (PciBus->subclass) {
- case PCI_SUBCLASS_BRIDGE_PCI:
- if (PciBus->interface != PCI_IF_BRIDGE_PCI_SUBTRACTIVE)
- break;
- /* Fall through */
-#if 0 /* Not yet */
- case PCI_SUBCLASS_BRIDGE_ISA:
- case PCI_SUBCLASS_BRIDGE_EISA:
- case PCI_SUBCLASS_BRIDGE_MC:
-#endif
- if (!(PciBus->io = primary->io))
- PciBus->io = primary->preferred_io;
- if (!(PciBus->mem = primary->mem))
- PciBus->mem = primary->preferred_mem;
- if (!(PciBus->pmem = primary->pmem))
- PciBus->pmem = primary->preferred_pmem;
- default:
- break;
- }
-
- alignBridgeRanges(PciBusBase, PciBus);
- }
- }
-}
-
-void
-ValidatePci(void)
-{
- pciVideoPtr pvp, pvp1;
- PciBusPtr pbp;
- pciConfigPtr pcrp, *pcrpp;
- CARD32 *basep;
- resPtr Sys;
- resRange range;
- int n = 0, m, i;
-
- if (!xf86PciVideoInfo) return;
-
- /*
- * Mark all pciInfoRecs that need to be validated. These are
- * the ones which have been assigned to a screen.
- */
- Sys = xf86DupResList(osRes);
- /* Only validate graphics devices in use */
- for (i=0; i<xf86NumScreens; i++) {
- for (m = 0; m < xf86Screens[i]->numEntities; m++)
- if ((pvp = xf86GetPciInfoForEntity(xf86Screens[i]->entityList[m])))
- pvp->validate = TRUE;
- }
-
- /*
- * Collect all background PCI resources we need to validate against.
- * These are all resources which don't belong to PCINONSYSTEMCLASSES
- * and which have not been assigned to an entity.
- */
- /* First get the PCIINFOCLASSES */
- m = 0;
- while ((pvp = xf86PciVideoInfo[m++])) {
- /* is it a PCINONSYSTEMCLASS? */
- if (PCINONSYSTEMCLASSES(pvp->class, pvp->subclass))
- continue;
- /* has it an Entity assigned to it? */
- for (i=0; i<xf86NumEntities; i++) {
- EntityPtr p = xf86Entities[i];
- if (p->busType != BUS_PCI)
- continue;
- if (p->pciBusId.bus == pvp->bus
- && p->pciBusId.device == pvp->device
- && p->pciBusId.func == pvp->func)
- break;
- }
- if (i != xf86NumEntities) /* found an Entity for this one */
- continue;
-
- for (i = 0; i<6; i++) {
- if (pvp->ioBase[i]) {
- PV_I_RANGE(range,pvp,i,ResExcIoBlock);
- Sys = xf86AddResToList(Sys,&range,-1);
- } else if (pvp->memBase[i]) {
- PV_M_RANGE(range,pvp,i,ResExcMemBlock);
- Sys = xf86AddResToList(Sys,&range,-1);
- }
- }
- }
- for (pcrpp = xf86PciInfo, pcrp = *pcrpp; pcrp; pcrp = *++(pcrpp)) {
-
- /* These were handled above */
- if (PCIINFOCLASSES(pcrp->pci_base_class, pcrp->pci_sub_class))
- continue;
-
- if ((pcrp->pci_header_type & 0x7f) ||
- !(pcrp->pci_command & (PCI_CMD_IO_ENABLE | PCI_CMD_MEM_ENABLE)))
- continue;
-
- basep = &pcrp->pci_base0;
- for (i = 0; i < 6; i++) {
- if (basep[i]) {
- if (PCI_MAP_IS_IO(basep[i])) {
- if (!(pcrp->pci_command & PCI_CMD_IO_ENABLE))
- continue;
- P_I_RANGE(range, pcrp->tag, PCIGETIO(basep[i]),
- pcrp->basesize[i], ResExcIoBlock)
- } else if (!PCI_MAP_IS64BITMEM(basep[i])) {
- if (!(pcrp->pci_command & PCI_CMD_MEM_ENABLE))
- continue;
- P_M_RANGE(range, pcrp->tag, PCIGETMEMORY(basep[i]),
- pcrp->basesize[i], ResExcMemBlock)
- } else {
- i++;
- if (!(pcrp->pci_command & PCI_CMD_MEM_ENABLE))
- continue;
-#if defined(LONG64) || defined(WORD64)
- P_M_RANGE(range, pcrp->tag, PCIGETMEMORY64(basep[i-1]),
- pcrp->basesize[i-1], ResExcMemBlock)
-#else
- if (basep[i])
- continue;
- P_M_RANGE(range, pcrp->tag, PCIGETMEMORY(basep[i-1]),
- pcrp->basesize[i-1], ResExcMemBlock)
-#endif
- }
- Sys = xf86AddResToList(Sys, &range, -1);
- }
- }
- if ((pcrp->pci_baserom) &&
- (pcrp->pci_command & PCI_CMD_MEM_ENABLE) &&
- (pcrp->pci_baserom & PCI_MAP_ROM_DECODE_ENABLE)) {
- P_M_RANGE(range,pcrp->tag,PCIGETROM(pcrp->pci_baserom),
- pcrp->basesize[6],ResExcMemBlock);
- Sys = xf86AddResToList(Sys, &range, -1);
- }
- }
-#ifdef DEBUG
- xf86MsgVerb(X_INFO, 3,"Sys:\n");
- xf86PrintResList(3,Sys);
-#endif
-
- /*
- * The order the video devices are listed in is
- * just right: the lower buses come first.
- * This way we attempt to fix a conflict of
- * a lower bus device with a higher bus device
- * where we have more room to find different
- * resources.
- */
- while ((pvp = xf86PciVideoInfo[n++])) {
- resPtr res_mp = NULL, res_m_io = NULL;
- resPtr NonSys;
- resPtr tmp, avoid = NULL;
-
- if (!pvp->validate) continue;
- NonSys = xf86DupResList(Sys);
- m = n;
- while ((pvp1 = xf86PciVideoInfo[m++])) {
- if (!pvp1->validate) continue;
- for (i = 0; i<6; i++) {
- if (pvp1->ioBase[i]) {
- PV_I_RANGE(range,pvp1,i,ResExcIoBlock);
- NonSys = xf86AddResToList(NonSys,&range,-1);
- } else if (pvp1->memBase[i]) {
- PV_M_RANGE(range,pvp1,i,ResExcMemBlock);
- NonSys = xf86AddResToList(NonSys,&range,-1);
- }
- }
- }
-#ifdef DEBUG
- xf86MsgVerb(X_INFO, 3,"NonSys:\n");
- xf86PrintResList(3,NonSys);
-#endif
- pbp = xf86PciBus;
- while (pbp) {
- if (pbp->secondary == pvp->bus) {
- if (pbp->preferred_pmem) {
- /* keep prefetchable separate */
- res_mp =
- xf86FindIntersectOfLists(pbp->preferred_pmem, ResRange);
- }
- if (pbp->pmem) {
- res_mp = xf86FindIntersectOfLists(pbp->pmem, ResRange);
- }
- if (pbp->preferred_mem) {
- res_m_io =
- xf86FindIntersectOfLists(pbp->preferred_mem, ResRange);
- }
- if (pbp->mem) {
- res_m_io = xf86FindIntersectOfLists(pbp->mem, ResRange);
- }
- if (pbp->preferred_io) {
- res_m_io = xf86JoinResLists(res_m_io,
- xf86FindIntersectOfLists(pbp->preferred_io, ResRange));
- }
- if (pbp->io) {
- res_m_io = xf86JoinResLists(res_m_io,
- xf86FindIntersectOfLists(pbp->preferred_io, ResRange));
- }
- } else if ((pbp->primary == pvp->bus) &&
- (pbp->secondary >= 0) &&
- (pbp->primary != pbp->secondary)) {
- tmp = xf86DupResList(pbp->preferred_pmem);
- avoid = xf86JoinResLists(avoid, tmp);
- tmp = xf86DupResList(pbp->preferred_mem);
- avoid = xf86JoinResLists(avoid, tmp);
- tmp = xf86DupResList(pbp->preferred_io);
- avoid = xf86JoinResLists(avoid, tmp);
- }
- pbp = pbp->next;
- }
- if (res_m_io == NULL)
- res_m_io = xf86DupResList(ResRange);
-
- pciConvertListToHost(pvp->bus,pvp->device,pvp->func, avoid);
-
-#ifdef DEBUG
- xf86MsgVerb(X_INFO, 3,"avoid:\n");
- xf86PrintResList(3,avoid);
- xf86MsgVerb(X_INFO, 3,"prefetchable Memory:\n");
- xf86PrintResList(3,res_mp);
- xf86MsgVerb(X_INFO, 3,"MEM/IO:\n");
- xf86PrintResList(3,res_m_io);
-#endif
- for (i = 0; i < 6; i++) {
- int j;
- resPtr own = NULL;
- for (j = i+1; j < 6; j++) {
- if (pvp->ioBase[j]) {
- PV_I_RANGE(range,pvp,j,ResExcIoBlock);
- own = xf86AddResToList(own,&range,-1);
- } else if (pvp->memBase[j]) {
- PV_M_RANGE(range,pvp,j,ResExcMemBlock);
- own = xf86AddResToList(own,&range,-1);
- }
- }
-#ifdef DEBUG
- xf86MsgVerb(X_INFO, 3, "own:\n");
- xf86PrintResList(3, own);
-#endif
- if (pvp->ioBase[i]) {
- PV_I_RANGE(range,pvp,i,ResExcIoBlock);
- if (xf86IsSubsetOf(range,res_m_io)
- && ! ChkConflict(&range,own,SETUP)
- && ! ChkConflict(&range,avoid,SETUP)
- && ! ChkConflict(&range,NonSys,SETUP)) {
- xf86FreeResList(own);
- continue;
- }
- xf86MsgVerb(X_WARNING, 0,
- "****INVALID IO ALLOCATION**** b: 0x%lx e: 0x%lx "
- "correcting\a\n", range.rBegin,range.rEnd);
-#ifdef DEBUG
- sleep(2);
-#endif
- fixPciResource(i, 0, pvp, range.type);
- } else if (pvp->memBase[i]) {
- PV_M_RANGE(range,pvp,i,ResExcMemBlock);
- if (pvp->type[i] & PCI_MAP_MEMORY_CACHABLE) {
- if (xf86IsSubsetOf(range,res_mp)
- && ! ChkConflict(&range,own,SETUP)
- && ! ChkConflict(&range,avoid,SETUP)
- && ! ChkConflict(&range,NonSys,SETUP)) {
- xf86FreeResList(own);
- continue;
- }
- }
- if (xf86IsSubsetOf(range,res_m_io)
- && ! ChkConflict(&range,own,SETUP)
- && ! ChkConflict(&range,avoid,SETUP)
- && ! ChkConflict(&range,NonSys,SETUP)) {
- xf86FreeResList(own);
- continue;
- }
- xf86MsgVerb(X_WARNING, 0,
- "****INVALID MEM ALLOCATION**** b: 0x%lx e: 0x%lx "
- "correcting\a\n", range.rBegin,range.rEnd);
- if (ChkConflict(&range,own,SETUP)) {
- xf86MsgVerb(X_INFO,3,"own\n");
- xf86PrintResList(3,own);
- }
- if (ChkConflict(&range,avoid,SETUP)) {
- xf86MsgVerb(X_INFO,3,"avoid\n");
- xf86PrintResList(3,avoid);
- }
- if (ChkConflict(&range,NonSys,SETUP)) {
- xf86MsgVerb(X_INFO,3,"NonSys\n");
- xf86PrintResList(3,NonSys);
- }
-
-#ifdef DEBUG
- sleep(2);
-#endif
- fixPciResource(i, 0, pvp, range.type);
- }
- xf86FreeResList(own);
- }
- xf86FreeResList(avoid);
- xf86FreeResList(NonSys);
- xf86FreeResList(res_mp);
- xf86FreeResList(res_m_io);
- }
- xf86FreeResList(Sys);
-}
-
-resList
-GetImplicitPciResources(int entityIndex)
-{
- pciVideoPtr pvp;
- int i;
- resList list = NULL;
- int num = 0;
-
- if (! (pvp = xf86GetPciInfoForEntity(entityIndex))) return NULL;
-
- for (i = 0; i < 6; i++) {
- if (pvp->ioBase[i]) {
- list = xnfrealloc(list,sizeof(resRange) * (++num));
- PV_I_RANGE(list[num - 1],pvp,i,ResShrIoBlock | ResBios);
- } else if (pvp->memBase[i]) {
- list = xnfrealloc(list,sizeof(resRange) * (++num));
- PV_M_RANGE(list[num - 1],pvp,i,ResShrMemBlock | ResBios);
- }
- }
-#if 0
- if (pvp->biosBase) {
- list = xnfrealloc(list,sizeof(resRange) * (++num));
- PV_B_RANGE(list[num - 1],pvp,ResShrMemBlock | ResBios);
- }
-#endif
- list = xnfrealloc(list,sizeof(resRange) * (++num));
- list[num - 1].type = ResEnd;
-
- return list;
-}
-
void
initPciState(void)
{
- int i = 0;
- int j = 0;
- pciVideoPtr pvp;
+ unsigned i;
pciAccPtr pcaccp;
- if (xf86PciAccInfo != NULL)
- return;
-
- if (xf86PciVideoInfo == NULL)
+ if (xf86PciVideoInfo == NULL) {
return;
+ }
+
+ for (i = 0 ; xf86PciVideoInfo[i] != NULL ; i++) {
+ struct pci_device * const pvp = xf86PciVideoInfo[i];
+
+ if (pvp->user_data == 0) {
+ pcaccp = xnfalloc( sizeof( pciAccRec ) );
+ pvp->user_data = (intptr_t) pcaccp;
- while ((pvp = xf86PciVideoInfo[i]) != NULL) {
- i++;
- j++;
- xf86PciAccInfo = xnfrealloc(xf86PciAccInfo,
- sizeof(pciAccPtr) * (j + 1));
- xf86PciAccInfo[j] = NULL;
- pcaccp = xf86PciAccInfo[j - 1] = xnfalloc(sizeof(pciAccRec));
- pcaccp->busnum = pvp->bus;
- pcaccp->devnum = pvp->device;
- pcaccp->funcnum = pvp->func;
- pcaccp->arg.tag = pciTag(pvp->bus, pvp->device, pvp->func);
- pcaccp->ioAccess.AccessDisable = pciIoAccessDisable;
- pcaccp->ioAccess.AccessEnable = pciIoAccessEnable;
- pcaccp->ioAccess.arg = &pcaccp->arg;
+ pcaccp->arg.dev = pvp;
+ pcaccp->ioAccess.AccessDisable = pciIoAccessDisable;
+ pcaccp->ioAccess.AccessEnable = pciIoAccessEnable;
+ pcaccp->ioAccess.arg = &pcaccp->arg;
pcaccp->io_memAccess.AccessDisable = pciIo_MemAccessDisable;
pcaccp->io_memAccess.AccessEnable = pciIo_MemAccessEnable;
pcaccp->io_memAccess.arg = &pcaccp->arg;
pcaccp->memAccess.AccessDisable = pciMemAccessDisable;
pcaccp->memAccess.AccessEnable = pciMemAccessEnable;
pcaccp->memAccess.arg = &pcaccp->arg;
- if (PCISHAREDIOCLASSES(pvp->class, pvp->subclass))
- pcaccp->ctrl = TRUE;
- else
- pcaccp->ctrl = FALSE;
- savePciState(pcaccp->arg.tag, &pcaccp->save);
+
+ pcaccp->ctrl = PCISHAREDIOCLASSES(pvp->device_class);
+
+ savePciState(pvp, &pcaccp->save);
pcaccp->arg.ctrl = pcaccp->save.command;
+ }
}
}
@@ -2676,59 +532,60 @@ initPciState(void)
void
initPciBusState(void)
{
+ static const struct pci_id_match bridge_match = {
+ PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY,
+ (PCI_CLASS_BRIDGE << 16), 0x0000ff0000, 0
+ };
+ struct pci_device *dev;
+ struct pci_device_iterator *iter;
BusAccPtr pbap, pbap_tmp;
- PciBusPtr pbp = xf86PciBus;
- pciBusInfo_t *pBusInfo;
- while (pbp) {
+ iter = pci_id_match_iterator_create(& bridge_match);
+ while((dev = pci_device_next(iter)) != NULL) {
+ const uint8_t subclass = (dev->device_class >> 8) & 0x0ff;
+ int primary;
+ int secondary;
+ int subordinate;
+
+
+ pci_device_get_bridge_buses(dev, &primary, &secondary, &subordinate);
+
pbap = xnfcalloc(1,sizeof(BusAccRec));
- pbap->busdep.pci.bus = pbp->secondary;
- pbap->busdep.pci.primary_bus = pbp->primary;
+ pbap->busdep.pci.bus = secondary;
+ pbap->busdep.pci.primary_bus = primary;
pbap->busdep_type = BUS_PCI;
- pbap->busdep.pci.acc = PCITAG_SPECIAL;
+ pbap->busdep.pci.dev = dev;
- if ((pbp->secondary >= 0) && (pbp->secondary < pciNumBuses) &&
- (pBusInfo = pciBusInfo[pbp->secondary]) &&
- pBusInfo->funcs->pciControlBridge) {
- pbap->type = BUS_PCI;
- pbap->save_f = savePciDrvBusState;
- pbap->restore_f = restorePciDrvBusState;
- pbap->set_f = pciSetBusAccess;
- pbap->enable_f = pciDrvBusAccessEnable;
- pbap->disable_f = pciDrvBusAccessDisable;
- savePciDrvBusState(pbap);
- } else switch (pbp->subclass) {
+ pbap->set_f = pciSetBusAccess;
+
+ switch (subclass) {
case PCI_SUBCLASS_BRIDGE_HOST:
pbap->type = BUS_PCI;
- pbap->set_f = pciSetBusAccess;
break;
case PCI_SUBCLASS_BRIDGE_PCI:
case PCI_SUBCLASS_BRIDGE_CARDBUS:
pbap->type = BUS_PCI;
pbap->save_f = savePciBusState;
pbap->restore_f = restorePciBusState;
- pbap->set_f = pciSetBusAccess;
pbap->enable_f = pciBusAccessEnable;
pbap->disable_f = pciBusAccessDisable;
- pbap->busdep.pci.acc = pciTag(pbp->brbus,pbp->brdev,pbp->brfunc);
savePciBusState(pbap);
break;
case PCI_SUBCLASS_BRIDGE_ISA:
case PCI_SUBCLASS_BRIDGE_EISA:
case PCI_SUBCLASS_BRIDGE_MC:
pbap->type = BUS_ISA;
- pbap->set_f = pciSetBusAccess;
break;
}
pbap->next = xf86BusAccInfo;
xf86BusAccInfo = pbap;
- pbp = pbp->next;
}
- pbap = xf86BusAccInfo;
+ pci_iterator_destroy(iter);
- while (pbap) {
+ for (pbap = xf86BusAccInfo; pbap; pbap = pbap->next) {
pbap->primary = NULL;
+
if (pbap->busdep_type == BUS_PCI
&& pbap->busdep.pci.primary_bus > -1) {
pbap_tmp = xf86BusAccInfo;
@@ -2744,32 +601,34 @@ initPciBusState(void)
pbap_tmp = pbap_tmp->next;
}
}
- pbap = pbap->next;
}
}
void
PciStateEnter(void)
{
- pciAccPtr paccp;
- int i = 0;
-
- if (xf86PciAccInfo == NULL)
+#if 0
+ unsigned i;
+
+ if (xf86PciVideoInfo == NULL)
return;
- while ((paccp = xf86PciAccInfo[i]) != NULL) {
- i++;
- if (!paccp->ctrl)
- continue;
- savePciState(paccp->arg.tag, &paccp->save);
- restorePciState(paccp->arg.tag, &paccp->restore);
- paccp->arg.ctrl = paccp->restore.command;
+ for ( i = 0 ; xf86PciVideoInfo[i] != NULL ; i++ ) {
+ pciAccPtr paccp = (pciAccPtr) xf86PciVideoInfo[i]->user_data;
+
+ if ( (paccp != NULL) && paccp->ctrl ) {
+ savePciState(paccp->arg.dev, &paccp->save);
+ restorePciState(paccp->arg.dev, &paccp->restore);
+ paccp->arg.ctrl = paccp->restore.command;
+ }
}
+#endif
}
void
PciBusStateEnter(void)
{
+#if 0
BusAccPtr pbap = xf86BusAccInfo;
while (pbap) {
@@ -2777,29 +636,33 @@ PciBusStateEnter(void)
pbap->save_f(pbap);
pbap = pbap->next;
}
+#endif
}
void
PciStateLeave(void)
{
- pciAccPtr paccp;
- int i = 0;
+#if 0
+ unsigned i;
- if (xf86PciAccInfo == NULL)
+ if (xf86PciVideoInfo == NULL)
return;
- while ((paccp = xf86PciAccInfo[i]) != NULL) {
- i++;
- if (!paccp->ctrl)
- continue;
- savePciState(paccp->arg.tag, &paccp->restore);
- restorePciState(paccp->arg.tag, &paccp->save);
+ for ( i = 0 ; xf86PciVideoInfo[i] != NULL ; i++ ) {
+ pciAccPtr paccp = (pciAccPtr) xf86PciVideoInfo[i]->user_data;
+
+ if ( (paccp != NULL) && paccp->ctrl ) {
+ savePciState(paccp->arg.dev, &paccp->restore);
+ restorePciState(paccp->arg.dev, &paccp->save);
+ }
}
+#endif
}
void
PciBusStateLeave(void)
{
+#if 0
BusAccPtr pbap = xf86BusAccInfo;
while (pbap) {
@@ -2807,27 +670,32 @@ PciBusStateLeave(void)
pbap->restore_f(pbap);
pbap = pbap->next;
}
+#endif
}
void
DisablePciAccess(void)
{
- int i = 0;
- pciAccPtr paccp;
- if (xf86PciAccInfo == NULL)
+#if 0
+ unsigned i;
+
+ if (xf86PciVideoInfo == NULL)
return;
- while ((paccp = xf86PciAccInfo[i]) != NULL) {
- i++;
- if (!paccp->ctrl) /* disable devices that are under control initially*/
- continue;
- pciIo_MemAccessDisable(paccp->io_memAccess.arg);
+ for ( i = 0 ; xf86PciVideoInfo[i] != NULL ; i++ ) {
+ pciAccPtr paccp = (pciAccPtr) xf86PciVideoInfo[i]->user_data;
+
+ if ( (paccp != NULL) && paccp->ctrl ) {
+ pciIo_MemAccessDisable(paccp->io_memAccess.arg);
+ }
}
+#endif
}
void
DisablePciBusAccess(void)
{
+#if 0
BusAccPtr pbap = xf86BusAccInfo;
while (pbap) {
@@ -2837,26 +705,7 @@ DisablePciBusAccess(void)
pbap->primary->current = NULL;
pbap = pbap->next;
}
-}
-
-/*
- * Public functions
- */
-
-_X_EXPORT Bool
-xf86IsPciDevPresent(int bus, int dev, int func)
-{
- int i = 0;
- pciConfigPtr pcp;
-
- while ((pcp = xf86PciInfo[i]) != NULL) {
- if ((pcp->busnum == bus)
- && (pcp->devnum == dev)
- && (pcp->funcnum == func))
- return TRUE;
- i++;
- }
- return FALSE;
+#endif
}
/*
@@ -2865,42 +714,35 @@ xf86IsPciDevPresent(int bus, int dev, int func)
*/
_X_EXPORT int
-xf86ClaimPciSlot(int bus, int device, int func, DriverPtr drvp,
+xf86ClaimPciSlot(struct pci_device * d, DriverPtr drvp,
int chipset, GDevPtr dev, Bool active)
{
EntityPtr p = NULL;
- pciAccPtr *ppaccp = xf86PciAccInfo;
+ pciAccPtr paccp = (pciAccPtr) d->user_data;
BusAccPtr pbap = xf86BusAccInfo;
+ const unsigned bus = PCI_MAKE_BUS(d->domain, d->bus);
int num;
- if (xf86CheckPciSlot(bus, device, func)) {
+ if (xf86CheckPciSlot(d)) {
num = xf86AllocateEntity();
p = xf86Entities[num];
p->driver = drvp;
p->chipset = chipset;
- p->busType = BUS_PCI;
- p->pciBusId.bus = bus;
- p->pciBusId.device = device;
- p->pciBusId.func = func;
+ p->bus.type = BUS_PCI;
+ p->bus.id.pci = d;
p->active = active;
p->inUse = FALSE;
if (dev)
xf86AddDevToEntity(num, dev);
/* Here we initialize the access structure */
p->access = xnfcalloc(1,sizeof(EntityAccessRec));
- while (ppaccp && *ppaccp) {
- if ((*ppaccp)->busnum == bus
- && (*ppaccp)->devnum == device
- && (*ppaccp)->funcnum == func) {
- p->access->fallback = &(*ppaccp)->io_memAccess;
- p->access->pAccess = &(*ppaccp)->io_memAccess;
- (*ppaccp)->ctrl = TRUE; /* mark control if not already */
- break;
- }
- ppaccp++;
+ if (paccp != NULL) {
+ p->access->fallback = & paccp->io_memAccess;
+ p->access->pAccess = & paccp->io_memAccess;
+ paccp->ctrl = TRUE; /* mark control if not already */
}
- if (!ppaccp || !*ppaccp) {
+ else {
p->access->fallback = &AccessNULL;
p->access->pAccess = &AccessNULL;
}
@@ -2911,16 +753,12 @@ xf86ClaimPciSlot(int bus, int device, int func, DriverPtr drvp,
p->busAcc = pbap;
pbap = pbap->next;
}
- fixPciSizeInfo(num);
- /* in case bios is enabled disable it */
- disablePciBios(pciTag(bus,device,func));
pciSlotClaimed = TRUE;
if (active) {
/* Map in this domain's I/O space */
- p->domainIO = xf86MapDomainIO(-1, VIDMEM_MMIO,
- pciTag(bus, device, func), 0, 1);
+ p->domainIO = xf86MapLegacyIO(d);
}
return num;
@@ -2929,138 +767,6 @@ xf86ClaimPciSlot(int bus, int device, int func, DriverPtr drvp,
}
/*
- * Get xf86PciVideoInfo for a driver.
- */
-_X_EXPORT pciVideoPtr *
-xf86GetPciVideoInfo(void)
-{
- return xf86PciVideoInfo;
-}
-
-/* --- Used by ATI driver, but also more generally useful */
-
-/*
- * Get the full xf86scanpci data.
- */
-_X_EXPORT pciConfigPtr *
-xf86GetPciConfigInfo(void)
-{
- return xf86PciInfo;
-}
-
-/*
- * Enable a device and route VGA to it. This is intended for a driver's
- * Probe(), before creating EntityRec's. Only one device can be thus enabled
- * at any one time, and should be disabled when the driver is done with it.
- *
- * The following special calls are also available:
- *
- * pvp == NULL && rt == NONE disable previously enabled device
- * pvp != NULL && rt == NONE ensure device is disabled
- * pvp == NULL && rt != NONE disable >all< subsequent calls to this function
- * (done from xf86PostProbe())
- * The last combination has been removed! To do this cleanly we have
- * to implement stages and need to test at each stage dependent function
- * if it is allowed to execute.
- *
- * The device represented by pvp may not have been previously claimed.
- */
-_X_EXPORT void
-xf86SetPciVideo(pciVideoPtr pvp, resType rt)
-{
- static BusAccPtr pbap = NULL;
- static xf86AccessPtr pAcc = NULL;
- static Bool DoneProbes = FALSE;
- pciAccPtr pcaccp;
- int i;
-
- if (DoneProbes)
- return;
-
- /* Disable previous access */
- if (pAcc) {
- if (pAcc->AccessDisable)
- (*pAcc->AccessDisable)(pAcc->arg);
- pAcc = NULL;
- }
- if (pbap) {
- while (pbap->primary) {
- if (pbap->disable_f)
- (*pbap->disable_f)(pbap);
- pbap->primary->current = NULL;
- pbap = pbap->primary;
- }
- pbap = NULL;
- }
-
- /* Check for xf86PostProbe's magic combo */
- if (!pvp) {
- if (rt != NONE)
- DoneProbes = TRUE;
- return;
- }
-
- /* Validate device */
- if (!xf86PciVideoInfo || !xf86PciAccInfo || !xf86BusAccInfo)
- return;
-
- for (i = 0; pvp != xf86PciVideoInfo[i]; i++)
- if (!xf86PciVideoInfo[i])
- return;
-
- /* Ignore request for claimed adapters */
- if (!xf86CheckPciSlot(pvp->bus, pvp->device, pvp->func))
- return;
-
- /* Find pciAccRec structure */
- for (i = 0; ; i++) {
- if (!(pcaccp = xf86PciAccInfo[i]))
- return;
- if ((pvp->bus == pcaccp->busnum) &&
- (pvp->device == pcaccp->devnum) &&
- (pvp->func == pcaccp->funcnum))
- break;
- }
-
- if (rt == NONE) {
- /* This is a call to ensure the adapter is disabled */
- if (pcaccp->io_memAccess.AccessDisable)
- (*pcaccp->io_memAccess.AccessDisable)(pcaccp->io_memAccess.arg);
- return;
- }
-
- /* Find BusAccRec structure */
- for (pbap = xf86BusAccInfo; ; pbap = pbap->next) {
- if (!pbap)
- return;
- if (pvp->bus == pbap->busdep.pci.bus)
- break;
- }
-
- /* Route VGA */
- if (pbap->set_f)
- (*pbap->set_f)(pbap);
-
- /* Enable device */
- switch (rt) {
- case IO:
- pAcc = &pcaccp->ioAccess;
- break;
- case MEM_IO:
- pAcc = &pcaccp->io_memAccess;
- break;
- case MEM:
- pAcc = &pcaccp->memAccess;
- break;
- default: /* no compiler noise */
- break;
- }
-
- if (pAcc && pAcc->AccessEnable)
- (*pAcc->AccessEnable)(pAcc->arg);
-}
-
-/*
* Parse a BUS ID string, and return the PCI bus parameters if it was
* in the correct format for a PCI bus id.
*/
@@ -3157,54 +863,24 @@ xf86ComparePciBusString(const char *busID, int bus, int device, int func)
*/
_X_EXPORT Bool
-xf86IsPrimaryPci(pciVideoPtr pPci)
+xf86IsPrimaryPci(struct pci_device *pPci)
{
- if (primaryBus.type != BUS_PCI) return FALSE;
- return (pPci->bus == primaryBus.id.pci.bus &&
- pPci->device == primaryBus.id.pci.device &&
- pPci->func == primaryBus.id.pci.func);
+ return ((primaryBus.type == BUS_PCI) && (pPci == primaryBus.id.pci));
}
/*
* xf86GetPciInfoForEntity() -- Get the pciVideoRec of entity.
*/
-_X_EXPORT pciVideoPtr
+_X_EXPORT struct pci_device *
xf86GetPciInfoForEntity(int entityIndex)
{
- pciVideoPtr *ppPci;
EntityPtr p;
if (entityIndex >= xf86NumEntities)
return NULL;
p = xf86Entities[entityIndex];
- if (p->busType != BUS_PCI)
- return NULL;
-
- for (ppPci = xf86PciVideoInfo; *ppPci != NULL; ppPci++) {
- if (p->pciBusId.bus == (*ppPci)->bus &&
- p->pciBusId.device == (*ppPci)->device &&
- p->pciBusId.func == (*ppPci)->func)
- return (*ppPci);
- }
- return NULL;
-}
-
-_X_EXPORT int
-xf86GetPciEntity(int bus, int dev, int func)
-{
- int i;
-
- for (i = 0; i < xf86NumEntities; i++) {
- EntityPtr p = xf86Entities[i];
- if (p->busType != BUS_PCI) continue;
-
- if (p->pciBusId.bus == bus &&
- p->pciBusId.device == dev &&
- p->pciBusId.func == func)
- return i;
- }
- return -1;
+ return (p->bus.type == BUS_PCI) ? p->bus.id.pci : NULL;
}
/*
@@ -3212,12 +888,12 @@ xf86GetPciEntity(int bus, int dev, int func)
* PCI base address register values for the given PCI device.
*/
_X_EXPORT Bool
-xf86CheckPciMemBase(pciVideoPtr pPci, memType base)
+xf86CheckPciMemBase( struct pci_device * pPci, memType base )
{
int i;
for (i = 0; i < 6; i++)
- if (base == pPci->memBase[i])
+ if (base == pPci->regions[i].base_addr)
return TRUE;
return FALSE;
}
@@ -3227,154 +903,32 @@ xf86CheckPciMemBase(pciVideoPtr pPci, memType base)
*/
_X_EXPORT Bool
-xf86CheckPciSlot(int bus, int device, int func)
+xf86CheckPciSlot(const struct pci_device *d)
{
int i;
- EntityPtr p;
for (i = 0; i < xf86NumEntities; i++) {
- p = xf86Entities[i];
- /* Check if this PCI slot is taken */
- if (p->busType == BUS_PCI && p->pciBusId.bus == bus &&
- p->pciBusId.device == device && p->pciBusId.func == func)
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-/*
- * xf86FindPciVendorDevice() xf86FindPciClass(): These functions
- * are meant to be used by the pci bios emulation. Some bioses
- * need to see if there are _other_ chips of the same type around
- * so by setting pvp_exclude one pci device can be explicitely
- * _excluded if required.
- */
-_X_EXPORT pciVideoPtr
-xf86FindPciDeviceVendor(CARD16 vendorID, CARD16 deviceID,
- char n, pciVideoPtr pvp_exclude)
-{
- pciVideoPtr pvp, *ppvp;
- n++;
+ const EntityPtr p = xf86Entities[i];
- for (ppvp = xf86PciVideoInfo, pvp =*ppvp; pvp ; pvp = *(++ppvp)) {
- if (pvp == pvp_exclude) continue;
- if ((pvp->vendor == vendorID) && (pvp->chipType == deviceID)) {
- if (!(--n)) break;
+ if ((p->bus.type == BUS_PCI) && (p->bus.id.pci == d)) {
+ return FALSE;
}
}
- return pvp;
+ return TRUE;
}
-_X_EXPORT pciVideoPtr
-xf86FindPciClass(CARD8 intf, CARD8 subClass, CARD16 class,
- char n, pciVideoPtr pvp_exclude)
-{
- pciVideoPtr pvp, *ppvp;
- n++;
-
- for (ppvp = xf86PciVideoInfo, pvp =*ppvp; pvp ; pvp = *(++ppvp)) {
- if (pvp == pvp_exclude) continue;
- if ((pvp->interface == intf) && (pvp->subclass == subClass)
- && (pvp->class == class)) {
- if (!(--n)) break;
- }
- }
- return pvp;
-}
-/*
- * This attempts to detect a multi-device card and sets up a list
- * of pci tags of the devices of this card. On some of these
- * cards the BIOS is not visible from all chipsets. We therefore
- * need to use the BIOS from a chipset where it is visible.
- * We do the following heuristics:
- * If we detect only identical pci devices on a bus we assume it's
- * a multi-device card. This assumption isn't true always, however.
- * One might just use identical cards on a bus. We therefore don't
- * detect this situation when we set up the PCI video info. Instead
- * we wait until an attempt to read the BIOS fails.
- */
-int
-pciTestMultiDeviceCard(int bus, int dev, int func, PCITAG** pTag)
+void
+pciConvertRange2Host(int entityIndex, resRange *pRange)
{
- pciConfigPtr *ppcrp = xf86PciInfo;
- pciConfigPtr pcrp = NULL;
- int i,j;
- Bool multicard = FALSE;
- Bool multifunc = FALSE;
- char str[256];
- char *str1;
-
- str1 = str;
- if (!pTag)
- return 0;
-
- *pTag = NULL;
-
- for (i=0; i < 8; i++) {
- j = 0;
+ struct pci_device *const pvp = xf86GetPciInfoForEntity(entityIndex);
+ const PCITAG tag = PCI_MAKE_TAG(PCI_MAKE_BUS(pvp->domain, pvp->bus),
+ pvp->dev, pvp->func);
- while (ppcrp[j]) {
- if (ppcrp[j]->busnum == bus && ppcrp[j]->funcnum == i) {
- pcrp = ppcrp[j];
- break;
- }
- j++;
- }
-
- if (!pcrp) return 0;
-
- /*
- * we check all functions here: since multifunc devices need
- * to implement func 0 we catch all devices on the bus when
- * i = 0
- */
- if (pcrp->pci_header_type &0x80)
- multifunc = TRUE;
-
- j = 0;
-
- while (ppcrp[j]) {
- if (ppcrp[j]->busnum == bus && ppcrp[j]->funcnum == i
- && ppcrp[j]->devnum != pcrp->devnum) {
- /* don't test subsys ID here. It might be set by POST
- - however some cards might not have been POSTed */
- if (ppcrp[j]->pci_device_vendor != pcrp->pci_device_vendor
- || ppcrp[j]->pci_header_type != pcrp->pci_header_type )
- return 0;
- else
- multicard = TRUE;
- }
- j++;
- }
- if (!multifunc)
- break;
- }
-
- if (!multicard)
- return 0;
-
- j = 0;
- i = 0;
- while (ppcrp[i]) {
- if (ppcrp[i]->busnum == bus && ppcrp[i]->funcnum == func) {
- str1 += sprintf(str1,"[%x:%x:%x]",ppcrp[i]->busnum,
- ppcrp[i]->devnum,ppcrp[i]->funcnum);
- *pTag = xnfrealloc(*pTag,sizeof(PCITAG) * (j + 1));
- (*pTag)[j++] = pciTag(ppcrp[i]->busnum,
- ppcrp[i]->devnum,ppcrp[i]->funcnum);
+ if (pvp == NULL) {
+ return;
}
- i++;
- }
- xf86MsgVerb(X_INFO,3,"Multi Device Card detected: %s\n",str);
- return j;
-}
-static void
-pciTagConvertRange2Host(PCITAG tag, resRange *pRange)
-{
if (!(pRange->type & ResBus))
return;
@@ -3411,41 +965,5 @@ pciTagConvertRange2Host(PCITAG tag, resRange *pRange)
/* Set domain number */
pRange->type &= ~(ResDomain | ResBus);
- pRange->type |= xf86GetPciDomain(tag) << 24;
-}
-
-static void
-pciConvertListToHost(int bus, int dev, int func, resPtr list)
-{
- PCITAG tag = pciTag(bus,dev,func);
- while (list) {
- pciTagConvertRange2Host(tag, &list->val);
- list = list->next;
- }
-}
-
-static void
-updateAccessInfoStatusControlInfo(PCITAG tag, CARD32 ctrl)
-{
- int i;
-
- if (!xf86PciAccInfo)
- return;
-
- for (i = 0; xf86PciAccInfo[i] != NULL; i++) {
- if (xf86PciAccInfo[i]->arg.tag == tag)
- xf86PciAccInfo[i]->arg.ctrl = ctrl;
- }
-}
-
-void
-pciConvertRange2Host(int entityIndex, resRange *pRange)
-{
- PCITAG tag;
- pciVideoPtr pvp;
-
- pvp = xf86GetPciInfoForEntity(entityIndex);
- if (!pvp) return;
- tag = TAG(pvp);
- pciTagConvertRange2Host(tag, pRange);
+ pRange->type |= pvp->domain << 24;
}
diff --git a/hw/xfree86/common/xf86pciBus.h b/hw/xfree86/common/xf86pciBus.h
index 90d9dd9b9..7d08502fc 100644
--- a/hw/xfree86/common/xf86pciBus.h
+++ b/hw/xfree86/common/xf86pciBus.h
@@ -42,14 +42,11 @@ typedef struct {
} pciSave, *pciSavePtr;
typedef struct {
- PCITAG tag;
+ struct pci_device * dev;
CARD32 ctrl;
} pciArg;
typedef struct {
- int busnum;
- int devnum;
- int funcnum;
pciArg arg;
xf86AccessRec ioAccess;
xf86AccessRec io_memAccess;
@@ -63,24 +60,7 @@ typedef union {
CARD16 control;
} pciBridgesSave, *pciBridgesSavePtr;
-typedef struct pciBusRec {
- int brbus, brdev, brfunc; /* ID of the bridge to this bus */
- int primary, secondary, subordinate;
- int subclass; /* bridge type */
- int interface;
- resPtr preferred_io; /* I/O range */
- resPtr preferred_mem; /* non-prefetchable memory range */
- resPtr preferred_pmem; /* prefetchable memory range */
- resPtr io; /* for subtractive PCI-PCI bridges */
- resPtr mem;
- resPtr pmem;
- int brcontrol; /* bridge_control byte */
- struct pciBusRec *next;
-} PciBusRec, *PciBusPtr;
-
void xf86PciProbe(void);
-void ValidatePci(void);
-resList GetImplicitPciResources(int entityIndex);
void initPciState(void);
void initPciBusState(void);
void DisablePciAccess(void);
@@ -89,10 +69,7 @@ void PciStateEnter(void);
void PciBusStateEnter(void);
void PciStateLeave(void);
void PciBusStateLeave(void);
-resPtr ResourceBrokerInitPci(resPtr *osRes);
void pciConvertRange2Host(int entityIndex, resRange *pRange);
void isaConvertRange2Host(resRange *pRange);
-extern pciAccPtr * xf86PciAccInfo;
-
#endif /* _XF86_PCI_BUS_H */
diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
index 086d2bfc4..0365ddd62 100644
--- a/hw/xfree86/common/xf86str.h
+++ b/hw/xfree86/common/xf86str.h
@@ -43,11 +43,21 @@
#include "xf86Opt.h"
#include "xf86Pci.h"
-/*
- * memType is of the size of the addressable memory (machine size)
- * usually unsigned long.
+#include <pciaccess.h>
+
+/**
+ * Integer type that is of the size of the addressable memory (machine size).
+ * On most platforms \c uintptr_t will suffice. However, on some mixed
+ * 32-bit / 64-bit platforms, such as 32-bit binaries on 64-bit PowerPC, this
+ * must be 64-bits.
*/
-typedef unsigned long memType;
+#include <inttypes.h>
+#if defined(__powerpc__)
+typedef uint64_t memType;
+#else
+typedef uintptr_t memType;
+#endif
+
/* Video mode flags */
@@ -307,6 +317,9 @@ typedef struct {
int refCount;
} DriverRec1;
+struct _SymTabRec;
+struct _PciChipsets;
+
typedef struct _DriverRec {
int driverVersion;
char * driverName;
@@ -316,6 +329,10 @@ typedef struct _DriverRec {
pointer module;
int refCount;
xorgDriverFuncProc *driverFunc;
+
+ const struct pci_id_match * supported_devices;
+ Bool (*PciProbe)( struct _DriverRec * drv, int entity_num,
+ struct pci_device * dev, intptr_t match_data );
} DriverRec, *DriverPtr;
/*
@@ -361,11 +378,7 @@ typedef enum {
BUS_last /* Keep last */
} BusType;
-typedef struct {
- int bus;
- int device;
- int func;
-} PciBusId;
+struct pci_device;
typedef struct {
unsigned int dummy;
@@ -379,7 +392,7 @@ typedef struct _bus {
BusType type;
union {
IsaBusId isa;
- PciBusId pci;
+ struct pci_device *pci;
SbusBusId sbus;
} id;
} BusRec, *BusPtr;
@@ -431,29 +444,6 @@ typedef struct {
} IDevRec, *IDevPtr;
typedef struct {
- int vendor;
- int chipType;
- int chipRev;
- int subsysVendor;
- int subsysCard;
- int bus;
- int device;
- int func;
- int class;
- int subclass;
- int interface;
- memType memBase[6];
- memType ioBase[6];
- int size[6];
- unsigned char type[6];
- memType biosBase;
- int biosSize;
- pointer thisCard;
- Bool validSize;
- Bool validate;
-} pciVideoRec, *pciVideoPtr;
-
-typedef struct {
int frameX0;
int frameY0;
int virtualX;
@@ -735,7 +725,7 @@ typedef struct {
resRange *resList;
} IsaChipsets;
-typedef struct {
+typedef struct _PciChipsets {
/**
* Key used to match this device with its name in an array of
* \c SymTabRec.
@@ -1064,7 +1054,7 @@ typedef struct {
);
} DGAFunctionRec, *DGAFunctionPtr;
-typedef struct {
+typedef struct _SymTabRec {
int token; /* id of the token */
const char * name; /* token name */
} SymTabRec, *SymTabPtr;