Enable HDCP 1.4 over DP MST for Gen12.
This also enable the stream encryption support for
older generations, which was missing earlier.

v2:
- Added debug print for stream encryption.
- Disable the hdcp on port after disabling last stream
  encryption.
v3:
- Cosmetic change, removed the value less comment. [Uma]

Cc: Ramalingam C <ramalinga...@intel.com>
Signed-off-by: Anshuman Gupta <anshuman.gu...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp_mst.c | 10 ++---
 drivers/gpu/drm/i915/display/intel_hdcp.c   | 43 ++++++++++++++-------
 2 files changed, 32 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c 
b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 16865b200062..f00e12fc83e8 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -826,13 +826,9 @@ static struct drm_connector 
*intel_dp_add_mst_connector(struct drm_dp_mst_topolo
        intel_attach_force_audio_property(connector);
        intel_attach_broadcast_rgb_property(connector);
 
-
-       /* TODO: Figure out how to make HDCP work on GEN12+ */
-       if (INTEL_GEN(dev_priv) < 12) {
-               ret = intel_dp_init_hdcp(dig_port, intel_connector);
-               if (ret)
-                       DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
-       }
+       ret = intel_dp_init_hdcp(dig_port, intel_connector);
+       if (ret)
+               drm_dbg_kms(&dev_priv->drm, "HDCP init failed, skipping.\n");
 
        /*
         * Reuse the prop from the SST connector because we're
diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c 
b/drivers/gpu/drm/i915/display/intel_hdcp.c
index 0322a83c151d..937af4aeaac2 100644
--- a/drivers/gpu/drm/i915/display/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
@@ -612,7 +612,12 @@ int intel_hdcp_auth_downstream(struct intel_connector 
*connector)
        return ret;
 }
 
-/* Implements Part 1 of the HDCP authorization procedure */
+/*
+ * Implements Part 1 of the HDCP authorization procedure.
+ * Authentication Part 1 steps for Multi-stream DisplayPort.
+ * Step 1. Auth Part 1 sequence on the driving MST Trasport Link.
+ * Step 2. Enable encryption for each stream that requires encryption.
+ */
 static int intel_hdcp_auth(struct intel_connector *connector)
 {
        struct intel_digital_port *dig_port = 
intel_attached_dig_port(connector);
@@ -766,10 +771,16 @@ static int intel_hdcp_auth(struct intel_connector 
*connector)
                return -ETIMEDOUT;
        }
 
-       /*
-        * XXX: If we have MST-connected devices, we need to enable encryption
-        * on those as well.
-        */
+       /* DP MST Auth Part 1 Step 2.a and Step 2.b */
+       if (shim->stream_encryption) {
+               ret = shim->stream_encryption(dig_port, true);
+               if (ret) {
+                       drm_err(&dev_priv->drm, "Failed to enable HDCP 1.4 
stream enc\n");
+                       return ret;
+               }
+               drm_dbg_kms(&dev_priv->drm, "HDCP 1.4 tras %s stream 
encrypted\n",
+                           transcoder_name(hdcp->stream_transcoder));
+       }
 
        if (repeater_present)
                return intel_hdcp_auth_downstream(connector);
@@ -791,18 +802,22 @@ static int _intel_hdcp_disable(struct intel_connector 
*connector)
        drm_dbg_kms(&dev_priv->drm, "[%s:%d] HDCP is being disabled...\n",
                    connector->base.name, connector->base.base.id);
 
+       if (hdcp->shim->stream_encryption) {
+               ret = hdcp->shim->stream_encryption(dig_port, false);
+               if (ret) {
+                       drm_err(&dev_priv->drm, "Failed to disable HDCP 1.4 
stream enc\n");
+                       return ret;
+               }
+               drm_dbg_kms(&dev_priv->drm, "HDCP 1.4 trans %s stream 
encryption disabled\n",
+                           transcoder_name(hdcp->stream_transcoder));
+       }
+
        /*
-        * If there are other connectors on this port using HDCP, don't disable
-        * it. Instead, toggle the HDCP signalling off on that particular
-        * connector/pipe and exit.
+        * If there are other connectors on this port using HDCP, don't disable 
it.
+        * Repeat steps 1-2 for each stream that no longer requires encryption.
         */
-       if (dig_port->num_hdcp_streams > 0) {
-               ret = hdcp->shim->toggle_signalling(dig_port,
-                                                   cpu_transcoder, false);
-               if (ret)
-                       DRM_ERROR("Failed to disable HDCP signalling\n");
+       if (dig_port->num_hdcp_streams > 0)
                return ret;
-       }
 
        hdcp->hdcp_encrypted = false;
        intel_de_write(dev_priv, HDCP_CONF(dev_priv, cpu_transcoder, port), 0);
-- 
2.26.2

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

Reply via email to