Adam Jackson wrote:
On Sun, 2008-09-07 at 02:13 -0400, Nathaniel McCallum wrote:

There are still some problems though (and I'd appreciate any advise on how to solve them): 1. It crashes when the ati "umbrella" driver is installed, I'm not sure why...

Adding this hunk makes it work for me:

--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -1486,6 +1486,8 @@ xf86MatchDevice(const char *drivername, GDevPtr 
**sectlist)
     if (sectlist)
        *sectlist = NULL;

+    if (xf86DoModalias) return 0;
+
     if (xf86DoProbe) return 1;

     if (xf86DoConfigure && xf86DoConfigurePass1) return 1;

2. It seems to want to initialize the display (or something). Could someone help me move this option to earlier in the Xorg start-up process so we don't have to mess with peoples' displays?

Admittedly I tested this on a headless machine, so I'm not sure what
you're talking about here.  Possibly the initial vt switch?
The following patch plus "-sharevts -novtswitch" should solve the issues remaining. I'd like to actually propose it for inclusion. What do I need to do?

Nathaniel
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-11 
16:24:33.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-11 16:24:33.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-11 
16:24:33.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-11 
16:24:58.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,12 @@
     xf86AllowMouseOpenFail = TRUE;
     return 1;
   }
+  if (!strcmp(argv[i], "-modalias"))
+  {
+    xf86DoModalias = TRUE;
+    xf86AllowMouseOpenFail = TRUE;
+    return 1;
+  }
   if (!strcmp(argv[i], "-isolateDevice"))
   {
     int bus, device, func;
@@ -1722,6 +1810,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");
_______________________________________________
xorg mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/xorg

Reply via email to