xf86-video-intel: src/intel_driver.c src/intel_module.c

Chris Wilson ickle at kemper.freedesktop.org
Sat Oct 2 05:40:26 PDT 2010


 src/intel_driver.c |   35 -----------------------------------
 src/intel_module.c |   46 ++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 42 insertions(+), 39 deletions(-)

New commits:
commit 455f2939a661764ebb8d1747d44e16a0a8937808
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Oct 2 13:32:58 2010 +0100

    Do not claim the PCI device if !KMS
    
    By returning FALSE whilst probing if we can't find a KMS driver, we
    allow X to fallback to trying the VESA driver -- rather than failing.
    
    The initial idea for this was by Julien Cristau.
    
    Reported-by: Julien Cristau <jcristau at debian.org>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_driver.c b/src/intel_driver.c
index 79c850b..4391672 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -262,33 +262,6 @@ static void PreInitCleanup(ScrnInfoPtr scrn)
 	scrn->driverPrivate = NULL;
 }
 
-/*
- * DRM mode setting Linux only at this point... later on we could
- * add a wrapper here.
- */
-static Bool intel_kernel_mode_enabled(ScrnInfoPtr scrn)
-{
-	struct pci_device *dev;
-	char id[20];
-	int ret;
-
-	dev = xf86GetPciInfoForEntity(xf86GetEntityInfo(scrn->entityList[0])->index);
-	snprintf(id, sizeof(id),
-		 "pci:%04x:%02x:%02x.%d",
-		 dev->domain, dev->bus, dev->dev, dev->func);
-
-	ret = drmCheckModesettingSupported(id);
-	if (ret) {
-		if (xf86LoadKernelModule("i915"))
-			ret = drmCheckModesettingSupported(id);
-	}
-	/* Be nice to the user and load fbcon too */
-	if (!ret)
-		(void)xf86LoadKernelModule("fbcon");
-
-	return ret == 0;
-}
-
 static void intel_check_chipset_option(ScrnInfoPtr scrn)
 {
 	intel_screen_private *intel = intel_get_screen_private(scrn);
@@ -513,18 +486,10 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
 	EntityInfoPtr pEnt;
 	int flags24;
 	Gamma zeros = { 0.0, 0.0, 0.0 };
-	int drm_mode_setting;
 
 	if (scrn->numEntities != 1)
 		return FALSE;
 
-	drm_mode_setting = intel_kernel_mode_enabled(scrn);
-	if (!drm_mode_setting) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "No kernel modesetting driver detected.\n");
-		return FALSE;
-	}
-
 	pEnt = xf86GetEntityInfo(scrn->entityList[0]);
 
 	if (flags & PROBE_DETECT)
diff --git a/src/intel_module.c b/src/intel_module.c
index 53e1cb6..8fd55ed 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -37,6 +37,8 @@
 #include "intel_driver.h"
 #include "legacy/legacy.h"
 
+#include <xf86drmMode.h>
+
 static const SymTabRec _intel_chipsets[] = {
     {PCI_CHIP_I810,		"i810"},
     {PCI_CHIP_I810_DC100,	"i810-dc100"},
@@ -361,6 +363,27 @@ static Bool intel_driver_func(ScrnInfoPtr pScrn,
     }
 }
 
+static Bool has_kernel_mode_setting(struct pci_device *dev)
+{
+	char id[20];
+	int ret;
+
+	snprintf(id, sizeof(id),
+		 "pci:%04x:%02x:%02x.%d",
+		 dev->domain, dev->bus, dev->dev, dev->func);
+
+	ret = drmCheckModesettingSupported(id);
+	if (ret) {
+		if (xf86LoadKernelModule("i915"))
+			ret = drmCheckModesettingSupported(id);
+	}
+	/* Be nice to the user and load fbcon too */
+	if (!ret)
+		(void)xf86LoadKernelModule("fbcon");
+
+	return ret == 0;
+}
+
 /*
  * intel_pci_probe --
  *
@@ -373,11 +396,26 @@ static Bool intel_pci_probe (DriverPtr		driver,
 			     struct pci_device	*device,
 			     intptr_t		match_data)
 {
-    ScrnInfoPtr scrn = NULL;
+    ScrnInfoPtr scrn;
+
+    if (!has_kernel_mode_setting(device)) {
+#if KMS_ONLY
+	    return FALSE;
+#else
+	    switch (DEVICE_ID(device)) {
+	    case PCI_CHIP_I810:
+	    case PCI_CHIP_I810_DC100:
+	    case PCI_CHIP_I810_E:
+	    case PCI_CHIP_I815:
+		    break;
+	    default:
+		    return FALSE;
+	    }
+#endif
+    }
 
-    scrn = xf86ConfigPciEntity(scrn, 0, entity_num, intel_pci_chipsets,
-			       NULL,
-			       NULL, NULL, NULL, NULL);
+    scrn = xf86ConfigPciEntity(NULL, 0, entity_num, intel_pci_chipsets,
+			       NULL, NULL, NULL, NULL, NULL);
     if (scrn != NULL) {
 	scrn->driverVersion = INTEL_VERSION;
 	scrn->driverName = INTEL_DRIVER_NAME;


More information about the xorg-commit mailing list