]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - android/external-libkmsxx.git/blob - kms++/src/modedb_cea.cpp
Fix byte order of 24-bit formats.
[android/external-libkmsxx.git] / kms++ / src / modedb_cea.cpp
1 /* From Linux kernel: drm_edid.c */
2 /*
3  * Copyright (c) 2006 Luc Verhaegen (quirks list)
4  * Copyright (c) 2007-2008 Intel Corporation
5  *   Jesse Barnes <jesse.barnes@intel.com>
6  * Copyright 2010 Red Hat, Inc.
7  *
8  * DDC probing routines (drm_ddc_read & drm_do_probe_ddc_edid) originally from
9  * FB layer.
10  *   Copyright (C) 2006 Dennis Munsie <dmunsie@cecropia.com>
11  *
12  * Permission is hereby granted, free of charge, to any person obtaining a
13  * copy of this software and associated documentation files (the "Software"),
14  * to deal in the Software without restriction, including without limitation
15  * the rights to use, copy, modify, merge, publish, distribute, sub license,
16  * and/or sell copies of the Software, and to permit persons to whom the
17  * Software is furnished to do so, subject to the following conditions:
18  *
19  * The above copyright notice and this permission notice (including the
20  * next paragraph) shall be included in all copies or substantial portions
21  * of the Software.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
26  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29  * DEALINGS IN THE SOFTWARE.
30  */
32 #include <kms++/modedb.h>
34 #include <xf86drm.h>
36 namespace kms
37 {
39 #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d))
41 #define DRM_MODE(nm, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \
42         .name = nm, .clock = (c), \
43         .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), .htotal = (ht), .hskew = (hsk), \
44         .vdisplay = (vd), .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), .vscan = (vs), \
45         .vrefresh = DIV_ROUND(c * 1000, ht * vt), .flags = (f), .type = 0
47 /*
48  * Probably taken from CEA-861 spec.
49  * This table is converted from xorg's hw/xfree86/modes/xf86EdidModes.c.
50  */
51 const Videomode cea_modes[] = {
52         /* 1 - 640x480@60Hz */
53         { DRM_MODE("640x480", 25175, 640, 656,
54           752, 800, 0, 480, 490, 492, 525, 0,
55           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
56         },
57         /* 2 - 720x480@60Hz */
58         { DRM_MODE("720x480", 27000, 720, 736,
59           798, 858, 0, 480, 489, 495, 525, 0,
60           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
61         },
62         /* 3 - 720x480@60Hz */
63         { DRM_MODE("720x480", 27000, 720, 736,
64           798, 858, 0, 480, 489, 495, 525, 0,
65           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
66         },
67         /* 4 - 1280x720@60Hz */
68         { DRM_MODE("1280x720", 74250, 1280, 1390,
69           1430, 1650, 0, 720, 725, 730, 750, 0,
70           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
71         },
72         /* 5 - 1920x1080i@60Hz */
73         { DRM_MODE("1920x1080i", 74250, 1920, 2008,
74           2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
75           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
76           DRM_MODE_FLAG_INTERLACE),
77         },
78         /* 6 - 720(1440)x480i@60Hz */
79         { DRM_MODE("720x480i", 13500, 720, 739,
80           801, 858, 0, 480, 488, 494, 525, 0,
81           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
82           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
83         },
84         /* 7 - 720(1440)x480i@60Hz */
85         { DRM_MODE("720x480i", 13500, 720, 739,
86           801, 858, 0, 480, 488, 494, 525, 0,
87           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
88           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
89         },
90         /* 8 - 720(1440)x240@60Hz */
91         { DRM_MODE("720x240", 13500, 720, 739,
92           801, 858, 0, 240, 244, 247, 262, 0,
93           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
94           DRM_MODE_FLAG_DBLCLK),
95         },
96         /* 9 - 720(1440)x240@60Hz */
97         { DRM_MODE("720x240", 13500, 720, 739,
98           801, 858, 0, 240, 244, 247, 262, 0,
99           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
100           DRM_MODE_FLAG_DBLCLK),
101         },
102         /* 10 - 2880x480i@60Hz */
103         { DRM_MODE("2880x480i", 54000, 2880, 2956,
104           3204, 3432, 0, 480, 488, 494, 525, 0,
105           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
106           DRM_MODE_FLAG_INTERLACE),
107         },
108         /* 11 - 2880x480i@60Hz */
109         { DRM_MODE("2880x480i", 54000, 2880, 2956,
110           3204, 3432, 0, 480, 488, 494, 525, 0,
111           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
112           DRM_MODE_FLAG_INTERLACE),
113         },
114         /* 12 - 2880x240@60Hz */
115         { DRM_MODE("2880x240", 54000, 2880, 2956,
116           3204, 3432, 0, 240, 244, 247, 262, 0,
117           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
118         },
119         /* 13 - 2880x240@60Hz */
120         { DRM_MODE("2880x240", 54000, 2880, 2956,
121           3204, 3432, 0, 240, 244, 247, 262, 0,
122           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
123         },
124         /* 14 - 1440x480@60Hz */
125         { DRM_MODE("1440x480", 54000, 1440, 1472,
126           1596, 1716, 0, 480, 489, 495, 525, 0,
127           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
128         },
129         /* 15 - 1440x480@60Hz */
130         { DRM_MODE("1440x480", 54000, 1440, 1472,
131           1596, 1716, 0, 480, 489, 495, 525, 0,
132           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
133         },
134         /* 16 - 1920x1080@60Hz */
135         { DRM_MODE("1920x1080", 148500, 1920, 2008,
136           2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
137           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
138         },
139         /* 17 - 720x576@50Hz */
140         { DRM_MODE("720x576", 27000, 720, 732,
141           796, 864, 0, 576, 581, 586, 625, 0,
142           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
143         },
144         /* 18 - 720x576@50Hz */
145         { DRM_MODE("720x576", 27000, 720, 732,
146           796, 864, 0, 576, 581, 586, 625, 0,
147           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
148         },
149         /* 19 - 1280x720@50Hz */
150         { DRM_MODE("1280x720", 74250, 1280, 1720,
151           1760, 1980, 0, 720, 725, 730, 750, 0,
152           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
153         },
154         /* 20 - 1920x1080i@50Hz */
155         { DRM_MODE("1920x1080i", 74250, 1920, 2448,
156           2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
157           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
158           DRM_MODE_FLAG_INTERLACE),
159         },
160         /* 21 - 720(1440)x576i@50Hz */
161         { DRM_MODE("720x576i", 13500, 720, 732,
162           795, 864, 0, 576, 580, 586, 625, 0,
163           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
164           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
165         },
166         /* 22 - 720(1440)x576i@50Hz */
167         { DRM_MODE("720x576i", 13500, 720, 732,
168           795, 864, 0, 576, 580, 586, 625, 0,
169           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
170           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
171         },
172         /* 23 - 720(1440)x288@50Hz */
173         { DRM_MODE("720x288", 13500, 720, 732,
174           795, 864, 0, 288, 290, 293, 312, 0,
175           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
176           DRM_MODE_FLAG_DBLCLK),
177         },
178         /* 24 - 720(1440)x288@50Hz */
179         { DRM_MODE("720x288", 13500, 720, 732,
180           795, 864, 0, 288, 290, 293, 312, 0,
181           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
182           DRM_MODE_FLAG_DBLCLK),
183         },
184         /* 25 - 2880x576i@50Hz */
185         { DRM_MODE("2880x576i", 54000, 2880, 2928,
186           3180, 3456, 0, 576, 580, 586, 625, 0,
187           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
188           DRM_MODE_FLAG_INTERLACE),
189         },
190         /* 26 - 2880x576i@50Hz */
191         { DRM_MODE("2880x576i", 54000, 2880, 2928,
192           3180, 3456, 0, 576, 580, 586, 625, 0,
193           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
194           DRM_MODE_FLAG_INTERLACE),
195         },
196         /* 27 - 2880x288@50Hz */
197         { DRM_MODE("2880x288", 54000, 2880, 2928,
198           3180, 3456, 0, 288, 290, 293, 312, 0,
199           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
200         },
201         /* 28 - 2880x288@50Hz */
202         { DRM_MODE("2880x288", 54000, 2880, 2928,
203           3180, 3456, 0, 288, 290, 293, 312, 0,
204           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
205         },
206         /* 29 - 1440x576@50Hz */
207         { DRM_MODE("1440x576", 54000, 1440, 1464,
208           1592, 1728, 0, 576, 581, 586, 625, 0,
209           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
210         },
211         /* 30 - 1440x576@50Hz */
212         { DRM_MODE("1440x576", 54000, 1440, 1464,
213           1592, 1728, 0, 576, 581, 586, 625, 0,
214           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
215         },
216         /* 31 - 1920x1080@50Hz */
217         { DRM_MODE("1920x1080", 148500, 1920, 2448,
218           2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
219           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
220         },
221         /* 32 - 1920x1080@24Hz */
222         { DRM_MODE("1920x1080", 74250, 1920, 2558,
223           2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
224           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
225         },
226         /* 33 - 1920x1080@25Hz */
227         { DRM_MODE("1920x1080", 74250, 1920, 2448,
228           2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
229           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
230         },
231         /* 34 - 1920x1080@30Hz */
232         { DRM_MODE("1920x1080", 74250, 1920, 2008,
233           2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
234           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
235         },
236         /* 35 - 2880x480@60Hz */
237         { DRM_MODE("2880x480", 108000, 2880, 2944,
238           3192, 3432, 0, 480, 489, 495, 525, 0,
239           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
240         },
241         /* 36 - 2880x480@60Hz */
242         { DRM_MODE("2880x480", 108000, 2880, 2944,
243           3192, 3432, 0, 480, 489, 495, 525, 0,
244           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
245         },
246         /* 37 - 2880x576@50Hz */
247         { DRM_MODE("2880x576", 108000, 2880, 2928,
248           3184, 3456, 0, 576, 581, 586, 625, 0,
249           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
250         },
251         /* 38 - 2880x576@50Hz */
252         { DRM_MODE("2880x576", 108000, 2880, 2928,
253           3184, 3456, 0, 576, 581, 586, 625, 0,
254           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
255         },
256         /* 39 - 1920x1080i@50Hz */
257         { DRM_MODE("1920x1080i", 72000, 1920, 1952,
258           2120, 2304, 0, 1080, 1126, 1136, 1250, 0,
259           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC |
260           DRM_MODE_FLAG_INTERLACE),
261         },
262         /* 40 - 1920x1080i@100Hz */
263         { DRM_MODE("1920x1080i", 148500, 1920, 2448,
264           2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
265           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
266           DRM_MODE_FLAG_INTERLACE),
267         },
268         /* 41 - 1280x720@100Hz */
269         { DRM_MODE("1280x720", 148500, 1280, 1720,
270           1760, 1980, 0, 720, 725, 730, 750, 0,
271           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
272         },
273         /* 42 - 720x576@100Hz */
274         { DRM_MODE("720x576", 54000, 720, 732,
275           796, 864, 0, 576, 581, 586, 625, 0,
276           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
277         },
278         /* 43 - 720x576@100Hz */
279         { DRM_MODE("720x576", 54000, 720, 732,
280           796, 864, 0, 576, 581, 586, 625, 0,
281           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
282         },
283         /* 44 - 720(1440)x576i@100Hz */
284         { DRM_MODE("720x576i", 27000, 720, 732,
285           795, 864, 0, 576, 580, 586, 625, 0,
286           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
287           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
288         },
289         /* 45 - 720(1440)x576i@100Hz */
290         { DRM_MODE("720x576i", 27000, 720, 732,
291           795, 864, 0, 576, 580, 586, 625, 0,
292           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
293           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
294         },
295         /* 46 - 1920x1080i@120Hz */
296         { DRM_MODE("1920x1080i", 148500, 1920, 2008,
297           2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
298           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
299           DRM_MODE_FLAG_INTERLACE),
300         },
301         /* 47 - 1280x720@120Hz */
302         { DRM_MODE("1280x720", 148500, 1280, 1390,
303           1430, 1650, 0, 720, 725, 730, 750, 0,
304           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
305         },
306         /* 48 - 720x480@120Hz */
307         { DRM_MODE("720x480", 54000, 720, 736,
308           798, 858, 0, 480, 489, 495, 525, 0,
309           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
310         },
311         /* 49 - 720x480@120Hz */
312         { DRM_MODE("720x480", 54000, 720, 736,
313           798, 858, 0, 480, 489, 495, 525, 0,
314           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
315         },
316         /* 50 - 720(1440)x480i@120Hz */
317         { DRM_MODE("720x480i", 27000, 720, 739,
318           801, 858, 0, 480, 488, 494, 525, 0,
319           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
320           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
321         },
322         /* 51 - 720(1440)x480i@120Hz */
323         { DRM_MODE("720x480i", 27000, 720, 739,
324           801, 858, 0, 480, 488, 494, 525, 0,
325           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
326           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
327         },
328         /* 52 - 720x576@200Hz */
329         { DRM_MODE("720x576", 108000, 720, 732,
330           796, 864, 0, 576, 581, 586, 625, 0,
331           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
332         },
333         /* 53 - 720x576@200Hz */
334         { DRM_MODE("720x576", 108000, 720, 732,
335           796, 864, 0, 576, 581, 586, 625, 0,
336           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
337         },
338         /* 54 - 720(1440)x576i@200Hz */
339         { DRM_MODE("720x576i", 54000, 720, 732,
340           795, 864, 0, 576, 580, 586, 625, 0,
341           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
342           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
343         },
344         /* 55 - 720(1440)x576i@200Hz */
345         { DRM_MODE("720x576i", 54000, 720, 732,
346           795, 864, 0, 576, 580, 586, 625, 0,
347           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
348           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
349         },
350         /* 56 - 720x480@240Hz */
351         { DRM_MODE("720x480", 108000, 720, 736,
352           798, 858, 0, 480, 489, 495, 525, 0,
353           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
354         },
355         /* 57 - 720x480@240Hz */
356         { DRM_MODE("720x480", 108000, 720, 736,
357           798, 858, 0, 480, 489, 495, 525, 0,
358           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
359         },
360         /* 58 - 720(1440)x480i@240 */
361         { DRM_MODE("720x480i", 54000, 720, 739,
362           801, 858, 0, 480, 488, 494, 525, 0,
363           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
364           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
365         },
366         /* 59 - 720(1440)x480i@240 */
367         { DRM_MODE("720x480i", 54000, 720, 739,
368           801, 858, 0, 480, 488, 494, 525, 0,
369           DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
370           DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
371         },
372         /* 60 - 1280x720@24Hz */
373         { DRM_MODE("1280x720", 59400, 1280, 3040,
374           3080, 3300, 0, 720, 725, 730, 750, 0,
375           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
376         },
377         /* 61 - 1280x720@25Hz */
378         { DRM_MODE("1280x720", 74250, 1280, 3700,
379           3740, 3960, 0, 720, 725, 730, 750, 0,
380           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
381         },
382         /* 62 - 1280x720@30Hz */
383         { DRM_MODE("1280x720", 74250, 1280, 3040,
384           3080, 3300, 0, 720, 725, 730, 750, 0,
385           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
386         },
387         /* 63 - 1920x1080@120Hz */
388         { DRM_MODE("1920x1080", 297000, 1920, 2008,
389           2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
390           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
391         },
392         /* 64 - 1920x1080@100Hz */
393         { DRM_MODE("1920x1080", 297000, 1920, 2448,
394           2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
395           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
396         },
397         /* TERMINATOR */
398         { },
399 };