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 37/43] drm/i915: Initialize HDCP2.2 and its MEI interface
Date: Wed, 14 Feb 2018 19:43:52 +0530 [thread overview]
Message-ID: <1518617638-21684-38-git-send-email-ramalingam.c@intel.com> (raw)
In-Reply-To: <1518617638-21684-1-git-send-email-ramalingam.c@intel.com>
Implements the init and exit for hdcp2.2 support. This includes the
mei interface initialization also.
Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
---
drivers/gpu/drm/i915/intel_dp.c | 3 +-
drivers/gpu/drm/i915/intel_drv.h | 3 +-
drivers/gpu/drm/i915/intel_hdcp.c | 145 +++++++++++++++++++++++++++++++++++++-
drivers/gpu/drm/i915/intel_hdmi.c | 2 +-
4 files changed, 147 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 8847f1a36504..6f6b4c8e3a42 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -6463,7 +6463,8 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
intel_dp_add_properties(intel_dp, connector);
if (is_hdcp_supported(dev_priv, port) && !intel_dp_is_edp(intel_dp)) {
- int ret = intel_hdcp_init(intel_connector, &intel_dp_hdcp_shim);
+ int ret = intel_hdcp_init(intel_connector, &intel_dp_hdcp_shim,
+ NULL);
if (ret)
DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
}
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 9c05049c25d5..842a22502763 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1950,7 +1950,8 @@ void intel_hdcp_atomic_check(struct drm_connector *connector,
struct drm_connector_state *old_state,
struct drm_connector_state *new_state);
int intel_hdcp_init(struct intel_connector *connector,
- const struct intel_hdcp_shim *hdcp_shim);
+ const struct intel_hdcp_shim *hdcp_shim,
+ const struct intel_hdcp2_shim *hdcp2_shim);
int intel_hdcp_enable(struct intel_connector *connector);
int intel_hdcp_disable(struct intel_connector *connector);
int intel_hdcp_check_link(struct intel_hdcp *hdcp);
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
index 9d01d1ff8c73..bb56e4e595d8 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -26,6 +26,7 @@ static int _intel_hdcp2_enable(struct intel_hdcp *hdcp);
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 void intel_hdcp2_exit(struct intel_connector *connector);
static inline bool intel_hdcp1_supported(struct intel_hdcp *hdcp)
{
@@ -738,11 +739,136 @@ bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port)
!IS_CHERRYVIEW(dev_priv) && port < PORT_E);
}
-int intel_hdcp_init(struct intel_connector *connector,
- const struct intel_hdcp_shim *hdcp_shim)
+static inline int initialize_mei_hdcp_data(struct intel_hdcp *hdcp)
+{
+ struct intel_connector *connector = hdcp->connector;
+ struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
+ struct mei_hdcp_data *data = hdcp->mei_hdcp_data;
+ enum port port;
+
+ data->cldev = dev_priv->mei_cldev;
+
+ if (connector->encoder) {
+ port = connector->encoder->port;
+ data->port = GET_MEI_DDI_INDEX(port);
+ }
+
+ data->port_type = INTEGRATED;
+ data->protocol = hdcp->hdcp2_shim->hdcp_protocol();
+
+ data->k = 1;
+ if (!data->streams)
+ data->streams = kcalloc(data->k,
+ sizeof(struct hdcp2_streamid_type),
+ GFP_KERNEL);
+ if (!data->streams)
+ return -ENOMEM;
+
+ data->streams[0].stream_id = 0;
+ data->streams[0].stream_type = hdcp->content_type;
+
+ return 0;
+}
+
+void intel_mei_cldev_reference_notify(void *client,
+ struct mei_cl_device *cldev)
+{
+ struct drm_i915_private *dev_priv = client;
+ struct drm_device *dev = &dev_priv->drm;
+ struct intel_connector *intel_connector;
+ struct drm_connector *connector;
+ struct drm_connector_list_iter conn_iter;
+
+ DRM_INFO("MEI_HDCP Notification. Interface: %s\n",
+ cldev ? "UP" : "Down");
+ dev_priv->mei_cldev = cldev;
+
+ drm_connector_list_iter_begin(dev, &conn_iter);
+ drm_for_each_connector_iter(connector, &conn_iter) {
+ intel_connector = to_intel_connector(connector);
+ if (!intel_connector->hdcp ||
+ !(intel_connector->hdcp->plat_cap & HDCP2_CAPABILITY))
+ continue;
+ if (cldev)
+ initialize_mei_hdcp_data(intel_connector->hdcp);
+ else
+ intel_hdcp2_exit(intel_connector);
+ }
+ drm_connector_list_iter_end(&conn_iter);
+}
+
+static int intel_hdcp2_init(struct intel_hdcp *hdcp,
+ const struct intel_hdcp2_shim *shim)
{
+ struct intel_connector *connector = hdcp->connector;
+ struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
int ret;
+
+ if (INTEL_GEN(dev_priv) < 10 && !IS_GEMINILAKE(dev_priv) &&
+ !IS_KABYLAKE(dev_priv))
+ return -EINVAL;
+
+ if (!dev_priv->mei_cldev && !dev_priv->mei_ref_cnt) {
+ ret = mei_hdcp_cldev_get_reference((void *)dev_priv,
+ &dev_priv->mei_cldev,
+ intel_mei_cldev_reference_notify);
+ if (ret < 0)
+ return ret;
+ }
+
+ dev_priv->mei_ref_cnt++;
+
+ hdcp->hdcp2_shim = shim;
+ hdcp->mei_hdcp_data = kzalloc(sizeof(struct mei_hdcp_data), GFP_KERNEL);
+ if (!hdcp->mei_hdcp_data) {
+ ret = -ENOMEM;
+ goto err_exit;
+ }
+
+ ret = initialize_mei_hdcp_data(hdcp);
+ if (ret)
+ goto err2_exit;
+
+ INIT_DELAYED_WORK(&hdcp->hdcp2_check_work, intel_hdcp2_check_work);
+ hdcp->plat_cap |= HDCP2_CAPABILITY;
+ return 0;
+
+err2_exit:
+ kfree(hdcp->mei_hdcp_data);
+err_exit:
+ if (!(--dev_priv->mei_ref_cnt)) {
+ mei_hdcp_cldev_put_reference(dev_priv->mei_cldev);
+ dev_priv->mei_cldev = NULL;
+ }
+ return ret;
+}
+
+static void intel_hdcp2_exit(struct intel_connector *connector)
+{
+ struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
+ struct intel_hdcp *hdcp = connector->hdcp;
+
+ intel_hdcp_disable(connector);
+
+ if (dev_priv->mei_cldev && !(--dev_priv->mei_ref_cnt)) {
+ mei_hdcp_cldev_put_reference(dev_priv->mei_cldev);
+ dev_priv->mei_cldev = NULL;
+ }
+
+ kfree(hdcp->mei_hdcp_data->streams);
+ kfree(hdcp->mei_hdcp_data);
+ hdcp->plat_cap &= ~HDCP2_CAPABILITY;
+}
+
+int intel_hdcp_init(struct intel_connector *connector,
+ const struct intel_hdcp_shim *hdcp_shim,
+ const struct intel_hdcp2_shim *hdcp2_shim)
+{
struct intel_hdcp *hdcp;
+ int ret;
+
+ if (!hdcp_shim && !hdcp2_shim)
+ return -EINVAL;
hdcp = kzalloc(sizeof(struct intel_hdcp), GFP_KERNEL);
if (!hdcp) {
@@ -750,6 +876,20 @@ int intel_hdcp_init(struct intel_connector *connector,
goto err;
}
+ hdcp->connector = connector;
+ if (hdcp_shim) {
+
+ /* Initialize HDCP1.4 */
+ INIT_DELAYED_WORK(&hdcp->hdcp_check_work,
+ intel_hdcp_check_work);
+ hdcp->hdcp_shim = hdcp_shim;
+
+ hdcp->plat_cap |= HDCP_CAPABILITY;
+ }
+
+ if (hdcp2_shim)
+ intel_hdcp2_init(hdcp, hdcp2_shim);
+
ret = drm_connector_attach_content_protection_property(
&connector->base);
if (ret)
@@ -757,7 +897,6 @@ int intel_hdcp_init(struct intel_connector *connector,
hdcp->hdcp_shim = hdcp_shim;
mutex_init(&hdcp->hdcp_mutex);
- INIT_DELAYED_WORK(&hdcp->hdcp_check_work, intel_hdcp_check_work);
INIT_WORK(&hdcp->hdcp_prop_work, intel_hdcp_prop_work);
INIT_WORK(&hdcp->hdcp_enable_work, intel_hdcp_enable_work);
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index f5d7bfb43006..23986c02dd41 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -2342,7 +2342,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
if (is_hdcp_supported(dev_priv, port)) {
int ret = intel_hdcp_init(intel_connector,
- &intel_hdmi_hdcp_shim);
+ &intel_hdmi_hdcp_shim, NULL);
if (ret)
DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
}
--
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 ` [PATCH 35/43] drm/i915: Enable HDCP version that is best capable Ramalingam C
2018-02-14 14:42 ` 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 ` Ramalingam C [this message]
2018-02-14 14:45 ` [PATCH 37/43] drm/i915: Initialize HDCP2.2 and its MEI interface 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-38-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