[Intel-gfx] [Patch 3/3_v2]: [DRM/I915] : Sync the default modes for LVDS output device

yakui_zhao yakui.zhao at intel.com
Mon Mar 23 04:30:31 CET 2009


Subject: [DRM/I915]: Sync the default modes for LVDS output device
From: Zhao Yakui <yakui.zhao at intel.com>

Sync the default modes for the LVDS output device
    This covers:
    Add the default modes for the LVDS output device.
    The bit of edid->feature.msc indicates whether the display device is not
continous-frequency. And it is used to determine whether the default modes will
be added to the output device.
    But for the LVDS output device the edid->feature.msc will always be set.Even
when there is no edid, the correponding bit in the fake edid will be set.
In such case the default modes will be added to LVDS output device.
    If not, the different modes are obtained by using KMS/UMS.

Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
---
 drivers/gpu/drm/i915/intel_lvds.c |  425 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 416 insertions(+), 9 deletions(-)

Index: linux-2.6/drivers/gpu/drm/i915/intel_lvds.c
===================================================================
--- linux-2.6.orig/drivers/gpu/drm/i915/intel_lvds.c	2009-03-23 11:19:40.000000000 +0800
+++ linux-2.6/drivers/gpu/drm/i915/intel_lvds.c	2009-03-23 11:25:28.000000000 +0800
@@ -36,6 +36,381 @@
 #include "intel_drv.h"
 #include "i915_drm.h"
 #include "i915_drv.h"
+/*
+ * the default modes, which is based on the file of
+ * xserver/xfree86/common/xf86DefModeSet.c.
+ */
+static struct drm_display_mode default_modes[] = {
+	/* 640x350 at 85Hz */
+	{ DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
+		   736, 832, 0, 350, 382, 385, 445, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 320x175 at 85Hz */
+	{ DRM_MODE("320x175", DRM_MODE_TYPE_DRIVER, 15750, 320, 336,
+		   368, 416, 0, 175, 191, 192, 222, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 640x400 at 85Hz */
+	{ DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
+		   736, 832, 0, 400, 401, 405, 445, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 320x200 at 85Hz */
+	{ DRM_MODE("320x200", DRM_MODE_TYPE_DRIVER, 15750, 320, 336,
+		   368, 416, 0, 200, 200, 202, 222, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 720x400 at 85Hz */
+	{ DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 756,
+		   828, 936, 0, 400, 401, 405, 446, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 360x200 at 85Hz */
+	{ DRM_MODE("360x200", DRM_MODE_TYPE_DRIVER, 17750, 360, 378,
+		   414, 468, 0, 200, 200, 202, 223, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 640x480 at 60Hz */
+	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 600, 656,
+		   752, 800, 0, 480, 490, 492, 525, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 320x240 at 60Hz */
+	{ DRM_MODE("320x240", DRM_MODE_TYPE_DRIVER, 12587, 320, 328,
+		   376, 400, 0, 240, 245, 246, 262, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 640x480 at 72Hz */
+	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
+		   704, 832, 0, 480, 489, 492, 520, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 320x240 at 72Hz */
+	{ DRM_MODE("320x240", DRM_MODE_TYPE_DRIVER, 15750, 320, 332,
+		   352, 416, 0, 240, 244, 246, 260, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 640x480 at 75Hz */
+	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656,
+		   720, 840, 0, 480, 481, 484, 500, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 320x240 at 75Hz */
+	{ DRM_MODE("320x240", DRM_MODE_TYPE_DRIVER, 15750, 320, 328,
+		   360, 420, 0, 240, 240, 242, 250, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 640x480 at 85Hz */
+	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 36000, 640, 696,
+		   752, 832, 0, 480, 481, 484, 509, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 320x240 at 85Hz */
+	{ DRM_MODE("320x240", DRM_MODE_TYPE_DRIVER, 18000, 320, 348,
+		   376, 416, 0, 240, 240, 242, 254, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 800x600 at 56Hz */
+	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 36000, 800, 824,
+		   968, 1024, 0, 600, 601, 603, 625, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 400x300 at 56Hz */
+	{ DRM_MODE("400x300", DRM_MODE_TYPE_DRIVER, 18000, 400, 412,
+		   484, 512, 0, 300, 300, 301, 312, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 800x600 at 60Hz */
+	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
+		   968, 1056, 0, 600, 601, 605,  628, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 400x300 at 60Hz */
+	{ DRM_MODE("400x300", DRM_MODE_TYPE_DRIVER, 20000, 400, 426,
+		   484, 528, 0, 300, 300, 302, 314, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 800x600 at 72Hz */
+	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 50000, 800, 856,
+		   976, 1040, 0, 600, 637, 643, 666, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 400x300 at 72Hz */
+	{ DRM_MODE("400x300", DRM_MODE_TYPE_DRIVER, 25000, 400, 428,
+		   488, 520, 0, 300, 318, 321, 333, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 800x600 at 75Hz */
+	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 49500, 800, 816,
+		   896, 1056, 0, 600, 601, 604, 625, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 400x300 at 75Hz */
+	{ DRM_MODE("400x300", DRM_MODE_TYPE_DRIVER, 24750, 400, 408,
+		   448, 528, 0, 300, 300, 302, 312, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 800x600 at 85Hz */
+	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 56300, 800, 832,
+		   896, 1048, 0, 600, 601, 604,  631, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 400x300 at 85Hz */
+	{ DRM_MODE("400x300", DRM_MODE_TYPE_DRIVER, 28150, 400, 416,
+		   448, 524, 0, 300, 300, 302, 315, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1024x768 at 43Hz */
+	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032,
+		   1208, 1264, 0, 768, 768, 776,  817, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 512x384 at 43Hz */
+	{ DRM_MODE("512x384", DRM_MODE_TYPE_DRIVER, 22450, 512, 516,
+		   604, 632, 0, 384, 384, 388, 408, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1024x768 at 60Hz */
+	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
+		   1184, 1344, 0, 768, 771, 777, 806, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 512x384 at 60Hz */
+	{ DRM_MODE("512x384", DRM_MODE_TYPE_DRIVER, 32500, 512, 524,
+		   592, 672, 0, 384, 385, 388, 403, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1024x768 at 70Hz */
+	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1020, 1048,
+		   1184, 1328, 0, 768, 771, 777, 806, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 512x384 at 70Hz */
+	{ DRM_MODE("512x384", DRM_MODE_TYPE_DRIVER, 37500, 510, 524,
+		   592, 664, 0, 384, 385, 388, 403, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1024x768 at 75Hz */
+	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040,
+		   1136, 1312, 0, 768, 769, 772, 800, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 512x384 at 75Hz */
+	{ DRM_MODE("512x384", DRM_MODE_TYPE_DRIVER, 39375, 512, 520,
+		   568, 656, 0, 384, 384, 386, 400, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1024x768 at 85Hz */
+	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 94500, 1024, 1072,
+		   1168, 1376, 0, 768, 769, 772, 808, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 512x384 at 85Hz */
+	{ DRM_MODE("512x384", DRM_MODE_TYPE_DRIVER, 47250, 512, 536,
+		   584, 688, 0, 384, 384, 386, 404, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1152x864 at 75Hz */
+	{ DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216,
+		   1344, 1600, 0, 864, 865, 868, 900, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 576x432 at 85Hz */
+	{ DRM_MODE("576x432", DRM_MODE_TYPE_DRIVER, 54000, 576, 608,
+		   672, 800, 0, 432, 432, 434, 450, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1280x960 at 60Hz */
+	{ DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1376,
+		   1488, 1800, 0, 960, 961, 964, 1000, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 1280x960 at 60Hz */
+	{ DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 540000, 640, 684,
+		   744, 900, 0, 480, 480, 482, 500, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1280x960 at 85Hz */
+	{ DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1344,
+		   1504, 1728, 0, 960, 961, 964,  1011, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 1280x960 at 85Hz */
+	{ DRM_MODE("1280x960", DRM_MODE_TYPE_DRIVER, 74250, 640, 672,
+		   752, 864, 0, 480, 480, 482, 505, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1280x1024 at 60Hz */
+	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1328,
+		   1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 640x512 at 60Hz */
+	{ DRM_MODE("640x512", DRM_MODE_TYPE_DRIVER, 54000, 640, 664,
+		   720, 744, 0, 512, 512, 514, 533, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1280x1024 at 75Hz */
+	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296,
+		   1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 640x512 at 75Hz */
+	{ DRM_MODE("640x512", DRM_MODE_TYPE_DRIVER, 67500, 640, 648,
+		   720, 844, 0, 512, 512, 514, 533, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1280x1024 at 85Hz */
+	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 157500, 1280, 1344,
+		   1504, 1728, 0, 1024, 1025, 1028, 1072, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 640x512 at 85Hz */
+	{ DRM_MODE("640x512", DRM_MODE_TYPE_DRIVER, 78750, 640, 672,
+		   752, 864, 0, 512, 512, 514, 536, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1600x1200 at 60Hz */
+	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 162000, 1600, 1664,
+		   1854, 2160, 0, 1200, 1201, 1205, 1250, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 800x600 at 60Hz */
+	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 81000, 800, 832,
+		   928, 1080, 0, 600, 600, 602, 625, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1600x1200 at 65Hz */
+	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 175500, 1600, 1664,
+		   1854, 2160, 0, 1200, 1201, 1205, 1250, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 800x600 at 65Hz */
+	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 87750, 800, 832,
+		   928, 1080, 0, 600, 600, 602, 625, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1600x1200 at 70Hz */
+	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 189000, 1600, 1664,
+		   1854, 2160, 0, 1200, 1201, 1205, 1250, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 800x600 at 70Hz */
+	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 94500, 800, 832,
+		   928, 1080, 0, 600, 600, 602, 625, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1600x1200 at 75Hz */
+	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 202500, 1600, 1664,
+		   1854, 2160, 0, 1200, 1201, 1205, 1250, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 800x600 at 75Hz */
+	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 101250, 800, 832,
+		   928, 1080, 0, 600, 600, 602, 625, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1600x1200 at 85Hz */
+	{ DRM_MODE("1600x1200", DRM_MODE_TYPE_DRIVER, 229500, 1600, 1664,
+		   1854, 2160, 0, 1200, 1201, 1205, 1250, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 800x600 at 85Hz */
+	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 114750, 800, 832,
+		   928, 1080, 0, 600, 600, 602, 625, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1792x1344 at 60Hz */
+	{ DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 204800, 1792, 1920,
+		   2104, 2448, 0, 1344, 1345, 1348, 1394, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 896x672 at 60Hz */
+	{ DRM_MODE("896x672", DRM_MODE_TYPE_DRIVER, 102400, 896, 960,
+		   1052, 1224, 0, 672, 672, 674, 697, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1792x1344 at 75Hz */
+	{ DRM_MODE("1792x1344", DRM_MODE_TYPE_DRIVER, 261000, 1792, 1888,
+		   2104, 2456, 0, 1344, 1345, 1348, 1417, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 896x672 at 75Hz */
+	{ DRM_MODE("896x672", DRM_MODE_TYPE_DRIVER, 130500, 896, 944,
+		   1052, 1228, 0, 672, 672, 674, 708, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1856x1392 at 60Hz */
+	{ DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 218300, 1856, 1952,
+		   2176, 2528, 0, 1392, 1393, 1396, 1439, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 928x696 at 60Hz */
+	{ DRM_MODE("928x696", DRM_MODE_TYPE_DRIVER, 109150, 928, 976,
+		   1088, 1264, 0, 696, 696, 698, 719, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1856x1392 at 75Hz */
+	{ DRM_MODE("1856x1392", DRM_MODE_TYPE_DRIVER, 288000, 1792, 1984,
+		   2208, 2560, 0, 1392, 1393, 1396, 1500, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 928x696 at 75Hz */
+	{ DRM_MODE("928x696", DRM_MODE_TYPE_DRIVER, 144000, 896, 992,
+		   1104, 1280, 0, 696, 696, 698, 750, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1920x1440 at 60Hz */
+	{ DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 234000, 1920, 2048,
+		   2256, 2600, 0, 1440, 1441, 1444, 1500, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 960x720 at 60Hz */
+	{ DRM_MODE("960x720", DRM_MODE_TYPE_DRIVER, 117000, 960, 1024,
+		   1128, 1300, 0, 720, 720, 722, 750, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 1920x1440 at 75Hz */
+	{ DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2064,
+		   2288, 2640, 0, 1440, 1441, 1444, 1500, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 960x720 at 75Hz */
+	{ DRM_MODE("960x720", DRM_MODE_TYPE_DRIVER, 148500, 960, 1032,
+		   1144, 1320, 0, 720, 720, 722, 750, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* 832x624 at 75Hz (fix if the official/Apple spec is different) */
+	{ DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 57284, 832, 864,
+		   928, 1152, 0, 624, 625, 628, 667, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* 416x312 at 75Hz (fix if the official/Apple spec is different) */
+	{ DRM_MODE("416x312", DRM_MODE_TYPE_DRIVER, 28642, 416, 432,
+		   464, 576, 0, 312, 312, 314, 333, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* vesa GTF 1400x1050 at 60Hz */
+	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 122200, 1400, 1488,
+		   1640, 1880, 0, 1050, 1052, 1064, 1082, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* vesa GTF 700x525 at 60Hz */
+	{ DRM_MODE("700x525", DRM_MODE_TYPE_DRIVER, 61100, 700, 744,
+		   820, 940, 0, 525, 526, 532, 541, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* vesa GTF 1400x1050 at 75Hz */
+	{ DRM_MODE("1400x1050", DRM_MODE_TYPE_DRIVER, 155800, 1400, 1464,
+		   1784, 1912, 0, 1050, 1052, 1064, 1090, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* vesa GTF 700x525 at 75Hz */
+	{ DRM_MODE("700x525", DRM_MODE_TYPE_DRIVER, 77900, 700, 732,
+		   892, 956, 0, 525, 526, 532, 545, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* vesa GTF 1920x1440 at 85Hz */
+	{ DRM_MODE("1920x1440", DRM_MODE_TYPE_DRIVER, 341350, 1920, 2072,
+		   2288, 2656, 0, 1440, 1441, 1444, 1512, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* vesa GFT 960x720 at 85Hz */
+	{ DRM_MODE("960x720", DRM_MODE_TYPE_DRIVER, 170675, 960, 1036,
+		   1144, 1328, 0, 720, 720, 722, 756, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* vesa GTF 2048x1536 at 60Hz */
+	{ DRM_MODE("2048x1536", DRM_MODE_TYPE_DRIVER, 266950, 2048, 2200,
+		   2424, 2800, 0, 1536, 1537, 1540, 1589, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* vesa GTF 1024x768 at 60Hz */
+	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 133475, 1024, 1100,
+		   1212, 1400, 0, 768, 768, 770, 794, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* vesa GTF 2048x1536 at 75Hz */
+	{ DRM_MODE("2048x1536", DRM_MODE_TYPE_DRIVER, 340480, 2048, 2216,
+		   2440, 2832, 0, 1536, 1537, 1540, 1603, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* vesa GTF 1024x768 at 75Hz */
+	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 170240, 1024, 1108,
+		   1220, 1416, 0, 768, 768, 770, 801, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+	/* vesa GTF 2048x1536 at 85Hz */
+	{ DRM_MODE("2048x1536", DRM_MODE_TYPE_DRIVER, 388040, 2048, 2216,
+		   2440, 2832, 0, 1536, 1537, 1540, 1612, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+	/* vesa GTF 1024x768 at 85Hz */
+	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 194020, 1024, 1108,
+		   1220, 1416, 0, 768, 768, 770, 806, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+					DRM_MODE_FLAG_DBLSCAN) },
+};
 
 /*
  * the following four scaling options are defined.
@@ -488,6 +863,22 @@
 }
 
 /**
+ * Add the default mode to mode list of connector.
+ */
+static int lvds_add_default_modes(struct drm_connector *connector)
+{
+	int i, num_modes = 0;
+	struct drm_device *dev = connector->dev;
+	num_modes = sizeof(default_modes)/sizeof(struct drm_display_mode);
+	for (i = 0; i < num_modes; i++) {
+		struct drm_display_mode *mode;
+
+		mode = drm_mode_duplicate(dev, &default_modes[i]);
+		drm_mode_probed_add(connector, mode);
+	}
+	return num_modes;
+}
+/**
  * Return the list of DDC modes if available, or the BIOS fixed mode otherwise.
  */
 static int intel_lvds_get_modes(struct drm_connector *connector)
@@ -495,13 +886,25 @@
 	struct drm_device *dev = connector->dev;
 	struct intel_output *intel_output = to_intel_output(connector);
 	struct drm_i915_private *dev_priv = dev->dev_private;
-	int ret = 0;
-
-	ret = intel_ddc_get_modes(intel_output);
-
-	if (ret)
-		return ret;
+	int ddc_ret = 0, num_modes = 0;
 
+	ddc_ret = intel_ddc_get_modes(intel_output);
+	/*
+	 * When there exists the EDID info, the bit of feature.msc will always
+	 * be set.
+	 * It seems that bit of feature.msc will also be set even when the
+	 * bogus edid_mon is constructed in 2D driver.
+	 * So in such case the default mode will be added.
+	 */
+	if (ddc_ret) {
+		/*
+		 * If the mode can be parsed from the EDID info, we will try
+		 * to add the default mode
+		 */
+		num_modes = lvds_add_default_modes(connector);
+		num_modes += ddc_ret;
+		return num_modes;
+	}
 	/* Didn't get an EDID, so
 	 * Set wide sync ranges so we get all modes
 	 * handed to valid_mode for checking
@@ -516,10 +919,14 @@
 
 		mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode);
 		drm_mode_probed_add(connector, mode);
-
-		return 1;
+		num_modes = lvds_add_default_modes(connector);
+		num_modes++;
+		return num_modes;
 	}
-
+	/*
+	 * If there is no panel_fix_mode, the default mode won't be added to
+	 * the mode list. And the number will be zero
+	 */
 	return 0;
 }
 





More information about the Intel-gfx mailing list