[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#483942: autodetection of sbus graphic cards



Package: xserver-xorg-core
Version: 2:1.4.1~git20080517-1
Severity: wishlist
Tags: patch

Attached patch adds automatic detection of the graphic
driver to load for sbus devices. This allows xorg to
work on those devices without a "Device" section
and the (buggy, see #469299) autodetection in xserver-xorg's
postinst to go away.

I've tested this only on sparc and with my sunffb[1] graphic
card, but I see no reason why this should fail for anything
else on sparc. (I think it should even be able to get the
real primary video card in case there are multiple built in).

Hochachtungsvoll,
	Bernhard R. Link

[1] If you have a sunffb and want to test thigs, you might need to
apply the patch for #455313 first so that sunffb works without
segfaulting all the time...
Index: xorg-server-1.4.1~git20080517/hw/xfree86/common/xf86sbusBus.h
===================================================================
--- xorg-server-1.4.1~git20080517.orig/hw/xfree86/common/xf86sbusBus.h	2008-05-31 19:45:52.000000000 +0200
+++ xorg-server-1.4.1~git20080517/hw/xfree86/common/xf86sbusBus.h	2008-05-31 19:47:49.000000000 +0200
@@ -60,6 +60,7 @@
     int devId;
     int fbType;
     char *promName;
+    char *driverName;
     char *descr;
 } sbusDeviceTable[];
 
@@ -93,5 +94,6 @@
 void sparcPromAssignNodes(void);
 char * sparcPromNode2Pathname(sbusPromNodePtr pnode);
 int sparcPromPathname2Node(const char *pathName);
+char *sparcDriverName(void);
 
 #endif /* _XF86_SBUSBUS_H */
Index: xorg-server-1.4.1~git20080517/hw/xfree86/os-support/bus/Sbus.c
===================================================================
--- xorg-server-1.4.1~git20080517.orig/hw/xfree86/os-support/bus/Sbus.c	2008-05-31 19:45:52.000000000 +0200
+++ xorg-server-1.4.1~git20080517/hw/xfree86/os-support/bus/Sbus.c	2008-05-31 19:47:49.000000000 +0200
@@ -54,20 +54,20 @@
 sbusDevicePtr *xf86SbusInfo = NULL;
 
 struct sbus_devtable sbusDeviceTable[] = {
-    { SBUS_DEVICE_BW2, FBTYPE_SUN2BW, "bwtwo", "Sun Monochrome (bwtwo)" },
-    { SBUS_DEVICE_CG2, FBTYPE_SUN2COLOR, "cgtwo", "Sun Color2 (cgtwo)" },
-    { SBUS_DEVICE_CG3, FBTYPE_SUN3COLOR, "cgthree", "Sun Color3 (cgthree)" },
-    { SBUS_DEVICE_CG4, FBTYPE_SUN4COLOR, "cgfour", "Sun Color4 (cgfour)" },
-    { SBUS_DEVICE_CG6, FBTYPE_SUNFAST_COLOR, "cgsix", "Sun GX" },
-    { SBUS_DEVICE_CG8, FBTYPE_MEMCOLOR, "cgeight", "Sun CG8/RasterOps" },
-    { SBUS_DEVICE_CG12, FBTYPE_SUNGP3, "cgtwelve", "Sun GS (cgtwelve)" },
-    { SBUS_DEVICE_CG14, FBTYPE_MDICOLOR, "cgfourteen", "Sun SX" },
-    { SBUS_DEVICE_GT, FBTYPE_SUNGT, "gt", "Sun Graphics Tower" },
-    { SBUS_DEVICE_MGX, -1, "mgx", "Quantum 3D MGXplus" },
-    { SBUS_DEVICE_LEO, FBTYPE_SUNLEO, "leo", "Sun ZX or Turbo ZX" },
-    { SBUS_DEVICE_TCX, FBTYPE_TCXCOLOR, "tcx", "Sun TCX" },
-    { SBUS_DEVICE_FFB, FBTYPE_CREATOR, "ffb", "Sun FFB" },
-    { SBUS_DEVICE_FFB, FBTYPE_CREATOR, "afb", "Sun Elite3D" },
+    { SBUS_DEVICE_BW2, FBTYPE_SUN2BW, "bwtwo", "sunbw2", "Sun Monochrome (bwtwo)" },
+    { SBUS_DEVICE_CG2, FBTYPE_SUN2COLOR, "cgtwo", NULL, "Sun Color2 (cgtwo)" },
+    { SBUS_DEVICE_CG3, FBTYPE_SUN3COLOR, "cgthree", "suncg3", "Sun Color3 (cgthree)" },
+    { SBUS_DEVICE_CG4, FBTYPE_SUN4COLOR, "cgfour", NULL, "Sun Color4 (cgfour)" },
+    { SBUS_DEVICE_CG6, FBTYPE_SUNFAST_COLOR, "cgsix", "suncg6", "Sun GX" },
+    { SBUS_DEVICE_CG8, FBTYPE_MEMCOLOR, "cgeight", NULL, "Sun CG8/RasterOps" },
+    { SBUS_DEVICE_CG12, FBTYPE_SUNGP3, "cgtwelve", NULL, "Sun GS (cgtwelve)" },
+    { SBUS_DEVICE_CG14, FBTYPE_MDICOLOR, "cgfourteen", "suncg14", "Sun SX" },
+    { SBUS_DEVICE_GT, FBTYPE_SUNGT, "gt", NULL, "Sun Graphics Tower" },
+    { SBUS_DEVICE_MGX, -1, "mgx", NULL, "Quantum 3D MGXplus" },
+    { SBUS_DEVICE_LEO, FBTYPE_SUNLEO, "leo", "sunleo", "Sun ZX or Turbo ZX" },
+    { SBUS_DEVICE_TCX, FBTYPE_TCXCOLOR, "tcx", "suntcx", "Sun TCX" },
+    { SBUS_DEVICE_FFB, FBTYPE_CREATOR, "ffb", "sunffb", "Sun FFB" },
+    { SBUS_DEVICE_FFB, FBTYPE_CREATOR, "afb", "sunffb", "Sun Elite3D" },
     { 0, 0, NULL }
 };
 
@@ -240,6 +240,60 @@
     return promGetBool(prop);
 }
 
+static char *
+promWalkGetDriverName(int node, int oldnode)
+{
+    int nextnode;
+    int len;
+    char *prop;
+    int devId, i;
+
+    prop = promGetProperty("device_type", &len);
+    if (prop && (len > 0)) do {
+	if (!strcmp(prop, "display")) {
+	    prop = promGetProperty("name", &len);
+	    if (!prop || len <= 0)
+		break;
+	    while ((*prop >= 'A' && *prop <= 'Z') || *prop == ',')
+		prop++;
+	    for (i = 0; sbusDeviceTable[i].devId; i++)
+		if (!strcmp(prop, sbusDeviceTable[i].promName))
+		    break;
+	    devId = sbusDeviceTable[i].devId;
+	    if (!devId)
+		break;
+	    if (sbusDeviceTable[i].driverName)
+	    	return sbusDeviceTable[i].driverName;
+	}
+    } while (0);
+
+    nextnode = promGetChild(node);
+    if (nextnode) {
+	char *name;
+	name = promWalkGetDriverName(nextnode, node);
+	if (name)
+	    return name;
+    }
+
+    nextnode = promGetSibling(node);
+    if (nextnode)
+	return promWalkGetDriverName(nextnode, node);
+    return NULL;
+}
+
+char *
+sparcDriverName(void)
+{
+    char *name;
+
+    if (sparcPromInit() < 0)
+	    return NULL;
+    promGetSibling(0);
+    name = promWalkGetDriverName(promRootNode, 0);
+    sparcPromClose();
+    return name;
+}
+
 static void
 promWalkAssignNodes(int node, int oldnode, int flags, sbusDevicePtr *devicePtrs)
 {
Index: xorg-server-1.4.1~git20080517/hw/xfree86/common/xf86AutoConfig.c
===================================================================
--- xorg-server-1.4.1~git20080517.orig/hw/xfree86/common/xf86AutoConfig.c	2008-05-31 19:45:52.000000000 +0200
+++ xorg-server-1.4.1~git20080517/hw/xfree86/common/xf86AutoConfig.c	2008-05-31 19:47:49.000000000 +0200
@@ -39,6 +39,7 @@
 #include "xf86Config.h"
 #include "xf86Priv.h"
 #include "xf86_OSlib.h"
+#include "xf86sbusBus.h"
 #include "dirent.h"
 
 /* Sections for the default built-in configuration. */
@@ -351,6 +352,12 @@
     int vendor, chip;
     int i, j;
     char *matches[20]; /* If we have more than 20 drivers we're in trouble */
+
+#if defined __sparc__
+    chosen_driver = sparcDriverName();
+    if (chosen_driver)
+        return chosen_driver;
+#endif
     
     for (i=0 ; i<20 ; i++)
         matches[i] = NULL;

Reply to: