Subversion Repositories Kolibri OS

Rev

Rev 3192 | Rev 3746 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1123 serge 1
/*
2
 * Copyright (c) 2006 Luc Verhaegen (quirks list)
3
 * Copyright (c) 2007-2008 Intel Corporation
4
 *   Jesse Barnes 
1963 serge 5
 * Copyright 2010 Red Hat, Inc.
1123 serge 6
 *
7
 * DDC probing routines (drm_ddc_read & drm_do_probe_ddc_edid) originally from
8
 * FB layer.
9
 *   Copyright (C) 2006 Dennis Munsie 
10
 *
11
 * Permission is hereby granted, free of charge, to any person obtaining a
12
 * copy of this software and associated documentation files (the "Software"),
13
 * to deal in the Software without restriction, including without limitation
14
 * the rights to use, copy, modify, merge, publish, distribute, sub license,
15
 * and/or sell copies of the Software, and to permit persons to whom the
16
 * Software is furnished to do so, subject to the following conditions:
17
 *
18
 * The above copyright notice and this permission notice (including the
19
 * next paragraph) shall be included in all copies or substantial portions
20
 * of the Software.
21
 *
22
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
25
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28
 * DEALINGS IN THE SOFTWARE.
29
 */
1221 serge 30
#include 
1963 serge 31
#include 
3480 Serge 32
#include 
1125 serge 33
#include 
3031 serge 34
#include 
35
#include 
36
#include 
1123 serge 37
 
1963 serge 38
#define version_greater(edid, maj, min) \
39
	(((edid)->version > (maj)) || \
40
	 ((edid)->version == (maj) && (edid)->revision > (min)))
1123 serge 41
 
1963 serge 42
#define EDID_EST_TIMINGS 16
43
#define EDID_STD_TIMINGS 8
44
#define EDID_DETAILED_TIMINGS 4
45
 
1123 serge 46
/*
47
 * EDID blocks out in the wild have a variety of bugs, try to collect
48
 * them here (note that userspace may work around broken monitors first,
49
 * but fixes should make their way here so that the kernel "just works"
50
 * on as many displays as possible).
51
 */
52
 
53
/* First detailed mode wrong, use largest 60Hz mode */
54
#define EDID_QUIRK_PREFER_LARGE_60		(1 << 0)
55
/* Reported 135MHz pixel clock is too high, needs adjustment */
56
#define EDID_QUIRK_135_CLOCK_TOO_HIGH		(1 << 1)
57
/* Prefer the largest mode at 75 Hz */
58
#define EDID_QUIRK_PREFER_LARGE_75		(1 << 2)
59
/* Detail timing is in cm not mm */
60
#define EDID_QUIRK_DETAILED_IN_CM		(1 << 3)
61
/* Detailed timing descriptors have bogus size values, so just take the
62
 * maximum size and use that.
63
 */
64
#define EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE	(1 << 4)
65
/* Monitor forgot to set the first detailed is preferred bit. */
66
#define EDID_QUIRK_FIRST_DETAILED_PREFERRED	(1 << 5)
67
/* use +hsync +vsync for detailed mode */
68
#define EDID_QUIRK_DETAILED_SYNC_PP		(1 << 6)
3031 serge 69
/* Force reduced-blanking timings for detailed modes */
70
#define EDID_QUIRK_FORCE_REDUCED_BLANKING	(1 << 7)
1123 serge 71
 
1963 serge 72
struct detailed_mode_closure {
73
	struct drm_connector *connector;
74
	struct edid *edid;
75
	bool preferred;
76
	u32 quirks;
77
	int modes;
78
};
1430 serge 79
 
1179 serge 80
#define LEVEL_DMT	0
81
#define LEVEL_GTF	1
1963 serge 82
#define LEVEL_GTF2	2
83
#define LEVEL_CVT	3
1179 serge 84
 
1123 serge 85
static struct edid_quirk {
3031 serge 86
	char vendor[4];
1123 serge 87
	int product_id;
88
	u32 quirks;
89
} edid_quirk_list[] = {
90
	/* Acer AL1706 */
91
	{ "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 },
92
	/* Acer F51 */
93
	{ "API", 0x7602, EDID_QUIRK_PREFER_LARGE_60 },
94
	/* Unknown Acer */
95
	{ "ACR", 2423, EDID_QUIRK_FIRST_DETAILED_PREFERRED },
96
 
97
	/* Belinea 10 15 55 */
98
	{ "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 },
99
	{ "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 },
100
 
101
	/* Envision Peripherals, Inc. EN-7100e */
102
	{ "EPI", 59264, EDID_QUIRK_135_CLOCK_TOO_HIGH },
1963 serge 103
	/* Envision EN2028 */
104
	{ "EPI", 8232, EDID_QUIRK_PREFER_LARGE_60 },
1123 serge 105
 
106
	/* Funai Electronics PM36B */
107
	{ "FCM", 13600, EDID_QUIRK_PREFER_LARGE_75 |
108
	  EDID_QUIRK_DETAILED_IN_CM },
109
 
110
	/* LG Philips LCD LP154W01-A5 */
111
	{ "LPL", 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE },
112
	{ "LPL", 0x2a00, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE },
113
 
114
	/* Philips 107p5 CRT */
115
	{ "PHL", 57364, EDID_QUIRK_FIRST_DETAILED_PREFERRED },
116
 
117
	/* Proview AY765C */
118
	{ "PTS", 765, EDID_QUIRK_FIRST_DETAILED_PREFERRED },
119
 
120
	/* Samsung SyncMaster 205BW.  Note: irony */
121
	{ "SAM", 541, EDID_QUIRK_DETAILED_SYNC_PP },
122
	/* Samsung SyncMaster 22[5-6]BW */
123
	{ "SAM", 596, EDID_QUIRK_PREFER_LARGE_60 },
124
	{ "SAM", 638, EDID_QUIRK_PREFER_LARGE_60 },
3031 serge 125
 
126
	/* ViewSonic VA2026w */
127
	{ "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING },
1123 serge 128
};
129
 
3480 Serge 130
/*
131
 * Autogenerated from the DMT spec.
132
 * This table is copied from xfree86/modes/xf86EdidModes.c.
133
 */
134
static const struct drm_display_mode drm_dmt_modes[] = {
135
	/* 640x350@85Hz */
136
	{ DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
137
		   736, 832, 0, 350, 382, 385, 445, 0,
138
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
139
	/* 640x400@85Hz */
140
	{ DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
141
		   736, 832, 0, 400, 401, 404, 445, 0,
142
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
143
	/* 720x400@85Hz */
144
	{ DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 756,
145
		   828, 936, 0, 400, 401, 404, 446, 0,
146
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
147
	/* 640x480@60Hz */
148
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
149
		   752, 800, 0, 480, 489, 492, 525, 0,
150
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
151
	/* 640x480@72Hz */
152
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
153
		   704, 832, 0, 480, 489, 492, 520, 0,
154
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
155
	/* 640x480@75Hz */
156
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656,
157
		   720, 840, 0, 480, 481, 484, 500, 0,
158
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
159
	/* 640x480@85Hz */
160
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 36000, 640, 696,
161
		   752, 832, 0, 480, 481, 484, 509, 0,
162
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
163
	/* 800x600@56Hz */
164
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824,
165
		   896, 1024, 0, 600, 601, 603, 625, 0,
166
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
167
	/* 800x600@60Hz */
168
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
169
		   968, 1056, 0, 600, 601, 605, 628, 0,
170
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
171
	/* 800x600@72Hz */
172
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856,
173
		   976, 1040, 0, 600, 637, 643, 666, 0,
174
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
175
	/* 800x600@75Hz */
176
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816,
177
		   896, 1056, 0, 600, 601, 604, 625, 0,
178
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
179
	/* 800x600@85Hz */
180
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 56250, 800, 832,
181
		   896, 1048, 0, 600, 601, 604, 631, 0,
182
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
183
	/* 800x600@120Hz RB */
184
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 73250, 800, 848,
185
		   880, 960, 0, 600, 603, 607, 636, 0,
186
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
187
	/* 848x480@60Hz */
188
	{ DRM_MODE("848x480", DRM_MODE_TYPE_DRIVER, 33750, 848, 864,
189
		   976, 1088, 0, 480, 486, 494, 517, 0,
190
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
191
	/* 1024x768@43Hz, interlace */
192
	{ DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032,
193
		   1208, 1264, 0, 768, 768, 772, 817, 0,
194
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
195
			DRM_MODE_FLAG_INTERLACE) },
196
	/* 1024x768@60Hz */
197
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
198
		   1184, 1344, 0, 768, 771, 777, 806, 0,
199
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
200
	/* 1024x768@70Hz */
201
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048,
202
		   1184, 1328, 0, 768, 771, 777, 806, 0,
203
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
204
	/* 1024x768@75Hz */
205
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040,
206
		   1136, 1312, 0, 768, 769, 772, 800, 0,
207
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
208
	/* 1024x768@85Hz */
209
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 94500, 1024, 1072,
210
		   1168, 1376, 0, 768, 769, 772, 808, 0,
211
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
212
	/* 1024x768@120Hz RB */
213
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 115500, 1024, 1072,
214
		   1104, 1184, 0, 768, 771, 775, 813, 0,
215
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
216
	/* 1152x864@75Hz */
217
	{ DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216,
218
		   1344, 1600, 0, 864, 865, 868, 900, 0,
219
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
220
	/* 1280x768@60Hz RB */
221
	{ DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 68250, 1280, 1328,
222
		   1360, 1440, 0, 768, 771, 778, 790, 0,
223
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
224
	/* 1280x768@60Hz */
225
	{ DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 79500, 1280, 1344,
226
		   1472, 1664, 0, 768, 771, 778, 798, 0,
227
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
228
	/* 1280x768@75Hz */
229
	{ DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 102250, 1280, 1360,
230
		   1488, 1696, 0, 768, 771, 778, 805, 0,
231
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
232
	/* 1280x768@85Hz */
233
	{ DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 117500, 1280, 1360,
234
		   1496, 1712, 0, 768, 771, 778, 809, 0,
235
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
236
	/* 1280x768@120Hz RB */
237
	{ DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 140250, 1280, 1328,