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.
This commit is contained in:
Nathaniel McCallum 2008-10-14 09:50:29 -04:00 committed by Adam Jackson
parent 3eb52de7f2
commit 8e368cf5b9
4 changed files with 105 additions and 10 deletions

View File

@ -56,6 +56,7 @@
/* General parameters */
extern int xf86DoConfigure;
extern Bool xf86DoModalias;
extern Bool xf86DoConfigurePass1;
extern DevPrivateKey xf86ScreenKey;
extern DevPrivateKey xf86CreateRootWindowKey;

View File

@ -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;

View File

@ -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;

View File

@ -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");