diff mbox

[v5,13/40] drm/i915: Implement HDCP2.2 Enable and Disable

Message ID 1530088829-11730-14-git-send-email-ramalingam.c@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ramalingam C June 27, 2018, 8:40 a.m. UTC
Implements a sequence of enabling and disabling the HDCP2.2
(auth and encryption).

v2:
  Rebased.
v3:
  No Changes.
v4:
  No Changes.
v5:
  Rebased as part of the patch reordering.
  HDCP2 encryption status is tracked.

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
---
 drivers/gpu/drm/i915/intel_hdcp.c | 105 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 104 insertions(+), 1 deletion(-)

Comments

Sean Paul July 9, 2018, 8:48 p.m. UTC | #1
On Wed, Jun 27, 2018 at 02:10:02PM +0530, Ramalingam C wrote:
> Implements a sequence of enabling and disabling the HDCP2.2
> (auth and encryption).

This is really hard to review, since all I see are stubs. I'd much rather have
each patch do something useful, instead of just call stubs. That said, I don't
have a vested interest in HDCP2.2 on intel, so if others are fine with it, I am
too.

Sean

> 
> v2:
>   Rebased.
> v3:
>   No Changes.
> v4:
>   No Changes.
> v5:
>   Rebased as part of the patch reordering.
>   HDCP2 encryption status is tracked.
> 
> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_hdcp.c | 105 +++++++++++++++++++++++++++++++++++++-
>  1 file changed, 104 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
> index 34bafc2025f7..f72684488bc7 100644
> --- a/drivers/gpu/drm/i915/intel_hdcp.c
> +++ b/drivers/gpu/drm/i915/intel_hdcp.c
> @@ -994,14 +994,117 @@ int intel_hdcp_check_link(struct intel_connector *connector)
>  	return ret;
>  }
>  
> +static int hdcp2_close_mei_session(struct intel_connector *connector)
> +{
> +	struct mei_hdcp_data *data = &connector->hdcp.mei_data;
> +	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> +	struct i915_hdcp_component *comp = dev_priv->hdcp_comp;
> +	int ret;
> +
> +	if (!comp)
> +		return -EINVAL;
> +
> +	mutex_lock(&comp->mutex);
> +	if (!comp->ops || !comp->mei_cldev || data->port == INVALID_PORT) {
> +		mutex_unlock(&comp->mutex);
> +		return -EINVAL;
> +	}
> +	ret = comp->ops->close_hdcp_session(comp->mei_cldev, data);
> +	mutex_unlock(&comp->mutex);
> +
> +	return ret;
> +}
> +
> +static int hdcp2_deauthenticate_port(struct intel_connector *connector)
> +{
> +	return hdcp2_close_mei_session(connector);
> +}
> +
> +static int hdcp2_authenticate_sink(struct intel_connector *connector)
> +{
> +	return 0;
> +}
> +
> +static int hdcp2_enable_encryption(struct intel_connector *connector)
> +{
> +	return 0;
> +}
> +
> +static int hdcp2_disable_encryption(struct intel_connector *connector)
> +{
> +	return 0;
> +}
> +
> +static int hdcp2_authenticate_and_encrypt(struct intel_connector *connector)
> +{
> +	int ret, i, tries = 3;
> +
> +	for (i = 0; i < tries; i++) {
> +		ret = hdcp2_authenticate_sink(connector);
> +		if (!ret)
> +			break;
> +
> +		/* Clearing the mei hdcp session */
> +		hdcp2_deauthenticate_port(connector);
> +		DRM_DEBUG_KMS("HDCP2.2 Auth %d of %d Failed.(%d)\n",
> +			      i + 1, tries, ret);
> +	}
> +
> +	if (i != tries) {
> +		/*
> +		 * Ensuring the required 200mSec min time interval between
> +		 * Session Key Exchange and encryption.
> +		 */
> +		msleep(HDCP_2_2_DELAY_BEFORE_ENCRYPTION_EN);
> +		ret = hdcp2_enable_encryption(connector);
> +		if (ret < 0) {
> +			DRM_DEBUG_KMS("Encryption Enable Failed.(%d)\n", ret);
> +			hdcp2_deauthenticate_port(connector);
> +		}
> +	}
> +
> +	return ret;
> +}
> +
>  static int _intel_hdcp2_enable(struct intel_connector *connector)
>  {
> +	struct intel_hdcp *hdcp = &connector->hdcp;
> +	int ret;
> +
> +	DRM_DEBUG_KMS("[%s:%d] HDCP2.2 is being enabled. Type: %d\n",
> +		      connector->base.name, connector->base.base.id,
> +		      hdcp->content_type);
> +
> +	ret = hdcp2_authenticate_and_encrypt(connector);
> +	if (ret) {
> +		DRM_ERROR("HDCP2 Type%d  Enabling Failed. (%d)\n",
> +			  hdcp->content_type, ret);
> +		return ret;
> +	}
> +
> +	DRM_DEBUG_KMS("[%s:%d] HDCP2.2 is enabled. Type %d\n",
> +		      connector->base.name, connector->base.base.id,
> +		      hdcp->content_type);
> +
> +	hdcp->hdcp2_in_use = true;
> +	hdcp->hdcp_value = DRM_MODE_CONTENT_PROTECTION_ENABLED;
> +	schedule_work(&hdcp->hdcp_prop_work);
>  	return 0;
>  }
>  
>  static int _intel_hdcp2_disable(struct intel_connector *connector)
>  {
> -	return 0;
> +	int ret;
> +
> +	DRM_DEBUG_KMS("[%s:%d] HDCP2.2 is being Disabled\n",
> +		      connector->base.name, connector->base.base.id);
> +
> +	ret = hdcp2_disable_encryption(connector);
> +
> +	hdcp2_deauthenticate_port(connector);
> +	connector->hdcp.hdcp2_in_use = false;
> +
> +	return ret;
>  }
>  
>  static int i915_hdcp_component_master_bind(struct device *dev)
> -- 
> 2.7.4
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Ramalingam C July 12, 2018, 2:41 p.m. UTC | #2
On Tuesday 10 July 2018 02:18 AM, Sean Paul wrote:
> On Wed, Jun 27, 2018 at 02:10:02PM +0530, Ramalingam C wrote:
>> Implements a sequence of enabling and disabling the HDCP2.2
>> (auth and encryption).
> This is really hard to review, since all I see are stubs. I'd much rather have
> each patch do something useful, instead of just call stubs. That said, I don't
> have a vested interest in HDCP2.2 on intel, so if others are fine with it, I am
> too.
Sean,

Just to avoid the so lengthy patches, I have split the changes in 
logical patches.
Looks like patches 11, 12, 13 and 14 are not so appealing. Merged these 
patches together.
Hope now the series looks more appealing.

Please have a look at the upcoming series version too. Thanks a lot again.

-Ram
>
> Sean
>
>> v2:
>>    Rebased.
>> v3:
>>    No Changes.
>> v4:
>>    No Changes.
>> v5:
>>    Rebased as part of the patch reordering.
>>    HDCP2 encryption status is tracked.
>>
>> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
>> ---
>>   drivers/gpu/drm/i915/intel_hdcp.c | 105 +++++++++++++++++++++++++++++++++++++-
>>   1 file changed, 104 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
>> index 34bafc2025f7..f72684488bc7 100644
>> --- a/drivers/gpu/drm/i915/intel_hdcp.c
>> +++ b/drivers/gpu/drm/i915/intel_hdcp.c
>> @@ -994,14 +994,117 @@ int intel_hdcp_check_link(struct intel_connector *connector)
>>   	return ret;
>>   }
>>   
>> +static int hdcp2_close_mei_session(struct intel_connector *connector)
>> +{
>> +	struct mei_hdcp_data *data = &connector->hdcp.mei_data;
>> +	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
>> +	struct i915_hdcp_component *comp = dev_priv->hdcp_comp;
>> +	int ret;
>> +
>> +	if (!comp)
>> +		return -EINVAL;
>> +
>> +	mutex_lock(&comp->mutex);
>> +	if (!comp->ops || !comp->mei_cldev || data->port == INVALID_PORT) {
>> +		mutex_unlock(&comp->mutex);
>> +		return -EINVAL;
>> +	}
>> +	ret = comp->ops->close_hdcp_session(comp->mei_cldev, data);
>> +	mutex_unlock(&comp->mutex);
>> +
>> +	return ret;
>> +}
>> +
>> +static int hdcp2_deauthenticate_port(struct intel_connector *connector)
>> +{
>> +	return hdcp2_close_mei_session(connector);
>> +}
>> +
>> +static int hdcp2_authenticate_sink(struct intel_connector *connector)
>> +{
>> +	return 0;
>> +}
>> +
>> +static int hdcp2_enable_encryption(struct intel_connector *connector)
>> +{
>> +	return 0;
>> +}
>> +
>> +static int hdcp2_disable_encryption(struct intel_connector *connector)
>> +{
>> +	return 0;
>> +}
>> +
>> +static int hdcp2_authenticate_and_encrypt(struct intel_connector *connector)
>> +{
>> +	int ret, i, tries = 3;
>> +
>> +	for (i = 0; i < tries; i++) {
>> +		ret = hdcp2_authenticate_sink(connector);
>> +		if (!ret)
>> +			break;
>> +
>> +		/* Clearing the mei hdcp session */
>> +		hdcp2_deauthenticate_port(connector);
>> +		DRM_DEBUG_KMS("HDCP2.2 Auth %d of %d Failed.(%d)\n",
>> +			      i + 1, tries, ret);
>> +	}
>> +
>> +	if (i != tries) {
>> +		/*
>> +		 * Ensuring the required 200mSec min time interval between
>> +		 * Session Key Exchange and encryption.
>> +		 */
>> +		msleep(HDCP_2_2_DELAY_BEFORE_ENCRYPTION_EN);
>> +		ret = hdcp2_enable_encryption(connector);
>> +		if (ret < 0) {
>> +			DRM_DEBUG_KMS("Encryption Enable Failed.(%d)\n", ret);
>> +			hdcp2_deauthenticate_port(connector);
>> +		}
>> +	}
>> +
>> +	return ret;
>> +}
>> +
>>   static int _intel_hdcp2_enable(struct intel_connector *connector)
>>   {
>> +	struct intel_hdcp *hdcp = &connector->hdcp;
>> +	int ret;
>> +
>> +	DRM_DEBUG_KMS("[%s:%d] HDCP2.2 is being enabled. Type: %d\n",
>> +		      connector->base.name, connector->base.base.id,
>> +		      hdcp->content_type);
>> +
>> +	ret = hdcp2_authenticate_and_encrypt(connector);
>> +	if (ret) {
>> +		DRM_ERROR("HDCP2 Type%d  Enabling Failed. (%d)\n",
>> +			  hdcp->content_type, ret);
>> +		return ret;
>> +	}
>> +
>> +	DRM_DEBUG_KMS("[%s:%d] HDCP2.2 is enabled. Type %d\n",
>> +		      connector->base.name, connector->base.base.id,
>> +		      hdcp->content_type);
>> +
>> +	hdcp->hdcp2_in_use = true;
>> +	hdcp->hdcp_value = DRM_MODE_CONTENT_PROTECTION_ENABLED;
>> +	schedule_work(&hdcp->hdcp_prop_work);
>>   	return 0;
>>   }
>>   
>>   static int _intel_hdcp2_disable(struct intel_connector *connector)
>>   {
>> -	return 0;
>> +	int ret;
>> +
>> +	DRM_DEBUG_KMS("[%s:%d] HDCP2.2 is being Disabled\n",
>> +		      connector->base.name, connector->base.base.id);
>> +
>> +	ret = hdcp2_disable_encryption(connector);
>> +
>> +	hdcp2_deauthenticate_port(connector);
>> +	connector->hdcp.hdcp2_in_use = false;
>> +
>> +	return ret;
>>   }
>>   
>>   static int i915_hdcp_component_master_bind(struct device *dev)
>> -- 
>> 2.7.4
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
index 34bafc2025f7..f72684488bc7 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -994,14 +994,117 @@  int intel_hdcp_check_link(struct intel_connector *connector)
 	return ret;
 }
 
+static int hdcp2_close_mei_session(struct intel_connector *connector)
+{
+	struct mei_hdcp_data *data = &connector->hdcp.mei_data;
+	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
+	struct i915_hdcp_component *comp = dev_priv->hdcp_comp;
+	int ret;
+
+	if (!comp)
+		return -EINVAL;
+
+	mutex_lock(&comp->mutex);
+	if (!comp->ops || !comp->mei_cldev || data->port == INVALID_PORT) {
+		mutex_unlock(&comp->mutex);
+		return -EINVAL;
+	}
+	ret = comp->ops->close_hdcp_session(comp->mei_cldev, data);
+	mutex_unlock(&comp->mutex);
+
+	return ret;
+}
+
+static int hdcp2_deauthenticate_port(struct intel_connector *connector)
+{
+	return hdcp2_close_mei_session(connector);
+}
+
+static int hdcp2_authenticate_sink(struct intel_connector *connector)
+{
+	return 0;
+}
+
+static int hdcp2_enable_encryption(struct intel_connector *connector)
+{
+	return 0;
+}
+
+static int hdcp2_disable_encryption(struct intel_connector *connector)
+{
+	return 0;
+}
+
+static int hdcp2_authenticate_and_encrypt(struct intel_connector *connector)
+{
+	int ret, i, tries = 3;
+
+	for (i = 0; i < tries; i++) {
+		ret = hdcp2_authenticate_sink(connector);
+		if (!ret)
+			break;
+
+		/* Clearing the mei hdcp session */
+		hdcp2_deauthenticate_port(connector);
+		DRM_DEBUG_KMS("HDCP2.2 Auth %d of %d Failed.(%d)\n",
+			      i + 1, tries, ret);
+	}
+
+	if (i != tries) {
+		/*
+		 * Ensuring the required 200mSec min time interval between
+		 * Session Key Exchange and encryption.
+		 */
+		msleep(HDCP_2_2_DELAY_BEFORE_ENCRYPTION_EN);
+		ret = hdcp2_enable_encryption(connector);
+		if (ret < 0) {
+			DRM_DEBUG_KMS("Encryption Enable Failed.(%d)\n", ret);
+			hdcp2_deauthenticate_port(connector);
+		}
+	}
+
+	return ret;
+}
+
 static int _intel_hdcp2_enable(struct intel_connector *connector)
 {
+	struct intel_hdcp *hdcp = &connector->hdcp;
+	int ret;
+
+	DRM_DEBUG_KMS("[%s:%d] HDCP2.2 is being enabled. Type: %d\n",
+		      connector->base.name, connector->base.base.id,
+		      hdcp->content_type);
+
+	ret = hdcp2_authenticate_and_encrypt(connector);
+	if (ret) {
+		DRM_ERROR("HDCP2 Type%d  Enabling Failed. (%d)\n",
+			  hdcp->content_type, ret);
+		return ret;
+	}
+
+	DRM_DEBUG_KMS("[%s:%d] HDCP2.2 is enabled. Type %d\n",
+		      connector->base.name, connector->base.base.id,
+		      hdcp->content_type);
+
+	hdcp->hdcp2_in_use = true;
+	hdcp->hdcp_value = DRM_MODE_CONTENT_PROTECTION_ENABLED;
+	schedule_work(&hdcp->hdcp_prop_work);
 	return 0;
 }
 
 static int _intel_hdcp2_disable(struct intel_connector *connector)
 {
-	return 0;
+	int ret;
+
+	DRM_DEBUG_KMS("[%s:%d] HDCP2.2 is being Disabled\n",
+		      connector->base.name, connector->base.base.id);
+
+	ret = hdcp2_disable_encryption(connector);
+
+	hdcp2_deauthenticate_port(connector);
+	connector->hdcp.hdcp2_in_use = false;
+
+	return ret;
 }
 
 static int i915_hdcp_component_master_bind(struct device *dev)