XORG_NV/sun-src/xc/programs/Xserver/hw/xfree86/common/xf86Mode.c
changeset 31 6fef7fb81fc7
parent 7 1ef1e7277e92
equal deleted inserted replaced
30:09d07a831488 31:6fef7fb81fc7
  1198 
  1198 
  1199     return 0;
  1199     return 0;
  1200 }
  1200 }
  1201 
  1201 
  1202 
  1202 
  1203 extern DisplayModePtr xf86CVTMode(int HDisplay, int VDisplay, float VRefresh,
       
  1204     Bool Reduced, Bool Interlaced);
       
  1205 
       
  1206 /*
  1203 /*
  1207  * xf86ValidateModes
  1204  * xf86ValidateModes
  1208  *
  1205  *
  1209  * This function takes a set of mode names, modes and limiting conditions,
  1206  * This function takes a set of mode names, modes and limiting conditions,
  1210  * and selects a set of modes and parameters based on those conditions.
  1207  * and selects a set of modes and parameters based on those conditions.
  1283     int numEdidModes;
  1280     int numEdidModes;
  1284     int numDtModes = 0;
  1281     int numDtModes = 0;
  1285     int numDtModelines = 0;
  1282     int numDtModelines = 0;
  1286     int numStdModes = 0;
  1283     int numStdModes = 0;
  1287     char **rmodeNames;
  1284     char **rmodeNames;
  1288     DisplayModePtr modePool;
  1285     float hmin = 1e6, hmax = 0.0, vmin = 1e6, vmax = 0.0;
       
  1286     int useBuiltin = FALSE;
       
  1287     float builtinHSync = 0.0;
       
  1288     float builtinVRfrsh = 0.0;
  1289 
  1289 
  1290 #ifdef DEBUG
  1290 #ifdef DEBUG
  1291     ErrorF("xf86ValidateModes(%p, %p, %p, %p,\n\t\t  %p, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x)\n",
  1291     ErrorF("xf86ValidateModes(%p, %p, %p, %p,\n\t\t  %p, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x)\n",
  1292 	   scrp, availModes, modeNames, clockRanges,
  1292 	   scrp, availModes, modeNames, clockRanges,
  1293 	   linePitches, minPitch, maxPitch, pitchInc,
  1293 	   linePitches, minPitch, maxPitch, pitchInc,
  1311 	return -1;
  1311 	return -1;
  1312     }
  1312     }
  1313     if ((virtualX > 0) != (virtualY > 0)) {
  1313     if ((virtualX > 0) != (virtualY > 0)) {
  1314 	ErrorF("xf86ValidateModes: called with invalid virtual resolution\n");
  1314 	ErrorF("xf86ValidateModes: called with invalid virtual resolution\n");
  1315 	return -1;
  1315 	return -1;
  1316     }
       
  1317 
       
  1318     /*
       
  1319      * If DDC is empty, try VBE DDC probing, since xf86DoEDID_DDC2
       
  1320      * probing, which at least nv and ati drivers count on, sometimes
       
  1321      * fails for some CRT monitors
       
  1322      */
       
  1323 #ifdef sun
       
  1324 #ifdef improve_for_nvidia_driver
       
  1325     /* 
       
  1326      * With nvidia driver, EDID modes are added to availModes with type 0, 
       
  1327      * reconstruct them.
       
  1328      */
       
  1329     if (!strcmp (scrp->driverName, "nvidia")) {
       
  1330 	for (p = availModes; p != NULL; p = p->next)
       
  1331 	    if (p->type == 0) {
       
  1332 		dt_modes[numDtModelines] = *p;
       
  1333 		dt_modes[numDtModelines].type = M_T_EDID;
       
  1334 		dt_mode_names[numDtModes++] = xnfstrdup(p->name);
       
  1335 		dt_mode_names[numDtModes] = NULL;
       
  1336 	    }
       
  1337 	/* 
       
  1338          * If monitor probing failed with nvidia driver, try the results from
       
  1339 	 * VBE probing 
       
  1340 	 */
       
  1341     }
       
  1342     if ((!scrp->monitor->DDC) && (strcmp (scrp->driverName, "nvidia") || 
       
  1343 	(!numDtModelines))) {
       
  1344 #else
       
  1345     if ((!scrp->monitor->DDC) && strcmp (scrp->driverName, "nvidia")) {
       
  1346 #endif
       
  1347 #else
       
  1348     if (!scrp->monitor->DDC) {
       
  1349 #endif
       
  1350 	int entityIndex = scrp->entityList[0];
       
  1351 
       
  1352 	if ((xf86LoadSubModule(scrp, "vbe")) && xf86FallbackDDCProbe)
       
  1353 	    	scrp->monitor->DDC = xf86FallbackDDCProbe (entityIndex, scrp);
       
  1354     }
  1316     }
  1355 
  1317 
  1356     /*
  1318     /*
  1357      * Probe monitor so that we can enforce/warn about its limits.
  1319      * Probe monitor so that we can enforce/warn about its limits.
  1358      * If one or more DS_RANGES descriptions are present, use the parameters
  1320      * If one or more DS_RANGES descriptions are present, use the parameters
  1363      */
  1325      */
  1364     if (scrp->monitor->DDC) {
  1326     if (scrp->monitor->DDC) {
  1365 	MonPtr monitor = scrp->monitor;
  1327 	MonPtr monitor = scrp->monitor;
  1366 	xf86MonPtr DDC = (xf86MonPtr)(scrp->monitor->DDC);
  1328 	xf86MonPtr DDC = (xf86MonPtr)(scrp->monitor->DDC);
  1367 	int i, j, c;
  1329 	int i, j, c;
  1368 	float hmin = 1e6, hmax = 0.0, vmin = 1e6, vmax = 0.0;
       
  1369 	float h;
  1330 	float h;
  1370 	struct std_timings *t;
  1331 	struct std_timings *t;
  1371 	struct detailed_timings *dt;
  1332 	struct detailed_timings *dt;
  1372 	char name[20];
  1333 	char name[20];
  1373 	int h_dpi, h_dpi_max = 0;
  1334 	int h_dpi, h_dpi_max = 0;
  1555 		vrefresh[numTimings].lo = vmin;
  1516 		vrefresh[numTimings].lo = vmin;
  1556 		vrefresh[numTimings].hi = vmax;
  1517 		vrefresh[numTimings].hi = vmax;
  1557 		numTimings++;
  1518 		numTimings++;
  1558 	    }
  1519 	    }
  1559 	}
  1520 	}
  1560 
  1521     } else {
  1561 	if (numTimings > 0) {
  1522 	/* Check built-in modes */
       
  1523 	for (p = scrp->modePool; p != NULL; p = p->next) {
       
  1524 	    if (p->type == M_T_BUILTIN) {
       
  1525 		std_mode_names[numStdModes++]	= xnfstrdup(p->name);
       
  1526 		std_mode_names[numStdModes] = NULL;
       
  1527 		useBuiltin = TRUE;
       
  1528 		if (ModeHSync(p) > builtinHSync)
       
  1529 		    builtinHSync = ModeHSync(p);
       
  1530 		if ((float) ModeVRefresh(p) > builtinVRfrsh)
       
  1531 		    builtinVRfrsh = (float) ModeVRefresh(p);
       
  1532 	    }
       
  1533 	}
       
  1534 	if (numStdModes == 0) 
       
  1535 	    for (p = scrp->monitor->Modes; p != NULL; p = p->next) {
       
  1536 	    	if (p->type == M_T_BUILTIN) {
       
  1537 		    std_mode_names[numStdModes++]	= xnfstrdup(p->name);
       
  1538 		    std_mode_names[numStdModes] = NULL;
       
  1539 		    useBuiltin = TRUE;
       
  1540 		    if (ModeHSync(p) > builtinHSync)
       
  1541 		    	builtinHSync = ModeHSync(p);
       
  1542 		    if ((float) ModeVRefresh(p) > builtinVRfrsh)
       
  1543 		    	builtinVRfrsh = (float) ModeVRefresh(p);
       
  1544 	    	}
       
  1545 	    }
       
  1546     }
       
  1547 
       
  1548     if (numTimings > 0) {
       
  1549 	MonPtr monitor = scrp->monitor;
       
  1550 	int i, j;
  1562 
  1551 
  1563 #ifdef DEBUG
  1552 #ifdef DEBUG
  1564 	    for (i = 0; i < numTimings; i++) {
  1553         for (i = 0; i < numTimings; i++) {
  1565 		ErrorF("DDC - Hsync %.1f-%.1f kHz - Vrefresh %.1f-%.1f Hz\n",
  1554 	    ErrorF("DDC - Hsync %.1f-%.1f kHz - Vrefresh %.1f-%.1f Hz\n",
  1566 		       hsync[i].lo, hsync[i].hi,
  1555 	    	hsync[i].lo, hsync[i].hi, vrefresh[i].lo, vrefresh[i].hi);
  1567 		       vrefresh[i].lo, vrefresh[i].hi);
  1556     	}
  1568 	    }
       
  1569 #endif
  1557 #endif
  1570 
  1558 
  1571 #define DDC_SYNC_TOLERANCE SYNC_TOLERANCE
  1559 #define DDC_SYNC_TOLERANCE SYNC_TOLERANCE
  1572 	    if (monitor->nHsync > 0) {
  1560   	if (monitor->nHsync > 0) {
  1573 		for (i = 0; i < monitor->nHsync; i++) {
  1561 	    for (i = 0; i < monitor->nHsync; i++) {
  1574 		    Bool good = FALSE;
  1562 	    	Bool good = FALSE;
  1575 		    for (j = 0; j < numTimings; j++) {
  1563 	    	for (j = 0; j < numTimings; j++) {
  1576 			if ((1.0 - DDC_SYNC_TOLERANCE) * hsync[j].lo <=
  1564 		    if ((1.0 - DDC_SYNC_TOLERANCE) * hsync[j].lo <=
  1577 				monitor->hsync[i].lo &&
  1565 			monitor->hsync[i].lo &&
  1578 			    (1.0 + DDC_SYNC_TOLERANCE) * hsync[j].hi >=
  1566 		    	(1.0 + DDC_SYNC_TOLERANCE) * hsync[j].hi >=
  1579 				monitor->hsync[i].hi) {
  1567 			monitor->hsync[i].hi) {
  1580 			    good = TRUE;
  1568 		    	good = TRUE;
  1581 			    break;
  1569 		    	break;
  1582 			}
       
  1583 		    }
  1570 		    }
  1584 		    if (!good) {
  1571 	 	}
  1585 			xf86DrvMsg(scrp->scrnIndex, X_WARNING,
  1572 	    	if (!good) {
  1586 			  "config file hsync range %g-%gkHz not within DDC "
  1573 		    xf86DrvMsg(scrp->scrnIndex, X_WARNING,
  1587 			  "hsync ranges.\n",
  1574 		       	"config file hsync range %g-%gkHz not within DDC "
  1588 			  monitor->hsync[i].lo, monitor->hsync[i].hi);
  1575 			"hsync ranges.\n",
       
  1576  			monitor->hsync[i].lo, monitor->hsync[i].hi);
       
  1577 		}
       
  1578 	    }
       
  1579 	}
       
  1580 
       
  1581 	if (monitor->nVrefresh > 0) {
       
  1582 	    for (i = 0; i < monitor->nVrefresh; i++) {
       
  1583 	    	Bool good = FALSE;
       
  1584 	    	for (j = 0; j < numTimings; j++) {
       
  1585 		    if ((1.0 - DDC_SYNC_TOLERANCE) * vrefresh[j].lo <=
       
  1586 			monitor->vrefresh[0].lo &&
       
  1587 			(1.0 + DDC_SYNC_TOLERANCE) * vrefresh[j].hi >=
       
  1588 			monitor->vrefresh[0].hi) {
       
  1589 		    	good = TRUE;
       
  1590 		    	break;
  1589 		    }
  1591 		    }
       
  1592 	 	}
       
  1593 	    	if (!good) {
       
  1594 		    xf86DrvMsg(scrp->scrnIndex, X_WARNING,
       
  1595 	 		"config file vrefresh range %g-%gHz not within DDC "
       
  1596 			"vrefresh ranges.\n",
       
  1597 			monitor->vrefresh[i].lo, monitor->vrefresh[i].hi);
  1590 		}
  1598 		}
  1591 	    }
  1599 	    }
  1592 
  1600 	}
  1593 	    if (monitor->nVrefresh > 0) {
       
  1594 		for (i = 0; i < monitor->nVrefresh; i++) {
       
  1595 		    Bool good = FALSE;
       
  1596 		    for (j = 0; j < numTimings; j++) {
       
  1597 			if ((1.0 - DDC_SYNC_TOLERANCE) * vrefresh[j].lo <=
       
  1598 				monitor->vrefresh[0].lo &&
       
  1599 			    (1.0 + DDC_SYNC_TOLERANCE) * vrefresh[j].hi >=
       
  1600 				monitor->vrefresh[0].hi) {
       
  1601 			    good = TRUE;
       
  1602 			    break;
       
  1603 			}
       
  1604 		    }
       
  1605 		    if (!good) {
       
  1606 			xf86DrvMsg(scrp->scrnIndex, X_WARNING,
       
  1607 			  "config file vrefresh range %g-%gHz not within DDC "
       
  1608 			  "vrefresh ranges.\n",
       
  1609 			  monitor->vrefresh[i].lo, monitor->vrefresh[i].hi);
       
  1610 		    }
       
  1611 		}
       
  1612 	    }
       
  1613         }
       
  1614     }
  1601     }
  1615 
  1602 
  1616     /*
  1603     /*
  1617      * If requested by the driver, allow missing hsync and/or vrefresh ranges
  1604      * If requested by the driver, allow missing hsync and/or vrefresh ranges
  1618      * in the monitor section.
  1605      * in the monitor section.
  1629 		    scrp->monitor->hsync[i].lo = hsync[i].lo;
  1616 		    scrp->monitor->hsync[i].lo = hsync[i].lo;
  1630 		    scrp->monitor->hsync[i].hi = hsync[i].hi;
  1617 		    scrp->monitor->hsync[i].hi = hsync[i].hi;
  1631 		}
  1618 		}
  1632 	    } else {
  1619 	    } else {
  1633 		scrp->monitor->hsync[0].lo = 28;
  1620 		scrp->monitor->hsync[0].lo = 28;
  1634 		scrp->monitor->hsync[0].hi = 60;
  1621 		if (useBuiltin)
       
  1622 		    scrp->monitor->hsync[0].hi = builtinHSync * 
       
  1623 			(1.0 + SYNC_TOLERANCE);
       
  1624 		else
       
  1625 		    scrp->monitor->hsync[0].hi = 60;
  1635 		scrp->monitor->nHsync = 1;
  1626 		scrp->monitor->nHsync = 1;
  1636 	    }
  1627 	    }
  1637 	    type = "default ";
  1628 	    type = "default ";
  1638 	}
  1629 	}
  1639 	for (i = 0; i < scrp->monitor->nHsync; i++) {
  1630 	for (i = 0; i < scrp->monitor->nHsync; i++) {
  1658 		    scrp->monitor->vrefresh[i].lo = vrefresh[i].lo;
  1649 		    scrp->monitor->vrefresh[i].lo = vrefresh[i].lo;
  1659 		    scrp->monitor->vrefresh[i].hi = vrefresh[i].hi;
  1650 		    scrp->monitor->vrefresh[i].hi = vrefresh[i].hi;
  1660 		}
  1651 		}
  1661 	    } else {
  1652 	    } else {
  1662 		scrp->monitor->vrefresh[0].lo = 43;
  1653 		scrp->monitor->vrefresh[0].lo = 43;
  1663 		scrp->monitor->vrefresh[0].hi = 72;
  1654 		if (useBuiltin)
       
  1655 		    scrp->monitor->vrefresh[0].hi = builtinVRfrsh *
       
  1656 			(1.0 + SYNC_TOLERANCE);
       
  1657 		else
       
  1658 		    scrp->monitor->vrefresh[0].hi = 72;
  1664 		scrp->monitor->nVrefresh = 1;
  1659 		scrp->monitor->nVrefresh = 1;
  1665 	    }
  1660 	    }
  1666 	    type = "default ";
  1661 	    type = "default ";
  1667 	}
  1662 	}
  1668 	for (i = 0; i < scrp->monitor->nVrefresh; i++) {
  1663 	for (i = 0; i < scrp->monitor->nVrefresh; i++) {
  1798 		for (s = availModes; s != NULL; s = s->next) {
  1793 		for (s = availModes; s != NULL; s = s->next) {
  1799 		   /* 
  1794 		   /* 
  1800 		    * Don't prepend EDID mode if there exits a user-defined or 
  1795 		    * Don't prepend EDID mode if there exits a user-defined or 
  1801 		    * built-in mode having the same name.
  1796 		    * built-in mode having the same name.
  1802 		    */
  1797 		    */
  1803 		   if (((s->type & M_T_USERDEF) || (s->type & M_T_BUILTIN)) && 
  1798 		   if ((s->type & M_T_USERDEF) && 
  1804 			(!strcmp(p->name, s->name)))
  1799 			(!strcmp(p->name, s->name)))
  1805 			break;
  1800 			break;
  1806 		}
  1801 		}
  1807 		if (s) {
  1802 		if (s) {
  1808 		    xf86DrvMsg(scrp->scrnIndex, X_INFO, "EDID Modeline \"%s\" %.1fMHz not prepended to Modeline database:\n", 
  1803 		    xf86DrvMsg(scrp->scrnIndex, X_INFO, "EDID Modeline \"%s\" %.1fMHz not prepended to Modeline database:\n", 
  1816 		    p->name, p->Clock/1000.0);	
  1811 		    p->name, p->Clock/1000.0);	
  1817 	    }
  1812 	    }
  1818 	    else {
  1813 	    else {
  1819 	    	if ((p = r) == NULL)
  1814 	    	if ((p = r) == NULL)
  1820 		    break;
  1815 		    break;
  1821 		else {
       
  1822 #ifdef sun
       
  1823 #ifdef improve_for_nvidia_driver
       
  1824 		   /*
       
  1825 		    * Type 0 modes are EDID modes added by nvidia driver, ignore 
       
  1826                     * them because they were converted to type EDID in dt_modes[] 
       
  1827                     * and have been prepended.
       
  1828 		    */
       
  1829 	            if (p->type == 0) {
       
  1830 			r = r->next;
       
  1831 			continue;
       
  1832 		    }
       
  1833 #endif
       
  1834 #endif
       
  1835 		}
       
  1836 	    }
  1816 	    }
  1837 	    
  1817 	    
  1838 	    status = xf86InitialCheckModeForDriver(scrp, p, clockRanges,
  1818 	    status = xf86InitialCheckModeForDriver(scrp, p, clockRanges,
  1839 						   strategy, maxPitch,
  1819 						   strategy, maxPitch,
  1840 						   virtualX, virtualY);
  1820 						   virtualX, virtualY);
  1859 	    } else {
  1839 	    } else {
  1860 		char *typestring;
  1840 		char *typestring;
  1861 
  1841 
  1862 		switch (p->type) {
  1842 		switch (p->type) {
  1863 		case M_T_BUILTIN:	
  1843 		case M_T_BUILTIN:	
  1864 		    typestring = xnfstrdup("builtin");
  1844 		    typestring = xnfstrdup("(B)");
  1865 		    break;
  1845 		    break;
  1866 		case M_T_USERDEF:	
  1846 		case M_T_USERDEF:	
  1867 		    typestring = xnfstrdup("user");
  1847 		    typestring = xnfstrdup("(U)");
  1868 		    break;
  1848 		    break;
  1869 		case M_T_EDID:	
  1849 		case M_T_EDID:	
  1870 		    typestring = xnfstrdup("EDID");
  1850 		    typestring = xnfstrdup("(E)");
  1871 		    break;
  1851 		    break;
  1872 		case M_T_DEFAULT:	
  1852 		case M_T_DEFAULT:	
  1873 		    typestring = xnfstrdup("default");
  1853 		    typestring = xnfstrdup("(D)");
  1874 		    break;
  1854 		    break;
  1875 		default:	
  1855 		default:	
  1876 		    typestring = xnfstrdup("");
  1856 		    typestring = xnfstrdup("");
  1877 		    break;
  1857 		    break;
  1878 		}
  1858 		}
  1879 		xf86DrvMsg(scrp->scrnIndex, X_INFO,
  1859 		xf86DrvMsg(scrp->scrnIndex, X_INFO,
  1880 		    "Not including %s \"%s\" %.1fMHz (%s) in pool\n", typestring,
  1860 		    "Excluding %s \"%s\" %.1fMHz (%s)\n", typestring,
  1881 		    p->name, p->Clock/1000.0, xf86ModeStatusToString(status));
  1861 		    p->name, p->Clock/1000.0, xf86ModeStatusToString(status));
  1882 	    }
  1862 	    }
  1883 	    if (i < numDtModelines)
  1863 	    if (i < numDtModelines)
  1884 		i++;
  1864 		i++;
  1885 	    else
  1865 	    else
  1966     last = NULL;
  1946     last = NULL;
  1967     if (rmodeNames != NULL) {
  1947     if (rmodeNames != NULL) {
  1968 	for (i = 0; rmodeNames[i] != NULL; i++) {
  1948 	for (i = 0; rmodeNames[i] != NULL; i++) {
  1969 	    if (fallbackMode)
  1949 	    if (fallbackMode)
  1970 	    	xf86DrvMsg(scrp->scrnIndex, X_INFO, 
  1950 	    	xf86DrvMsg(scrp->scrnIndex, X_INFO, 
  1971 		    "Prepend Fallback mode name \"%s\" to validation list\n", 
  1951 		    "Prepend Fallback mode name (F) \"%s\" to validation list\n", 
  1972 		    rmodeNames[i]);
  1952 		    rmodeNames[i]);
  1973 	    else {
  1953 	    else {
  1974 	    	if (userModes)
  1954 	    	if (userModes)
  1975 	    	    xf86DrvMsg(scrp->scrnIndex, X_INFO, 
  1955 	    	    xf86DrvMsg(scrp->scrnIndex, X_INFO, 
  1976 		    	"Prepend User mode name \"%s\" to validation list\n", 
  1956 		    	"Prepend User mode name (U) \"%s\" to validation list\n", 
  1977 		    	rmodeNames[i]);
  1957 		    	rmodeNames[i]);
  1978 		else
  1958 		else
  1979 	    	    xf86DrvMsg(scrp->scrnIndex, X_INFO, 
  1959 		    if (useBuiltin)
  1980 		    	"Prepend EDID mode name \"%s\" to validation list\n", rmodeNames[i]);
  1960 	    	    	xf86DrvMsg(scrp->scrnIndex, X_INFO, 
       
  1961 		    	    "Prepend BUILTIN mode name (B) \"%s\" to validation list\n", 
       
  1962 			    rmodeNames[i]);
       
  1963 		    else
       
  1964 	    	    	xf86DrvMsg(scrp->scrnIndex, X_INFO, 
       
  1965 		    	    "Prepend EDID mode name (E) \"%s\" to validation list\n", 
       
  1966 			    rmodeNames[i]);
  1981 	    }
  1967 	    }
  1982 	    new = xnfcalloc(1, sizeof(DisplayModeRec));
  1968 	    new = xnfcalloc(1, sizeof(DisplayModeRec));
  1983 	    new->prev = last;
  1969 	    new->prev = last;
  1984 	    if (userModes)
  1970 	    if (userModes)
  1985 	    	new->type = M_T_USERDEF;
  1971 	    	new->type = M_T_USERDEF;
  1986 	    else {
  1972 	    else  {
  1987 		if (fallbackMode)
  1973 	    	if (useBuiltin)
  1988 	    	    new->type = M_T_DEFAULT;
  1974 	    	    new->type = M_T_BUILTIN;
  1989 		else
  1975 		else {
  1990 	    	    new->type = M_T_EDID;
  1976 		    if (fallbackMode)
       
  1977 	    	    	new->type = M_T_DEFAULT;
       
  1978 		    else
       
  1979 	    	    	new->type = M_T_EDID;
       
  1980 		}
  1991 	    }
  1981 	    }
  1992 	    new->name = xnfalloc(strlen(rmodeNames[i]) + 1);
  1982 	    new->name = xnfalloc(strlen(rmodeNames[i]) + 1);
  1993 	    strcpy(new->name, rmodeNames[i]);
  1983 	    strcpy(new->name, rmodeNames[i]);
  1994 	    if (new->prev)
  1984 	    if (new->prev)
  1995 		new->prev->next = new;
  1985 		new->prev->next = new;
  2086 	if (repeat && ((status = p->status) != MODE_OK)) {
  2076 	if (repeat && ((status = p->status) != MODE_OK)) {
  2087 	    char *typestring;
  2077 	    char *typestring;
  2088 
  2078 
  2089 	    switch (p->type) {
  2079 	    switch (p->type) {
  2090 	    	case M_T_BUILTIN:	
  2080 	    	case M_T_BUILTIN:	
  2091 	    	    typestring = xnfstrdup("builtin");
  2081 	    	    typestring = xnfstrdup("(B)");
  2092 		    break;
  2082 		    break;
  2093 	    	case M_T_USERDEF:	
  2083 	    	case M_T_USERDEF:	
  2094 	    	    typestring = xnfstrdup("user");
  2084 	    	    typestring = xnfstrdup("(U)");
  2095 		    break;
  2085 		    break;
  2096 	    	case M_T_EDID:	
  2086 	    	case M_T_EDID:	
  2097 	    	    typestring = xnfstrdup("EDID");
  2087 	    	    typestring = xnfstrdup("(E)");
  2098 		    break;
  2088 		    break;
  2099 	    	case M_T_DEFAULT:	
  2089 	    	case M_T_DEFAULT:	
  2100 		    typestring = xnfstrdup("default");
  2090 		    typestring = xnfstrdup("(D)");
  2101 		    break;
  2091 		    break;
  2102 	    	default:	
  2092 	    	default:	
  2103 	    	    typestring = xnfstrdup("");
  2093 	    	    typestring = xnfstrdup("");
  2104 		    break;
  2094 		    break;
  2105 	    }
  2095 	    }
  2115 	if (status != MODE_OK) {
  2105 	if (status != MODE_OK) {
  2116 	    char *typestring;
  2106 	    char *typestring;
  2117 
  2107 
  2118 	    switch (p->type) {
  2108 	    switch (p->type) {
  2119 	    	case M_T_BUILTIN:	
  2109 	    	case M_T_BUILTIN:	
  2120 	    	    typestring = xnfstrdup("builtin");
  2110 	    	    typestring = xnfstrdup("(B)");
  2121 		    break;
  2111 		    break;
  2122 	    	case M_T_USERDEF:	
  2112 	    	case M_T_USERDEF:	
  2123 	    	    typestring = xnfstrdup("user");
  2113 	    	    typestring = xnfstrdup("(U)");
  2124 		    break;
  2114 		    break;
  2125 	    	case M_T_EDID:	
  2115 	    	case M_T_EDID:	
  2126 	    	    typestring = xnfstrdup("EDID");
  2116 	    	    typestring = xnfstrdup("(E)");
  2127 		    break;
  2117 		    break;
  2128 	    	case M_T_DEFAULT:	
  2118 	    	case M_T_DEFAULT:	
  2129 		    typestring = xnfstrdup("default");
  2119 		    typestring = xnfstrdup("(D)");
  2130 		    break;
  2120 		    break;
  2131 	    	default:	
  2121 	    	default:	
  2132 	    	    typestring = xnfstrdup("");
  2122 	    	    typestring = xnfstrdup("");
  2133 		    break;
  2123 		    break;
  2134 	    }
  2124 	    }
  2256     for (p = scrp->modes; p != NULL; p = p->next)
  2246     for (p = scrp->modes; p != NULL; p = p->next)
  2257         if (p->status == MODE_OK) 
  2247         if (p->status == MODE_OK) 
  2258 	    break;
  2248 	    break;
  2259     if (p) {
  2249     if (p) {
  2260 	xf86DrvMsg(scrp->scrnIndex, X_INFO,
  2250 	xf86DrvMsg(scrp->scrnIndex, X_INFO,
  2261 	    "Valid mode on top of list : \"%s\" %.1f MHz %.1f kHz, %.1f Hz with --\n", 
  2251 	    "Valid mode on top: \"%s\" %.1f MHz %.1f kHz, %.1f Hz with --\n", 
  2262 	    p->name, p->Clock/1000.0, ModeHSync(p), ModeVRefresh(p));
  2252 	    p->name, p->Clock/1000.0, ModeHSync(p), ModeVRefresh(p));
  2263 	PrintModeline(scrp->scrnIndex, p);
  2253 	PrintModeline(scrp->scrnIndex, p);
  2264     }
  2254     }
  2265 
  2255 
  2266     /* Make the mode list into a circular list by joining up the ends */
  2256     /* Make the mode list into a circular list by joining up the ends */
  2444     if (mode->Flags & V_NCSYNC) add(&flags, "-csync");
  2434     if (mode->Flags & V_NCSYNC) add(&flags, "-csync");
  2445 #if 0
  2435 #if 0
  2446     if (mode->Flags & V_CLKDIV2) add(&flags, "vclk/2");
  2436     if (mode->Flags & V_CLKDIV2) add(&flags, "vclk/2");
  2447 #endif
  2437 #endif
  2448     xf86DrvMsgVerb(scrnIndex, X_INFO, 3,
  2438     xf86DrvMsgVerb(scrnIndex, X_INFO, 3,
  2449 		   "Modeline \"%s\"  %6.2f  %i %i %i %i  %i %i %i %i%s\n",
  2439 		   "\"%s\" %6.2f  %i %i %i %i  %i %i %i %i%s\n",
  2450 		   mode->name, mode->Clock/1000., mode->HDisplay,
  2440 		   mode->name, mode->Clock/1000., mode->HDisplay,
  2451 		   mode->HSyncStart, mode->HSyncEnd, mode->HTotal,
  2441 		   mode->HSyncStart, mode->HSyncEnd, mode->HTotal,
  2452 		   mode->VDisplay, mode->VSyncStart, mode->VSyncEnd,
  2442 		   mode->VDisplay, mode->VSyncStart, mode->VSyncEnd,
  2453 		   mode->VTotal, flags);
  2443 		   mode->VTotal, flags);
  2454     xfree(flags);
  2444     xfree(flags);
  2484 	}
  2474 	}
  2485 	if (p->VScan > 1) {
  2475 	if (p->VScan > 1) {
  2486 	    desc2 = " (VScan)";
  2476 	    desc2 = " (VScan)";
  2487 	}
  2477 	}
  2488 	if (!(p->type) || (p->type & M_T_EDID))
  2478 	if (!(p->type) || (p->type & M_T_EDID))
  2489             prefix = "EDID mode";
  2479             prefix = "(E)";
  2490 	else if (p->type & M_T_USERDEF)
  2480 	else if (p->type & M_T_USERDEF)
  2491 	    prefix = "User mode";
  2481 	    prefix = "(U)";
  2492 	else if (p->type & M_T_BUILTIN)
  2482 	else if (p->type & M_T_BUILTIN)
  2493 	    prefix = "Builtin mode";
  2483 	    prefix = "(B)";
  2494 	else if (p->type & M_T_DEFAULT)
  2484 	else if (p->type & M_T_DEFAULT)
  2495 	    prefix = "Default mode";
  2485 	    prefix = "(D)";
  2496 	else
  2486 	else
  2497 	    prefix = "Mode";
  2487 	    prefix = "Mode";
  2498 	uprefix = "";
  2488 	uprefix = "";
  2499 	if (hsync == 0 || refresh == 0) {
  2489 	if (hsync == 0 || refresh == 0) {
  2500 	    if (p->name)
  2490 	    if (p->name)