[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