diff -ru xorg-server-1.5.0.orig/hw/xfree86/common/xf86Globals.c xorg-server-1.5.0/hw/xfree86/common/xf86Globals.c --- xorg-server-1.5.0.orig/hw/xfree86/common/xf86Globals.c 2008-09-03 13:03:39.000000000 -0400 +++ xorg-server-1.5.0/hw/xfree86/common/xf86Globals.c 2008-09-07 01:14:43.000000000 -0400 @@ -149,6 +149,7 @@ Bool xf86Initialising = FALSE; Bool xf86DoProbe = FALSE; Bool xf86DoConfigure = FALSE; +Bool xf86DoModalias = FALSE; DriverPtr *xf86DriverList = NULL; int xf86NumDrivers = 0; InputDriverPtr *xf86InputDriverList = NULL; diff -ru xorg-server-1.5.0.orig/hw/xfree86/common/xf86.h xorg-server-1.5.0/hw/xfree86/common/xf86.h --- xorg-server-1.5.0.orig/hw/xfree86/common/xf86.h 2008-09-03 13:03:39.000000000 -0400 +++ xorg-server-1.5.0/hw/xfree86/common/xf86.h 2008-09-07 01:13:47.000000000 -0400 @@ -56,6 +56,7 @@ /* General parameters */ extern int xf86DoConfigure; +extern Bool xf86DoModalias; extern Bool xf86DoConfigurePass1; extern DevPrivateKey xf86ScreenKey; extern DevPrivateKey xf86CreateRootWindowKey; diff -ru xorg-server-1.5.0.orig/hw/xfree86/common/xf86Helper.c xorg-server-1.5.0/hw/xfree86/common/xf86Helper.c --- xorg-server-1.5.0.orig/hw/xfree86/common/xf86Helper.c 2008-09-03 13:03:39.000000000 -0400 +++ xorg-server-1.5.0/hw/xfree86/common/xf86Helper.c 2008-09-08 13:32:41.000000000 -0400 @@ -1486,6 +1486,8 @@ if (sectlist) *sectlist = NULL; + if (xf86DoModalias) return 0; + if (xf86DoProbe) return 1; if (xf86DoConfigure && xf86DoConfigurePass1) return 1; diff -ru xorg-server-1.5.0.orig/hw/xfree86/common/xf86Init.c xorg-server-1.5.0/hw/xfree86/common/xf86Init.c --- xorg-server-1.5.0.orig/hw/xfree86/common/xf86Init.c 2008-09-03 13:03:39.000000000 -0400 +++ xorg-server-1.5.0/hw/xfree86/common/xf86Init.c 2008-09-08 13:45:34.000000000 -0400 @@ -131,6 +131,84 @@ #endif static Bool formatsDone = FALSE; +static void +DoModalias() +{ + int i = -1; + char **vlist; + + /* Get all the drivers */ + vlist = xf86DriverlistFromCompile(); + if (!vlist) { + ErrorF("Missing output drivers. PCI Access dump failed.\n"); + goto bail; + } + + /* Load all the drivers that were found. */ + xf86LoadModules(vlist, NULL); + + xfree(vlist); + + /* Iterate through each driver */ + for (i = 0; i < xf86NumDrivers; i++) { + struct pci_id_match *match; + + /* Iterate through each pci id match data, dumping it to the screen */ + for (match = (struct pci_id_match *) xf86DriverList[i]->supported_devices ; + match && !(!match->vendor_id && !match->device_id) ; match++) { + /* Prefix */ + ErrorF("alias pci:"); + + /* Vendor */ + if (match->vendor_id == ~0) + ErrorF("v*"); + else + ErrorF("v%08X", match->vendor_id); + + /* Device */ + if (match->device_id == ~0) + ErrorF("d*"); + else + ErrorF("d%08X", match->device_id); + + /* Subvendor */ + if (match->subvendor_id == ~0) + ErrorF("sv*"); + else + ErrorF("sv%08X", match->subvendor_id); + + /* Subdevice */ + if (match->subdevice_id == ~0) + ErrorF("sd*"); + else + ErrorF("sd%08X", match->subdevice_id); + + /* Class */ + if (match->device_class_mask >> 16 & 0xFF == 0xFF) + ErrorF("bc%02X", match->device_class >> 16 & 0xFF); + else + ErrorF("bc*"); + if (match->device_class_mask >> 8 & 0xFF == 0xFF) + ErrorF("sc%02X", match->device_class >> 8 & 0xFF); + else + ErrorF("sc*"); + if (match->device_class_mask & 0xFF == 0xFF) + ErrorF("i%02X*", match->device_class & 0xFF); + else + ErrorF("i*"); + + /* Suffix (driver) */ + ErrorF(" %s\n", xf86DriverList[i]->driverName); + } + } + +bail: + OsCleanup(TRUE); + AbortDDX(); + fflush(stderr); + exit(0); +} + static Bool xf86CreateRootWindow(WindowPtr pWin) { @@ -500,7 +578,7 @@ } /* Read and parse the config file */ - if (!xf86DoProbe && !xf86DoConfigure) { + if (!xf86DoProbe && !xf86DoConfigure && !xf86DoModalias) { switch (xf86HandleConfigFile(FALSE)) { case CONFIG_OK: break; @@ -537,6 +615,10 @@ if (xf86DoConfigure) DoConfigure(); + /* Do the PCI Access dump */ + if (xf86DoModalias) + DoModalias(); + if (autoconfig) { if (!xf86AutoConfig()) { xf86Msg(X_ERROR, "Auto configuration failed\n"); @@ -1678,6 +1760,14 @@ xf86AllowMouseOpenFail = TRUE; return 1; } + if (!strcmp(argv[i], "-modalias")) + { + xf86DoModalias = TRUE; + xf86AllowMouseOpenFail = TRUE; + ShareVTs = TRUE; + VTSwitch = FALSE; + return 1; + } if (!strcmp(argv[i], "-isolateDevice")) { int bus, device, func; @@ -1722,6 +1812,7 @@ ErrorF("-logfile file specify a log file name\n"); ErrorF("-configure probe for devices and write an "__XCONFIGFILE__"\n"); } + ErrorF("-modalias output a modalias-style filter for each driver installed\n"); ErrorF("-config file specify a configuration file, relative to the\n"); ErrorF(" "__XCONFIGFILE__" search path, only root can use absolute\n"); ErrorF("-probeonly probe for devices, then exit\n");