diff -r ded9b2f2ce56 -r ac5d422c36fa open-src/xserver/xorg/driver-autoconfig.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/open-src/xserver/xorg/driver-autoconfig.patch Mon May 12 16:39:00 2008 -0700 @@ -0,0 +1,277 @@ +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use subject to license terms. +# +# 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. + +diff -urp -x '*~' -x '*.orig' hw/xfree86/common/xf86AutoConfig.c hw/xfree86/common/xf86AutoConfig.c +--- hw/xfree86/common/xf86AutoConfig.c 2008-05-07 18:53:54.780461000 -0700 ++++ hw/xfree86/common/xf86AutoConfig.c 2008-05-07 18:54:39.872308000 -0700 +@@ -40,6 +40,11 @@ + #include "xf86Priv.h" + #include "xf86_OSlib.h" + ++#ifdef sun ++# include ++# include ++#endif ++ + /* Sections for the default built-in configuration. */ + + #define BUILTIN_MODULE_SECTION \ +@@ -99,7 +104,7 @@ + + static const char **builtinConfig = NULL; + static int builtinLines = 0; +-static const char *deviceList[] = { ++static const char *fallbackDeviceList[] = { + #if defined(sun) && defined(__sparc) + "wsfb", + #else +@@ -160,70 +165,123 @@ AppendToConfig(const char *s) + AppendToList(s, &builtinConfig, &builtinLines); + } + +-static const char * +-videoPtrToDriverName(pciVideoPtr info) ++static void ++videoPtrToDriverName(pciVideoPtr info, const char *driverList[]) + { + /* + * 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 0x1142: driverList[0] = "apm"; break; ++ case 0xedd8: driverList[0] = "ark"; break; ++ case 0x1a03: driverList[0] = "ast"; break; ++ case 0x1002: ++ driverList[0] = "ati"; ++ driverList[1] = "radeonhd"; ++ break; ++ case 0x102c: driverList[0] = "chips"; break; ++ case 0x1013: driverList[0] = "cirrus"; break; + 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"; ++ if ((info->chipType == 0x00d1) || (info->chipType == 0x7800)) { ++ driverList[0] = "i740"; ++ } else { ++ driverList[0] = "intel"; ++ driverList[1] = "i810"; ++ } ++ break; ++ case 0x102b: driverList[0] = "mga"; break; ++ case 0x10c8: driverList[0] = "neomagic"; break; ++ case 0x105d: driverList[0] = "i128"; break; ++ case 0x10de: case 0x12d2: driverList[0] = "nv"; break; ++ case 0x1163: driverList[0] = "rendition";break; + case 0x5333: + switch (info->chipType) + { + case 0x88d0: case 0x88d1: case 0x88f0: case 0x8811: + case 0x8812: case 0x8814: case 0x8901: +- return "s3"; ++ driverList[0] = "s3"; ++ break; + case 0x5631: case 0x883d: case 0x8a01: case 0x8a10: + case 0x8c01: case 0x8c03: case 0x8904: case 0x8a13: +- return "s3virge"; ++ driverList[0] = "s3virge"; ++ break; + default: +- return "savage"; ++ driverList[0] = "savage"; ++ break; + } +- case 0x1039: return "sis"; +- case 0x126f: return "siliconmotion"; ++ break; ++ case 0x1039: driverList[0] = "sis"; break; ++ case 0x126f: driverList[0] = "siliconmotion"; break; + case 0x121a: + if (info->chipType < 0x0003) +- return "voodoo"; ++ driverList[0] = "voodoo"; + else +- return "tdfx"; +- case 0x3d3d: return "glint"; +- case 0x1023: return "trident"; +- case 0x100c: return "tseng"; +- case 0x1106: return "via"; +- case 0x15ad: return "vmware"; ++ driverList[0] = "tdfx"; ++ break; ++ case 0x3d3d: driverList[0] = "glint"; break; ++ case 0x1023: driverList[0] = "trident"; break; ++ case 0x100c: driverList[0] = "tseng"; break; ++ case 0x1106: ++ driverList[0] = "openchrome"; ++ driverList[1] = "via"; ++ break; ++ case 0x15ad: driverList[0] = "vmware"; break; + default: break; + } +- return NULL; + } + + Bool + xf86AutoConfig(void) + { +- const char **p; ++ const char *detectedDeviceList[8] = { NULL, NULL, NULL, NULL, ++ NULL, NULL, NULL, NULL }; ++ const char **deviceLists[3] ++ = { detectedDeviceList, fallbackDeviceList, NULL }; ++ const char **p = detectedDeviceList; ++ const char ***d; + char buf[1024]; + pciVideoPtr *pciptr, info = NULL; +- char *driver = NULL; + ConfigStatus ret; ++#ifdef sun ++ char *vendorName = NULL, *driverName = NULL; + ++ /* Check for driver type based on /dev/fb type and if valid, replace ++ detectedDeviceList */ ++ if (xf86Info.consoleFd >= 0) { ++ struct vis_identifier visid; ++ const char *cp; ++ int ddi = 0; ++ ++ if (ioctl(xf86Info.consoleFd, VIS_GETIDENTIFIER, &visid) >= 0) { ++ xf86Msg(X_PROBED, "console driver: %s\n", visid.name); ++ ++ /* Special case from before the general case was set */ ++ if (strcmp(visid.name, "NVDAnvda") == 0) { ++ detectedDeviceList[ddi++] = "nvidia"; ++ } ++ ++ /* General case - split into vendor name & driver name */ ++ if (strcmp(visid.name, "SUNWtext") != 0) { ++ for (cp = visid.name; (*cp != '\0') && isupper(*cp); cp++) { ++ /* find end of all uppercase vendor section */ ++ } ++ if ((cp != visid.name) && (*cp != '\0')) { ++ vendorName = xnfstrdup(visid.name); ++ vendorName[cp - visid.name] = '\0'; ++ driverName = xnfstrdup(cp); ++ ++ detectedDeviceList[ddi++] = vendorName; ++ detectedDeviceList[ddi++] = driverName; ++ } ++ } ++ p = &detectedDeviceList[ddi]; ++ } ++ } ++#endif ++ + /* Find the primary device, and get some information about it. */ + if (xf86PciVideoInfo) { + for (pciptr = xf86PciVideoInfo; (info = *pciptr); pciptr++) { +@@ -239,38 +297,29 @@ xf86AutoConfig(void) + } + + if (info) +- driver = videoPtrToDriverName(info); +- ++ videoPtrToDriverName(info, p); ++ + AppendToConfig(BUILTIN_MODULE_SECTION); + AppendToConfig(BUILTIN_MONITOR_SECTION); +- +- if (driver) { +- snprintf(buf, sizeof(buf), BUILTIN_DEVICE_SECTION_PRE, +- driver, 0, driver); +- AppendToConfig(buf); +- ErrorF("New driver is \"%s\"\n", driver); +- buf[0] = '\t'; +- AppendToConfig(BUILTIN_DEVICE_SECTION_POST); +- snprintf(buf, sizeof(buf), BUILTIN_SCREEN_SECTION, +- driver, 0, driver, 0); +- AppendToConfig(buf); +- } +- +- for (p = deviceList; *p; p++) { +- snprintf(buf, sizeof(buf), BUILTIN_DEVICE_SECTION, *p, 0, *p); +- AppendToConfig(buf); +- snprintf(buf, sizeof(buf), BUILTIN_SCREEN_SECTION, *p, 0, *p, 0); +- AppendToConfig(buf); ++ ++ ErrorF("Drivers to try are:"); ++ for (d = deviceLists; *d ; d++) { ++ for (p = *d; *p; p++) { ++ ErrorF(" \"%s\"", *p); ++ snprintf(buf, sizeof(buf), BUILTIN_DEVICE_SECTION, *p, 0, *p); ++ AppendToConfig(buf); ++ snprintf(buf, sizeof(buf), BUILTIN_SCREEN_SECTION, *p, 0, *p, 0); ++ AppendToConfig(buf); ++ } + } ++ ErrorF("\n"); + + AppendToConfig(BUILTIN_LAYOUT_SECTION_PRE); +- if (driver) { +- snprintf(buf, sizeof(buf), BUILTIN_LAYOUT_SCREEN_LINE, driver, 0); +- AppendToConfig(buf); +- } +- for (p = deviceList; *p; p++) { +- snprintf(buf, sizeof(buf), BUILTIN_LAYOUT_SCREEN_LINE, *p, 0); +- AppendToConfig(buf); ++ for (d = deviceLists; *d ; d++) { ++ for (p = *d; *p; p++) { ++ snprintf(buf, sizeof(buf), BUILTIN_LAYOUT_SCREEN_LINE, *p, 0); ++ AppendToConfig(buf); ++ } + } + AppendToConfig(BUILTIN_LAYOUT_SECTION_POST); + +@@ -287,6 +336,11 @@ xf86AutoConfig(void) + ret = xf86HandleConfigFile(TRUE); + FreeConfig(); + ++#ifdef sun ++ xfree(driverName); ++ xfree(vendorName); ++#endif ++ + if (ret != CONFIG_OK) + xf86Msg(X_ERROR, "Error parsing the built-in default configuration.\n"); +