diff -Nurp xc/programs/Xserver/hw/xfree86/common/xf86Config.c xc-changed/programs/Xserver/hw/xfree86/common/xf86Config.c
--- xc/programs/Xserver/hw/xfree86/common/xf86Config.c	2003-02-20 04:36:07.000000000 +0000
+++ xc-changed/programs/Xserver/hw/xfree86/common/xf86Config.c	2003-09-08 17:48:10.000000000 +0100
@@ -1416,6 +1416,20 @@ checkCoreInputDevices(serverLayoutPtr se
     return TRUE;
 }
 
+typedef enum {
+    LAYOUT_PREFERREDBUSID,
+    LAYOUT_SINGLECARD
+} LayoutValues;
+   
+static OptionInfoRec LayoutOptions[] = {
+  { LAYOUT_PREFERREDBUSID,	"PrefBusID",		        OPTV_STRING,
+	{0}, FALSE },
+  { LAYOUT_SINGLECARD,		"SingleCard",			OPTV_BOOLEAN,
+	{0}, FALSE },
+  { -1,				NULL,				OPTV_NONE,
+	{0}, FALSE },
+};
+
 /*
  * figure out which layout is active, which screens are used in that layout,
  * which drivers and monitors are used in these screens
@@ -2213,6 +2227,8 @@ xf86HandleConfigFile(void)
     const char *filename;
     char *searchpath;
     MessageType from = X_DEFAULT;
+    char *scanptr;
+    Bool singlecard = 0;
 
     if (getuid() == 0)
 	searchpath = ROOT_CONFIGPATH;
@@ -2283,6 +2299,28 @@ xf86HandleConfigFile(void)
 	}
     }
 
+    xf86ProcessOptions(-1, xf86ConfigLayout.options, LayoutOptions);
+
+    if ((scanptr = xf86GetOptValString(LayoutOptions, LAYOUT_PREFERREDBUSID))) {
+        ; /* PrefBusID is primary */
+    }
+    else {
+        xf86GetOptValBool(LayoutOptions, LAYOUT_SINGLECARD, &singlecard);
+	if (singlecard) scanptr = xf86ConfigLayout.screens->screen->device->busID;
+    }
+    if (scanptr) {
+        int bus, device, func, stroffset = 0;
+	if (tolower(scanptr[0]) == 'p' && strlen(scanptr) >= 4) stroffset = 4;
+        if (sscanf(scanptr + stroffset, "%d:%d:%d", &bus, &device, &func) == 3) {
+            xf86PrefBusId.bus = bus;
+            xf86PrefBusId.device = device;
+            xf86PrefBusId.func = func;
+	    xf86Msg(X_INFO,
+		    "Preferred PCI BusID set to \"%d:%d:%d\"\n",bus,device,func);
+        }
+    }
+	
+
     /* Now process everything else */
 
     if (!configFiles(xf86configptr->conf_files) ||
diff -Nurp xc/programs/Xserver/hw/xfree86/common/xf86Globals.c xc-changed/programs/Xserver/hw/xfree86/common/xf86Globals.c
--- xc/programs/Xserver/hw/xfree86/common/xf86Globals.c	2003-02-20 04:05:14.000000000 +0000
+++ xc-changed/programs/Xserver/hw/xfree86/common/xf86Globals.c	2003-04-02 13:03:00.000000000 +0100
@@ -215,6 +215,7 @@ Bool xf86MiscModInDevAllowNonLocal = FAL
 #endif
 PropertyPtr *xf86RegisteredPropertiesTable = NULL;
 Bool xf86inSuspend = FALSE;
+PciBusId xf86PrefBusId;
 
 #ifdef DLOPEN_HACK
 /*
diff -Nurp xc/programs/Xserver/hw/xfree86/common/xf86Init.c xc-changed/programs/Xserver/hw/xfree86/common/xf86Init.c
--- xc/programs/Xserver/hw/xfree86/common/xf86Init.c	2003-02-26 09:21:38.000000000 +0000
+++ xc-changed/programs/Xserver/hw/xfree86/common/xf86Init.c	2003-08-26 14:55:22.000000000 +0100
@@ -1553,6 +1553,22 @@ ddxProcessArgument(int argc, char **argv
     xf86AllowMouseOpenFail = TRUE;
     return 1;
   }
+  if (!strcmp(argv[i], "-prefbusid"))
+  {
+    int bus, device, func;
+    if (++i >= argc)
+      return 0;
+    if (sscanf(argv[i], "%d:%d:%d", &bus, &device, &func) == 3) {
+      xf86PrefBusId.bus = bus;
+      xf86PrefBusId.device = device;
+      xf86PrefBusId.func = func;
+      return 2;
+    }
+    else {
+      ErrorF("Invalid preferred PCI BusId\n");
+      return 0;
+    }
+  }
   /* OS-specific processing */
   return xf86ProcessArgument(argc, argv, i);
 }
diff -Nurp xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c xc-changed/programs/Xserver/hw/xfree86/common/xf86pciBus.c
--- xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c	2003-02-18 15:42:11.000000000 +0000
+++ xc-changed/programs/Xserver/hw/xfree86/common/xf86pciBus.c	2003-04-02 13:03:00.000000000 +0100
@@ -160,7 +160,10 @@ FindPCIVideoInfo(void)
     int num = 0;
     pciVideoPtr info;
     Bool mem64 = FALSE;
+    int DoPrefBusIdCheck = 0;
 
+    if( xf86PrefBusId.bus || xf86PrefBusId.device || xf86PrefBusId.func )
+	DoPrefBusIdCheck = 1;
     pcrpp = xf86PciInfo = xf86scanpci(0);
     getPciClassFlags(pcrpp);
     
@@ -182,7 +185,11 @@ FindPCIVideoInfo(void)
 	    subclass = pcrp->pci_sub_class;
 	}
 	
-	if (PCIINFOCLASSES(baseclass, subclass)) {
+	if (PCIINFOCLASSES(baseclass, subclass) &&
+	    (DoPrefBusIdCheck ? 
+	    (xf86PrefBusId.bus == pcrp->busnum &&
+	     xf86PrefBusId.device == pcrp->devnum &&
+	     xf86PrefBusId.func == pcrp->funcnum):1)) {
 	    num++;
 	    xf86PciVideoInfo = xnfrealloc(xf86PciVideoInfo,
 					  sizeof(pciVideoPtr) * (num + 1));
diff -Nurp xc/programs/Xserver/hw/xfree86/common/xf86Priv.h xc-changed/programs/Xserver/hw/xfree86/common/xf86Priv.h
--- xc/programs/Xserver/hw/xfree86/common/xf86Priv.h	2002-12-12 18:29:10.000000000 +0000
+++ xc-changed/programs/Xserver/hw/xfree86/common/xf86Priv.h	2003-04-02 13:03:00.000000000 +0100
@@ -53,6 +53,7 @@ extern Bool xf86BestRefresh;
 extern Gamma xf86Gamma;
 extern char *xf86ServerName;
 extern Bool xf86ShowUnresolved;
+extern PciBusId xf86PrefBusId;
 
 /* Other parameters */
 

