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

xorg-server: Changes to 'ubuntu'



 debian/changelog                                                    |    9 
 debian/patches/149_add_quirks_for_physical_screen_size_issues.patch |  291 ++++++++++
 debian/patches/series                                               |    1 
 3 files changed, 301 insertions(+)

New commits:
commit b0db7cbe9d91e89f91165370c7d9a0f6a6415e96
Author: Bryce Harrington <bryce@bryce@bryceharrington.org>
Date:   Thu Feb 14 16:42:06 2008 -0800

    Adding a patch with quirks for various monitors with bad EDID info

diff --git a/debian/changelog b/debian/changelog
index a8bba1a..7f1ece7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+xorg-server (2:1.4.1~git20080131-1ubuntu3) UNRELEASED; urgency=low
+
+  [Bryce Harrington]
+  * Add 149_add_quirks_for_physical_screen_size_issues.patch to help
+    address various common EDID issues (like monitors that report in
+    centimeters instead of millimeters, etc.)  (LP: #151311)
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Thu, 14 Feb 2008 16:23:47 -0800
+
 xorg-server (2:1.4.1~git20080131-1ubuntu2) hardy; urgency=low
 
     * Add patch 148_dix_touchscreen_fixes.diff from Matthew Garrett to fix
diff --git a/debian/patches/149_add_quirks_for_physical_screen_size_issues.patch b/debian/patches/149_add_quirks_for_physical_screen_size_issues.patch
new file mode 100644
index 0000000..091e280
--- /dev/null
+++ b/debian/patches/149_add_quirks_for_physical_screen_size_issues.patch
@@ -0,0 +1,291 @@
+From: Eric Anholt <eric@anholt.net>
+Date: Thu, 11 Oct 2007 23:48:56 +0000 (-0700)
+Subject: Bug #10304,12784,11603: Add quirks for several physical size issues.
+X-Git-Url: http://gitweb.freedesktop.org/?p=xorg/xserver.git;a=commitdiff;h=fc092334ac0a323b80a9602cb8bf60ca9dee3bfa
+
+Bug #10304,12784,11603: Add quirks for several physical size issues.
+
+A lot of EDID writers apparently end up stuffing centimeters (like the
+maximum image size field) into the detailed timings, instead of millimeters.
+Some of them only get it wrong in one direction.  Also, add a quirk to let
+us mark the largest 75hz mode as preferred, which will often be used for
+EDID 1.0 CRTs.
+---
+
+--- a/hw/xfree86/modes/xf86Crtc.c
++++ b/hw/xfree86/modes/xf86Crtc.c
+@@ -2134,8 +2134,12 @@ _X_EXPORT xf86MonPtr
+ xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus)
+ {
+     ScrnInfoPtr	scrn = output->scrn;
++    xf86MonPtr mon;
+ 
+-    return xf86DoEDID_DDC2 (scrn->scrnIndex, pDDCBus);
++    mon = xf86DoEDID_DDC2 (scrn->scrnIndex, pDDCBus);
++    xf86DDCApplyQuirks (scrn->scrnIndex, pDDCBus);
++
++    return mon;
+ }
+ 
+ static char *_xf86ConnectorNames[] = { "None", "VGA", "DVI-I", "DVI-D",
+--- a/hw/xfree86/modes/xf86EdidModes.c
++++ b/hw/xfree86/modes/xf86EdidModes.c
+@@ -54,6 +54,16 @@ typedef enum {
+     DDC_QUIRK_PREFER_LARGE_60 = 1 << 0,
+     /* 135MHz clock is too high, drop a bit */
+     DDC_QUIRK_135_CLOCK_TOO_HIGH = 1 << 1,
++    /* Prefer the largest mode at 75 Hz */
++    DDC_QUIRK_PREFER_LARGE_75 = 1 << 2,
++    /* Convert detailed timing's horizontal from units of cm to mm */
++    DDC_QUIRK_DETAILED_H_IN_CM = 1 << 3,
++    /* Convert detailed timing's vertical from units of cm to mm */
++    DDC_QUIRK_DETAILED_V_IN_CM = 1 << 4,
++    /* Detailed timing descriptors have bogus size values, so just take the
++     * maximum size and use that.
++     */
++    DDC_QUIRK_DETAILED_USE_MAXIMUM_SIZE = 1 << 5,
+ } ddc_quirk_t;
+ 
+ static Bool quirk_prefer_large_60 (int scrnIndex, xf86MonPtr DDC)
+@@ -81,6 +91,52 @@ static Bool quirk_prefer_large_60 (int s
+     return FALSE;
+ }
+ 
++static Bool quirk_prefer_large_75 (int scrnIndex, xf86MonPtr DDC)
++{
++    /* Bug #11603: Funai Electronics PM36B */
++    if (memcmp (DDC->vendor.name, "FCM", 4) == 0 &&
++	DDC->vendor.prod_id == 13600)
++	return TRUE;
++
++    return FALSE;
++}
++
++static Bool quirk_detailed_h_in_cm (int scrnIndex, xf86MonPtr DDC)
++{
++    /* Bug #10304: "LGPhilipsLCD LP154W01-A5" */
++    /* Bug #12784: "LGPhilipsLCD LP154W01-TLA2" */
++    if (memcmp (DDC->vendor.name, "LPL", 4) == 0 &&
++	DDC->vendor.prod_id == 0)
++	return TRUE;
++
++    /* Bug #11603: Funai Electronics PM36B */
++    if (memcmp (DDC->vendor.name, "FCM", 4) == 0 &&
++	DDC->vendor.prod_id == 13600)
++	return TRUE;
++
++    return FALSE;
++}
++
++static Bool quirk_detailed_v_in_cm (int scrnIndex, xf86MonPtr DDC)
++{
++    /* Bug #11603: Funai Electronics PM36B */
++    if (memcmp (DDC->vendor.name, "FCM", 4) == 0 &&
++	DDC->vendor.prod_id == 13600)
++	return TRUE;
++
++    return FALSE;
++}
++
++static Bool quirk_detailed_use_maximum_size (int scrnIndex, xf86MonPtr DDC)
++{
++    /* Bug #10304: LGPhilipsLCD LP154W01-A5 */
++    if (memcmp (DDC->vendor.name, "LPL", 4) == 0 &&
++	DDC->vendor.prod_id == 0)
++	return TRUE;
++
++    return FALSE;
++}
++
+ static Bool quirk_135_clock_too_high (int scrnIndex, xf86MonPtr DDC)
+ {
+     /* Envision Peripherals, Inc. EN-7100e.  See bug #9550. */
+@@ -106,6 +162,22 @@ static const ddc_quirk_map_t ddc_quirks[
+ 	quirk_135_clock_too_high,   DDC_QUIRK_135_CLOCK_TOO_HIGH,
+ 	"Recommended 135MHz pixel clock is too high"
+     },
++    {
++	quirk_prefer_large_75,   DDC_QUIRK_PREFER_LARGE_75,
++	"Detailed timing is not preferred, use largest mode at 75Hz"
++    },
++    {
++	quirk_detailed_h_in_cm,   DDC_QUIRK_DETAILED_H_IN_CM,
++	"Detailed timings give horizontal size in cm."
++    },
++    {
++	quirk_detailed_v_in_cm,   DDC_QUIRK_DETAILED_V_IN_CM,
++	"Detailed timings give vertical size in cm."
++    },
++    {
++	quirk_detailed_use_maximum_size,   DDC_QUIRK_DETAILED_USE_MAXIMUM_SIZE,
++	"Detailed timings give sizes in cm."
++    },
+     { 
+ 	NULL,		DDC_QUIRK_NONE,
+ 	"No known quirks"
+@@ -303,6 +375,98 @@ DDCGuessRangesFromModes(int scrnIndex, M
+     }
+ }
+ 
++static ddc_quirk_t
++xf86DDCDetectQuirks(int scrnIndex, xf86MonPtr DDC, Bool verbose)
++{
++    ddc_quirk_t	quirks;
++    int i;
++
++    quirks = DDC_QUIRK_NONE;
++    for (i = 0; ddc_quirks[i].detect; i++) {
++	if (ddc_quirks[i].detect (scrnIndex, DDC)) {
++	    if (verbose) {
++		xf86DrvMsg (scrnIndex, X_INFO, "    EDID quirk: %s\n",
++			    ddc_quirks[i].description);
++	    }
++	    quirks |= ddc_quirks[i].quirk;
++	}
++    }
++
++    return quirks;
++}
++
++/**
++ * Applies monitor-specific quirks to the decoded EDID information.
++ *
++ * Note that some quirks applying to the mode list are still implemented in
++ * xf86DDCGetModes.
++ */
++void
++xf86DDCApplyQuirks(int scrnIndex, xf86MonPtr DDC)
++{
++    ddc_quirk_t quirks = xf86DDCDetectQuirks (scrnIndex, DDC, FALSE);
++    int i;
++
++    for (i = 0; i < DET_TIMINGS; i++) {
++	struct detailed_monitor_section *det_mon = &DDC->det_mon[i];
++
++	if (det_mon->type != DT)
++	    continue;
++
++	if (quirks & DDC_QUIRK_DETAILED_H_IN_CM)
++	    det_mon->section.d_timings.h_size *= 10;
++
++	if (quirks & DDC_QUIRK_DETAILED_V_IN_CM)
++	    det_mon->section.d_timings.v_size *= 10;
++
++	if (quirks & DDC_QUIRK_DETAILED_USE_MAXIMUM_SIZE) {
++	    det_mon->section.d_timings.h_size = 10 * DDC->features.hsize;
++	    det_mon->section.d_timings.v_size = 10 * DDC->features.vsize;
++	}
++    }
++}
++
++/**
++ * Walks the modes list, finding the mode with the largest area which is
++ * closest to the target refresh rate, and marks it as the only preferred mode.
++*/
++static void
++xf86DDCSetPreferredRefresh(int scrnIndex, DisplayModePtr modes,
++			   float target_refresh)
++{
++	DisplayModePtr	mode, best = modes;
++
++	for (mode = modes; mode; mode = mode->next)
++	{
++	    mode->type &= ~M_T_PREFERRED;
++
++	    if (mode == best) continue;
++
++	    if (mode->HDisplay * mode->VDisplay >
++		best->HDisplay * best->VDisplay)
++	    {
++		best = mode;
++		continue;
++	    }
++	    if (mode->HDisplay * mode->VDisplay ==
++		best->HDisplay * best->VDisplay)
++	    {
++		double	mode_refresh = xf86ModeVRefresh (mode);
++		double	best_refresh = xf86ModeVRefresh (best);
++		double	mode_dist = fabs(mode_refresh - target_refresh);
++		double	best_dist = fabs(best_refresh - target_refresh);
++
++		if (mode_dist < best_dist)
++		{
++		    best = mode;
++		    continue;
++		}
++	    }
++	}
++	if (best)
++	    best->type |= M_T_PREFERRED;
++}
++
+ _X_EXPORT DisplayModePtr
+ xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
+ {
+@@ -312,15 +476,9 @@ xf86DDCGetModes(int scrnIndex, xf86MonPt
+ 
+     xf86DrvMsg (scrnIndex, X_INFO, "EDID vendor \"%s\", prod id %d\n",
+ 		DDC->vendor.name, DDC->vendor.prod_id);
+-    quirks = DDC_QUIRK_NONE;
+-    for (i = 0; ddc_quirks[i].detect; i++)
+-	if (ddc_quirks[i].detect (scrnIndex, DDC))
+-	{
+-	    xf86DrvMsg (scrnIndex, X_INFO, "    EDID quirk: %s\n",
+-			ddc_quirks[i].description);
+-	    quirks |= ddc_quirks[i].quirk;
+-	}
+-    
++
++    quirks = xf86DDCDetectQuirks(scrnIndex, DDC, TRUE);
++
+     preferred = PREFERRED_TIMING_MODE(DDC->features.msc);
+     if (quirks & DDC_QUIRK_PREFER_LARGE_60)
+ 	preferred = 0;
+@@ -357,32 +515,11 @@ xf86DDCGetModes(int scrnIndex, xf86MonPt
+     Modes = xf86ModesAdd(Modes, Mode);
+ 
+     if (quirks & DDC_QUIRK_PREFER_LARGE_60)
+-    {
+-	DisplayModePtr	best = Modes;
+-	for (Mode = Modes; Mode; Mode = Mode->next)
+-	{
+-	    if (Mode == best) continue;
+-	    if (Mode->HDisplay * Mode->VDisplay > best->HDisplay * best->VDisplay)
+-	    {
+-		best = Mode;
+-		continue;
+-	    }
+-	    if (Mode->HDisplay * Mode->VDisplay == best->HDisplay * best->VDisplay)
+-	    {
+-		double	mode_refresh = xf86ModeVRefresh (Mode);
+-		double	best_refresh = xf86ModeVRefresh (best);
+-		double	mode_dist = fabs(mode_refresh - 60.0);
+-		double	best_dist = fabs(best_refresh - 60.0);
+-		if (mode_dist < best_dist)
+-		{
+-		    best = Mode;
+-		    continue;
+-		}
+-	    }
+-	}
+-	if (best)
+-	    best->type |= M_T_PREFERRED;
+-    }
++	xf86DDCSetPreferredRefresh(scrnIndex, Modes, 60);
++
++    if (quirks & DDC_QUIRK_PREFER_LARGE_75)
++	xf86DDCSetPreferredRefresh(scrnIndex, Modes, 75);
++
+     return Modes;
+ }
+ 
+--- a/hw/xfree86/modes/xf86Modes.h
++++ b/hw/xfree86/modes/xf86Modes.h
+@@ -95,4 +95,7 @@ xf86GetMonitorModes (ScrnInfoPtr pScrn, 
+ DisplayModePtr
+ xf86GetDefaultModes (Bool interlaceAllowed, Bool doubleScanAllowed);
+ 
++void
++xf86DDCApplyQuirks(int scrnIndex, xf86MonPtr DDC);
++
+ #endif /* _XF86MODES_H_ */
diff --git a/debian/patches/series b/debian/patches/series
index 93e3aea..8e6819e 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -42,3 +42,4 @@
 146_X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch
 147_X86EMU-pass-the-correct-bus-dev-fn-tag-to-pci-emula.patch
 148_dix_touchscreen_fixes.diff
+149_add_quirks_for_physical_screen_size_issues.patch


Reply to: