Revert "drm/edid: Fix csync detailed mode parsing"
[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_read_switcheroo - get EDID data for a vga_switcheroo output
2849  * @connector: connector we're probing
2850  * @adapter: I2C adapter to use for DDC
2851  *
2852  * Wrapper around drm_edid_read_ddc() for laptops with dual GPUs using one set
2853  * of outputs. The wrapper adds the requisite vga_switcheroo calls to
2854  * temporarily switch DDC to the GPU which is retrieving EDID.
2855  *
2856  * Return: Pointer to valid EDID or %NULL if we couldn't find any.
2857  */
2858 const struct drm_edid *drm_edid_read_switcheroo(struct drm_connector *connector,
2859                                                 struct i2c_adapter *adapter)
2860 {
2861         struct drm_device *dev = connector->dev;
2862         struct pci_dev *pdev = to_pci_dev(dev->dev);
2863         const struct drm_edid *drm_edid;
2864
2865         if (drm_WARN_ON_ONCE(dev, !dev_is_pci(dev->dev)))
2866                 return NULL;
2867
2868         vga_switcheroo_lock_ddc(pdev);
2869         drm_edid = drm_edid_read_ddc(connector, adapter);
2870         vga_switcheroo_unlock_ddc(pdev);
2871
2872         return drm_edid;
2873 }
2874 EXPORT_SYMBOL(drm_edid_read_switcheroo);
2875
2876 /**
2877  * drm_edid_duplicate - duplicate an EDID and the extensions
2878  * @edid: EDID to duplicate
2879  *
2880  * Return: Pointer to duplicated EDID or NULL on allocation failure.
2881  */
2882 struct edid *drm_edid_duplicate(const struct edid *edid)
2883 {
2884         if (!edid)
2885                 return NULL;
2886
2887         return kmemdup(edid, edid_size(edid), GFP_KERNEL);
2888 }
2889 EXPORT_SYMBOL(drm_edid_duplicate);
2890
2891 /*** EDID parsing ***/
2892
2893 /**
2894  * edid_get_quirks - return quirk flags for a given EDID
2895  * @drm_edid: EDID to process
2896  *
2897  * This tells subsequent routines what fixes they need to apply.
2898  */
2899 static u32 edid_get_quirks(const struct drm_edid *drm_edid)
2900 {
2901         u32 panel_id = edid_extract_panel_id(drm_edid->edid);
2902         const struct edid_quirk *quirk;
2903         int i;
2904
2905         for (i = 0; i < ARRAY_SIZE(edid_quirk_list); i++) {
2906                 quirk = &edid_quirk_list[i];
2907                 if (quirk->panel_id == panel_id)
2908                         return quirk->quirks;
2909         }
2910
2911         return 0;
2912 }
2913
2914 #define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay)
2915 #define MODE_REFRESH_DIFF(c,t) (abs((c) - (t)))
2916
2917 /*
2918  * Walk the mode list for connector, clearing the preferred status on existing
2919  * modes and setting it anew for the right mode ala quirks.
2920  */
2921 static void edid_fixup_preferred(struct drm_connector *connector)
2922 {
2923         const struct drm_display_info *info = &connector->display_info;
2924         struct drm_display_mode *t, *cur_mode, *preferred_mode;
2925         int target_refresh = 0;
2926         int cur_vrefresh, preferred_vrefresh;
2927
2928         if (list_empty(&connector->probed_modes))
2929                 return;
2930
2931         if (info->quirks & EDID_QUIRK_PREFER_LARGE_60)
2932                 target_refresh = 60;
2933         if (info->quirks & EDID_QUIRK_PREFER_LARGE_75)
2934                 target_refresh = 75;
2935
2936         preferred_mode = list_first_entry(&connector->probed_modes,
2937                                           struct drm_display_mode, head);
2938
2939         list_for_each_entry_safe(cur_mode, t, &connector->probed_modes, head) {
2940                 cur_mode->type &= ~DRM_MODE_TYPE_PREFERRED;
2941
2942                 if (cur_mode == preferred_mode)
2943                         continue;
2944
2945                 /* Largest mode is preferred */
2946                 if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode))
2947                         preferred_mode = cur_mode;
2948
2949                 cur_vrefresh = drm_mode_vrefresh(cur_mode);
2950                 preferred_vrefresh = drm_mode_vrefresh(preferred_mode);
2951                 /* At a given size, try to get closest to target refresh */
2952                 if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) &&
2953                     MODE_REFRESH_DIFF(cur_vrefresh, target_refresh) <
2954                     MODE_REFRESH_DIFF(preferred_vrefresh, target_refresh)) {
2955                         preferred_mode = cur_mode;
2956                 }
2957         }
2958
2959         preferred_mode->type |= DRM_MODE_TYPE_PREFERRED;
2960 }
2961
2962 static bool
2963 mode_is_rb(const struct drm_display_mode *mode)
2964 {
2965         return (mode->htotal - mode->hdisplay == 160) &&
2966                (mode->hsync_end - mode->hdisplay == 80) &&
2967                (mode->hsync_end - mode->hsync_start == 32) &&
2968                (mode->vsync_start - mode->vdisplay == 3);
2969 }
2970
2971 /*
2972  * drm_mode_find_dmt - Create a copy of a mode if present in DMT
2973  * @dev: Device to duplicate against
2974  * @hsize: Mode width
2975  * @vsize: Mode height
2976  * @fresh: Mode refresh rate
2977  * @rb: Mode reduced-blanking-ness
2978  *
2979  * Walk the DMT mode list looking for a match for the given parameters.
2980  *
2981  * Return: A newly allocated copy of the mode, or NULL if not found.
2982  */
2983 struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
2984                                            int hsize, int vsize, int fresh,
2985                                            bool rb)
2986 {
2987         int i;
2988
2989         for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
2990                 const struct drm_display_mode *ptr = &drm_dmt_modes[i];
2991
2992                 if (hsize != ptr->hdisplay)
2993                         continue;
2994                 if (vsize != ptr->vdisplay)
2995                         continue;
2996                 if (fresh != drm_mode_vrefresh(ptr))
2997                         continue;
2998                 if (rb != mode_is_rb(ptr))
2999                         continue;
3000
3001                 return drm_mode_duplicate(dev, ptr);
3002         }
3003
3004         return NULL;
3005 }
3006 EXPORT_SYMBOL(drm_mode_find_dmt);
3007
3008 static bool is_display_descriptor(const struct detailed_timing *descriptor, u8 type)
3009 {
3010         BUILD_BUG_ON(offsetof(typeof(*descriptor), pixel_clock) != 0);
3011         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.pad1) != 2);
3012         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.type) != 3);
3013
3014         return descriptor->pixel_clock == 0 &&
3015                 descriptor->data.other_data.pad1 == 0 &&
3016                 descriptor->data.other_data.type == type;
3017 }
3018
3019 static bool is_detailed_timing_descriptor(const struct detailed_timing *descriptor)
3020 {
3021         BUILD_BUG_ON(offsetof(typeof(*descriptor), pixel_clock) != 0);
3022
3023         return descriptor->pixel_clock != 0;
3024 }
3025
3026 typedef void detailed_cb(const struct detailed_timing *timing, void *closure);
3027
3028 static void
3029 cea_for_each_detailed_block(const u8 *ext, detailed_cb *cb, void *closure)
3030 {
3031         int i, n;
3032         u8 d = ext[0x02];
3033         const u8 *det_base = ext + d;
3034
3035         if (d < 4 || d > 127)
3036                 return;
3037
3038         n = (127 - d) / 18;
3039         for (i = 0; i < n; i++)
3040                 cb((const struct detailed_timing *)(det_base + 18 * i), closure);
3041 }
3042
3043 static void
3044 vtb_for_each_detailed_block(const u8 *ext, detailed_cb *cb, void *closure)
3045 {
3046         unsigned int i, n = min((int)ext[0x02], 6);
3047         const u8 *det_base = ext + 5;
3048
3049         if (ext[0x01] != 1)
3050                 return; /* unknown version */
3051
3052         for (i = 0; i < n; i++)
3053                 cb((const struct detailed_timing *)(det_base + 18 * i), closure);
3054 }
3055
3056 static void drm_for_each_detailed_block(const struct drm_edid *drm_edid,
3057                                         detailed_cb *cb, void *closure)
3058 {
3059         struct drm_edid_iter edid_iter;
3060         const u8 *ext;
3061         int i;
3062
3063         if (!drm_edid)
3064                 return;
3065
3066         for (i = 0; i < EDID_DETAILED_TIMINGS; i++)
3067                 cb(&drm_edid->edid->detailed_timings[i], closure);
3068
3069         drm_edid_iter_begin(drm_edid, &edid_iter);
3070         drm_edid_iter_for_each(ext, &edid_iter) {
3071                 switch (*ext) {
3072                 case CEA_EXT:
3073                         cea_for_each_detailed_block(ext, cb, closure);
3074                         break;
3075                 case VTB_EXT:
3076                         vtb_for_each_detailed_block(ext, cb, closure);
3077                         break;
3078                 default:
3079                         break;
3080                 }
3081         }
3082         drm_edid_iter_end(&edid_iter);
3083 }
3084
3085 static void
3086 is_rb(const struct detailed_timing *descriptor, void *data)
3087 {
3088         bool *res = data;
3089
3090         if (!is_display_descriptor(descriptor, EDID_DETAIL_MONITOR_RANGE))
3091                 return;
3092
3093         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.flags) != 10);
3094         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.cvt.flags) != 15);
3095
3096         if (descriptor->data.other_data.data.range.flags == DRM_EDID_CVT_SUPPORT_FLAG &&
3097             descriptor->data.other_data.data.range.formula.cvt.flags & DRM_EDID_CVT_FLAGS_REDUCED_BLANKING)
3098                 *res = true;
3099 }
3100
3101 /* EDID 1.4 defines this explicitly.  For EDID 1.3, we guess, badly. */
3102 static bool
3103 drm_monitor_supports_rb(const struct drm_edid *drm_edid)
3104 {
3105         if (drm_edid->edid->revision >= 4) {
3106                 bool ret = false;
3107
3108                 drm_for_each_detailed_block(drm_edid, is_rb, &ret);
3109                 return ret;
3110         }
3111
3112         return ((drm_edid->edid->input & DRM_EDID_INPUT_DIGITAL) != 0);
3113 }
3114
3115 static void
3116 find_gtf2(const struct detailed_timing *descriptor, void *data)
3117 {
3118         const struct detailed_timing **res = data;
3119
3120         if (!is_display_descriptor(descriptor, EDID_DETAIL_MONITOR_RANGE))
3121                 return;
3122
3123         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.flags) != 10);
3124
3125         if (descriptor->data.other_data.data.range.flags == DRM_EDID_SECONDARY_GTF_SUPPORT_FLAG)
3126                 *res = descriptor;
3127 }
3128
3129 /* Secondary GTF curve kicks in above some break frequency */
3130 static int
3131 drm_gtf2_hbreak(const struct drm_edid *drm_edid)
3132 {
3133         const struct detailed_timing *descriptor = NULL;
3134
3135         drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3136
3137         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.hfreq_start_khz) != 12);
3138
3139         return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.hfreq_start_khz * 2 : 0;
3140 }
3141
3142 static int
3143 drm_gtf2_2c(const struct drm_edid *drm_edid)
3144 {
3145         const struct detailed_timing *descriptor = NULL;
3146
3147         drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3148
3149         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.c) != 13);
3150
3151         return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.c : 0;
3152 }
3153
3154 static int
3155 drm_gtf2_m(const struct drm_edid *drm_edid)
3156 {
3157         const struct detailed_timing *descriptor = NULL;
3158
3159         drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3160
3161         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.m) != 14);
3162
3163         return descriptor ? le16_to_cpu(descriptor->data.other_data.data.range.formula.gtf2.m) : 0;
3164 }
3165
3166 static int
3167 drm_gtf2_k(const struct drm_edid *drm_edid)
3168 {
3169         const struct detailed_timing *descriptor = NULL;
3170
3171         drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3172
3173         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.k) != 16);
3174
3175         return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.k : 0;
3176 }
3177
3178 static int
3179 drm_gtf2_2j(const struct drm_edid *drm_edid)
3180 {
3181         const struct detailed_timing *descriptor = NULL;
3182
3183         drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3184
3185         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.j) != 17);
3186
3187         return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.j : 0;
3188 }
3189
3190 static void
3191 get_timing_level(const struct detailed_timing *descriptor, void *data)
3192 {
3193         int *res = data;
3194
3195         if (!is_display_descriptor(descriptor, EDID_DETAIL_MONITOR_RANGE))
3196                 return;
3197
3198         BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.flags) != 10);
3199
3200         switch (descriptor->data.other_data.data.range.flags) {
3201         case DRM_EDID_DEFAULT_GTF_SUPPORT_FLAG:
3202                 *res = LEVEL_GTF;
3203                 break;
3204         case DRM_EDID_SECONDARY_GTF_SUPPORT_FLAG:
3205                 *res = LEVEL_GTF2;
3206                 break;
3207         case DRM_EDID_CVT_SUPPORT_FLAG:
3208                 *res = LEVEL_CVT;
3209                 break;
3210         default:
3211                 break;
3212         }
3213 }
3214
3215 /* Get standard timing level (CVT/GTF/DMT). */
3216 static int standard_timing_level(const struct drm_edid *drm_edid)
3217 {
3218         const struct edid *edid = drm_edid->edid;
3219
3220         if (edid->revision >= 4) {
3221                 /*
3222                  * If the range descriptor doesn't
3223                  * indicate otherwise default to CVT
3224                  */
3225                 int ret = LEVEL_CVT;
3226
3227                 drm_for_each_detailed_block(drm_edid, get_timing_level, &ret);
3228
3229                 return ret;
3230         } else if (edid->revision >= 3 && drm_gtf2_hbreak(drm_edid)) {
3231                 return LEVEL_GTF2;
3232         } else if (edid->revision >= 2) {
3233                 return LEVEL_GTF;
3234         } else {
3235                 return LEVEL_DMT;
3236         }
3237 }
3238
3239 /*
3240  * 0 is reserved.  The spec says 0x01 fill for unused timings.  Some old
3241  * monitors fill with ascii space (0x20) instead.
3242  */
3243 static int
3244 bad_std_timing(u8 a, u8 b)
3245 {
3246         return (a == 0x00 && b == 0x00) ||
3247                (a == 0x01 && b == 0x01) ||
3248                (a == 0x20 && b == 0x20);
3249 }
3250
3251 static int drm_mode_hsync(const struct drm_display_mode *mode)
3252 {
3253         if (mode->htotal <= 0)
3254                 return 0;
3255
3256         return DIV_ROUND_CLOSEST(mode->clock, mode->htotal);
3257 }
3258
3259 static struct drm_display_mode *
3260 drm_gtf2_mode(struct drm_device *dev,
3261               const struct drm_edid *drm_edid,
3262               int hsize, int vsize, int vrefresh_rate)
3263 {
3264         struct drm_display_mode *mode;
3265
3266         /*
3267          * This is potentially wrong if there's ever a monitor with
3268          * more than one ranges section, each claiming a different
3269          * secondary GTF curve.  Please don't do that.
3270          */
3271         mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
3272         if (!mode)
3273                 return NULL;
3274
3275         if (drm_mode_hsync(mode) > drm_gtf2_hbreak(drm_edid)) {
3276                 drm_mode_destroy(dev, mode);
3277                 mode = drm_gtf_mode_complex(dev, hsize, vsize,
3278                                             vrefresh_rate, 0, 0,
3279                                             drm_gtf2_m(drm_edid),
3280                                             drm_gtf2_2c(drm_edid),
3281                                             drm_gtf2_k(drm_edid),
3282                                             drm_gtf2_2j(drm_edid));
3283         }
3284
3285         return mode;
3286 }
3287
3288 /*
3289  * Take the standard timing params (in this case width, aspect, and refresh)
3290  * and convert them into a real mode using CVT/GTF/DMT.
3291  */
3292 static struct drm_display_mode *drm_mode_std(struct drm_connector *connector,
3293                                              const struct drm_edid *drm_edid,
3294                                              const struct std_timing *t)
3295 {
3296         struct drm_device *dev = connector->dev;
3297         struct drm_display_mode *m, *mode = NULL;
3298         int hsize, vsize;
3299         int vrefresh_rate;
3300         unsigned aspect_ratio = (t->vfreq_aspect & EDID_TIMING_ASPECT_MASK)
3301                 >> EDID_TIMING_ASPECT_SHIFT;
3302         unsigned vfreq = (t->vfreq_aspect & EDID_TIMING_VFREQ_MASK)
3303                 >> EDID_TIMING_VFREQ_SHIFT;
3304         int timing_level = standard_timing_level(drm_edid);
3305
3306         if (bad_std_timing(t->hsize, t->vfreq_aspect))
3307                 return NULL;
3308
3309         /* According to the EDID spec, the hdisplay = hsize * 8 + 248 */
3310         hsize = t->hsize * 8 + 248;
3311         /* vrefresh_rate = vfreq + 60 */
3312         vrefresh_rate = vfreq + 60;
3313         /* the vdisplay is calculated based on the aspect ratio */
3314         if (aspect_ratio == 0) {
3315                 if (drm_edid->edid->revision < 3)
3316                         vsize = hsize;
3317                 else
3318                         vsize = (hsize * 10) / 16;
3319         } else if (aspect_ratio == 1)
3320                 vsize = (hsize * 3) / 4;
3321         else if (aspect_ratio == 2)
3322                 vsize = (hsize * 4) / 5;
3323         else
3324                 vsize = (hsize * 9) / 16;
3325
3326         /* HDTV hack, part 1 */
3327         if (vrefresh_rate == 60 &&
3328             ((hsize == 1360 && vsize == 765) ||
3329              (hsize == 1368 && vsize == 769))) {
3330                 hsize = 1366;
3331                 vsize = 768;
3332         }
3333
3334         /*
3335          * If this connector already has a mode for this size and refresh
3336          * rate (because it came from detailed or CVT info), use that
3337          * instead.  This way we don't have to guess at interlace or
3338          * reduced blanking.
3339          */
3340         list_for_each_entry(m, &connector->probed_modes, head)
3341                 if (m->hdisplay == hsize && m->vdisplay == vsize &&
3342                     drm_mode_vrefresh(m) == vrefresh_rate)
3343                         return NULL;
3344
3345         /* HDTV hack, part 2 */
3346         if (hsize == 1366 && vsize == 768 && vrefresh_rate == 60) {
3347                 mode = drm_cvt_mode(dev, 1366, 768, vrefresh_rate, 0, 0,
3348                                     false);
3349                 if (!mode)
3350                         return NULL;
3351                 mode->hdisplay = 1366;
3352                 mode->hsync_start = mode->hsync_start - 1;
3353                 mode->hsync_end = mode->hsync_end - 1;
3354                 return mode;
3355         }
3356
3357         /* check whether it can be found in default mode table */
3358         if (drm_monitor_supports_rb(drm_edid)) {
3359                 mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate,
3360                                          true);
3361                 if (mode)
3362                         return mode;
3363         }
3364         mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate, false);
3365         if (mode)
3366                 return mode;
3367
3368         /* okay, generate it */
3369         switch (timing_level) {
3370         case LEVEL_DMT:
3371                 break;
3372         case LEVEL_GTF:
3373                 mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
3374                 break;
3375         case LEVEL_GTF2:
3376                 mode = drm_gtf2_mode(dev, drm_edid, hsize, vsize, vrefresh_rate);
3377                 break;
3378         case LEVEL_CVT:
3379                 mode = drm_cvt_mode(dev, hsize, vsize, vrefresh_rate, 0, 0,
3380                                     false);
3381                 break;
3382         }
3383         return mode;
3384 }
3385
3386 /*
3387  * EDID is delightfully ambiguous about how interlaced modes are to be
3388  * encoded.  Our internal representation is of frame height, but some
3389  * HDTV detailed timings are encoded as field height.
3390  *
3391  * The format list here is from CEA, in frame size.  Technically we
3392  * should be checking refresh rate too.  Whatever.
3393  */
3394 static void
3395 drm_mode_do_interlace_quirk(struct drm_display_mode *mode,
3396                             const struct detailed_pixel_timing *pt)
3397 {
3398         int i;
3399         static const struct {
3400                 int w, h;
3401         } cea_interlaced[] = {
3402                 { 1920, 1080 },
3403                 {  720,  480 },
3404                 { 1440,  480 },
3405                 { 2880,  480 },
3406                 {  720,  576 },
3407                 { 1440,  576 },
3408                 { 2880,  576 },
3409         };
3410
3411         if (!(pt->misc & DRM_EDID_PT_INTERLACED))
3412                 return;
3413
3414         for (i = 0; i < ARRAY_SIZE(cea_interlaced); i++) {
3415                 if ((mode->hdisplay == cea_interlaced[i].w) &&
3416                     (mode->vdisplay == cea_interlaced[i].h / 2)) {
3417                         mode->vdisplay *= 2;
3418                         mode->vsync_start *= 2;
3419                         mode->vsync_end *= 2;
3420                         mode->vtotal *= 2;
3421                         mode->vtotal |= 1;
3422                 }
3423         }
3424
3425         mode->flags |= DRM_MODE_FLAG_INTERLACE;
3426 }
3427
3428 /*
3429  * Create a new mode from an EDID detailed timing section. An EDID detailed
3430  * timing block contains enough info for us to create and return a new struct
3431  * drm_display_mode.
3432  */
3433 static struct drm_display_mode *drm_mode_detailed(struct drm_connector *connector,
3434                                                   const struct drm_edid *drm_edid,
3435                                                   const struct detailed_timing *timing)
3436 {
3437         const struct drm_display_info *info = &connector->display_info;
3438         struct drm_device *dev = connector->dev;
3439         struct drm_display_mode *mode;
3440         const struct detailed_pixel_timing *pt = &timing->data.pixel_data;
3441         unsigned hactive = (pt->hactive_hblank_hi & 0xf0) << 4 | pt->hactive_lo;
3442         unsigned vactive = (pt->vactive_vblank_hi & 0xf0) << 4 | pt->vactive_lo;
3443         unsigned hblank = (pt->hactive_hblank_hi & 0xf) << 8 | pt->hblank_lo;
3444         unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo;
3445         unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | pt->hsync_offset_lo;
3446         unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | pt->hsync_pulse_width_lo;
3447         unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) << 2 | pt->vsync_offset_pulse_width_lo >> 4;
3448         unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | (pt->vsync_offset_pulse_width_lo & 0xf);
3449
3450         /* ignore tiny modes */
3451         if (hactive < 64 || vactive < 64)
3452                 return NULL;
3453
3454         if (pt->misc & DRM_EDID_PT_STEREO) {
3455                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Stereo mode not supported\n",
3456                             connector->base.id, connector->name);
3457                 return NULL;
3458         }
3459         if (!(pt->misc & DRM_EDID_PT_SEPARATE_SYNC)) {
3460                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Composite sync not supported\n",
3461                             connector->base.id, connector->name);
3462         }
3463
3464         /* it is incorrect if hsync/vsync width is zero */
3465         if (!hsync_pulse_width || !vsync_pulse_width) {
3466                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Incorrect Detailed timing. Wrong Hsync/Vsync pulse width\n",
3467                             connector->base.id, connector->name);
3468                 return NULL;
3469         }
3470
3471         if (info->quirks & EDID_QUIRK_FORCE_REDUCED_BLANKING) {
3472                 mode = drm_cvt_mode(dev, hactive, vactive, 60, true, false, false);
3473                 if (!mode)
3474                         return NULL;
3475
3476                 goto set_size;
3477         }
3478
3479         mode = drm_mode_create(dev);
3480         if (!mode)
3481                 return NULL;
3482
3483         if (info->quirks & EDID_QUIRK_135_CLOCK_TOO_HIGH)
3484                 mode->clock = 1088 * 10;
3485         else
3486                 mode->clock = le16_to_cpu(timing->pixel_clock) * 10;
3487
3488         mode->hdisplay = hactive;
3489         mode->hsync_start = mode->hdisplay + hsync_offset;
3490         mode->hsync_end = mode->hsync_start + hsync_pulse_width;
3491         mode->htotal = mode->hdisplay + hblank;
3492
3493         mode->vdisplay = vactive;
3494         mode->vsync_start = mode->vdisplay + vsync_offset;
3495         mode->vsync_end = mode->vsync_start + vsync_pulse_width;
3496         mode->vtotal = mode->vdisplay + vblank;
3497
3498         /* Some EDIDs have bogus h/vtotal values */
3499         if (mode->hsync_end > mode->htotal)
3500                 mode->htotal = mode->hsync_end + 1;
3501         if (mode->vsync_end > mode->vtotal)
3502                 mode->vtotal = mode->vsync_end + 1;
3503
3504         drm_mode_do_interlace_quirk(mode, pt);
3505
3506         if (info->quirks & EDID_QUIRK_DETAILED_SYNC_PP) {
3507                 mode->flags |= DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC;
3508         } else {
3509                 mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ?
3510                         DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
3511                 mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ?
3512                         DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
3513         }
3514
3515 set_size:
3516         mode->width_mm = pt->width_mm_lo | (pt->width_height_mm_hi & 0xf0) << 4;
3517         mode->height_mm = pt->height_mm_lo | (pt->width_height_mm_hi & 0xf) << 8;
3518
3519         if (info->quirks & EDID_QUIRK_DETAILED_IN_CM) {
3520                 mode->width_mm *= 10;
3521                 mode->height_mm *= 10;
3522         }
3523
3524         if (info->quirks & EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE) {
3525                 mode->width_mm = drm_edid->edid->width_cm * 10;
3526                 mode->height_mm = drm_edid->edid->height_cm * 10;
3527         }
3528
3529         mode->type = DRM_MODE_TYPE_DRIVER;
3530         drm_mode_set_name(mode);
3531
3532         return mode;
3533 }
3534
3535 static bool
3536 mode_in_hsync_range(const struct drm_display_mode *mode,
3537                     const struct edid *edid, const u8 *t)
3538 {
3539         int hsync, hmin, hmax;
3540
3541         hmin = t[7];
3542         if (edid->revision >= 4)
3543             hmin += ((t[4] & 0x04) ? 255 : 0);
3544         hmax = t[8];
3545         if (edid->revision >= 4)
3546             hmax += ((t[4] & 0x08) ? 255 : 0);
3547         hsync = drm_mode_hsync(mode);
3548
3549         return (hsync <= hmax && hsync >= hmin);
3550 }
3551
3552 static bool
3553 mode_in_vsync_range(const struct drm_display_mode *mode,
3554                     const struct edid *edid, const u8 *t)
3555 {
3556         int vsync, vmin, vmax;
3557
3558         vmin = t[5];
3559         if (edid->revision >= 4)
3560             vmin += ((t[4] & 0x01) ? 255 : 0);
3561         vmax = t[6];
3562         if (edid->revision >= 4)
3563             vmax += ((t[4] & 0x02) ? 255 : 0);
3564         vsync = drm_mode_vrefresh(mode);
3565
3566         return (vsync <= vmax && vsync >= vmin);
3567 }
3568
3569 static u32
3570 range_pixel_clock(const struct edid *edid, const u8 *t)
3571 {
3572         /* unspecified */
3573         if (t[9] == 0 || t[9] == 255)
3574                 return 0;
3575
3576         /* 1.4 with CVT support gives us real precision, yay */
3577         if (edid->revision >= 4 && t[10] == DRM_EDID_CVT_SUPPORT_FLAG)
3578                 return (t[9] * 10000) - ((t[12] >> 2) * 250);
3579
3580         /* 1.3 is pathetic, so fuzz up a bit */
3581         return t[9] * 10000 + 5001;
3582 }
3583
3584 static bool mode_in_range(const struct drm_display_mode *mode,
3585                           const struct drm_edid *drm_edid,
3586                           const struct detailed_timing *timing)
3587 {
3588         const struct edid *edid = drm_edid->edid;
3589         u32 max_clock;
3590         const u8 *t = (const u8 *)timing;
3591
3592         if (!mode_in_hsync_range(mode, edid, t))
3593                 return false;
3594
3595         if (!mode_in_vsync_range(mode, edid, t))
3596                 return false;
3597
3598         if ((max_clock = range_pixel_clock(edid, t)))
3599                 if (mode->clock > max_clock)
3600                         return false;
3601
3602         /* 1.4 max horizontal check */
3603         if (edid->revision >= 4 && t[10] == DRM_EDID_CVT_SUPPORT_FLAG)
3604                 if (t[13] && mode->hdisplay > 8 * (t[13] + (256 * (t[12]&0x3))))
3605                         return false;
3606
3607         if (mode_is_rb(mode) && !drm_monitor_supports_rb(drm_edid))
3608                 return false;
3609
3610         return true;
3611 }
3612
3613 static bool valid_inferred_mode(const struct drm_connector *connector,
3614                                 const struct drm_display_mode *mode)
3615 {
3616         const struct drm_display_mode *m;
3617         bool ok = false;
3618
3619         list_for_each_entry(m, &connector->probed_modes, head) {
3620                 if (mode->hdisplay == m->hdisplay &&
3621                     mode->vdisplay == m->vdisplay &&
3622                     drm_mode_vrefresh(mode) == drm_mode_vrefresh(m))
3623                         return false; /* duplicated */
3624                 if (mode->hdisplay <= m->hdisplay &&
3625                     mode->vdisplay <= m->vdisplay)
3626                         ok = true;
3627         }
3628         return ok;
3629 }
3630
3631 static int drm_dmt_modes_for_range(struct drm_connector *connector,
3632                                    const struct drm_edid *drm_edid,
3633                                    const struct detailed_timing *timing)
3634 {
3635         int i, modes = 0;
3636         struct drm_display_mode *newmode;
3637         struct drm_device *dev = connector->dev;
3638
3639         for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
3640                 if (mode_in_range(drm_dmt_modes + i, drm_edid, timing) &&
3641                     valid_inferred_mode(connector, drm_dmt_modes + i)) {
3642                         newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]);
3643                         if (newmode) {
3644                                 drm_mode_probed_add(connector, newmode);
3645                                 modes++;
3646                         }
3647                 }
3648         }
3649
3650         return modes;
3651 }
3652
3653 /* fix up 1366x768 mode from 1368x768;
3654  * GFT/CVT can't express 1366 width which isn't dividable by 8
3655  */
3656 void drm_mode_fixup_1366x768(struct drm_display_mode *mode)
3657 {
3658         if (mode->hdisplay == 1368 && mode->vdisplay == 768) {
3659                 mode->hdisplay = 1366;
3660                 mode->hsync_start--;
3661                 mode->hsync_end--;
3662                 drm_mode_set_name(mode);
3663         }
3664 }
3665
3666 static int drm_gtf_modes_for_range(struct drm_connector *connector,
3667                                    const struct drm_edid *drm_edid,
3668                                    const struct detailed_timing *timing)
3669 {
3670         int i, modes = 0;
3671         struct drm_display_mode *newmode;
3672         struct drm_device *dev = connector->dev;
3673
3674         for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
3675                 const struct minimode *m = &extra_modes[i];
3676
3677                 newmode = drm_gtf_mode(dev, m->w, m->h, m->r, 0, 0);
3678                 if (!newmode)
3679                         return modes;
3680
3681                 drm_mode_fixup_1366x768(newmode);
3682                 if (!mode_in_range(newmode, drm_edid, timing) ||
3683                     !valid_inferred_mode(connector, newmode)) {
3684                         drm_mode_destroy(dev, newmode);
3685                         continue;
3686                 }
3687
3688                 drm_mode_probed_add(connector, newmode);
3689                 modes++;
3690         }
3691
3692         return modes;
3693 }
3694
3695 static int drm_gtf2_modes_for_range(struct drm_connector *connector,
3696                                     const struct drm_edid *drm_edid,
3697                                     const struct detailed_timing *timing)
3698 {
3699         int i, modes = 0;
3700         struct drm_display_mode *newmode;
3701         struct drm_device *dev = connector->dev;
3702
3703         for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
3704                 const struct minimode *m = &extra_modes[i];
3705
3706                 newmode = drm_gtf2_mode(dev, drm_edid, m->w, m->h, m->r);
3707                 if (!newmode)
3708                         return modes;
3709
3710                 drm_mode_fixup_1366x768(newmode);
3711                 if (!mode_in_range(newmode, drm_edid, timing) ||
3712                     !valid_inferred_mode(connector, newmode)) {
3713                         drm_mode_destroy(dev, newmode);
3714                         continue;
3715                 }
3716
3717                 drm_mode_probed_add(connector, newmode);
3718                 modes++;
3719         }
3720
3721         return modes;
3722 }
3723
3724 static int drm_cvt_modes_for_range(struct drm_connector *connector,
3725                                    const struct drm_edid *drm_edid,
3726                                    const struct detailed_timing *timing)
3727 {
3728         int i, modes = 0;
3729         struct drm_display_mode *newmode;
3730         struct drm_device *dev = connector->dev;
3731         bool rb = drm_monitor_supports_rb(drm_edid);
3732
3733         for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
3734                 const struct minimode *m = &extra_modes[i];
3735
3736                 newmode = drm_cvt_mode(dev, m->w, m->h, m->r, rb, 0, 0);
3737                 if (!newmode)
3738                         return modes;
3739
3740                 drm_mode_fixup_1366x768(newmode);
3741                 if (!mode_in_range(newmode, drm_edid, timing) ||
3742                     !valid_inferred_mode(connector, newmode)) {
3743                         drm_mode_destroy(dev, newmode);
3744                         continue;
3745                 }
3746
3747                 drm_mode_probed_add(connector, newmode);
3748                 modes++;
3749         }
3750
3751         return modes;
3752 }
3753
3754 static void
3755 do_inferred_modes(const struct detailed_timing *timing, void *c)
3756 {
3757         struct detailed_mode_closure *closure = c;
3758         const struct detailed_non_pixel *data = &timing->data.other_data;
3759         const struct detailed_data_monitor_range *range = &data->data.range;
3760
3761         if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_RANGE))
3762                 return;
3763
3764         closure->modes += drm_dmt_modes_for_range(closure->connector,
3765                                                   closure->drm_edid,
3766                                                   timing);
3767
3768         if (closure->drm_edid->edid->revision < 2)
3769                 return; /* GTF not defined yet */
3770
3771         switch (range->flags) {
3772         case DRM_EDID_SECONDARY_GTF_SUPPORT_FLAG:
3773                 closure->modes += drm_gtf2_modes_for_range(closure->connector,
3774                                                            closure->drm_edid,
3775                                                            timing);
3776                 break;
3777         case DRM_EDID_DEFAULT_GTF_SUPPORT_FLAG:
3778                 closure->modes += drm_gtf_modes_for_range(closure->connector,
3779                                                           closure->drm_edid,
3780                                                           timing);
3781                 break;
3782         case DRM_EDID_CVT_SUPPORT_FLAG:
3783                 if (closure->drm_edid->edid->revision < 4)
3784                         break;
3785
3786                 closure->modes += drm_cvt_modes_for_range(closure->connector,
3787                                                           closure->drm_edid,
3788                                                           timing);
3789                 break;
3790         case DRM_EDID_RANGE_LIMITS_ONLY_FLAG:
3791         default:
3792                 break;
3793         }
3794 }
3795
3796 static int add_inferred_modes(struct drm_connector *connector,
3797                               const struct drm_edid *drm_edid)
3798 {
3799         struct detailed_mode_closure closure = {
3800                 .connector = connector,
3801                 .drm_edid = drm_edid,
3802         };
3803
3804         if (drm_edid->edid->revision >= 1)
3805                 drm_for_each_detailed_block(drm_edid, do_inferred_modes, &closure);
3806
3807         return closure.modes;
3808 }
3809
3810 static int
3811 drm_est3_modes(struct drm_connector *connector, const struct detailed_timing *timing)
3812 {
3813         int i, j, m, modes = 0;
3814         struct drm_display_mode *mode;
3815         const u8 *est = ((const u8 *)timing) + 6;
3816
3817         for (i = 0; i < 6; i++) {
3818                 for (j = 7; j >= 0; j--) {
3819                         m = (i * 8) + (7 - j);
3820                         if (m >= ARRAY_SIZE(est3_modes))
3821                                 break;
3822                         if (est[i] & (1 << j)) {
3823                                 mode = drm_mode_find_dmt(connector->dev,
3824                                                          est3_modes[m].w,
3825                                                          est3_modes[m].h,
3826                                                          est3_modes[m].r,
3827                                                          est3_modes[m].rb);
3828                                 if (mode) {
3829                                         drm_mode_probed_add(connector, mode);
3830                                         modes++;
3831                                 }
3832                         }
3833                 }
3834         }
3835
3836         return modes;
3837 }
3838
3839 static void
3840 do_established_modes(const struct detailed_timing *timing, void *c)
3841 {
3842         struct detailed_mode_closure *closure = c;
3843
3844         if (!is_display_descriptor(timing, EDID_DETAIL_EST_TIMINGS))
3845                 return;
3846
3847         closure->modes += drm_est3_modes(closure->connector, timing);
3848 }
3849
3850 /*
3851  * Get established modes from EDID and add them. Each EDID block contains a
3852  * bitmap of the supported "established modes" list (defined above). Tease them
3853  * out and add them to the global modes list.
3854  */
3855 static int add_established_modes(struct drm_connector *connector,
3856                                  const struct drm_edid *drm_edid)
3857 {
3858         struct drm_device *dev = connector->dev;
3859         const struct edid *edid = drm_edid->edid;
3860         unsigned long est_bits = edid->established_timings.t1 |
3861                 (edid->established_timings.t2 << 8) |
3862                 ((edid->established_timings.mfg_rsvd & 0x80) << 9);
3863         int i, modes = 0;
3864         struct detailed_mode_closure closure = {
3865                 .connector = connector,
3866                 .drm_edid = drm_edid,
3867         };
3868
3869         for (i = 0; i <= EDID_EST_TIMINGS; i++) {
3870                 if (est_bits & (1<<i)) {
3871                         struct drm_display_mode *newmode;
3872
3873                         newmode = drm_mode_duplicate(dev, &edid_est_modes[i]);
3874                         if (newmode) {
3875                                 drm_mode_probed_add(connector, newmode);
3876                                 modes++;
3877                         }
3878                 }
3879         }
3880
3881         if (edid->revision >= 1)
3882                 drm_for_each_detailed_block(drm_edid, do_established_modes,
3883                                             &closure);
3884
3885         return modes + closure.modes;
3886 }
3887
3888 static void
3889 do_standard_modes(const struct detailed_timing *timing, void *c)
3890 {
3891         struct detailed_mode_closure *closure = c;
3892         const struct detailed_non_pixel *data = &timing->data.other_data;
3893         struct drm_connector *connector = closure->connector;
3894         int i;
3895
3896         if (!is_display_descriptor(timing, EDID_DETAIL_STD_MODES))
3897                 return;
3898
3899         for (i = 0; i < 6; i++) {
3900                 const struct std_timing *std = &data->data.timings[i];
3901                 struct drm_display_mode *newmode;
3902
3903                 newmode = drm_mode_std(connector, closure->drm_edid, std);
3904                 if (newmode) {
3905                         drm_mode_probed_add(connector, newmode);
3906                         closure->modes++;
3907                 }
3908         }
3909 }
3910
3911 /*
3912  * Get standard modes from EDID and add them. Standard modes can be calculated
3913  * using the appropriate standard (DMT, GTF, or CVT). Grab them from EDID and
3914  * add them to the list.
3915  */
3916 static int add_standard_modes(struct drm_connector *connector,
3917                               const struct drm_edid *drm_edid)
3918 {
3919         int i, modes = 0;
3920         struct detailed_mode_closure closure = {
3921                 .connector = connector,
3922                 .drm_edid = drm_edid,
3923         };
3924
3925         for (i = 0; i < EDID_STD_TIMINGS; i++) {
3926                 struct drm_display_mode *newmode;
3927
3928                 newmode = drm_mode_std(connector, drm_edid,
3929                                        &drm_edid->edid->standard_timings[i]);
3930                 if (newmode) {
3931                         drm_mode_probed_add(connector, newmode);
3932                         modes++;
3933                 }
3934         }
3935
3936         if (drm_edid->edid->revision >= 1)
3937                 drm_for_each_detailed_block(drm_edid, do_standard_modes,
3938                                             &closure);
3939
3940         /* XXX should also look for standard codes in VTB blocks */
3941
3942         return modes + closure.modes;
3943 }
3944
3945 static int drm_cvt_modes(struct drm_connector *connector,
3946                          const struct detailed_timing *timing)
3947 {
3948         int i, j, modes = 0;
3949         struct drm_display_mode *newmode;
3950         struct drm_device *dev = connector->dev;
3951         const struct cvt_timing *cvt;
3952         const int rates[] = { 60, 85, 75, 60, 50 };
3953         const u8 empty[3] = { 0, 0, 0 };
3954
3955         for (i = 0; i < 4; i++) {
3956                 int width, height;
3957
3958                 cvt = &(timing->data.other_data.data.cvt[i]);
3959
3960                 if (!memcmp(cvt->code, empty, 3))
3961                         continue;
3962
3963                 height = (cvt->code[0] + ((cvt->code[1] & 0xf0) << 4) + 1) * 2;
3964                 switch (cvt->code[1] & 0x0c) {
3965                 /* default - because compiler doesn't see that we've enumerated all cases */
3966                 default:
3967                 case 0x00:
3968                         width = height * 4 / 3;
3969                         break;
3970                 case 0x04:
3971                         width = height * 16 / 9;
3972                         break;
3973                 case 0x08:
3974                         width = height * 16 / 10;
3975                         break;
3976                 case 0x0c:
3977                         width = height * 15 / 9;
3978                         break;
3979                 }
3980
3981                 for (j = 1; j < 5; j++) {
3982                         if (cvt->code[2] & (1 << j)) {
3983                                 newmode = drm_cvt_mode(dev, width, height,
3984                                                        rates[j], j == 0,
3985                                                        false, false);
3986                                 if (newmode) {
3987                                         drm_mode_probed_add(connector, newmode);
3988                                         modes++;
3989                                 }
3990                         }
3991                 }
3992         }
3993
3994         return modes;
3995 }
3996
3997 static void
3998 do_cvt_mode(const struct detailed_timing *timing, void *c)
3999 {
4000         struct detailed_mode_closure *closure = c;
4001
4002         if (!is_display_descriptor(timing, EDID_DETAIL_CVT_3BYTE))
4003                 return;
4004
4005         closure->modes += drm_cvt_modes(closure->connector, timing);
4006 }
4007
4008 static int
4009 add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
4010 {
4011         struct detailed_mode_closure closure = {
4012                 .connector = connector,
4013                 .drm_edid = drm_edid,
4014         };
4015
4016         if (drm_edid->edid->revision >= 3)
4017                 drm_for_each_detailed_block(drm_edid, do_cvt_mode, &closure);
4018
4019         /* XXX should also look for CVT codes in VTB blocks */
4020
4021         return closure.modes;
4022 }
4023
4024 static void fixup_detailed_cea_mode_clock(struct drm_connector *connector,
4025                                           struct drm_display_mode *mode);
4026
4027 static void
4028 do_detailed_mode(const struct detailed_timing *timing, void *c)
4029 {
4030         struct detailed_mode_closure *closure = c;
4031         struct drm_display_mode *newmode;
4032
4033         if (!is_detailed_timing_descriptor(timing))
4034                 return;
4035
4036         newmode = drm_mode_detailed(closure->connector,
4037                                     closure->drm_edid, timing);
4038         if (!newmode)
4039                 return;
4040
4041         if (closure->preferred)
4042                 newmode->type |= DRM_MODE_TYPE_PREFERRED;
4043
4044         /*
4045          * Detailed modes are limited to 10kHz pixel clock resolution,
4046          * so fix up anything that looks like CEA/HDMI mode, but the clock
4047          * is just slightly off.
4048          */
4049         fixup_detailed_cea_mode_clock(closure->connector, newmode);
4050
4051         drm_mode_probed_add(closure->connector, newmode);
4052         closure->modes++;
4053         closure->preferred = false;
4054 }
4055
4056 /*
4057  * add_detailed_modes - Add modes from detailed timings
4058  * @connector: attached connector
4059  * @drm_edid: EDID block to scan
4060  */
4061 static int add_detailed_modes(struct drm_connector *connector,
4062                               const struct drm_edid *drm_edid)
4063 {
4064         struct detailed_mode_closure closure = {
4065                 .connector = connector,
4066                 .drm_edid = drm_edid,
4067         };
4068
4069         if (drm_edid->edid->revision >= 4)
4070                 closure.preferred = true; /* first detailed timing is always preferred */
4071         else
4072                 closure.preferred =
4073                         drm_edid->edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING;
4074
4075         drm_for_each_detailed_block(drm_edid, do_detailed_mode, &closure);
4076
4077         return closure.modes;
4078 }
4079
4080 /* CTA-861-H Table 60 - CTA Tag Codes */
4081 #define CTA_DB_AUDIO                    1
4082 #define CTA_DB_VIDEO                    2
4083 #define CTA_DB_VENDOR                   3
4084 #define CTA_DB_SPEAKER                  4
4085 #define CTA_DB_EXTENDED_TAG             7
4086
4087 /* CTA-861-H Table 62 - CTA Extended Tag Codes */
4088 #define CTA_EXT_DB_VIDEO_CAP            0
4089 #define CTA_EXT_DB_VENDOR               1
4090 #define CTA_EXT_DB_HDR_STATIC_METADATA  6
4091 #define CTA_EXT_DB_420_VIDEO_DATA       14
4092 #define CTA_EXT_DB_420_VIDEO_CAP_MAP    15
4093 #define CTA_EXT_DB_HF_EEODB             0x78
4094 #define CTA_EXT_DB_HF_SCDB              0x79
4095
4096 #define EDID_BASIC_AUDIO        (1 << 6)
4097 #define EDID_CEA_YCRCB444       (1 << 5)
4098 #define EDID_CEA_YCRCB422       (1 << 4)
4099 #define EDID_CEA_VCDB_QS        (1 << 6)
4100
4101 /*
4102  * Search EDID for CEA extension block.
4103  *
4104  * FIXME: Prefer not returning pointers to raw EDID data.
4105  */
4106 const u8 *drm_find_edid_extension(const struct drm_edid *drm_edid,
4107                                   int ext_id, int *ext_index)
4108 {
4109         const u8 *edid_ext = NULL;
4110         int i;
4111
4112         /* No EDID or EDID extensions */
4113         if (!drm_edid || !drm_edid_extension_block_count(drm_edid))
4114                 return NULL;
4115
4116         /* Find CEA extension */
4117         for (i = *ext_index; i < drm_edid_extension_block_count(drm_edid); i++) {
4118                 edid_ext = drm_edid_extension_block_data(drm_edid, i);
4119                 if (edid_block_tag(edid_ext) == ext_id)
4120                         break;
4121         }
4122
4123         if (i >= drm_edid_extension_block_count(drm_edid))
4124                 return NULL;
4125
4126         *ext_index = i + 1;
4127
4128         return edid_ext;
4129 }
4130
4131 /* Return true if the EDID has a CTA extension or a DisplayID CTA data block */
4132 static bool drm_edid_has_cta_extension(const struct drm_edid *drm_edid)
4133 {
4134         const struct displayid_block *block;
4135         struct displayid_iter iter;
4136         int ext_index = 0;
4137         bool found = false;
4138
4139         /* Look for a top level CEA extension block */
4140         if (drm_find_edid_extension(drm_edid, CEA_EXT, &ext_index))
4141                 return true;
4142
4143         /* CEA blocks can also be found embedded in a DisplayID block */
4144         displayid_iter_edid_begin(drm_edid, &iter);
4145         displayid_iter_for_each(block, &iter) {
4146                 if (block->tag == DATA_BLOCK_CTA) {
4147                         found = true;
4148                         break;
4149                 }
4150         }
4151         displayid_iter_end(&iter);
4152
4153         return found;
4154 }
4155
4156 static __always_inline const struct drm_display_mode *cea_mode_for_vic(u8 vic)
4157 {
4158         BUILD_BUG_ON(1 + ARRAY_SIZE(edid_cea_modes_1) - 1 != 127);
4159         BUILD_BUG_ON(193 + ARRAY_SIZE(edid_cea_modes_193) - 1 != 219);
4160
4161         if (vic >= 1 && vic < 1 + ARRAY_SIZE(edid_cea_modes_1))
4162                 return &edid_cea_modes_1[vic - 1];
4163         if (vic >= 193 && vic < 193 + ARRAY_SIZE(edid_cea_modes_193))
4164                 return &edid_cea_modes_193[vic - 193];
4165         return NULL;
4166 }
4167
4168 static u8 cea_num_vics(void)
4169 {
4170         return 193 + ARRAY_SIZE(edid_cea_modes_193);
4171 }
4172
4173 static u8 cea_next_vic(u8 vic)
4174 {
4175         if (++vic == 1 + ARRAY_SIZE(edid_cea_modes_1))
4176                 vic = 193;
4177         return vic;
4178 }
4179
4180 /*
4181  * Calculate the alternate clock for the CEA mode
4182  * (60Hz vs. 59.94Hz etc.)
4183  */
4184 static unsigned int
4185 cea_mode_alternate_clock(const struct drm_display_mode *cea_mode)
4186 {
4187         unsigned int clock = cea_mode->clock;
4188
4189         if (drm_mode_vrefresh(cea_mode) % 6 != 0)
4190                 return clock;
4191
4192         /*
4193          * edid_cea_modes contains the 59.94Hz
4194          * variant for 240 and 480 line modes,
4195          * and the 60Hz variant otherwise.
4196          */
4197         if (cea_mode->vdisplay == 240 || cea_mode->vdisplay == 480)
4198                 clock = DIV_ROUND_CLOSEST(clock * 1001, 1000);
4199         else
4200                 clock = DIV_ROUND_CLOSEST(clock * 1000, 1001);
4201
4202         return clock;
4203 }
4204
4205 static bool
4206 cea_mode_alternate_timings(u8 vic, struct drm_display_mode *mode)
4207 {
4208         /*
4209          * For certain VICs the spec allows the vertical
4210          * front porch to vary by one or two lines.
4211          *
4212          * cea_modes[] stores the variant with the shortest
4213          * vertical front porch. We can adjust the mode to
4214          * get the other variants by simply increasing the
4215          * vertical front porch length.
4216          */
4217         BUILD_BUG_ON(cea_mode_for_vic(8)->vtotal != 262 ||
4218                      cea_mode_for_vic(9)->vtotal != 262 ||
4219                      cea_mode_for_vic(12)->vtotal != 262 ||
4220                      cea_mode_for_vic(13)->vtotal != 262 ||
4221                      cea_mode_for_vic(23)->vtotal != 312 ||
4222                      cea_mode_for_vic(24)->vtotal != 312 ||
4223                      cea_mode_for_vic(27)->vtotal != 312 ||
4224                      cea_mode_for_vic(28)->vtotal != 312);
4225
4226         if (((vic == 8 || vic == 9 ||
4227               vic == 12 || vic == 13) && mode->vtotal < 263) ||
4228             ((vic == 23 || vic == 24 ||
4229               vic == 27 || vic == 28) && mode->vtotal < 314)) {
4230                 mode->vsync_start++;
4231                 mode->vsync_end++;
4232                 mode->vtotal++;
4233
4234                 return true;
4235         }
4236
4237         return false;
4238 }
4239
4240 static u8 drm_match_cea_mode_clock_tolerance(const struct drm_display_mode *to_match,
4241                                              unsigned int clock_tolerance)
4242 {
4243         unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
4244         u8 vic;
4245
4246         if (!to_match->clock)
4247                 return 0;
4248
4249         if (to_match->picture_aspect_ratio)
4250                 match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
4251
4252         for (vic = 1; vic < cea_num_vics(); vic = cea_next_vic(vic)) {
4253                 struct drm_display_mode cea_mode;
4254                 unsigned int clock1, clock2;
4255
4256                 drm_mode_init(&cea_mode, cea_mode_for_vic(vic));
4257
4258                 /* Check both 60Hz and 59.94Hz */
4259                 clock1 = cea_mode.clock;
4260                 clock2 = cea_mode_alternate_clock(&cea_mode);
4261
4262                 if (abs(to_match->clock - clock1) > clock_tolerance &&
4263                     abs(to_match->clock - clock2) > clock_tolerance)
4264                         continue;
4265
4266                 do {
4267                         if (drm_mode_match(to_match, &cea_mode, match_flags))
4268                                 return vic;
4269                 } while (cea_mode_alternate_timings(vic, &cea_mode));
4270         }
4271
4272         return 0;
4273 }
4274
4275 /**
4276  * drm_match_cea_mode - look for a CEA mode matching given mode
4277  * @to_match: display mode
4278  *
4279  * Return: The CEA Video ID (VIC) of the mode or 0 if it isn't a CEA-861
4280  * mode.
4281  */
4282 u8 drm_match_cea_mode(const struct drm_display_mode *to_match)
4283 {
4284         unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
4285         u8 vic;
4286
4287         if (!to_match->clock)
4288                 return 0;
4289
4290         if (to_match->picture_aspect_ratio)
4291                 match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
4292
4293         for (vic = 1; vic < cea_num_vics(); vic = cea_next_vic(vic)) {
4294                 struct drm_display_mode cea_mode;
4295                 unsigned int clock1, clock2;
4296
4297                 drm_mode_init(&cea_mode, cea_mode_for_vic(vic));
4298
4299                 /* Check both 60Hz and 59.94Hz */
4300                 clock1 = cea_mode.clock;
4301                 clock2 = cea_mode_alternate_clock(&cea_mode);
4302
4303                 if (KHZ2PICOS(to_match->clock) != KHZ2PICOS(clock1) &&
4304                     KHZ2PICOS(to_match->clock) != KHZ2PICOS(clock2))
4305                         continue;
4306
4307                 do {
4308                         if (drm_mode_match(to_match, &cea_mode, match_flags))
4309                                 return vic;
4310                 } while (cea_mode_alternate_timings(vic, &cea_mode));
4311         }
4312
4313         return 0;
4314 }
4315 EXPORT_SYMBOL(drm_match_cea_mode);
4316
4317 static bool drm_valid_cea_vic(u8 vic)
4318 {
4319         return cea_mode_for_vic(vic) != NULL;
4320 }
4321
4322 static enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code)
4323 {
4324         const struct drm_display_mode *mode = cea_mode_for_vic(video_code);
4325
4326         if (mode)
4327                 return mode->picture_aspect_ratio;
4328
4329         return HDMI_PICTURE_ASPECT_NONE;
4330 }
4331
4332 static enum hdmi_picture_aspect drm_get_hdmi_aspect_ratio(const u8 video_code)
4333 {
4334         return edid_4k_modes[video_code].picture_aspect_ratio;
4335 }
4336
4337 /*
4338  * Calculate the alternate clock for HDMI modes (those from the HDMI vendor
4339  * specific block).
4340  */
4341 static unsigned int
4342 hdmi_mode_alternate_clock(const struct drm_display_mode *hdmi_mode)
4343 {
4344         return cea_mode_alternate_clock(hdmi_mode);
4345 }
4346
4347 static u8 drm_match_hdmi_mode_clock_tolerance(const struct drm_display_mode *to_match,
4348                                               unsigned int clock_tolerance)
4349 {
4350         unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
4351         u8 vic;
4352
4353         if (!to_match->clock)
4354                 return 0;
4355
4356         if (to_match->picture_aspect_ratio)
4357                 match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
4358
4359         for (vic = 1; vic < ARRAY_SIZE(edid_4k_modes); vic++) {
4360                 const struct drm_display_mode *hdmi_mode = &edid_4k_modes[vic];
4361                 unsigned int clock1, clock2;
4362
4363                 /* Make sure to also match alternate clocks */
4364                 clock1 = hdmi_mode->clock;
4365                 clock2 = hdmi_mode_alternate_clock(hdmi_mode);
4366
4367                 if (abs(to_match->clock - clock1) > clock_tolerance &&
4368                     abs(to_match->clock - clock2) > clock_tolerance)
4369                         continue;
4370
4371                 if (drm_mode_match(to_match, hdmi_mode, match_flags))
4372                         return vic;
4373         }
4374
4375         return 0;
4376 }
4377
4378 /*
4379  * drm_match_hdmi_mode - look for a HDMI mode matching given mode
4380  * @to_match: display mode
4381  *
4382  * An HDMI mode is one defined in the HDMI vendor specific block.
4383  *
4384  * Returns the HDMI Video ID (VIC) of the mode or 0 if it isn't one.
4385  */
4386 static u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match)
4387 {
4388         unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
4389         u8 vic;
4390
4391         if (!to_match->clock)
4392                 return 0;
4393
4394         if (to_match->picture_aspect_ratio)
4395                 match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
4396
4397         for (vic = 1; vic < ARRAY_SIZE(edid_4k_modes); vic++) {
4398                 const struct drm_display_mode *hdmi_mode = &edid_4k_modes[vic];
4399                 unsigned int clock1, clock2;
4400
4401                 /* Make sure to also match alternate clocks */
4402                 clock1 = hdmi_mode->clock;
4403                 clock2 = hdmi_mode_alternate_clock(hdmi_mode);
4404
4405                 if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
4406                      KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
4407                     drm_mode_match(to_match, hdmi_mode, match_flags))
4408                         return vic;
4409         }
4410         return 0;
4411 }
4412
4413 static bool drm_valid_hdmi_vic(u8 vic)
4414 {
4415         return vic > 0 && vic < ARRAY_SIZE(edid_4k_modes);
4416 }
4417
4418 static int add_alternate_cea_modes(struct drm_connector *connector,
4419                                    const struct drm_edid *drm_edid)
4420 {
4421         struct drm_device *dev = connector->dev;
4422         struct drm_display_mode *mode, *tmp;
4423         LIST_HEAD(list);
4424         int modes = 0;
4425
4426         /* Don't add CTA modes if the CTA extension block is missing */
4427         if (!drm_edid_has_cta_extension(drm_edid))
4428                 return 0;
4429
4430         /*
4431          * Go through all probed modes and create a new mode
4432          * with the alternate clock for certain CEA modes.
4433          */
4434         list_for_each_entry(mode, &connector->probed_modes, head) {
4435                 const struct drm_display_mode *cea_mode = NULL;
4436                 struct drm_display_mode *newmode;
4437                 u8 vic = drm_match_cea_mode(mode);
4438                 unsigned int clock1, clock2;
4439
4440                 if (drm_valid_cea_vic(vic)) {
4441                         cea_mode = cea_mode_for_vic(vic);
4442                         clock2 = cea_mode_alternate_clock(cea_mode);
4443                 } else {
4444                         vic = drm_match_hdmi_mode(mode);
4445                         if (drm_valid_hdmi_vic(vic)) {
4446                                 cea_mode = &edid_4k_modes[vic];
4447                                 clock2 = hdmi_mode_alternate_clock(cea_mode);
4448                         }
4449                 }
4450
4451                 if (!cea_mode)
4452                         continue;
4453
4454                 clock1 = cea_mode->clock;
4455
4456                 if (clock1 == clock2)
4457                         continue;
4458
4459                 if (mode->clock != clock1 && mode->clock != clock2)
4460                         continue;
4461
4462                 newmode = drm_mode_duplicate(dev, cea_mode);
4463                 if (!newmode)
4464                         continue;
4465
4466                 /* Carry over the stereo flags */
4467                 newmode->flags |= mode->flags & DRM_MODE_FLAG_3D_MASK;
4468
4469                 /*
4470                  * The current mode could be either variant. Make
4471                  * sure to pick the "other" clock for the new mode.
4472                  */
4473                 if (mode->clock != clock1)
4474                         newmode->clock = clock1;
4475                 else
4476                         newmode->clock = clock2;
4477
4478                 list_add_tail(&newmode->head, &list);
4479         }
4480
4481         list_for_each_entry_safe(mode, tmp, &list, head) {
4482                 list_del(&mode->head);
4483                 drm_mode_probed_add(connector, mode);
4484                 modes++;
4485         }
4486
4487         return modes;
4488 }
4489
4490 static u8 svd_to_vic(u8 svd)
4491 {
4492         /* 0-6 bit vic, 7th bit native mode indicator */
4493         if ((svd >= 1 &&  svd <= 64) || (svd >= 129 && svd <= 192))
4494                 return svd & 127;
4495
4496         return svd;
4497 }
4498
4499 /*
4500  * Return a display mode for the 0-based vic_index'th VIC across all CTA VDBs in
4501  * the EDID, or NULL on errors.
4502  */
4503 static struct drm_display_mode *
4504 drm_display_mode_from_vic_index(struct drm_connector *connector, int vic_index)
4505 {
4506         const struct drm_display_info *info = &connector->display_info;
4507         struct drm_device *dev = connector->dev;
4508
4509         if (!info->vics || vic_index >= info->vics_len || !info->vics[vic_index])
4510                 return NULL;
4511
4512         return drm_display_mode_from_cea_vic(dev, info->vics[vic_index]);
4513 }
4514
4515 /*
4516  * do_y420vdb_modes - Parse YCBCR 420 only modes
4517  * @connector: connector corresponding to the HDMI sink
4518  * @svds: start of the data block of CEA YCBCR 420 VDB
4519  * @len: length of the CEA YCBCR 420 VDB
4520  *
4521  * Parse the CEA-861-F YCBCR 420 Video Data Block (Y420VDB)
4522  * which contains modes which can be supported in YCBCR 420
4523  * output format only.
4524  */
4525 static int do_y420vdb_modes(struct drm_connector *connector,
4526                             const u8 *svds, u8 svds_len)
4527 {
4528         struct drm_device *dev = connector->dev;
4529         int modes = 0, i;
4530
4531         for (i = 0; i < svds_len; i++) {
4532                 u8 vic = svd_to_vic(svds[i]);
4533                 struct drm_display_mode *newmode;
4534
4535                 if (!drm_valid_cea_vic(vic))
4536                         continue;
4537
4538                 newmode = drm_mode_duplicate(dev, cea_mode_for_vic(vic));
4539                 if (!newmode)
4540                         break;
4541                 drm_mode_probed_add(connector, newmode);
4542                 modes++;
4543         }
4544
4545         return modes;
4546 }
4547
4548 /**
4549  * drm_display_mode_from_cea_vic() - return a mode for CEA VIC
4550  * @dev: DRM device
4551  * @video_code: CEA VIC of the mode
4552  *
4553  * Creates a new mode matching the specified CEA VIC.
4554  *
4555  * Returns: A new drm_display_mode on success or NULL on failure
4556  */
4557 struct drm_display_mode *
4558 drm_display_mode_from_cea_vic(struct drm_device *dev,
4559                               u8 video_code)
4560 {
4561         const struct drm_display_mode *cea_mode;
4562         struct drm_display_mode *newmode;
4563
4564         cea_mode = cea_mode_for_vic(video_code);
4565         if (!cea_mode)
4566                 return NULL;
4567
4568         newmode = drm_mode_duplicate(dev, cea_mode);
4569         if (!newmode)
4570                 return NULL;
4571
4572         return newmode;
4573 }
4574 EXPORT_SYMBOL(drm_display_mode_from_cea_vic);
4575
4576 /* Add modes based on VICs parsed in parse_cta_vdb() */
4577 static int add_cta_vdb_modes(struct drm_connector *connector)
4578 {
4579         const struct drm_display_info *info = &connector->display_info;
4580         int i, modes = 0;
4581
4582         if (!info->vics)
4583                 return 0;
4584
4585         for (i = 0; i < info->vics_len; i++) {
4586                 struct drm_display_mode *mode;
4587
4588                 mode = drm_display_mode_from_vic_index(connector, i);
4589                 if (mode) {
4590                         drm_mode_probed_add(connector, mode);
4591                         modes++;
4592                 }
4593         }
4594
4595         return modes;
4596 }
4597
4598 struct stereo_mandatory_mode {
4599         int width, height, vrefresh;
4600         unsigned int flags;
4601 };
4602
4603 static const struct stereo_mandatory_mode stereo_mandatory_modes[] = {
4604         { 1920, 1080, 24, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
4605         { 1920, 1080, 24, DRM_MODE_FLAG_3D_FRAME_PACKING },
4606         { 1920, 1080, 50,
4607           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF },
4608         { 1920, 1080, 60,
4609           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF },
4610         { 1280, 720,  50, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
4611         { 1280, 720,  50, DRM_MODE_FLAG_3D_FRAME_PACKING },
4612         { 1280, 720,  60, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
4613         { 1280, 720,  60, DRM_MODE_FLAG_3D_FRAME_PACKING }
4614 };
4615
4616 static bool
4617 stereo_match_mandatory(const struct drm_display_mode *mode,
4618                        const struct stereo_mandatory_mode *stereo_mode)
4619 {
4620         unsigned int interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
4621
4622         return mode->hdisplay == stereo_mode->width &&
4623                mode->vdisplay == stereo_mode->height &&
4624                interlaced == (stereo_mode->flags & DRM_MODE_FLAG_INTERLACE) &&
4625                drm_mode_vrefresh(mode) == stereo_mode->vrefresh;
4626 }
4627
4628 static int add_hdmi_mandatory_stereo_modes(struct drm_connector *connector)
4629 {
4630         struct drm_device *dev = connector->dev;
4631         const struct drm_display_mode *mode;
4632         struct list_head stereo_modes;
4633         int modes = 0, i;
4634
4635         INIT_LIST_HEAD(&stereo_modes);
4636
4637         list_for_each_entry(mode, &connector->probed_modes, head) {
4638                 for (i = 0; i < ARRAY_SIZE(stereo_mandatory_modes); i++) {
4639                         const struct stereo_mandatory_mode *mandatory;
4640                         struct drm_display_mode *new_mode;
4641
4642                         if (!stereo_match_mandatory(mode,
4643                                                     &stereo_mandatory_modes[i]))
4644                                 continue;
4645
4646                         mandatory = &stereo_mandatory_modes[i];
4647                         new_mode = drm_mode_duplicate(dev, mode);
4648                         if (!new_mode)
4649                                 continue;
4650
4651                         new_mode->flags |= mandatory->flags;
4652                         list_add_tail(&new_mode->head, &stereo_modes);
4653                         modes++;
4654                 }
4655         }
4656
4657         list_splice_tail(&stereo_modes, &connector->probed_modes);
4658
4659         return modes;
4660 }
4661
4662 static int add_hdmi_mode(struct drm_connector *connector, u8 vic)
4663 {
4664         struct drm_device *dev = connector->dev;
4665         struct drm_display_mode *newmode;
4666
4667         if (!drm_valid_hdmi_vic(vic)) {
4668                 drm_err(connector->dev, "[CONNECTOR:%d:%s] Unknown HDMI VIC: %d\n",
4669                         connector->base.id, connector->name, vic);
4670                 return 0;
4671         }
4672
4673         newmode = drm_mode_duplicate(dev, &edid_4k_modes[vic]);
4674         if (!newmode)
4675                 return 0;
4676
4677         drm_mode_probed_add(connector, newmode);
4678
4679         return 1;
4680 }
4681
4682 static int add_3d_struct_modes(struct drm_connector *connector, u16 structure,
4683                                int vic_index)
4684 {
4685         struct drm_display_mode *newmode;
4686         int modes = 0;
4687
4688         if (structure & (1 << 0)) {
4689                 newmode = drm_display_mode_from_vic_index(connector, vic_index);
4690                 if (newmode) {
4691                         newmode->flags |= DRM_MODE_FLAG_3D_FRAME_PACKING;
4692                         drm_mode_probed_add(connector, newmode);
4693                         modes++;
4694                 }
4695         }
4696         if (structure & (1 << 6)) {
4697                 newmode = drm_display_mode_from_vic_index(connector, vic_index);
4698                 if (newmode) {
4699                         newmode->flags |= DRM_MODE_FLAG_3D_TOP_AND_BOTTOM;
4700                         drm_mode_probed_add(connector, newmode);
4701                         modes++;
4702                 }
4703         }
4704         if (structure & (1 << 8)) {
4705                 newmode = drm_display_mode_from_vic_index(connector, vic_index);
4706                 if (newmode) {
4707                         newmode->flags |= DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF;
4708                         drm_mode_probed_add(connector, newmode);
4709                         modes++;
4710                 }
4711         }
4712
4713         return modes;
4714 }
4715
4716 static bool hdmi_vsdb_latency_present(const u8 *db)
4717 {
4718         return db[8] & BIT(7);
4719 }
4720
4721 static bool hdmi_vsdb_i_latency_present(const u8 *db)
4722 {
4723         return hdmi_vsdb_latency_present(db) && db[8] & BIT(6);
4724 }
4725
4726 static int hdmi_vsdb_latency_length(const u8 *db)
4727 {
4728         if (hdmi_vsdb_i_latency_present(db))
4729                 return 4;
4730         else if (hdmi_vsdb_latency_present(db))
4731                 return 2;
4732         else
4733                 return 0;
4734 }
4735
4736 /*
4737  * do_hdmi_vsdb_modes - Parse the HDMI Vendor Specific data block
4738  * @connector: connector corresponding to the HDMI sink
4739  * @db: start of the CEA vendor specific block
4740  * @len: length of the CEA block payload, ie. one can access up to db[len]
4741  *
4742  * Parses the HDMI VSDB looking for modes to add to @connector. This function
4743  * also adds the stereo 3d modes when applicable.
4744  */
4745 static int
4746 do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len)
4747 {
4748         int modes = 0, offset = 0, i, multi_present = 0, multi_len;
4749         u8 vic_len, hdmi_3d_len = 0;
4750         u16 mask;
4751         u16 structure_all;
4752
4753         if (len < 8)
4754                 goto out;
4755
4756         /* no HDMI_Video_Present */
4757         if (!(db[8] & (1 << 5)))
4758                 goto out;
4759
4760         offset += hdmi_vsdb_latency_length(db);
4761
4762         /* the declared length is not long enough for the 2 first bytes
4763          * of additional video format capabilities */
4764         if (len < (8 + offset + 2))
4765                 goto out;
4766
4767         /* 3D_Present */
4768         offset++;
4769         if (db[8 + offset] & (1 << 7)) {
4770                 modes += add_hdmi_mandatory_stereo_modes(connector);
4771
4772                 /* 3D_Multi_present */
4773                 multi_present = (db[8 + offset] & 0x60) >> 5;
4774         }
4775
4776         offset++;
4777         vic_len = db[8 + offset] >> 5;
4778         hdmi_3d_len = db[8 + offset] & 0x1f;
4779
4780         for (i = 0; i < vic_len && len >= (9 + offset + i); i++) {
4781                 u8 vic;
4782
4783                 vic = db[9 + offset + i];
4784                 modes += add_hdmi_mode(connector, vic);
4785         }
4786         offset += 1 + vic_len;
4787
4788         if (multi_present == 1)
4789                 multi_len = 2;
4790         else if (multi_present == 2)
4791                 multi_len = 4;
4792         else
4793                 multi_len = 0;
4794
4795         if (len < (8 + offset + hdmi_3d_len - 1))
4796                 goto out;
4797
4798         if (hdmi_3d_len < multi_len)
4799                 goto out;
4800
4801         if (multi_present == 1 || multi_present == 2) {
4802                 /* 3D_Structure_ALL */
4803                 structure_all = (db[8 + offset] << 8) | db[9 + offset];
4804
4805                 /* check if 3D_MASK is present */
4806                 if (multi_present == 2)
4807                         mask = (db[10 + offset] << 8) | db[11 + offset];
4808                 else
4809                         mask = 0xffff;
4810
4811                 for (i = 0; i < 16; i++) {
4812                         if (mask & (1 << i))
4813                                 modes += add_3d_struct_modes(connector,
4814                                                              structure_all, i);
4815                 }
4816         }
4817
4818         offset += multi_len;
4819
4820         for (i = 0; i < (hdmi_3d_len - multi_len); i++) {
4821                 int vic_index;
4822                 struct drm_display_mode *newmode = NULL;
4823                 unsigned int newflag = 0;
4824                 bool detail_present;
4825
4826                 detail_present = ((db[8 + offset + i] & 0x0f) > 7);
4827
4828                 if (detail_present && (i + 1 == hdmi_3d_len - multi_len))
4829                         break;
4830
4831                 /* 2D_VIC_order_X */
4832                 vic_index = db[8 + offset + i] >> 4;
4833
4834                 /* 3D_Structure_X */
4835                 switch (db[8 + offset + i] & 0x0f) {
4836                 case 0:
4837                         newflag = DRM_MODE_FLAG_3D_FRAME_PACKING;
4838                         break;
4839                 case 6:
4840                         newflag = DRM_MODE_FLAG_3D_TOP_AND_BOTTOM;
4841                         break;
4842                 case 8:
4843                         /* 3D_Detail_X */
4844                         if ((db[9 + offset + i] >> 4) == 1)
4845                                 newflag = DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF;
4846                         break;
4847                 }
4848
4849                 if (newflag != 0) {
4850                         newmode = drm_display_mode_from_vic_index(connector,
4851                                                                   vic_index);
4852
4853                         if (newmode) {
4854                                 newmode->flags |= newflag;
4855                                 drm_mode_probed_add(connector, newmode);
4856                                 modes++;
4857                         }
4858                 }
4859
4860                 if (detail_present)
4861                         i++;
4862         }
4863
4864 out:
4865         return modes;
4866 }
4867
4868 static int
4869 cea_revision(const u8 *cea)
4870 {
4871         /*
4872          * FIXME is this correct for the DispID variant?
4873          * The DispID spec doesn't really specify whether
4874          * this is the revision of the CEA extension or
4875          * the DispID CEA data block. And the only value
4876          * given as an example is 0.
4877          */
4878         return cea[1];
4879 }
4880
4881 /*
4882  * CTA Data Block iterator.
4883  *
4884  * Iterate through all CTA Data Blocks in both EDID CTA Extensions and DisplayID
4885  * CTA Data Blocks.
4886  *
4887  * struct cea_db *db:
4888  * struct cea_db_iter iter;
4889  *
4890  * cea_db_iter_edid_begin(edid, &iter);
4891  * cea_db_iter_for_each(db, &iter) {
4892  *         // do stuff with db
4893  * }
4894  * cea_db_iter_end(&iter);
4895  */
4896 struct cea_db_iter {
4897         struct drm_edid_iter edid_iter;
4898         struct displayid_iter displayid_iter;
4899
4900         /* Current Data Block Collection. */
4901         const u8 *collection;
4902
4903         /* Current Data Block index in current collection. */
4904         int index;
4905
4906         /* End index in current collection. */
4907         int end;
4908 };
4909
4910 /* CTA-861-H section 7.4 CTA Data BLock Collection */
4911 struct cea_db {
4912         u8 tag_length;
4913         u8 data[];
4914 } __packed;
4915
4916 static int cea_db_tag(const struct cea_db *db)
4917 {
4918         return db->tag_length >> 5;
4919 }
4920
4921 static int cea_db_payload_len(const void *_db)
4922 {
4923         /* FIXME: Transition to passing struct cea_db * everywhere. */
4924         const struct cea_db *db = _db;
4925
4926         return db->tag_length & 0x1f;
4927 }
4928
4929 static const void *cea_db_data(const struct cea_db *db)
4930 {
4931         return db->data;
4932 }
4933
4934 static bool cea_db_is_extended_tag(const struct cea_db *db, int tag)
4935 {
4936         return cea_db_tag(db) == CTA_DB_EXTENDED_TAG &&
4937                 cea_db_payload_len(db) >= 1 &&
4938                 db->data[0] == tag;
4939 }
4940
4941 static bool cea_db_is_vendor(const struct cea_db *db, int vendor_oui)
4942 {
4943         const u8 *data = cea_db_data(db);
4944
4945         return cea_db_tag(db) == CTA_DB_VENDOR &&
4946                 cea_db_payload_len(db) >= 3 &&
4947                 oui(data[2], data[1], data[0]) == vendor_oui;
4948 }
4949
4950 static void cea_db_iter_edid_begin(const struct drm_edid *drm_edid,
4951                                    struct cea_db_iter *iter)
4952 {
4953         memset(iter, 0, sizeof(*iter));
4954
4955         drm_edid_iter_begin(drm_edid, &iter->edid_iter);
4956         displayid_iter_edid_begin(drm_edid, &iter->displayid_iter);
4957 }
4958
4959 static const struct cea_db *
4960 __cea_db_iter_current_block(const struct cea_db_iter *iter)
4961 {
4962         const struct cea_db *db;
4963
4964         if (!iter->collection)
4965                 return NULL;
4966
4967         db = (const struct cea_db *)&iter->collection[iter->index];
4968
4969         if (iter->index + sizeof(*db) <= iter->end &&
4970             iter->index + sizeof(*db) + cea_db_payload_len(db) <= iter->end)
4971                 return db;
4972
4973         return NULL;
4974 }
4975
4976 /*
4977  * References:
4978  * - CTA-861-H section 7.3.3 CTA Extension Version 3
4979  */
4980 static int cea_db_collection_size(const u8 *cta)
4981 {
4982         u8 d = cta[2];
4983
4984         if (d < 4 || d > 127)
4985                 return 0;
4986
4987         return d - 4;
4988 }
4989
4990 /*
4991  * References:
4992  * - VESA E-EDID v1.4
4993  * - CTA-861-H section 7.3.3 CTA Extension Version 3
4994  */
4995 static const void *__cea_db_iter_edid_next(struct cea_db_iter *iter)
4996 {
4997         const u8 *ext;
4998
4999         drm_edid_iter_for_each(ext, &iter->edid_iter) {
5000                 int size;
5001
5002                 /* Only support CTA Extension revision 3+ */
5003                 if (ext[0] != CEA_EXT || cea_revision(ext) < 3)
5004                         continue;
5005
5006                 size = cea_db_collection_size(ext);
5007                 if (!size)
5008                         continue;
5009
5010                 iter->index = 4;
5011                 iter->end = iter->index + size;
5012
5013                 return ext;
5014         }
5015
5016         return NULL;
5017 }
5018
5019 /*
5020  * References:
5021  * - DisplayID v1.3 Appendix C: CEA Data Block within a DisplayID Data Block
5022  * - DisplayID v2.0 section 4.10 CTA DisplayID Data Block
5023  *
5024  * Note that the above do not specify any connection between DisplayID Data
5025  * Block revision and CTA Extension versions.
5026  */
5027 static const void *__cea_db_iter_displayid_next(struct cea_db_iter *iter)
5028 {
5029         const struct displayid_block *block;
5030
5031         displayid_iter_for_each(block, &iter->displayid_iter) {
5032                 if (block->tag != DATA_BLOCK_CTA)
5033                         continue;
5034
5035                 /*
5036                  * The displayid iterator has already verified the block bounds
5037                  * in displayid_iter_block().
5038                  */
5039                 iter->index = sizeof(*block);
5040                 iter->end = iter->index + block->num_bytes;
5041
5042                 return block;
5043         }
5044
5045         return NULL;
5046 }
5047
5048 static const struct cea_db *__cea_db_iter_next(struct cea_db_iter *iter)
5049 {
5050         const struct cea_db *db;
5051
5052         if (iter->collection) {
5053                 /* Current collection should always be valid. */
5054                 db = __cea_db_iter_current_block(iter);
5055                 if (WARN_ON(!db)) {
5056                         iter->collection = NULL;
5057                         return NULL;
5058                 }
5059
5060                 /* Next block in CTA Data Block Collection */
5061                 iter->index += sizeof(*db) + cea_db_payload_len(db);
5062
5063                 db = __cea_db_iter_current_block(iter);
5064                 if (db)
5065                         return db;
5066         }
5067
5068         for (;;) {
5069                 /*
5070                  * Find the next CTA Data Block Collection. First iterate all
5071                  * the EDID CTA Extensions, then all the DisplayID CTA blocks.
5072                  *
5073                  * Per DisplayID v1.3 Appendix B: DisplayID as an EDID
5074                  * Extension, it's recommended that DisplayID extensions are
5075                  * exposed after all of the CTA Extensions.
5076                  */
5077                 iter->collection = __cea_db_iter_edid_next(iter);
5078                 if (!iter->collection)
5079                         iter->collection = __cea_db_iter_displayid_next(iter);
5080
5081                 if (!iter->collection)
5082                         return NULL;
5083
5084                 db = __cea_db_iter_current_block(iter);
5085                 if (db)
5086                         return db;
5087         }
5088 }
5089
5090 #define cea_db_iter_for_each(__db, __iter) \
5091         while (((__db) = __cea_db_iter_next(__iter)))
5092
5093 static void cea_db_iter_end(struct cea_db_iter *iter)
5094 {
5095         displayid_iter_end(&iter->displayid_iter);
5096         drm_edid_iter_end(&iter->edid_iter);
5097
5098         memset(iter, 0, sizeof(*iter));
5099 }
5100
5101 static bool cea_db_is_hdmi_vsdb(const struct cea_db *db)
5102 {
5103         return cea_db_is_vendor(db, HDMI_IEEE_OUI) &&
5104                 cea_db_payload_len(db) >= 5;
5105 }
5106
5107 static bool cea_db_is_hdmi_forum_vsdb(const struct cea_db *db)
5108 {
5109         return cea_db_is_vendor(db, HDMI_FORUM_IEEE_OUI) &&
5110                 cea_db_payload_len(db) >= 7;
5111 }
5112
5113 static bool cea_db_is_hdmi_forum_eeodb(const void *db)
5114 {
5115         return cea_db_is_extended_tag(db, CTA_EXT_DB_HF_EEODB) &&
5116                 cea_db_payload_len(db) >= 2;
5117 }
5118
5119 static bool cea_db_is_microsoft_vsdb(const struct cea_db *db)
5120 {
5121         return cea_db_is_vendor(db, MICROSOFT_IEEE_OUI) &&
5122                 cea_db_payload_len(db) == 21;
5123 }
5124
5125 static bool cea_db_is_vcdb(const struct cea_db *db)
5126 {
5127         return cea_db_is_extended_tag(db, CTA_EXT_DB_VIDEO_CAP) &&
5128                 cea_db_payload_len(db) == 2;
5129 }
5130
5131 static bool cea_db_is_hdmi_forum_scdb(const struct cea_db *db)
5132 {
5133         return cea_db_is_extended_tag(db, CTA_EXT_DB_HF_SCDB) &&
5134                 cea_db_payload_len(db) >= 7;
5135 }
5136
5137 static bool cea_db_is_y420cmdb(const struct cea_db *db)
5138 {
5139         return cea_db_is_extended_tag(db, CTA_EXT_DB_420_VIDEO_CAP_MAP);
5140 }
5141
5142 static bool cea_db_is_y420vdb(const struct cea_db *db)
5143 {
5144         return cea_db_is_extended_tag(db, CTA_EXT_DB_420_VIDEO_DATA);
5145 }
5146
5147 static bool cea_db_is_hdmi_hdr_metadata_block(const struct cea_db *db)
5148 {
5149         return cea_db_is_extended_tag(db, CTA_EXT_DB_HDR_STATIC_METADATA) &&
5150                 cea_db_payload_len(db) >= 3;
5151 }
5152
5153 /*
5154  * Get the HF-EEODB override extension block count from EDID.
5155  *
5156  * The passed in EDID may be partially read, as long as it has at least two
5157  * blocks (base block and one extension block) if EDID extension count is > 0.
5158  *
5159  * Note that this is *not* how you should parse CTA Data Blocks in general; this
5160  * is only to handle partially read EDIDs. Normally, use the CTA Data Block
5161  * iterators instead.
5162  *
5163  * References:
5164  * - HDMI 2.1 section 10.3.6 HDMI Forum EDID Extension Override Data Block
5165  */
5166 static int edid_hfeeodb_extension_block_count(const struct edid *edid)
5167 {
5168         const u8 *cta;
5169
5170         /* No extensions according to base block, no HF-EEODB. */
5171         if (!edid_extension_block_count(edid))
5172                 return 0;
5173
5174         /* HF-EEODB is always in the first EDID extension block only */
5175         cta = edid_extension_block_data(edid, 0);
5176         if (edid_block_tag(cta) != CEA_EXT || cea_revision(cta) < 3)
5177                 return 0;
5178
5179         /* Need to have the data block collection, and at least 3 bytes. */
5180         if (cea_db_collection_size(cta) < 3)
5181                 return 0;
5182
5183         /*
5184          * Sinks that include the HF-EEODB in their E-EDID shall include one and
5185          * only one instance of the HF-EEODB in the E-EDID, occupying bytes 4
5186          * through 6 of Block 1 of the E-EDID.
5187          */
5188         if (!cea_db_is_hdmi_forum_eeodb(&cta[4]))
5189                 return 0;
5190
5191         return cta[4 + 2];
5192 }
5193
5194 /*
5195  * CTA-861 YCbCr 4:2:0 Capability Map Data Block (CTA Y420CMDB)
5196  *
5197  * Y420CMDB contains a bitmap which gives the index of CTA modes from CTA VDB,
5198  * which can support YCBCR 420 sampling output also (apart from RGB/YCBCR444
5199  * etc). For example, if the bit 0 in bitmap is set, first mode in VDB can
5200  * support YCBCR420 output too.
5201  */
5202 static void parse_cta_y420cmdb(struct drm_connector *connector,
5203                                const struct cea_db *db, u64 *y420cmdb_map)
5204 {
5205         struct drm_display_info *info = &connector->display_info;
5206         int i, map_len = cea_db_payload_len(db) - 1;
5207         const u8 *data = cea_db_data(db) + 1;
5208         u64 map = 0;
5209
5210         if (map_len == 0) {
5211                 /* All CEA modes support ycbcr420 sampling also.*/
5212                 map = U64_MAX;
5213                 goto out;
5214         }
5215
5216         /*
5217          * This map indicates which of the existing CEA block modes
5218          * from VDB can support YCBCR420 output too. So if bit=0 is
5219          * set, first mode from VDB can support YCBCR420 output too.
5220          * We will parse and keep this map, before parsing VDB itself
5221          * to avoid going through the same block again and again.
5222          *
5223          * Spec is not clear about max possible size of this block.
5224          * Clamping max bitmap block size at 8 bytes. Every byte can
5225          * address 8 CEA modes, in this way this map can address
5226          * 8*8 = first 64 SVDs.
5227          */
5228         if (WARN_ON_ONCE(map_len > 8))
5229                 map_len = 8;
5230
5231         for (i = 0; i < map_len; i++)
5232                 map |= (u64)data[i] << (8 * i);
5233
5234 out:
5235         if (map)
5236                 info->color_formats |= DRM_COLOR_FORMAT_YCBCR420;
5237
5238         *y420cmdb_map = map;
5239 }
5240
5241 static int add_cea_modes(struct drm_connector *connector,
5242                          const struct drm_edid *drm_edid)
5243 {
5244         const struct cea_db *db;
5245         struct cea_db_iter iter;
5246         int modes;
5247
5248         /* CTA VDB block VICs parsed earlier */
5249         modes = add_cta_vdb_modes(connector);
5250
5251         cea_db_iter_edid_begin(drm_edid, &iter);
5252         cea_db_iter_for_each(db, &iter) {
5253                 if (cea_db_is_hdmi_vsdb(db)) {
5254                         modes += do_hdmi_vsdb_modes(connector, (const u8 *)db,
5255                                                     cea_db_payload_len(db));
5256                 } else if (cea_db_is_y420vdb(db)) {
5257                         const u8 *vdb420 = cea_db_data(db) + 1;
5258
5259                         /* Add 4:2:0(only) modes present in EDID */
5260                         modes += do_y420vdb_modes(connector, vdb420,
5261                                                   cea_db_payload_len(db) - 1);
5262                 }
5263         }
5264         cea_db_iter_end(&iter);
5265
5266         return modes;
5267 }
5268
5269 static void fixup_detailed_cea_mode_clock(struct drm_connector *connector,
5270                                           struct drm_display_mode *mode)
5271 {
5272         const struct drm_display_mode *cea_mode;
5273         int clock1, clock2, clock;
5274         u8 vic;
5275         const char *type;
5276
5277         /*
5278          * allow 5kHz clock difference either way to account for
5279          * the 10kHz clock resolution limit of detailed timings.
5280          */
5281         vic = drm_match_cea_mode_clock_tolerance(mode, 5);
5282         if (drm_valid_cea_vic(vic)) {
5283                 type = "CEA";
5284                 cea_mode = cea_mode_for_vic(vic);
5285                 clock1 = cea_mode->clock;
5286                 clock2 = cea_mode_alternate_clock(cea_mode);
5287         } else {
5288                 vic = drm_match_hdmi_mode_clock_tolerance(mode, 5);
5289                 if (drm_valid_hdmi_vic(vic)) {
5290                         type = "HDMI";
5291                         cea_mode = &edid_4k_modes[vic];
5292                         clock1 = cea_mode->clock;
5293                         clock2 = hdmi_mode_alternate_clock(cea_mode);
5294                 } else {
5295                         return;
5296                 }
5297         }
5298
5299         /* pick whichever is closest */
5300         if (abs(mode->clock - clock1) < abs(mode->clock - clock2))
5301                 clock = clock1;
5302         else
5303                 clock = clock2;
5304
5305         if (mode->clock == clock)
5306                 return;
5307
5308         drm_dbg_kms(connector->dev,
5309                     "[CONNECTOR:%d:%s] detailed mode matches %s VIC %d, adjusting clock %d -> %d\n",
5310                     connector->base.id, connector->name,
5311                     type, vic, mode->clock, clock);
5312         mode->clock = clock;
5313 }
5314
5315 static void drm_calculate_luminance_range(struct drm_connector *connector)
5316 {
5317         struct hdr_static_metadata *hdr_metadata = &connector->hdr_sink_metadata.hdmi_type1;
5318         struct drm_luminance_range_info *luminance_range =
5319                 &connector->display_info.luminance_range;
5320         static const u8 pre_computed_values[] = {
5321                 50, 51, 52, 53, 55, 56, 57, 58, 59, 61, 62, 63, 65, 66, 68, 69,
5322                 71, 72, 74, 75, 77, 79, 81, 82, 84, 86, 88, 90, 92, 94, 96, 98
5323         };
5324         u32 max_avg, min_cll, max, min, q, r;
5325
5326         if (!(hdr_metadata->metadata_type & BIT(HDMI_STATIC_METADATA_TYPE1)))
5327                 return;
5328
5329         max_avg = hdr_metadata->max_fall;
5330         min_cll = hdr_metadata->min_cll;
5331
5332         /*
5333          * From the specification (CTA-861-G), for calculating the maximum
5334          * luminance we need to use:
5335          *      Luminance = 50*2**(CV/32)
5336          * Where CV is a one-byte value.
5337          * For calculating this expression we may need float point precision;
5338          * to avoid this complexity level, we take advantage that CV is divided
5339          * by a constant. From the Euclids division algorithm, we know that CV
5340          * can be written as: CV = 32*q + r. Next, we replace CV in the
5341          * Luminance expression and get 50*(2**q)*(2**(r/32)), hence we just
5342          * need to pre-compute the value of r/32. For pre-computing the values
5343          * We just used the following Ruby line:
5344          *      (0...32).each {|cv| puts (50*2**(cv/32.0)).round}
5345          * The results of the above expressions can be verified at
5346          * pre_computed_values.
5347          */
5348         q = max_avg >> 5;
5349         r = max_avg % 32;
5350         max = (1 << q) * pre_computed_values[r];
5351
5352         /* min luminance: maxLum * (CV/255)^2 / 100 */
5353         q = DIV_ROUND_CLOSEST(min_cll, 255);
5354         min = max * DIV_ROUND_CLOSEST((q * q), 100);
5355
5356         luminance_range->min_luminance = min;
5357         luminance_range->max_luminance = max;
5358 }
5359
5360 static uint8_t eotf_supported(const u8 *edid_ext)
5361 {
5362         return edid_ext[2] &
5363                 (BIT(HDMI_EOTF_TRADITIONAL_GAMMA_SDR) |
5364                  BIT(HDMI_EOTF_TRADITIONAL_GAMMA_HDR) |
5365                  BIT(HDMI_EOTF_SMPTE_ST2084) |
5366                  BIT(HDMI_EOTF_BT_2100_HLG));
5367 }
5368
5369 static uint8_t hdr_metadata_type(const u8 *edid_ext)
5370 {
5371         return edid_ext[3] &
5372                 BIT(HDMI_STATIC_METADATA_TYPE1);
5373 }
5374
5375 static void
5376 drm_parse_hdr_metadata_block(struct drm_connector *connector, const u8 *db)
5377 {
5378         u16 len;
5379
5380         len = cea_db_payload_len(db);
5381
5382         connector->hdr_sink_metadata.hdmi_type1.eotf =
5383                                                 eotf_supported(db);
5384         connector->hdr_sink_metadata.hdmi_type1.metadata_type =
5385                                                 hdr_metadata_type(db);
5386
5387         if (len >= 4)
5388                 connector->hdr_sink_metadata.hdmi_type1.max_cll = db[4];
5389         if (len >= 5)
5390                 connector->hdr_sink_metadata.hdmi_type1.max_fall = db[5];
5391         if (len >= 6) {
5392                 connector->hdr_sink_metadata.hdmi_type1.min_cll = db[6];
5393
5394                 /* Calculate only when all values are available */
5395                 drm_calculate_luminance_range(connector);
5396         }
5397 }
5398
5399 /* HDMI Vendor-Specific Data Block (HDMI VSDB, H14b-VSDB) */
5400 static void
5401 drm_parse_hdmi_vsdb_audio(struct drm_connector *connector, const u8 *db)
5402 {
5403         u8 len = cea_db_payload_len(db);
5404
5405         if (len >= 6 && (db[6] & (1 << 7)))
5406                 connector->eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_SUPPORTS_AI;
5407
5408         if (len >= 10 && hdmi_vsdb_latency_present(db)) {
5409                 connector->latency_present[0] = true;
5410                 connector->video_latency[0] = db[9];
5411                 connector->audio_latency[0] = db[10];
5412         }
5413
5414         if (len >= 12 && hdmi_vsdb_i_latency_present(db)) {
5415                 connector->latency_present[1] = true;
5416                 connector->video_latency[1] = db[11];
5417                 connector->audio_latency[1] = db[12];
5418         }
5419
5420         drm_dbg_kms(connector->dev,
5421                     "[CONNECTOR:%d:%s] HDMI: latency present %d %d, video latency %d %d, audio latency %d %d\n",
5422                     connector->base.id, connector->name,
5423                     connector->latency_present[0], connector->latency_present[1],
5424                     connector->video_latency[0], connector->video_latency[1],
5425                     connector->audio_latency[0], connector->audio_latency[1]);
5426 }
5427
5428 static void
5429 monitor_name(const struct detailed_timing *timing, void *data)
5430 {
5431         const char **res = data;
5432
5433         if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_NAME))
5434                 return;
5435
5436         *res = timing->data.other_data.data.str.str;
5437 }
5438
5439 static int get_monitor_name(const struct drm_edid *drm_edid, char name[13])
5440 {
5441         const char *edid_name = NULL;
5442         int mnl;
5443
5444         if (!drm_edid || !name)
5445                 return 0;
5446
5447         drm_for_each_detailed_block(drm_edid, monitor_name, &edid_name);
5448         for (mnl = 0; edid_name && mnl < 13; mnl++) {
5449                 if (edid_name[mnl] == 0x0a)
5450                         break;
5451
5452                 name[mnl] = edid_name[mnl];
5453         }
5454
5455         return mnl;
5456 }
5457
5458 /**
5459  * drm_edid_get_monitor_name - fetch the monitor name from the edid
5460  * @edid: monitor EDID information
5461  * @name: pointer to a character array to hold the name of the monitor
5462  * @bufsize: The size of the name buffer (should be at least 14 chars.)
5463  *
5464  */
5465 void drm_edid_get_monitor_name(const struct edid *edid, char *name, int bufsize)
5466 {
5467         int name_length = 0;
5468
5469         if (bufsize <= 0)
5470                 return;
5471
5472         if (edid) {
5473                 char buf[13];
5474                 struct drm_edid drm_edid = {
5475                         .edid = edid,
5476                         .size = edid_size(edid),
5477                 };
5478
5479                 name_length = min(get_monitor_name(&drm_edid, buf), bufsize - 1);
5480                 memcpy(name, buf, name_length);
5481         }
5482
5483         name[name_length] = '\0';
5484 }
5485 EXPORT_SYMBOL(drm_edid_get_monitor_name);
5486
5487 static void clear_eld(struct drm_connector *connector)
5488 {
5489         memset(connector->eld, 0, sizeof(connector->eld));
5490
5491         connector->latency_present[0] = false;
5492         connector->latency_present[1] = false;
5493         connector->video_latency[0] = 0;
5494         connector->audio_latency[0] = 0;
5495         connector->video_latency[1] = 0;
5496         connector->audio_latency[1] = 0;
5497 }
5498
5499 /*
5500  * drm_edid_to_eld - build ELD from EDID
5501  * @connector: connector corresponding to the HDMI/DP sink
5502  * @drm_edid: EDID to parse
5503  *
5504  * Fill the ELD (EDID-Like Data) buffer for passing to the audio driver. The
5505  * HDCP and Port_ID ELD fields are left for the graphics driver to fill in.
5506  */
5507 static void drm_edid_to_eld(struct drm_connector *connector,
5508                             const struct drm_edid *drm_edid)
5509 {
5510         const struct drm_display_info *info = &connector->display_info;
5511         const struct cea_db *db;
5512         struct cea_db_iter iter;
5513         uint8_t *eld = connector->eld;
5514         int total_sad_count = 0;
5515         int mnl;
5516
5517         if (!drm_edid)
5518                 return;
5519
5520         mnl = get_monitor_name(drm_edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
5521         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] ELD monitor %s\n",
5522                     connector->base.id, connector->name,
5523                     &eld[DRM_ELD_MONITOR_NAME_STRING]);
5524
5525         eld[DRM_ELD_CEA_EDID_VER_MNL] = info->cea_rev << DRM_ELD_CEA_EDID_VER_SHIFT;
5526         eld[DRM_ELD_CEA_EDID_VER_MNL] |= mnl;
5527
5528         eld[DRM_ELD_VER] = DRM_ELD_VER_CEA861D;
5529
5530         eld[DRM_ELD_MANUFACTURER_NAME0] = drm_edid->edid->mfg_id[0];
5531         eld[DRM_ELD_MANUFACTURER_NAME1] = drm_edid->edid->mfg_id[1];
5532         eld[DRM_ELD_PRODUCT_CODE0] = drm_edid->edid->prod_code[0];
5533         eld[DRM_ELD_PRODUCT_CODE1] = drm_edid->edid->prod_code[1];
5534
5535         cea_db_iter_edid_begin(drm_edid, &iter);
5536         cea_db_iter_for_each(db, &iter) {
5537                 const u8 *data = cea_db_data(db);
5538                 int len = cea_db_payload_len(db);
5539                 int sad_count;
5540
5541                 switch (cea_db_tag(db)) {
5542                 case CTA_DB_AUDIO:
5543                         /* Audio Data Block, contains SADs */
5544                         sad_count = min(len / 3, 15 - total_sad_count);
5545                         if (sad_count >= 1)
5546                                 memcpy(&eld[DRM_ELD_CEA_SAD(mnl, total_sad_count)],
5547                                        data, sad_count * 3);
5548                         total_sad_count += sad_count;
5549                         break;
5550                 case CTA_DB_SPEAKER:
5551                         /* Speaker Allocation Data Block */
5552                         if (len >= 1)
5553                                 eld[DRM_ELD_SPEAKER] = data[0];
5554                         break;
5555                 case CTA_DB_VENDOR:
5556                         /* HDMI Vendor-Specific Data Block */
5557                         if (cea_db_is_hdmi_vsdb(db))
5558                                 drm_parse_hdmi_vsdb_audio(connector, (const u8 *)db);
5559                         break;
5560                 default:
5561                         break;
5562                 }
5563         }
5564         cea_db_iter_end(&iter);
5565
5566         eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= total_sad_count << DRM_ELD_SAD_COUNT_SHIFT;
5567
5568         if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
5569             connector->connector_type == DRM_MODE_CONNECTOR_eDP)
5570                 eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_CONN_TYPE_DP;
5571         else
5572                 eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_CONN_TYPE_HDMI;
5573
5574         eld[DRM_ELD_BASELINE_ELD_LEN] =
5575                 DIV_ROUND_UP(drm_eld_calc_baseline_block_size(eld), 4);
5576
5577         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] ELD size %d, SAD count %d\n",
5578                     connector->base.id, connector->name,
5579                     drm_eld_size(eld), total_sad_count);
5580 }
5581
5582 static int _drm_edid_to_sad(const struct drm_edid *drm_edid,
5583                             struct cea_sad **sads)
5584 {
5585         const struct cea_db *db;
5586         struct cea_db_iter iter;
5587         int count = 0;
5588
5589         cea_db_iter_edid_begin(drm_edid, &iter);
5590         cea_db_iter_for_each(db, &iter) {
5591                 if (cea_db_tag(db) == CTA_DB_AUDIO) {
5592                         int j;
5593
5594                         count = cea_db_payload_len(db) / 3; /* SAD is 3B */
5595                         *sads = kcalloc(count, sizeof(**sads), GFP_KERNEL);
5596                         if (!*sads)
5597                                 return -ENOMEM;
5598                         for (j = 0; j < count; j++) {
5599                                 const u8 *sad = &db->data[j * 3];
5600
5601                                 (*sads)[j].format = (sad[0] & 0x78) >> 3;
5602                                 (*sads)[j].channels = sad[0] & 0x7;
5603                                 (*sads)[j].freq = sad[1] & 0x7F;
5604                                 (*sads)[j].byte2 = sad[2];
5605                         }
5606                         break;
5607                 }
5608         }
5609         cea_db_iter_end(&iter);
5610
5611         DRM_DEBUG_KMS("Found %d Short Audio Descriptors\n", count);
5612
5613         return count;
5614 }
5615
5616 /**
5617  * drm_edid_to_sad - extracts SADs from EDID
5618  * @edid: EDID to parse
5619  * @sads: pointer that will be set to the extracted SADs
5620  *
5621  * Looks for CEA EDID block and extracts SADs (Short Audio Descriptors) from it.
5622  *
5623  * Note: The returned pointer needs to be freed using kfree().
5624  *
5625  * Return: The number of found SADs or negative number on error.
5626  */
5627 int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads)
5628 {
5629         struct drm_edid drm_edid;
5630
5631         return _drm_edid_to_sad(drm_edid_legacy_init(&drm_edid, edid), sads);
5632 }
5633 EXPORT_SYMBOL(drm_edid_to_sad);
5634
5635 static int _drm_edid_to_speaker_allocation(const struct drm_edid *drm_edid,
5636                                            u8 **sadb)
5637 {
5638         const struct cea_db *db;
5639         struct cea_db_iter iter;
5640         int count = 0;
5641
5642         cea_db_iter_edid_begin(drm_edid, &iter);
5643         cea_db_iter_for_each(db, &iter) {
5644                 if (cea_db_tag(db) == CTA_DB_SPEAKER &&
5645                     cea_db_payload_len(db) == 3) {
5646                         *sadb = kmemdup(db->data, cea_db_payload_len(db),
5647                                         GFP_KERNEL);
5648                         if (!*sadb)
5649                                 return -ENOMEM;
5650                         count = cea_db_payload_len(db);
5651                         break;
5652                 }
5653         }
5654         cea_db_iter_end(&iter);
5655
5656         DRM_DEBUG_KMS("Found %d Speaker Allocation Data Blocks\n", count);
5657
5658         return count;
5659 }
5660
5661 /**
5662  * drm_edid_to_speaker_allocation - extracts Speaker Allocation Data Blocks from EDID
5663  * @edid: EDID to parse
5664  * @sadb: pointer to the speaker block
5665  *
5666  * Looks for CEA EDID block and extracts the Speaker Allocation Data Block from it.
5667  *
5668  * Note: The returned pointer needs to be freed using kfree().
5669  *
5670  * Return: The number of found Speaker Allocation Blocks or negative number on
5671  * error.
5672  */
5673 int drm_edid_to_speaker_allocation(const struct edid *edid, u8 **sadb)
5674 {
5675         struct drm_edid drm_edid;
5676
5677         return _drm_edid_to_speaker_allocation(drm_edid_legacy_init(&drm_edid, edid),
5678                                                sadb);
5679 }
5680 EXPORT_SYMBOL(drm_edid_to_speaker_allocation);
5681
5682 /**
5683  * drm_av_sync_delay - compute the HDMI/DP sink audio-video sync delay
5684  * @connector: connector associated with the HDMI/DP sink
5685  * @mode: the display mode
5686  *
5687  * Return: The HDMI/DP sink's audio-video sync delay in milliseconds or 0 if
5688  * the sink doesn't support audio or video.
5689  */
5690 int drm_av_sync_delay(struct drm_connector *connector,
5691                       const struct drm_display_mode *mode)
5692 {
5693         int i = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
5694         int a, v;
5695
5696         if (!connector->latency_present[0])
5697                 return 0;
5698         if (!connector->latency_present[1])
5699                 i = 0;
5700
5701         a = connector->audio_latency[i];
5702         v = connector->video_latency[i];
5703
5704         /*
5705          * HDMI/DP sink doesn't support audio or video?
5706          */
5707         if (a == 255 || v == 255)
5708                 return 0;
5709
5710         /*
5711          * Convert raw EDID values to millisecond.
5712          * Treat unknown latency as 0ms.
5713          */
5714         if (a)
5715                 a = min(2 * (a - 1), 500);
5716         if (v)
5717                 v = min(2 * (v - 1), 500);
5718
5719         return max(v - a, 0);
5720 }
5721 EXPORT_SYMBOL(drm_av_sync_delay);
5722
5723 static bool _drm_detect_hdmi_monitor(const struct drm_edid *drm_edid)
5724 {
5725         const struct cea_db *db;
5726         struct cea_db_iter iter;
5727         bool hdmi = false;
5728
5729         /*
5730          * Because HDMI identifier is in Vendor Specific Block,
5731          * search it from all data blocks of CEA extension.
5732          */
5733         cea_db_iter_edid_begin(drm_edid, &iter);
5734         cea_db_iter_for_each(db, &iter) {
5735                 if (cea_db_is_hdmi_vsdb(db)) {
5736                         hdmi = true;
5737                         break;
5738                 }
5739         }
5740         cea_db_iter_end(&iter);
5741
5742         return hdmi;
5743 }
5744
5745 /**
5746  * drm_detect_hdmi_monitor - detect whether monitor is HDMI
5747  * @edid: monitor EDID information
5748  *
5749  * Parse the CEA extension according to CEA-861-B.
5750  *
5751  * Drivers that have added the modes parsed from EDID to drm_display_info
5752  * should use &drm_display_info.is_hdmi instead of calling this function.
5753  *
5754  * Return: True if the monitor is HDMI, false if not or unknown.
5755  */
5756 bool drm_detect_hdmi_monitor(const struct edid *edid)
5757 {
5758         struct drm_edid drm_edid;
5759
5760         return _drm_detect_hdmi_monitor(drm_edid_legacy_init(&drm_edid, edid));
5761 }
5762 EXPORT_SYMBOL(drm_detect_hdmi_monitor);
5763
5764 static bool _drm_detect_monitor_audio(const struct drm_edid *drm_edid)
5765 {
5766         struct drm_edid_iter edid_iter;
5767         const struct cea_db *db;
5768         struct cea_db_iter iter;
5769         const u8 *edid_ext;
5770         bool has_audio = false;
5771
5772         drm_edid_iter_begin(drm_edid, &edid_iter);
5773         drm_edid_iter_for_each(edid_ext, &edid_iter) {
5774                 if (edid_ext[0] == CEA_EXT) {
5775                         has_audio = edid_ext[3] & EDID_BASIC_AUDIO;
5776                         if (has_audio)
5777                                 break;
5778                 }
5779         }
5780         drm_edid_iter_end(&edid_iter);
5781
5782         if (has_audio) {
5783                 DRM_DEBUG_KMS("Monitor has basic audio support\n");
5784                 goto end;
5785         }
5786
5787         cea_db_iter_edid_begin(drm_edid, &iter);
5788         cea_db_iter_for_each(db, &iter) {
5789                 if (cea_db_tag(db) == CTA_DB_AUDIO) {
5790                         const u8 *data = cea_db_data(db);
5791                         int i;
5792
5793                         for (i = 0; i < cea_db_payload_len(db); i += 3)
5794                                 DRM_DEBUG_KMS("CEA audio format %d\n",
5795                                               (data[i] >> 3) & 0xf);
5796                         has_audio = true;
5797                         break;
5798                 }
5799         }
5800         cea_db_iter_end(&iter);
5801
5802 end:
5803         return has_audio;
5804 }
5805
5806 /**
5807  * drm_detect_monitor_audio - check monitor audio capability
5808  * @edid: EDID block to scan
5809  *
5810  * Monitor should have CEA extension block.
5811  * If monitor has 'basic audio', but no CEA audio blocks, it's 'basic
5812  * audio' only. If there is any audio extension block and supported
5813  * audio format, assume at least 'basic audio' support, even if 'basic
5814  * audio' is not defined in EDID.
5815  *
5816  * Return: True if the monitor supports audio, false otherwise.
5817  */
5818 bool drm_detect_monitor_audio(const struct edid *edid)
5819 {
5820         struct drm_edid drm_edid;
5821
5822         return _drm_detect_monitor_audio(drm_edid_legacy_init(&drm_edid, edid));
5823 }
5824 EXPORT_SYMBOL(drm_detect_monitor_audio);
5825
5826
5827 /**
5828  * drm_default_rgb_quant_range - default RGB quantization range
5829  * @mode: display mode
5830  *
5831  * Determine the default RGB quantization range for the mode,
5832  * as specified in CEA-861.
5833  *
5834  * Return: The default RGB quantization range for the mode
5835  */
5836 enum hdmi_quantization_range
5837 drm_default_rgb_quant_range(const struct drm_display_mode *mode)
5838 {
5839         /* All CEA modes other than VIC 1 use limited quantization range. */
5840         return drm_match_cea_mode(mode) > 1 ?
5841                 HDMI_QUANTIZATION_RANGE_LIMITED :
5842                 HDMI_QUANTIZATION_RANGE_FULL;
5843 }
5844 EXPORT_SYMBOL(drm_default_rgb_quant_range);
5845
5846 /* CTA-861 Video Data Block (CTA VDB) */
5847 static void parse_cta_vdb(struct drm_connector *connector, const struct cea_db *db)
5848 {
5849         struct drm_display_info *info = &connector->display_info;
5850         int i, vic_index, len = cea_db_payload_len(db);
5851         const u8 *svds = cea_db_data(db);
5852         u8 *vics;
5853
5854         if (!len)
5855                 return;
5856
5857         /* Gracefully handle multiple VDBs, however unlikely that is */
5858         vics = krealloc(info->vics, info->vics_len + len, GFP_KERNEL);
5859         if (!vics)
5860                 return;
5861
5862         vic_index = info->vics_len;
5863         info->vics_len += len;
5864         info->vics = vics;
5865
5866         for (i = 0; i < len; i++) {
5867                 u8 vic = svd_to_vic(svds[i]);
5868
5869                 if (!drm_valid_cea_vic(vic))
5870                         vic = 0;
5871
5872                 info->vics[vic_index++] = vic;
5873         }
5874 }
5875
5876 /*
5877  * Update y420_cmdb_modes based on previously parsed CTA VDB and Y420CMDB.
5878  *
5879  * Translate the y420cmdb_map based on VIC indexes to y420_cmdb_modes indexed
5880  * using the VICs themselves.
5881  */
5882 static void update_cta_y420cmdb(struct drm_connector *connector, u64 y420cmdb_map)
5883 {
5884         struct drm_display_info *info = &connector->display_info;
5885         struct drm_hdmi_info *hdmi = &info->hdmi;
5886         int i, len = min_t(int, info->vics_len, BITS_PER_TYPE(y420cmdb_map));
5887
5888         for (i = 0; i < len; i++) {
5889                 u8 vic = info->vics[i];
5890
5891                 if (vic && y420cmdb_map & BIT_ULL(i))
5892                         bitmap_set(hdmi->y420_cmdb_modes, vic, 1);
5893         }
5894 }
5895
5896 static bool cta_vdb_has_vic(const struct drm_connector *connector, u8 vic)
5897 {
5898         const struct drm_display_info *info = &connector->display_info;
5899         int i;
5900
5901         if (!vic || !info->vics)
5902                 return false;
5903
5904         for (i = 0; i < info->vics_len; i++) {
5905                 if (info->vics[i] == vic)
5906                         return true;
5907         }
5908
5909         return false;
5910 }
5911
5912 /* CTA-861-H YCbCr 4:2:0 Video Data Block (CTA Y420VDB) */
5913 static void parse_cta_y420vdb(struct drm_connector *connector,
5914                               const struct cea_db *db)
5915 {
5916         struct drm_display_info *info = &connector->display_info;
5917         struct drm_hdmi_info *hdmi = &info->hdmi;
5918         const u8 *svds = cea_db_data(db) + 1;
5919         int i;
5920
5921         for (i = 0; i < cea_db_payload_len(db) - 1; i++) {
5922                 u8 vic = svd_to_vic(svds[i]);
5923
5924                 if (!drm_valid_cea_vic(vic))
5925                         continue;
5926
5927                 bitmap_set(hdmi->y420_vdb_modes, vic, 1);
5928                 info->color_formats |= DRM_COLOR_FORMAT_YCBCR420;
5929         }
5930 }
5931
5932 static void drm_parse_vcdb(struct drm_connector *connector, const u8 *db)
5933 {
5934         struct drm_display_info *info = &connector->display_info;
5935
5936         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] CEA VCDB 0x%02x\n",
5937                     connector->base.id, connector->name, db[2]);
5938
5939         if (db[2] & EDID_CEA_VCDB_QS)
5940                 info->rgb_quant_range_selectable = true;
5941 }
5942
5943 static
5944 void drm_get_max_frl_rate(int max_frl_rate, u8 *max_lanes, u8 *max_rate_per_lane)
5945 {
5946         switch (max_frl_rate) {
5947         case 1:
5948                 *max_lanes = 3;
5949                 *max_rate_per_lane = 3;
5950                 break;
5951         case 2:
5952                 *max_lanes = 3;
5953                 *max_rate_per_lane = 6;
5954                 break;
5955         case 3:
5956                 *max_lanes = 4;
5957                 *max_rate_per_lane = 6;
5958                 break;
5959         case 4:
5960                 *max_lanes = 4;
5961                 *max_rate_per_lane = 8;
5962                 break;
5963         case 5:
5964                 *max_lanes = 4;
5965                 *max_rate_per_lane = 10;
5966                 break;
5967         case 6:
5968                 *max_lanes = 4;
5969                 *max_rate_per_lane = 12;
5970                 break;
5971         case 0:
5972         default:
5973                 *max_lanes = 0;
5974                 *max_rate_per_lane = 0;
5975         }
5976 }
5977
5978 static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector,
5979                                                const u8 *db)
5980 {
5981         u8 dc_mask;
5982         struct drm_hdmi_info *hdmi = &connector->display_info.hdmi;
5983
5984         dc_mask = db[7] & DRM_EDID_YCBCR420_DC_MASK;
5985         hdmi->y420_dc_modes = dc_mask;
5986 }
5987
5988 static void drm_parse_dsc_info(struct drm_hdmi_dsc_cap *hdmi_dsc,
5989                                const u8 *hf_scds)
5990 {
5991         hdmi_dsc->v_1p2 = hf_scds[11] & DRM_EDID_DSC_1P2;
5992
5993         if (!hdmi_dsc->v_1p2)
5994                 return;
5995
5996         hdmi_dsc->native_420 = hf_scds[11] & DRM_EDID_DSC_NATIVE_420;
5997         hdmi_dsc->all_bpp = hf_scds[11] & DRM_EDID_DSC_ALL_BPP;
5998
5999         if (hf_scds[11] & DRM_EDID_DSC_16BPC)
6000                 hdmi_dsc->bpc_supported = 16;
6001         else if (hf_scds[11] & DRM_EDID_DSC_12BPC)
6002                 hdmi_dsc->bpc_supported = 12;
6003         else if (hf_scds[11] & DRM_EDID_DSC_10BPC)
6004                 hdmi_dsc->bpc_supported = 10;
6005         else
6006                 /* Supports min 8 BPC if DSC 1.2 is supported*/
6007                 hdmi_dsc->bpc_supported = 8;
6008
6009         if (cea_db_payload_len(hf_scds) >= 12 && hf_scds[12]) {
6010                 u8 dsc_max_slices;
6011                 u8 dsc_max_frl_rate;
6012
6013                 dsc_max_frl_rate = (hf_scds[12] & DRM_EDID_DSC_MAX_FRL_RATE_MASK) >> 4;
6014                 drm_get_max_frl_rate(dsc_max_frl_rate, &hdmi_dsc->max_lanes,
6015                                      &hdmi_dsc->max_frl_rate_per_lane);
6016
6017                 dsc_max_slices = hf_scds[12] & DRM_EDID_DSC_MAX_SLICES;
6018
6019                 switch (dsc_max_slices) {
6020                 case 1:
6021                         hdmi_dsc->max_slices = 1;
6022                         hdmi_dsc->clk_per_slice = 340;
6023                         break;
6024                 case 2:
6025                         hdmi_dsc->max_slices = 2;
6026                         hdmi_dsc->clk_per_slice = 340;
6027                         break;
6028                 case 3:
6029                         hdmi_dsc->max_slices = 4;
6030                         hdmi_dsc->clk_per_slice = 340;
6031                         break;
6032                 case 4:
6033                         hdmi_dsc->max_slices = 8;
6034                         hdmi_dsc->clk_per_slice = 340;
6035                         break;
6036                 case 5:
6037                         hdmi_dsc->max_slices = 8;
6038                         hdmi_dsc->clk_per_slice = 400;
6039                         break;
6040                 case 6:
6041                         hdmi_dsc->max_slices = 12;
6042                         hdmi_dsc->clk_per_slice = 400;
6043                         break;
6044                 case 7:
6045                         hdmi_dsc->max_slices = 16;
6046                         hdmi_dsc->clk_per_slice = 400;
6047                         break;
6048                 case 0:
6049                 default:
6050                         hdmi_dsc->max_slices = 0;
6051                         hdmi_dsc->clk_per_slice = 0;
6052                 }
6053         }
6054
6055         if (cea_db_payload_len(hf_scds) >= 13 && hf_scds[13])
6056                 hdmi_dsc->total_chunk_kbytes = hf_scds[13] & DRM_EDID_DSC_TOTAL_CHUNK_KBYTES;
6057 }
6058
6059 /* Sink Capability Data Structure */
6060 static void drm_parse_hdmi_forum_scds(struct drm_connector *connector,
6061                                       const u8 *hf_scds)
6062 {
6063         struct drm_display_info *info = &connector->display_info;
6064         struct drm_hdmi_info *hdmi = &info->hdmi;
6065         struct drm_hdmi_dsc_cap *hdmi_dsc = &hdmi->dsc_cap;
6066         int max_tmds_clock = 0;
6067         u8 max_frl_rate = 0;
6068         bool dsc_support = false;
6069
6070         info->has_hdmi_infoframe = true;
6071
6072         if (hf_scds[6] & 0x80) {
6073                 hdmi->scdc.supported = true;
6074                 if (hf_scds[6] & 0x40)
6075                         hdmi->scdc.read_request = true;
6076         }
6077
6078         /*
6079          * All HDMI 2.0 monitors must support scrambling at rates > 340 MHz.
6080          * And as per the spec, three factors confirm this:
6081          * * Availability of a HF-VSDB block in EDID (check)
6082          * * Non zero Max_TMDS_Char_Rate filed in HF-VSDB (let's check)
6083          * * SCDC support available (let's check)
6084          * Lets check it out.
6085          */
6086
6087         if (hf_scds[5]) {
6088                 struct drm_scdc *scdc = &hdmi->scdc;
6089
6090                 /* max clock is 5000 KHz times block value */
6091                 max_tmds_clock = hf_scds[5] * 5000;
6092
6093                 if (max_tmds_clock > 340000) {
6094                         info->max_tmds_clock = max_tmds_clock;
6095                 }
6096
6097                 if (scdc->supported) {
6098                         scdc->scrambling.supported = true;
6099
6100                         /* Few sinks support scrambling for clocks < 340M */
6101                         if ((hf_scds[6] & 0x8))
6102                                 scdc->scrambling.low_rates = true;
6103                 }
6104         }
6105
6106         if (hf_scds[7]) {
6107                 max_frl_rate = (hf_scds[7] & DRM_EDID_MAX_FRL_RATE_MASK) >> 4;
6108                 drm_get_max_frl_rate(max_frl_rate, &hdmi->max_lanes,
6109                                      &hdmi->max_frl_rate_per_lane);
6110         }
6111
6112         drm_parse_ycbcr420_deep_color_info(connector, hf_scds);
6113
6114         if (cea_db_payload_len(hf_scds) >= 11 && hf_scds[11]) {
6115                 drm_parse_dsc_info(hdmi_dsc, hf_scds);
6116                 dsc_support = true;
6117         }
6118
6119         drm_dbg_kms(connector->dev,
6120                     "[CONNECTOR:%d:%s] HF-VSDB: max TMDS clock: %d KHz, HDMI 2.1 support: %s, DSC 1.2 support: %s\n",
6121                     connector->base.id, connector->name,
6122                     max_tmds_clock, str_yes_no(max_frl_rate), str_yes_no(dsc_support));
6123 }
6124
6125 static void drm_parse_hdmi_deep_color_info(struct drm_connector *connector,
6126                                            const u8 *hdmi)
6127 {
6128         struct drm_display_info *info = &connector->display_info;
6129         unsigned int dc_bpc = 0;
6130
6131         /* HDMI supports at least 8 bpc */
6132         info->bpc = 8;
6133
6134         if (cea_db_payload_len(hdmi) < 6)
6135                 return;
6136
6137         if (hdmi[6] & DRM_EDID_HDMI_DC_30) {
6138                 dc_bpc = 10;
6139                 info->edid_hdmi_rgb444_dc_modes |= DRM_EDID_HDMI_DC_30;
6140                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does deep color 30.\n",
6141                             connector->base.id, connector->name);
6142         }
6143
6144         if (hdmi[6] & DRM_EDID_HDMI_DC_36) {
6145                 dc_bpc = 12;
6146                 info->edid_hdmi_rgb444_dc_modes |= DRM_EDID_HDMI_DC_36;
6147                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does deep color 36.\n",
6148                             connector->base.id, connector->name);
6149         }
6150
6151         if (hdmi[6] & DRM_EDID_HDMI_DC_48) {
6152                 dc_bpc = 16;
6153                 info->edid_hdmi_rgb444_dc_modes |= DRM_EDID_HDMI_DC_48;
6154                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does deep color 48.\n",
6155                             connector->base.id, connector->name);
6156         }
6157
6158         if (dc_bpc == 0) {
6159                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] No deep color support on this HDMI sink.\n",
6160                             connector->base.id, connector->name);
6161                 return;
6162         }
6163
6164         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Assigning HDMI sink color depth as %d bpc.\n",
6165                     connector->base.id, connector->name, dc_bpc);
6166         info->bpc = dc_bpc;
6167
6168         /* YCRCB444 is optional according to spec. */
6169         if (hdmi[6] & DRM_EDID_HDMI_DC_Y444) {
6170                 info->edid_hdmi_ycbcr444_dc_modes = info->edid_hdmi_rgb444_dc_modes;
6171                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does YCRCB444 in deep color.\n",
6172                             connector->base.id, connector->name);
6173         }
6174
6175         /*
6176          * Spec says that if any deep color mode is supported at all,
6177          * then deep color 36 bit must be supported.
6178          */
6179         if (!(hdmi[6] & DRM_EDID_HDMI_DC_36)) {
6180                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink should do DC_36, but does not!\n",
6181                             connector->base.id, connector->name);
6182         }
6183 }
6184
6185 /* HDMI Vendor-Specific Data Block (HDMI VSDB, H14b-VSDB) */
6186 static void
6187 drm_parse_hdmi_vsdb_video(struct drm_connector *connector, const u8 *db)
6188 {
6189         struct drm_display_info *info = &connector->display_info;
6190         u8 len = cea_db_payload_len(db);
6191
6192         info->is_hdmi = true;
6193
6194         if (len >= 6)
6195                 info->dvi_dual = db[6] & 1;
6196         if (len >= 7)
6197                 info->max_tmds_clock = db[7] * 5000;
6198
6199         /*
6200          * Try to infer whether the sink supports HDMI infoframes.
6201          *
6202          * HDMI infoframe support was first added in HDMI 1.4. Assume the sink
6203          * supports infoframes if HDMI_Video_present is set.
6204          */
6205         if (len >= 8 && db[8] & BIT(5))
6206                 info->has_hdmi_infoframe = true;
6207
6208         drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI: DVI dual %d, max TMDS clock %d kHz\n",
6209                     connector->base.id, connector->name,
6210                     info->dvi_dual, info->max_tmds_clock);
6211
6212         drm_parse_hdmi_deep_color_info(connector, db);
6213 }
6214
6215 /*
6216  * See EDID extension for head-mounted and specialized monitors, specified at:
6217  * https://docs.microsoft.com/en-us/windows-hardware/drivers/display/specialized-monitors-edid-extension
6218  */
6219 static void drm_parse_microsoft_vsdb(struct drm_connector *connector,
6220                                      const u8 *db)
6221 {
6222         struct drm_display_info *info = &connector->display_info;
6223         u8 version = db[4];
6224         bool desktop_usage = db[5] & BIT(6);
6225
6226         /* Version 1 and 2 for HMDs, version 3 flags desktop usage explicitly */
6227         if (version == 1 || version == 2 || (version == 3 && !desktop_usage))
6228                 info->non_desktop = true;
6229
6230         drm_dbg_kms(connector->dev,
6231                     "[CONNECTOR:%d:%s] HMD or specialized display VSDB version %u: 0x%02x\n",
6232                     connector->base.id, connector->name, version, db[5]);
6233 }
6234
6235 static void drm_parse_cea_ext(struct drm_connector *connector,
6236                               const struct drm_edid *drm_edid)
6237 {
6238         struct drm_display_info *info = &connector->display_info;
6239         struct drm_edid_iter edid_iter;
6240         const struct cea_db *db;
6241         struct cea_db_iter iter;
6242         const u8 *edid_ext;
6243         u64 y420cmdb_map = 0;
6244
6245         drm_edid_iter_begin(drm_edid, &edid_iter);
6246         drm_edid_iter_for_each(edid_ext, &edid_iter) {
6247                 if (edid_ext[0] != CEA_EXT)
6248                         continue;
6249
6250                 if (!info->cea_rev)
6251                         info->cea_rev = edid_ext[1];
6252
6253                 if (info->cea_rev != edid_ext[1])
6254                         drm_dbg_kms(connector->dev,
6255                                     "[CONNECTOR:%d:%s] CEA extension version mismatch %u != %u\n",
6256                                     connector->base.id, connector->name,
6257                                     info->cea_rev, edid_ext[1]);
6258
6259                 /* The existence of a CTA extension should imply RGB support */
6260                 info->color_formats = DRM_COLOR_FORMAT_RGB444;
6261                 if (edid_ext[3] & EDID_CEA_YCRCB444)
6262                         info->color_formats |= DRM_COLOR_FORMAT_YCBCR444;
6263                 if (edid_ext[3] & EDID_CEA_YCRCB422)
6264                         info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
6265                 if (edid_ext[3] & EDID_BASIC_AUDIO)
6266                         info->has_audio = true;
6267
6268         }
6269         drm_edid_iter_end(&edid_iter);
6270
6271         cea_db_iter_edid_begin(drm_edid, &iter);
6272         cea_db_iter_for_each(db, &iter) {
6273                 /* FIXME: convert parsers to use struct cea_db */
6274                 const u8 *data = (const u8 *)db;
6275
6276                 if (cea_db_is_hdmi_vsdb(db))
6277                         drm_parse_hdmi_vsdb_video(connector, data);
6278                 else if (cea_db_is_hdmi_forum_vsdb(db) ||
6279                          cea_db_is_hdmi_forum_scdb(db))
6280                         drm_parse_hdmi_forum_scds(connector, data);
6281                 else if (cea_db_is_microsoft_vsdb(db))
6282                         drm_parse_microsoft_vsdb(connector, data);
6283                 else if (cea_db_is_y420cmdb(db))
6284                         parse_cta_y420cmdb(connector, db, &y420cmdb_map);
6285                 else if (cea_db_is_y420vdb(db))
6286                         parse_cta_y420vdb(connector, db);
6287                 else if (cea_db_is_vcdb(db))
6288                         drm_parse_vcdb(connector, data);
6289                 else if (cea_db_is_hdmi_hdr_metadata_block(db))
6290                         drm_parse_hdr_metadata_block(connector, data);
6291                 else if (cea_db_tag(db) == CTA_DB_VIDEO)
6292                         parse_cta_vdb(connector, db);
6293                 else if (cea_db_tag(db) == CTA_DB_AUDIO)
6294                         info->has_audio = true;
6295         }
6296         cea_db_iter_end(&iter);
6297
6298         if (y420cmdb_map)
6299                 update_cta_y420cmdb(connector, y420cmdb_map);
6300 }
6301
6302 static
6303 void get_monitor_range(const struct detailed_timing *timing, void *c)
6304 {
6305         struct detailed_mode_closure *closure = c;
6306         struct drm_display_info *info = &closure->connector->display_info;
6307         struct drm_monitor_range_info *monitor_range = &info->monitor_range;
6308         const struct detailed_non_pixel *data = &timing->data.other_data;
6309         const struct detailed_data_monitor_range *range = &data->data.range;
6310         const struct edid *edid = closure->drm_edid->edid;
6311
6312         if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_RANGE))
6313                 return;
6314
6315         /*
6316          * These limits are used to determine the VRR refresh
6317          * rate range. Only the "range limits only" variant
6318          * of the range descriptor seems to guarantee that
6319          * any and all timings are accepted by the sink, as
6320          * opposed to just timings conforming to the indicated
6321          * formula (GTF/GTF2/CVT). Thus other variants of the
6322          * range descriptor are not accepted here.
6323          */
6324         if (range->flags != DRM_EDID_RANGE_LIMITS_ONLY_FLAG)
6325                 return;
6326
6327         monitor_range->min_vfreq = range->min_vfreq;
6328         monitor_range->max_vfreq = range->max_vfreq;
6329
6330         if (edid->revision >= 4) {
6331                 if (data->pad2 & DRM_EDID_RANGE_OFFSET_MIN_VFREQ)
6332                         monitor_range->min_vfreq += 255;
6333                 if (data->pad2 & DRM_EDID_RANGE_OFFSET_MAX_VFREQ)
6334                         monitor_range->max_vfreq += 255;
6335         }
6336 }
6337
6338 static void drm_get_monitor_range(struct drm_connector *connector,
6339                                   const struct drm_edid *drm_edid)
6340 {
6341         const struct drm_display_info *info = &connector->display_info;
6342         struct detailed_mode_closure closure = {
6343                 .connector = connector,
6344                 .drm_edid = drm_edid,
6345         };
6346
6347         if (drm_edid->edid->revision < 4)
6348                 return;
6349
6350         if (!(drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ))
6351                 return;
6352
6353         drm_for_each_detailed_block(drm_edid, get_monitor_range, &closure);
6354
6355         drm_dbg_kms(connector->dev,
6356                     "[CONNECTOR:%d:%s] Supported Monitor Refresh rate range is %d Hz - %d Hz\n",
6357                     connector->base.id, connector->name,
6358                     info->monitor_range.min_vfreq, info->monitor_range.max_vfreq);
6359 }
6360
6361 static void drm_parse_vesa_mso_data(struct drm_connector *connector,
6362                                     const struct displayid_block *block)
6363 {
6364         struct displayid_vesa_vendor_specific_block *vesa =
6365                 (struct displayid_vesa_vendor_specific_block *)block;
6366         struct drm_display_info *info = &connector->display_info;
6367
6368         if (block->num_bytes < 3) {
6369                 drm_dbg_kms(connector->dev,
6370                             "[CONNECTOR:%d:%s] Unexpected vendor block size %u\n",
6371                             connector->base.id, connector->name, block->num_bytes);
6372                 return;
6373         }
6374
6375         if (oui(vesa->oui[0], vesa->oui[1], vesa->oui[2]) != VESA_IEEE_OUI)
6376                 return;
6377
6378         if (sizeof(*vesa) != sizeof(*block) + block->num_bytes) {
6379                 drm_dbg_kms(connector->dev,
6380                             "[CONNECTOR:%d:%s] Unexpected VESA vendor block size\n",
6381                             connector->base.id, connector->name);
6382                 return;
6383         }
6384
6385         switch (FIELD_GET(DISPLAYID_VESA_MSO_MODE, vesa->mso)) {
6386         default:
6387                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Reserved MSO mode value\n",
6388                             connector->base.id, connector->name);
6389                 fallthrough;
6390         case 0:
6391                 info->mso_stream_count = 0;
6392                 break;
6393         case 1:
6394                 info->mso_stream_count = 2; /* 2 or 4 links */
6395                 break;
6396         case 2:
6397                 info->mso_stream_count = 4; /* 4 links */
6398                 break;
6399         }
6400
6401         if (!info->mso_stream_count) {
6402                 info->mso_pixel_overlap = 0;
6403                 return;
6404         }
6405
6406         info->mso_pixel_overlap = FIELD_GET(DISPLAYID_VESA_MSO_OVERLAP, vesa->mso);
6407         if (info->mso_pixel_overlap > 8) {
6408                 drm_dbg_kms(connector->dev,
6409                             "[CONNECTOR:%d:%s] Reserved MSO pixel overlap value %u\n",
6410                             connector->base.id, connector->name,
6411                             info->mso_pixel_overlap);
6412                 info->mso_pixel_overlap = 8;
6413         }
6414
6415         drm_dbg_kms(connector->dev,
6416                     "[CONNECTOR:%d:%s] MSO stream count %u, pixel overlap %u\n",
6417                     connector->base.id, connector->name,
6418                     info->mso_stream_count, info->mso_pixel_overlap);
6419 }
6420
6421 static void drm_update_mso(struct drm_connector *connector,
6422                            const struct drm_edid *drm_edid)
6423 {
6424         const struct displayid_block *block;
6425         struct displayid_iter iter;
6426
6427         displayid_iter_edid_begin(drm_edid, &iter);
6428         displayid_iter_for_each(block, &iter) {
6429                 if (block->tag == DATA_BLOCK_2_VENDOR_SPECIFIC)
6430                         drm_parse_vesa_mso_data(connector, block);
6431         }
6432         displayid_iter_end(&iter);
6433 }
6434
6435 /* A connector has no EDID information, so we've got no EDID to compute quirks from. Reset
6436  * all of the values which would have been set from EDID
6437  */
6438 static void drm_reset_display_info(struct drm_connector *connector)
6439 {
6440         struct drm_display_info *info = &connector->display_info;
6441
6442         info->width_mm = 0;
6443         info->height_mm = 0;
6444
6445         info->bpc = 0;
6446         info->color_formats = 0;
6447         info->cea_rev = 0;
6448         info->max_tmds_clock = 0;
6449         info->dvi_dual = false;
6450         info->is_hdmi = false;
6451         info->has_audio = false;
6452         info->has_hdmi_infoframe = false;
6453         info->rgb_quant_range_selectable = false;
6454         memset(&info->hdmi, 0, sizeof(info->hdmi));
6455
6456         info->edid_hdmi_rgb444_dc_modes = 0;
6457         info->edid_hdmi_ycbcr444_dc_modes = 0;
6458
6459         info->non_desktop = 0;
6460         memset(&info->monitor_range, 0, sizeof(info->monitor_range));
6461         memset(&info->luminance_range, 0, sizeof(info->luminance_range));
6462
6463         info->mso_stream_count = 0;
6464         info->mso_pixel_overlap = 0;
6465         info->max_dsc_bpp = 0;
6466
6467         kfree(info->vics);
6468         info->vics = NULL;
6469         info->vics_len = 0;
6470
6471         info->quirks = 0;
6472 }
6473
6474 static void update_displayid_info(struct drm_connector *connector,
6475                                   const struct drm_edid *drm_edid)
6476 {
6477         struct drm_display_info *info = &connector->display_info;
6478         const struct displayid_block *block;
6479         struct displayid_iter iter;
6480
6481         displayid_iter_edid_begin(drm_edid, &iter);
6482         displayid_iter_for_each(block, &iter) {
6483                 if (displayid_version(&iter) == DISPLAY_ID_STRUCTURE_VER_20 &&
6484                     (displayid_primary_use(&iter) == PRIMARY_USE_HEAD_MOUNTED_VR ||
6485                      displayid_primary_use(&iter) == PRIMARY_USE_HEAD_MOUNTED_AR))
6486                         info->non_desktop = true;
6487
6488                 /*
6489                  * We're only interested in the base section here, no need to
6490                  * iterate further.
6491                  */
6492                 break;
6493         }
6494         displayid_iter_end(&iter);
6495 }
6496
6497 static void update_display_info(struct drm_connector *connector,
6498                                 const struct drm_edid *drm_edid)
6499 {
6500         struct drm_display_info *info = &connector->display_info;
6501         const struct edid *edid;
6502
6503         drm_reset_display_info(connector);
6504         clear_eld(connector);
6505
6506         if (!drm_edid)
6507                 return;
6508
6509         edid = drm_edid->edid;
6510
6511         info->quirks = edid_get_quirks(drm_edid);
6512
6513         info->width_mm = edid->width_cm * 10;
6514         info->height_mm = edid->height_cm * 10;
6515
6516         drm_get_monitor_range(connector, drm_edid);
6517
6518         if (edid->revision < 3)
6519                 goto out;
6520
6521         if (!(edid->input & DRM_EDID_INPUT_DIGITAL))
6522                 goto out;
6523
6524         info->color_formats |= DRM_COLOR_FORMAT_RGB444;
6525         drm_parse_cea_ext(connector, drm_edid);
6526
6527         update_displayid_info(connector, drm_edid);
6528
6529         /*
6530          * Digital sink with "DFP 1.x compliant TMDS" according to EDID 1.3?
6531          *
6532          * For such displays, the DFP spec 1.0, section 3.10 "EDID support"
6533          * tells us to assume 8 bpc color depth if the EDID doesn't have
6534          * extensions which tell otherwise.
6535          */
6536         if (info->bpc == 0 && edid->revision == 3 &&
6537             edid->input & DRM_EDID_DIGITAL_DFP_1_X) {
6538                 info->bpc = 8;
6539                 drm_dbg_kms(connector->dev,
6540                             "[CONNECTOR:%d:%s] Assigning DFP sink color depth as %d bpc.\n",
6541                             connector->base.id, connector->name, info->bpc);
6542         }
6543
6544         /* Only defined for 1.4 with digital displays */
6545         if (edid->revision < 4)
6546                 goto out;
6547
6548         switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) {
6549         case DRM_EDID_DIGITAL_DEPTH_6:
6550                 info->bpc = 6;
6551                 break;
6552         case DRM_EDID_DIGITAL_DEPTH_8:
6553                 info->bpc = 8;
6554                 break;
6555         case DRM_EDID_DIGITAL_DEPTH_10:
6556                 info->bpc = 10;
6557                 break;
6558         case DRM_EDID_DIGITAL_DEPTH_12:
6559                 info->bpc = 12;
6560                 break;
6561         case DRM_EDID_DIGITAL_DEPTH_14:
6562                 info->bpc = 14;
6563                 break;
6564         case DRM_EDID_DIGITAL_DEPTH_16:
6565                 info->bpc = 16;
6566                 break;
6567         case DRM_EDID_DIGITAL_DEPTH_UNDEF:
6568         default:
6569                 info->bpc = 0;
6570                 break;
6571         }
6572
6573         drm_dbg_kms(connector->dev,
6574                     "[CONNECTOR:%d:%s] Assigning EDID-1.4 digital sink color depth as %d bpc.\n",
6575                     connector->base.id, connector->name, info->bpc);
6576
6577         if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444)
6578                 info->color_formats |= DRM_COLOR_FORMAT_YCBCR444;
6579         if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422)
6580                 info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
6581
6582         drm_update_mso(connector, drm_edid);
6583
6584 out:
6585         if (info->quirks & EDID_QUIRK_NON_DESKTOP) {
6586                 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Non-desktop display%s\n",
6587                             connector->base.id, connector->name,
6588                             info->non_desktop ? " (redundant quirk)" : "");
6589                 info->non_desktop = true;
6590         }
6591
6592         if (info->quirks & EDID_QUIRK_CAP_DSC_15BPP)
6593                 info->max_dsc_bpp = 15;
6594
6595         if (info->quirks & EDID_QUIRK_FORCE_6BPC)
6596                 info->bpc = 6;
6597
6598         if (info->quirks & EDID_QUIRK_FORCE_8BPC)
6599                 info->bpc = 8;
6600
6601         if (info->quirks & EDID_QUIRK_FORCE_10BPC)
6602                 info->bpc = 10;
6603
6604         if (info->quirks & EDID_QUIRK_FORCE_12BPC)
6605                 info->bpc = 12;
6606
6607         /* Depends on info->cea_rev set by drm_parse_cea_ext() above */
6608         drm_edid_to_eld(connector, drm_edid);
6609 }
6610
6611 static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev,
6612                                                             struct displayid_detailed_timings_1 *timings,
6613                                                             bool type_7)
6614 {
6615         struct drm_display_mode *mode;
6616         unsigned pixel_clock = (timings->pixel_clock[0] |
6617                                 (timings->pixel_clock[1] << 8) |
6618                                 (timings->pixel_clock[2] << 16)) + 1;
6619         unsigned hactive = (timings->hactive[0] | timings->hactive[1] << 8) + 1;
6620         unsigned hblank = (timings->hblank[0] | timings->hblank[1] << 8) + 1;
6621         unsigned hsync = (timings->hsync[0] | (timings->hsync[1] & 0x7f) << 8) + 1;
6622         unsigned hsync_width = (timings->hsw[0] | timings->hsw[1] << 8) + 1;
6623         unsigned vactive = (timings->vactive[0] | timings->vactive[1] << 8) + 1;
6624         unsigned vblank = (timings->vblank[0] | timings->vblank[1] << 8) + 1;
6625         unsigned vsync = (timings->vsync[0] | (timings->vsync[1] & 0x7f) << 8) + 1;
6626         unsigned vsync_width = (timings->vsw[0] | timings->vsw[1] << 8) + 1;
6627         bool hsync_positive = (timings->hsync[1] >> 7) & 0x1;
6628         bool vsync_positive = (timings->vsync[1] >> 7) & 0x1;
6629
6630         mode = drm_mode_create(dev);
6631         if (!mode)
6632                 return NULL;
6633
6634         /* resolution is kHz for type VII, and 10 kHz for type I */
6635         mode->clock = type_7 ? pixel_clock : pixel_clock * 10;
6636         mode->hdisplay = hactive;
6637         mode->hsync_start = mode->hdisplay + hsync;
6638         mode->hsync_end = mode->hsync_start + hsync_width;
6639         mode->htotal = mode->hdisplay + hblank;
6640
6641         mode->vdisplay = vactive;
6642         mode->vsync_start = mode->vdisplay + vsync;
6643         mode->vsync_end = mode->vsync_start + vsync_width;
6644         mode->vtotal = mode->vdisplay + vblank;
6645
6646         mode->flags = 0;
6647         mode->flags |= hsync_positive ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
6648         mode->flags |= vsync_positive ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
6649         mode->type = DRM_MODE_TYPE_DRIVER;
6650
6651         if (timings->flags & 0x80)
6652                 mode->type |= DRM_MODE_TYPE_PREFERRED;
6653         drm_mode_set_name(mode);
6654
6655         return mode;
6656 }
6657
6658 static int add_displayid_detailed_1_modes(struct drm_connector *connector,
6659                                           const struct displayid_block *block)
6660 {
6661         struct displayid_detailed_timing_block *det = (struct displayid_detailed_timing_block *)block;
6662         int i;
6663         int num_timings;
6664         struct drm_display_mode *newmode;
6665         int num_modes = 0;
6666         bool type_7 = block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING;
6667         /* blocks must be multiple of 20 bytes length */
6668         if (block->num_bytes % 20)
6669                 return 0;
6670
6671         num_timings = block->num_bytes / 20;
6672         for (i = 0; i < num_timings; i++) {
6673                 struct displayid_detailed_timings_1 *timings = &det->timings[i];
6674
6675                 newmode = drm_mode_displayid_detailed(connector->dev, timings, type_7);
6676                 if (!newmode)
6677                         continue;
6678
6679                 drm_mode_probed_add(connector, newmode);
6680                 num_modes++;
6681         }
6682         return num_modes;
6683 }
6684
6685 static int add_displayid_detailed_modes(struct drm_connector *connector,
6686                                         const struct drm_edid *drm_edid)
6687 {
6688         const struct displayid_block *block;
6689         struct displayid_iter iter;
6690         int num_modes = 0;
6691
6692         displayid_iter_edid_begin(drm_edid, &iter);
6693         displayid_iter_for_each(block, &iter) {
6694                 if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING ||
6695                     block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING)
6696                         num_modes += add_displayid_detailed_1_modes(connector, block);
6697         }
6698         displayid_iter_end(&iter);
6699
6700         return num_modes;
6701 }
6702
6703 static int _drm_edid_connector_add_modes(struct drm_connector *connector,
6704                                          const struct drm_edid *drm_edid)
6705 {
6706         const struct drm_display_info *info = &connector->display_info;
6707         int num_modes = 0;
6708
6709         if (!drm_edid)
6710                 return 0;
6711
6712         /*
6713          * EDID spec says modes should be preferred in this order:
6714          * - preferred detailed mode
6715          * - other detailed modes from base block
6716          * - detailed modes from extension blocks
6717          * - CVT 3-byte code modes
6718          * - standard timing codes
6719          * - established timing codes
6720          * - modes inferred from GTF or CVT range information
6721          *
6722          * We get this pretty much right.
6723          *
6724          * XXX order for additional mode types in extension blocks?
6725          */
6726         num_modes += add_detailed_modes(connector, drm_edid);
6727         num_modes += add_cvt_modes(connector, drm_edid);
6728         num_modes += add_standard_modes(connector, drm_edid);
6729         num_modes += add_established_modes(connector, drm_edid);
6730         num_modes += add_cea_modes(connector, drm_edid);
6731         num_modes += add_alternate_cea_modes(connector, drm_edid);
6732         num_modes += add_displayid_detailed_modes(connector, drm_edid);
6733         if (drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ)
6734                 num_modes += add_inferred_modes(connector, drm_edid);
6735
6736         if (info->quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
6737                 edid_fixup_preferred(connector);
6738
6739         return num_modes;
6740 }
6741
6742 static void _drm_update_tile_info(struct drm_connector *connector,
6743                                   const struct drm_edid *drm_edid);
6744
6745 static int _drm_edid_connector_property_update(struct drm_connector *connector,
6746                                                const struct drm_edid *drm_edid)
6747 {
6748         struct drm_device *dev = connector->dev;
6749         int ret;
6750
6751         if (connector->edid_blob_ptr) {
6752                 const struct edid *old_edid = connector->edid_blob_ptr->data;
6753
6754                 if (old_edid) {
6755                         if (!drm_edid_are_equal(drm_edid ? drm_edid->edid : NULL, old_edid)) {
6756                                 connector->epoch_counter++;
6757                                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] EDID changed, epoch counter %llu\n",
6758                                             connector->base.id, connector->name,
6759                                             connector->epoch_counter);
6760                         }
6761                 }
6762         }
6763
6764         ret = drm_property_replace_global_blob(dev,
6765                                                &connector->edid_blob_ptr,
6766                                                drm_edid ? drm_edid->size : 0,
6767                                                drm_edid ? drm_edid->edid : NULL,
6768                                                &connector->base,
6769                                                dev->mode_config.edid_property);
6770         if (ret) {
6771                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] EDID property update failed (%d)\n",
6772                             connector->base.id, connector->name, ret);
6773                 goto out;
6774         }
6775
6776         ret = drm_object_property_set_value(&connector->base,
6777                                             dev->mode_config.non_desktop_property,
6778                                             connector->display_info.non_desktop);
6779         if (ret) {
6780                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Non-desktop property update failed (%d)\n",
6781                             connector->base.id, connector->name, ret);
6782                 goto out;
6783         }
6784
6785         ret = drm_connector_set_tile_property(connector);
6786         if (ret) {
6787                 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Tile property update failed (%d)\n",
6788                             connector->base.id, connector->name, ret);
6789                 goto out;
6790         }
6791
6792 out:
6793         return ret;
6794 }
6795
6796 /**
6797  * drm_edid_connector_update - Update connector information from EDID
6798  * @connector: Connector
6799  * @drm_edid: EDID
6800  *
6801  * Update the connector display info, ELD, HDR metadata, relevant properties,
6802  * etc. from the passed in EDID.
6803  *
6804  * If EDID is NULL, reset the information.
6805  *
6806  * Must be called before calling drm_edid_connector_add_modes().
6807  *
6808  * Return: 0 on success, negative error on errors.
6809  */
6810 int drm_edid_connector_update(struct drm_connector *connector,
6811                               const struct drm_edid *drm_edid)
6812 {
6813         update_display_info(connector, drm_edid);
6814
6815         _drm_update_tile_info(connector, drm_edid);
6816
6817         return _drm_edid_connector_property_update(connector, drm_edid);
6818 }
6819 EXPORT_SYMBOL(drm_edid_connector_update);
6820
6821 /**
6822  * drm_edid_connector_add_modes - Update probed modes from the EDID property
6823  * @connector: Connector
6824  *
6825  * Add the modes from the previously updated EDID property to the connector
6826  * probed modes list.
6827  *
6828  * drm_edid_connector_update() must have been called before this to update the
6829  * EDID property.
6830  *
6831  * Return: The number of modes added, or 0 if we couldn't find any.
6832  */
6833 int drm_edid_connector_add_modes(struct drm_connector *connector)
6834 {
6835         const struct drm_edid *drm_edid = NULL;
6836         int count;
6837
6838         if (connector->edid_blob_ptr)
6839                 drm_edid = drm_edid_alloc(connector->edid_blob_ptr->data,
6840                                           connector->edid_blob_ptr->length);
6841
6842         count = _drm_edid_connector_add_modes(connector, drm_edid);
6843
6844         drm_edid_free(drm_edid);
6845
6846         return count;
6847 }
6848 EXPORT_SYMBOL(drm_edid_connector_add_modes);
6849
6850 /**
6851  * drm_connector_update_edid_property - update the edid property of a connector
6852  * @connector: drm connector
6853  * @edid: new value of the edid property
6854  *
6855  * This function creates a new blob modeset object and assigns its id to the
6856  * connector's edid property.
6857  * Since we also parse tile information from EDID's displayID block, we also
6858  * set the connector's tile property here. See drm_connector_set_tile_property()
6859  * for more details.
6860  *
6861  * This function is deprecated. Use drm_edid_connector_update() instead.
6862  *
6863  * Returns:
6864  * Zero on success, negative errno on failure.
6865  */
6866 int drm_connector_update_edid_property(struct drm_connector *connector,
6867                                        const struct edid *edid)
6868 {
6869         struct drm_edid drm_edid;
6870
6871         return drm_edid_connector_update(connector, drm_edid_legacy_init(&drm_edid, edid));
6872 }
6873 EXPORT_SYMBOL(drm_connector_update_edid_property);
6874
6875 /**
6876  * drm_add_edid_modes - add modes from EDID data, if available
6877  * @connector: connector we're probing
6878  * @edid: EDID data
6879  *
6880  * Add the specified modes to the connector's mode list. Also fills out the
6881  * &drm_display_info structure and ELD in @connector with any information which
6882  * can be derived from the edid.
6883  *
6884  * This function is deprecated. Use drm_edid_connector_add_modes() instead.
6885  *
6886  * Return: The number of modes added or 0 if we couldn't find any.
6887  */
6888 int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
6889 {
6890         struct drm_edid _drm_edid;
6891         const struct drm_edid *drm_edid;
6892
6893         if (edid && !drm_edid_is_valid(edid)) {
6894                 drm_warn(connector->dev, "[CONNECTOR:%d:%s] EDID invalid.\n",
6895                          connector->base.id, connector->name);
6896                 edid = NULL;
6897         }
6898
6899         drm_edid = drm_edid_legacy_init(&_drm_edid, edid);
6900
6901         update_display_info(connector, drm_edid);
6902
6903         return _drm_edid_connector_add_modes(connector, drm_edid);
6904 }
6905 EXPORT_SYMBOL(drm_add_edid_modes);
6906
6907 /**
6908  * drm_add_modes_noedid - add modes for the connectors without EDID
6909  * @connector: connector we're probing
6910  * @hdisplay: the horizontal display limit
6911  * @vdisplay: the vertical display limit
6912  *
6913  * Add the specified modes to the connector's mode list. Only when the
6914  * hdisplay/vdisplay is not beyond the given limit, it will be added.
6915  *
6916  * Return: The number of modes added or 0 if we couldn't find any.
6917  */
6918 int drm_add_modes_noedid(struct drm_connector *connector,
6919                         int hdisplay, int vdisplay)
6920 {
6921         int i, count, num_modes = 0;
6922         struct drm_display_mode *mode;
6923         struct drm_device *dev = connector->dev;
6924
6925         count = ARRAY_SIZE(drm_dmt_modes);
6926         if (hdisplay < 0)
6927                 hdisplay = 0;
6928         if (vdisplay < 0)
6929                 vdisplay = 0;
6930
6931         for (i = 0; i < count; i++) {
6932                 const struct drm_display_mode *ptr = &drm_dmt_modes[i];
6933
6934                 if (hdisplay && vdisplay) {
6935                         /*
6936                          * Only when two are valid, they will be used to check
6937                          * whether the mode should be added to the mode list of
6938                          * the connector.
6939                          */
6940                         if (ptr->hdisplay > hdisplay ||
6941                                         ptr->vdisplay > vdisplay)
6942                                 continue;
6943                 }
6944                 if (drm_mode_vrefresh(ptr) > 61)
6945                         continue;
6946                 mode = drm_mode_duplicate(dev, ptr);
6947                 if (mode) {
6948                         drm_mode_probed_add(connector, mode);
6949                         num_modes++;
6950                 }
6951         }
6952         return num_modes;
6953 }
6954 EXPORT_SYMBOL(drm_add_modes_noedid);
6955
6956 /**
6957  * drm_set_preferred_mode - Sets the preferred mode of a connector
6958  * @connector: connector whose mode list should be processed
6959  * @hpref: horizontal resolution of preferred mode
6960  * @vpref: vertical resolution of preferred mode
6961  *
6962  * Marks a mode as preferred if it matches the resolution specified by @hpref
6963  * and @vpref.
6964  */
6965 void drm_set_preferred_mode(struct drm_connector *connector,
6966                            int hpref, int vpref)
6967 {
6968         struct drm_display_mode *mode;
6969
6970         list_for_each_entry(mode, &connector->probed_modes, head) {
6971                 if (mode->hdisplay == hpref &&
6972                     mode->vdisplay == vpref)
6973                         mode->type |= DRM_MODE_TYPE_PREFERRED;
6974         }
6975 }
6976 EXPORT_SYMBOL(drm_set_preferred_mode);
6977
6978 static bool is_hdmi2_sink(const struct drm_connector *connector)
6979 {
6980         /*
6981          * FIXME: sil-sii8620 doesn't have a connector around when
6982          * we need one, so we have to be prepared for a NULL connector.
6983          */
6984         if (!connector)
6985                 return true;
6986
6987         return connector->display_info.hdmi.scdc.supported ||
6988                 connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR420;
6989 }
6990
6991 static u8 drm_mode_hdmi_vic(const struct drm_connector *connector,
6992                             const struct drm_display_mode *mode)
6993 {
6994         bool has_hdmi_infoframe = connector ?
6995                 connector->display_info.has_hdmi_infoframe : false;
6996
6997         if (!has_hdmi_infoframe)
6998                 return 0;
6999
7000         /* No HDMI VIC when signalling 3D video format */
7001         if (mode->flags & DRM_MODE_FLAG_3D_MASK)
7002                 return 0;
7003
7004         return drm_match_hdmi_mode(mode);
7005 }
7006
7007 static u8 drm_mode_cea_vic(const struct drm_connector *connector,
7008                            const struct drm_display_mode *mode)
7009 {
7010         /*
7011          * HDMI spec says if a mode is found in HDMI 1.4b 4K modes
7012          * we should send its VIC in vendor infoframes, else send the
7013          * VIC in AVI infoframes. Lets check if this mode is present in
7014          * HDMI 1.4b 4K modes
7015          */
7016         if (drm_mode_hdmi_vic(connector, mode))
7017                 return 0;
7018
7019         return drm_match_cea_mode(mode);
7020 }
7021
7022 /*
7023  * Avoid sending VICs defined in HDMI 2.0 in AVI infoframes to sinks that
7024  * conform to HDMI 1.4.
7025  *
7026  * HDMI 1.4 (CTA-861-D) VIC range: [1..64]
7027  * HDMI 2.0 (CTA-861-F) VIC range: [1..107]
7028  *
7029  * If the sink lists the VIC in CTA VDB, assume it's fine, regardless of HDMI
7030  * version.
7031  */
7032 static u8 vic_for_avi_infoframe(const struct drm_connector *connector, u8 vic)
7033 {
7034         if (!is_hdmi2_sink(connector) && vic > 64 &&
7035             !cta_vdb_has_vic(connector, vic))
7036                 return 0;
7037
7038         return vic;
7039 }
7040
7041 /**
7042  * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with
7043  *                                              data from a DRM display mode
7044  * @frame: HDMI AVI infoframe
7045  * @connector: the connector
7046  * @mode: DRM display mode
7047  *
7048  * Return: 0 on success or a negative error code on failure.
7049  */
7050 int
7051 drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
7052                                          const struct drm_connector *connector,
7053                                          const struct drm_display_mode *mode)
7054 {
7055         enum hdmi_picture_aspect picture_aspect;
7056         u8 vic, hdmi_vic;
7057
7058         if (!frame || !mode)
7059                 return -EINVAL;
7060
7061         hdmi_avi_infoframe_init(frame);
7062
7063         if (mode->flags & DRM_MODE_FLAG_DBLCLK)
7064                 frame->pixel_repeat = 1;
7065
7066         vic = drm_mode_cea_vic(connector, mode);
7067         hdmi_vic = drm_mode_hdmi_vic(connector, mode);
7068
7069         frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
7070
7071         /*
7072          * As some drivers don't support atomic, we can't use connector state.
7073          * So just initialize the frame with default values, just the same way
7074          * as it's done with other properties here.
7075          */
7076         frame->content_type = HDMI_CONTENT_TYPE_GRAPHICS;
7077         frame->itc = 0;
7078
7079         /*
7080          * Populate picture aspect ratio from either
7081          * user input (if specified) or from the CEA/HDMI mode lists.
7082          */
7083         picture_aspect = mode->picture_aspect_ratio;
7084         if (picture_aspect == HDMI_PICTURE_ASPECT_NONE) {
7085                 if (vic)
7086                         picture_aspect = drm_get_cea_aspect_ratio(vic);
7087                 else if (hdmi_vic)
7088                         picture_aspect = drm_get_hdmi_aspect_ratio(hdmi_vic);
7089         }
7090
7091         /*
7092          * The infoframe can't convey anything but none, 4:3
7093          * and 16:9, so if the user has asked for anything else
7094          * we can only satisfy it by specifying the right VIC.
7095          */
7096         if (picture_aspect > HDMI_PICTURE_ASPECT_16_9) {
7097                 if (vic) {
7098                         if (picture_aspect != drm_get_cea_aspect_ratio(vic))
7099                                 return -EINVAL;
7100                 } else if (hdmi_vic) {
7101                         if (picture_aspect != drm_get_hdmi_aspect_ratio(hdmi_vic))
7102                                 return -EINVAL;
7103                 } else {
7104                         return -EINVAL;
7105                 }
7106
7107                 picture_aspect = HDMI_PICTURE_ASPECT_NONE;
7108         }
7109
7110         frame->video_code = vic_for_avi_infoframe(connector, vic);
7111         frame->picture_aspect = picture_aspect;
7112         frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
7113         frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
7114
7115         return 0;
7116 }
7117 EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
7118
7119 /**
7120  * drm_hdmi_avi_infoframe_quant_range() - fill the HDMI AVI infoframe
7121  *                                        quantization range information
7122  * @frame: HDMI AVI infoframe
7123  * @connector: the connector
7124  * @mode: DRM display mode
7125  * @rgb_quant_range: RGB quantization range (Q)
7126  */
7127 void
7128 drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
7129                                    const struct drm_connector *connector,
7130                                    const struct drm_display_mode *mode,
7131                                    enum hdmi_quantization_range rgb_quant_range)
7132 {
7133         const struct drm_display_info *info = &connector->display_info;
7134
7135         /*
7136          * CEA-861:
7137          * "A Source shall not send a non-zero Q value that does not correspond
7138          *  to the default RGB Quantization Range for the transmitted Picture
7139          *  unless the Sink indicates support for the Q bit in a Video
7140          *  Capabilities Data Block."
7141          *
7142          * HDMI 2.0 recommends sending non-zero Q when it does match the
7143          * default RGB quantization range for the mode, even when QS=0.
7144          */
7145         if (info->rgb_quant_range_selectable ||
7146             rgb_quant_range == drm_default_rgb_quant_range(mode))
7147                 frame->quantization_range = rgb_quant_range;
7148         else
7149                 frame->quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
7150
7151         /*
7152          * CEA-861-F:
7153          * "When transmitting any RGB colorimetry, the Source should set the
7154          *  YQ-field to match the RGB Quantization Range being transmitted
7155          *  (e.g., when Limited Range RGB, set YQ=0 or when Full Range RGB,
7156          *  set YQ=1) and the Sink shall ignore the YQ-field."
7157          *
7158          * Unfortunate certain sinks (eg. VIZ Model 67/E261VA) get confused
7159          * by non-zero YQ when receiving RGB. There doesn't seem to be any
7160          * good way to tell which version of CEA-861 the sink supports, so
7161          * we limit non-zero YQ to HDMI 2.0 sinks only as HDMI 2.0 is based
7162          * on CEA-861-F.
7163          */
7164         if (!is_hdmi2_sink(connector) ||
7165             rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED)
7166                 frame->ycc_quantization_range =
7167                         HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
7168         else
7169                 frame->ycc_quantization_range =
7170                         HDMI_YCC_QUANTIZATION_RANGE_FULL;
7171 }
7172 EXPORT_SYMBOL(drm_hdmi_avi_infoframe_quant_range);
7173
7174 static enum hdmi_3d_structure
7175 s3d_structure_from_display_mode(const struct drm_display_mode *mode)
7176 {
7177         u32 layout = mode->flags & DRM_MODE_FLAG_3D_MASK;
7178
7179         switch (layout) {
7180         case DRM_MODE_FLAG_3D_FRAME_PACKING:
7181                 return HDMI_3D_STRUCTURE_FRAME_PACKING;
7182         case DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE:
7183                 return HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE;
7184         case DRM_MODE_FLAG_3D_LINE_ALTERNATIVE:
7185                 return HDMI_3D_STRUCTURE_LINE_ALTERNATIVE;
7186         case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL:
7187                 return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL;
7188         case DRM_MODE_FLAG_3D_L_DEPTH:
7189                 return HDMI_3D_STRUCTURE_L_DEPTH;
7190         case DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH:
7191                 return HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH;
7192         case DRM_MODE_FLAG_3D_TOP_AND_BOTTOM:
7193                 return HDMI_3D_STRUCTURE_TOP_AND_BOTTOM;
7194         case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF:
7195                 return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF;
7196         default:
7197                 return HDMI_3D_STRUCTURE_INVALID;
7198         }
7199 }
7200
7201 /**
7202  * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
7203  * data from a DRM display mode
7204  * @frame: HDMI vendor infoframe
7205  * @connector: the connector
7206  * @mode: DRM display mode
7207  *
7208  * Note that there's is a need to send HDMI vendor infoframes only when using a
7209  * 4k or stereoscopic 3D mode. So when giving any other mode as input this
7210  * function will return -EINVAL, error that can be safely ignored.
7211  *
7212  * Return: 0 on success or a negative error code on failure.
7213  */
7214 int
7215 drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
7216                                             const struct drm_connector *connector,
7217                                             const struct drm_display_mode *mode)
7218 {
7219         /*
7220          * FIXME: sil-sii8620 doesn't have a connector around when
7221          * we need one, so we have to be prepared for a NULL connector.
7222          */
7223         bool has_hdmi_infoframe = connector ?
7224                 connector->display_info.has_hdmi_infoframe : false;
7225         int err;
7226
7227         if (!frame || !mode)
7228                 return -EINVAL;
7229
7230         if (!has_hdmi_infoframe)
7231                 return -EINVAL;
7232
7233         err = hdmi_vendor_infoframe_init(frame);
7234         if (err < 0)
7235                 return err;
7236
7237         /*
7238          * Even if it's not absolutely necessary to send the infoframe
7239          * (ie.vic==0 and s3d_struct==0) we will still send it if we
7240          * know that the sink can handle it. This is based on a
7241          * suggestion in HDMI 2.0 Appendix F. Apparently some sinks
7242          * have trouble realizing that they should switch from 3D to 2D
7243          * mode if the source simply stops sending the infoframe when
7244          * it wants to switch from 3D to 2D.
7245          */
7246         frame->vic = drm_mode_hdmi_vic(connector, mode);
7247         frame->s3d_struct = s3d_structure_from_display_mode(mode);
7248
7249         return 0;
7250 }
7251 EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode);
7252
7253 static void drm_parse_tiled_block(struct drm_connector *connector,
7254                                   const struct displayid_block *block)
7255 {
7256         const struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block;
7257         u16 w, h;
7258         u8 tile_v_loc, tile_h_loc;
7259         u8 num_v_tile, num_h_tile;
7260         struct drm_tile_group *tg;
7261
7262         w = tile->tile_size[0] | tile->tile_size[1] << 8;
7263         h = tile->tile_size[2] | tile->tile_size[3] << 8;
7264
7265         num_v_tile = (tile->topo[0] & 0xf) | (tile->topo[2] & 0x30);
7266         num_h_tile = (tile->topo[0] >> 4) | ((tile->topo[2] >> 2) & 0x30);
7267         tile_v_loc = (tile->topo[1] & 0xf) | ((tile->topo[2] & 0x3) << 4);
7268         tile_h_loc = (tile->topo[1] >> 4) | (((tile->topo[2] >> 2) & 0x3) << 4);
7269
7270         connector->has_tile = true;
7271         if (tile->tile_cap & 0x80)
7272                 connector->tile_is_single_monitor = true;
7273
7274         connector->num_h_tile = num_h_tile + 1;
7275         connector->num_v_tile = num_v_tile + 1;
7276         connector->tile_h_loc = tile_h_loc;
7277         connector->tile_v_loc = tile_v_loc;
7278         connector->tile_h_size = w + 1;
7279         connector->tile_v_size = h + 1;
7280
7281         drm_dbg_kms(connector->dev,
7282                     "[CONNECTOR:%d:%s] tile cap 0x%x, size %dx%d, num tiles %dx%d, location %dx%d, vend %c%c%c",
7283                     connector->base.id, connector->name,
7284                     tile->tile_cap,
7285                     connector->tile_h_size, connector->tile_v_size,
7286                     connector->num_h_tile, connector->num_v_tile,
7287                     connector->tile_h_loc, connector->tile_v_loc,
7288                     tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]);
7289
7290         tg = drm_mode_get_tile_group(connector->dev, tile->topology_id);
7291         if (!tg)
7292                 tg = drm_mode_create_tile_group(connector->dev, tile->topology_id);
7293         if (!tg)
7294                 return;
7295
7296         if (connector->tile_group != tg) {
7297                 /* if we haven't got a pointer,
7298                    take the reference, drop ref to old tile group */
7299                 if (connector->tile_group)
7300                         drm_mode_put_tile_group(connector->dev, connector->tile_group);
7301                 connector->tile_group = tg;
7302         } else {
7303                 /* if same tile group, then release the ref we just took. */
7304                 drm_mode_put_tile_group(connector->dev, tg);
7305         }
7306 }
7307
7308 static bool displayid_is_tiled_block(const struct displayid_iter *iter,
7309                                      const struct displayid_block *block)
7310 {
7311         return (displayid_version(iter) == DISPLAY_ID_STRUCTURE_VER_12 &&
7312                 block->tag == DATA_BLOCK_TILED_DISPLAY) ||
7313                 (displayid_version(iter) == DISPLAY_ID_STRUCTURE_VER_20 &&
7314                  block->tag == DATA_BLOCK_2_TILED_DISPLAY_TOPOLOGY);
7315 }
7316
7317 static void _drm_update_tile_info(struct drm_connector *connector,
7318                                   const struct drm_edid *drm_edid)
7319 {
7320         const struct displayid_block *block;
7321         struct displayid_iter iter;
7322
7323         connector->has_tile = false;
7324
7325         displayid_iter_edid_begin(drm_edid, &iter);
7326         displayid_iter_for_each(block, &iter) {
7327                 if (displayid_is_tiled_block(&iter, block))
7328                         drm_parse_tiled_block(connector, block);
7329         }
7330         displayid_iter_end(&iter);
7331
7332         if (!connector->has_tile && connector->tile_group) {
7333                 drm_mode_put_tile_group(connector->dev, connector->tile_group);
7334                 connector->tile_group = NULL;
7335         }
7336 }