Signed-off-by: Adam Jackson <a...@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:640x...@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:720x...@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:720x...@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: 
1280x...@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:1920x10...@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:1440x4...@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:1440x4...@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:1440x...@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:1440x...@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:2880x4...@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:2880x4...@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:2880x...@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:2880x...@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:1440x...@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:1440x...@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:1920x1...@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:720x...@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:720x...@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: 
1280x...@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:1920x10...@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:1440x5...@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:1440x5...@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:1440x...@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:1440x...@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:2880x5...@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:2880x5...@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:2880x...@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:2880x...@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:1440x...@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:1440x...@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:1920x1...@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:1920x1...@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:1920x1...@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:1920x1...@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:2880x...@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:2880x...@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:2880x...@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:2880x...@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:1920x10...@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:1920x10...@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:1280x...@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:720x...@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:720x...@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:1440x5...@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:1440x5...@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:1920x10...@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:1280x...@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:720x...@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:720x...@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:1440x4...@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:1440x4...@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:720x...@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:720x...@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:1440x5...@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:1440x5...@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:720x...@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:720x...@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:1440x4...@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:1440x4...@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: 
1280x...@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: 
1280x...@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: 
1280x...@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: 
1920x1...@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:1920x1...@100hz */
+       };
+static const int cea_num_modes = sizeof(cea_modes) / sizeof(cea_modes[0]);
-- 
1.7.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to