Message ID | 1531538117-1606-18-git-send-email-ramalingam.c@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
>-----Original Message----- >From: C, Ramalingam >Sent: Saturday, July 14, 2018 8:45 AM >To: intel-gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org; >daniel@ffwll.ch; seanpaul@chromium.org; Winkler, Tomas ><tomas.winkler@intel.com>; Usyskin, Alexander <alexander.usyskin@intel.com>; >Shankar, Uma <uma.shankar@intel.com> >Cc: Sharma, Shashank <shashank.sharma@intel.com>; C, Ramalingam ><ramalingam.c@intel.com> >Subject: [PATCH v6 17/35] drm/i915: Check HDCP 1.4 and 2.2 link on CP_IRQ > >On DP HDCP1.4 and 2.2, when CP_IRQ is received, start the link integrity check >for the HDCP version that is enabled. > >v2: > Rebased. Function name is changed. >v3: > No Changes. >v4: > No Changes. >v5: > No Changes. >v6: > %s/_in_force/_in_use [Sean Paul] > >Signed-off-by: Ramalingam C <ramalingam.c@intel.com> >cc: Sean Paul <seanpaul@chromium.org> >Reviewed-by: Sean Paul <seanpaul@chromium.org> >--- > drivers/gpu/drm/i915/intel_dp.c | 2 +- > drivers/gpu/drm/i915/intel_drv.h | 2 +- drivers/gpu/drm/i915/intel_hdcp.c | 31 >++++++++++++++++++++++++++++++- > 3 files changed, 32 insertions(+), 3 deletions(-) > >diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c >index 0d31c9c286e9..6dcb09430fb5 100644 >--- a/drivers/gpu/drm/i915/intel_dp.c >+++ b/drivers/gpu/drm/i915/intel_dp.c >@@ -4484,7 +4484,7 @@ intel_dp_short_pulse(struct intel_dp *intel_dp) > if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST) > intel_dp_handle_test_request(intel_dp); > if (sink_irq_vector & DP_CP_IRQ) >- intel_hdcp_check_link(intel_dp->attached_connector); >+ intel_hdcp_handle_cp_irq(intel_dp- >>attached_connector); > if (sink_irq_vector & DP_SINK_SPECIFIC_IRQ) > DRM_DEBUG_DRIVER("Sink specific irq unhandled\n"); > } >diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h >index ce4679a0b530..82cda9a5aae3 100644 >--- a/drivers/gpu/drm/i915/intel_drv.h >+++ b/drivers/gpu/drm/i915/intel_drv.h >@@ -1969,10 +1969,10 @@ int intel_hdcp_init(struct intel_connector >*connector, > bool hdcp2_supported); > int intel_hdcp_enable(struct intel_connector *connector); int >intel_hdcp_disable(struct intel_connector *connector); -int >intel_hdcp_check_link(struct intel_connector *connector); bool >is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port); int >intel_hdcp_component_init(struct drm_i915_private *dev_priv); bool >is_hdcp2_supported(struct drm_i915_private *dev_priv); >+void intel_hdcp_handle_cp_irq(struct intel_connector *connector); > > /* intel_psr.c */ > #define CAN_PSR(dev_priv) (HAS_PSR(dev_priv) && dev_priv->psr.sink_support) >diff --git a/drivers/gpu/drm/i915/intel_hdcp.c >b/drivers/gpu/drm/i915/intel_hdcp.c >index 6afce9ae09ed..66d47240336f 100644 >--- a/drivers/gpu/drm/i915/intel_hdcp.c >+++ b/drivers/gpu/drm/i915/intel_hdcp.c >@@ -32,6 +32,7 @@ int intel_hdcp_read_valid_bksv(struct intel_digital_port >*intel_dig_port, > const struct intel_hdcp_shim *shim, u8 *bksv); static >struct intel_digital_port *conn_to_dig_port(struct intel_connector *connector); >+static int intel_hdcp_check_link(struct intel_connector *connector); > > /* Is HDCP1.4 capable on Platform and Panel */ static bool >intel_hdcp_capable(struct intel_connector *connector) @@ -66,6 +67,26 @@ >static bool intel_hdcp2_capable(struct intel_connector *connector) > return capable; > } > >+static inline bool intel_hdcp_in_use(struct intel_connector *connector) >+{ >+ struct drm_i915_private *dev_priv = to_i915(connector->base.dev); >+ enum port port = connector->encoder->port; >+ u32 reg; >+ >+ reg = I915_READ(PORT_HDCP_STATUS(port)); >+ return reg & (HDCP_STATUS_AUTH | HDCP_STATUS_ENC); } >+ >+static inline bool intel_hdcp2_in_use(struct intel_connector >+*connector) { >+ struct drm_i915_private *dev_priv = to_i915(connector->base.dev); >+ enum port port = connector->encoder->port; >+ u32 reg; >+ >+ reg = I915_READ(HDCP2_STATUS_DDI(port)); >+ return reg & (LINK_ENCRYPTION_STATUS | LINK_AUTH_STATUS); } >+ > static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port, > const struct intel_hdcp_shim *shim) { @@ - >928,7 +949,7 @@ void intel_hdcp_atomic_check(struct drm_connector >*connector, } > > /* Implements Part 3 of the HDCP authorization procedure */ -int >intel_hdcp_check_link(struct intel_connector *connector) >+static int intel_hdcp_check_link(struct intel_connector *connector) > { > struct intel_hdcp *hdcp = &connector->hdcp; > struct drm_i915_private *dev_priv = connector->base.dev->dev_private; >@@ -1821,3 +1842,11 @@ static void intel_hdcp2_check_work(struct >work_struct *work) > schedule_delayed_work(&hdcp->hdcp2_check_work, > DRM_HDCP2_CHECK_PERIOD_MS); > } >+ >+void intel_hdcp_handle_cp_irq(struct intel_connector *connector) { >+ if (intel_hdcp_in_use(connector)) >+ intel_hdcp_check_link(connector); Handle the return value. Atleast a print in case of link failures through this path. >+ else if (intel_hdcp2_in_use(connector)) >+ intel_hdcp2_check_link(connector); Same here. With above fixed. Reviewed-by: Uma Shankar <uma.shankar@intel.com> >+} >-- >2.7.4
On Wednesday 01 August 2018 04:32 PM, Shankar, Uma wrote: > >> -----Original Message----- >> From: C, Ramalingam >> Sent: Saturday, July 14, 2018 8:45 AM >> To: intel-gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org; >> daniel@ffwll.ch; seanpaul@chromium.org; Winkler, Tomas >> <tomas.winkler@intel.com>; Usyskin, Alexander <alexander.usyskin@intel.com>; >> Shankar, Uma <uma.shankar@intel.com> >> Cc: Sharma, Shashank <shashank.sharma@intel.com>; C, Ramalingam >> <ramalingam.c@intel.com> >> Subject: [PATCH v6 17/35] drm/i915: Check HDCP 1.4 and 2.2 link on CP_IRQ >> >> On DP HDCP1.4 and 2.2, when CP_IRQ is received, start the link integrity check >> for the HDCP version that is enabled. >> >> v2: >> Rebased. Function name is changed. >> v3: >> No Changes. >> v4: >> No Changes. >> v5: >> No Changes. >> v6: >> %s/_in_force/_in_use [Sean Paul] >> >> Signed-off-by: Ramalingam C <ramalingam.c@intel.com> >> cc: Sean Paul <seanpaul@chromium.org> >> Reviewed-by: Sean Paul <seanpaul@chromium.org> >> --- >> drivers/gpu/drm/i915/intel_dp.c | 2 +- >> drivers/gpu/drm/i915/intel_drv.h | 2 +- drivers/gpu/drm/i915/intel_hdcp.c | 31 >> ++++++++++++++++++++++++++++++- >> 3 files changed, 32 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c >> index 0d31c9c286e9..6dcb09430fb5 100644 >> --- a/drivers/gpu/drm/i915/intel_dp.c >> +++ b/drivers/gpu/drm/i915/intel_dp.c >> @@ -4484,7 +4484,7 @@ intel_dp_short_pulse(struct intel_dp *intel_dp) >> if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST) >> intel_dp_handle_test_request(intel_dp); >> if (sink_irq_vector & DP_CP_IRQ) >> - intel_hdcp_check_link(intel_dp->attached_connector); >> + intel_hdcp_handle_cp_irq(intel_dp- >>> attached_connector); >> if (sink_irq_vector & DP_SINK_SPECIFIC_IRQ) >> DRM_DEBUG_DRIVER("Sink specific irq unhandled\n"); >> } >> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h >> index ce4679a0b530..82cda9a5aae3 100644 >> --- a/drivers/gpu/drm/i915/intel_drv.h >> +++ b/drivers/gpu/drm/i915/intel_drv.h >> @@ -1969,10 +1969,10 @@ int intel_hdcp_init(struct intel_connector >> *connector, >> bool hdcp2_supported); >> int intel_hdcp_enable(struct intel_connector *connector); int >> intel_hdcp_disable(struct intel_connector *connector); -int >> intel_hdcp_check_link(struct intel_connector *connector); bool >> is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port); int >> intel_hdcp_component_init(struct drm_i915_private *dev_priv); bool >> is_hdcp2_supported(struct drm_i915_private *dev_priv); >> +void intel_hdcp_handle_cp_irq(struct intel_connector *connector); >> >> /* intel_psr.c */ >> #define CAN_PSR(dev_priv) (HAS_PSR(dev_priv) && dev_priv->psr.sink_support) >> diff --git a/drivers/gpu/drm/i915/intel_hdcp.c >> b/drivers/gpu/drm/i915/intel_hdcp.c >> index 6afce9ae09ed..66d47240336f 100644 >> --- a/drivers/gpu/drm/i915/intel_hdcp.c >> +++ b/drivers/gpu/drm/i915/intel_hdcp.c >> @@ -32,6 +32,7 @@ int intel_hdcp_read_valid_bksv(struct intel_digital_port >> *intel_dig_port, >> const struct intel_hdcp_shim *shim, u8 *bksv); static >> struct intel_digital_port *conn_to_dig_port(struct intel_connector *connector); >> +static int intel_hdcp_check_link(struct intel_connector *connector); >> >> /* Is HDCP1.4 capable on Platform and Panel */ static bool >> intel_hdcp_capable(struct intel_connector *connector) @@ -66,6 +67,26 @@ >> static bool intel_hdcp2_capable(struct intel_connector *connector) >> return capable; >> } >> >> +static inline bool intel_hdcp_in_use(struct intel_connector *connector) >> +{ >> + struct drm_i915_private *dev_priv = to_i915(connector->base.dev); >> + enum port port = connector->encoder->port; >> + u32 reg; >> + >> + reg = I915_READ(PORT_HDCP_STATUS(port)); >> + return reg & (HDCP_STATUS_AUTH | HDCP_STATUS_ENC); } >> + >> +static inline bool intel_hdcp2_in_use(struct intel_connector >> +*connector) { >> + struct drm_i915_private *dev_priv = to_i915(connector->base.dev); >> + enum port port = connector->encoder->port; >> + u32 reg; >> + >> + reg = I915_READ(HDCP2_STATUS_DDI(port)); >> + return reg & (LINK_ENCRYPTION_STATUS | LINK_AUTH_STATUS); } >> + >> static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port, >> const struct intel_hdcp_shim *shim) { @@ - >> 928,7 +949,7 @@ void intel_hdcp_atomic_check(struct drm_connector >> *connector, } >> >> /* Implements Part 3 of the HDCP authorization procedure */ -int >> intel_hdcp_check_link(struct intel_connector *connector) >> +static int intel_hdcp_check_link(struct intel_connector *connector) >> { >> struct intel_hdcp *hdcp = &connector->hdcp; >> struct drm_i915_private *dev_priv = connector->base.dev->dev_private; >> @@ -1821,3 +1842,11 @@ static void intel_hdcp2_check_work(struct >> work_struct *work) >> schedule_delayed_work(&hdcp->hdcp2_check_work, >> DRM_HDCP2_CHECK_PERIOD_MS); >> } >> + >> +void intel_hdcp_handle_cp_irq(struct intel_connector *connector) { >> + if (intel_hdcp_in_use(connector)) >> + intel_hdcp_check_link(connector); > Handle the return value. Atleast a print in case of link failures through this > path. > >> + else if (intel_hdcp2_in_use(connector)) >> + intel_hdcp2_check_link(connector); > Same here. Uma, At this handler of CP_IRQ, we don't want to handle the return of the Link integrity check. As CP_IRQ could be generated for LINK_INTEGRITY_FAILURE and REAUTH_REQ and which are handled in the check_link() And if reauth(Disable -> Enable) fails we have nothing to do. So we need not handle it. Errors are already logged within check_link(). --Ram. > With above fixed. > Reviewed-by: Uma Shankar <uma.shankar@intel.com> > >> +} >> -- >> 2.7.4
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 0d31c9c286e9..6dcb09430fb5 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -4484,7 +4484,7 @@ intel_dp_short_pulse(struct intel_dp *intel_dp) if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST) intel_dp_handle_test_request(intel_dp); if (sink_irq_vector & DP_CP_IRQ) - intel_hdcp_check_link(intel_dp->attached_connector); + intel_hdcp_handle_cp_irq(intel_dp->attached_connector); if (sink_irq_vector & DP_SINK_SPECIFIC_IRQ) DRM_DEBUG_DRIVER("Sink specific irq unhandled\n"); } diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index ce4679a0b530..82cda9a5aae3 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -1969,10 +1969,10 @@ int intel_hdcp_init(struct intel_connector *connector, bool hdcp2_supported); int intel_hdcp_enable(struct intel_connector *connector); int intel_hdcp_disable(struct intel_connector *connector); -int intel_hdcp_check_link(struct intel_connector *connector); bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port); int intel_hdcp_component_init(struct drm_i915_private *dev_priv); bool is_hdcp2_supported(struct drm_i915_private *dev_priv); +void intel_hdcp_handle_cp_irq(struct intel_connector *connector); /* intel_psr.c */ #define CAN_PSR(dev_priv) (HAS_PSR(dev_priv) && dev_priv->psr.sink_support) diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c index 6afce9ae09ed..66d47240336f 100644 --- a/drivers/gpu/drm/i915/intel_hdcp.c +++ b/drivers/gpu/drm/i915/intel_hdcp.c @@ -32,6 +32,7 @@ int intel_hdcp_read_valid_bksv(struct intel_digital_port *intel_dig_port, const struct intel_hdcp_shim *shim, u8 *bksv); static struct intel_digital_port *conn_to_dig_port(struct intel_connector *connector); +static int intel_hdcp_check_link(struct intel_connector *connector); /* Is HDCP1.4 capable on Platform and Panel */ static bool intel_hdcp_capable(struct intel_connector *connector) @@ -66,6 +67,26 @@ static bool intel_hdcp2_capable(struct intel_connector *connector) return capable; } +static inline bool intel_hdcp_in_use(struct intel_connector *connector) +{ + struct drm_i915_private *dev_priv = to_i915(connector->base.dev); + enum port port = connector->encoder->port; + u32 reg; + + reg = I915_READ(PORT_HDCP_STATUS(port)); + return reg & (HDCP_STATUS_AUTH | HDCP_STATUS_ENC); +} + +static inline bool intel_hdcp2_in_use(struct intel_connector *connector) +{ + struct drm_i915_private *dev_priv = to_i915(connector->base.dev); + enum port port = connector->encoder->port; + u32 reg; + + reg = I915_READ(HDCP2_STATUS_DDI(port)); + return reg & (LINK_ENCRYPTION_STATUS | LINK_AUTH_STATUS); +} + static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port, const struct intel_hdcp_shim *shim) { @@ -928,7 +949,7 @@ void intel_hdcp_atomic_check(struct drm_connector *connector, } /* Implements Part 3 of the HDCP authorization procedure */ -int intel_hdcp_check_link(struct intel_connector *connector) +static int intel_hdcp_check_link(struct intel_connector *connector) { struct intel_hdcp *hdcp = &connector->hdcp; struct drm_i915_private *dev_priv = connector->base.dev->dev_private; @@ -1821,3 +1842,11 @@ static void intel_hdcp2_check_work(struct work_struct *work) schedule_delayed_work(&hdcp->hdcp2_check_work, DRM_HDCP2_CHECK_PERIOD_MS); } + +void intel_hdcp_handle_cp_irq(struct intel_connector *connector) +{ + if (intel_hdcp_in_use(connector)) + intel_hdcp_check_link(connector); + else if (intel_hdcp2_in_use(connector)) + intel_hdcp2_check_link(connector); +}