All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ramalingam C <ramalingam.c@intel.com>
To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Cc: alexander.usyskin@intel.com, uma.shankar@intel.com,
	tomas.winkler@intel.com
Subject: [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface
Date: Mon, 21 May 2018 18:23:49 +0530	[thread overview]
Message-ID: <1526907240-17639-31-git-send-email-ramalingam.c@intel.com> (raw)
In-Reply-To: <1526907240-17639-1-git-send-email-ramalingam.c@intel.com>

Initialize HDCP2.2 support. This includes the mei interface
initialization along with required notifier registration.

v2:
  mei interface handle is protected with mutex. [Chris Wilson]
v3:
  Notifiers are used for the mei interface state.
v4:
  Poll for mei client device state
  Error msg for out of mem [Uma]
  Inline req for init function removed [Uma]

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
---
 drivers/gpu/drm/i915/intel_dp.c   |   3 +-
 drivers/gpu/drm/i915/intel_drv.h  |   5 +-
 drivers/gpu/drm/i915/intel_hdcp.c | 117 +++++++++++++++++++++++++++++++++++++-
 drivers/gpu/drm/i915/intel_hdmi.c |   2 +-
 4 files changed, 122 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 62f82c4298ac..276eb49113e9 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -6368,7 +6368,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,
+					  false);
 		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 ac943ec73987..7aaaa50fc19f 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -442,7 +442,7 @@ struct intel_hdcp {
 	/* mei interface related information */
 	struct mei_cl_device *cldev;
 	struct mei_hdcp_data mei_data;
-
+	struct notifier_block mei_cldev_nb;
 	struct delayed_work hdcp2_check_work;
 };
 
@@ -1940,7 +1940,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,
+		    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);
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
index f3f935046c31..9948e4b4e203 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -11,6 +11,7 @@
 #include <linux/i2c.h>
 #include <linux/random.h>
 #include <linux/mei_hdcp.h>
+#include <linux/notifier.h>
 
 #include "intel_drv.h"
 #include "i915_reg.h"
@@ -25,6 +26,7 @@ static int _intel_hdcp2_enable(struct intel_connector *connector);
 static int _intel_hdcp2_disable(struct intel_connector *connector);
 static void intel_hdcp2_check_work(struct work_struct *work);
 static int intel_hdcp2_check_link(struct intel_connector *connector);
+static int intel_hdcp2_init(struct intel_connector *connector);
 
 static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port,
 				    const struct intel_hdcp_shim *shim)
@@ -766,11 +768,15 @@ bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port)
 }
 
 int intel_hdcp_init(struct intel_connector *connector,
-		    const struct intel_hdcp_shim *hdcp_shim)
+		    const struct intel_hdcp_shim *hdcp_shim,
+		    bool hdcp2_supported)
 {
 	struct intel_hdcp *hdcp = &connector->hdcp;
 	int ret;
 
+	if (!hdcp_shim)
+		return -EINVAL;
+
 	ret = drm_connector_attach_content_protection_property(
 			&connector->base);
 	if (ret)
@@ -779,7 +785,12 @@ 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_DELAYED_WORK(&hdcp->hdcp2_check_work, intel_hdcp2_check_work);
 	INIT_WORK(&hdcp->hdcp_prop_work, intel_hdcp_prop_work);
+
+	if (hdcp2_supported)
+		intel_hdcp2_init(connector);
+
 	return 0;
 }
 
@@ -1637,3 +1648,107 @@ static void intel_hdcp2_check_work(struct work_struct *work)
 		schedule_delayed_work(&hdcp->hdcp2_check_work,
 				      DRM_HDCP2_CHECK_PERIOD_MS);
 }
+
+static int initialize_mei_hdcp_data(struct intel_connector *connector)
+{
+	struct intel_hdcp *hdcp = &connector->hdcp;
+	struct mei_hdcp_data *data = &hdcp->mei_data;
+	enum port port;
+
+	if (connector->encoder) {
+		port = connector->encoder->port;
+		data->port = GET_MEI_DDI_INDEX(port);
+	}
+
+	data->port_type = INTEGRATED;
+	data->protocol = hdcp->hdcp_shim->hdcp_protocol();
+
+	data->k = 1;
+	if (!data->streams)
+		data->streams = kcalloc(data->k,
+					sizeof(struct hdcp2_streamid_type),
+					GFP_KERNEL);
+	if (!data->streams) {
+		DRM_ERROR("Out of Memory\n");
+		return -ENOMEM;
+	}
+
+	data->streams[0].stream_id = 0;
+	data->streams[0].stream_type = hdcp->content_type;
+
+	return 0;
+}
+
+static void intel_hdcp2_exit(struct intel_connector *connector)
+{
+	intel_hdcp_disable(connector);
+	kfree(connector->hdcp.mei_data.streams);
+}
+
+static int mei_cldev_notify(struct notifier_block *nb, unsigned long event,
+			    void *cldev)
+{
+	struct intel_hdcp *hdcp = container_of(nb, struct intel_hdcp,
+					       mei_cldev_nb);
+	struct intel_connector *intel_connector = container_of(hdcp,
+							struct intel_connector,
+							hdcp);
+
+	DRM_DEBUG_KMS("[%s:%d] MEI_HDCP Notification. Interface: %s\n",
+		      intel_connector->base.name, intel_connector->base.base.id,
+		      cldev ? "UP" : "Down");
+
+	if (event == MEI_CLDEV_ENABLED) {
+		hdcp->cldev = cldev;
+		initialize_mei_hdcp_data(intel_connector);
+	} else {
+		hdcp->cldev = NULL;
+		intel_hdcp2_exit(intel_connector);
+	}
+
+	return NOTIFY_OK;
+}
+
+static inline
+bool is_hdcp2_supported(struct drm_i915_private *dev_priv)
+{
+	return (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv) ||
+		IS_KABYLAKE(dev_priv));
+}
+
+static int intel_hdcp2_init(struct intel_connector *connector)
+{
+	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
+	struct intel_hdcp *hdcp = &connector->hdcp;
+	int ret;
+
+	if (!is_hdcp2_supported(dev_priv))
+		return -EINVAL;
+
+	hdcp->hdcp2_supported = true;
+
+	hdcp->mei_cldev_nb.notifier_call = mei_cldev_notify;
+	ret = mei_cldev_register_notify(&hdcp->mei_cldev_nb);
+	if (ret) {
+		DRM_ERROR("mei_cldev not available. %d\n", ret);
+		goto exit;
+	}
+
+	ret = initialize_mei_hdcp_data(connector);
+	if (ret) {
+		mei_cldev_unregister_notify(&hdcp->mei_cldev_nb);
+		goto exit;
+	}
+
+	/*
+	 * Incase notifier is triggered well before this point, request for
+	 * notification of the mei client device state.
+	 */
+	mei_cldev_poll_notification();
+
+exit:
+	if (ret)
+		hdcp->hdcp2_supported = false;
+
+	return ret;
+}
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index ee929f31f7db..a5cc73101acb 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -2334,7 +2334,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, false);
 		if (ret)
 			DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
 	}
-- 
2.7.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2018-05-21 12:53 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-21 12:53 [PATCH v4 00/41] drm/i915: Implement HDCP2.2 Ramalingam C
2018-05-21 12:53 ` [PATCH v4 01/41] drm: hdcp2.2 authentication msg definitions Ramalingam C
2018-05-21 12:53 ` [PATCH v4 02/41] drm: HDMI and DP specific HDCP2.2 defines Ramalingam C
2018-05-21 12:53 ` [PATCH v4 03/41] mei: bus: whitelist hdcp client Ramalingam C
2018-05-21 12:53 ` [PATCH v4 04/41] misc/mei/hdcp: Client driver for HDCP application Ramalingam C
2018-05-21 12:53 ` [PATCH v4 05/41] misc/mei/hdcp: Notifier chain for mei cldev state change Ramalingam C
2018-05-21 12:53 ` [PATCH v4 06/41] misc/mei/hdcp: Define ME FW interface for HDCP2.2 Ramalingam C
2018-05-21 12:53 ` [PATCH v4 07/41] linux/mei: Header for mei_hdcp driver interface Ramalingam C
2018-05-21 12:53 ` [PATCH v4 08/41] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session Ramalingam C
2018-05-21 12:53 ` [PATCH v4 09/41] misc/mei/hdcp: Verify Receiver Cert and prepare km Ramalingam C
2018-05-21 12:53 ` [PATCH v4 10/41] misc/mei/hdcp: Verify H_prime Ramalingam C
2018-05-21 12:53 ` [PATCH v4 11/41] misc/mei/hdcp: Store the HDCP Pairing info Ramalingam C
2018-05-21 12:53 ` [PATCH v4 12/41] misc/mei/hdcp: Initiate Locality check Ramalingam C
2018-05-21 12:53 ` [PATCH v4 13/41] misc/mei/hdcp: Verify L_prime Ramalingam C
2018-05-21 12:53 ` [PATCH v4 14/41] misc/mei/hdcp: Prepare Session Key Ramalingam C
2018-05-21 12:53 ` [PATCH v4 15/41] misc/mei/hdcp: Repeater topology verification and ack Ramalingam C
2018-05-21 12:53 ` [PATCH v4 16/41] misc/mei/hdcp: Verify M_prime Ramalingam C
2018-05-21 12:53 ` [PATCH v4 17/41] misc/mei/hdcp: Enabling the HDCP authentication Ramalingam C
2018-05-21 12:53 ` [PATCH v4 18/41] misc/mei/hdcp: Closing wired HDCP2.2 Tx Session Ramalingam C
2018-05-21 12:53 ` [PATCH v4 19/41] drm/i915: wrapping all hdcp var into intel_hdcp Ramalingam C
2018-05-21 12:53 ` [PATCH v4 20/41] drm/i915: Define HDCP2.2 related variables Ramalingam C
2018-05-21 12:53 ` [PATCH v4 21/41] drm/i915: Define Intel HDCP2.2 registers Ramalingam C
2018-05-21 12:53 ` [PATCH v4 22/41] drm/i915: Wrappers for mei HDCP2.2 services Ramalingam C
2018-05-31  7:07   ` Daniel Vetter
2018-06-20  6:46     ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 23/41] drm/i915: Implement HDCP2.2 receiver authentication Ramalingam C
2018-05-21 12:53 ` [PATCH v4 24/41] drm/i915: Implement HDCP2.2 repeater authentication Ramalingam C
2018-05-23 18:35   ` kbuild test robot
2018-05-21 12:53 ` [PATCH v4 25/41] drm/i915: Enable and Disable HDCP2.2 port encryption Ramalingam C
2018-05-31  7:09   ` Daniel Vetter
2018-06-20  6:49     ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 26/41] drm/i915: Implement HDCP2.2 En/Dis-able Ramalingam C
2018-05-21 12:53 ` [PATCH v4 27/41] drm/i915: Implement HDCP2.2 link integrity check Ramalingam C
2018-05-21 12:53 ` [PATCH v4 28/41] drm/i915: Handle HDCP2.2 downstream topology change Ramalingam C
2018-05-21 12:53 ` [PATCH v4 29/41] drm/i915: Pullout the bksv read and validation Ramalingam C
2018-05-21 12:53 ` Ramalingam C [this message]
2018-05-24  8:06   ` [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface Daniel Vetter
2018-05-25 11:12     ` Ramalingam C
2018-05-29  6:53       ` Daniel Vetter
2018-05-29  8:42         ` Daniel Vetter
2018-05-29  9:27           ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 31/41] drm/i915: Schedule hdcp_check_link in _intel_hdcp_enable Ramalingam C
2018-05-21 12:53 ` [PATCH v4 32/41] drm/i915: Enable superior HDCP ver that is capable Ramalingam C
2018-05-21 12:53 ` [PATCH v4 33/41] drm/i915: Enable HDCP1.4 incase of HDCP2.2 failure Ramalingam C
2018-05-21 12:53 ` [PATCH v4 34/41] drm/i915: hdcp_check_link only on CP_IRQ Ramalingam C
2018-05-21 12:53 ` [PATCH v4 35/41] drm/i915: Check HDCP 1.4 and 2.2 link " Ramalingam C
2018-05-21 12:53 ` [PATCH v4 36/41] drm/i915/gmbus: Increase the Bytes per Rd/Wr Op Ramalingam C
2018-05-21 12:53 ` [PATCH v4 37/41] drm/i915/gmbus: Enable burst read Ramalingam C
2018-05-21 12:53 ` [PATCH v4 38/41] drm/i915: Implement the HDCP2.2 support for DP Ramalingam C
2018-05-22 20:52   ` [Intel-gfx] " kbuild test robot
2018-05-22 21:33   ` kbuild test robot
2018-05-31  7:22   ` Daniel Vetter
2018-06-20 10:19     ` Ramalingam C
2018-06-20 11:43       ` Daniel Vetter
2018-06-20 11:55         ` C, Ramalingam
2018-05-21 12:53 ` [PATCH v4 39/41] drm/i915: Implement the HDCP2.2 support for HDMI Ramalingam C
2018-05-31  7:24   ` Daniel Vetter
2018-06-20 10:19     ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 40/41] drm/i915: Add HDCP2.2 support for DP connectors Ramalingam C
2018-05-21 12:54 ` [PATCH v4 41/41] drm/i915: Add HDCP2.2 support for HDMI connectors Ramalingam C
2018-05-21 13:16 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Implement HDCP2.2 (rev5) Patchwork
2018-05-21 13:23 ` ✗ Fi.CI.SPARSE: " Patchwork
2018-05-21 15:04   ` Ramalingam C
2018-05-21 15:17     ` Shankar, Uma
2018-05-21 13:39 ` ✗ Fi.CI.BAT: failure " Patchwork
2018-05-29  6:57 ` [PATCH v4 00/41] drm/i915: Implement HDCP2.2 Daniel Vetter
2018-05-29  7:51   ` C, Ramalingam
2018-05-29  8:30     ` Daniel Vetter
2018-05-29  9:40       ` C, Ramalingam

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=1526907240-17639-31-git-send-email-ramalingam.c@intel.com \
    --to=ramalingam.c@intel.com \
    --cc=alexander.usyskin@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=tomas.winkler@intel.com \
    --cc=uma.shankar@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.