xref: /openbmc/linux/drivers/gpu/drm/drm_edid.c (revision 83775e158a3d2dc437132ab357ed6c9214ef0ae9)
1 /*
2  * Copyright (c) 2006 Luc Verhaegen (quirks list)
3  * Copyright (c) 2007-2008 Intel Corporation
4  *   Jesse Barnes <jesse.barnes@intel.com>
5  * Copyright 2010 Red Hat, Inc.
6  *
7  * DDC probing routines (drm_ddc_read & drm_do_probe_ddc_edid) originally from
8  * FB layer.
9  *   Copyright (C) 2006 Dennis Munsie <dmunsie@cecropia.com>
10  *
11  * Permission is hereby granted, free of charge, to any person obtaining a
12  * copy of this software and associated documentation files (the "Software"),
13  * to deal in the Software without restriction, including without limitation
14  * the rights to use, copy, modify, merge, publish, distribute, sub license,
15  * and/or sell copies of the Software, and to permit persons to whom the
16  * Software is furnished to do so, subject to the following conditions:
17  *
18  * The above copyright notice and this permission notice (including the
19  * next paragraph) shall be included in all copies or substantial portions
20  * of the Software.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
25  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28  * DEALINGS IN THE SOFTWARE.
29  */
30 
31 #include <linux/bitfield.h>
32 #include <linux/hdmi.h>
33 #include <linux/i2c.h>
34 #include <linux/kernel.h>
35 #include <linux/module.h>
36 #include <linux/pci.h>
37 #include <linux/slab.h>
38 #include <linux/vga_switcheroo.h>
39 
40 #include <drm/drm_displayid.h>
41 #include <drm/drm_drv.h>
42 #include <drm/drm_edid.h>
43 #include <drm/drm_encoder.h>
44 #include <drm/drm_print.h>
45 
46 #include "drm_crtc_internal.h"
47 
48 static int oui(u8 first, u8 second, u8 third)
49 {
50 	return (first << 16) | (second << 8) | third;
51 }
52 
53 #define EDID_EST_TIMINGS 16
54 #define EDID_STD_TIMINGS 8
55 #define EDID_DETAILED_TIMINGS 4
56 
57 /*
58  * EDID blocks out in the wild have a variety of bugs, try to collect
59  * them here (note that userspace may work around broken monitors first,
60  * but fixes should make their way here so that the kernel "just works"
61  * on as many displays as possible).
62  */
63 
64 /* First detailed mode wrong, use largest 60Hz mode */
65 #define EDID_QUIRK_PREFER_LARGE_60		(1 << 0)
66 /* Reported 135MHz pixel clock is too high, needs adjustment */
67 #define EDID_QUIRK_135_CLOCK_TOO_HIGH		(1 << 1)
68 /* Prefer the largest mode at 75 Hz */
69 #define EDID_QUIRK_PREFER_LARGE_75		(1 << 2)
70 /* Detail timing is in cm not mm */
71 #define EDID_QUIRK_DETAILED_IN_CM		(1 << 3)
72 /* Detailed timing descriptors have bogus size values, so just take the
73  * maximum size and use that.
74  */
75 #define EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE	(1 << 4)
76 /* use +hsync +vsync for detailed mode */
77 #define EDID_QUIRK_DETAILED_SYNC_PP		(1 << 6)
78 /* Force reduced-blanking timings for detailed modes */
79 #define EDID_QUIRK_FORCE_REDUCED_BLANKING	(1 << 7)
80 /* Force 8bpc */
81 #define EDID_QUIRK_FORCE_8BPC			(1 << 8)
82 /* Force 12bpc */
83 #define EDID_QUIRK_FORCE_12BPC			(1 << 9)
84 /* Force 6bpc */
85 #define EDID_QUIRK_FORCE_6BPC			(1 << 10)
86 /* Force 10bpc */
87 #define EDID_QUIRK_FORCE_10BPC			(1 << 11)
88 /* Non desktop display (i.e. HMD) */
89 #define EDID_QUIRK_NON_DESKTOP			(1 << 12)
90 /* Cap the DSC target bitrate to 15bpp */
91 #define EDID_QUIRK_CAP_DSC_15BPP		(1 << 13)
92 
93 #define MICROSOFT_IEEE_OUI	0xca125c
94 
95 struct detailed_mode_closure {
96 	struct drm_connector *connector;
97 	const struct drm_edid *drm_edid;
98 	bool preferred;
99 	int modes;
100 };
101 
102 #define LEVEL_DMT	0
103 #define LEVEL_GTF	1
104 #define LEVEL_GTF2	2
105 #define LEVEL_CVT	3
106 
107 #define EDID_QUIRK(vend_chr_0, vend_chr_1, vend_chr_2, product_id, _quirks) \
108 { \
109 	.panel_id = drm_edid_encode_panel_id(vend_chr_0, vend_chr_1, vend_chr_2, \
110 					     product_id), \
111 	.quirks = _quirks \
112 }
113 
114 static const struct edid_quirk {
115 	u32 panel_id;
116 	u32 quirks;
117 } edid_quirk_list[] = {
118 	/* Acer AL1706 */
119 	EDID_QUIRK('A', 'C', 'R', 44358, EDID_QUIRK_PREFER_LARGE_60),
120 	/* Acer F51 */
121 	EDID_QUIRK('A', 'P', 'I', 0x7602, EDID_QUIRK_PREFER_LARGE_60),
122 
123 	/* AEO model 0 reports 8 bpc, but is a 6 bpc panel */
124 	EDID_QUIRK('A', 'E', 'O', 0, EDID_QUIRK_FORCE_6BPC),
125 
126 	/* BOE model on HP Pavilion 15-n233sl reports 8 bpc, but is a 6 bpc panel */
127 	EDID_QUIRK('B', 'O', 'E', 0x78b, EDID_QUIRK_FORCE_6BPC),
128 
129 	/* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */
130 	EDID_QUIRK('C', 'P', 'T', 0x17df, EDID_QUIRK_FORCE_6BPC),
131 
132 	/* SDC panel of Lenovo B50-80 reports 8 bpc, but is a 6 bpc panel */
133 	EDID_QUIRK('S', 'D', 'C', 0x3652, EDID_QUIRK_FORCE_6BPC),
134 
135 	/* BOE model 0x0771 reports 8 bpc, but is a 6 bpc panel */
136 	EDID_QUIRK('B', 'O', 'E', 0x0771, EDID_QUIRK_FORCE_6BPC),
137 
138 	/* Belinea 10 15 55 */
139 	EDID_QUIRK('M', 'A', 'X', 1516, EDID_QUIRK_PREFER_LARGE_60),
140 	EDID_QUIRK('M', 'A', 'X', 0x77e, EDID_QUIRK_PREFER_LARGE_60),
141 
142 	/* Envision Peripherals, Inc. EN-7100e */
143 	EDID_QUIRK('E', 'P', 'I', 59264, EDID_QUIRK_135_CLOCK_TOO_HIGH),
144 	/* Envision EN2028 */
145 	EDID_QUIRK('E', 'P', 'I', 8232, EDID_QUIRK_PREFER_LARGE_60),
146 
147 	/* Funai Electronics PM36B */
148 	EDID_QUIRK('F', 'C', 'M', 13600, EDID_QUIRK_PREFER_LARGE_75 |
149 				       EDID_QUIRK_DETAILED_IN_CM),
150 
151 	/* LG 27GP950 */
152 	EDID_QUIRK('G', 'S', 'M', 0x5bbf, EDID_QUIRK_CAP_DSC_15BPP),
153 
154 	/* LG 27GN950 */
155 	EDID_QUIRK('G', 'S', 'M', 0x5b9a, EDID_QUIRK_CAP_DSC_15BPP),
156 
157 	/* LGD panel of HP zBook 17 G2, eDP 10 bpc, but reports unknown bpc */
158 	EDID_QUIRK('L', 'G', 'D', 764, EDID_QUIRK_FORCE_10BPC),
159 
160 	/* LG Philips LCD LP154W01-A5 */
161 	EDID_QUIRK('L', 'P', 'L', 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE),
162 	EDID_QUIRK('L', 'P', 'L', 0x2a00, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE),
163 
164 	/* Samsung SyncMaster 205BW.  Note: irony */
165 	EDID_QUIRK('S', 'A', 'M', 541, EDID_QUIRK_DETAILED_SYNC_PP),
166 	/* Samsung SyncMaster 22[5-6]BW */
167 	EDID_QUIRK('S', 'A', 'M', 596, EDID_QUIRK_PREFER_LARGE_60),
168 	EDID_QUIRK('S', 'A', 'M', 638, EDID_QUIRK_PREFER_LARGE_60),
169 
170 	/* Sony PVM-2541A does up to 12 bpc, but only reports max 8 bpc */
171 	EDID_QUIRK('S', 'N', 'Y', 0x2541, EDID_QUIRK_FORCE_12BPC),
172 
173 	/* ViewSonic VA2026w */
174 	EDID_QUIRK('V', 'S', 'C', 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING),
175 
176 	/* Medion MD 30217 PG */
177 	EDID_QUIRK('M', 'E', 'D', 0x7b8, EDID_QUIRK_PREFER_LARGE_75),
178 
179 	/* Lenovo G50 */
180 	EDID_QUIRK('S', 'D', 'C', 18514, EDID_QUIRK_FORCE_6BPC),
181 
182 	/* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */
183 	EDID_QUIRK('S', 'E', 'C', 0xd033, EDID_QUIRK_FORCE_8BPC),
184 
185 	/* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/
186 	EDID_QUIRK('E', 'T', 'R', 13896, EDID_QUIRK_FORCE_8BPC),
187 
188 	/* Valve Index Headset */
189 	EDID_QUIRK('V', 'L', 'V', 0x91a8, EDID_QUIRK_NON_DESKTOP),
190 	EDID_QUIRK('V', 'L', 'V', 0x91b0, EDID_QUIRK_NON_DESKTOP),
191 	EDID_QUIRK('V', 'L', 'V', 0x91b1, EDID_QUIRK_NON_DESKTOP),
192 	EDID_QUIRK('V', 'L', 'V', 0x91b2, EDID_QUIRK_NON_DESKTOP),
193 	EDID_QUIRK('V', 'L', 'V', 0x91b3, EDID_QUIRK_NON_DESKTOP),
194 	EDID_QUIRK('V', 'L', 'V', 0x91b4, EDID_QUIRK_NON_DESKTOP),
195 	EDID_QUIRK('V', 'L', 'V', 0x91b5, EDID_QUIRK_NON_DESKTOP),
196 	EDID_QUIRK('V', 'L', 'V', 0x91b6, EDID_QUIRK_NON_DESKTOP),
197 	EDID_QUIRK('V', 'L', 'V', 0x91b7, EDID_QUIRK_NON_DESKTOP),
198 	EDID_QUIRK('V', 'L', 'V', 0x91b8, EDID_QUIRK_NON_DESKTOP),
199 	EDID_QUIRK('V', 'L', 'V', 0x91b9, EDID_QUIRK_NON_DESKTOP),
200 	EDID_QUIRK('V', 'L', 'V', 0x91ba, EDID_QUIRK_NON_DESKTOP),
201 	EDID_QUIRK('V', 'L', 'V', 0x91bb, EDID_QUIRK_NON_DESKTOP),
202 	EDID_QUIRK('V', 'L', 'V', 0x91bc, EDID_QUIRK_NON_DESKTOP),
203 	EDID_QUIRK('V', 'L', 'V', 0x91bd, EDID_QUIRK_NON_DESKTOP),
204 	EDID_QUIRK('V', 'L', 'V', 0x91be, EDID_QUIRK_NON_DESKTOP),
205 	EDID_QUIRK('V', 'L', 'V', 0x91bf, EDID_QUIRK_NON_DESKTOP),
206 
207 	/* HTC Vive and Vive Pro VR Headsets */
208 	EDID_QUIRK('H', 'V', 'R', 0xaa01, EDID_QUIRK_NON_DESKTOP),
209 	EDID_QUIRK('H', 'V', 'R', 0xaa02, EDID_QUIRK_NON_DESKTOP),
210 
211 	/* Oculus Rift DK1, DK2, CV1 and Rift S VR Headsets */
212 	EDID_QUIRK('O', 'V', 'R', 0x0001, EDID_QUIRK_NON_DESKTOP),
213 	EDID_QUIRK('O', 'V', 'R', 0x0003, EDID_QUIRK_NON_DESKTOP),
214 	EDID_QUIRK('O', 'V', 'R', 0x0004, EDID_QUIRK_NON_DESKTOP),
215 	EDID_QUIRK('O', 'V', 'R', 0x0012, EDID_QUIRK_NON_DESKTOP),
216 
217 	/* Windows Mixed Reality Headsets */
218 	EDID_QUIRK('A', 'C', 'R', 0x7fce, EDID_QUIRK_NON_DESKTOP),
219 	EDID_QUIRK('L', 'E', 'N', 0x0408, EDID_QUIRK_NON_DESKTOP),
220 	EDID_QUIRK('F', 'U', 'J', 0x1970, EDID_QUIRK_NON_DESKTOP),
221 	EDID_QUIRK('D', 'E', 'L', 0x7fce, EDID_QUIRK_NON_DESKTOP),
222 	EDID_QUIRK('S', 'E', 'C', 0x144a, EDID_QUIRK_NON_DESKTOP),
223 	EDID_QUIRK('A', 'U', 'S', 0xc102, EDID_QUIRK_NON_DESKTOP),
224 
225 	/* Sony PlayStation VR Headset */
226 	EDID_QUIRK('S', 'N', 'Y', 0x0704, EDID_QUIRK_NON_DESKTOP),
227 
228 	/* Sensics VR Headsets */
229 	EDID_QUIRK('S', 'E', 'N', 0x1019, EDID_QUIRK_NON_DESKTOP),
230 
231 	/* OSVR HDK and HDK2 VR Headsets */
232 	EDID_QUIRK('S', 'V', 'R', 0x1019, EDID_QUIRK_NON_DESKTOP),
233 	EDID_QUIRK('A', 'U', 'O', 0x1111, EDID_QUIRK_NON_DESKTOP),
234 };
235 
236 /*
237  * Autogenerated from the DMT spec.
238  * This table is copied from xfree86/modes/xf86EdidModes.c.
239  */
240 static const struct drm_display_mode drm_dmt_modes[] = {
241 	/* 0x01 - 640x350@85Hz */
242 	{ DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
243 		   736, 832, 0, 350, 382, 385, 445, 0,
244 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
245 	/* 0x02 - 640x400@85Hz */
246 	{ DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
247 		   736, 832, 0, 400, 401, 404, 445, 0,
248 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
249 	/* 0x03 - 720x400@85Hz */
250 	{ DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 756,
251 		   828, 936, 0, 400, 401, 404, 446, 0,
252 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
253 	/* 0x04 - 640x480@60Hz */
254 	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
255 		   752, 800, 0, 480, 490, 492, 525, 0,
256 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
257 	/* 0x05 - 640x480@72Hz */
258 	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
259 		   704, 832, 0, 480, 489, 492, 520, 0,
260 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
261 	/* 0x06 - 640x480@75Hz */
262 	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656,
263 		   720, 840, 0, 480, 481, 484, 500, 0,
264 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
265 	/* 0x07 - 640x480@85Hz */
266 	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 36000, 640, 696,
267 		   752, 832, 0, 480, 481, 484, 509, 0,
268 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
269 	/* 0x08 - 800x600@56Hz */
270 	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824,
271 		   896, 1024, 0, 600, 601, 603, 625, 0,
272 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
273 	/* 0x09 - 800x600@60Hz */
274 	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
275 		   968, 1056, 0, 600, 601, 605, 628, 0,
276 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
277 	/* 0x0a - 800x600@72Hz */
278 	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856,
279 		   976, 1040, 0, 600, 637, 643, 666, 0,
280 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
281 	/* 0x0b - 800x600@75Hz */
282 	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816,
283 		   896, 1056, 0, 600, 601, 604, 625, 0,
284 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
285 	/* 0x0c - 800x600@85Hz */
286 	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 56250, 800, 832,
287 		   896, 1048, 0, 600, 601, 604, 631, 0,
288 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
289 	/* 0x0d - 800x600@120Hz RB */
290 	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 73250, 800, 848,
291 		   880, 960, 0, 600, 603, 607, 636, 0,
292 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
293 	/* 0x0e - 848x480@60Hz */
294 	{ DRM_MODE("848x480", DRM_MODE_TYPE_DRIVER, 33750, 848, 864,
295 		   976, 1088, 0, 480, 486, 494, 517, 0,
296 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
297 	/* 0x0f - 1024x768@43Hz, interlace */
298 	{ DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032,
299 		   1208, 1264, 0, 768, 768, 776, 817, 0,
300 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
301 		   DRM_MODE_FLAG_INTERLACE) },
302 	/* 0x10 - 1024x768@60Hz */
303 	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
304 		   1184, 1344, 0, 768, 771, 777, 806, 0,
305 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
306 	/* 0x11 - 1024x768@70Hz */
307 	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048,
308 		   1184, 1328, 0, 768, 771, 777, 806, 0,
309 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
310 	/* 0x12 - 1024x768@75Hz */
311 	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040,
312 		   1136, 1312, 0, 768, 769, 772, 800, 0,
313 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
314 	/* 0x13 - 1024x768@85Hz */
315 	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 94500, 1024, 1072,
316 		   1168, 1376, 0, 768, 769, 772, 808, 0,
317 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
318 	/* 0x14 - 1024x768@120Hz RB */
319 	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 115500, 1024, 1072,
320 		   1104, 1184, 0, 768, 771, 775, 813, 0,
321 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
322 	/* 0x15 - 1152x864@75Hz */
323 	{ DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216,
324 		   1344, 1600, 0, 864, 865, 868, 900, 0,
325 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
326 	/* 0x55 - 1280x720@60Hz */
327 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
328 		   1430, 1650, 0, 720, 725, 730, 750, 0,
329 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
330 	/* 0x16 - 1280x768@60Hz RB */
331 	{ DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 68250, 1280, 1328,
332 		   1360, 1440, 0, 768, 771, 778, 790, 0,
333 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
334 	/* 0x17 - 1280x768@60Hz */
335 	{ DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 79500, 1280, 1344,
336 		   1472, 1664, 0, 768, 771, 778, 798, 0,
337 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
338 	/* 0x18 - 1280x768@75Hz */
339 	{ DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 102250, 1280, 1360,
340 		   1488, 1696, 0, 768, 771, 778, 805, 0,
341 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
342 	/* 0x19 - 1280x768@85Hz */
343 	{ DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 117500, 1280, 1360,
344 		   1496, 1712, 0, 768, 771, 778, 809, 0,
345 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
346 	/* 0x1a - 1280x768@120Hz RB */
347 	{ DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 140250, 1280, 1328,
348 		   1360, 1440, 0, 768, 771, 778, 813, 0,
349 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
350 	/* 0x1b - 1280x800@60Hz RB */
351 	{ DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 71000, 1280, 1328,
352 		   1360, 1440, 0, 800, 803, 809, 823, 0,
353 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
354 	/* 0x1c - 1280x800@60Hz */
355 	{ DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352,
356 		   1480, 1680, 0, 800, 803, 809, 831, 0,
357 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
358 	/* 0x1d - 1280x800@75Hz */
359 	{ DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 106500, 1280, 1360,
360 		   1488, 1696, 0, 800, 803, 809, 838, 0,
361 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
362 	/* 0x1e - 1280x800@85Hz */
363 	{ DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 122500, 1280, 1360,
364 		   1496, 1712, 0, 800, 803, 809, 843, 0,
365 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
366 	/* 0x1f - 1280x800@120Hz RB */
367 	{ DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 146250, 1280, 1328,
368 		   1360, 1440, 0, 800, 803, 809, 847, 0,
369 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
370 	/* 0x20 - 1280x960@60Hz */
371 	{ DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1376,
372 		   1488, 1800, 0, 960, 961, 964, 1000, 0,
373 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
374 	/* 0x21 - 1280x960@85Hz */
375 	{ DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1344,
376 		   1504, 1728, 0, 960, 961, 964, 1011, 0,
377 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
378 	/* 0x22 - 1280x960@120Hz RB */
379 	{ DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 175500, 1280, 1328,
380 		   1360, 1440, 0, 960, 963, 967, 1017, 0,
381 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
382 	/* 0x23 - 1280x1024@60Hz */
383 	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1328,
384 		   1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
385 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
386 	/* 0x24 - 1280x1024@75Hz */
387 	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296,
388 		   1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
389 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
390 	/* 0x25 - 1280x1024@85Hz */
391 	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 157500, 1280, 1344,
392 		   1504, 1728, 0, 1024, 1025, 1028, 1072, 0,
393 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
394 	/* 0x26 - 1280x1024@120Hz RB */
395 	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 187250, 1280, 1328,
396 		   1360, 1440, 0, 1024, 1027, 1034, 1084, 0,
397 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
398 	/* 0x27 - 1360x768@60Hz */
399 	{ DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 85500, 1360, 1424,
400 		   1536, 1792, 0, 768, 771, 777, 795, 0,
401 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
402 	/* 0x28 - 1360x768@120Hz RB */
403 	{ DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 148250, 1360, 1408,
404 		   1440, 1520, 0, 768, 771, 776, 813, 0,
405 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
406 	/* 0x51 - 1366x768@60Hz */
407 	{ DRM_MODE("1366x768", DRM_MODE_TYPE_DRIVER, 85500, 1366, 1436,
408 		   1579, 1792, 0, 768, 771, 774, 798, 0,
409 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
410 	/* 0x56 - 1366x768@60Hz */
411 	{ DRM_MODE("1366x768", DRM_MODE_TYPE_DRIVER, 72000, 1366, 1380,
412 		   1436, 1500, 0, 768, 769, 772, 800, 0,
413 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
414 	/* 0x29 - 1400x1050@60Hz RB */
415 	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 101000, 1400, 1448,
416 		   1480, 1560, 0, 1050, 1053, 1057, 1080, 0,
417 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
418 	/* 0x2a - 1400x1050@60Hz */
419 	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 121750, 1400, 1488,
420 		   1632, 1864, 0, 1050, 1053, 1057, 1089, 0,
421 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
422 	/* 0x2b - 1400x1050@75Hz */
423 	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 156000, 1400, 1504,
424 		   1648, 1896, 0, 1050, 1053, 1057, 1099, 0,
425 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
426 	/* 0x2c - 1400x1050@85Hz */
427 	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 179500, 1400, 1504,
428 		   1656, 1912, 0, 1050, 1053, 1057, 1105, 0,
429 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
430 	/* 0x2d - 1400x1050@120Hz RB */
431 	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 208000, 1400, 1448,
432 		   1480, 1560, 0, 1050, 1053, 1057, 1112, 0,
433 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
434 	/* 0x2e - 1440x900@60Hz RB */
435 	{ DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 88750, 1440, 1488,
436 		   1520, 1600, 0, 900, 903, 909, 926, 0,
437 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
438 	/* 0x2f - 1440x900@60Hz */
439 	{ DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 106500, 1440, 1520,
440 		   1672, 1904, 0, 900, 903, 909, 934, 0,
441 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
442 	/* 0x30 - 1440x900@75Hz */
443 	{ DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 136750, 1440, 1536,
444 		   1688, 1936, 0, 900, 903, 909, 942, 0,
445 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
446 	/* 0x31 - 1440x900@85Hz */
447 	{ DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 157000, 1440, 1544,
448 		   1696, 1952, 0, 900, 903, 909, 948, 0,
449 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
450 	/* 0x32 - 1440x900@120Hz RB */
451 	{ DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 182750, 1440, 1488,
452 		   1520, 1600, 0, 900, 903, 909, 953, 0,
453 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
454 	/* 0x53 - 1600x900@60Hz */
455 	{ DRM_MODE("1600x900", DRM_MODE_TYPE_DRIVER, 108000, 1600, 1624,
456 		   1704, 1800, 0, 900, 901, 904, 1000, 0,
457 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
458 	/* 0x33 - 1600x1200@60Hz */
459 	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 162000, 1600, 1664,
460 		   1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
461 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
462 	/* 0x34 - 1600x1200@65Hz */
463 	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 175500, 1600, 1664,
464 		   1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
465 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
466 	/* 0x35 - 1600x1200@70Hz */
467 	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 189000, 1600, 1664,
468 		   1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
469 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
470 	/* 0x36 - 1600x1200@75Hz */
471 	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 202500, 1600, 1664,
472 		   1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
473 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
474 	/* 0x37 - 1600x1200@85Hz */
475 	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 229500, 1600, 1664,
476 		   1856, 2160, 0, 1200, 1201, 1204, 1250, 0,
477 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
478 	/* 0x38 - 1600x1200@120Hz RB */
479 	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 268250, 1600, 1648,
480 		   1680, 1760, 0, 1200, 1203, 1207, 1271, 0,
481 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
482 	/* 0x39 - 1680x1050@60Hz RB */
483 	{ DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 119000, 1680, 1728,
484 		   1760, 1840, 0, 1050, 1053, 1059, 1080, 0,
485 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
486 	/* 0x3a - 1680x1050@60Hz */
487 	{ DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 146250, 1680, 1784,
488 		   1960, 2240, 0, 1050, 1053, 1059, 1089, 0,
489 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
490 	/* 0x3b - 1680x1050@75Hz */
491 	{ DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 187000, 1680, 1800,
492 		   1976, 2272, 0, 1050, 1053, 1059, 1099, 0,
493 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
494 	/* 0x3c - 1680x1050@85Hz */
495 	{ DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 214750, 1680, 1808,
496 		   1984, 2288, 0, 1050, 1053, 1059, 1105, 0,
497 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
498 	/* 0x3d - 1680x1050@120Hz RB */
499 	{ DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 245500, 1680, 1728,
500 		   1760, 1840, 0, 1050, 1053, 1059, 1112, 0,
501 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
502 	/* 0x3e - 1792x1344@60Hz */
503 	{ DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 204750, 1792, 1920,
504 		   2120, 2448, 0, 1344, 1345, 1348, 1394, 0,
505 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
506 	/* 0x3f - 1792x1344@75Hz */
507 	{ DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 261000, 1792, 1888,
508 		   2104, 2456, 0, 1344, 1345, 1348, 1417, 0,
509 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
510 	/* 0x40 - 1792x1344@120Hz RB */
511 	{ DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 333250, 1792, 1840,
512 		   1872, 1952, 0, 1344, 1347, 1351, 1423, 0,
513 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
514 	/* 0x41 - 1856x1392@60Hz */
515 	{ DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 218250, 1856, 1952,
516 		   2176, 2528, 0, 1392, 1393, 1396, 1439, 0,
517 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
518 	/* 0x42 - 1856x1392@75Hz */
519 	{ DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 288000, 1856, 1984,
520 		   2208, 2560, 0, 1392, 1393, 1396, 1500, 0,
521 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
522 	/* 0x43 - 1856x1392@120Hz RB */
523 	{ DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 356500, 1856, 1904,
524 		   1936, 2016, 0, 1392, 1395, 1399, 1474, 0,
525 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
526 	/* 0x52 - 1920x1080@60Hz */
527 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
528 		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
529 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
530 	/* 0x44 - 1920x1200@60Hz RB */
531 	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 154000, 1920, 1968,
532 		   2000, 2080, 0, 1200, 1203, 1209, 1235, 0,
533 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
534 	/* 0x45 - 1920x1200@60Hz */
535 	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 193250, 1920, 2056,
536 		   2256, 2592, 0, 1200, 1203, 1209, 1245, 0,
537 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
538 	/* 0x46 - 1920x1200@75Hz */
539 	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 245250, 1920, 2056,
540 		   2264, 2608, 0, 1200, 1203, 1209, 1255, 0,
541 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
542 	/* 0x47 - 1920x1200@85Hz */
543 	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 281250, 1920, 2064,
544 		   2272, 2624, 0, 1200, 1203, 1209, 1262, 0,
545 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
546 	/* 0x48 - 1920x1200@120Hz RB */
547 	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 317000, 1920, 1968,
548 		   2000, 2080, 0, 1200, 1203, 1209, 1271, 0,
549 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
550 	/* 0x49 - 1920x1440@60Hz */
551 	{ DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 234000, 1920, 2048,
552 		   2256, 2600, 0, 1440, 1441, 1444, 1500, 0,
553 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
554 	/* 0x4a - 1920x1440@75Hz */
555 	{ DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2064,
556 		   2288, 2640, 0, 1440, 1441, 1444, 1500, 0,
557 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
558 	/* 0x4b - 1920x1440@120Hz RB */
559 	{ DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 380500, 1920, 1968,
560 		   2000, 2080, 0, 1440, 1443, 1447, 1525, 0,
561 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
562 	/* 0x54 - 2048x1152@60Hz */
563 	{ DRM_MODE("2048x1152", DRM_MODE_TYPE_DRIVER, 162000, 2048, 2074,
564 		   2154, 2250, 0, 1152, 1153, 1156, 1200, 0,
565 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
566 	/* 0x4c - 2560x1600@60Hz RB */
567 	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 268500, 2560, 2608,
568 		   2640, 2720, 0, 1600, 1603, 1609, 1646, 0,
569 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
570 	/* 0x4d - 2560x1600@60Hz */
571 	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 348500, 2560, 2752,
572 		   3032, 3504, 0, 1600, 1603, 1609, 1658, 0,
573 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
574 	/* 0x4e - 2560x1600@75Hz */
575 	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 443250, 2560, 2768,
576 		   3048, 3536, 0, 1600, 1603, 1609, 1672, 0,
577 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
578 	/* 0x4f - 2560x1600@85Hz */
579 	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 505250, 2560, 2768,
580 		   3048, 3536, 0, 1600, 1603, 1609, 1682, 0,
581 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },
582 	/* 0x50 - 2560x1600@120Hz RB */
583 	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 552750, 2560, 2608,
584 		   2640, 2720, 0, 1600, 1603, 1609, 1694, 0,
585 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
586 	/* 0x57 - 4096x2160@60Hz RB */
587 	{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 556744, 4096, 4104,
588 		   4136, 4176, 0, 2160, 2208, 2216, 2222, 0,
589 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
590 	/* 0x58 - 4096x2160@59.94Hz RB */
591 	{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 556188, 4096, 4104,
592 		   4136, 4176, 0, 2160, 2208, 2216, 2222, 0,
593 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
594 };
595 
596 /*
597  * These more or less come from the DMT spec.  The 720x400 modes are
598  * inferred from historical 80x25 practice.  The 640x480@67 and 832x624@75
599  * modes are old-school Mac modes.  The EDID spec says the 1152x864@75 mode
600  * should be 1152x870, again for the Mac, but instead we use the x864 DMT
601  * mode.
602  *
603  * The DMT modes have been fact-checked; the rest are mild guesses.
604  */
605 static const struct drm_display_mode edid_est_modes[] = {
606 	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
607 		   968, 1056, 0, 600, 601, 605, 628, 0,
608 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@60Hz */
609 	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824,
610 		   896, 1024, 0, 600, 601, 603,  625, 0,
611 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@56Hz */
612 	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656,
613 		   720, 840, 0, 480, 481, 484, 500, 0,
614 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@75Hz */
615 	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
616 		   704,  832, 0, 480, 489, 492, 520, 0,
617 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@72Hz */
618 	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 30240, 640, 704,
619 		   768,  864, 0, 480, 483, 486, 525, 0,
620 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@67Hz */
621 	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
622 		   752, 800, 0, 480, 490, 492, 525, 0,
623 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@60Hz */
624 	{ DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 738,
625 		   846, 900, 0, 400, 421, 423,  449, 0,
626 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 720x400@88Hz */
627 	{ DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 28320, 720, 738,
628 		   846,  900, 0, 400, 412, 414, 449, 0,
629 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 720x400@70Hz */
630 	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296,
631 		   1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
632 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */
633 	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040,
634 		   1136, 1312, 0,  768, 769, 772, 800, 0,
635 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1024x768@75Hz */
636 	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048,
637 		   1184, 1328, 0,  768, 771, 777, 806, 0,
638 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@70Hz */
639 	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
640 		   1184, 1344, 0,  768, 771, 777, 806, 0,
641 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@60Hz */
642 	{ DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER,44900, 1024, 1032,
643 		   1208, 1264, 0, 768, 768, 776, 817, 0,
644 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* 1024x768@43Hz */
645 	{ DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 57284, 832, 864,
646 		   928, 1152, 0, 624, 625, 628, 667, 0,
647 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 832x624@75Hz */
648 	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816,
649 		   896, 1056, 0, 600, 601, 604,  625, 0,
650 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@75Hz */
651 	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856,
652 		   976, 1040, 0, 600, 637, 643, 666, 0,
653 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@72Hz */
654 	{ DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216,
655 		   1344, 1600, 0,  864, 865, 868, 900, 0,
656 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1152x864@75Hz */
657 };
658 
659 struct minimode {
660 	short w;
661 	short h;
662 	short r;
663 	short rb;
664 };
665 
666 static const struct minimode est3_modes[] = {
667 	/* byte 6 */
668 	{ 640, 350, 85, 0 },
669 	{ 640, 400, 85, 0 },
670 	{ 720, 400, 85, 0 },
671 	{ 640, 480, 85, 0 },
672 	{ 848, 480, 60, 0 },
673 	{ 800, 600, 85, 0 },
674 	{ 1024, 768, 85, 0 },
675 	{ 1152, 864, 75, 0 },
676 	/* byte 7 */
677 	{ 1280, 768, 60, 1 },
678 	{ 1280, 768, 60, 0 },
679 	{ 1280, 768, 75, 0 },
680 	{ 1280, 768, 85, 0 },
681 	{ 1280, 960, 60, 0 },
682 	{ 1280, 960, 85, 0 },
683 	{ 1280, 1024, 60, 0 },
684 	{ 1280, 1024, 85, 0 },
685 	/* byte 8 */
686 	{ 1360, 768, 60, 0 },
687 	{ 1440, 900, 60, 1 },
688 	{ 1440, 900, 60, 0 },
689 	{ 1440, 900, 75, 0 },
690 	{ 1440, 900, 85, 0 },
691 	{ 1400, 1050, 60, 1 },
692 	{ 1400, 1050, 60, 0 },
693 	{ 1400, 1050, 75, 0 },
694 	/* byte 9 */
695 	{ 1400, 1050, 85, 0 },
696 	{ 1680, 1050, 60, 1 },
697 	{ 1680, 1050, 60, 0 },
698 	{ 1680, 1050, 75, 0 },
699 	{ 1680, 1050, 85, 0 },
700 	{ 1600, 1200, 60, 0 },
701 	{ 1600, 1200, 65, 0 },
702 	{ 1600, 1200, 70, 0 },
703 	/* byte 10 */
704 	{ 1600, 1200, 75, 0 },
705 	{ 1600, 1200, 85, 0 },
706 	{ 1792, 1344, 60, 0 },
707 	{ 1792, 1344, 75, 0 },
708 	{ 1856, 1392, 60, 0 },
709 	{ 1856, 1392, 75, 0 },
710 	{ 1920, 1200, 60, 1 },
711 	{ 1920, 1200, 60, 0 },
712 	/* byte 11 */
713 	{ 1920, 1200, 75, 0 },
714 	{ 1920, 1200, 85, 0 },
715 	{ 1920, 1440, 60, 0 },
716 	{ 1920, 1440, 75, 0 },
717 };
718 
719 static const struct minimode extra_modes[] = {
720 	{ 1024, 576,  60, 0 },
721 	{ 1366, 768,  60, 0 },
722 	{ 1600, 900,  60, 0 },
723 	{ 1680, 945,  60, 0 },
724 	{ 1920, 1080, 60, 0 },
725 	{ 2048, 1152, 60, 0 },
726 	{ 2048, 1536, 60, 0 },
727 };
728 
729 /*
730  * From CEA/CTA-861 spec.
731  *
732  * Do not access directly, instead always use cea_mode_for_vic().
733  */
734 static const struct drm_display_mode edid_cea_modes_1[] = {
735 	/* 1 - 640x480@60Hz 4:3 */
736 	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
737 		   752, 800, 0, 480, 490, 492, 525, 0,
738 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
739 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
740 	/* 2 - 720x480@60Hz 4:3 */
741 	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
742 		   798, 858, 0, 480, 489, 495, 525, 0,
743 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
744 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
745 	/* 3 - 720x480@60Hz 16:9 */
746 	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
747 		   798, 858, 0, 480, 489, 495, 525, 0,
748 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
749 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
750 	/* 4 - 1280x720@60Hz 16:9 */
751 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
752 		   1430, 1650, 0, 720, 725, 730, 750, 0,
753 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
754 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
755 	/* 5 - 1920x1080i@60Hz 16:9 */
756 	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
757 		   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
758 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
759 		   DRM_MODE_FLAG_INTERLACE),
760 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
761 	/* 6 - 720(1440)x480i@60Hz 4:3 */
762 	{ DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
763 		   801, 858, 0, 480, 488, 494, 525, 0,
764 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
765 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
766 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
767 	/* 7 - 720(1440)x480i@60Hz 16:9 */
768 	{ DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
769 		   801, 858, 0, 480, 488, 494, 525, 0,
770 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
771 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
772 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
773 	/* 8 - 720(1440)x240@60Hz 4:3 */
774 	{ DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
775 		   801, 858, 0, 240, 244, 247, 262, 0,
776 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
777 		   DRM_MODE_FLAG_DBLCLK),
778 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
779 	/* 9 - 720(1440)x240@60Hz 16:9 */
780 	{ DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
781 		   801, 858, 0, 240, 244, 247, 262, 0,
782 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
783 		   DRM_MODE_FLAG_DBLCLK),
784 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
785 	/* 10 - 2880x480i@60Hz 4:3 */
786 	{ DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
787 		   3204, 3432, 0, 480, 488, 494, 525, 0,
788 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
789 		   DRM_MODE_FLAG_INTERLACE),
790 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
791 	/* 11 - 2880x480i@60Hz 16:9 */
792 	{ DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
793 		   3204, 3432, 0, 480, 488, 494, 525, 0,
794 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
795 		   DRM_MODE_FLAG_INTERLACE),
796 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
797 	/* 12 - 2880x240@60Hz 4:3 */
798 	{ DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
799 		   3204, 3432, 0, 240, 244, 247, 262, 0,
800 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
801 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
802 	/* 13 - 2880x240@60Hz 16:9 */
803 	{ DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
804 		   3204, 3432, 0, 240, 244, 247, 262, 0,
805 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
806 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
807 	/* 14 - 1440x480@60Hz 4:3 */
808 	{ DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
809 		   1596, 1716, 0, 480, 489, 495, 525, 0,
810 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
811 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
812 	/* 15 - 1440x480@60Hz 16:9 */
813 	{ DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
814 		   1596, 1716, 0, 480, 489, 495, 525, 0,
815 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
816 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
817 	/* 16 - 1920x1080@60Hz 16:9 */
818 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
819 		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
820 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
821 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
822 	/* 17 - 720x576@50Hz 4:3 */
823 	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
824 		   796, 864, 0, 576, 581, 586, 625, 0,
825 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
826 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
827 	/* 18 - 720x576@50Hz 16:9 */
828 	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
829 		   796, 864, 0, 576, 581, 586, 625, 0,
830 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
831 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
832 	/* 19 - 1280x720@50Hz 16:9 */
833 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
834 		   1760, 1980, 0, 720, 725, 730, 750, 0,
835 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
836 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
837 	/* 20 - 1920x1080i@50Hz 16:9 */
838 	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
839 		   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
840 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
841 		   DRM_MODE_FLAG_INTERLACE),
842 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
843 	/* 21 - 720(1440)x576i@50Hz 4:3 */
844 	{ DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
845 		   795, 864, 0, 576, 580, 586, 625, 0,
846 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
847 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
848 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
849 	/* 22 - 720(1440)x576i@50Hz 16:9 */
850 	{ DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
851 		   795, 864, 0, 576, 580, 586, 625, 0,
852 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
853 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
854 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
855 	/* 23 - 720(1440)x288@50Hz 4:3 */
856 	{ DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
857 		   795, 864, 0, 288, 290, 293, 312, 0,
858 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
859 		   DRM_MODE_FLAG_DBLCLK),
860 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
861 	/* 24 - 720(1440)x288@50Hz 16:9 */
862 	{ DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
863 		   795, 864, 0, 288, 290, 293, 312, 0,
864 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
865 		   DRM_MODE_FLAG_DBLCLK),
866 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
867 	/* 25 - 2880x576i@50Hz 4:3 */
868 	{ DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
869 		   3180, 3456, 0, 576, 580, 586, 625, 0,
870 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
871 		   DRM_MODE_FLAG_INTERLACE),
872 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
873 	/* 26 - 2880x576i@50Hz 16:9 */
874 	{ DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
875 		   3180, 3456, 0, 576, 580, 586, 625, 0,
876 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
877 		   DRM_MODE_FLAG_INTERLACE),
878 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
879 	/* 27 - 2880x288@50Hz 4:3 */
880 	{ DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
881 		   3180, 3456, 0, 288, 290, 293, 312, 0,
882 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
883 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
884 	/* 28 - 2880x288@50Hz 16:9 */
885 	{ DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
886 		   3180, 3456, 0, 288, 290, 293, 312, 0,
887 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
888 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
889 	/* 29 - 1440x576@50Hz 4:3 */
890 	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
891 		   1592, 1728, 0, 576, 581, 586, 625, 0,
892 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
893 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
894 	/* 30 - 1440x576@50Hz 16:9 */
895 	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
896 		   1592, 1728, 0, 576, 581, 586, 625, 0,
897 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
898 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
899 	/* 31 - 1920x1080@50Hz 16:9 */
900 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
901 		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
902 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
903 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
904 	/* 32 - 1920x1080@24Hz 16:9 */
905 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
906 		   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
907 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
908 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
909 	/* 33 - 1920x1080@25Hz 16:9 */
910 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
911 		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
912 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
913 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
914 	/* 34 - 1920x1080@30Hz 16:9 */
915 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
916 		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
917 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
918 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
919 	/* 35 - 2880x480@60Hz 4:3 */
920 	{ DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
921 		   3192, 3432, 0, 480, 489, 495, 525, 0,
922 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
923 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
924 	/* 36 - 2880x480@60Hz 16:9 */
925 	{ DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
926 		   3192, 3432, 0, 480, 489, 495, 525, 0,
927 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
928 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
929 	/* 37 - 2880x576@50Hz 4:3 */
930 	{ DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
931 		   3184, 3456, 0, 576, 581, 586, 625, 0,
932 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
933 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
934 	/* 38 - 2880x576@50Hz 16:9 */
935 	{ DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
936 		   3184, 3456, 0, 576, 581, 586, 625, 0,
937 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
938 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
939 	/* 39 - 1920x1080i@50Hz 16:9 */
940 	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952,
941 		   2120, 2304, 0, 1080, 1126, 1136, 1250, 0,
942 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC |
943 		   DRM_MODE_FLAG_INTERLACE),
944 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
945 	/* 40 - 1920x1080i@100Hz 16:9 */
946 	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
947 		   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
948 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
949 		   DRM_MODE_FLAG_INTERLACE),
950 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
951 	/* 41 - 1280x720@100Hz 16:9 */
952 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
953 		   1760, 1980, 0, 720, 725, 730, 750, 0,
954 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
955 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
956 	/* 42 - 720x576@100Hz 4:3 */
957 	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
958 		   796, 864, 0, 576, 581, 586, 625, 0,
959 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
960 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
961 	/* 43 - 720x576@100Hz 16:9 */
962 	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
963 		   796, 864, 0, 576, 581, 586, 625, 0,
964 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
965 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
966 	/* 44 - 720(1440)x576i@100Hz 4:3 */
967 	{ DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
968 		   795, 864, 0, 576, 580, 586, 625, 0,
969 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
970 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
971 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
972 	/* 45 - 720(1440)x576i@100Hz 16:9 */
973 	{ DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
974 		   795, 864, 0, 576, 580, 586, 625, 0,
975 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
976 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
977 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
978 	/* 46 - 1920x1080i@120Hz 16:9 */
979 	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
980 		   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
981 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
982 		   DRM_MODE_FLAG_INTERLACE),
983 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
984 	/* 47 - 1280x720@120Hz 16:9 */
985 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
986 		   1430, 1650, 0, 720, 725, 730, 750, 0,
987 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
988 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
989 	/* 48 - 720x480@120Hz 4:3 */
990 	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
991 		   798, 858, 0, 480, 489, 495, 525, 0,
992 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
993 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
994 	/* 49 - 720x480@120Hz 16:9 */
995 	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
996 		   798, 858, 0, 480, 489, 495, 525, 0,
997 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
998 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
999 	/* 50 - 720(1440)x480i@120Hz 4:3 */
1000 	{ DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
1001 		   801, 858, 0, 480, 488, 494, 525, 0,
1002 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1003 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1004 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
1005 	/* 51 - 720(1440)x480i@120Hz 16:9 */
1006 	{ DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
1007 		   801, 858, 0, 480, 488, 494, 525, 0,
1008 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1009 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1010 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1011 	/* 52 - 720x576@200Hz 4:3 */
1012 	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
1013 		   796, 864, 0, 576, 581, 586, 625, 0,
1014 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
1015 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
1016 	/* 53 - 720x576@200Hz 16:9 */
1017 	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
1018 		   796, 864, 0, 576, 581, 586, 625, 0,
1019 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
1020 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1021 	/* 54 - 720(1440)x576i@200Hz 4:3 */
1022 	{ DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
1023 		   795, 864, 0, 576, 580, 586, 625, 0,
1024 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1025 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1026 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
1027 	/* 55 - 720(1440)x576i@200Hz 16:9 */
1028 	{ DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
1029 		   795, 864, 0, 576, 580, 586, 625, 0,
1030 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1031 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1032 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1033 	/* 56 - 720x480@240Hz 4:3 */
1034 	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
1035 		   798, 858, 0, 480, 489, 495, 525, 0,
1036 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
1037 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
1038 	/* 57 - 720x480@240Hz 16:9 */
1039 	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
1040 		   798, 858, 0, 480, 489, 495, 525, 0,
1041 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
1042 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1043 	/* 58 - 720(1440)x480i@240Hz 4:3 */
1044 	{ DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
1045 		   801, 858, 0, 480, 488, 494, 525, 0,
1046 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1047 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1048 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
1049 	/* 59 - 720(1440)x480i@240Hz 16:9 */
1050 	{ DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
1051 		   801, 858, 0, 480, 488, 494, 525, 0,
1052 		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
1053 		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
1054 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1055 	/* 60 - 1280x720@24Hz 16:9 */
1056 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
1057 		   3080, 3300, 0, 720, 725, 730, 750, 0,
1058 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1059 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1060 	/* 61 - 1280x720@25Hz 16:9 */
1061 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
1062 		   3740, 3960, 0, 720, 725, 730, 750, 0,
1063 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1064 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1065 	/* 62 - 1280x720@30Hz 16:9 */
1066 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
1067 		   3080, 3300, 0, 720, 725, 730, 750, 0,
1068 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1069 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1070 	/* 63 - 1920x1080@120Hz 16:9 */
1071 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
1072 		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
1073 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1074 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1075 	/* 64 - 1920x1080@100Hz 16:9 */
1076 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
1077 		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
1078 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1079 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1080 	/* 65 - 1280x720@24Hz 64:27 */
1081 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
1082 		   3080, 3300, 0, 720, 725, 730, 750, 0,
1083 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1084 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1085 	/* 66 - 1280x720@25Hz 64:27 */
1086 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
1087 		   3740, 3960, 0, 720, 725, 730, 750, 0,
1088 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1089 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1090 	/* 67 - 1280x720@30Hz 64:27 */
1091 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
1092 		   3080, 3300, 0, 720, 725, 730, 750, 0,
1093 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1094 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1095 	/* 68 - 1280x720@50Hz 64:27 */
1096 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
1097 		   1760, 1980, 0, 720, 725, 730, 750, 0,
1098 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1099 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1100 	/* 69 - 1280x720@60Hz 64:27 */
1101 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
1102 		   1430, 1650, 0, 720, 725, 730, 750, 0,
1103 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1104 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1105 	/* 70 - 1280x720@100Hz 64:27 */
1106 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
1107 		   1760, 1980, 0, 720, 725, 730, 750, 0,
1108 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1109 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1110 	/* 71 - 1280x720@120Hz 64:27 */
1111 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
1112 		   1430, 1650, 0, 720, 725, 730, 750, 0,
1113 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1114 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1115 	/* 72 - 1920x1080@24Hz 64:27 */
1116 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
1117 		   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
1118 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1119 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1120 	/* 73 - 1920x1080@25Hz 64:27 */
1121 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
1122 		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
1123 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1124 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1125 	/* 74 - 1920x1080@30Hz 64:27 */
1126 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
1127 		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
1128 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1129 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1130 	/* 75 - 1920x1080@50Hz 64:27 */
1131 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
1132 		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
1133 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1134 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1135 	/* 76 - 1920x1080@60Hz 64:27 */
1136 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
1137 		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
1138 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1139 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1140 	/* 77 - 1920x1080@100Hz 64:27 */
1141 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
1142 		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
1143 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1144 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1145 	/* 78 - 1920x1080@120Hz 64:27 */
1146 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
1147 		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
1148 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1149 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1150 	/* 79 - 1680x720@24Hz 64:27 */
1151 	{ DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 3040,
1152 		   3080, 3300, 0, 720, 725, 730, 750, 0,
1153 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1154 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1155 	/* 80 - 1680x720@25Hz 64:27 */
1156 	{ DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 2908,
1157 		   2948, 3168, 0, 720, 725, 730, 750, 0,
1158 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1159 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1160 	/* 81 - 1680x720@30Hz 64:27 */
1161 	{ DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 2380,
1162 		   2420, 2640, 0, 720, 725, 730, 750, 0,
1163 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1164 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1165 	/* 82 - 1680x720@50Hz 64:27 */
1166 	{ DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 82500, 1680, 1940,
1167 		   1980, 2200, 0, 720, 725, 730, 750, 0,
1168 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1169 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1170 	/* 83 - 1680x720@60Hz 64:27 */
1171 	{ DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 99000, 1680, 1940,
1172 		   1980, 2200, 0, 720, 725, 730, 750, 0,
1173 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1174 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1175 	/* 84 - 1680x720@100Hz 64:27 */
1176 	{ DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 165000, 1680, 1740,
1177 		   1780, 2000, 0, 720, 725, 730, 825, 0,
1178 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1179 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1180 	/* 85 - 1680x720@120Hz 64:27 */
1181 	{ DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 198000, 1680, 1740,
1182 		   1780, 2000, 0, 720, 725, 730, 825, 0,
1183 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1184 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1185 	/* 86 - 2560x1080@24Hz 64:27 */
1186 	{ DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 99000, 2560, 3558,
1187 		   3602, 3750, 0, 1080, 1084, 1089, 1100, 0,
1188 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1189 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1190 	/* 87 - 2560x1080@25Hz 64:27 */
1191 	{ DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 90000, 2560, 3008,
1192 		   3052, 3200, 0, 1080, 1084, 1089, 1125, 0,
1193 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1194 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1195 	/* 88 - 2560x1080@30Hz 64:27 */
1196 	{ DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 118800, 2560, 3328,
1197 		   3372, 3520, 0, 1080, 1084, 1089, 1125, 0,
1198 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1199 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1200 	/* 89 - 2560x1080@50Hz 64:27 */
1201 	{ DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 185625, 2560, 3108,
1202 		   3152, 3300, 0, 1080, 1084, 1089, 1125, 0,
1203 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1204 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1205 	/* 90 - 2560x1080@60Hz 64:27 */
1206 	{ DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 198000, 2560, 2808,
1207 		   2852, 3000, 0, 1080, 1084, 1089, 1100, 0,
1208 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1209 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1210 	/* 91 - 2560x1080@100Hz 64:27 */
1211 	{ DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 371250, 2560, 2778,
1212 		   2822, 2970, 0, 1080, 1084, 1089, 1250, 0,
1213 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1214 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1215 	/* 92 - 2560x1080@120Hz 64:27 */
1216 	{ DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 495000, 2560, 3108,
1217 		   3152, 3300, 0, 1080, 1084, 1089, 1250, 0,
1218 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1219 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1220 	/* 93 - 3840x2160@24Hz 16:9 */
1221 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116,
1222 		   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1223 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1224 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1225 	/* 94 - 3840x2160@25Hz 16:9 */
1226 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896,
1227 		   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1228 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1229 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1230 	/* 95 - 3840x2160@30Hz 16:9 */
1231 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
1232 		   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1233 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1234 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1235 	/* 96 - 3840x2160@50Hz 16:9 */
1236 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896,
1237 		   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1238 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1239 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1240 	/* 97 - 3840x2160@60Hz 16:9 */
1241 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
1242 		   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1243 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1244 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1245 	/* 98 - 4096x2160@24Hz 256:135 */
1246 	{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5116,
1247 		   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1248 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1249 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1250 	/* 99 - 4096x2160@25Hz 256:135 */
1251 	{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5064,
1252 		   5152, 5280, 0, 2160, 2168, 2178, 2250, 0,
1253 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1254 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1255 	/* 100 - 4096x2160@30Hz 256:135 */
1256 	{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 4184,
1257 		   4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
1258 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1259 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1260 	/* 101 - 4096x2160@50Hz 256:135 */
1261 	{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 5064,
1262 		   5152, 5280, 0, 2160, 2168, 2178, 2250, 0,
1263 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1264 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1265 	/* 102 - 4096x2160@60Hz 256:135 */
1266 	{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 4184,
1267 		   4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
1268 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1269 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1270 	/* 103 - 3840x2160@24Hz 64:27 */
1271 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116,
1272 		   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1273 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1274 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1275 	/* 104 - 3840x2160@25Hz 64:27 */
1276 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896,
1277 		   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1278 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1279 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1280 	/* 105 - 3840x2160@30Hz 64:27 */
1281 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
1282 		   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1283 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1284 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1285 	/* 106 - 3840x2160@50Hz 64:27 */
1286 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896,
1287 		   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1288 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1289 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1290 	/* 107 - 3840x2160@60Hz 64:27 */
1291 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
1292 		   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1293 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1294 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1295 	/* 108 - 1280x720@48Hz 16:9 */
1296 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 90000, 1280, 2240,
1297 		   2280, 2500, 0, 720, 725, 730, 750, 0,
1298 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1299 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1300 	/* 109 - 1280x720@48Hz 64:27 */
1301 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 90000, 1280, 2240,
1302 		   2280, 2500, 0, 720, 725, 730, 750, 0,
1303 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1304 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1305 	/* 110 - 1680x720@48Hz 64:27 */
1306 	{ DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 99000, 1680, 2490,
1307 		   2530, 2750, 0, 720, 725, 730, 750, 0,
1308 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1309 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1310 	/* 111 - 1920x1080@48Hz 16:9 */
1311 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2558,
1312 		   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
1313 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1314 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1315 	/* 112 - 1920x1080@48Hz 64:27 */
1316 	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2558,
1317 		   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
1318 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1319 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1320 	/* 113 - 2560x1080@48Hz 64:27 */
1321 	{ DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 198000, 2560, 3558,
1322 		   3602, 3750, 0, 1080, 1084, 1089, 1100, 0,
1323 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1324 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1325 	/* 114 - 3840x2160@48Hz 16:9 */
1326 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 5116,
1327 		   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1328 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1329 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1330 	/* 115 - 4096x2160@48Hz 256:135 */
1331 	{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 5116,
1332 		   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1333 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1334 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1335 	/* 116 - 3840x2160@48Hz 64:27 */
1336 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 5116,
1337 		   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
1338 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1339 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1340 	/* 117 - 3840x2160@100Hz 16:9 */
1341 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4896,
1342 		   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1343 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1344 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1345 	/* 118 - 3840x2160@120Hz 16:9 */
1346 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4016,
1347 		   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1348 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1349 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1350 	/* 119 - 3840x2160@100Hz 64:27 */
1351 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4896,
1352 		   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1353 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1354 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1355 	/* 120 - 3840x2160@120Hz 64:27 */
1356 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4016,
1357 		   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
1358 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1359 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1360 	/* 121 - 5120x2160@24Hz 64:27 */
1361 	{ DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 7116,
1362 		   7204, 7500, 0, 2160, 2168, 2178, 2200, 0,
1363 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1364 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1365 	/* 122 - 5120x2160@25Hz 64:27 */
1366 	{ DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 6816,
1367 		   6904, 7200, 0, 2160, 2168, 2178, 2200, 0,
1368 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1369 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1370 	/* 123 - 5120x2160@30Hz 64:27 */
1371 	{ DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 5784,
1372 		   5872, 6000, 0, 2160, 2168, 2178, 2200, 0,
1373 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1374 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1375 	/* 124 - 5120x2160@48Hz 64:27 */
1376 	{ DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 5866,
1377 		   5954, 6250, 0, 2160, 2168, 2178, 2475, 0,
1378 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1379 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1380 	/* 125 - 5120x2160@50Hz 64:27 */
1381 	{ DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 6216,
1382 		   6304, 6600, 0, 2160, 2168, 2178, 2250, 0,
1383 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1384 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1385 	/* 126 - 5120x2160@60Hz 64:27 */
1386 	{ DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 5284,
1387 		   5372, 5500, 0, 2160, 2168, 2178, 2250, 0,
1388 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1389 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1390 	/* 127 - 5120x2160@100Hz 64:27 */
1391 	{ DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 1485000, 5120, 6216,
1392 		   6304, 6600, 0, 2160, 2168, 2178, 2250, 0,
1393 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1394 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1395 };
1396 
1397 /*
1398  * From CEA/CTA-861 spec.
1399  *
1400  * Do not access directly, instead always use cea_mode_for_vic().
1401  */
1402 static const struct drm_display_mode edid_cea_modes_193[] = {
1403 	/* 193 - 5120x2160@120Hz 64:27 */
1404 	{ DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 1485000, 5120, 5284,
1405 		   5372, 5500, 0, 2160, 2168, 2178, 2250, 0,
1406 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1407 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1408 	/* 194 - 7680x4320@24Hz 16:9 */
1409 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10232,
1410 		   10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
1411 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1412 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1413 	/* 195 - 7680x4320@25Hz 16:9 */
1414 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10032,
1415 		   10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
1416 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1417 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1418 	/* 196 - 7680x4320@30Hz 16:9 */
1419 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 8232,
1420 		   8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
1421 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1422 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1423 	/* 197 - 7680x4320@48Hz 16:9 */
1424 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10232,
1425 		   10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
1426 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1427 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1428 	/* 198 - 7680x4320@50Hz 16:9 */
1429 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10032,
1430 		   10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
1431 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1432 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1433 	/* 199 - 7680x4320@60Hz 16:9 */
1434 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 8232,
1435 		   8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
1436 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1437 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1438 	/* 200 - 7680x4320@100Hz 16:9 */
1439 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 9792,
1440 		   9968, 10560, 0, 4320, 4336, 4356, 4500, 0,
1441 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1442 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1443 	/* 201 - 7680x4320@120Hz 16:9 */
1444 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 8032,
1445 		   8208, 8800, 0, 4320, 4336, 4356, 4500, 0,
1446 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1447 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1448 	/* 202 - 7680x4320@24Hz 64:27 */
1449 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10232,
1450 		   10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
1451 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1452 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1453 	/* 203 - 7680x4320@25Hz 64:27 */
1454 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10032,
1455 		   10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
1456 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1457 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1458 	/* 204 - 7680x4320@30Hz 64:27 */
1459 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 8232,
1460 		   8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
1461 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1462 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1463 	/* 205 - 7680x4320@48Hz 64:27 */
1464 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10232,
1465 		   10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
1466 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1467 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1468 	/* 206 - 7680x4320@50Hz 64:27 */
1469 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10032,
1470 		   10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
1471 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1472 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1473 	/* 207 - 7680x4320@60Hz 64:27 */
1474 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 8232,
1475 		   8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
1476 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1477 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1478 	/* 208 - 7680x4320@100Hz 64:27 */
1479 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 9792,
1480 		   9968, 10560, 0, 4320, 4336, 4356, 4500, 0,
1481 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1482 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1483 	/* 209 - 7680x4320@120Hz 64:27 */
1484 	{ DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 8032,
1485 		   8208, 8800, 0, 4320, 4336, 4356, 4500, 0,
1486 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1487 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1488 	/* 210 - 10240x4320@24Hz 64:27 */
1489 	{ DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 11732,
1490 		   11908, 12500, 0, 4320, 4336, 4356, 4950, 0,
1491 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1492 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1493 	/* 211 - 10240x4320@25Hz 64:27 */
1494 	{ DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 12732,
1495 		   12908, 13500, 0, 4320, 4336, 4356, 4400, 0,
1496 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1497 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1498 	/* 212 - 10240x4320@30Hz 64:27 */
1499 	{ DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 10528,
1500 		   10704, 11000, 0, 4320, 4336, 4356, 4500, 0,
1501 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1502 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1503 	/* 213 - 10240x4320@48Hz 64:27 */
1504 	{ DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 11732,
1505 		   11908, 12500, 0, 4320, 4336, 4356, 4950, 0,
1506 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1507 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1508 	/* 214 - 10240x4320@50Hz 64:27 */
1509 	{ DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 12732,
1510 		   12908, 13500, 0, 4320, 4336, 4356, 4400, 0,
1511 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1512 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1513 	/* 215 - 10240x4320@60Hz 64:27 */
1514 	{ DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 10528,
1515 		   10704, 11000, 0, 4320, 4336, 4356, 4500, 0,
1516 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1517 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1518 	/* 216 - 10240x4320@100Hz 64:27 */
1519 	{ DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 5940000, 10240, 12432,
1520 		   12608, 13200, 0, 4320, 4336, 4356, 4500, 0,
1521 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1522 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1523 	/* 217 - 10240x4320@120Hz 64:27 */
1524 	{ DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 5940000, 10240, 10528,
1525 		   10704, 11000, 0, 4320, 4336, 4356, 4500, 0,
1526 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1527 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
1528 	/* 218 - 4096x2160@100Hz 256:135 */
1529 	{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 1188000, 4096, 4896,
1530 		   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
1531 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1532 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1533 	/* 219 - 4096x2160@120Hz 256:135 */
1534 	{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 1188000, 4096, 4184,
1535 		   4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
1536 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1537 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1538 };
1539 
1540 /*
1541  * HDMI 1.4 4k modes. Index using the VIC.
1542  */
1543 static const struct drm_display_mode edid_4k_modes[] = {
1544 	/* 0 - dummy, VICs start at 1 */
1545 	{ },
1546 	/* 1 - 3840x2160@30Hz */
1547 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
1548 		   3840, 4016, 4104, 4400, 0,
1549 		   2160, 2168, 2178, 2250, 0,
1550 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1551 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1552 	/* 2 - 3840x2160@25Hz */
1553 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
1554 		   3840, 4896, 4984, 5280, 0,
1555 		   2160, 2168, 2178, 2250, 0,
1556 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1557 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1558 	/* 3 - 3840x2160@24Hz */
1559 	{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
1560 		   3840, 5116, 5204, 5500, 0,
1561 		   2160, 2168, 2178, 2250, 0,
1562 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1563 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
1564 	/* 4 - 4096x2160@24Hz (SMPTE) */
1565 	{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000,
1566 		   4096, 5116, 5204, 5500, 0,
1567 		   2160, 2168, 2178, 2250, 0,
1568 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
1569 	  .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
1570 };
1571 
1572 /*** DDC fetch and block validation ***/
1573 
1574 /*
1575  * The opaque EDID type, internal to drm_edid.c.
1576  */
1577 struct drm_edid {
1578 	/* Size allocated for edid */
1579 	size_t size;
1580 	const struct edid *edid;
1581 };
1582 
1583 static int edid_hfeeodb_extension_block_count(const struct edid *edid);
1584 
1585 static int edid_hfeeodb_block_count(const struct edid *edid)
1586 {
1587 	int eeodb = edid_hfeeodb_extension_block_count(edid);
1588 
1589 	return eeodb ? eeodb + 1 : 0;
1590 }
1591 
1592 static int edid_extension_block_count(const struct edid *edid)
1593 {
1594 	return edid->extensions;
1595 }
1596 
1597 static int edid_block_count(const struct edid *edid)
1598 {
1599 	return edid_extension_block_count(edid) + 1;
1600 }
1601 
1602 static int edid_size_by_blocks(int num_blocks)
1603 {
1604 	return num_blocks * EDID_LENGTH;
1605 }
1606 
1607 static int edid_size(const struct edid *edid)
1608 {
1609 	return edid_size_by_blocks(edid_block_count(edid));
1610 }
1611 
1612 static const void *edid_block_data(const struct edid *edid, int index)
1613 {
1614 	BUILD_BUG_ON(sizeof(*edid) != EDID_LENGTH);
1615 
1616 	return edid + index;
1617 }
1618 
1619 static const void *edid_extension_block_data(const struct edid *edid, int index)
1620 {
1621 	return edid_block_data(edid, index + 1);
1622 }
1623 
1624 /* EDID block count indicated in EDID, may exceed allocated size */
1625 static int __drm_edid_block_count(const struct drm_edid *drm_edid)
1626 {
1627 	int num_blocks;
1628 
1629 	/* Starting point */
1630 	num_blocks = edid_block_count(drm_edid->edid);
1631 
1632 	/* HF-EEODB override */
1633 	if (drm_edid->size >= edid_size_by_blocks(2)) {
1634 		int eeodb;
1635 
1636 		/*
1637 		 * Note: HF-EEODB may specify a smaller extension count than the
1638 		 * regular one. Unlike in buffer allocation, here we can use it.
1639 		 */
1640 		eeodb = edid_hfeeodb_block_count(drm_edid->edid);
1641 		if (eeodb)
1642 			num_blocks = eeodb;
1643 	}
1644 
1645 	return num_blocks;
1646 }
1647 
1648 /* EDID block count, limited by allocated size */
1649 static int drm_edid_block_count(const struct drm_edid *drm_edid)
1650 {
1651 	/* Limit by allocated size */
1652 	return min(__drm_edid_block_count(drm_edid),
1653 		   (int)drm_edid->size / EDID_LENGTH);
1654 }
1655 
1656 /* EDID extension block count, limited by allocated size */
1657 static int drm_edid_extension_block_count(const struct drm_edid *drm_edid)
1658 {
1659 	return drm_edid_block_count(drm_edid) - 1;
1660 }
1661 
1662 static const void *drm_edid_block_data(const struct drm_edid *drm_edid, int index)
1663 {
1664 	return edid_block_data(drm_edid->edid, index);
1665 }
1666 
1667 static const void *drm_edid_extension_block_data(const struct drm_edid *drm_edid,
1668 						 int index)
1669 {
1670 	return edid_extension_block_data(drm_edid->edid, index);
1671 }
1672 
1673 /*
1674  * Initializer helper for legacy interfaces, where we have no choice but to
1675  * trust edid size. Not for general purpose use.
1676  */
1677 static const struct drm_edid *drm_edid_legacy_init(struct drm_edid *drm_edid,
1678 						   const struct edid *edid)
1679 {
1680 	if (!edid)
1681 		return NULL;
1682 
1683 	memset(drm_edid, 0, sizeof(*drm_edid));
1684 
1685 	drm_edid->edid = edid;
1686 	drm_edid->size = edid_size(edid);
1687 
1688 	return drm_edid;
1689 }
1690 
1691 /*
1692  * EDID base and extension block iterator.
1693  *
1694  * struct drm_edid_iter iter;
1695  * const u8 *block;
1696  *
1697  * drm_edid_iter_begin(drm_edid, &iter);
1698  * drm_edid_iter_for_each(block, &iter) {
1699  *         // do stuff with block
1700  * }
1701  * drm_edid_iter_end(&iter);
1702  */
1703 struct drm_edid_iter {
1704 	const struct drm_edid *drm_edid;
1705 
1706 	/* Current block index. */
1707 	int index;
1708 };
1709 
1710 static void drm_edid_iter_begin(const struct drm_edid *drm_edid,
1711 				struct drm_edid_iter *iter)
1712 {
1713 	memset(iter, 0, sizeof(*iter));
1714 
1715 	iter->drm_edid = drm_edid;
1716 }
1717 
1718 static const void *__drm_edid_iter_next(struct drm_edid_iter *iter)
1719 {
1720 	const void *block = NULL;
1721 
1722 	if (!iter->drm_edid)
1723 		return NULL;
1724 
1725 	if (iter->index < drm_edid_block_count(iter->drm_edid))
1726 		block = drm_edid_block_data(iter->drm_edid, iter->index++);
1727 
1728 	return block;
1729 }
1730 
1731 #define drm_edid_iter_for_each(__block, __iter)			\
1732 	while (((__block) = __drm_edid_iter_next(__iter)))
1733 
1734 static void drm_edid_iter_end(struct drm_edid_iter *iter)
1735 {
1736 	memset(iter, 0, sizeof(*iter));
1737 }
1738 
1739 static const u8 edid_header[] = {
1740 	0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
1741 };
1742 
1743 static void edid_header_fix(void *edid)
1744 {
1745 	memcpy(edid, edid_header, sizeof(edid_header));
1746 }
1747 
1748 /**
1749  * drm_edid_header_is_valid - sanity check the header of the base EDID block
1750  * @_edid: pointer to raw base EDID block
1751  *
1752  * Sanity check the header of the base EDID block.
1753  *
1754  * Return: 8 if the header is perfect, down to 0 if it's totally wrong.
1755  */
1756 int drm_edid_header_is_valid(const void *_edid)
1757 {
1758 	const struct edid *edid = _edid;
1759 	int i, score = 0;
1760 
1761 	for (i = 0; i < sizeof(edid_header); i++) {
1762 		if (edid->header[i] == edid_header[i])
1763 			score++;
1764 	}
1765 
1766 	return score;
1767 }
1768 EXPORT_SYMBOL(drm_edid_header_is_valid);
1769 
1770 static int edid_fixup __read_mostly = 6;
1771 module_param_named(edid_fixup, edid_fixup, int, 0400);
1772 MODULE_PARM_DESC(edid_fixup,
1773 		 "Minimum number of valid EDID header bytes (0-8, default 6)");
1774 
1775 static int edid_block_compute_checksum(const void *_block)
1776 {
1777 	const u8 *block = _block;
1778 	int i;
1779 	u8 csum = 0, crc = 0;
1780 
1781 	for (i = 0; i < EDID_LENGTH - 1; i++)
1782 		csum += block[i];
1783 
1784 	crc = 0x100 - csum;
1785 
1786 	return crc;
1787 }
1788 
1789 static int edid_block_get_checksum(const void *_block)
1790 {
1791 	const struct edid *block = _block;
1792 
1793 	return block->checksum;
1794 }
1795 
1796 static int edid_block_tag(const void *_block)
1797 {
1798 	const u8 *block = _block;
1799 
1800 	return block[0];
1801 }
1802 
1803 static bool edid_block_is_zero(const void *edid)
1804 {
1805 	return !memchr_inv(edid, 0, EDID_LENGTH);
1806 }
1807 
1808 /**
1809  * drm_edid_are_equal - compare two edid blobs.
1810  * @edid1: pointer to first blob
1811  * @edid2: pointer to second blob
1812  * This helper can be used during probing to determine if
1813  * edid had changed.
1814  */
1815 bool drm_edid_are_equal(const struct edid *edid1, const struct edid *edid2)
1816 {
1817 	int edid1_len, edid2_len;
1818 	bool edid1_present = edid1 != NULL;
1819 	bool edid2_present = edid2 != NULL;
1820 
1821 	if (edid1_present != edid2_present)
1822 		return false;
1823 
1824 	if (edid1) {
1825 		edid1_len = edid_size(edid1);
1826 		edid2_len = edid_size(edid2);
1827 
1828 		if (edid1_len != edid2_len)
1829 			return false;
1830 
1831 		if (memcmp(edid1, edid2, edid1_len))
1832 			return false;
1833 	}
1834 
1835 	return true;
1836 }
1837 EXPORT_SYMBOL(drm_edid_are_equal);
1838 
1839 enum edid_block_status {
1840 	EDID_BLOCK_OK = 0,
1841 	EDID_BLOCK_READ_FAIL,
1842 	EDID_BLOCK_NULL,
1843 	EDID_BLOCK_ZERO,
1844 	EDID_BLOCK_HEADER_CORRUPT,
1845 	EDID_BLOCK_HEADER_REPAIR,
1846 	EDID_BLOCK_HEADER_FIXED,
1847 	EDID_BLOCK_CHECKSUM,
1848 	EDID_BLOCK_VERSION,
1849 };
1850 
1851 static enum edid_block_status edid_block_check(const void *_block,
1852 					       bool is_base_block)
1853 {
1854 	const struct edid *block = _block;
1855 
1856 	if (!block)
1857 		return EDID_BLOCK_NULL;
1858 
1859 	if (is_base_block) {
1860 		int score = drm_edid_header_is_valid(block);
1861 
1862 		if (score < clamp(edid_fixup, 0, 8)) {
1863 			if (edid_block_is_zero(block))
1864 				return EDID_BLOCK_ZERO;
1865 			else
1866 				return EDID_BLOCK_HEADER_CORRUPT;
1867 		}
1868 
1869 		if (score < 8)
1870 			return EDID_BLOCK_HEADER_REPAIR;
1871 	}
1872 
1873 	if (edid_block_compute_checksum(block) != edid_block_get_checksum(block)) {
1874 		if (edid_block_is_zero(block))
1875 			return EDID_BLOCK_ZERO;
1876 		else
1877 			return EDID_BLOCK_CHECKSUM;
1878 	}
1879 
1880 	if (is_base_block) {
1881 		if (block->version != 1)
1882 			return EDID_BLOCK_VERSION;
1883 	}
1884 
1885 	return EDID_BLOCK_OK;
1886 }
1887 
1888 static bool edid_block_status_valid(enum edid_block_status status, int tag)
1889 {
1890 	return status == EDID_BLOCK_OK ||
1891 		status == EDID_BLOCK_HEADER_FIXED ||
1892 		(status == EDID_BLOCK_CHECKSUM && tag == CEA_EXT);
1893 }
1894 
1895 static bool edid_block_valid(const void *block, bool base)
1896 {
1897 	return edid_block_status_valid(edid_block_check(block, base),
1898 				       edid_block_tag(block));
1899 }
1900 
1901 static void edid_block_status_print(enum edid_block_status status,
1902 				    const struct edid *block,
1903 				    int block_num)
1904 {
1905 	switch (status) {
1906 	case EDID_BLOCK_OK:
1907 		break;
1908 	case EDID_BLOCK_READ_FAIL:
1909 		pr_debug("EDID block %d read failed\n", block_num);
1910 		break;
1911 	case EDID_BLOCK_NULL:
1912 		pr_debug("EDID block %d pointer is NULL\n", block_num);
1913 		break;
1914 	case EDID_BLOCK_ZERO:
1915 		pr_notice("EDID block %d is all zeroes\n", block_num);
1916 		break;
1917 	case EDID_BLOCK_HEADER_CORRUPT:
1918 		pr_notice("EDID has corrupt header\n");
1919 		break;
1920 	case EDID_BLOCK_HEADER_REPAIR:
1921 		pr_debug("EDID corrupt header needs repair\n");
1922 		break;
1923 	case EDID_BLOCK_HEADER_FIXED:
1924 		pr_debug("EDID corrupt header fixed\n");
1925 		break;
1926 	case EDID_BLOCK_CHECKSUM:
1927 		if (edid_block_status_valid(status, edid_block_tag(block))) {
1928 			pr_debug("EDID block %d (tag 0x%02x) checksum is invalid, remainder is %d, ignoring\n",
1929 				 block_num, edid_block_tag(block),
1930 				 edid_block_compute_checksum(block));
1931 		} else {
1932 			pr_notice("EDID block %d (tag 0x%02x) checksum is invalid, remainder is %d\n",
1933 				  block_num, edid_block_tag(block),
1934 				  edid_block_compute_checksum(block));
1935 		}
1936 		break;
1937 	case EDID_BLOCK_VERSION:
1938 		pr_notice("EDID has major version %d, instead of 1\n",
1939 			  block->version);
1940 		break;
1941 	default:
1942 		WARN(1, "EDID block %d unknown edid block status code %d\n",
1943 		     block_num, status);
1944 		break;
1945 	}
1946 }
1947 
1948 static void edid_block_dump(const char *level, const void *block, int block_num)
1949 {
1950 	enum edid_block_status status;
1951 	char prefix[20];
1952 
1953 	status = edid_block_check(block, block_num == 0);
1954 	if (status == EDID_BLOCK_ZERO)
1955 		sprintf(prefix, "\t[%02x] ZERO ", block_num);
1956 	else if (!edid_block_status_valid(status, edid_block_tag(block)))
1957 		sprintf(prefix, "\t[%02x] BAD  ", block_num);
1958 	else
1959 		sprintf(prefix, "\t[%02x] GOOD ", block_num);
1960 
1961 	print_hex_dump(level, prefix, DUMP_PREFIX_NONE, 16, 1,
1962 		       block, EDID_LENGTH, false);
1963 }
1964 
1965 /**
1966  * drm_edid_block_valid - Sanity check the EDID block (base or extension)
1967  * @_block: pointer to raw EDID block
1968  * @block_num: type of block to validate (0 for base, extension otherwise)
1969  * @print_bad_edid: if true, dump bad EDID blocks to the console
1970  * @edid_corrupt: if true, the header or checksum is invalid
1971  *
1972  * Validate a base or extension EDID block and optionally dump bad blocks to
1973  * the console.
1974  *
1975  * Return: True if the block is valid, false otherwise.
1976  */
1977 bool drm_edid_block_valid(u8 *_block, int block_num, bool print_bad_edid,
1978 			  bool *edid_corrupt)
1979 {
1980 	struct edid *block = (struct edid *)_block;
1981 	enum edid_block_status status;
1982 	bool is_base_block = block_num == 0;
1983 	bool valid;
1984 
1985 	if (WARN_ON(!block))
1986 		return false;
1987 
1988 	status = edid_block_check(block, is_base_block);
1989 	if (status == EDID_BLOCK_HEADER_REPAIR) {
1990 		DRM_DEBUG_KMS("Fixing EDID header, your hardware may be failing\n");
1991 		edid_header_fix(block);
1992 
1993 		/* Retry with fixed header, update status if that worked. */
1994 		status = edid_block_check(block, is_base_block);
1995 		if (status == EDID_BLOCK_OK)
1996 			status = EDID_BLOCK_HEADER_FIXED;
1997 	}
1998 
1999 	if (edid_corrupt) {
2000 		/*
2001 		 * Unknown major version isn't corrupt but we can't use it. Only
2002 		 * the base block can reset edid_corrupt to false.
2003 		 */
2004 		if (is_base_block &&
2005 		    (status == EDID_BLOCK_OK || status == EDID_BLOCK_VERSION))
2006 			*edid_corrupt = false;
2007 		else if (status != EDID_BLOCK_OK)
2008 			*edid_corrupt = true;
2009 	}
2010 
2011 	edid_block_status_print(status, block, block_num);
2012 
2013 	/* Determine whether we can use this block with this status. */
2014 	valid = edid_block_status_valid(status, edid_block_tag(block));
2015 
2016 	if (!valid && print_bad_edid && status != EDID_BLOCK_ZERO) {
2017 		pr_notice("Raw EDID:\n");
2018 		edid_block_dump(KERN_NOTICE, block, block_num);
2019 	}
2020 
2021 	return valid;
2022 }
2023 EXPORT_SYMBOL(drm_edid_block_valid);
2024 
2025 /**
2026  * drm_edid_is_valid - sanity check EDID data
2027  * @edid: EDID data
2028  *
2029  * Sanity-check an entire EDID record (including extensions)
2030  *
2031  * Return: True if the EDID data is valid, false otherwise.
2032  */
2033 bool drm_edid_is_valid(struct edid *edid)
2034 {
2035 	int i;
2036 
2037 	if (!edid)
2038 		return false;
2039 
2040 	for (i = 0; i < edid_block_count(edid); i++) {
2041 		void *block = (void *)edid_block_data(edid, i);
2042 
2043 		if (!drm_edid_block_valid(block, i, true, NULL))
2044 			return false;
2045 	}
2046 
2047 	return true;
2048 }
2049 EXPORT_SYMBOL(drm_edid_is_valid);
2050 
2051 /**
2052  * drm_edid_valid - sanity check EDID data
2053  * @drm_edid: EDID data
2054  *
2055  * Sanity check an EDID. Cross check block count against allocated size and
2056  * checksum the blocks.
2057  *
2058  * Return: True if the EDID data is valid, false otherwise.
2059  */
2060 bool drm_edid_valid(const struct drm_edid *drm_edid)
2061 {
2062 	int i;
2063 
2064 	if (!drm_edid)
2065 		return false;
2066 
2067 	if (edid_size_by_blocks(__drm_edid_block_count(drm_edid)) != drm_edid->size)
2068 		return false;
2069 
2070 	for (i = 0; i < drm_edid_block_count(drm_edid); i++) {
2071 		const void *block = drm_edid_block_data(drm_edid, i);
2072 
2073 		if (!edid_block_valid(block, i == 0))
2074 			return false;
2075 	}
2076 
2077 	return true;
2078 }
2079 EXPORT_SYMBOL(drm_edid_valid);
2080 
2081 static struct edid *edid_filter_invalid_blocks(struct edid *edid,
2082 					       size_t *alloc_size)
2083 {
2084 	struct edid *new;
2085 	int i, valid_blocks = 0;
2086 
2087 	/*
2088 	 * Note: If the EDID uses HF-EEODB, but has invalid blocks, we'll revert
2089 	 * back to regular extension count here. We don't want to start
2090 	 * modifying the HF-EEODB extension too.
2091 	 */
2092 	for (i = 0; i < edid_block_count(edid); i++) {
2093 		const void *src_block = edid_block_data(edid, i);
2094 
2095 		if (edid_block_valid(src_block, i == 0)) {
2096 			void *dst_block = (void *)edid_block_data(edid, valid_blocks);
2097 
2098 			memmove(dst_block, src_block, EDID_LENGTH);
2099 			valid_blocks++;
2100 		}
2101 	}
2102 
2103 	/* We already trusted the base block to be valid here... */
2104 	if (WARN_ON(!valid_blocks)) {
2105 		kfree(edid);
2106 		return NULL;
2107 	}
2108 
2109 	edid->extensions = valid_blocks - 1;
2110 	edid->checksum = edid_block_compute_checksum(edid);
2111 
2112 	*alloc_size = edid_size_by_blocks(valid_blocks);
2113 
2114 	new = krealloc(edid, *alloc_size, GFP_KERNEL);
2115 	if (!new)
2116 		kfree(edid);
2117 
2118 	return new;
2119 }
2120 
2121 #define DDC_SEGMENT_ADDR 0x30
2122 /**
2123  * drm_do_probe_ddc_edid() - get EDID information via I2C
2124  * @data: I2C device adapter
2125  * @buf: EDID data buffer to be filled
2126  * @block: 128 byte EDID block to start fetching from
2127  * @len: EDID data buffer length to fetch
2128  *
2129  * Try to fetch EDID information by calling I2C driver functions.
2130  *
2131  * Return: 0 on success or -1 on failure.
2132  */
2133 static int
2134 drm_do_probe_ddc_edid(void *data, u8 *buf, unsigned int block, size_t len)
2135 {
2136 	struct i2c_adapter *adapter = data;
2137 	unsigned char start = block * EDID_LENGTH;
2138 	unsigned char segment = block >> 1;
2139 	unsigned char xfers = segment ? 3 : 2;
2140 	int ret, retries = 5;
2141 
2142 	/*
2143 	 * The core I2C driver will automatically retry the transfer if the
2144 	 * adapter reports EAGAIN. However, we find that bit-banging transfers
2145 	 * are susceptible to errors under a heavily loaded machine and
2146 	 * generate spurious NAKs and timeouts. Retrying the transfer
2147 	 * of the individual block a few times seems to overcome this.
2148 	 */
2149 	do {
2150 		struct i2c_msg msgs[] = {
2151 			{
2152 				.addr	= DDC_SEGMENT_ADDR,
2153 				.flags	= 0,
2154 				.len	= 1,
2155 				.buf	= &segment,
2156 			}, {
2157 				.addr	= DDC_ADDR,
2158 				.flags	= 0,
2159 				.len	= 1,
2160 				.buf	= &start,
2161 			}, {
2162 				.addr	= DDC_ADDR,
2163 				.flags	= I2C_M_RD,
2164 				.len	= len,
2165 				.buf	= buf,
2166 			}
2167 		};
2168 
2169 		/*
2170 		 * Avoid sending the segment addr to not upset non-compliant
2171 		 * DDC monitors.
2172 		 */
2173 		ret = i2c_transfer(adapter, &msgs[3 - xfers], xfers);
2174 
2175 		if (ret == -ENXIO) {
2176 			DRM_DEBUG_KMS("drm: skipping non-existent adapter %s\n",
2177 					adapter->name);
2178 			break;
2179 		}
2180 	} while (ret != xfers && --retries);
2181 
2182 	return ret == xfers ? 0 : -1;
2183 }
2184 
2185 static void connector_bad_edid(struct drm_connector *connector,
2186 			       const struct edid *edid, int num_blocks)
2187 {
2188 	int i;
2189 	u8 last_block;
2190 
2191 	/*
2192 	 * 0x7e in the EDID is the number of extension blocks. The EDID
2193 	 * is 1 (base block) + num_ext_blocks big. That means we can think
2194 	 * of 0x7e in the EDID of the _index_ of the last block in the
2195 	 * combined chunk of memory.
2196 	 */
2197 	last_block = edid->extensions;
2198 
2199 	/* Calculate real checksum for the last edid extension block data */
2200 	if (last_block < num_blocks)
2201 		connector->real_edid_checksum =
2202 			edid_block_compute_checksum(edid + last_block);
2203 
2204 	if (connector->bad_edid_counter++ && !drm_debug_enabled(DRM_UT_KMS))
2205 		return;
2206 
2207 	drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID is invalid:\n",
2208 		    connector->base.id, connector->name);
2209 	for (i = 0; i < num_blocks; i++)
2210 		edid_block_dump(KERN_DEBUG, edid + i, i);
2211 }
2212 
2213 /* Get override or firmware EDID */
2214 static const struct drm_edid *drm_edid_override_get(struct drm_connector *connector)
2215 {
2216 	const struct drm_edid *override = NULL;
2217 
2218 	mutex_lock(&connector->edid_override_mutex);
2219 
2220 	if (connector->edid_override)
2221 		override = drm_edid_dup(connector->edid_override);
2222 
2223 	mutex_unlock(&connector->edid_override_mutex);
2224 
2225 	if (!override)
2226 		override = drm_edid_load_firmware(connector);
2227 
2228 	return IS_ERR(override) ? NULL : override;
2229 }
2230 
2231 /* For debugfs edid_override implementation */
2232 int drm_edid_override_show(struct drm_connector *connector, struct seq_file *m)
2233 {
2234 	const struct drm_edid *drm_edid;
2235 
2236 	mutex_lock(&connector->edid_override_mutex);
2237 
2238 	drm_edid = connector->edid_override;
2239 	if (drm_edid)
2240 		seq_write(m, drm_edid->edid, drm_edid->size);
2241 
2242 	mutex_unlock(&connector->edid_override_mutex);
2243 
2244 	return 0;
2245 }
2246 
2247 /* For debugfs edid_override implementation */
2248 int drm_edid_override_set(struct drm_connector *connector, const void *edid,
2249 			  size_t size)
2250 {
2251 	const struct drm_edid *drm_edid;
2252 
2253 	drm_edid = drm_edid_alloc(edid, size);
2254 	if (!drm_edid_valid(drm_edid)) {
2255 		drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override invalid\n",
2256 			    connector->base.id, connector->name);
2257 		drm_edid_free(drm_edid);
2258 		return -EINVAL;
2259 	}
2260 
2261 	drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override set\n",
2262 		    connector->base.id, connector->name);
2263 
2264 	mutex_lock(&connector->edid_override_mutex);
2265 
2266 	drm_edid_free(connector->edid_override);
2267 	connector->edid_override = drm_edid;
2268 
2269 	mutex_unlock(&connector->edid_override_mutex);
2270 
2271 	return 0;
2272 }
2273 
2274 /* For debugfs edid_override implementation */
2275 int drm_edid_override_reset(struct drm_connector *connector)
2276 {
2277 	drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override reset\n",
2278 		    connector->base.id, connector->name);
2279 
2280 	mutex_lock(&connector->edid_override_mutex);
2281 
2282 	drm_edid_free(connector->edid_override);
2283 	connector->edid_override = NULL;
2284 
2285 	mutex_unlock(&connector->edid_override_mutex);
2286 
2287 	return 0;
2288 }
2289 
2290 /**
2291  * drm_edid_override_connector_update - add modes from override/firmware EDID
2292  * @connector: connector we're probing
2293  *
2294  * Add modes from the override/firmware EDID, if available. Only to be used from
2295  * drm_helper_probe_single_connector_modes() as a fallback for when DDC probe
2296  * failed during drm_get_edid() and caused the override/firmware EDID to be
2297  * skipped.
2298  *
2299  * Return: The number of modes added or 0 if we couldn't find any.
2300  */
2301 int drm_edid_override_connector_update(struct drm_connector *connector)
2302 {
2303 	const struct drm_edid *override;
2304 	int num_modes = 0;
2305 
2306 	override = drm_edid_override_get(connector);
2307 	if (override) {
2308 		num_modes = drm_edid_connector_update(connector, override);
2309 
2310 		drm_edid_free(override);
2311 
2312 		drm_dbg_kms(connector->dev,
2313 			    "[CONNECTOR:%d:%s] adding %d modes via fallback override/firmware EDID\n",
2314 			    connector->base.id, connector->name, num_modes);
2315 	}
2316 
2317 	return num_modes;
2318 }
2319 EXPORT_SYMBOL(drm_edid_override_connector_update);
2320 
2321 typedef int read_block_fn(void *context, u8 *buf, unsigned int block, size_t len);
2322 
2323 static enum edid_block_status edid_block_read(void *block, unsigned int block_num,
2324 					      read_block_fn read_block,
2325 					      void *context)
2326 {
2327 	enum edid_block_status status;
2328 	bool is_base_block = block_num == 0;
2329 	int try;
2330 
2331 	for (try = 0; try < 4; try++) {
2332 		if (read_block(context, block, block_num, EDID_LENGTH))
2333 			return EDID_BLOCK_READ_FAIL;
2334 
2335 		status = edid_block_check(block, is_base_block);
2336 		if (status == EDID_BLOCK_HEADER_REPAIR) {
2337 			edid_header_fix(block);
2338 
2339 			/* Retry with fixed header, update status if that worked. */
2340 			status = edid_block_check(block, is_base_block);
2341 			if (status == EDID_BLOCK_OK)
2342 				status = EDID_BLOCK_HEADER_FIXED;
2343 		}
2344 
2345 		if (edid_block_status_valid(status, edid_block_tag(block)))
2346 			break;
2347 
2348 		/* Fail early for unrepairable base block all zeros. */
2349 		if (try == 0 && is_base_block && status == EDID_BLOCK_ZERO)
2350 			break;
2351 	}
2352 
2353 	return status;
2354 }
2355 
2356 static struct edid *_drm_do_get_edid(struct drm_connector *connector,
2357 				     read_block_fn read_block, void *context,
2358 				     size_t *size)
2359 {
2360 	enum edid_block_status status;
2361 	int i, num_blocks, invalid_blocks = 0;
2362 	const struct drm_edid *override;
2363 	struct edid *edid, *new;
2364 	size_t alloc_size = EDID_LENGTH;
2365 
2366 	override = drm_edid_override_get(connector);
2367 	if (override) {
2368 		alloc_size = override->size;
2369 		edid = kmemdup(override->edid, alloc_size, GFP_KERNEL);
2370 		drm_edid_free(override);
2371 		if (!edid)
2372 			return NULL;
2373 		goto ok;
2374 	}
2375 
2376 	edid = kmalloc(alloc_size, GFP_KERNEL);
2377 	if (!edid)
2378 		return NULL;
2379 
2380 	status = edid_block_read(edid, 0, read_block, context);
2381 
2382 	edid_block_status_print(status, edid, 0);
2383 
2384 	if (status == EDID_BLOCK_READ_FAIL)
2385 		goto fail;
2386 
2387 	/* FIXME: Clarify what a corrupt EDID actually means. */
2388 	if (status == EDID_BLOCK_OK || status == EDID_BLOCK_VERSION)
2389 		connector->edid_corrupt = false;
2390 	else
2391 		connector->edid_corrupt = true;
2392 
2393 	if (!edid_block_status_valid(status, edid_block_tag(edid))) {
2394 		if (status == EDID_BLOCK_ZERO)
2395 			connector->null_edid_counter++;
2396 
2397 		connector_bad_edid(connector, edid, 1);
2398 		goto fail;
2399 	}
2400 
2401 	if (!edid_extension_block_count(edid))
2402 		goto ok;
2403 
2404 	alloc_size = edid_size(edid);
2405 	new = krealloc(edid, alloc_size, GFP_KERNEL);
2406 	if (!new)
2407 		goto fail;
2408 	edid = new;
2409 
2410 	num_blocks = edid_block_count(edid);
2411 	for (i = 1; i < num_blocks; i++) {
2412 		void *block = (void *)edid_block_data(edid, i);
2413 
2414 		status = edid_block_read(block, i, read_block, context);
2415 
2416 		edid_block_status_print(status, block, i);
2417 
2418 		if (!edid_block_status_valid(status, edid_block_tag(block))) {
2419 			if (status == EDID_BLOCK_READ_FAIL)
2420 				goto fail;
2421 			invalid_blocks++;
2422 		} else if (i == 1) {
2423 			/*
2424 			 * If the first EDID extension is a CTA extension, and
2425 			 * the first Data Block is HF-EEODB, override the
2426 			 * extension block count.
2427 			 *
2428 			 * Note: HF-EEODB could specify a smaller extension
2429 			 * count too, but we can't risk allocating a smaller
2430 			 * amount.
2431 			 */
2432 			int eeodb = edid_hfeeodb_block_count(edid);
2433 
2434 			if (eeodb > num_blocks) {
2435 				num_blocks = eeodb;
2436 				alloc_size = edid_size_by_blocks(num_blocks);
2437 				new = krealloc(edid, alloc_size, GFP_KERNEL);
2438 				if (!new)
2439 					goto fail;
2440 				edid = new;
2441 			}
2442 		}
2443 	}
2444 
2445 	if (invalid_blocks) {
2446 		connector_bad_edid(connector, edid, num_blocks);
2447 
2448 		edid = edid_filter_invalid_blocks(edid, &alloc_size);
2449 	}
2450 
2451 ok:
2452 	if (size)
2453 		*size = alloc_size;
2454 
2455 	return edid;
2456 
2457 fail:
2458 	kfree(edid);
2459 	return NULL;
2460 }
2461 
2462 /**
2463  * drm_do_get_edid - get EDID data using a custom EDID block read function
2464  * @connector: connector we're probing
2465  * @read_block: EDID block read function
2466  * @context: private data passed to the block read function
2467  *
2468  * When the I2C adapter connected to the DDC bus is hidden behind a device that
2469  * exposes a different interface to read EDID blocks this function can be used
2470  * to get EDID data using a custom block read function.
2471  *
2472  * As in the general case the DDC bus is accessible by the kernel at the I2C
2473  * level, drivers must make all reasonable efforts to expose it as an I2C
2474  * adapter and use drm_get_edid() instead of abusing this function.
2475  *
2476  * The EDID may be overridden using debugfs override_edid or firmware EDID
2477  * (drm_edid_load_firmware() and drm.edid_firmware parameter), in this priority
2478  * order. Having either of them bypasses actual EDID reads.
2479  *
2480  * Return: Pointer to valid EDID or NULL if we couldn't find any.
2481  */
2482 struct edid *drm_do_get_edid(struct drm_connector *connector,
2483 			     read_block_fn read_block,
2484 			     void *context)
2485 {
2486 	return _drm_do_get_edid(connector, read_block, context, NULL);
2487 }
2488 EXPORT_SYMBOL_GPL(drm_do_get_edid);
2489 
2490 /**
2491  * drm_edid_raw - Get a pointer to the raw EDID data.
2492  * @drm_edid: drm_edid container
2493  *
2494  * Get a pointer to the raw EDID data.
2495  *
2496  * This is for transition only. Avoid using this like the plague.
2497  *
2498  * Return: Pointer to raw EDID data.
2499  */
2500 const struct edid *drm_edid_raw(const struct drm_edid *drm_edid)
2501 {
2502 	if (!drm_edid || !drm_edid->size)
2503 		return NULL;
2504 
2505 	/*
2506 	 * Do not return pointers where relying on EDID extension count would
2507 	 * lead to buffer overflow.
2508 	 */
2509 	if (WARN_ON(edid_size(drm_edid->edid) > drm_edid->size))
2510 		return NULL;
2511 
2512 	return drm_edid->edid;
2513 }
2514 EXPORT_SYMBOL(drm_edid_raw);
2515 
2516 /* Allocate struct drm_edid container *without* duplicating the edid data */
2517 static const struct drm_edid *_drm_edid_alloc(const void *edid, size_t size)
2518 {
2519 	struct drm_edid *drm_edid;
2520 
2521 	if (!edid || !size || size < EDID_LENGTH)
2522 		return NULL;
2523 
2524 	drm_edid = kzalloc(sizeof(*drm_edid), GFP_KERNEL);
2525 	if (drm_edid) {
2526 		drm_edid->edid = edid;
2527 		drm_edid->size = size;
2528 	}
2529 
2530 	return drm_edid;
2531 }
2532 
2533 /**
2534  * drm_edid_alloc - Allocate a new drm_edid container
2535  * @edid: Pointer to raw EDID data
2536  * @size: Size of memory allocated for EDID
2537  *
2538  * Allocate a new drm_edid container. Do not calculate edid size from edid, pass
2539  * the actual size that has been allocated for the data. There is no validation
2540  * of the raw EDID data against the size, but at least the EDID base block must
2541  * fit in the buffer.
2542  *
2543  * The returned pointer must be freed using drm_edid_free().
2544  *
2545  * Return: drm_edid container, or NULL on errors
2546  */
2547 const struct drm_edid *drm_edid_alloc(const void *edid, size_t size)
2548 {
2549 	const struct drm_edid *drm_edid;
2550 
2551 	if (!edid || !size || size < EDID_LENGTH)
2552 		return NULL;
2553 
2554 	edid = kmemdup(edid, size, GFP_KERNEL);
2555 	if (!edid)
2556 		return NULL;
2557 
2558 	drm_edid = _drm_edid_alloc(edid, size);
2559 	if (!drm_edid)
2560 		kfree(edid);
2561 
2562 	return drm_edid;
2563 }
2564 EXPORT_SYMBOL(drm_edid_alloc);
2565 
2566 /**
2567  * drm_edid_dup - Duplicate a drm_edid container
2568  * @drm_edid: EDID to duplicate
2569  *
2570  * The returned pointer must be freed using drm_edid_free().
2571  *
2572  * Returns: drm_edid container copy, or NULL on errors
2573  */
2574 const struct drm_edid *drm_edid_dup(const struct drm_edid *drm_edid)
2575 {
2576 	if (!drm_edid)
2577 		return NULL;
2578 
2579 	return drm_edid_alloc(drm_edid->edid, drm_edid->size);
2580 }
2581 EXPORT_SYMBOL(drm_edid_dup);
2582 
2583 /**
2584  * drm_edid_free - Free the drm_edid container
2585  * @drm_edid: EDID to free
2586  */
2587 void drm_edid_free(const struct drm_edid *drm_edid)
2588 {
2589 	if (!drm_edid)
2590 		return;
2591 
2592 	kfree(drm_edid->edid);
2593 	kfree(drm_edid);
2594 }
2595 EXPORT_SYMBOL(drm_edid_free);
2596 
2597 /**
2598  * drm_probe_ddc() - probe DDC presence
2599  * @adapter: I2C adapter to probe
2600  *
2601  * Return: True on success, false on failure.
2602  */
2603 bool
2604 drm_probe_ddc(struct i2c_adapter *adapter)
2605 {
2606 	unsigned char out;
2607 
2608 	return (drm_do_probe_ddc_edid(adapter, &out, 0, 1) == 0);
2609 }
2610 EXPORT_SYMBOL(drm_probe_ddc);
2611 
2612 /**
2613  * drm_get_edid - get EDID data, if available
2614  * @connector: connector we're probing
2615  * @adapter: I2C adapter to use for DDC
2616  *
2617  * Poke the given I2C channel to grab EDID data if possible.  If found,
2618  * attach it to the connector.
2619  *
2620  * Return: Pointer to valid EDID or NULL if we couldn't find any.
2621  */
2622 struct edid *drm_get_edid(struct drm_connector *connector,
2623 			  struct i2c_adapter *adapter)
2624 {
2625 	struct edid *edid;
2626 
2627 	if (connector->force == DRM_FORCE_OFF)
2628 		return NULL;
2629 
2630 	if (connector->force == DRM_FORCE_UNSPECIFIED && !drm_probe_ddc(adapter))
2631 		return NULL;
2632 
2633 	edid = _drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter, NULL);
2634 	drm_connector_update_edid_property(connector, edid);
2635 	return edid;
2636 }
2637 EXPORT_SYMBOL(drm_get_edid);
2638 
2639 /**
2640  * drm_edid_read_custom - Read EDID data using given EDID block read function
2641  * @connector: Connector to use
2642  * @read_block: EDID block read function
2643  * @context: Private data passed to the block read function
2644  *
2645  * When the I2C adapter connected to the DDC bus is hidden behind a device that
2646  * exposes a different interface to read EDID blocks this function can be used
2647  * to get EDID data using a custom block read function.
2648  *
2649  * As in the general case the DDC bus is accessible by the kernel at the I2C
2650  * level, drivers must make all reasonable efforts to expose it as an I2C
2651  * adapter and use drm_edid_read() or drm_edid_read_ddc() instead of abusing
2652  * this function.
2653  *
2654  * The EDID may be overridden using debugfs override_edid or firmware EDID
2655  * (drm_edid_load_firmware() and drm.edid_firmware parameter), in this priority
2656  * order. Having either of them bypasses actual EDID reads.
2657  *
2658  * The returned pointer must be freed using drm_edid_free().
2659  *
2660  * Return: Pointer to EDID, or NULL if probe/read failed.
2661  */
2662 const struct drm_edid *drm_edid_read_custom(struct drm_connector *connector,
2663 					    read_block_fn read_block,
2664 					    void *context)
2665 {
2666 	const struct drm_edid *drm_edid;
2667 	struct edid *edid;
2668 	size_t size = 0;
2669 
2670 	edid = _drm_do_get_edid(connector, read_block, context, &size);
2671 	if (!edid)
2672 		return NULL;
2673 
2674 	/* Sanity check for now */
2675 	drm_WARN_ON(connector->dev, !size);
2676 
2677 	drm_edid = _drm_edid_alloc(edid, size);
2678 	if (!drm_edid)
2679 		kfree(edid);
2680 
2681 	return drm_edid;
2682 }
2683 EXPORT_SYMBOL(drm_edid_read_custom);
2684 
2685 /**
2686  * drm_edid_read_ddc - Read EDID data using given I2C adapter
2687  * @connector: Connector to use
2688  * @adapter: I2C adapter to use for DDC
2689  *
2690  * Read EDID using the given I2C adapter.
2691  *
2692  * The EDID may be overridden using debugfs override_edid or firmware EDID
2693  * (drm_edid_load_firmware() and drm.edid_firmware parameter), in this priority
2694  * order. Having either of them bypasses actual EDID reads.
2695  *
2696  * Prefer initializing connector->ddc with drm_connector_init_with_ddc() and
2697  * using drm_edid_read() instead of this function.
2698  *
2699  * The returned pointer must be freed using drm_edid_free().
2700  *
2701  * Return: Pointer to EDID, or NULL if probe/read failed.
2702  */
2703 const struct drm_edid *drm_edid_read_ddc(struct drm_connector *connector,
2704 					 struct i2c_adapter *adapter)
2705 {
2706 	const struct drm_edid *drm_edid;
2707 
2708 	if (connector->force == DRM_FORCE_OFF)
2709 		return NULL;
2710 
2711 	if (connector->force == DRM_FORCE_UNSPECIFIED && !drm_probe_ddc(adapter))
2712 		return NULL;
2713 
2714 	drm_edid = drm_edid_read_custom(connector, drm_do_probe_ddc_edid, adapter);
2715 
2716 	/* Note: Do *not* call connector updates here. */
2717 
2718 	return drm_edid;
2719 }
2720 EXPORT_SYMBOL(drm_edid_read_ddc);
2721 
2722 /**
2723  * drm_edid_read - Read EDID data using connector's I2C adapter
2724  * @connector: Connector to use
2725  *
2726  * Read EDID using the connector's I2C adapter.
2727  *
2728  * The EDID may be overridden using debugfs override_edid or firmware EDID
2729  * (drm_edid_load_firmware() and drm.edid_firmware parameter), in this priority
2730  * order. Having either of them bypasses actual EDID reads.
2731  *
2732  * The returned pointer must be freed using drm_edid_free().
2733  *
2734  * Return: Pointer to EDID, or NULL if probe/read failed.
2735  */
2736 const struct drm_edid *drm_edid_read(struct drm_connector *connector)
2737 {
2738 	if (drm_WARN_ON(connector->dev, !connector->ddc))
2739 		return NULL;
2740 
2741 	return drm_edid_read_ddc(connector, connector->ddc);
2742 }
2743 EXPORT_SYMBOL(drm_edid_read);
2744 
2745 static u32 edid_extract_panel_id(const struct edid *edid)
2746 {
2747 	/*
2748 	 * We represent the ID as a 32-bit number so it can easily be compared
2749 	 * with "==".
2750 	 *
2751 	 * NOTE that we deal with endianness differently for the top half
2752 	 * of this ID than for the bottom half. The bottom half (the product
2753 	 * id) gets decoded as little endian by the EDID_PRODUCT_ID because
2754 	 * that's how everyone seems to interpret it. The top half (the mfg_id)
2755 	 * gets stored as big endian because that makes
2756 	 * drm_edid_encode_panel_id() and drm_edid_decode_panel_id() easier
2757 	 * to write (it's easier to extract the ASCII). It doesn't really
2758 	 * matter, though, as long as the number here is unique.
2759 	 */
2760 	return (u32)edid->mfg_id[0] << 24   |
2761 	       (u32)edid->mfg_id[1] << 16   |
2762 	       (u32)EDID_PRODUCT_ID(edid);
2763 }
2764 
2765 /**
2766  * drm_edid_get_panel_id - Get a panel's ID through DDC
2767  * @adapter: I2C adapter to use for DDC
2768  *
2769  * This function reads the first block of the EDID of a panel and (assuming
2770  * that the EDID is valid) extracts the ID out of it. The ID is a 32-bit value
2771  * (16 bits of manufacturer ID and 16 bits of per-manufacturer ID) that's
2772  * supposed to be different for each different modem of panel.
2773  *
2774  * This function is intended to be used during early probing on devices where
2775  * more than one panel might be present. Because of its intended use it must
2776  * assume that the EDID of the panel is correct, at least as far as the ID
2777  * is concerned (in other words, we don't process any overrides here).
2778  *
2779  * NOTE: it's expected that this function and drm_do_get_edid() will both
2780  * be read the EDID, but there is no caching between them. Since we're only
2781  * reading the first block, hopefully this extra overhead won't be too big.
2782  *
2783  * Return: A 32-bit ID that should be different for each make/model of panel.
2784  *         See the functions drm_edid_encode_panel_id() and
2785  *         drm_edid_decode_panel_id() for some details on the structure of this
2786  *         ID.
2787  */
2788 
2789 u32 drm_edid_get_panel_id(struct i2c_adapter *adapter)
2790 {
2791 	enum edid_block_status status;
2792 	void *base_block;
2793 	u32 panel_id = 0;
2794 
2795 	/*
2796 	 * There are no manufacturer IDs of 0, so if there is a problem reading
2797 	 * the EDID then we'll just return 0.
2798 	 */
2799 
2800 	base_block = kzalloc(EDID_LENGTH, GFP_KERNEL);
2801 	if (!base_block)
2802 		return 0;
2803 
2804 	status = edid_block_read(base_block, 0, drm_do_probe_ddc_edid, adapter);
2805 
2806 	edid_block_status_print(status, base_block, 0);
2807 
2808 	if (edid_block_status_valid(status, edid_block_tag(base_block)))
2809 		panel_id = edid_extract_panel_id(base_block);
2810 	else
2811 		edid_block_dump(KERN_NOTICE, base_block, 0);
2812 
2813 	kfree(base_block);
2814 
2815 	return panel_id;
2816 }
2817 EXPORT_SYMBOL(drm_edid_get_panel_id);
2818 
2819 /**
2820  * drm_get_edid_switcheroo - get EDID data for a vga_switcheroo output
2821  * @connector: connector we're probing
2822  * @adapter: I2C adapter to use for DDC
2823  *
2824  * Wrapper around drm_get_edid() for laptops with dual GPUs using one set of
2825  * outputs. The wrapper adds the requisite vga_switcheroo calls to temporarily
2826  * switch DDC to the GPU which is retrieving EDID.
2827  *
2828  * Return: Pointer to valid EDID or %NULL if we couldn't find any.
2829  */
2830 struct edid *drm_get_edid_switcheroo(struct drm_connector *connector,
2831 				     struct i2c_adapter *adapter)
2832 {
2833 	struct drm_device *dev = connector->dev;
2834 	struct pci_dev *pdev = to_pci_dev(dev->dev);
2835 	struct edid *edid;
2836 
2837 	if (drm_WARN_ON_ONCE(dev, !dev_is_pci(dev->dev)))
2838 		return NULL;
2839 
2840 	vga_switcheroo_lock_ddc(pdev);
2841 	edid = drm_get_edid(connector, adapter);
2842 	vga_switcheroo_unlock_ddc(pdev);
2843 
2844 	return edid;
2845 }
2846 EXPORT_SYMBOL(drm_get_edid_switcheroo);
2847 
2848 /**
2849  * drm_edid_read_switcheroo - get EDID data for a vga_switcheroo output
2850  * @connector: connector we're probing
2851  * @adapter: I2C adapter to use for DDC
2852  *
2853  * Wrapper around drm_edid_read_ddc() for laptops with dual GPUs using one set
2854  * of outputs. The wrapper adds the requisite vga_switcheroo calls to
2855  * temporarily switch DDC to the GPU which is retrieving EDID.
2856  *
2857  * Return: Pointer to valid EDID or %NULL if we couldn't find any.
2858  */
2859 const struct drm_edid *drm_edid_read_switcheroo(struct drm_connector *connector,
2860 						struct i2c_adapter *adapter)
2861 {
2862 	struct drm_device *dev = connector->dev;
2863 	struct pci_dev *pdev = to_pci_dev(dev->dev);
2864 	const struct drm_edid *drm_edid;
2865 
2866 	if (drm_WARN_ON_ONCE(dev, !dev_is_pci(dev->dev)))
2867 		return NULL;
2868 
2869 	vga_switcheroo_lock_ddc(pdev);
2870 	drm_edid = drm_edid_read_ddc(connector, adapter);
2871 	vga_switcheroo_unlock_ddc(pdev);
2872 
2873 	return drm_edid;
2874 }
2875 EXPORT_SYMBOL(drm_edid_read_switcheroo);
2876 
2877 /**
2878  * drm_edid_duplicate - duplicate an EDID and the extensions
2879  * @edid: EDID to duplicate
2880  *
2881  * Return: Pointer to duplicated EDID or NULL on allocation failure.
2882  */
2883 struct edid *drm_edid_duplicate(const struct edid *edid)
2884 {
2885 	if (!edid)
2886 		return NULL;
2887 
2888 	return kmemdup(edid, edid_size(edid), GFP_KERNEL);
2889 }
2890 EXPORT_SYMBOL(drm_edid_duplicate);
2891 
2892 /*** EDID parsing ***/
2893 
2894 /**
2895  * edid_get_quirks - return quirk flags for a given EDID
2896  * @drm_edid: EDID to process
2897  *
2898  * This tells subsequent routines what fixes they need to apply.
2899  */
2900 static u32 edid_get_quirks(const struct drm_edid *drm_edid)
2901 {
2902 	u32 panel_id = edid_extract_panel_id(drm_edid->edid);
2903 	const struct edid_quirk *quirk;
2904 	int i;
2905 
2906 	for (i = 0; i < ARRAY_SIZE(edid_quirk_list); i++) {
2907 		quirk = &edid_quirk_list[i];
2908 		if (quirk->panel_id == panel_id)
2909 			return quirk->quirks;
2910 	}
2911 
2912 	return 0;
2913 }
2914 
2915 #define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay)
2916 #define MODE_REFRESH_DIFF(c,t) (abs((c) - (t)))
2917 
2918 /*
2919  * Walk the mode list for connector, clearing the preferred status on existing
2920  * modes and setting it anew for the right mode ala quirks.
2921  */
2922 static void edid_fixup_preferred(struct drm_connector *connector)
2923 {
2924 	const struct drm_display_info *info = &connector->display_info;
2925 	struct drm_display_mode *t, *cur_mode, *preferred_mode;
2926 	int target_refresh = 0;
2927 	int cur_vrefresh, preferred_vrefresh;
2928 
2929 	if (list_empty(&connector->probed_modes))
2930 		return;
2931 
2932 	if (info->quirks & EDID_QUIRK_PREFER_LARGE_60)
2933 		target_refresh = 60;
2934 	if (info->quirks & EDID_QUIRK_PREFER_LARGE_75)
2935 		target_refresh = 75;
2936 
2937 	preferred_mode = list_first_entry(&connector->probed_modes,
2938 					  struct drm_display_mode, head);
2939 
2940 	list_for_each_entry_safe(cur_mode, t, &connector->probed_modes, head) {
2941 		cur_mode->type &= ~DRM_MODE_TYPE_PREFERRED;
2942 
2943 		if (cur_mode == preferred_mode)
2944 			continue;
2945 
2946 		/* Largest mode is preferred */
2947 		if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode))
2948 			preferred_mode = cur_mode;
2949 
2950 		cur_vrefresh = drm_mode_vrefresh(cur_mode);
2951 		preferred_vrefresh = drm_mode_vrefresh(preferred_mode);
2952 		/* At a given size, try to get closest to target refresh */
2953 		if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) &&
2954 		    MODE_REFRESH_DIFF(cur_vrefresh, target_refresh) <
2955 		    MODE_REFRESH_DIFF(preferred_vrefresh, target_refresh)) {
2956 			preferred_mode = cur_mode;
2957 		}
2958 	}
2959 
2960 	preferred_mode->type |= DRM_MODE_TYPE_PREFERRED;
2961 }
2962 
2963 static bool
2964 mode_is_rb(const struct drm_display_mode *mode)
2965 {
2966 	return (mode->htotal - mode->hdisplay == 160) &&
2967 	       (mode->hsync_end - mode->hdisplay == 80) &&
2968 	       (mode->hsync_end - mode->hsync_start == 32) &&
2969 	       (mode->vsync_start - mode->vdisplay == 3);
2970 }
2971 
2972 /*
2973  * drm_mode_find_dmt - Create a copy of a mode if present in DMT
2974  * @dev: Device to duplicate against
2975  * @hsize: Mode width
2976  * @vsize: Mode height
2977  * @fresh: Mode refresh rate
2978  * @rb: Mode reduced-blanking-ness
2979  *
2980  * Walk the DMT mode list looking for a match for the given parameters.
2981  *
2982  * Return: A newly allocated copy of the mode, or NULL if not found.
2983  */
2984 struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
2985 					   int hsize, int vsize, int fresh,
2986 					   bool rb)
2987 {
2988 	int i;
2989 
2990 	for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
2991 		const struct drm_display_mode *ptr = &drm_dmt_modes[i];
2992 
2993 		if (hsize != ptr->hdisplay)
2994 			continue;
2995 		if (vsize != ptr->vdisplay)
2996 			continue;
2997 		if (fresh != drm_mode_vrefresh(ptr))
2998 			continue;
2999 		if (rb != mode_is_rb(ptr))
3000 			continue;
3001 
3002 		return drm_mode_duplicate(dev, ptr);
3003 	}
3004 
3005 	return NULL;
3006 }
3007 EXPORT_SYMBOL(drm_mode_find_dmt);
3008 
3009 static bool is_display_descriptor(const struct detailed_timing *descriptor, u8 type)
3010 {
3011 	BUILD_BUG_ON(offsetof(typeof(*descriptor), pixel_clock) != 0);
3012 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.pad1) != 2);
3013 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.type) != 3);
3014 
3015 	return descriptor->pixel_clock == 0 &&
3016 		descriptor->data.other_data.pad1 == 0 &&
3017 		descriptor->data.other_data.type == type;
3018 }
3019 
3020 static bool is_detailed_timing_descriptor(const struct detailed_timing *descriptor)
3021 {
3022 	BUILD_BUG_ON(offsetof(typeof(*descriptor), pixel_clock) != 0);
3023 
3024 	return descriptor->pixel_clock != 0;
3025 }
3026 
3027 typedef void detailed_cb(const struct detailed_timing *timing, void *closure);
3028 
3029 static void
3030 cea_for_each_detailed_block(const u8 *ext, detailed_cb *cb, void *closure)
3031 {
3032 	int i, n;
3033 	u8 d = ext[0x02];
3034 	const u8 *det_base = ext + d;
3035 
3036 	if (d < 4 || d > 127)
3037 		return;
3038 
3039 	n = (127 - d) / 18;
3040 	for (i = 0; i < n; i++)
3041 		cb((const struct detailed_timing *)(det_base + 18 * i), closure);
3042 }
3043 
3044 static void
3045 vtb_for_each_detailed_block(const u8 *ext, detailed_cb *cb, void *closure)
3046 {
3047 	unsigned int i, n = min((int)ext[0x02], 6);
3048 	const u8 *det_base = ext + 5;
3049 
3050 	if (ext[0x01] != 1)
3051 		return; /* unknown version */
3052 
3053 	for (i = 0; i < n; i++)
3054 		cb((const struct detailed_timing *)(det_base + 18 * i), closure);
3055 }
3056 
3057 static void drm_for_each_detailed_block(const struct drm_edid *drm_edid,
3058 					detailed_cb *cb, void *closure)
3059 {
3060 	struct drm_edid_iter edid_iter;
3061 	const u8 *ext;
3062 	int i;
3063 
3064 	if (!drm_edid)
3065 		return;
3066 
3067 	for (i = 0; i < EDID_DETAILED_TIMINGS; i++)
3068 		cb(&drm_edid->edid->detailed_timings[i], closure);
3069 
3070 	drm_edid_iter_begin(drm_edid, &edid_iter);
3071 	drm_edid_iter_for_each(ext, &edid_iter) {
3072 		switch (*ext) {
3073 		case CEA_EXT:
3074 			cea_for_each_detailed_block(ext, cb, closure);
3075 			break;
3076 		case VTB_EXT:
3077 			vtb_for_each_detailed_block(ext, cb, closure);
3078 			break;
3079 		default:
3080 			break;
3081 		}
3082 	}
3083 	drm_edid_iter_end(&edid_iter);
3084 }
3085 
3086 static void
3087 is_rb(const struct detailed_timing *descriptor, void *data)
3088 {
3089 	bool *res = data;
3090 
3091 	if (!is_display_descriptor(descriptor, EDID_DETAIL_MONITOR_RANGE))
3092 		return;
3093 
3094 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.flags) != 10);
3095 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.cvt.flags) != 15);
3096 
3097 	if (descriptor->data.other_data.data.range.flags == DRM_EDID_CVT_SUPPORT_FLAG &&
3098 	    descriptor->data.other_data.data.range.formula.cvt.flags & DRM_EDID_CVT_FLAGS_REDUCED_BLANKING)
3099 		*res = true;
3100 }
3101 
3102 /* EDID 1.4 defines this explicitly.  For EDID 1.3, we guess, badly. */
3103 static bool
3104 drm_monitor_supports_rb(const struct drm_edid *drm_edid)
3105 {
3106 	if (drm_edid->edid->revision >= 4) {
3107 		bool ret = false;
3108 
3109 		drm_for_each_detailed_block(drm_edid, is_rb, &ret);
3110 		return ret;
3111 	}
3112 
3113 	return ((drm_edid->edid->input & DRM_EDID_INPUT_DIGITAL) != 0);
3114 }
3115 
3116 static void
3117 find_gtf2(const struct detailed_timing *descriptor, void *data)
3118 {
3119 	const struct detailed_timing **res = data;
3120 
3121 	if (!is_display_descriptor(descriptor, EDID_DETAIL_MONITOR_RANGE))
3122 		return;
3123 
3124 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.flags) != 10);
3125 
3126 	if (descriptor->data.other_data.data.range.flags == DRM_EDID_SECONDARY_GTF_SUPPORT_FLAG)
3127 		*res = descriptor;
3128 }
3129 
3130 /* Secondary GTF curve kicks in above some break frequency */
3131 static int
3132 drm_gtf2_hbreak(const struct drm_edid *drm_edid)
3133 {
3134 	const struct detailed_timing *descriptor = NULL;
3135 
3136 	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3137 
3138 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.hfreq_start_khz) != 12);
3139 
3140 	return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.hfreq_start_khz * 2 : 0;
3141 }
3142 
3143 static int
3144 drm_gtf2_2c(const struct drm_edid *drm_edid)
3145 {
3146 	const struct detailed_timing *descriptor = NULL;
3147 
3148 	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3149 
3150 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.c) != 13);
3151 
3152 	return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.c : 0;
3153 }
3154 
3155 static int
3156 drm_gtf2_m(const struct drm_edid *drm_edid)
3157 {
3158 	const struct detailed_timing *descriptor = NULL;
3159 
3160 	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3161 
3162 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.m) != 14);
3163 
3164 	return descriptor ? le16_to_cpu(descriptor->data.other_data.data.range.formula.gtf2.m) : 0;
3165 }
3166 
3167 static int
3168 drm_gtf2_k(const struct drm_edid *drm_edid)
3169 {
3170 	const struct detailed_timing *descriptor = NULL;
3171 
3172 	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3173 
3174 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.k) != 16);
3175 
3176 	return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.k : 0;
3177 }
3178 
3179 static int
3180 drm_gtf2_2j(const struct drm_edid *drm_edid)
3181 {
3182 	const struct detailed_timing *descriptor = NULL;
3183 
3184 	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3185 
3186 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.j) != 17);
3187 
3188 	return descriptor ? descriptor->data.other_data.data.range.formula.gtf2.j : 0;
3189 }
3190 
3191 static void
3192 get_timing_level(const struct detailed_timing *descriptor, void *data)
3193 {
3194 	int *res = data;
3195 
3196 	if (!is_display_descriptor(descriptor, EDID_DETAIL_MONITOR_RANGE))
3197 		return;
3198 
3199 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.flags) != 10);
3200 
3201 	switch (descriptor->data.other_data.data.range.flags) {
3202 	case DRM_EDID_DEFAULT_GTF_SUPPORT_FLAG:
3203 		*res = LEVEL_GTF;
3204 		break;
3205 	case DRM_EDID_SECONDARY_GTF_SUPPORT_FLAG:
3206 		*res = LEVEL_GTF2;
3207 		break;
3208 	case DRM_EDID_CVT_SUPPORT_FLAG:
3209 		*res = LEVEL_CVT;
3210 		break;
3211 	default:
3212 		break;
3213 	}
3214 }
3215 
3216 /* Get standard timing level (CVT/GTF/DMT). */
3217 static int standard_timing_level(const struct drm_edid *drm_edid)
3218 {
3219 	const struct edid *edid = drm_edid->edid;
3220 
3221 	if (edid->revision >= 4) {
3222 		/*
3223 		 * If the range descriptor doesn't
3224 		 * indicate otherwise default to CVT
3225 		 */
3226 		int ret = LEVEL_CVT;
3227 
3228 		drm_for_each_detailed_block(drm_edid, get_timing_level, &ret);
3229 
3230 		return ret;
3231 	} else if (edid->revision >= 3 && drm_gtf2_hbreak(drm_edid)) {
3232 		return LEVEL_GTF2;
3233 	} else if (edid->revision >= 2) {
3234 		return LEVEL_GTF;
3235 	} else {
3236 		return LEVEL_DMT;
3237 	}
3238 }
3239 
3240 /*
3241  * 0 is reserved.  The spec says 0x01 fill for unused timings.  Some old
3242  * monitors fill with ascii space (0x20) instead.
3243  */
3244 static int
3245 bad_std_timing(u8 a, u8 b)
3246 {
3247 	return (a == 0x00 && b == 0x00) ||
3248 	       (a == 0x01 && b == 0x01) ||
3249 	       (a == 0x20 && b == 0x20);
3250 }
3251 
3252 static int drm_mode_hsync(const struct drm_display_mode *mode)
3253 {
3254 	if (mode->htotal <= 0)
3255 		return 0;
3256 
3257 	return DIV_ROUND_CLOSEST(mode->clock, mode->htotal);
3258 }
3259 
3260 static struct drm_display_mode *
3261 drm_gtf2_mode(struct drm_device *dev,
3262 	      const struct drm_edid *drm_edid,
3263 	      int hsize, int vsize, int vrefresh_rate)
3264 {
3265 	struct drm_display_mode *mode;
3266 
3267 	/*
3268 	 * This is potentially wrong if there's ever a monitor with
3269 	 * more than one ranges section, each claiming a different
3270 	 * secondary GTF curve.  Please don't do that.
3271 	 */
3272 	mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
3273 	if (!mode)
3274 		return NULL;
3275 
3276 	if (drm_mode_hsync(mode) > drm_gtf2_hbreak(drm_edid)) {
3277 		drm_mode_destroy(dev, mode);
3278 		mode = drm_gtf_mode_complex(dev, hsize, vsize,
3279 					    vrefresh_rate, 0, 0,
3280 					    drm_gtf2_m(drm_edid),
3281 					    drm_gtf2_2c(drm_edid),
3282 					    drm_gtf2_k(drm_edid),
3283 					    drm_gtf2_2j(drm_edid));
3284 	}
3285 
3286 	return mode;
3287 }
3288 
3289 /*
3290  * Take the standard timing params (in this case width, aspect, and refresh)
3291  * and convert them into a real mode using CVT/GTF/DMT.
3292  */
3293 static struct drm_display_mode *drm_mode_std(struct drm_connector *connector,
3294 					     const struct drm_edid *drm_edid,
3295 					     const struct std_timing *t)
3296 {
3297 	struct drm_device *dev = connector->dev;
3298 	struct drm_display_mode *m, *mode = NULL;
3299 	int hsize, vsize;
3300 	int vrefresh_rate;
3301 	unsigned aspect_ratio = (t->vfreq_aspect & EDID_TIMING_ASPECT_MASK)
3302 		>> EDID_TIMING_ASPECT_SHIFT;
3303 	unsigned vfreq = (t->vfreq_aspect & EDID_TIMING_VFREQ_MASK)
3304 		>> EDID_TIMING_VFREQ_SHIFT;
3305 	int timing_level = standard_timing_level(drm_edid);
3306 
3307 	if (bad_std_timing(t->hsize, t->vfreq_aspect))
3308 		return NULL;
3309 
3310 	/* According to the EDID spec, the hdisplay = hsize * 8 + 248 */
3311 	hsize = t->hsize * 8 + 248;
3312 	/* vrefresh_rate = vfreq + 60 */
3313 	vrefresh_rate = vfreq + 60;
3314 	/* the vdisplay is calculated based on the aspect ratio */
3315 	if (aspect_ratio == 0) {
3316 		if (drm_edid->edid->revision < 3)
3317 			vsize = hsize;
3318 		else
3319 			vsize = (hsize * 10) / 16;
3320 	} else if (aspect_ratio == 1)
3321 		vsize = (hsize * 3) / 4;
3322 	else if (aspect_ratio == 2)
3323 		vsize = (hsize * 4) / 5;
3324 	else
3325 		vsize = (hsize * 9) / 16;
3326 
3327 	/* HDTV hack, part 1 */
3328 	if (vrefresh_rate == 60 &&
3329 	    ((hsize == 1360 && vsize == 765) ||
3330 	     (hsize == 1368 && vsize == 769))) {
3331 		hsize = 1366;
3332 		vsize = 768;
3333 	}
3334 
3335 	/*
3336 	 * If this connector already has a mode for this size and refresh
3337 	 * rate (because it came from detailed or CVT info), use that
3338 	 * instead.  This way we don't have to guess at interlace or
3339 	 * reduced blanking.
3340 	 */
3341 	list_for_each_entry(m, &connector->probed_modes, head)
3342 		if (m->hdisplay == hsize && m->vdisplay == vsize &&
3343 		    drm_mode_vrefresh(m) == vrefresh_rate)
3344 			return NULL;
3345 
3346 	/* HDTV hack, part 2 */
3347 	if (hsize == 1366 && vsize == 768 && vrefresh_rate == 60) {
3348 		mode = drm_cvt_mode(dev, 1366, 768, vrefresh_rate, 0, 0,
3349 				    false);
3350 		if (!mode)
3351 			return NULL;
3352 		mode->hdisplay = 1366;
3353 		mode->hsync_start = mode->hsync_start - 1;
3354 		mode->hsync_end = mode->hsync_end - 1;
3355 		return mode;
3356 	}
3357 
3358 	/* check whether it can be found in default mode table */
3359 	if (drm_monitor_supports_rb(drm_edid)) {
3360 		mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate,
3361 					 true);
3362 		if (mode)
3363 			return mode;
3364 	}
3365 	mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate, false);
3366 	if (mode)
3367 		return mode;
3368 
3369 	/* okay, generate it */
3370 	switch (timing_level) {
3371 	case LEVEL_DMT:
3372 		break;
3373 	case LEVEL_GTF:
3374 		mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
3375 		break;
3376 	case LEVEL_GTF2:
3377 		mode = drm_gtf2_mode(dev, drm_edid, hsize, vsize, vrefresh_rate);
3378 		break;
3379 	case LEVEL_CVT:
3380 		mode = drm_cvt_mode(dev, hsize, vsize, vrefresh_rate, 0, 0,
3381 				    false);
3382 		break;
3383 	}
3384 	return mode;
3385 }
3386 
3387 /*
3388  * EDID is delightfully ambiguous about how interlaced modes are to be
3389  * encoded.  Our internal representation is of frame height, but some
3390  * HDTV detailed timings are encoded as field height.
3391  *
3392  * The format list here is from CEA, in frame size.  Technically we
3393  * should be checking refresh rate too.  Whatever.
3394  */
3395 static void
3396 drm_mode_do_interlace_quirk(struct drm_display_mode *mode,
3397 			    const struct detailed_pixel_timing *pt)
3398 {
3399 	int i;
3400 	static const struct {
3401 		int w, h;
3402 	} cea_interlaced[] = {
3403 		{ 1920, 1080 },
3404 		{  720,  480 },
3405 		{ 1440,  480 },
3406 		{ 2880,  480 },
3407 		{  720,  576 },
3408 		{ 1440,  576 },
3409 		{ 2880,  576 },
3410 	};
3411 
3412 	if (!(pt->misc & DRM_EDID_PT_INTERLACED))
3413 		return;
3414 
3415 	for (i = 0; i < ARRAY_SIZE(cea_interlaced); i++) {
3416 		if ((mode->hdisplay == cea_interlaced[i].w) &&
3417 		    (mode->vdisplay == cea_interlaced[i].h / 2)) {
3418 			mode->vdisplay *= 2;
3419 			mode->vsync_start *= 2;
3420 			mode->vsync_end *= 2;
3421 			mode->vtotal *= 2;
3422 			mode->vtotal |= 1;
3423 		}
3424 	}
3425 
3426 	mode->flags |= DRM_MODE_FLAG_INTERLACE;
3427 }
3428 
3429 /*
3430  * Create a new mode from an EDID detailed timing section. An EDID detailed
3431  * timing block contains enough info for us to create and return a new struct
3432  * drm_display_mode.
3433  */
3434 static struct drm_display_mode *drm_mode_detailed(struct drm_connector *connector,
3435 						  const struct drm_edid *drm_edid,
3436 						  const struct detailed_timing *timing)
3437 {
3438 	const struct drm_display_info *info = &connector->display_info;
3439 	struct drm_device *dev = connector->dev;
3440 	struct drm_display_mode *mode;
3441 	const struct detailed_pixel_timing *pt = &timing->data.pixel_data;
3442 	unsigned hactive = (pt->hactive_hblank_hi & 0xf0) << 4 | pt->hactive_lo;
3443 	unsigned vactive = (pt->vactive_vblank_hi & 0xf0) << 4 | pt->vactive_lo;
3444 	unsigned hblank = (pt->hactive_hblank_hi & 0xf) << 8 | pt->hblank_lo;
3445 	unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo;
3446 	unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | pt->hsync_offset_lo;
3447 	unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | pt->hsync_pulse_width_lo;
3448 	unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) << 2 | pt->vsync_offset_pulse_width_lo >> 4;
3449 	unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | (pt->vsync_offset_pulse_width_lo & 0xf);
3450 
3451 	/* ignore tiny modes */
3452 	if (hactive < 64 || vactive < 64)
3453 		return NULL;
3454 
3455 	if (pt->misc & DRM_EDID_PT_STEREO) {
3456 		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Stereo mode not supported\n",
3457 			    connector->base.id, connector->name);
3458 		return NULL;
3459 	}
3460 
3461 	/* it is incorrect if hsync/vsync width is zero */
3462 	if (!hsync_pulse_width || !vsync_pulse_width) {
3463 		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Incorrect Detailed timing. Wrong Hsync/Vsync pulse width\n",
3464 			    connector->base.id, connector->name);
3465 		return NULL;
3466 	}
3467 
3468 	if (info->quirks & EDID_QUIRK_FORCE_REDUCED_BLANKING) {
3469 		mode = drm_cvt_mode(dev, hactive, vactive, 60, true, false, false);
3470 		if (!mode)
3471 			return NULL;
3472 
3473 		goto set_size;
3474 	}
3475 
3476 	mode = drm_mode_create(dev);
3477 	if (!mode)
3478 		return NULL;
3479 
3480 	if (info->quirks & EDID_QUIRK_135_CLOCK_TOO_HIGH)
3481 		mode->clock = 1088 * 10;
3482 	else
3483 		mode->clock = le16_to_cpu(timing->pixel_clock) * 10;
3484 
3485 	mode->hdisplay = hactive;
3486 	mode->hsync_start = mode->hdisplay + hsync_offset;
3487 	mode->hsync_end = mode->hsync_start + hsync_pulse_width;
3488 	mode->htotal = mode->hdisplay + hblank;
3489 
3490 	mode->vdisplay = vactive;
3491 	mode->vsync_start = mode->vdisplay + vsync_offset;
3492 	mode->vsync_end = mode->vsync_start + vsync_pulse_width;
3493 	mode->vtotal = mode->vdisplay + vblank;
3494 
3495 	/* Some EDIDs have bogus h/vtotal values */
3496 	if (mode->hsync_end > mode->htotal)
3497 		mode->htotal = mode->hsync_end + 1;
3498 	if (mode->vsync_end > mode->vtotal)
3499 		mode->vtotal = mode->vsync_end + 1;
3500 
3501 	drm_mode_do_interlace_quirk(mode, pt);
3502 
3503 	if (info->quirks & EDID_QUIRK_DETAILED_SYNC_PP) {
3504 		mode->flags |= DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC;
3505 	} else {
3506 		switch (pt->misc & DRM_EDID_PT_SYNC_MASK) {
3507 		case DRM_EDID_PT_ANALOG_CSYNC:
3508 		case DRM_EDID_PT_BIPOLAR_ANALOG_CSYNC:
3509 			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Analog composite sync!\n",
3510 				    connector->base.id, connector->name);
3511 			mode->flags |= DRM_MODE_FLAG_CSYNC | DRM_MODE_FLAG_NCSYNC;
3512 			break;
3513 		case DRM_EDID_PT_DIGITAL_CSYNC:
3514 			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Digital composite sync!\n",
3515 				    connector->base.id, connector->name);
3516 			mode->flags |= DRM_MODE_FLAG_CSYNC;
3517 			mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ?
3518 				DRM_MODE_FLAG_PCSYNC : DRM_MODE_FLAG_NCSYNC;
3519 			break;
3520 		case DRM_EDID_PT_DIGITAL_SEPARATE_SYNC:
3521 			mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ?
3522 				DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
3523 			mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ?
3524 				DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
3525 			break;
3526 		}
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 	if (len >= 6)
6209 		info->dvi_dual = db[6] & 1;
6210 	if (len >= 7)
6211 		info->max_tmds_clock = db[7] * 5000;
6212 
6213 	/*
6214 	 * Try to infer whether the sink supports HDMI infoframes.
6215 	 *
6216 	 * HDMI infoframe support was first added in HDMI 1.4. Assume the sink
6217 	 * supports infoframes if HDMI_Video_present is set.
6218 	 */
6219 	if (len >= 8 && db[8] & BIT(5))
6220 		info->has_hdmi_infoframe = true;
6221 
6222 	drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI: DVI dual %d, max TMDS clock %d kHz\n",
6223 		    connector->base.id, connector->name,
6224 		    info->dvi_dual, info->max_tmds_clock);
6225 
6226 	drm_parse_hdmi_deep_color_info(connector, db);
6227 }
6228 
6229 /*
6230  * See EDID extension for head-mounted and specialized monitors, specified at:
6231  * https://docs.microsoft.com/en-us/windows-hardware/drivers/display/specialized-monitors-edid-extension
6232  */
6233 static void drm_parse_microsoft_vsdb(struct drm_connector *connector,
6234 				     const u8 *db)
6235 {
6236 	struct drm_display_info *info = &connector->display_info;
6237 	u8 version = db[4];
6238 	bool desktop_usage = db[5] & BIT(6);
6239 
6240 	/* Version 1 and 2 for HMDs, version 3 flags desktop usage explicitly */
6241 	if (version == 1 || version == 2 || (version == 3 && !desktop_usage))
6242 		info->non_desktop = true;
6243 
6244 	drm_dbg_kms(connector->dev,
6245 		    "[CONNECTOR:%d:%s] HMD or specialized display VSDB version %u: 0x%02x\n",
6246 		    connector->base.id, connector->name, version, db[5]);
6247 }
6248 
6249 static void drm_parse_cea_ext(struct drm_connector *connector,
6250 			      const struct drm_edid *drm_edid)
6251 {
6252 	struct drm_display_info *info = &connector->display_info;
6253 	struct drm_edid_iter edid_iter;
6254 	const struct cea_db *db;
6255 	struct cea_db_iter iter;
6256 	const u8 *edid_ext;
6257 	u64 y420cmdb_map = 0;
6258 
6259 	drm_edid_iter_begin(drm_edid, &edid_iter);
6260 	drm_edid_iter_for_each(edid_ext, &edid_iter) {
6261 		if (edid_ext[0] != CEA_EXT)
6262 			continue;
6263 
6264 		if (!info->cea_rev)
6265 			info->cea_rev = edid_ext[1];
6266 
6267 		if (info->cea_rev != edid_ext[1])
6268 			drm_dbg_kms(connector->dev,
6269 				    "[CONNECTOR:%d:%s] CEA extension version mismatch %u != %u\n",
6270 				    connector->base.id, connector->name,
6271 				    info->cea_rev, edid_ext[1]);
6272 
6273 		/* The existence of a CTA extension should imply RGB support */
6274 		info->color_formats = DRM_COLOR_FORMAT_RGB444;
6275 		if (edid_ext[3] & EDID_CEA_YCRCB444)
6276 			info->color_formats |= DRM_COLOR_FORMAT_YCBCR444;
6277 		if (edid_ext[3] & EDID_CEA_YCRCB422)
6278 			info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
6279 		if (edid_ext[3] & EDID_BASIC_AUDIO)
6280 			info->has_audio = true;
6281 
6282 	}
6283 	drm_edid_iter_end(&edid_iter);
6284 
6285 	cea_db_iter_edid_begin(drm_edid, &iter);
6286 	cea_db_iter_for_each(db, &iter) {
6287 		/* FIXME: convert parsers to use struct cea_db */
6288 		const u8 *data = (const u8 *)db;
6289 
6290 		if (cea_db_is_hdmi_vsdb(db))
6291 			drm_parse_hdmi_vsdb_video(connector, data);
6292 		else if (cea_db_is_hdmi_forum_vsdb(db) ||
6293 			 cea_db_is_hdmi_forum_scdb(db))
6294 			drm_parse_hdmi_forum_scds(connector, data);
6295 		else if (cea_db_is_microsoft_vsdb(db))
6296 			drm_parse_microsoft_vsdb(connector, data);
6297 		else if (cea_db_is_y420cmdb(db))
6298 			parse_cta_y420cmdb(connector, db, &y420cmdb_map);
6299 		else if (cea_db_is_y420vdb(db))
6300 			parse_cta_y420vdb(connector, db);
6301 		else if (cea_db_is_vcdb(db))
6302 			drm_parse_vcdb(connector, data);
6303 		else if (cea_db_is_hdmi_hdr_metadata_block(db))
6304 			drm_parse_hdr_metadata_block(connector, data);
6305 		else if (cea_db_tag(db) == CTA_DB_VIDEO)
6306 			parse_cta_vdb(connector, db);
6307 		else if (cea_db_tag(db) == CTA_DB_AUDIO)
6308 			info->has_audio = true;
6309 	}
6310 	cea_db_iter_end(&iter);
6311 
6312 	if (y420cmdb_map)
6313 		update_cta_y420cmdb(connector, y420cmdb_map);
6314 }
6315 
6316 static
6317 void get_monitor_range(const struct detailed_timing *timing, void *c)
6318 {
6319 	struct detailed_mode_closure *closure = c;
6320 	struct drm_display_info *info = &closure->connector->display_info;
6321 	struct drm_monitor_range_info *monitor_range = &info->monitor_range;
6322 	const struct detailed_non_pixel *data = &timing->data.other_data;
6323 	const struct detailed_data_monitor_range *range = &data->data.range;
6324 	const struct edid *edid = closure->drm_edid->edid;
6325 
6326 	if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_RANGE))
6327 		return;
6328 
6329 	/*
6330 	 * These limits are used to determine the VRR refresh
6331 	 * rate range. Only the "range limits only" variant
6332 	 * of the range descriptor seems to guarantee that
6333 	 * any and all timings are accepted by the sink, as
6334 	 * opposed to just timings conforming to the indicated
6335 	 * formula (GTF/GTF2/CVT). Thus other variants of the
6336 	 * range descriptor are not accepted here.
6337 	 */
6338 	if (range->flags != DRM_EDID_RANGE_LIMITS_ONLY_FLAG)
6339 		return;
6340 
6341 	monitor_range->min_vfreq = range->min_vfreq;
6342 	monitor_range->max_vfreq = range->max_vfreq;
6343 
6344 	if (edid->revision >= 4) {
6345 		if (data->pad2 & DRM_EDID_RANGE_OFFSET_MIN_VFREQ)
6346 			monitor_range->min_vfreq += 255;
6347 		if (data->pad2 & DRM_EDID_RANGE_OFFSET_MAX_VFREQ)
6348 			monitor_range->max_vfreq += 255;
6349 	}
6350 }
6351 
6352 static void drm_get_monitor_range(struct drm_connector *connector,
6353 				  const struct drm_edid *drm_edid)
6354 {
6355 	const struct drm_display_info *info = &connector->display_info;
6356 	struct detailed_mode_closure closure = {
6357 		.connector = connector,
6358 		.drm_edid = drm_edid,
6359 	};
6360 
6361 	if (drm_edid->edid->revision < 4)
6362 		return;
6363 
6364 	if (!(drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ))
6365 		return;
6366 
6367 	drm_for_each_detailed_block(drm_edid, get_monitor_range, &closure);
6368 
6369 	drm_dbg_kms(connector->dev,
6370 		    "[CONNECTOR:%d:%s] Supported Monitor Refresh rate range is %d Hz - %d Hz\n",
6371 		    connector->base.id, connector->name,
6372 		    info->monitor_range.min_vfreq, info->monitor_range.max_vfreq);
6373 }
6374 
6375 static void drm_parse_vesa_mso_data(struct drm_connector *connector,
6376 				    const struct displayid_block *block)
6377 {
6378 	struct displayid_vesa_vendor_specific_block *vesa =
6379 		(struct displayid_vesa_vendor_specific_block *)block;
6380 	struct drm_display_info *info = &connector->display_info;
6381 
6382 	if (block->num_bytes < 3) {
6383 		drm_dbg_kms(connector->dev,
6384 			    "[CONNECTOR:%d:%s] Unexpected vendor block size %u\n",
6385 			    connector->base.id, connector->name, block->num_bytes);
6386 		return;
6387 	}
6388 
6389 	if (oui(vesa->oui[0], vesa->oui[1], vesa->oui[2]) != VESA_IEEE_OUI)
6390 		return;
6391 
6392 	if (sizeof(*vesa) != sizeof(*block) + block->num_bytes) {
6393 		drm_dbg_kms(connector->dev,
6394 			    "[CONNECTOR:%d:%s] Unexpected VESA vendor block size\n",
6395 			    connector->base.id, connector->name);
6396 		return;
6397 	}
6398 
6399 	switch (FIELD_GET(DISPLAYID_VESA_MSO_MODE, vesa->mso)) {
6400 	default:
6401 		drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Reserved MSO mode value\n",
6402 			    connector->base.id, connector->name);
6403 		fallthrough;
6404 	case 0:
6405 		info->mso_stream_count = 0;
6406 		break;
6407 	case 1:
6408 		info->mso_stream_count = 2; /* 2 or 4 links */
6409 		break;
6410 	case 2:
6411 		info->mso_stream_count = 4; /* 4 links */
6412 		break;
6413 	}
6414 
6415 	if (!info->mso_stream_count) {
6416 		info->mso_pixel_overlap = 0;
6417 		return;
6418 	}
6419 
6420 	info->mso_pixel_overlap = FIELD_GET(DISPLAYID_VESA_MSO_OVERLAP, vesa->mso);
6421 	if (info->mso_pixel_overlap > 8) {
6422 		drm_dbg_kms(connector->dev,
6423 			    "[CONNECTOR:%d:%s] Reserved MSO pixel overlap value %u\n",
6424 			    connector->base.id, connector->name,
6425 			    info->mso_pixel_overlap);
6426 		info->mso_pixel_overlap = 8;
6427 	}
6428 
6429 	drm_dbg_kms(connector->dev,
6430 		    "[CONNECTOR:%d:%s] MSO stream count %u, pixel overlap %u\n",
6431 		    connector->base.id, connector->name,
6432 		    info->mso_stream_count, info->mso_pixel_overlap);
6433 }
6434 
6435 static void drm_update_mso(struct drm_connector *connector,
6436 			   const struct drm_edid *drm_edid)
6437 {
6438 	const struct displayid_block *block;
6439 	struct displayid_iter iter;
6440 
6441 	displayid_iter_edid_begin(drm_edid, &iter);
6442 	displayid_iter_for_each(block, &iter) {
6443 		if (block->tag == DATA_BLOCK_2_VENDOR_SPECIFIC)
6444 			drm_parse_vesa_mso_data(connector, block);
6445 	}
6446 	displayid_iter_end(&iter);
6447 }
6448 
6449 /* A connector has no EDID information, so we've got no EDID to compute quirks from. Reset
6450  * all of the values which would have been set from EDID
6451  */
6452 static void drm_reset_display_info(struct drm_connector *connector)
6453 {
6454 	struct drm_display_info *info = &connector->display_info;
6455 
6456 	info->width_mm = 0;
6457 	info->height_mm = 0;
6458 
6459 	info->bpc = 0;
6460 	info->color_formats = 0;
6461 	info->cea_rev = 0;
6462 	info->max_tmds_clock = 0;
6463 	info->dvi_dual = false;
6464 	info->is_hdmi = false;
6465 	info->has_audio = false;
6466 	info->has_hdmi_infoframe = false;
6467 	info->rgb_quant_range_selectable = false;
6468 	memset(&info->hdmi, 0, sizeof(info->hdmi));
6469 
6470 	info->edid_hdmi_rgb444_dc_modes = 0;
6471 	info->edid_hdmi_ycbcr444_dc_modes = 0;
6472 
6473 	info->non_desktop = 0;
6474 	memset(&info->monitor_range, 0, sizeof(info->monitor_range));
6475 	memset(&info->luminance_range, 0, sizeof(info->luminance_range));
6476 
6477 	info->mso_stream_count = 0;
6478 	info->mso_pixel_overlap = 0;
6479 	info->max_dsc_bpp = 0;
6480 
6481 	kfree(info->vics);
6482 	info->vics = NULL;
6483 	info->vics_len = 0;
6484 
6485 	info->quirks = 0;
6486 }
6487 
6488 static void update_displayid_info(struct drm_connector *connector,
6489 				  const struct drm_edid *drm_edid)
6490 {
6491 	struct drm_display_info *info = &connector->display_info;
6492 	const struct displayid_block *block;
6493 	struct displayid_iter iter;
6494 
6495 	displayid_iter_edid_begin(drm_edid, &iter);
6496 	displayid_iter_for_each(block, &iter) {
6497 		if (displayid_version(&iter) == DISPLAY_ID_STRUCTURE_VER_20 &&
6498 		    (displayid_primary_use(&iter) == PRIMARY_USE_HEAD_MOUNTED_VR ||
6499 		     displayid_primary_use(&iter) == PRIMARY_USE_HEAD_MOUNTED_AR))
6500 			info->non_desktop = true;
6501 
6502 		/*
6503 		 * We're only interested in the base section here, no need to
6504 		 * iterate further.
6505 		 */
6506 		break;
6507 	}
6508 	displayid_iter_end(&iter);
6509 }
6510 
6511 static void update_display_info(struct drm_connector *connector,
6512 				const struct drm_edid *drm_edid)
6513 {
6514 	struct drm_display_info *info = &connector->display_info;
6515 	const struct edid *edid;
6516 
6517 	drm_reset_display_info(connector);
6518 	clear_eld(connector);
6519 
6520 	if (!drm_edid)
6521 		return;
6522 
6523 	edid = drm_edid->edid;
6524 
6525 	info->quirks = edid_get_quirks(drm_edid);
6526 
6527 	info->width_mm = edid->width_cm * 10;
6528 	info->height_mm = edid->height_cm * 10;
6529 
6530 	drm_get_monitor_range(connector, drm_edid);
6531 
6532 	if (edid->revision < 3)
6533 		goto out;
6534 
6535 	if (!(edid->input & DRM_EDID_INPUT_DIGITAL))
6536 		goto out;
6537 
6538 	info->color_formats |= DRM_COLOR_FORMAT_RGB444;
6539 	drm_parse_cea_ext(connector, drm_edid);
6540 
6541 	update_displayid_info(connector, drm_edid);
6542 
6543 	/*
6544 	 * Digital sink with "DFP 1.x compliant TMDS" according to EDID 1.3?
6545 	 *
6546 	 * For such displays, the DFP spec 1.0, section 3.10 "EDID support"
6547 	 * tells us to assume 8 bpc color depth if the EDID doesn't have
6548 	 * extensions which tell otherwise.
6549 	 */
6550 	if (info->bpc == 0 && edid->revision == 3 &&
6551 	    edid->input & DRM_EDID_DIGITAL_DFP_1_X) {
6552 		info->bpc = 8;
6553 		drm_dbg_kms(connector->dev,
6554 			    "[CONNECTOR:%d:%s] Assigning DFP sink color depth as %d bpc.\n",
6555 			    connector->base.id, connector->name, info->bpc);
6556 	}
6557 
6558 	/* Only defined for 1.4 with digital displays */
6559 	if (edid->revision < 4)
6560 		goto out;
6561 
6562 	switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) {
6563 	case DRM_EDID_DIGITAL_DEPTH_6:
6564 		info->bpc = 6;
6565 		break;
6566 	case DRM_EDID_DIGITAL_DEPTH_8:
6567 		info->bpc = 8;
6568 		break;
6569 	case DRM_EDID_DIGITAL_DEPTH_10:
6570 		info->bpc = 10;
6571 		break;
6572 	case DRM_EDID_DIGITAL_DEPTH_12:
6573 		info->bpc = 12;
6574 		break;
6575 	case DRM_EDID_DIGITAL_DEPTH_14:
6576 		info->bpc = 14;
6577 		break;
6578 	case DRM_EDID_DIGITAL_DEPTH_16:
6579 		info->bpc = 16;
6580 		break;
6581 	case DRM_EDID_DIGITAL_DEPTH_UNDEF:
6582 	default:
6583 		info->bpc = 0;
6584 		break;
6585 	}
6586 
6587 	drm_dbg_kms(connector->dev,
6588 		    "[CONNECTOR:%d:%s] Assigning EDID-1.4 digital sink color depth as %d bpc.\n",
6589 		    connector->base.id, connector->name, info->bpc);
6590 
6591 	if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444)
6592 		info->color_formats |= DRM_COLOR_FORMAT_YCBCR444;
6593 	if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422)
6594 		info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
6595 
6596 	drm_update_mso(connector, drm_edid);
6597 
6598 out:
6599 	if (info->quirks & EDID_QUIRK_NON_DESKTOP) {
6600 		drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Non-desktop display%s\n",
6601 			    connector->base.id, connector->name,
6602 			    info->non_desktop ? " (redundant quirk)" : "");
6603 		info->non_desktop = true;
6604 	}
6605 
6606 	if (info->quirks & EDID_QUIRK_CAP_DSC_15BPP)
6607 		info->max_dsc_bpp = 15;
6608 
6609 	if (info->quirks & EDID_QUIRK_FORCE_6BPC)
6610 		info->bpc = 6;
6611 
6612 	if (info->quirks & EDID_QUIRK_FORCE_8BPC)
6613 		info->bpc = 8;
6614 
6615 	if (info->quirks & EDID_QUIRK_FORCE_10BPC)
6616 		info->bpc = 10;
6617 
6618 	if (info->quirks & EDID_QUIRK_FORCE_12BPC)
6619 		info->bpc = 12;
6620 
6621 	/* Depends on info->cea_rev set by drm_parse_cea_ext() above */
6622 	drm_edid_to_eld(connector, drm_edid);
6623 }
6624 
6625 static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev,
6626 							    struct displayid_detailed_timings_1 *timings,
6627 							    bool type_7)
6628 {
6629 	struct drm_display_mode *mode;
6630 	unsigned pixel_clock = (timings->pixel_clock[0] |
6631 				(timings->pixel_clock[1] << 8) |
6632 				(timings->pixel_clock[2] << 16)) + 1;
6633 	unsigned hactive = (timings->hactive[0] | timings->hactive[1] << 8) + 1;
6634 	unsigned hblank = (timings->hblank[0] | timings->hblank[1] << 8) + 1;
6635 	unsigned hsync = (timings->hsync[0] | (timings->hsync[1] & 0x7f) << 8) + 1;
6636 	unsigned hsync_width = (timings->hsw[0] | timings->hsw[1] << 8) + 1;
6637 	unsigned vactive = (timings->vactive[0] | timings->vactive[1] << 8) + 1;
6638 	unsigned vblank = (timings->vblank[0] | timings->vblank[1] << 8) + 1;
6639 	unsigned vsync = (timings->vsync[0] | (timings->vsync[1] & 0x7f) << 8) + 1;
6640 	unsigned vsync_width = (timings->vsw[0] | timings->vsw[1] << 8) + 1;
6641 	bool hsync_positive = (timings->hsync[1] >> 7) & 0x1;
6642 	bool vsync_positive = (timings->vsync[1] >> 7) & 0x1;
6643 
6644 	mode = drm_mode_create(dev);
6645 	if (!mode)
6646 		return NULL;
6647 
6648 	/* resolution is kHz for type VII, and 10 kHz for type I */
6649 	mode->clock = type_7 ? pixel_clock : pixel_clock * 10;
6650 	mode->hdisplay = hactive;
6651 	mode->hsync_start = mode->hdisplay + hsync;
6652 	mode->hsync_end = mode->hsync_start + hsync_width;
6653 	mode->htotal = mode->hdisplay + hblank;
6654 
6655 	mode->vdisplay = vactive;
6656 	mode->vsync_start = mode->vdisplay + vsync;
6657 	mode->vsync_end = mode->vsync_start + vsync_width;
6658 	mode->vtotal = mode->vdisplay + vblank;
6659 
6660 	mode->flags = 0;
6661 	mode->flags |= hsync_positive ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
6662 	mode->flags |= vsync_positive ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
6663 	mode->type = DRM_MODE_TYPE_DRIVER;
6664 
6665 	if (timings->flags & 0x80)
6666 		mode->type |= DRM_MODE_TYPE_PREFERRED;
6667 	drm_mode_set_name(mode);
6668 
6669 	return mode;
6670 }
6671 
6672 static int add_displayid_detailed_1_modes(struct drm_connector *connector,
6673 					  const struct displayid_block *block)
6674 {
6675 	struct displayid_detailed_timing_block *det = (struct displayid_detailed_timing_block *)block;
6676 	int i;
6677 	int num_timings;
6678 	struct drm_display_mode *newmode;
6679 	int num_modes = 0;
6680 	bool type_7 = block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING;
6681 	/* blocks must be multiple of 20 bytes length */
6682 	if (block->num_bytes % 20)
6683 		return 0;
6684 
6685 	num_timings = block->num_bytes / 20;
6686 	for (i = 0; i < num_timings; i++) {
6687 		struct displayid_detailed_timings_1 *timings = &det->timings[i];
6688 
6689 		newmode = drm_mode_displayid_detailed(connector->dev, timings, type_7);
6690 		if (!newmode)
6691 			continue;
6692 
6693 		drm_mode_probed_add(connector, newmode);
6694 		num_modes++;
6695 	}
6696 	return num_modes;
6697 }
6698 
6699 static int add_displayid_detailed_modes(struct drm_connector *connector,
6700 					const struct drm_edid *drm_edid)
6701 {
6702 	const struct displayid_block *block;
6703 	struct displayid_iter iter;
6704 	int num_modes = 0;
6705 
6706 	displayid_iter_edid_begin(drm_edid, &iter);
6707 	displayid_iter_for_each(block, &iter) {
6708 		if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING ||
6709 		    block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING)
6710 			num_modes += add_displayid_detailed_1_modes(connector, block);
6711 	}
6712 	displayid_iter_end(&iter);
6713 
6714 	return num_modes;
6715 }
6716 
6717 static int _drm_edid_connector_add_modes(struct drm_connector *connector,
6718 					 const struct drm_edid *drm_edid)
6719 {
6720 	const struct drm_display_info *info = &connector->display_info;
6721 	int num_modes = 0;
6722 
6723 	if (!drm_edid)
6724 		return 0;
6725 
6726 	/*
6727 	 * EDID spec says modes should be preferred in this order:
6728 	 * - preferred detailed mode
6729 	 * - other detailed modes from base block
6730 	 * - detailed modes from extension blocks
6731 	 * - CVT 3-byte code modes
6732 	 * - standard timing codes
6733 	 * - established timing codes
6734 	 * - modes inferred from GTF or CVT range information
6735 	 *
6736 	 * We get this pretty much right.
6737 	 *
6738 	 * XXX order for additional mode types in extension blocks?
6739 	 */
6740 	num_modes += add_detailed_modes(connector, drm_edid);
6741 	num_modes += add_cvt_modes(connector, drm_edid);
6742 	num_modes += add_standard_modes(connector, drm_edid);
6743 	num_modes += add_established_modes(connector, drm_edid);
6744 	num_modes += add_cea_modes(connector, drm_edid);
6745 	num_modes += add_alternate_cea_modes(connector, drm_edid);
6746 	num_modes += add_displayid_detailed_modes(connector, drm_edid);
6747 	if (drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ)
6748 		num_modes += add_inferred_modes(connector, drm_edid);
6749 
6750 	if (info->quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
6751 		edid_fixup_preferred(connector);
6752 
6753 	return num_modes;
6754 }
6755 
6756 static void _drm_update_tile_info(struct drm_connector *connector,
6757 				  const struct drm_edid *drm_edid);
6758 
6759 static int _drm_edid_connector_property_update(struct drm_connector *connector,
6760 					       const struct drm_edid *drm_edid)
6761 {
6762 	struct drm_device *dev = connector->dev;
6763 	int ret;
6764 
6765 	if (connector->edid_blob_ptr) {
6766 		const struct edid *old_edid = connector->edid_blob_ptr->data;
6767 
6768 		if (old_edid) {
6769 			if (!drm_edid_are_equal(drm_edid ? drm_edid->edid : NULL, old_edid)) {
6770 				connector->epoch_counter++;
6771 				drm_dbg_kms(dev, "[CONNECTOR:%d:%s] EDID changed, epoch counter %llu\n",
6772 					    connector->base.id, connector->name,
6773 					    connector->epoch_counter);
6774 			}
6775 		}
6776 	}
6777 
6778 	ret = drm_property_replace_global_blob(dev,
6779 					       &connector->edid_blob_ptr,
6780 					       drm_edid ? drm_edid->size : 0,
6781 					       drm_edid ? drm_edid->edid : NULL,
6782 					       &connector->base,
6783 					       dev->mode_config.edid_property);
6784 	if (ret) {
6785 		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] EDID property update failed (%d)\n",
6786 			    connector->base.id, connector->name, ret);
6787 		goto out;
6788 	}
6789 
6790 	ret = drm_object_property_set_value(&connector->base,
6791 					    dev->mode_config.non_desktop_property,
6792 					    connector->display_info.non_desktop);
6793 	if (ret) {
6794 		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Non-desktop property update failed (%d)\n",
6795 			    connector->base.id, connector->name, ret);
6796 		goto out;
6797 	}
6798 
6799 	ret = drm_connector_set_tile_property(connector);
6800 	if (ret) {
6801 		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Tile property update failed (%d)\n",
6802 			    connector->base.id, connector->name, ret);
6803 		goto out;
6804 	}
6805 
6806 out:
6807 	return ret;
6808 }
6809 
6810 /**
6811  * drm_edid_connector_update - Update connector information from EDID
6812  * @connector: Connector
6813  * @drm_edid: EDID
6814  *
6815  * Update the connector display info, ELD, HDR metadata, relevant properties,
6816  * etc. from the passed in EDID.
6817  *
6818  * If EDID is NULL, reset the information.
6819  *
6820  * Must be called before calling drm_edid_connector_add_modes().
6821  *
6822  * Return: 0 on success, negative error on errors.
6823  */
6824 int drm_edid_connector_update(struct drm_connector *connector,
6825 			      const struct drm_edid *drm_edid)
6826 {
6827 	update_display_info(connector, drm_edid);
6828 
6829 	_drm_update_tile_info(connector, drm_edid);
6830 
6831 	return _drm_edid_connector_property_update(connector, drm_edid);
6832 }
6833 EXPORT_SYMBOL(drm_edid_connector_update);
6834 
6835 /**
6836  * drm_edid_connector_add_modes - Update probed modes from the EDID property
6837  * @connector: Connector
6838  *
6839  * Add the modes from the previously updated EDID property to the connector
6840  * probed modes list.
6841  *
6842  * drm_edid_connector_update() must have been called before this to update the
6843  * EDID property.
6844  *
6845  * Return: The number of modes added, or 0 if we couldn't find any.
6846  */
6847 int drm_edid_connector_add_modes(struct drm_connector *connector)
6848 {
6849 	const struct drm_edid *drm_edid = NULL;
6850 	int count;
6851 
6852 	if (connector->edid_blob_ptr)
6853 		drm_edid = drm_edid_alloc(connector->edid_blob_ptr->data,
6854 					  connector->edid_blob_ptr->length);
6855 
6856 	count = _drm_edid_connector_add_modes(connector, drm_edid);
6857 
6858 	drm_edid_free(drm_edid);
6859 
6860 	return count;
6861 }
6862 EXPORT_SYMBOL(drm_edid_connector_add_modes);
6863 
6864 /**
6865  * drm_connector_update_edid_property - update the edid property of a connector
6866  * @connector: drm connector
6867  * @edid: new value of the edid property
6868  *
6869  * This function creates a new blob modeset object and assigns its id to the
6870  * connector's edid property.
6871  * Since we also parse tile information from EDID's displayID block, we also
6872  * set the connector's tile property here. See drm_connector_set_tile_property()
6873  * for more details.
6874  *
6875  * This function is deprecated. Use drm_edid_connector_update() instead.
6876  *
6877  * Returns:
6878  * Zero on success, negative errno on failure.
6879  */
6880 int drm_connector_update_edid_property(struct drm_connector *connector,
6881 				       const struct edid *edid)
6882 {
6883 	struct drm_edid drm_edid;
6884 
6885 	return drm_edid_connector_update(connector, drm_edid_legacy_init(&drm_edid, edid));
6886 }
6887 EXPORT_SYMBOL(drm_connector_update_edid_property);
6888 
6889 /**
6890  * drm_add_edid_modes - add modes from EDID data, if available
6891  * @connector: connector we're probing
6892  * @edid: EDID data
6893  *
6894  * Add the specified modes to the connector's mode list. Also fills out the
6895  * &drm_display_info structure and ELD in @connector with any information which
6896  * can be derived from the edid.
6897  *
6898  * This function is deprecated. Use drm_edid_connector_add_modes() instead.
6899  *
6900  * Return: The number of modes added or 0 if we couldn't find any.
6901  */
6902 int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
6903 {
6904 	struct drm_edid _drm_edid;
6905 	const struct drm_edid *drm_edid;
6906 
6907 	if (edid && !drm_edid_is_valid(edid)) {
6908 		drm_warn(connector->dev, "[CONNECTOR:%d:%s] EDID invalid.\n",
6909 			 connector->base.id, connector->name);
6910 		edid = NULL;
6911 	}
6912 
6913 	drm_edid = drm_edid_legacy_init(&_drm_edid, edid);
6914 
6915 	update_display_info(connector, drm_edid);
6916 
6917 	return _drm_edid_connector_add_modes(connector, drm_edid);
6918 }
6919 EXPORT_SYMBOL(drm_add_edid_modes);
6920 
6921 /**
6922  * drm_add_modes_noedid - add modes for the connectors without EDID
6923  * @connector: connector we're probing
6924  * @hdisplay: the horizontal display limit
6925  * @vdisplay: the vertical display limit
6926  *
6927  * Add the specified modes to the connector's mode list. Only when the
6928  * hdisplay/vdisplay is not beyond the given limit, it will be added.
6929  *
6930  * Return: The number of modes added or 0 if we couldn't find any.
6931  */
6932 int drm_add_modes_noedid(struct drm_connector *connector,
6933 			int hdisplay, int vdisplay)
6934 {
6935 	int i, count, num_modes = 0;
6936 	struct drm_display_mode *mode;
6937 	struct drm_device *dev = connector->dev;
6938 
6939 	count = ARRAY_SIZE(drm_dmt_modes);
6940 	if (hdisplay < 0)
6941 		hdisplay = 0;
6942 	if (vdisplay < 0)
6943 		vdisplay = 0;
6944 
6945 	for (i = 0; i < count; i++) {
6946 		const struct drm_display_mode *ptr = &drm_dmt_modes[i];
6947 
6948 		if (hdisplay && vdisplay) {
6949 			/*
6950 			 * Only when two are valid, they will be used to check
6951 			 * whether the mode should be added to the mode list of
6952 			 * the connector.
6953 			 */
6954 			if (ptr->hdisplay > hdisplay ||
6955 					ptr->vdisplay > vdisplay)
6956 				continue;
6957 		}
6958 		if (drm_mode_vrefresh(ptr) > 61)
6959 			continue;
6960 		mode = drm_mode_duplicate(dev, ptr);
6961 		if (mode) {
6962 			drm_mode_probed_add(connector, mode);
6963 			num_modes++;
6964 		}
6965 	}
6966 	return num_modes;
6967 }
6968 EXPORT_SYMBOL(drm_add_modes_noedid);
6969 
6970 /**
6971  * drm_set_preferred_mode - Sets the preferred mode of a connector
6972  * @connector: connector whose mode list should be processed
6973  * @hpref: horizontal resolution of preferred mode
6974  * @vpref: vertical resolution of preferred mode
6975  *
6976  * Marks a mode as preferred if it matches the resolution specified by @hpref
6977  * and @vpref.
6978  */
6979 void drm_set_preferred_mode(struct drm_connector *connector,
6980 			   int hpref, int vpref)
6981 {
6982 	struct drm_display_mode *mode;
6983 
6984 	list_for_each_entry(mode, &connector->probed_modes, head) {
6985 		if (mode->hdisplay == hpref &&
6986 		    mode->vdisplay == vpref)
6987 			mode->type |= DRM_MODE_TYPE_PREFERRED;
6988 	}
6989 }
6990 EXPORT_SYMBOL(drm_set_preferred_mode);
6991 
6992 static bool is_hdmi2_sink(const struct drm_connector *connector)
6993 {
6994 	/*
6995 	 * FIXME: sil-sii8620 doesn't have a connector around when
6996 	 * we need one, so we have to be prepared for a NULL connector.
6997 	 */
6998 	if (!connector)
6999 		return true;
7000 
7001 	return connector->display_info.hdmi.scdc.supported ||
7002 		connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR420;
7003 }
7004 
7005 static u8 drm_mode_hdmi_vic(const struct drm_connector *connector,
7006 			    const struct drm_display_mode *mode)
7007 {
7008 	bool has_hdmi_infoframe = connector ?
7009 		connector->display_info.has_hdmi_infoframe : false;
7010 
7011 	if (!has_hdmi_infoframe)
7012 		return 0;
7013 
7014 	/* No HDMI VIC when signalling 3D video format */
7015 	if (mode->flags & DRM_MODE_FLAG_3D_MASK)
7016 		return 0;
7017 
7018 	return drm_match_hdmi_mode(mode);
7019 }
7020 
7021 static u8 drm_mode_cea_vic(const struct drm_connector *connector,
7022 			   const struct drm_display_mode *mode)
7023 {
7024 	/*
7025 	 * HDMI spec says if a mode is found in HDMI 1.4b 4K modes
7026 	 * we should send its VIC in vendor infoframes, else send the
7027 	 * VIC in AVI infoframes. Lets check if this mode is present in
7028 	 * HDMI 1.4b 4K modes
7029 	 */
7030 	if (drm_mode_hdmi_vic(connector, mode))
7031 		return 0;
7032 
7033 	return drm_match_cea_mode(mode);
7034 }
7035 
7036 /*
7037  * Avoid sending VICs defined in HDMI 2.0 in AVI infoframes to sinks that
7038  * conform to HDMI 1.4.
7039  *
7040  * HDMI 1.4 (CTA-861-D) VIC range: [1..64]
7041  * HDMI 2.0 (CTA-861-F) VIC range: [1..107]
7042  *
7043  * If the sink lists the VIC in CTA VDB, assume it's fine, regardless of HDMI
7044  * version.
7045  */
7046 static u8 vic_for_avi_infoframe(const struct drm_connector *connector, u8 vic)
7047 {
7048 	if (!is_hdmi2_sink(connector) && vic > 64 &&
7049 	    !cta_vdb_has_vic(connector, vic))
7050 		return 0;
7051 
7052 	return vic;
7053 }
7054 
7055 /**
7056  * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with
7057  *                                              data from a DRM display mode
7058  * @frame: HDMI AVI infoframe
7059  * @connector: the connector
7060  * @mode: DRM display mode
7061  *
7062  * Return: 0 on success or a negative error code on failure.
7063  */
7064 int
7065 drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
7066 					 const struct drm_connector *connector,
7067 					 const struct drm_display_mode *mode)
7068 {
7069 	enum hdmi_picture_aspect picture_aspect;
7070 	u8 vic, hdmi_vic;
7071 
7072 	if (!frame || !mode)
7073 		return -EINVAL;
7074 
7075 	hdmi_avi_infoframe_init(frame);
7076 
7077 	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
7078 		frame->pixel_repeat = 1;
7079 
7080 	vic = drm_mode_cea_vic(connector, mode);
7081 	hdmi_vic = drm_mode_hdmi_vic(connector, mode);
7082 
7083 	frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
7084 
7085 	/*
7086 	 * As some drivers don't support atomic, we can't use connector state.
7087 	 * So just initialize the frame with default values, just the same way
7088 	 * as it's done with other properties here.
7089 	 */
7090 	frame->content_type = HDMI_CONTENT_TYPE_GRAPHICS;
7091 	frame->itc = 0;
7092 
7093 	/*
7094 	 * Populate picture aspect ratio from either
7095 	 * user input (if specified) or from the CEA/HDMI mode lists.
7096 	 */
7097 	picture_aspect = mode->picture_aspect_ratio;
7098 	if (picture_aspect == HDMI_PICTURE_ASPECT_NONE) {
7099 		if (vic)
7100 			picture_aspect = drm_get_cea_aspect_ratio(vic);
7101 		else if (hdmi_vic)
7102 			picture_aspect = drm_get_hdmi_aspect_ratio(hdmi_vic);
7103 	}
7104 
7105 	/*
7106 	 * The infoframe can't convey anything but none, 4:3
7107 	 * and 16:9, so if the user has asked for anything else
7108 	 * we can only satisfy it by specifying the right VIC.
7109 	 */
7110 	if (picture_aspect > HDMI_PICTURE_ASPECT_16_9) {
7111 		if (vic) {
7112 			if (picture_aspect != drm_get_cea_aspect_ratio(vic))
7113 				return -EINVAL;
7114 		} else if (hdmi_vic) {
7115 			if (picture_aspect != drm_get_hdmi_aspect_ratio(hdmi_vic))
7116 				return -EINVAL;
7117 		} else {
7118 			return -EINVAL;
7119 		}
7120 
7121 		picture_aspect = HDMI_PICTURE_ASPECT_NONE;
7122 	}
7123 
7124 	frame->video_code = vic_for_avi_infoframe(connector, vic);
7125 	frame->picture_aspect = picture_aspect;
7126 	frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
7127 	frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
7128 
7129 	return 0;
7130 }
7131 EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
7132 
7133 /**
7134  * drm_hdmi_avi_infoframe_quant_range() - fill the HDMI AVI infoframe
7135  *                                        quantization range information
7136  * @frame: HDMI AVI infoframe
7137  * @connector: the connector
7138  * @mode: DRM display mode
7139  * @rgb_quant_range: RGB quantization range (Q)
7140  */
7141 void
7142 drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
7143 				   const struct drm_connector *connector,
7144 				   const struct drm_display_mode *mode,
7145 				   enum hdmi_quantization_range rgb_quant_range)
7146 {
7147 	const struct drm_display_info *info = &connector->display_info;
7148 
7149 	/*
7150 	 * CEA-861:
7151 	 * "A Source shall not send a non-zero Q value that does not correspond
7152 	 *  to the default RGB Quantization Range for the transmitted Picture
7153 	 *  unless the Sink indicates support for the Q bit in a Video
7154 	 *  Capabilities Data Block."
7155 	 *
7156 	 * HDMI 2.0 recommends sending non-zero Q when it does match the
7157 	 * default RGB quantization range for the mode, even when QS=0.
7158 	 */
7159 	if (info->rgb_quant_range_selectable ||
7160 	    rgb_quant_range == drm_default_rgb_quant_range(mode))
7161 		frame->quantization_range = rgb_quant_range;
7162 	else
7163 		frame->quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
7164 
7165 	/*
7166 	 * CEA-861-F:
7167 	 * "When transmitting any RGB colorimetry, the Source should set the
7168 	 *  YQ-field to match the RGB Quantization Range being transmitted
7169 	 *  (e.g., when Limited Range RGB, set YQ=0 or when Full Range RGB,
7170 	 *  set YQ=1) and the Sink shall ignore the YQ-field."
7171 	 *
7172 	 * Unfortunate certain sinks (eg. VIZ Model 67/E261VA) get confused
7173 	 * by non-zero YQ when receiving RGB. There doesn't seem to be any
7174 	 * good way to tell which version of CEA-861 the sink supports, so
7175 	 * we limit non-zero YQ to HDMI 2.0 sinks only as HDMI 2.0 is based
7176 	 * on CEA-861-F.
7177 	 */
7178 	if (!is_hdmi2_sink(connector) ||
7179 	    rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED)
7180 		frame->ycc_quantization_range =
7181 			HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
7182 	else
7183 		frame->ycc_quantization_range =
7184 			HDMI_YCC_QUANTIZATION_RANGE_FULL;
7185 }
7186 EXPORT_SYMBOL(drm_hdmi_avi_infoframe_quant_range);
7187 
7188 static enum hdmi_3d_structure
7189 s3d_structure_from_display_mode(const struct drm_display_mode *mode)
7190 {
7191 	u32 layout = mode->flags & DRM_MODE_FLAG_3D_MASK;
7192 
7193 	switch (layout) {
7194 	case DRM_MODE_FLAG_3D_FRAME_PACKING:
7195 		return HDMI_3D_STRUCTURE_FRAME_PACKING;
7196 	case DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE:
7197 		return HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE;
7198 	case DRM_MODE_FLAG_3D_LINE_ALTERNATIVE:
7199 		return HDMI_3D_STRUCTURE_LINE_ALTERNATIVE;
7200 	case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL:
7201 		return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL;
7202 	case DRM_MODE_FLAG_3D_L_DEPTH:
7203 		return HDMI_3D_STRUCTURE_L_DEPTH;
7204 	case DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH:
7205 		return HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH;
7206 	case DRM_MODE_FLAG_3D_TOP_AND_BOTTOM:
7207 		return HDMI_3D_STRUCTURE_TOP_AND_BOTTOM;
7208 	case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF:
7209 		return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF;
7210 	default:
7211 		return HDMI_3D_STRUCTURE_INVALID;
7212 	}
7213 }
7214 
7215 /**
7216  * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
7217  * data from a DRM display mode
7218  * @frame: HDMI vendor infoframe
7219  * @connector: the connector
7220  * @mode: DRM display mode
7221  *
7222  * Note that there's is a need to send HDMI vendor infoframes only when using a
7223  * 4k or stereoscopic 3D mode. So when giving any other mode as input this
7224  * function will return -EINVAL, error that can be safely ignored.
7225  *
7226  * Return: 0 on success or a negative error code on failure.
7227  */
7228 int
7229 drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
7230 					    const struct drm_connector *connector,
7231 					    const struct drm_display_mode *mode)
7232 {
7233 	/*
7234 	 * FIXME: sil-sii8620 doesn't have a connector around when
7235 	 * we need one, so we have to be prepared for a NULL connector.
7236 	 */
7237 	bool has_hdmi_infoframe = connector ?
7238 		connector->display_info.has_hdmi_infoframe : false;
7239 	int err;
7240 
7241 	if (!frame || !mode)
7242 		return -EINVAL;
7243 
7244 	if (!has_hdmi_infoframe)
7245 		return -EINVAL;
7246 
7247 	err = hdmi_vendor_infoframe_init(frame);
7248 	if (err < 0)
7249 		return err;
7250 
7251 	/*
7252 	 * Even if it's not absolutely necessary to send the infoframe
7253 	 * (ie.vic==0 and s3d_struct==0) we will still send it if we
7254 	 * know that the sink can handle it. This is based on a
7255 	 * suggestion in HDMI 2.0 Appendix F. Apparently some sinks
7256 	 * have trouble realizing that they should switch from 3D to 2D
7257 	 * mode if the source simply stops sending the infoframe when
7258 	 * it wants to switch from 3D to 2D.
7259 	 */
7260 	frame->vic = drm_mode_hdmi_vic(connector, mode);
7261 	frame->s3d_struct = s3d_structure_from_display_mode(mode);
7262 
7263 	return 0;
7264 }
7265 EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode);
7266 
7267 static void drm_parse_tiled_block(struct drm_connector *connector,
7268 				  const struct displayid_block *block)
7269 {
7270 	const struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block;
7271 	u16 w, h;
7272 	u8 tile_v_loc, tile_h_loc;
7273 	u8 num_v_tile, num_h_tile;
7274 	struct drm_tile_group *tg;
7275 
7276 	w = tile->tile_size[0] | tile->tile_size[1] << 8;
7277 	h = tile->tile_size[2] | tile->tile_size[3] << 8;
7278 
7279 	num_v_tile = (tile->topo[0] & 0xf) | (tile->topo[2] & 0x30);
7280 	num_h_tile = (tile->topo[0] >> 4) | ((tile->topo[2] >> 2) & 0x30);
7281 	tile_v_loc = (tile->topo[1] & 0xf) | ((tile->topo[2] & 0x3) << 4);
7282 	tile_h_loc = (tile->topo[1] >> 4) | (((tile->topo[2] >> 2) & 0x3) << 4);
7283 
7284 	connector->has_tile = true;
7285 	if (tile->tile_cap & 0x80)
7286 		connector->tile_is_single_monitor = true;
7287 
7288 	connector->num_h_tile = num_h_tile + 1;
7289 	connector->num_v_tile = num_v_tile + 1;
7290 	connector->tile_h_loc = tile_h_loc;
7291 	connector->tile_v_loc = tile_v_loc;
7292 	connector->tile_h_size = w + 1;
7293 	connector->tile_v_size = h + 1;
7294 
7295 	drm_dbg_kms(connector->dev,
7296 		    "[CONNECTOR:%d:%s] tile cap 0x%x, size %dx%d, num tiles %dx%d, location %dx%d, vend %c%c%c",
7297 		    connector->base.id, connector->name,
7298 		    tile->tile_cap,
7299 		    connector->tile_h_size, connector->tile_v_size,
7300 		    connector->num_h_tile, connector->num_v_tile,
7301 		    connector->tile_h_loc, connector->tile_v_loc,
7302 		    tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]);
7303 
7304 	tg = drm_mode_get_tile_group(connector->dev, tile->topology_id);
7305 	if (!tg)
7306 		tg = drm_mode_create_tile_group(connector->dev, tile->topology_id);
7307 	if (!tg)
7308 		return;
7309 
7310 	if (connector->tile_group != tg) {
7311 		/* if we haven't got a pointer,
7312 		   take the reference, drop ref to old tile group */
7313 		if (connector->tile_group)
7314 			drm_mode_put_tile_group(connector->dev, connector->tile_group);
7315 		connector->tile_group = tg;
7316 	} else {
7317 		/* if same tile group, then release the ref we just took. */
7318 		drm_mode_put_tile_group(connector->dev, tg);
7319 	}
7320 }
7321 
7322 static bool displayid_is_tiled_block(const struct displayid_iter *iter,
7323 				     const struct displayid_block *block)
7324 {
7325 	return (displayid_version(iter) == DISPLAY_ID_STRUCTURE_VER_12 &&
7326 		block->tag == DATA_BLOCK_TILED_DISPLAY) ||
7327 		(displayid_version(iter) == DISPLAY_ID_STRUCTURE_VER_20 &&
7328 		 block->tag == DATA_BLOCK_2_TILED_DISPLAY_TOPOLOGY);
7329 }
7330 
7331 static void _drm_update_tile_info(struct drm_connector *connector,
7332 				  const struct drm_edid *drm_edid)
7333 {
7334 	const struct displayid_block *block;
7335 	struct displayid_iter iter;
7336 
7337 	connector->has_tile = false;
7338 
7339 	displayid_iter_edid_begin(drm_edid, &iter);
7340 	displayid_iter_for_each(block, &iter) {
7341 		if (displayid_is_tiled_block(&iter, block))
7342 			drm_parse_tiled_block(connector, block);
7343 	}
7344 	displayid_iter_end(&iter);
7345 
7346 	if (!connector->has_tile && connector->tile_group) {
7347 		drm_mode_put_tile_group(connector->dev, connector->tile_group);
7348 		connector->tile_group = NULL;
7349 	}
7350 }
7351