From 8e368cf5b964f1d29fda0a463f9510457619b14d Mon Sep 17 00:00:00 2001 From: Nathaniel McCallum Date: Tue, 14 Oct 2008 09:50:29 -0400 Subject: [PATCH] Xorg: add -modalias option This scans the installed video drivers and prints a Linux-style modalias listing of the devices each driver claims to support. --- hw/xfree86/common/xf86.h | 1 + hw/xfree86/common/xf86Globals.c | 1 + hw/xfree86/common/xf86Helper.c | 2 + hw/xfree86/common/xf86Init.c | 111 +++++++++++++++++++++++++++++--- 4 files changed, 105 insertions(+), 10 deletions(-) diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h index fbbfc7352..459712ea0 100644 --- a/hw/xfree86/common/xf86.h +++ b/hw/xfree86/common/xf86.h @@ -56,6 +56,7 @@ /* General parameters */ extern int xf86DoConfigure; +extern Bool xf86DoModalias; extern Bool xf86DoConfigurePass1; extern DevPrivateKey xf86ScreenKey; extern DevPrivateKey xf86CreateRootWindowKey; diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c index dffe98863..f72f1b6dc 100644 --- a/hw/xfree86/common/xf86Globals.c +++ b/hw/xfree86/common/xf86Globals.c @@ -144,6 +144,7 @@ Bool xf86Resetting = FALSE; Bool xf86Initialising = FALSE; Bool xf86DoProbe = FALSE; Bool xf86DoConfigure = FALSE; +Bool xf86DoModalias = FALSE; DriverPtr *xf86DriverList = NULL; int xf86NumDrivers = 0; InputDriverPtr *xf86InputDriverList = NULL; diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c index f10fb1ce8..0d21f4639 100644 --- a/hw/xfree86/common/xf86Helper.c +++ b/hw/xfree86/common/xf86Helper.c @@ -1472,6 +1472,8 @@ xf86MatchDevice(const char *drivername, GDevPtr **sectlist) if (sectlist) *sectlist = NULL; + if (xf86DoModalias) return 0; + if (xf86DoProbe) return 1; if (xf86DoConfigure && xf86DoConfigurePass1) return 1; diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c index 06a7f93cd..c0ff0b3f2 100644 --- a/hw/xfree86/common/xf86Init.c +++ b/hw/xfree86/common/xf86Init.c @@ -244,6 +244,84 @@ xf86PrintMarkers() LogPrintMarkers(); } +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) { @@ -596,19 +674,21 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv) else xf86ServerName = argv[0]; - xf86PrintBanner(); - xf86PrintMarkers(); - if (xf86LogFile) { - time_t t; - const char *ct; - t = time(NULL); - ct = ctime(&t); - xf86MsgVerb(xf86LogFileFrom, 0, "Log file: \"%s\", Time: %s", - xf86LogFile, ct); + if (!xf86DoModalias) { + xf86PrintBanner(); + xf86PrintMarkers(); + if (xf86LogFile) { + time_t t; + const char *ct; + t = time(NULL); + ct = ctime(&t); + xf86MsgVerb(xf86LogFileFrom, 0, "Log file: \"%s\", Time: %s", + xf86LogFile, ct); + } } /* Read and parse the config file */ - if (!xf86DoProbe && !xf86DoConfigure) { + if (!xf86DoProbe && !xf86DoConfigure && !xf86DoModalias) { switch (xf86HandleConfigFile(FALSE)) { case CONFIG_OK: break; @@ -644,6 +724,10 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv) if (xf86DoConfigure) DoConfigure(); + /* Do the PCI Access dump */ + if (xf86DoModalias) + DoModalias(); + if (autoconfig) { if (!xf86AutoConfig()) { xf86Msg(X_ERROR, "Auto configuration failed\n"); @@ -1684,6 +1768,12 @@ ddxProcessArgument(int argc, char **argv, int i) xf86AllowMouseOpenFail = TRUE; return 1; } + if (!strcmp(argv[i], "-modalias")) + { + xf86DoModalias = TRUE; + xf86AllowMouseOpenFail = TRUE; + return 1; + } if (!strcmp(argv[i], "-isolateDevice")) { int bus, device, func; @@ -1723,6 +1813,7 @@ ddxUseMsg() 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");