Bug#16501: autodetection of sbus graphic cards
Add automatic detection of the graphic driver to load for sbus devices. This allows xorg to work on those devices without a "Device" section. Debian bug#483942. Signed-off-by: Julien Cristau <jcristau@debian.org>
This commit is contained in:
		
							parent
							
								
									fd97ff1bdd
								
							
						
					
					
						commit
						24e863b0eb
					
				| 
						 | 
				
			
			@ -39,6 +39,9 @@
 | 
			
		|||
#include "xf86Config.h"
 | 
			
		||||
#include "xf86Priv.h"
 | 
			
		||||
#include "xf86_OSlib.h"
 | 
			
		||||
#ifdef __sparc__
 | 
			
		||||
# include "xf86sbusBus.h"
 | 
			
		||||
#endif
 | 
			
		||||
#include "dirent.h"
 | 
			
		||||
 | 
			
		||||
#ifdef sun
 | 
			
		||||
| 
						 | 
				
			
			@ -472,6 +475,13 @@ listPossibleVideoDrivers(char *matches[], int nmatches)
 | 
			
		|||
	}
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __sparc__
 | 
			
		||||
    {
 | 
			
		||||
	char *sbusDriver = sparcDriverName();
 | 
			
		||||
	if (sbusDriver)
 | 
			
		||||
	    matches[i++] = xnfstrdup(sbusDriver);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /* Find the primary device, and get some information about it. */
 | 
			
		||||
    iter = pci_slot_match_iterator_create(NULL);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,6 +60,7 @@ extern struct sbus_devtable {
 | 
			
		|||
    int devId;
 | 
			
		||||
    int fbType;
 | 
			
		||||
    char *promName;
 | 
			
		||||
    char *driverName;
 | 
			
		||||
    char *descr;
 | 
			
		||||
} sbusDeviceTable[];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -93,5 +94,6 @@ int sparcPromGetBool(sbusPromNodePtr pnode, const char *prop);
 | 
			
		|||
void sparcPromAssignNodes(void);
 | 
			
		||||
char * sparcPromNode2Pathname(sbusPromNodePtr pnode);
 | 
			
		||||
int sparcPromPathname2Node(const char *pathName);
 | 
			
		||||
char *sparcDriverName(void);
 | 
			
		||||
 | 
			
		||||
#endif /* _XF86_SBUSBUS_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,20 +54,20 @@ static struct openpromio *promOpio;
 | 
			
		|||
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 @@ sparcPromGetBool(sbusPromNodePtr pnode, const char *prop)
 | 
			
		|||
    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)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue