[Nouveau] [PATCH 5/6] drm: Delete "mandatory" stereographic modes

Alastair Bridgewater alastair.bridgewater at gmail.com
Tue Jan 17 22:42:03 UTC 2017


HDMI specification 1.4a, table 8-15 is very explicitly a "must
support at least one of" table, not a "must support all of" table.
It is not hard to find hardware that does not support some of the
so-called "mandatory" modes.

More seriously, this code generates invalid display modes for both
of the 3D-capable panels that I have (a 42-inch LG TV and a Sony
PlayStation 3D Display).

If we want to be persnickety, one option would be to check the
final list of modes against the table and give some message if
none of them are valid, but it's a whole lot easier just to delete
the code in question.

Signed-off-by: Alastair Bridgewater <alastair.bridgewater at gmail.com>
---
 drivers/gpu/drm/drm_edid.c | 66 ----------------------------------------------
 1 file changed, 66 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 336be31..723116a 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2926,70 +2926,6 @@ do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len)
 	return modes;
 }
 
-struct stereo_mandatory_mode {
-	int width, height, vrefresh;
-	unsigned int flags;
-};
-
-static const struct stereo_mandatory_mode stereo_mandatory_modes[] = {
-	{ 1920, 1080, 24, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
-	{ 1920, 1080, 24, DRM_MODE_FLAG_3D_FRAME_PACKING },
-	{ 1920, 1080, 50,
-	  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF },
-	{ 1920, 1080, 60,
-	  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF },
-	{ 1280, 720,  50, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
-	{ 1280, 720,  50, DRM_MODE_FLAG_3D_FRAME_PACKING },
-	{ 1280, 720,  60, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
-	{ 1280, 720,  60, DRM_MODE_FLAG_3D_FRAME_PACKING }
-};
-
-static bool
-stereo_match_mandatory(const struct drm_display_mode *mode,
-		       const struct stereo_mandatory_mode *stereo_mode)
-{
-	unsigned int interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
-
-	return mode->hdisplay == stereo_mode->width &&
-	       mode->vdisplay == stereo_mode->height &&
-	       interlaced == (stereo_mode->flags & DRM_MODE_FLAG_INTERLACE) &&
-	       drm_mode_vrefresh(mode) == stereo_mode->vrefresh;
-}
-
-static int add_hdmi_mandatory_stereo_modes(struct drm_connector *connector)
-{
-	struct drm_device *dev = connector->dev;
-	const struct drm_display_mode *mode;
-	struct list_head stereo_modes;
-	int modes = 0, i;
-
-	INIT_LIST_HEAD(&stereo_modes);
-
-	list_for_each_entry(mode, &connector->probed_modes, head) {
-		for (i = 0; i < ARRAY_SIZE(stereo_mandatory_modes); i++) {
-			const struct stereo_mandatory_mode *mandatory;
-			struct drm_display_mode *new_mode;
-
-			if (!stereo_match_mandatory(mode,
-						    &stereo_mandatory_modes[i]))
-				continue;
-
-			mandatory = &stereo_mandatory_modes[i];
-			new_mode = drm_mode_duplicate(dev, mode);
-			if (!new_mode)
-				continue;
-
-			new_mode->flags |= mandatory->flags;
-			list_add_tail(&new_mode->head, &stereo_modes);
-			modes++;
-		}
-	}
-
-	list_splice_tail(&stereo_modes, &connector->probed_modes);
-
-	return modes;
-}
-
 static int add_hdmi_mode(struct drm_connector *connector, u8 vic)
 {
 	struct drm_device *dev = connector->dev;
@@ -3090,8 +3026,6 @@ do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len,
 	/* 3D_Present */
 	offset++;
 	if (db[8 + offset] & (1 << 7)) {
-		modes += add_hdmi_mandatory_stereo_modes(connector);
-
 		/* 3D_Multi_present */
 		multi_present = (db[8 + offset] & 0x60) >> 5;
 	}
-- 
2.10.2



More information about the Nouveau mailing list