]> Git Repo - linux.git/blob - drivers/gpu/drm/drm_edid.c
Merge tag 'drm-intel-gt-next-2023-10-12' of git://anongit.freedesktop.org/drm/drm...
[linux.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 <[email protected]>
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 <[email protected]>
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
31 #include <linux/bitfield.h>
32 #include <linux/cec.h>
33 #include <linux/hdmi.h>
34 #include <linux/i2c.h>
35 #include <linux/kernel.h>
36 #include <linux/module.h>
37 #include <linux/pci.h>
38 #include <linux/slab.h>
39 #include <linux/vga_switcheroo.h>
40
41 #include <drm/drm_displayid.h>
42 #include <drm/drm_drv.h>
43 #include <drm/drm_edid.h>
44 #include <drm/drm_encoder.h>
45 #include <drm/drm_print.h>
46
47 #include "drm_crtc_internal.h"
48
49 static int oui(u8 first, u8 second, u8 third)
50 {
51         return (first << 16) | (second << 8) | third;
52 }
53
54 #define EDID_EST_TIMINGS 16
55 #define EDID_STD_TIMINGS 8
56 #define EDID_DETAILED_TIMINGS 4
57
58 /*
59  * EDID blocks out in the wild have a variety of bugs, try to collect
60  * them here (note that userspace may work around broken monitors first,
61  * but fixes should make their way here so that the kernel "just works"
62  * on as many displays as possible).
63  */
64
65 /* First detailed mode wrong, use largest 60Hz mode */
66 #define EDID_QUIRK_PREFER_LARGE_60              (1 << 0)
67 /* Reported 135MHz pixel clock is too high, needs adjustment */
68 #define EDID_QUIRK_135_CLOCK_TOO_HIGH           (1 << 1)
69 /* Prefer the largest mode at 75 Hz */
70 #define EDID_QUIRK_PREFER_LARGE_75              (1 << 2)
71 /* Detail timing is in cm not mm */
72 #define EDID_QUIRK_DETAILED_IN_CM               (1 << 3)
73 /* Detailed timing descriptors have bogus size values, so just take the
74  * maximum size and use that.
75  */
76 #define EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE    (1 << 4)
77 /* use +hsync +vsync for detailed mode */
78 #define EDID_QUIRK_DETAILED_SYNC_PP             (1 << 6)
79 /* Force reduced-blanking timings for detailed modes */
80 #define EDID_QUIRK_FORCE_REDUCED_BLANKING       (1 << 7)
81 /* Force 8bpc */
82 #define EDID_QUIRK_FORCE_8BPC                   (1 << 8)
83 /* Force 12bpc */
84 #define EDID_QUIRK_FORCE_12BPC                  (1 << 9)
85 /* Force 6bpc */
86 #define EDID_QUIRK_FORCE_6BPC                   (1 << 10)
87 /* Force 10bpc */
88 #define EDID_QUIRK_FORCE_10BPC                  (1 << 11)
89 /* Non desktop display (i.e. HMD) */
90 #define EDID_QUIRK_NON_DESKTOP                  (1 << 12)
91 /* Cap the DSC target bitrate to 15bpp */
92 #define EDID_QUIRK_CAP_DSC_15BPP                (1 << 13)
93
94 #define MICROSOFT_IEEE_OUI      0xca125c
95
96 struct detailed_mode_closure {
97         struct drm_connector *connector;
98         const struct drm_edid *drm_edid;
99         bool preferred;
100         int modes;
101 };
102
103 #define LEVEL_DMT       0
104 #define LEVEL_GTF       1
105 #define LEVEL_GTF2      2
106 #define LEVEL_CVT       3
107
108 #define EDID_QUIRK(vend_chr_0, vend_chr_1, vend_chr_2, product_id, _quirks) \
109 { \
110         .panel_id = drm_edid_encode_panel_id(vend_chr_0, vend_chr_1, vend_chr_2, \
111                                              product_id), \
112         .quirks = _quirks \
113 }
114
115 static const struct edid_quirk {
116         u32 panel_id;
117         u32 quirks;
118 } edid_quirk_list[] = {
119         /* Acer AL1706 */
120         EDID_QUIRK('A', 'C', 'R', 44358, EDID_QUIRK_PREFER_LARGE_60),
121         /* Acer F51 */
122         EDID_QUIRK('A', 'P', 'I', 0x7602, EDID_QUIRK_PREFER_LARGE_60),
123
124         /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */
125         EDID_QUIRK('A', 'E', 'O', 0, EDID_QUIRK_FORCE_6BPC),
126
127         /* BOE model on HP Pavilion 15-n233sl reports 8 bpc, but is a 6 bpc panel */
128         EDID_QUIRK('B', 'O', 'E', 0x78b, EDID_QUIRK_FORCE_6BPC),
129
130         /* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */
131         EDID_QUIRK('C', 'P', 'T', 0x17df, EDID_QUIRK_FORCE_6BPC),
132
133         /* SDC panel of Lenovo B50-80 reports 8 bpc, but is a 6 bpc panel */
134         EDID_QUIRK('S', 'D', 'C', 0x3652, EDID_QUIRK_FORCE_6BPC),
135
136         /* BOE model 0x0771 reports 8 bpc, but is a 6 bpc panel */
137         EDID_QUIRK('B', 'O', 'E', 0x0771, EDID_QUIRK_FORCE_6BPC),
138
139         /* Belinea 10 15 55 */
140         EDID_QUIRK('M', 'A', 'X', 1516, EDID_QUIRK_PREFER_LARGE_60),
141         EDID_QUIRK('M', 'A', 'X', 0x77e, EDID_QUIRK_PREFER_LARGE_60),
142
143         /* Envision Peripherals, Inc. EN-7100e */
144         EDID_QUIRK('E', 'P', 'I', 59264, EDID_QUIRK_135_CLOCK_TOO_HIGH),
145         /* Envision EN2028 */
146         EDID_QUIRK('E', 'P', 'I', 8232, EDID_QUIRK_PREFER_LARGE_60),
147
148         /* Funai Electronics PM36B */
149         EDID_QUIRK('F', 'C', 'M', 13600, EDID_QUIRK_PREFER_LARGE_75 |
150                                        EDID_QUIRK_DETAILED_IN_CM),
151
152         /* LG 27GP950 */
153         EDID_QUIRK('G', 'S', 'M', 0x5bbf, EDID_QUIRK_CAP_DSC_15BPP),
154
155         /* LG 27GN950 */
156         EDID_QUIRK('G', 'S', 'M', 0x5b9a, EDID_QUIRK_CAP_DSC_15BPP),
157
158         /* LGD panel of HP zBook 17 G2, eDP 10 bpc, but reports unknown bpc */
159         EDID_QUIRK('L', 'G', 'D', 764, EDID_QUIRK_FORCE_10BPC),
160
161         /* LG Philips LCD LP154W01-A5 */
162         EDID_QUIRK('L', 'P', 'L', 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE),
163         EDID_QUIRK('L', 'P', 'L', 0x2a00, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE),
164
165         /* Samsung SyncMaster 205BW.  Note: irony */
166         EDID_QUIRK('S', 'A', 'M', 541, EDID_QUIRK_DETAILED_SYNC_PP),
167         /* Samsung SyncMaster 22[5-6]BW */
168         EDID_QUIRK('S', 'A', 'M', 596, EDID_QUIRK_PREFER_LARGE_60),
169         EDID_QUIRK('S', 'A', 'M', 638, EDID_QUIRK_PREFER_LARGE_60),
170
171         /* Sony PVM-2541A does up to 12 bpc, but only reports max 8 bpc */
172         EDID_QUIRK('S', 'N', 'Y', 0x2541, EDID_QUIRK_FORCE_12BPC),
173
174         /* ViewSonic VA2026w */
175         EDID_QUIRK('V', 'S', 'C', 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING),
176
177         /* Medion MD 30217 PG */
178         EDID_QUIRK('M', 'E', 'D', 0x7b8, EDID_QUIRK_PREFER_LARGE_75),
179
180         /* Lenovo G50 */
181         EDID_QUIRK('S', 'D', 'C', 18514, EDID_QUIRK_FORCE_6BPC),
182
183         /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */
184         EDID_QUIRK('S', 'E', 'C', 0xd033, EDID_QUIRK_FORCE_8BPC),
185
186         /* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/
187         EDID_QUIRK('E', 'T', 'R', 13896, EDID_QUIRK_FORCE_8BPC),
188
189         /* Valve Index Headset */
190         EDID_QUIRK('V', 'L', 'V', 0x91a8, EDID_QUIRK_NON_DESKTOP),
191         EDID_QUIRK('V', 'L', 'V', 0x91b0, EDID_QUIRK_NON_DESKTOP),
192         EDID_QUIRK('V', 'L', 'V', 0x91b1, EDID_QUIRK_NON_DESKTOP),
193         EDID_QUIRK('V', 'L', 'V', 0x91b2, EDID_QUIRK_NON_DESKTOP),
194         EDID_QUIRK('V', 'L', 'V', 0x91b3, EDID_QUIRK_NON_DESKTOP),
195         EDID_QUIRK('V', 'L', 'V', 0x91b4, EDID_QUIRK_NON_DESKTOP),
196         EDID_QUIRK('V', 'L', 'V', 0x91b5, EDID_QUIRK_NON_DESKTOP),
197         EDID_QUIRK('V', 'L', 'V', 0x91b6, EDID_QUIRK_NON_DESKTOP),
198         EDID_QUIRK('V', 'L', 'V', 0x91b7, EDID_QUIRK_NON_DESKTOP),
199         EDID_QUIRK('V', 'L', 'V', 0x91b8, EDID_QUIRK_NON_DESKTOP),
200         EDID_QUIRK('V', 'L', 'V', 0x91b9, EDID_QUIRK_NON_DESKTOP),
201         EDID_QUIRK('V', 'L', 'V', 0x91ba, EDID_QUIRK_NON_DESKTOP),
202         EDID_QUIRK('V', 'L', 'V', 0x91bb, EDID_QUIRK_NON_DESKTOP),
203         EDID_QUIRK('V', 'L', 'V', 0x91bc, EDID_QUIRK_NON_DESKTOP),
204         EDID_QUIRK('V', 'L', 'V', 0x91bd, EDID_QUIRK_NON_DESKTOP),
205         EDID_QUIRK('V', 'L', 'V', 0x91be, EDID_QUIRK_NON_DESKTOP),
206         EDID_QUIRK('V', 'L', 'V', 0x91bf, EDID_QUIRK_NON_DESKTOP),
207
208         /* HTC Vive and Vive Pro VR Headsets */
209         EDID_QUIRK('H', 'V', 'R', 0xaa01, EDID_QUIRK_NON_DESKTOP),
210         EDID_QUIRK('H', 'V', 'R', 0xaa02, EDID_QUIRK_NON_DESKTOP),
211
212         /* Oculus Rift DK1, DK2, CV1 and Rift S VR Headsets */
213         EDID_QUIRK('O', 'V', 'R', 0x0001, EDID_QUIRK_NON_DESKTOP),
214         EDID_QUIRK('O', 'V', 'R', 0x0003, EDID_QUIRK_NON_DESKTOP),
215         EDID_QUIRK('O', 'V', 'R', 0x0004, EDID_QUIRK_NON_DESKTOP),
216         EDID_QUIRK('O', 'V', 'R', 0x0012, EDID_QUIRK_NON_DESKTOP),
217
218         /* Windows Mixed Reality Headsets */
219         EDID_QUIRK('A', 'C', 'R', 0x7fce, EDID_QUIRK_NON_DESKTOP),
220         EDID_QUIRK('L', 'E', 'N', 0x0408, EDID_QUIRK_NON_DESKTOP),
221         EDID_QUIRK('F', 'U', 'J', 0x1970, EDID_QUIRK_NON_DESKTOP),
222         EDID_QUIRK('D', 'E', 'L', 0x7fce, EDID_QUIRK_NON_DESKTOP),
223         EDID_QUIRK('S', 'E', 'C', 0x144a, EDID_QUIRK_NON_DESKTOP),
224         EDID_QUIRK('A', 'U', 'S', 0xc102, EDID_QUIRK_NON_DESKTOP),
225
226         /* Sony PlayStation VR Headset */
227         EDID_QUIRK('S', 'N', 'Y', 0x0704, EDID_QUIRK_NON_DESKTOP),
228
229         /* Sensics VR Headsets */
230         EDID_QUIRK('S', 'E', 'N', 0x1019, EDID_QUIRK_NON_DESKTOP),
231
232         /* OSVR HDK and HDK2 VR Headsets */
233         EDID_QUIRK('S', 'V', 'R', 0x1019, EDID_QUIRK_NON_DESKTOP),
234         EDID_QUIRK('A', 'U', 'O', 0x1111, EDID_QUIRK_NON_DESKTOP),
235 };
236
237 /*
238  * Autogenerated from the DMT spec.
239  * This table is copied from xfree86/modes/xf86EdidModes.c.
240  */
241 static const struct drm_display_mode drm_dmt_modes[] = {
242         /* 0x01 - 640x350@85Hz */
243         { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
244                    736, 832, 0, 350, 382, 385, 445, 0,
245                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
246         /* 0x02 - 640x400@85Hz */
247         { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
248                    736, 832, 0, 400, 401, 404, 445, 0,
249                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
250         /* 0x03 - 720x400@85Hz */
251         { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 756,
252                    828, 936, 0, 400, 401, 404, 446, 0,
253                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
254         /* 0x04 - 640x480@60Hz */
255         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
256                    752, 800, 0, 480, 490, 492, 525, 0,
257                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
258         /* 0x05 - 640x480@72Hz */
259         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
260                    704, 832, 0, 480, 489, 492, 520, 0,
261                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
262         /* 0x06 - 640x480@75Hz */
263         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656,
264                    720, 840, 0, 480, 481, 484, 500, 0,
265                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
266         /* 0x07 - 640x480@85Hz */
267         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 36000, 640, 696,
268                    752, 832, 0, 480, 481, 484, 509, 0,
269                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
270         /* 0x08 - 800x600@56Hz */
271         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824,
272                    896, 1024, 0, 600, 601, 603, 625, 0,
273                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
274         /* 0x09 - 800x600@60Hz */
275         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
276                    968, 1056, 0, 600, 601, 605, 628, 0,
277                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
278         /* 0x0a - 800x600@72Hz */
279         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856,
280                    976, 1040, 0, 600, 637, 643, 666, 0,
281                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
282         /* 0x0b - 800x600@75Hz */
283         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816,
284                    896, 1056, 0, 600, 601, 604, 625, 0,
285                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
286         /* 0x0c - 800x600@85Hz */
287         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 56250, 800, 832,
288                    896, 1048, 0, 600, 601, 604, 631, 0,
289                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
290         /* 0x0d - 800x600@120Hz RB */
291         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 73250, 800, 848,
292                    880, 960, 0, 600, 603, 607, 636, 0,
293                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
294         /* 0x0e - 848x480@60Hz */
295         { DRM_MODE("848x480", DRM_MODE_TYPE_DRIVER, 33750, 848, 864,
296                    976, 1088, 0, 480, 486, 494, 517, 0,
297                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
298         /* 0x0f - 1024x768@43Hz, interlace */
299         { DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032,
300                    1208, 1264, 0, 768, 768, 776, 817, 0,
301                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
302                    DRM_MODE_FLAG_INTERLACE) },
303         /* 0x10 - 1024x768@60Hz */
304         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
305                    1184, 1344, 0, 768, 771, 777, 806, 0,
306                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
307         /* 0x11 - 1024x768@70Hz */
308         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048,
309                    1184, 1328, 0, 768, 771, 777, 806, 0,
310                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
311         /* 0x12 - 1024x768@75Hz */
312         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040,
313                    1136, 1312, 0, 768, 769, 772, 800, 0,
314                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
315         /* 0x13 - 1024x768@85Hz */
316         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 94500, 1024, 1072,
317                    1168, 1376, 0, 768, 769, 772, 808, 0,
318                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
319         /* 0x14 - 1024x768@120Hz RB */
320         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 115500, 1024, 1072,
321                    1104, 1184, 0, 768, 771, 775, 813, 0,
322                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
323         /* 0x15 - 1152x864@75Hz */
324         { DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216,
325                    1344, 1600, 0, 864, 865, 868, 900, 0,
326                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
327         /* 0x55 - 1280x720@60Hz */
328         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
329                    1430, 1650, 0, 720, 725, 730, 750, 0,
330                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
331         /* 0x16 - 1280x768@60Hz RB */
332         { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 68250, 1280, 1328,
333                    1360, 1440, 0, 768, 771, 778, 790, 0,
334                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
335         /* 0x17 - 1280x768@60Hz */
336         { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 79500, 1280, 1344,
337                    1472, 1664, 0, 768, 771, 778, 798, 0,
338                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
339         /* 0x18 - 1280x768@75Hz */
340         { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 102250, 1280, 1360,
341                    1488, 1696, 0, 768, 771, 778, 805, 0,
342                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
343         /* 0x19 - 1280x768@85Hz */
344         { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 117500, 1280, 1360,
345                    1496, 1712, 0, 768, 771, 778, 809, 0,
346                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
347         /* 0x1a - 1280x768@120Hz RB */
348         { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 140250, 1280, 1328,
349                    1360, 1440, 0, 768, 771, 778, 813, 0,
350                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
351         /* 0x1b - 1280x800@60Hz RB */
352         { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 71000, 1280, 1328,
353                    1360, 1440, 0, 800, 803, 809, 823, 0,
354                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
355         /* 0x1c - 1280x800@60Hz */
356         { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352,
357                    1480, 1680, 0, 800, 803, 809, 831, 0,
358                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
359         /* 0x1d - 1280x800@75Hz */
360         { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 106500, 1280, 1360,
361                    1488, 1696, 0, 800, 803, 809, 838, 0,
362                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
363         /* 0x1e - 1280x800@85Hz */
364         { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 122500, 1280, 1360,
365                    1496, 1712, 0, 800, 803, 809, 843, 0,
366                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
367         /* 0x1f - 1280x800@120Hz RB */
368         { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 146250, 1280, 1328,
369                    1360, 1440, 0, 800, 803, 809, 847, 0,
370                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
371         /* 0x20 - 1280x960@60Hz */
372         { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1376,
373                    1488, 1800, 0, 960, 961, 964, 1000, 0,
374                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
375         /* 0x21 - 1280x960@85Hz */
376         { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1344,
377                    1504, 1728, 0, 960, 961, 964, 1011, 0,
378                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
379         /* 0x22 - 1280x960@120Hz RB */
380         { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 175500, 1280, 1328,
381                    1360, 1440, 0, 960, 963, 967, 1017, 0,
382                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
383         /* 0x23 - 1280x1024@60Hz */
384         { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1328,
385                    1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
386                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
387         /* 0x24 - 1280x1024@75Hz */
388         { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296,
389                    1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
390                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
391         /* 0x25 - 1280x1024@85Hz */
392         { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 157500, 1280, 1344,
393                    1504, 1728, 0, 1024, 1025, 1028, 1072, 0,
394                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
395         /* 0x26 - 1280x1024@120Hz RB */
396         { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 187250, 1280, 1328,
397                    1360, 1440, 0, 1024, 1027, 1034, 1084, 0,
398                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
399         /* 0x27 - 1360x768@60Hz */
400         { DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 85500, 1360, 1424,
401                    1536, 1792, 0, 768, 771, 777, 795, 0,
402                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
403         /* 0x28 - 1360x768@120Hz RB */
404         { DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 148250, 1360, 1408,
405                    1440, 1520, 0, 768, 771, 776, 813, 0,
406                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
407         /* 0x51 - 1366x768@60Hz */
408         { DRM_MODE("1366x768", DRM_MODE_TYPE_DRIVER, 85500, 1366, 1436,
409                    1579, 1792, 0, 768, 771, 774, 798, 0,
410                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
411         /* 0x56 - 1366x768@60Hz */
412         { DRM_MODE("1366x768", DRM_MODE_TYPE_DRIVER, 72000, 1366, 1380,
413                    1436, 1500, 0, 768, 769, 772, 800, 0,
414                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
415         /* 0x29 - 1400x1050@60Hz RB */
416         { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 101000, 1400, 1448,
417                    1480, 1560, 0, 1050, 1053, 1057, 1080, 0,
418                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
419         /* 0x2a - 1400x1050@60Hz */
420         { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 121750, 1400, 1488,
421                    1632, 1864, 0, 1050, 1053, 1057, 1089, 0,
422                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
423         /* 0x2b - 1400x1050@75Hz */
424         { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 156000, 1400, 1504,
425                    1648, 1896, 0, 1050, 1053, 1057, 1099, 0,
426                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
427         /* 0x2c - 1400x1050@85Hz */
428         { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 179500, 1400, 1504,
429                    1656, 1912, 0, 1050, 1053, 1057, 1105, 0,
430                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
431         /* 0x2d - 1400x1050@120Hz RB */
432         { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 208000, 1400, 1448,
433                    1480, 1560, 0, 1050, 1053, 1057, 1112, 0,
434                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
435         /* 0x2e - 1440x900@60Hz RB */
436         { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 88750, 1440, 1488,
437                    1520, 1600, 0, 900, 903, 909, 926, 0,
438                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
439         /* 0x2f - 1440x900@60Hz */
440         { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 106500, 1440, 1520,
441                    1672, 1904, 0, 900, 903, 909, 934, 0,
442                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
443         /* 0x30 - 1440x900@75Hz */
444         { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 136750, 1440, 1536,
445                    1688, 1936, 0, 900, 903, 909, 942, 0,
446                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
447         /* 0x31 - 1440x900@85Hz */
448         { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 157000, 1440, 1544,
449                    1696, 1952, 0, 900, 903, 909, 948, 0,
450                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
451         /* 0x32 - 1440x900@120Hz RB */
452         { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 182750, 1440, 1488,
453                    1520, 1600, 0, 900, 903, 909, 953, 0,
454                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
455         /* 0x53 - 1600x900@60Hz */
456         { DRM_MODE("1600x900", DRM_MODE_TYPE_DRIVER, 108000, 1600, 1624,
457                    1704, 1800, 0, 900, 901, 904, 1000, 0,
458                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
459         /* 0x33 - 1600x1200@60Hz */
460         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 162000, 1600, 1664,
461                    1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
462                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
463         /* 0x34 - 1600x1200@65Hz */
464         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 175500, 1600, 1664,
465                    1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
466                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
467         /* 0x35 - 1600x1200@70Hz */
468         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 189000, 1600, 1664,
469                    1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
470                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
471         /* 0x36 - 1600x1200@75Hz */
472         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 202500, 1600, 1664,
473                    1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
474                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
475         /* 0x37 - 1600x1200@85Hz */
476         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 229500, 1600, 1664,
477                    1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
478                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
479         /* 0x38 - 1600x1200@120Hz RB */
480         { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 268250, 1600, 1648,
481                    1680, 1760, 0, 1200, 1203, 1207, 1271, 0,
482                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
483         /* 0x39 - 1680x1050@60Hz RB */
484         { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 119000, 1680, 1728,
485                    1760, 1840, 0, 1050, 1053, 1059, 1080, 0,
486                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
487         /* 0x3a - 1680x1050@60Hz */
488         { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 146250, 1680, 1784,
489                    1960, 2240, 0, 1050, 1053, 1059, 1089, 0,
490                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
491         /* 0x3b - 1680x1050@75Hz */
492         { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 187000, 1680, 1800,
493                    1976, 2272, 0, 1050, 1053, 1059, 1099, 0,
494                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
495         /* 0x3c - 1680x1050@85Hz */
496         { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 214750, 1680, 1808,
497                    1984, 2288, 0, 1050, 1053, 1059, 1105, 0,
498                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
499         /* 0x3d - 1680x1050@120Hz RB */
500         { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 245500, 1680, 1728,
501                    1760, 1840, 0, 1050, 1053, 1059, 1112, 0,
502                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
503         /* 0x3e - 1792x1344@60Hz */
504         { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 204750, 1792, 1920,
505                    2120, 2448, 0, 1344, 1345, 1348, 1394, 0,
506                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
507         /* 0x3f - 1792x1344@75Hz */
508         { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 261000, 1792, 1888,
509                    2104, 2456, 0, 1344, 1345, 1348, 1417, 0,
510                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
511         /* 0x40 - 1792x1344@120Hz RB */
512         { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 333250, 1792, 1840,
513                    1872, 1952, 0, 1344, 1347, 1351, 1423, 0,
514                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
515         /* 0x41 - 1856x1392@60Hz */
516         { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 218250, 1856, 1952,
517                    2176, 2528, 0, 1392, 1393, 1396, 1439, 0,
518                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
519         /* 0x42 - 1856x1392@75Hz */
520         { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 288000, 1856, 1984,
521                    2208, 2560, 0, 1392, 1393, 1396, 1500, 0,
522                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
523         /* 0x43 - 1856x1392@120Hz RB */
524         { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 356500, 1856, 1904,
525                    1936, 2016, 0, 1392, 1395, 1399, 1474, 0,
526                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
527         /* 0x52 - 1920x1080@60Hz */
528         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
529                    2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
530                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
531         /* 0x44 - 1920x1200@60Hz RB */
532         { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 154000, 1920, 1968,
533                    2000, 2080, 0, 1200, 1203, 1209, 1235, 0,
534                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
535         /* 0x45 - 1920x1200@60Hz */
536         { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 193250, 1920, 2056,
537                    2256, 2592, 0, 1200, 1203, 1209, 1245, 0,
538                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
539         /* 0x46 - 1920x1200@75Hz */
540         { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 245250, 1920, 2056,
541                    2264, 2608, 0, 1200, 1203, 1209, 1255, 0,
542                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
543         /* 0x47 - 1920x1200@85Hz */
544         { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 281250, 1920, 2064,
545                    2272, 2624, 0, 1200, 1203, 1209, 1262, 0,
546                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
547         /* 0x48 - 1920x1200@120Hz RB */
548         { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 317000, 1920, 1968,
549                    2000, 2080, 0, 1200, 1203, 1209, 1271, 0,
550                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
551         /* 0x49 - 1920x1440@60Hz */
552         { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 234000, 1920, 2048,
553                    2256, 2600, 0, 1440, 1441, 1444, 1500, 0,
554                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
555         /* 0x4a - 1920x1440@75Hz */
556         { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2064,
557                    2288, 2640, 0, 1440, 1441, 1444, 1500, 0,
558                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
559         /* 0x4b - 1920x1440@120Hz RB */
560         { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 380500, 1920, 1968,
561                    2000, 2080, 0, 1440, 1443, 1447, 1525, 0,
562                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
563         /* 0x54 - 2048x1152@60Hz */
564         { DRM_MODE("2048x1152", DRM_MODE_TYPE_DRIVER, 162000, 2048, 2074,
565                    2154, 2250, 0, 1152, 1153, 1156, 1200, 0,
566                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
567         /* 0x4c - 2560x1600@60Hz RB */
568         { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 268500, 2560, 2608,
569                    2640, 2720, 0, 1600, 1603, 1609, 1646, 0,
570                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
571         /* 0x4d - 2560x1600@60Hz */
572         { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 348500, 2560, 2752,
573                    3032, 3504, 0, 1600, 1603, 1609, 1658, 0,
574                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
575         /* 0x4e - 2560x1600@75Hz */
576         { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 443250, 2560, 2768,
577                    3048, 3536, 0, 1600, 1603, 1609, 1672, 0,
578                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
579         /* 0x4f - 2560x1600@85Hz */
580         { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 505250, 2560, 2768,
581                    3048, 3536, 0, 1600, 1603, 1609, 1682, 0,
582                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
583         /* 0x50 - 2560x1600@120Hz RB */
584         { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 552750, 2560, 2608,
585                    2640, 2720, 0, 1600, 1603, 1609, 1694, 0,
586                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
587         /* 0x57 - 4096x2160@60Hz RB */
588         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 556744, 4096, 4104,
589                    4136, 4176, 0, 2160, 2208, 2216, 2222, 0,
590                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
591         /* 0x58 - [email protected] RB */
592         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 556188, 4096, 4104,
593                    4136, 4176, 0, 2160, 2208, 2216, 2222, 0,
594                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
595 };
596
597 /*
598  * These more or less come from the DMT spec.  The 720x400 modes are
599  * inferred from historical 80x25 practice.  The 640x480@67 and 832x624@75
600  * modes are old-school Mac modes.  The EDID spec says the 1152x864@75 mode
601  * should be 1152x870, again for the Mac, but instead we use the x864 DMT
602  * mode.
603  *
604  * The DMT modes have been fact-checked; the rest are mild guesses.
605  */
606 static const struct drm_display_mode edid_est_modes[] = {
607         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
608                    968, 1056, 0, 600, 601, 605, 628, 0,
609                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@60Hz */
610         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824,
611                    896, 1024, 0, 600, 601, 603,  625, 0,
612                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@56Hz */
613         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656,
614                    720, 840, 0, 480, 481, 484, 500, 0,
615                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@75Hz */
616         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
617                    704,  832, 0, 480, 489, 492, 520, 0,
618                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@72Hz */
619         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 30240, 640, 704,
620                    768,  864, 0, 480, 483, 486, 525, 0,
621                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@67Hz */
622         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
623                    752, 800, 0, 480, 490, 492, 525, 0,
624                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@60Hz */
625         { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 738,
626                    846, 900, 0, 400, 421, 423,  449, 0,
627                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 720x400@88Hz */
628         { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 28320, 720, 738,
629                    846,  900, 0, 400, 412, 414, 449, 0,
630                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 720x400@70Hz */
631         { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296,
632                    1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
633                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */
634         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040,
635                    1136, 1312, 0,  768, 769, 772, 800, 0,
636                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1024x768@75Hz */
637         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048,
638                    1184, 1328, 0,  768, 771, 777, 806, 0,
639                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@70Hz */
640         { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
641                    1184, 1344, 0,  768, 771, 777, 806, 0,
642                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@60Hz */
643         { DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER,44900, 1024, 1032,
644                    1208, 1264, 0, 768, 768, 776, 817, 0,
645                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* 1024x768@43Hz */
646         { DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 57284, 832, 864,
647                    928, 1152, 0, 624, 625, 628, 667, 0,
648                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 832x624@75Hz */
649         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816,
650                    896, 1056, 0, 600, 601, 604,  625, 0,
651                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@75Hz */
652         { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856,
653                    976, 1040, 0, 600, 637, 643, 666, 0,
654                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@72Hz */
655         { DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216,
656                    1344, 1600, 0,  864, 865, 868, 900, 0,
657                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1152x864@75Hz */
658 };
659
660 struct minimode {
661         short w;
662         short h;
663         short r;
664         short rb;
665 };
666
667 static const struct minimode est3_modes[] = {
668         /* byte 6 */
669         { 640, 350, 85, 0 },
670         { 640, 400, 85, 0 },
671         { 720, 400, 85, 0 },
672         { 640, 480, 85, 0 },
673         { 848, 480, 60, 0 },
674         { 800, 600, 85, 0 },
675         { 1024, 768, 85, 0 },
676         { 1152, 864, 75, 0 },
677         /* byte 7 */
678         { 1280, 768, 60, 1 },
679         { 1280, 768, 60, 0 },
680         { 1280, 768, 75, 0 },
681         { 1280, 768, 85, 0 },
682         { 1280, 960, 60, 0 },
683         { 1280, 960, 85, 0 },
684         { 1280, 1024, 60, 0 },
685         { 1280, 1024, 85, 0 },
686         /* byte 8 */
687         { 1360, 768, 60, 0 },
688         { 1440, 900, 60, 1 },
689         { 1440, 900, 60, 0 },
690         { 1440, 900, 75, 0 },
691         { 1440, 900, 85, 0 },
692         { 1400, 1050, 60, 1 },
693         { 1400, 1050, 60, 0 },
694         { 1400, 1050, 75, 0 },
695         /* byte 9 */
696         { 1400, 1050, 85, 0 },
697         { 1680, 1050, 60, 1 },
698         { 1680, 1050, 60, 0 },
699         { 1680, 1050, 75, 0 },
700         { 1680, 1050, 85, 0 },
701         { 1600, 1200, 60, 0 },
702         { 1600, 1200, 65, 0 },
703         { 1600, 1200, 70, 0 },
704         /* byte 10 */
705         { 1600, 1200, 75, 0 },
706         { 1600, 1200, 85, 0 },
707         { 1792, 1344, 60, 0 },
708         { 1792, 1344, 75, 0 },
709         { 1856, 1392, 60, 0 },
710         { 1856, 1392, 75, 0 },
711         { 1920, 1200, 60, 1 },
712         { 1920, 1200, 60, 0 },
713         /* byte 11 */
714         { 1920, 1200, 75, 0 },
715         { 1920, 1200, 85, 0 },
716         { 1920, 1440, 60, 0 },
717         { 1920, 1440, 75, 0 },
718 };
719
720 static const struct minimode extra_modes[] = {
721         { 1024, 576,  60, 0 },
722         { 1366, 768,  60, 0 },
723         { 1600, 900,  60, 0 },
724         { 1680, 945,  60, 0 },
725         { 1920, 1080, 60, 0 },
726         { 2048, 1152, 60, 0 },
727         { 2048, 1536, 60, 0 },
728 };
729
730 /*
731  * From CEA/CTA-861 spec.
732  *
733  * Do not access directly, instead always use cea_mode_for_vic().
734  */
735 static const struct drm_display_mode edid_cea_modes_1[] = {
736         /* 1 - 640x480@60Hz 4:3 */
737         { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
738                    752, 800, 0, 480, 490, 492, 525, 0,
739                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
740           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
741         /* 2 - 720x480@60Hz 4:3 */
742         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
743                    798, 858, 0, 480, 489, 495, 525, 0,
744                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
745           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
746         /* 3 - 720x480@60Hz 16:9 */
747         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
748                    798, 858, 0, 480, 489, 495, 525, 0,
749                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
750           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
751         /* 4 - 1280x720@60Hz 16:9 */
752         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
753                    1430, 1650, 0, 720, 725, 730, 750, 0,
754                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
755           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
756         /* 5 - 1920x1080i@60Hz 16:9 */
757         { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
758                    2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
759                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
760                    DRM_MODE_FLAG_INTERLACE),
761           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
762         /* 6 - 720(1440)x480i@60Hz 4:3 */
763         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
764                    801, 858, 0, 480, 488, 494, 525, 0,
765                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
766                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
767           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
768         /* 7 - 720(1440)x480i@60Hz 16:9 */
769         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
770                    801, 858, 0, 480, 488, 494, 525, 0,
771                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
772                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
773           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
774         /* 8 - 720(1440)x240@60Hz 4:3 */
775         { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
776                    801, 858, 0, 240, 244, 247, 262, 0,
777                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
778                    DRM_MODE_FLAG_DBLCLK),
779           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
780         /* 9 - 720(1440)x240@60Hz 16:9 */
781         { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
782                    801, 858, 0, 240, 244, 247, 262, 0,
783                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
784                    DRM_MODE_FLAG_DBLCLK),
785           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
786         /* 10 - 2880x480i@60Hz 4:3 */
787         { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
788                    3204, 3432, 0, 480, 488, 494, 525, 0,
789                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
790                    DRM_MODE_FLAG_INTERLACE),
791           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
792         /* 11 - 2880x480i@60Hz 16:9 */
793         { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
794                    3204, 3432, 0, 480, 488, 494, 525, 0,
795                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
796                    DRM_MODE_FLAG_INTERLACE),
797           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
798         /* 12 - 2880x240@60Hz 4:3 */
799         { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
800                    3204, 3432, 0, 240, 244, 247, 262, 0,
801                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
802           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
803         /* 13 - 2880x240@60Hz 16:9 */
804         { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
805                    3204, 3432, 0, 240, 244, 247, 262, 0,
806                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
807           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
808         /* 14 - 1440x480@60Hz 4:3 */
809         { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
810                    1596, 1716, 0, 480, 489, 495, 525, 0,
811                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
812           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
813         /* 15 - 1440x480@60Hz 16:9 */
814         { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
815                    1596, 1716, 0, 480, 489, 495, 525, 0,
816                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
817           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
818         /* 16 - 1920x1080@60Hz 16:9 */
819         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
820                    2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
821                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
822           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
823         /* 17 - 720x576@50Hz 4:3 */
824         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
825                    796, 864, 0, 576, 581, 586, 625, 0,
826                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
827           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
828         /* 18 - 720x576@50Hz 16:9 */
829         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
830                    796, 864, 0, 576, 581, 586, 625, 0,
831                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
832           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
833         /* 19 - 1280x720@50Hz 16:9 */
834         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
835                    1760, 1980, 0, 720, 725, 730, 750, 0,
836                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
837           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
838         /* 20 - 1920x1080i@50Hz 16:9 */
839         { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
840                    2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
841                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
842                    DRM_MODE_FLAG_INTERLACE),
843           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
844         /* 21 - 720(1440)x576i@50Hz 4:3 */
845         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
846                    795, 864, 0, 576, 580, 586, 625, 0,
847                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
848                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
849           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
850         /* 22 - 720(1440)x576i@50Hz 16:9 */
851         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
852                    795, 864, 0, 576, 580, 586, 625, 0,
853                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
854                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
855           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
856         /* 23 - 720(1440)x288@50Hz 4:3 */
857         { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
858                    795, 864, 0, 288, 290, 293, 312, 0,
859                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
860                    DRM_MODE_FLAG_DBLCLK),
861           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
862         /* 24 - 720(1440)x288@50Hz 16:9 */
863         { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
864                    795, 864, 0, 288, 290, 293, 312, 0,
865                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
866                    DRM_MODE_FLAG_DBLCLK),
867           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
868         /* 25 - 2880x576i@50Hz 4:3 */
869         { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
870                    3180, 3456, 0, 576, 580, 586, 625, 0,
871                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
872                    DRM_MODE_FLAG_INTERLACE),
873           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
874         /* 26 - 2880x576i@50Hz 16:9 */
875         { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
876                    3180, 3456, 0, 576, 580, 586, 625, 0,
877                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
878                    DRM_MODE_FLAG_INTERLACE),
879           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
880         /* 27 - 2880x288@50Hz 4:3 */
881         { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
882                    3180, 3456, 0, 288, 290, 293, 312, 0,
883                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
884           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
885         /* 28 - 2880x288@50Hz 16:9 */
886         { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
887                    3180, 3456, 0, 288, 290, 293, 312, 0,
888                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
889           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
890         /* 29 - 1440x576@50Hz 4:3 */
891         { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
892                    1592, 1728, 0, 576, 581, 586, 625, 0,
893                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
894           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
895         /* 30 - 1440x576@50Hz 16:9 */
896         { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
897                    1592, 1728, 0, 576, 581, 586, 625, 0,
898                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
899           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
900         /* 31 - 1920x1080@50Hz 16:9 */
901         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
902                    2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
903                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
904           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
905         /* 32 - 1920x1080@24Hz 16:9 */
906         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
907                    2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
908                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
909           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
910         /* 33 - 1920x1080@25Hz 16:9 */
911         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
912                    2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
913                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
914           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
915         /* 34 - 1920x1080@30Hz 16:9 */
916         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
917                    2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
918                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
919           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
920         /* 35 - 2880x480@60Hz 4:3 */
921         { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
922                    3192, 3432, 0, 480, 489, 495, 525, 0,
923                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
924           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
925         /* 36 - 2880x480@60Hz 16:9 */
926         { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
927                    3192, 3432, 0, 480, 489, 495, 525, 0,
928                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
929           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
930         /* 37 - 2880x576@50Hz 4:3 */
931         { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
932                    3184, 3456, 0, 576, 581, 586, 625, 0,
933                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
934           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
935         /* 38 - 2880x576@50Hz 16:9 */
936         { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
937                    3184, 3456, 0, 576, 581, 586, 625, 0,
938                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
939           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
940         /* 39 - 1920x1080i@50Hz 16:9 */
941         { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952,
942                    2120, 2304, 0, 1080, 1126, 1136, 1250, 0,
943                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC |
944                    DRM_MODE_FLAG_INTERLACE),
945           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
946         /* 40 - 1920x1080i@100Hz 16:9 */
947         { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
948                    2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
949                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
950                    DRM_MODE_FLAG_INTERLACE),
951           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
952         /* 41 - 1280x720@100Hz 16:9 */
953         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
954                    1760, 1980, 0, 720, 725, 730, 750, 0,
955                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
956           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
957         /* 42 - 720x576@100Hz 4:3 */
958         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
959                    796, 864, 0, 576, 581, 586, 625, 0,
960                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
961           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
962         /* 43 - 720x576@100Hz 16:9 */
963         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
964                    796, 864, 0, 576, 581, 586, 625, 0,
965                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
966           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
967         /* 44 - 720(1440)x576i@100Hz 4:3 */
968         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
969                    795, 864, 0, 576, 580, 586, 625, 0,
970                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
971                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
972           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
973         /* 45 - 720(1440)x576i@100Hz 16:9 */
974         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
975                    795, 864, 0, 576, 580, 586, 625, 0,
976                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
977                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
978           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
979         /* 46 - 1920x1080i@120Hz 16:9 */
980         { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
981                    2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
982                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
983                    DRM_MODE_FLAG_INTERLACE),
984           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
985         /* 47 - 1280x720@120Hz 16:9 */
986         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
987                    1430, 1650, 0, 720, 725, 730, 750, 0,
988                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
989           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
990         /* 48 - 720x480@120Hz 4:3 */
991         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
992                    798, 858, 0, 480, 489, 495, 525, 0,
993                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
994           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
995         /* 49 - 720x480@120Hz 16:9 */
996         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
997                    798, 858, 0, 480, 489, 495, 525, 0,
998                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
999           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1000         /* 50 - 720(1440)x480i@120Hz 4:3 */
1001         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
1002                    801, 858, 0, 480, 488, 494, 525, 0,
1003                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1004                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1005           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
1006         /* 51 - 720(1440)x480i@120Hz 16:9 */
1007         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
1008                    801, 858, 0, 480, 488, 494, 525, 0,
1009                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1010                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1011           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1012         /* 52 - 720x576@200Hz 4:3 */
1013         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
1014                    796, 864, 0, 576, 581, 586, 625, 0,
1015                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
1016           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
1017         /* 53 - 720x576@200Hz 16:9 */
1018         { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
1019                    796, 864, 0, 576, 581, 586, 625, 0,
1020                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
1021           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1022         /* 54 - 720(1440)x576i@200Hz 4:3 */
1023         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
1024                    795, 864, 0, 576, 580, 586, 625, 0,
1025                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1026                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1027           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
1028         /* 55 - 720(1440)x576i@200Hz 16:9 */
1029         { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
1030                    795, 864, 0, 576, 580, 586, 625, 0,
1031                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1032                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1033           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1034         /* 56 - 720x480@240Hz 4:3 */
1035         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
1036                    798, 858, 0, 480, 489, 495, 525, 0,
1037                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
1038           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
1039         /* 57 - 720x480@240Hz 16:9 */
1040         { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
1041                    798, 858, 0, 480, 489, 495, 525, 0,
1042                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
1043           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1044         /* 58 - 720(1440)x480i@240Hz 4:3 */
1045         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
1046                    801, 858, 0, 480, 488, 494, 525, 0,
1047                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1048                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1049           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
1050         /* 59 - 720(1440)x480i@240Hz 16:9 */
1051         { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
1052                    801, 858, 0, 480, 488, 494, 525, 0,
1053                    DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1054                    DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1055           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1056         /* 60 - 1280x720@24Hz 16:9 */
1057         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
1058                    3080, 3300, 0, 720, 725, 730, 750, 0,
1059                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1060           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1061         /* 61 - 1280x720@25Hz 16:9 */
1062         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
1063                    3740, 3960, 0, 720, 725, 730, 750, 0,
1064                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1065           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1066         /* 62 - 1280x720@30Hz 16:9 */
1067         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
1068                    3080, 3300, 0, 720, 725, 730, 750, 0,
1069                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1070           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1071         /* 63 - 1920x1080@120Hz 16:9 */
1072         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
1073                    2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
1074                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1075           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1076         /* 64 - 1920x1080@100Hz 16:9 */
1077         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
1078                    2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
1079                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1080           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1081         /* 65 - 1280x720@24Hz 64:27 */
1082         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
1083                    3080, 3300, 0, 720, 725, 730, 750, 0,
1084                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1085           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1086         /* 66 - 1280x720@25Hz 64:27 */
1087         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
1088                    3740, 3960, 0, 720, 725, 730, 750, 0,
1089                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1090           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1091         /* 67 - 1280x720@30Hz 64:27 */
1092         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
1093                    3080, 3300, 0, 720, 725, 730, 750, 0,
1094                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1095           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1096         /* 68 - 1280x720@50Hz 64:27 */
1097         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
1098                    1760, 1980, 0, 720, 725, 730, 750, 0,
1099                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1100           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1101         /* 69 - 1280x720@60Hz 64:27 */
1102         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
1103                    1430, 1650, 0, 720, 725, 730, 750, 0,
1104                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1105           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1106         /* 70 - 1280x720@100Hz 64:27 */
1107         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
1108                    1760, 1980, 0, 720, 725, 730, 750, 0,
1109                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1110           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1111         /* 71 - 1280x720@120Hz 64:27 */
1112         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
1113                    1430, 1650, 0, 720, 725, 730, 750, 0,
1114                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1115           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1116         /* 72 - 1920x1080@24Hz 64:27 */
1117         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
1118                    2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
1119                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1120           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1121         /* 73 - 1920x1080@25Hz 64:27 */
1122         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
1123                    2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
1124                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1125           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1126         /* 74 - 1920x1080@30Hz 64:27 */
1127         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
1128                    2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
1129                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1130           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1131         /* 75 - 1920x1080@50Hz 64:27 */
1132         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
1133                    2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
1134                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1135           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1136         /* 76 - 1920x1080@60Hz 64:27 */
1137         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
1138                    2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
1139                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1140           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1141         /* 77 - 1920x1080@100Hz 64:27 */
1142         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
1143                    2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
1144                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1145           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1146         /* 78 - 1920x1080@120Hz 64:27 */
1147         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
1148                    2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
1149                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1150           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1151         /* 79 - 1680x720@24Hz 64:27 */
1152         { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 3040,
1153                    3080, 3300, 0, 720, 725, 730, 750, 0,
1154                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1155           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1156         /* 80 - 1680x720@25Hz 64:27 */
1157         { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 2908,
1158                    2948, 3168, 0, 720, 725, 730, 750, 0,
1159                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1160           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1161         /* 81 - 1680x720@30Hz 64:27 */
1162         { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 2380,
1163                    2420, 2640, 0, 720, 725, 730, 750, 0,
1164                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1165           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1166         /* 82 - 1680x720@50Hz 64:27 */
1167         { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 82500, 1680, 1940,
1168                    1980, 2200, 0, 720, 725, 730, 750, 0,
1169                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1170           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1171         /* 83 - 1680x720@60Hz 64:27 */
1172         { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 99000, 1680, 1940,
1173                    1980, 2200, 0, 720, 725, 730, 750, 0,
1174                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1175           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1176         /* 84 - 1680x720@100Hz 64:27 */
1177         { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 165000, 1680, 1740,
1178                    1780, 2000, 0, 720, 725, 730, 825, 0,
1179                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1180           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1181         /* 85 - 1680x720@120Hz 64:27 */
1182         { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 198000, 1680, 1740,
1183                    1780, 2000, 0, 720, 725, 730, 825, 0,
1184                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1185           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1186         /* 86 - 2560x1080@24Hz 64:27 */
1187         { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 99000, 2560, 3558,
1188                    3602, 3750, 0, 1080, 1084, 1089, 1100, 0,
1189                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1190           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1191         /* 87 - 2560x1080@25Hz 64:27 */
1192         { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 90000, 2560, 3008,
1193                    3052, 3200, 0, 1080, 1084, 1089, 1125, 0,
1194                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1195           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1196         /* 88 - 2560x1080@30Hz 64:27 */
1197         { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 118800, 2560, 3328,
1198                    3372, 3520, 0, 1080, 1084, 1089, 1125, 0,
1199                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1200           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1201         /* 89 - 2560x1080@50Hz 64:27 */
1202         { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 185625, 2560, 3108,
1203                    3152, 3300, 0, 1080, 1084, 1089, 1125, 0,
1204                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1205           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1206         /* 90 - 2560x1080@60Hz 64:27 */
1207         { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 198000, 2560, 2808,
1208                    2852, 3000, 0, 1080, 1084, 1089, 1100, 0,
1209                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1210           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1211         /* 91 - 2560x1080@100Hz 64:27 */
1212         { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 371250, 2560, 2778,
1213                    2822, 2970, 0, 1080, 1084, 1089, 1250, 0,
1214                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1215           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1216         /* 92 - 2560x1080@120Hz 64:27 */
1217         { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 495000, 2560, 3108,
1218                    3152, 3300, 0, 1080, 1084, 1089, 1250, 0,
1219                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1220           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1221         /* 93 - 3840x2160@24Hz 16:9 */
1222         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116,
1223                    5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1224                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1225           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1226         /* 94 - 3840x2160@25Hz 16:9 */
1227         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896,
1228                    4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1229                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1230           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1231         /* 95 - 3840x2160@30Hz 16:9 */
1232         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
1233                    4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1234                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1235           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1236         /* 96 - 3840x2160@50Hz 16:9 */
1237         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896,
1238                    4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1239                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1240           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1241         /* 97 - 3840x2160@60Hz 16:9 */
1242         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
1243                    4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1244                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1245           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1246         /* 98 - 4096x2160@24Hz 256:135 */
1247         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5116,
1248                    5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1249                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1250           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1251         /* 99 - 4096x2160@25Hz 256:135 */
1252         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5064,
1253                    5152, 5280, 0, 2160, 2168, 2178, 2250, 0,
1254                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1255           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1256         /* 100 - 4096x2160@30Hz 256:135 */
1257         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 4184,
1258                    4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
1259                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1260           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1261         /* 101 - 4096x2160@50Hz 256:135 */
1262         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 5064,
1263                    5152, 5280, 0, 2160, 2168, 2178, 2250, 0,
1264                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1265           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1266         /* 102 - 4096x2160@60Hz 256:135 */
1267         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 4184,
1268                    4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
1269                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1270           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1271         /* 103 - 3840x2160@24Hz 64:27 */
1272         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116,
1273                    5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1274                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1275           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1276         /* 104 - 3840x2160@25Hz 64:27 */
1277         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896,
1278                    4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1279                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1280           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1281         /* 105 - 3840x2160@30Hz 64:27 */
1282         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
1283                    4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1284                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1285           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1286         /* 106 - 3840x2160@50Hz 64:27 */
1287         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896,
1288                    4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1289                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1290           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1291         /* 107 - 3840x2160@60Hz 64:27 */
1292         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
1293                    4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1294                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1295           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1296         /* 108 - 1280x720@48Hz 16:9 */
1297         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 90000, 1280, 2240,
1298                    2280, 2500, 0, 720, 725, 730, 750, 0,
1299                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1300           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1301         /* 109 - 1280x720@48Hz 64:27 */
1302         { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 90000, 1280, 2240,
1303                    2280, 2500, 0, 720, 725, 730, 750, 0,
1304                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1305           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1306         /* 110 - 1680x720@48Hz 64:27 */
1307         { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 99000, 1680, 2490,
1308                    2530, 2750, 0, 720, 725, 730, 750, 0,
1309                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1310           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1311         /* 111 - 1920x1080@48Hz 16:9 */
1312         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2558,
1313                    2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
1314                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1315           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1316         /* 112 - 1920x1080@48Hz 64:27 */
1317         { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2558,
1318                    2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
1319                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1320           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1321         /* 113 - 2560x1080@48Hz 64:27 */
1322         { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 198000, 2560, 3558,
1323                    3602, 3750, 0, 1080, 1084, 1089, 1100, 0,
1324                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1325           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1326         /* 114 - 3840x2160@48Hz 16:9 */
1327         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 5116,
1328                    5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1329                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1330           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1331         /* 115 - 4096x2160@48Hz 256:135 */
1332         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 5116,
1333                    5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1334                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1335           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1336         /* 116 - 3840x2160@48Hz 64:27 */
1337         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 5116,
1338                    5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1339                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1340           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1341         /* 117 - 3840x2160@100Hz 16:9 */
1342         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4896,
1343                    4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1344                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1345           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1346         /* 118 - 3840x2160@120Hz 16:9 */
1347         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4016,
1348                    4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1349                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1350           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1351         /* 119 - 3840x2160@100Hz 64:27 */
1352         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4896,
1353                    4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1354                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1355           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1356         /* 120 - 3840x2160@120Hz 64:27 */
1357         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4016,
1358                    4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1359                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1360           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1361         /* 121 - 5120x2160@24Hz 64:27 */
1362         { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 7116,
1363                    7204, 7500, 0, 2160, 2168, 2178, 2200, 0,
1364                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1365           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1366         /* 122 - 5120x2160@25Hz 64:27 */
1367         { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 6816,
1368                    6904, 7200, 0, 2160, 2168, 2178, 2200, 0,
1369                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1370           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1371         /* 123 - 5120x2160@30Hz 64:27 */
1372         { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 5784,
1373                    5872, 6000, 0, 2160, 2168, 2178, 2200, 0,
1374                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1375           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1376         /* 124 - 5120x2160@48Hz 64:27 */
1377         { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 5866,
1378                    5954, 6250, 0, 2160, 2168, 2178, 2475, 0,
1379                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1380           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1381         /* 125 - 5120x2160@50Hz 64:27 */
1382         { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 6216,
1383                    6304, 6600, 0, 2160, 2168, 2178, 2250, 0,
1384                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1385           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1386         /* 126 - 5120x2160@60Hz 64:27 */
1387         { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 5284,
1388                    5372, 5500, 0, 2160, 2168, 2178, 2250, 0,
1389                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1390           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1391         /* 127 - 5120x2160@100Hz 64:27 */
1392         { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 1485000, 5120, 6216,
1393                    6304, 6600, 0, 2160, 2168, 2178, 2250, 0,
1394                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1395           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1396 };
1397
1398 /*
1399  * From CEA/CTA-861 spec.
1400  *
1401  * Do not access directly, instead always use cea_mode_for_vic().
1402  */
1403 static const struct drm_display_mode edid_cea_modes_193[] = {
1404         /* 193 - 5120x2160@120Hz 64:27 */
1405         { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 1485000, 5120, 5284,
1406                    5372, 5500, 0, 2160, 2168, 2178, 2250, 0,
1407                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1408           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1409         /* 194 - 7680x4320@24Hz 16:9 */
1410         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10232,
1411                    10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
1412                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1413           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1414         /* 195 - 7680x4320@25Hz 16:9 */
1415         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10032,
1416                    10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
1417                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1418           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1419         /* 196 - 7680x4320@30Hz 16:9 */
1420         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 8232,
1421                    8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
1422                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1423           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1424         /* 197 - 7680x4320@48Hz 16:9 */
1425         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10232,
1426                    10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
1427                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1428           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1429         /* 198 - 7680x4320@50Hz 16:9 */
1430         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10032,
1431                    10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
1432                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1433           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1434         /* 199 - 7680x4320@60Hz 16:9 */
1435         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 8232,
1436                    8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
1437                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1438           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1439         /* 200 - 7680x4320@100Hz 16:9 */
1440         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 9792,
1441                    9968, 10560, 0, 4320, 4336, 4356, 4500, 0,
1442                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1443           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1444         /* 201 - 7680x4320@120Hz 16:9 */
1445         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 8032,
1446                    8208, 8800, 0, 4320, 4336, 4356, 4500, 0,
1447                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1448           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1449         /* 202 - 7680x4320@24Hz 64:27 */
1450         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10232,
1451                    10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
1452                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1453           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1454         /* 203 - 7680x4320@25Hz 64:27 */
1455         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10032,
1456                    10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
1457                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1458           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1459         /* 204 - 7680x4320@30Hz 64:27 */
1460         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 8232,
1461                    8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
1462                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1463           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1464         /* 205 - 7680x4320@48Hz 64:27 */
1465         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10232,
1466                    10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
1467                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1468           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1469         /* 206 - 7680x4320@50Hz 64:27 */
1470         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10032,
1471                    10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
1472                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1473           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1474         /* 207 - 7680x4320@60Hz 64:27 */
1475         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 8232,
1476                    8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
1477                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1478           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1479         /* 208 - 7680x4320@100Hz 64:27 */
1480         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 9792,
1481                    9968, 10560, 0, 4320, 4336, 4356, 4500, 0,
1482                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1483           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1484         /* 209 - 7680x4320@120Hz 64:27 */
1485         { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 8032,
1486                    8208, 8800, 0, 4320, 4336, 4356, 4500, 0,
1487                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1488           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1489         /* 210 - 10240x4320@24Hz 64:27 */
1490         { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 11732,
1491                    11908, 12500, 0, 4320, 4336, 4356, 4950, 0,
1492                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1493           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1494         /* 211 - 10240x4320@25Hz 64:27 */
1495         { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 12732,
1496                    12908, 13500, 0, 4320, 4336, 4356, 4400, 0,
1497                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1498           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1499         /* 212 - 10240x4320@30Hz 64:27 */
1500         { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 10528,
1501                    10704, 11000, 0, 4320, 4336, 4356, 4500, 0,
1502                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1503           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1504         /* 213 - 10240x4320@48Hz 64:27 */
1505         { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 11732,
1506                    11908, 12500, 0, 4320, 4336, 4356, 4950, 0,
1507                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1508           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1509         /* 214 - 10240x4320@50Hz 64:27 */
1510         { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 12732,
1511                    12908, 13500, 0, 4320, 4336, 4356, 4400, 0,
1512                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1513           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1514         /* 215 - 10240x4320@60Hz 64:27 */
1515         { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 10528,
1516                    10704, 11000, 0, 4320, 4336, 4356, 4500, 0,
1517                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1518           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1519         /* 216 - 10240x4320@100Hz 64:27 */
1520         { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 5940000, 10240, 12432,
1521                    12608, 13200, 0, 4320, 4336, 4356, 4500, 0,
1522                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1523           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1524         /* 217 - 10240x4320@120Hz 64:27 */
1525         { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 5940000, 10240, 10528,
1526                    10704, 11000, 0, 4320, 4336, 4356, 4500, 0,
1527                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1528           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1529         /* 218 - 4096x2160@100Hz 256:135 */
1530         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 1188000, 4096, 4896,
1531                    4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1532                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1533           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1534         /* 219 - 4096x2160@120Hz 256:135 */
1535         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 1188000, 4096, 4184,
1536                    4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
1537                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1538           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1539 };
1540
1541 /*
1542  * HDMI 1.4 4k modes. Index using the VIC.
1543  */
1544 static const struct drm_display_mode edid_4k_modes[] = {
1545         /* 0 - dummy, VICs start at 1 */
1546         { },
1547         /* 1 - 3840x2160@30Hz */
1548         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
1549                    3840, 4016, 4104, 4400, 0,
1550                    2160, 2168, 2178, 2250, 0,
1551                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1552           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1553         /* 2 - 3840x2160@25Hz */
1554         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
1555                    3840, 4896, 4984, 5280, 0,
1556                    2160, 2168, 2178, 2250, 0,
1557                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1558           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1559         /* 3 - 3840x2160@24Hz */
1560         { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
1561                    3840, 5116, 5204, 5500, 0,
1562                    2160, 2168, 2178, 2250, 0,
1563                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1564           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1565         /* 4 - 4096x2160@24Hz (SMPTE) */
1566         { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000,
1567                    4096, 5116, 5204, 5500, 0,
1568                    2160, 2168, 2178, 2250, 0,
1569                    DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1570           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1571 };
1572
1573 /*** DDC fetch and block validation ***/
1574
1575 /*
1576  * The opaque EDID type, internal to drm_edid.c.
1577  */
1578 struct drm_edid {
1579         /* Size allocated for edid */
1580         size_t size;
1581         const struct edid *edid;
1582 };
1583
1584 static int edid_hfeeodb_extension_block_count(const struct edid *edid);
1585
1586 static int edid_hfeeodb_block_count(const struct edid *edid)
1587 {
1588         int eeodb = edid_hfeeodb_extension_block_count(edid);
1589
1590         return eeodb ? eeodb + 1 : 0;
1591 }
1592
1593 static int edid_extension_block_count(const struct edid *edid)
1594 {
1595         return edid->extensions;
1596 }
1597
1598 static int edid_block_count(const struct edid *edid)
1599 {
1600         return edid_extension_block_count(edid) + 1;
1601 }
1602
1603 static int edid_size_by_blocks(int num_blocks)
1604 {
1605         return num_blocks * EDID_LENGTH;
1606 }
1607
1608 static int edid_size(const struct edid *edid)
1609 {
1610         return edid_size_by_blocks(edid_block_count(edid));
1611 }
1612
1613 static const void *edid_block_data(const struct edid *edid, int index)
1614 {
1615         BUILD_BUG_ON(sizeof(*edid) != EDID_LENGTH);
1616
1617         return edid + index;
1618 }
1619
1620 static const void *edid_extension_block_data(const struct edid *edid, int index)
1621 {
1622         return edid_block_data(edid, index + 1);
1623 }
1624
1625 /* EDID block count indicated in EDID, may exceed allocated size */
1626 static int __drm_edid_block_count(const struct drm_edid *drm_edid)
1627 {
1628         int num_blocks;
1629
1630         /* Starting point */
1631         num_blocks = edid_block_count(drm_edid->edid);
1632
1633         /* HF-EEODB override */
1634         if (drm_edid->size >= edid_size_by_blocks(2)) {
1635                 int eeodb;
1636
1637                 /*
1638                  * Note: HF-EEODB may specify a smaller extension count than the
1639                  * regular one. Unlike in buffer allocation, here we can use it.
1640                  */
1641                 eeodb = edid_hfeeodb_block_count(drm_edid->edid);
1642                 if (eeodb)
1643                         num_blocks = eeodb;
1644         }
1645
1646         return num_blocks;
1647 }
1648
1649 /* EDID block count, limited by allocated size */
1650 static int drm_edid_block_count(const struct drm_edid *drm_edid)
1651 {
1652         /* Limit by allocated size */
1653         return min(__drm_edid_block_count(drm_edid),
1654                    (int)drm_edid->size / EDID_LENGTH);
1655 }
1656
1657 /* EDID extension block count, limited by allocated size */
1658 static int drm_edid_extension_block_count(const struct drm_edid *drm_edid)
1659 {
1660         return drm_edid_block_count(drm_edid) - 1;
1661 }
1662
1663 static const void *drm_edid_block_data(const struct drm_edid *drm_edid, int index)
1664 {
1665         return edid_block_data(drm_edid->edid, index);
1666 }
1667
1668 static const void *drm_edid_extension_block_data(const struct drm_edid *drm_edid,
1669                                                  int index)
1670 {
1671         return edid_extension_block_data(drm_edid->edid, index);
1672 }
1673
1674 /*
1675  * Initializer helper for legacy interfaces, where we have no choice but to
1676  * trust edid size. Not for general purpose use.
1677  */
1678 static const struct drm_edid *drm_edid_legacy_init(struct drm_edid *drm_edid,
1679                                                    const struct edid *edid)
1680 {
1681         if (!edid)
1682                 return NULL;
1683
1684         memset(drm_edid, 0, sizeof(*drm_edid));
1685
1686         drm_edid->edid = edid;
1687         drm_edid->size = edid_size(edid);
1688
1689         return drm_edid;
1690 }
1691
1692 /*
1693  * EDID base and extension block iterator.
1694  *
1695  * struct drm_edid_iter iter;
1696  * const u8 *block;
1697  *
1698  * drm_edid_iter_begin(drm_edid, &iter);
1699  * drm_edid_iter_for_each(block, &iter) {
1700  *         // do stuff with block
1701  * }
1702  * drm_edid_iter_end(&iter);
1703  */
1704 struct drm_edid_iter {
1705         const struct drm_edid *drm_edid;
1706
1707         /* Current block index. */
1708         int index;
1709 };
1710
1711 static void drm_edid_iter_begin(const struct drm_edid *drm_edid,
1712                                 struct drm_edid_iter *iter)
1713 {
1714         memset(iter, 0, sizeof(*iter));
1715
1716         iter->drm_edid = drm_edid;
1717 }
1718
1719 static const void *__drm_edid_iter_next(struct drm_edid_iter *iter)
1720 {
1721         const void *block = NULL;
1722
1723         if (!iter->drm_edid)
1724                 return NULL;
1725
1726         if (iter->index < drm_edid_block_count(iter->drm_edid))
1727                 block = drm_edid_block_data(iter->drm_edid, iter->index++);
1728
1729         return block;
1730 }
1731
1732 #define drm_edid_iter_for_each(__block, __iter)                 \
1733         while (((__block) = __drm_edid_iter_next(__iter)))
1734
1735 static void drm_edid_iter_end(struct drm_edid_iter *iter)
1736 {
1737         memset(iter, 0, sizeof(*iter));
1738 }
1739
1740 static const u8 edid_header[] = {
1741         0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
1742 };
1743
1744 static void edid_header_fix(void *edid)
1745 {
1746         memcpy(edid, edid_header, sizeof(edid_header));
1747 }
1748
1749 /**
1750  * drm_edid_header_is_valid - sanity check the header of the base EDID block
1751  * @_edid: pointer to raw base EDID block
1752  *
1753  * Sanity check the header of the base EDID block.
1754  *
1755  * Return: 8 if the header is perfect, down to 0 if it's totally wrong.
1756  */
1757 int drm_edid_header_is_valid(const void *_edid)
1758 {
1759         const struct edid *edid = _edid;
1760         int i, score = 0;
1761
1762         for (i = 0; i < sizeof(edid_header); i++) {
1763                 if (edid->header[i] == edid_header[i])
1764                         score++;
1765         }
1766
1767         return score;
1768 }
1769 EXPORT_SYMBOL(drm_edid_header_is_valid);
1770
1771 static int edid_fixup __read_mostly = 6;
1772 module_param_named(edid_fixup, edid_fixup, int, 0400);
1773 MODULE_PARM_DESC(edid_fixup,
1774                  "Minimum number of valid EDID header bytes (0-8, default 6)");
1775
1776 static int edid_block_compute_checksum(const void *_block)
1777 {
1778         const u8 *block = _block;
1779         int i;
1780         u8 csum = 0, crc = 0;
1781
1782         for (i = 0; i < EDID_LENGTH - 1; i++)
1783                 csum += block[i];
1784
1785         crc = 0x100 - csum;
1786
1787         return crc;
1788 }
1789
1790 static int edid_block_get_checksum(const void *_block)
1791 {
1792         const struct edid *block = _block;
1793
1794         return block->checksum;
1795 }
1796
1797 static int edid_block_tag(const void *_block)
1798 {
1799         const u8 *block = _block;
1800
1801         return block[0];
1802 }
1803
1804 static bool edid_block_is_zero(const void *edid)
1805 {
1806         return !memchr_inv(edid, 0, EDID_LENGTH);
1807 }
1808
1809 /**
1810  * drm_edid_are_equal - compare two edid blobs.
1811  * @edid1: pointer to first blob
1812  * @edid2: pointer to second blob
1813  * This helper can be used during probing to determine if
1814  * edid had changed.
1815  */
1816 bool drm_edid_are_equal(const struct edid *edid1, const struct edid *edid2)
1817 {
1818         int edid1_len, edid2_len;
1819         bool edid1_present = edid1 != NULL;
1820         bool edid2_present = edid2 != NULL;
1821
1822         if (edid1_present != edid2_present)
1823                 return false;
1824
1825         if (edid1) {
1826                 edid1_len = edid_size(edid1);
1827                 edid2_len = edid_size(edid2);
1828
1829                 if (edid1_len != edid2_len)
1830                         return false;
1831
1832                 if (memcmp(edid1, edid2, edid1_len))
1833                         return false;
1834         }
1835
1836         return true;
1837 }
1838 EXPORT_SYMBOL(drm_edid_are_equal);
1839
1840 enum edid_block_status {
1841         EDID_BLOCK_OK = 0,
1842         EDID_BLOCK_READ_FAIL,
1843         EDID_BLOCK_NULL,
1844         EDID_BLOCK_ZERO,
1845         EDID_BLOCK_HEADER_CORRUPT,
1846         EDID_BLOCK_HEADER_REPAIR,
1847         EDID_BLOCK_HEADER_FIXED,
1848         EDID_BLOCK_CHECKSUM,
1849         EDID_BLOCK_VERSION,
1850 };
1851
1852 static enum edid_block_status edid_block_check(const void *_block,
1853                                                bool is_base_block)
1854 {
1855         const struct edid *block = _block;
1856
1857         if (!block)
1858                 return EDID_BLOCK_NULL;
1859
1860         if (is_base_block) {
1861                 int score = drm_edid_header_is_valid(block);
1862
1863                 if (score < clamp(edid_fixup, 0, 8)) {
1864                         if (edid_block_is_zero(block))
1865                                 return EDID_BLOCK_ZERO;
1866                         else
1867                                 return EDID_BLOCK_HEADER_CORRUPT;
1868                 }
1869
1870                 if (score < 8)
1871                         return EDID_BLOCK_HEADER_REPAIR;
1872         }
1873
1874         if (edid_block_compute_checksum(block) != edid_block_get_checksum(block)) {
1875                 if (edid_block_is_zero(block))
1876                         return EDID_BLOCK_ZERO;
1877                 else
1878                         return EDID_BLOCK_CHECKSUM;
1879         }
1880
1881         if (is_base_block) {
1882                 if (block->version != 1)
1883                         return EDID_BLOCK_VERSION;
1884         }
1885
1886         return EDID_BLOCK_OK;
1887 }
1888
1889 static bool edid_block_status_valid(enum edid_block_status status, int tag)
1890 {
1891         return status == EDID_BLOCK_OK ||
1892                 status == EDID_BLOCK_HEADER_FIXED ||
1893                 (status == EDID_BLOCK_CHECKSUM && tag == CEA_EXT);
1894 }
1895
1896 static bool edid_block_valid(const void *block, bool base)
1897 {
1898         return edid_block_status_valid(edid_block_check(block, base),
1899                                        edid_block_tag(block));
1900 }
1901
1902 static void edid_block_status_print(enum edid_block_status status,
1903                                     const struct edid *block,
1904                                     int block_num)
1905 {
1906         switch (status) {
1907         case EDID_BLOCK_OK:
1908                 break;
1909         case EDID_BLOCK_READ_FAIL:
1910                 pr_debug("EDID block %d read failed\n", block_num);
1911                 break;
1912         case EDID_BLOCK_NULL:
1913                 pr_debug("EDID block %d pointer is NULL\n", block_num);
1914                 break;
1915         case EDID_BLOCK_ZERO:
1916                 pr_notice("EDID block %d is all zeroes\n", block_num);
1917                 break;
1918         case EDID_BLOCK_HEADER_CORRUPT:
1919                 pr_notice("EDID has corrupt header\n");
1920                 break;
1921         case EDID_BLOCK_HEADER_REPAIR:
1922                 pr_debug("EDID corrupt header needs repair\n");
1923                 break;
1924         case EDID_BLOCK_HEADER_FIXED:
1925                 pr_debug("EDID corrupt header fixed\n");
1926                 break;
1927         case EDID_BLOCK_CHECKSUM:
1928                 if (edid_block_status_valid(status, edid_block_tag(block))) {
1929                         pr_debug("EDID block %d (tag 0x%02x) checksum is invalid, remainder is %d, ignoring\n",
1930                                  block_num, edid_block_tag(block),
1931                                  edid_block_compute_checksum(block));
1932                 } else {
1933                         pr_notice("EDID block %d (tag 0x%02x) checksum is invalid, remainder is %d\n",
1934                                   block_num, edid_block_tag(block),
1935                                   edid_block_compute_checksum(block));
1936                 }
1937                 break;
1938         case EDID_BLOCK_VERSION:
1939                 pr_notice("EDID has major version %d, instead of 1\n",
1940                           block->version);
1941                 break;
1942         default:
1943                 WARN(1, "EDID block %d unknown edid block status code %d\n",
1944                      block_num, status);
1945                 break;
1946         }
1947 }
1948
1949 static void edid_block_dump(const char *level, const void *block, int block_num)
1950 {
1951         enum edid_block_status status;
1952         char prefix[20];
1953
1954         status = edid_block_check(block, block_num == 0);
1955         if (status == EDID_BLOCK_ZERO)
1956                 sprintf(prefix, "\t[%02x] ZERO ", block_num);
1957         else if (!edid_block_status_valid(status, edid_block_tag(block)))
1958                 sprintf(prefix, "\t[%02x] BAD  ", block_num);
1959         else
1960                 sprintf(prefix, "\t[%02x] GOOD ", block_num);
1961
1962         print_hex_dump(level, prefix, DUMP_PREFIX_NONE, 16, 1,
1963                        block, EDID_LENGTH, false);
1964 }
1965
1966 /**
1967  * drm_edid_block_valid - Sanity check the EDID block (base or extension)
1968  * @_block: pointer to raw EDID block
1969  * @block_num: type of block to validate (0 for base, extension otherwise)
1970  * @print_bad_edid: if true, dump bad EDID blocks to the console
1971  * @edid_corrupt: if true, the header or checksum is invalid
1972  *
1973  * Validate a base or extension EDID block and optionally dump bad blocks to
1974  * the console.
1975  *
1976  * Return: True if the block is valid, false otherwise.
1977  */
1978 bool drm_edid_block_valid(u8 *_block, int block_num, bool print_bad_edid,
1979                           bool *edid_corrupt)
1980 {
1981         struct edid *block = (struct edid *)_block;
1982         enum edid_block_status status;
1983         bool is_base_block = block_num == 0;
1984         bool valid;
1985
1986         if (WARN_ON(!block))
1987                 return false;
1988
1989         status = edid_block_check(block, is_base_block);
1990         if (status == EDID_BLOCK_HEADER_REPAIR) {
1991                 DRM_DEBUG_KMS("Fixing EDID header, your hardware may be failing\n");
1992                 edid_header_fix(block);
1993
1994                 /* Retry with fixed header, update status if that worked. */
1995                 status = edid_block_check(block, is_base_block);
1996                 if (status == EDID_BLOCK_OK)
1997                         status = EDID_BLOCK_HEADER_FIXED;
1998         }
1999
2000         if (edid_corrupt) {
2001                 /*
2002                  * Unknown major version isn't corrupt but we can't use it. Only
2003                  * the base block can reset edid_corrupt to false.
2004                  */
2005                 if (is_base_block &&
2006                     (status == EDID_BLOCK_OK || status == EDID_BLOCK_VERSION))
2007                         *edid_corrupt = false;
2008                 else if (status != EDID_BLOCK_OK)
2009                         *edid_corrupt = true;
2010         }
2011
2012         edid_block_status_print(status, block, block_num);
2013
2014         /* Determine whether we can use this block with this status. */
2015         valid = edid_block_status_valid(status, edid_block_tag(block));
2016
2017         if (!valid && print_bad_edid && status != EDID_BLOCK_ZERO) {
2018                 pr_notice("Raw EDID:\n");
2019                 edid_block_dump(KERN_NOTICE, block, block_num);
2020         }
2021
2022         return valid;
2023 }
2024 EXPORT_SYMBOL(drm_edid_block_valid);
2025
2026 /**
2027  * drm_edid_is_valid - sanity check EDID data
2028  * @edid: EDID data
2029  *
2030  * Sanity-check an entire EDID record (including extensions)
2031  *
2032  * Return: True if the EDID data is valid, false otherwise.
2033  */
2034 bool drm_edid_is_valid(struct edid *edid)
2035 {
2036         int i;
2037
2038         if (!edid)
2039                 return false;
2040
2041         for (i = 0; i < edid_block_count(edid); i++) {
2042                 void *block = (void *)edid_block_data(edid, i);
2043
2044                 if (!drm_edid_block_valid(block, i, true, NULL))
2045                         return false;
2046         }
2047
2048         return true;
2049 }
2050 EXPORT_SYMBOL(drm_edid_is_valid);
2051
2052 /**
2053  * drm_edid_valid - sanity check EDID data
2054  * @drm_edid: EDID data
2055  *
2056  * Sanity check an EDID. Cross check block count against allocated size and
2057  * checksum the blocks.
2058  *
2059  * Return: True if the EDID data is valid, false otherwise.
2060  */
2061 bool drm_edid_valid(const struct drm_edid *drm_edid)
2062 {
2063         int i;
2064
2065         if (!drm_edid)
2066                 return false;
2067
2068         if (edid_size_by_blocks(__drm_edid_block_count(drm_edid)) != drm_edid->size)
2069                 return false;
2070
2071         for (i = 0; i < drm_edid_block_count(drm_edid); i++) {
2072                 const void *block = drm_edid_block_data(drm_edid, i);
2073
2074                 if (!edid_block_valid(block, i == 0))
2075                         return false;
2076         }
2077
2078         return true;
2079 }
2080 EXPORT_SYMBOL(drm_edid_valid);
2081
2082 static struct edid *edid_filter_invalid_blocks(struct edid *edid,
2083                                                size_t *alloc_size)
2084 {
2085         struct edid *new;
2086         int i, valid_blocks = 0;
2087
2088         /*
2089          * Note: If the EDID uses HF-EEODB, but has invalid blocks, we'll revert
2090          * back to regular extension count here. We don't want to start
2091          * modifying the HF-EEODB extension too.
2092          */
2093         for (i = 0; i < edid_block_count(edid); i++) {
2094                 const void *src_block = edid_block_data(edid, i);
2095
2096                 if (edid_block_valid(src_block, i == 0)) {
2097                         void *dst_block = (void *)edid_block_data(edid, valid_blocks);
2098
2099                         memmove(dst_block, src_block, EDID_LENGTH);
2100                         valid_blocks++;
2101                 }
2102         }
2103
2104         /* We already trusted the base block to be valid here... */
2105         if (WARN_ON(!valid_blocks)) {
2106                 kfree(edid);
2107                 return NULL;
2108         }
2109
2110         edid->extensions = valid_blocks - 1;
2111         edid->checksum = edid_block_compute_checksum(edid);
2112
2113         *alloc_size = edid_size_by_blocks(valid_blocks);
2114
2115         new = krealloc(edid, *alloc_size, GFP_KERNEL);
2116         if (!new)
2117                 kfree(edid);
2118
2119         return new;
2120 }
2121
2122 #define DDC_SEGMENT_ADDR 0x30
2123 /**
2124  * drm_do_probe_ddc_edid() - get EDID information via I2C
2125  * @data: I2C device adapter
2126  * @buf: EDID data buffer to be filled
2127  * @block: 128 byte EDID block to start fetching from
2128  * @len: EDID data buffer length to fetch
2129  *
2130  * Try to fetch EDID information by calling I2C driver functions.
2131  *
2132  * Return: 0 on success or -1 on failure.
2133  */
2134 static int
2135 drm_do_probe_ddc_edid(void *data, u8 *buf, unsigned int block, size_t len)
2136 {
2137         struct i2c_adapter *adapter = data;
2138         unsigned char start = block * EDID_LENGTH;
2139         unsigned char segment = block >> 1;
2140         unsigned char xfers = segment ? 3 : 2;
2141         int ret, retries = 5;
2142
2143         /*
2144          * The core I2C driver will automatically retry the transfer if the
2145          * adapter reports EAGAIN. However, we find that bit-banging transfers
2146          * are susceptible to errors under a heavily loaded machine and
2147          * generate spurious NAKs and timeouts. Retrying the transfer
2148          * of the individual block a few times seems to overcome this.
2149          */
2150         do {
2151                 struct i2c_msg msgs[] = {
2152                         {
2153                                 .addr   = DDC_SEGMENT_ADDR,
2154                                 .flags  = 0,
2155                                 .len    = 1,
2156                                 .buf    = &segment,
2157                         }, {
2158                                 .addr   = DDC_ADDR,
2159                                 .flags  = 0,
2160                                 .len    = 1,
2161                                 .buf    = &start,
2162                         }, {
2163                                 .addr   = DDC_ADDR,
2164                                 .flags  = I2C_M_RD,
2165                                 .len    = len,
2166                                 .buf    = buf,
2167                         }
2168                 };
2169
2170                 /*
2171                  * Avoid sending the segment addr to not upset non-compliant
2172                  * DDC monitors.
2173                  */
2174                 ret = i2c_transfer(adapter, &msgs[3 - xfers], xfers);
2175
2176                 if (ret == -ENXIO) {
2177                         DRM_DEBUG_KMS("drm: skipping non-existent adapter %s\n",
2178                                         adapter->name);
2179                         break;
2180                 }
2181         } while (ret != xfers && --retries);
2182
2183         return ret == xfers ? 0 : -1;
2184 }
2185
2186 static void connector_bad_edid(struct drm_connector *connector,
2187                                const struct edid *edid, int num_blocks)
2188 {
2189         int i;
2190         u8 last_block;
2191
2192         /*
2193          * 0x7e in the EDID is the number of extension blocks. The EDID
2194          * is 1 (base block) + num_ext_blocks big. That means we can think
2195          * of 0x7e in the EDID of the _index_ of the last block in the
2196          * combined chunk of memory.
2197          */
2198         last_block = edid->extensions;
2199
2200         /* Calculate real checksum for the last edid extension block data */
2201         if (last_block < num_blocks)
2202                 connector->real_edid_checksum =
2203                         edid_block_compute_checksum(edid + last_block);
2204
2205         if (connector->bad_edid_counter++ && !drm_debug_enabled(DRM_UT_KMS))
2206                 return;
2207
2208         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID is invalid:\n",
2209                     connector->base.id, connector->name);
2210         for (i = 0; i < num_blocks; i++)
2211                 edid_block_dump(KERN_DEBUG, edid + i, i);
2212 }
2213
2214 /* Get override or firmware EDID */
2215 static const struct drm_edid *drm_edid_override_get(struct drm_connector *connector)
2216 {
2217         const struct drm_edid *override = NULL;
2218
2219         mutex_lock(&connector->edid_override_mutex);
2220
2221         if (connector->edid_override)
2222                 override = drm_edid_dup(connector->edid_override);
2223
2224         mutex_unlock(&connector->edid_override_mutex);
2225
2226         if (!override)
2227                 override = drm_edid_load_firmware(connector);
2228
2229         return IS_ERR(override) ? NULL : override;
2230 }
2231
2232 /* For debugfs edid_override implementation */
2233 int drm_edid_override_show(struct drm_connector *connector, struct seq_file *m)
2234 {
2235         const struct drm_edid *drm_edid;
2236
2237         mutex_lock(&connector->edid_override_mutex);
2238
2239         drm_edid = connector->edid_override;
2240         if (drm_edid)
2241                 seq_write(m, drm_edid->edid, drm_edid->size);
2242
2243         mutex_unlock(&connector->edid_override_mutex);
2244
2245         return 0;
2246 }
2247
2248 /* For debugfs edid_override implementation */
2249 int drm_edid_override_set(struct drm_connector *connector, const void *edid,
2250                           size_t size)
2251 {
2252         const struct drm_edid *drm_edid;
2253
2254         drm_edid = drm_edid_alloc(edid, size);
2255         if (!drm_edid_valid(drm_edid)) {
2256                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override invalid\n",
2257                             connector->base.id, connector->name);
2258                 drm_edid_free(drm_edid);
2259                 return -EINVAL;
2260         }
2261
2262         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override set\n",
2263                     connector->base.id, connector->name);
2264
2265         mutex_lock(&connector->edid_override_mutex);
2266
2267         drm_edid_free(connector->edid_override);
2268         connector->edid_override = drm_edid;
2269
2270         mutex_unlock(&connector->edid_override_mutex);
2271
2272         return 0;
2273 }
2274
2275 /* For debugfs edid_override implementation */
2276 int drm_edid_override_reset(struct drm_connector *connector)
2277 {
2278         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override reset\n",
2279                     connector->base.id, connector->name);
2280
2281         mutex_lock(&connector->edid_override_mutex);
2282
2283         drm_edid_free(connector->edid_override);
2284         connector->edid_override = NULL;
2285
2286         mutex_unlock(&connector->edid_override_mutex);
2287
2288         return 0;
2289 }
2290
2291 /**
2292  * drm_edid_override_connector_update - add modes from override/firmware EDID
2293  * @connector: connector we're probing
2294  *
2295  * Add modes from the override/firmware EDID, if available. Only to be used from
2296  * drm_helper_probe_single_connector_modes() as a fallback for when DDC probe
2297  * failed during drm_get_edid() and caused the override/firmware EDID to be
2298  * skipped.
2299  *
2300  * Return: The number of modes added or 0 if we couldn't find any.
2301  */
2302 int drm_edid_override_connector_update(struct drm_connector *connector)
2303 {
2304         const struct drm_edid *override;
2305         int num_modes = 0;
2306
2307         override = drm_edid_override_get(connector);
2308         if (override) {
2309                 num_modes = drm_edid_connector_update(connector, override);
2310
2311                 drm_edid_free(override);
2312
2313                 drm_dbg_kms(connector->dev,
2314                             "[CONNECTOR:%d:%s] adding %d modes via fallback override/firmware EDID\n",
2315                             connector->base.id, connector->name, num_modes);
2316         }
2317
2318         return num_modes;
2319 }
2320 EXPORT_SYMBOL(drm_edid_override_connector_update);
2321
2322 typedef int read_block_fn(void *context, u8 *buf, unsigned int block, size_t len);
2323
2324 static enum edid_block_status edid_block_read(void *block, unsigned int block_num,
2325                                               read_block_fn read_block,
2326                                               void *context)
2327 {
2328         enum edid_block_status status;
2329         bool is_base_block = block_num == 0;
2330         int try;
2331
2332         for (try = 0; try < 4; try++) {
2333                 if (read_block(context, block, block_num, EDID_LENGTH))
2334                         return EDID_BLOCK_READ_FAIL;
2335
2336                 status = edid_block_check(block, is_base_block);
2337                 if (status == EDID_BLOCK_HEADER_REPAIR) {
2338                         edid_header_fix(block);
2339
2340                         /* Retry with fixed header, update status if that worked. */
2341                         status = edid_block_check(block, is_base_block);
2342                         if (status == EDID_BLOCK_OK)
2343                                 status = EDID_BLOCK_HEADER_FIXED;
2344                 }
2345
2346                 if (edid_block_status_valid(status, edid_block_tag(block)))
2347                         break;
2348
2349                 /* Fail early for unrepairable base block all zeros. */
2350                 if (try == 0 && is_base_block && status == EDID_BLOCK_ZERO)
2351                         break;
2352         }
2353
2354         return status;
2355 }
2356
2357 static struct edid *_drm_do_get_edid(struct drm_connector *connector,
2358                                      read_block_fn read_block, void *context,
2359                                      size_t *size)
2360 {
2361         enum edid_block_status status;
2362         int i, num_blocks, invalid_blocks = 0;
2363         const struct drm_edid *override;
2364         struct edid *edid, *new;
2365         size_t alloc_size = EDID_LENGTH;
2366
2367         override = drm_edid_override_get(connector);
2368         if (override) {
2369                 alloc_size = override->size;
2370                 edid = kmemdup(override->edid, alloc_size, GFP_KERNEL);
2371                 drm_edid_free(override);
2372                 if (!edid)
2373                         return NULL;
2374                 goto ok;
2375         }
2376
2377         edid = kmalloc(alloc_size, GFP_KERNEL);
2378         if (!edid)
2379                 return NULL;
2380
2381         status = edid_block_read(edid, 0, read_block, context);
2382
2383         edid_block_status_print(status, edid, 0);
2384
2385         if (status == EDID_BLOCK_READ_FAIL)
2386                 goto fail;
2387
2388         /* FIXME: Clarify what a corrupt EDID actually means. */
2389         if (status == EDID_BLOCK_OK || status == EDID_BLOCK_VERSION)
2390                 connector->edid_corrupt = false;
2391         else
2392                 connector->edid_corrupt = true;
2393
2394         if (!edid_block_status_valid(status, edid_block_tag(edid))) {
2395                 if (status == EDID_BLOCK_ZERO)
2396                         connector->null_edid_counter++;
2397
2398                 connector_bad_edid(connector, edid, 1);
2399                 goto fail;
2400         }
2401
2402         if (!edid_extension_block_count(edid))
2403                 goto ok;
2404
2405         alloc_size = edid_size(edid);
2406         new = krealloc(edid, alloc_size, GFP_KERNEL);
2407         if (!new)
2408                 goto fail;
2409         edid = new;
2410
2411         num_blocks = edid_block_count(edid);
2412         for (i = 1; i < num_blocks; i++) {
2413                 void *block = (void *)edid_block_data(edid, i);
2414
2415                 status = edid_block_read(block, i, read_block, context);
2416
2417                 edid_block_status_print(status, block, i);
2418
2419                 if (!edid_block_status_valid(status, edid_block_tag(block))) {
2420                         if (status == EDID_BLOCK_READ_FAIL)
2421                                 goto fail;
2422                         invalid_blocks++;
2423                 } else if (i == 1) {
2424                         /*
2425                          * If the first EDID extension is a CTA extension, and
2426                          * the first Data Block is HF-EEODB, override the
2427                          * extension block count.
2428                          *
2429                          * Note: HF-EEODB could specify a smaller extension
2430                          * count too, but we can't risk allocating a smaller
2431                          * amount.
2432                          */
2433                         int eeodb = edid_hfeeodb_block_count(edid);
2434
2435                         if (eeodb > num_blocks) {
2436                                 num_blocks = eeodb;
2437                                 alloc_size = edid_size_by_blocks(num_blocks);
2438                                 new = krealloc(edid, alloc_size, GFP_KERNEL);
2439                                 if (!new)
2440                                         goto fail;
2441                                 edid = new;
2442                         }
2443                 }
2444         }
2445
2446         if (invalid_blocks) {
2447                 connector_bad_edid(connector, edid, num_blocks);
2448
2449                 edid = edid_filter_invalid_blocks(edid, &alloc_size);
2450         }
2451
2452 ok:
2453         if (size)
2454                 *size = alloc_size;
2455
2456         return edid;
2457
2458 fail:
2459         kfree(edid);
2460         return NULL;
2461 }
2462
2463 /**
2464  * drm_do_get_edid - get EDID data using a custom EDID block read function
2465  * @connector: connector we're probing
2466  * @read_block: EDID block read function
2467  * @context: private data passed to the block read function
2468  *
2469  * When the I2C adapter connected to the DDC bus is hidden behind a device that
2470  * exposes a different interface to read EDID blocks this function can be used
2471  * to get EDID data using a custom block read function.
2472  *
2473  * As in the general case the DDC bus is accessible by the kernel at the I2C
2474  * level, drivers must make all reasonable efforts to expose it as an I2C
2475  * adapter and use drm_get_edid() instead of abusing this function.
2476  *
2477  * The EDID may be overridden using debugfs override_edid or firmware EDID
2478  * (drm_edid_load_firmware() and drm.edid_firmware parameter), in this priority
2479  * order. Having either of them bypasses actual EDID reads.
2480  *
2481  * Return: Pointer to valid EDID or NULL if we couldn't find any.
2482  */
2483 struct edid *drm_do_get_edid(struct drm_connector *connector,
2484                              read_block_fn read_block,
2485                              void *context)
2486 {
2487         return _drm_do_get_edid(connector, read_block, context, NULL);
2488 }
2489 EXPORT_SYMBOL_GPL(drm_do_get_edid);
2490
2491 /**
2492  * drm_edid_raw - Get a pointer to the raw EDID data.
2493  * @drm_edid: drm_edid container
2494  *
2495  * Get a pointer to the raw EDID data.
2496  *
2497  * This is for transition only. Avoid using this like the plague.
2498  *
2499  * Return: Pointer to raw EDID data.
2500  */
2501 const struct edid *drm_edid_raw(const struct drm_edid *drm_edid)
2502 {
2503         if (!drm_edid || !drm_edid->size)
2504                 return NULL;
2505
2506         /*
2507          * Do not return pointers where relying on EDID extension count would
2508          * lead to buffer overflow.
2509          */
2510         if (WARN_ON(edid_size(drm_edid->edid) > drm_edid->size))
2511                 return NULL;
2512
2513         return drm_edid->edid;
2514 }
2515 EXPORT_SYMBOL(drm_edid_raw);
2516
2517 /* Allocate struct drm_edid container *without* duplicating the edid data */
2518 static const struct drm_edid *_drm_edid_alloc(const void *edid, size_t size)
2519 {
2520         struct drm_edid *drm_edid;
2521
2522         if (!edid || !size || size < EDID_LENGTH)
2523                 return NULL;
2524
2525         drm_edid = kzalloc(sizeof(*drm_edid), GFP_KERNEL);
2526         if (drm_edid) {
2527                 drm_edid->edid = edid;
2528                 drm_edid->size = size;
2529         }
2530
2531         return drm_edid;
2532 }
2533
2534 /**
2535  * drm_edid_alloc - Allocate a new drm_edid container
2536  * @edid: Pointer to raw EDID data
2537  * @size: Size of memory allocated for EDID
2538  *
2539  * Allocate a new drm_edid container. Do not calculate edid size from edid, pass
2540  * the actual size that has been allocated for the data. There is no validation
2541  * of the raw EDID data against the size, but at least the EDID base block must
2542  * fit in the buffer.
2543  *
2544  * The returned pointer must be freed using drm_edid_free().
2545  *
2546  * Return: drm_edid container, or NULL on errors
2547  */
2548 const struct drm_edid *drm_edid_alloc(const void *edid, size_t size)
2549 {
2550         const struct drm_edid *drm_edid;
2551
2552         if (!edid || !size || size < EDID_LENGTH)
2553                 return NULL;
2554
2555         edid = kmemdup(edid, size, GFP_KERNEL);
2556         if (!edid)
2557                 return NULL;
2558
2559         drm_edid = _drm_edid_alloc(edid, size);
2560         if (!drm_edid)
2561                 kfree(edid);
2562
2563         return drm_edid;
2564 }
2565 EXPORT_SYMBOL(drm_edid_alloc);
2566
2567 /**
2568  * drm_edid_dup - Duplicate a drm_edid container
2569  * @drm_edid: EDID to duplicate
2570  *
2571  * The returned pointer must be freed using drm_edid_free().
2572  *
2573  * Returns: drm_edid container copy, or NULL on errors
2574  */
2575 const struct drm_edid *drm_edid_dup(const struct drm_edid *drm_edid)
2576 {
2577         if (!drm_edid)
2578                 return NULL;
2579
2580         return drm_edid_alloc(drm_edid->edid, drm_edid->size);
2581 }
2582 EXPORT_SYMBOL(drm_edid_dup);
2583
2584 /**
2585  * drm_edid_free - Free the drm_edid container
2586  * @drm_edid: EDID to free
2587  */
2588 void drm_edid_free(const struct drm_edid *drm_edid)
2589 {
2590         if (!drm_edid)
2591                 return;
2592
2593         kfree(drm_edid->edid);
2594         kfree(drm_edid);
2595 }
2596 EXPORT_SYMBOL(drm_edid_free);
2597
2598 /**
2599  * drm_probe_ddc() - probe DDC presence
2600  * @adapter: I2C adapter to probe
2601  *
2602  * Return: True on success, false on failure.
2603  */
2604 bool
2605 drm_probe_ddc(struct i2c_adapter *adapter)
2606 {
2607         unsigned char out;
2608
2609         return (drm_do_probe_ddc_edid(adapter, &out, 0, 1) == 0);
2610 }
2611 EXPORT_SYMBOL(drm_probe_ddc);
2612
2613 /**
2614  * drm_get_edid - get EDID data, if available
2615  * @connector: connector we're probing
2616  * @adapter: I2C adapter to use for DDC
2617  *
2618  * Poke the given I2C channel to grab EDID data if possible.  If found,
2619  * attach it to the connector.
2620  *
2621  * Return: Pointer to valid EDID or NULL if we couldn't find any.
2622  */
2623 struct edid *drm_get_edid(struct drm_connector *connector,
2624                           struct i2c_adapter *adapter)
2625 {
2626         struct edid *edid;
2627
2628         if (connector->force == DRM_FORCE_OFF)
2629                 return NULL;
2630
2631         if (connector->force == DRM_FORCE_UNSPECIFIED && !drm_probe_ddc(adapter))
2632                 return NULL;
2633
2634         edid = _drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter, NULL);
2635         drm_connector_update_edid_property(connector, edid);
2636         return edid;
2637 }
2638 EXPORT_SYMBOL(drm_get_edid);
2639
2640 /**
2641  * drm_edid_read_custom - Read EDID data using given EDID block read function
2642  * @connector: Connector to use
2643  * @read_block: EDID block read function
2644  * @context: Private data passed to the block read function
2645  *
2646  * When the I2C adapter connected to the DDC bus is hidden behind a device that
2647  * exposes a different interface to read EDID blocks this function can be used
2648  * to get EDID data using a custom block read function.
2649  *
2650  * As in the general case the DDC bus is accessible by the kernel at the I2C
2651  * level, drivers must make all reasonable efforts to expose it as an I2C
2652  * adapter and use drm_edid_read() or drm_edid_read_ddc() instead of abusing
2653  * this function.
2654  *
2655  * The EDID may be overridden using debugfs override_edid or firmware EDID
2656  * (drm_edid_load_firmware() and drm.edid_firmware parameter), in this priority
2657  * order. Having either of them bypasses actual EDID reads.
2658  *
2659  * The returned pointer must be freed using drm_edid_free().
2660  *
2661  * Return: Pointer to EDID, or NULL if probe/read failed.
2662  */
2663 const struct drm_edid *drm_edid_read_custom(struct drm_connector *connector,
2664                                             read_block_fn read_block,
2665                                             void *context)
2666 {
2667         const struct drm_edid *drm_edid;
2668         struct edid *edid;
2669         size_t size = 0;
2670
2671         edid = _drm_do_get_edid(connector, read_block, context, &size);
2672         if (!edid)
2673                 return NULL;
2674
2675         /* Sanity check for now */
2676         drm_WARN_ON(connector->dev, !size);
2677
2678         drm_edid = _drm_edid_alloc(edid, size);
2679         if (!drm_edid)
2680                 kfree(edid);
2681
2682         return drm_edid;
2683 }
2684 EXPORT_SYMBOL(drm_edid_read_custom);
2685
2686 /**
2687  * drm_edid_read_ddc - Read EDID data using given I2C adapter
2688  * @connector: Connector to use
2689  * @adapter: I2C adapter to use for DDC
2690  *
2691  * Read EDID using the given I2C adapter.
2692  *
2693  * The EDID may be overridden using debugfs override_edid or firmware EDID
2694  * (drm_edid_load_firmware() and drm.edid_firmware parameter), in this priority
2695  * order. Having either of them bypasses actual EDID reads.
2696  *
2697  * Prefer initializing connector->ddc with drm_connector_init_with_ddc() and
2698  * using drm_edid_read() instead of this function.
2699  *
2700  * The returned pointer must be freed using drm_edid_free().
2701  *
2702  * Return: Pointer to EDID, or NULL if probe/read failed.
2703  */
2704 const struct drm_edid *drm_edid_read_ddc(struct drm_connector *connector,
2705                                          struct i2c_adapter *adapter)
2706 {
2707         const struct drm_edid *drm_edid;
2708
2709         if (connector->force == DRM_FORCE_OFF)
2710                 return NULL;
2711
2712         if (connector->force == DRM_FORCE_UNSPECIFIED && !drm_probe_ddc(adapter))
2713                 return NULL;
2714
2715         drm_edid = drm_edid_read_custom(connector, drm_do_probe_ddc_edid, adapter);
2716
2717         /* Note: Do *not* call connector updates here. */
2718
2719         return drm_edid;
2720 }
2721 EXPORT_SYMBOL(drm_edid_read_ddc);
2722
2723 /**
2724  * drm_edid_read - Read EDID data using connector's I2C adapter
2725  * @connector: Connector to use
2726  *
2727  * Read EDID using the connector's I2C adapter.
2728  *
2729  * The EDID may be overridden using debugfs override_edid or firmware EDID
2730  * (drm_edid_load_firmware() and drm.edid_firmware parameter), in this priority
2731  * order. Having either of them bypasses actual EDID reads.
2732  *
2733  * The returned pointer must be freed using drm_edid_free().
2734  *
2735  * Return: Pointer to EDID, or NULL if probe/read failed.
2736  */
2737 const struct drm_edid *drm_edid_read(struct drm_connector *connector)
2738 {
2739         if (drm_WARN_ON(connector->dev, !connector->ddc))
2740                 return NULL;
2741
2742         return drm_edid_read_ddc(connector, connector->ddc);
2743 }
2744 EXPORT_SYMBOL(drm_edid_read);
2745
2746 static u32 edid_extract_panel_id(const struct edid *edid)
2747 {
2748         /*
2749          * We represent the ID as a 32-bit number so it can easily be compared
2750          * with "==".
2751          *
2752          * NOTE that we deal with endianness differently for the top half
2753          * of this ID than for the bottom half. The bottom half (the product
2754          * id) gets decoded as little endian by the EDID_PRODUCT_ID because
2755          * that's how everyone seems to interpret it. The top half (the mfg_id)
2756          * gets stored as big endian because that makes
2757          * drm_edid_encode_panel_id() and drm_edid_decode_panel_id() easier
2758          * to write (it's easier to extract the ASCII). It doesn't really
2759          * matter, though, as long as the number here is unique.
2760          */
2761         return (u32)edid->mfg_id[0] << 24   |
2762                (u32)edid->mfg_id[1] << 16   |
2763                (u32)EDID_PRODUCT_ID(edid);
2764 }
2765
2766 /**
2767  * drm_edid_get_panel_id - Get a panel's ID through DDC
2768  * @adapter: I2C adapter to use for DDC
2769  *
2770  * This function reads the first block of the EDID of a panel and (assuming
2771  * that the EDID is valid) extracts the ID out of it. The ID is a 32-bit value
2772  * (16 bits of manufacturer ID and 16 bits of per-manufacturer ID) that's
2773  * supposed to be different for each different modem of panel.
2774  *
2775  * This function is intended to be used during early probing on devices where
2776  * more than one panel might be present. Because of its intended use it must
2777  * assume that the EDID of the panel is correct, at least as far as the ID
2778  * is concerned (in other words, we don't process any overrides here).
2779  *
2780  * NOTE: it's expected that this function and drm_do_get_edid() will both
2781  * be read the EDID, but there is no caching between them. Since we're only
2782  * reading the first block, hopefully this extra overhead won't be too big.
2783  *
2784  * Return: A 32-bit ID that should be different for each make/model of panel.
2785  *         See the functions drm_edid_encode_panel_id() and
2786  *         drm_edid_decode_panel_id() for some details on the structure of this
2787  *         ID.
2788  */
2789
2790 u32 drm_edid_get_panel_id(struct i2c_adapter *adapter)
2791 {
2792         enum edid_block_status status;
2793         void *base_block;
2794         u32 panel_id = 0;
2795
2796         /*
2797          * There are no manufacturer IDs of 0, so if there is a problem reading
2798          * the EDID then we'll just return 0.
2799          */
2800
2801         base_block = kzalloc(EDID_LENGTH, GFP_KERNEL);
2802         if (!base_block)
2803                 return 0;
2804
2805         status = edid_block_read(base_block, 0, drm_do_probe_ddc_edid, adapter);
2806
2807         edid_block_status_print(status, base_block, 0);
2808
2809         if (edid_block_status_valid(status, edid_block_tag(base_block)))
2810                 panel_id = edid_extract_panel_id(base_block);
2811         else
2812                 edid_block_dump(KERN_NOTICE, base_block, 0);
2813
2814         kfree(base_block);
2815
2816         return panel_id;
2817 }
2818 EXPORT_SYMBOL(drm_edid_get_panel_id);
2819
2820 /**
2821  * drm_get_edid_switcheroo - get EDID data for a vga_switcheroo output
2822  * @connector: connector we're probing
2823  * @adapter: I2C adapter to use for DDC
2824  *
2825  * Wrapper around drm_get_edid() for laptops with dual GPUs using one set of
2826  * outputs. The wrapper adds the requisite vga_switcheroo calls to temporarily
2827  * switch DDC to the GPU which is retrieving EDID.
2828  *
2829  * Return: Pointer to valid EDID or %NULL if we couldn't find any.
2830  */
2831 struct edid *drm_get_edid_switcheroo(struct drm_connector *connector,
2832                                      struct i2c_adapter *adapter)
2833 {
2834         struct drm_device *dev = connector->dev;
2835         struct pci_dev *pdev = to_pci_dev(dev->dev);
2836         struct edid *edid;
2837
2838         if (drm_WARN_ON_ONCE(dev, !dev_is_pci(dev->dev)))
2839                 return NULL;
2840
2841         vga_switcheroo_lock_ddc(pdev);
2842         edid = drm_get_edid(connector, adapter);
2843         vga_switcheroo_unlock_ddc(pdev);
2844
2845         return edid;
2846 }
2847 EXPORT_SYMBOL(drm_get_edid_switcheroo);
2848
2849 /**
2850  * drm_edid_read_switcheroo - get EDID data for a vga_switcheroo output
2851  * @connector: connector we're probing
2852  * @adapter: I2C adapter to use for DDC
2853  *
2854  * Wrapper around drm_edid_read_ddc() for laptops with dual GPUs using one set
2855  * of outputs. The wrapper adds the requisite vga_switcheroo calls to
2856  * temporarily switch DDC to the GPU which is retrieving EDID.
2857  *
2858  * Return: Pointer to valid EDID or %NULL if we couldn't find any.
2859  */
2860 const struct drm_edid *drm_edid_read_switcheroo(struct drm_connector *connector,
2861                                                 struct i2c_adapter *adapter)
2862 {
2863         struct drm_device *dev = connector->dev;
2864         struct pci_dev *pdev = to_pci_dev(dev->dev);
2865         const struct drm_edid *drm_edid;
2866
2867         if (drm_WARN_ON_ONCE(dev, !dev_is_pci(dev->dev)))
2868                 return NULL;
2869
2870         vga_switcheroo_lock_ddc(pdev);
2871         drm_edid = drm_edid_read_ddc(connector, adapter);
2872         vga_switcheroo_unlock_ddc(pdev);
2873
2874         return drm_edid;
2875 }
2876 EXPORT_SYMBOL(drm_edid_read_switcheroo);
2877
2878 /**
2879  * drm_edid_duplicate - duplicate an EDID and the extensions
2880  * @edid: EDID to duplicate
2881  *
2882  * Return: Pointer to duplicated EDID or NULL on allocation failure.
2883  */
2884 struct edid *drm_edid_duplicate(const struct edid *edid)
2885 {
2886         if (!edid)
2887                 return NULL;
2888
2889         return kmemdup(edid, edid_size(edid), GFP_KERNEL);
2890 }
2891 EXPORT_SYMBOL(drm_edid_duplicate);
2892
2893 /*** EDID parsing ***/
2894
2895 /**
2896  * edid_get_quirks - return quirk flags for a given EDID
2897  * @drm_edid: EDID to process
2898  *
2899  * This tells subsequent routines what fixes they need to apply.
2900  */
2901 static u32 edid_get_quirks(const struct drm_edid *drm_edid)
2902 {
2903         u32 panel_id = edid_extract_panel_id(drm_edid->edid);
2904         const struct edid_quirk *quirk;
2905         int i;
2906
2907         for (i = 0; i < ARRAY_SIZE(edid_quirk_list); i++) {
2908                 quirk = &edid_quirk_list[i];
2909                 if (quirk->panel_id == panel_id)
2910                         return quirk->quirks;
2911         }
2912
2913         return 0;
2914 }
2915
2916 #define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay)
2917 #define MODE_REFRESH_DIFF(c,t) (abs((c) - (t)))
2918
2919 /*
2920  * Walk the mode list for connector, clearing the preferred status on existing
2921  * modes and setting it anew for the right mode ala quirks.
2922  */
2923 static void edid_fixup_preferred(struct drm_connector *connector)
2924 {
2925         const struct drm_display_info *info = &connector->display_info;
2926         struct drm_display_mode *t, *cur_mode, *preferred_mode;
2927         int target_refresh = 0;
2928         int cur_vrefresh, preferred_vrefresh;
2929
2930         if (list_empty(&connector->probed_modes))
2931                 return;
2932
2933         if (info->quirks & EDID_QUIRK_PREFER_LARGE_60)
2934                 target_refresh = 60;
2935         if (info->quirks & EDID_QUIRK_PREFER_LARGE_75)
2936                 target_refresh = 75;
2937
2938         preferred_mode = list_first_entry(&connector->probed_modes,
2939                                           struct drm_display_mode, head);
2940
2941         list_for_each_entry_safe(cur_mode, t, &connector->probed_modes, head) {
2942                 cur_mode->type &= ~DRM_MODE_TYPE_PREFERRED;
2943
2944                 if (cur_mode == preferred_mode)
2945                         continue;
2946
2947                 /* Largest mode is preferred */
2948                 if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode))
2949                         preferred_mode = cur_mode;
2950
2951                 cur_vrefresh = drm_mode_vrefresh(cur_mode);
2952                 preferred_vrefresh = drm_mode_vrefresh(preferred_mode);
2953                 /* At a given size, try to get closest to target refresh */
2954                 if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) &&
2955                     MODE_REFRESH_DIFF(cur_vrefresh, target_refresh) <
2956                     MODE_REFRESH_DIFF(preferred_vrefresh, target_refresh)) {
2957                         preferred_mode = cur_mode;
2958                 }
2959         }
2960
2961         preferred_mode->type |= DRM_MODE_TYPE_PREFERRED;
2962 }
2963
2964 static bool
2965 mode_is_rb(const struct drm_display_mode *mode)
2966 {
2967         return (mode->htotal - mode->hdisplay == 160) &&
2968                (mode->hsync_end - mode->hdisplay == 80) &&
2969                (mode->hsync_end - mode->hsync_start == 32) &&
2970                (mode->vsync_start - mode->vdisplay == 3);
2971 }
2972
2973 /*
2974  * drm_mode_find_dmt - Create a copy of a mode if present in DMT
2975  * @dev: Device to duplicate against
2976  * @hsize: Mode width
2977  * @vsize: Mode height
2978  * @fresh: Mode refresh rate
2979  * @rb: Mode reduced-blanking-ness
2980  *
2981  * Walk the DMT mode list looking for a match for the given parameters.
2982  *
2983  * Return: A newly allocated copy of the mode, or NULL if not found.
2984  */
2985 struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
2986                                            int hsize, int vsize, int fresh,
2987                                            bool rb)
2988 {
2989         int i;
2990
2991         for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
2992                 const struct drm_display_mode *ptr = &drm_dmt_modes[i];
2993
2994                 if (hsize != ptr->hdisplay)
2995                         continue;
2996                 if (vsize != ptr->vdisplay)
2997                         continue;
2998                 if (fresh != drm_mode_vrefresh(ptr))
2999                         continue;
3000                 if (rb != mode_is_rb(ptr))
3001                         continue;
3002
3003                 return drm_mode_duplicate(dev, ptr);
3004         }
3005
3006         return NULL;
3007 }
3008 EXPORT_SYMBOL(drm_mode_find_dmt);
3009
3010 static bool is_display_descriptor(const struct detailed_timing *descriptor, u8 type)
3011 {
3012         BUILD_BUG_ON(offsetof(typeof(*descriptor), pixel_clock) != 0);
3013         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.pad1) != 2);
3014         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.type) != 3);
3015
3016         return descriptor->pixel_clock == 0 &&
3017                 descriptor->data.other_data.pad1 == 0 &&
3018                 descriptor->data.other_data.type == type;
3019 }
3020
3021 static bool is_detailed_timing_descriptor(const struct detailed_timing *descriptor)
3022 {
3023         BUILD_BUG_ON(offsetof(typeof(*descriptor), pixel_clock) != 0);
3024
3025         return descriptor->pixel_clock != 0;
3026 }
3027
3028 typedef void detailed_cb(const struct detailed_timing *timing, void *closure);
3029
3030 static void
3031 cea_for_each_detailed_block(const u8 *ext, detailed_cb *cb, void *closure)
3032 {
3033         int i, n;
3034         u8 d = ext[0x02];
3035         const u8 *det_base = ext + d;
3036
3037         if (d < 4 || d > 127)
3038                 return;
3039
3040         n = (127 - d) / 18;
3041         for (i = 0; i < n; i++)
3042                 cb((const struct detailed_timing *)(det_base + 18 * i), closure);
3043 }
3044
3045 static void
3046 vtb_for_each_detailed_block(const u8 *ext, detailed_cb *cb, void *closure)
3047 {
3048         unsigned int i, n = min((int)ext[0x02], 6);
3049         const u8 *det_base = ext + 5;
3050
3051         if (ext[0x01] != 1)
3052                 return; /* unknown version */
3053
3054         for (i = 0; i < n; i++)
3055                 cb((const struct detailed_timing *)(det_base + 18 * i), closure);
3056 }
3057
3058 static void drm_for_each_detailed_block(const struct drm_edid *drm_edid,
3059                                         detailed_cb *cb, void *closure)
3060 {
3061         struct drm_edid_iter edid_iter;
3062         const u8 *ext;
3063         int i;
3064
3065         if (!drm_edid)
3066                 return;
3067
3068         for (i = 0; i < EDID_DETAILED_TIMINGS; i++)
3069                 cb(&drm_edid->edid->detailed_timings[i], closure);
3070
3071         drm_edid_iter_begin(drm_edid, &edid_iter);
3072         drm_edid_iter_for_each(ext, &edid_iter) {
3073                 switch (*ext) {
3074                 case CEA_EXT:
3075                         cea_for_each_detailed_block(ext, cb, closure);
3076                         break;
3077                 case VTB_EXT:
3078                         vtb_for_each_detailed_block(ext, cb, closure);
3079                         break;
3080                 default:
3081                         break;
3082                 }
3083         }
3084         drm_edid_iter_end(&edid_iter);
3085 }
3086
3087 static void
3088 is_rb(const struct detailed_timing *descriptor, void *data)
3089 {
3090         bool *res = data;
3091
3092         if (!is_display_descriptor(descriptor, EDID_DETAIL_MONITOR_RANGE))
3093                 return;
3094
3095         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.flags) != 10);
3096         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.cvt.flags) != 15);
3097
3098         if (descriptor->data.other_data.data.range.flags == DRM_EDID_CVT_SUPPORT_FLAG &&
3099             descriptor->data.other_data.data.range.formula.cvt.flags & DRM_EDID_CVT_FLAGS_REDUCED_BLANKING)
3100                 *res = true;
3101 }
3102
3103 /* EDID 1.4 defines this explicitly.  For EDID 1.3, we guess, badly. */
3104 static bool
3105 drm_monitor_supports_rb(const struct drm_edid *drm_edid)
3106 {
3107         if (drm_edid->edid->revision >= 4) {
3108                 bool ret = false;
3109
3110                 drm_for_each_detailed_block(drm_edid, is_rb, &ret);
3111                 return ret;
3112         }
3113
3114         return drm_edid_is_digital(drm_edid);
3115 }
3116
3117 static void
3118 find_gtf2(const struct detailed_timing *descriptor, void *data)
3119 {
3120         const struct detailed_timing **res = data;
3121
3122         if (!is_display_descriptor(descriptor, EDID_DETAIL_MONITOR_RANGE))
3123                 return;
3124
3125         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.flags) != 10);
3126
3127         if (descriptor->data.other_data.data.range.flags == DRM_EDID_SECONDARY_GTF_SUPPORT_FLAG)
3128                 *res = descriptor;
3129 }
3130
3131 /* Secondary GTF curve kicks in above some break frequency */
3132 static int
3133 drm_gtf2_hbreak(const struct drm_edid *drm_edid)
3134 {
3135         const struct detailed_timing *descriptor = NULL;
3136
3137         drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3138
3139         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.hfreq_start_khz) != 12);
3140
3141         return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.hfreq_start_khz * 2 : 0;
3142 }
3143
3144 static int
3145 drm_gtf2_2c(const struct drm_edid *drm_edid)
3146 {
3147         const struct detailed_timing *descriptor = NULL;
3148
3149         drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3150
3151         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.c) != 13);
3152
3153         return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.c : 0;
3154 }
3155
3156 static int
3157 drm_gtf2_m(const struct drm_edid *drm_edid)
3158 {
3159         const struct detailed_timing *descriptor = NULL;
3160
3161         drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3162
3163         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.m) != 14);
3164
3165         return descriptor ? le16_to_cpu(descriptor->data.other_data.data.range.formula.gtf2.m) : 0;
3166 }
3167
3168 static int
3169 drm_gtf2_k(const struct drm_edid *drm_edid)
3170 {
3171         const struct detailed_timing *descriptor = NULL;
3172
3173         drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3174
3175         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.k) != 16);
3176
3177         return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.k : 0;
3178 }
3179
3180 static int
3181 drm_gtf2_2j(const struct drm_edid *drm_edid)
3182 {
3183         const struct detailed_timing *descriptor = NULL;
3184
3185         drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3186
3187         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.j) != 17);
3188
3189         return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.j : 0;
3190 }
3191
3192 static void
3193 get_timing_level(const struct detailed_timing *descriptor, void *data)
3194 {
3195         int *res = data;
3196
3197         if (!is_display_descriptor(descriptor, EDID_DETAIL_MONITOR_RANGE))
3198                 return;
3199
3200         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.flags) != 10);
3201
3202         switch (descriptor->data.other_data.data.range.flags) {
3203         case DRM_EDID_DEFAULT_GTF_SUPPORT_FLAG:
3204                 *res = LEVEL_GTF;
3205                 break;
3206         case DRM_EDID_SECONDARY_GTF_SUPPORT_FLAG:
3207                 *res = LEVEL_GTF2;
3208                 break;
3209         case DRM_EDID_CVT_SUPPORT_FLAG:
3210                 *res = LEVEL_CVT;
3211                 break;
3212         default:
3213                 break;
3214         }
3215 }
3216
3217 /* Get standard timing level (CVT/GTF/DMT). */
3218 static int standard_timing_level(const struct drm_edid *drm_edid)
3219 {
3220         const struct edid *edid = drm_edid->edid;
3221
3222         if (edid->revision >= 4) {
3223                 /*
3224                  * If the range descriptor doesn't
3225                  * indicate otherwise default to CVT
3226                  */
3227                 int ret = LEVEL_CVT;
3228
3229                 drm_for_each_detailed_block(drm_edid, get_timing_level, &ret);
3230
3231                 return ret;
3232         } else if (edid->revision >= 3 && drm_gtf2_hbreak(drm_edid)) {
3233                 return LEVEL_GTF2;
3234         } else if (edid->revision >= 2) {
3235                 return LEVEL_GTF;
3236         } else {
3237                 return LEVEL_DMT;
3238         }
3239 }
3240
3241 /*
3242  * 0 is reserved.  The spec says 0x01 fill for unused timings.  Some old
3243  * monitors fill with ascii space (0x20) instead.
3244  */
3245 static int
3246 bad_std_timing(u8 a, u8 b)
3247 {
3248         return (a == 0x00 && b == 0x00) ||
3249                (a == 0x01 && b == 0x01) ||
3250                (a == 0x20 && b == 0x20);
3251 }
3252
3253 static int drm_mode_hsync(const struct drm_display_mode *mode)
3254 {
3255         if (mode->htotal <= 0)
3256                 return 0;
3257
3258         return DIV_ROUND_CLOSEST(mode->clock, mode->htotal);
3259 }
3260
3261 static struct drm_display_mode *
3262 drm_gtf2_mode(struct drm_device *dev,
3263               const struct drm_edid *drm_edid,
3264               int hsize, int vsize, int vrefresh_rate)
3265 {
3266         struct drm_display_mode *mode;
3267
3268         /*
3269          * This is potentially wrong if there's ever a monitor with
3270          * more than one ranges section, each claiming a different
3271          * secondary GTF curve.  Please don't do that.
3272          */
3273         mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
3274         if (!mode)
3275                 return NULL;
3276
3277         if (drm_mode_hsync(mode) > drm_gtf2_hbreak(drm_edid)) {
3278                 drm_mode_destroy(dev, mode);
3279                 mode = drm_gtf_mode_complex(dev, hsize, vsize,
3280                                             vrefresh_rate, 0, 0,
3281                                             drm_gtf2_m(drm_edid),
3282                                             drm_gtf2_2c(drm_edid),
3283                                             drm_gtf2_k(drm_edid),
3284                                             drm_gtf2_2j(drm_edid));
3285         }
3286
3287         return mode;
3288 }
3289
3290 /*
3291  * Take the standard timing params (in this case width, aspect, and refresh)
3292  * and convert them into a real mode using CVT/GTF/DMT.
3293  */
3294 static struct drm_display_mode *drm_mode_std(struct drm_connector *connector,
3295                                              const struct drm_edid *drm_edid,
3296                                              const struct std_timing *t)
3297 {
3298         struct drm_device *dev = connector->dev;
3299         struct drm_display_mode *m, *mode = NULL;
3300         int hsize, vsize;
3301         int vrefresh_rate;
3302         unsigned aspect_ratio = (t->vfreq_aspect & EDID_TIMING_ASPECT_MASK)
3303                 >> EDID_TIMING_ASPECT_SHIFT;
3304         unsigned vfreq = (t->vfreq_aspect & EDID_TIMING_VFREQ_MASK)
3305                 >> EDID_TIMING_VFREQ_SHIFT;
3306         int timing_level = standard_timing_level(drm_edid);
3307
3308         if (bad_std_timing(t->hsize, t->vfreq_aspect))
3309                 return NULL;
3310
3311         /* According to the EDID spec, the hdisplay = hsize * 8 + 248 */
3312         hsize = t->hsize * 8 + 248;
3313         /* vrefresh_rate = vfreq + 60 */
3314         vrefresh_rate = vfreq + 60;
3315         /* the vdisplay is calculated based on the aspect ratio */
3316         if (aspect_ratio == 0) {
3317                 if (drm_edid->edid->revision < 3)
3318                         vsize = hsize;
3319                 else
3320                         vsize = (hsize * 10) / 16;
3321         } else if (aspect_ratio == 1)
3322                 vsize = (hsize * 3) / 4;
3323         else if (aspect_ratio == 2)
3324                 vsize = (hsize * 4) / 5;
3325         else
3326                 vsize = (hsize * 9) / 16;
3327
3328         /* HDTV hack, part 1 */
3329         if (vrefresh_rate == 60 &&
3330             ((hsize == 1360 && vsize == 765) ||
3331              (hsize == 1368 && vsize == 769))) {
3332                 hsize = 1366;
3333                 vsize = 768;
3334         }
3335
3336         /*
3337          * If this connector already has a mode for this size and refresh
3338          * rate (because it came from detailed or CVT info), use that
3339          * instead.  This way we don't have to guess at interlace or
3340          * reduced blanking.
3341          */
3342         list_for_each_entry(m, &connector->probed_modes, head)
3343                 if (m->hdisplay == hsize && m->vdisplay == vsize &&
3344                     drm_mode_vrefresh(m) == vrefresh_rate)
3345                         return NULL;
3346
3347         /* HDTV hack, part 2 */
3348         if (hsize == 1366 && vsize == 768 && vrefresh_rate == 60) {
3349                 mode = drm_cvt_mode(dev, 1366, 768, vrefresh_rate, 0, 0,
3350                                     false);
3351                 if (!mode)
3352                         return NULL;
3353                 mode->hdisplay = 1366;
3354                 mode->hsync_start = mode->hsync_start - 1;
3355                 mode->hsync_end = mode->hsync_end - 1;
3356                 return mode;
3357         }
3358
3359         /* check whether it can be found in default mode table */
3360         if (drm_monitor_supports_rb(drm_edid)) {
3361                 mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate,
3362                                          true);
3363                 if (mode)
3364                         return mode;
3365         }
3366         mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate, false);
3367         if (mode)
3368                 return mode;
3369
3370         /* okay, generate it */
3371         switch (timing_level) {
3372         case LEVEL_DMT:
3373                 break;
3374         case LEVEL_GTF:
3375                 mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
3376                 break;
3377         case LEVEL_GTF2:
3378                 mode = drm_gtf2_mode(dev, drm_edid, hsize, vsize, vrefresh_rate);
3379                 break;
3380         case LEVEL_CVT:
3381                 mode = drm_cvt_mode(dev, hsize, vsize, vrefresh_rate, 0, 0,
3382                                     false);
3383                 break;
3384         }
3385         return mode;
3386 }
3387
3388 /*
3389  * EDID is delightfully ambiguous about how interlaced modes are to be
3390  * encoded.  Our internal representation is of frame height, but some
3391  * HDTV detailed timings are encoded as field height.
3392  *
3393  * The format list here is from CEA, in frame size.  Technically we
3394  * should be checking refresh rate too.  Whatever.
3395  */
3396 static void
3397 drm_mode_do_interlace_quirk(struct drm_display_mode *mode,
3398                             const struct detailed_pixel_timing *pt)
3399 {
3400         int i;
3401         static const struct {
3402                 int w, h;
3403         } cea_interlaced[] = {
3404                 { 1920, 1080 },
3405                 {  720,  480 },
3406                 { 1440,  480 },
3407                 { 2880,  480 },
3408                 {  720,  576 },
3409                 { 1440,  576 },
3410                 { 2880,  576 },
3411         };
3412
3413         if (!(pt->misc & DRM_EDID_PT_INTERLACED))
3414                 return;
3415
3416         for (i = 0; i < ARRAY_SIZE(cea_interlaced); i++) {
3417                 if ((mode->hdisplay == cea_interlaced[i].w) &&
3418                     (mode->vdisplay == cea_interlaced[i].h / 2)) {
3419                         mode->vdisplay *= 2;
3420                         mode->vsync_start *= 2;
3421                         mode->vsync_end *= 2;
3422                         mode->vtotal *= 2;
3423                         mode->vtotal |= 1;
3424                 }
3425         }
3426
3427         mode->flags |= DRM_MODE_FLAG_INTERLACE;
3428 }
3429
3430 /*
3431  * Create a new mode from an EDID detailed timing section. An EDID detailed
3432  * timing block contains enough info for us to create and return a new struct
3433  * drm_display_mode.
3434  */
3435 static struct drm_display_mode *drm_mode_detailed(struct drm_connector *connector,
3436                                                   const struct drm_edid *drm_edid,
3437                                                   const struct detailed_timing *timing)
3438 {
3439         const struct drm_display_info *info = &connector->display_info;
3440         struct drm_device *dev = connector->dev;
3441         struct drm_display_mode *mode;
3442         const struct detailed_pixel_timing *pt = &timing->data.pixel_data;
3443         unsigned hactive = (pt->hactive_hblank_hi & 0xf0) << 4 | pt->hactive_lo;
3444         unsigned vactive = (pt->vactive_vblank_hi & 0xf0) << 4 | pt->vactive_lo;
3445         unsigned hblank = (pt->hactive_hblank_hi & 0xf) << 8 | pt->hblank_lo;
3446         unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo;
3447         unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | pt->hsync_offset_lo;
3448         unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | pt->hsync_pulse_width_lo;
3449         unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) << 2 | pt->vsync_offset_pulse_width_lo >> 4;
3450         unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | (pt->vsync_offset_pulse_width_lo & 0xf);
3451
3452         /* ignore tiny modes */
3453         if (hactive < 64 || vactive < 64)
3454                 return NULL;
3455
3456         if (pt->misc & DRM_EDID_PT_STEREO) {
3457                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Stereo mode not supported\n",
3458                             connector->base.id, connector->name);
3459                 return NULL;
3460         }
3461         if (!(pt->misc & DRM_EDID_PT_SEPARATE_SYNC)) {
3462                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Composite sync not supported\n",
3463                             connector->base.id, connector->name);
3464         }
3465
3466         /* it is incorrect if hsync/vsync width is zero */
3467         if (!hsync_pulse_width || !vsync_pulse_width) {
3468                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Incorrect Detailed timing. Wrong Hsync/Vsync pulse width\n",
3469                             connector->base.id, connector->name);
3470                 return NULL;
3471         }
3472
3473         if (info->quirks & EDID_QUIRK_FORCE_REDUCED_BLANKING) {
3474                 mode = drm_cvt_mode(dev, hactive, vactive, 60, true, false, false);
3475                 if (!mode)
3476                         return NULL;
3477
3478                 goto set_size;
3479         }
3480
3481         mode = drm_mode_create(dev);
3482         if (!mode)
3483                 return NULL;
3484
3485         if (info->quirks & EDID_QUIRK_135_CLOCK_TOO_HIGH)
3486                 mode->clock = 1088 * 10;
3487         else
3488                 mode->clock = le16_to_cpu(timing->pixel_clock) * 10;
3489
3490         mode->hdisplay = hactive;
3491         mode->hsync_start = mode->hdisplay + hsync_offset;
3492         mode->hsync_end = mode->hsync_start + hsync_pulse_width;
3493         mode->htotal = mode->hdisplay + hblank;
3494
3495         mode->vdisplay = vactive;
3496         mode->vsync_start = mode->vdisplay + vsync_offset;
3497         mode->vsync_end = mode->vsync_start + vsync_pulse_width;
3498         mode->vtotal = mode->vdisplay + vblank;
3499
3500         /* Some EDIDs have bogus h/vsync_end values */
3501         if (mode->hsync_end > mode->htotal) {
3502                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] reducing hsync_end %d->%d\n",
3503                             connector->base.id, connector->name,
3504                             mode->hsync_end, mode->htotal);
3505                 mode->hsync_end = mode->htotal;
3506         }
3507         if (mode->vsync_end > mode->vtotal) {
3508                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] reducing vsync_end %d->%d\n",
3509                             connector->base.id, connector->name,
3510                             mode->vsync_end, mode->vtotal);
3511                 mode->vsync_end = mode->vtotal;
3512         }
3513
3514         drm_mode_do_interlace_quirk(mode, pt);
3515
3516         if (info->quirks & EDID_QUIRK_DETAILED_SYNC_PP) {
3517                 mode->flags |= DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC;
3518         } else {
3519                 mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ?
3520                         DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
3521                 mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ?
3522                         DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
3523         }
3524
3525 set_size:
3526         mode->width_mm = pt->width_mm_lo | (pt->width_height_mm_hi & 0xf0) << 4;
3527         mode->height_mm = pt->height_mm_lo | (pt->width_height_mm_hi & 0xf) << 8;
3528
3529         if (info->quirks & EDID_QUIRK_DETAILED_IN_CM) {
3530                 mode->width_mm *= 10;
3531                 mode->height_mm *= 10;
3532         }
3533
3534         if (info->quirks & EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE) {
3535                 mode->width_mm = drm_edid->edid->width_cm * 10;
3536                 mode->height_mm = drm_edid->edid->height_cm * 10;
3537         }
3538
3539         mode->type = DRM_MODE_TYPE_DRIVER;
3540         drm_mode_set_name(mode);
3541
3542         return mode;
3543 }
3544
3545 static bool
3546 mode_in_hsync_range(const struct drm_display_mode *mode,
3547                     const struct edid *edid, const u8 *t)
3548 {
3549         int hsync, hmin, hmax;
3550
3551         hmin = t[7];
3552         if (edid->revision >= 4)
3553             hmin += ((t[4] & 0x04) ? 255 : 0);
3554         hmax = t[8];
3555         if (edid->revision >= 4)
3556             hmax += ((t[4] & 0x08) ? 255 : 0);
3557         hsync = drm_mode_hsync(mode);
3558
3559         return (hsync <= hmax && hsync >= hmin);
3560 }
3561
3562 static bool
3563 mode_in_vsync_range(const struct drm_display_mode *mode,
3564                     const struct edid *edid, const u8 *t)
3565 {
3566         int vsync, vmin, vmax;
3567
3568         vmin = t[5];
3569         if (edid->revision >= 4)
3570             vmin += ((t[4] & 0x01) ? 255 : 0);
3571         vmax = t[6];
3572         if (edid->revision >= 4)
3573             vmax += ((t[4] & 0x02) ? 255 : 0);
3574         vsync = drm_mode_vrefresh(mode);
3575
3576         return (vsync <= vmax && vsync >= vmin);
3577 }
3578
3579 static u32
3580 range_pixel_clock(const struct edid *edid, const u8 *t)
3581 {
3582         /* unspecified */
3583         if (t[9] == 0 || t[9] == 255)
3584                 return 0;
3585
3586         /* 1.4 with CVT support gives us real precision, yay */
3587         if (edid->revision >= 4 && t[10] == DRM_EDID_CVT_SUPPORT_FLAG)
3588                 return (t[9] * 10000) - ((t[12] >> 2) * 250);
3589
3590         /* 1.3 is pathetic, so fuzz up a bit */
3591         return t[9] * 10000 + 5001;
3592 }
3593
3594 static bool mode_in_range(const struct drm_display_mode *mode,
3595                           const struct drm_edid *drm_edid,
3596                           const struct detailed_timing *timing)
3597 {
3598         const struct edid *edid = drm_edid->edid;
3599         u32 max_clock;
3600         const u8 *t = (const u8 *)timing;
3601
3602         if (!mode_in_hsync_range(mode, edid, t))
3603                 return false;
3604
3605         if (!mode_in_vsync_range(mode, edid, t))
3606                 return false;
3607
3608         if ((max_clock = range_pixel_clock(edid, t)))
3609                 if (mode->clock > max_clock)
3610                         return false;
3611
3612         /* 1.4 max horizontal check */
3613         if (edid->revision >= 4 && t[10] == DRM_EDID_CVT_SUPPORT_FLAG)
3614                 if (t[13] && mode->hdisplay > 8 * (t[13] + (256 * (t[12]&0x3))))
3615                         return false;
3616
3617         if (mode_is_rb(mode) && !drm_monitor_supports_rb(drm_edid))
3618                 return false;
3619
3620         return true;
3621 }
3622
3623 static bool valid_inferred_mode(const struct drm_connector *connector,
3624                                 const struct drm_display_mode *mode)
3625 {
3626         const struct drm_display_mode *m;
3627         bool ok = false;
3628
3629         list_for_each_entry(m, &connector->probed_modes, head) {
3630                 if (mode->hdisplay == m->hdisplay &&
3631                     mode->vdisplay == m->vdisplay &&
3632                     drm_mode_vrefresh(mode) == drm_mode_vrefresh(m))
3633                         return false; /* duplicated */
3634                 if (mode->hdisplay <= m->hdisplay &&
3635                     mode->vdisplay <= m->vdisplay)
3636                         ok = true;
3637         }
3638         return ok;
3639 }
3640
3641 static int drm_dmt_modes_for_range(struct drm_connector *connector,
3642                                    const struct drm_edid *drm_edid,
3643                                    const struct detailed_timing *timing)
3644 {
3645         int i, modes = 0;
3646         struct drm_display_mode *newmode;
3647         struct drm_device *dev = connector->dev;
3648
3649         for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
3650                 if (mode_in_range(drm_dmt_modes + i, drm_edid, timing) &&
3651                     valid_inferred_mode(connector, drm_dmt_modes + i)) {
3652                         newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]);
3653                         if (newmode) {
3654                                 drm_mode_probed_add(connector, newmode);
3655                                 modes++;
3656                         }
3657                 }
3658         }
3659
3660         return modes;
3661 }
3662
3663 /* fix up 1366x768 mode from 1368x768;
3664  * GFT/CVT can't express 1366 width which isn't dividable by 8
3665  */
3666 void drm_mode_fixup_1366x768(struct drm_display_mode *mode)
3667 {
3668         if (mode->hdisplay == 1368 && mode->vdisplay == 768) {
3669                 mode->hdisplay = 1366;
3670                 mode->hsync_start--;
3671                 mode->hsync_end--;
3672                 drm_mode_set_name(mode);
3673         }
3674 }
3675
3676 static int drm_gtf_modes_for_range(struct drm_connector *connector,
3677                                    const struct drm_edid *drm_edid,
3678                                    const struct detailed_timing *timing)
3679 {
3680         int i, modes = 0;
3681         struct drm_display_mode *newmode;
3682         struct drm_device *dev = connector->dev;
3683
3684         for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
3685                 const struct minimode *m = &extra_modes[i];
3686
3687                 newmode = drm_gtf_mode(dev, m->w, m->h, m->r, 0, 0);
3688                 if (!newmode)
3689                         return modes;
3690
3691                 drm_mode_fixup_1366x768(newmode);
3692                 if (!mode_in_range(newmode, drm_edid, timing) ||
3693                     !valid_inferred_mode(connector, newmode)) {
3694                         drm_mode_destroy(dev, newmode);
3695                         continue;
3696                 }
3697
3698                 drm_mode_probed_add(connector, newmode);
3699                 modes++;
3700         }
3701
3702         return modes;
3703 }
3704
3705 static int drm_gtf2_modes_for_range(struct drm_connector *connector,
3706                                     const struct drm_edid *drm_edid,
3707                                     const struct detailed_timing *timing)
3708 {
3709         int i, modes = 0;
3710         struct drm_display_mode *newmode;
3711         struct drm_device *dev = connector->dev;
3712
3713         for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
3714                 const struct minimode *m = &extra_modes[i];
3715
3716                 newmode = drm_gtf2_mode(dev, drm_edid, m->w, m->h, m->r);
3717                 if (!newmode)
3718                         return modes;
3719
3720                 drm_mode_fixup_1366x768(newmode);
3721                 if (!mode_in_range(newmode, drm_edid, timing) ||
3722                     !valid_inferred_mode(connector, newmode)) {
3723                         drm_mode_destroy(dev, newmode);
3724                         continue;
3725                 }
3726
3727                 drm_mode_probed_add(connector, newmode);
3728                 modes++;
3729         }
3730
3731         return modes;
3732 }
3733
3734 static int drm_cvt_modes_for_range(struct drm_connector *connector,
3735                                    const struct drm_edid *drm_edid,
3736                                    const struct detailed_timing *timing)
3737 {
3738         int i, modes = 0;
3739         struct drm_display_mode *newmode;
3740         struct drm_device *dev = connector->dev;
3741         bool rb = drm_monitor_supports_rb(drm_edid);
3742
3743         for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
3744                 const struct minimode *m = &extra_modes[i];
3745
3746                 newmode = drm_cvt_mode(dev, m->w, m->h, m->r, rb, 0, 0);
3747                 if (!newmode)
3748                         return modes;
3749
3750                 drm_mode_fixup_1366x768(newmode);
3751                 if (!mode_in_range(newmode, drm_edid, timing) ||
3752                     !valid_inferred_mode(connector, newmode)) {
3753                         drm_mode_destroy(dev, newmode);
3754                         continue;
3755                 }
3756
3757                 drm_mode_probed_add(connector, newmode);
3758                 modes++;
3759         }
3760
3761         return modes;
3762 }
3763
3764 static void
3765 do_inferred_modes(const struct detailed_timing *timing, void *c)
3766 {
3767         struct detailed_mode_closure *closure = c;
3768         const struct detailed_non_pixel *data = &timing->data.other_data;
3769         const struct detailed_data_monitor_range *range = &data->data.range;
3770
3771         if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_RANGE))
3772                 return;
3773
3774         closure->modes += drm_dmt_modes_for_range(closure->connector,
3775                                                   closure->drm_edid,
3776                                                   timing);
3777
3778         if (closure->drm_edid->edid->revision < 2)
3779                 return; /* GTF not defined yet */
3780
3781         switch (range->flags) {
3782         case DRM_EDID_SECONDARY_GTF_SUPPORT_FLAG:
3783                 closure->modes += drm_gtf2_modes_for_range(closure->connector,
3784                                                            closure->drm_edid,
3785                                                            timing);
3786                 break;
3787         case DRM_EDID_DEFAULT_GTF_SUPPORT_FLAG:
3788                 closure->modes += drm_gtf_modes_for_range(closure->connector,
3789                                                           closure->drm_edid,
3790                                                           timing);
3791                 break;
3792         case DRM_EDID_CVT_SUPPORT_FLAG:
3793                 if (closure->drm_edid->edid->revision < 4)
3794                         break;
3795
3796                 closure->modes += drm_cvt_modes_for_range(closure->connector,
3797                                                           closure->drm_edid,
3798                                                           timing);
3799                 break;
3800         case DRM_EDID_RANGE_LIMITS_ONLY_FLAG:
3801         default:
3802                 break;
3803         }
3804 }
3805
3806 static int add_inferred_modes(struct drm_connector *connector,
3807                               const struct drm_edid *drm_edid)
3808 {
3809         struct detailed_mode_closure closure = {
3810                 .connector = connector,
3811                 .drm_edid = drm_edid,
3812         };
3813
3814         if (drm_edid->edid->revision >= 1)
3815                 drm_for_each_detailed_block(drm_edid, do_inferred_modes, &closure);
3816
3817         return closure.modes;
3818 }
3819
3820 static int
3821 drm_est3_modes(struct drm_connector *connector, const struct detailed_timing *timing)
3822 {
3823         int i, j, m, modes = 0;
3824         struct drm_display_mode *mode;
3825         const u8 *est = ((const u8 *)timing) + 6;
3826
3827         for (i = 0; i < 6; i++) {
3828                 for (j = 7; j >= 0; j--) {
3829                         m = (i * 8) + (7 - j);
3830                         if (m >= ARRAY_SIZE(est3_modes))
3831                                 break;
3832                         if (est[i] & (1 << j)) {
3833                                 mode = drm_mode_find_dmt(connector->dev,
3834                                                          est3_modes[m].w,
3835                                                          est3_modes[m].h,
3836                                                          est3_modes[m].r,
3837                                                          est3_modes[m].rb);
3838                                 if (mode) {
3839                                         drm_mode_probed_add(connector, mode);
3840                                         modes++;
3841                                 }
3842                         }
3843                 }
3844         }
3845
3846         return modes;
3847 }
3848
3849 static void
3850 do_established_modes(const struct detailed_timing *timing, void *c)
3851 {
3852         struct detailed_mode_closure *closure = c;
3853
3854         if (!is_display_descriptor(timing, EDID_DETAIL_EST_TIMINGS))
3855                 return;
3856
3857         closure->modes += drm_est3_modes(closure->connector, timing);
3858 }
3859
3860 /*
3861  * Get established modes from EDID and add them. Each EDID block contains a
3862  * bitmap of the supported "established modes" list (defined above). Tease them
3863  * out and add them to the global modes list.
3864  */
3865 static int add_established_modes(struct drm_connector *connector,
3866                                  const struct drm_edid *drm_edid)
3867 {
3868         struct drm_device *dev = connector->dev;
3869         const struct edid *edid = drm_edid->edid;
3870         unsigned long est_bits = edid->established_timings.t1 |
3871                 (edid->established_timings.t2 << 8) |
3872                 ((edid->established_timings.mfg_rsvd & 0x80) << 9);
3873         int i, modes = 0;
3874         struct detailed_mode_closure closure = {
3875                 .connector = connector,
3876                 .drm_edid = drm_edid,
3877         };
3878
3879         for (i = 0; i <= EDID_EST_TIMINGS; i++) {
3880                 if (est_bits & (1<<i)) {
3881                         struct drm_display_mode *newmode;
3882
3883                         newmode = drm_mode_duplicate(dev, &edid_est_modes[i]);
3884                         if (newmode) {
3885                                 drm_mode_probed_add(connector, newmode);
3886                                 modes++;
3887                         }
3888                 }
3889         }
3890
3891         if (edid->revision >= 1)
3892                 drm_for_each_detailed_block(drm_edid, do_established_modes,
3893                                             &closure);
3894
3895         return modes + closure.modes;
3896 }
3897
3898 static void
3899 do_standard_modes(const struct detailed_timing *timing, void *c)
3900 {
3901         struct detailed_mode_closure *closure = c;
3902         const struct detailed_non_pixel *data = &timing->data.other_data;
3903         struct drm_connector *connector = closure->connector;
3904         int i;
3905
3906         if (!is_display_descriptor(timing, EDID_DETAIL_STD_MODES))
3907                 return;
3908
3909         for (i = 0; i < 6; i++) {
3910                 const struct std_timing *std = &data->data.timings[i];
3911                 struct drm_display_mode *newmode;
3912
3913                 newmode = drm_mode_std(connector, closure->drm_edid, std);
3914                 if (newmode) {
3915                         drm_mode_probed_add(connector, newmode);
3916                         closure->modes++;
3917                 }
3918         }
3919 }
3920
3921 /*
3922  * Get standard modes from EDID and add them. Standard modes can be calculated
3923  * using the appropriate standard (DMT, GTF, or CVT). Grab them from EDID and
3924  * add them to the list.
3925  */
3926 static int add_standard_modes(struct drm_connector *connector,
3927                               const struct drm_edid *drm_edid)
3928 {
3929         int i, modes = 0;
3930         struct detailed_mode_closure closure = {
3931                 .connector = connector,
3932                 .drm_edid = drm_edid,
3933         };
3934
3935         for (i = 0; i < EDID_STD_TIMINGS; i++) {
3936                 struct drm_display_mode *newmode;
3937
3938                 newmode = drm_mode_std(connector, drm_edid,
3939                                        &drm_edid->edid->standard_timings[i]);
3940                 if (newmode) {
3941                         drm_mode_probed_add(connector, newmode);
3942                         modes++;
3943                 }
3944         }
3945
3946         if (drm_edid->edid->revision >= 1)
3947                 drm_for_each_detailed_block(drm_edid, do_standard_modes,
3948                                             &closure);
3949
3950         /* XXX should also look for standard codes in VTB blocks */
3951
3952         return modes + closure.modes;
3953 }
3954
3955 static int drm_cvt_modes(struct drm_connector *connector,
3956                          const struct detailed_timing *timing)
3957 {
3958         int i, j, modes = 0;
3959         struct drm_display_mode *newmode;
3960         struct drm_device *dev = connector->dev;
3961         const struct cvt_timing *cvt;
3962         static const int rates[] = { 60, 85, 75, 60, 50 };
3963         const u8 empty[3] = { 0, 0, 0 };
3964
3965         for (i = 0; i < 4; i++) {
3966                 int width, height;
3967
3968                 cvt = &(timing->data.other_data.data.cvt[i]);
3969
3970                 if (!memcmp(cvt->code, empty, 3))
3971                         continue;
3972
3973                 height = (cvt->code[0] + ((cvt->code[1] & 0xf0) << 4) + 1) * 2;
3974                 switch (cvt->code[1] & 0x0c) {
3975                 /* default - because compiler doesn't see that we've enumerated all cases */
3976                 default:
3977                 case 0x00:
3978                         width = height * 4 / 3;
3979                         break;
3980                 case 0x04:
3981                         width = height * 16 / 9;
3982                         break;
3983                 case 0x08:
3984                         width = height * 16 / 10;
3985                         break;
3986                 case 0x0c:
3987                         width = height * 15 / 9;
3988                         break;
3989                 }
3990
3991                 for (j = 1; j < 5; j++) {
3992                         if (cvt->code[2] & (1 << j)) {
3993                                 newmode = drm_cvt_mode(dev, width, height,
3994                                                        rates[j], j == 0,
3995                                                        false, false);
3996                                 if (newmode) {
3997                                         drm_mode_probed_add(connector, newmode);
3998                                         modes++;
3999                                 }
4000                         }
4001                 }
4002         }
4003
4004         return modes;
4005 }
4006
4007 static void
4008 do_cvt_mode(const struct detailed_timing *timing, void *c)
4009 {
4010         struct detailed_mode_closure *closure = c;
4011
4012         if (!is_display_descriptor(timing, EDID_DETAIL_CVT_3BYTE))
4013                 return;
4014
4015         closure->modes += drm_cvt_modes(closure->connector, timing);
4016 }
4017
4018 static int
4019 add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
4020 {
4021         struct detailed_mode_closure closure = {
4022                 .connector = connector,
4023                 .drm_edid = drm_edid,
4024         };
4025
4026         if (drm_edid->edid->revision >= 3)
4027                 drm_for_each_detailed_block(drm_edid, do_cvt_mode, &closure);
4028
4029         /* XXX should also look for CVT codes in VTB blocks */
4030
4031         return closure.modes;
4032 }
4033
4034 static void fixup_detailed_cea_mode_clock(struct drm_connector *connector,
4035                                           struct drm_display_mode *mode);
4036
4037 static void
4038 do_detailed_mode(const struct detailed_timing *timing, void *c)
4039 {
4040         struct detailed_mode_closure *closure = c;
4041         struct drm_display_mode *newmode;
4042
4043         if (!is_detailed_timing_descriptor(timing))
4044                 return;
4045
4046         newmode = drm_mode_detailed(closure->connector,
4047                                     closure->drm_edid, timing);
4048         if (!newmode)
4049                 return;
4050
4051         if (closure->preferred)
4052                 newmode->type |= DRM_MODE_TYPE_PREFERRED;
4053
4054         /*
4055          * Detailed modes are limited to 10kHz pixel clock resolution,
4056          * so fix up anything that looks like CEA/HDMI mode, but the clock
4057          * is just slightly off.
4058          */
4059         fixup_detailed_cea_mode_clock(closure->connector, newmode);
4060
4061         drm_mode_probed_add(closure->connector, newmode);
4062         closure->modes++;
4063         closure->preferred = false;
4064 }
4065
4066 /*
4067  * add_detailed_modes - Add modes from detailed timings
4068  * @connector: attached connector
4069  * @drm_edid: EDID block to scan
4070  */
4071 static int add_detailed_modes(struct drm_connector *connector,
4072                               const struct drm_edid *drm_edid)
4073 {
4074         struct detailed_mode_closure closure = {
4075                 .connector = connector,
4076                 .drm_edid = drm_edid,
4077         };
4078
4079         if (drm_edid->edid->revision >= 4)
4080                 closure.preferred = true; /* first detailed timing is always preferred */
4081         else
4082                 closure.preferred =
4083                         drm_edid->edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING;
4084
4085         drm_for_each_detailed_block(drm_edid, do_detailed_mode, &closure);
4086
4087         return closure.modes;
4088 }
4089
4090 /* CTA-861-H Table 60 - CTA Tag Codes */
4091 #define CTA_DB_AUDIO                    1
4092 #define CTA_DB_VIDEO                    2
4093 #define CTA_DB_VENDOR                   3
4094 #define CTA_DB_SPEAKER                  4
4095 #define CTA_DB_EXTENDED_TAG             7
4096
4097 /* CTA-861-H Table 62 - CTA Extended Tag Codes */
4098 #define CTA_EXT_DB_VIDEO_CAP            0
4099 #define CTA_EXT_DB_VENDOR               1
4100 #define CTA_EXT_DB_HDR_STATIC_METADATA  6
4101 #define CTA_EXT_DB_420_VIDEO_DATA       14
4102 #define CTA_EXT_DB_420_VIDEO_CAP_MAP    15
4103 #define CTA_EXT_DB_HF_EEODB             0x78
4104 #define CTA_EXT_DB_HF_SCDB              0x79
4105
4106 #define EDID_BASIC_AUDIO        (1 << 6)
4107 #define EDID_CEA_YCRCB444       (1 << 5)
4108 #define EDID_CEA_YCRCB422       (1 << 4)
4109 #define EDID_CEA_VCDB_QS        (1 << 6)
4110
4111 /*
4112  * Search EDID for CEA extension block.
4113  *
4114  * FIXME: Prefer not returning pointers to raw EDID data.
4115  */
4116 const u8 *drm_find_edid_extension(const struct drm_edid *drm_edid,
4117                                   int ext_id, int *ext_index)
4118 {
4119         const u8 *edid_ext = NULL;
4120         int i;
4121
4122         /* No EDID or EDID extensions */
4123         if (!drm_edid || !drm_edid_extension_block_count(drm_edid))
4124                 return NULL;
4125
4126         /* Find CEA extension */
4127         for (i = *ext_index; i < drm_edid_extension_block_count(drm_edid); i++) {
4128                 edid_ext = drm_edid_extension_block_data(drm_edid, i);
4129                 if (edid_block_tag(edid_ext) == ext_id)
4130                         break;
4131         }
4132
4133         if (i >= drm_edid_extension_block_count(drm_edid))
4134                 return NULL;
4135
4136         *ext_index = i + 1;
4137
4138         return edid_ext;
4139 }
4140
4141 /* Return true if the EDID has a CTA extension or a DisplayID CTA data block */
4142 static bool drm_edid_has_cta_extension(const struct drm_edid *drm_edid)
4143 {
4144         const struct displayid_block *block;
4145         struct displayid_iter iter;
4146         int ext_index = 0;
4147         bool found = false;
4148
4149         /* Look for a top level CEA extension block */
4150         if (drm_find_edid_extension(drm_edid, CEA_EXT, &ext_index))
4151                 return true;
4152
4153         /* CEA blocks can also be found embedded in a DisplayID block */
4154         displayid_iter_edid_begin(drm_edid, &iter);
4155         displayid_iter_for_each(block, &iter) {
4156                 if (block->tag == DATA_BLOCK_CTA) {
4157                         found = true;
4158                         break;
4159                 }
4160         }
4161         displayid_iter_end(&iter);
4162
4163         return found;
4164 }
4165
4166 static __always_inline const struct drm_display_mode *cea_mode_for_vic(u8 vic)
4167 {
4168         BUILD_BUG_ON(1 + ARRAY_SIZE(edid_cea_modes_1) - 1 != 127);
4169         BUILD_BUG_ON(193 + ARRAY_SIZE(edid_cea_modes_193) - 1 != 219);
4170
4171         if (vic >= 1 && vic < 1 + ARRAY_SIZE(edid_cea_modes_1))
4172                 return &edid_cea_modes_1[vic - 1];
4173         if (vic >= 193 && vic < 193 + ARRAY_SIZE(edid_cea_modes_193))
4174                 return &edid_cea_modes_193[vic - 193];
4175         return NULL;
4176 }
4177
4178 static u8 cea_num_vics(void)
4179 {
4180         return 193 + ARRAY_SIZE(edid_cea_modes_193);
4181 }
4182
4183 static u8 cea_next_vic(u8 vic)
4184 {
4185         if (++vic == 1 + ARRAY_SIZE(edid_cea_modes_1))
4186                 vic = 193;
4187         return vic;
4188 }
4189
4190 /*
4191  * Calculate the alternate clock for the CEA mode
4192  * (60Hz vs. 59.94Hz etc.)
4193  */
4194 static unsigned int
4195 cea_mode_alternate_clock(const struct drm_display_mode *cea_mode)
4196 {
4197         unsigned int clock = cea_mode->clock;
4198
4199         if (drm_mode_vrefresh(cea_mode) % 6 != 0)
4200                 return clock;
4201
4202         /*
4203          * edid_cea_modes contains the 59.94Hz
4204          * variant for 240 and 480 line modes,
4205          * and the 60Hz variant otherwise.
4206          */
4207         if (cea_mode->vdisplay == 240 || cea_mode->vdisplay == 480)
4208                 clock = DIV_ROUND_CLOSEST(clock * 1001, 1000);
4209         else
4210                 clock = DIV_ROUND_CLOSEST(clock * 1000, 1001);
4211
4212         return clock;
4213 }
4214
4215 static bool
4216 cea_mode_alternate_timings(u8 vic, struct drm_display_mode *mode)
4217 {
4218         /*
4219          * For certain VICs the spec allows the vertical
4220          * front porch to vary by one or two lines.
4221          *
4222          * cea_modes[] stores the variant with the shortest
4223          * vertical front porch. We can adjust the mode to
4224          * get the other variants by simply increasing the
4225          * vertical front porch length.
4226          */
4227         BUILD_BUG_ON(cea_mode_for_vic(8)->vtotal != 262 ||
4228                      cea_mode_for_vic(9)->vtotal != 262 ||
4229                      cea_mode_for_vic(12)->vtotal != 262 ||
4230                      cea_mode_for_vic(13)->vtotal != 262 ||
4231                      cea_mode_for_vic(23)->vtotal != 312 ||
4232                      cea_mode_for_vic(24)->vtotal != 312 ||
4233                      cea_mode_for_vic(27)->vtotal != 312 ||
4234                      cea_mode_for_vic(28)->vtotal != 312);
4235
4236         if (((vic == 8 || vic == 9 ||
4237               vic == 12 || vic == 13) && mode->vtotal < 263) ||
4238             ((vic == 23 || vic == 24 ||
4239               vic == 27 || vic == 28) && mode->vtotal < 314)) {
4240                 mode->vsync_start++;
4241                 mode->vsync_end++;
4242                 mode->vtotal++;
4243
4244                 return true;
4245         }
4246
4247         return false;
4248 }
4249
4250 static u8 drm_match_cea_mode_clock_tolerance(const struct drm_display_mode *to_match,
4251                                              unsigned int clock_tolerance)
4252 {
4253         unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
4254         u8 vic;
4255
4256         if (!to_match->clock)
4257                 return 0;
4258
4259         if (to_match->picture_aspect_ratio)
4260                 match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
4261
4262         for (vic = 1; vic < cea_num_vics(); vic = cea_next_vic(vic)) {
4263                 struct drm_display_mode cea_mode;
4264                 unsigned int clock1, clock2;
4265
4266                 drm_mode_init(&cea_mode, cea_mode_for_vic(vic));
4267
4268                 /* Check both 60Hz and 59.94Hz */
4269                 clock1 = cea_mode.clock;
4270                 clock2 = cea_mode_alternate_clock(&cea_mode);
4271
4272                 if (abs(to_match->clock - clock1) > clock_tolerance &&
4273                     abs(to_match->clock - clock2) > clock_tolerance)
4274                         continue;
4275
4276                 do {
4277                         if (drm_mode_match(to_match, &cea_mode, match_flags))
4278                                 return vic;
4279                 } while (cea_mode_alternate_timings(vic, &cea_mode));
4280         }
4281
4282         return 0;
4283 }
4284
4285 /**
4286  * drm_match_cea_mode - look for a CEA mode matching given mode
4287  * @to_match: display mode
4288  *
4289  * Return: The CEA Video ID (VIC) of the mode or 0 if it isn't a CEA-861
4290  * mode.
4291  */
4292 u8 drm_match_cea_mode(const struct drm_display_mode *to_match)
4293 {
4294         unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
4295         u8 vic;
4296
4297         if (!to_match->clock)
4298                 return 0;
4299
4300         if (to_match->picture_aspect_ratio)
4301                 match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
4302
4303         for (vic = 1; vic < cea_num_vics(); vic = cea_next_vic(vic)) {
4304                 struct drm_display_mode cea_mode;
4305                 unsigned int clock1, clock2;
4306
4307                 drm_mode_init(&cea_mode, cea_mode_for_vic(vic));
4308
4309                 /* Check both 60Hz and 59.94Hz */
4310                 clock1 = cea_mode.clock;
4311                 clock2 = cea_mode_alternate_clock(&cea_mode);
4312
4313                 if (KHZ2PICOS(to_match->clock) != KHZ2PICOS(clock1) &&
4314                     KHZ2PICOS(to_match->clock) != KHZ2PICOS(clock2))
4315                         continue;
4316
4317                 do {
4318                         if (drm_mode_match(to_match, &cea_mode, match_flags))
4319                                 return vic;
4320                 } while (cea_mode_alternate_timings(vic, &cea_mode));
4321         }
4322
4323         return 0;
4324 }
4325 EXPORT_SYMBOL(drm_match_cea_mode);
4326
4327 static bool drm_valid_cea_vic(u8 vic)
4328 {
4329         return cea_mode_for_vic(vic) != NULL;
4330 }
4331
4332 static enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code)
4333 {
4334         const struct drm_display_mode *mode = cea_mode_for_vic(video_code);
4335
4336         if (mode)
4337                 return mode->picture_aspect_ratio;
4338
4339         return HDMI_PICTURE_ASPECT_NONE;
4340 }
4341
4342 static enum hdmi_picture_aspect drm_get_hdmi_aspect_ratio(const u8 video_code)
4343 {
4344         return edid_4k_modes[video_code].picture_aspect_ratio;
4345 }
4346
4347 /*
4348  * Calculate the alternate clock for HDMI modes (those from the HDMI vendor
4349  * specific block).
4350  */
4351 static unsigned int
4352 hdmi_mode_alternate_clock(const struct drm_display_mode *hdmi_mode)
4353 {
4354         return cea_mode_alternate_clock(hdmi_mode);
4355 }
4356
4357 static u8 drm_match_hdmi_mode_clock_tolerance(const struct drm_display_mode *to_match,
4358                                               unsigned int clock_tolerance)
4359 {
4360         unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
4361         u8 vic;
4362
4363         if (!to_match->clock)
4364                 return 0;
4365
4366         if (to_match->picture_aspect_ratio)
4367                 match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
4368
4369         for (vic = 1; vic < ARRAY_SIZE(edid_4k_modes); vic++) {
4370                 const struct drm_display_mode *hdmi_mode = &edid_4k_modes[vic];
4371                 unsigned int clock1, clock2;
4372
4373                 /* Make sure to also match alternate clocks */
4374                 clock1 = hdmi_mode->clock;
4375                 clock2 = hdmi_mode_alternate_clock(hdmi_mode);
4376
4377                 if (abs(to_match->clock - clock1) > clock_tolerance &&
4378                     abs(to_match->clock - clock2) > clock_tolerance)
4379                         continue;
4380
4381                 if (drm_mode_match(to_match, hdmi_mode, match_flags))
4382                         return vic;
4383         }
4384
4385         return 0;
4386 }
4387
4388 /*
4389  * drm_match_hdmi_mode - look for a HDMI mode matching given mode
4390  * @to_match: display mode
4391  *
4392  * An HDMI mode is one defined in the HDMI vendor specific block.
4393  *
4394  * Returns the HDMI Video ID (VIC) of the mode or 0 if it isn't one.
4395  */
4396 static u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match)
4397 {
4398         unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
4399         u8 vic;
4400
4401         if (!to_match->clock)
4402                 return 0;
4403
4404         if (to_match->picture_aspect_ratio)
4405                 match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
4406
4407         for (vic = 1; vic < ARRAY_SIZE(edid_4k_modes); vic++) {
4408                 const struct drm_display_mode *hdmi_mode = &edid_4k_modes[vic];
4409                 unsigned int clock1, clock2;
4410
4411                 /* Make sure to also match alternate clocks */
4412                 clock1 = hdmi_mode->clock;
4413                 clock2 = hdmi_mode_alternate_clock(hdmi_mode);
4414
4415                 if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
4416                      KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
4417                     drm_mode_match(to_match, hdmi_mode, match_flags))
4418                         return vic;
4419         }
4420         return 0;
4421 }
4422
4423 static bool drm_valid_hdmi_vic(u8 vic)
4424 {
4425         return vic > 0 && vic < ARRAY_SIZE(edid_4k_modes);
4426 }
4427
4428 static int add_alternate_cea_modes(struct drm_connector *connector,
4429                                    const struct drm_edid *drm_edid)
4430 {
4431         struct drm_device *dev = connector->dev;
4432         struct drm_display_mode *mode, *tmp;
4433         LIST_HEAD(list);
4434         int modes = 0;
4435
4436         /* Don't add CTA modes if the CTA extension block is missing */
4437         if (!drm_edid_has_cta_extension(drm_edid))
4438                 return 0;
4439
4440         /*
4441          * Go through all probed modes and create a new mode
4442          * with the alternate clock for certain CEA modes.
4443          */
4444         list_for_each_entry(mode, &connector->probed_modes, head) {
4445                 const struct drm_display_mode *cea_mode = NULL;
4446                 struct drm_display_mode *newmode;
4447                 u8 vic = drm_match_cea_mode(mode);
4448                 unsigned int clock1, clock2;
4449
4450                 if (drm_valid_cea_vic(vic)) {
4451                         cea_mode = cea_mode_for_vic(vic);
4452                         clock2 = cea_mode_alternate_clock(cea_mode);
4453                 } else {
4454                         vic = drm_match_hdmi_mode(mode);
4455                         if (drm_valid_hdmi_vic(vic)) {
4456                                 cea_mode = &edid_4k_modes[vic];
4457                                 clock2 = hdmi_mode_alternate_clock(cea_mode);
4458                         }
4459                 }
4460
4461                 if (!cea_mode)
4462                         continue;
4463
4464                 clock1 = cea_mode->clock;
4465
4466                 if (clock1 == clock2)
4467                         continue;
4468
4469                 if (mode->clock != clock1 && mode->clock != clock2)
4470                         continue;
4471
4472                 newmode = drm_mode_duplicate(dev, cea_mode);
4473                 if (!newmode)
4474                         continue;
4475
4476                 /* Carry over the stereo flags */
4477                 newmode->flags |= mode->flags & DRM_MODE_FLAG_3D_MASK;
4478
4479                 /*
4480                  * The current mode could be either variant. Make
4481                  * sure to pick the "other" clock for the new mode.
4482                  */
4483                 if (mode->clock != clock1)
4484                         newmode->clock = clock1;
4485                 else
4486                         newmode->clock = clock2;
4487
4488                 list_add_tail(&newmode->head, &list);
4489         }
4490
4491         list_for_each_entry_safe(mode, tmp, &list, head) {
4492                 list_del(&mode->head);
4493                 drm_mode_probed_add(connector, mode);
4494                 modes++;
4495         }
4496
4497         return modes;
4498 }
4499
4500 static u8 svd_to_vic(u8 svd)
4501 {
4502         /* 0-6 bit vic, 7th bit native mode indicator */
4503         if ((svd >= 1 &&  svd <= 64) || (svd >= 129 && svd <= 192))
4504                 return svd & 127;
4505
4506         return svd;
4507 }
4508
4509 /*
4510  * Return a display mode for the 0-based vic_index'th VIC across all CTA VDBs in
4511  * the EDID, or NULL on errors.
4512  */
4513 static struct drm_display_mode *
4514 drm_display_mode_from_vic_index(struct drm_connector *connector, int vic_index)
4515 {
4516         const struct drm_display_info *info = &connector->display_info;
4517         struct drm_device *dev = connector->dev;
4518
4519         if (!info->vics || vic_index >= info->vics_len || !info->vics[vic_index])
4520                 return NULL;
4521
4522         return drm_display_mode_from_cea_vic(dev, info->vics[vic_index]);
4523 }
4524
4525 /*
4526  * do_y420vdb_modes - Parse YCBCR 420 only modes
4527  * @connector: connector corresponding to the HDMI sink
4528  * @svds: start of the data block of CEA YCBCR 420 VDB
4529  * @len: length of the CEA YCBCR 420 VDB
4530  *
4531  * Parse the CEA-861-F YCBCR 420 Video Data Block (Y420VDB)
4532  * which contains modes which can be supported in YCBCR 420
4533  * output format only.
4534  */
4535 static int do_y420vdb_modes(struct drm_connector *connector,
4536                             const u8 *svds, u8 svds_len)
4537 {
4538         struct drm_device *dev = connector->dev;
4539         int modes = 0, i;
4540
4541         for (i = 0; i < svds_len; i++) {
4542                 u8 vic = svd_to_vic(svds[i]);
4543                 struct drm_display_mode *newmode;
4544
4545                 if (!drm_valid_cea_vic(vic))
4546                         continue;
4547
4548                 newmode = drm_mode_duplicate(dev, cea_mode_for_vic(vic));
4549                 if (!newmode)
4550                         break;
4551                 drm_mode_probed_add(connector, newmode);
4552                 modes++;
4553         }
4554
4555         return modes;
4556 }
4557
4558 /**
4559  * drm_display_mode_from_cea_vic() - return a mode for CEA VIC
4560  * @dev: DRM device
4561  * @video_code: CEA VIC of the mode
4562  *
4563  * Creates a new mode matching the specified CEA VIC.
4564  *
4565  * Returns: A new drm_display_mode on success or NULL on failure
4566  */
4567 struct drm_display_mode *
4568 drm_display_mode_from_cea_vic(struct drm_device *dev,
4569                               u8 video_code)
4570 {
4571         const struct drm_display_mode *cea_mode;
4572         struct drm_display_mode *newmode;
4573
4574         cea_mode = cea_mode_for_vic(video_code);
4575         if (!cea_mode)
4576                 return NULL;
4577
4578         newmode = drm_mode_duplicate(dev, cea_mode);
4579         if (!newmode)
4580                 return NULL;
4581
4582         return newmode;
4583 }
4584 EXPORT_SYMBOL(drm_display_mode_from_cea_vic);
4585
4586 /* Add modes based on VICs parsed in parse_cta_vdb() */
4587 static int add_cta_vdb_modes(struct drm_connector *connector)
4588 {
4589         const struct drm_display_info *info = &connector->display_info;
4590         int i, modes = 0;
4591
4592         if (!info->vics)
4593                 return 0;
4594
4595         for (i = 0; i < info->vics_len; i++) {
4596                 struct drm_display_mode *mode;
4597
4598                 mode = drm_display_mode_from_vic_index(connector, i);
4599                 if (mode) {
4600                         drm_mode_probed_add(connector, mode);
4601                         modes++;
4602                 }
4603         }
4604
4605         return modes;
4606 }
4607
4608 struct stereo_mandatory_mode {
4609         int width, height, vrefresh;
4610         unsigned int flags;
4611 };
4612
4613 static const struct stereo_mandatory_mode stereo_mandatory_modes[] = {
4614         { 1920, 1080, 24, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
4615         { 1920, 1080, 24, DRM_MODE_FLAG_3D_FRAME_PACKING },
4616         { 1920, 1080, 50,
4617           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF },
4618         { 1920, 1080, 60,
4619           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF },
4620         { 1280, 720,  50, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
4621         { 1280, 720,  50, DRM_MODE_FLAG_3D_FRAME_PACKING },
4622         { 1280, 720,  60, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
4623         { 1280, 720,  60, DRM_MODE_FLAG_3D_FRAME_PACKING }
4624 };
4625
4626 static bool
4627 stereo_match_mandatory(const struct drm_display_mode *mode,
4628                        const struct stereo_mandatory_mode *stereo_mode)
4629 {
4630         unsigned int interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
4631
4632         return mode->hdisplay == stereo_mode->width &&
4633                mode->vdisplay == stereo_mode->height &&
4634                interlaced == (stereo_mode->flags & DRM_MODE_FLAG_INTERLACE) &&
4635                drm_mode_vrefresh(mode) == stereo_mode->vrefresh;
4636 }
4637
4638 static int add_hdmi_mandatory_stereo_modes(struct drm_connector *connector)
4639 {
4640         struct drm_device *dev = connector->dev;
4641         const struct drm_display_mode *mode;
4642         struct list_head stereo_modes;
4643         int modes = 0, i;
4644
4645         INIT_LIST_HEAD(&stereo_modes);
4646
4647         list_for_each_entry(mode, &connector->probed_modes, head) {
4648                 for (i = 0; i < ARRAY_SIZE(stereo_mandatory_modes); i++) {
4649                         const struct stereo_mandatory_mode *mandatory;
4650                         struct drm_display_mode *new_mode;
4651
4652                         if (!stereo_match_mandatory(mode,
4653                                                     &stereo_mandatory_modes[i]))
4654                                 continue;
4655
4656                         mandatory = &stereo_mandatory_modes[i];
4657                         new_mode = drm_mode_duplicate(dev, mode);
4658                         if (!new_mode)
4659                                 continue;
4660
4661                         new_mode->flags |= mandatory->flags;
4662                         list_add_tail(&new_mode->head, &stereo_modes);
4663                         modes++;
4664                 }
4665         }
4666
4667         list_splice_tail(&stereo_modes, &connector->probed_modes);
4668
4669         return modes;
4670 }
4671
4672 static int add_hdmi_mode(struct drm_connector *connector, u8 vic)
4673 {
4674         struct drm_device *dev = connector->dev;
4675         struct drm_display_mode *newmode;
4676
4677         if (!drm_valid_hdmi_vic(vic)) {
4678                 drm_err(connector->dev, "[CONNECTOR:%d:%s] Unknown HDMI VIC: %d\n",
4679                         connector->base.id, connector->name, vic);
4680                 return 0;
4681         }
4682
4683         newmode = drm_mode_duplicate(dev, &edid_4k_modes[vic]);
4684         if (!newmode)
4685                 return 0;
4686
4687         drm_mode_probed_add(connector, newmode);
4688
4689         return 1;
4690 }
4691
4692 static int add_3d_struct_modes(struct drm_connector *connector, u16 structure,
4693                                int vic_index)
4694 {
4695         struct drm_display_mode *newmode;
4696         int modes = 0;
4697
4698         if (structure & (1 << 0)) {
4699                 newmode = drm_display_mode_from_vic_index(connector, vic_index);
4700                 if (newmode) {
4701                         newmode->flags |= DRM_MODE_FLAG_3D_FRAME_PACKING;
4702                         drm_mode_probed_add(connector, newmode);
4703                         modes++;
4704                 }
4705         }
4706         if (structure & (1 << 6)) {
4707                 newmode = drm_display_mode_from_vic_index(connector, vic_index);
4708                 if (newmode) {
4709                         newmode->flags |= DRM_MODE_FLAG_3D_TOP_AND_BOTTOM;
4710                         drm_mode_probed_add(connector, newmode);
4711                         modes++;
4712                 }
4713         }
4714         if (structure & (1 << 8)) {
4715                 newmode = drm_display_mode_from_vic_index(connector, vic_index);
4716                 if (newmode) {
4717                         newmode->flags |= DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF;
4718                         drm_mode_probed_add(connector, newmode);
4719                         modes++;
4720                 }
4721         }
4722
4723         return modes;
4724 }
4725
4726 static bool hdmi_vsdb_latency_present(const u8 *db)
4727 {
4728         return db[8] & BIT(7);
4729 }
4730
4731 static bool hdmi_vsdb_i_latency_present(const u8 *db)
4732 {
4733         return hdmi_vsdb_latency_present(db) && db[8] & BIT(6);
4734 }
4735
4736 static int hdmi_vsdb_latency_length(const u8 *db)
4737 {
4738         if (hdmi_vsdb_i_latency_present(db))
4739                 return 4;
4740         else if (hdmi_vsdb_latency_present(db))
4741                 return 2;
4742         else
4743                 return 0;
4744 }
4745
4746 /*
4747  * do_hdmi_vsdb_modes - Parse the HDMI Vendor Specific data block
4748  * @connector: connector corresponding to the HDMI sink
4749  * @db: start of the CEA vendor specific block
4750  * @len: length of the CEA block payload, ie. one can access up to db[len]
4751  *
4752  * Parses the HDMI VSDB looking for modes to add to @connector. This function
4753  * also adds the stereo 3d modes when applicable.
4754  */
4755 static int
4756 do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len)
4757 {
4758         int modes = 0, offset = 0, i, multi_present = 0, multi_len;
4759         u8 vic_len, hdmi_3d_len = 0;
4760         u16 mask;
4761         u16 structure_all;
4762
4763         if (len < 8)
4764                 goto out;
4765
4766         /* no HDMI_Video_Present */
4767         if (!(db[8] & (1 << 5)))
4768                 goto out;
4769
4770         offset += hdmi_vsdb_latency_length(db);
4771
4772         /* the declared length is not long enough for the 2 first bytes
4773          * of additional video format capabilities */
4774         if (len < (8 + offset + 2))
4775                 goto out;
4776
4777         /* 3D_Present */
4778         offset++;
4779         if (db[8 + offset] & (1 << 7)) {
4780                 modes += add_hdmi_mandatory_stereo_modes(connector);
4781
4782                 /* 3D_Multi_present */
4783                 multi_present = (db[8 + offset] & 0x60) >> 5;
4784         }
4785
4786         offset++;
4787         vic_len = db[8 + offset] >> 5;
4788         hdmi_3d_len = db[8 + offset] & 0x1f;
4789
4790         for (i = 0; i < vic_len && len >= (9 + offset + i); i++) {
4791                 u8 vic;
4792
4793                 vic = db[9 + offset + i];
4794                 modes += add_hdmi_mode(connector, vic);
4795         }
4796         offset += 1 + vic_len;
4797
4798         if (multi_present == 1)
4799                 multi_len = 2;
4800         else if (multi_present == 2)
4801                 multi_len = 4;
4802         else
4803                 multi_len = 0;
4804
4805         if (len < (8 + offset + hdmi_3d_len - 1))
4806                 goto out;
4807
4808         if (hdmi_3d_len < multi_len)
4809                 goto out;
4810
4811         if (multi_present == 1 || multi_present == 2) {
4812                 /* 3D_Structure_ALL */
4813                 structure_all = (db[8 + offset] << 8) | db[9 + offset];
4814
4815                 /* check if 3D_MASK is present */
4816                 if (multi_present == 2)
4817                         mask = (db[10 + offset] << 8) | db[11 + offset];
4818                 else
4819                         mask = 0xffff;
4820
4821                 for (i = 0; i < 16; i++) {
4822                         if (mask & (1 << i))
4823                                 modes += add_3d_struct_modes(connector,
4824                                                              structure_all, i);
4825                 }
4826         }
4827
4828         offset += multi_len;
4829
4830         for (i = 0; i < (hdmi_3d_len - multi_len); i++) {
4831                 int vic_index;
4832                 struct drm_display_mode *newmode = NULL;
4833                 unsigned int newflag = 0;
4834                 bool detail_present;
4835
4836                 detail_present = ((db[8 + offset + i] & 0x0f) > 7);
4837
4838                 if (detail_present && (i + 1 == hdmi_3d_len - multi_len))
4839                         break;
4840
4841                 /* 2D_VIC_order_X */
4842                 vic_index = db[8 + offset + i] >> 4;
4843
4844                 /* 3D_Structure_X */
4845                 switch (db[8 + offset + i] & 0x0f) {
4846                 case 0:
4847                         newflag = DRM_MODE_FLAG_3D_FRAME_PACKING;
4848                         break;
4849                 case 6:
4850                         newflag = DRM_MODE_FLAG_3D_TOP_AND_BOTTOM;
4851                         break;
4852                 case 8:
4853                         /* 3D_Detail_X */
4854                         if ((db[9 + offset + i] >> 4) == 1)
4855                                 newflag = DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF;
4856                         break;
4857                 }
4858
4859                 if (newflag != 0) {
4860                         newmode = drm_display_mode_from_vic_index(connector,
4861                                                                   vic_index);
4862
4863                         if (newmode) {
4864                                 newmode->flags |= newflag;
4865                                 drm_mode_probed_add(connector, newmode);
4866                                 modes++;
4867                         }
4868                 }
4869
4870                 if (detail_present)
4871                         i++;
4872         }
4873
4874 out:
4875         return modes;
4876 }
4877
4878 static int
4879 cea_revision(const u8 *cea)
4880 {
4881         /*
4882          * FIXME is this correct for the DispID variant?
4883          * The DispID spec doesn't really specify whether
4884          * this is the revision of the CEA extension or
4885          * the DispID CEA data block. And the only value
4886          * given as an example is 0.
4887          */
4888         return cea[1];
4889 }
4890
4891 /*
4892  * CTA Data Block iterator.
4893  *
4894  * Iterate through all CTA Data Blocks in both EDID CTA Extensions and DisplayID
4895  * CTA Data Blocks.
4896  *
4897  * struct cea_db *db:
4898  * struct cea_db_iter iter;
4899  *
4900  * cea_db_iter_edid_begin(edid, &iter);
4901  * cea_db_iter_for_each(db, &iter) {
4902  *         // do stuff with db
4903  * }
4904  * cea_db_iter_end(&iter);
4905  */
4906 struct cea_db_iter {
4907         struct drm_edid_iter edid_iter;
4908         struct displayid_iter displayid_iter;
4909
4910         /* Current Data Block Collection. */
4911         const u8 *collection;
4912
4913         /* Current Data Block index in current collection. */
4914         int index;
4915
4916         /* End index in current collection. */
4917         int end;
4918 };
4919
4920 /* CTA-861-H section 7.4 CTA Data BLock Collection */
4921 struct cea_db {
4922         u8 tag_length;
4923         u8 data[];
4924 } __packed;
4925
4926 static int cea_db_tag(const struct cea_db *db)
4927 {
4928         return db->tag_length >> 5;
4929 }
4930
4931 static int cea_db_payload_len(const void *_db)
4932 {
4933         /* FIXME: Transition to passing struct cea_db * everywhere. */
4934         const struct cea_db *db = _db;
4935
4936         return db->tag_length & 0x1f;
4937 }
4938
4939 static const void *cea_db_data(const struct cea_db *db)
4940 {
4941         return db->data;
4942 }
4943
4944 static bool cea_db_is_extended_tag(const struct cea_db *db, int tag)
4945 {
4946         return cea_db_tag(db) == CTA_DB_EXTENDED_TAG &&
4947                 cea_db_payload_len(db) >= 1 &&
4948                 db->data[0] == tag;
4949 }
4950
4951 static bool cea_db_is_vendor(const struct cea_db *db, int vendor_oui)
4952 {
4953         const u8 *data = cea_db_data(db);
4954
4955         return cea_db_tag(db) == CTA_DB_VENDOR &&
4956                 cea_db_payload_len(db) >= 3 &&
4957                 oui(data[2], data[1], data[0]) == vendor_oui;
4958 }
4959
4960 static void cea_db_iter_edid_begin(const struct drm_edid *drm_edid,
4961                                    struct cea_db_iter *iter)
4962 {
4963         memset(iter, 0, sizeof(*iter));
4964
4965         drm_edid_iter_begin(drm_edid, &iter->edid_iter);
4966         displayid_iter_edid_begin(drm_edid, &iter->displayid_iter);
4967 }
4968
4969 static const struct cea_db *
4970 __cea_db_iter_current_block(const struct cea_db_iter *iter)
4971 {
4972         const struct cea_db *db;
4973
4974         if (!iter->collection)
4975                 return NULL;
4976
4977         db = (const struct cea_db *)&iter->collection[iter->index];
4978
4979         if (iter->index + sizeof(*db) <= iter->end &&
4980             iter->index + sizeof(*db) + cea_db_payload_len(db) <= iter->end)
4981                 return db;
4982
4983         return NULL;
4984 }
4985
4986 /*
4987  * References:
4988  * - CTA-861-H section 7.3.3 CTA Extension Version 3
4989  */
4990 static int cea_db_collection_size(const u8 *cta)
4991 {
4992         u8 d = cta[2];
4993
4994         if (d < 4 || d > 127)
4995                 return 0;
4996
4997         return d - 4;
4998 }
4999
5000 /*
5001  * References:
5002  * - VESA E-EDID v1.4
5003  * - CTA-861-H section 7.3.3 CTA Extension Version 3
5004  */
5005 static const void *__cea_db_iter_edid_next(struct cea_db_iter *iter)
5006 {
5007         const u8 *ext;
5008
5009         drm_edid_iter_for_each(ext, &iter->edid_iter) {
5010                 int size;
5011
5012                 /* Only support CTA Extension revision 3+ */
5013                 if (ext[0] != CEA_EXT || cea_revision(ext) < 3)
5014                         continue;
5015
5016                 size = cea_db_collection_size(ext);
5017                 if (!size)
5018                         continue;
5019
5020                 iter->index = 4;
5021                 iter->end = iter->index + size;
5022
5023                 return ext;
5024         }
5025
5026         return NULL;
5027 }
5028
5029 /*
5030  * References:
5031  * - DisplayID v1.3 Appendix C: CEA Data Block within a DisplayID Data Block
5032  * - DisplayID v2.0 section 4.10 CTA DisplayID Data Block
5033  *
5034  * Note that the above do not specify any connection between DisplayID Data
5035  * Block revision and CTA Extension versions.
5036  */
5037 static const void *__cea_db_iter_displayid_next(struct cea_db_iter *iter)
5038 {
5039         const struct displayid_block *block;
5040
5041         displayid_iter_for_each(block, &iter->displayid_iter) {
5042                 if (block->tag != DATA_BLOCK_CTA)
5043                         continue;
5044
5045                 /*
5046                  * The displayid iterator has already verified the block bounds
5047                  * in displayid_iter_block().
5048                  */
5049                 iter->index = sizeof(*block);
5050                 iter->end = iter->index + block->num_bytes;
5051
5052                 return block;
5053         }
5054
5055         return NULL;
5056 }
5057
5058 static const struct cea_db *__cea_db_iter_next(struct cea_db_iter *iter)
5059 {
5060         const struct cea_db *db;
5061
5062         if (iter->collection) {
5063                 /* Current collection should always be valid. */
5064                 db = __cea_db_iter_current_block(iter);
5065                 if (WARN_ON(!db)) {
5066                         iter->collection = NULL;
5067                         return NULL;
5068                 }
5069
5070                 /* Next block in CTA Data Block Collection */
5071                 iter->index += sizeof(*db) + cea_db_payload_len(db);
5072
5073                 db = __cea_db_iter_current_block(iter);
5074                 if (db)
5075                         return db;
5076         }
5077
5078         for (;;) {
5079                 /*
5080                  * Find the next CTA Data Block Collection. First iterate all
5081                  * the EDID CTA Extensions, then all the DisplayID CTA blocks.
5082                  *
5083                  * Per DisplayID v1.3 Appendix B: DisplayID as an EDID
5084                  * Extension, it's recommended that DisplayID extensions are
5085                  * exposed after all of the CTA Extensions.
5086                  */
5087                 iter->collection = __cea_db_iter_edid_next(iter);
5088                 if (!iter->collection)
5089                         iter->collection = __cea_db_iter_displayid_next(iter);
5090
5091                 if (!iter->collection)
5092                         return NULL;
5093
5094                 db = __cea_db_iter_current_block(iter);
5095                 if (db)
5096                         return db;
5097         }
5098 }
5099
5100 #define cea_db_iter_for_each(__db, __iter) \
5101         while (((__db) = __cea_db_iter_next(__iter)))
5102
5103 static void cea_db_iter_end(struct cea_db_iter *iter)
5104 {
5105         displayid_iter_end(&iter->displayid_iter);
5106         drm_edid_iter_end(&iter->edid_iter);
5107
5108         memset(iter, 0, sizeof(*iter));
5109 }
5110
5111 static bool cea_db_is_hdmi_vsdb(const struct cea_db *db)
5112 {
5113         return cea_db_is_vendor(db, HDMI_IEEE_OUI) &&
5114                 cea_db_payload_len(db) >= 5;
5115 }
5116
5117 static bool cea_db_is_hdmi_forum_vsdb(const struct cea_db *db)
5118 {
5119         return cea_db_is_vendor(db, HDMI_FORUM_IEEE_OUI) &&
5120                 cea_db_payload_len(db) >= 7;
5121 }
5122
5123 static bool cea_db_is_hdmi_forum_eeodb(const void *db)
5124 {
5125         return cea_db_is_extended_tag(db, CTA_EXT_DB_HF_EEODB) &&
5126                 cea_db_payload_len(db) >= 2;
5127 }
5128
5129 static bool cea_db_is_microsoft_vsdb(const struct cea_db *db)
5130 {
5131         return cea_db_is_vendor(db, MICROSOFT_IEEE_OUI) &&
5132                 cea_db_payload_len(db) == 21;
5133 }
5134
5135 static bool cea_db_is_vcdb(const struct cea_db *db)
5136 {
5137         return cea_db_is_extended_tag(db, CTA_EXT_DB_VIDEO_CAP) &&
5138                 cea_db_payload_len(db) == 2;
5139 }
5140
5141 static bool cea_db_is_hdmi_forum_scdb(const struct cea_db *db)
5142 {
5143         return cea_db_is_extended_tag(db, CTA_EXT_DB_HF_SCDB) &&
5144                 cea_db_payload_len(db) >= 7;
5145 }
5146
5147 static bool cea_db_is_y420cmdb(const struct cea_db *db)
5148 {
5149         return cea_db_is_extended_tag(db, CTA_EXT_DB_420_VIDEO_CAP_MAP);
5150 }
5151
5152 static bool cea_db_is_y420vdb(const struct cea_db *db)
5153 {
5154         return cea_db_is_extended_tag(db, CTA_EXT_DB_420_VIDEO_DATA);
5155 }
5156
5157 static bool cea_db_is_hdmi_hdr_metadata_block(const struct cea_db *db)
5158 {
5159         return cea_db_is_extended_tag(db, CTA_EXT_DB_HDR_STATIC_METADATA) &&
5160                 cea_db_payload_len(db) >= 3;
5161 }
5162
5163 /*
5164  * Get the HF-EEODB override extension block count from EDID.
5165  *
5166  * The passed in EDID may be partially read, as long as it has at least two
5167  * blocks (base block and one extension block) if EDID extension count is > 0.
5168  *
5169  * Note that this is *not* how you should parse CTA Data Blocks in general; this
5170  * is only to handle partially read EDIDs. Normally, use the CTA Data Block
5171  * iterators instead.
5172  *
5173  * References:
5174  * - HDMI 2.1 section 10.3.6 HDMI Forum EDID Extension Override Data Block
5175  */
5176 static int edid_hfeeodb_extension_block_count(const struct edid *edid)
5177 {
5178         const u8 *cta;
5179
5180         /* No extensions according to base block, no HF-EEODB. */
5181         if (!edid_extension_block_count(edid))
5182                 return 0;
5183
5184         /* HF-EEODB is always in the first EDID extension block only */
5185         cta = edid_extension_block_data(edid, 0);
5186         if (edid_block_tag(cta) != CEA_EXT || cea_revision(cta) < 3)
5187                 return 0;
5188
5189         /* Need to have the data block collection, and at least 3 bytes. */
5190         if (cea_db_collection_size(cta) < 3)
5191                 return 0;
5192
5193         /*
5194          * Sinks that include the HF-EEODB in their E-EDID shall include one and
5195          * only one instance of the HF-EEODB in the E-EDID, occupying bytes 4
5196          * through 6 of Block 1 of the E-EDID.
5197          */
5198         if (!cea_db_is_hdmi_forum_eeodb(&cta[4]))
5199                 return 0;
5200
5201         return cta[4 + 2];
5202 }
5203
5204 /*
5205  * CTA-861 YCbCr 4:2:0 Capability Map Data Block (CTA Y420CMDB)
5206  *
5207  * Y420CMDB contains a bitmap which gives the index of CTA modes from CTA VDB,
5208  * which can support YCBCR 420 sampling output also (apart from RGB/YCBCR444
5209  * etc). For example, if the bit 0 in bitmap is set, first mode in VDB can
5210  * support YCBCR420 output too.
5211  */
5212 static void parse_cta_y420cmdb(struct drm_connector *connector,
5213                                const struct cea_db *db, u64 *y420cmdb_map)
5214 {
5215         struct drm_display_info *info = &connector->display_info;
5216         int i, map_len = cea_db_payload_len(db) - 1;
5217         const u8 *data = cea_db_data(db) + 1;
5218         u64 map = 0;
5219
5220         if (map_len == 0) {
5221                 /* All CEA modes support ycbcr420 sampling also.*/
5222                 map = U64_MAX;
5223                 goto out;
5224         }
5225
5226         /*
5227          * This map indicates which of the existing CEA block modes
5228          * from VDB can support YCBCR420 output too. So if bit=0 is
5229          * set, first mode from VDB can support YCBCR420 output too.
5230          * We will parse and keep this map, before parsing VDB itself
5231          * to avoid going through the same block again and again.
5232          *
5233          * Spec is not clear about max possible size of this block.
5234          * Clamping max bitmap block size at 8 bytes. Every byte can
5235          * address 8 CEA modes, in this way this map can address
5236          * 8*8 = first 64 SVDs.
5237          */
5238         if (WARN_ON_ONCE(map_len > 8))
5239                 map_len = 8;
5240
5241         for (i = 0; i < map_len; i++)
5242                 map |= (u64)data[i] << (8 * i);
5243
5244 out:
5245         if (map)
5246                 info->color_formats |= DRM_COLOR_FORMAT_YCBCR420;
5247
5248         *y420cmdb_map = map;
5249 }
5250
5251 static int add_cea_modes(struct drm_connector *connector,
5252                          const struct drm_edid *drm_edid)
5253 {
5254         const struct cea_db *db;
5255         struct cea_db_iter iter;
5256         int modes;
5257
5258         /* CTA VDB block VICs parsed earlier */
5259         modes = add_cta_vdb_modes(connector);
5260
5261         cea_db_iter_edid_begin(drm_edid, &iter);
5262         cea_db_iter_for_each(db, &iter) {
5263                 if (cea_db_is_hdmi_vsdb(db)) {
5264                         modes += do_hdmi_vsdb_modes(connector, (const u8 *)db,
5265                                                     cea_db_payload_len(db));
5266                 } else if (cea_db_is_y420vdb(db)) {
5267                         const u8 *vdb420 = cea_db_data(db) + 1;
5268
5269                         /* Add 4:2:0(only) modes present in EDID */
5270                         modes += do_y420vdb_modes(connector, vdb420,
5271                                                   cea_db_payload_len(db) - 1);
5272                 }
5273         }
5274         cea_db_iter_end(&iter);
5275
5276         return modes;
5277 }
5278
5279 static void fixup_detailed_cea_mode_clock(struct drm_connector *connector,
5280                                           struct drm_display_mode *mode)
5281 {
5282         const struct drm_display_mode *cea_mode;
5283         int clock1, clock2, clock;
5284         u8 vic;
5285         const char *type;
5286
5287         /*
5288          * allow 5kHz clock difference either way to account for
5289          * the 10kHz clock resolution limit of detailed timings.
5290          */
5291         vic = drm_match_cea_mode_clock_tolerance(mode, 5);
5292         if (drm_valid_cea_vic(vic)) {
5293                 type = "CEA";
5294                 cea_mode = cea_mode_for_vic(vic);
5295                 clock1 = cea_mode->clock;
5296                 clock2 = cea_mode_alternate_clock(cea_mode);
5297         } else {
5298                 vic = drm_match_hdmi_mode_clock_tolerance(mode, 5);
5299                 if (drm_valid_hdmi_vic(vic)) {
5300                         type = "HDMI";
5301                         cea_mode = &edid_4k_modes[vic];
5302                         clock1 = cea_mode->clock;
5303                         clock2 = hdmi_mode_alternate_clock(cea_mode);
5304                 } else {
5305                         return;
5306                 }
5307         }
5308
5309         /* pick whichever is closest */
5310         if (abs(mode->clock - clock1) < abs(mode->clock - clock2))
5311                 clock = clock1;
5312         else
5313                 clock = clock2;
5314
5315         if (mode->clock == clock)
5316                 return;
5317
5318         drm_dbg_kms(connector->dev,
5319                     "[CONNECTOR:%d:%s] detailed mode matches %s VIC %d, adjusting clock %d -> %d\n",
5320                     connector->base.id, connector->name,
5321                     type, vic, mode->clock, clock);
5322         mode->clock = clock;
5323 }
5324
5325 static void drm_calculate_luminance_range(struct drm_connector *connector)
5326 {
5327         struct hdr_static_metadata *hdr_metadata = &connector->hdr_sink_metadata.hdmi_type1;
5328         struct drm_luminance_range_info *luminance_range =
5329                 &connector->display_info.luminance_range;
5330         static const u8 pre_computed_values[] = {
5331                 50, 51, 52, 53, 55, 56, 57, 58, 59, 61, 62, 63, 65, 66, 68, 69,
5332                 71, 72, 74, 75, 77, 79, 81, 82, 84, 86, 88, 90, 92, 94, 96, 98
5333         };
5334         u32 max_avg, min_cll, max, min, q, r;
5335
5336         if (!(hdr_metadata->metadata_type & BIT(HDMI_STATIC_METADATA_TYPE1)))
5337                 return;
5338
5339         max_avg = hdr_metadata->max_fall;
5340         min_cll = hdr_metadata->min_cll;
5341
5342         /*
5343          * From the specification (CTA-861-G), for calculating the maximum
5344          * luminance we need to use:
5345          *      Luminance = 50*2**(CV/32)
5346          * Where CV is a one-byte value.
5347          * For calculating this expression we may need float point precision;
5348          * to avoid this complexity level, we take advantage that CV is divided
5349          * by a constant. From the Euclids division algorithm, we know that CV
5350          * can be written as: CV = 32*q + r. Next, we replace CV in the
5351          * Luminance expression and get 50*(2**q)*(2**(r/32)), hence we just
5352          * need to pre-compute the value of r/32. For pre-computing the values
5353          * We just used the following Ruby line:
5354          *      (0...32).each {|cv| puts (50*2**(cv/32.0)).round}
5355          * The results of the above expressions can be verified at
5356          * pre_computed_values.
5357          */
5358         q = max_avg >> 5;
5359         r = max_avg % 32;
5360         max = (1 << q) * pre_computed_values[r];
5361
5362         /* min luminance: maxLum * (CV/255)^2 / 100 */
5363         q = DIV_ROUND_CLOSEST(min_cll, 255);
5364         min = max * DIV_ROUND_CLOSEST((q * q), 100);
5365
5366         luminance_range->min_luminance = min;
5367         luminance_range->max_luminance = max;
5368 }
5369
5370 static uint8_t eotf_supported(const u8 *edid_ext)
5371 {
5372         return edid_ext[2] &
5373                 (BIT(HDMI_EOTF_TRADITIONAL_GAMMA_SDR) |
5374                  BIT(HDMI_EOTF_TRADITIONAL_GAMMA_HDR) |
5375                  BIT(HDMI_EOTF_SMPTE_ST2084) |
5376                  BIT(HDMI_EOTF_BT_2100_HLG));
5377 }
5378
5379 static uint8_t hdr_metadata_type(const u8 *edid_ext)
5380 {
5381         return edid_ext[3] &
5382                 BIT(HDMI_STATIC_METADATA_TYPE1);
5383 }
5384
5385 static void
5386 drm_parse_hdr_metadata_block(struct drm_connector *connector, const u8 *db)
5387 {
5388         u16 len;
5389
5390         len = cea_db_payload_len(db);
5391
5392         connector->hdr_sink_metadata.hdmi_type1.eotf =
5393                                                 eotf_supported(db);
5394         connector->hdr_sink_metadata.hdmi_type1.metadata_type =
5395                                                 hdr_metadata_type(db);
5396
5397         if (len >= 4)
5398                 connector->hdr_sink_metadata.hdmi_type1.max_cll = db[4];
5399         if (len >= 5)
5400                 connector->hdr_sink_metadata.hdmi_type1.max_fall = db[5];
5401         if (len >= 6) {
5402                 connector->hdr_sink_metadata.hdmi_type1.min_cll = db[6];
5403
5404                 /* Calculate only when all values are available */
5405                 drm_calculate_luminance_range(connector);
5406         }
5407 }
5408
5409 /* HDMI Vendor-Specific Data Block (HDMI VSDB, H14b-VSDB) */
5410 static void
5411 drm_parse_hdmi_vsdb_audio(struct drm_connector *connector, const u8 *db)
5412 {
5413         u8 len = cea_db_payload_len(db);
5414
5415         if (len >= 6 && (db[6] & (1 << 7)))
5416                 connector->eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_SUPPORTS_AI;
5417
5418         if (len >= 10 && hdmi_vsdb_latency_present(db)) {
5419                 connector->latency_present[0] = true;
5420                 connector->video_latency[0] = db[9];
5421                 connector->audio_latency[0] = db[10];
5422         }
5423
5424         if (len >= 12 && hdmi_vsdb_i_latency_present(db)) {
5425                 connector->latency_present[1] = true;
5426                 connector->video_latency[1] = db[11];
5427                 connector->audio_latency[1] = db[12];
5428         }
5429
5430         drm_dbg_kms(connector->dev,
5431                     "[CONNECTOR:%d:%s] HDMI: latency present %d %d, video latency %d %d, audio latency %d %d\n",
5432                     connector->base.id, connector->name,
5433                     connector->latency_present[0], connector->latency_present[1],
5434                     connector->video_latency[0], connector->video_latency[1],
5435                     connector->audio_latency[0], connector->audio_latency[1]);
5436 }
5437
5438 static void
5439 monitor_name(const struct detailed_timing *timing, void *data)
5440 {
5441         const char **res = data;
5442
5443         if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_NAME))
5444                 return;
5445
5446         *res = timing->data.other_data.data.str.str;
5447 }
5448
5449 static int get_monitor_name(const struct drm_edid *drm_edid, char name[13])
5450 {
5451         const char *edid_name = NULL;
5452         int mnl;
5453
5454         if (!drm_edid || !name)
5455                 return 0;
5456
5457         drm_for_each_detailed_block(drm_edid, monitor_name, &edid_name);
5458         for (mnl = 0; edid_name && mnl < 13; mnl++) {
5459                 if (edid_name[mnl] == 0x0a)
5460                         break;
5461
5462                 name[mnl] = edid_name[mnl];
5463         }
5464
5465         return mnl;
5466 }
5467
5468 /**
5469  * drm_edid_get_monitor_name - fetch the monitor name from the edid
5470  * @edid: monitor EDID information
5471  * @name: pointer to a character array to hold the name of the monitor
5472  * @bufsize: The size of the name buffer (should be at least 14 chars.)
5473  *
5474  */
5475 void drm_edid_get_monitor_name(const struct edid *edid, char *name, int bufsize)
5476 {
5477         int name_length = 0;
5478
5479         if (bufsize <= 0)
5480                 return;
5481
5482         if (edid) {
5483                 char buf[13];
5484                 struct drm_edid drm_edid = {
5485                         .edid = edid,
5486                         .size = edid_size(edid),
5487                 };
5488
5489                 name_length = min(get_monitor_name(&drm_edid, buf), bufsize - 1);
5490                 memcpy(name, buf, name_length);
5491         }
5492
5493         name[name_length] = '\0';
5494 }
5495 EXPORT_SYMBOL(drm_edid_get_monitor_name);
5496
5497 static void clear_eld(struct drm_connector *connector)
5498 {
5499         memset(connector->eld, 0, sizeof(connector->eld));
5500
5501         connector->latency_present[0] = false;
5502         connector->latency_present[1] = false;
5503         connector->video_latency[0] = 0;
5504         connector->audio_latency[0] = 0;
5505         connector->video_latency[1] = 0;
5506         connector->audio_latency[1] = 0;
5507 }
5508
5509 /*
5510  * drm_edid_to_eld - build ELD from EDID
5511  * @connector: connector corresponding to the HDMI/DP sink
5512  * @drm_edid: EDID to parse
5513  *
5514  * Fill the ELD (EDID-Like Data) buffer for passing to the audio driver. The
5515  * HDCP and Port_ID ELD fields are left for the graphics driver to fill in.
5516  */
5517 static void drm_edid_to_eld(struct drm_connector *connector,
5518                             const struct drm_edid *drm_edid)
5519 {
5520         const struct drm_display_info *info = &connector->display_info;
5521         const struct cea_db *db;
5522         struct cea_db_iter iter;
5523         uint8_t *eld = connector->eld;
5524         int total_sad_count = 0;
5525         int mnl;
5526
5527         if (!drm_edid)
5528                 return;
5529
5530         mnl = get_monitor_name(drm_edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
5531         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] ELD monitor %s\n",
5532                     connector->base.id, connector->name,
5533                     &eld[DRM_ELD_MONITOR_NAME_STRING]);
5534
5535         eld[DRM_ELD_CEA_EDID_VER_MNL] = info->cea_rev << DRM_ELD_CEA_EDID_VER_SHIFT;
5536         eld[DRM_ELD_CEA_EDID_VER_MNL] |= mnl;
5537
5538         eld[DRM_ELD_VER] = DRM_ELD_VER_CEA861D;
5539
5540         eld[DRM_ELD_MANUFACTURER_NAME0] = drm_edid->edid->mfg_id[0];
5541         eld[DRM_ELD_MANUFACTURER_NAME1] = drm_edid->edid->mfg_id[1];
5542         eld[DRM_ELD_PRODUCT_CODE0] = drm_edid->edid->prod_code[0];
5543         eld[DRM_ELD_PRODUCT_CODE1] = drm_edid->edid->prod_code[1];
5544
5545         cea_db_iter_edid_begin(drm_edid, &iter);
5546         cea_db_iter_for_each(db, &iter) {
5547                 const u8 *data = cea_db_data(db);
5548                 int len = cea_db_payload_len(db);
5549                 int sad_count;
5550
5551                 switch (cea_db_tag(db)) {
5552                 case CTA_DB_AUDIO:
5553                         /* Audio Data Block, contains SADs */
5554                         sad_count = min(len / 3, 15 - total_sad_count);
5555                         if (sad_count >= 1)
5556                                 memcpy(&eld[DRM_ELD_CEA_SAD(mnl, total_sad_count)],
5557                                        data, sad_count * 3);
5558                         total_sad_count += sad_count;
5559                         break;
5560                 case CTA_DB_SPEAKER:
5561                         /* Speaker Allocation Data Block */
5562                         if (len >= 1)
5563                                 eld[DRM_ELD_SPEAKER] = data[0];
5564                         break;
5565                 case CTA_DB_VENDOR:
5566                         /* HDMI Vendor-Specific Data Block */
5567                         if (cea_db_is_hdmi_vsdb(db))
5568                                 drm_parse_hdmi_vsdb_audio(connector, (const u8 *)db);
5569                         break;
5570                 default:
5571                         break;
5572                 }
5573         }
5574         cea_db_iter_end(&iter);
5575
5576         eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= total_sad_count << DRM_ELD_SAD_COUNT_SHIFT;
5577
5578         if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
5579             connector->connector_type == DRM_MODE_CONNECTOR_eDP)
5580                 eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_CONN_TYPE_DP;
5581         else
5582                 eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_CONN_TYPE_HDMI;
5583
5584         eld[DRM_ELD_BASELINE_ELD_LEN] =
5585                 DIV_ROUND_UP(drm_eld_calc_baseline_block_size(eld), 4);
5586
5587         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] ELD size %d, SAD count %d\n",
5588                     connector->base.id, connector->name,
5589                     drm_eld_size(eld), total_sad_count);
5590 }
5591
5592 static int _drm_edid_to_sad(const struct drm_edid *drm_edid,
5593                             struct cea_sad **sads)
5594 {
5595         const struct cea_db *db;
5596         struct cea_db_iter iter;
5597         int count = 0;
5598
5599         cea_db_iter_edid_begin(drm_edid, &iter);
5600         cea_db_iter_for_each(db, &iter) {
5601                 if (cea_db_tag(db) == CTA_DB_AUDIO) {
5602                         int j;
5603
5604                         count = cea_db_payload_len(db) / 3; /* SAD is 3B */
5605                         *sads = kcalloc(count, sizeof(**sads), GFP_KERNEL);
5606                         if (!*sads)
5607                                 return -ENOMEM;
5608                         for (j = 0; j < count; j++) {
5609                                 const u8 *sad = &db->data[j * 3];
5610
5611                                 (*sads)[j].format = (sad[0] & 0x78) >> 3;
5612                                 (*sads)[j].channels = sad[0] & 0x7;
5613                                 (*sads)[j].freq = sad[1] & 0x7F;
5614                                 (*sads)[j].byte2 = sad[2];
5615                         }
5616                         break;
5617                 }
5618         }
5619         cea_db_iter_end(&iter);
5620
5621         DRM_DEBUG_KMS("Found %d Short Audio Descriptors\n", count);
5622
5623         return count;
5624 }
5625
5626 /**
5627  * drm_edid_to_sad - extracts SADs from EDID
5628  * @edid: EDID to parse
5629  * @sads: pointer that will be set to the extracted SADs
5630  *
5631  * Looks for CEA EDID block and extracts SADs (Short Audio Descriptors) from it.
5632  *
5633  * Note: The returned pointer needs to be freed using kfree().
5634  *
5635  * Return: The number of found SADs or negative number on error.
5636  */
5637 int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads)
5638 {
5639         struct drm_edid drm_edid;
5640
5641         return _drm_edid_to_sad(drm_edid_legacy_init(&drm_edid, edid), sads);
5642 }
5643 EXPORT_SYMBOL(drm_edid_to_sad);
5644
5645 static int _drm_edid_to_speaker_allocation(const struct drm_edid *drm_edid,
5646                                            u8 **sadb)
5647 {
5648         const struct cea_db *db;
5649         struct cea_db_iter iter;
5650         int count = 0;
5651
5652         cea_db_iter_edid_begin(drm_edid, &iter);
5653         cea_db_iter_for_each(db, &iter) {
5654                 if (cea_db_tag(db) == CTA_DB_SPEAKER &&
5655                     cea_db_payload_len(db) == 3) {
5656                         *sadb = kmemdup(db->data, cea_db_payload_len(db),
5657                                         GFP_KERNEL);
5658                         if (!*sadb)
5659                                 return -ENOMEM;
5660                         count = cea_db_payload_len(db);
5661                         break;
5662                 }
5663         }
5664         cea_db_iter_end(&iter);
5665
5666         DRM_DEBUG_KMS("Found %d Speaker Allocation Data Blocks\n", count);
5667
5668         return count;
5669 }
5670
5671 /**
5672  * drm_edid_to_speaker_allocation - extracts Speaker Allocation Data Blocks from EDID
5673  * @edid: EDID to parse
5674  * @sadb: pointer to the speaker block
5675  *
5676  * Looks for CEA EDID block and extracts the Speaker Allocation Data Block from it.
5677  *
5678  * Note: The returned pointer needs to be freed using kfree().
5679  *
5680  * Return: The number of found Speaker Allocation Blocks or negative number on
5681  * error.
5682  */
5683 int drm_edid_to_speaker_allocation(const struct edid *edid, u8 **sadb)
5684 {
5685         struct drm_edid drm_edid;
5686
5687         return _drm_edid_to_speaker_allocation(drm_edid_legacy_init(&drm_edid, edid),
5688                                                sadb);
5689 }
5690 EXPORT_SYMBOL(drm_edid_to_speaker_allocation);
5691
5692 /**
5693  * drm_av_sync_delay - compute the HDMI/DP sink audio-video sync delay
5694  * @connector: connector associated with the HDMI/DP sink
5695  * @mode: the display mode
5696  *
5697  * Return: The HDMI/DP sink's audio-video sync delay in milliseconds or 0 if
5698  * the sink doesn't support audio or video.
5699  */
5700 int drm_av_sync_delay(struct drm_connector *connector,
5701                       const struct drm_display_mode *mode)
5702 {
5703         int i = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
5704         int a, v;
5705
5706         if (!connector->latency_present[0])
5707                 return 0;
5708         if (!connector->latency_present[1])
5709                 i = 0;
5710
5711         a = connector->audio_latency[i];
5712         v = connector->video_latency[i];
5713
5714         /*
5715          * HDMI/DP sink doesn't support audio or video?
5716          */
5717         if (a == 255 || v == 255)
5718                 return 0;
5719
5720         /*
5721          * Convert raw EDID values to millisecond.
5722          * Treat unknown latency as 0ms.
5723          */
5724         if (a)
5725                 a = min(2 * (a - 1), 500);
5726         if (v)
5727                 v = min(2 * (v - 1), 500);
5728
5729         return max(v - a, 0);
5730 }
5731 EXPORT_SYMBOL(drm_av_sync_delay);
5732
5733 static bool _drm_detect_hdmi_monitor(const struct drm_edid *drm_edid)
5734 {
5735         const struct cea_db *db;
5736         struct cea_db_iter iter;
5737         bool hdmi = false;
5738
5739         /*
5740          * Because HDMI identifier is in Vendor Specific Block,
5741          * search it from all data blocks of CEA extension.
5742          */
5743         cea_db_iter_edid_begin(drm_edid, &iter);
5744         cea_db_iter_for_each(db, &iter) {
5745                 if (cea_db_is_hdmi_vsdb(db)) {
5746                         hdmi = true;
5747                         break;
5748                 }
5749         }
5750         cea_db_iter_end(&iter);
5751
5752         return hdmi;
5753 }
5754
5755 /**
5756  * drm_detect_hdmi_monitor - detect whether monitor is HDMI
5757  * @edid: monitor EDID information
5758  *
5759  * Parse the CEA extension according to CEA-861-B.
5760  *
5761  * Drivers that have added the modes parsed from EDID to drm_display_info
5762  * should use &drm_display_info.is_hdmi instead of calling this function.
5763  *
5764  * Return: True if the monitor is HDMI, false if not or unknown.
5765  */
5766 bool drm_detect_hdmi_monitor(const struct edid *edid)
5767 {
5768         struct drm_edid drm_edid;
5769
5770         return _drm_detect_hdmi_monitor(drm_edid_legacy_init(&drm_edid, edid));
5771 }
5772 EXPORT_SYMBOL(drm_detect_hdmi_monitor);
5773
5774 static bool _drm_detect_monitor_audio(const struct drm_edid *drm_edid)
5775 {
5776         struct drm_edid_iter edid_iter;
5777         const struct cea_db *db;
5778         struct cea_db_iter iter;
5779         const u8 *edid_ext;
5780         bool has_audio = false;
5781
5782         drm_edid_iter_begin(drm_edid, &edid_iter);
5783         drm_edid_iter_for_each(edid_ext, &edid_iter) {
5784                 if (edid_ext[0] == CEA_EXT) {
5785                         has_audio = edid_ext[3] & EDID_BASIC_AUDIO;
5786                         if (has_audio)
5787                                 break;
5788                 }
5789         }
5790         drm_edid_iter_end(&edid_iter);
5791
5792         if (has_audio) {
5793                 DRM_DEBUG_KMS("Monitor has basic audio support\n");
5794                 goto end;
5795         }
5796
5797         cea_db_iter_edid_begin(drm_edid, &iter);
5798         cea_db_iter_for_each(db, &iter) {
5799                 if (cea_db_tag(db) == CTA_DB_AUDIO) {
5800                         const u8 *data = cea_db_data(db);
5801                         int i;
5802
5803                         for (i = 0; i < cea_db_payload_len(db); i += 3)
5804                                 DRM_DEBUG_KMS("CEA audio format %d\n",
5805                                               (data[i] >> 3) & 0xf);
5806                         has_audio = true;
5807                         break;
5808                 }
5809         }
5810         cea_db_iter_end(&iter);
5811
5812 end:
5813         return has_audio;
5814 }
5815
5816 /**
5817  * drm_detect_monitor_audio - check monitor audio capability
5818  * @edid: EDID block to scan
5819  *
5820  * Monitor should have CEA extension block.
5821  * If monitor has 'basic audio', but no CEA audio blocks, it's 'basic
5822  * audio' only. If there is any audio extension block and supported
5823  * audio format, assume at least 'basic audio' support, even if 'basic
5824  * audio' is not defined in EDID.
5825  *
5826  * Return: True if the monitor supports audio, false otherwise.
5827  */
5828 bool drm_detect_monitor_audio(const struct edid *edid)
5829 {
5830         struct drm_edid drm_edid;
5831
5832         return _drm_detect_monitor_audio(drm_edid_legacy_init(&drm_edid, edid));
5833 }
5834 EXPORT_SYMBOL(drm_detect_monitor_audio);
5835
5836
5837 /**
5838  * drm_default_rgb_quant_range - default RGB quantization range
5839  * @mode: display mode
5840  *
5841  * Determine the default RGB quantization range for the mode,
5842  * as specified in CEA-861.
5843  *
5844  * Return: The default RGB quantization range for the mode
5845  */
5846 enum hdmi_quantization_range
5847 drm_default_rgb_quant_range(const struct drm_display_mode *mode)
5848 {
5849         /* All CEA modes other than VIC 1 use limited quantization range. */
5850         return drm_match_cea_mode(mode) > 1 ?
5851                 HDMI_QUANTIZATION_RANGE_LIMITED :
5852                 HDMI_QUANTIZATION_RANGE_FULL;
5853 }
5854 EXPORT_SYMBOL(drm_default_rgb_quant_range);
5855
5856 /* CTA-861 Video Data Block (CTA VDB) */
5857 static void parse_cta_vdb(struct drm_connector *connector, const struct cea_db *db)
5858 {
5859         struct drm_display_info *info = &connector->display_info;
5860         int i, vic_index, len = cea_db_payload_len(db);
5861         const u8 *svds = cea_db_data(db);
5862         u8 *vics;
5863
5864         if (!len)
5865                 return;
5866
5867         /* Gracefully handle multiple VDBs, however unlikely that is */
5868         vics = krealloc(info->vics, info->vics_len + len, GFP_KERNEL);
5869         if (!vics)
5870                 return;
5871
5872         vic_index = info->vics_len;
5873         info->vics_len += len;
5874         info->vics = vics;
5875
5876         for (i = 0; i < len; i++) {
5877                 u8 vic = svd_to_vic(svds[i]);
5878
5879                 if (!drm_valid_cea_vic(vic))
5880                         vic = 0;
5881
5882                 info->vics[vic_index++] = vic;
5883         }
5884 }
5885
5886 /*
5887  * Update y420_cmdb_modes based on previously parsed CTA VDB and Y420CMDB.
5888  *
5889  * Translate the y420cmdb_map based on VIC indexes to y420_cmdb_modes indexed
5890  * using the VICs themselves.
5891  */
5892 static void update_cta_y420cmdb(struct drm_connector *connector, u64 y420cmdb_map)
5893 {
5894         struct drm_display_info *info = &connector->display_info;
5895         struct drm_hdmi_info *hdmi = &info->hdmi;
5896         int i, len = min_t(int, info->vics_len, BITS_PER_TYPE(y420cmdb_map));
5897
5898         for (i = 0; i < len; i++) {
5899                 u8 vic = info->vics[i];
5900
5901                 if (vic && y420cmdb_map & BIT_ULL(i))
5902                         bitmap_set(hdmi->y420_cmdb_modes, vic, 1);
5903         }
5904 }
5905
5906 static bool cta_vdb_has_vic(const struct drm_connector *connector, u8 vic)
5907 {
5908         const struct drm_display_info *info = &connector->display_info;
5909         int i;
5910
5911         if (!vic || !info->vics)
5912                 return false;
5913
5914         for (i = 0; i < info->vics_len; i++) {
5915                 if (info->vics[i] == vic)
5916                         return true;
5917         }
5918
5919         return false;
5920 }
5921
5922 /* CTA-861-H YCbCr 4:2:0 Video Data Block (CTA Y420VDB) */
5923 static void parse_cta_y420vdb(struct drm_connector *connector,
5924                               const struct cea_db *db)
5925 {
5926         struct drm_display_info *info = &connector->display_info;
5927         struct drm_hdmi_info *hdmi = &info->hdmi;
5928         const u8 *svds = cea_db_data(db) + 1;
5929         int i;
5930
5931         for (i = 0; i < cea_db_payload_len(db) - 1; i++) {
5932                 u8 vic = svd_to_vic(svds[i]);
5933
5934                 if (!drm_valid_cea_vic(vic))
5935                         continue;
5936
5937                 bitmap_set(hdmi->y420_vdb_modes, vic, 1);
5938                 info->color_formats |= DRM_COLOR_FORMAT_YCBCR420;
5939         }
5940 }
5941
5942 static void drm_parse_vcdb(struct drm_connector *connector, const u8 *db)
5943 {
5944         struct drm_display_info *info = &connector->display_info;
5945
5946         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] CEA VCDB 0x%02x\n",
5947                     connector->base.id, connector->name, db[2]);
5948
5949         if (db[2] & EDID_CEA_VCDB_QS)
5950                 info->rgb_quant_range_selectable = true;
5951 }
5952
5953 static
5954 void drm_get_max_frl_rate(int max_frl_rate, u8 *max_lanes, u8 *max_rate_per_lane)
5955 {
5956         switch (max_frl_rate) {
5957         case 1:
5958                 *max_lanes = 3;
5959                 *max_rate_per_lane = 3;
5960                 break;
5961         case 2:
5962                 *max_lanes = 3;
5963                 *max_rate_per_lane = 6;
5964                 break;
5965         case 3:
5966                 *max_lanes = 4;
5967                 *max_rate_per_lane = 6;
5968                 break;
5969         case 4:
5970                 *max_lanes = 4;
5971                 *max_rate_per_lane = 8;
5972                 break;
5973         case 5:
5974                 *max_lanes = 4;
5975                 *max_rate_per_lane = 10;
5976                 break;
5977         case 6:
5978                 *max_lanes = 4;
5979                 *max_rate_per_lane = 12;
5980                 break;
5981         case 0:
5982         default:
5983                 *max_lanes = 0;
5984                 *max_rate_per_lane = 0;
5985         }
5986 }
5987
5988 static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector,
5989                                                const u8 *db)
5990 {
5991         u8 dc_mask;
5992         struct drm_hdmi_info *hdmi = &connector->display_info.hdmi;
5993
5994         dc_mask = db[7] & DRM_EDID_YCBCR420_DC_MASK;
5995         hdmi->y420_dc_modes = dc_mask;
5996 }
5997
5998 static void drm_parse_dsc_info(struct drm_hdmi_dsc_cap *hdmi_dsc,
5999                                const u8 *hf_scds)
6000 {
6001         hdmi_dsc->v_1p2 = hf_scds[11] & DRM_EDID_DSC_1P2;
6002
6003         if (!hdmi_dsc->v_1p2)
6004                 return;
6005
6006         hdmi_dsc->native_420 = hf_scds[11] & DRM_EDID_DSC_NATIVE_420;
6007         hdmi_dsc->all_bpp = hf_scds[11] & DRM_EDID_DSC_ALL_BPP;
6008
6009         if (hf_scds[11] & DRM_EDID_DSC_16BPC)
6010                 hdmi_dsc->bpc_supported = 16;
6011         else if (hf_scds[11] & DRM_EDID_DSC_12BPC)
6012                 hdmi_dsc->bpc_supported = 12;
6013         else if (hf_scds[11] & DRM_EDID_DSC_10BPC)
6014                 hdmi_dsc->bpc_supported = 10;
6015         else
6016                 /* Supports min 8 BPC if DSC 1.2 is supported*/
6017                 hdmi_dsc->bpc_supported = 8;
6018
6019         if (cea_db_payload_len(hf_scds) >= 12 && hf_scds[12]) {
6020                 u8 dsc_max_slices;
6021                 u8 dsc_max_frl_rate;
6022
6023                 dsc_max_frl_rate = (hf_scds[12] & DRM_EDID_DSC_MAX_FRL_RATE_MASK) >> 4;
6024                 drm_get_max_frl_rate(dsc_max_frl_rate, &hdmi_dsc->max_lanes,
6025                                      &hdmi_dsc->max_frl_rate_per_lane);
6026
6027                 dsc_max_slices = hf_scds[12] & DRM_EDID_DSC_MAX_SLICES;
6028
6029                 switch (dsc_max_slices) {
6030                 case 1:
6031                         hdmi_dsc->max_slices = 1;
6032                         hdmi_dsc->clk_per_slice = 340;
6033                         break;
6034                 case 2:
6035                         hdmi_dsc->max_slices = 2;
6036                         hdmi_dsc->clk_per_slice = 340;
6037                         break;
6038                 case 3:
6039                         hdmi_dsc->max_slices = 4;
6040                         hdmi_dsc->clk_per_slice = 340;
6041                         break;
6042                 case 4:
6043                         hdmi_dsc->max_slices = 8;
6044                         hdmi_dsc->clk_per_slice = 340;
6045                         break;
6046                 case 5:
6047                         hdmi_dsc->max_slices = 8;
6048                         hdmi_dsc->clk_per_slice = 400;
6049                         break;
6050                 case 6:
6051                         hdmi_dsc->max_slices = 12;
6052                         hdmi_dsc->clk_per_slice = 400;
6053                         break;
6054                 case 7:
6055                         hdmi_dsc->max_slices = 16;
6056                         hdmi_dsc->clk_per_slice = 400;
6057                         break;
6058                 case 0:
6059                 default:
6060                         hdmi_dsc->max_slices = 0;
6061                         hdmi_dsc->clk_per_slice = 0;
6062                 }
6063         }
6064
6065         if (cea_db_payload_len(hf_scds) >= 13 && hf_scds[13])
6066                 hdmi_dsc->total_chunk_kbytes = hf_scds[13] & DRM_EDID_DSC_TOTAL_CHUNK_KBYTES;
6067 }
6068
6069 /* Sink Capability Data Structure */
6070 static void drm_parse_hdmi_forum_scds(struct drm_connector *connector,
6071                                       const u8 *hf_scds)
6072 {
6073         struct drm_display_info *info = &connector->display_info;
6074         struct drm_hdmi_info *hdmi = &info->hdmi;
6075         struct drm_hdmi_dsc_cap *hdmi_dsc = &hdmi->dsc_cap;
6076         int max_tmds_clock = 0;
6077         u8 max_frl_rate = 0;
6078         bool dsc_support = false;
6079
6080         info->has_hdmi_infoframe = true;
6081
6082         if (hf_scds[6] & 0x80) {
6083                 hdmi->scdc.supported = true;
6084                 if (hf_scds[6] & 0x40)
6085                         hdmi->scdc.read_request = true;
6086         }
6087
6088         /*
6089          * All HDMI 2.0 monitors must support scrambling at rates > 340 MHz.
6090          * And as per the spec, three factors confirm this:
6091          * * Availability of a HF-VSDB block in EDID (check)
6092          * * Non zero Max_TMDS_Char_Rate filed in HF-VSDB (let's check)
6093          * * SCDC support available (let's check)
6094          * Lets check it out.
6095          */
6096
6097         if (hf_scds[5]) {
6098                 struct drm_scdc *scdc = &hdmi->scdc;
6099
6100                 /* max clock is 5000 KHz times block value */
6101                 max_tmds_clock = hf_scds[5] * 5000;
6102
6103                 if (max_tmds_clock > 340000) {
6104                         info->max_tmds_clock = max_tmds_clock;
6105                 }
6106
6107                 if (scdc->supported) {
6108                         scdc->scrambling.supported = true;
6109
6110                         /* Few sinks support scrambling for clocks < 340M */
6111                         if ((hf_scds[6] & 0x8))
6112                                 scdc->scrambling.low_rates = true;
6113                 }
6114         }
6115
6116         if (hf_scds[7]) {
6117                 max_frl_rate = (hf_scds[7] & DRM_EDID_MAX_FRL_RATE_MASK) >> 4;
6118                 drm_get_max_frl_rate(max_frl_rate, &hdmi->max_lanes,
6119                                      &hdmi->max_frl_rate_per_lane);
6120         }
6121
6122         drm_parse_ycbcr420_deep_color_info(connector, hf_scds);
6123
6124         if (cea_db_payload_len(hf_scds) >= 11 && hf_scds[11]) {
6125                 drm_parse_dsc_info(hdmi_dsc, hf_scds);
6126                 dsc_support = true;
6127         }
6128
6129         drm_dbg_kms(connector->dev,
6130                     "[CONNECTOR:%d:%s] HF-VSDB: max TMDS clock: %d KHz, HDMI 2.1 support: %s, DSC 1.2 support: %s\n",
6131                     connector->base.id, connector->name,
6132                     max_tmds_clock, str_yes_no(max_frl_rate), str_yes_no(dsc_support));
6133 }
6134
6135 static void drm_parse_hdmi_deep_color_info(struct drm_connector *connector,
6136                                            const u8 *hdmi)
6137 {
6138         struct drm_display_info *info = &connector->display_info;
6139         unsigned int dc_bpc = 0;
6140
6141         /* HDMI supports at least 8 bpc */
6142         info->bpc = 8;
6143
6144         if (cea_db_payload_len(hdmi) < 6)
6145                 return;
6146
6147         if (hdmi[6] & DRM_EDID_HDMI_DC_30) {
6148                 dc_bpc = 10;
6149                 info->edid_hdmi_rgb444_dc_modes |= DRM_EDID_HDMI_DC_30;
6150                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does deep color 30.\n",
6151                             connector->base.id, connector->name);
6152         }
6153
6154         if (hdmi[6] & DRM_EDID_HDMI_DC_36) {
6155                 dc_bpc = 12;
6156                 info->edid_hdmi_rgb444_dc_modes |= DRM_EDID_HDMI_DC_36;
6157                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does deep color 36.\n",
6158                             connector->base.id, connector->name);
6159         }
6160
6161         if (hdmi[6] & DRM_EDID_HDMI_DC_48) {
6162                 dc_bpc = 16;
6163                 info->edid_hdmi_rgb444_dc_modes |= DRM_EDID_HDMI_DC_48;
6164                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does deep color 48.\n",
6165                             connector->base.id, connector->name);
6166         }
6167
6168         if (dc_bpc == 0) {
6169                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] No deep color support on this HDMI sink.\n",
6170                             connector->base.id, connector->name);
6171                 return;
6172         }
6173
6174         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Assigning HDMI sink color depth as %d bpc.\n",
6175                     connector->base.id, connector->name, dc_bpc);
6176         info->bpc = dc_bpc;
6177
6178         /* YCRCB444 is optional according to spec. */
6179         if (hdmi[6] & DRM_EDID_HDMI_DC_Y444) {
6180                 info->edid_hdmi_ycbcr444_dc_modes = info->edid_hdmi_rgb444_dc_modes;
6181                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does YCRCB444 in deep color.\n",
6182                             connector->base.id, connector->name);
6183         }
6184
6185         /*
6186          * Spec says that if any deep color mode is supported at all,
6187          * then deep color 36 bit must be supported.
6188          */
6189         if (!(hdmi[6] & DRM_EDID_HDMI_DC_36)) {
6190                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink should do DC_36, but does not!\n",
6191                             connector->base.id, connector->name);
6192         }
6193 }
6194
6195 /* HDMI Vendor-Specific Data Block (HDMI VSDB, H14b-VSDB) */
6196 static void
6197 drm_parse_hdmi_vsdb_video(struct drm_connector *connector, const u8 *db)
6198 {
6199         struct drm_display_info *info = &connector->display_info;
6200         u8 len = cea_db_payload_len(db);
6201
6202         info->is_hdmi = true;
6203
6204         info->source_physical_address = (db[4] << 8) | db[5];
6205
6206         if (len >= 6)
6207                 info->dvi_dual = db[6] & 1;
6208         if (len >= 7)
6209                 info->max_tmds_clock = db[7] * 5000;
6210
6211         /*
6212          * Try to infer whether the sink supports HDMI infoframes.
6213          *
6214          * HDMI infoframe support was first added in HDMI 1.4. Assume the sink
6215          * supports infoframes if HDMI_Video_present is set.
6216          */
6217         if (len >= 8 && db[8] & BIT(5))
6218                 info->has_hdmi_infoframe = true;
6219
6220         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI: DVI dual %d, max TMDS clock %d kHz\n",
6221                     connector->base.id, connector->name,
6222                     info->dvi_dual, info->max_tmds_clock);
6223
6224         drm_parse_hdmi_deep_color_info(connector, db);
6225 }
6226
6227 /*
6228  * See EDID extension for head-mounted and specialized monitors, specified at:
6229  * https://docs.microsoft.com/en-us/windows-hardware/drivers/display/specialized-monitors-edid-extension
6230  */
6231 static void drm_parse_microsoft_vsdb(struct drm_connector *connector,
6232                                      const u8 *db)
6233 {
6234         struct drm_display_info *info = &connector->display_info;
6235         u8 version = db[4];
6236         bool desktop_usage = db[5] & BIT(6);
6237
6238         /* Version 1 and 2 for HMDs, version 3 flags desktop usage explicitly */
6239         if (version == 1 || version == 2 || (version == 3 && !desktop_usage))
6240                 info->non_desktop = true;
6241
6242         drm_dbg_kms(connector->dev,
6243                     "[CONNECTOR:%d:%s] HMD or specialized display VSDB version %u: 0x%02x\n",
6244                     connector->base.id, connector->name, version, db[5]);
6245 }
6246
6247 static void drm_parse_cea_ext(struct drm_connector *connector,
6248                               const struct drm_edid *drm_edid)
6249 {
6250         struct drm_display_info *info = &connector->display_info;
6251         struct drm_edid_iter edid_iter;
6252         const struct cea_db *db;
6253         struct cea_db_iter iter;
6254         const u8 *edid_ext;
6255         u64 y420cmdb_map = 0;
6256
6257         drm_edid_iter_begin(drm_edid, &edid_iter);
6258         drm_edid_iter_for_each(edid_ext, &edid_iter) {
6259                 if (edid_ext[0] != CEA_EXT)
6260                         continue;
6261
6262                 if (!info->cea_rev)
6263                         info->cea_rev = edid_ext[1];
6264
6265                 if (info->cea_rev != edid_ext[1])
6266                         drm_dbg_kms(connector->dev,
6267                                     "[CONNECTOR:%d:%s] CEA extension version mismatch %u != %u\n",
6268                                     connector->base.id, connector->name,
6269                                     info->cea_rev, edid_ext[1]);
6270
6271                 /* The existence of a CTA extension should imply RGB support */
6272                 info->color_formats = DRM_COLOR_FORMAT_RGB444;
6273                 if (edid_ext[3] & EDID_CEA_YCRCB444)
6274                         info->color_formats |= DRM_COLOR_FORMAT_YCBCR444;
6275                 if (edid_ext[3] & EDID_CEA_YCRCB422)
6276                         info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
6277                 if (edid_ext[3] & EDID_BASIC_AUDIO)
6278                         info->has_audio = true;
6279
6280         }
6281         drm_edid_iter_end(&edid_iter);
6282
6283         cea_db_iter_edid_begin(drm_edid, &iter);
6284         cea_db_iter_for_each(db, &iter) {
6285                 /* FIXME: convert parsers to use struct cea_db */
6286                 const u8 *data = (const u8 *)db;
6287
6288                 if (cea_db_is_hdmi_vsdb(db))
6289                         drm_parse_hdmi_vsdb_video(connector, data);
6290                 else if (cea_db_is_hdmi_forum_vsdb(db) ||
6291                          cea_db_is_hdmi_forum_scdb(db))
6292                         drm_parse_hdmi_forum_scds(connector, data);
6293                 else if (cea_db_is_microsoft_vsdb(db))
6294                         drm_parse_microsoft_vsdb(connector, data);
6295                 else if (cea_db_is_y420cmdb(db))
6296                         parse_cta_y420cmdb(connector, db, &y420cmdb_map);
6297                 else if (cea_db_is_y420vdb(db))
6298                         parse_cta_y420vdb(connector, db);
6299                 else if (cea_db_is_vcdb(db))
6300                         drm_parse_vcdb(connector, data);
6301                 else if (cea_db_is_hdmi_hdr_metadata_block(db))
6302                         drm_parse_hdr_metadata_block(connector, data);
6303                 else if (cea_db_tag(db) == CTA_DB_VIDEO)
6304                         parse_cta_vdb(connector, db);
6305                 else if (cea_db_tag(db) == CTA_DB_AUDIO)
6306                         info->has_audio = true;
6307         }
6308         cea_db_iter_end(&iter);
6309
6310         if (y420cmdb_map)
6311                 update_cta_y420cmdb(connector, y420cmdb_map);
6312 }
6313
6314 static
6315 void get_monitor_range(const struct detailed_timing *timing, void *c)
6316 {
6317         struct detailed_mode_closure *closure = c;
6318         struct drm_display_info *info = &closure->connector->display_info;
6319         struct drm_monitor_range_info *monitor_range = &info->monitor_range;
6320         const struct detailed_non_pixel *data = &timing->data.other_data;
6321         const struct detailed_data_monitor_range *range = &data->data.range;
6322         const struct edid *edid = closure->drm_edid->edid;
6323
6324         if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_RANGE))
6325                 return;
6326
6327         /*
6328          * These limits are used to determine the VRR refresh
6329          * rate range. Only the "range limits only" variant
6330          * of the range descriptor seems to guarantee that
6331          * any and all timings are accepted by the sink, as
6332          * opposed to just timings conforming to the indicated
6333          * formula (GTF/GTF2/CVT). Thus other variants of the
6334          * range descriptor are not accepted here.
6335          */
6336         if (range->flags != DRM_EDID_RANGE_LIMITS_ONLY_FLAG)
6337                 return;
6338
6339         monitor_range->min_vfreq = range->min_vfreq;
6340         monitor_range->max_vfreq = range->max_vfreq;
6341
6342         if (edid->revision >= 4) {
6343                 if (data->pad2 & DRM_EDID_RANGE_OFFSET_MIN_VFREQ)
6344                         monitor_range->min_vfreq += 255;
6345                 if (data->pad2 & DRM_EDID_RANGE_OFFSET_MAX_VFREQ)
6346                         monitor_range->max_vfreq += 255;
6347         }
6348 }
6349
6350 static void drm_get_monitor_range(struct drm_connector *connector,
6351                                   const struct drm_edid *drm_edid)
6352 {
6353         const struct drm_display_info *info = &connector->display_info;
6354         struct detailed_mode_closure closure = {
6355                 .connector = connector,
6356                 .drm_edid = drm_edid,
6357         };
6358
6359         if (drm_edid->edid->revision < 4)
6360                 return;
6361
6362         if (!(drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ))
6363                 return;
6364
6365         drm_for_each_detailed_block(drm_edid, get_monitor_range, &closure);
6366
6367         drm_dbg_kms(connector->dev,
6368                     "[CONNECTOR:%d:%s] Supported Monitor Refresh rate range is %d Hz - %d Hz\n",
6369                     connector->base.id, connector->name,
6370                     info->monitor_range.min_vfreq, info->monitor_range.max_vfreq);
6371 }
6372
6373 static void drm_parse_vesa_mso_data(struct drm_connector *connector,
6374                                     const struct displayid_block *block)
6375 {
6376         struct displayid_vesa_vendor_specific_block *vesa =
6377                 (struct displayid_vesa_vendor_specific_block *)block;
6378         struct drm_display_info *info = &connector->display_info;
6379
6380         if (block->num_bytes < 3) {
6381                 drm_dbg_kms(connector->dev,
6382                             "[CONNECTOR:%d:%s] Unexpected vendor block size %u\n",
6383                             connector->base.id, connector->name, block->num_bytes);
6384                 return;
6385         }
6386
6387         if (oui(vesa->oui[0], vesa->oui[1], vesa->oui[2]) != VESA_IEEE_OUI)
6388                 return;
6389
6390         if (sizeof(*vesa) != sizeof(*block) + block->num_bytes) {
6391                 drm_dbg_kms(connector->dev,
6392                             "[CONNECTOR:%d:%s] Unexpected VESA vendor block size\n",
6393                             connector->base.id, connector->name);
6394                 return;
6395         }
6396
6397         switch (FIELD_GET(DISPLAYID_VESA_MSO_MODE, vesa->mso)) {
6398         default:
6399                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Reserved MSO mode value\n",
6400                             connector->base.id, connector->name);
6401                 fallthrough;
6402         case 0:
6403                 info->mso_stream_count = 0;
6404                 break;
6405         case 1:
6406                 info->mso_stream_count = 2; /* 2 or 4 links */
6407                 break;
6408         case 2:
6409                 info->mso_stream_count = 4; /* 4 links */
6410                 break;
6411         }
6412
6413         if (!info->mso_stream_count) {
6414                 info->mso_pixel_overlap = 0;
6415                 return;
6416         }
6417
6418         info->mso_pixel_overlap = FIELD_GET(DISPLAYID_VESA_MSO_OVERLAP, vesa->mso);
6419         if (info->mso_pixel_overlap > 8) {
6420                 drm_dbg_kms(connector->dev,
6421                             "[CONNECTOR:%d:%s] Reserved MSO pixel overlap value %u\n",
6422                             connector->base.id, connector->name,
6423                             info->mso_pixel_overlap);
6424                 info->mso_pixel_overlap = 8;
6425         }
6426
6427         drm_dbg_kms(connector->dev,
6428                     "[CONNECTOR:%d:%s] MSO stream count %u, pixel overlap %u\n",
6429                     connector->base.id, connector->name,
6430                     info->mso_stream_count, info->mso_pixel_overlap);
6431 }
6432
6433 static void drm_update_mso(struct drm_connector *connector,
6434                            const struct drm_edid *drm_edid)
6435 {
6436         const struct displayid_block *block;
6437         struct displayid_iter iter;
6438
6439         displayid_iter_edid_begin(drm_edid, &iter);
6440         displayid_iter_for_each(block, &iter) {
6441                 if (block->tag == DATA_BLOCK_2_VENDOR_SPECIFIC)
6442                         drm_parse_vesa_mso_data(connector, block);
6443         }
6444         displayid_iter_end(&iter);
6445 }
6446
6447 /* A connector has no EDID information, so we've got no EDID to compute quirks from. Reset
6448  * all of the values which would have been set from EDID
6449  */
6450 static void drm_reset_display_info(struct drm_connector *connector)
6451 {
6452         struct drm_display_info *info = &connector->display_info;
6453
6454         info->width_mm = 0;
6455         info->height_mm = 0;
6456
6457         info->bpc = 0;
6458         info->color_formats = 0;
6459         info->cea_rev = 0;
6460         info->max_tmds_clock = 0;
6461         info->dvi_dual = false;
6462         info->is_hdmi = false;
6463         info->has_audio = false;
6464         info->has_hdmi_infoframe = false;
6465         info->rgb_quant_range_selectable = false;
6466         memset(&info->hdmi, 0, sizeof(info->hdmi));
6467
6468         info->edid_hdmi_rgb444_dc_modes = 0;
6469         info->edid_hdmi_ycbcr444_dc_modes = 0;
6470
6471         info->non_desktop = 0;
6472         memset(&info->monitor_range, 0, sizeof(info->monitor_range));
6473         memset(&info->luminance_range, 0, sizeof(info->luminance_range));
6474
6475         info->mso_stream_count = 0;
6476         info->mso_pixel_overlap = 0;
6477         info->max_dsc_bpp = 0;
6478
6479         kfree(info->vics);
6480         info->vics = NULL;
6481         info->vics_len = 0;
6482
6483         info->quirks = 0;
6484
6485         info->source_physical_address = CEC_PHYS_ADDR_INVALID;
6486 }
6487
6488 static void update_displayid_info(struct drm_connector *connector,
6489                                   const struct drm_edid *drm_edid)
6490 {
6491         struct drm_display_info *info = &connector->display_info;
6492         const struct displayid_block *block;
6493         struct displayid_iter iter;
6494
6495         displayid_iter_edid_begin(drm_edid, &iter);
6496         displayid_iter_for_each(block, &iter) {
6497                 if (displayid_version(&iter) == DISPLAY_ID_STRUCTURE_VER_20 &&
6498                     (displayid_primary_use(&iter) == PRIMARY_USE_HEAD_MOUNTED_VR ||
6499                      displayid_primary_use(&iter) == PRIMARY_USE_HEAD_MOUNTED_AR))
6500                         info->non_desktop = true;
6501
6502                 /*
6503                  * We're only interested in the base section here, no need to
6504                  * iterate further.
6505                  */
6506                 break;
6507         }
6508         displayid_iter_end(&iter);
6509 }
6510
6511 static void update_display_info(struct drm_connector *connector,
6512                                 const struct drm_edid *drm_edid)
6513 {
6514         struct drm_display_info *info = &connector->display_info;
6515         const struct edid *edid;
6516
6517         drm_reset_display_info(connector);
6518         clear_eld(connector);
6519
6520         if (!drm_edid)
6521                 return;
6522
6523         edid = drm_edid->edid;
6524
6525         info->quirks = edid_get_quirks(drm_edid);
6526
6527         info->width_mm = edid->width_cm * 10;
6528         info->height_mm = edid->height_cm * 10;
6529
6530         drm_get_monitor_range(connector, drm_edid);
6531
6532         if (edid->revision < 3)
6533                 goto out;
6534
6535         if (!drm_edid_is_digital(drm_edid))
6536                 goto out;
6537
6538         info->color_formats |= DRM_COLOR_FORMAT_RGB444;
6539         drm_parse_cea_ext(connector, drm_edid);
6540
6541         update_displayid_info(connector, drm_edid);
6542
6543         /*
6544          * Digital sink with "DFP 1.x compliant TMDS" according to EDID 1.3?
6545          *
6546          * For such displays, the DFP spec 1.0, section 3.10 "EDID support"
6547          * tells us to assume 8 bpc color depth if the EDID doesn't have
6548          * extensions which tell otherwise.
6549          */
6550         if (info->bpc == 0 && edid->revision == 3 &&
6551             edid->input & DRM_EDID_DIGITAL_DFP_1_X) {
6552                 info->bpc = 8;
6553                 drm_dbg_kms(connector->dev,
6554                             "[CONNECTOR:%d:%s] Assigning DFP sink color depth as %d bpc.\n",
6555                             connector->base.id, connector->name, info->bpc);
6556         }
6557
6558         /* Only defined for 1.4 with digital displays */
6559         if (edid->revision < 4)
6560                 goto out;
6561
6562         switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) {
6563         case DRM_EDID_DIGITAL_DEPTH_6:
6564                 info->bpc = 6;
6565                 break;
6566         case DRM_EDID_DIGITAL_DEPTH_8:
6567                 info->bpc = 8;
6568                 break;
6569         case DRM_EDID_DIGITAL_DEPTH_10:
6570                 info->bpc = 10;
6571                 break;
6572         case DRM_EDID_DIGITAL_DEPTH_12:
6573                 info->bpc = 12;
6574                 break;
6575         case DRM_EDID_DIGITAL_DEPTH_14:
6576                 info->bpc = 14;
6577                 break;
6578         case DRM_EDID_DIGITAL_DEPTH_16:
6579                 info->bpc = 16;
6580                 break;
6581         case DRM_EDID_DIGITAL_DEPTH_UNDEF:
6582         default:
6583                 info->bpc = 0;
6584                 break;
6585         }
6586
6587         drm_dbg_kms(connector->dev,
6588                     "[CONNECTOR:%d:%s] Assigning EDID-1.4 digital sink color depth as %d bpc.\n",
6589                     connector->base.id, connector->name, info->bpc);
6590
6591         if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444)
6592                 info->color_formats |= DRM_COLOR_FORMAT_YCBCR444;
6593         if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422)
6594                 info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
6595
6596         drm_update_mso(connector, drm_edid);
6597
6598 out:
6599         if (info->quirks & EDID_QUIRK_NON_DESKTOP) {
6600                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Non-desktop display%s\n",
6601                             connector->base.id, connector->name,
6602                             info->non_desktop ? " (redundant quirk)" : "");
6603                 info->non_desktop = true;
6604         }
6605
6606         if (info->quirks & EDID_QUIRK_CAP_DSC_15BPP)
6607                 info->max_dsc_bpp = 15;
6608
6609         if (info->quirks & EDID_QUIRK_FORCE_6BPC)
6610                 info->bpc = 6;
6611
6612         if (info->quirks & EDID_QUIRK_FORCE_8BPC)
6613                 info->bpc = 8;
6614
6615         if (info->quirks & EDID_QUIRK_FORCE_10BPC)
6616                 info->bpc = 10;
6617
6618         if (info->quirks & EDID_QUIRK_FORCE_12BPC)
6619                 info->bpc = 12;
6620
6621         /* Depends on info->cea_rev set by drm_parse_cea_ext() above */
6622         drm_edid_to_eld(connector, drm_edid);
6623 }
6624
6625 static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev,
6626                                                             struct displayid_detailed_timings_1 *timings,
6627                                                             bool type_7)
6628 {
6629         struct drm_display_mode *mode;
6630         unsigned pixel_clock = (timings->pixel_clock[0] |
6631                                 (timings->pixel_clock[1] << 8) |
6632                                 (timings->pixel_clock[2] << 16)) + 1;
6633         unsigned hactive = (timings->hactive[0] | timings->hactive[1] << 8) + 1;
6634         unsigned hblank = (timings->hblank[0] | timings->hblank[1] << 8) + 1;
6635         unsigned hsync = (timings->hsync[0] | (timings->hsync[1] & 0x7f) << 8) + 1;
6636         unsigned hsync_width = (timings->hsw[0] | timings->hsw[1] << 8) + 1;
6637         unsigned vactive = (timings->vactive[0] | timings->vactive[1] << 8) + 1;
6638         unsigned vblank = (timings->vblank[0] | timings->vblank[1] << 8) + 1;
6639         unsigned vsync = (timings->vsync[0] | (timings->vsync[1] & 0x7f) << 8) + 1;
6640         unsigned vsync_width = (timings->vsw[0] | timings->vsw[1] << 8) + 1;
6641         bool hsync_positive = (timings->hsync[1] >> 7) & 0x1;
6642         bool vsync_positive = (timings->vsync[1] >> 7) & 0x1;
6643
6644         mode = drm_mode_create(dev);
6645         if (!mode)
6646                 return NULL;
6647
6648         /* resolution is kHz for type VII, and 10 kHz for type I */
6649         mode->clock = type_7 ? pixel_clock : pixel_clock * 10;
6650         mode->hdisplay = hactive;
6651         mode->hsync_start = mode->hdisplay + hsync;
6652         mode->hsync_end = mode->hsync_start + hsync_width;
6653         mode->htotal = mode->hdisplay + hblank;
6654
6655         mode->vdisplay = vactive;
6656         mode->vsync_start = mode->vdisplay + vsync;
6657         mode->vsync_end = mode->vsync_start + vsync_width;
6658         mode->vtotal = mode->vdisplay + vblank;
6659
6660         mode->flags = 0;
6661         mode->flags |= hsync_positive ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
6662         mode->flags |= vsync_positive ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
6663         mode->type = DRM_MODE_TYPE_DRIVER;
6664
6665         if (timings->flags & 0x80)
6666                 mode->type |= DRM_MODE_TYPE_PREFERRED;
6667         drm_mode_set_name(mode);
6668
6669         return mode;
6670 }
6671
6672 static int add_displayid_detailed_1_modes(struct drm_connector *connector,
6673                                           const struct displayid_block *block)
6674 {
6675         struct displayid_detailed_timing_block *det = (struct displayid_detailed_timing_block *)block;
6676         int i;
6677         int num_timings;
6678         struct drm_display_mode *newmode;
6679         int num_modes = 0;
6680         bool type_7 = block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING;
6681         /* blocks must be multiple of 20 bytes length */
6682         if (block->num_bytes % 20)
6683                 return 0;
6684
6685         num_timings = block->num_bytes / 20;
6686         for (i = 0; i < num_timings; i++) {
6687                 struct displayid_detailed_timings_1 *timings = &det->timings[i];
6688
6689                 newmode = drm_mode_displayid_detailed(connector->dev, timings, type_7);
6690                 if (!newmode)
6691                         continue;
6692
6693                 drm_mode_probed_add(connector, newmode);
6694                 num_modes++;
6695         }
6696         return num_modes;
6697 }
6698
6699 static int add_displayid_detailed_modes(struct drm_connector *connector,
6700                                         const struct drm_edid *drm_edid)
6701 {
6702         const struct displayid_block *block;
6703         struct displayid_iter iter;
6704         int num_modes = 0;
6705
6706         displayid_iter_edid_begin(drm_edid, &iter);
6707         displayid_iter_for_each(block, &iter) {
6708                 if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING ||
6709                     block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING)
6710                         num_modes += add_displayid_detailed_1_modes(connector, block);
6711         }
6712         displayid_iter_end(&iter);
6713
6714         return num_modes;
6715 }
6716
6717 static int _drm_edid_connector_add_modes(struct drm_connector *connector,
6718                                          const struct drm_edid *drm_edid)
6719 {
6720         const struct drm_display_info *info = &connector->display_info;
6721         int num_modes = 0;
6722
6723         if (!drm_edid)
6724                 return 0;
6725
6726         /*
6727          * EDID spec says modes should be preferred in this order:
6728          * - preferred detailed mode
6729          * - other detailed modes from base block
6730          * - detailed modes from extension blocks
6731          * - CVT 3-byte code modes
6732          * - standard timing codes
6733          * - established timing codes
6734          * - modes inferred from GTF or CVT range information
6735          *
6736          * We get this pretty much right.
6737          *
6738          * XXX order for additional mode types in extension blocks?
6739          */
6740         num_modes += add_detailed_modes(connector, drm_edid);
6741         num_modes += add_cvt_modes(connector, drm_edid);
6742         num_modes += add_standard_modes(connector, drm_edid);
6743         num_modes += add_established_modes(connector, drm_edid);
6744         num_modes += add_cea_modes(connector, drm_edid);
6745         num_modes += add_alternate_cea_modes(connector, drm_edid);
6746         num_modes += add_displayid_detailed_modes(connector, drm_edid);
6747         if (drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ)
6748                 num_modes += add_inferred_modes(connector, drm_edid);
6749
6750         if (info->quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
6751                 edid_fixup_preferred(connector);
6752
6753         return num_modes;
6754 }
6755
6756 static void _drm_update_tile_info(struct drm_connector *connector,
6757                                   const struct drm_edid *drm_edid);
6758
6759 static int _drm_edid_connector_property_update(struct drm_connector *connector,
6760                                                const struct drm_edid *drm_edid)
6761 {
6762         struct drm_device *dev = connector->dev;
6763         int ret;
6764
6765         if (connector->edid_blob_ptr) {
6766                 const struct edid *old_edid = connector->edid_blob_ptr->data;
6767
6768                 if (old_edid) {
6769                         if (!drm_edid_are_equal(drm_edid ? drm_edid->edid : NULL, old_edid)) {
6770                                 connector->epoch_counter++;
6771                                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] EDID changed, epoch counter %llu\n",
6772                                             connector->base.id, connector->name,
6773                                             connector->epoch_counter);
6774                         }
6775                 }
6776         }
6777
6778         ret = drm_property_replace_global_blob(dev,
6779                                                &connector->edid_blob_ptr,
6780                                                drm_edid ? drm_edid->size : 0,
6781                                                drm_edid ? drm_edid->edid : NULL,
6782                                                &connector->base,
6783                                                dev->mode_config.edid_property);
6784         if (ret) {
6785                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] EDID property update failed (%d)\n",
6786                             connector->base.id, connector->name, ret);
6787                 goto out;
6788         }
6789
6790         ret = drm_object_property_set_value(&connector->base,
6791                                             dev->mode_config.non_desktop_property,
6792                                             connector->display_info.non_desktop);
6793         if (ret) {
6794                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Non-desktop property update failed (%d)\n",
6795                             connector->base.id, connector->name, ret);
6796                 goto out;
6797         }
6798
6799         ret = drm_connector_set_tile_property(connector);
6800         if (ret) {
6801                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Tile property update failed (%d)\n",
6802                             connector->base.id, connector->name, ret);
6803                 goto out;
6804         }
6805
6806 out:
6807         return ret;
6808 }
6809
6810 /**
6811  * drm_edid_connector_update - Update connector information from EDID
6812  * @connector: Connector
6813  * @drm_edid: EDID
6814  *
6815  * Update the connector display info, ELD, HDR metadata, relevant properties,
6816  * etc. from the passed in EDID.
6817  *
6818  * If EDID is NULL, reset the information.
6819  *
6820  * Must be called before calling drm_edid_connector_add_modes().
6821  *
6822  * Return: 0 on success, negative error on errors.
6823  */
6824 int drm_edid_connector_update(struct drm_connector *connector,
6825                               const struct drm_edid *drm_edid)
6826 {
6827         update_display_info(connector, drm_edid);
6828
6829         _drm_update_tile_info(connector, drm_edid);
6830
6831         return _drm_edid_connector_property_update(connector, drm_edid);
6832 }
6833 EXPORT_SYMBOL(drm_edid_connector_update);
6834
6835 /**
6836  * drm_edid_connector_add_modes - Update probed modes from the EDID property
6837  * @connector: Connector
6838  *
6839  * Add the modes from the previously updated EDID property to the connector
6840  * probed modes list.
6841  *
6842  * drm_edid_connector_update() must have been called before this to update the
6843  * EDID property.
6844  *
6845  * Return: The number of modes added, or 0 if we couldn't find any.
6846  */
6847 int drm_edid_connector_add_modes(struct drm_connector *connector)
6848 {
6849         const struct drm_edid *drm_edid = NULL;
6850         int count;
6851
6852         if (connector->edid_blob_ptr)
6853                 drm_edid = drm_edid_alloc(connector->edid_blob_ptr->data,
6854                                           connector->edid_blob_ptr->length);
6855
6856         count = _drm_edid_connector_add_modes(connector, drm_edid);
6857
6858         drm_edid_free(drm_edid);
6859
6860         return count;
6861 }
6862 EXPORT_SYMBOL(drm_edid_connector_add_modes);
6863
6864 /**
6865  * drm_connector_update_edid_property - update the edid property of a connector
6866  * @connector: drm connector
6867  * @edid: new value of the edid property
6868  *
6869  * This function creates a new blob modeset object and assigns its id to the
6870  * connector's edid property.
6871  * Since we also parse tile information from EDID's displayID block, we also
6872  * set the connector's tile property here. See drm_connector_set_tile_property()
6873  * for more details.
6874  *
6875  * This function is deprecated. Use drm_edid_connector_update() instead.
6876  *
6877  * Returns:
6878  * Zero on success, negative errno on failure.
6879  */
6880 int drm_connector_update_edid_property(struct drm_connector *connector,
6881                                        const struct edid *edid)
6882 {
6883         struct drm_edid drm_edid;
6884
6885         return drm_edid_connector_update(connector, drm_edid_legacy_init(&drm_edid, edid));
6886 }
6887 EXPORT_SYMBOL(drm_connector_update_edid_property);
6888
6889 /**
6890  * drm_add_edid_modes - add modes from EDID data, if available
6891  * @connector: connector we're probing
6892  * @edid: EDID data
6893  *
6894  * Add the specified modes to the connector's mode list. Also fills out the
6895  * &drm_display_info structure and ELD in @connector with any information which
6896  * can be derived from the edid.
6897  *
6898  * This function is deprecated. Use drm_edid_connector_add_modes() instead.
6899  *
6900  * Return: The number of modes added or 0 if we couldn't find any.
6901  */
6902 int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
6903 {
6904         struct drm_edid _drm_edid;
6905         const struct drm_edid *drm_edid;
6906
6907         if (edid && !drm_edid_is_valid(edid)) {
6908                 drm_warn(connector->dev, "[CONNECTOR:%d:%s] EDID invalid.\n",
6909                          connector->base.id, connector->name);
6910                 edid = NULL;
6911         }
6912
6913         drm_edid = drm_edid_legacy_init(&_drm_edid, edid);
6914
6915         update_display_info(connector, drm_edid);
6916
6917         return _drm_edid_connector_add_modes(connector, drm_edid);
6918 }
6919 EXPORT_SYMBOL(drm_add_edid_modes);
6920
6921 /**
6922  * drm_add_modes_noedid - add modes for the connectors without EDID
6923  * @connector: connector we're probing
6924  * @hdisplay: the horizontal display limit
6925  * @vdisplay: the vertical display limit
6926  *
6927  * Add the specified modes to the connector's mode list. Only when the
6928  * hdisplay/vdisplay is not beyond the given limit, it will be added.
6929  *
6930  * Return: The number of modes added or 0 if we couldn't find any.
6931  */
6932 int drm_add_modes_noedid(struct drm_connector *connector,
6933                         int hdisplay, int vdisplay)
6934 {
6935         int i, count, num_modes = 0;
6936         struct drm_display_mode *mode;
6937         struct drm_device *dev = connector->dev;
6938
6939         count = ARRAY_SIZE(drm_dmt_modes);
6940         if (hdisplay < 0)
6941                 hdisplay = 0;
6942         if (vdisplay < 0)
6943                 vdisplay = 0;
6944
6945         for (i = 0; i < count; i++) {
6946                 const struct drm_display_mode *ptr = &drm_dmt_modes[i];
6947
6948                 if (hdisplay && vdisplay) {
6949                         /*
6950                          * Only when two are valid, they will be used to check
6951                          * whether the mode should be added to the mode list of
6952                          * the connector.
6953                          */
6954                         if (ptr->hdisplay > hdisplay ||
6955                                         ptr->vdisplay > vdisplay)
6956                                 continue;
6957                 }
6958                 if (drm_mode_vrefresh(ptr) > 61)
6959                         continue;
6960                 mode = drm_mode_duplicate(dev, ptr);
6961                 if (mode) {
6962                         drm_mode_probed_add(connector, mode);
6963                         num_modes++;
6964                 }
6965         }
6966         return num_modes;
6967 }
6968 EXPORT_SYMBOL(drm_add_modes_noedid);
6969
6970 /**
6971  * drm_set_preferred_mode - Sets the preferred mode of a connector
6972  * @connector: connector whose mode list should be processed
6973  * @hpref: horizontal resolution of preferred mode
6974  * @vpref: vertical resolution of preferred mode
6975  *
6976  * Marks a mode as preferred if it matches the resolution specified by @hpref
6977  * and @vpref.
6978  */
6979 void drm_set_preferred_mode(struct drm_connector *connector,
6980                            int hpref, int vpref)
6981 {
6982         struct drm_display_mode *mode;
6983
6984         list_for_each_entry(mode, &connector->probed_modes, head) {
6985                 if (mode->hdisplay == hpref &&
6986                     mode->vdisplay == vpref)
6987                         mode->type |= DRM_MODE_TYPE_PREFERRED;
6988         }
6989 }
6990 EXPORT_SYMBOL(drm_set_preferred_mode);
6991
6992 static bool is_hdmi2_sink(const struct drm_connector *connector)
6993 {
6994         /*
6995          * FIXME: sil-sii8620 doesn't have a connector around when
6996          * we need one, so we have to be prepared for a NULL connector.
6997          */
6998         if (!connector)
6999                 return true;
7000
7001         return connector->display_info.hdmi.scdc.supported ||
7002                 connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR420;
7003 }
7004
7005 static u8 drm_mode_hdmi_vic(const struct drm_connector *connector,
7006                             const struct drm_display_mode *mode)
7007 {
7008         bool has_hdmi_infoframe = connector ?
7009                 connector->display_info.has_hdmi_infoframe : false;
7010
7011         if (!has_hdmi_infoframe)
7012                 return 0;
7013
7014         /* No HDMI VIC when signalling 3D video format */
7015         if (mode->flags & DRM_MODE_FLAG_3D_MASK)
7016                 return 0;
7017
7018         return drm_match_hdmi_mode(mode);
7019 }
7020
7021 static u8 drm_mode_cea_vic(const struct drm_connector *connector,
7022                            const struct drm_display_mode *mode)
7023 {
7024         /*
7025          * HDMI spec says if a mode is found in HDMI 1.4b 4K modes
7026          * we should send its VIC in vendor infoframes, else send the
7027          * VIC in AVI infoframes. Lets check if this mode is present in
7028          * HDMI 1.4b 4K modes
7029          */
7030         if (drm_mode_hdmi_vic(connector, mode))
7031                 return 0;
7032
7033         return drm_match_cea_mode(mode);
7034 }
7035
7036 /*
7037  * Avoid sending VICs defined in HDMI 2.0 in AVI infoframes to sinks that
7038  * conform to HDMI 1.4.
7039  *
7040  * HDMI 1.4 (CTA-861-D) VIC range: [1..64]
7041  * HDMI 2.0 (CTA-861-F) VIC range: [1..107]
7042  *
7043  * If the sink lists the VIC in CTA VDB, assume it's fine, regardless of HDMI
7044  * version.
7045  */
7046 static u8 vic_for_avi_infoframe(const struct drm_connector *connector, u8 vic)
7047 {
7048         if (!is_hdmi2_sink(connector) && vic > 64 &&
7049             !cta_vdb_has_vic(connector, vic))
7050                 return 0;
7051
7052         return vic;
7053 }
7054
7055 /**
7056  * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with
7057  *                                              data from a DRM display mode
7058  * @frame: HDMI AVI infoframe
7059  * @connector: the connector
7060  * @mode: DRM display mode
7061  *
7062  * Return: 0 on success or a negative error code on failure.
7063  */
7064 int
7065 drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
7066                                          const struct drm_connector *connector,
7067                                          const struct drm_display_mode *mode)
7068 {
7069         enum hdmi_picture_aspect picture_aspect;
7070         u8 vic, hdmi_vic;
7071
7072         if (!frame || !mode)
7073                 return -EINVAL;
7074
7075         hdmi_avi_infoframe_init(frame);
7076
7077         if (mode->flags & DRM_MODE_FLAG_DBLCLK)
7078                 frame->pixel_repeat = 1;
7079
7080         vic = drm_mode_cea_vic(connector, mode);
7081         hdmi_vic = drm_mode_hdmi_vic(connector, mode);
7082
7083         frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
7084
7085         /*
7086          * As some drivers don't support atomic, we can't use connector state.
7087          * So just initialize the frame with default values, just the same way
7088          * as it's done with other properties here.
7089          */
7090         frame->content_type = HDMI_CONTENT_TYPE_GRAPHICS;
7091         frame->itc = 0;
7092
7093         /*
7094          * Populate picture aspect ratio from either
7095          * user input (if specified) or from the CEA/HDMI mode lists.
7096          */
7097         picture_aspect = mode->picture_aspect_ratio;
7098         if (picture_aspect == HDMI_PICTURE_ASPECT_NONE) {
7099                 if (vic)
7100                         picture_aspect = drm_get_cea_aspect_ratio(vic);
7101                 else if (hdmi_vic)
7102                         picture_aspect = drm_get_hdmi_aspect_ratio(hdmi_vic);
7103         }
7104
7105         /*
7106          * The infoframe can't convey anything but none, 4:3
7107          * and 16:9, so if the user has asked for anything else
7108          * we can only satisfy it by specifying the right VIC.
7109          */
7110         if (picture_aspect > HDMI_PICTURE_ASPECT_16_9) {
7111                 if (vic) {
7112                         if (picture_aspect != drm_get_cea_aspect_ratio(vic))
7113                                 return -EINVAL;
7114                 } else if (hdmi_vic) {
7115                         if (picture_aspect != drm_get_hdmi_aspect_ratio(hdmi_vic))
7116                                 return -EINVAL;
7117                 } else {
7118                         return -EINVAL;
7119                 }
7120
7121                 picture_aspect = HDMI_PICTURE_ASPECT_NONE;
7122         }
7123
7124         frame->video_code = vic_for_avi_infoframe(connector, vic);
7125         frame->picture_aspect = picture_aspect;
7126         frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
7127         frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
7128
7129         return 0;
7130 }
7131 EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
7132
7133 /**
7134  * drm_hdmi_avi_infoframe_quant_range() - fill the HDMI AVI infoframe
7135  *                                        quantization range information
7136  * @frame: HDMI AVI infoframe
7137  * @connector: the connector
7138  * @mode: DRM display mode
7139  * @rgb_quant_range: RGB quantization range (Q)
7140  */
7141 void
7142 drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
7143                                    const struct drm_connector *connector,
7144                                    const struct drm_display_mode *mode,
7145                                    enum hdmi_quantization_range rgb_quant_range)
7146 {
7147         const struct drm_display_info *info = &connector->display_info;
7148
7149         /*
7150          * CEA-861:
7151          * "A Source shall not send a non-zero Q value that does not correspond
7152          *  to the default RGB Quantization Range for the transmitted Picture
7153          *  unless the Sink indicates support for the Q bit in a Video
7154          *  Capabilities Data Block."
7155          *
7156          * HDMI 2.0 recommends sending non-zero Q when it does match the
7157          * default RGB quantization range for the mode, even when QS=0.
7158          */
7159         if (info->rgb_quant_range_selectable ||
7160             rgb_quant_range == drm_default_rgb_quant_range(mode))
7161                 frame->quantization_range = rgb_quant_range;
7162         else
7163                 frame->quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
7164
7165         /*
7166          * CEA-861-F:
7167          * "When transmitting any RGB colorimetry, the Source should set the
7168          *  YQ-field to match the RGB Quantization Range being transmitted
7169          *  (e.g., when Limited Range RGB, set YQ=0 or when Full Range RGB,
7170          *  set YQ=1) and the Sink shall ignore the YQ-field."
7171          *
7172          * Unfortunate certain sinks (eg. VIZ Model 67/E261VA) get confused
7173          * by non-zero YQ when receiving RGB. There doesn't seem to be any
7174          * good way to tell which version of CEA-861 the sink supports, so
7175          * we limit non-zero YQ to HDMI 2.0 sinks only as HDMI 2.0 is based
7176          * on CEA-861-F.
7177          */
7178         if (!is_hdmi2_sink(connector) ||
7179             rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED)
7180                 frame->ycc_quantization_range =
7181                         HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
7182         else
7183                 frame->ycc_quantization_range =
7184                         HDMI_YCC_QUANTIZATION_RANGE_FULL;
7185 }
7186 EXPORT_SYMBOL(drm_hdmi_avi_infoframe_quant_range);
7187
7188 static enum hdmi_3d_structure
7189 s3d_structure_from_display_mode(const struct drm_display_mode *mode)
7190 {
7191         u32 layout = mode->flags & DRM_MODE_FLAG_3D_MASK;
7192
7193         switch (layout) {
7194         case DRM_MODE_FLAG_3D_FRAME_PACKING:
7195                 return HDMI_3D_STRUCTURE_FRAME_PACKING;
7196         case DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE:
7197                 return HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE;
7198         case DRM_MODE_FLAG_3D_LINE_ALTERNATIVE:
7199                 return HDMI_3D_STRUCTURE_LINE_ALTERNATIVE;
7200         case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL:
7201                 return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL;
7202         case DRM_MODE_FLAG_3D_L_DEPTH:
7203                 return HDMI_3D_STRUCTURE_L_DEPTH;
7204         case DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH:
7205                 return HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH;
7206         case DRM_MODE_FLAG_3D_TOP_AND_BOTTOM:
7207                 return HDMI_3D_STRUCTURE_TOP_AND_BOTTOM;
7208         case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF:
7209                 return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF;
7210         default:
7211                 return HDMI_3D_STRUCTURE_INVALID;
7212         }
7213 }
7214
7215 /**
7216  * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
7217  * data from a DRM display mode
7218  * @frame: HDMI vendor infoframe
7219  * @connector: the connector
7220  * @mode: DRM display mode
7221  *
7222  * Note that there's is a need to send HDMI vendor infoframes only when using a
7223  * 4k or stereoscopic 3D mode. So when giving any other mode as input this
7224  * function will return -EINVAL, error that can be safely ignored.
7225  *
7226  * Return: 0 on success or a negative error code on failure.
7227  */
7228 int
7229 drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
7230                                             const struct drm_connector *connector,
7231                                             const struct drm_display_mode *mode)
7232 {
7233         /*
7234          * FIXME: sil-sii8620 doesn't have a connector around when
7235          * we need one, so we have to be prepared for a NULL connector.
7236          */
7237         bool has_hdmi_infoframe = connector ?
7238                 connector->display_info.has_hdmi_infoframe : false;
7239         int err;
7240
7241         if (!frame || !mode)
7242                 return -EINVAL;
7243
7244         if (!has_hdmi_infoframe)
7245                 return -EINVAL;
7246
7247         err = hdmi_vendor_infoframe_init(frame);
7248         if (err < 0)
7249                 return err;
7250
7251         /*
7252          * Even if it's not absolutely necessary to send the infoframe
7253          * (ie.vic==0 and s3d_struct==0) we will still send it if we
7254          * know that the sink can handle it. This is based on a
7255          * suggestion in HDMI 2.0 Appendix F. Apparently some sinks
7256          * have trouble realizing that they should switch from 3D to 2D
7257          * mode if the source simply stops sending the infoframe when
7258          * it wants to switch from 3D to 2D.
7259          */
7260         frame->vic = drm_mode_hdmi_vic(connector, mode);
7261         frame->s3d_struct = s3d_structure_from_display_mode(mode);
7262
7263         return 0;
7264 }
7265 EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode);
7266
7267 static void drm_parse_tiled_block(struct drm_connector *connector,
7268                                   const struct displayid_block *block)
7269 {
7270         const struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block;
7271         u16 w, h;
7272         u8 tile_v_loc, tile_h_loc;
7273         u8 num_v_tile, num_h_tile;
7274         struct drm_tile_group *tg;
7275
7276         w = tile->tile_size[0] | tile->tile_size[1] << 8;
7277         h = tile->tile_size[2] | tile->tile_size[3] << 8;
7278
7279         num_v_tile = (tile->topo[0] & 0xf) | (tile->topo[2] & 0x30);
7280         num_h_tile = (tile->topo[0] >> 4) | ((tile->topo[2] >> 2) & 0x30);
7281         tile_v_loc = (tile->topo[1] & 0xf) | ((tile->topo[2] & 0x3) << 4);
7282         tile_h_loc = (tile->topo[1] >> 4) | (((tile->topo[2] >> 2) & 0x3) << 4);
7283
7284         connector->has_tile = true;
7285         if (tile->tile_cap & 0x80)
7286                 connector->tile_is_single_monitor = true;
7287
7288         connector->num_h_tile = num_h_tile + 1;
7289         connector->num_v_tile = num_v_tile + 1;
7290         connector->tile_h_loc = tile_h_loc;
7291         connector->tile_v_loc = tile_v_loc;
7292         connector->tile_h_size = w + 1;
7293         connector->tile_v_size = h + 1;
7294
7295         drm_dbg_kms(connector->dev,
7296                     "[CONNECTOR:%d:%s] tile cap 0x%x, size %dx%d, num tiles %dx%d, location %dx%d, vend %c%c%c",
7297                     connector->base.id, connector->name,
7298                     tile->tile_cap,
7299                     connector->tile_h_size, connector->tile_v_size,
7300                     connector->num_h_tile, connector->num_v_tile,
7301                     connector->tile_h_loc, connector->tile_v_loc,
7302                     tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]);
7303
7304         tg = drm_mode_get_tile_group(connector->dev, tile->topology_id);
7305         if (!tg)
7306                 tg = drm_mode_create_tile_group(connector->dev, tile->topology_id);
7307         if (!tg)
7308                 return;
7309
7310         if (connector->tile_group != tg) {
7311                 /* if we haven't got a pointer,
7312                    take the reference, drop ref to old tile group */
7313                 if (connector->tile_group)
7314                         drm_mode_put_tile_group(connector->dev, connector->tile_group);
7315                 connector->tile_group = tg;
7316         } else {
7317                 /* if same tile group, then release the ref we just took. */
7318                 drm_mode_put_tile_group(connector->dev, tg);
7319         }
7320 }
7321
7322 static bool displayid_is_tiled_block(const struct displayid_iter *iter,
7323                                      const struct displayid_block *block)
7324 {
7325         return (displayid_version(iter) == DISPLAY_ID_STRUCTURE_VER_12 &&
7326                 block->tag == DATA_BLOCK_TILED_DISPLAY) ||
7327                 (displayid_version(iter) == DISPLAY_ID_STRUCTURE_VER_20 &&
7328                  block->tag == DATA_BLOCK_2_TILED_DISPLAY_TOPOLOGY);
7329 }
7330
7331 static void _drm_update_tile_info(struct drm_connector *connector,
7332                                   const struct drm_edid *drm_edid)
7333 {
7334         const struct displayid_block *block;
7335         struct displayid_iter iter;
7336
7337         connector->has_tile = false;
7338
7339         displayid_iter_edid_begin(drm_edid, &iter);
7340         displayid_iter_for_each(block, &iter) {
7341                 if (displayid_is_tiled_block(&iter, block))
7342                         drm_parse_tiled_block(connector, block);
7343         }
7344         displayid_iter_end(&iter);
7345
7346         if (!connector->has_tile && connector->tile_group) {
7347                 drm_mode_put_tile_group(connector->dev, connector->tile_group);
7348                 connector->tile_group = NULL;
7349         }
7350 }
7351
7352 /**
7353  * drm_edid_is_digital - is digital?
7354  * @drm_edid: The EDID
7355  *
7356  * Return true if input is digital.
7357  */
7358 bool drm_edid_is_digital(const struct drm_edid *drm_edid)
7359 {
7360         return drm_edid && drm_edid->edid &&
7361                 drm_edid->edid->input & DRM_EDID_INPUT_DIGITAL;
7362 }
7363 EXPORT_SYMBOL(drm_edid_is_digital);
This page took 0.506499 seconds and 4 git commands to generate.