[PATCH 7/7] drm/edid: Add modes from CEA short video descriptor codes

Adam Jackson ajax at redhat.com
Tue Aug 3 11:38:22 PDT 2010


Signed-off-by: Adam Jackson <ajax at redhat.com>
---
 drivers/gpu/drm/drm_edid.c       |  188 +++++++++++++++++++---------
 drivers/gpu/drm/drm_edid_modes.h |  260 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 389 insertions(+), 59 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 817ffab..44fd754 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1223,53 +1223,23 @@ add_cvt_modes(struct drm_connector *connector, struct edid *edid)
 	return closure.modes;
 }
 
-static void
-do_detailed_mode(struct detailed_timing *timing, void *c)
+/* XXX assumes there's only one */
+static u8 *
+find_cea_block(struct edid *edid)
 {
-	struct detailed_mode_closure *closure = c;
-	struct drm_display_mode *newmode;
-
-	if (timing->pixel_clock) {
-		newmode = drm_mode_detailed(closure->connector->dev,
-					    closure->edid, timing,
-					    closure->quirks);
-		if (!newmode)
-			return;
+	int i;
+	u8 *ret;
 
-		if (closure->preferred)
-			newmode->type |= DRM_MODE_TYPE_PREFERRED;
+	if (!edid)
+		return NULL;
 
-		drm_mode_probed_add(closure->connector, newmode);
-		closure->modes++;
-		closure->preferred = 0;
+	for (i = 0; i < edid->extensions; i++) {
+		ret = (u8 *)edid + EDID_LENGTH * (i + 1);
+		if (ret[0] == CEA_EXT)
+			return ret;
 	}
-}
-
-/*
- * add_detailed_modes - Add modes from detailed timings
- * @connector: attached connector
- * @edid: EDID block to scan
- * @quirks: quirks to apply
- */
-static int
-add_detailed_modes(struct drm_connector *connector, struct edid *edid,
-		   u32 quirks)
-{
-	struct detailed_mode_closure closure = {
-		connector,
-		edid,
-		1,
-		quirks,
-		0
-	};
-
-	if (closure.preferred && !version_greater(edid, 1, 3))
-		closure.preferred =
-		    (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
-
-	drm_for_each_detailed_block((u8 *)edid, do_detailed_mode, &closure);
 
-	return closure.modes;
+	return NULL;
 }
 
 #define HDMI_IDENTIFIER 0x000C03
@@ -1283,25 +1253,13 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
  */
 bool drm_detect_hdmi_monitor(struct edid *edid)
 {
-	char *edid_ext = NULL;
+	u8 *edid_ext = NULL;
 	int i, hdmi_id;
 	int start_offset, end_offset;
 	bool is_hdmi = false;
 
-	/* No EDID or EDID extensions */
-	if (edid == NULL || edid->extensions == 0)
-		goto end;
-
-	/* Find CEA extension */
-	for (i = 0; i < edid->extensions; i++) {
-		edid_ext = (char *)edid + EDID_LENGTH * (i + 1);
-		/* This block is CEA extension */
-		if (edid_ext[0] == 0x02)
-			break;
-	}
-
-	if (i == edid->extensions)
-		goto end;
+	if (!(edid_ext = find_cea_block(edid)))
+		return false;
 
 	/* Data block offset in CEA extension block */
 	start_offset = 4;
@@ -1325,11 +1283,116 @@ bool drm_detect_hdmi_monitor(struct edid *edid)
 		}
 	}
 
-end:
 	return is_hdmi;
 }
 EXPORT_SYMBOL(drm_detect_hdmi_monitor);
 
+static int
+add_cea_modes(struct drm_connector *connector, struct edid *edid)
+{
+	u8 *block = find_cea_block(edid);
+	u8 *b, *end;
+	int modes = 0;
+
+	if (!block)
+		return 0;
+
+	if (block[0x01] < 3)
+		return 0; /* SVDs not specified yet */
+
+	b = block;
+	end = block + block[0x02];
+
+	while (b < end) {
+		u8 header = *b;
+		u8 length = header & 0x1f;
+		u8 tag = (header & 0xe0) >> 5;
+
+		if (tag == 2) {
+			int i, m;
+			struct drm_display_mode *mode, *newmode;
+			for (i = 1; i <= length; i++) {
+				m = b[i] & 0x7f;
+				if (m > cea_num_modes) /* XXX warn */
+					continue;
+
+				/*
+				 * Don't add modes that require pixel repeat,
+				 * yet. The driver needs to be aware of this
+				 * and we don't have a mechanism for that.
+				 *
+				 * This prunes some modes that don't need 
+				 * repeat; oh well.
+				 */
+				mode = &cea_modes[m];
+				if (mode->hdisplay == 1440 ||
+				    mode->hdisplay == 2880)
+					continue;
+
+				newmode = drm_mode_duplicate(connector->dev,
+							     &cea_modes[m]);
+				if (newmode) {
+					drm_mode_probed_add(connector, newmode);
+					modes++;
+				}
+			}
+		}
+
+		b += length;
+	}
+
+	return modes;
+}
+
+static void
+do_detailed_mode(struct detailed_timing *timing, void *c)
+{
+	struct detailed_mode_closure *closure = c;
+	struct drm_display_mode *newmode;
+
+	if (timing->pixel_clock) {
+		newmode = drm_mode_detailed(closure->connector->dev,
+					    closure->edid, timing,
+					    closure->quirks);
+		if (!newmode)
+			return;
+
+		if (closure->preferred)
+			newmode->type |= DRM_MODE_TYPE_PREFERRED;
+
+		drm_mode_probed_add(closure->connector, newmode);
+		closure->modes++;
+		closure->preferred = 0;
+	}
+}
+
+/*
+ * add_detailed_modes - Add modes from detailed timings
+ * @connector: attached connector
+ * @edid: EDID block to scan
+ * @quirks: quirks to apply
+ */
+static int
+add_detailed_modes(struct drm_connector *connector, struct edid *edid,
+		   u32 quirks)
+{
+	struct detailed_mode_closure closure = {
+		connector,
+		edid,
+		1,
+		quirks,
+		0
+	};
+
+	if (closure.preferred && !version_greater(edid, 1, 3))
+		closure.preferred =
+		    (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
+
+	drm_for_each_detailed_block((u8 *)edid, do_detailed_mode, &closure);
+
+	return closure.modes;
+}
+
 /**
  * drm_add_edid_modes - add modes from EDID data, if available
  * @connector: connector we're probing
@@ -1367,9 +1430,16 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
 	 *
 	 * We get this pretty much right.
 	 *
-	 * XXX order for additional mode types in extension blocks?
+	 * CEA defines "short video descriptors" but is not especially clear
+	 * what their priority is.  Depending how you read it, all of:
+	 * - the first detailed timing in base block
+	 * - the first short video descriptor
+	 * - any short video descriptors with a preferred bit set
+	 * are "preferred".  Thanks for that.  We'll assume they all come
+	 * after detailed timings but before CVT timings.
 	 */
 	num_modes += add_detailed_modes(connector, edid, quirks);
+	num_modes += add_cea_modes(connector, edid);
 	num_modes += add_cvt_modes(connector, edid);
 	num_modes += add_standard_modes(connector, edid);
 	num_modes += add_established_modes(connector, edid);
diff --git a/drivers/gpu/drm/drm_edid_modes.h b/drivers/gpu/drm/drm_edid_modes.h
index 19690cd..f83953f 100644
--- a/drivers/gpu/drm/drm_edid_modes.h
+++ b/drivers/gpu/drm/drm_edid_modes.h
@@ -466,3 +466,263 @@ static const struct {
 	{ 1920, 1440, 75, 0 },
 };
 static const int num_est3_modes = sizeof(est3_modes) / sizeof(est3_modes[0]);
+
+static struct drm_display_mode cea_modes[] = {
+	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175,
+		   640, 656, 752, 800, 0,
+		   480, 490, 492, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 1:640x480 at 60Hz */
+	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000,
+		   720, 736, 798, 858, 0,
+		   480, 489, 495, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 2:720x480 at 60Hz */
+	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000,
+		   720, 736, 798, 858, 0,
+		   480, 489, 495, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 3:720x480 at 60Hz */
+	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250,
+		   1280, 1390, 1430, 1650, 0,
+		   720, 725, 730, 750, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 4: 1280x720 at 60Hz */
+	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250,
+		   1920, 2008, 2052, 2200, 0,
+		   1080, 1084, 1094, 1125, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 5:1920x1080i at 60Hz */
+	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000,
+		   1440, 1478, 1602, 1716, 0,
+		   480, 488, 494, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 6:1440x480i at 60Hz */
+	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000,
+		   1440, 1478, 1602, 1716, 0,
+		   480, 488, 494, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 7:1440x480i at 60Hz */
+	{ DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000,
+		   1440, 1478, 1602, 1716, 0,
+		   240, 244, 247, 262, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 8:1440x240 at 60Hz */
+	{ DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000,
+		   1440, 1478, 1602, 1716, 0,
+		   240, 244, 247, 262, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 9:1440x240 at 60Hz */
+	{ DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000,
+		   2880, 2956, 3204, 3432, 0,
+		   480, 488, 494, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 10:2880x480i at 60Hz */
+	{ DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000,
+		   2880, 2956, 3204, 3432, 0,
+		   480, 488, 494, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 11:2880x480i at 60Hz */
+	{ DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000,
+		   2880, 2956, 3204, 3432, 0,
+		   240, 244, 247, 262, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 12:2880x240 at 60Hz */
+	{ DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000,
+		   2880, 2956, 3204, 3432, 0,
+		   240, 244, 247, 262, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 13:2880x240 at 60Hz */
+	{ DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000,
+		   1440, 1472, 1596, 1716, 0,
+		   480, 489, 495, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 14:1440x480 at 60Hz */
+	{ DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000,
+		   1440, 1472, 1596, 1716, 0,
+		   480, 489, 495, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 15:1440x480 at 60Hz */
+	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500,
+		   1920, 2008, 2052, 2200, 0,
+		   1080, 1084, 1089, 1125, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 16:1920x1080 at 60Hz */
+	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000,
+		   720, 732, 796, 864, 0,
+		   576, 581, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 17:720x576 at 50Hz */
+	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000,
+		   720, 732, 796, 864, 0,
+		   576, 581, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 18:720x576 at 50Hz */
+	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250,
+		   1280, 1720, 1760, 1980, 0,
+		   720, 725, 730, 750, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 19: 1280x720 at 50Hz */
+	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250,
+		   1920, 2448, 2492, 2640, 0,
+		   1080, 1084, 1094, 1125, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 20:1920x1080i at 50Hz */
+	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000,
+		   1440, 1464, 1590, 1728, 0,
+		   576, 580, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 21:1440x576i at 50Hz */
+	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000,
+		   1440, 1464, 1590, 1728, 0,
+		   576, 580, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 22:1440x576i at 50Hz */
+	{ DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000,
+		   1440, 1464, 1590, 1728, 0,
+		   288, 290, 293, 312, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 23:1440x288 at 50Hz */
+	{ DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000,
+		   1440, 1464, 1590, 1728, 0,
+		   288, 290, 293, 312, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 24:1440x288 at 50Hz */
+	{ DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000,
+		   2880, 2928, 3180, 3456, 0,
+		   576, 580, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 25:2880x576i at 50Hz */
+	{ DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000,
+		   2880, 2928, 3180, 3456, 0,
+		   576, 580, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 26:2880x576i at 50Hz */
+	{ DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000,
+		   2880, 2928, 3180, 3456, 0,
+		   288, 290, 293, 312, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 27:2880x288 at 50Hz */
+	{ DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000,
+		   2880, 2928, 3180, 3456, 0,
+		   288, 290, 293, 312, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 28:2880x288 at 50Hz */
+	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000,
+		   1440, 1464, 1592, 1728, 0,
+		   576, 581, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 29:1440x576 at 50Hz */
+	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000,
+		   1440, 1464, 1592, 1728, 0,
+		   576, 581, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 30:1440x576 at 50Hz */
+	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500,
+		   1920, 2448, 2492, 2640, 0,
+		   1080, 1084, 1089, 1125, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 31:1920x1080 at 50Hz */
+	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250,
+		   1920, 2558, 2602, 2750, 0,
+		   1080, 1084, 1089, 1125, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 32:1920x1080 at 24Hz */
+	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250,
+		   1920, 2448, 2492, 2640, 0,
+		   1080, 1084, 1089, 1125, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 33:1920x1080 at 25Hz */
+	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250,
+		   1920, 2008, 2052, 2200, 0,
+		   1080, 1084, 1089, 1125, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 34:1920x1080 at 30Hz */
+	{ DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000,
+		   2880, 2944, 3192, 3432, 0,
+		   480, 489, 495, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 35:2880x480 at 60Hz */
+	{ DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000,
+		   2880, 2944, 3192, 3432, 0,
+		   480, 489, 495, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 36:2880x480 at 60Hz */
+	{ DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000,
+		   2880, 2928, 3184, 3456, 0,
+		   576, 581, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 37:2880x576 at 50Hz */
+	{ DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000,
+		   2880, 2928, 3184, 3456, 0,
+		   576, 581, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 38:2880x576 at 50Hz */
+	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000,
+		   1920, 1952, 2120, 2304, 0,
+		   1080, 1126, 1136, 1250, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 39:1920x1080i at 50Hz */
+	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500,
+		   1920, 2448, 2492, 2640, 0,
+		   1080, 1084, 1094, 1125, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 40:1920x1080i at 100Hz */
+	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500,
+		   1280, 1720, 1760, 1980, 0,
+		   720, 725, 730, 750, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 41:1280x720 at 100Hz */
+	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000,
+		   720, 732, 796, 864, 0,
+		   576, 581, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 42:720x576 at 100Hz */
+	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000,
+		   720, 732, 796, 864, 0,
+		   576, 581, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 43:720x576 at 100Hz */
+	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 54000,
+		   1440, 1464, 1590, 1728, 0,
+		   576, 580, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 44:1440x576i at 100Hz */
+	{ DRM_MODE("1400x576i", DRM_MODE_TYPE_DRIVER, 54000,
+		   1440, 1464, 1590, 1728, 0,
+		   576, 580, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 45:1440x576i at 100Hz */
+	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500,
+		   1920, 2008, 2052, 2200, 0,
+		   1080, 1084, 1094, 1125, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE) }, /* VIC 46:1920x1080i at 120Hz */
+	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500,
+		   1280, 1390, 1430, 1650, 0,
+		   720, 725, 730, 750, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 47:1280x720 at 120Hz */
+	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000,
+		   720, 736, 798, 858, 0,
+		   480, 489, 495, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 48:720x480 at 120Hz */
+	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000,
+		   720, 736, 798, 858, 0,
+		   480, 489, 495, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 49:720x480 at 120Hz */
+	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000,
+		   1440, 1478, 1602, 1716, 0,
+		   480, 488, 494, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) },/* VIC 50:1440x480i at 120Hz */
+	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000,
+		   1440, 1478, 1602, 1716, 0,
+		   480, 488, 494, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) },/* VIC 51:1440x480i at 120Hz */
+	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000,
+		   720, 732, 796, 864, 0,
+		   576, 581, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 52:720x576 at 200Hz */
+	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000,
+		   720, 732, 796, 864, 0,
+		   576, 581, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 53:720x576 at 200Hz */
+	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000,
+		   1440, 1464, 1590, 1728, 0,
+		   576, 580, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) },/* VIC 54:1440x576i at 200Hz */
+	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000,
+		   1440, 1464, 1590, 1728, 0,
+		   576, 580, 586, 625, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) },/* VIC 55:1440x576i at 200Hz */
+	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000,
+		   720, 736, 798, 858, 0,
+		   480, 489, 495, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 56:720x480 at 240Hz */
+	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000,
+		   720, 736, 798, 858, 0,
+		   480, 489, 495, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* VIC 57:720x480 at 240Hz */
+	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000,
+		   1440, 1478, 1602, 1716, 0,
+		   480, 488, 494, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) },/* VIC 58:1440x480i at 240 */
+	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000,
+		   1440, 1478, 1602, 1716, 0,
+		   480, 488, 494, 525, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_INTERLACE) },/* VIC 59:1440x480i at 240 */
+	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400,
+		   1280, 3040, 3080, 3300, 0,
+		   720, 725, 730, 750, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 60: 1280x720 at 24Hz */
+	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250,
+		   3700, 3740, 1430, 3960, 0,
+		   720, 725, 730, 750, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 61: 1280x720 at 25Hz */
+	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250,
+		   1280, 3040, 3080, 3300, 0,
+		   720, 725, 730, 750, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 62: 1280x720 at 30Hz */
+	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000,
+		   1920, 2008, 2052, 2200, 0,
+		   1080, 1084, 1089, 1125, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 63: 1920x1080 at 120Hz */
+	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000,
+		   1920, 2448, 2492, 2640, 0,
+		   1080, 1084, 1094, 1125, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* VIC 64:1920x1080 at 100Hz */
+	};
+static const int cea_num_modes = sizeof(cea_modes) / sizeof(cea_modes[0]);
-- 
1.7.2



More information about the dri-devel mailing list