dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Nicholas Sielicki <nicholas.sielicki@gmail.com>
To: dri-devel@lists.freedesktop.org
Cc: Nicholas Sielicki <nicholas.sielicki@gmail.com>
Subject: [PATCH] drm: disable deep color when EDID violates spec
Date: Thu,  5 Jan 2017 17:45:23 -0600	[thread overview]
Message-ID: <20170105234523.5899-1-nicholas.sielicki@gmail.com> (raw)

As per the HDMI 1.3 and 1.4 spec, "deep color modes" are color depths
greater than 24 bits per pixel. The spec explicitly states, "All Deep
Color modes are optional though if an HDMI Source or Sink supports any
Deep Color mode, it shall support 36-bit mode." (6.2.4 Color Depth
Requirements).

I came across a monitor (Acer X233H) that supplies an illegal EDID where
DC_30bit is set and DC_36bit is not set. The end result is badly garbled
output because the driver is sending 36BPP when the monitor can't handle
it.

Much of the intel hardware is incapable of operating at any
bit-per-component setting outside of 8 or 12, and the spec seems to
imply that if any deep color support is found, then it is a safe
assumption to operate at 12.

This patch ensures that the EDID is within the spec (specifically, that
DC_36bit is set) before committing to going forward with any deep
colors.  There was already a check for this EDID inconsistency, but it
resulted only in a warning and did not fall-back to safer settings.

CC: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Nicholas Sielicki <nicholas.sielicki@gmail.com>
---
 drivers/gpu/drm/drm_edid.c | 35 +++++++++++++++++++++++------------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 336be31ff3de..42ce3f54d2dc 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3772,30 +3772,34 @@ static void drm_parse_hdmi_deep_color_info(struct drm_connector *connector,
 {
 	struct drm_display_info *info = &connector->display_info;
 	unsigned int dc_bpc = 0;
+	u8 modes = 0;
 
 	/* HDMI supports at least 8 bpc */
 	info->bpc = 8;
 
+	/* Ensure all DC modes are unset if we return early */
+	info->edid_hdmi_dc_modes = 0;
+
 	if (cea_db_payload_len(hdmi) < 6)
 		return;
 
 	if (hdmi[6] & DRM_EDID_HDMI_DC_30) {
 		dc_bpc = 10;
-		info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_30;
+		modes |= DRM_EDID_HDMI_DC_30;
 		DRM_DEBUG("%s: HDMI sink does deep color 30.\n",
 			  connector->name);
 	}
 
 	if (hdmi[6] & DRM_EDID_HDMI_DC_36) {
 		dc_bpc = 12;
-		info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_36;
+		modes |= DRM_EDID_HDMI_DC_36;
 		DRM_DEBUG("%s: HDMI sink does deep color 36.\n",
 			  connector->name);
 	}
 
 	if (hdmi[6] & DRM_EDID_HDMI_DC_48) {
 		dc_bpc = 16;
-		info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_48;
+		modes |= DRM_EDID_HDMI_DC_48;
 		DRM_DEBUG("%s: HDMI sink does deep color 48.\n",
 			  connector->name);
 	}
@@ -3806,9 +3810,24 @@ static void drm_parse_hdmi_deep_color_info(struct drm_connector *connector,
 		return;
 	}
 
+	/*
+	 * All deep color modes are optional, but if a sink supports any deep
+	 * color mode, it must support 36-bit mode. If this is found not
+	 * to be the case, sink is in violation of HDMI 1.3 / 1.4 spec and it
+	 * is prudent to disable all deep color modes. Return here before
+	 * committing bpc and edid_hdmi_dc_modes.
+	 */
+	if (!(modes & DRM_EDID_HDMI_DC_36)) {
+		DRM_DEBUG("%s: HDMI sink should do DC_36, but does not!\n",
+			  connector->name);
+		return;
+	}
+
+
 	DRM_DEBUG("%s: Assigning HDMI sink color depth as %d bpc.\n",
 		  connector->name, dc_bpc);
 	info->bpc = dc_bpc;
+	info->edid_hdmi_dc_modes = modes;
 
 	/*
 	 * Deep color support mandates RGB444 support for all video
@@ -3823,15 +3842,6 @@ static void drm_parse_hdmi_deep_color_info(struct drm_connector *connector,
 		DRM_DEBUG("%s: HDMI sink does YCRCB444 in deep color.\n",
 			  connector->name);
 	}
-
-	/*
-	 * Spec says that if any deep color mode is supported at all,
-	 * then deep color 36 bit must be supported.
-	 */
-	if (!(hdmi[6] & DRM_EDID_HDMI_DC_36)) {
-		DRM_DEBUG("%s: HDMI sink should do DC_36, but does not!\n",
-			  connector->name);
-	}
 }
 
 static void
@@ -3895,6 +3905,7 @@ static void drm_add_display_info(struct drm_connector *connector,
 	/* driver figures it out in this case */
 	info->bpc = 0;
 	info->color_formats = 0;
+	info->edid_hdmi_dc_modes = 0;
 	info->cea_rev = 0;
 	info->max_tmds_clock = 0;
 	info->dvi_dual = false;
-- 
2.11.0

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

             reply	other threads:[~2017-01-05 23:45 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-05 23:45 Nicholas Sielicki [this message]
2017-01-09 10:16 ` [PATCH] drm: disable deep color when EDID violates spec Daniel Vetter
2017-01-10 10:52 ` Ville Syrjälä
2017-01-10 11:33   ` Ernst Sjöstrand
2017-01-10 13:18     ` Ville Syrjälä
2017-01-10 17:27     ` Alex Deucher
2017-01-10 17:46       ` Ville Syrjälä
2017-01-10 19:54         ` Alex Deucher
2017-01-10 20:02           ` Ernst Sjöstrand
2017-01-10 20:10             ` Alex Deucher
2017-01-10 20:41               ` Harry Wentland
2017-01-10 21:01                 ` Harry Wentland
2017-01-11 10:04                   ` Jani Nikula
2017-01-11 11:38                     ` Ville Syrjälä
2017-02-13 17:58                       ` [PATCH] drm/i915: Reject HDMI 12bpc if the sink doesn't indicate support ville.syrjala
2017-01-10 13:39   ` [PATCH] drm: disable deep color when EDID violates spec Jani Nikula
2017-01-10 14:12     ` Ville Syrjälä

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170105234523.5899-1-nicholas.sielicki@gmail.com \
    --to=nicholas.sielicki@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox