Remove getconfig horrorshow. Replace with a static built-in rule list for now.

This commit is contained in:
Adam Jackson 2006-07-26 19:03:39 -04:00
parent 39158e98ac
commit 990a400905
11 changed files with 65 additions and 1077 deletions

View File

@ -1659,7 +1659,6 @@ hw/xfree86/dri/Makefile
hw/xfree86/dummylib/Makefile
hw/xfree86/exa/Makefile
hw/xfree86/fbdevhw/Makefile
hw/xfree86/getconfig/Makefile
hw/xfree86/i2c/Makefile
hw/xfree86/int10/Makefile
hw/xfree86/loader/Makefile

View File

@ -7,12 +7,12 @@ DOC_SUBDIR = doc
SUBDIRS = common ddc dummylib i2c x86emu int10 fbdevhw os-support parser rac \
ramdac shadowfb vbe vgahw xaa xf1bpp xf4bpp xf8_16bpp \
xf8_32bpp loader scanpci dixmods exa \
$(DRI_SUBDIR) utils $(DOC_SUBDIR) getconfig
$(DRI_SUBDIR) utils $(DOC_SUBDIR)
DIST_SUBDIRS = common ddc dummylib i2c x86emu int10 fbdevhw os-support \
parser rac ramdac shadowfb vbe vgahw xaa xf1bpp xf4bpp \
xf8_16bpp xf8_32bpp loader scanpci dixmods dri exa \
utils doc getconfig
utils doc
bin_PROGRAMS = Xorg

View File

@ -1,6 +1,3 @@
/* $DHD: xc/programs/Xserver/hw/xfree86/common/xf86AutoConfig.c,v 1.15 2003/09/24 19:39:36 dawes Exp $ */
/* $XdotOrg: $ */
/*
* Copyright 2003 by David H. Dawes.
* Copyright 2003 by X-Oz Technologies.
@ -32,7 +29,6 @@
* Author: David Dawes <dawes@XFree86.Org>.
*/
#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
@ -44,9 +40,7 @@
#include "xf86Priv.h"
#include "xf86_OSlib.h"
/*
* Sections for the default built-in configuration.
*/
/* Sections for the default built-in configuration. */
#define BUILTIN_MODULE_SECTION \
"Section \"Module\"\n" \
@ -100,17 +94,6 @@
#define BUILTIN_LAYOUT_SECTION_POST \
"EndSection\n\n"
#ifndef GET_CONFIG_CMD
#define GET_CONFIG_CMD "getconfig"
#endif
#ifndef GETCONFIG_DIR
#define GETCONFIG_DIR PROJECTROOT "/lib/X11/getconfig"
#endif
#define GETCONFIG_WHITESPACE " \t\n"
static const char **builtinConfig = NULL;
static int builtinLines = 0;
static const char *deviceList[] = {
@ -170,6 +153,61 @@ AppendToConfig(const char *s)
AppendToList(s, &builtinConfig, &builtinLines);
}
static const char *
videoPtrToDriverName(pciVideoPtr info)
{
/*
* things not handled yet:
* amd/cyrix/nsc
* xgi
*/
switch (info->vendor)
{
case 0x1142: return "apm";
case 0xedd8: return "ark";
case 0x1a03: return "ast";
case 0x1002: return "ati";
case 0x102c: return "chips";
case 0x1013: return "cirrus";
case 0x8086:
if ((info->chipType == 0x00d1) || (info->chipType == 0x7800))
return "i740";
else return "i810";
case 0x102b: return "mga";
case 0x10c8: return "neomagic";
case 0x105d: return "i128";
case 0x10de: case 0x12d2: return "nv";
case 0x1163: return "rendition";
case 0x5333:
switch (info->chipType)
{
case 0x88d0: case 0x88d1: case 0x88f0: case 0x8811:
case 0x8812: case 0x8814: case 0x8901:
return "s3";
case 0x5631: case 0x883d: case 0x8a01: case 0x8a10:
case 0x8c01: case 0x8c03: case 0x8904: case 0x8a13:
return "s3virge";
default:
return "savage";
}
case 0x1039: return "sis";
case 0x126f: return "siliconmotion";
case 0x121a:
if (info->chipType < 0x0003)
return "voodoo";
else
return "tdfx";
case 0x3d3d: return "glint";
case 0x1023: return "trident";
case 0x100c: return "tseng";
case 0x1106: return "via";
case 0x15ad: return "vmware";
default: break;
}
return NULL;
}
Bool
xf86AutoConfig(void)
{
@ -177,7 +215,6 @@ xf86AutoConfig(void)
char buf[1024];
pciVideoPtr *pciptr, info = NULL;
char *driver = NULL;
FILE *gp = NULL;
ConfigStatus ret;
/* Find the primary device, and get some information about it. */
@ -194,108 +231,8 @@ xf86AutoConfig(void)
ErrorF("xf86PciVideoInfo is not set\n");
}
if (info) {
char *tmp;
char *path = NULL, *a, *b;
char *searchPath = NULL;
/*
* Look for the getconfig program first in the xf86ModulePath
* directories, then in GETCONFIG_DIR, then in BINDIR. If it
* isn't found in any of those locations, just use the normal
* search path.
*/
if (xf86ModulePath) {
a = xnfstrdup(xf86ModulePath);
b = strtok(a, ",");
while (b) {
path = xnfrealloc(path,
strlen(b) + 1 + strlen(GET_CONFIG_CMD) + 1);
sprintf(path, "%s/%s", b, GET_CONFIG_CMD);
if (access(path, X_OK) == 0)
break;
b = strtok(NULL, ",");
}
if (!b) {
xfree(path);
path = NULL;
}
xfree(a);
}
if (!path) {
path = xnfstrdup(GETCONFIG_DIR "/" GET_CONFIG_CMD);
if (access(path, X_OK) != 0) {
xfree(path);
path = NULL;
}
}
#ifdef BINDIR
if (!path) {
path = xnfstrdup(BINDIR "/" GET_CONFIG_CMD);
if (access(path, X_OK) != 0) {
xfree(path);
path = NULL;
}
}
#endif
if (!path)
path = xnfstrdup(GET_CONFIG_CMD);
/*
* Build up the config file directory search path:
*
* /etc/X11
* PROJECTROOT/etc/X11
* xf86ModulePath
* PROJECTROOT/lib/X11/getconfig (GETCONFIG_DIR)
*/
searchPath = xnfalloc(strlen("/etc/X11") + 1 +
strlen(PROJECTROOT "/etc/X11") + 1 +
(xf86ModulePath ? strlen(xf86ModulePath) : 0)
+ 1 +
strlen(GETCONFIG_DIR) + 1);
strcpy(searchPath, "/etc/X11," PROJECTROOT "/etc/X11,");
if (xf86ModulePath && *xf86ModulePath) {
strcat(searchPath, xf86ModulePath);
strcat(searchPath, ",");
}
strcat(searchPath, GETCONFIG_DIR);
ErrorF("xf86AutoConfig: Primary PCI is %d:%d:%d\n",
info->bus, info->device, info->func);
snprintf(buf, sizeof(buf), "%s"
#ifdef DEBUG
" -D"
#endif
" -X %d"
" -I %s"
" -v 0x%04x -d 0x%04x -r 0x%02x -s 0x%04x"
" -b 0x%04x -c 0x%04x",
path,
(unsigned int)xorgGetVersion(),
searchPath,
info->vendor, info->chipType, info->chipRev,
info->subsysVendor, info->subsysCard,
info->class << 8 | info->subclass);
ErrorF("Running \"%s\"\n", buf);
gp = Popen(buf, "r");
if (gp) {
if (fgets(buf, sizeof(buf) - 1, gp)) {
buf[strlen(buf) - 1] = '\0';
tmp = strtok(buf, GETCONFIG_WHITESPACE);
if (tmp)
driver = xnfstrdup(tmp);
}
}
xfree(path);
xfree(searchPath);
}
if (info)
driver = videoPtrToDriverName(info);
AppendToConfig(BUILTIN_MODULE_SECTION);
AppendToConfig(BUILTIN_MONITOR_SECTION);
@ -306,19 +243,12 @@ xf86AutoConfig(void)
AppendToConfig(buf);
ErrorF("New driver is \"%s\"\n", driver);
buf[0] = '\t';
while (fgets(buf + 1, sizeof(buf) - 2, gp)) {
AppendToConfig(buf);
ErrorF("Extra line: %s", buf);
}
AppendToConfig(BUILTIN_DEVICE_SECTION_POST);
snprintf(buf, sizeof(buf), BUILTIN_SCREEN_SECTION,
driver, 0, driver, 0);
AppendToConfig(buf);
}
if (gp)
Pclose(gp);
for (p = deviceList; *p; p++) {
snprintf(buf, sizeof(buf), BUILTIN_DEVICE_SECTION, *p, 0, *p);
AppendToConfig(buf);
@ -337,13 +267,6 @@ xf86AutoConfig(void)
}
AppendToConfig(BUILTIN_LAYOUT_SECTION_POST);
#ifdef BUILTIN_EXTRA
AppendToConfig(BUILTIN_EXTRA);
#endif
if (driver)
xfree(driver);
xf86MsgVerb(X_DEFAULT, 0,
"Using default built-in configuration (%d lines)\n",
builtinLines);
@ -356,12 +279,9 @@ xf86AutoConfig(void)
xf86setBuiltinConfig(builtinConfig);
ret = xf86HandleConfigFile(TRUE);
FreeConfig();
switch(ret) {
case CONFIG_OK:
return TRUE;
default:
xf86Msg(X_ERROR, "Error parsing the built-in default configuration.\n");
return FALSE;
}
}
if (ret != CONFIG_OK)
xf86Msg(X_ERROR, "Error parsing the built-in default configuration.\n");
return (ret == CONFIG_OK);
}

View File

@ -1,4 +0,0 @@
getconfig.1
getconfig.1x
getconfig.5
getconfig.5x

View File

@ -1,56 +0,0 @@
# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, and/or sell copies of the Software, and to permit persons
# to whom the Software is furnished to do so, provided that the above
# copyright notice(s) and this permission notice appear in all copies of
# the Software and that both the above copyright notice(s) and this
# permission notice appear in supporting documentation.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
# OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
# INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# Except as contained in this notice, the name of a copyright holder
# shall not be used in advertising or otherwise to promote the sale, use
# or other dealings in this Software without prior written authorization
# of the copyright holder.
#
dist_bin_SCRIPTS = getconfig getconfig.pl
getconfigdir = $(libdir)/X11/getconfig
dist_getconfig_DATA = xorg.cfg cfg.sample
include $(top_srcdir)/cpprules.in
appmandir = $(APP_MAN_DIR)
appman_PRE = getconfig.man
appman_DATA = $(appman_PRE:man=@APP_MAN_SUFFIX@)
filemandir = $(FILE_MAN_DIR)
fileman_DATA = getconfig.$(FILE_MAN_SUFFIX)
getconfig.$(FILE_MAN_SUFFIX): cfg.man
-rm -f getconfig.$(FILE_MAN_SUFFIX)
$(LN_S) cfg.man getconfig.$(FILE_MAN_SUFFIX)
SUFFIXES += .$(APP_MAN_SUFFIX) .man
.man.$(APP_MAN_SUFFIX):
-rm -f $@
$(LN_S) $< $@
BUILT_SOURCES = $(appman_PRE)
CLEANFILES = $(appman_PRE) $(appman_DATA) $(fileman_DATA) cfg.man
EXTRA_DIST = cfg.man.pre getconfig.man.pre

View File

@ -1,137 +0,0 @@
.TH getconfig __filemansuffix__ __vendorversion__
.SH NAME
getconfig - meta configuration files for getconfig(1)
.SH SYNOPSIS
.B \(**.cfg
.SH DESCRIPTION
.B getconfig
is a programmatic interface that is used by the
.B __xservername__
server to get configuration information about video hardware when
operating without an
.B __xconfigfile__
file.
.PP
This implementation of
.B getconfig
is written in perl. It processes rules from meta-configuration files.
All meta-configuration files have a
.I .cfg
suffix.
.PP
Lines starting with a pound-sign (#) are comments, and are ignored.
Blank lines that consist only of white space are also treated as comments
and ignored.
.PP
The first non-comment line must be a signature string followed by
the file format version number. The signature string is
.PP
.RS 4
.nf
"Xorg getconfig rules file.\ \ Version: "
.fi
.RE
.PP
The currently defined version is "1.0". Files that do not have the
correct signature string are ignored.
.PP
The remaining non-comment lines define rules. The start of a new rule
is indicated by a line with no leading white space. Subsequent lines
making up a rule must be indented with white space. Logical lines within
a rule may be split over multiple physical lines by using the usual
continuation convention ('\e' at the end of the line). The first logical
line of each rule is a perl expression. It may be any valid perl
expression whose evaluated (with 'eval') result may be used as the
argument to a perl 'if' statement. The second logical line should be
the name of the __xservername__ video driver to use when the rule is true, and
subsequent logical lines of each rule, if present, are additional
configuration output for the video device's
.B __xconfigfile__
.B Device
section. The driver name and additional lines of configuration information
are written to standard output when the rule is chosen as the successful
rule.
.PP
Pseudo rules consisting of perl expressions may be present in the file
for the purpose of defining custom perl variables or setting the weight
to use for the following rules. Pseudo rules are rules that consist of
a single logical line only, and the are never candidates themselves for the
successful rule.
.PP
Several perl variables are pre-defined, and may be used within rules.
They include:
.PP
.RS 4
.nf
.BR "$vendor " "PCI vendor ID"
.BR "$device " "PCI device ID"
.BR "$revision " "PCI revision ID"
.BR "$subsys " "PCI subsystem ID"
.BR "$subsysVendor " "PCI subsystem vendor ID"
.BR "$class " "PCI class"
.BR "$XorgVersion " "Xorg version, as a 'v' string"
.BR "$XorgVersionNumeric " "Xorg numeric version"
.BR "$XorgVersionMajor " "Xorg major version"
.BR "$XorgVersionMinor " "Xorg minor version"
.BR "$XorgVersionPatch " "Xorg patch version"
.BR "$XorgVersionSnap " "Xorg snap version"
.BR "$weight " "current rule weight"
.fi
.RE
.PP
The
.B $weight
variable determines the weight of the rules as they are processed. The
weight for subsequent rules may be set with a pseudo rule that sets or
changes the value of
.BR $weight .
The default weight, and the weight used for built-in rules is 500. The
meta-configuration files are processed in an unpredictable order. The
weighting of the rules is used to determine their relative priority
.PP
After processing all of the rules, both built-in and those read from
the meta-configuration files, the
.B getconfig
program chooses as the successful rule the last and highest weighted
rule that evaluates to true.
.SH FILES
.I .cfg
files located in the search path. The search path typically specified
by the
.B __xservername__
server is:
.PP
.RS 4
.nf
.I /etc/X11
.I __projectroot__/etc/X11
.I <modulepath>
.I __projectroot__/lib/X11/getconfig
.fi
.RE
.PP
where
.I <modulepath>
is the
.B __xservername__
server's module search path.
.PP
.TP 30
.I __projectroot__/lib/X11/getconfig/xorg.cfg
Default rules file that gets installed. This file doesn't contain any
rules by default.
.TP 30
.I __projectroot__/lib/X11/getconfig/cfg.sample
A sample rules file that gives some examples of what types of rules can
appear in rules files.
.SH "SEE ALSO"
getconfig(1),
__xservername__(__appmansuffix__),
__xconfigfile__(__filemansuffix__).
.SH AUTHORS
The __xservername__ automatic configuration support and the
.B getconfig
interface was written by David H. Dawes, with the support of X-Oz
Technologies for XFree86.

View File

@ -1,110 +0,0 @@
# $DHD: xc/programs/Xserver/hw/xfree86/getconfig/cfg.sample,v 1.2 2003/09/23 05:12:07 dawes Exp $
# Some sample Xorg getconfig rules file.
#
# The line below is the getconfig rules file signature, and must be the
# first non-blank, non-comment line.
#
Xorg Project getconfig rules file. Version: 1.0
#
# Set the weight for the following rules. This should be set, otherwise
# the previously set weight will get used, and you have no idea of knowing
# what that might be.
#
$weight = 1000
#
# Rules. Rules consist of a condition (in perl code) followed by
# a driver name and optionally some additional strings. The start of a
# rule is indicated by a line with no leading white space. Subsequent
# lines making up a rule must be indented. Logical lines may be split
# over multiple physical lines by using the usual continuation '\'.
#
# Rules that are not followed by a driver name may be used to do other
# things, like setting the weight as above.
#
#
# Pre-defined variables include:
#
# $vendor PCI vendor ID
# $device PCI device ID
# $revision PCI revision ID
# $subsys PCI subsystem ID
# $subsysVendor PCI subsystem vendor ID
# $class PCI class
# $XorgVersion Xorg version, as a 'v' string.
#
# The Xorg version information is also available as the following:
#
# $XorgVersionNumeric
# $XorgVersionMajor
# $XorgVersionMinor
# $XorgVersionPatch
# $XorgVersionSnap
#
# Define a fake vendor ID for some sample rules.
$novendor = 0x10000
$nodevice = 0x10000
$vendor == $novendor
nodriver
Option "xx"
Videoram 1000
# A rule with continued lines.
$vendor == $novendor && \
$device == $nodevice
nodriver2
Option \
"yy"
# Increase the weight of the following rules if the Xorg version is 4.3 or
# higher.
$weight++ if ($XorgVersion ge v4.3)
$vendor == $novendor
nodriver
Option "yy"
#
# The weight can be changed at any times, and applies to rules that follow
# until changed again.
#
$weight = 100
$vendor == $novendor && $XorgVersion eq v4.3.2.1
nodriver3
$weight = 600
#
# The following two examples use some real values.
#
# Example: make the default depth 24 for Radeon R200 and RV200 cards.
$vendor == 0x1002 && \
($device >= 0x5148 && $device <= 0x514F || \
$device >= 0x5168 && $device <= 0x516C || \
$device == 0x4242 || \
$device >= 0x5157 && device <= 0x5158)
ati
Option "DefaultDepth" "24"
# Example: enable DRI for MGA G400
$vendor == 0x102b && $device == 0x0525
mga
Option "dri"

View File

@ -1,43 +0,0 @@
#!/bin/sh
# $XdotOrg$
#
# Copyright 2003 by David H. Dawes.
# Copyright 2003 by X-Oz Technologies.
# All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# Except as contained in this notice, the name of the copyright holder(s)
# and author(s) shall not be used in advertising or otherwise to promote
# the sale, use or other dealings in this Software without prior written
# authorization from the copyright holder(s) and author(s).
#
# Author: David Dawes <dawes@XFree86.Org>.
#
# A simple wrapper to execute the real getconfig program. So long as perl
# is in $PATH, we don't need to know where it is this way.
if echo $0 | grep / >/dev/null 2>&1; then
DIR=`dirname $0`/
fi
exec perl ${DIR}getconfig.pl "$@"

View File

@ -1,98 +0,0 @@
.TH getconfig 1 __vendorversion__
.SH NAME
getconfig - get configuration information for the __xservername__ server
.SH SYNOPSIS
.B getconfig
.RI [ option
.IR ... ]
.SH DESCRIPTION
.B getconfig
is a programmatic interface that is used by the
.B __xservername__
server to get configuration information about video hardware when
operating without an
.B __xconfigfile__
file.
.PP
This implementation of
.B getconfig
is written in perl. It processes a prioritized and ordered list of
rules supplied internally and from meta-configuration files. The rules
are in the form of perl expressions.
.B getconfig
writes to standard output the __xconfigfile__-style configuration data
specified by the last highest priority rule that evaluates to true.
Information about the format of the meta-configuration files can be
found in the getconfig(__filemansuffix__) manual page.
.SH OPTIONS
.TP 8
.BI \-I " search-path"
Specify the search path to use for meta-config files.
.I search-path
is a comma-separated list of directories to search. Each directory in
the search path is searched for files with a
.I .cfg
suffix. Each such file is opened and checked for a valid signature
string. Rules are read from files with a valid signature string and
appended to the list of rules to evaluate. If no search path is specified,
only the internally supplied configuration rules will be used.
.TP 8
.B \-D
Enable debugging output.
.TP 8
.B \-V
Print out the version information and exit.
.TP 8
.BI \-X
.BI __xservername__-version
Specify the __xservername__ version in numeric (integer) form.
.TP 8
.BI \-b " subsys-id"
Specify the PCI subsystem ID of the video device.
.TP 8
.BI \-c " class"
Specify the PCI class of the video device.
.TP 8
.BI \-d " device-id"
Specify the PCI devide ID of the video device.
.TP 8
.BI \-r " revision"
Specify the PCI revision of the video device.
.TP 8
.BI \-s " subsysvendor-id"
Specify the PCI subsystem vendor ID of the video device.
.TP 8
.BI \-v " vendor-id"
Specify the PCI vendor ID of the video device.
.SH FILES
.I .cfg
files located in the search path. The search path typically specified
by the
.B __xservername__
server is:
.PP
.RS 4
.nf
.I /etc/X11
.I __projectroot__/etc/X11
.I <modulepath>
.I __projectroot__/lib/X11/getconfig
.fi
.RE
.PP
where
.I <modulepath>
is the
.B __xservername__
server's module search path.
.SH "SEE ALSO"
getconfig(__filemansuffix__),
__xservername__(__appmansuffix__),
__xconfigfile__(__filemansuffix__).
.SH AUTHORS
The __xservername__ automatic configuration support and the
.B getconfig
interface was written by David H. Dawes, with the support of X-Oz
Technologies for XFree86.

View File

@ -1,433 +0,0 @@
#!/usr/bin/perl
# $DHD: xc/programs/Xserver/hw/xfree86/getconfig/getconfig.pl,v 1.13 2003/09/23 05:12:07 dawes Exp $
# $XdotOrg: $
#
# Copyright 2003 by David H. Dawes.
# Copyright 2003 by X-Oz Technologies.
# All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# Except as contained in this notice, the name of the copyright holder(s)
# and author(s) shall not be used in advertising or otherwise to promote
# the sale, use or other dealings in this Software without prior written
# authorization from the copyright holder(s) and author(s).
#
# Author: David Dawes <dawes@XFree86.Org>.
#
#
# This script takes PCI id information, compares it against an ordered list
# of rules, and prints out the configuration information specified by the
# last matching rule.
#
# This script is called by xf86AutoConfig().
#
# Command line processing.
$GetconfigVersion = v1.0;
$debug = 0;
$myname = $0;
$myname =~ s/.*\///;
$signature = "Xorg Foundation getconfig rules file. Version: ";
while (@ARGV[0] =~ /^-[A-Za-z]$/) {
$f = shift;
SWITCH: {
if ($f eq "-D") {
$debug = 1;
last SWITCH;
}
if ($f eq "-I") {
push(@searchPaths, split(/,/, shift));
last SWITCH;
}
if ($f eq "-V") {
printf STDERR "$myname: Version %vd.\n", $GetconfigVersion;
exit 0;
}
if ($f eq "-X") {
$XorgVersionNumeric = shift;
if (!defined($XorgVersionNumeric)) {
print STDERR "$myname: -X requires the Xorg version.\n";
exit 1;
}
}
if ($f eq "-b") {
$subsys = oct(shift);
if (!defined($subsys)) {
print STDERR "$myname: -b requires the subsys id.\n";
exit 1;
}
last SWITCH;
}
if ($f eq "-c") {
$class = oct(shift);
if (!defined($class)) {
print STDERR "$myname: -c requires the class value.\n";
exit 1;
}
last SWITCH;
}
if ($f eq "-d") {
$device = oct(shift);
if (!defined($device)) {
print STDERR "$myname: -d requires the device id.\n";
exit 1;
}
last SWITCH;
}
if ($f eq "-r") {
$revision = oct(shift);
if (!defined($revision)) {
print STDERR "$myname: -r requires the device revision.\n";
exit 1;
}
last SWITCH;
}
if ($f eq "-s") {
$subsysVendor = oct(shift);
if (!defined($subsysVendor)) {
print STDERR "$myname: -s requires the subsysVendor id.\n";
exit 1;
}
last SWITCH;
}
if ($f eq "-v") {
$vendor = oct(shift);
if (!defined($vendor)) {
print STDERR "$myname: -v requires the vendor id.\n";
exit 1;
}
last SWITCH;
}
}
}
printf STDERR "$myname: Version %vd.\n", $GetconfigVersion;
if (defined($XorgVersionNumeric)) {
$XorgVersionMajor = $XorgVersionNumeric / 10000000;
$XorgVersionMinor = ($XorgVersionNumeric % 10000000) / 100000;
$XorgVersionPatch = ($XorgVersionNumeric % 100000) / 1000;
$XorgVersionSnapshot = $XorgVersionNumeric % 1000;
$XorgVersion = chr($XorgVersionMajor) . chr($XorgVersionMinor) .
chr($XorgVersionPatch) . chr($XorgVersionSnapshot);
}
if ($debug) {
printf STDERR "$myname: Xorg Version: %d, %d.%d.%d.%d, %vd.\n",
$XorgVersionNumeric, $XorgVersionMajor, $XorgVersionMinor,
$XorgVersionPatch, $XorgVersionSnapshot, $XorgVersion;
} else {
printf STDERR "$myname: Xorg Version: %vd.\n", $XorgVersion;
}
# The rules here are just basic vendor ID to driver mappings.
# Ideally this is all that would be required. More complicated configuration
# rules will be provided in external files.
# XXX This set of basic rules isn't complete yet.
@rules = (
# Set the weight for the built-in rules.
['$weight = 500'],
# APM
['$vendor == 0x1142',
'apm'],
# ARK
['$vendor == 0xedd8',
'apm'],
# AST
['$vendor == 0x1a03',
'ast'],
# ATI
['$vendor == 0x1002',
'ati'],
# Chips & Technologies
['$vendor == 0x102c',
'chips'],
# Cirrus
['$vendor == 0x1013',
'cirrus'],
# Intel
['$vendor == 0x8086',
'i810'],
['$vendor == 0x8086 && ($chipType == 0x00d1 || $chipType == 0x7800)',
'i740'],
# Matrox
['$vendor == 0x102b',
'mga'],
# Neomagic
['$vendor == 0x10c8',
'neomagic'],
# Number Nine
['$vendor == 0x105d',
'i128'],
# NVIDIA
['$vendor == 0x10de || $vendor == 0x12d2',
'nv'],
# S3
['$vendor == 0x5333 && ($device == 0x88d0 ||' .
'$device == 0x88d1 ||' .
'$device == 0x88f0 ||' .
'$device == 0x8811 ||' .
'$device == 0x8812 ||' .
'$device == 0x8814 ||' .
'$device == 0x8901)',
's3'],
# S3 virge
['$vendor == 0x5333 && ($device == 0x5631 ||' .
'$device == 0x883d ||' .
'$device == 0x8a01 ||' .
'$device == 0x8a10 ||' .
'$device == 0x8c01 ||' .
'$device == 0x8c03 ||' .
'$device == 0x8904 ||' .
'$device == 0x8a13)',
's3virge'],
# S3 Savage
['$vendor == 0x5333 && ($device >= 0x8a20 && $device <= 0x8a22 ||' .
'$device == 0x9102 ||' .
'$device >= 0x8c10 && $device <= 0x8c13 ||' .
'$device == 0x8a25 ||' .
'$device == 0x8a26 ||' .
'$device >= 0x8d01 && $device <= 0x8d04 ||' .
'$device >= 0x8c2a && $device <= 0x8c2f ||' .
'$device == 0x8c22 ||' .
'$device == 0x8c24 ||' .
'$device == 0x8c26)',
'savage'],
# SIS
['$vendor == 0x1039',
'sis'],
# SMI
['$vendor == 0x126f',
'siliconmotion'],
# 3Dfx
['$vendor == 0x121a',
'tdfx'],
# 3Dlabs
['$vendor == 0x3d3d',
'glint'],
# Trident
['$vendor == 0x1023',
'trident'],
# Tseng Labs
['$vendor == 0x100c',
'tseng'],
# VIA
['$vendor == 0x1106',
'via'],
# VMware
['$vendor == 0x15ad',
'vmware'],
);
# Reverse the search path list, since the later rules have higher priority
# than earlier ones (weighting being equal).
@searchPaths = reverse(@searchPaths);
if ($debug) {
$i = 0;
for $path (@searchPaths) {
print STDERR "$myname: Search path $i is: \"$path\".\n";
$i++;
}
}
print STDERR "$myname: ", $#rules + 1, " built-in rule", plural($#rules + 1),
".\n";
for $path (@searchPaths) {
while (<$path/*.cfg>) {
@tmp = readRulesFile($_);
if (defined(@tmp[0])) {
push @rules, @tmp;
}
}
}
if ($debug) {
$i = 0;
for $r (@rules) {
print STDERR "$myname: rule $i is: \'@$r\'.\n";
$i++
}
}
$i = 0;
$e = 0;
$weight = 0;
$w = 0;
for $r (@rules) {
($cond, $d, @o) = @$r;
$result = eval $cond;
if ($@) {
print STDERR "$myname: Error evaluating rule $i \'$cond\': $@";
$e++;
}
if ($debug) {
print STDERR "$myname: rule $i \'$cond\' evaluates to \'$result\'.\n";
}
if ($result && defined($d) && $weight >= $w) {
$driver = $d;
@opts = @o;
$w = $weight;
}
$i++;
}
print STDERR "$myname: Evaluated $i rule", plural($i),
" with $e error", plural($e), ".\n";
print STDERR "$myname: Weight of result is $w.\n";
if ($debug) {
if (defined($driver)) {
print STDERR "$myname: Driver is \'$driver\'.\n";
} else {
print STDERR "$myname: No driver.\n";
}
if (defined(@opts)) {
print STDERR "$myname: options are:\n";
for $opt (@opts) {
print STDERR "\t$opt\n";
}
} else {
print STDERR "$myname: No options.\n";
}
}
print "$driver\n";
for $opt (@opts) {
print "$opt\n";
}
exit 0;
# Subroutines.
sub readRulesFile {
my ($file) = @_;
my $signatureOK = 0;
my @r, @tmp;
my $line, $cont, $prevcont, $fileversion;
undef @tmp;
undef @r;
if (open(RF, "<$file")) {
$prevcont = 0;
while (<RF>) {
chop;
$line = $_;
next if ($line =~ /^#/);
next if ($line =~ /^\s*$/);
if (!$signatureOK) {
if ($line =~ /^$signature(.*)$/) {
$fileversion = $1;
$signatureOK = 1;
print STDERR
"$myname: rules file \'$file\' has version $fileversion.\n";
next;
}
}
if (!$signatureOK) {
print STDERR "$myname: file \'$file\' has bad signature.\n";
close(RF);
last;
}
$cont = 0;
if ($line =~ s/\\\s*$//) {
$cont = 1;
}
if (!$prevcont && $line =~ /^\S+/) {
if (defined(@tmp[0])) {
push(@r,[@tmp]);
}
undef @tmp;
}
if ($prevcont) {
push(@tmp, pop(@tmp) . $line);
} else {
push(@tmp, $line);
}
$prevcont = $cont;
}
if (defined(@tmp[0])) {
push(@r,[@tmp]);
}
if (!defined(@r[0])) {
print STDERR "$myname: no rules in file \'$file\'.\n";
} else {
print STDERR "$myname: ", $#r + 1,
" rule", plural($#r + 1),
" added from file \'$file\'.\n";
}
} else {
print STDERR "$myname: cannot open file \'$file\'.\n";
}
return @r;
}
sub plural {
my ($count) = @_;
if ($count != 1) {
return "s";
} else {
return "";
}
}

View File

@ -1,50 +0,0 @@
# $XdotOrg: xc/programs/Xserver/hw/xfree86/getconfig/xorg.cfg,v 1.2 2004/04/23 19:54:01 eich Exp $
# Base Xorg getconfig rules file.
#
# The line below is the getconfig rules file signature, and must be the
# first non-blank, non-comment line.
#
Xorg Foundation getconfig rules file. Version: 1.0
#
# Set the weight for the following rules. This should be set, otherwise
# the previously set weight will get used, and you have no idea of knowing
# what that might be.
#
$weight = 1000
#
# Rules. Rules consist of a condition (in perl code) followed by
# a driver name and optionally some additional strings. The start of a
# rule is indicated by a line with no leading white space. subsequent
# lines making up a rule must be indented. Logical lines may be split
# over multiple physical lines by using the usual continuation '\'.
#
# Rules that are not followed by a driver name may be used to do other
# things, like setting the weight as above.
#
#
# Pre-defined variables include:
#
# $vendor PCI vendor ID
# $device PCI device ID
# $revision PCI revision ID
# $subsys PCI subsystem ID
# $subsysVendor PCI subsystem vendor ID
# $class PCI class
# $XorgVersion Xorg version, as a 'v' string.
#
# The Xorg version information is also available as the following:
#
# $XorgVersionNumeric
# $XorgVersionMajor
# $XorgVersionMinor
# $XorgVersionPatch
# $XorgVersionSnap
#