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