Rev 3192 | Rev 3746 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1123 | serge | 1 | /* |
2 | * Copyright (c) 2006 Luc Verhaegen (quirks list) |
||
3 | * Copyright (c) 2007-2008 Intel Corporation |
||
4 | * Jesse Barnes |
||
1963 | serge | 5 | * Copyright 2010 Red Hat, Inc. |
1123 | serge | 6 | * |
7 | * DDC probing routines (drm_ddc_read & drm_do_probe_ddc_edid) originally from |
||
8 | * FB layer. |
||
9 | * Copyright (C) 2006 Dennis Munsie |
||
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 | */ |
||
1221 | serge | 30 | #include |
1963 | serge | 31 | #include |
3480 | Serge | 32 | #include |
1125 | serge | 33 | #include |
3031 | serge | 34 | #include |
35 | #include |
||
36 | #include |
||
1123 | serge | 37 | |
1963 | serge | 38 | #define version_greater(edid, maj, min) \ |
39 | (((edid)->version > (maj)) || \ |
||
40 | ((edid)->version == (maj) && (edid)->revision > (min))) |
||
1123 | serge | 41 | |
1963 | serge | 42 | #define EDID_EST_TIMINGS 16 |
43 | #define EDID_STD_TIMINGS 8 |
||
44 | #define EDID_DETAILED_TIMINGS 4 |
||
45 | |||
1123 | serge | 46 | /* |
47 | * EDID blocks out in the wild have a variety of bugs, try to collect |
||
48 | * them here (note that userspace may work around broken monitors first, |
||
49 | * but fixes should make their way here so that the kernel "just works" |
||
50 | * on as many displays as possible). |
||
51 | */ |
||
52 | |||
53 | /* First detailed mode wrong, use largest 60Hz mode */ |
||
54 | #define EDID_QUIRK_PREFER_LARGE_60 (1 << 0) |
||
55 | /* Reported 135MHz pixel clock is too high, needs adjustment */ |
||
56 | #define EDID_QUIRK_135_CLOCK_TOO_HIGH (1 << 1) |
||
57 | /* Prefer the largest mode at 75 Hz */ |
||
58 | #define EDID_QUIRK_PREFER_LARGE_75 (1 << 2) |
||
59 | /* Detail timing is in cm not mm */ |
||
60 | #define EDID_QUIRK_DETAILED_IN_CM (1 << 3) |
||
61 | /* Detailed timing descriptors have bogus size values, so just take the |
||
62 | * maximum size and use that. |
||
63 | */ |
||
64 | #define EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE (1 << 4) |
||
65 | /* Monitor forgot to set the first detailed is preferred bit. */ |
||
66 | #define EDID_QUIRK_FIRST_DETAILED_PREFERRED (1 << 5) |
||
67 | /* use +hsync +vsync for detailed mode */ |
||
68 | #define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) |
||
3031 | serge | 69 | /* Force reduced-blanking timings for detailed modes */ |
70 | #define EDID_QUIRK_FORCE_REDUCED_BLANKING (1 << 7) |
||
1123 | serge | 71 | |
1963 | serge | 72 | struct detailed_mode_closure { |
73 | struct drm_connector *connector; |
||
74 | struct edid *edid; |
||
75 | bool preferred; |
||
76 | u32 quirks; |
||
77 | int modes; |
||
78 | }; |
||
1430 | serge | 79 | |
1179 | serge | 80 | #define LEVEL_DMT 0 |
81 | #define LEVEL_GTF 1 |
||
1963 | serge | 82 | #define LEVEL_GTF2 2 |
83 | #define LEVEL_CVT 3 |
||
1179 | serge | 84 | |
1123 | serge | 85 | static struct edid_quirk { |
3031 | serge | 86 | char vendor[4]; |
1123 | serge | 87 | int product_id; |
88 | u32 quirks; |
||
89 | } edid_quirk_list[] = { |
||
90 | /* Acer AL1706 */ |
||
91 | { "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 }, |
||
92 | /* Acer F51 */ |
||
93 | { "API", 0x7602, EDID_QUIRK_PREFER_LARGE_60 }, |
||
94 | /* Unknown Acer */ |
||
95 | { "ACR", 2423, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, |
||
96 | |||
97 | /* Belinea 10 15 55 */ |
||
98 | { "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 }, |
||
99 | { "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 }, |
||
100 | |||
101 | /* Envision Peripherals, Inc. EN-7100e */ |
||
102 | { "EPI", 59264, EDID_QUIRK_135_CLOCK_TOO_HIGH }, |
||
1963 | serge | 103 | /* Envision EN2028 */ |
104 | { "EPI", 8232, EDID_QUIRK_PREFER_LARGE_60 }, |
||
1123 | serge | 105 | |
106 | /* Funai Electronics PM36B */ |
||
107 | { "FCM", 13600, EDID_QUIRK_PREFER_LARGE_75 | |
||
108 | EDID_QUIRK_DETAILED_IN_CM }, |
||
109 | |||
110 | /* LG Philips LCD LP154W01-A5 */ |
||
111 | { "LPL", 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE }, |
||
112 | { "LPL", 0x2a00, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE }, |
||
113 | |||
114 | /* Philips 107p5 CRT */ |
||
115 | { "PHL", 57364, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, |
||
116 | |||
117 | /* Proview AY765C */ |
||
118 | { "PTS", 765, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, |
||
119 | |||
120 | /* Samsung SyncMaster 205BW. Note: irony */ |
||
121 | { "SAM", 541, EDID_QUIRK_DETAILED_SYNC_PP }, |
||
122 | /* Samsung SyncMaster 22[5-6]BW */ |
||
123 | { "SAM", 596, EDID_QUIRK_PREFER_LARGE_60 }, |
||
124 | { "SAM", 638, EDID_QUIRK_PREFER_LARGE_60 }, |
||
3031 | serge | 125 | |
126 | /* ViewSonic VA2026w */ |
||
127 | { "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING }, |
||
1123 | serge | 128 | }; |
129 | |||
3480 | Serge | 130 | /* |
131 | * Autogenerated from the DMT spec. |
||
132 | * This table is copied from xfree86/modes/xf86EdidModes.c. |
||
133 | */ |
||
134 | static const struct drm_display_mode drm_dmt_modes[] = { |
||
135 | /* 640x350@85Hz */ |
||
136 | { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 31500, 640, 672, |
||
137 | 736, 832, 0, 350, 382, 385, 445, 0, |
||
138 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, |
||
139 | /* 640x400@85Hz */ |
||
140 | { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 31500, 640, 672, |
||
141 | 736, 832, 0, 400, 401, 404, 445, 0, |
||
142 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
143 | /* 720x400@85Hz */ |
||
144 | { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 756, |
||
145 | 828, 936, 0, 400, 401, 404, 446, 0, |
||
146 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
147 | /* 640x480@60Hz */ |
||
148 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656, |
||
149 | 752, 800, 0, 480, 489, 492, 525, 0, |
||
150 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, |
||
151 | /* 640x480@72Hz */ |
||
152 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664, |
||
153 | 704, 832, 0, 480, 489, 492, 520, 0, |
||
154 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, |
||
155 | /* 640x480@75Hz */ |
||
156 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656, |
||
157 | 720, 840, 0, 480, 481, 484, 500, 0, |
||
158 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, |
||
159 | /* 640x480@85Hz */ |
||
160 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 36000, 640, 696, |
||
161 | 752, 832, 0, 480, 481, 484, 509, 0, |
||
162 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, |
||
163 | /* 800x600@56Hz */ |
||
164 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824, |
||
165 | 896, 1024, 0, 600, 601, 603, 625, 0, |
||
166 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
167 | /* 800x600@60Hz */ |
||
168 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840, |
||
169 | 968, 1056, 0, 600, 601, 605, 628, 0, |
||
170 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
171 | /* 800x600@72Hz */ |
||
172 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856, |
||
173 | 976, 1040, 0, 600, 637, 643, 666, 0, |
||
174 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
175 | /* 800x600@75Hz */ |
||
176 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816, |
||
177 | 896, 1056, 0, 600, 601, 604, 625, 0, |
||
178 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
179 | /* 800x600@85Hz */ |
||
180 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 56250, 800, 832, |
||
181 | 896, 1048, 0, 600, 601, 604, 631, 0, |
||
182 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
183 | /* 800x600@120Hz RB */ |
||
184 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 73250, 800, 848, |
||
185 | 880, 960, 0, 600, 603, 607, 636, 0, |
||
186 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, |
||
187 | /* 848x480@60Hz */ |
||
188 | { DRM_MODE("848x480", DRM_MODE_TYPE_DRIVER, 33750, 848, 864, |
||
189 | 976, 1088, 0, 480, 486, 494, 517, 0, |
||
190 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
191 | /* 1024x768@43Hz, interlace */ |
||
192 | { DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032, |
||
193 | 1208, 1264, 0, 768, 768, 772, 817, 0, |
||
194 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | |
||
195 | DRM_MODE_FLAG_INTERLACE) }, |
||
196 | /* 1024x768@60Hz */ |
||
197 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048, |
||
198 | 1184, 1344, 0, 768, 771, 777, 806, 0, |
||
199 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, |
||
200 | /* 1024x768@70Hz */ |
||
201 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048, |
||
202 | 1184, 1328, 0, 768, 771, 777, 806, 0, |
||
203 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, |
||
204 | /* 1024x768@75Hz */ |
||
205 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040, |
||
206 | 1136, 1312, 0, 768, 769, 772, 800, 0, |
||
207 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
208 | /* 1024x768@85Hz */ |
||
209 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 94500, 1024, 1072, |
||
210 | 1168, 1376, 0, 768, 769, 772, 808, 0, |
||
211 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
212 | /* 1024x768@120Hz RB */ |
||
213 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 115500, 1024, 1072, |
||
214 | 1104, 1184, 0, 768, 771, 775, 813, 0, |
||
215 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, |
||
216 | /* 1152x864@75Hz */ |
||
217 | { DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216, |
||
218 | 1344, 1600, 0, 864, 865, 868, 900, 0, |
||
219 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
220 | /* 1280x768@60Hz RB */ |
||
221 | { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 68250, 1280, 1328, |
||
222 | 1360, 1440, 0, 768, 771, 778, 790, 0, |
||
223 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, |
||
224 | /* 1280x768@60Hz */ |
||
225 | { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 79500, 1280, 1344, |
||
226 | 1472, 1664, 0, 768, 771, 778, 798, 0, |
||
227 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
228 | /* 1280x768@75Hz */ |
||
229 | { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 102250, 1280, 1360, |
||
230 | 1488, 1696, 0, 768, 771, 778, 805, 0, |
||
231 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, |
||
232 | /* 1280x768@85Hz */ |
||
233 | { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 117500, 1280, 1360, |
||
234 | 1496, 1712, 0, 768, 771, 778, 809, 0, |
||
235 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
||
236 | /* 1280x768@120Hz RB */ |
||
237 | { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 140250, 1280, 1328, |
||