[PATCH v14 16/33] drm/i915: Fix KBL HDCP2.2 encrypt status signalling

Daniel Vetter daniel at ffwll.ch
Wed Feb 20 19:49:46 UTC 2019


On Sat, Feb 16, 2019 at 11:07:03PM +0530, Ramalingam C wrote:
> HDCP transmitter is supposed to indicate the HDCP encryption status of
> the link through enc_en signals in a window of time called "window of
> opportunity" defined by HDCP HDMI spec.
> 
> But on KBL this timing of signalling has an issue. To fix the issue this
> WA of resetting the signalling is required.
> 
> v2:
>   WA is moved into the toggle_signalling [Daniel]
> v3:
>   Commit msg is rewritten with more information
> v4:
>   Reviewed-by Daniel.
> 
> Signed-off-by: Ramalingam C <ramalingam.c at intel.com>
> Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>

Merged all the i915 patches to dinq for 5.2.

Thanks, Daniel

> ---
>  drivers/gpu/drm/i915/intel_hdmi.c | 42 +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 42 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> index 6a3e400f54d7..c2c91e6645a5 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -1083,10 +1083,44 @@ int intel_hdmi_hdcp_read_v_prime_part(struct intel_digital_port *intel_dig_port,
>  	return ret;
>  }
>  
> +static int kbl_repositioning_enc_en_signal(struct intel_connector *connector)
> +{
> +	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> +	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
> +	struct drm_crtc *crtc = connector->base.state->crtc;
> +	struct intel_crtc *intel_crtc = container_of(crtc,
> +						     struct intel_crtc, base);
> +	u32 scanline;
> +	int ret;
> +
> +	for (;;) {
> +		scanline = I915_READ(PIPEDSL(intel_crtc->pipe));
> +		if (scanline > 100 && scanline < 200)
> +			break;
> +		usleep_range(25, 50);
> +	}
> +
> +	ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base, false);
> +	if (ret) {
> +		DRM_ERROR("Disable HDCP signalling failed (%d)\n", ret);
> +		return ret;
> +	}
> +	ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base, true);
> +	if (ret) {
> +		DRM_ERROR("Enable HDCP signalling failed (%d)\n", ret);
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
>  static
>  int intel_hdmi_hdcp_toggle_signalling(struct intel_digital_port *intel_dig_port,
>  				      bool enable)
>  {
> +	struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
> +	struct intel_connector *connector = hdmi->attached_connector;
> +	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
>  	int ret;
>  
>  	if (!enable)
> @@ -1098,6 +1132,14 @@ int intel_hdmi_hdcp_toggle_signalling(struct intel_digital_port *intel_dig_port,
>  			  enable ? "Enable" : "Disable", ret);
>  		return ret;
>  	}
> +
> +	/*
> +	 * WA: To fix incorrect positioning of the window of
> +	 * opportunity and enc_en signalling in KABYLAKE.
> +	 */
> +	if (IS_KABYLAKE(dev_priv) && enable)
> +		return kbl_repositioning_enc_en_signal(connector);
> +
>  	return 0;
>  }
>  
> -- 
> 2.7.4
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list