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