From: Ramalingam C <ramalingam.c@intel.com>
To: seanpaul@chromium.org, intel-gfx@lists.freedesktop.org,
rodrigo.vivi@intel.com, daniel.vetter@ffwll.ch
Cc: tomas.winkler@intel.com
Subject: [PATCH 35/43] drm/i915: Enable HDCP version that is best capable
Date: Wed, 14 Feb 2018 19:43:50 +0530 [thread overview]
Message-ID: <1518617638-21684-36-git-send-email-ramalingam.c@intel.com> (raw)
In-Reply-To: <1518617638-21684-1-git-send-email-ramalingam.c@intel.com>
hdcp_enable_work is extended to choose the better hdcp version based
on the system and panel capability.
And intel_hdcp_disable will find the version that is inforce, if any.
And corresponding version specific disable function alone called.
Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
---
drivers/gpu/drm/i915/intel_hdcp.c | 112 ++++++++++++++++++++++++++++++++++----
1 file changed, 100 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
index 69ae47eaff49..2fe73f7eb6dd 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -27,6 +27,43 @@ static int _intel_hdcp2_disable(struct intel_hdcp *hdcp);
static void intel_hdcp2_check_work(struct work_struct *work);
static int intel_hdcp2_check_link(struct intel_hdcp *hdcp);
+static inline bool intel_hdcp1_supported(struct intel_hdcp *hdcp)
+{
+ return (hdcp->plat_cap & HDCP_CAPABILITY &&
+ hdcp->panel_cap & HDCP_CAPABILITY);
+}
+
+static inline bool intel_hdcp2_supported(struct intel_hdcp *hdcp)
+{
+ return (hdcp->plat_cap & HDCP2_CAPABILITY &&
+ hdcp->panel_cap & HDCP2_CAPABILITY);
+}
+
+static inline bool intel_hdcp_in_force(struct intel_hdcp *hdcp)
+{
+ struct drm_i915_private *dev_priv = to_i915(hdcp->connector->base.dev);
+ enum port port = hdcp->connector->encoder->port;
+ u32 reg;
+
+ reg = I915_READ(PORT_HDCP_STATUS(port));
+ if (reg & HDCP_STATUS_AUTH || reg & HDCP_STATUS_ENC)
+ return true;
+ return false;
+
+}
+
+static inline bool intel_hdcp2_in_force(struct intel_hdcp *hdcp)
+{
+ struct drm_i915_private *dev_priv = to_i915(hdcp->connector->base.dev);
+ enum port port = hdcp->connector->encoder->port;
+ u32 reg;
+
+ reg = I915_READ(HDCP2_STATUS_DDI(port));
+ if (reg & LINK_ENCRYPTION_STATUS || reg & LINK_AUTH_STATUS)
+ return true;
+ return false;
+}
+
static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port,
const struct intel_hdcp_shim *shim)
{
@@ -650,7 +687,11 @@ static void intel_hdcp_enable_work(struct work_struct *work)
hdcp_enable_work);
mutex_lock(&hdcp->hdcp_mutex);
- _intel_hdcp_enable(hdcp);
+ if (intel_hdcp2_supported(hdcp))
+ _intel_hdcp2_enable(hdcp);
+ else if (intel_hdcp1_supported(hdcp))
+ _intel_hdcp_enable(hdcp);
+
mutex_unlock(&hdcp->hdcp_mutex);
}
@@ -727,13 +768,48 @@ int intel_hdcp_init(struct intel_connector *connector,
return ret;
}
+static void intel_hdcp_probe_panel_cap(struct intel_hdcp *hdcp)
+{
+ struct intel_digital_port *intel_dig_port =
+ conn_to_dig_port(hdcp->connector);
+ bool capable = false;
+ u8 bksv[5];
+
+ hdcp->panel_cap = 0;
+
+ if (hdcp->plat_cap & HDCP_CAPABILITY) {
+ if (hdcp->hdcp_shim->hdcp_capable) {
+ hdcp->hdcp_shim->hdcp_capable(intel_dig_port, &capable);
+ } else {
+ if (!intel_hdcp_read_valid_bksv(intel_dig_port,
+ hdcp->hdcp_shim, bksv))
+ capable = true;
+ }
+ if (capable)
+ hdcp->panel_cap |= HDCP_CAPABILITY;
+ }
+
+ if (hdcp->plat_cap & HDCP2_CAPABILITY) {
+ hdcp->hdcp2_shim->hdcp_capable(intel_dig_port, &capable);
+ if (capable)
+ hdcp->panel_cap |= HDCP2_CAPABILITY;
+ }
+ DRM_DEBUG_KMS("plat_cap: 0x%X, panel_cap: 0x%X\n",
+ hdcp->plat_cap, hdcp->panel_cap);
+}
+
int intel_hdcp_enable(struct intel_connector *connector)
{
struct intel_hdcp *hdcp = connector->hdcp;
- if (!hdcp || !hdcp->hdcp_shim)
+ if (!hdcp)
return -ENOENT;
+ intel_hdcp_probe_panel_cap(hdcp);
+
+ if (!intel_hdcp1_supported(hdcp) && !intel_hdcp2_supported(hdcp))
+ return -EINVAL;
+
mutex_lock(&hdcp->hdcp_mutex);
schedule_work(&hdcp->hdcp_enable_work);
mutex_unlock(&hdcp->hdcp_mutex);
@@ -744,21 +820,33 @@ int intel_hdcp_enable(struct intel_connector *connector)
int intel_hdcp_disable(struct intel_connector *connector)
{
struct intel_hdcp *hdcp = connector->hdcp;
- int ret = 0;
- if (!hdcp || !hdcp->hdcp_shim)
+ if (!hdcp)
return -ENOENT;
- mutex_lock(&hdcp->hdcp_mutex);
+ if (hdcp->hdcp_value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
+ return 0;
- if (hdcp->hdcp_value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
- hdcp->hdcp_value = DRM_MODE_CONTENT_PROTECTION_UNDESIRED;
- ret = _intel_hdcp_disable(hdcp);
- }
+ /*
+ * Setting it out of mutex, so that other on going process like check
+ * link and auth can check for this state change and terminate themself.
+ */
+ hdcp->hdcp_value = DRM_MODE_CONTENT_PROTECTION_UNDESIRED;
+ cancel_work_sync(&hdcp->hdcp_enable_work);
- mutex_unlock(&hdcp->hdcp_mutex);
cancel_delayed_work_sync(&hdcp->hdcp_check_work);
- return ret;
+ cancel_delayed_work_sync(&hdcp->hdcp2_check_work);
+
+ mutex_lock(&hdcp->hdcp_mutex);
+ if (hdcp->plat_cap & HDCP_CAPABILITY)
+ if (intel_hdcp_in_force(hdcp))
+ _intel_hdcp_disable(hdcp);
+ if (hdcp->plat_cap & HDCP2_CAPABILITY)
+ if (intel_hdcp2_in_force(hdcp))
+ _intel_hdcp2_disable(hdcp);
+ mutex_unlock(&hdcp->hdcp_mutex);
+
+ return 0;
}
void intel_hdcp_atomic_check(struct drm_connector *connector,
@@ -1437,7 +1525,7 @@ static int _intel_hdcp2_disable(struct intel_hdcp *hdcp)
{
int ret;
- DRM_ERROR("[%s:%d] HDCP2.2 is being Disabled\n",
+ DRM_INFO("[%s:%d] HDCP2.2 is being Disabled\n",
hdcp->connector->base.name, hdcp->connector->base.base.id);
ret = hdcp2_disable_encryption(hdcp);
--
2.7.4
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2018-02-14 14:21 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-14 14:13 [PATCH 00/43] drm/i915: Implement HDCP2.2 Ramalingam C
2018-02-14 14:13 ` [PATCH 01/43] drm: hdcp2.2 authentication msg definitions Ramalingam C
2018-02-14 15:15 ` Winkler, Tomas
2018-02-14 19:40 ` Jani Nikula
2018-02-22 5:24 ` Ramalingam C
2018-02-22 5:29 ` Ramalingam C
2018-02-14 14:13 ` [PATCH 02/43] drm: HDMI and DP specific HDCP2.2 defines Ramalingam C
2018-02-14 14:13 ` [PATCH 03/43] mei: bus: whitelist hdcp client Ramalingam C
2018-02-14 14:13 ` [PATCH 04/43] mei: me: add gemini lake devices ids Ramalingam C
2018-02-14 14:45 ` Winkler, Tomas
2018-02-22 5:22 ` Ramalingam C
2018-02-14 14:13 ` [PATCH 05/43] misc/mei/hdcp: Client driver for HDCP application Ramalingam C
2018-02-14 14:54 ` Winkler, Tomas
2018-02-14 14:57 ` Ramalingam C
2018-02-14 14:13 ` [PATCH 06/43] misc/mei/hdcp: Add KBuild for mei hdcp driver Ramalingam C
2018-02-14 14:54 ` Winkler, Tomas
2018-02-14 14:58 ` Ramalingam C
2018-02-28 15:43 ` Ramalingam C
2018-02-28 16:11 ` Winkler, Tomas
2018-02-14 14:13 ` [PATCH 07/43] misc/mei/hdcp: Verify mei client device status Ramalingam C
2018-02-14 14:13 ` [PATCH 08/43] misc/mei/hdcp: Get & Put for mei cl_device Ramalingam C
2018-02-14 14:13 ` [PATCH 09/43] misc/mei/hdcp: Define ME FW interface for HDCP2.2 Ramalingam C
2018-02-14 14:13 ` [PATCH 10/43] linux/mei: Header for mei_hdcp driver interface Ramalingam C
2018-02-14 14:13 ` [PATCH 11/43] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session Ramalingam C
2018-02-14 14:13 ` [PATCH 12/43] misc/mei/hdcp: Verify Receiver Cert and prepare km Ramalingam C
2018-02-14 14:13 ` [PATCH 13/43] misc/mei/hdcp: Verify H_prime Ramalingam C
2018-02-14 14:13 ` [PATCH 14/43] misc/mei/hdcp: Store the HDCP Pairing info Ramalingam C
2018-02-14 14:13 ` [PATCH 15/43] misc/mei/hdcp: Initiate Locality check Ramalingam C
2018-02-14 14:13 ` [PATCH 16/43] misc/mei/hdcp: Verify L_prime Ramalingam C
2018-02-14 14:13 ` [PATCH 17/43] misc/mei/hdcp: Prepare Session Key Ramalingam C
2018-02-14 14:13 ` [PATCH 18/43] misc/mei/hdcp: Repeater topology verifcation and ack Ramalingam C
2018-02-14 14:13 ` [PATCH 19/43] misc/mei/hdcp: Verify M_prime Ramalingam C
2018-02-14 14:13 ` [PATCH 20/43] misc/mei/hdcp: Enabling the HDCP authentication Ramalingam C
2018-02-14 14:13 ` [PATCH 21/43] misc/mei/hdcp: Closing wired HDCP2.2 Tx Session Ramalingam C
2018-02-14 14:13 ` [PATCH 22/43] drm/i915: Async execution of hdcp authentication Ramalingam C
2018-02-22 14:39 ` Sean Paul
2018-02-26 6:32 ` Ramalingam C
2018-02-14 14:13 ` [PATCH 23/43] drm/i915: wrapping all hdcp var into intel_hdcp Ramalingam C
2018-02-22 14:47 ` Sean Paul
2018-02-26 6:05 ` Ramalingam C
2018-02-14 14:13 ` [PATCH 24/43] drm/i915: wait for cp_irq Ramalingam C
2018-02-22 15:46 ` Sean Paul
2018-02-26 5:49 ` Ramalingam C
2018-02-14 14:13 ` [PATCH 25/43] drm/i915: Define HDCP2.2 related variables Ramalingam C
2018-02-14 14:36 ` Chris Wilson
2018-02-14 14:56 ` Ramalingam C
2018-02-22 14:59 ` Sean Paul
2018-02-26 5:46 ` Ramalingam C
2018-02-14 14:13 ` [PATCH 26/43] drm/i915: Define Intel HDCP2.2 registers Ramalingam C
2018-02-22 15:43 ` Sean Paul
2018-02-26 5:33 ` Ramalingam C
2018-02-14 14:13 ` [PATCH 27/43] drm/i915: Wrappers for mei HDCP2.2 services Ramalingam C
2018-02-14 14:13 ` [PATCH 28/43] drm/i915: Implement HDCP2.2 receiver authentication Ramalingam C
2018-02-14 14:13 ` [PATCH 29/43] drm/i915: Implement HDCP2.2 repeater authentication Ramalingam C
2018-02-14 14:13 ` [PATCH 30/43] drm/i915: Enable and Disable HDCP2.2 port encryption Ramalingam C
2018-02-14 14:38 ` Chris Wilson
2018-02-14 14:52 ` Ramalingam C
2018-02-14 14:13 ` [PATCH 31/43] drm/i915: Implement HDCP2.2 En/Dis-able Ramalingam C
2018-02-14 14:13 ` [PATCH 32/43] drm/i915: Implement HDCP2.2 link integrity check Ramalingam C
2018-02-14 14:13 ` [PATCH 33/43] drm/i915: Handle HDCP2.2 downstream topology change Ramalingam C
2018-02-14 14:13 ` [PATCH 34/43] drm/i915: Pullout the bksv read and validation Ramalingam C
2018-02-14 14:13 ` Ramalingam C [this message]
2018-02-14 14:42 ` [PATCH 35/43] drm/i915: Enable HDCP version that is best capable Chris Wilson
2018-02-14 14:51 ` Ramalingam C
2018-02-14 15:00 ` Chris Wilson
2018-02-14 15:00 ` Ramalingam C
2018-02-14 14:13 ` [PATCH 36/43] drm/i915: Enable HDCP1.4 incase of HDCP2.2 failure Ramalingam C
2018-02-14 14:13 ` [PATCH 37/43] drm/i915: Initialize HDCP2.2 and its MEI interface Ramalingam C
2018-02-14 14:45 ` Chris Wilson
2018-02-14 14:45 ` Ramalingam C
2018-02-14 14:13 ` [PATCH 38/43] drm/i915: Implement gmbus burst read Ramalingam C
2018-02-14 14:13 ` [PATCH 39/43] drm/i915: Implement the HDCP2.2 support for DP Ramalingam C
2018-02-14 14:13 ` [PATCH 40/43] drm/i915: Implement the HDCP2.2 support for HDMI Ramalingam C
2018-02-14 14:13 ` [PATCH 41/43] drm/i915: Add HDCP2.2 support for DP connectors Ramalingam C
2018-02-14 14:13 ` [PATCH 42/43] drm/i915: Add HDCP2.2 support for HDMI connectors Ramalingam C
2018-02-14 14:13 ` [PATCH 43/43] drm/i915: Invoke check link on CP_IRQ of DP Ramalingam C
2018-02-14 15:07 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Implement HDCP2.2 Patchwork
2018-02-14 15:13 ` ✗ Fi.CI.SPARSE: " Patchwork
2018-02-14 15:20 ` ✗ Fi.CI.BAT: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1518617638-21684-36-git-send-email-ramalingam.c@intel.com \
--to=ramalingam.c@intel.com \
--cc=daniel.vetter@ffwll.ch \
--cc=intel-gfx@lists.freedesktop.org \
--cc=rodrigo.vivi@intel.com \
--cc=seanpaul@chromium.org \
--cc=tomas.winkler@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox