Subversion Repositories Kolibri OS

Rev

Rev 3192 | Rev 3746 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3192 Rev 3480
Line 27... Line 27...
27
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28
 * DEALINGS IN THE SOFTWARE.
28
 * DEALINGS IN THE SOFTWARE.
29
 */
29
 */
30
#include 
30
#include 
31
#include 
31
#include 
-
 
32
#include 
32
#include 
33
#include 
33
#include 
34
#include 
34
#include 
35
#include 
35
#include 
36
#include 
36
#include "drm_edid_modes.h"
-
 
Line 37... Line 37...
37
 
37
 
38
#define version_greater(edid, maj, min) \
38
#define version_greater(edid, maj, min) \
39
	(((edid)->version > (maj)) || \
39
	(((edid)->version > (maj)) || \
Line 85... Line 85...
85
static struct edid_quirk {
85
static struct edid_quirk {
86
	char vendor[4];
86
	char vendor[4];
87
	int product_id;
87
	int product_id;
88
	u32 quirks;
88
	u32 quirks;
89
} edid_quirk_list[] = {
89
} edid_quirk_list[] = {
90
	/* ASUS VW222S */
-
 
91
	{ "ACI", 0x22a2, EDID_QUIRK_FORCE_REDUCED_BLANKING },
-
 
92
 
-
 
93
	/* Acer AL1706 */
90
	/* Acer AL1706 */
94
	{ "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 },
91
	{ "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 },
95
	/* Acer F51 */
92
	/* Acer F51 */
96
	{ "API", 0x7602, EDID_QUIRK_PREFER_LARGE_60 },
93
	{ "API", 0x7602, EDID_QUIRK_PREFER_LARGE_60 },
97
	/* Unknown Acer */
94
	/* Unknown Acer */
Line 128... Line 125...
128
 
125
 
129
	/* ViewSonic VA2026w */
126
	/* ViewSonic VA2026w */
130
	{ "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING },
127
	{ "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING },
Line -... Line 128...
-
 
128
};
-
 
129
 
-
 
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,
-
 
238
		   1360, 1440, 0, 768, 771, 778, 813, 0,
-
 
239
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
240
	/* 1280x800@60Hz RB */
-
 
241
	{ DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 71000, 1280, 1328,
-
 
242
		   1360, 1440, 0, 800, 803, 809, 823, 0,
-
 
243
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
244
	/* 1280x800@60Hz */
-
 
245
	{ DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352,
-
 
246
		   1480, 1680, 0, 800, 803, 809, 831, 0,
-
 
247
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
248
	/* 1280x800@75Hz */
-
 
249
	{ DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 106500, 1280, 1360,
-
 
250
		   1488, 1696, 0, 800, 803, 809, 838, 0,
-
 
251
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
252
	/* 1280x800@85Hz */
-
 
253
	{ DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 122500, 1280, 1360,
-
 
254
		   1496, 1712, 0, 800, 803, 809, 843, 0,
-
 
255
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
256
	/* 1280x800@120Hz RB */
-
 
257
	{ DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 146250, 1280, 1328,
-
 
258
		   1360, 1440, 0, 800, 803, 809, 847, 0,
-
 
259
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
260
	/* 1280x960@60Hz */
-
 
261
	{ DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1376,
-
 
262
		   1488, 1800, 0, 960, 961, 964, 1000, 0,
-
 
263
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
264
	/* 1280x960@85Hz */
-
 
265
	{ DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1344,
-
 
266
		   1504, 1728, 0, 960, 961, 964, 1011, 0,
-
 
267
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
268
	/* 1280x960@120Hz RB */
-
 
269
	{ DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 175500, 1280, 1328,
-
 
270
		   1360, 1440, 0, 960, 963, 967, 1017, 0,
-
 
271
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
272
	/* 1280x1024@60Hz */
-
 
273
	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1328,
-
 
274
		   1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
-
 
275
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
276
	/* 1280x1024@75Hz */
-
 
277
	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296,
-
 
278
		   1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
-
 
279
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
280
	/* 1280x1024@85Hz */
-
 
281
	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 157500, 1280, 1344,
-
 
282
		   1504, 1728, 0, 1024, 1025, 1028, 1072, 0,
-
 
283
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
284
	/* 1280x1024@120Hz RB */
-
 
285
	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 187250, 1280, 1328,
-
 
286
		   1360, 1440, 0, 1024, 1027, 1034, 1084, 0,
-
 
287
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
288
	/* 1360x768@60Hz */
-
 
289
	{ DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 85500, 1360, 1424,
-
 
290
		   1536, 1792, 0, 768, 771, 777, 795, 0,
-
 
291
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
292
	/* 1360x768@120Hz RB */
-
 
293
	{ DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 148250, 1360, 1408,
-
 
294
		   1440, 1520, 0, 768, 771, 776, 813, 0,
-
 
295
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
296
	/* 1400x1050@60Hz RB */
-
 
297
	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 101000, 1400, 1448,
-
 
298
		   1480, 1560, 0, 1050, 1053, 1057, 1080, 0,
-
 
299
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
300
	/* 1400x1050@60Hz */
-
 
301
	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 121750, 1400, 1488,
-
 
302
		   1632, 1864, 0, 1050, 1053, 1057, 1089, 0,
-
 
303
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
304
	/* 1400x1050@75Hz */
-
 
305
	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 156000, 1400, 1504,
-
 
306
		   1648, 1896, 0, 1050, 1053, 1057, 1099, 0,
-
 
307
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
308
	/* 1400x1050@85Hz */
-
 
309
	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 179500, 1400, 1504,
-
 
310
		   1656, 1912, 0, 1050, 1053, 1057, 1105, 0,
-
 
311
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
312
	/* 1400x1050@120Hz RB */
-
 
313
	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 208000, 1400, 1448,
-
 
314
		   1480, 1560, 0, 1050, 1053, 1057, 1112, 0,
-
 
315
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
316
	/* 1440x900@60Hz RB */
-
 
317
	{ DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 88750, 1440, 1488,
-
 
318
		   1520, 1600, 0, 900, 903, 909, 926, 0,
-
 
319
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
320
	/* 1440x900@60Hz */
-
 
321
	{ DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 106500, 1440, 1520,
-
 
322
		   1672, 1904, 0, 900, 903, 909, 934, 0,
-
 
323
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
324
	/* 1440x900@75Hz */
-
 
325
	{ DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 136750, 1440, 1536,
-
 
326
		   1688, 1936, 0, 900, 903, 909, 942, 0,
-
 
327
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
328
	/* 1440x900@85Hz */
-
 
329
	{ DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 157000, 1440, 1544,
-
 
330
		   1696, 1952, 0, 900, 903, 909, 948, 0,
-
 
331
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
332
	/* 1440x900@120Hz RB */
-
 
333
	{ DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 182750, 1440, 1488,
-
 
334
		   1520, 1600, 0, 900, 903, 909, 953, 0,
-
 
335
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
336
	/* 1600x1200@60Hz */
-
 
337
	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 162000, 1600, 1664,
-
 
338
		   1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
-
 
339
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
340
	/* 1600x1200@65Hz */
-
 
341
	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 175500, 1600, 1664,
-
 
342
		   1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
-
 
343
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
344
	/* 1600x1200@70Hz */
-
 
345
	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 189000, 1600, 1664,
-
 
346
		   1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
-
 
347
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
348
	/* 1600x1200@75Hz */
-
 
349
	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 202500, 1600, 1664,
-
 
350
		   1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
-
 
351
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
352
	/* 1600x1200@85Hz */
-
 
353
	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 229500, 1600, 1664,
-
 
354
		   1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
-
 
355
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
356
	/* 1600x1200@120Hz RB */
-
 
357
	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 268250, 1600, 1648,
-
 
358
		   1680, 1760, 0, 1200, 1203, 1207, 1271, 0,
-
 
359
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
360
	/* 1680x1050@60Hz RB */
-
 
361
	{ DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 119000, 1680, 1728,
-
 
362
		   1760, 1840, 0, 1050, 1053, 1059, 1080, 0,
-
 
363
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
364
	/* 1680x1050@60Hz */
-
 
365
	{ DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 146250, 1680, 1784,
-
 
366
		   1960, 2240, 0, 1050, 1053, 1059, 1089, 0,
-
 
367
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
368
	/* 1680x1050@75Hz */
-
 
369
	{ DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 187000, 1680, 1800,
-
 
370
		   1976, 2272, 0, 1050, 1053, 1059, 1099, 0,
-
 
371
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
372
	/* 1680x1050@85Hz */
-
 
373
	{ DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 214750, 1680, 1808,
-
 
374
		   1984, 2288, 0, 1050, 1053, 1059, 1105, 0,
-
 
375
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
376
	/* 1680x1050@120Hz RB */
-
 
377
	{ DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 245500, 1680, 1728,
-
 
378
		   1760, 1840, 0, 1050, 1053, 1059, 1112, 0,
-
 
379
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
380
	/* 1792x1344@60Hz */
-
 
381
	{ DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 204750, 1792, 1920,
-
 
382
		   2120, 2448, 0, 1344, 1345, 1348, 1394, 0,
-
 
383
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
384
	/* 1792x1344@75Hz */
-
 
385
	{ DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 261000, 1792, 1888,
-
 
386
		   2104, 2456, 0, 1344, 1345, 1348, 1417, 0,
-
 
387
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
388
	/* 1792x1344@120Hz RB */
-
 
389
	{ DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 333250, 1792, 1840,
-
 
390
		   1872, 1952, 0, 1344, 1347, 1351, 1423, 0,
-
 
391
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
392
	/* 1856x1392@60Hz */
-
 
393
	{ DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 218250, 1856, 1952,
-
 
394
		   2176, 2528, 0, 1392, 1393, 1396, 1439, 0,
-
 
395
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
396
	/* 1856x1392@75Hz */
-
 
397
	{ DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 288000, 1856, 1984,
-
 
398
		   2208, 2560, 0, 1392, 1395, 1399, 1500, 0,
-
 
399
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
400
	/* 1856x1392@120Hz RB */
-
 
401
	{ DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 356500, 1856, 1904,
-
 
402
		   1936, 2016, 0, 1392, 1395, 1399, 1474, 0,
-
 
403
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
404
	/* 1920x1200@60Hz RB */
-
 
405
	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 154000, 1920, 1968,
-
 
406
		   2000, 2080, 0, 1200, 1203, 1209, 1235, 0,
-
 
407
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
408
	/* 1920x1200@60Hz */
-
 
409
	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 193250, 1920, 2056,
-
 
410
		   2256, 2592, 0, 1200, 1203, 1209, 1245, 0,
-
 
411
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
412
	/* 1920x1200@75Hz */
-
 
413
	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 245250, 1920, 2056,
-
 
414
		   2264, 2608, 0, 1200, 1203, 1209, 1255, 0,
-
 
415
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
416
	/* 1920x1200@85Hz */
-
 
417
	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 281250, 1920, 2064,
-
 
418
		   2272, 2624, 0, 1200, 1203, 1209, 1262, 0,
-
 
419
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
420
	/* 1920x1200@120Hz RB */
-
 
421
	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 317000, 1920, 1968,
-
 
422
		   2000, 2080, 0, 1200, 1203, 1209, 1271, 0,
-
 
423
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
424
	/* 1920x1440@60Hz */
-
 
425
	{ DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 234000, 1920, 2048,
-
 
426
		   2256, 2600, 0, 1440, 1441, 1444, 1500, 0,
-
 
427
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
428
	/* 1920x1440@75Hz */
-
 
429
	{ DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2064,
-
 
430
		   2288, 2640, 0, 1440, 1441, 1444, 1500, 0,
-
 
431
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
432
	/* 1920x1440@120Hz RB */
-
 
433
	{ DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 380500, 1920, 1968,
-
 
434
		   2000, 2080, 0, 1440, 1443, 1447, 1525, 0,
-
 
435
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
436
	/* 2560x1600@60Hz RB */
-
 
437
	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 268500, 2560, 2608,
-
 
438
		   2640, 2720, 0, 1600, 1603, 1609, 1646, 0,
-
 
439
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
440
	/* 2560x1600@60Hz */
-
 
441
	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 348500, 2560, 2752,
-
 
442
		   3032, 3504, 0, 1600, 1603, 1609, 1658, 0,
-
 
443
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
444
	/* 2560x1600@75HZ */
-
 
445
	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 443250, 2560, 2768,
-
 
446
		   3048, 3536, 0, 1600, 1603, 1609, 1672, 0,
-
 
447
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
448
	/* 2560x1600@85HZ */
-
 
449
	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 505250, 2560, 2768,
-
 
450
		   3048, 3536, 0, 1600, 1603, 1609, 1682, 0,
-
 
451
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
452
	/* 2560x1600@120Hz RB */
-
 
453
	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 552750, 2560, 2608,
-
 
454
		   2640, 2720, 0, 1600, 1603, 1609, 1694, 0,
-
 
455
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
456
};
-
 
457
 
-
 
458
static const struct drm_display_mode edid_est_modes[] = {
-
 
459
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
-
 
460
		   968, 1056, 0, 600, 601, 605, 628, 0,
-
 
461
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@60Hz */
-
 
462
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824,
-
 
463
		   896, 1024, 0, 600, 601, 603,  625, 0,
-
 
464
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@56Hz */
-
 
465
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656,
-
 
466
		   720, 840, 0, 480, 481, 484, 500, 0,
-
 
467
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@75Hz */
-
 
468
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
-
 
469
		   704,  832, 0, 480, 489, 491, 520, 0,
-
 
470
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@72Hz */
-
 
471
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 30240, 640, 704,
-
 
472
		   768,  864, 0, 480, 483, 486, 525, 0,
-
 
473
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@67Hz */
-
 
474
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25200, 640, 656,
-
 
475
		   752, 800, 0, 480, 490, 492, 525, 0,
-
 
476
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@60Hz */
-
 
477
	{ DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 738,
-
 
478
		   846, 900, 0, 400, 421, 423,  449, 0,
-
 
479
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 720x400@88Hz */
-
 
480
	{ DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 28320, 720, 738,
-
 
481
		   846,  900, 0, 400, 412, 414, 449, 0,
-
 
482
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 720x400@70Hz */
-
 
483
	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296,
-
 
484
		   1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
-
 
485
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */
-
 
486
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78800, 1024, 1040,
-
 
487
		   1136, 1312, 0,  768, 769, 772, 800, 0,
-
 
488
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1024x768@75Hz */
-
 
489
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048,
-
 
490
		   1184, 1328, 0,  768, 771, 777, 806, 0,
-
 
491
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@70Hz */
-
 
492
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
-
 
493
		   1184, 1344, 0,  768, 771, 777, 806, 0,
-
 
494
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@60Hz */
-
 
495
	{ DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER,44900, 1024, 1032,
-
 
496
		   1208, 1264, 0, 768, 768, 776, 817, 0,
-
 
497
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* 1024x768@43Hz */
-
 
498
	{ DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 57284, 832, 864,
-
 
499
		   928, 1152, 0, 624, 625, 628, 667, 0,
-
 
500
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 832x624@75Hz */
-
 
501
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816,
-
 
502
		   896, 1056, 0, 600, 601, 604,  625, 0,
-
 
503
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@75Hz */
-
 
504
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856,
-
 
505
		   976, 1040, 0, 600, 637, 643, 666, 0,
-
 
506
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@72Hz */
-
 
507
	{ DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216,
-
 
508
		   1344, 1600, 0,  864, 865, 868, 900, 0,
-
 
509
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1152x864@75Hz */
-
 
510
};
-
 
511
 
-
 
512
struct minimode {
-
 
513
	short w;
-
 
514
	short h;
-
 
515
	short r;
-
 
516
	short rb;
-
 
517
};
-
 
518
 
-
 
519
static const struct minimode est3_modes[] = {
-
 
520
	/* byte 6 */
-
 
521
	{ 640, 350, 85, 0 },
-
 
522
	{ 640, 400, 85, 0 },
-
 
523
	{ 720, 400, 85, 0 },
-
 
524
	{ 640, 480, 85, 0 },
-
 
525
	{ 848, 480, 60, 0 },
-
 
526
	{ 800, 600, 85, 0 },
-
 
527
	{ 1024, 768, 85, 0 },
-
 
528
	{ 1152, 864, 75, 0 },
-
 
529
	/* byte 7 */
-
 
530
	{ 1280, 768, 60, 1 },
-
 
531
	{ 1280, 768, 60, 0 },
-
 
532
	{ 1280, 768, 75, 0 },
-
 
533
	{ 1280, 768, 85, 0 },
-
 
534
	{ 1280, 960, 60, 0 },
-
 
535
	{ 1280, 960, 85, 0 },
-
 
536
	{ 1280, 1024, 60, 0 },
-
 
537
	{ 1280, 1024, 85, 0 },
-
 
538
	/* byte 8 */
-
 
539
	{ 1360, 768, 60, 0 },
-
 
540
	{ 1440, 900, 60, 1 },
-
 
541
	{ 1440, 900, 60, 0 },
-
 
542
	{ 1440, 900, 75, 0 },
-
 
543
	{ 1440, 900, 85, 0 },
-
 
544
	{ 1400, 1050, 60, 1 },
-
 
545
	{ 1400, 1050, 60, 0 },
-
 
546
	{ 1400, 1050, 75, 0 },
-
 
547
	/* byte 9 */
-
 
548
	{ 1400, 1050, 85, 0 },
-
 
549
	{ 1680, 1050, 60, 1 },
-
 
550
	{ 1680, 1050, 60, 0 },
-
 
551
	{ 1680, 1050, 75, 0 },
-
 
552
	{ 1680, 1050, 85, 0 },
-
 
553
	{ 1600, 1200, 60, 0 },
-
 
554
	{ 1600, 1200, 65, 0 },
-
 
555
	{ 1600, 1200, 70, 0 },
-
 
556
	/* byte 10 */
-
 
557
	{ 1600, 1200, 75, 0 },
-
 
558
	{ 1600, 1200, 85, 0 },
-
 
559
	{ 1792, 1344, 60, 0 },
-
 
560
	{ 1792, 1344, 85, 0 },
-
 
561
	{ 1856, 1392, 60, 0 },
-
 
562
	{ 1856, 1392, 75, 0 },
-
 
563
	{ 1920, 1200, 60, 1 },
-
 
564
	{ 1920, 1200, 60, 0 },
-
 
565
	/* byte 11 */
-
 
566
	{ 1920, 1200, 75, 0 },
-
 
567
	{ 1920, 1200, 85, 0 },
-
 
568
	{ 1920, 1440, 60, 0 },
-
 
569
	{ 1920, 1440, 75, 0 },
-
 
570
};
-
 
571
 
-
 
572
static const struct minimode extra_modes[] = {
-
 
573
	{ 1024, 576,  60, 0 },
-
 
574
	{ 1366, 768,  60, 0 },
-
 
575
	{ 1600, 900,  60, 0 },
-
 
576
	{ 1680, 945,  60, 0 },
-
 
577
	{ 1920, 1080, 60, 0 },
-
 
578
	{ 2048, 1152, 60, 0 },
-
 
579
	{ 2048, 1536, 60, 0 },
-
 
580
};
-
 
581
 
-
 
582
/*
-
 
583
 * Probably taken from CEA-861 spec.
-
 
584
 * This table is converted from xorg's hw/xfree86/modes/xf86EdidModes.c.
-
 
585
 */
-
 
586
static const struct drm_display_mode edid_cea_modes[] = {
-
 
587
	/* 1 - 640x480@60Hz */
-
 
588
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
-
 
589
		   752, 800, 0, 480, 490, 492, 525, 0,
-
 
590
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
591
	/* 2 - 720x480@60Hz */
-
 
592
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
-
 
593
		   798, 858, 0, 480, 489, 495, 525, 0,
-
 
594
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
595
	/* 3 - 720x480@60Hz */
-
 
596
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
-
 
597
		   798, 858, 0, 480, 489, 495, 525, 0,
-
 
598
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
599
	/* 4 - 1280x720@60Hz */
-
 
600
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
-
 
601
		   1430, 1650, 0, 720, 725, 730, 750, 0,
-
 
602
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
603
	/* 5 - 1920x1080i@60Hz */
-
 
604
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
-
 
605
		   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
-
 
606
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
-
 
607
			DRM_MODE_FLAG_INTERLACE) },
-
 
608
	/* 6 - 1440x480i@60Hz */
-
 
609
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
-
 
610
		   1602, 1716, 0, 480, 488, 494, 525, 0,
-
 
611
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
612
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) },
-
 
613
	/* 7 - 1440x480i@60Hz */
-
 
614
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
-
 
615
		   1602, 1716, 0, 480, 488, 494, 525, 0,
-
 
616
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
617
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) },
-
 
618
	/* 8 - 1440x240@60Hz */
-
 
619
	{ DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
-
 
620
		   1602, 1716, 0, 240, 244, 247, 262, 0,
-
 
621
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
622
			DRM_MODE_FLAG_DBLCLK) },
-
 
623
	/* 9 - 1440x240@60Hz */
-
 
624
	{ DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
-
 
625
		   1602, 1716, 0, 240, 244, 247, 262, 0,
-
 
626
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
627
			DRM_MODE_FLAG_DBLCLK) },
-
 
628
	/* 10 - 2880x480i@60Hz */
-
 
629
	{ DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
-
 
630
		   3204, 3432, 0, 480, 488, 494, 525, 0,
-
 
631
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
632
			DRM_MODE_FLAG_INTERLACE) },
-
 
633
	/* 11 - 2880x480i@60Hz */
-
 
634
	{ DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
-
 
635
		   3204, 3432, 0, 480, 488, 494, 525, 0,
-
 
636
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
637
			DRM_MODE_FLAG_INTERLACE) },
-
 
638
	/* 12 - 2880x240@60Hz */
-
 
639
	{ DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
-
 
640
		   3204, 3432, 0, 240, 244, 247, 262, 0,
-
 
641
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
642
	/* 13 - 2880x240@60Hz */
-
 
643
	{ DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
-
 
644
		   3204, 3432, 0, 240, 244, 247, 262, 0,
-
 
645
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
646
	/* 14 - 1440x480@60Hz */
-
 
647
	{ DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
-
 
648
		   1596, 1716, 0, 480, 489, 495, 525, 0,
-
 
649
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
650
	/* 15 - 1440x480@60Hz */
-
 
651
	{ DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
-
 
652
		   1596, 1716, 0, 480, 489, 495, 525, 0,
-
 
653
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
654
	/* 16 - 1920x1080@60Hz */
-
 
655
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
-
 
656
		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
-
 
657
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
658
	/* 17 - 720x576@50Hz */
-
 
659
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
-
 
660
		   796, 864, 0, 576, 581, 586, 625, 0,
-
 
661
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
662
	/* 18 - 720x576@50Hz */
-
 
663
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
-
 
664
		   796, 864, 0, 576, 581, 586, 625, 0,
-
 
665
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
666
	/* 19 - 1280x720@50Hz */
-
 
667
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
-
 
668
		   1760, 1980, 0, 720, 725, 730, 750, 0,
-
 
669
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
670
	/* 20 - 1920x1080i@50Hz */
-
 
671
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
-
 
672
		   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
-
 
673
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
-
 
674
			DRM_MODE_FLAG_INTERLACE) },
-
 
675
	/* 21 - 1440x576i@50Hz */
-
 
676
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
-
 
677
		   1590, 1728, 0, 576, 580, 586, 625, 0,
-
 
678
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
679
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) },
-
 
680
	/* 22 - 1440x576i@50Hz */
-
 
681
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
-
 
682
		   1590, 1728, 0, 576, 580, 586, 625, 0,
-
 
683
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
684
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) },
-
 
685
	/* 23 - 1440x288@50Hz */
-
 
686
	{ DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
-
 
687
		   1590, 1728, 0, 288, 290, 293, 312, 0,
-
 
688
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
689
			DRM_MODE_FLAG_DBLCLK) },
-
 
690
	/* 24 - 1440x288@50Hz */
-
 
691
	{ DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
-
 
692
		   1590, 1728, 0, 288, 290, 293, 312, 0,
-
 
693
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
694
			DRM_MODE_FLAG_DBLCLK) },
-
 
695
	/* 25 - 2880x576i@50Hz */
-
 
696
	{ DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
-
 
697
		   3180, 3456, 0, 576, 580, 586, 625, 0,
-
 
698
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
699
			DRM_MODE_FLAG_INTERLACE) },
-
 
700
	/* 26 - 2880x576i@50Hz */
-
 
701
	{ DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
-
 
702
		   3180, 3456, 0, 576, 580, 586, 625, 0,
-
 
703
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
704
			DRM_MODE_FLAG_INTERLACE) },
-
 
705
	/* 27 - 2880x288@50Hz */
-
 
706
	{ DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
-
 
707
		   3180, 3456, 0, 288, 290, 293, 312, 0,
-
 
708
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
709
	/* 28 - 2880x288@50Hz */
-
 
710
	{ DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
-
 
711
		   3180, 3456, 0, 288, 290, 293, 312, 0,
-
 
712
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
713
	/* 29 - 1440x576@50Hz */
-
 
714
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
-
 
715
		   1592, 1728, 0, 576, 581, 586, 625, 0,
-
 
716
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
717
	/* 30 - 1440x576@50Hz */
-
 
718
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
-
 
719
		   1592, 1728, 0, 576, 581, 586, 625, 0,
-
 
720
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
721
	/* 31 - 1920x1080@50Hz */
-
 
722
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
-
 
723
		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
-
 
724
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
725
	/* 32 - 1920x1080@24Hz */
-
 
726
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
-
 
727
		   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
-
 
728
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
729
	/* 33 - 1920x1080@25Hz */
-
 
730
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
-
 
731
		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
-
 
732
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
733
	/* 34 - 1920x1080@30Hz */
-
 
734
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
-
 
735
		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
-
 
736
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
737
	/* 35 - 2880x480@60Hz */
-
 
738
	{ DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
-
 
739
		   3192, 3432, 0, 480, 489, 495, 525, 0,
-
 
740
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
741
	/* 36 - 2880x480@60Hz */
-
 
742
	{ DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
-
 
743
		   3192, 3432, 0, 480, 489, 495, 525, 0,
-
 
744
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
745
	/* 37 - 2880x576@50Hz */
-
 
746
	{ DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
-
 
747
		   3184, 3456, 0, 576, 581, 586, 625, 0,
-
 
748
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
749
	/* 38 - 2880x576@50Hz */
-
 
750
	{ DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
-
 
751
		   3184, 3456, 0, 576, 581, 586, 625, 0,
-
 
752
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
753
	/* 39 - 1920x1080i@50Hz */
-
 
754
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952,
-
 
755
		   2120, 2304, 0, 1080, 1126, 1136, 1250, 0,
-
 
756
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
757
			DRM_MODE_FLAG_INTERLACE) },
-
 
758
	/* 40 - 1920x1080i@100Hz */
-
 
759
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
-
 
760
		   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
-
 
761
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
-
 
762
			DRM_MODE_FLAG_INTERLACE) },
-
 
763
	/* 41 - 1280x720@100Hz */
-
 
764
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
-
 
765
		   1760, 1980, 0, 720, 725, 730, 750, 0,
-
 
766
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
767
	/* 42 - 720x576@100Hz */
-
 
768
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
-
 
769
		   796, 864, 0, 576, 581, 586, 625, 0,
-
 
770
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
771
	/* 43 - 720x576@100Hz */
-
 
772
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
-
 
773
		   796, 864, 0, 576, 581, 586, 625, 0,
-
 
774
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
775
	/* 44 - 1440x576i@100Hz */
-
 
776
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
-
 
777
		   1590, 1728, 0, 576, 580, 586, 625, 0,
-
 
778
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
779
			DRM_MODE_FLAG_DBLCLK) },
-
 
780
	/* 45 - 1440x576i@100Hz */
-
 
781
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
-
 
782
		   1590, 1728, 0, 576, 580, 586, 625, 0,
-
 
783
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
784
			DRM_MODE_FLAG_DBLCLK) },
-
 
785
	/* 46 - 1920x1080i@120Hz */
-
 
786
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
-
 
787
		   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
-
 
788
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
-
 
789
			DRM_MODE_FLAG_INTERLACE) },
-
 
790
	/* 47 - 1280x720@120Hz */
-
 
791
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
-
 
792
		   1430, 1650, 0, 720, 725, 730, 750, 0,
-
 
793
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
794
	/* 48 - 720x480@120Hz */
-
 
795
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
-
 
796
		   798, 858, 0, 480, 489, 495, 525, 0,
-
 
797
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
798
	/* 49 - 720x480@120Hz */
-
 
799
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
-
 
800
		   798, 858, 0, 480, 489, 495, 525, 0,
-
 
801
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
802
	/* 50 - 1440x480i@120Hz */
-
 
803
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478,
-
 
804
		   1602, 1716, 0, 480, 488, 494, 525, 0,
-
 
805
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
806
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) },
-
 
807
	/* 51 - 1440x480i@120Hz */
-
 
808
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478,
-
 
809
		   1602, 1716, 0, 480, 488, 494, 525, 0,
-
 
810
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
811
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) },
-
 
812
	/* 52 - 720x576@200Hz */
-
 
813
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
-
 
814
		   796, 864, 0, 576, 581, 586, 625, 0,
-
 
815
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
816
	/* 53 - 720x576@200Hz */
-
 
817
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
-
 
818
		   796, 864, 0, 576, 581, 586, 625, 0,
-
 
819
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
820
	/* 54 - 1440x576i@200Hz */
-
 
821
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464,
-
 
822
		   1590, 1728, 0, 576, 580, 586, 625, 0,
-
 
823
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
824
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) },
-
 
825
	/* 55 - 1440x576i@200Hz */
-
 
826
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464,
-
 
827
		   1590, 1728, 0, 576, 580, 586, 625, 0,
-
 
828
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
829
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) },
-
 
830
	/* 56 - 720x480@240Hz */
-
 
831
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
-
 
832
		   798, 858, 0, 480, 489, 495, 525, 0,
-
 
833
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
834
	/* 57 - 720x480@240Hz */
-
 
835
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
-
 
836
		   798, 858, 0, 480, 489, 495, 525, 0,
-
 
837
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-
 
838
	/* 58 - 1440x480i@240 */
-
 
839
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478,
-
 
840
		   1602, 1716, 0, 480, 488, 494, 525, 0,
-
 
841
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
842
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) },
-
 
843
	/* 59 - 1440x480i@240 */
-
 
844
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478,
-
 
845
		   1602, 1716, 0, 480, 488, 494, 525, 0,
-
 
846
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-
 
847
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) },
-
 
848
	/* 60 - 1280x720@24Hz */
-
 
849
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
-
 
850
		   3080, 3300, 0, 720, 725, 730, 750, 0,
-
 
851
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
852
	/* 61 - 1280x720@25Hz */
-
 
853
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
-
 
854
		   3740, 3960, 0, 720, 725, 730, 750, 0,
-
 
855
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
856
	/* 62 - 1280x720@30Hz */
-
 
857
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
-
 
858
		   3080, 3300, 0, 720, 725, 730, 750, 0,
-
 
859
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
860
	/* 63 - 1920x1080@120Hz */
-
 
861
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
-
 
862
		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
-
 
863
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
-
 
864
	/* 64 - 1920x1080@100Hz */
-
 
865
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
-
 
866
		   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
-
 
867
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
131
};
868
};
Line 132... Line 869...
132
 
869
 
133
/*** DDC fetch and block validation ***/
870
/*** DDC fetch and block validation ***/
134
 
871
 
Line 151... Line 888...
151
	return score;
888
	return score;
152
}
889
}
153
EXPORT_SYMBOL(drm_edid_header_is_valid);
890
EXPORT_SYMBOL(drm_edid_header_is_valid);
Line 154... Line 891...
154
 
891
 
155
static int edid_fixup __read_mostly = 6;
892
static int edid_fixup __read_mostly = 6;
156
//module_param_named(edid_fixup, edid_fixup, int, 0400);
893
module_param_named(edid_fixup, edid_fixup, int, 0400);
157
//MODULE_PARM_DESC(edid_fixup,
894
MODULE_PARM_DESC(edid_fixup,
Line 158... Line 895...
158
//        "Minimum number of valid EDID header bytes (0-8, default 6)");
895
		 "Minimum number of valid EDID header bytes (0-8, default 6)");
159
 
896
 
160
/*
897
/*
161
 * Sanity check the EDID block (base or extension).  Return 0 if the block
898
 * Sanity check the EDID block (base or extension).  Return 0 if the block
Line 212... Line 949...
212
	return 1;
949
	return 1;
Line 213... Line 950...
213
 
950
 
214
bad:
951
bad:
215
	if (raw_edid && print_bad_edid) {
952
	if (raw_edid && print_bad_edid) {
216
		printk(KERN_ERR "Raw EDID:\n");
953
		printk(KERN_ERR "Raw EDID:\n");
-
 
954
		print_hex_dump(KERN_ERR, " \t", DUMP_PREFIX_NONE, 16, 1,
217
//		print_hex_dump_bytes(KERN_ERR, DUMP_PREFIX_NONE, raw_edid, EDID_LENGTH);
955
			       raw_edid, EDID_LENGTH, false);
218
	}
956
	}
219
	return 0;
957
	return 0;
220
}
958
}
Line 304... Line 1042...
304
	return ret == xfers ? 0 : -1;
1042
	return ret == xfers ? 0 : -1;
305
}
1043
}
Line 306... Line 1044...
306
 
1044
 
307
static bool drm_edid_is_zero(u8 *in_edid, int length)
1045
static bool drm_edid_is_zero(u8 *in_edid, int length)
308
{
-
 
309
	int i;
-
 
310
	u32 *raw_edid = (u32 *)in_edid;
-
 
311
 
-
 
312
	for (i = 0; i < length / 4; i++)
1046
{
313
		if (*(raw_edid + i) != 0)
1047
	if (memchr_inv(in_edid, 0, length))
-
 
1048
		return false;
314
			return false;
1049
 
315
	return true;
1050
	return true;
Line 316... Line 1051...
316
}
1051
}
317
 
1052
 
318
static u8 *
1053
static u8 *
319
drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
-
 
320
{
1054
drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
321
	size_t alloc_size;
1055
{
322
	int i, j = 0, valid_extensions = 0;
1056
	int i, j = 0, valid_extensions = 0;
Line 323... Line 1057...
323
	u8 *block, *new;
1057
	u8 *block, *new;
Line 342... Line 1076...
342
 
1076
 
343
	/* if there's no extensions, we're done */
1077
	/* if there's no extensions, we're done */
344
	if (block[0x7e] == 0)
1078
	if (block[0x7e] == 0)
Line 345... Line 1079...
345
		return block;
1079
		return block;
346
 
-
 
347
    alloc_size = (block[0x7e] + 1) * EDID_LENGTH ;
-
 
348
 
-
 
349
    new = kmalloc(alloc_size, GFP_KERNEL);
1080
 
350
 
1081
	new = krealloc(block, (block[0x7e] + 1) * EDID_LENGTH, GFP_KERNEL);
351
	if (!new)
-
 
352
		goto out;
-
 
353
 
-
 
354
    memcpy(new, block, EDID_LENGTH);
-
 
355
    kfree(block);
1082
	if (!new)
Line 356... Line 1083...
356
 
1083
		goto out;
357
	block = new;
1084
	block = new;
358
 
1085
 
Line 365... Line 1092...
365
			if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH, j, print_bad_edid)) {
1092
			if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH, j, print_bad_edid)) {
366
				valid_extensions++;
1093
				valid_extensions++;
367
				break;
1094
				break;
368
		}
1095
		}
369
		}
1096
		}
-
 
1097
 
370
		if (i == 4)
1098
		if (i == 4 && print_bad_edid) {
371
			dev_warn(connector->dev->dev,
1099
			dev_warn(connector->dev->dev,
372
			 "%s: Ignoring invalid EDID block %d.\n",
1100
			 "%s: Ignoring invalid EDID block %d.\n",
373
			 drm_get_connector_name(connector), j);
1101
			 drm_get_connector_name(connector), j);
-
 
1102
 
-
 
1103
			connector->bad_edid_counter++;
-
 
1104
		}
374
	}
1105
	}
Line 375... Line 1106...
375
 
1106
 
376
	if (valid_extensions != block[0x7e]) {
1107
	if (valid_extensions != block[0x7e]) {
377
		block[EDID_LENGTH-1] += block[0x7e] - valid_extensions;
1108
		block[EDID_LENGTH-1] += block[0x7e] - valid_extensions;
378
		block[0x7e] = valid_extensions;
1109
		block[0x7e] = valid_extensions;
379
        new = kmalloc((valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL);
1110
		new = krealloc(block, (valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL);
380
        if (!new)
1111
        if (!new)
381
			goto out;
-
 
382
        memcpy(new, block, alloc_size);
-
 
383
        kfree(block);
1112
			goto out;
384
		block = new;
1113
		block = new;
Line 385... Line 1114...
385
	}
1114
	}
Line 551... Line 1280...
551
					   int hsize, int vsize, int fresh,
1280
					   int hsize, int vsize, int fresh,
552
					   bool rb)
1281
					   bool rb)
553
{
1282
{
554
	int i;
1283
	int i;
Line 555... Line 1284...
555
 
1284
 
556
	for (i = 0; i < drm_num_dmt_modes; i++) {
1285
	for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
557
		const struct drm_display_mode *ptr = &drm_dmt_modes[i];
1286
		const struct drm_display_mode *ptr = &drm_dmt_modes[i];
558
		if (hsize != ptr->hdisplay)
1287
		if (hsize != ptr->hdisplay)
559
			continue;
1288
			continue;
560
		if (vsize != ptr->vdisplay)
1289
		if (vsize != ptr->vdisplay)
Line 903... Line 1632...
903
	unsigned vactive = (pt->vactive_vblank_hi & 0xf0) << 4 | pt->vactive_lo;
1632
	unsigned vactive = (pt->vactive_vblank_hi & 0xf0) << 4 | pt->vactive_lo;
904
	unsigned hblank = (pt->hactive_hblank_hi & 0xf) << 8 | pt->hblank_lo;
1633
	unsigned hblank = (pt->hactive_hblank_hi & 0xf) << 8 | pt->hblank_lo;
905
	unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo;
1634
	unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo;
906
	unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | pt->hsync_offset_lo;
1635
	unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | pt->hsync_offset_lo;
907
	unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | pt->hsync_pulse_width_lo;
1636
	unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | pt->hsync_pulse_width_lo;
908
	unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) >> 2 | pt->vsync_offset_pulse_width_lo >> 4;
1637
	unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) << 2 | pt->vsync_offset_pulse_width_lo >> 4;
909
	unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | (pt->vsync_offset_pulse_width_lo & 0xf);
1638
	unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | (pt->vsync_offset_pulse_width_lo & 0xf);
Line 910... Line 1639...
910
 
1639
 
911
	/* ignore tiny modes */
1640
	/* ignore tiny modes */
912
	if (hactive < 64 || vactive < 64)
1641
	if (hactive < 64 || vactive < 64)
Line 984... Line 1713...
984
		mode->width_mm = edid->width_cm * 10;
1713
		mode->width_mm = edid->width_cm * 10;
985
		mode->height_mm = edid->height_cm * 10;
1714
		mode->height_mm = edid->height_cm * 10;
986
	}
1715
	}
Line 987... Line 1716...
987
 
1716
 
-
 
1717
	mode->type = DRM_MODE_TYPE_DRIVER;
988
	mode->type = DRM_MODE_TYPE_DRIVER;
1718
	mode->vrefresh = drm_mode_vrefresh(mode);
Line 989... Line 1719...
989
	drm_mode_set_name(mode);
1719
	drm_mode_set_name(mode);
990
 
1720
 
Line 1092... Line 1822...
1092
{
1822
{
1093
	int i, modes = 0;
1823
	int i, modes = 0;
1094
	struct drm_display_mode *newmode;
1824
	struct drm_display_mode *newmode;
1095
	struct drm_device *dev = connector->dev;
1825
	struct drm_device *dev = connector->dev;
Line 1096... Line 1826...
1096
 
1826
 
1097
	for (i = 0; i < drm_num_dmt_modes; i++) {
1827
	for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
1098
		if (mode_in_range(drm_dmt_modes + i, edid, timing) &&
1828
		if (mode_in_range(drm_dmt_modes + i, edid, timing) &&
1099
		    valid_inferred_mode(connector, drm_dmt_modes + i)) {
1829
		    valid_inferred_mode(connector, drm_dmt_modes + i)) {
1100
			newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]);
1830
			newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]);
1101
			if (newmode) {
1831
			if (newmode) {
Line 1127... Line 1857...
1127
{
1857
{
1128
	int i, modes = 0;
1858
	int i, modes = 0;
1129
	struct drm_display_mode *newmode;
1859
	struct drm_display_mode *newmode;
1130
	struct drm_device *dev = connector->dev;
1860
	struct drm_device *dev = connector->dev;
Line 1131... Line 1861...
1131
 
1861
 
1132
	for (i = 0; i < num_extra_modes; i++) {
1862
	for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
1133
		const struct minimode *m = &extra_modes[i];
1863
		const struct minimode *m = &extra_modes[i];
1134
		newmode = drm_gtf_mode(dev, m->w, m->h, m->r, 0, 0);
1864
		newmode = drm_gtf_mode(dev, m->w, m->h, m->r, 0, 0);
1135
		if (!newmode)
1865
		if (!newmode)
Line 1156... Line 1886...
1156
	int i, modes = 0;
1886
	int i, modes = 0;
1157
	struct drm_display_mode *newmode;
1887
	struct drm_display_mode *newmode;
1158
	struct drm_device *dev = connector->dev;
1888
	struct drm_device *dev = connector->dev;
1159
	bool rb = drm_monitor_supports_rb(edid);
1889
	bool rb = drm_monitor_supports_rb(edid);
Line 1160... Line 1890...
1160
 
1890
 
1161
	for (i = 0; i < num_extra_modes; i++) {
1891
	for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
1162
		const struct minimode *m = &extra_modes[i];
1892
		const struct minimode *m = &extra_modes[i];
1163
		newmode = drm_cvt_mode(dev, m->w, m->h, m->r, rb, 0, 0);
1893
		newmode = drm_cvt_mode(dev, m->w, m->h, m->r, rb, 0, 0);
1164
		if (!newmode)
1894
		if (!newmode)
Line 1493... Line 2223...
1493
#define HDMI_IDENTIFIER 0x000C03
2223
#define HDMI_IDENTIFIER 0x000C03
1494
#define AUDIO_BLOCK	0x01
2224
#define AUDIO_BLOCK	0x01
1495
#define VIDEO_BLOCK     0x02
2225
#define VIDEO_BLOCK     0x02
1496
#define VENDOR_BLOCK    0x03
2226
#define VENDOR_BLOCK    0x03
1497
#define SPEAKER_BLOCK	0x04
2227
#define SPEAKER_BLOCK	0x04
-
 
2228
#define VIDEO_CAPABILITY_BLOCK	0x07
1498
#define EDID_BASIC_AUDIO	(1 << 6)
2229
#define EDID_BASIC_AUDIO	(1 << 6)
1499
#define EDID_CEA_YCRCB444	(1 << 5)
2230
#define EDID_CEA_YCRCB444	(1 << 5)
1500
#define EDID_CEA_YCRCB422	(1 << 4)
2231
#define EDID_CEA_YCRCB422	(1 << 4)
-
 
2232
#define EDID_CEA_VCDB_QS	(1 << 6)
Line 1501... Line 2233...
1501
 
2233
 
1502
/**
2234
/**
1503
 * Search EDID for CEA extension block.
2235
 * Search EDID for CEA extension block.
1504
 */
2236
 */
Line 1523... Line 2255...
1523
 
2255
 
1524
	return edid_ext;
2256
	return edid_ext;
1525
}
2257
}
Line 1526... Line 2258...
1526
EXPORT_SYMBOL(drm_find_cea_extension);
2258
EXPORT_SYMBOL(drm_find_cea_extension);
1527
 
2259
 
-
 
2260
/**
-
 
2261
 * drm_match_cea_mode - look for a CEA mode matching given mode
1528
/*
2262
 * @to_match: display mode
-
 
2263
 *
1529
 * Looks for a CEA mode matching given drm_display_mode.
2264
 * Returns the CEA Video ID (VIC) of the mode or 0 if it isn't a CEA-861
1530
 * Returns its CEA Video ID code, or 0 if not found.
2265
 * mode.
1531
 */
2266
 */
1532
u8 drm_match_cea_mode(struct drm_display_mode *to_match)
2267
u8 drm_match_cea_mode(const struct drm_display_mode *to_match)
1533
{
2268
{
Line 1534... Line 2269...
1534
	struct drm_display_mode *cea_mode;
2269
	struct drm_display_mode *cea_mode;
1535
	u8 mode;
2270
	u8 mode;
Line 1536... Line 2271...
1536
 
2271
 
1537
	for (mode = 0; mode < drm_num_cea_modes; mode++) {
2272
	for (mode = 0; mode < ARRAY_SIZE(edid_cea_modes); mode++) {
1538
		cea_mode = (struct drm_display_mode *)&edid_cea_modes[mode];
2273
		cea_mode = (struct drm_display_mode *)&edid_cea_modes[mode];
Line 1552... Line 2287...
1552
	u8 * mode, cea_mode;
2287
	u8 * mode, cea_mode;
1553
	int modes = 0;
2288
	int modes = 0;
Line 1554... Line 2289...
1554
 
2289
 
1555
	for (mode = db; mode < db + len; mode++) {
2290
	for (mode = db; mode < db + len; mode++) {
1556
		cea_mode = (*mode & 127) - 1; /* CEA modes are numbered 1..127 */
2291
		cea_mode = (*mode & 127) - 1; /* CEA modes are numbered 1..127 */
1557
		if (cea_mode < drm_num_cea_modes) {
2292
		if (cea_mode < ARRAY_SIZE(edid_cea_modes)) {
1558
			struct drm_display_mode *newmode;
2293
			struct drm_display_mode *newmode;
1559
			newmode = drm_mode_duplicate(dev,
2294
			newmode = drm_mode_duplicate(dev,
1560
						     &edid_cea_modes[cea_mode]);
2295
						     &edid_cea_modes[cea_mode]);
1561
			if (newmode) {
2296
			if (newmode) {
Line 1912... Line 2647...
1912
	return has_audio;
2647
	return has_audio;
1913
}
2648
}
1914
EXPORT_SYMBOL(drm_detect_monitor_audio);
2649
EXPORT_SYMBOL(drm_detect_monitor_audio);
Line 1915... Line 2650...
1915
 
2650
 
-
 
2651
/**
-
 
2652
 * drm_rgb_quant_range_selectable - is RGB quantization range selectable?
-
 
2653
 *
-
 
2654
 * Check whether the monitor reports the RGB quantization range selection
-
 
2655
 * as supported. The AVI infoframe can then be used to inform the monitor
-
 
2656
 * which quantization range (full or limited) is used.
-
 
2657
 */
-
 
2658
bool drm_rgb_quant_range_selectable(struct edid *edid)
-
 
2659
{
-
 
2660
	u8 *edid_ext;
-
 
2661
	int i, start, end;
-
 
2662
 
-
 
2663
	edid_ext = drm_find_cea_extension(edid);
-
 
2664
	if (!edid_ext)
-
 
2665
		return false;
-
 
2666
 
-
 
2667
	if (cea_db_offsets(edid_ext, &start, &end))
-
 
2668
		return false;
-
 
2669
 
-
 
2670
	for_each_cea_db(edid_ext, i, start, end) {
-
 
2671
		if (cea_db_tag(&edid_ext[i]) == VIDEO_CAPABILITY_BLOCK &&
-
 
2672
		    cea_db_payload_len(&edid_ext[i]) == 2) {
-
 
2673
			DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", edid_ext[i + 2]);
-
 
2674
			return edid_ext[i + 2] & EDID_CEA_VCDB_QS;
-
 
2675
		}
-
 
2676
	}
-
 
2677
 
-
 
2678
	return false;
-
 
2679
}
-
 
2680
EXPORT_SYMBOL(drm_rgb_quant_range_selectable);
-
 
2681
 
1916
/**
2682
/**
1917
 * drm_add_display_info - pull display info out if present
2683
 * drm_add_display_info - pull display info out if present
1918
 * @edid: EDID data
2684
 * @edid: EDID data
1919
 * @info: display info (attached to connector)
2685
 * @info: display info (attached to connector)
1920
 *
2686
 *
Line 2030... Line 2796...
2030
	 */
2796
	 */
2031
	num_modes += add_detailed_modes(connector, edid, quirks);
2797
	num_modes += add_detailed_modes(connector, edid, quirks);
2032
	num_modes += add_cvt_modes(connector, edid);
2798
	num_modes += add_cvt_modes(connector, edid);
2033
	num_modes += add_standard_modes(connector, edid);
2799
	num_modes += add_standard_modes(connector, edid);
2034
	num_modes += add_established_modes(connector, edid);
2800
	num_modes += add_established_modes(connector, edid);
-
 
2801
	if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
2035
	num_modes += add_inferred_modes(connector, edid);
2802
	num_modes += add_inferred_modes(connector, edid);
2036
	num_modes += add_cea_modes(connector, edid);
2803
	num_modes += add_cea_modes(connector, edid);
Line 2037... Line 2804...
2037
 
2804
 
2038
	if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
2805
	if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
Line 2091... Line 2858...
2091
	return num_modes;
2858
	return num_modes;
2092
}
2859
}
2093
EXPORT_SYMBOL(drm_add_modes_noedid);
2860
EXPORT_SYMBOL(drm_add_modes_noedid);
Line 2094... Line 2861...
2094
 
2861
 
-
 
2862
/**
2095
/**
2863
 * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with
-
 
2864
 *                                              data from a DRM display mode
2096
 * drm_mode_cea_vic - return the CEA-861 VIC of a given mode
2865
 * @frame: HDMI AVI infoframe
2097
 * @mode: mode
2866
 * @mode: DRM display mode
2098
 *
-
 
2099
 * RETURNS:
2867
 *
2100
 * The VIC number, 0 in case it's not a CEA-861 mode.
2868
 * Returns 0 on success or a negative error code on failure.
-
 
2869
 */
-
 
2870
int
2101
 */
2871
drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
2102
uint8_t drm_mode_cea_vic(const struct drm_display_mode *mode)
2872
					 const struct drm_display_mode *mode)
2103
{
2873
{
-
 
2874
	int err;
-
 
2875
 
-
 
2876
	if (!frame || !mode)
-
 
2877
		return -EINVAL;
-
 
2878
 
-
 
2879
	err = hdmi_avi_infoframe_init(frame);
-
 
2880
	if (err < 0)
-
 
2881
		return err;
-
 
2882
 
-
 
2883
	frame->video_code = drm_match_cea_mode(mode);
-
 
2884
	if (!frame->video_code)
Line 2104... Line 2885...
2104
	uint8_t i;
2885
		return 0;
2105
 
2886
 
2106
	for (i = 0; i < drm_num_cea_modes; i++)
-
 
Line 2107... Line 2887...
2107
		if (drm_mode_equal(mode, &edid_cea_modes[i]))
2887
	frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
2108
			return i + 1;
2888
	frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
2109
 
2889