diff options
| author | Dave Airlie <airlied@redhat.com> | 2013-02-23 21:39:42 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2013-02-23 21:39:42 -0500 |
| commit | 28ee46184fc64591e286fa0355845e09c39e2a84 (patch) | |
| tree | 97f6cb0411cf45f173586275b53c1cfe457a587b /drivers/gpu/drm | |
| parent | a497bfe9dbbc0fbacd61295986372a626e73f452 (diff) | |
| parent | e3b2e0347e3b3b81cc322b413abf98a349d275df (diff) | |
Merge branch 'drm/hdmi-for-3.9' of git://anongit.freedesktop.org/tegra/linux into drm-next
Thierry writes:
"Remove a duplicate implementation of the CEA VIC lookup and move the CEA
and other mode tables to drm_edid.c to make it more difficult to create
duplicates of the tables.
Add some helpers to pack CEA-861/HDMI AVI, audio and SPD infoframes into
binary buffers that can easily be written into hardware registers. A new
helper function makes it easy construct an AVI infoframe from a DRM
display mode.
Convert the Tegra and Radeon drivers to use the new HDMI helpers."
* 'drm/hdmi-for-3.9' of git://anongit.freedesktop.org/tegra/linux:
drm/radeon: Use generic HDMI infoframe helpers
drm/tegra: Use generic HDMI infoframe helpers
drm: Add EDID helper documentation
drm: Add HDMI infoframe helpers
video: Add generic HDMI infoframe helpers
drm: Add some missing forward declarations
drm: Move mode tables to drm_edid.c
drm: Remove duplicate drm_mode_cea_vic()
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_edid.c | 798 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_edid_modes.h | 774 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen_hdmi.c | 85 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600_hdmi.c | 134 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/hdmi.c | 226 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/hdmi.h | 189 |
11 files changed, 950 insertions, 1266 deletions
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index f8dae851130c..1e82882da9de 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | menuconfig DRM | 7 | menuconfig DRM |
| 8 | tristate "Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)" | 8 | tristate "Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)" |
| 9 | depends on (AGP || AGP=n) && !EMULATED_CMPXCHG && MMU | 9 | depends on (AGP || AGP=n) && !EMULATED_CMPXCHG && MMU |
| 10 | select HDMI | ||
| 10 | select I2C | 11 | select I2C |
| 11 | select I2C_ALGOBIT | 12 | select I2C_ALGOBIT |
| 12 | select DMA_SHARED_BUFFER | 13 | select DMA_SHARED_BUFFER |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 67aa0dd68250..c194f4e680ad 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
| @@ -29,11 +29,11 @@ | |||
| 29 | */ | 29 | */ |
| 30 | #include <linux/kernel.h> | 30 | #include <linux/kernel.h> |
| 31 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
| 32 | #include <linux/hdmi.h> | ||
| 32 | #include <linux/i2c.h> | 33 | #include <linux/i2c.h> |
| 33 | #include <linux/module.h> | 34 | #include <linux/module.h> |
| 34 | #include <drm/drmP.h> | 35 | #include <drm/drmP.h> |
| 35 | #include <drm/drm_edid.h> | 36 | #include <drm/drm_edid.h> |
| 36 | #include "drm_edid_modes.h" | ||
| 37 | 37 | ||
| 38 | #define version_greater(edid, maj, min) \ | 38 | #define version_greater(edid, maj, min) \ |
| 39 | (((edid)->version > (maj)) || \ | 39 | (((edid)->version > (maj)) || \ |
| @@ -127,6 +127,746 @@ static struct edid_quirk { | |||
| 127 | { "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING }, | 127 | { "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING }, |
| 128 | }; | 128 | }; |
| 129 | 129 | ||
| 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, | ||
| 238 | 1360, 1440, 0, 768, 771, 778, 813, 0, | ||
| 239 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 240 | /* 1280x800@60Hz RB */ | ||
| 241 | { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 71000, 1280, 1328, | ||
| 242 | 1360, 1440, 0, 800, 803, 809, 823, 0, | ||
| 243 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 244 | /* 1280x800@60Hz */ | ||
| 245 | { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352, | ||
| 246 | 1480, 1680, 0, 800, 803, 809, 831, 0, | ||
| 247 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 248 | /* 1280x800@75Hz */ | ||
| 249 | { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 106500, 1280, 1360, | ||
| 250 | 1488, 1696, 0, 800, 803, 809, 838, 0, | ||
| 251 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 252 | /* 1280x800@85Hz */ | ||
| 253 | { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 122500, 1280, 1360, | ||
| 254 | 1496, 1712, 0, 800, 803, 809, 843, 0, | ||
| 255 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 256 | /* 1280x800@120Hz RB */ | ||
| 257 | { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 146250, 1280, 1328, | ||
| 258 | 1360, 1440, 0, 800, 803, 809, 847, 0, | ||
| 259 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 260 | /* 1280x960@60Hz */ | ||
| 261 | { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1376, | ||
| 262 | 1488, 1800, 0, 960, 961, 964, 1000, 0, | ||
| 263 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 264 | /* 1280x960@85Hz */ | ||
| 265 | { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1344, | ||
| 266 | 1504, 1728, 0, 960, 961, 964, 1011, 0, | ||
| 267 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 268 | /* 1280x960@120Hz RB */ | ||
| 269 | { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 175500, 1280, 1328, | ||
| 270 | 1360, 1440, 0, 960, 963, 967, 1017, 0, | ||
| 271 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 272 | /* 1280x1024@60Hz */ | ||
| 273 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1328, | ||
| 274 | 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, | ||
| 275 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 276 | /* 1280x1024@75Hz */ | ||
| 277 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296, | ||
| 278 | 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, | ||
| 279 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 280 | /* 1280x1024@85Hz */ | ||
| 281 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 157500, 1280, 1344, | ||
| 282 | 1504, 1728, 0, 1024, 1025, 1028, 1072, 0, | ||
| 283 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 284 | /* 1280x1024@120Hz RB */ | ||
| 285 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 187250, 1280, 1328, | ||
| 286 | 1360, 1440, 0, 1024, 1027, 1034, 1084, 0, | ||
| 287 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 288 | /* 1360x768@60Hz */ | ||
| 289 | { DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 85500, 1360, 1424, | ||
| 290 | 1536, 1792, 0, 768, 771, 777, 795, 0, | ||
| 291 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 292 | /* 1360x768@120Hz RB */ | ||
| 293 | { DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 148250, 1360, 1408, | ||
| 294 | 1440, 1520, 0, 768, 771, 776, 813, 0, | ||
| 295 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 296 | /* 1400x1050@60Hz RB */ | ||
| 297 | { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 101000, 1400, 1448, | ||
| 298 | 1480, 1560, 0, 1050, 1053, 1057, 1080, 0, | ||
| 299 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 300 | /* 1400x1050@60Hz */ | ||
| 301 | { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 121750, 1400, 1488, | ||
| 302 | 1632, 1864, 0, 1050, 1053, 1057, 1089, 0, | ||
| 303 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 304 | /* 1400x1050@75Hz */ | ||
| 305 | { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 156000, 1400, 1504, | ||
| 306 | 1648, 1896, 0, 1050, 1053, 1057, 1099, 0, | ||
| 307 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 308 | /* 1400x1050@85Hz */ | ||
| 309 | { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 179500, 1400, 1504, | ||
| 310 | 1656, 1912, 0, 1050, 1053, 1057, 1105, 0, | ||
| 311 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 312 | /* 1400x1050@120Hz RB */ | ||
| 313 | { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 208000, 1400, 1448, | ||
| 314 | 1480, 1560, 0, 1050, 1053, 1057, 1112, 0, | ||
| 315 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 316 | /* 1440x900@60Hz RB */ | ||
| 317 | { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 88750, 1440, 1488, | ||
| 318 | 1520, 1600, 0, 900, 903, 909, 926, 0, | ||
| 319 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 320 | /* 1440x900@60Hz */ | ||
| 321 | { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 106500, 1440, 1520, | ||
| 322 | 1672, 1904, 0, 900, 903, 909, 934, 0, | ||
| 323 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 324 | /* 1440x900@75Hz */ | ||
| 325 | { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 136750, 1440, 1536, | ||
| 326 | 1688, 1936, 0, 900, 903, 909, 942, 0, | ||
| 327 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 328 | /* 1440x900@85Hz */ | ||
| 329 | { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 157000, 1440, 1544, | ||
| 330 | 1696, 1952, 0, 900, 903, 909, 948, 0, | ||
| 331 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 332 | /* 1440x900@120Hz RB */ | ||
| 333 | { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 182750, 1440, 1488, | ||
| 334 | 1520, 1600, 0, 900, 903, 909, 953, 0, | ||
| 335 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 336 | /* 1600x1200@60Hz */ | ||
| 337 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 162000, 1600, 1664, | ||
| 338 | 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, | ||
| 339 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 340 | /* 1600x1200@65Hz */ | ||
| 341 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 175500, 1600, 1664, | ||
| 342 | 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, | ||
| 343 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 344 | /* 1600x1200@70Hz */ | ||
| 345 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 189000, 1600, 1664, | ||
| 346 | 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, | ||
| 347 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 348 | /* 1600x1200@75Hz */ | ||
| 349 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 202500, 1600, 1664, | ||
| 350 | 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, | ||
| 351 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 352 | /* 1600x1200@85Hz */ | ||
| 353 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 229500, 1600, 1664, | ||
| 354 | 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, | ||
| 355 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 356 | /* 1600x1200@120Hz RB */ | ||
| 357 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 268250, 1600, 1648, | ||
| 358 | 1680, 1760, 0, 1200, 1203, 1207, 1271, 0, | ||
| 359 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 360 | /* 1680x1050@60Hz RB */ | ||
| 361 | { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 119000, 1680, 1728, | ||
| 362 | 1760, 1840, 0, 1050, 1053, 1059, 1080, 0, | ||
| 363 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 364 | /* 1680x1050@60Hz */ | ||
| 365 | { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 146250, 1680, 1784, | ||
| 366 | 1960, 2240, 0, 1050, 1053, 1059, 1089, 0, | ||
| 367 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 368 | /* 1680x1050@75Hz */ | ||
| 369 | { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 187000, 1680, 1800, | ||
| 370 | 1976, 2272, 0, 1050, 1053, 1059, 1099, 0, | ||
| 371 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 372 | /* 1680x1050@85Hz */ | ||
| 373 | { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 214750, 1680, 1808, | ||
| 374 | 1984, 2288, 0, 1050, 1053, 1059, 1105, 0, | ||
| 375 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 376 | /* 1680x1050@120Hz RB */ | ||
| 377 | { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 245500, 1680, 1728, | ||
| 378 | 1760, 1840, 0, 1050, 1053, 1059, 1112, 0, | ||
| 379 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 380 | /* 1792x1344@60Hz */ | ||
| 381 | { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 204750, 1792, 1920, | ||
| 382 | 2120, 2448, 0, 1344, 1345, 1348, 1394, 0, | ||
| 383 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 384 | /* 1792x1344@75Hz */ | ||
| 385 | { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 261000, 1792, 1888, | ||
| 386 | 2104, 2456, 0, 1344, 1345, 1348, 1417, 0, | ||
| 387 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 388 | /* 1792x1344@120Hz RB */ | ||
| 389 | { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 333250, 1792, 1840, | ||
| 390 | 1872, 1952, 0, 1344, 1347, 1351, 1423, 0, | ||
| 391 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 392 | /* 1856x1392@60Hz */ | ||
| 393 | { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 218250, 1856, 1952, | ||
| 394 | 2176, 2528, 0, 1392, 1393, 1396, 1439, 0, | ||
| 395 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 396 | /* 1856x1392@75Hz */ | ||
| 397 | { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 288000, 1856, 1984, | ||
| 398 | 2208, 2560, 0, 1392, 1395, 1399, 1500, 0, | ||
| 399 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 400 | /* 1856x1392@120Hz RB */ | ||
| 401 | { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 356500, 1856, 1904, | ||
| 402 | 1936, 2016, 0, 1392, 1395, 1399, 1474, 0, | ||
| 403 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 404 | /* 1920x1200@60Hz RB */ | ||
| 405 | { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 154000, 1920, 1968, | ||
| 406 | 2000, 2080, 0, 1200, 1203, 1209, 1235, 0, | ||
| 407 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 408 | /* 1920x1200@60Hz */ | ||
| 409 | { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 193250, 1920, 2056, | ||
| 410 | 2256, 2592, 0, 1200, 1203, 1209, 1245, 0, | ||
| 411 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 412 | /* 1920x1200@75Hz */ | ||
| 413 | { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 245250, 1920, 2056, | ||
| 414 | 2264, 2608, 0, 1200, 1203, 1209, 1255, 0, | ||
| 415 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 416 | /* 1920x1200@85Hz */ | ||
| 417 | { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 281250, 1920, 2064, | ||
| 418 | 2272, 2624, 0, 1200, 1203, 1209, 1262, 0, | ||
| 419 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 420 | /* 1920x1200@120Hz RB */ | ||
| 421 | { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 317000, 1920, 1968, | ||
| 422 | 2000, 2080, 0, 1200, 1203, 1209, 1271, 0, | ||
| 423 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 424 | /* 1920x1440@60Hz */ | ||
| 425 | { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 234000, 1920, 2048, | ||
| 426 | 2256, 2600, 0, 1440, 1441, 1444, 1500, 0, | ||
| 427 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 428 | /* 1920x1440@75Hz */ | ||
| 429 | { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2064, | ||
| 430 | 2288, 2640, 0, 1440, 1441, 1444, 1500, 0, | ||
| 431 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 432 | /* 1920x1440@120Hz RB */ | ||
| 433 | { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 380500, 1920, 1968, | ||
| 434 | 2000, 2080, 0, 1440, 1443, 1447, 1525, 0, | ||
| 435 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 436 | /* 2560x1600@60Hz RB */ | ||
| 437 | { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 268500, 2560, 2608, | ||
| 438 | 2640, 2720, 0, 1600, 1603, 1609, 1646, 0, | ||
| 439 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 440 | /* 2560x1600@60Hz */ | ||
| 441 | { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 348500, 2560, 2752, | ||
| 442 | 3032, 3504, 0, 1600, 1603, 1609, 1658, 0, | ||
| 443 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 444 | /* 2560x1600@75HZ */ | ||
| 445 | { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 443250, 2560, 2768, | ||
| 446 | 3048, 3536, 0, 1600, 1603, 1609, 1672, 0, | ||
| 447 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 448 | /* 2560x1600@85HZ */ | ||
| 449 | { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 505250, 2560, 2768, | ||
| 450 | 3048, 3536, 0, 1600, 1603, 1609, 1682, 0, | ||
| 451 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 452 | /* 2560x1600@120Hz RB */ | ||
| 453 | { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 552750, 2560, 2608, | ||
| 454 | 2640, 2720, 0, 1600, 1603, 1609, 1694, 0, | ||
| 455 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 456 | }; | ||
| 457 | |||
| 458 | static const struct drm_display_mode edid_est_modes[] = { | ||
| 459 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840, | ||
| 460 | 968, 1056, 0, 600, 601, 605, 628, 0, | ||
| 461 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@60Hz */ | ||
| 462 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824, | ||
| 463 | 896, 1024, 0, 600, 601, 603, 625, 0, | ||
| 464 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@56Hz */ | ||
| 465 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656, | ||
| 466 | 720, 840, 0, 480, 481, 484, 500, 0, | ||
| 467 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@75Hz */ | ||
| 468 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664, | ||
| 469 | 704, 832, 0, 480, 489, 491, 520, 0, | ||
| 470 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@72Hz */ | ||
| 471 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 30240, 640, 704, | ||
| 472 | 768, 864, 0, 480, 483, 486, 525, 0, | ||
| 473 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@67Hz */ | ||
| 474 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25200, 640, 656, | ||
| 475 | 752, 800, 0, 480, 490, 492, 525, 0, | ||
| 476 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@60Hz */ | ||
| 477 | { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 738, | ||
| 478 | 846, 900, 0, 400, 421, 423, 449, 0, | ||
| 479 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 720x400@88Hz */ | ||
| 480 | { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 28320, 720, 738, | ||
| 481 | 846, 900, 0, 400, 412, 414, 449, 0, | ||
| 482 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 720x400@70Hz */ | ||
| 483 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296, | ||
| 484 | 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, | ||
| 485 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */ | ||
| 486 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78800, 1024, 1040, | ||
| 487 | 1136, 1312, 0, 768, 769, 772, 800, 0, | ||
| 488 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1024x768@75Hz */ | ||
| 489 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048, | ||
| 490 | 1184, 1328, 0, 768, 771, 777, 806, 0, | ||
| 491 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@70Hz */ | ||
| 492 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048, | ||
| 493 | 1184, 1344, 0, 768, 771, 777, 806, 0, | ||
| 494 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@60Hz */ | ||
| 495 | { DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER,44900, 1024, 1032, | ||
| 496 | 1208, 1264, 0, 768, 768, 776, 817, 0, | ||
| 497 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* 1024x768@43Hz */ | ||
| 498 | { DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 57284, 832, 864, | ||
| 499 | 928, 1152, 0, 624, 625, 628, 667, 0, | ||
| 500 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 832x624@75Hz */ | ||
| 501 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816, | ||
| 502 | 896, 1056, 0, 600, 601, 604, 625, 0, | ||
| 503 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@75Hz */ | ||
| 504 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856, | ||
| 505 | 976, 1040, 0, 600, 637, 643, 666, 0, | ||
| 506 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@72Hz */ | ||
| 507 | { DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216, | ||
| 508 | 1344, 1600, 0, 864, 865, 868, 900, 0, | ||
| 509 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1152x864@75Hz */ | ||
| 510 | }; | ||
| 511 | |||
| 512 | struct minimode { | ||
| 513 | short w; | ||
| 514 | short h; | ||
| 515 | short r; | ||
| 516 | short rb; | ||
| 517 | }; | ||
| 518 | |||
| 519 | static const struct minimode est3_modes[] = { | ||
| 520 | /* byte 6 */ | ||
| 521 | { 640, 350, 85, 0 }, | ||
| 522 | { 640, 400, 85, 0 }, | ||
| 523 | { 720, 400, 85, 0 }, | ||
| 524 | { 640, 480, 85, 0 }, | ||
| 525 | { 848, 480, 60, 0 }, | ||
| 526 | { 800, 600, 85, 0 }, | ||
| 527 | { 1024, 768, 85, 0 }, | ||
| 528 | { 1152, 864, 75, 0 }, | ||
| 529 | /* byte 7 */ | ||
| 530 | { 1280, 768, 60, 1 }, | ||
| 531 | { 1280, 768, 60, 0 }, | ||
| 532 | { 1280, 768, 75, 0 }, | ||
| 533 | { 1280, 768, 85, 0 }, | ||
| 534 | { 1280, 960, 60, 0 }, | ||
| 535 | { 1280, 960, 85, 0 }, | ||
| 536 | { 1280, 1024, 60, 0 }, | ||
| 537 | { 1280, 1024, 85, 0 }, | ||
| 538 | /* byte 8 */ | ||
| 539 | { 1360, 768, 60, 0 }, | ||
| 540 | { 1440, 900, 60, 1 }, | ||
| 541 | { 1440, 900, 60, 0 }, | ||
| 542 | { 1440, 900, 75, 0 }, | ||
| 543 | { 1440, 900, 85, 0 }, | ||
| 544 | { 1400, 1050, 60, 1 }, | ||
| 545 | { 1400, 1050, 60, 0 }, | ||
| 546 | { 1400, 1050, 75, 0 }, | ||
| 547 | /* byte 9 */ | ||
| 548 | { 1400, 1050, 85, 0 }, | ||
| 549 | { 1680, 1050, 60, 1 }, | ||
| 550 | { 1680, 1050, 60, 0 }, | ||
| 551 | { 1680, 1050, 75, 0 }, | ||
| 552 | { 1680, 1050, 85, 0 }, | ||
| 553 | { 1600, 1200, 60, 0 }, | ||
| 554 | { 1600, 1200, 65, 0 }, | ||
| 555 | { 1600, 1200, 70, 0 }, | ||
| 556 | /* byte 10 */ | ||
| 557 | { 1600, 1200, 75, 0 }, | ||
| 558 | { 1600, 1200, 85, 0 }, | ||
| 559 | { 1792, 1344, 60, 0 }, | ||
| 560 | { 1792, 1344, 85, 0 }, | ||
| 561 | { 1856, 1392, 60, 0 }, | ||
| 562 | { 1856, 1392, 75, 0 }, | ||
| 563 | { 1920, 1200, 60, 1 }, | ||
| 564 | { 1920, 1200, 60, 0 }, | ||
| 565 | /* byte 11 */ | ||
| 566 | { 1920, 1200, 75, 0 }, | ||
| 567 | { 1920, 1200, 85, 0 }, | ||
| 568 | { 1920, 1440, 60, 0 }, | ||
| 569 | { 1920, 1440, 75, 0 }, | ||
| 570 | }; | ||
| 571 | |||
| 572 | static const struct minimode extra_modes[] = { | ||
| 573 | { 1024, 576, 60, 0 }, | ||
| 574 | { 1366, 768, 60, 0 }, | ||
| 575 | { 1600, 900, 60, 0 }, | ||
| 576 | { 1680, 945, 60, 0 }, | ||
| 577 | { 1920, 1080, 60, 0 }, | ||
| 578 | { 2048, 1152, 60, 0 }, | ||
| 579 | { 2048, 1536, 60, 0 }, | ||
| 580 | }; | ||
| 581 | |||
| 582 | /* | ||
| 583 | * Probably taken from CEA-861 spec. | ||
| 584 | * This table is converted from xorg's hw/xfree86/modes/xf86EdidModes.c. | ||
| 585 | */ | ||
| 586 | static const struct drm_display_mode edid_cea_modes[] = { | ||
| 587 | /* 1 - 640x480@60Hz */ | ||
| 588 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656, | ||
| 589 | 752, 800, 0, 480, 490, 492, 525, 0, | ||
| 590 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 591 | /* 2 - 720x480@60Hz */ | ||
| 592 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736, | ||
| 593 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 594 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 595 | /* 3 - 720x480@60Hz */ | ||
| 596 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736, | ||
| 597 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 598 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 599 | /* 4 - 1280x720@60Hz */ | ||
| 600 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390, | ||
| 601 | 1430, 1650, 0, 720, 725, 730, 750, 0, | ||
| 602 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 603 | /* 5 - 1920x1080i@60Hz */ | ||
| 604 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008, | ||
| 605 | 2052, 2200, 0, 1080, 1084, 1094, 1125, 0, | ||
| 606 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | | ||
| 607 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 608 | /* 6 - 1440x480i@60Hz */ | ||
| 609 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478, | ||
| 610 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 611 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 612 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 613 | /* 7 - 1440x480i@60Hz */ | ||
| 614 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478, | ||
| 615 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 616 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 617 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 618 | /* 8 - 1440x240@60Hz */ | ||
| 619 | { DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478, | ||
| 620 | 1602, 1716, 0, 240, 244, 247, 262, 0, | ||
| 621 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 622 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 623 | /* 9 - 1440x240@60Hz */ | ||
| 624 | { DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478, | ||
| 625 | 1602, 1716, 0, 240, 244, 247, 262, 0, | ||
| 626 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 627 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 628 | /* 10 - 2880x480i@60Hz */ | ||
| 629 | { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, | ||
| 630 | 3204, 3432, 0, 480, 488, 494, 525, 0, | ||
| 631 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 632 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 633 | /* 11 - 2880x480i@60Hz */ | ||
| 634 | { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, | ||
| 635 | 3204, 3432, 0, 480, 488, 494, 525, 0, | ||
| 636 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 637 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 638 | /* 12 - 2880x240@60Hz */ | ||
| 639 | { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, | ||
| 640 | 3204, 3432, 0, 240, 244, 247, 262, 0, | ||
| 641 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 642 | /* 13 - 2880x240@60Hz */ | ||
| 643 | { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, | ||
| 644 | 3204, 3432, 0, 240, 244, 247, 262, 0, | ||
| 645 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 646 | /* 14 - 1440x480@60Hz */ | ||
| 647 | { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472, | ||
| 648 | 1596, 1716, 0, 480, 489, 495, 525, 0, | ||
| 649 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 650 | /* 15 - 1440x480@60Hz */ | ||
| 651 | { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472, | ||
| 652 | 1596, 1716, 0, 480, 489, 495, 525, 0, | ||
| 653 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 654 | /* 16 - 1920x1080@60Hz */ | ||
| 655 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008, | ||
| 656 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, | ||
| 657 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 658 | /* 17 - 720x576@50Hz */ | ||
| 659 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732, | ||
| 660 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 661 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 662 | /* 18 - 720x576@50Hz */ | ||
| 663 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732, | ||
| 664 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 665 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 666 | /* 19 - 1280x720@50Hz */ | ||
| 667 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720, | ||
| 668 | 1760, 1980, 0, 720, 725, 730, 750, 0, | ||
| 669 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 670 | /* 20 - 1920x1080i@50Hz */ | ||
| 671 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448, | ||
| 672 | 2492, 2640, 0, 1080, 1084, 1094, 1125, 0, | ||
| 673 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | | ||
| 674 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 675 | /* 21 - 1440x576i@50Hz */ | ||
| 676 | { DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464, | ||
| 677 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 678 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 679 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 680 | /* 22 - 1440x576i@50Hz */ | ||
| 681 | { DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464, | ||
| 682 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 683 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 684 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 685 | /* 23 - 1440x288@50Hz */ | ||
| 686 | { DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464, | ||
| 687 | 1590, 1728, 0, 288, 290, 293, 312, 0, | ||
| 688 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 689 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 690 | /* 24 - 1440x288@50Hz */ | ||
| 691 | { DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464, | ||
| 692 | 1590, 1728, 0, 288, 290, 293, 312, 0, | ||
| 693 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 694 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 695 | /* 25 - 2880x576i@50Hz */ | ||
| 696 | { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, | ||
| 697 | 3180, 3456, 0, 576, 580, 586, 625, 0, | ||
| 698 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 699 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 700 | /* 26 - 2880x576i@50Hz */ | ||
| 701 | { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, | ||
| 702 | 3180, 3456, 0, 576, 580, 586, 625, 0, | ||
| 703 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 704 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 705 | /* 27 - 2880x288@50Hz */ | ||
| 706 | { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, | ||
| 707 | 3180, 3456, 0, 288, 290, 293, 312, 0, | ||
| 708 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 709 | /* 28 - 2880x288@50Hz */ | ||
| 710 | { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, | ||
| 711 | 3180, 3456, 0, 288, 290, 293, 312, 0, | ||
| 712 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 713 | /* 29 - 1440x576@50Hz */ | ||
| 714 | { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464, | ||
| 715 | 1592, 1728, 0, 576, 581, 586, 625, 0, | ||
| 716 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 717 | /* 30 - 1440x576@50Hz */ | ||
| 718 | { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464, | ||
| 719 | 1592, 1728, 0, 576, 581, 586, 625, 0, | ||
| 720 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 721 | /* 31 - 1920x1080@50Hz */ | ||
| 722 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448, | ||
| 723 | 2492, 2640, 0, 1080, 1084, 1089, 1125, 0, | ||
| 724 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 725 | /* 32 - 1920x1080@24Hz */ | ||
| 726 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558, | ||
| 727 | 2602, 2750, 0, 1080, 1084, 1089, 1125, 0, | ||
| 728 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 729 | /* 33 - 1920x1080@25Hz */ | ||
| 730 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448, | ||
| 731 | 2492, 2640, 0, 1080, 1084, 1089, 1125, 0, | ||
| 732 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 733 | /* 34 - 1920x1080@30Hz */ | ||
| 734 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008, | ||
| 735 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, | ||
| 736 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 737 | /* 35 - 2880x480@60Hz */ | ||
| 738 | { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944, | ||
| 739 | 3192, 3432, 0, 480, 489, 495, 525, 0, | ||
| 740 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 741 | /* 36 - 2880x480@60Hz */ | ||
| 742 | { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944, | ||
| 743 | 3192, 3432, 0, 480, 489, 495, 525, 0, | ||
| 744 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 745 | /* 37 - 2880x576@50Hz */ | ||
| 746 | { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928, | ||
| 747 | 3184, 3456, 0, 576, 581, 586, 625, 0, | ||
| 748 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 749 | /* 38 - 2880x576@50Hz */ | ||
| 750 | { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928, | ||
| 751 | 3184, 3456, 0, 576, 581, 586, 625, 0, | ||
| 752 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 753 | /* 39 - 1920x1080i@50Hz */ | ||
| 754 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952, | ||
| 755 | 2120, 2304, 0, 1080, 1126, 1136, 1250, 0, | ||
| 756 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 757 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 758 | /* 40 - 1920x1080i@100Hz */ | ||
| 759 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448, | ||
| 760 | 2492, 2640, 0, 1080, 1084, 1094, 1125, 0, | ||
| 761 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | | ||
| 762 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 763 | /* 41 - 1280x720@100Hz */ | ||
| 764 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720, | ||
| 765 | 1760, 1980, 0, 720, 725, 730, 750, 0, | ||
| 766 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 767 | /* 42 - 720x576@100Hz */ | ||
| 768 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732, | ||
| 769 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 770 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 771 | /* 43 - 720x576@100Hz */ | ||
| 772 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732, | ||
| 773 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 774 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 775 | /* 44 - 1440x576i@100Hz */ | ||
| 776 | { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464, | ||
| 777 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 778 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 779 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 780 | /* 45 - 1440x576i@100Hz */ | ||
| 781 | { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464, | ||
| 782 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 783 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 784 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 785 | /* 46 - 1920x1080i@120Hz */ | ||
| 786 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008, | ||
| 787 | 2052, 2200, 0, 1080, 1084, 1094, 1125, 0, | ||
| 788 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | | ||
| 789 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 790 | /* 47 - 1280x720@120Hz */ | ||
| 791 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390, | ||
| 792 | 1430, 1650, 0, 720, 725, 730, 750, 0, | ||
| 793 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 794 | /* 48 - 720x480@120Hz */ | ||
| 795 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736, | ||
| 796 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 797 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 798 | /* 49 - 720x480@120Hz */ | ||
| 799 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736, | ||
| 800 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 801 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 802 | /* 50 - 1440x480i@120Hz */ | ||
| 803 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478, | ||
| 804 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 805 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 806 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 807 | /* 51 - 1440x480i@120Hz */ | ||
| 808 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478, | ||
| 809 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 810 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 811 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 812 | /* 52 - 720x576@200Hz */ | ||
| 813 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732, | ||
| 814 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 815 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 816 | /* 53 - 720x576@200Hz */ | ||
| 817 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732, | ||
| 818 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 819 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 820 | /* 54 - 1440x576i@200Hz */ | ||
| 821 | { DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464, | ||
| 822 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 823 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 824 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 825 | /* 55 - 1440x576i@200Hz */ | ||
| 826 | { DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464, | ||
| 827 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 828 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 829 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 830 | /* 56 - 720x480@240Hz */ | ||
| 831 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736, | ||
| 832 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 833 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 834 | /* 57 - 720x480@240Hz */ | ||
| 835 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736, | ||
| 836 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 837 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 838 | /* 58 - 1440x480i@240 */ | ||
| 839 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478, | ||
| 840 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 841 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 842 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 843 | /* 59 - 1440x480i@240 */ | ||
| 844 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478, | ||
| 845 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 846 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 847 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 848 | /* 60 - 1280x720@24Hz */ | ||
| 849 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040, | ||
| 850 | 3080, 3300, 0, 720, 725, 730, 750, 0, | ||
| 851 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 852 | /* 61 - 1280x720@25Hz */ | ||
| 853 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700, | ||
| 854 | 3740, 3960, 0, 720, 725, 730, 750, 0, | ||
| 855 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 856 | /* 62 - 1280x720@30Hz */ | ||
| 857 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040, | ||
| 858 | 3080, 3300, 0, 720, 725, 730, 750, 0, | ||
| 859 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 860 | /* 63 - 1920x1080@120Hz */ | ||
| 861 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008, | ||
| 862 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, | ||
| 863 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 864 | /* 64 - 1920x1080@100Hz */ | ||
| 865 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448, | ||
| 866 | 2492, 2640, 0, 1080, 1084, 1094, 1125, 0, | ||
| 867 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 868 | }; | ||
| 869 | |||
| 130 | /*** DDC fetch and block validation ***/ | 870 | /*** DDC fetch and block validation ***/ |
| 131 | 871 | ||
| 132 | static const u8 edid_header[] = { | 872 | static const u8 edid_header[] = { |
| @@ -542,7 +1282,7 @@ struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, | |||
| 542 | { | 1282 | { |
| 543 | int i; | 1283 | int i; |
| 544 | 1284 | ||
| 545 | for (i = 0; i < drm_num_dmt_modes; i++) { | 1285 | for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) { |
| 546 | const struct drm_display_mode *ptr = &drm_dmt_modes[i]; | 1286 | const struct drm_display_mode *ptr = &drm_dmt_modes[i]; |
| 547 | if (hsize != ptr->hdisplay) | 1287 | if (hsize != ptr->hdisplay) |
| 548 | continue; | 1288 | continue; |
| @@ -1083,7 +1823,7 @@ drm_dmt_modes_for_range(struct drm_connector *connector, struct edid *edid, | |||
| 1083 | struct drm_display_mode *newmode; | 1823 | struct drm_display_mode *newmode; |
| 1084 | struct drm_device *dev = connector->dev; | 1824 | struct drm_device *dev = connector->dev; |
| 1085 | 1825 | ||
| 1086 | for (i = 0; i < drm_num_dmt_modes; i++) { | 1826 | for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) { |
| 1087 | if (mode_in_range(drm_dmt_modes + i, edid, timing) && | 1827 | if (mode_in_range(drm_dmt_modes + i, edid, timing) && |
| 1088 | valid_inferred_mode(connector, drm_dmt_modes + i)) { | 1828 | valid_inferred_mode(connector, drm_dmt_modes + i)) { |
| 1089 | newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]); | 1829 | newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]); |
| @@ -1118,7 +1858,7 @@ drm_gtf_modes_for_range(struct drm_connector *connector, struct edid *edid, | |||
| 1118 | struct drm_display_mode *newmode; | 1858 | struct drm_display_mode *newmode; |
| 1119 | struct drm_device *dev = connector->dev; | 1859 | struct drm_device *dev = connector->dev; |
| 1120 | 1860 | ||
| 1121 | for (i = 0; i < num_extra_modes; i++) { | 1861 | for (i = 0; i < ARRAY_SIZE(extra_modes); i++) { |
| 1122 | const struct minimode *m = &extra_modes[i]; | 1862 | const struct minimode *m = &extra_modes[i]; |
| 1123 | newmode = drm_gtf_mode(dev, m->w, m->h, m->r, 0, 0); | 1863 | newmode = drm_gtf_mode(dev, m->w, m->h, m->r, 0, 0); |
| 1124 | if (!newmode) | 1864 | if (!newmode) |
| @@ -1147,7 +1887,7 @@ drm_cvt_modes_for_range(struct drm_connector *connector, struct edid *edid, | |||
| 1147 | struct drm_device *dev = connector->dev; | 1887 | struct drm_device *dev = connector->dev; |
| 1148 | bool rb = drm_monitor_supports_rb(edid); | 1888 | bool rb = drm_monitor_supports_rb(edid); |
| 1149 | 1889 | ||
| 1150 | for (i = 0; i < num_extra_modes; i++) { | 1890 | for (i = 0; i < ARRAY_SIZE(extra_modes); i++) { |
| 1151 | const struct minimode *m = &extra_modes[i]; | 1891 | const struct minimode *m = &extra_modes[i]; |
| 1152 | newmode = drm_cvt_mode(dev, m->w, m->h, m->r, rb, 0, 0); | 1892 | newmode = drm_cvt_mode(dev, m->w, m->h, m->r, rb, 0, 0); |
| 1153 | if (!newmode) | 1893 | if (!newmode) |
| @@ -1516,16 +2256,19 @@ u8 *drm_find_cea_extension(struct edid *edid) | |||
| 1516 | } | 2256 | } |
| 1517 | EXPORT_SYMBOL(drm_find_cea_extension); | 2257 | EXPORT_SYMBOL(drm_find_cea_extension); |
| 1518 | 2258 | ||
| 1519 | /* | 2259 | /** |
| 1520 | * Looks for a CEA mode matching given drm_display_mode. | 2260 | * drm_match_cea_mode - look for a CEA mode matching given mode |
| 1521 | * Returns its CEA Video ID code, or 0 if not found. | 2261 | * @to_match: display mode |
| 2262 | * | ||
| 2263 | * Returns the CEA Video ID (VIC) of the mode or 0 if it isn't a CEA-861 | ||
| 2264 | * mode. | ||
| 1522 | */ | 2265 | */ |
| 1523 | u8 drm_match_cea_mode(struct drm_display_mode *to_match) | 2266 | u8 drm_match_cea_mode(const struct drm_display_mode *to_match) |
| 1524 | { | 2267 | { |
| 1525 | struct drm_display_mode *cea_mode; | 2268 | struct drm_display_mode *cea_mode; |
| 1526 | u8 mode; | 2269 | u8 mode; |
| 1527 | 2270 | ||
| 1528 | for (mode = 0; mode < drm_num_cea_modes; mode++) { | 2271 | for (mode = 0; mode < ARRAY_SIZE(edid_cea_modes); mode++) { |
| 1529 | cea_mode = (struct drm_display_mode *)&edid_cea_modes[mode]; | 2272 | cea_mode = (struct drm_display_mode *)&edid_cea_modes[mode]; |
| 1530 | 2273 | ||
| 1531 | if (drm_mode_equal(to_match, cea_mode)) | 2274 | if (drm_mode_equal(to_match, cea_mode)) |
| @@ -1545,7 +2288,7 @@ do_cea_modes (struct drm_connector *connector, u8 *db, u8 len) | |||
| 1545 | 2288 | ||
| 1546 | for (mode = db; mode < db + len; mode++) { | 2289 | for (mode = db; mode < db + len; mode++) { |
| 1547 | cea_mode = (*mode & 127) - 1; /* CEA modes are numbered 1..127 */ | 2290 | cea_mode = (*mode & 127) - 1; /* CEA modes are numbered 1..127 */ |
| 1548 | if (cea_mode < drm_num_cea_modes) { | 2291 | if (cea_mode < ARRAY_SIZE(edid_cea_modes)) { |
| 1549 | struct drm_display_mode *newmode; | 2292 | struct drm_display_mode *newmode; |
| 1550 | newmode = drm_mode_duplicate(dev, | 2293 | newmode = drm_mode_duplicate(dev, |
| 1551 | &edid_cea_modes[cea_mode]); | 2294 | &edid_cea_modes[cea_mode]); |
| @@ -2116,20 +2859,33 @@ int drm_add_modes_noedid(struct drm_connector *connector, | |||
| 2116 | EXPORT_SYMBOL(drm_add_modes_noedid); | 2859 | EXPORT_SYMBOL(drm_add_modes_noedid); |
| 2117 | 2860 | ||
| 2118 | /** | 2861 | /** |
| 2119 | * drm_mode_cea_vic - return the CEA-861 VIC of a given mode | 2862 | * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with |
| 2120 | * @mode: mode | 2863 | * data from a DRM display mode |
| 2864 | * @frame: HDMI AVI infoframe | ||
| 2865 | * @mode: DRM display mode | ||
| 2121 | * | 2866 | * |
| 2122 | * RETURNS: | 2867 | * Returns 0 on success or a negative error code on failure. |
| 2123 | * The VIC number, 0 in case it's not a CEA-861 mode. | ||
| 2124 | */ | 2868 | */ |
| 2125 | uint8_t drm_mode_cea_vic(const struct drm_display_mode *mode) | 2869 | int |
| 2870 | drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, | ||
| 2871 | const struct drm_display_mode *mode) | ||
| 2126 | { | 2872 | { |
| 2127 | uint8_t i; | 2873 | int err; |
| 2874 | |||
| 2875 | if (!frame || !mode) | ||
| 2876 | return -EINVAL; | ||
| 2877 | |||
| 2878 | err = hdmi_avi_infoframe_init(frame); | ||
| 2879 | if (err < 0) | ||
| 2880 | return err; | ||
| 2881 | |||
| 2882 | frame->video_code = drm_match_cea_mode(mode); | ||
| 2883 | if (!frame->video_code) | ||
| 2884 | return 0; | ||
| 2128 | 2885 | ||
| 2129 | for (i = 0; i < drm_num_cea_modes; i++) | 2886 | frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE; |
| 2130 | if (drm_mode_equal(mode, &edid_cea_modes[i])) | 2887 | frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE; |
| 2131 | return i + 1; | ||
| 2132 | 2888 | ||
| 2133 | return 0; | 2889 | return 0; |
| 2134 | } | 2890 | } |
| 2135 | EXPORT_SYMBOL(drm_mode_cea_vic); | 2891 | EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode); |
diff --git a/drivers/gpu/drm/drm_edid_modes.h b/drivers/gpu/drm/drm_edid_modes.h deleted file mode 100644 index 5dbf7d2557b4..000000000000 --- a/drivers/gpu/drm/drm_edid_modes.h +++ /dev/null | |||
| @@ -1,774 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2007-2008 Intel Corporation | ||
| 3 | * Jesse Barnes <jesse.barnes@intel.com> | ||
| 4 | * Copyright 2010 Red Hat, Inc. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 7 | * copy of this software and associated documentation files (the "Software"), | ||
| 8 | * to deal in the Software without restriction, including without limitation | ||
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sub license, | ||
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the | ||
| 14 | * next paragraph) shall be included in all copies or substantial portions | ||
| 15 | * of the Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL | ||
| 20 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 21 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| 22 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||
| 23 | * DEALINGS IN THE SOFTWARE. | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <linux/kernel.h> | ||
| 27 | #include <drm/drmP.h> | ||
| 28 | #include <drm/drm_edid.h> | ||
| 29 | |||
| 30 | /* | ||
| 31 | * Autogenerated from the DMT spec. | ||
| 32 | * This table is copied from xfree86/modes/xf86EdidModes.c. | ||
| 33 | */ | ||
| 34 | static const struct drm_display_mode drm_dmt_modes[] = { | ||
| 35 | /* 640x350@85Hz */ | ||
| 36 | { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 31500, 640, 672, | ||
| 37 | 736, 832, 0, 350, 382, 385, 445, 0, | ||
| 38 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 39 | /* 640x400@85Hz */ | ||
| 40 | { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 31500, 640, 672, | ||
| 41 | 736, 832, 0, 400, 401, 404, 445, 0, | ||
| 42 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 43 | /* 720x400@85Hz */ | ||
| 44 | { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 756, | ||
| 45 | 828, 936, 0, 400, 401, 404, 446, 0, | ||
| 46 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 47 | /* 640x480@60Hz */ | ||
| 48 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656, | ||
| 49 | 752, 800, 0, 480, 489, 492, 525, 0, | ||
| 50 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 51 | /* 640x480@72Hz */ | ||
| 52 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664, | ||
| 53 | 704, 832, 0, 480, 489, 492, 520, 0, | ||
| 54 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 55 | /* 640x480@75Hz */ | ||
| 56 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656, | ||
| 57 | 720, 840, 0, 480, 481, 484, 500, 0, | ||
| 58 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 59 | /* 640x480@85Hz */ | ||
| 60 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 36000, 640, 696, | ||
| 61 | 752, 832, 0, 480, 481, 484, 509, 0, | ||
| 62 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 63 | /* 800x600@56Hz */ | ||
| 64 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824, | ||
| 65 | 896, 1024, 0, 600, 601, 603, 625, 0, | ||
| 66 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 67 | /* 800x600@60Hz */ | ||
| 68 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840, | ||
| 69 | 968, 1056, 0, 600, 601, 605, 628, 0, | ||
| 70 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 71 | /* 800x600@72Hz */ | ||
| 72 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856, | ||
| 73 | 976, 1040, 0, 600, 637, 643, 666, 0, | ||
| 74 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 75 | /* 800x600@75Hz */ | ||
| 76 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816, | ||
| 77 | 896, 1056, 0, 600, 601, 604, 625, 0, | ||
| 78 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 79 | /* 800x600@85Hz */ | ||
| 80 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 56250, 800, 832, | ||
| 81 | 896, 1048, 0, 600, 601, 604, 631, 0, | ||
| 82 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 83 | /* 800x600@120Hz RB */ | ||
| 84 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 73250, 800, 848, | ||
| 85 | 880, 960, 0, 600, 603, 607, 636, 0, | ||
| 86 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 87 | /* 848x480@60Hz */ | ||
| 88 | { DRM_MODE("848x480", DRM_MODE_TYPE_DRIVER, 33750, 848, 864, | ||
| 89 | 976, 1088, 0, 480, 486, 494, 517, 0, | ||
| 90 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 91 | /* 1024x768@43Hz, interlace */ | ||
| 92 | { DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032, | ||
| 93 | 1208, 1264, 0, 768, 768, 772, 817, 0, | ||
| 94 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | | ||
| 95 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 96 | /* 1024x768@60Hz */ | ||
| 97 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048, | ||
| 98 | 1184, 1344, 0, 768, 771, 777, 806, 0, | ||
| 99 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 100 | /* 1024x768@70Hz */ | ||
| 101 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048, | ||
| 102 | 1184, 1328, 0, 768, 771, 777, 806, 0, | ||
| 103 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 104 | /* 1024x768@75Hz */ | ||
| 105 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040, | ||
| 106 | 1136, 1312, 0, 768, 769, 772, 800, 0, | ||
| 107 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 108 | /* 1024x768@85Hz */ | ||
| 109 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 94500, 1024, 1072, | ||
| 110 | 1168, 1376, 0, 768, 769, 772, 808, 0, | ||
| 111 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 112 | /* 1024x768@120Hz RB */ | ||
| 113 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 115500, 1024, 1072, | ||
| 114 | 1104, 1184, 0, 768, 771, 775, 813, 0, | ||
| 115 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 116 | /* 1152x864@75Hz */ | ||
| 117 | { DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216, | ||
| 118 | 1344, 1600, 0, 864, 865, 868, 900, 0, | ||
| 119 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 120 | /* 1280x768@60Hz RB */ | ||
| 121 | { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 68250, 1280, 1328, | ||
| 122 | 1360, 1440, 0, 768, 771, 778, 790, 0, | ||
| 123 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 124 | /* 1280x768@60Hz */ | ||
| 125 | { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 79500, 1280, 1344, | ||
| 126 | 1472, 1664, 0, 768, 771, 778, 798, 0, | ||
| 127 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 128 | /* 1280x768@75Hz */ | ||
| 129 | { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 102250, 1280, 1360, | ||
| 130 | 1488, 1696, 0, 768, 771, 778, 805, 0, | ||
| 131 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 132 | /* 1280x768@85Hz */ | ||
| 133 | { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 117500, 1280, 1360, | ||
| 134 | 1496, 1712, 0, 768, 771, 778, 809, 0, | ||
| 135 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 136 | /* 1280x768@120Hz RB */ | ||
| 137 | { DRM_MODE("1280x768", DRM_MODE_TYPE_DRIVER, 140250, 1280, 1328, | ||
| 138 | 1360, 1440, 0, 768, 771, 778, 813, 0, | ||
| 139 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 140 | /* 1280x800@60Hz RB */ | ||
| 141 | { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 71000, 1280, 1328, | ||
| 142 | 1360, 1440, 0, 800, 803, 809, 823, 0, | ||
| 143 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 144 | /* 1280x800@60Hz */ | ||
| 145 | { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352, | ||
| 146 | 1480, 1680, 0, 800, 803, 809, 831, 0, | ||
| 147 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 148 | /* 1280x800@75Hz */ | ||
| 149 | { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 106500, 1280, 1360, | ||
| 150 | 1488, 1696, 0, 800, 803, 809, 838, 0, | ||
| 151 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 152 | /* 1280x800@85Hz */ | ||
| 153 | { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 122500, 1280, 1360, | ||
| 154 | 1496, 1712, 0, 800, 803, 809, 843, 0, | ||
| 155 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 156 | /* 1280x800@120Hz RB */ | ||
| 157 | { DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 146250, 1280, 1328, | ||
| 158 | 1360, 1440, 0, 800, 803, 809, 847, 0, | ||
| 159 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 160 | /* 1280x960@60Hz */ | ||
| 161 | { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1376, | ||
| 162 | 1488, 1800, 0, 960, 961, 964, 1000, 0, | ||
| 163 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 164 | /* 1280x960@85Hz */ | ||
| 165 | { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1344, | ||
| 166 | 1504, 1728, 0, 960, 961, 964, 1011, 0, | ||
| 167 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 168 | /* 1280x960@120Hz RB */ | ||
| 169 | { DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 175500, 1280, 1328, | ||
| 170 | 1360, 1440, 0, 960, 963, 967, 1017, 0, | ||
| 171 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 172 | /* 1280x1024@60Hz */ | ||
| 173 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1328, | ||
| 174 | 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, | ||
| 175 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 176 | /* 1280x1024@75Hz */ | ||
| 177 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296, | ||
| 178 | 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, | ||
| 179 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 180 | /* 1280x1024@85Hz */ | ||
| 181 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 157500, 1280, 1344, | ||
| 182 | 1504, 1728, 0, 1024, 1025, 1028, 1072, 0, | ||
| 183 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 184 | /* 1280x1024@120Hz RB */ | ||
| 185 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 187250, 1280, 1328, | ||
| 186 | 1360, 1440, 0, 1024, 1027, 1034, 1084, 0, | ||
| 187 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 188 | /* 1360x768@60Hz */ | ||
| 189 | { DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 85500, 1360, 1424, | ||
| 190 | 1536, 1792, 0, 768, 771, 777, 795, 0, | ||
| 191 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 192 | /* 1360x768@120Hz RB */ | ||
| 193 | { DRM_MODE("1360x768", DRM_MODE_TYPE_DRIVER, 148250, 1360, 1408, | ||
| 194 | 1440, 1520, 0, 768, 771, 776, 813, 0, | ||
| 195 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 196 | /* 1400x1050@60Hz RB */ | ||
| 197 | { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 101000, 1400, 1448, | ||
| 198 | 1480, 1560, 0, 1050, 1053, 1057, 1080, 0, | ||
| 199 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 200 | /* 1400x1050@60Hz */ | ||
| 201 | { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 121750, 1400, 1488, | ||
| 202 | 1632, 1864, 0, 1050, 1053, 1057, 1089, 0, | ||
| 203 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 204 | /* 1400x1050@75Hz */ | ||
| 205 | { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 156000, 1400, 1504, | ||
| 206 | 1648, 1896, 0, 1050, 1053, 1057, 1099, 0, | ||
| 207 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 208 | /* 1400x1050@85Hz */ | ||
| 209 | { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 179500, 1400, 1504, | ||
| 210 | 1656, 1912, 0, 1050, 1053, 1057, 1105, 0, | ||
| 211 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 212 | /* 1400x1050@120Hz RB */ | ||
| 213 | { DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 208000, 1400, 1448, | ||
| 214 | 1480, 1560, 0, 1050, 1053, 1057, 1112, 0, | ||
| 215 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 216 | /* 1440x900@60Hz RB */ | ||
| 217 | { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 88750, 1440, 1488, | ||
| 218 | 1520, 1600, 0, 900, 903, 909, 926, 0, | ||
| 219 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 220 | /* 1440x900@60Hz */ | ||
| 221 | { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 106500, 1440, 1520, | ||
| 222 | 1672, 1904, 0, 900, 903, 909, 934, 0, | ||
| 223 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 224 | /* 1440x900@75Hz */ | ||
| 225 | { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 136750, 1440, 1536, | ||
| 226 | 1688, 1936, 0, 900, 903, 909, 942, 0, | ||
| 227 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 228 | /* 1440x900@85Hz */ | ||
| 229 | { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 157000, 1440, 1544, | ||
| 230 | 1696, 1952, 0, 900, 903, 909, 948, 0, | ||
| 231 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 232 | /* 1440x900@120Hz RB */ | ||
| 233 | { DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 182750, 1440, 1488, | ||
| 234 | 1520, 1600, 0, 900, 903, 909, 953, 0, | ||
| 235 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 236 | /* 1600x1200@60Hz */ | ||
| 237 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 162000, 1600, 1664, | ||
| 238 | 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, | ||
| 239 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 240 | /* 1600x1200@65Hz */ | ||
| 241 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 175500, 1600, 1664, | ||
| 242 | 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, | ||
| 243 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 244 | /* 1600x1200@70Hz */ | ||
| 245 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 189000, 1600, 1664, | ||
| 246 | 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, | ||
| 247 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 248 | /* 1600x1200@75Hz */ | ||
| 249 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 202500, 1600, 1664, | ||
| 250 | 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, | ||
| 251 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 252 | /* 1600x1200@85Hz */ | ||
| 253 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 229500, 1600, 1664, | ||
| 254 | 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, | ||
| 255 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 256 | /* 1600x1200@120Hz RB */ | ||
| 257 | { DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 268250, 1600, 1648, | ||
| 258 | 1680, 1760, 0, 1200, 1203, 1207, 1271, 0, | ||
| 259 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 260 | /* 1680x1050@60Hz RB */ | ||
| 261 | { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 119000, 1680, 1728, | ||
| 262 | 1760, 1840, 0, 1050, 1053, 1059, 1080, 0, | ||
| 263 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 264 | /* 1680x1050@60Hz */ | ||
| 265 | { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 146250, 1680, 1784, | ||
| 266 | 1960, 2240, 0, 1050, 1053, 1059, 1089, 0, | ||
| 267 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 268 | /* 1680x1050@75Hz */ | ||
| 269 | { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 187000, 1680, 1800, | ||
| 270 | 1976, 2272, 0, 1050, 1053, 1059, 1099, 0, | ||
| 271 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 272 | /* 1680x1050@85Hz */ | ||
| 273 | { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 214750, 1680, 1808, | ||
| 274 | 1984, 2288, 0, 1050, 1053, 1059, 1105, 0, | ||
| 275 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 276 | /* 1680x1050@120Hz RB */ | ||
| 277 | { DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 245500, 1680, 1728, | ||
| 278 | 1760, 1840, 0, 1050, 1053, 1059, 1112, 0, | ||
| 279 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 280 | /* 1792x1344@60Hz */ | ||
| 281 | { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 204750, 1792, 1920, | ||
| 282 | 2120, 2448, 0, 1344, 1345, 1348, 1394, 0, | ||
| 283 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 284 | /* 1792x1344@75Hz */ | ||
| 285 | { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 261000, 1792, 1888, | ||
| 286 | 2104, 2456, 0, 1344, 1345, 1348, 1417, 0, | ||
| 287 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 288 | /* 1792x1344@120Hz RB */ | ||
| 289 | { DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 333250, 1792, 1840, | ||
| 290 | 1872, 1952, 0, 1344, 1347, 1351, 1423, 0, | ||
| 291 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 292 | /* 1856x1392@60Hz */ | ||
| 293 | { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 218250, 1856, 1952, | ||
| 294 | 2176, 2528, 0, 1392, 1393, 1396, 1439, 0, | ||
| 295 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 296 | /* 1856x1392@75Hz */ | ||
| 297 | { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 288000, 1856, 1984, | ||
| 298 | 2208, 2560, 0, 1392, 1395, 1399, 1500, 0, | ||
| 299 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 300 | /* 1856x1392@120Hz RB */ | ||
| 301 | { DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 356500, 1856, 1904, | ||
| 302 | 1936, 2016, 0, 1392, 1395, 1399, 1474, 0, | ||
| 303 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 304 | /* 1920x1200@60Hz RB */ | ||
| 305 | { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 154000, 1920, 1968, | ||
| 306 | 2000, 2080, 0, 1200, 1203, 1209, 1235, 0, | ||
| 307 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 308 | /* 1920x1200@60Hz */ | ||
| 309 | { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 193250, 1920, 2056, | ||
| 310 | 2256, 2592, 0, 1200, 1203, 1209, 1245, 0, | ||
| 311 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 312 | /* 1920x1200@75Hz */ | ||
| 313 | { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 245250, 1920, 2056, | ||
| 314 | 2264, 2608, 0, 1200, 1203, 1209, 1255, 0, | ||
| 315 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 316 | /* 1920x1200@85Hz */ | ||
| 317 | { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 281250, 1920, 2064, | ||
| 318 | 2272, 2624, 0, 1200, 1203, 1209, 1262, 0, | ||
| 319 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 320 | /* 1920x1200@120Hz RB */ | ||
| 321 | { DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 317000, 1920, 1968, | ||
| 322 | 2000, 2080, 0, 1200, 1203, 1209, 1271, 0, | ||
| 323 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 324 | /* 1920x1440@60Hz */ | ||
| 325 | { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 234000, 1920, 2048, | ||
| 326 | 2256, 2600, 0, 1440, 1441, 1444, 1500, 0, | ||
| 327 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 328 | /* 1920x1440@75Hz */ | ||
| 329 | { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2064, | ||
| 330 | 2288, 2640, 0, 1440, 1441, 1444, 1500, 0, | ||
| 331 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 332 | /* 1920x1440@120Hz RB */ | ||
| 333 | { DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 380500, 1920, 1968, | ||
| 334 | 2000, 2080, 0, 1440, 1443, 1447, 1525, 0, | ||
| 335 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 336 | /* 2560x1600@60Hz RB */ | ||
| 337 | { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 268500, 2560, 2608, | ||
| 338 | 2640, 2720, 0, 1600, 1603, 1609, 1646, 0, | ||
| 339 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 340 | /* 2560x1600@60Hz */ | ||
| 341 | { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 348500, 2560, 2752, | ||
| 342 | 3032, 3504, 0, 1600, 1603, 1609, 1658, 0, | ||
| 343 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 344 | /* 2560x1600@75HZ */ | ||
| 345 | { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 443250, 2560, 2768, | ||
| 346 | 3048, 3536, 0, 1600, 1603, 1609, 1672, 0, | ||
| 347 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 348 | /* 2560x1600@85HZ */ | ||
| 349 | { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 505250, 2560, 2768, | ||
| 350 | 3048, 3536, 0, 1600, 1603, 1609, 1682, 0, | ||
| 351 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 352 | /* 2560x1600@120Hz RB */ | ||
| 353 | { DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 552750, 2560, 2608, | ||
| 354 | 2640, 2720, 0, 1600, 1603, 1609, 1694, 0, | ||
| 355 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 356 | |||
| 357 | }; | ||
| 358 | static const int drm_num_dmt_modes = | ||
| 359 | sizeof(drm_dmt_modes) / sizeof(struct drm_display_mode); | ||
| 360 | |||
| 361 | static const struct drm_display_mode edid_est_modes[] = { | ||
| 362 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840, | ||
| 363 | 968, 1056, 0, 600, 601, 605, 628, 0, | ||
| 364 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@60Hz */ | ||
| 365 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824, | ||
| 366 | 896, 1024, 0, 600, 601, 603, 625, 0, | ||
| 367 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@56Hz */ | ||
| 368 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656, | ||
| 369 | 720, 840, 0, 480, 481, 484, 500, 0, | ||
| 370 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@75Hz */ | ||
| 371 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664, | ||
| 372 | 704, 832, 0, 480, 489, 491, 520, 0, | ||
| 373 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@72Hz */ | ||
| 374 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 30240, 640, 704, | ||
| 375 | 768, 864, 0, 480, 483, 486, 525, 0, | ||
| 376 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@67Hz */ | ||
| 377 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25200, 640, 656, | ||
| 378 | 752, 800, 0, 480, 490, 492, 525, 0, | ||
| 379 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@60Hz */ | ||
| 380 | { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 738, | ||
| 381 | 846, 900, 0, 400, 421, 423, 449, 0, | ||
| 382 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 720x400@88Hz */ | ||
| 383 | { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 28320, 720, 738, | ||
| 384 | 846, 900, 0, 400, 412, 414, 449, 0, | ||
| 385 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 720x400@70Hz */ | ||
| 386 | { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296, | ||
| 387 | 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, | ||
| 388 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */ | ||
| 389 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78800, 1024, 1040, | ||
| 390 | 1136, 1312, 0, 768, 769, 772, 800, 0, | ||
| 391 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1024x768@75Hz */ | ||
| 392 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048, | ||
| 393 | 1184, 1328, 0, 768, 771, 777, 806, 0, | ||
| 394 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@70Hz */ | ||
| 395 | { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048, | ||
| 396 | 1184, 1344, 0, 768, 771, 777, 806, 0, | ||
| 397 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@60Hz */ | ||
| 398 | { DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER,44900, 1024, 1032, | ||
| 399 | 1208, 1264, 0, 768, 768, 776, 817, 0, | ||
| 400 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* 1024x768@43Hz */ | ||
| 401 | { DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 57284, 832, 864, | ||
| 402 | 928, 1152, 0, 624, 625, 628, 667, 0, | ||
| 403 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 832x624@75Hz */ | ||
| 404 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816, | ||
| 405 | 896, 1056, 0, 600, 601, 604, 625, 0, | ||
| 406 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@75Hz */ | ||
| 407 | { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856, | ||
| 408 | 976, 1040, 0, 600, 637, 643, 666, 0, | ||
| 409 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@72Hz */ | ||
| 410 | { DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216, | ||
| 411 | 1344, 1600, 0, 864, 865, 868, 900, 0, | ||
| 412 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1152x864@75Hz */ | ||
| 413 | }; | ||
| 414 | |||
| 415 | struct minimode { | ||
| 416 | short w; | ||
| 417 | short h; | ||
| 418 | short r; | ||
| 419 | short rb; | ||
| 420 | }; | ||
| 421 | |||
| 422 | static const struct minimode est3_modes[] = { | ||
| 423 | /* byte 6 */ | ||
| 424 | { 640, 350, 85, 0 }, | ||
| 425 | { 640, 400, 85, 0 }, | ||
| 426 | { 720, 400, 85, 0 }, | ||
| 427 | { 640, 480, 85, 0 }, | ||
| 428 | { 848, 480, 60, 0 }, | ||
| 429 | { 800, 600, 85, 0 }, | ||
| 430 | { 1024, 768, 85, 0 }, | ||
| 431 | { 1152, 864, 75, 0 }, | ||
| 432 | /* byte 7 */ | ||
| 433 | { 1280, 768, 60, 1 }, | ||
| 434 | { 1280, 768, 60, 0 }, | ||
| 435 | { 1280, 768, 75, 0 }, | ||
| 436 | { 1280, 768, 85, 0 }, | ||
| 437 | { 1280, 960, 60, 0 }, | ||
| 438 | { 1280, 960, 85, 0 }, | ||
| 439 | { 1280, 1024, 60, 0 }, | ||
| 440 | { 1280, 1024, 85, 0 }, | ||
| 441 | /* byte 8 */ | ||
| 442 | { 1360, 768, 60, 0 }, | ||
| 443 | { 1440, 900, 60, 1 }, | ||
| 444 | { 1440, 900, 60, 0 }, | ||
| 445 | { 1440, 900, 75, 0 }, | ||
| 446 | { 1440, 900, 85, 0 }, | ||
| 447 | { 1400, 1050, 60, 1 }, | ||
| 448 | { 1400, 1050, 60, 0 }, | ||
| 449 | { 1400, 1050, 75, 0 }, | ||
| 450 | /* byte 9 */ | ||
| 451 | { 1400, 1050, 85, 0 }, | ||
| 452 | { 1680, 1050, 60, 1 }, | ||
| 453 | { 1680, 1050, 60, 0 }, | ||
| 454 | { 1680, 1050, 75, 0 }, | ||
| 455 | { 1680, 1050, 85, 0 }, | ||
| 456 | { 1600, 1200, 60, 0 }, | ||
| 457 | { 1600, 1200, 65, 0 }, | ||
| 458 | { 1600, 1200, 70, 0 }, | ||
| 459 | /* byte 10 */ | ||
| 460 | { 1600, 1200, 75, 0 }, | ||
| 461 | { 1600, 1200, 85, 0 }, | ||
| 462 | { 1792, 1344, 60, 0 }, | ||
| 463 | { 1792, 1344, 85, 0 }, | ||
| 464 | { 1856, 1392, 60, 0 }, | ||
| 465 | { 1856, 1392, 75, 0 }, | ||
| 466 | { 1920, 1200, 60, 1 }, | ||
| 467 | { 1920, 1200, 60, 0 }, | ||
| 468 | /* byte 11 */ | ||
| 469 | { 1920, 1200, 75, 0 }, | ||
| 470 | { 1920, 1200, 85, 0 }, | ||
| 471 | { 1920, 1440, 60, 0 }, | ||
| 472 | { 1920, 1440, 75, 0 }, | ||
| 473 | }; | ||
| 474 | static const int num_est3_modes = ARRAY_SIZE(est3_modes); | ||
| 475 | |||
| 476 | static const struct minimode extra_modes[] = { | ||
| 477 | { 1024, 576, 60, 0 }, | ||
| 478 | { 1366, 768, 60, 0 }, | ||
| 479 | { 1600, 900, 60, 0 }, | ||
| 480 | { 1680, 945, 60, 0 }, | ||
| 481 | { 1920, 1080, 60, 0 }, | ||
| 482 | { 2048, 1152, 60, 0 }, | ||
| 483 | { 2048, 1536, 60, 0 }, | ||
| 484 | }; | ||
| 485 | static const int num_extra_modes = ARRAY_SIZE(extra_modes); | ||
| 486 | |||
| 487 | /* | ||
| 488 | * Probably taken from CEA-861 spec. | ||
| 489 | * This table is converted from xorg's hw/xfree86/modes/xf86EdidModes.c. | ||
| 490 | */ | ||
| 491 | static const struct drm_display_mode edid_cea_modes[] = { | ||
| 492 | /* 1 - 640x480@60Hz */ | ||
| 493 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656, | ||
| 494 | 752, 800, 0, 480, 490, 492, 525, 0, | ||
| 495 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 496 | /* 2 - 720x480@60Hz */ | ||
| 497 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736, | ||
| 498 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 499 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 500 | /* 3 - 720x480@60Hz */ | ||
| 501 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736, | ||
| 502 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 503 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 504 | /* 4 - 1280x720@60Hz */ | ||
| 505 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390, | ||
| 506 | 1430, 1650, 0, 720, 725, 730, 750, 0, | ||
| 507 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 508 | /* 5 - 1920x1080i@60Hz */ | ||
| 509 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008, | ||
| 510 | 2052, 2200, 0, 1080, 1084, 1094, 1125, 0, | ||
| 511 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | | ||
| 512 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 513 | /* 6 - 1440x480i@60Hz */ | ||
| 514 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478, | ||
| 515 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 516 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 517 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 518 | /* 7 - 1440x480i@60Hz */ | ||
| 519 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478, | ||
| 520 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 521 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 522 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 523 | /* 8 - 1440x240@60Hz */ | ||
| 524 | { DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478, | ||
| 525 | 1602, 1716, 0, 240, 244, 247, 262, 0, | ||
| 526 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 527 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 528 | /* 9 - 1440x240@60Hz */ | ||
| 529 | { DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478, | ||
| 530 | 1602, 1716, 0, 240, 244, 247, 262, 0, | ||
| 531 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 532 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 533 | /* 10 - 2880x480i@60Hz */ | ||
| 534 | { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, | ||
| 535 | 3204, 3432, 0, 480, 488, 494, 525, 0, | ||
| 536 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 537 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 538 | /* 11 - 2880x480i@60Hz */ | ||
| 539 | { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, | ||
| 540 | 3204, 3432, 0, 480, 488, 494, 525, 0, | ||
| 541 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 542 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 543 | /* 12 - 2880x240@60Hz */ | ||
| 544 | { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, | ||
| 545 | 3204, 3432, 0, 240, 244, 247, 262, 0, | ||
| 546 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 547 | /* 13 - 2880x240@60Hz */ | ||
| 548 | { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, | ||
| 549 | 3204, 3432, 0, 240, 244, 247, 262, 0, | ||
| 550 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 551 | /* 14 - 1440x480@60Hz */ | ||
| 552 | { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472, | ||
| 553 | 1596, 1716, 0, 480, 489, 495, 525, 0, | ||
| 554 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 555 | /* 15 - 1440x480@60Hz */ | ||
| 556 | { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472, | ||
| 557 | 1596, 1716, 0, 480, 489, 495, 525, 0, | ||
| 558 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 559 | /* 16 - 1920x1080@60Hz */ | ||
| 560 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008, | ||
| 561 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, | ||
| 562 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 563 | /* 17 - 720x576@50Hz */ | ||
| 564 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732, | ||
| 565 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 566 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 567 | /* 18 - 720x576@50Hz */ | ||
| 568 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732, | ||
| 569 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 570 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 571 | /* 19 - 1280x720@50Hz */ | ||
| 572 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720, | ||
| 573 | 1760, 1980, 0, 720, 725, 730, 750, 0, | ||
| 574 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 575 | /* 20 - 1920x1080i@50Hz */ | ||
| 576 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448, | ||
| 577 | 2492, 2640, 0, 1080, 1084, 1094, 1125, 0, | ||
| 578 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | | ||
| 579 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 580 | /* 21 - 1440x576i@50Hz */ | ||
| 581 | { DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464, | ||
| 582 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 583 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 584 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 585 | /* 22 - 1440x576i@50Hz */ | ||
| 586 | { DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464, | ||
| 587 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 588 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 589 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 590 | /* 23 - 1440x288@50Hz */ | ||
| 591 | { DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464, | ||
| 592 | 1590, 1728, 0, 288, 290, 293, 312, 0, | ||
| 593 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 594 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 595 | /* 24 - 1440x288@50Hz */ | ||
| 596 | { DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464, | ||
| 597 | 1590, 1728, 0, 288, 290, 293, 312, 0, | ||
| 598 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 599 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 600 | /* 25 - 2880x576i@50Hz */ | ||
| 601 | { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, | ||
| 602 | 3180, 3456, 0, 576, 580, 586, 625, 0, | ||
| 603 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 604 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 605 | /* 26 - 2880x576i@50Hz */ | ||
| 606 | { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, | ||
| 607 | 3180, 3456, 0, 576, 580, 586, 625, 0, | ||
| 608 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 609 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 610 | /* 27 - 2880x288@50Hz */ | ||
| 611 | { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, | ||
| 612 | 3180, 3456, 0, 288, 290, 293, 312, 0, | ||
| 613 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 614 | /* 28 - 2880x288@50Hz */ | ||
| 615 | { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, | ||
| 616 | 3180, 3456, 0, 288, 290, 293, 312, 0, | ||
| 617 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 618 | /* 29 - 1440x576@50Hz */ | ||
| 619 | { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464, | ||
| 620 | 1592, 1728, 0, 576, 581, 586, 625, 0, | ||
| 621 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 622 | /* 30 - 1440x576@50Hz */ | ||
| 623 | { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464, | ||
| 624 | 1592, 1728, 0, 576, 581, 586, 625, 0, | ||
| 625 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 626 | /* 31 - 1920x1080@50Hz */ | ||
| 627 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448, | ||
| 628 | 2492, 2640, 0, 1080, 1084, 1089, 1125, 0, | ||
| 629 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 630 | /* 32 - 1920x1080@24Hz */ | ||
| 631 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558, | ||
| 632 | 2602, 2750, 0, 1080, 1084, 1089, 1125, 0, | ||
| 633 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 634 | /* 33 - 1920x1080@25Hz */ | ||
| 635 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448, | ||
| 636 | 2492, 2640, 0, 1080, 1084, 1089, 1125, 0, | ||
| 637 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 638 | /* 34 - 1920x1080@30Hz */ | ||
| 639 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008, | ||
| 640 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, | ||
| 641 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 642 | /* 35 - 2880x480@60Hz */ | ||
| 643 | { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944, | ||
| 644 | 3192, 3432, 0, 480, 489, 495, 525, 0, | ||
| 645 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 646 | /* 36 - 2880x480@60Hz */ | ||
| 647 | { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944, | ||
| 648 | 3192, 3432, 0, 480, 489, 495, 525, 0, | ||
| 649 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 650 | /* 37 - 2880x576@50Hz */ | ||
| 651 | { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928, | ||
| 652 | 3184, 3456, 0, 576, 581, 586, 625, 0, | ||
| 653 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 654 | /* 38 - 2880x576@50Hz */ | ||
| 655 | { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928, | ||
| 656 | 3184, 3456, 0, 576, 581, 586, 625, 0, | ||
| 657 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 658 | /* 39 - 1920x1080i@50Hz */ | ||
| 659 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952, | ||
| 660 | 2120, 2304, 0, 1080, 1126, 1136, 1250, 0, | ||
| 661 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 662 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 663 | /* 40 - 1920x1080i@100Hz */ | ||
| 664 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448, | ||
| 665 | 2492, 2640, 0, 1080, 1084, 1094, 1125, 0, | ||
| 666 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | | ||
| 667 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 668 | /* 41 - 1280x720@100Hz */ | ||
| 669 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720, | ||
| 670 | 1760, 1980, 0, 720, 725, 730, 750, 0, | ||
| 671 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 672 | /* 42 - 720x576@100Hz */ | ||
| 673 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732, | ||
| 674 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 675 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 676 | /* 43 - 720x576@100Hz */ | ||
| 677 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732, | ||
| 678 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 679 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 680 | /* 44 - 1440x576i@100Hz */ | ||
| 681 | { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464, | ||
| 682 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 683 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 684 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 685 | /* 45 - 1440x576i@100Hz */ | ||
| 686 | { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464, | ||
| 687 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 688 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 689 | DRM_MODE_FLAG_DBLCLK) }, | ||
| 690 | /* 46 - 1920x1080i@120Hz */ | ||
| 691 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008, | ||
| 692 | 2052, 2200, 0, 1080, 1084, 1094, 1125, 0, | ||
| 693 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | | ||
| 694 | DRM_MODE_FLAG_INTERLACE) }, | ||
| 695 | /* 47 - 1280x720@120Hz */ | ||
| 696 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390, | ||
| 697 | 1430, 1650, 0, 720, 725, 730, 750, 0, | ||
| 698 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 699 | /* 48 - 720x480@120Hz */ | ||
| 700 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736, | ||
| 701 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 702 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 703 | /* 49 - 720x480@120Hz */ | ||
| 704 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736, | ||
| 705 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 706 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 707 | /* 50 - 1440x480i@120Hz */ | ||
| 708 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478, | ||
| 709 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 710 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 711 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 712 | /* 51 - 1440x480i@120Hz */ | ||
| 713 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478, | ||
| 714 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 715 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 716 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 717 | /* 52 - 720x576@200Hz */ | ||
| 718 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732, | ||
| 719 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 720 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 721 | /* 53 - 720x576@200Hz */ | ||
| 722 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732, | ||
| 723 | 796, 864, 0, 576, 581, 586, 625, 0, | ||
| 724 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 725 | /* 54 - 1440x576i@200Hz */ | ||
| 726 | { DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464, | ||
| 727 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 728 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 729 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 730 | /* 55 - 1440x576i@200Hz */ | ||
| 731 | { DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464, | ||
| 732 | 1590, 1728, 0, 576, 580, 586, 625, 0, | ||
| 733 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 734 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 735 | /* 56 - 720x480@240Hz */ | ||
| 736 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736, | ||
| 737 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 738 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 739 | /* 57 - 720x480@240Hz */ | ||
| 740 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736, | ||
| 741 | 798, 858, 0, 480, 489, 495, 525, 0, | ||
| 742 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, | ||
| 743 | /* 58 - 1440x480i@240 */ | ||
| 744 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478, | ||
| 745 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 746 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 747 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 748 | /* 59 - 1440x480i@240 */ | ||
| 749 | { DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478, | ||
| 750 | 1602, 1716, 0, 480, 488, 494, 525, 0, | ||
| 751 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | | ||
| 752 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK) }, | ||
| 753 | /* 60 - 1280x720@24Hz */ | ||
| 754 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040, | ||
| 755 | 3080, 3300, 0, 720, 725, 730, 750, 0, | ||
| 756 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 757 | /* 61 - 1280x720@25Hz */ | ||
| 758 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700, | ||
| 759 | 3740, 3960, 0, 720, 725, 730, 750, 0, | ||
| 760 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 761 | /* 62 - 1280x720@30Hz */ | ||
| 762 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040, | ||
| 763 | 3080, 3300, 0, 720, 725, 730, 750, 0, | ||
| 764 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 765 | /* 63 - 1920x1080@120Hz */ | ||
| 766 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008, | ||
| 767 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, | ||
| 768 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 769 | /* 64 - 1920x1080@100Hz */ | ||
| 770 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448, | ||
| 771 | 2492, 2640, 0, 1080, 1084, 1094, 1125, 0, | ||
| 772 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | ||
| 773 | }; | ||
| 774 | static const int drm_num_cea_modes = ARRAY_SIZE(edid_cea_modes); | ||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 31c0205685ab..f61cb7998c72 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -770,7 +770,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, | |||
| 770 | * CEA-861-E - 5.1 Default Encoding Parameters | 770 | * CEA-861-E - 5.1 Default Encoding Parameters |
| 771 | * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry | 771 | * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry |
| 772 | */ | 772 | */ |
| 773 | if (bpp != 18 && drm_mode_cea_vic(adjusted_mode) > 1) | 773 | if (bpp != 18 && drm_match_cea_mode(adjusted_mode) > 1) |
| 774 | intel_dp->color_range = DP_COLOR_RANGE_16_235; | 774 | intel_dp->color_range = DP_COLOR_RANGE_16_235; |
| 775 | else | 775 | else |
| 776 | intel_dp->color_range = 0; | 776 | intel_dp->color_range = 0; |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 83d66602414b..fa8ec4a26041 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -348,7 +348,7 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder, | |||
| 348 | avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL; | 348 | avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL; |
| 349 | } | 349 | } |
| 350 | 350 | ||
| 351 | avi_if.body.avi.VIC = drm_mode_cea_vic(adjusted_mode); | 351 | avi_if.body.avi.VIC = drm_match_cea_mode(adjusted_mode); |
| 352 | 352 | ||
| 353 | intel_set_infoframe(encoder, &avi_if); | 353 | intel_set_infoframe(encoder, &avi_if); |
| 354 | } | 354 | } |
| @@ -781,7 +781,7 @@ bool intel_hdmi_mode_fixup(struct drm_encoder *encoder, | |||
| 781 | if (intel_hdmi->color_range_auto) { | 781 | if (intel_hdmi->color_range_auto) { |
| 782 | /* See CEA-861-E - 5.1 Default Encoding Parameters */ | 782 | /* See CEA-861-E - 5.1 Default Encoding Parameters */ |
| 783 | if (intel_hdmi->has_hdmi_sink && | 783 | if (intel_hdmi->has_hdmi_sink && |
| 784 | drm_mode_cea_vic(adjusted_mode) > 1) | 784 | drm_match_cea_mode(adjusted_mode) > 1) |
| 785 | intel_hdmi->color_range = SDVO_COLOR_RANGE_16_235; | 785 | intel_hdmi->color_range = SDVO_COLOR_RANGE_16_235; |
| 786 | else | 786 | else |
| 787 | intel_hdmi->color_range = 0; | 787 | intel_hdmi->color_range = 0; |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 33b46d9694ea..d07a8cdf998e 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -1077,7 +1077,7 @@ static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder, | |||
| 1077 | if (intel_sdvo->color_range_auto) { | 1077 | if (intel_sdvo->color_range_auto) { |
| 1078 | /* See CEA-861-E - 5.1 Default Encoding Parameters */ | 1078 | /* See CEA-861-E - 5.1 Default Encoding Parameters */ |
| 1079 | if (intel_sdvo->has_hdmi_monitor && | 1079 | if (intel_sdvo->has_hdmi_monitor && |
| 1080 | drm_mode_cea_vic(adjusted_mode) > 1) | 1080 | drm_match_cea_mode(adjusted_mode) > 1) |
| 1081 | intel_sdvo->color_range = SDVO_COLOR_RANGE_16_235; | 1081 | intel_sdvo->color_range = SDVO_COLOR_RANGE_16_235; |
| 1082 | else | 1082 | else |
| 1083 | intel_sdvo->color_range = 0; | 1083 | intel_sdvo->color_range = 0; |
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index 327c08b54180..4fdecc2b4040 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | * Authors: Christian König | 24 | * Authors: Christian König |
| 25 | * Rafał Miłecki | 25 | * Rafał Miłecki |
| 26 | */ | 26 | */ |
| 27 | #include <linux/hdmi.h> | ||
| 27 | #include <drm/drmP.h> | 28 | #include <drm/drmP.h> |
| 28 | #include <drm/radeon_drm.h> | 29 | #include <drm/radeon_drm.h> |
| 29 | #include "radeon.h" | 30 | #include "radeon.h" |
| @@ -54,79 +55,18 @@ static void evergreen_hdmi_update_ACR(struct drm_encoder *encoder, uint32_t cloc | |||
| 54 | } | 55 | } |
| 55 | 56 | ||
| 56 | /* | 57 | /* |
| 57 | * calculate the crc for a given info frame | ||
| 58 | */ | ||
| 59 | static void evergreen_hdmi_infoframe_checksum(uint8_t packetType, | ||
| 60 | uint8_t versionNumber, | ||
| 61 | uint8_t length, | ||
| 62 | uint8_t *frame) | ||
| 63 | { | ||
| 64 | int i; | ||
| 65 | frame[0] = packetType + versionNumber + length; | ||
| 66 | for (i = 1; i <= length; i++) | ||
| 67 | frame[0] += frame[i]; | ||
| 68 | frame[0] = 0x100 - frame[0]; | ||
| 69 | } | ||
| 70 | |||
| 71 | /* | ||
| 72 | * build a HDMI Video Info Frame | 58 | * build a HDMI Video Info Frame |
| 73 | */ | 59 | */ |
| 74 | static void evergreen_hdmi_videoinfoframe( | 60 | static void evergreen_hdmi_update_avi_infoframe(struct drm_encoder *encoder, |
| 75 | struct drm_encoder *encoder, | 61 | void *buffer, size_t size) |
| 76 | uint8_t color_format, | ||
| 77 | int active_information_present, | ||
| 78 | uint8_t active_format_aspect_ratio, | ||
| 79 | uint8_t scan_information, | ||
| 80 | uint8_t colorimetry, | ||
| 81 | uint8_t ex_colorimetry, | ||
| 82 | uint8_t quantization, | ||
| 83 | int ITC, | ||
| 84 | uint8_t picture_aspect_ratio, | ||
| 85 | uint8_t video_format_identification, | ||
| 86 | uint8_t pixel_repetition, | ||
| 87 | uint8_t non_uniform_picture_scaling, | ||
| 88 | uint8_t bar_info_data_valid, | ||
| 89 | uint16_t top_bar, | ||
| 90 | uint16_t bottom_bar, | ||
| 91 | uint16_t left_bar, | ||
| 92 | uint16_t right_bar | ||
| 93 | ) | ||
| 94 | { | 62 | { |
| 95 | struct drm_device *dev = encoder->dev; | 63 | struct drm_device *dev = encoder->dev; |
| 96 | struct radeon_device *rdev = dev->dev_private; | 64 | struct radeon_device *rdev = dev->dev_private; |
| 97 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 65 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 98 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 66 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 99 | uint32_t offset = dig->afmt->offset; | 67 | uint32_t offset = dig->afmt->offset; |
| 68 | uint8_t *frame = buffer + 3; | ||
| 100 | 69 | ||
| 101 | uint8_t frame[14]; | ||
| 102 | |||
| 103 | frame[0x0] = 0; | ||
| 104 | frame[0x1] = | ||
| 105 | (scan_information & 0x3) | | ||
| 106 | ((bar_info_data_valid & 0x3) << 2) | | ||
| 107 | ((active_information_present & 0x1) << 4) | | ||
| 108 | ((color_format & 0x3) << 5); | ||
| 109 | frame[0x2] = | ||
| 110 | (active_format_aspect_ratio & 0xF) | | ||
| 111 | ((picture_aspect_ratio & 0x3) << 4) | | ||
| 112 | ((colorimetry & 0x3) << 6); | ||
| 113 | frame[0x3] = | ||
| 114 | (non_uniform_picture_scaling & 0x3) | | ||
| 115 | ((quantization & 0x3) << 2) | | ||
| 116 | ((ex_colorimetry & 0x7) << 4) | | ||
| 117 | ((ITC & 0x1) << 7); | ||
| 118 | frame[0x4] = (video_format_identification & 0x7F); | ||
| 119 | frame[0x5] = (pixel_repetition & 0xF); | ||
| 120 | frame[0x6] = (top_bar & 0xFF); | ||
| 121 | frame[0x7] = (top_bar >> 8); | ||
| 122 | frame[0x8] = (bottom_bar & 0xFF); | ||
| 123 | frame[0x9] = (bottom_bar >> 8); | ||
| 124 | frame[0xA] = (left_bar & 0xFF); | ||
| 125 | frame[0xB] = (left_bar >> 8); | ||
| 126 | frame[0xC] = (right_bar & 0xFF); | ||
| 127 | frame[0xD] = (right_bar >> 8); | ||
| 128 | |||
| 129 | evergreen_hdmi_infoframe_checksum(0x82, 0x02, 0x0D, frame); | ||
| 130 | /* Our header values (type, version, length) should be alright, Intel | 70 | /* Our header values (type, version, length) should be alright, Intel |
| 131 | * is using the same. Checksum function also seems to be OK, it works | 71 | * is using the same. Checksum function also seems to be OK, it works |
| 132 | * fine for audio infoframe. However calculated value is always lower | 72 | * fine for audio infoframe. However calculated value is always lower |
| @@ -154,7 +94,10 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
| 154 | struct radeon_device *rdev = dev->dev_private; | 94 | struct radeon_device *rdev = dev->dev_private; |
| 155 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 95 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 156 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 96 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 97 | u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE]; | ||
| 98 | struct hdmi_avi_infoframe frame; | ||
| 157 | uint32_t offset; | 99 | uint32_t offset; |
| 100 | ssize_t err; | ||
| 158 | 101 | ||
| 159 | /* Silent, r600_hdmi_enable will raise WARN for us */ | 102 | /* Silent, r600_hdmi_enable will raise WARN for us */ |
| 160 | if (!dig->afmt->enabled) | 103 | if (!dig->afmt->enabled) |
| @@ -200,9 +143,19 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
| 200 | 143 | ||
| 201 | WREG32(HDMI_GC + offset, 0); /* unset HDMI_GC_AVMUTE */ | 144 | WREG32(HDMI_GC + offset, 0); /* unset HDMI_GC_AVMUTE */ |
| 202 | 145 | ||
| 203 | evergreen_hdmi_videoinfoframe(encoder, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 146 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode); |
| 204 | 0, 0, 0, 0, 0, 0); | 147 | if (err < 0) { |
| 148 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); | ||
| 149 | return; | ||
| 150 | } | ||
| 151 | |||
| 152 | err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer)); | ||
| 153 | if (err < 0) { | ||
| 154 | DRM_ERROR("failed to pack AVI infoframe: %zd\n", err); | ||
| 155 | return; | ||
| 156 | } | ||
| 205 | 157 | ||
| 158 | evergreen_hdmi_update_avi_infoframe(encoder, buffer, sizeof(buffer)); | ||
| 206 | evergreen_hdmi_update_ACR(encoder, mode->clock); | 159 | evergreen_hdmi_update_ACR(encoder, mode->clock); |
| 207 | 160 | ||
| 208 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ | 161 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 95970ec47c45..21ecc0e12dc4 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | * | 23 | * |
| 24 | * Authors: Christian König | 24 | * Authors: Christian König |
| 25 | */ | 25 | */ |
| 26 | #include <linux/hdmi.h> | ||
| 26 | #include <drm/drmP.h> | 27 | #include <drm/drmP.h> |
| 27 | #include <drm/radeon_drm.h> | 28 | #include <drm/radeon_drm.h> |
| 28 | #include "radeon.h" | 29 | #include "radeon.h" |
| @@ -121,79 +122,18 @@ static void r600_hdmi_update_ACR(struct drm_encoder *encoder, uint32_t clock) | |||
| 121 | } | 122 | } |
| 122 | 123 | ||
| 123 | /* | 124 | /* |
| 124 | * calculate the crc for a given info frame | ||
| 125 | */ | ||
| 126 | static void r600_hdmi_infoframe_checksum(uint8_t packetType, | ||
| 127 | uint8_t versionNumber, | ||
| 128 | uint8_t length, | ||
| 129 | uint8_t *frame) | ||
| 130 | { | ||
| 131 | int i; | ||
| 132 | frame[0] = packetType + versionNumber + length; | ||
| 133 | for (i = 1; i <= length; i++) | ||
| 134 | frame[0] += frame[i]; | ||
| 135 | frame[0] = 0x100 - frame[0]; | ||
| 136 | } | ||
| 137 | |||
| 138 | /* | ||
| 139 | * build a HDMI Video Info Frame | 125 | * build a HDMI Video Info Frame |
| 140 | */ | 126 | */ |
| 141 | static void r600_hdmi_videoinfoframe( | 127 | static void r600_hdmi_update_avi_infoframe(struct drm_encoder *encoder, |
| 142 | struct drm_encoder *encoder, | 128 | void *buffer, size_t size) |
| 143 | enum r600_hdmi_color_format color_format, | ||
| 144 | int active_information_present, | ||
| 145 | uint8_t active_format_aspect_ratio, | ||
| 146 | uint8_t scan_information, | ||
| 147 | uint8_t colorimetry, | ||
| 148 | uint8_t ex_colorimetry, | ||
| 149 | uint8_t quantization, | ||
| 150 | int ITC, | ||
| 151 | uint8_t picture_aspect_ratio, | ||
| 152 | uint8_t video_format_identification, | ||
| 153 | uint8_t pixel_repetition, | ||
| 154 | uint8_t non_uniform_picture_scaling, | ||
| 155 | uint8_t bar_info_data_valid, | ||
| 156 | uint16_t top_bar, | ||
| 157 | uint16_t bottom_bar, | ||
| 158 | uint16_t left_bar, | ||
| 159 | uint16_t right_bar | ||
| 160 | ) | ||
| 161 | { | 129 | { |
| 162 | struct drm_device *dev = encoder->dev; | 130 | struct drm_device *dev = encoder->dev; |
| 163 | struct radeon_device *rdev = dev->dev_private; | 131 | struct radeon_device *rdev = dev->dev_private; |
| 164 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 132 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 165 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 133 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 166 | uint32_t offset = dig->afmt->offset; | 134 | uint32_t offset = dig->afmt->offset; |
| 135 | uint8_t *frame = buffer + 3; | ||
| 167 | 136 | ||
| 168 | uint8_t frame[14]; | ||
| 169 | |||
| 170 | frame[0x0] = 0; | ||
| 171 | frame[0x1] = | ||
| 172 | (scan_information & 0x3) | | ||
| 173 | ((bar_info_data_valid & 0x3) << 2) | | ||
| 174 | ((active_information_present & 0x1) << 4) | | ||
| 175 | ((color_format & 0x3) << 5); | ||
| 176 | frame[0x2] = | ||
| 177 | (active_format_aspect_ratio & 0xF) | | ||
| 178 | ((picture_aspect_ratio & 0x3) << 4) | | ||
| 179 | ((colorimetry & 0x3) << 6); | ||
| 180 | frame[0x3] = | ||
| 181 | (non_uniform_picture_scaling & 0x3) | | ||
| 182 | ((quantization & 0x3) << 2) | | ||
| 183 | ((ex_colorimetry & 0x7) << 4) | | ||
| 184 | ((ITC & 0x1) << 7); | ||
| 185 | frame[0x4] = (video_format_identification & 0x7F); | ||
| 186 | frame[0x5] = (pixel_repetition & 0xF); | ||
| 187 | frame[0x6] = (top_bar & 0xFF); | ||
| 188 | frame[0x7] = (top_bar >> 8); | ||
| 189 | frame[0x8] = (bottom_bar & 0xFF); | ||
| 190 | frame[0x9] = (bottom_bar >> 8); | ||
| 191 | frame[0xA] = (left_bar & 0xFF); | ||
| 192 | frame[0xB] = (left_bar >> 8); | ||
| 193 | frame[0xC] = (right_bar & 0xFF); | ||
| 194 | frame[0xD] = (right_bar >> 8); | ||
| 195 | |||
| 196 | r600_hdmi_infoframe_checksum(0x82, 0x02, 0x0D, frame); | ||
| 197 | /* Our header values (type, version, length) should be alright, Intel | 137 | /* Our header values (type, version, length) should be alright, Intel |
| 198 | * is using the same. Checksum function also seems to be OK, it works | 138 | * is using the same. Checksum function also seems to be OK, it works |
| 199 | * fine for audio infoframe. However calculated value is always lower | 139 | * fine for audio infoframe. However calculated value is always lower |
| @@ -215,39 +155,15 @@ static void r600_hdmi_videoinfoframe( | |||
| 215 | /* | 155 | /* |
| 216 | * build a Audio Info Frame | 156 | * build a Audio Info Frame |
| 217 | */ | 157 | */ |
| 218 | static void r600_hdmi_audioinfoframe( | 158 | static void r600_hdmi_update_audio_infoframe(struct drm_encoder *encoder, |
| 219 | struct drm_encoder *encoder, | 159 | const void *buffer, size_t size) |
| 220 | uint8_t channel_count, | ||
| 221 | uint8_t coding_type, | ||
| 222 | uint8_t sample_size, | ||
| 223 | uint8_t sample_frequency, | ||
| 224 | uint8_t format, | ||
| 225 | uint8_t channel_allocation, | ||
| 226 | uint8_t level_shift, | ||
| 227 | int downmix_inhibit | ||
| 228 | ) | ||
| 229 | { | 160 | { |
| 230 | struct drm_device *dev = encoder->dev; | 161 | struct drm_device *dev = encoder->dev; |
| 231 | struct radeon_device *rdev = dev->dev_private; | 162 | struct radeon_device *rdev = dev->dev_private; |
| 232 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 163 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 233 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 164 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 234 | uint32_t offset = dig->afmt->offset; | 165 | uint32_t offset = dig->afmt->offset; |
| 235 | 166 | const u8 *frame = buffer + 3; | |
| 236 | uint8_t frame[11]; | ||
| 237 | |||
| 238 | frame[0x0] = 0; | ||
| 239 | frame[0x1] = (channel_count & 0x7) | ((coding_type & 0xF) << 4); | ||
| 240 | frame[0x2] = (sample_size & 0x3) | ((sample_frequency & 0x7) << 2); | ||
| 241 | frame[0x3] = format; | ||
| 242 | frame[0x4] = channel_allocation; | ||
| 243 | frame[0x5] = ((level_shift & 0xF) << 3) | ((downmix_inhibit & 0x1) << 7); | ||
| 244 | frame[0x6] = 0; | ||
| 245 | frame[0x7] = 0; | ||
| 246 | frame[0x8] = 0; | ||
| 247 | frame[0x9] = 0; | ||
| 248 | frame[0xA] = 0; | ||
| 249 | |||
| 250 | r600_hdmi_infoframe_checksum(0x84, 0x01, 0x0A, frame); | ||
| 251 | 167 | ||
| 252 | WREG32(HDMI0_AUDIO_INFO0 + offset, | 168 | WREG32(HDMI0_AUDIO_INFO0 + offset, |
| 253 | frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); | 169 | frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); |
| @@ -320,7 +236,10 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
| 320 | struct radeon_device *rdev = dev->dev_private; | 236 | struct radeon_device *rdev = dev->dev_private; |
| 321 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 237 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 322 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 238 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 239 | u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE]; | ||
| 240 | struct hdmi_avi_infoframe frame; | ||
| 323 | uint32_t offset; | 241 | uint32_t offset; |
| 242 | ssize_t err; | ||
| 324 | 243 | ||
| 325 | /* Silent, r600_hdmi_enable will raise WARN for us */ | 244 | /* Silent, r600_hdmi_enable will raise WARN for us */ |
| 326 | if (!dig->afmt->enabled) | 245 | if (!dig->afmt->enabled) |
| @@ -371,9 +290,19 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
| 371 | 290 | ||
| 372 | WREG32(HDMI0_GC + offset, 0); /* unset HDMI0_GC_AVMUTE */ | 291 | WREG32(HDMI0_GC + offset, 0); /* unset HDMI0_GC_AVMUTE */ |
| 373 | 292 | ||
| 374 | r600_hdmi_videoinfoframe(encoder, RGB, 0, 0, 0, 0, | 293 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode); |
| 375 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | 294 | if (err < 0) { |
| 295 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); | ||
| 296 | return; | ||
| 297 | } | ||
| 376 | 298 | ||
| 299 | err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer)); | ||
| 300 | if (err < 0) { | ||
| 301 | DRM_ERROR("failed to pack AVI infoframe: %zd\n", err); | ||
| 302 | return; | ||
| 303 | } | ||
| 304 | |||
| 305 | r600_hdmi_update_avi_infoframe(encoder, buffer, sizeof(buffer)); | ||
| 377 | r600_hdmi_update_ACR(encoder, mode->clock); | 306 | r600_hdmi_update_ACR(encoder, mode->clock); |
| 378 | 307 | ||
| 379 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ | 308 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ |
| @@ -395,8 +324,11 @@ void r600_hdmi_update_audio_settings(struct drm_encoder *encoder) | |||
| 395 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 324 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 396 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 325 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 397 | struct r600_audio audio = r600_audio_status(rdev); | 326 | struct r600_audio audio = r600_audio_status(rdev); |
| 327 | uint8_t buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AUDIO_INFOFRAME_SIZE]; | ||
| 328 | struct hdmi_audio_infoframe frame; | ||
| 398 | uint32_t offset; | 329 | uint32_t offset; |
| 399 | uint32_t iec; | 330 | uint32_t iec; |
| 331 | ssize_t err; | ||
| 400 | 332 | ||
| 401 | if (!dig->afmt || !dig->afmt->enabled) | 333 | if (!dig->afmt || !dig->afmt->enabled) |
| 402 | return; | 334 | return; |
| @@ -462,9 +394,21 @@ void r600_hdmi_update_audio_settings(struct drm_encoder *encoder) | |||
| 462 | iec |= 0x5 << 16; | 394 | iec |= 0x5 << 16; |
| 463 | WREG32_P(HDMI0_60958_1 + offset, iec, ~0x5000f); | 395 | WREG32_P(HDMI0_60958_1 + offset, iec, ~0x5000f); |
| 464 | 396 | ||
| 465 | r600_hdmi_audioinfoframe(encoder, audio.channels - 1, 0, 0, 0, 0, 0, 0, | 397 | err = hdmi_audio_infoframe_init(&frame); |
| 466 | 0); | 398 | if (err < 0) { |
| 399 | DRM_ERROR("failed to setup audio infoframe\n"); | ||
| 400 | return; | ||
| 401 | } | ||
| 402 | |||
| 403 | frame.channels = audio.channels; | ||
| 404 | |||
| 405 | err = hdmi_audio_infoframe_pack(&frame, buffer, sizeof(buffer)); | ||
| 406 | if (err < 0) { | ||
| 407 | DRM_ERROR("failed to pack audio infoframe\n"); | ||
| 408 | return; | ||
| 409 | } | ||
| 467 | 410 | ||
| 411 | r600_hdmi_update_audio_infoframe(encoder, buffer, sizeof(buffer)); | ||
| 468 | r600_hdmi_audio_workaround(encoder); | 412 | r600_hdmi_audio_workaround(encoder); |
| 469 | } | 413 | } |
| 470 | 414 | ||
diff --git a/drivers/gpu/drm/tegra/Kconfig b/drivers/gpu/drm/tegra/Kconfig index be1daf7344d3..c92955df0658 100644 --- a/drivers/gpu/drm/tegra/Kconfig +++ b/drivers/gpu/drm/tegra/Kconfig | |||
| @@ -4,6 +4,7 @@ config DRM_TEGRA | |||
| 4 | select DRM_KMS_HELPER | 4 | select DRM_KMS_HELPER |
| 5 | select DRM_GEM_CMA_HELPER | 5 | select DRM_GEM_CMA_HELPER |
| 6 | select DRM_KMS_CMA_HELPER | 6 | select DRM_KMS_CMA_HELPER |
| 7 | select DRM_HDMI | ||
| 7 | select FB_CFB_FILLRECT | 8 | select FB_CFB_FILLRECT |
| 8 | select FB_CFB_COPYAREA | 9 | select FB_CFB_COPYAREA |
| 9 | select FB_CFB_IMAGEBLIT | 10 | select FB_CFB_IMAGEBLIT |
diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c index e060c7e6434d..0daee8e2578b 100644 --- a/drivers/gpu/drm/tegra/hdmi.c +++ b/drivers/gpu/drm/tegra/hdmi.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/clk.h> | 10 | #include <linux/clk.h> |
| 11 | #include <linux/debugfs.h> | 11 | #include <linux/debugfs.h> |
| 12 | #include <linux/gpio.h> | 12 | #include <linux/gpio.h> |
| 13 | #include <linux/hdmi.h> | ||
| 13 | #include <linux/module.h> | 14 | #include <linux/module.h> |
| 14 | #include <linux/of.h> | 15 | #include <linux/of.h> |
| 15 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
| @@ -17,6 +18,8 @@ | |||
| 17 | 18 | ||
| 18 | #include <mach/clk.h> | 19 | #include <mach/clk.h> |
| 19 | 20 | ||
| 21 | #include <drm/drm_edid.h> | ||
| 22 | |||
| 20 | #include "hdmi.h" | 23 | #include "hdmi.h" |
| 21 | #include "drm.h" | 24 | #include "drm.h" |
| 22 | #include "dc.h" | 25 | #include "dc.h" |
| @@ -401,54 +404,65 @@ static int tegra_hdmi_setup_audio(struct tegra_hdmi *hdmi, unsigned int pclk) | |||
| 401 | return 0; | 404 | return 0; |
| 402 | } | 405 | } |
| 403 | 406 | ||
| 404 | static void tegra_hdmi_write_infopack(struct tegra_hdmi *hdmi, | 407 | static inline unsigned long tegra_hdmi_subpack(const u8 *ptr, size_t size) |
| 405 | unsigned int offset, u8 type, | ||
| 406 | u8 version, void *data, size_t size) | ||
| 407 | { | 408 | { |
| 408 | unsigned long value; | 409 | unsigned long value = 0; |
| 409 | u8 *ptr = data; | ||
| 410 | u32 subpack[2]; | ||
| 411 | size_t i; | 410 | size_t i; |
| 412 | u8 csum; | ||
| 413 | 411 | ||
| 414 | /* first byte of data is the checksum */ | 412 | for (i = size; i > 0; i--) |
| 415 | csum = type + version + size - 1; | 413 | value = (value << 8) | ptr[i - 1]; |
| 416 | 414 | ||
| 417 | for (i = 1; i < size; i++) | 415 | return value; |
| 418 | csum += ptr[i]; | 416 | } |
| 419 | 417 | ||
| 420 | ptr[0] = 0x100 - csum; | 418 | static void tegra_hdmi_write_infopack(struct tegra_hdmi *hdmi, const void *data, |
| 419 | size_t size) | ||
| 420 | { | ||
| 421 | const u8 *ptr = data; | ||
| 422 | unsigned long offset; | ||
| 423 | unsigned long value; | ||
| 424 | size_t i, j; | ||
| 421 | 425 | ||
| 422 | value = INFOFRAME_HEADER_TYPE(type) | | 426 | switch (ptr[0]) { |
| 423 | INFOFRAME_HEADER_VERSION(version) | | 427 | case HDMI_INFOFRAME_TYPE_AVI: |
| 424 | INFOFRAME_HEADER_LEN(size - 1); | 428 | offset = HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_HEADER; |
| 425 | tegra_hdmi_writel(hdmi, value, offset); | 429 | break; |
| 426 | 430 | ||
| 427 | /* The audio inforame only has one set of subpack registers. The hdmi | 431 | case HDMI_INFOFRAME_TYPE_AUDIO: |
| 428 | * block pads the rest of the data as per the spec so we have to fixup | 432 | offset = HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER; |
| 429 | * the length before filling in the subpacks. | 433 | break; |
| 430 | */ | ||
| 431 | if (offset == HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER) | ||
| 432 | size = 6; | ||
| 433 | 434 | ||
| 434 | /* each subpack 7 bytes devided into: | 435 | case HDMI_INFOFRAME_TYPE_VENDOR: |
| 435 | * subpack_low - bytes 0 - 3 | 436 | offset = HDMI_NV_PDISP_HDMI_GENERIC_HEADER; |
| 436 | * subpack_high - bytes 4 - 6 (with byte 7 padded to 0x00) | 437 | break; |
| 437 | */ | 438 | |
| 438 | for (i = 0; i < size; i++) { | 439 | default: |
| 439 | size_t index = i % 7; | 440 | dev_err(hdmi->dev, "unsupported infoframe type: %02x\n", |
| 441 | ptr[0]); | ||
| 442 | return; | ||
| 443 | } | ||
| 444 | |||
| 445 | value = INFOFRAME_HEADER_TYPE(ptr[0]) | | ||
| 446 | INFOFRAME_HEADER_VERSION(ptr[1]) | | ||
| 447 | INFOFRAME_HEADER_LEN(ptr[2]); | ||
| 448 | tegra_hdmi_writel(hdmi, value, offset); | ||
| 449 | offset++; | ||
| 440 | 450 | ||
| 441 | if (index == 0) | 451 | /* |
| 442 | memset(subpack, 0x0, sizeof(subpack)); | 452 | * Each subpack contains 7 bytes, divided into: |
| 453 | * - subpack_low: bytes 0 - 3 | ||
| 454 | * - subpack_high: bytes 4 - 6 (with byte 7 padded to 0x00) | ||
| 455 | */ | ||
| 456 | for (i = 3, j = 0; i < size; i += 7, j += 8) { | ||
| 457 | size_t rem = size - i, num = min_t(size_t, rem, 4); | ||
| 443 | 458 | ||
| 444 | ((u8 *)subpack)[index] = ptr[i]; | 459 | value = tegra_hdmi_subpack(&ptr[i], num); |
| 460 | tegra_hdmi_writel(hdmi, value, offset++); | ||
| 445 | 461 | ||
| 446 | if (index == 6 || (i + 1 == size)) { | 462 | num = min_t(size_t, rem - num, 3); |
| 447 | unsigned int reg = offset + 1 + (i / 7) * 2; | ||
| 448 | 463 | ||
| 449 | tegra_hdmi_writel(hdmi, subpack[0], reg); | 464 | value = tegra_hdmi_subpack(&ptr[i + 4], num); |
| 450 | tegra_hdmi_writel(hdmi, subpack[1], reg + 1); | 465 | tegra_hdmi_writel(hdmi, value, offset++); |
| 451 | } | ||
| 452 | } | 466 | } |
| 453 | } | 467 | } |
| 454 | 468 | ||
| @@ -456,9 +470,8 @@ static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi, | |||
| 456 | struct drm_display_mode *mode) | 470 | struct drm_display_mode *mode) |
| 457 | { | 471 | { |
| 458 | struct hdmi_avi_infoframe frame; | 472 | struct hdmi_avi_infoframe frame; |
| 459 | unsigned int h_front_porch; | 473 | u8 buffer[17]; |
| 460 | unsigned int hsize = 16; | 474 | ssize_t err; |
| 461 | unsigned int vsize = 9; | ||
| 462 | 475 | ||
| 463 | if (hdmi->dvi) { | 476 | if (hdmi->dvi) { |
| 464 | tegra_hdmi_writel(hdmi, 0, | 477 | tegra_hdmi_writel(hdmi, 0, |
| @@ -466,69 +479,19 @@ static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi, | |||
| 466 | return; | 479 | return; |
| 467 | } | 480 | } |
| 468 | 481 | ||
| 469 | h_front_porch = mode->hsync_start - mode->hdisplay; | 482 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode); |
| 470 | memset(&frame, 0, sizeof(frame)); | 483 | if (err < 0) { |
| 471 | frame.r = HDMI_AVI_R_SAME; | 484 | dev_err(hdmi->dev, "failed to setup AVI infoframe: %zd\n", err); |
| 472 | 485 | return; | |
| 473 | switch (mode->vdisplay) { | 486 | } |
| 474 | case 480: | ||
| 475 | if (mode->hdisplay == 640) { | ||
| 476 | frame.m = HDMI_AVI_M_4_3; | ||
| 477 | frame.vic = 1; | ||
| 478 | } else { | ||
| 479 | frame.m = HDMI_AVI_M_16_9; | ||
| 480 | frame.vic = 3; | ||
| 481 | } | ||
| 482 | break; | ||
| 483 | |||
| 484 | case 576: | ||
| 485 | if (((hsize * 10) / vsize) > 14) { | ||
| 486 | frame.m = HDMI_AVI_M_16_9; | ||
| 487 | frame.vic = 18; | ||
| 488 | } else { | ||
| 489 | frame.m = HDMI_AVI_M_4_3; | ||
| 490 | frame.vic = 17; | ||
| 491 | } | ||
| 492 | break; | ||
| 493 | |||
| 494 | case 720: | ||
| 495 | case 1470: /* stereo mode */ | ||
| 496 | frame.m = HDMI_AVI_M_16_9; | ||
| 497 | |||
| 498 | if (h_front_porch == 110) | ||
| 499 | frame.vic = 4; | ||
| 500 | else | ||
| 501 | frame.vic = 19; | ||
| 502 | break; | ||
| 503 | |||
| 504 | case 1080: | ||
| 505 | case 2205: /* stereo mode */ | ||
| 506 | frame.m = HDMI_AVI_M_16_9; | ||
| 507 | |||
| 508 | switch (h_front_porch) { | ||
| 509 | case 88: | ||
| 510 | frame.vic = 16; | ||
| 511 | break; | ||
| 512 | |||
| 513 | case 528: | ||
| 514 | frame.vic = 31; | ||
| 515 | break; | ||
| 516 | |||
| 517 | default: | ||
| 518 | frame.vic = 32; | ||
| 519 | break; | ||
| 520 | } | ||
| 521 | break; | ||
| 522 | 487 | ||
| 523 | default: | 488 | err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer)); |
| 524 | frame.m = HDMI_AVI_M_16_9; | 489 | if (err < 0) { |
| 525 | frame.vic = 0; | 490 | dev_err(hdmi->dev, "failed to pack AVI infoframe: %zd\n", err); |
| 526 | break; | 491 | return; |
| 527 | } | 492 | } |
| 528 | 493 | ||
| 529 | tegra_hdmi_write_infopack(hdmi, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_HEADER, | 494 | tegra_hdmi_write_infopack(hdmi, buffer, err); |
| 530 | HDMI_INFOFRAME_TYPE_AVI, HDMI_AVI_VERSION, | ||
| 531 | &frame, sizeof(frame)); | ||
| 532 | 495 | ||
| 533 | tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE, | 496 | tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE, |
| 534 | HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL); | 497 | HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL); |
| @@ -537,6 +500,8 @@ static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi, | |||
| 537 | static void tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi *hdmi) | 500 | static void tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi *hdmi) |
| 538 | { | 501 | { |
| 539 | struct hdmi_audio_infoframe frame; | 502 | struct hdmi_audio_infoframe frame; |
| 503 | u8 buffer[14]; | ||
| 504 | ssize_t err; | ||
| 540 | 505 | ||
| 541 | if (hdmi->dvi) { | 506 | if (hdmi->dvi) { |
| 542 | tegra_hdmi_writel(hdmi, 0, | 507 | tegra_hdmi_writel(hdmi, 0, |
| @@ -544,14 +509,29 @@ static void tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi *hdmi) | |||
| 544 | return; | 509 | return; |
| 545 | } | 510 | } |
| 546 | 511 | ||
| 547 | memset(&frame, 0, sizeof(frame)); | 512 | err = hdmi_audio_infoframe_init(&frame); |
| 548 | frame.cc = HDMI_AUDIO_CC_2; | 513 | if (err < 0) { |
| 514 | dev_err(hdmi->dev, "failed to initialize audio infoframe: %d\n", | ||
| 515 | err); | ||
| 516 | return; | ||
| 517 | } | ||
| 518 | |||
| 519 | frame.channels = 2; | ||
| 520 | |||
| 521 | err = hdmi_audio_infoframe_pack(&frame, buffer, sizeof(buffer)); | ||
| 522 | if (err < 0) { | ||
| 523 | dev_err(hdmi->dev, "failed to pack audio infoframe: %zd\n", | ||
| 524 | err); | ||
| 525 | return; | ||
| 526 | } | ||
| 549 | 527 | ||
| 550 | tegra_hdmi_write_infopack(hdmi, | 528 | /* |
| 551 | HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER, | 529 | * The audio infoframe has only one set of subpack registers, so the |
| 552 | HDMI_INFOFRAME_TYPE_AUDIO, | 530 | * infoframe needs to be truncated. One set of subpack registers can |
| 553 | HDMI_AUDIO_VERSION, | 531 | * contain 7 bytes. Including the 3 byte header only the first 10 |
| 554 | &frame, sizeof(frame)); | 532 | * bytes can be programmed. |
| 533 | */ | ||
| 534 | tegra_hdmi_write_infopack(hdmi, buffer, min(10, err)); | ||
| 555 | 535 | ||
| 556 | tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE, | 536 | tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE, |
| 557 | HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL); | 537 | HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL); |
| @@ -559,8 +539,10 @@ static void tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi *hdmi) | |||
| 559 | 539 | ||
| 560 | static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi) | 540 | static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi) |
| 561 | { | 541 | { |
| 562 | struct hdmi_stereo_infoframe frame; | 542 | struct hdmi_vendor_infoframe frame; |
| 563 | unsigned long value; | 543 | unsigned long value; |
| 544 | u8 buffer[10]; | ||
| 545 | ssize_t err; | ||
| 564 | 546 | ||
| 565 | if (!hdmi->stereo) { | 547 | if (!hdmi->stereo) { |
| 566 | value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); | 548 | value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); |
| @@ -570,22 +552,32 @@ static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi) | |||
| 570 | } | 552 | } |
| 571 | 553 | ||
| 572 | memset(&frame, 0, sizeof(frame)); | 554 | memset(&frame, 0, sizeof(frame)); |
| 573 | frame.regid0 = 0x03; | 555 | |
| 574 | frame.regid1 = 0x0c; | 556 | frame.type = HDMI_INFOFRAME_TYPE_VENDOR; |
| 575 | frame.regid2 = 0x00; | 557 | frame.version = 0x01; |
| 576 | frame.hdmi_video_format = 2; | 558 | frame.length = 6; |
| 559 | |||
| 560 | frame.data[0] = 0x03; /* regid0 */ | ||
| 561 | frame.data[1] = 0x0c; /* regid1 */ | ||
| 562 | frame.data[2] = 0x00; /* regid2 */ | ||
| 563 | frame.data[3] = 0x02 << 5; /* video format */ | ||
| 577 | 564 | ||
| 578 | /* TODO: 74 MHz limit? */ | 565 | /* TODO: 74 MHz limit? */ |
| 579 | if (1) { | 566 | if (1) { |
| 580 | frame._3d_structure = 0; | 567 | frame.data[4] = 0x00 << 4; /* 3D structure */ |
| 581 | } else { | 568 | } else { |
| 582 | frame._3d_structure = 8; | 569 | frame.data[4] = 0x08 << 4; /* 3D structure */ |
| 583 | frame._3d_ext_data = 0; | 570 | frame.data[5] = 0x00 << 4; /* 3D ext. data */ |
| 571 | } | ||
| 572 | |||
| 573 | err = hdmi_vendor_infoframe_pack(&frame, buffer, sizeof(buffer)); | ||
| 574 | if (err < 0) { | ||
| 575 | dev_err(hdmi->dev, "failed to pack vendor infoframe: %zd\n", | ||
| 576 | err); | ||
| 577 | return; | ||
| 584 | } | 578 | } |
| 585 | 579 | ||
| 586 | tegra_hdmi_write_infopack(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_HEADER, | 580 | tegra_hdmi_write_infopack(hdmi, buffer, err); |
| 587 | HDMI_INFOFRAME_TYPE_VENDOR, | ||
| 588 | HDMI_VENDOR_VERSION, &frame, 6); | ||
| 589 | 581 | ||
| 590 | value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); | 582 | value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); |
| 591 | value |= GENERIC_CTRL_ENABLE; | 583 | value |= GENERIC_CTRL_ENABLE; |
diff --git a/drivers/gpu/drm/tegra/hdmi.h b/drivers/gpu/drm/tegra/hdmi.h index 1477f36eb45a..52ac36e08ccb 100644 --- a/drivers/gpu/drm/tegra/hdmi.h +++ b/drivers/gpu/drm/tegra/hdmi.h | |||
| @@ -10,195 +10,6 @@ | |||
| 10 | #ifndef TEGRA_HDMI_H | 10 | #ifndef TEGRA_HDMI_H |
| 11 | #define TEGRA_HDMI_H 1 | 11 | #define TEGRA_HDMI_H 1 |
| 12 | 12 | ||
| 13 | #define HDMI_INFOFRAME_TYPE_VENDOR 0x81 | ||
| 14 | #define HDMI_INFOFRAME_TYPE_AVI 0x82 | ||
| 15 | #define HDMI_INFOFRAME_TYPE_SPD 0x83 | ||
| 16 | #define HDMI_INFOFRAME_TYPE_AUDIO 0x84 | ||
| 17 | #define HDMI_INFOFRAME_TYPE_MPEG_SRC 0x85 | ||
| 18 | #define HDMI_INFOFRAME_TYPE_NTSC_VBI 0x86 | ||
| 19 | |||
| 20 | /* all fields little endian */ | ||
| 21 | struct hdmi_avi_infoframe { | ||
| 22 | /* PB0 */ | ||
| 23 | u8 csum; | ||
| 24 | |||
| 25 | /* PB1 */ | ||
| 26 | unsigned s:2; /* scan information */ | ||
| 27 | unsigned b:2; /* bar info data valid */ | ||
| 28 | unsigned a:1; /* active info present */ | ||
| 29 | unsigned y:2; /* RGB or YCbCr */ | ||
| 30 | unsigned res1:1; | ||
| 31 | |||
| 32 | /* PB2 */ | ||
| 33 | unsigned r:4; /* active format aspect ratio */ | ||
| 34 | unsigned m:2; /* picture aspect ratio */ | ||
| 35 | unsigned c:2; /* colorimetry */ | ||
| 36 | |||
| 37 | /* PB3 */ | ||
| 38 | unsigned sc:2; /* scan information */ | ||
| 39 | unsigned q:2; /* quantization range */ | ||
| 40 | unsigned ec:3; /* extended colorimetry */ | ||
| 41 | unsigned itc:1; /* it content */ | ||
| 42 | |||
| 43 | /* PB4 */ | ||
| 44 | unsigned vic:7; /* video format id code */ | ||
| 45 | unsigned res4:1; | ||
| 46 | |||
| 47 | /* PB5 */ | ||
| 48 | unsigned pr:4; /* pixel repetition factor */ | ||
| 49 | unsigned cn:2; /* it content type*/ | ||
| 50 | unsigned yq:2; /* ycc quantization range */ | ||
| 51 | |||
| 52 | /* PB6-7 */ | ||
| 53 | u16 top_bar_end_line; | ||
| 54 | |||
| 55 | /* PB8-9 */ | ||
| 56 | u16 bot_bar_start_line; | ||
| 57 | |||
| 58 | /* PB10-11 */ | ||
| 59 | u16 left_bar_end_pixel; | ||
| 60 | |||
| 61 | /* PB12-13 */ | ||
| 62 | u16 right_bar_start_pixel; | ||
| 63 | } __packed; | ||
| 64 | |||
| 65 | #define HDMI_AVI_VERSION 0x02 | ||
| 66 | |||
| 67 | #define HDMI_AVI_Y_RGB 0x0 | ||
| 68 | #define HDMI_AVI_Y_YCBCR_422 0x1 | ||
| 69 | #define HDMI_AVI_Y_YCBCR_444 0x2 | ||
| 70 | |||
| 71 | #define HDMI_AVI_B_VERT 0x1 | ||
| 72 | #define HDMI_AVI_B_HORIZ 0x2 | ||
| 73 | |||
| 74 | #define HDMI_AVI_S_NONE 0x0 | ||
| 75 | #define HDMI_AVI_S_OVERSCAN 0x1 | ||
| 76 | #define HDMI_AVI_S_UNDERSCAN 0x2 | ||
| 77 | |||
| 78 | #define HDMI_AVI_C_NONE 0x0 | ||
| 79 | #define HDMI_AVI_C_SMPTE 0x1 | ||
| 80 | #define HDMI_AVI_C_ITU_R 0x2 | ||
| 81 | #define HDMI_AVI_C_EXTENDED 0x4 | ||
| 82 | |||
| 83 | #define HDMI_AVI_M_4_3 0x1 | ||
| 84 | #define HDMI_AVI_M_16_9 0x2 | ||
| 85 | |||
| 86 | #define HDMI_AVI_R_SAME 0x8 | ||
| 87 | #define HDMI_AVI_R_4_3_CENTER 0x9 | ||
| 88 | #define HDMI_AVI_R_16_9_CENTER 0xa | ||
| 89 | #define HDMI_AVI_R_14_9_CENTER 0xb | ||
| 90 | |||
| 91 | /* all fields little endian */ | ||
| 92 | struct hdmi_audio_infoframe { | ||
| 93 | /* PB0 */ | ||
| 94 | u8 csum; | ||
| 95 | |||
| 96 | /* PB1 */ | ||
| 97 | unsigned cc:3; /* channel count */ | ||
| 98 | unsigned res1:1; | ||
| 99 | unsigned ct:4; /* coding type */ | ||
| 100 | |||
| 101 | /* PB2 */ | ||
| 102 | unsigned ss:2; /* sample size */ | ||
| 103 | unsigned sf:3; /* sample frequency */ | ||
| 104 | unsigned res2:3; | ||
| 105 | |||
| 106 | /* PB3 */ | ||
| 107 | unsigned cxt:5; /* coding extention type */ | ||
| 108 | unsigned res3:3; | ||
| 109 | |||
| 110 | /* PB4 */ | ||
| 111 | u8 ca; /* channel/speaker allocation */ | ||
| 112 | |||
| 113 | /* PB5 */ | ||
| 114 | unsigned res5:3; | ||
| 115 | unsigned lsv:4; /* level shift value */ | ||
| 116 | unsigned dm_inh:1; /* downmix inhibit */ | ||
| 117 | |||
| 118 | /* PB6-10 reserved */ | ||
| 119 | u8 res6; | ||
| 120 | u8 res7; | ||
| 121 | u8 res8; | ||
| 122 | u8 res9; | ||
| 123 | u8 res10; | ||
| 124 | } __packed; | ||
| 125 | |||
| 126 | #define HDMI_AUDIO_VERSION 0x01 | ||
| 127 | |||
| 128 | #define HDMI_AUDIO_CC_STREAM 0x0 /* specified by audio stream */ | ||
| 129 | #define HDMI_AUDIO_CC_2 0x1 | ||
| 130 | #define HDMI_AUDIO_CC_3 0x2 | ||
| 131 | #define HDMI_AUDIO_CC_4 0x3 | ||
| 132 | #define HDMI_AUDIO_CC_5 0x4 | ||
| 133 | #define HDMI_AUDIO_CC_6 0x5 | ||
| 134 | #define HDMI_AUDIO_CC_7 0x6 | ||
| 135 | #define HDMI_AUDIO_CC_8 0x7 | ||
| 136 | |||
| 137 | #define HDMI_AUDIO_CT_STREAM 0x0 /* specified by audio stream */ | ||
| 138 | #define HDMI_AUDIO_CT_PCM 0x1 | ||
| 139 | #define HDMI_AUDIO_CT_AC3 0x2 | ||
| 140 | #define HDMI_AUDIO_CT_MPEG1 0x3 | ||
| 141 | #define HDMI_AUDIO_CT_MP3 0x4 | ||
| 142 | #define HDMI_AUDIO_CT_MPEG2 0x5 | ||
| 143 | #define HDMI_AUDIO_CT_AAC_LC 0x6 | ||
| 144 | #define HDMI_AUDIO_CT_DTS 0x7 | ||
| 145 | #define HDMI_AUDIO_CT_ATRAC 0x8 | ||
| 146 | #define HDMI_AUDIO_CT_DSD 0x9 | ||
| 147 | #define HDMI_AUDIO_CT_E_AC3 0xa | ||
| 148 | #define HDMI_AUDIO_CT_DTS_HD 0xb | ||
| 149 | #define HDMI_AUDIO_CT_MLP 0xc | ||
| 150 | #define HDMI_AUDIO_CT_DST 0xd | ||
| 151 | #define HDMI_AUDIO_CT_WMA_PRO 0xe | ||
| 152 | #define HDMI_AUDIO_CT_CXT 0xf | ||
| 153 | |||
| 154 | #define HDMI_AUDIO_SF_STREAM 0x0 /* specified by audio stream */ | ||
| 155 | #define HDMI_AUIDO_SF_32K 0x1 | ||
| 156 | #define HDMI_AUDIO_SF_44_1K 0x2 | ||
| 157 | #define HDMI_AUDIO_SF_48K 0x3 | ||
| 158 | #define HDMI_AUDIO_SF_88_2K 0x4 | ||
| 159 | #define HDMI_AUDIO_SF_96K 0x5 | ||
| 160 | #define HDMI_AUDIO_SF_176_4K 0x6 | ||
| 161 | #define HDMI_AUDIO_SF_192K 0x7 | ||
| 162 | |||
| 163 | #define HDMI_AUDIO_SS_STREAM 0x0 /* specified by audio stream */ | ||
| 164 | #define HDMI_AUDIO_SS_16BIT 0x1 | ||
| 165 | #define HDMI_AUDIO_SS_20BIT 0x2 | ||
| 166 | #define HDMI_AUDIO_SS_24BIT 0x3 | ||
| 167 | |||
| 168 | #define HDMI_AUDIO_CXT_CT 0x0 /* refer to coding in CT */ | ||
| 169 | #define HDMI_AUDIO_CXT_HE_AAC 0x1 | ||
| 170 | #define HDMI_AUDIO_CXT_HE_AAC_V2 0x2 | ||
| 171 | #define HDMI_AUDIO_CXT_MPEG_SURROUND 0x3 | ||
| 172 | |||
| 173 | /* all fields little endian */ | ||
| 174 | struct hdmi_stereo_infoframe { | ||
| 175 | /* PB0 */ | ||
| 176 | u8 csum; | ||
| 177 | |||
| 178 | /* PB1 */ | ||
| 179 | u8 regid0; | ||
| 180 | |||
| 181 | /* PB2 */ | ||
| 182 | u8 regid1; | ||
| 183 | |||
| 184 | /* PB3 */ | ||
| 185 | u8 regid2; | ||
| 186 | |||
| 187 | /* PB4 */ | ||
| 188 | unsigned res1:5; | ||
| 189 | unsigned hdmi_video_format:3; | ||
| 190 | |||
| 191 | /* PB5 */ | ||
| 192 | unsigned res2:4; | ||
| 193 | unsigned _3d_structure:4; | ||
| 194 | |||
| 195 | /* PB6*/ | ||
| 196 | unsigned res3:4; | ||
| 197 | unsigned _3d_ext_data:4; | ||
| 198 | } __packed; | ||
| 199 | |||
| 200 | #define HDMI_VENDOR_VERSION 0x01 | ||
| 201 | |||
| 202 | /* register definitions */ | 13 | /* register definitions */ |
| 203 | #define HDMI_CTXSW 0x00 | 14 | #define HDMI_CTXSW 0x00 |
| 204 | 15 | ||
