diff mbox series

[v10,38/40] drm/i915: Fix KBL HDCP2.2 encrypt status signalling

Message ID 1548917996-28081-39-git-send-email-ramalingam.c@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915: Implement HDCP2.2 | expand

Commit Message

Ramalingam C Jan. 31, 2019, 6:59 a.m. UTC
Implement the required WA sequence for KBL to fix the
incorrect positioning of the window of oppurtunity and enc_en
signalling.

v2:
  WA is moved into the toggle_signalling [Daniel]

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

Comments

Ramalingam C Feb. 4, 2019, 3:32 p.m. UTC | #1
daniel,

Could you please review this patch too.? Already Updated this as per 
your previous review comment.

--Ram

On 1/31/2019 12:29 PM, Ramalingam C wrote:
> Implement the required WA sequence for KBL to fix the
> incorrect positioning of the window of oppurtunity and enc_en
> signalling.
>
> v2:
>    WA is moved into the toggle_signalling [Daniel]
>
> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> ---
>   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 2c4bf6d0c39f..ae20288f7bbf 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;
>   }
>
Shankar, Uma Feb. 4, 2019, 4:35 p.m. UTC | #2
>-----Original Message-----
>From: C, Ramalingam
>Sent: Thursday, January 31, 2019 12:30 PM
>To: intel-gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org;
>daniel.vetter@ffwll.ch; Winkler, Tomas <tomas.winkler@intel.com>; Shankar,
>Uma <uma.shankar@intel.com>
>Cc: C, Ramalingam <ramalingam.c@intel.com>
>Subject: [PATCH v10 38/40] drm/i915: Fix KBL HDCP2.2 encrypt status signalling
>
>Implement the required WA sequence for KBL to fix the incorrect positioning of
>the window of oppurtunity and enc_en signalling.

Typo in opportunity.

>
>v2:
>  WA is moved into the toggle_signalling [Daniel]
>
>Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
>---
> 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 2c4bf6d0c39f..ae20288f7bbf 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;
> }
>
Would be good to add a comment here as to what exactly is the WA and what
you are trying to do here.

>+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 Feb. 5, 2019, 8:54 a.m. UTC | #3
On Mon, Feb 04, 2019 at 09:02:35PM +0530, C, Ramalingam wrote:
> daniel,
> 
> Could you please review this patch too.? Already Updated this as per your
> previous review comment.

Oops, missed this one somehow. Looks much cleaner now imo.

Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> 
> --Ram
> 
> On 1/31/2019 12:29 PM, Ramalingam C wrote:
> > Implement the required WA sequence for KBL to fix the
> > incorrect positioning of the window of oppurtunity and enc_en
> > signalling.
> > 
> > v2:
> >    WA is moved into the toggle_signalling [Daniel]
> > 
> > Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> > ---
> >   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 2c4bf6d0c39f..ae20288f7bbf 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;
> >   }
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 2c4bf6d0c39f..ae20288f7bbf 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;
 }