Message ID | 1548917996-28081-4-git-send-email-ramalingam.c@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915: Implement HDCP2.2 | expand |
>-----Original Message----- >From: C, Ramalingam >Sent: Thursday, January 31, 2019 12:29 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 03/40] drm/i915: Gathering the HDCP1.4 routines together > >All HDCP1.4 routines are gathered together, followed by the generic functions >those can be extended for HDCP2.2 too. > >Signed-off-by: Ramalingam C <ramalingam.c@intel.com> >Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> Looks ok to me. Reviewed-by: Uma Shankar <uma.shankar@intel.com> >--- > drivers/gpu/drm/i915/intel_hdcp.c | 118 +++++++++++++++++++------------------- > 1 file changed, 59 insertions(+), 59 deletions(-) > >diff --git a/drivers/gpu/drm/i915/intel_hdcp.c >b/drivers/gpu/drm/i915/intel_hdcp.c >index ce7ba3a9c000..8cb85b07cfde 100644 >--- a/drivers/gpu/drm/i915/intel_hdcp.c >+++ b/drivers/gpu/drm/i915/intel_hdcp.c >@@ -730,6 +730,65 @@ struct intel_connector *intel_hdcp_to_connector(struct >intel_hdcp *hdcp) > return container_of(hdcp, struct intel_connector, hdcp); } > >+/* Implements Part 3 of the HDCP authorization procedure */ 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; >+ struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); >+ enum port port = intel_dig_port->base.port; >+ int ret = 0; >+ >+ if (!hdcp->shim) >+ return -ENOENT; >+ >+ mutex_lock(&hdcp->mutex); >+ >+ if (hdcp->value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED) >+ goto out; >+ >+ if (!(I915_READ(PORT_HDCP_STATUS(port)) & HDCP_STATUS_ENC)) { >+ DRM_ERROR("%s:%d HDCP check failed: link is not >encrypted,%x\n", >+ connector->base.name, connector->base.base.id, >+ I915_READ(PORT_HDCP_STATUS(port))); >+ ret = -ENXIO; >+ hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; >+ schedule_work(&hdcp->prop_work); >+ goto out; >+ } >+ >+ if (hdcp->shim->check_link(intel_dig_port)) { >+ if (hdcp->value != >DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { >+ hdcp->value = >DRM_MODE_CONTENT_PROTECTION_ENABLED; >+ schedule_work(&hdcp->prop_work); >+ } >+ goto out; >+ } >+ >+ DRM_DEBUG_KMS("[%s:%d] HDCP link failed, retrying authentication\n", >+ connector->base.name, connector->base.base.id); >+ >+ ret = _intel_hdcp_disable(connector); >+ if (ret) { >+ DRM_ERROR("Failed to disable hdcp (%d)\n", ret); >+ hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; >+ schedule_work(&hdcp->prop_work); >+ goto out; >+ } >+ >+ ret = _intel_hdcp_enable(connector); >+ if (ret) { >+ DRM_ERROR("Failed to enable hdcp (%d)\n", ret); >+ hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; >+ schedule_work(&hdcp->prop_work); >+ goto out; >+ } >+ >+out: >+ mutex_unlock(&hdcp->mutex); >+ return ret; >+} >+ > static void intel_hdcp_check_work(struct work_struct *work) { > struct intel_hdcp *hdcp = container_of(to_delayed_work(work), >@@ -866,62 +925,3 @@ void intel_hdcp_atomic_check(struct drm_connector >*connector, > new_state->crtc); > crtc_state->mode_changed = true; > } >- >-/* Implements Part 3 of the HDCP authorization procedure */ -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; >- struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); >- enum port port = intel_dig_port->base.port; >- int ret = 0; >- >- if (!hdcp->shim) >- return -ENOENT; >- >- mutex_lock(&hdcp->mutex); >- >- if (hdcp->value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED) >- goto out; >- >- if (!(I915_READ(PORT_HDCP_STATUS(port)) & HDCP_STATUS_ENC)) { >- DRM_ERROR("%s:%d HDCP check failed: link is not >encrypted,%x\n", >- connector->base.name, connector->base.base.id, >- I915_READ(PORT_HDCP_STATUS(port))); >- ret = -ENXIO; >- hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; >- schedule_work(&hdcp->prop_work); >- goto out; >- } >- >- if (hdcp->shim->check_link(intel_dig_port)) { >- if (hdcp->value != >DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { >- hdcp->value = >DRM_MODE_CONTENT_PROTECTION_ENABLED; >- schedule_work(&hdcp->prop_work); >- } >- goto out; >- } >- >- DRM_DEBUG_KMS("[%s:%d] HDCP link failed, retrying authentication\n", >- connector->base.name, connector->base.base.id); >- >- ret = _intel_hdcp_disable(connector); >- if (ret) { >- DRM_ERROR("Failed to disable hdcp (%d)\n", ret); >- hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; >- schedule_work(&hdcp->prop_work); >- goto out; >- } >- >- ret = _intel_hdcp_enable(connector); >- if (ret) { >- DRM_DEBUG_KMS("Failed to enable hdcp (%d)\n", ret); >- hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; >- schedule_work(&hdcp->prop_work); >- goto out; >- } >- >-out: >- mutex_unlock(&hdcp->mutex); >- return ret; >-} >-- >2.7.4
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c index ce7ba3a9c000..8cb85b07cfde 100644 --- a/drivers/gpu/drm/i915/intel_hdcp.c +++ b/drivers/gpu/drm/i915/intel_hdcp.c @@ -730,6 +730,65 @@ struct intel_connector *intel_hdcp_to_connector(struct intel_hdcp *hdcp) return container_of(hdcp, struct intel_connector, hdcp); } +/* Implements Part 3 of the HDCP authorization procedure */ +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; + struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); + enum port port = intel_dig_port->base.port; + int ret = 0; + + if (!hdcp->shim) + return -ENOENT; + + mutex_lock(&hdcp->mutex); + + if (hdcp->value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED) + goto out; + + if (!(I915_READ(PORT_HDCP_STATUS(port)) & HDCP_STATUS_ENC)) { + DRM_ERROR("%s:%d HDCP check failed: link is not encrypted,%x\n", + connector->base.name, connector->base.base.id, + I915_READ(PORT_HDCP_STATUS(port))); + ret = -ENXIO; + hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; + schedule_work(&hdcp->prop_work); + goto out; + } + + if (hdcp->shim->check_link(intel_dig_port)) { + if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { + hdcp->value = DRM_MODE_CONTENT_PROTECTION_ENABLED; + schedule_work(&hdcp->prop_work); + } + goto out; + } + + DRM_DEBUG_KMS("[%s:%d] HDCP link failed, retrying authentication\n", + connector->base.name, connector->base.base.id); + + ret = _intel_hdcp_disable(connector); + if (ret) { + DRM_ERROR("Failed to disable hdcp (%d)\n", ret); + hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; + schedule_work(&hdcp->prop_work); + goto out; + } + + ret = _intel_hdcp_enable(connector); + if (ret) { + DRM_ERROR("Failed to enable hdcp (%d)\n", ret); + hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; + schedule_work(&hdcp->prop_work); + goto out; + } + +out: + mutex_unlock(&hdcp->mutex); + return ret; +} + static void intel_hdcp_check_work(struct work_struct *work) { struct intel_hdcp *hdcp = container_of(to_delayed_work(work), @@ -866,62 +925,3 @@ void intel_hdcp_atomic_check(struct drm_connector *connector, new_state->crtc); crtc_state->mode_changed = true; } - -/* Implements Part 3 of the HDCP authorization procedure */ -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; - struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); - enum port port = intel_dig_port->base.port; - int ret = 0; - - if (!hdcp->shim) - return -ENOENT; - - mutex_lock(&hdcp->mutex); - - if (hdcp->value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED) - goto out; - - if (!(I915_READ(PORT_HDCP_STATUS(port)) & HDCP_STATUS_ENC)) { - DRM_ERROR("%s:%d HDCP check failed: link is not encrypted,%x\n", - connector->base.name, connector->base.base.id, - I915_READ(PORT_HDCP_STATUS(port))); - ret = -ENXIO; - hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; - schedule_work(&hdcp->prop_work); - goto out; - } - - if (hdcp->shim->check_link(intel_dig_port)) { - if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { - hdcp->value = DRM_MODE_CONTENT_PROTECTION_ENABLED; - schedule_work(&hdcp->prop_work); - } - goto out; - } - - DRM_DEBUG_KMS("[%s:%d] HDCP link failed, retrying authentication\n", - connector->base.name, connector->base.base.id); - - ret = _intel_hdcp_disable(connector); - if (ret) { - DRM_ERROR("Failed to disable hdcp (%d)\n", ret); - hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; - schedule_work(&hdcp->prop_work); - goto out; - } - - ret = _intel_hdcp_enable(connector); - if (ret) { - DRM_DEBUG_KMS("Failed to enable hdcp (%d)\n", ret); - hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED; - schedule_work(&hdcp->prop_work); - goto out; - } - -out: - mutex_unlock(&hdcp->mutex); - return ret; -}