05caa03
diff -up xorg-server-1.3.0.0/hw/xfree86/modes/xf86EdidModes.c.da xorg-server-1.3.0.0/hw/xfree86/modes/xf86EdidModes.c
05caa03
--- xorg-server-1.3.0.0/hw/xfree86/modes/xf86EdidModes.c.da	2007-11-30 13:28:41.000000000 +1000
05caa03
+++ xorg-server-1.3.0.0/hw/xfree86/modes/xf86EdidModes.c	2007-11-30 13:29:10.000000000 +1000
05caa03
@@ -64,13 +64,16 @@ typedef enum {
05caa03
      * maximum size and use that.
05caa03
      */
05caa03
     DDC_QUIRK_DETAILED_USE_MAXIMUM_SIZE = 1 << 5,
05caa03
+    /* Monitor forgot to set the first detailed is preferred bit. */
05caa03
+    DDC_QUIRK_FIRST_DETAILED_PREFERRED = 1 << 6,
05caa03
 } ddc_quirk_t;
05caa03
 
05caa03
 static Bool quirk_prefer_large_60 (int scrnIndex, xf86MonPtr DDC)
05caa03
 {
05caa03
     /* Belinea 10 15 55 */
05caa03
     if (memcmp (DDC->vendor.name, "MAX", 4) == 0 &&
05caa03
-	DDC->vendor.prod_id == 1516)
05caa03
+	((DDC->vendor.prod_id == 1516) ||
05caa03
+	(DDC->vendor.prod_id == 0x77e)))
05caa03
 	return TRUE;
05caa03
     
05caa03
     /* Acer AL1706 */
05caa03
@@ -147,6 +150,16 @@ static Bool quirk_135_clock_too_high (in
05caa03
     return FALSE;
05caa03
 }
05caa03
 
05caa03
+static Bool quirk_first_detailed_preferred (int scrnIndex, xf86MonPtr DDC)
05caa03
+{
05caa03
+    /* Philips 107p5 CRT. Reported on xorg@ with pastebin. */
05caa03
+    if (memcmp (DDC->vendor.name, "PHL", 4) == 0 &&
05caa03
+	DDC->vendor.prod_id == 57364)
05caa03
+	return TRUE;
05caa03
+
05caa03
+    return FALSE;
05caa03
+}
05caa03
+
05caa03
 typedef struct {
05caa03
     Bool	(*detect) (int scrnIndex, xf86MonPtr DDC);
05caa03
     ddc_quirk_t	quirk;
05caa03
@@ -178,6 +191,10 @@ static const ddc_quirk_map_t ddc_quirks[
05caa03
 	quirk_detailed_use_maximum_size,   DDC_QUIRK_DETAILED_USE_MAXIMUM_SIZE,
05caa03
 	"Detailed timings give sizes in cm."
05caa03
     },
05caa03
+    {
05caa03
+	quirk_first_detailed_preferred, DDC_QUIRK_FIRST_DETAILED_PREFERRED,
05caa03
+	"First detailed timing was not marked as preferred."
05caa03
+    },
05caa03
     { 
05caa03
 	NULL,		DDC_QUIRK_NONE,
05caa03
 	"No known quirks"
05caa03
@@ -257,7 +274,7 @@ DDCModesFromStandardTiming(int scrnIndex
05caa03
  */
05caa03
 static DisplayModePtr
05caa03
 DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
05caa03
-			  int preferred, ddc_quirk_t quirks)
05caa03
+			  Bool preferred, ddc_quirk_t quirks)
05caa03
 {
05caa03
     DisplayModePtr Mode;
05caa03
 
05caa03
@@ -470,9 +487,10 @@ xf86DDCSetPreferredRefresh(int scrnIndex
05caa03
 _X_EXPORT DisplayModePtr
05caa03
 xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
05caa03
 {
05caa03
-    int preferred, i;
05caa03
+    int		    i;
05caa03
     DisplayModePtr  Modes = NULL, Mode;
05caa03
     ddc_quirk_t	    quirks;
05caa03
+    Bool	    preferred;
05caa03
 
05caa03
     xf86DrvMsg (scrnIndex, X_INFO, "EDID vendor \"%s\", prod id %d\n",
05caa03
 		DDC->vendor.name, DDC->vendor.prod_id);
05caa03
@@ -480,8 +498,10 @@ xf86DDCGetModes(int scrnIndex, xf86MonPt
05caa03
     quirks = xf86DDCDetectQuirks(scrnIndex, DDC, TRUE);
05caa03
 
05caa03
     preferred = PREFERRED_TIMING_MODE(DDC->features.msc);
05caa03
-    if (quirks & DDC_QUIRK_PREFER_LARGE_60)
05caa03
-	preferred = 0;
05caa03
+    if (quirks & DDC_QUIRK_FIRST_DETAILED_PREFERRED)
05caa03
+	preferred = TRUE;
05caa03
+    if (quirks & (DDC_QUIRK_PREFER_LARGE_60 | DDC_QUIRK_PREFER_LARGE_75))
05caa03
+	preferred = FALSE;
05caa03
 
05caa03
     for (i = 0; i < DET_TIMINGS; i++) {
05caa03
 	struct detailed_monitor_section *det_mon = &DDC->det_mon[i];
05caa03
@@ -492,7 +512,7 @@ xf86DDCGetModes(int scrnIndex, xf86MonPt
05caa03
                                              &det_mon->section.d_timings,
05caa03
 					     preferred,
05caa03
 					     quirks);
05caa03
-	    preferred = 0;
05caa03
+	    preferred = FALSE;
05caa03
             Modes = xf86ModesAdd(Modes, Mode);
05caa03
             break;
05caa03
         case DS_STD_TIMINGS:
05caa03
@@ -538,10 +558,8 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
05caa03
 
05caa03
     Monitor->DDC = DDC;
05caa03
 
05caa03
-    if (Monitor->widthmm <= 0 && Monitor->heightmm <= 0) {
05caa03
-        Monitor->widthmm = 10 * DDC->features.hsize;
05caa03
-        Monitor->heightmm = 10 * DDC->features.vsize;
05caa03
-    }
05caa03
+    Monitor->widthmm = 10 * DDC->features.hsize;
05caa03
+    Monitor->heightmm = 10 * DDC->features.vsize;
05caa03
 
05caa03
     /* If this is a digital display, then we can use reduced blanking */
05caa03
     if (DDC->features.input_type)