6699579 Xorg driver selection based on VIS_GETIDENTIFIER [PSARC 2008/294]
authorAlan Coopersmith <Alan.Coopersmith@Sun.COM>
Mon, 12 May 2008 16:39:00 -0700
changeset 412 ac5d422c36fa
parent 411 ded9b2f2ce56
child 413 e9ff2327152c
6699579 Xorg driver selection based on VIS_GETIDENTIFIER [PSARC 2008/294] 6642276 Xorg will not use radeonhd driver without an xorg.conf
open-src/xserver/xorg/driver-autoconfig.patch
open-src/xserver/xorg/nvidia-autoconfig.patch
open-src/xserver/xorg/patch-list
--- /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 <sys/visual_io.h>
++# include <ctype.h>
++#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");
+ 
--- a/open-src/xserver/xorg/nvidia-autoconfig.patch	Mon May 12 16:38:17 2008 -0700
+++ b/open-src/xserver/xorg/nvidia-autoconfig.patch	Mon May 12 16:39:00 2008 -0700
@@ -26,43 +26,6 @@
 # or other dealings in this Software without prior written authorization
 # of the copyright holder.
 
---- hw/xfree86/common/xf86AutoConfig.c	2006-12-06 22:08:26.575466000 -0800
-+++ hw/xfree86/common/xf86AutoConfig.c	2006-12-07 15:19:47.671859000 -0800
-@@ -40,6 +40,10 @@
- #include "xf86Priv.h"
- #include "xf86_OSlib.h"
- 
-+#if defined(sun) && !defined(__sparc)
-+# include <sys/visual_io.h>
-+#endif
-+
- /* Sections for the default built-in configuration. */
- 
- #define BUILTIN_MODULE_SECTION \
-@@ -242,6 +246,22 @@
-     if (info)
- 	driver = videoPtrToDriverName(info);
- 
-+#if defined(sun) && !defined(__sparc)
-+    /* Check for nvidia accelerated driver - needs to be replaced with
-+     * more general mechanism for selecting drivers based on fbtype
-+     */
-+    if (xf86Info.consoleFd  >= 0) {
-+	struct vis_identifier   visid;
-+
-+	if (ioctl(xf86Info.consoleFd, VIS_GETIDENTIFIER, &visid) >= 0) {
-+	    xf86Msg(X_PROBED, "console driver: %s\n", visid.name);
-+	    if (strcmp(visid.name, "NVDAnvda") == 0) {
-+		driver = "nvidia";
-+	    }
-+	}	
-+    }
-+#endif    
-+    
-     AppendToConfig(BUILTIN_MODULE_SECTION);
-     AppendToConfig(BUILTIN_MONITOR_SECTION);
- 
-
 --- hw/xfree86/common/xf86Config.c	2006-12-06 22:08:26.479334000 -0800
 +++ hw/xfree86/common/xf86Config.c	2006-12-07 15:31:59.400139000 -0800
 @@ -513,11 +513,30 @@
--- a/open-src/xserver/xorg/patch-list	Mon May 12 16:38:17 2008 -0700
+++ b/open-src/xserver/xorg/patch-list	Mon May 12 16:39:00 2008 -0700
@@ -60,3 +60,4 @@
 6642762.patch,-p1
 6618220.patch
 6668806.patch
+driver-autoconfig.patch