Enable HDCP 2.2 over DP MST.

Cc: Ramalingam C <ramalinga...@intel.com>
Signed-off-by: Anshuman Gupta <anshuman.gu...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_hdcp.c | 46 ++++++++++++++++++++++-
 1 file changed, 44 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c 
b/drivers/gpu/drm/i915/display/intel_hdcp.c
index b5e6bcf800aa..5f1fadbc5a10 100644
--- a/drivers/gpu/drm/i915/display/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
@@ -1696,6 +1696,32 @@ static int hdcp2_authenticate_sink(struct 
intel_connector *connector)
        return ret;
 }
 
+static int hdcp2_enable_stream_encryption(struct intel_connector *connector)
+{
+       struct intel_digital_port *dig_port = 
intel_attached_dig_port(connector);
+       struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
+       struct intel_hdcp *hdcp = &connector->hdcp;
+       enum transcoder cpu_transcoder = hdcp->cpu_transcoder;
+       enum port port = dig_port->base.port;
+       int ret = 0;
+
+       if (!(intel_de_read(dev_priv, HDCP2_STATUS(dev_priv, cpu_transcoder, 
port)) &
+                           LINK_ENCRYPTION_STATUS)) {
+               drm_err(&dev_priv->drm, "HDCP 2.2 Link is not encrypted\n");
+               return -EPERM;
+       }
+
+       if (hdcp->shim->stream_2_2_encryption) {
+               ret = hdcp->shim->stream_2_2_encryption(dig_port, true);
+               if (ret) {
+                       drm_err(&dev_priv->drm, "Failed to enable HDCP 2.2 
stream enc\n");
+                       return ret;
+               }
+       }
+
+       return ret;
+}
+
 static int hdcp2_enable_encryption(struct intel_connector *connector)
 {
        struct intel_digital_port *dig_port = 
intel_attached_dig_port(connector);
@@ -1834,7 +1860,7 @@ static int hdcp2_authenticate_and_encrypt(struct 
intel_connector *connector)
                        drm_dbg_kms(&i915->drm, "Port deauth failed.\n");
        }
 
-       if (!ret) {
+       if (!ret && !dig_port->port_auth) {
                /*
                 * Ensuring the required 200mSec min time interval between
                 * Session Key Exchange and encryption.
@@ -1849,6 +1875,8 @@ static int hdcp2_authenticate_and_encrypt(struct 
intel_connector *connector)
                }
        }
 
+       ret = hdcp2_enable_stream_encryption(connector);
+
        return ret;
 }
 
@@ -1893,11 +1921,23 @@ static int _intel_hdcp2_disable(struct intel_connector 
*connector)
        struct intel_digital_port *dig_port = 
intel_attached_dig_port(connector);
        struct drm_i915_private *i915 = to_i915(connector->base.dev);
        struct hdcp_port_data *data = &dig_port->port_data;
+       struct intel_hdcp *hdcp = &connector->hdcp;
        int ret;
 
        drm_dbg_kms(&i915->drm, "[%s:%d] HDCP2.2 is being Disabled\n",
                    connector->base.name, connector->base.base.id);
 
+       if (hdcp->shim->stream_2_2_encryption) {
+               ret = hdcp->shim->stream_2_2_encryption(dig_port, false);
+               if (ret) {
+                       drm_err(&i915->drm, "Failed to disable HDCP 2.2 stream 
enc\n");
+                       return ret;
+               }
+       }
+
+       if (dig_port->num_hdcp_streams > 0)
+               return ret;
+
        ret = hdcp2_disable_encryption(connector);
 
        if (hdcp2_deauthenticate_port(connector) < 0)
@@ -1921,6 +1961,7 @@ static int intel_hdcp2_check_link(struct intel_connector 
*connector)
        int ret = 0;
 
        mutex_lock(&hdcp->mutex);
+       mutex_lock(&dig_port->hdcp_mutex);
        cpu_transcoder = hdcp->cpu_transcoder;
 
        /* hdcp2_check_link is expected only when HDCP2.2 is Enabled */
@@ -1998,6 +2039,7 @@ static int intel_hdcp2_check_link(struct intel_connector 
*connector)
        }
 
 out:
+       mutex_unlock(&dig_port->hdcp_mutex);
        mutex_unlock(&hdcp->mutex);
        return ret;
 }
@@ -2179,7 +2221,7 @@ int intel_hdcp_init(struct intel_connector *connector,
        if (!shim)
                return -EINVAL;
 
-       if (is_hdcp2_supported(dev_priv) && !connector->mst_port)
+       if (is_hdcp2_supported(dev_priv))
                intel_hdcp2_init(connector, dig_port, shim);
 
        ret =
-- 
2.26.2

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to