|
|
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)
|