drm: Add 800x600 (SVGA) screen resolution to the built-in EDIDs
authorDaniel Thompson <daniel.thompson@linaro.org>
Fri, 23 May 2014 15:01:43 +0000 (16:01 +0100)
committerDave Airlie <airlied@redhat.com>
Mon, 26 May 2014 02:53:40 +0000 (12:53 +1000)
The 800x600 (SVGA) screen resolution was lacking in the set of
built-in selectable EDID screen resolutions that can be used to
repair misbehaving monitor firmware.

This patch adds the related data set and expands the documentation.
Note that the SVGA bit occupies a different byte to all the existing
users of the established timing bits forcing a rework of the
ESTABLISHED_TIMINGS_BITS macro.

Tested new EDID on an aged (and misbehaving) industrial LCD panel;
existing EDIDs still pass edid-decode's checksum checks.

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: David Airlie <airlied@linux.ie>
Cc: Carsten Emde <C.Emde@osadl.org>
Cc: linux-doc@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Documentation/EDID/1024x768.S
Documentation/EDID/1280x1024.S
Documentation/EDID/1600x1200.S
Documentation/EDID/1680x1050.S
Documentation/EDID/1920x1080.S
Documentation/EDID/800x600.S [new file with mode: 0644]
Documentation/EDID/HOWTO.txt
Documentation/EDID/edid.S
drivers/gpu/drm/drm_edid_load.c

index 4b486fe31b322f5267d1b67ccdad012a1c4cf85c..6f3e4b75e49ea639cc45d65d5dbdb9daac9e790f 100644 (file)
@@ -36,7 +36,7 @@
 #define DPI 72
 #define VFREQ 60 /* Hz */
 #define TIMING_NAME "Linux XGA"
-#define ESTABLISHED_TIMINGS_BITS 0x08 /* Bit 3 -> 1024x768 @60 Hz */
+#define ESTABLISHED_TIMING2_BITS 0x08 /* Bit 3 -> 1024x768 @60 Hz */
 #define HSYNC_POL 0
 #define VSYNC_POL 0
 #define CRC 0x55
index a2799fe33a4d71e6ae0be9d3260ed1773aeb3bd1..bd9bef2a65af7204bb8541fa195871ec5459e480 100644 (file)
@@ -36,7 +36,7 @@
 #define DPI 72
 #define VFREQ 60 /* Hz */
 #define TIMING_NAME "Linux SXGA"
-#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
+/* No ESTABLISHED_TIMINGx_BITS */
 #define HSYNC_POL 1
 #define VSYNC_POL 1
 #define CRC 0xa0
index 0ded64cfd1f5e2e39af00f70c498dca802c02dc6..a45101c6160c5c418c5a038218d590193f95d6ca 100644 (file)
@@ -36,7 +36,7 @@
 #define DPI 72
 #define VFREQ 60 /* Hz */
 #define TIMING_NAME "Linux UXGA"
-#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
+/* No ESTABLISHED_TIMINGx_BITS */
 #define HSYNC_POL 1
 #define VSYNC_POL 1
 #define CRC 0x9d
index 96f67cafcf2ef962888bd0098576276e10e5f359..b0d7c69282b46433741ba922e48d42776ec582bd 100644 (file)
@@ -36,7 +36,7 @@
 #define DPI 96
 #define VFREQ 60 /* Hz */
 #define TIMING_NAME "Linux WSXGA"
-#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
+/* No ESTABLISHED_TIMINGx_BITS */
 #define HSYNC_POL 1
 #define VSYNC_POL 1
 #define CRC 0x26
index 36ed5d571d0a9101fd535d40d0afb92e440ed4d7..3084355e81e76103ce7f29e0ff12d26c7e097746 100644 (file)
@@ -36,7 +36,7 @@
 #define DPI 96
 #define VFREQ 60 /* Hz */
 #define TIMING_NAME "Linux FHD"
-#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
+/* No ESTABLISHED_TIMINGx_BITS */
 #define HSYNC_POL 1
 #define VSYNC_POL 1
 #define CRC 0x05
diff --git a/Documentation/EDID/800x600.S b/Documentation/EDID/800x600.S
new file mode 100644 (file)
index 0000000..6644e26
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+   800x600.S: EDID data set for standard 800x600 60 Hz monitor
+
+   Copyright (C) 2011 Carsten Emde <C.Emde@osadl.org>
+   Copyright (C) 2014 Linaro Limited
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License
+   as published by the Free Software Foundation; either version 2
+   of the License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+*/
+
+/* EDID */
+#define VERSION 1
+#define REVISION 3
+
+/* Display */
+#define CLOCK 40000 /* kHz */
+#define XPIX 800
+#define YPIX 600
+#define XY_RATIO XY_RATIO_4_3
+#define XBLANK 256
+#define YBLANK 28
+#define XOFFSET 40
+#define XPULSE 128
+#define YOFFSET (63+1)
+#define YPULSE (63+4)
+#define DPI 72
+#define VFREQ 60 /* Hz */
+#define TIMING_NAME "Linux SVGA"
+#define ESTABLISHED_TIMING1_BITS 0x01 /* Bit 0: 800x600 @ 60Hz */
+#define HSYNC_POL 1
+#define VSYNC_POL 1
+#define CRC 0xc2
+
+#include "edid.S"
index 7146db1d9e8cf1e855b86002e34820dc270665c9..835db332289b35aa0d126dc7065572dfd82e801e 100644 (file)
@@ -18,7 +18,7 @@ CONFIG_DRM_LOAD_EDID_FIRMWARE was introduced. It allows to provide an
 individually prepared or corrected EDID data set in the /lib/firmware
 directory from where it is loaded via the firmware interface. The code
 (see drivers/gpu/drm/drm_edid_load.c) contains built-in data sets for
-commonly used screen resolutions (1024x768, 1280x1024, 1600x1200,
+commonly used screen resolutions (800x600, 1024x768, 1280x1024, 1600x1200,
 1680x1050, 1920x1080) as binary blobs, but the kernel source tree does
 not contain code to create these data. In order to elucidate the origin
 of the built-in binary EDID blobs and to facilitate the creation of
index ea97ae275fca2fac741d04dc60cb0632faa70bbc..7ac03276d7a2363200f21b09135da008e8b02da9 100644 (file)
 #define XY_RATIO_5_4   0b10
 #define XY_RATIO_16_9  0b11
 
+/* Provide defaults for the timing bits */
+#ifndef ESTABLISHED_TIMING1_BITS
+#define ESTABLISHED_TIMING1_BITS 0x00
+#endif
+#ifndef ESTABLISHED_TIMING2_BITS
+#define ESTABLISHED_TIMING2_BITS 0x00
+#endif
+#ifndef ESTABLISHED_TIMING3_BITS
+#define ESTABLISHED_TIMING3_BITS 0x00
+#endif
+
 #define mfgname2id(v1,v2,v3) \
        ((((v1-'@')&0x1f)<<10)+(((v2-'@')&0x1f)<<5)+((v3-'@')&0x1f))
 #define swap16(v1) ((v1>>8)+((v1&0xff)<<8))
@@ -139,7 +150,7 @@ white_x_y_msb:      .byte   0x50,0x54
    Bit 2       640x480 @ 75 Hz
    Bit 1       800x600 @ 56 Hz
    Bit 0       800x600 @ 60 Hz */
-estbl_timing1: .byte   0x00
+estbl_timing1: .byte   ESTABLISHED_TIMING1_BITS
 
 /* Bit 7       800x600 @ 72 Hz
    Bit 6       800x600 @ 75 Hz
@@ -149,11 +160,11 @@ estbl_timing1:    .byte   0x00
    Bit 2       1024x768 @ 72 Hz
    Bit 1       1024x768 @ 75 Hz
    Bit 0       1280x1024 @ 75 Hz */
-estbl_timing2: .byte   ESTABLISHED_TIMINGS_BITS
+estbl_timing2: .byte   ESTABLISHED_TIMING2_BITS
 
 /* Bit 7       1152x870 @ 75 Hz (Apple Macintosh II)
    Bits 6-0    Other manufacturer-specific display mod */
-estbl_timing3: .byte   0x00
+estbl_timing3: .byte   ESTABLISHED_TIMING3_BITS
 
 /* Standard timing */
 /* X resolution, less 31, divided by 8 (256-2288 pixels) */
index 1b4c7a5442c5de22210925c2cea8317790340b04..6e09f615ebc9b015593d986f7b804a761f79e131 100644 (file)
@@ -31,8 +31,9 @@ module_param_string(edid_firmware, edid_firmware, sizeof(edid_firmware), 0644);
 MODULE_PARM_DESC(edid_firmware, "Do not probe monitor, use specified EDID blob "
        "from built-in data or /lib/firmware instead. ");
 
-#define GENERIC_EDIDS 5
+#define GENERIC_EDIDS 6
 static const char *generic_edid_name[GENERIC_EDIDS] = {
+       "edid/800x600.bin",
        "edid/1024x768.bin",
        "edid/1280x1024.bin",
        "edid/1600x1200.bin",
@@ -41,6 +42,24 @@ static const char *generic_edid_name[GENERIC_EDIDS] = {
 };
 
 static const u8 generic_edid[GENERIC_EDIDS][128] = {
+       {
+       0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+       0x31, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x05, 0x16, 0x01, 0x03, 0x6d, 0x1b, 0x14, 0x78,
+       0xea, 0x5e, 0xc0, 0xa4, 0x59, 0x4a, 0x98, 0x25,
+       0x20, 0x50, 0x54, 0x01, 0x00, 0x00, 0x45, 0x40,
+       0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+       0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xa0, 0x0f,
+       0x20, 0x00, 0x31, 0x58, 0x1c, 0x20, 0x28, 0x80,
+       0x14, 0x00, 0x15, 0xd0, 0x10, 0x00, 0x00, 0x1e,
+       0x00, 0x00, 0x00, 0xff, 0x00, 0x4c, 0x69, 0x6e,
+       0x75, 0x78, 0x20, 0x23, 0x30, 0x0a, 0x20, 0x20,
+       0x20, 0x20, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x3b,
+       0x3d, 0x24, 0x26, 0x05, 0x00, 0x0a, 0x20, 0x20,
+       0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xfc,
+       0x00, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x53,
+       0x56, 0x47, 0x41, 0x0a, 0x20, 0x20, 0x00, 0xc2,
+       },
        {
        0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
        0x31, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,