Blob Blame History Raw
From d14ad659451a9fbc45156095d1672c3bf61ed647 Mon Sep 17 00:00:00 2001
From: Fedora X Ninjas <x@fedoraproject.org>
Date: Mon, 16 Feb 2009 15:50:14 +1000
Subject: [PATCH] autoconfig: select nouveau by default for NVIDIA GPUs

Also, don't treat DRI setup failure as an error for nouveau.
---
 glx/glxdri.c                       |    7 +++++--
 glx/glxdri2.c                      |    7 +++++--
 hw/xfree86/common/xf86AutoConfig.c |   21 ++++++++++++++++++++-
 3 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/glx/glxdri.c b/glx/glxdri.c
index 8d614d0..e1525fd 100644
--- a/glx/glxdri.c
+++ b/glx/glxdri.c
@@ -965,6 +965,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
     const __DRIconfig **driConfigs;
     const __DRIextension **extensions;
     int i;
+    int from = X_ERROR;
 
     if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") ||
 	!DRIQueryDirectRenderingCapable(pScreen, &isCapable) ||
@@ -1044,7 +1045,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 
     screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
     if (screen->driver == NULL) {
-	LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
+	if (!strcmp(driverName, "nouveau"))
+	    from = X_INFO;
+	LogMessage(from, "AIGLX error: dlopen of %s failed (%s)\n",
 		   filename, dlerror());
         goto handle_error;
     }
@@ -1176,7 +1179,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 
     xfree(screen);
 
-    LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
+    LogMessage(from, "AIGLX: reverting to software rendering\n");
 
     return NULL;
 }
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 4544a2c..f22119d 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -476,6 +476,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
     const __DRIextension **extensions;
     const __DRIconfig **driConfigs;
     int i;
+    int from = X_ERROR;
 
     screen = xcalloc(1, sizeof *screen);
     if (screen == NULL)
@@ -502,7 +503,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 
     screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
     if (screen->driver == NULL) {
-	LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
+	if (!strcmp(driverName, "nouveau"))
+	    from = X_INFO;
+	LogMessage(from, "AIGLX error: dlopen of %s failed (%s)\n",
 		   filename, dlerror());
         goto handle_error;
     }
@@ -577,7 +580,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 
     xfree(screen);
 
-    LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
+    LogMessage(from, "AIGLX: reverting to software rendering\n");
 
     return NULL;
 }
diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c
index 19c06c8..e40551e 100644
--- a/hw/xfree86/common/xf86AutoConfig.c
+++ b/hw/xfree86/common/xf86AutoConfig.c
@@ -181,7 +181,32 @@ videoPtrToDriverList(struct pci_device *dev,
 	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 0x10de: case 0x12d2:
+	    switch (dev->device_id) {
+	    /* NV1 */
+	    case 0x0008:
+	    case 0x0009:
+		driverList[0] = "vesa";
+		break;
+	    /* NV3 */
+	    case 0x0018:
+	    case 0x0019:
+		driverList[0] = "nv";
+		break;
+	    default:
+		switch (dev->device_id & 0xfff0) {
+		/* Non-functional with both nouveau and nv */
+		case 0x0840:
+		case 0x0860:
+		    driverList[0] = "vesa";
+		    break;
+		default:
+		    driverList[0] = "nouveau";
+		    break;
+		}
+		break;
+	    }
+	    break;
 	case 0x1163:		    driverList[0] = "rendition"; break;
 	case 0x5333:
 	    switch (dev->device_id)
-- 
1.6.2.2