summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathaniel McCallum <nathaniel@natemccallum.com>2008-10-14 09:50:29 -0400
committerAdam Jackson <ajax@redhat.com>2008-10-14 09:50:29 -0400
commit8e368cf5b964f1d29fda0a463f9510457619b14d (patch)
treebe074d2fdc3f2cb968315e5e5d52939710e3482b
parent3eb52de7f28b0050582f9ac4c28bc894d3f06f4b (diff)
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.
-rw-r--r--hw/xfree86/common/xf86.h1
-rw-r--r--hw/xfree86/common/xf86Globals.c1
-rw-r--r--hw/xfree86/common/xf86Helper.c2
-rw-r--r--hw/xfree86/common/xf86Init.c111
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");