drm: Add 800x600 (SVGA) screen resolution to the built-in EDIDs
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>
This commit is contained in:
parent
9a6594fc52
commit
4cbe1bfa27
9 changed files with 81 additions and 10 deletions
|
@ -36,7 +36,7 @@
|
||||||
#define DPI 72
|
#define DPI 72
|
||||||
#define VFREQ 60 /* Hz */
|
#define VFREQ 60 /* Hz */
|
||||||
#define TIMING_NAME "Linux XGA"
|
#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 HSYNC_POL 0
|
||||||
#define VSYNC_POL 0
|
#define VSYNC_POL 0
|
||||||
#define CRC 0x55
|
#define CRC 0x55
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#define DPI 72
|
#define DPI 72
|
||||||
#define VFREQ 60 /* Hz */
|
#define VFREQ 60 /* Hz */
|
||||||
#define TIMING_NAME "Linux SXGA"
|
#define TIMING_NAME "Linux SXGA"
|
||||||
#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
|
/* No ESTABLISHED_TIMINGx_BITS */
|
||||||
#define HSYNC_POL 1
|
#define HSYNC_POL 1
|
||||||
#define VSYNC_POL 1
|
#define VSYNC_POL 1
|
||||||
#define CRC 0xa0
|
#define CRC 0xa0
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#define DPI 72
|
#define DPI 72
|
||||||
#define VFREQ 60 /* Hz */
|
#define VFREQ 60 /* Hz */
|
||||||
#define TIMING_NAME "Linux UXGA"
|
#define TIMING_NAME "Linux UXGA"
|
||||||
#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
|
/* No ESTABLISHED_TIMINGx_BITS */
|
||||||
#define HSYNC_POL 1
|
#define HSYNC_POL 1
|
||||||
#define VSYNC_POL 1
|
#define VSYNC_POL 1
|
||||||
#define CRC 0x9d
|
#define CRC 0x9d
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#define DPI 96
|
#define DPI 96
|
||||||
#define VFREQ 60 /* Hz */
|
#define VFREQ 60 /* Hz */
|
||||||
#define TIMING_NAME "Linux WSXGA"
|
#define TIMING_NAME "Linux WSXGA"
|
||||||
#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
|
/* No ESTABLISHED_TIMINGx_BITS */
|
||||||
#define HSYNC_POL 1
|
#define HSYNC_POL 1
|
||||||
#define VSYNC_POL 1
|
#define VSYNC_POL 1
|
||||||
#define CRC 0x26
|
#define CRC 0x26
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#define DPI 96
|
#define DPI 96
|
||||||
#define VFREQ 60 /* Hz */
|
#define VFREQ 60 /* Hz */
|
||||||
#define TIMING_NAME "Linux FHD"
|
#define TIMING_NAME "Linux FHD"
|
||||||
#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
|
/* No ESTABLISHED_TIMINGx_BITS */
|
||||||
#define HSYNC_POL 1
|
#define HSYNC_POL 1
|
||||||
#define VSYNC_POL 1
|
#define VSYNC_POL 1
|
||||||
#define CRC 0x05
|
#define CRC 0x05
|
||||||
|
|
41
Documentation/EDID/800x600.S
Normal file
41
Documentation/EDID/800x600.S
Normal file
|
@ -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"
|
|
@ -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
|
individually prepared or corrected EDID data set in the /lib/firmware
|
||||||
directory from where it is loaded via the firmware interface. The code
|
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
|
(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
|
1680x1050, 1920x1080) as binary blobs, but the kernel source tree does
|
||||||
not contain code to create these data. In order to elucidate the origin
|
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
|
of the built-in binary EDID blobs and to facilitate the creation of
|
||||||
|
|
|
@ -33,6 +33,17 @@
|
||||||
#define XY_RATIO_5_4 0b10
|
#define XY_RATIO_5_4 0b10
|
||||||
#define XY_RATIO_16_9 0b11
|
#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) \
|
#define mfgname2id(v1,v2,v3) \
|
||||||
((((v1-'@')&0x1f)<<10)+(((v2-'@')&0x1f)<<5)+((v3-'@')&0x1f))
|
((((v1-'@')&0x1f)<<10)+(((v2-'@')&0x1f)<<5)+((v3-'@')&0x1f))
|
||||||
#define swap16(v1) ((v1>>8)+((v1&0xff)<<8))
|
#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 2 640x480 @ 75 Hz
|
||||||
Bit 1 800x600 @ 56 Hz
|
Bit 1 800x600 @ 56 Hz
|
||||||
Bit 0 800x600 @ 60 Hz */
|
Bit 0 800x600 @ 60 Hz */
|
||||||
estbl_timing1: .byte 0x00
|
estbl_timing1: .byte ESTABLISHED_TIMING1_BITS
|
||||||
|
|
||||||
/* Bit 7 800x600 @ 72 Hz
|
/* Bit 7 800x600 @ 72 Hz
|
||||||
Bit 6 800x600 @ 75 Hz
|
Bit 6 800x600 @ 75 Hz
|
||||||
|
@ -149,11 +160,11 @@ estbl_timing1: .byte 0x00
|
||||||
Bit 2 1024x768 @ 72 Hz
|
Bit 2 1024x768 @ 72 Hz
|
||||||
Bit 1 1024x768 @ 75 Hz
|
Bit 1 1024x768 @ 75 Hz
|
||||||
Bit 0 1280x1024 @ 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)
|
/* Bit 7 1152x870 @ 75 Hz (Apple Macintosh II)
|
||||||
Bits 6-0 Other manufacturer-specific display mod */
|
Bits 6-0 Other manufacturer-specific display mod */
|
||||||
estbl_timing3: .byte 0x00
|
estbl_timing3: .byte ESTABLISHED_TIMING3_BITS
|
||||||
|
|
||||||
/* Standard timing */
|
/* Standard timing */
|
||||||
/* X resolution, less 31, divided by 8 (256-2288 pixels) */
|
/* X resolution, less 31, divided by 8 (256-2288 pixels) */
|
||||||
|
|
|
@ -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 "
|
MODULE_PARM_DESC(edid_firmware, "Do not probe monitor, use specified EDID blob "
|
||||||
"from built-in data or /lib/firmware instead. ");
|
"from built-in data or /lib/firmware instead. ");
|
||||||
|
|
||||||
#define GENERIC_EDIDS 5
|
#define GENERIC_EDIDS 6
|
||||||
static const char *generic_edid_name[GENERIC_EDIDS] = {
|
static const char *generic_edid_name[GENERIC_EDIDS] = {
|
||||||
|
"edid/800x600.bin",
|
||||||
"edid/1024x768.bin",
|
"edid/1024x768.bin",
|
||||||
"edid/1280x1024.bin",
|
"edid/1280x1024.bin",
|
||||||
"edid/1600x1200.bin",
|
"edid/1600x1200.bin",
|
||||||
|
@ -41,6 +42,24 @@ static const char *generic_edid_name[GENERIC_EDIDS] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const u8 generic_edid[GENERIC_EDIDS][128] = {
|
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,
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
0x31, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x31, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
|
Loading…
Reference in a new issue