From: Ramalingam C <ramalingam.c@intel.com>
To: intel-gfx@lists.freedesktop.org, seanpaul@chromium.org,
dri-devel@lists.freedesktop.org
Subject: [PATCH 4/5] drm/i915: Poll hdcp register on sudden NACK
Date: Mon, 26 Feb 2018 22:42:38 +0530 [thread overview]
Message-ID: <1519665159-28639-5-git-send-email-ramalingam.c@intel.com> (raw)
In-Reply-To: <1519665159-28639-1-git-send-email-ramalingam.c@intel.com>
In a connected state, If a HDMI HDCP sink is responded with NACK for
HDCP I2C register access, then HDMI HDCP spec mandates the polling
of any HDCP space registers for accessibility, minimum once in 2Secs
atleast for 4Secs.
Just to make it simple, this is generically implemented for both HDMI
and DP. But we dont expect that this scanario will occur for DP.
HDMI HDCP CTS Tests: 1A-04 and 1A-07A.
Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
---
drivers/gpu/drm/i915/intel_hdcp.c | 74 +++++++++++++++++++++++++++++++++++----
1 file changed, 67 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
index 95081aaa832a..14be14a45e5a 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -16,6 +16,47 @@
#define KEY_LOAD_TRIES 5
+static
+struct intel_digital_port *conn_to_dig_port(struct intel_connector *connector)
+{
+ return enc_to_dig_port(&intel_attached_encoder(&connector->base)->base);
+}
+
+static inline bool hdcp_port_accessible(struct intel_connector *connector)
+{
+ struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
+ int ret = -ENXIO;
+ u8 bksv[DRM_HDCP_KSV_LEN];
+
+ ret = connector->hdcp_shim->read_bksv(intel_dig_port, bksv);
+ if (!ret)
+ return true;
+ return false;
+}
+
+static bool wait_for_hdcp_port(struct intel_connector *connector)
+{
+ int i, tries = 10;
+
+ for (i = 0; i < tries; i++) {
+ if (connector->base.status != connector_status_connected ||
+ connector->base.state->content_protection ==
+ DRM_MODE_CONTENT_PROTECTION_UNDESIRED ||
+ connector->hdcp_value ==
+ DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
+ return false;
+
+ if (hdcp_port_accessible(connector))
+ break;
+
+ msleep_interruptible(500);
+ }
+
+ if (i == tries)
+ return false;
+ return true;
+}
+
static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port,
const struct intel_hdcp_shim *shim)
{
@@ -584,12 +625,6 @@ static int intel_hdcp_auth(struct intel_digital_port *intel_dig_port,
return 0;
}
-static
-struct intel_digital_port *conn_to_dig_port(struct intel_connector *connector)
-{
- return enc_to_dig_port(&intel_attached_encoder(&connector->base)->base);
-}
-
static int _intel_hdcp_disable(struct intel_connector *connector)
{
struct drm_i915_private *dev_priv = connector->base.dev->dev_private;
@@ -719,14 +754,26 @@ int intel_hdcp_init(struct intel_connector *connector,
int intel_hdcp_enable(struct intel_connector *connector)
{
- int ret;
+ int ret, tries = 2;
if (!connector->hdcp_shim)
return -ENOENT;
mutex_lock(&connector->hdcp_mutex);
+enable_hdcp:
ret = _intel_hdcp_enable(connector);
+
+ /*
+ * Suddenly if sink is NACK-ed for the access of HDCP
+ * registers, but display is still connected, poll for hdcp
+ * port accessibility. One of the HDCP spec requirement.
+ */
+ if ((ret == -EIO || ret == -ENXIO) &&
+ connector->base.status == connector_status_connected &&
+ !hdcp_port_accessible(connector))
+ if (wait_for_hdcp_port(connector) && --tries)
+ goto enable_hdcp;
if (ret)
goto out;
@@ -838,6 +885,19 @@ int intel_hdcp_check_link(struct intel_connector *connector)
goto out;
}
+ /*
+ * Suddenly if sink is NACK-ed for the access of HDCP
+ * registers, but display is still connected, poll for hdcp
+ * port accessibility. One of the HDCP spec requirement.
+ */
+ if (connector->base.status == connector_status_connected &&
+ !hdcp_port_accessible(connector)) {
+ mutex_unlock(&connector->hdcp_mutex);
+ if (!wait_for_hdcp_port(connector))
+ return ret;
+ mutex_lock(&connector->hdcp_mutex);
+ }
+
ret = _intel_hdcp_enable(connector);
if (ret) {
DRM_ERROR("Failed to enable hdcp (%d)\n", ret);
--
2.7.4
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2018-02-26 17:12 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-26 17:12 [PATCH 0/5] HDCP1.4 fixes Ramalingam C
2018-02-26 17:12 ` [PATCH 1/5] drm/i915: Read HDCP R0 thrice in case of mismatch Ramalingam C
2018-02-26 17:37 ` Sean Paul
2018-02-27 11:38 ` Ramalingam C
2018-02-26 17:12 ` [PATCH 2/5] drm/i915: read Vprime thrice incase " Ramalingam C
2018-02-26 17:40 ` Sean Paul
2018-02-27 12:32 ` [PATCH v2] " Ramalingam C
2018-02-26 17:12 ` [PATCH 3/5] drm/i915: Check hdcp key loadability Ramalingam C
2018-02-26 17:45 ` Sean Paul
2018-02-26 17:12 ` Ramalingam C [this message]
2018-02-26 17:52 ` [PATCH 4/5] drm/i915: Poll hdcp register on sudden NACK Sean Paul
2018-02-27 14:36 ` Ramalingam C
2018-02-26 17:12 ` [PATCH 5/5] drm/i915: Move hdcp msg detection into shim Ramalingam C
2018-02-26 18:01 ` Sean Paul
2018-02-27 11:20 ` Ramalingam C
2018-02-26 22:50 ` [Intel-gfx] " Chris Wilson
2018-03-08 6:29 ` Ramalingam C
2018-02-26 23:24 ` [PATCH 0/5] HDCP1.4 fixes Rodrigo Vivi
2018-02-27 11:11 ` Ramalingam C
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=1519665159-28639-5-git-send-email-ramalingam.c@intel.com \
--to=ramalingam.c@intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=seanpaul@chromium.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