From patchwork Wed Oct 17 23:10:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Taylor, Clinton A" X-Patchwork-Id: 10646587 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 616EB13A4 for ; Wed, 17 Oct 2018 23:09:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4EE72286A4 for ; Wed, 17 Oct 2018 23:09:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 43226286AC; Wed, 17 Oct 2018 23:09:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id DB179286A4 for ; Wed, 17 Oct 2018 23:09:37 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 736746E42A; Wed, 17 Oct 2018 23:09:37 +0000 (UTC) X-Original-To: Intel-gfx@lists.freedesktop.org Delivered-To: Intel-gfx@lists.freedesktop.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by gabe.freedesktop.org (Postfix) with ESMTPS id 159BC6E42A for ; Wed, 17 Oct 2018 23:09:36 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Oct 2018 16:09:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,393,1534834800"; d="scan'208";a="266599604" Received: from cataylo2-ubuntu64-14.jf.intel.com ([10.7.199.52]) by orsmga005.jf.intel.com with ESMTP; 17 Oct 2018 16:09:35 -0700 From: clinton.a.taylor@intel.com To: Intel-gfx@lists.freedesktop.org Date: Wed, 17 Oct 2018 16:10:34 -0700 Message-Id: <1539817834-23408-1-git-send-email-clinton.a.taylor@intel.com> X-Mailer: git-send-email 1.9.1 MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH] drm/i915/hdmi: Detect HDMI 2.0 monitors using multiple EDID capabilities X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP From: Clint Taylor HDMI 2.0 monitors may not support SCDC and still be able to accept VICs above 63. Use multiple EDID capbilities to determine if the SINK is actually an HDMI 2.0 device. The QD980B HDMI 2.0 Analyzer generates unique EDIDs during CTS tests that don't contain a HDMI Forum VSDB if the block is not used during the test. The current HDMI AVI infoframe code only uses the SCDC supported information in the HDMI Forum VSDB to determine if the sink is HDMI 2.0. This patch adds checks for YCbCr420 Deep Color, YCbCR420 VDB, YCBCR420 CMDB capabilities, and pipe is YCbCr420 to the existing SCDC supported check to Infer SINK is HDMI 2.0. HDMI 2.0 CTS HF1-51 test fails on the QD980B. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107894 Cc: Ville Syrjälä Cc: Shashank Sharma Signed-off-by: Clint Taylor --- drivers/gpu/drm/i915/intel_hdmi.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 2c53efc..6913806 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c @@ -458,6 +458,34 @@ static void intel_write_infoframe(struct intel_encoder *encoder, frame->any.type, buffer, len); } +static bool is_hdmi2(const struct drm_connector *connector, + const struct intel_crtc_state *crtc_state) +{ + bool hdmi2 = false; + bool vdb_mode = false; + bool cmdb_mode = false; + int i = 0; + + /* check VDB bits for HDMI 2.0 mode */ + for (i = 0; i < BITS_TO_LONGS(128); i++) + if (connector->display_info.hdmi.y420_vdb_modes[i]) + vdb_mode = true; + + /* check CMDB bits for HDMI 2.0 mode */ + for (i = 0; i < BITS_TO_LONGS(128); i++) + if (connector->display_info.hdmi.y420_cmdb_modes[i]) + cmdb_mode = true; + + if (connector->display_info.hdmi.scdc.supported || + connector->display_info.hdmi.y420_dc_modes || + crtc_state->ycbcr420 || vdb_mode || cmdb_mode) { + DRM_DEBUG_KMS("Inferred HDMI2 sink present\n"); + hdmi2 = true; + } + + return hdmi2; +} + static void intel_hdmi_set_avi_infoframe(struct intel_encoder *encoder, const struct intel_crtc_state *crtc_state, const struct drm_connector_state *conn_state) @@ -466,10 +494,12 @@ static void intel_hdmi_set_avi_infoframe(struct intel_encoder *encoder, const struct drm_display_mode *adjusted_mode = &crtc_state->base.adjusted_mode; struct drm_connector *connector = &intel_hdmi->attached_connector->base; - bool is_hdmi2_sink = connector->display_info.hdmi.scdc.supported; + bool is_hdmi2_sink = false; union hdmi_infoframe frame; int ret; + is_hdmi2_sink = is_hdmi2(connector, crtc_state); + ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, adjusted_mode, is_hdmi2_sink);