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