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