drm/edid: Add 3840x2160@60hz modes
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / drm_edid.c
1 /*
2  * Copyright (c) 2006 Luc Verhaegen (quirks list)
3  * Copyright (c) 2007-2008 Intel Corporation
4  *   Jesse Barnes <jesse.barnes@intel.com>
5  * Copyright 2010 Red Hat, Inc.
6  *
7  * DDC probing routines (drm_ddc_read & drm_do_probe_ddc_edid) originally from
8  * FB layer.
9  *   Copyright (C) 2006 Dennis Munsie <dmunsie@cecropia.com>
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  */
30 #include <linux/kernel.h>
31 #include <linux/slab.h>
32 #include <linux/hdmi.h>
33 #include <linux/i2c.h>
34 #include <linux/module.h>
35 #include <drm/drmP.h>
36 #include <drm/drm_edid.h>
37 #include <drm/drm_displayid.h>
38
39 #define version_greater(edid, maj, min) \
40         (((edid)->version > (maj)) || \
41          ((edid)->version == (maj) && (edid)->revision > (min)))
42
43 #define EDID_EST_TIMINGS 16
44 #define EDID_STD_TIMINGS 8
45 #define EDID_DETAILED_TIMINGS 4
46
47 /*
48  * EDID blocks out in the wild have a variety of bugs, try to collect
49  * them here (note that userspace may work around broken monitors first,
50  * but fixes should make their way here so that the kernel "just works"
51  * on as many displays as possible).
52  */
53
54 /* First detailed mode wrong, use largest 60Hz mode */
55 #define EDID_QUIRK_PREFER_LARGE_60              (1 << 0)
56 /* Reported 135MHz pixel clock is too high, needs adjustment */
57 #define EDID_QUIRK_135_CLOCK_TOO_HIGH           (1 << 1)
58 /* Prefer the largest mode at 75 Hz */
59 #define EDID_QUIRK_PREFER_LARGE_75              (1 << 2)
60 /* Detail timing is in cm not mm */
61 #define EDID_QUIRK_DETAILED_IN_CM               (1 << 3)
62 /* Detailed timing descriptors have bogus size values, so just take the
63  * maximum size and use that.
64  */
65 #define EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE    (1 << 4)
66 /* Monitor forgot to set the first detailed is preferred bit. */
67 #define EDID_QUIRK_FIRST_DETAILED_PREFERRED     (1 << 5)
68 /* use +hsync +vsync for detailed mode */
69 #define EDID_QUIRK_DETAILED_SYNC_PP             (1 << 6)
70 /* Force reduced-blanking timings for detailed modes */
71 #define EDID_QUIRK_FORCE_REDUCED_BLANKING       (1 << 7)
72 /* Force 8bpc */
73 #define EDID_QUIRK_FORCE_8BPC                   (1 << 8)
74 /* Force 12bpc */
75 #define EDID_QUIRK_FORCE_12BPC                  (1 << 9)
76 /* Force 6bpc */
77 #define EDID_QUIRK_FORCE_6BPC                   (1 << 10)
78
79 struct detailed_mode_closure {
80         struct drm_connector *connector;
81         struct edid *edid;
82         bool preferred;
83         u32 quirks;
84         int modes;
85 };
86
87 #define LEVEL_DMT       0
88 #define LEVEL_GTF       1
89 #define LEVEL_GTF2      2
90 #define LEVEL_CVT       3
91
92 static struct edid_quirk {
93         char vendor[4];
94         int product_id;
95         u32 quirks;
96 } edid_quirk_list[] = {
97         /* Acer AL1706 */
98         { "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 },
99         /* Acer F51 */
100         { "API", 0x7602, EDID_QUIRK_PREFER_LARGE_60 },
101         /* Unknown Acer */
102         { "ACR", 2423, EDID_QUIRK_FIRST_DETAILED_PREFERRED },
103
104         /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */
105         { "AEO", 0, EDID_QUIRK_FORCE_6BPC },
106
107         /* Belinea 10 15 55 */
108         { "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 },
109         { "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 },
110
111         /* Envision Peripherals, Inc. EN-7100e */
112         { "EPI", 59264, EDID_QUIRK_135_CLOCK_TOO_HIGH },
113         /* Envision EN2028 */
114         { "EPI", 8232, EDID_QUIRK_PREFER_LARGE_60 },
115
116         /* Funai Electronics PM36B */
117         { "FCM", 13600, EDID_QUIRK_PREFER_LARGE_75 |
118           EDID_QUIRK_DETAILED_IN_CM },
119
120         /* LG Philips LCD LP154W01-A5 */
121         { "LPL", 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE },
122         { "LPL", 0x2a00, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE },
123
124         /* Philips 107p5 CRT */
125         { "PHL", 57364, EDID_QUIRK_FIRST_DETAILED_PREFERRED },
126
127         /* Proview AY765C */
128         { "PTS", 765, EDID_QUIRK_FIRST_DETAILED_PREFERRED },
129
130         /* Samsung SyncMaster 205BW.  Note: irony */
131         { "SAM", 541, EDID_QUIRK_DETAILED_SYNC_PP },
132         /* Samsung SyncMaster 22[5-6]BW */
133         { "SAM", 596, EDID_QUIRK_PREFER_LARGE_60 },
134         { "SAM", 638, EDID_QUIRK_PREFER_LARGE_60 },
135
136         /* Sony PVM-2541A does up to 12 bpc, but only reports max 8 bpc */
137         { "SNY", 0x2541, EDID_QUIRK_FORCE_12BPC },
138
139         /* ViewSonic VA2026w */
140         { "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING },
141
142         /* Medion MD 30217 PG */
143         { "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 },
144
145         /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */
146         { "SEC", 0xd033, EDID_QUIRK_FORCE_8BPC },
147 };
148
149 /*
150  * Autogenerated from the DMT spec.
151  * This table is copied from xfree86/modes/xf86EdidModes.c.
152  */
153 static const struct drm_display_mode drm_dmt_modes[] = {
154         /* 0x01 - 640x350@85Hz */
155         { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
156                    736, 832, 0, 350, 382, 385, 445, 0,
157                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
158         /* 0x02 - 640x400@85Hz */
159         { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
160                    736, 832, 0, 400, 401, 404, 445, 0,
161                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
162         /* 0x03 - 720x400@85Hz */
163         { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 756,
164                    828, 936, 0, 400, 401, 404, 446, 0,
165                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
166         /* 0x04 - 640x480@60Hz */
167         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
168                    752, 800, 0, 480, 490, 492, 525, 0,
169                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
170         /* 0x05 - 640x480@72Hz */
171         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
172                    704, 832, 0, 480, 489, 492, 520, 0,
173                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
174         /* 0x06 - 640x480@75Hz */
175         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656,
176                    720, 840, 0, 480, 481, 484, 500, 0,
177                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
178         /* 0x07 - 640x480@85Hz */
179         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 36000, 640, 696,
180                    752, 832, 0, 480, 481, 484, 509, 0,
181                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
182         /* 0x08 - 800x600@56Hz */
183         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824,
184                    896, 1024, 0, 600, 601, 603, 625, 0,
185                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
186         /* 0x09 - 800x600@60Hz */
187         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
188                    968, 1056, 0, 600, 601, 605, 628, 0,
189                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
190         /* 0x0a - 800x600@72Hz */
191         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856,
192                    976, 1040, 0, 600, 637, 643, 666, 0,
193                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
194         /* 0x0b - 800x600@75Hz */
195         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816,
196                    896, 1056, 0, 600, 601, 604, 625, 0,
197                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
198         /* 0x0c - 800x600@85Hz */
199         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 56250, 800, 832,
200                    896, 1048, 0, 600, 601, 604, 631, 0,
201                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
202         /* 0x0d - 800x600@120Hz RB */
203         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 73250, 800, 848,
204                    880, 960, 0, 600, 603, 607, 636, 0,
205                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
206         /* 0x0e - 848x480@60Hz */
207         { DRM_MODE("848x480", DRM_MODE_TYPE_DRIVER, 33750, 848, 864,
208                    976, 1088, 0, 480, 486, 494, 517, 0,
209                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
210         /* 0x0f - 1024x768@43Hz, interlace */
211         { DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032,
212                    1208, 1264, 0, 768, 768, 772, 817, 0,
213                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
214                    DRM_MODE_FLAG_INTERLACE) },
215         /* 0x10 - 1024x768@60Hz */
216         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
217                    1184, 1344, 0, 768, 771, 777, 806, 0,
218                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
219         /* 0x11 - 1024x768@70Hz */
220         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048,
221                    1184, 1328, 0, 768, 771, 777, 806, 0,
222                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
223         /* 0x12 - 1024x768@75Hz */
224         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040,
225                    1136, 1312, 0, 768, 769, 772, 800, 0,
226                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
227         /* 0x13 - 1024x768@85Hz */
228         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 94500, 1024, 1072,
229                    1168, 1376, 0, 768, 769, 772, 808, 0,
230                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
231         /* 0x14 - 1024x768@120Hz RB */
232         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 115500, 1024, 1072,
233                    1104, 1184, 0, 768, 771, 775, 813, 0,
234                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
235         /* 0x15 - 1152x864@75Hz */
236         { DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216,
237                    1344, 1600, 0, 864, 865, 868, 900, 0,
238                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
239         /* 0x55 - 1280x720@60Hz */
240         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
241                    1430, 1650, 0, 720, 725, 730, 750, 0,
242                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
243         /* 0x16 - 1280x768@60Hz RB */
244         { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 68250, 1280, 1328,
245                    1360, 1440, 0, 768, 771, 778, 790, 0,
246                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
247         /* 0x17 - 1280x768@60Hz */
248         { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 79500, 1280, 1344,
249                    1472, 1664, 0, 768, 771, 778, 798, 0,
250                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
251         /* 0x18 - 1280x768@75Hz */
252         { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 102250, 1280, 1360,
253                    1488, 1696, 0, 768, 771, 778, 805, 0,
254                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
255         /* 0x19 - 1280x768@85Hz */
256         { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 117500, 1280, 1360,
257                    1496, 1712, 0, 768, 771, 778, 809, 0,
258                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
259         /* 0x1a - 1280x768@120Hz RB */
260         { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 140250, 1280, 1328,
261                    1360, 1440, 0, 768, 771, 778, 813, 0,
262                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
263         /* 0x1b - 1280x800@60Hz RB */
264         { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 71000, 1280, 1328,
265                    1360, 1440, 0, 800, 803, 809, 823, 0,
266                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
267         /* 0x1c - 1280x800@60Hz */
268         { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352,
269                    1480, 1680, 0, 800, 803, 809, 831, 0,
270                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
271         /* 0x1d - 1280x800@75Hz */
272         { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 106500, 1280, 1360,
273                    1488, 1696, 0, 800, 803, 809, 838, 0,
274                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
275         /* 0x1e - 1280x800@85Hz */
276         { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 122500, 1280, 1360,
277                    1496, 1712, 0, 800, 803, 809, 843, 0,
278                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
279         /* 0x1f - 1280x800@120Hz RB */
280         { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 146250, 1280, 1328,
281                    1360, 1440, 0, 800, 803, 809, 847, 0,
282                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
283         /* 0x20 - 1280x960@60Hz */
284         { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1376,
285                    1488, 1800, 0, 960, 961, 964, 1000, 0,
286                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
287         /* 0x21 - 1280x960@85Hz */
288         { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1344,
289                    1504, 1728, 0, 960, 961, 964, 1011, 0,
290                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
291         /* 0x22 - 1280x960@120Hz RB */
292         { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 175500, 1280, 1328,
293                    1360, 1440, 0, 960, 963, 967, 1017, 0,
294                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
295         /* 0x23 - 1280x1024@60Hz */
296         { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1328,
297                    1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
298                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
299         /* 0x24 - 1280x1024@75Hz */
300         { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296,
301                    1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
302                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
303         /* 0x25 - 1280x1024@85Hz */
304         { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 157500, 1280, 1344,
305                    1504, 1728, 0, 1024, 1025, 1028, 1072, 0,
306                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
307         /* 0x26 - 1280x1024@120Hz RB */
308         { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 187250, 1280, 1328,
309                    1360, 1440, 0, 1024, 1027, 1034, 1084, 0,
310                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
311         /* 0x27 - 1360x768@60Hz */
312         { DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 85500, 1360, 1424,
313                    1536, 1792, 0, 768, 771, 777, 795, 0,
314                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
315         /* 0x28 - 1360x768@120Hz RB */
316         { DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 148250, 1360, 1408,
317                    1440, 1520, 0, 768, 771, 776, 813, 0,
318                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
319         /* 0x51 - 1366x768@60Hz */
320         { DRM_MODE("1366x768", DRM_MODE_TYPE_DRIVER, 85500, 1366, 1436,
321                    1579, 1792, 0, 768, 771, 774, 798, 0,
322                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
323         /* 0x56 - 1366x768@60Hz */
324         { DRM_MODE("1366x768", DRM_MODE_TYPE_DRIVER, 72000, 1366, 1380,
325                    1436, 1500, 0, 768, 769, 772, 800, 0,
326                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
327         /* 0x29 - 1400x1050@60Hz RB */
328         { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 101000, 1400, 1448,
329                    1480, 1560, 0, 1050, 1053, 1057, 1080, 0,
330                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
331         /* 0x2a - 1400x1050@60Hz */
332         { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 121750, 1400, 1488,
333                    1632, 1864, 0, 1050, 1053, 1057, 1089, 0,
334                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
335         /* 0x2b - 1400x1050@75Hz */
336         { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 156000, 1400, 1504,
337                    1648, 1896, 0, 1050, 1053, 1057, 1099, 0,
338                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
339         /* 0x2c - 1400x1050@85Hz */
340         { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 179500, 1400, 1504,
341                    1656, 1912, 0, 1050, 1053, 1057, 1105, 0,
342                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
343         /* 0x2d - 1400x1050@120Hz RB */
344         { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 208000, 1400, 1448,
345                    1480, 1560, 0, 1050, 1053, 1057, 1112, 0,
346                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
347         /* 0x2e - 1440x900@60Hz RB */
348         { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 88750, 1440, 1488,
349                    1520, 1600, 0, 900, 903, 909, 926, 0,
350                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
351         /* 0x2f - 1440x900@60Hz */
352         { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 106500, 1440, 1520,
353                    1672, 1904, 0, 900, 903, 909, 934, 0,
354                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
355         /* 0x30 - 1440x900@75Hz */
356         { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 136750, 1440, 1536,
357                    1688, 1936, 0, 900, 903, 909, 942, 0,
358                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
359         /* 0x31 - 1440x900@85Hz */
360         { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 157000, 1440, 1544,
361                    1696, 1952, 0, 900, 903, 909, 948, 0,
362                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
363         /* 0x32 - 1440x900@120Hz RB */
364         { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 182750, 1440, 1488,
365                    1520, 1600, 0, 900, 903, 909, 953, 0,
366                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
367         /* 0x53 - 1600x900@60Hz */
368         { DRM_MODE("1600x900", DRM_MODE_TYPE_DRIVER, 108000, 1600, 1624,
369                    1704, 1800, 0, 900, 901, 904, 1000, 0,
370                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
371         /* 0x33 - 1600x1200@60Hz */
372         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 162000, 1600, 1664,
373                    1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
374                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
375         /* 0x34 - 1600x1200@65Hz */
376         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 175500, 1600, 1664,
377                    1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
378                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
379         /* 0x35 - 1600x1200@70Hz */
380         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 189000, 1600, 1664,
381                    1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
382                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
383         /* 0x36 - 1600x1200@75Hz */
384         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 202500, 1600, 1664,
385                    1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
386                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
387         /* 0x37 - 1600x1200@85Hz */
388         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 229500, 1600, 1664,
389                    1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
390                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
391         /* 0x38 - 1600x1200@120Hz RB */
392         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 268250, 1600, 1648,
393                    1680, 1760, 0, 1200, 1203, 1207, 1271, 0,
394                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
395         /* 0x39 - 1680x1050@60Hz RB */
396         { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 119000, 1680, 1728,
397                    1760, 1840, 0, 1050, 1053, 1059, 1080, 0,
398                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
399         /* 0x3a - 1680x1050@60Hz */
400         { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 146250, 1680, 1784,
401                    1960, 2240, 0, 1050, 1053, 1059, 1089, 0,
402                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
403         /* 0x3b - 1680x1050@75Hz */
404         { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 187000, 1680, 1800,
405                    1976, 2272, 0, 1050, 1053, 1059, 1099, 0,
406                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
407         /* 0x3c - 1680x1050@85Hz */
408         { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 214750, 1680, 1808,
409                    1984, 2288, 0, 1050, 1053, 1059, 1105, 0,
410                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
411         /* 0x3d - 1680x1050@120Hz RB */
412         { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 245500, 1680, 1728,
413                    1760, 1840, 0, 1050, 1053, 1059, 1112, 0,
414                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
415         /* 0x3e - 1792x1344@60Hz */
416         { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 204750, 1792, 1920,
417                    2120, 2448, 0, 1344, 1345, 1348, 1394, 0,
418                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
419         /* 0x3f - 1792x1344@75Hz */
420         { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 261000, 1792, 1888,
421                    2104, 2456, 0, 1344, 1345, 1348, 1417, 0,
422                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
423         /* 0x40 - 1792x1344@120Hz RB */
424         { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 333250, 1792, 1840,
425                    1872, 1952, 0, 1344, 1347, 1351, 1423, 0,
426                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
427         /* 0x41 - 1856x1392@60Hz */
428         { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 218250, 1856, 1952,
429                    2176, 2528, 0, 1392, 1393, 1396, 1439, 0,
430                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
431         /* 0x42 - 1856x1392@75Hz */
432         { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 288000, 1856, 1984,
433                    2208, 2560, 0, 1392, 1393, 1396, 1500, 0,
434                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
435         /* 0x43 - 1856x1392@120Hz RB */
436         { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 356500, 1856, 1904,
437                    1936, 2016, 0, 1392, 1395, 1399, 1474, 0,
438                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
439         /* 0x52 - 1920x1080@60Hz */
440         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
441                    2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
442                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
443         /* 0x44 - 1920x1200@60Hz RB */
444         { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 154000, 1920, 1968,
445                    2000, 2080, 0, 1200, 1203, 1209, 1235, 0,
446                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
447         /* 0x45 - 1920x1200@60Hz */
448         { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 193250, 1920, 2056,
449                    2256, 2592, 0, 1200, 1203, 1209, 1245, 0,
450                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
451         /* 0x46 - 1920x1200@75Hz */
452         { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 245250, 1920, 2056,
453                    2264, 2608, 0, 1200, 1203, 1209, 1255, 0,
454                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
455         /* 0x47 - 1920x1200@85Hz */
456         { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 281250, 1920, 2064,
457                    2272, 2624, 0, 1200, 1203, 1209, 1262, 0,
458                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
459         /* 0x48 - 1920x1200@120Hz RB */
460         { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 317000, 1920, 1968,
461                    2000, 2080, 0, 1200, 1203, 1209, 1271, 0,
462                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
463         /* 0x49 - 1920x1440@60Hz */
464         { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 234000, 1920, 2048,
465                    2256, 2600, 0, 1440, 1441, 1444, 1500, 0,
466                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
467         /* 0x4a - 1920x1440@75Hz */
468         { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2064,
469                    2288, 2640, 0, 1440, 1441, 1444, 1500, 0,
470                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
471         /* 0x4b - 1920x1440@120Hz RB */
472         { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 380500, 1920, 1968,
473                    2000, 2080, 0, 1440, 1443, 1447, 1525, 0,
474                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
475         /* 0x54 - 2048x1152@60Hz */
476         { DRM_MODE("2048x1152", DRM_MODE_TYPE_DRIVER, 162000, 2048, 2074,
477                    2154, 2250, 0, 1152, 1153, 1156, 1200, 0,
478                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
479         /* 0x4c - 2560x1600@60Hz RB */
480         { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 268500, 2560, 2608,
481                    2640, 2720, 0, 1600, 1603, 1609, 1646, 0,
482                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
483         /* 0x4d - 2560x1600@60Hz */
484         { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 348500, 2560, 2752,
485                    3032, 3504, 0, 1600, 1603, 1609, 1658, 0,
486                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
487         /* 0x4e - 2560x1600@75Hz */
488         { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 443250, 2560, 2768,
489                    3048, 3536, 0, 1600, 1603, 1609, 1672, 0,
490                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
491         /* 0x4f - 2560x1600@85Hz */
492         { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 505250, 2560, 2768,
493                    3048, 3536, 0, 1600, 1603, 1609, 1682, 0,
494                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
495         /* 0x50 - 2560x1600@120Hz RB */
496         { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 552750, 2560, 2608,
497                    2640, 2720, 0, 1600, 1603, 1609, 1694, 0,
498                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
499         /* 0x57 - 4096x2160@60Hz RB */
500         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 556744, 4096, 4104,
501                    4136, 4176, 0, 2160, 2208, 2216, 2222, 0,
502                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
503         /* 0x58 - 4096x2160@59.94Hz RB */
504         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 556188, 4096, 4104,
505                    4136, 4176, 0, 2160, 2208, 2216, 2222, 0,
506                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
507 };
508
509 /*
510  * These more or less come from the DMT spec.  The 720x400 modes are
511  * inferred from historical 80x25 practice.  The 640x480@67 and 832x624@75
512  * modes are old-school Mac modes.  The EDID spec says the 1152x864@75 mode
513  * should be 1152x870, again for the Mac, but instead we use the x864 DMT
514  * mode.
515  *
516  * The DMT modes have been fact-checked; the rest are mild guesses.
517  */
518 static const struct drm_display_mode edid_est_modes[] = {
519         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
520                    968, 1056, 0, 600, 601, 605, 628, 0,
521                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@60Hz */
522         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824,
523                    896, 1024, 0, 600, 601, 603,  625, 0,
524                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@56Hz */
525         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656,
526                    720, 840, 0, 480, 481, 484, 500, 0,
527                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@75Hz */
528         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
529                    704,  832, 0, 480, 489, 491, 520, 0,
530                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@72Hz */
531         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 30240, 640, 704,
532                    768,  864, 0, 480, 483, 486, 525, 0,
533                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@67Hz */
534         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25200, 640, 656,
535                    752, 800, 0, 480, 490, 492, 525, 0,
536                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@60Hz */
537         { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 738,
538                    846, 900, 0, 400, 421, 423,  449, 0,
539                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 720x400@88Hz */
540         { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 28320, 720, 738,
541                    846,  900, 0, 400, 412, 414, 449, 0,
542                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 720x400@70Hz */
543         { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296,
544                    1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
545                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */
546         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78800, 1024, 1040,
547                    1136, 1312, 0,  768, 769, 772, 800, 0,
548                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1024x768@75Hz */
549         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048,
550                    1184, 1328, 0,  768, 771, 777, 806, 0,
551                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@70Hz */
552         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
553                    1184, 1344, 0,  768, 771, 777, 806, 0,
554                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@60Hz */
555         { DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER,44900, 1024, 1032,
556                    1208, 1264, 0, 768, 768, 776, 817, 0,
557                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* 1024x768@43Hz */
558         { DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 57284, 832, 864,
559                    928, 1152, 0, 624, 625, 628, 667, 0,
560                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 832x624@75Hz */
561         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816,
562                    896, 1056, 0, 600, 601, 604,  625, 0,
563                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@75Hz */
564         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856,
565                    976, 1040, 0, 600, 637, 643, 666, 0,
566                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@72Hz */
567         { DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216,
568                    1344, 1600, 0,  864, 865, 868, 900, 0,
569                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1152x864@75Hz */
570 };
571
572 struct minimode {
573         short w;
574         short h;
575         short r;
576         short rb;
577 };
578
579 static const struct minimode est3_modes[] = {
580         /* byte 6 */
581         { 640, 350, 85, 0 },
582         { 640, 400, 85, 0 },
583         { 720, 400, 85, 0 },
584         { 640, 480, 85, 0 },
585         { 848, 480, 60, 0 },
586         { 800, 600, 85, 0 },
587         { 1024, 768, 85, 0 },
588         { 1152, 864, 75, 0 },
589         /* byte 7 */
590         { 1280, 768, 60, 1 },
591         { 1280, 768, 60, 0 },
592         { 1280, 768, 75, 0 },
593         { 1280, 768, 85, 0 },
594         { 1280, 960, 60, 0 },
595         { 1280, 960, 85, 0 },
596         { 1280, 1024, 60, 0 },
597         { 1280, 1024, 85, 0 },
598         /* byte 8 */
599         { 1360, 768, 60, 0 },
600         { 1440, 900, 60, 1 },
601         { 1440, 900, 60, 0 },
602         { 1440, 900, 75, 0 },
603         { 1440, 900, 85, 0 },
604         { 1400, 1050, 60, 1 },
605         { 1400, 1050, 60, 0 },
606         { 1400, 1050, 75, 0 },
607         /* byte 9 */
608         { 1400, 1050, 85, 0 },
609         { 1680, 1050, 60, 1 },
610         { 1680, 1050, 60, 0 },
611         { 1680, 1050, 75, 0 },
612         { 1680, 1050, 85, 0 },
613         { 1600, 1200, 60, 0 },
614         { 1600, 1200, 65, 0 },
615         { 1600, 1200, 70, 0 },
616         /* byte 10 */
617         { 1600, 1200, 75, 0 },
618         { 1600, 1200, 85, 0 },
619         { 1792, 1344, 60, 0 },
620         { 1792, 1344, 75, 0 },
621         { 1856, 1392, 60, 0 },
622         { 1856, 1392, 75, 0 },
623         { 1920, 1200, 60, 1 },
624         { 1920, 1200, 60, 0 },
625         /* byte 11 */
626         { 1920, 1200, 75, 0 },
627         { 1920, 1200, 85, 0 },
628         { 1920, 1440, 60, 0 },
629         { 1920, 1440, 75, 0 },
630 };
631
632 static const struct minimode extra_modes[] = {
633         { 1024, 576,  60, 0 },
634         { 1366, 768,  60, 0 },
635         { 1600, 900,  60, 0 },
636         { 1680, 945,  60, 0 },
637         { 1920, 1080, 60, 0 },
638         { 2048, 1152, 60, 0 },
639         { 2048, 1536, 60, 0 },
640 };
641
642 /*
643  * Probably taken from CEA-861 spec.
644  * This table is converted from xorg's hw/xfree86/modes/xf86EdidModes.c.
645  */
646 static const struct drm_display_mode edid_cea_modes[] = {
647         /* 1 - 640x480@60Hz */
648         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
649                    752, 800, 0, 480, 490, 492, 525, 0,
650                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
651           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
652         /* 2 - 720x480@60Hz */
653         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
654                    798, 858, 0, 480, 489, 495, 525, 0,
655                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
656           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
657         /* 3 - 720x480@60Hz */
658         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
659                    798, 858, 0, 480, 489, 495, 525, 0,
660                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
661           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
662         /* 4 - 1280x720@60Hz */
663         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
664                    1430, 1650, 0, 720, 725, 730, 750, 0,
665                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
666           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
667         /* 5 - 1920x1080i@60Hz */
668         { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
669                    2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
670                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
671                         DRM_MODE_FLAG_INTERLACE),
672           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
673         /* 6 - 720(1440)x480i@60Hz */
674         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
675                    801, 858, 0, 480, 488, 494, 525, 0,
676                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
677                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
678           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
679         /* 7 - 720(1440)x480i@60Hz */
680         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
681                    801, 858, 0, 480, 488, 494, 525, 0,
682                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
683                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
684           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
685         /* 8 - 720(1440)x240@60Hz */
686         { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
687                    801, 858, 0, 240, 244, 247, 262, 0,
688                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
689                         DRM_MODE_FLAG_DBLCLK),
690           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
691         /* 9 - 720(1440)x240@60Hz */
692         { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
693                    801, 858, 0, 240, 244, 247, 262, 0,
694                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
695                         DRM_MODE_FLAG_DBLCLK),
696           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
697         /* 10 - 2880x480i@60Hz */
698         { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
699                    3204, 3432, 0, 480, 488, 494, 525, 0,
700                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
701                         DRM_MODE_FLAG_INTERLACE),
702           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
703         /* 11 - 2880x480i@60Hz */
704         { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
705                    3204, 3432, 0, 480, 488, 494, 525, 0,
706                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
707                         DRM_MODE_FLAG_INTERLACE),
708           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
709         /* 12 - 2880x240@60Hz */
710         { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
711                    3204, 3432, 0, 240, 244, 247, 262, 0,
712                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
713           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
714         /* 13 - 2880x240@60Hz */
715         { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
716                    3204, 3432, 0, 240, 244, 247, 262, 0,
717                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
718           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
719         /* 14 - 1440x480@60Hz */
720         { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
721                    1596, 1716, 0, 480, 489, 495, 525, 0,
722                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
723           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
724         /* 15 - 1440x480@60Hz */
725         { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
726                    1596, 1716, 0, 480, 489, 495, 525, 0,
727                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
728           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
729         /* 16 - 1920x1080@60Hz */
730         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
731                    2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
732                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
733           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
734         /* 17 - 720x576@50Hz */
735         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
736                    796, 864, 0, 576, 581, 586, 625, 0,
737                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
738           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
739         /* 18 - 720x576@50Hz */
740         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
741                    796, 864, 0, 576, 581, 586, 625, 0,
742                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
743           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
744         /* 19 - 1280x720@50Hz */
745         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
746                    1760, 1980, 0, 720, 725, 730, 750, 0,
747                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
748           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
749         /* 20 - 1920x1080i@50Hz */
750         { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
751                    2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
752                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
753                         DRM_MODE_FLAG_INTERLACE),
754           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
755         /* 21 - 720(1440)x576i@50Hz */
756         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
757                    795, 864, 0, 576, 580, 586, 625, 0,
758                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
759                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
760           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
761         /* 22 - 720(1440)x576i@50Hz */
762         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
763                    795, 864, 0, 576, 580, 586, 625, 0,
764                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
765                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
766           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
767         /* 23 - 720(1440)x288@50Hz */
768         { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
769                    795, 864, 0, 288, 290, 293, 312, 0,
770                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
771                         DRM_MODE_FLAG_DBLCLK),
772           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
773         /* 24 - 720(1440)x288@50Hz */
774         { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
775                    795, 864, 0, 288, 290, 293, 312, 0,
776                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
777                         DRM_MODE_FLAG_DBLCLK),
778           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
779         /* 25 - 2880x576i@50Hz */
780         { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
781                    3180, 3456, 0, 576, 580, 586, 625, 0,
782                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
783                         DRM_MODE_FLAG_INTERLACE),
784           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
785         /* 26 - 2880x576i@50Hz */
786         { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
787                    3180, 3456, 0, 576, 580, 586, 625, 0,
788                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
789                         DRM_MODE_FLAG_INTERLACE),
790           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
791         /* 27 - 2880x288@50Hz */
792         { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
793                    3180, 3456, 0, 288, 290, 293, 312, 0,
794                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
795           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
796         /* 28 - 2880x288@50Hz */
797         { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
798                    3180, 3456, 0, 288, 290, 293, 312, 0,
799                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
800           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
801         /* 29 - 1440x576@50Hz */
802         { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
803                    1592, 1728, 0, 576, 581, 586, 625, 0,
804                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
805           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
806         /* 30 - 1440x576@50Hz */
807         { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
808                    1592, 1728, 0, 576, 581, 586, 625, 0,
809                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
810           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
811         /* 31 - 1920x1080@50Hz */
812         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
813                    2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
814                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
815           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
816         /* 32 - 1920x1080@24Hz */
817         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
818                    2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
819                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
820           .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
821         /* 33 - 1920x1080@25Hz */
822         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
823                    2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
824                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
825           .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
826         /* 34 - 1920x1080@30Hz */
827         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
828                    2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
829                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
830           .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
831         /* 35 - 2880x480@60Hz */
832         { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
833                    3192, 3432, 0, 480, 489, 495, 525, 0,
834                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
835           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
836         /* 36 - 2880x480@60Hz */
837         { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
838                    3192, 3432, 0, 480, 489, 495, 525, 0,
839                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
840           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
841         /* 37 - 2880x576@50Hz */
842         { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
843                    3184, 3456, 0, 576, 581, 586, 625, 0,
844                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
845           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
846         /* 38 - 2880x576@50Hz */
847         { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
848                    3184, 3456, 0, 576, 581, 586, 625, 0,
849                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
850           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
851         /* 39 - 1920x1080i@50Hz */
852         { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952,
853                    2120, 2304, 0, 1080, 1126, 1136, 1250, 0,
854                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC |
855                         DRM_MODE_FLAG_INTERLACE),
856           .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
857         /* 40 - 1920x1080i@100Hz */
858         { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
859                    2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
860                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
861                         DRM_MODE_FLAG_INTERLACE),
862           .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
863         /* 41 - 1280x720@100Hz */
864         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
865                    1760, 1980, 0, 720, 725, 730, 750, 0,
866                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
867           .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
868         /* 42 - 720x576@100Hz */
869         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
870                    796, 864, 0, 576, 581, 586, 625, 0,
871                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
872           .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
873         /* 43 - 720x576@100Hz */
874         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
875                    796, 864, 0, 576, 581, 586, 625, 0,
876                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
877           .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
878         /* 44 - 720(1440)x576i@100Hz */
879         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
880                    795, 864, 0, 576, 580, 586, 625, 0,
881                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
882                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
883           .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
884         /* 45 - 720(1440)x576i@100Hz */
885         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
886                    795, 864, 0, 576, 580, 586, 625, 0,
887                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
888                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
889           .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
890         /* 46 - 1920x1080i@120Hz */
891         { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
892                    2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
893                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
894                         DRM_MODE_FLAG_INTERLACE),
895           .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
896         /* 47 - 1280x720@120Hz */
897         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
898                    1430, 1650, 0, 720, 725, 730, 750, 0,
899                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
900           .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
901         /* 48 - 720x480@120Hz */
902         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
903                    798, 858, 0, 480, 489, 495, 525, 0,
904                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
905           .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
906         /* 49 - 720x480@120Hz */
907         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
908                    798, 858, 0, 480, 489, 495, 525, 0,
909                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
910           .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
911         /* 50 - 720(1440)x480i@120Hz */
912         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
913                    801, 858, 0, 480, 488, 494, 525, 0,
914                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
915                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
916           .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
917         /* 51 - 720(1440)x480i@120Hz */
918         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
919                    801, 858, 0, 480, 488, 494, 525, 0,
920                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
921                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
922           .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
923         /* 52 - 720x576@200Hz */
924         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
925                    796, 864, 0, 576, 581, 586, 625, 0,
926                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
927           .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
928         /* 53 - 720x576@200Hz */
929         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
930                    796, 864, 0, 576, 581, 586, 625, 0,
931                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
932           .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
933         /* 54 - 720(1440)x576i@200Hz */
934         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
935                    795, 864, 0, 576, 580, 586, 625, 0,
936                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
937                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
938           .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
939         /* 55 - 720(1440)x576i@200Hz */
940         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
941                    795, 864, 0, 576, 580, 586, 625, 0,
942                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
943                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
944           .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
945         /* 56 - 720x480@240Hz */
946         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
947                    798, 858, 0, 480, 489, 495, 525, 0,
948                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
949           .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
950         /* 57 - 720x480@240Hz */
951         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
952                    798, 858, 0, 480, 489, 495, 525, 0,
953                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
954           .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
955         /* 58 - 720(1440)x480i@240 */
956         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
957                    801, 858, 0, 480, 488, 494, 525, 0,
958                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
959                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
960           .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
961         /* 59 - 720(1440)x480i@240 */
962         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
963                    801, 858, 0, 480, 488, 494, 525, 0,
964                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
965                         DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
966           .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
967         /* 60 - 1280x720@24Hz */
968         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
969                    3080, 3300, 0, 720, 725, 730, 750, 0,
970                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
971           .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
972         /* 61 - 1280x720@25Hz */
973         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
974                    3740, 3960, 0, 720, 725, 730, 750, 0,
975                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
976           .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
977         /* 62 - 1280x720@30Hz */
978         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
979                    3080, 3300, 0, 720, 725, 730, 750, 0,
980                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
981           .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
982         /* 63 - 1920x1080@120Hz */
983         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
984                    2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
985                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
986          .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
987         /* 64 - 1920x1080@100Hz */
988         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
989                    2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
990                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
991          .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
992 };
993
994 /*
995  * HDMI 1.4 4k modes.
996  */
997 static const struct drm_display_mode edid_4k_modes[] = {
998         /* 1 - 3840x2160@30Hz */
999         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
1000                    3840, 4016, 4104, 4400, 0,
1001                    2160, 2168, 2178, 2250, 0,
1002                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1003           .vrefresh = 30, },
1004         /* 2 - 3840x2160@25Hz */
1005         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
1006                    3840, 4896, 4984, 5280, 0,
1007                    2160, 2168, 2178, 2250, 0,
1008                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1009           .vrefresh = 25, },
1010         /* 3 - 3840x2160@24Hz */
1011         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
1012                    3840, 5116, 5204, 5500, 0,
1013                    2160, 2168, 2178, 2250, 0,
1014                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1015           .vrefresh = 24, },
1016         /* 4 - 4096x2160@24Hz (SMPTE) */
1017         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000,
1018                    4096, 5116, 5204, 5500, 0,
1019                    2160, 2168, 2178, 2250, 0,
1020                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1021           .vrefresh = 24, },
1022         /* 5 - 3840x2160@60Hz */
1023         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000,
1024                    3840, 4016, 4104, 4400, 0,
1025                    2160, 2168, 2178, 2250, 0,
1026                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1027           .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1028 };
1029
1030 /*** DDC fetch and block validation ***/
1031
1032 static const u8 edid_header[] = {
1033         0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
1034 };
1035
1036 /**
1037  * drm_edid_header_is_valid - sanity check the header of the base EDID block
1038  * @raw_edid: pointer to raw base EDID block
1039  *
1040  * Sanity check the header of the base EDID block.
1041  *
1042  * Return: 8 if the header is perfect, down to 0 if it's totally wrong.
1043  */
1044 int drm_edid_header_is_valid(const u8 *raw_edid)
1045 {
1046         int i, score = 0;
1047
1048         for (i = 0; i < sizeof(edid_header); i++)
1049                 if (raw_edid[i] == edid_header[i])
1050                         score++;
1051
1052         return score;
1053 }
1054 EXPORT_SYMBOL(drm_edid_header_is_valid);
1055
1056 static int edid_fixup __read_mostly = 6;
1057 module_param_named(edid_fixup, edid_fixup, int, 0400);
1058 MODULE_PARM_DESC(edid_fixup,
1059                  "Minimum number of valid EDID header bytes (0-8, default 6)");
1060
1061 static void drm_get_displayid(struct drm_connector *connector,
1062                               struct edid *edid);
1063
1064 static int drm_edid_block_checksum(const u8 *raw_edid)
1065 {
1066         int i;
1067         u8 csum = 0;
1068         for (i = 0; i < EDID_LENGTH; i++)
1069                 csum += raw_edid[i];
1070
1071         return csum;
1072 }
1073
1074 static bool drm_edid_is_zero(const u8 *in_edid, int length)
1075 {
1076         if (memchr_inv(in_edid, 0, length))
1077                 return false;
1078
1079         return true;
1080 }
1081
1082 /**
1083  * drm_edid_block_valid - Sanity check the EDID block (base or extension)
1084  * @raw_edid: pointer to raw EDID block
1085  * @block: type of block to validate (0 for base, extension otherwise)
1086  * @print_bad_edid: if true, dump bad EDID blocks to the console
1087  * @edid_corrupt: if true, the header or checksum is invalid
1088  *
1089  * Validate a base or extension EDID block and optionally dump bad blocks to
1090  * the console.
1091  *
1092  * Return: True if the block is valid, false otherwise.
1093  */
1094 bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid,
1095                           bool *edid_corrupt)
1096 {
1097         u8 csum;
1098         struct edid *edid = (struct edid *)raw_edid;
1099
1100         if (WARN_ON(!raw_edid))
1101                 return false;
1102
1103         if (edid_fixup > 8 || edid_fixup < 0)
1104                 edid_fixup = 6;
1105
1106         if (block == 0) {
1107                 int score = drm_edid_header_is_valid(raw_edid);
1108                 if (score == 8) {
1109                         if (edid_corrupt)
1110                                 *edid_corrupt = false;
1111                 } else if (score >= edid_fixup) {
1112                         /* Displayport Link CTS Core 1.2 rev1.1 test 4.2.2.6
1113                          * The corrupt flag needs to be set here otherwise, the
1114                          * fix-up code here will correct the problem, the
1115                          * checksum is correct and the test fails
1116                          */
1117                         if (edid_corrupt)
1118                                 *edid_corrupt = true;
1119                         DRM_DEBUG("Fixing EDID header, your hardware may be failing\n");
1120                         memcpy(raw_edid, edid_header, sizeof(edid_header));
1121                 } else {
1122                         if (edid_corrupt)
1123                                 *edid_corrupt = true;
1124                         goto bad;
1125                 }
1126         }
1127
1128         csum = drm_edid_block_checksum(raw_edid);
1129         if (csum) {
1130                 if (print_bad_edid) {
1131                         DRM_ERROR("EDID checksum is invalid, remainder is %d\n", csum);
1132                 }
1133
1134                 if (edid_corrupt)
1135                         *edid_corrupt = true;
1136
1137                 /* allow CEA to slide through, switches mangle this */
1138                 if (raw_edid[0] != 0x02)
1139                         goto bad;
1140         }
1141
1142         /* per-block-type checks */
1143         switch (raw_edid[0]) {
1144         case 0: /* base */
1145                 if (edid->version != 1) {
1146                         DRM_ERROR("EDID has major version %d, instead of 1\n", edid->version);
1147                         goto bad;
1148                 }
1149
1150                 if (edid->revision > 4)
1151                         DRM_DEBUG("EDID minor > 4, assuming backward compatibility\n");
1152                 break;
1153
1154         default:
1155                 break;
1156         }
1157
1158         return true;
1159
1160 bad:
1161         if (print_bad_edid) {
1162                 if (drm_edid_is_zero(raw_edid, EDID_LENGTH)) {
1163                         printk(KERN_ERR "EDID block is all zeroes\n");
1164                 } else {
1165                         printk(KERN_ERR "Raw EDID:\n");
1166                         print_hex_dump(KERN_ERR, " \t", DUMP_PREFIX_NONE, 16, 1,
1167                                raw_edid, EDID_LENGTH, false);
1168                 }
1169         }
1170         return false;
1171 }
1172 EXPORT_SYMBOL(drm_edid_block_valid);
1173
1174 /**
1175  * drm_edid_is_valid - sanity check EDID data
1176  * @edid: EDID data
1177  *
1178  * Sanity-check an entire EDID record (including extensions)
1179  *
1180  * Return: True if the EDID data is valid, false otherwise.
1181  */
1182 bool drm_edid_is_valid(struct edid *edid)
1183 {
1184         int i;
1185         u8 *raw = (u8 *)edid;
1186
1187         if (!edid)
1188                 return false;
1189
1190         for (i = 0; i <= edid->extensions; i++)
1191                 if (!drm_edid_block_valid(raw + i * EDID_LENGTH, i, true, NULL))
1192                         return false;
1193
1194         return true;
1195 }
1196 EXPORT_SYMBOL(drm_edid_is_valid);
1197
1198 #define DDC_SEGMENT_ADDR 0x30
1199 /**
1200  * drm_do_probe_ddc_edid() - get EDID information via I2C
1201  * @data: I2C device adapter
1202  * @buf: EDID data buffer to be filled
1203  * @block: 128 byte EDID block to start fetching from
1204  * @len: EDID data buffer length to fetch
1205  *
1206  * Try to fetch EDID information by calling I2C driver functions.
1207  *
1208  * Return: 0 on success or -1 on failure.
1209  */
1210 static int
1211 drm_do_probe_ddc_edid(void *data, u8 *buf, unsigned int block, size_t len)
1212 {
1213         struct i2c_adapter *adapter = data;
1214         unsigned char start = block * EDID_LENGTH;
1215         unsigned char segment = block >> 1;
1216         unsigned char xfers = segment ? 3 : 2;
1217         int ret, retries = 5;
1218
1219         /*
1220          * The core I2C driver will automatically retry the transfer if the
1221          * adapter reports EAGAIN. However, we find that bit-banging transfers
1222          * are susceptible to errors under a heavily loaded machine and
1223          * generate spurious NAKs and timeouts. Retrying the transfer
1224          * of the individual block a few times seems to overcome this.
1225          */
1226         do {
1227                 struct i2c_msg msgs[] = {
1228                         {
1229                                 .addr   = DDC_SEGMENT_ADDR,
1230                                 .flags  = 0,
1231                                 .len    = 1,
1232                                 .buf    = &segment,
1233                         }, {
1234                                 .addr   = DDC_ADDR,
1235                                 .flags  = 0,
1236                                 .len    = 1,
1237                                 .buf    = &start,
1238                         }, {
1239                                 .addr   = DDC_ADDR,
1240                                 .flags  = I2C_M_RD,
1241                                 .len    = len,
1242                                 .buf    = buf,
1243                         }
1244                 };
1245
1246                 /*
1247                  * Avoid sending the segment addr to not upset non-compliant
1248                  * DDC monitors.
1249                  */
1250                 ret = i2c_transfer(adapter, &msgs[3 - xfers], xfers);
1251
1252                 if (ret == -ENXIO) {
1253                         DRM_DEBUG_KMS("drm: skipping non-existent adapter %s\n",
1254                                         adapter->name);
1255                         break;
1256                 }
1257         } while (ret != xfers && --retries);
1258
1259         return ret == xfers ? 0 : -1;
1260 }
1261
1262 /**
1263  * drm_do_get_edid - get EDID data using a custom EDID block read function
1264  * @connector: connector we're probing
1265  * @get_edid_block: EDID block read function
1266  * @data: private data passed to the block read function
1267  *
1268  * When the I2C adapter connected to the DDC bus is hidden behind a device that
1269  * exposes a different interface to read EDID blocks this function can be used
1270  * to get EDID data using a custom block read function.
1271  *
1272  * As in the general case the DDC bus is accessible by the kernel at the I2C
1273  * level, drivers must make all reasonable efforts to expose it as an I2C
1274  * adapter and use drm_get_edid() instead of abusing this function.
1275  *
1276  * Return: Pointer to valid EDID or NULL if we couldn't find any.
1277  */
1278 struct edid *drm_do_get_edid(struct drm_connector *connector,
1279         int (*get_edid_block)(void *data, u8 *buf, unsigned int block,
1280                               size_t len),
1281         void *data)
1282 {
1283         int i, j = 0, valid_extensions = 0;
1284         u8 *block, *new;
1285         bool print_bad_edid = !connector->bad_edid_counter || (drm_debug & DRM_UT_KMS);
1286
1287         if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL)
1288                 return NULL;
1289
1290         /* base block fetch */
1291         for (i = 0; i < 4; i++) {
1292                 if (get_edid_block(data, block, 0, EDID_LENGTH))
1293                         goto out;
1294                 if (drm_edid_block_valid(block, 0, print_bad_edid,
1295                                          &connector->edid_corrupt))
1296                         break;
1297                 if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) {
1298                         connector->null_edid_counter++;
1299                         goto carp;
1300                 }
1301         }
1302         if (i == 4)
1303                 goto carp;
1304
1305         /* if there's no extensions, we're done */
1306         if (block[0x7e] == 0)
1307                 return (struct edid *)block;
1308
1309         new = krealloc(block, (block[0x7e] + 1) * EDID_LENGTH, GFP_KERNEL);
1310         if (!new)
1311                 goto out;
1312         block = new;
1313
1314         for (j = 1; j <= block[0x7e]; j++) {
1315                 for (i = 0; i < 4; i++) {
1316                         if (get_edid_block(data,
1317                                   block + (valid_extensions + 1) * EDID_LENGTH,
1318                                   j, EDID_LENGTH))
1319                                 goto out;
1320                         if (drm_edid_block_valid(block + (valid_extensions + 1)
1321                                                  * EDID_LENGTH, j,
1322                                                  print_bad_edid,
1323                                                  NULL)) {
1324                                 valid_extensions++;
1325                                 break;
1326                         }
1327                 }
1328
1329                 if (i == 4 && print_bad_edid) {
1330                         dev_warn(connector->dev->dev,
1331                          "%s: Ignoring invalid EDID block %d.\n",
1332                          connector->name, j);
1333
1334                         connector->bad_edid_counter++;
1335                 }
1336         }
1337
1338         if (valid_extensions != block[0x7e]) {
1339                 block[EDID_LENGTH-1] += block[0x7e] - valid_extensions;
1340                 block[0x7e] = valid_extensions;
1341                 new = krealloc(block, (valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL);
1342                 if (!new)
1343                         goto out;
1344                 block = new;
1345         }
1346
1347         return (struct edid *)block;
1348
1349 carp:
1350         if (print_bad_edid) {
1351                 dev_warn(connector->dev->dev, "%s: EDID block %d invalid.\n",
1352                          connector->name, j);
1353         }
1354         connector->bad_edid_counter++;
1355
1356 out:
1357         kfree(block);
1358         return NULL;
1359 }
1360 EXPORT_SYMBOL_GPL(drm_do_get_edid);
1361
1362 /**
1363  * drm_probe_ddc() - probe DDC presence
1364  * @adapter: I2C adapter to probe
1365  *
1366  * Return: True on success, false on failure.
1367  */
1368 bool
1369 drm_probe_ddc(struct i2c_adapter *adapter)
1370 {
1371         unsigned char out;
1372
1373         return (drm_do_probe_ddc_edid(adapter, &out, 0, 1) == 0);
1374 }
1375 EXPORT_SYMBOL(drm_probe_ddc);
1376
1377 /**
1378  * drm_get_edid - get EDID data, if available
1379  * @connector: connector we're probing
1380  * @adapter: I2C adapter to use for DDC
1381  *
1382  * Poke the given I2C channel to grab EDID data if possible.  If found,
1383  * attach it to the connector.
1384  *
1385  * Return: Pointer to valid EDID or NULL if we couldn't find any.
1386  */
1387 struct edid *drm_get_edid(struct drm_connector *connector,
1388                           struct i2c_adapter *adapter)
1389 {
1390         struct edid *edid;
1391
1392         if (!drm_probe_ddc(adapter))
1393                 return NULL;
1394
1395         edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter);
1396         if (edid)
1397                 drm_get_displayid(connector, edid);
1398         return edid;
1399 }
1400 EXPORT_SYMBOL(drm_get_edid);
1401
1402 /**
1403  * drm_edid_duplicate - duplicate an EDID and the extensions
1404  * @edid: EDID to duplicate
1405  *
1406  * Return: Pointer to duplicated EDID or NULL on allocation failure.
1407  */
1408 struct edid *drm_edid_duplicate(const struct edid *edid)
1409 {
1410         return kmemdup(edid, (edid->extensions + 1) * EDID_LENGTH, GFP_KERNEL);
1411 }
1412 EXPORT_SYMBOL(drm_edid_duplicate);
1413
1414 /*** EDID parsing ***/
1415
1416 /**
1417  * edid_vendor - match a string against EDID's obfuscated vendor field
1418  * @edid: EDID to match
1419  * @vendor: vendor string
1420  *
1421  * Returns true if @vendor is in @edid, false otherwise
1422  */
1423 static bool edid_vendor(struct edid *edid, char *vendor)
1424 {
1425         char edid_vendor[3];
1426
1427         edid_vendor[0] = ((edid->mfg_id[0] & 0x7c) >> 2) + '@';
1428         edid_vendor[1] = (((edid->mfg_id[0] & 0x3) << 3) |
1429                           ((edid->mfg_id[1] & 0xe0) >> 5)) + '@';
1430         edid_vendor[2] = (edid->mfg_id[1] & 0x1f) + '@';
1431
1432         return !strncmp(edid_vendor, vendor, 3);
1433 }
1434
1435 /**
1436  * edid_get_quirks - return quirk flags for a given EDID
1437  * @edid: EDID to process
1438  *
1439  * This tells subsequent routines what fixes they need to apply.
1440  */
1441 static u32 edid_get_quirks(struct edid *edid)
1442 {
1443         struct edid_quirk *quirk;
1444         int i;
1445
1446         for (i = 0; i < ARRAY_SIZE(edid_quirk_list); i++) {
1447                 quirk = &edid_quirk_list[i];
1448
1449                 if (edid_vendor(edid, quirk->vendor) &&
1450                     (EDID_PRODUCT_ID(edid) == quirk->product_id))
1451                         return quirk->quirks;
1452         }
1453
1454         return 0;
1455 }
1456
1457 #define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay)
1458 #define MODE_REFRESH_DIFF(c,t) (abs((c) - (t)))
1459
1460 /**
1461  * edid_fixup_preferred - set preferred modes based on quirk list
1462  * @connector: has mode list to fix up
1463  * @quirks: quirks list
1464  *
1465  * Walk the mode list for @connector, clearing the preferred status
1466  * on existing modes and setting it anew for the right mode ala @quirks.
1467  */
1468 static void edid_fixup_preferred(struct drm_connector *connector,
1469                                  u32 quirks)
1470 {
1471         struct drm_display_mode *t, *cur_mode, *preferred_mode;
1472         int target_refresh = 0;
1473         int cur_vrefresh, preferred_vrefresh;
1474
1475         if (list_empty(&connector->probed_modes))
1476                 return;
1477
1478         if (quirks & EDID_QUIRK_PREFER_LARGE_60)
1479                 target_refresh = 60;
1480         if (quirks & EDID_QUIRK_PREFER_LARGE_75)
1481                 target_refresh = 75;
1482
1483         preferred_mode = list_first_entry(&connector->probed_modes,
1484                                           struct drm_display_mode, head);
1485
1486         list_for_each_entry_safe(cur_mode, t, &connector->probed_modes, head) {
1487                 cur_mode->type &= ~DRM_MODE_TYPE_PREFERRED;
1488
1489                 if (cur_mode == preferred_mode)
1490                         continue;
1491
1492                 /* Largest mode is preferred */
1493                 if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode))
1494                         preferred_mode = cur_mode;
1495
1496                 cur_vrefresh = cur_mode->vrefresh ?
1497                         cur_mode->vrefresh : drm_mode_vrefresh(cur_mode);
1498                 preferred_vrefresh = preferred_mode->vrefresh ?
1499                         preferred_mode->vrefresh : drm_mode_vrefresh(preferred_mode);
1500                 /* At a given size, try to get closest to target refresh */
1501                 if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) &&
1502                     MODE_REFRESH_DIFF(cur_vrefresh, target_refresh) <
1503                     MODE_REFRESH_DIFF(preferred_vrefresh, target_refresh)) {
1504                         preferred_mode = cur_mode;
1505                 }
1506         }
1507
1508         preferred_mode->type |= DRM_MODE_TYPE_PREFERRED;
1509 }
1510
1511 static bool
1512 mode_is_rb(const struct drm_display_mode *mode)
1513 {
1514         return (mode->htotal - mode->hdisplay == 160) &&
1515                (mode->hsync_end - mode->hdisplay == 80) &&
1516                (mode->hsync_end - mode->hsync_start == 32) &&
1517                (mode->vsync_start - mode->vdisplay == 3);
1518 }
1519
1520 /*
1521  * drm_mode_find_dmt - Create a copy of a mode if present in DMT
1522  * @dev: Device to duplicate against
1523  * @hsize: Mode width
1524  * @vsize: Mode height
1525  * @fresh: Mode refresh rate
1526  * @rb: Mode reduced-blanking-ness
1527  *
1528  * Walk the DMT mode list looking for a match for the given parameters.
1529  *
1530  * Return: A newly allocated copy of the mode, or NULL if not found.
1531  */
1532 struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
1533                                            int hsize, int vsize, int fresh,
1534                                            bool rb)
1535 {
1536         int i;
1537
1538         for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
1539                 const struct drm_display_mode *ptr = &drm_dmt_modes[i];
1540                 if (hsize != ptr->hdisplay)
1541                         continue;
1542                 if (vsize != ptr->vdisplay)
1543                         continue;
1544                 if (fresh != drm_mode_vrefresh(ptr))
1545                         continue;
1546                 if (rb != mode_is_rb(ptr))
1547                         continue;
1548
1549                 return drm_mode_duplicate(dev, ptr);
1550         }
1551
1552         return NULL;
1553 }
1554 EXPORT_SYMBOL(drm_mode_find_dmt);
1555
1556 typedef void detailed_cb(struct detailed_timing *timing, void *closure);
1557
1558 static void
1559 cea_for_each_detailed_block(u8 *ext, detailed_cb *cb, void *closure)
1560 {
1561         int i, n = 0;
1562         u8 d = ext[0x02];
1563         u8 *det_base = ext + d;
1564
1565         n = (127 - d) / 18;
1566         for (i = 0; i < n; i++)
1567                 cb((struct detailed_timing *)(det_base + 18 * i), closure);
1568 }
1569
1570 static void
1571 vtb_for_each_detailed_block(u8 *ext, detailed_cb *cb, void *closure)
1572 {
1573         unsigned int i, n = min((int)ext[0x02], 6);
1574         u8 *det_base = ext + 5;
1575
1576         if (ext[0x01] != 1)
1577                 return; /* unknown version */
1578
1579         for (i = 0; i < n; i++)
1580                 cb((struct detailed_timing *)(det_base + 18 * i), closure);
1581 }
1582
1583 static void
1584 drm_for_each_detailed_block(u8 *raw_edid, detailed_cb *cb, void *closure)
1585 {
1586         int i;
1587         struct edid *edid = (struct edid *)raw_edid;
1588
1589         if (edid == NULL)
1590                 return;
1591
1592         for (i = 0; i < EDID_DETAILED_TIMINGS; i++)
1593                 cb(&(edid->detailed_timings[i]), closure);
1594
1595         for (i = 1; i <= raw_edid[0x7e]; i++) {
1596                 u8 *ext = raw_edid + (i * EDID_LENGTH);
1597                 switch (*ext) {
1598                 case CEA_EXT:
1599                         cea_for_each_detailed_block(ext, cb, closure);
1600                         break;
1601                 case VTB_EXT:
1602                         vtb_for_each_detailed_block(ext, cb, closure);
1603                         break;
1604                 default:
1605                         break;
1606                 }
1607         }
1608 }
1609
1610 static void
1611 is_rb(struct detailed_timing *t, void *data)
1612 {
1613         u8 *r = (u8 *)t;
1614         if (r[3] == EDID_DETAIL_MONITOR_RANGE)
1615                 if (r[15] & 0x10)
1616                         *(bool *)data = true;
1617 }
1618
1619 /* EDID 1.4 defines this explicitly.  For EDID 1.3, we guess, badly. */
1620 static bool
1621 drm_monitor_supports_rb(struct edid *edid)
1622 {
1623         if (edid->revision >= 4) {
1624                 bool ret = false;
1625                 drm_for_each_detailed_block((u8 *)edid, is_rb, &ret);
1626                 return ret;
1627         }
1628
1629         return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0);
1630 }
1631
1632 static void
1633 find_gtf2(struct detailed_timing *t, void *data)
1634 {
1635         u8 *r = (u8 *)t;
1636         if (r[3] == EDID_DETAIL_MONITOR_RANGE && r[10] == 0x02)
1637                 *(u8 **)data = r;
1638 }
1639
1640 /* Secondary GTF curve kicks in above some break frequency */
1641 static int
1642 drm_gtf2_hbreak(struct edid *edid)
1643 {
1644         u8 *r = NULL;
1645         drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r);
1646         return r ? (r[12] * 2) : 0;
1647 }
1648
1649 static int
1650 drm_gtf2_2c(struct edid *edid)
1651 {
1652         u8 *r = NULL;
1653         drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r);
1654         return r ? r[13] : 0;
1655 }
1656
1657 static int
1658 drm_gtf2_m(struct edid *edid)
1659 {
1660         u8 *r = NULL;
1661         drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r);
1662         return r ? (r[15] << 8) + r[14] : 0;
1663 }
1664
1665 static int
1666 drm_gtf2_k(struct edid *edid)
1667 {
1668         u8 *r = NULL;
1669         drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r);
1670         return r ? r[16] : 0;
1671 }
1672
1673 static int
1674 drm_gtf2_2j(struct edid *edid)
1675 {
1676         u8 *r = NULL;
1677         drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r);
1678         return r ? r[17] : 0;
1679 }
1680
1681 /**
1682  * standard_timing_level - get std. timing level(CVT/GTF/DMT)
1683  * @edid: EDID block to scan
1684  */
1685 static int standard_timing_level(struct edid *edid)
1686 {
1687         if (edid->revision >= 2) {
1688                 if (edid->revision >= 4 && (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF))
1689                         return LEVEL_CVT;
1690                 if (drm_gtf2_hbreak(edid))
1691                         return LEVEL_GTF2;
1692                 return LEVEL_GTF;
1693         }
1694         return LEVEL_DMT;
1695 }
1696
1697 /*
1698  * 0 is reserved.  The spec says 0x01 fill for unused timings.  Some old
1699  * monitors fill with ascii space (0x20) instead.
1700  */
1701 static int
1702 bad_std_timing(u8 a, u8 b)
1703 {
1704         return (a == 0x00 && b == 0x00) ||
1705                (a == 0x01 && b == 0x01) ||
1706                (a == 0x20 && b == 0x20);
1707 }
1708
1709 /**
1710  * drm_mode_std - convert standard mode info (width, height, refresh) into mode
1711  * @connector: connector of for the EDID block
1712  * @edid: EDID block to scan
1713  * @t: standard timing params
1714  *
1715  * Take the standard timing params (in this case width, aspect, and refresh)
1716  * and convert them into a real mode using CVT/GTF/DMT.
1717  */
1718 static struct drm_display_mode *
1719 drm_mode_std(struct drm_connector *connector, struct edid *edid,
1720              struct std_timing *t)
1721 {
1722         struct drm_device *dev = connector->dev;
1723         struct drm_display_mode *m, *mode = NULL;
1724         int hsize, vsize;
1725         int vrefresh_rate;
1726         unsigned aspect_ratio = (t->vfreq_aspect & EDID_TIMING_ASPECT_MASK)
1727                 >> EDID_TIMING_ASPECT_SHIFT;
1728         unsigned vfreq = (t->vfreq_aspect & EDID_TIMING_VFREQ_MASK)
1729                 >> EDID_TIMING_VFREQ_SHIFT;
1730         int timing_level = standard_timing_level(edid);
1731
1732         if (bad_std_timing(t->hsize, t->vfreq_aspect))
1733                 return NULL;
1734
1735         /* According to the EDID spec, the hdisplay = hsize * 8 + 248 */
1736         hsize = t->hsize * 8 + 248;
1737         /* vrefresh_rate = vfreq + 60 */
1738         vrefresh_rate = vfreq + 60;
1739         /* the vdisplay is calculated based on the aspect ratio */
1740         if (aspect_ratio == 0) {
1741                 if (edid->revision < 3)
1742                         vsize = hsize;
1743                 else
1744                         vsize = (hsize * 10) / 16;
1745         } else if (aspect_ratio == 1)
1746                 vsize = (hsize * 3) / 4;
1747         else if (aspect_ratio == 2)
1748                 vsize = (hsize * 4) / 5;
1749         else
1750                 vsize = (hsize * 9) / 16;
1751
1752         /* HDTV hack, part 1 */
1753         if (vrefresh_rate == 60 &&
1754             ((hsize == 1360 && vsize == 765) ||
1755              (hsize == 1368 && vsize == 769))) {
1756                 hsize = 1366;
1757                 vsize = 768;
1758         }
1759
1760         /*
1761          * If this connector already has a mode for this size and refresh
1762          * rate (because it came from detailed or CVT info), use that
1763          * instead.  This way we don't have to guess at interlace or
1764          * reduced blanking.
1765          */
1766         list_for_each_entry(m, &connector->probed_modes, head)
1767                 if (m->hdisplay == hsize && m->vdisplay == vsize &&
1768                     drm_mode_vrefresh(m) == vrefresh_rate)
1769                         return NULL;
1770
1771         /* HDTV hack, part 2 */
1772         if (hsize == 1366 && vsize == 768 && vrefresh_rate == 60) {
1773                 mode = drm_cvt_mode(dev, 1366, 768, vrefresh_rate, 0, 0,
1774                                     false);
1775                 mode->hdisplay = 1366;
1776                 mode->hsync_start = mode->hsync_start - 1;
1777                 mode->hsync_end = mode->hsync_end - 1;
1778                 return mode;
1779         }
1780
1781         /* check whether it can be found in default mode table */
1782         if (drm_monitor_supports_rb(edid)) {
1783                 mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate,
1784                                          true);
1785                 if (mode)
1786                         return mode;
1787         }
1788         mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate, false);
1789         if (mode)
1790                 return mode;
1791
1792         /* okay, generate it */
1793         switch (timing_level) {
1794         case LEVEL_DMT:
1795                 break;
1796         case LEVEL_GTF:
1797                 mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
1798                 break;
1799         case LEVEL_GTF2:
1800                 /*
1801                  * This is potentially wrong if there's ever a monitor with
1802                  * more than one ranges section, each claiming a different
1803                  * secondary GTF curve.  Please don't do that.
1804                  */
1805                 mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
1806                 if (!mode)
1807                         return NULL;
1808                 if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) {
1809                         drm_mode_destroy(dev, mode);
1810                         mode = drm_gtf_mode_complex(dev, hsize, vsize,
1811                                                     vrefresh_rate, 0, 0,
1812                                                     drm_gtf2_m(edid),
1813                                                     drm_gtf2_2c(edid),
1814                                                     drm_gtf2_k(edid),
1815                                                     drm_gtf2_2j(edid));
1816                 }
1817                 break;
1818         case LEVEL_CVT:
1819                 mode = drm_cvt_mode(dev, hsize, vsize, vrefresh_rate, 0, 0,
1820                                     false);
1821                 break;
1822         }
1823         return mode;
1824 }
1825
1826 /*
1827  * EDID is delightfully ambiguous about how interlaced modes are to be
1828  * encoded.  Our internal representation is of frame height, but some
1829  * HDTV detailed timings are encoded as field height.
1830  *
1831  * The format list here is from CEA, in frame size.  Technically we
1832  * should be checking refresh rate too.  Whatever.
1833  */
1834 static void
1835 drm_mode_do_interlace_quirk(struct drm_display_mode *mode,
1836                             struct detailed_pixel_timing *pt)
1837 {
1838         int i;
1839         static const struct {
1840                 int w, h;
1841         } cea_interlaced[] = {
1842                 { 1920, 1080 },
1843                 {  720,  480 },
1844                 { 1440,  480 },
1845                 { 2880,  480 },
1846                 {  720,  576 },
1847                 { 1440,  576 },
1848                 { 2880,  576 },
1849         };
1850
1851         if (!(pt->misc & DRM_EDID_PT_INTERLACED))
1852                 return;
1853
1854         for (i = 0; i < ARRAY_SIZE(cea_interlaced); i++) {
1855                 if ((mode->hdisplay == cea_interlaced[i].w) &&
1856                     (mode->vdisplay == cea_interlaced[i].h / 2)) {
1857                         mode->vdisplay *= 2;
1858                         mode->vsync_start *= 2;
1859                         mode->vsync_end *= 2;
1860                         mode->vtotal *= 2;
1861                         mode->vtotal |= 1;
1862                 }
1863         }
1864
1865         mode->flags |= DRM_MODE_FLAG_INTERLACE;
1866 }
1867
1868 /**
1869  * drm_mode_detailed - create a new mode from an EDID detailed timing section
1870  * @dev: DRM device (needed to create new mode)
1871  * @edid: EDID block
1872  * @timing: EDID detailed timing info
1873  * @quirks: quirks to apply
1874  *
1875  * An EDID detailed timing block contains enough info for us to create and
1876  * return a new struct drm_display_mode.
1877  */
1878 static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,
1879                                                   struct edid *edid,
1880                                                   struct detailed_timing *timing,
1881                                                   u32 quirks)
1882 {
1883         struct drm_display_mode *mode;
1884         struct detailed_pixel_timing *pt = &timing->data.pixel_data;
1885         unsigned hactive = (pt->hactive_hblank_hi & 0xf0) << 4 | pt->hactive_lo;
1886         unsigned vactive = (pt->vactive_vblank_hi & 0xf0) << 4 | pt->vactive_lo;
1887         unsigned hblank = (pt->hactive_hblank_hi & 0xf) << 8 | pt->hblank_lo;
1888         unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo;
1889         unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | pt->hsync_offset_lo;
1890         unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | pt->hsync_pulse_width_lo;
1891         unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) << 2 | pt->vsync_offset_pulse_width_lo >> 4;
1892         unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | (pt->vsync_offset_pulse_width_lo & 0xf);
1893
1894         /* ignore tiny modes */
1895         if (hactive < 64 || vactive < 64)
1896                 return NULL;
1897
1898         if (pt->misc & DRM_EDID_PT_STEREO) {
1899                 DRM_DEBUG_KMS("stereo mode not supported\n");
1900                 return NULL;
1901         }
1902         if (!(pt->misc & DRM_EDID_PT_SEPARATE_SYNC)) {
1903                 DRM_DEBUG_KMS("composite sync not supported\n");
1904         }
1905
1906         /* it is incorrect if hsync/vsync width is zero */
1907         if (!hsync_pulse_width || !vsync_pulse_width) {
1908                 DRM_DEBUG_KMS("Incorrect Detailed timing. "
1909                                 "Wrong Hsync/Vsync pulse width\n");
1910                 return NULL;
1911         }
1912
1913         if (quirks & EDID_QUIRK_FORCE_REDUCED_BLANKING) {
1914                 mode = drm_cvt_mode(dev, hactive, vactive, 60, true, false, false);
1915                 if (!mode)
1916                         return NULL;
1917
1918                 goto set_size;
1919         }
1920
1921         mode = drm_mode_create(dev);
1922         if (!mode)
1923                 return NULL;
1924
1925         if (quirks & EDID_QUIRK_135_CLOCK_TOO_HIGH)
1926                 timing->pixel_clock = cpu_to_le16(1088);
1927
1928         mode->clock = le16_to_cpu(timing->pixel_clock) * 10;
1929
1930         mode->hdisplay = hactive;
1931         mode->hsync_start = mode->hdisplay + hsync_offset;
1932         mode->hsync_end = mode->hsync_start + hsync_pulse_width;
1933         mode->htotal = mode->hdisplay + hblank;
1934
1935         mode->vdisplay = vactive;
1936         mode->vsync_start = mode->vdisplay + vsync_offset;
1937         mode->vsync_end = mode->vsync_start + vsync_pulse_width;
1938         mode->vtotal = mode->vdisplay + vblank;
1939
1940         /* Some EDIDs have bogus h/vtotal values */
1941         if (mode->hsync_end > mode->htotal)
1942                 mode->htotal = mode->hsync_end + 1;
1943         if (mode->vsync_end > mode->vtotal)
1944                 mode->vtotal = mode->vsync_end + 1;
1945
1946         drm_mode_do_interlace_quirk(mode, pt);
1947
1948         if (quirks & EDID_QUIRK_DETAILED_SYNC_PP) {
1949                 pt->misc |= DRM_EDID_PT_HSYNC_POSITIVE | DRM_EDID_PT_VSYNC_POSITIVE;
1950         }
1951
1952         mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ?
1953                 DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
1954         mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ?
1955                 DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
1956
1957 set_size:
1958         mode->width_mm = pt->width_mm_lo | (pt->width_height_mm_hi & 0xf0) << 4;
1959         mode->height_mm = pt->height_mm_lo | (pt->width_height_mm_hi & 0xf) << 8;
1960
1961         if (quirks & EDID_QUIRK_DETAILED_IN_CM) {
1962                 mode->width_mm *= 10;
1963                 mode->height_mm *= 10;
1964         }
1965
1966         if (quirks & EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE) {
1967                 mode->width_mm = edid->width_cm * 10;
1968                 mode->height_mm = edid->height_cm * 10;
1969         }
1970
1971         mode->type = DRM_MODE_TYPE_DRIVER;
1972         mode->vrefresh = drm_mode_vrefresh(mode);
1973         drm_mode_set_name(mode);
1974
1975         return mode;
1976 }
1977
1978 static bool
1979 mode_in_hsync_range(const struct drm_display_mode *mode,
1980                     struct edid *edid, u8 *t)
1981 {
1982         int hsync, hmin, hmax;
1983
1984         hmin = t[7];
1985         if (edid->revision >= 4)
1986             hmin += ((t[4] & 0x04) ? 255 : 0);
1987         hmax = t[8];
1988         if (edid->revision >= 4)
1989             hmax += ((t[4] & 0x08) ? 255 : 0);
1990         hsync = drm_mode_hsync(mode);
1991
1992         return (hsync <= hmax && hsync >= hmin);
1993 }
1994
1995 static bool
1996 mode_in_vsync_range(const struct drm_display_mode *mode,
1997                     struct edid *edid, u8 *t)
1998 {
1999         int vsync, vmin, vmax;
2000
2001         vmin = t[5];
2002         if (edid->revision >= 4)
2003             vmin += ((t[4] & 0x01) ? 255 : 0);
2004         vmax = t[6];
2005         if (edid->revision >= 4)
2006             vmax += ((t[4] & 0x02) ? 255 : 0);
2007         vsync = drm_mode_vrefresh(mode);
2008
2009         return (vsync <= vmax && vsync >= vmin);
2010 }
2011
2012 static u32
2013 range_pixel_clock(struct edid *edid, u8 *t)
2014 {
2015         /* unspecified */
2016         if (t[9] == 0 || t[9] == 255)
2017                 return 0;
2018
2019         /* 1.4 with CVT support gives us real precision, yay */
2020         if (edid->revision >= 4 && t[10] == 0x04)
2021                 return (t[9] * 10000) - ((t[12] >> 2) * 250);
2022
2023         /* 1.3 is pathetic, so fuzz up a bit */
2024         return t[9] * 10000 + 5001;
2025 }
2026
2027 static bool
2028 mode_in_range(const struct drm_display_mode *mode, struct edid *edid,
2029               struct detailed_timing *timing)
2030 {
2031         u32 max_clock;
2032         u8 *t = (u8 *)timing;
2033
2034         if (!mode_in_hsync_range(mode, edid, t))
2035                 return false;
2036
2037         if (!mode_in_vsync_range(mode, edid, t))
2038                 return false;
2039
2040         if ((max_clock = range_pixel_clock(edid, t)))
2041                 if (mode->clock > max_clock)
2042                         return false;
2043
2044         /* 1.4 max horizontal check */
2045         if (edid->revision >= 4 && t[10] == 0x04)
2046                 if (t[13] && mode->hdisplay > 8 * (t[13] + (256 * (t[12]&0x3))))
2047                         return false;
2048
2049         if (mode_is_rb(mode) && !drm_monitor_supports_rb(edid))
2050                 return false;
2051
2052         return true;
2053 }
2054
2055 static bool valid_inferred_mode(const struct drm_connector *connector,
2056                                 const struct drm_display_mode *mode)
2057 {
2058         const struct drm_display_mode *m;
2059         bool ok = false;
2060
2061         list_for_each_entry(m, &connector->probed_modes, head) {
2062                 if (mode->hdisplay == m->hdisplay &&
2063                     mode->vdisplay == m->vdisplay &&
2064                     drm_mode_vrefresh(mode) == drm_mode_vrefresh(m))
2065                         return false; /* duplicated */
2066                 if (mode->hdisplay <= m->hdisplay &&
2067                     mode->vdisplay <= m->vdisplay)
2068                         ok = true;
2069         }
2070         return ok;
2071 }
2072
2073 static int
2074 drm_dmt_modes_for_range(struct drm_connector *connector, struct edid *edid,
2075                         struct detailed_timing *timing)
2076 {
2077         int i, modes = 0;
2078         struct drm_display_mode *newmode;
2079         struct drm_device *dev = connector->dev;
2080
2081         for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
2082                 if (mode_in_range(drm_dmt_modes + i, edid, timing) &&
2083                     valid_inferred_mode(connector, drm_dmt_modes + i)) {
2084                         newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]);
2085                         if (newmode) {
2086                                 drm_mode_probed_add(connector, newmode);
2087                                 modes++;
2088                         }
2089                 }
2090         }
2091
2092         return modes;
2093 }
2094
2095 /* fix up 1366x768 mode from 1368x768;
2096  * GFT/CVT can't express 1366 width which isn't dividable by 8
2097  */
2098 static void fixup_mode_1366x768(struct drm_display_mode *mode)
2099 {
2100         if (mode->hdisplay == 1368 && mode->vdisplay == 768) {
2101                 mode->hdisplay = 1366;
2102                 mode->hsync_start--;
2103                 mode->hsync_end--;
2104                 drm_mode_set_name(mode);
2105         }
2106 }
2107
2108 static int
2109 drm_gtf_modes_for_range(struct drm_connector *connector, struct edid *edid,
2110                         struct detailed_timing *timing)
2111 {
2112         int i, modes = 0;
2113         struct drm_display_mode *newmode;
2114         struct drm_device *dev = connector->dev;
2115
2116         for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
2117                 const struct minimode *m = &extra_modes[i];
2118                 newmode = drm_gtf_mode(dev, m->w, m->h, m->r, 0, 0);
2119                 if (!newmode)
2120                         return modes;
2121
2122                 fixup_mode_1366x768(newmode);
2123                 if (!mode_in_range(newmode, edid, timing) ||
2124                     !valid_inferred_mode(connector, newmode)) {
2125                         drm_mode_destroy(dev, newmode);
2126                         continue;
2127                 }
2128
2129                 drm_mode_probed_add(connector, newmode);
2130                 modes++;
2131         }
2132
2133         return modes;
2134 }
2135
2136 static int
2137 drm_cvt_modes_for_range(struct drm_connector *connector, struct edid *edid,
2138                         struct detailed_timing *timing)
2139 {
2140         int i, modes = 0;
2141         struct drm_display_mode *newmode;
2142         struct drm_device *dev = connector->dev;
2143         bool rb = drm_monitor_supports_rb(edid);
2144
2145         for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
2146                 const struct minimode *m = &extra_modes[i];
2147                 newmode = drm_cvt_mode(dev, m->w, m->h, m->r, rb, 0, 0);
2148                 if (!newmode)
2149                         return modes;
2150
2151                 fixup_mode_1366x768(newmode);
2152                 if (!mode_in_range(newmode, edid, timing) ||
2153                     !valid_inferred_mode(connector, newmode)) {
2154                         drm_mode_destroy(dev, newmode);
2155                         continue;
2156                 }
2157
2158                 drm_mode_probed_add(connector, newmode);
2159                 modes++;
2160         }
2161
2162         return modes;
2163 }
2164
2165 static void
2166 do_inferred_modes(struct detailed_timing *timing, void *c)
2167 {
2168         struct detailed_mode_closure *closure = c;
2169         struct detailed_non_pixel *data = &timing->data.other_data;
2170         struct detailed_data_monitor_range *range = &data->data.range;
2171
2172         if (data->type != EDID_DETAIL_MONITOR_RANGE)
2173                 return;
2174
2175         closure->modes += drm_dmt_modes_for_range(closure->connector,
2176                                                   closure->edid,
2177                                                   timing);
2178         
2179         if (!version_greater(closure->edid, 1, 1))
2180                 return; /* GTF not defined yet */
2181
2182         switch (range->flags) {
2183         case 0x02: /* secondary gtf, XXX could do more */
2184         case 0x00: /* default gtf */
2185                 closure->modes += drm_gtf_modes_for_range(closure->connector,
2186                                                           closure->edid,
2187                                                           timing);
2188                 break;
2189         case 0x04: /* cvt, only in 1.4+ */
2190                 if (!version_greater(closure->edid, 1, 3))
2191                         break;
2192
2193                 closure->modes += drm_cvt_modes_for_range(closure->connector,
2194                                                           closure->edid,
2195                                                           timing);
2196                 break;
2197         case 0x01: /* just the ranges, no formula */
2198         default:
2199                 break;
2200         }
2201 }
2202
2203 static int
2204 add_inferred_modes(struct drm_connector *connector, struct edid *edid)
2205 {
2206         struct detailed_mode_closure closure = {
2207                 .connector = connector,
2208                 .edid = edid,
2209         };
2210
2211         if (version_greater(edid, 1, 0))
2212                 drm_for_each_detailed_block((u8 *)edid, do_inferred_modes,
2213                                             &closure);
2214
2215         return closure.modes;
2216 }
2217
2218 static int
2219 drm_est3_modes(struct drm_connector *connector, struct detailed_timing *timing)
2220 {
2221         int i, j, m, modes = 0;
2222         struct drm_display_mode *mode;
2223         u8 *est = ((u8 *)timing) + 5;
2224
2225         for (i = 0; i < 6; i++) {
2226                 for (j = 7; j >= 0; j--) {
2227                         m = (i * 8) + (7 - j);
2228                         if (m >= ARRAY_SIZE(est3_modes))
2229                                 break;
2230                         if (est[i] & (1 << j)) {
2231                                 mode = drm_mode_find_dmt(connector->dev,
2232                                                          est3_modes[m].w,
2233                                                          est3_modes[m].h,
2234                                                          est3_modes[m].r,
2235                                                          est3_modes[m].rb);
2236                                 if (mode) {
2237                                         drm_mode_probed_add(connector, mode);
2238                                         modes++;
2239                                 }
2240                         }
2241                 }
2242         }
2243
2244         return modes;
2245 }
2246
2247 static void
2248 do_established_modes(struct detailed_timing *timing, void *c)
2249 {
2250         struct detailed_mode_closure *closure = c;
2251         struct detailed_non_pixel *data = &timing->data.other_data;
2252
2253         if (data->type == EDID_DETAIL_EST_TIMINGS)
2254                 closure->modes += drm_est3_modes(closure->connector, timing);
2255 }
2256
2257 /**
2258  * add_established_modes - get est. modes from EDID and add them
2259  * @connector: connector to add mode(s) to
2260  * @edid: EDID block to scan
2261  *
2262  * Each EDID block contains a bitmap of the supported "established modes" list
2263  * (defined above).  Tease them out and add them to the global modes list.
2264  */
2265 static int
2266 add_established_modes(struct drm_connector *connector, struct edid *edid)
2267 {
2268         struct drm_device *dev = connector->dev;
2269         unsigned long est_bits = edid->established_timings.t1 |
2270                 (edid->established_timings.t2 << 8) |
2271                 ((edid->established_timings.mfg_rsvd & 0x80) << 9);
2272         int i, modes = 0;
2273         struct detailed_mode_closure closure = {
2274                 .connector = connector,
2275                 .edid = edid,
2276         };
2277
2278         for (i = 0; i <= EDID_EST_TIMINGS; i++) {
2279                 if (est_bits & (1<<i)) {
2280                         struct drm_display_mode *newmode;
2281                         newmode = drm_mode_duplicate(dev, &edid_est_modes[i]);
2282                         if (newmode) {
2283                                 drm_mode_probed_add(connector, newmode);
2284                                 modes++;
2285                         }
2286                 }
2287         }
2288
2289         if (version_greater(edid, 1, 0))
2290                     drm_for_each_detailed_block((u8 *)edid,
2291                                                 do_established_modes, &closure);
2292
2293         return modes + closure.modes;
2294 }
2295
2296 static void
2297 do_standard_modes(struct detailed_timing *timing, void *c)
2298 {
2299         struct detailed_mode_closure *closure = c;
2300         struct detailed_non_pixel *data = &timing->data.other_data;
2301         struct drm_connector *connector = closure->connector;
2302         struct edid *edid = closure->edid;
2303
2304         if (data->type == EDID_DETAIL_STD_MODES) {
2305                 int i;
2306                 for (i = 0; i < 6; i++) {
2307                         struct std_timing *std;
2308                         struct drm_display_mode *newmode;
2309
2310                         std = &data->data.timings[i];
2311                         newmode = drm_mode_std(connector, edid, std);
2312                         if (newmode) {
2313                                 drm_mode_probed_add(connector, newmode);
2314                                 closure->modes++;
2315                         }
2316                 }
2317         }
2318 }
2319
2320 /**
2321  * add_standard_modes - get std. modes from EDID and add them
2322  * @connector: connector to add mode(s) to
2323  * @edid: EDID block to scan
2324  *
2325  * Standard modes can be calculated using the appropriate standard (DMT,
2326  * GTF or CVT. Grab them from @edid and add them to the list.
2327  */
2328 static int
2329 add_standard_modes(struct drm_connector *connector, struct edid *edid)
2330 {
2331         int i, modes = 0;
2332         struct detailed_mode_closure closure = {
2333                 .connector = connector,
2334                 .edid = edid,
2335         };
2336
2337         for (i = 0; i < EDID_STD_TIMINGS; i++) {
2338                 struct drm_display_mode *newmode;
2339
2340                 newmode = drm_mode_std(connector, edid,
2341                                        &edid->standard_timings[i]);
2342                 if (newmode) {
2343                         drm_mode_probed_add(connector, newmode);
2344                         modes++;
2345                 }
2346         }
2347
2348         if (version_greater(edid, 1, 0))
2349                 drm_for_each_detailed_block((u8 *)edid, do_standard_modes,
2350                                             &closure);
2351
2352         /* XXX should also look for standard codes in VTB blocks */
2353
2354         return modes + closure.modes;
2355 }
2356
2357 static int drm_cvt_modes(struct drm_connector *connector,
2358                          struct detailed_timing *timing)
2359 {
2360         int i, j, modes = 0;
2361         struct drm_display_mode *newmode;
2362         struct drm_device *dev = connector->dev;
2363         struct cvt_timing *cvt;
2364         const int rates[] = { 60, 85, 75, 60, 50 };
2365         const u8 empty[3] = { 0, 0, 0 };
2366
2367         for (i = 0; i < 4; i++) {
2368                 int uninitialized_var(width), height;
2369                 cvt = &(timing->data.other_data.data.cvt[i]);
2370
2371                 if (!memcmp(cvt->code, empty, 3))
2372                         continue;
2373
2374                 height = (cvt->code[0] + ((cvt->code[1] & 0xf0) << 4) + 1) * 2;
2375                 switch (cvt->code[1] & 0x0c) {
2376                 case 0x00:
2377                         width = height * 4 / 3;
2378                         break;
2379                 case 0x04:
2380                         width = height * 16 / 9;
2381                         break;
2382                 case 0x08:
2383                         width = height * 16 / 10;
2384                         break;
2385                 case 0x0c:
2386                         width = height * 15 / 9;
2387                         break;
2388                 }
2389
2390                 for (j = 1; j < 5; j++) {
2391                         if (cvt->code[2] & (1 << j)) {
2392                                 newmode = drm_cvt_mode(dev, width, height,
2393                                                        rates[j], j == 0,
2394                                                        false, false);
2395                                 if (newmode) {
2396                                         drm_mode_probed_add(connector, newmode);
2397                                         modes++;
2398                                 }
2399                         }
2400                 }
2401         }
2402
2403         return modes;
2404 }
2405
2406 static void
2407 do_cvt_mode(struct detailed_timing *timing, void *c)
2408 {
2409         struct detailed_mode_closure *closure = c;
2410         struct detailed_non_pixel *data = &timing->data.other_data;
2411
2412         if (data->type == EDID_DETAIL_CVT_3BYTE)
2413                 closure->modes += drm_cvt_modes(closure->connector, timing);
2414 }
2415
2416 static int
2417 add_cvt_modes(struct drm_connector *connector, struct edid *edid)
2418 {       
2419         struct detailed_mode_closure closure = {
2420                 .connector = connector,
2421                 .edid = edid,
2422         };
2423
2424         if (version_greater(edid, 1, 2))
2425                 drm_for_each_detailed_block((u8 *)edid, do_cvt_mode, &closure);
2426
2427         /* XXX should also look for CVT codes in VTB blocks */
2428
2429         return closure.modes;
2430 }
2431
2432 static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode);
2433
2434 static void
2435 do_detailed_mode(struct detailed_timing *timing, void *c)
2436 {
2437         struct detailed_mode_closure *closure = c;
2438         struct drm_display_mode *newmode;
2439
2440         if (timing->pixel_clock) {
2441                 newmode = drm_mode_detailed(closure->connector->dev,
2442                                             closure->edid, timing,
2443                                             closure->quirks);
2444                 if (!newmode)
2445                         return;
2446
2447                 if (closure->preferred)
2448                         newmode->type |= DRM_MODE_TYPE_PREFERRED;
2449
2450                 /*
2451                  * Detailed modes are limited to 10kHz pixel clock resolution,
2452                  * so fix up anything that looks like CEA/HDMI mode, but the clock
2453                  * is just slightly off.
2454                  */
2455                 fixup_detailed_cea_mode_clock(newmode);
2456
2457                 drm_mode_probed_add(closure->connector, newmode);
2458                 closure->modes++;
2459                 closure->preferred = 0;
2460         }
2461 }
2462
2463 /*
2464  * add_detailed_modes - Add modes from detailed timings
2465  * @connector: attached connector
2466  * @edid: EDID block to scan
2467  * @quirks: quirks to apply
2468  */
2469 static int
2470 add_detailed_modes(struct drm_connector *connector, struct edid *edid,
2471                    u32 quirks)
2472 {
2473         struct detailed_mode_closure closure = {
2474                 .connector = connector,
2475                 .edid = edid,
2476                 .preferred = 1,
2477                 .quirks = quirks,
2478         };
2479
2480         if (closure.preferred && !version_greater(edid, 1, 3))
2481                 closure.preferred =
2482                     (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
2483
2484         drm_for_each_detailed_block((u8 *)edid, do_detailed_mode, &closure);
2485
2486         return closure.modes;
2487 }
2488
2489 #define AUDIO_BLOCK     0x01
2490 #define VIDEO_BLOCK     0x02
2491 #define VENDOR_BLOCK    0x03
2492 #define SPEAKER_BLOCK   0x04
2493 #define VIDEO_CAPABILITY_BLOCK  0x07
2494 #define EDID_BASIC_AUDIO        (1 << 6)
2495 #define EDID_CEA_YCRCB444       (1 << 5)
2496 #define EDID_CEA_YCRCB422       (1 << 4)
2497 #define EDID_CEA_VCDB_QS        (1 << 6)
2498
2499 /*
2500  * Search EDID for CEA extension block.
2501  */
2502 static u8 *drm_find_edid_extension(struct edid *edid, int ext_id)
2503 {
2504         u8 *edid_ext = NULL;
2505         int i;
2506
2507         /* No EDID or EDID extensions */
2508         if (edid == NULL || edid->extensions == 0)
2509                 return NULL;
2510
2511         /* Find CEA extension */
2512         for (i = 0; i < edid->extensions; i++) {
2513                 edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1);
2514                 if (edid_ext[0] == ext_id)
2515                         break;
2516         }
2517
2518         if (i == edid->extensions)
2519                 return NULL;
2520
2521         return edid_ext;
2522 }
2523
2524 static u8 *drm_find_cea_extension(struct edid *edid)
2525 {
2526         return drm_find_edid_extension(edid, CEA_EXT);
2527 }
2528
2529 static u8 *drm_find_displayid_extension(struct edid *edid)
2530 {
2531         return drm_find_edid_extension(edid, DISPLAYID_EXT);
2532 }
2533
2534 /*
2535  * Calculate the alternate clock for the CEA mode
2536  * (60Hz vs. 59.94Hz etc.)
2537  */
2538 static unsigned int
2539 cea_mode_alternate_clock(const struct drm_display_mode *cea_mode)
2540 {
2541         unsigned int clock = cea_mode->clock;
2542
2543         if (cea_mode->vrefresh % 6 != 0)
2544                 return clock;
2545
2546         /*
2547          * edid_cea_modes contains the 59.94Hz
2548          * variant for 240 and 480 line modes,
2549          * and the 60Hz variant otherwise.
2550          */
2551         if (cea_mode->vdisplay == 240 || cea_mode->vdisplay == 480)
2552                 clock = DIV_ROUND_CLOSEST(clock * 1001, 1000);
2553         else
2554                 clock = DIV_ROUND_CLOSEST(clock * 1000, 1001);
2555
2556         return clock;
2557 }
2558
2559 /**
2560  * drm_match_cea_mode - look for a CEA mode matching given mode
2561  * @to_match: display mode
2562  *
2563  * Return: The CEA Video ID (VIC) of the mode or 0 if it isn't a CEA-861
2564  * mode.
2565  */
2566 u8 drm_match_cea_mode(const struct drm_display_mode *to_match)
2567 {
2568         u8 mode;
2569
2570         if (!to_match->clock)
2571                 return 0;
2572
2573         for (mode = 0; mode < ARRAY_SIZE(edid_cea_modes); mode++) {
2574                 const struct drm_display_mode *cea_mode = &edid_cea_modes[mode];
2575                 unsigned int clock1, clock2;
2576
2577                 /* Check both 60Hz and 59.94Hz */
2578                 clock1 = cea_mode->clock;
2579                 clock2 = cea_mode_alternate_clock(cea_mode);
2580
2581                 if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
2582                      KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
2583                     drm_mode_equal_no_clocks_no_stereo(to_match, cea_mode))
2584                         return mode + 1;
2585         }
2586         return 0;
2587 }
2588 EXPORT_SYMBOL(drm_match_cea_mode);
2589
2590 /**
2591  * drm_get_cea_aspect_ratio - get the picture aspect ratio corresponding to
2592  * the input VIC from the CEA mode list
2593  * @video_code: ID given to each of the CEA modes
2594  *
2595  * Returns picture aspect ratio
2596  */
2597 enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code)
2598 {
2599         /* return picture aspect ratio for video_code - 1 to access the
2600          * right array element
2601         */
2602         return edid_cea_modes[video_code-1].picture_aspect_ratio;
2603 }
2604 EXPORT_SYMBOL(drm_get_cea_aspect_ratio);
2605
2606 /*
2607  * Calculate the alternate clock for HDMI modes (those from the HDMI vendor
2608  * specific block).
2609  *
2610  * It's almost like cea_mode_alternate_clock(), we just need to add an
2611  * exception for the VIC 4 mode (4096x2160@24Hz): no alternate clock for this
2612  * one.
2613  */
2614 static unsigned int
2615 hdmi_mode_alternate_clock(const struct drm_display_mode *hdmi_mode)
2616 {
2617         if (hdmi_mode->vdisplay == 4096 && hdmi_mode->hdisplay == 2160)
2618                 return hdmi_mode->clock;
2619
2620         return cea_mode_alternate_clock(hdmi_mode);
2621 }
2622
2623 /*
2624  * drm_match_hdmi_mode - look for a HDMI mode matching given mode
2625  * @to_match: display mode
2626  *
2627  * An HDMI mode is one defined in the HDMI vendor specific block.
2628  *
2629  * Returns the HDMI Video ID (VIC) of the mode or 0 if it isn't one.
2630  */
2631 static u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match)
2632 {
2633         u8 mode;
2634
2635         if (!to_match->clock)
2636                 return 0;
2637
2638         for (mode = 0; mode < ARRAY_SIZE(edid_4k_modes); mode++) {
2639                 const struct drm_display_mode *hdmi_mode = &edid_4k_modes[mode];
2640                 unsigned int clock1, clock2;
2641
2642                 /* Make sure to also match alternate clocks */
2643                 clock1 = hdmi_mode->clock;
2644                 clock2 = hdmi_mode_alternate_clock(hdmi_mode);
2645
2646                 if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
2647                      KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
2648                     drm_mode_equal_no_clocks_no_stereo(to_match, hdmi_mode))
2649                         return mode + 1;
2650         }
2651         return 0;
2652 }
2653
2654 static int
2655 add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid)
2656 {
2657         struct drm_device *dev = connector->dev;
2658         struct drm_display_mode *mode, *tmp;
2659         LIST_HEAD(list);
2660         int modes = 0;
2661
2662         /* Don't add CEA modes if the CEA extension block is missing */
2663         if (!drm_find_cea_extension(edid))
2664                 return 0;
2665
2666         /*
2667          * Go through all probed modes and create a new mode
2668          * with the alternate clock for certain CEA modes.
2669          */
2670         list_for_each_entry(mode, &connector->probed_modes, head) {
2671                 const struct drm_display_mode *cea_mode = NULL;
2672                 struct drm_display_mode *newmode;
2673                 u8 mode_idx = drm_match_cea_mode(mode) - 1;
2674                 unsigned int clock1, clock2;
2675
2676                 if (mode_idx < ARRAY_SIZE(edid_cea_modes)) {
2677                         cea_mode = &edid_cea_modes[mode_idx];
2678                         clock2 = cea_mode_alternate_clock(cea_mode);
2679                 } else {
2680                         mode_idx = drm_match_hdmi_mode(mode) - 1;
2681                         if (mode_idx < ARRAY_SIZE(edid_4k_modes)) {
2682                                 cea_mode = &edid_4k_modes[mode_idx];
2683                                 clock2 = hdmi_mode_alternate_clock(cea_mode);
2684                         }
2685                 }
2686
2687                 if (!cea_mode)
2688                         continue;
2689
2690                 clock1 = cea_mode->clock;
2691
2692                 if (clock1 == clock2)
2693                         continue;
2694
2695                 if (mode->clock != clock1 && mode->clock != clock2)
2696                         continue;
2697
2698                 newmode = drm_mode_duplicate(dev, cea_mode);
2699                 if (!newmode)
2700                         continue;
2701
2702                 /* Carry over the stereo flags */
2703                 newmode->flags |= mode->flags & DRM_MODE_FLAG_3D_MASK;
2704
2705                 /*
2706                  * The current mode could be either variant. Make
2707                  * sure to pick the "other" clock for the new mode.
2708                  */
2709                 if (mode->clock != clock1)
2710                         newmode->clock = clock1;
2711                 else
2712                         newmode->clock = clock2;
2713
2714                 list_add_tail(&newmode->head, &list);
2715         }
2716
2717         list_for_each_entry_safe(mode, tmp, &list, head) {
2718                 list_del(&mode->head);
2719                 drm_mode_probed_add(connector, mode);
2720                 modes++;
2721         }
2722
2723         return modes;
2724 }
2725
2726 static struct drm_display_mode *
2727 drm_display_mode_from_vic_index(struct drm_connector *connector,
2728                                 const u8 *video_db, u8 video_len,
2729                                 u8 video_index)
2730 {
2731         struct drm_device *dev = connector->dev;
2732         struct drm_display_mode *newmode;
2733         u8 cea_mode;
2734
2735         if (video_db == NULL || video_index >= video_len)
2736                 return NULL;
2737
2738         /* CEA modes are numbered 1..127 */
2739         cea_mode = (video_db[video_index] & 127) - 1;
2740         if (cea_mode >= ARRAY_SIZE(edid_cea_modes))
2741                 return NULL;
2742
2743         newmode = drm_mode_duplicate(dev, &edid_cea_modes[cea_mode]);
2744         if (!newmode)
2745                 return NULL;
2746
2747         newmode->vrefresh = 0;
2748
2749         return newmode;
2750 }
2751
2752 static int
2753 do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len)
2754 {
2755         int i, modes = 0;
2756
2757         for (i = 0; i < len; i++) {
2758                 struct drm_display_mode *mode;
2759                 mode = drm_display_mode_from_vic_index(connector, db, len, i);
2760                 if (mode) {
2761                         drm_mode_probed_add(connector, mode);
2762                         modes++;
2763                 }
2764         }
2765
2766         return modes;
2767 }
2768
2769 struct stereo_mandatory_mode {
2770         int width, height, vrefresh;
2771         unsigned int flags;
2772 };
2773
2774 static const struct stereo_mandatory_mode stereo_mandatory_modes[] = {
2775         { 1920, 1080, 24, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
2776         { 1920, 1080, 24, DRM_MODE_FLAG_3D_FRAME_PACKING },
2777         { 1920, 1080, 50,
2778           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF },
2779         { 1920, 1080, 60,
2780           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF },
2781         { 1280, 720,  50, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
2782         { 1280, 720,  50, DRM_MODE_FLAG_3D_FRAME_PACKING },
2783         { 1280, 720,  60, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
2784         { 1280, 720,  60, DRM_MODE_FLAG_3D_FRAME_PACKING }
2785 };
2786
2787 static bool
2788 stereo_match_mandatory(const struct drm_display_mode *mode,
2789                        const struct stereo_mandatory_mode *stereo_mode)
2790 {
2791         unsigned int interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
2792
2793         return mode->hdisplay == stereo_mode->width &&
2794                mode->vdisplay == stereo_mode->height &&
2795                interlaced == (stereo_mode->flags & DRM_MODE_FLAG_INTERLACE) &&
2796                drm_mode_vrefresh(mode) == stereo_mode->vrefresh;
2797 }
2798
2799 static int add_hdmi_mandatory_stereo_modes(struct drm_connector *connector)
2800 {
2801         struct drm_device *dev = connector->dev;
2802         const struct drm_display_mode *mode;
2803         struct list_head stereo_modes;
2804         int modes = 0, i;
2805
2806         INIT_LIST_HEAD(&stereo_modes);
2807
2808         list_for_each_entry(mode, &connector->probed_modes, head) {
2809                 for (i = 0; i < ARRAY_SIZE(stereo_mandatory_modes); i++) {
2810                         const struct stereo_mandatory_mode *mandatory;
2811                         struct drm_display_mode *new_mode;
2812
2813                         if (!stereo_match_mandatory(mode,
2814                                                     &stereo_mandatory_modes[i]))
2815                                 continue;
2816
2817                         mandatory = &stereo_mandatory_modes[i];
2818                         new_mode = drm_mode_duplicate(dev, mode);
2819                         if (!new_mode)
2820                                 continue;
2821
2822                         new_mode->flags |= mandatory->flags;
2823                         list_add_tail(&new_mode->head, &stereo_modes);
2824                         modes++;
2825                 }
2826         }
2827
2828         list_splice_tail(&stereo_modes, &connector->probed_modes);
2829
2830         return modes;
2831 }
2832
2833 static int add_hdmi_mode(struct drm_connector *connector, u8 vic)
2834 {
2835         struct drm_device *dev = connector->dev;
2836         struct drm_display_mode *newmode;
2837
2838         vic--; /* VICs start at 1 */
2839         if (vic >= ARRAY_SIZE(edid_4k_modes)) {
2840                 DRM_ERROR("Unknown HDMI VIC: %d\n", vic);
2841                 return 0;
2842         }
2843
2844         newmode = drm_mode_duplicate(dev, &edid_4k_modes[vic]);
2845         if (!newmode)
2846                 return 0;
2847
2848         drm_mode_probed_add(connector, newmode);
2849
2850         return 1;
2851 }
2852
2853 static int add_3d_struct_modes(struct drm_connector *connector, u16 structure,
2854                                const u8 *video_db, u8 video_len, u8 video_index)
2855 {
2856         struct drm_display_mode *newmode;
2857         int modes = 0;
2858
2859         if (structure & (1 << 0)) {
2860                 newmode = drm_display_mode_from_vic_index(connector, video_db,
2861                                                           video_len,
2862                                                           video_index);
2863                 if (newmode) {
2864                         newmode->flags |= DRM_MODE_FLAG_3D_FRAME_PACKING;
2865                         drm_mode_probed_add(connector, newmode);
2866                         modes++;
2867                 }
2868         }
2869         if (structure & (1 << 6)) {
2870                 newmode = drm_display_mode_from_vic_index(connector, video_db,
2871                                                           video_len,
2872                                                           video_index);
2873                 if (newmode) {
2874                         newmode->flags |= DRM_MODE_FLAG_3D_TOP_AND_BOTTOM;
2875                         drm_mode_probed_add(connector, newmode);
2876                         modes++;
2877                 }
2878         }
2879         if (structure & (1 << 8)) {
2880                 newmode = drm_display_mode_from_vic_index(connector, video_db,
2881                                                           video_len,
2882                                                           video_index);
2883                 if (newmode) {
2884                         newmode->flags |= DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF;
2885                         drm_mode_probed_add(connector, newmode);
2886                         modes++;
2887                 }
2888         }
2889
2890         return modes;
2891 }
2892
2893 /*
2894  * do_hdmi_vsdb_modes - Parse the HDMI Vendor Specific data block
2895  * @connector: connector corresponding to the HDMI sink
2896  * @db: start of the CEA vendor specific block
2897  * @len: length of the CEA block payload, ie. one can access up to db[len]
2898  *
2899  * Parses the HDMI VSDB looking for modes to add to @connector. This function
2900  * also adds the stereo 3d modes when applicable.
2901  */
2902 static int
2903 do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len,
2904                    const u8 *video_db, u8 video_len)
2905 {
2906         int modes = 0, offset = 0, i, multi_present = 0, multi_len;
2907         u8 vic_len, hdmi_3d_len = 0;
2908         u16 mask;
2909         u16 structure_all;
2910
2911         if (len < 8)
2912                 goto out;
2913
2914         /* no HDMI_Video_Present */
2915         if (!(db[8] & (1 << 5)))
2916                 goto out;
2917
2918         /* Latency_Fields_Present */
2919         if (db[8] & (1 << 7))
2920                 offset += 2;
2921
2922         /* I_Latency_Fields_Present */
2923         if (db[8] & (1 << 6))
2924                 offset += 2;
2925
2926         /* the declared length is not long enough for the 2 first bytes
2927          * of additional video format capabilities */
2928         if (len < (8 + offset + 2))
2929                 goto out;
2930
2931         /* 3D_Present */
2932         offset++;
2933         if (db[8 + offset] & (1 << 7)) {
2934                 modes += add_hdmi_mandatory_stereo_modes(connector);
2935
2936                 /* 3D_Multi_present */
2937                 multi_present = (db[8 + offset] & 0x60) >> 5;
2938         }
2939
2940         offset++;
2941         vic_len = db[8 + offset] >> 5;
2942         hdmi_3d_len = db[8 + offset] & 0x1f;
2943
2944         for (i = 0; i < vic_len && len >= (9 + offset + i); i++) {
2945                 u8 vic;
2946
2947                 vic = db[9 + offset + i];
2948                 modes += add_hdmi_mode(connector, vic);
2949         }
2950         offset += 1 + vic_len;
2951
2952         if (multi_present == 1)
2953                 multi_len = 2;
2954         else if (multi_present == 2)
2955                 multi_len = 4;
2956         else
2957                 multi_len = 0;
2958
2959         if (len < (8 + offset + hdmi_3d_len - 1))
2960                 goto out;
2961
2962         if (hdmi_3d_len < multi_len)
2963                 goto out;
2964
2965         if (multi_present == 1 || multi_present == 2) {
2966                 /* 3D_Structure_ALL */
2967                 structure_all = (db[8 + offset] << 8) | db[9 + offset];
2968
2969                 /* check if 3D_MASK is present */
2970                 if (multi_present == 2)
2971                         mask = (db[10 + offset] << 8) | db[11 + offset];
2972                 else
2973                         mask = 0xffff;
2974
2975                 for (i = 0; i < 16; i++) {
2976                         if (mask & (1 << i))
2977                                 modes += add_3d_struct_modes(connector,
2978                                                 structure_all,
2979                                                 video_db,
2980                                                 video_len, i);
2981                 }
2982         }
2983
2984         offset += multi_len;
2985
2986         for (i = 0; i < (hdmi_3d_len - multi_len); i++) {
2987                 int vic_index;
2988                 struct drm_display_mode *newmode = NULL;
2989                 unsigned int newflag = 0;
2990                 bool detail_present;
2991
2992                 detail_present = ((db[8 + offset + i] & 0x0f) > 7);
2993
2994                 if (detail_present && (i + 1 == hdmi_3d_len - multi_len))
2995                         break;
2996
2997                 /* 2D_VIC_order_X */
2998                 vic_index = db[8 + offset + i] >> 4;
2999
3000                 /* 3D_Structure_X */
3001                 switch (db[8 + offset + i] & 0x0f) {
3002                 case 0:
3003                         newflag = DRM_MODE_FLAG_3D_FRAME_PACKING;
3004                         break;
3005                 case 6:
3006                         newflag = DRM_MODE_FLAG_3D_TOP_AND_BOTTOM;
3007                         break;
3008                 case 8:
3009                         /* 3D_Detail_X */
3010                         if ((db[9 + offset + i] >> 4) == 1)
3011                                 newflag = DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF;
3012                         break;
3013                 }
3014
3015                 if (newflag != 0) {
3016                         newmode = drm_display_mode_from_vic_index(connector,
3017                                                                   video_db,
3018                                                                   video_len,
3019                                                                   vic_index);
3020
3021                         if (newmode) {
3022                                 newmode->flags |= newflag;
3023                                 drm_mode_probed_add(connector, newmode);
3024                                 modes++;
3025                         }
3026                 }
3027
3028                 if (detail_present)
3029                         i++;
3030         }
3031
3032 out:
3033         return modes;
3034 }
3035
3036 static int
3037 cea_db_payload_len(const u8 *db)
3038 {
3039         return db[0] & 0x1f;
3040 }
3041
3042 static int
3043 cea_db_tag(const u8 *db)
3044 {
3045         return db[0] >> 5;
3046 }
3047
3048 static int
3049 cea_revision(const u8 *cea)
3050 {
3051         return cea[1];
3052 }
3053
3054 static int
3055 cea_db_offsets(const u8 *cea, int *start, int *end)
3056 {
3057         /* Data block offset in CEA extension block */
3058         *start = 4;
3059         *end = cea[2];
3060         if (*end == 0)
3061                 *end = 127;
3062         if (*end < 4 || *end > 127)
3063                 return -ERANGE;
3064         return 0;
3065 }
3066
3067 static bool cea_db_is_hdmi_vsdb(const u8 *db)
3068 {
3069         int hdmi_id;
3070
3071         if (cea_db_tag(db) != VENDOR_BLOCK)
3072                 return false;
3073
3074         if (cea_db_payload_len(db) < 5)
3075                 return false;
3076
3077         hdmi_id = db[1] | (db[2] << 8) | (db[3] << 16);
3078
3079         return hdmi_id == HDMI_IEEE_OUI;
3080 }
3081
3082 static bool cea_db_is_hdmi_hf_vsdb(const u8 *db)
3083 {
3084         int hdmi_id;
3085
3086         if (cea_db_tag(db) != VENDOR_BLOCK)
3087                 return false;
3088
3089         if (cea_db_payload_len(db) < 7)
3090                 return false;
3091
3092         hdmi_id = db[1] | (db[2] << 8) | (db[3] << 16);
3093
3094         return hdmi_id == HDMI_IEEE_OUI_HF;
3095 }
3096
3097 #define for_each_cea_db(cea, i, start, end) \
3098         for ((i) = (start); (i) < (end) && (i) + cea_db_payload_len(&(cea)[(i)]) < (end); (i) += cea_db_payload_len(&(cea)[(i)]) + 1)
3099
3100 static int
3101 add_cea_modes(struct drm_connector *connector, struct edid *edid)
3102 {
3103         const u8 *cea = drm_find_cea_extension(edid);
3104         const u8 *db, *hdmi = NULL, *video = NULL;
3105         u8 dbl, hdmi_len, video_len = 0;
3106         int modes = 0;
3107
3108         if (cea && cea_revision(cea) >= 3) {
3109                 int i, start, end;
3110
3111                 if (cea_db_offsets(cea, &start, &end))
3112                         return 0;
3113
3114                 for_each_cea_db(cea, i, start, end) {
3115                         db = &cea[i];
3116                         dbl = cea_db_payload_len(db);
3117
3118                         if (cea_db_tag(db) == VIDEO_BLOCK) {
3119                                 video = db + 1;
3120                                 video_len = dbl;
3121                                 modes += do_cea_modes(connector, video, dbl);
3122                         }
3123                         else if (cea_db_is_hdmi_vsdb(db)) {
3124                                 hdmi = db;
3125                                 hdmi_len = dbl;
3126                         }
3127                 }
3128         }
3129
3130         /*
3131          * We parse the HDMI VSDB after having added the cea modes as we will
3132          * be patching their flags when the sink supports stereo 3D.
3133          */
3134         if (hdmi)
3135                 modes += do_hdmi_vsdb_modes(connector, hdmi, hdmi_len, video,
3136                                             video_len);
3137
3138         return modes;
3139 }
3140
3141 static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode)
3142 {
3143         const struct drm_display_mode *cea_mode;
3144         int clock1, clock2, clock;
3145         u8 mode_idx;
3146         const char *type;
3147
3148         mode_idx = drm_match_cea_mode(mode) - 1;
3149         if (mode_idx < ARRAY_SIZE(edid_cea_modes)) {
3150                 type = "CEA";
3151                 cea_mode = &edid_cea_modes[mode_idx];
3152                 clock1 = cea_mode->clock;
3153                 clock2 = cea_mode_alternate_clock(cea_mode);
3154         } else {
3155                 mode_idx = drm_match_hdmi_mode(mode) - 1;
3156                 if (mode_idx < ARRAY_SIZE(edid_4k_modes)) {
3157                         type = "HDMI";
3158                         cea_mode = &edid_4k_modes[mode_idx];
3159                         clock1 = cea_mode->clock;
3160                         clock2 = hdmi_mode_alternate_clock(cea_mode);
3161                 } else {
3162                         return;
3163                 }
3164         }
3165
3166         /* pick whichever is closest */
3167         if (abs(mode->clock - clock1) < abs(mode->clock - clock2))
3168                 clock = clock1;
3169         else
3170                 clock = clock2;
3171
3172         if (mode->clock == clock)
3173                 return;
3174
3175         DRM_DEBUG("detailed mode matches %s VIC %d, adjusting clock %d -> %d\n",
3176                   type, mode_idx + 1, mode->clock, clock);
3177         mode->clock = clock;
3178 }
3179
3180 static void
3181 parse_hdmi_vsdb(struct drm_connector *connector, const u8 *db)
3182 {
3183         u8 len = cea_db_payload_len(db);
3184
3185         if (len >= 6) {
3186                 connector->eld[5] |= (db[6] >> 7) << 1;  /* Supports_AI */
3187                 connector->dvi_dual = db[6] & 1;
3188         }
3189         if (len >= 7)
3190                 connector->max_tmds_clock = db[7] * 5;
3191         if (len >= 8) {
3192                 connector->latency_present[0] = db[8] >> 7;
3193                 connector->latency_present[1] = (db[8] >> 6) & 1;
3194         }
3195         if (len >= 9)
3196                 connector->video_latency[0] = db[9];
3197         if (len >= 10)
3198                 connector->audio_latency[0] = db[10];
3199         if (len >= 11)
3200                 connector->video_latency[1] = db[11];
3201         if (len >= 12)
3202                 connector->audio_latency[1] = db[12];
3203
3204         DRM_DEBUG_KMS("HDMI: DVI dual %d, "
3205                     "max TMDS clock %d, "
3206                     "latency present %d %d, "
3207                     "video latency %d %d, "
3208                     "audio latency %d %d\n",
3209                     connector->dvi_dual,
3210                     connector->max_tmds_clock,
3211               (int) connector->latency_present[0],
3212               (int) connector->latency_present[1],
3213                     connector->video_latency[0],
3214                     connector->video_latency[1],
3215                     connector->audio_latency[0],
3216                     connector->audio_latency[1]);
3217 }
3218
3219 static void
3220 parse_hdmi_hf_vsdb(struct drm_connector *connector, const u8 *db)
3221 {
3222         u8 len = cea_db_payload_len(db);
3223
3224         if (len < 7)
3225                 return;
3226
3227         if (db[4] != 1)
3228                 return; /* invalid version */
3229
3230         connector->max_tmds_char = db[5] * 5;
3231         connector->scdc_present = db[6] & (1 << 7);
3232         connector->rr_capable = db[6] & (1 << 6);
3233         connector->flags_3d = db[6] & 0x7;
3234         connector->lte_340mcsc_scramble = db[6] & (1 << 3);
3235
3236         DRM_DEBUG_KMS("HDMI v2: max TMDS clock %d, "
3237                         "scdc %s, "
3238                         "rr %s, "
3239                         "3D flags 0x%x, "
3240                         "scramble %s\n",
3241                         connector->max_tmds_char,
3242                         connector->scdc_present ? "available" : "not available",
3243                         connector->rr_capable ? "capable" : "not capable",
3244                         connector->flags_3d,
3245                         connector->lte_340mcsc_scramble ?
3246                                 "supported" : "not supported");
3247 }
3248
3249 static void
3250 monitor_name(struct detailed_timing *t, void *data)
3251 {
3252         if (t->data.other_data.type == EDID_DETAIL_MONITOR_NAME)
3253                 *(u8 **)data = t->data.other_data.data.str.str;
3254 }
3255
3256 /**
3257  * drm_edid_to_eld - build ELD from EDID
3258  * @connector: connector corresponding to the HDMI/DP sink
3259  * @edid: EDID to parse
3260  *
3261  * Fill the ELD (EDID-Like Data) buffer for passing to the audio driver. The
3262  * Conn_Type, HDCP and Port_ID ELD fields are left for the graphics driver to
3263  * fill in.
3264  */
3265 void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
3266 {
3267         uint8_t *eld = connector->eld;
3268         u8 *cea;
3269         u8 *name;
3270         u8 *db;
3271         int sad_count = 0;
3272         int mnl;
3273         int dbl;
3274
3275         memset(eld, 0, sizeof(connector->eld));
3276
3277         cea = drm_find_cea_extension(edid);
3278         if (!cea) {
3279                 DRM_DEBUG_KMS("ELD: no CEA Extension found\n");
3280                 return;
3281         }
3282
3283         name = NULL;
3284         drm_for_each_detailed_block((u8 *)edid, monitor_name, &name);
3285         for (mnl = 0; name && mnl < 13; mnl++) {
3286                 if (name[mnl] == 0x0a)
3287                         break;
3288                 eld[20 + mnl] = name[mnl];
3289         }
3290         eld[4] = (cea[1] << 5) | mnl;
3291         DRM_DEBUG_KMS("ELD monitor %s\n", eld + 20);
3292
3293         eld[0] = 2 << 3;                /* ELD version: 2 */
3294
3295         eld[16] = edid->mfg_id[0];
3296         eld[17] = edid->mfg_id[1];
3297         eld[18] = edid->prod_code[0];
3298         eld[19] = edid->prod_code[1];
3299
3300         if (cea_revision(cea) >= 3) {
3301                 int i, start, end;
3302
3303                 if (cea_db_offsets(cea, &start, &end)) {
3304                         start = 0;
3305                         end = 0;
3306                 }
3307
3308                 for_each_cea_db(cea, i, start, end) {
3309                         db = &cea[i];
3310                         dbl = cea_db_payload_len(db);
3311
3312                         switch (cea_db_tag(db)) {
3313                         case AUDIO_BLOCK:
3314                                 /* Audio Data Block, contains SADs */
3315                                 sad_count = dbl / 3;
3316                                 if (dbl >= 1)
3317                                         memcpy(eld + 20 + mnl, &db[1], dbl);
3318                                 break;
3319                         case SPEAKER_BLOCK:
3320                                 /* Speaker Allocation Data Block */
3321                                 if (dbl >= 1)
3322                                         eld[7] = db[1];
3323                                 break;
3324                         case VENDOR_BLOCK:
3325                                 /* HDMI Vendor-Specific Data Block */
3326                                 if (cea_db_is_hdmi_vsdb(db))
3327                                         parse_hdmi_vsdb(connector, db);
3328                                 /* HDMI Forum Vendor-Specific Data Block */
3329                                 else if (cea_db_is_hdmi_hf_vsdb(db))
3330                                         parse_hdmi_hf_vsdb(connector, db);
3331                                 break;
3332                         default:
3333                                 break;
3334                         }
3335                 }
3336         }
3337         eld[5] |= sad_count << 4;
3338
3339         eld[DRM_ELD_BASELINE_ELD_LEN] =
3340                 DIV_ROUND_UP(drm_eld_calc_baseline_block_size(eld), 4);
3341
3342         DRM_DEBUG_KMS("ELD size %d, SAD count %d\n",
3343                       drm_eld_size(eld), sad_count);
3344 }
3345 EXPORT_SYMBOL(drm_edid_to_eld);
3346
3347 /**
3348  * drm_edid_to_sad - extracts SADs from EDID
3349  * @edid: EDID to parse
3350  * @sads: pointer that will be set to the extracted SADs
3351  *
3352  * Looks for CEA EDID block and extracts SADs (Short Audio Descriptors) from it.
3353  *
3354  * Note: The returned pointer needs to be freed using kfree().
3355  *
3356  * Return: The number of found SADs or negative number on error.
3357  */
3358 int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads)
3359 {
3360         int count = 0;
3361         int i, start, end, dbl;
3362         u8 *cea;
3363
3364         cea = drm_find_cea_extension(edid);
3365         if (!cea) {
3366                 DRM_DEBUG_KMS("SAD: no CEA Extension found\n");
3367                 return -ENOENT;
3368         }
3369
3370         if (cea_revision(cea) < 3) {
3371                 DRM_DEBUG_KMS("SAD: wrong CEA revision\n");
3372                 return -ENOTSUPP;
3373         }
3374
3375         if (cea_db_offsets(cea, &start, &end)) {
3376                 DRM_DEBUG_KMS("SAD: invalid data block offsets\n");
3377                 return -EPROTO;
3378         }
3379
3380         for_each_cea_db(cea, i, start, end) {
3381                 u8 *db = &cea[i];
3382
3383                 if (cea_db_tag(db) == AUDIO_BLOCK) {
3384                         int j;
3385                         dbl = cea_db_payload_len(db);
3386
3387                         count = dbl / 3; /* SAD is 3B */
3388                         *sads = kcalloc(count, sizeof(**sads), GFP_KERNEL);
3389                         if (!*sads)
3390                                 return -ENOMEM;
3391                         for (j = 0; j < count; j++) {
3392                                 u8 *sad = &db[1 + j * 3];
3393
3394                                 (*sads)[j].format = (sad[0] & 0x78) >> 3;
3395                                 (*sads)[j].channels = sad[0] & 0x7;
3396                                 (*sads)[j].freq = sad[1] & 0x7F;
3397                                 (*sads)[j].byte2 = sad[2];
3398                         }
3399                         break;
3400                 }
3401         }
3402
3403         return count;
3404 }
3405 EXPORT_SYMBOL(drm_edid_to_sad);
3406
3407 /**
3408  * drm_edid_to_speaker_allocation - extracts Speaker Allocation Data Blocks from EDID
3409  * @edid: EDID to parse
3410  * @sadb: pointer to the speaker block
3411  *
3412  * Looks for CEA EDID block and extracts the Speaker Allocation Data Block from it.
3413  *
3414  * Note: The returned pointer needs to be freed using kfree().
3415  *
3416  * Return: The number of found Speaker Allocation Blocks or negative number on
3417  * error.
3418  */
3419 int drm_edid_to_speaker_allocation(struct edid *edid, u8 **sadb)
3420 {
3421         int count = 0;
3422         int i, start, end, dbl;
3423         const u8 *cea;
3424
3425         cea = drm_find_cea_extension(edid);
3426         if (!cea) {
3427                 DRM_DEBUG_KMS("SAD: no CEA Extension found\n");
3428                 return -ENOENT;
3429         }
3430
3431         if (cea_revision(cea) < 3) {
3432                 DRM_DEBUG_KMS("SAD: wrong CEA revision\n");
3433                 return -ENOTSUPP;
3434         }
3435
3436         if (cea_db_offsets(cea, &start, &end)) {
3437                 DRM_DEBUG_KMS("SAD: invalid data block offsets\n");
3438                 return -EPROTO;
3439         }
3440
3441         for_each_cea_db(cea, i, start, end) {
3442                 const u8 *db = &cea[i];
3443
3444                 if (cea_db_tag(db) == SPEAKER_BLOCK) {
3445                         dbl = cea_db_payload_len(db);
3446
3447                         /* Speaker Allocation Data Block */
3448                         if (dbl == 3) {
3449                                 *sadb = kmemdup(&db[1], dbl, GFP_KERNEL);
3450                                 if (!*sadb)
3451                                         return -ENOMEM;
3452                                 count = dbl;
3453                                 break;
3454                         }
3455                 }
3456         }
3457
3458         return count;
3459 }
3460 EXPORT_SYMBOL(drm_edid_to_speaker_allocation);
3461
3462 /**
3463  * drm_av_sync_delay - compute the HDMI/DP sink audio-video sync delay
3464  * @connector: connector associated with the HDMI/DP sink
3465  * @mode: the display mode
3466  *
3467  * Return: The HDMI/DP sink's audio-video sync delay in milliseconds or 0 if
3468  * the sink doesn't support audio or video.
3469  */
3470 int drm_av_sync_delay(struct drm_connector *connector,
3471                       const struct drm_display_mode *mode)
3472 {
3473         int i = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
3474         int a, v;
3475
3476         if (!connector->latency_present[0])
3477                 return 0;
3478         if (!connector->latency_present[1])
3479                 i = 0;
3480
3481         a = connector->audio_latency[i];
3482         v = connector->video_latency[i];
3483
3484         /*
3485          * HDMI/DP sink doesn't support audio or video?
3486          */
3487         if (a == 255 || v == 255)
3488                 return 0;
3489
3490         /*
3491          * Convert raw EDID values to millisecond.
3492          * Treat unknown latency as 0ms.
3493          */
3494         if (a)
3495                 a = min(2 * (a - 1), 500);
3496         if (v)
3497                 v = min(2 * (v - 1), 500);
3498
3499         return max(v - a, 0);
3500 }
3501 EXPORT_SYMBOL(drm_av_sync_delay);
3502
3503 /**
3504  * drm_select_eld - select one ELD from multiple HDMI/DP sinks
3505  * @encoder: the encoder just changed display mode
3506  *
3507  * It's possible for one encoder to be associated with multiple HDMI/DP sinks.
3508  * The policy is now hard coded to simply use the first HDMI/DP sink's ELD.
3509  *
3510  * Return: The connector associated with the first HDMI/DP sink that has ELD
3511  * attached to it.
3512  */
3513 struct drm_connector *drm_select_eld(struct drm_encoder *encoder)
3514 {
3515         struct drm_connector *connector;
3516         struct drm_device *dev = encoder->dev;
3517
3518         WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
3519         WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
3520
3521         drm_for_each_connector(connector, dev)
3522                 if (connector->encoder == encoder && connector->eld[0])
3523                         return connector;
3524
3525         return NULL;
3526 }
3527 EXPORT_SYMBOL(drm_select_eld);
3528
3529 /**
3530  * drm_detect_hdmi_monitor - detect whether monitor is HDMI
3531  * @edid: monitor EDID information
3532  *
3533  * Parse the CEA extension according to CEA-861-B.
3534  *
3535  * Return: True if the monitor is HDMI, false if not or unknown.
3536  */
3537 bool drm_detect_hdmi_monitor(struct edid *edid)
3538 {
3539         u8 *edid_ext;
3540         int i;
3541         int start_offset, end_offset;
3542
3543         edid_ext = drm_find_cea_extension(edid);
3544         if (!edid_ext)
3545                 return false;
3546
3547         if (cea_db_offsets(edid_ext, &start_offset, &end_offset))
3548                 return false;
3549
3550         /*
3551          * Because HDMI identifier is in Vendor Specific Block,
3552          * search it from all data blocks of CEA extension.
3553          */
3554         for_each_cea_db(edid_ext, i, start_offset, end_offset) {
3555                 if (cea_db_is_hdmi_vsdb(&edid_ext[i]))
3556                         return true;
3557         }
3558
3559         return false;
3560 }
3561 EXPORT_SYMBOL(drm_detect_hdmi_monitor);
3562
3563 /**
3564  * drm_detect_monitor_audio - check monitor audio capability
3565  * @edid: EDID block to scan
3566  *
3567  * Monitor should have CEA extension block.
3568  * If monitor has 'basic audio', but no CEA audio blocks, it's 'basic
3569  * audio' only. If there is any audio extension block and supported
3570  * audio format, assume at least 'basic audio' support, even if 'basic
3571  * audio' is not defined in EDID.
3572  *
3573  * Return: True if the monitor supports audio, false otherwise.
3574  */
3575 bool drm_detect_monitor_audio(struct edid *edid)
3576 {
3577         u8 *edid_ext;
3578         int i, j;
3579         bool has_audio = false;
3580         int start_offset, end_offset;
3581
3582         edid_ext = drm_find_cea_extension(edid);
3583         if (!edid_ext)
3584                 goto end;
3585
3586         has_audio = ((edid_ext[3] & EDID_BASIC_AUDIO) != 0);
3587
3588         if (has_audio) {
3589                 DRM_DEBUG_KMS("Monitor has basic audio support\n");
3590                 goto end;
3591         }
3592
3593         if (cea_db_offsets(edid_ext, &start_offset, &end_offset))
3594                 goto end;
3595
3596         for_each_cea_db(edid_ext, i, start_offset, end_offset) {
3597                 if (cea_db_tag(&edid_ext[i]) == AUDIO_BLOCK) {
3598                         has_audio = true;
3599                         for (j = 1; j < cea_db_payload_len(&edid_ext[i]) + 1; j += 3)
3600                                 DRM_DEBUG_KMS("CEA audio format %d\n",
3601                                               (edid_ext[i + j] >> 3) & 0xf);
3602                         goto end;
3603                 }
3604         }
3605 end:
3606         return has_audio;
3607 }
3608 EXPORT_SYMBOL(drm_detect_monitor_audio);
3609
3610 /**
3611  * drm_rgb_quant_range_selectable - is RGB quantization range selectable?
3612  * @edid: EDID block to scan
3613  *
3614  * Check whether the monitor reports the RGB quantization range selection
3615  * as supported. The AVI infoframe can then be used to inform the monitor
3616  * which quantization range (full or limited) is used.
3617  *
3618  * Return: True if the RGB quantization range is selectable, false otherwise.
3619  */
3620 bool drm_rgb_quant_range_selectable(struct edid *edid)
3621 {
3622         u8 *edid_ext;
3623         int i, start, end;
3624
3625         edid_ext = drm_find_cea_extension(edid);
3626         if (!edid_ext)
3627                 return false;
3628
3629         if (cea_db_offsets(edid_ext, &start, &end))
3630                 return false;
3631
3632         for_each_cea_db(edid_ext, i, start, end) {
3633                 if (cea_db_tag(&edid_ext[i]) == VIDEO_CAPABILITY_BLOCK &&
3634                     cea_db_payload_len(&edid_ext[i]) == 2) {
3635                         DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", edid_ext[i + 2]);
3636                         return edid_ext[i + 2] & EDID_CEA_VCDB_QS;
3637                 }
3638         }
3639
3640         return false;
3641 }
3642 EXPORT_SYMBOL(drm_rgb_quant_range_selectable);
3643
3644 /**
3645  * drm_assign_hdmi_deep_color_info - detect whether monitor supports
3646  * hdmi deep color modes and update drm_display_info if so.
3647  * @edid: monitor EDID information
3648  * @info: Updated with maximum supported deep color bpc and color format
3649  *        if deep color supported.
3650  * @connector: DRM connector, used only for debug output
3651  *
3652  * Parse the CEA extension according to CEA-861-B.
3653  * Return true if HDMI deep color supported, false if not or unknown.
3654  */
3655 static bool drm_assign_hdmi_deep_color_info(struct edid *edid,
3656                                             struct drm_display_info *info,
3657                                             struct drm_connector *connector)
3658 {
3659         u8 *edid_ext, *hdmi;
3660         int i;
3661         int start_offset, end_offset;
3662         unsigned int dc_bpc = 0;
3663
3664         edid_ext = drm_find_cea_extension(edid);
3665         if (!edid_ext)
3666                 return false;
3667
3668         if (cea_db_offsets(edid_ext, &start_offset, &end_offset))
3669                 return false;
3670
3671         /*
3672          * Because HDMI identifier is in Vendor Specific Block,
3673          * search it from all data blocks of CEA extension.
3674          */
3675         for_each_cea_db(edid_ext, i, start_offset, end_offset) {
3676                 if (cea_db_is_hdmi_vsdb(&edid_ext[i])) {
3677                         /* HDMI supports at least 8 bpc */
3678                         info->bpc = 8;
3679
3680                         hdmi = &edid_ext[i];
3681                         if (cea_db_payload_len(hdmi) < 6)
3682                                 return false;
3683
3684                         if (hdmi[6] & DRM_EDID_HDMI_DC_30) {
3685                                 dc_bpc = 10;
3686                                 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_30;
3687                                 DRM_DEBUG("%s: HDMI sink does deep color 30.\n",
3688                                                   connector->name);
3689                         }
3690
3691                         if (hdmi[6] & DRM_EDID_HDMI_DC_36) {
3692                                 dc_bpc = 12;
3693                                 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_36;
3694                                 DRM_DEBUG("%s: HDMI sink does deep color 36.\n",
3695                                                   connector->name);
3696                         }
3697
3698                         if (hdmi[6] & DRM_EDID_HDMI_DC_48) {
3699                                 dc_bpc = 16;
3700                                 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_48;
3701                                 DRM_DEBUG("%s: HDMI sink does deep color 48.\n",
3702                                                   connector->name);
3703                         }
3704
3705                         if (dc_bpc > 0) {
3706                                 DRM_DEBUG("%s: Assigning HDMI sink color depth as %d bpc.\n",
3707                                                   connector->name, dc_bpc);
3708                                 info->bpc = dc_bpc;
3709
3710                                 /*
3711                                  * Deep color support mandates RGB444 support for all video
3712                                  * modes and forbids YCRCB422 support for all video modes per
3713                                  * HDMI 1.3 spec.
3714                                  */
3715                                 info->color_formats = DRM_COLOR_FORMAT_RGB444;
3716
3717                                 /* YCRCB444 is optional according to spec. */
3718                                 if (hdmi[6] & DRM_EDID_HDMI_DC_Y444) {
3719                                         info->color_formats |= DRM_COLOR_FORMAT_YCRCB444;
3720                                         DRM_DEBUG("%s: HDMI sink does YCRCB444 in deep color.\n",
3721                                                           connector->name);
3722                                 }
3723
3724                                 /*
3725                                  * Spec says that if any deep color mode is supported at all,
3726                                  * then deep color 36 bit must be supported.
3727                                  */
3728                                 if (!(hdmi[6] & DRM_EDID_HDMI_DC_36)) {
3729                                         DRM_DEBUG("%s: HDMI sink should do DC_36, but does not!\n",
3730                                                           connector->name);
3731                                 }
3732
3733                                 return true;
3734                         }
3735                         else {
3736                                 DRM_DEBUG("%s: No deep color support on this HDMI sink.\n",
3737                                                   connector->name);
3738                         }
3739                 }
3740         }
3741
3742         return false;
3743 }
3744
3745 /**
3746  * drm_add_display_info - pull display info out if present
3747  * @edid: EDID data
3748  * @info: display info (attached to connector)
3749  * @connector: connector whose edid is used to build display info
3750  *
3751  * Grab any available display info and stuff it into the drm_display_info
3752  * structure that's part of the connector.  Useful for tracking bpp and
3753  * color spaces.
3754  */
3755 static void drm_add_display_info(struct edid *edid,
3756                                  struct drm_display_info *info,
3757                                  struct drm_connector *connector)
3758 {
3759         u8 *edid_ext;
3760
3761         info->width_mm = edid->width_cm * 10;
3762         info->height_mm = edid->height_cm * 10;
3763
3764         /* driver figures it out in this case */
3765         info->bpc = 0;
3766         info->color_formats = 0;
3767
3768         if (edid->revision < 3)
3769                 return;
3770
3771         if (!(edid->input & DRM_EDID_INPUT_DIGITAL))
3772                 return;
3773
3774         /* Get data from CEA blocks if present */
3775         edid_ext = drm_find_cea_extension(edid);
3776         if (edid_ext) {
3777                 info->cea_rev = edid_ext[1];
3778
3779                 /* The existence of a CEA block should imply RGB support */
3780                 info->color_formats = DRM_COLOR_FORMAT_RGB444;
3781                 if (edid_ext[3] & EDID_CEA_YCRCB444)
3782                         info->color_formats |= DRM_COLOR_FORMAT_YCRCB444;
3783                 if (edid_ext[3] & EDID_CEA_YCRCB422)
3784                         info->color_formats |= DRM_COLOR_FORMAT_YCRCB422;
3785         }
3786
3787         /* HDMI deep color modes supported? Assign to info, if so */
3788         drm_assign_hdmi_deep_color_info(edid, info, connector);
3789
3790         /* Only defined for 1.4 with digital displays */
3791         if (edid->revision < 4)
3792                 return;
3793
3794         switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) {
3795         case DRM_EDID_DIGITAL_DEPTH_6:
3796                 info->bpc = 6;
3797                 break;
3798         case DRM_EDID_DIGITAL_DEPTH_8:
3799                 info->bpc = 8;
3800                 break;
3801         case DRM_EDID_DIGITAL_DEPTH_10:
3802                 info->bpc = 10;
3803                 break;
3804         case DRM_EDID_DIGITAL_DEPTH_12:
3805                 info->bpc = 12;
3806                 break;
3807         case DRM_EDID_DIGITAL_DEPTH_14:
3808                 info->bpc = 14;
3809                 break;
3810         case DRM_EDID_DIGITAL_DEPTH_16:
3811                 info->bpc = 16;
3812                 break;
3813         case DRM_EDID_DIGITAL_DEPTH_UNDEF:
3814         default:
3815                 info->bpc = 0;
3816                 break;
3817         }
3818
3819         DRM_DEBUG("%s: Assigning EDID-1.4 digital sink color depth as %d bpc.\n",
3820                           connector->name, info->bpc);
3821
3822         info->color_formats |= DRM_COLOR_FORMAT_RGB444;
3823         if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444)
3824                 info->color_formats |= DRM_COLOR_FORMAT_YCRCB444;
3825         if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422)
3826                 info->color_formats |= DRM_COLOR_FORMAT_YCRCB422;
3827 }
3828
3829 /**
3830  * drm_add_edid_modes - add modes from EDID data, if available
3831  * @connector: connector we're probing
3832  * @edid: EDID data
3833  *
3834  * Add the specified modes to the connector's mode list.
3835  *
3836  * Return: The number of modes added or 0 if we couldn't find any.
3837  */
3838 int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
3839 {
3840         int num_modes = 0;
3841         u32 quirks;
3842
3843         if (edid == NULL) {
3844                 return 0;
3845         }
3846         if (!drm_edid_is_valid(edid)) {
3847                 dev_warn(connector->dev->dev, "%s: EDID invalid.\n",
3848                          connector->name);
3849                 return 0;
3850         }
3851
3852         quirks = edid_get_quirks(edid);
3853
3854         /*
3855          * EDID spec says modes should be preferred in this order:
3856          * - preferred detailed mode
3857          * - other detailed modes from base block
3858          * - detailed modes from extension blocks
3859          * - CVT 3-byte code modes
3860          * - standard timing codes
3861          * - established timing codes
3862          * - modes inferred from GTF or CVT range information
3863          *
3864          * We get this pretty much right.
3865          *
3866          * XXX order for additional mode types in extension blocks?
3867          */
3868         num_modes += add_detailed_modes(connector, edid, quirks);
3869         num_modes += add_cvt_modes(connector, edid);
3870         num_modes += add_standard_modes(connector, edid);
3871         num_modes += add_established_modes(connector, edid);
3872         num_modes += add_cea_modes(connector, edid);
3873         num_modes += add_alternate_cea_modes(connector, edid);
3874         if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
3875                 num_modes += add_inferred_modes(connector, edid);
3876
3877         if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
3878                 edid_fixup_preferred(connector, quirks);
3879
3880         drm_add_display_info(edid, &connector->display_info, connector);
3881
3882         if (quirks & EDID_QUIRK_FORCE_6BPC)
3883                 connector->display_info.bpc = 6;
3884
3885         if (quirks & EDID_QUIRK_FORCE_8BPC)
3886                 connector->display_info.bpc = 8;
3887
3888         if (quirks & EDID_QUIRK_FORCE_12BPC)
3889                 connector->display_info.bpc = 12;
3890
3891         return num_modes;
3892 }
3893 EXPORT_SYMBOL(drm_add_edid_modes);
3894
3895 /**
3896  * drm_add_modes_noedid - add modes for the connectors without EDID
3897  * @connector: connector we're probing
3898  * @hdisplay: the horizontal display limit
3899  * @vdisplay: the vertical display limit
3900  *
3901  * Add the specified modes to the connector's mode list. Only when the
3902  * hdisplay/vdisplay is not beyond the given limit, it will be added.
3903  *
3904  * Return: The number of modes added or 0 if we couldn't find any.
3905  */
3906 int drm_add_modes_noedid(struct drm_connector *connector,
3907                         int hdisplay, int vdisplay)
3908 {
3909         int i, count, num_modes = 0;
3910         struct drm_display_mode *mode;
3911         struct drm_device *dev = connector->dev;
3912
3913         count = ARRAY_SIZE(drm_dmt_modes);
3914         if (hdisplay < 0)
3915                 hdisplay = 0;
3916         if (vdisplay < 0)
3917                 vdisplay = 0;
3918
3919         for (i = 0; i < count; i++) {
3920                 const struct drm_display_mode *ptr = &drm_dmt_modes[i];
3921                 if (hdisplay && vdisplay) {
3922                         /*
3923                          * Only when two are valid, they will be used to check
3924                          * whether the mode should be added to the mode list of
3925                          * the connector.
3926                          */
3927                         if (ptr->hdisplay > hdisplay ||
3928                                         ptr->vdisplay > vdisplay)
3929                                 continue;
3930                 }
3931                 if (drm_mode_vrefresh(ptr) > 61)
3932                         continue;
3933                 mode = drm_mode_duplicate(dev, ptr);
3934                 if (mode) {
3935                         drm_mode_probed_add(connector, mode);
3936                         num_modes++;
3937                 }
3938         }
3939         return num_modes;
3940 }
3941 EXPORT_SYMBOL(drm_add_modes_noedid);
3942
3943 /**
3944  * drm_set_preferred_mode - Sets the preferred mode of a connector
3945  * @connector: connector whose mode list should be processed
3946  * @hpref: horizontal resolution of preferred mode
3947  * @vpref: vertical resolution of preferred mode
3948  *
3949  * Marks a mode as preferred if it matches the resolution specified by @hpref
3950  * and @vpref.
3951  */
3952 void drm_set_preferred_mode(struct drm_connector *connector,
3953                            int hpref, int vpref)
3954 {
3955         struct drm_display_mode *mode;
3956
3957         list_for_each_entry(mode, &connector->probed_modes, head) {
3958                 if (mode->hdisplay == hpref &&
3959                     mode->vdisplay == vpref)
3960                         mode->type |= DRM_MODE_TYPE_PREFERRED;
3961         }
3962 }
3963 EXPORT_SYMBOL(drm_set_preferred_mode);
3964
3965 /**
3966  * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with
3967  *                                              data from a DRM display mode
3968  * @frame: HDMI AVI infoframe
3969  * @mode: DRM display mode
3970  *
3971  * Return: 0 on success or a negative error code on failure.
3972  */
3973 int
3974 drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
3975                                          const struct drm_display_mode *mode)
3976 {
3977         int err;
3978
3979         if (!frame || !mode)
3980                 return -EINVAL;
3981
3982         err = hdmi_avi_infoframe_init(frame);
3983         if (err < 0)
3984                 return err;
3985
3986         if (mode->flags & DRM_MODE_FLAG_DBLCLK)
3987                 frame->pixel_repeat = 1;
3988
3989         frame->video_code = drm_match_cea_mode(mode);
3990
3991         frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
3992
3993         /*
3994          * Populate picture aspect ratio from either
3995          * user input (if specified) or from the CEA mode list.
3996          */
3997         if (mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_4_3 ||
3998                 mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_16_9)
3999                 frame->picture_aspect = mode->picture_aspect_ratio;
4000         else if (frame->video_code > 0)
4001                 frame->picture_aspect = drm_get_cea_aspect_ratio(
4002                                                 frame->video_code);
4003
4004         frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
4005         frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
4006
4007         return 0;
4008 }
4009 EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
4010
4011 static enum hdmi_3d_structure
4012 s3d_structure_from_display_mode(const struct drm_display_mode *mode)
4013 {
4014         u32 layout = mode->flags & DRM_MODE_FLAG_3D_MASK;
4015
4016         switch (layout) {
4017         case DRM_MODE_FLAG_3D_FRAME_PACKING:
4018                 return HDMI_3D_STRUCTURE_FRAME_PACKING;
4019         case DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE:
4020                 return HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE;
4021         case DRM_MODE_FLAG_3D_LINE_ALTERNATIVE:
4022                 return HDMI_3D_STRUCTURE_LINE_ALTERNATIVE;
4023         case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL:
4024                 return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL;
4025         case DRM_MODE_FLAG_3D_L_DEPTH:
4026                 return HDMI_3D_STRUCTURE_L_DEPTH;
4027         case DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH:
4028                 return HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH;
4029         case DRM_MODE_FLAG_3D_TOP_AND_BOTTOM:
4030                 return HDMI_3D_STRUCTURE_TOP_AND_BOTTOM;
4031         case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF:
4032                 return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF;
4033         default:
4034                 return HDMI_3D_STRUCTURE_INVALID;
4035         }
4036 }
4037
4038 /**
4039  * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
4040  * data from a DRM display mode
4041  * @frame: HDMI vendor infoframe
4042  * @mode: DRM display mode
4043  *
4044  * Note that there's is a need to send HDMI vendor infoframes only when using a
4045  * 4k or stereoscopic 3D mode. So when giving any other mode as input this
4046  * function will return -EINVAL, error that can be safely ignored.
4047  *
4048  * Return: 0 on success or a negative error code on failure.
4049  */
4050 int
4051 drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
4052                                             const struct drm_display_mode *mode)
4053 {
4054         int err;
4055         u32 s3d_flags;
4056         u8 vic;
4057
4058         if (!frame || !mode)
4059                 return -EINVAL;
4060
4061         vic = drm_match_hdmi_mode(mode);
4062         s3d_flags = mode->flags & DRM_MODE_FLAG_3D_MASK;
4063
4064         if (!vic && !s3d_flags)
4065                 return -EINVAL;
4066
4067         if (vic && s3d_flags)
4068                 return -EINVAL;
4069
4070         err = hdmi_vendor_infoframe_init(frame);
4071         if (err < 0)
4072                 return err;
4073
4074         if (vic)
4075                 frame->vic = vic;
4076         else
4077                 frame->s3d_struct = s3d_structure_from_display_mode(mode);
4078
4079         return 0;
4080 }
4081 EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode);
4082
4083 static int drm_parse_display_id(struct drm_connector *connector,
4084                                 u8 *displayid, int length,
4085                                 bool is_edid_extension)
4086 {
4087         /* if this is an EDID extension the first byte will be 0x70 */
4088         int idx = 0;
4089         struct displayid_hdr *base;
4090         struct displayid_block *block;
4091         u8 csum = 0;
4092         int i;
4093
4094         if (is_edid_extension)
4095                 idx = 1;
4096
4097         base = (struct displayid_hdr *)&displayid[idx];
4098
4099         DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
4100                       base->rev, base->bytes, base->prod_id, base->ext_count);
4101
4102         if (base->bytes + 5 > length - idx)
4103                 return -EINVAL;
4104
4105         for (i = idx; i <= base->bytes + 5; i++) {
4106                 csum += displayid[i];
4107         }
4108         if (csum) {
4109                 DRM_ERROR("DisplayID checksum invalid, remainder is %d\n", csum);
4110                 return -EINVAL;
4111         }
4112
4113         block = (struct displayid_block *)&displayid[idx + 4];
4114         DRM_DEBUG_KMS("block id %d, rev %d, len %d\n",
4115                       block->tag, block->rev, block->num_bytes);
4116
4117         switch (block->tag) {
4118         case DATA_BLOCK_TILED_DISPLAY: {
4119                 struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block;
4120
4121                 u16 w, h;
4122                 u8 tile_v_loc, tile_h_loc;
4123                 u8 num_v_tile, num_h_tile;
4124                 struct drm_tile_group *tg;
4125
4126                 w = tile->tile_size[0] | tile->tile_size[1] << 8;
4127                 h = tile->tile_size[2] | tile->tile_size[3] << 8;
4128
4129                 num_v_tile = (tile->topo[0] & 0xf) | (tile->topo[2] & 0x30);
4130                 num_h_tile = (tile->topo[0] >> 4) | ((tile->topo[2] >> 2) & 0x30);
4131                 tile_v_loc = (tile->topo[1] & 0xf) | ((tile->topo[2] & 0x3) << 4);
4132                 tile_h_loc = (tile->topo[1] >> 4) | (((tile->topo[2] >> 2) & 0x3) << 4);
4133
4134                 connector->has_tile = true;
4135                 if (tile->tile_cap & 0x80)
4136                         connector->tile_is_single_monitor = true;
4137
4138                 connector->num_h_tile = num_h_tile + 1;
4139                 connector->num_v_tile = num_v_tile + 1;
4140                 connector->tile_h_loc = tile_h_loc;
4141                 connector->tile_v_loc = tile_v_loc;
4142                 connector->tile_h_size = w + 1;
4143                 connector->tile_v_size = h + 1;
4144
4145                 DRM_DEBUG_KMS("tile cap 0x%x\n", tile->tile_cap);
4146                 DRM_DEBUG_KMS("tile_size %d x %d\n", w + 1, h + 1);
4147                 DRM_DEBUG_KMS("topo num tiles %dx%d, location %dx%d\n",
4148                        num_h_tile + 1, num_v_tile + 1, tile_h_loc, tile_v_loc);
4149                 DRM_DEBUG_KMS("vend %c%c%c\n", tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]);
4150
4151                 tg = drm_mode_get_tile_group(connector->dev, tile->topology_id);
4152                 if (!tg) {
4153                         tg = drm_mode_create_tile_group(connector->dev, tile->topology_id);
4154                 }
4155                 if (!tg)
4156                         return -ENOMEM;
4157
4158                 if (connector->tile_group != tg) {
4159                         /* if we haven't got a pointer,
4160                            take the reference, drop ref to old tile group */
4161                         if (connector->tile_group) {
4162                                 drm_mode_put_tile_group(connector->dev, connector->tile_group);
4163                         }
4164                         connector->tile_group = tg;
4165                 } else
4166                         /* if same tile group, then release the ref we just took. */
4167                         drm_mode_put_tile_group(connector->dev, tg);
4168         }
4169                 break;
4170         default:
4171                 printk("unknown displayid tag %d\n", block->tag);
4172                 break;
4173         }
4174         return 0;
4175 }
4176
4177 static void drm_get_displayid(struct drm_connector *connector,
4178                               struct edid *edid)
4179 {
4180         void *displayid = NULL;
4181         int ret;
4182         connector->has_tile = false;
4183         displayid = drm_find_displayid_extension(edid);
4184         if (!displayid) {
4185                 /* drop reference to any tile group we had */
4186                 goto out_drop_ref;
4187         }
4188
4189         ret = drm_parse_display_id(connector, displayid, EDID_LENGTH, true);
4190         if (ret < 0)
4191                 goto out_drop_ref;
4192         if (!connector->has_tile)
4193                 goto out_drop_ref;
4194         return;
4195 out_drop_ref:
4196         if (connector->tile_group) {
4197                 drm_mode_put_tile_group(connector->dev, connector->tile_group);
4198                 connector->tile_group = NULL;
4199         }
4200         return;
4201 }