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,
	daniel.vetter@ffwll.ch, tomas.winkler@intel.com,
	uma.shankar@intel.com
Subject: [PATCH v11 19/42] drm/i915: Implement the HDCP2.2 support for HDMI
Date: Thu,  7 Feb 2019 02:34:08 +0530	[thread overview]
Message-ID: <1549487071-15343-20-git-send-email-ramalingam.c@intel.com> (raw)
In-Reply-To: <1549487071-15343-1-git-send-email-ramalingam.c@intel.com>

Implements the HDMI adaptation specific HDCP2.2 operations.

Basically these are DDC read and write for authenticating through
HDCP2.2 messages.

v2: Rebased.
v3:
  No more special handling of Gmbus burst read for AKE_SEND_CERT.
  Style fixed with few naming. [Uma]
  %s/PARING/PAIRING
v4:
  msg_sz is initialized at definition.
  Lookup table is defined for HDMI HDCP2.2 msgs [Daniel].
v5: Rebased.
v6:
  Make a function as inline [Uma]
  %s/uintxx_t/uxx
v7:
  Errors due to sinks are reported as DEBUG logs.
  Adjust to the new mei interface.
v8:
  ARRAY_SIZE for the # of array members [Jon & Daniel].
  hdcp adaptation is added as a const in the hdcp_shim [Daniel]

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
Reviewed-by: Uma Shankar <uma.shankar@intel.com>
---
 drivers/gpu/drm/i915/intel_hdmi.c | 189 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 189 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index faeedf76db99..6a3e400f54d7 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1129,6 +1129,190 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
 	return true;
 }
 
+static struct hdcp2_hdmi_msg_data {
+	u8 msg_id;
+	u32 timeout;
+	u32 timeout2;
+	} hdcp2_msg_data[] = {
+		{HDCP_2_2_AKE_INIT, 0, 0},
+		{HDCP_2_2_AKE_SEND_CERT, HDCP_2_2_CERT_TIMEOUT_MS, 0},
+		{HDCP_2_2_AKE_NO_STORED_KM, 0, 0},
+		{HDCP_2_2_AKE_STORED_KM, 0, 0},
+		{HDCP_2_2_AKE_SEND_HPRIME, HDCP_2_2_HPRIME_PAIRED_TIMEOUT_MS,
+				HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT_MS},
+		{HDCP_2_2_AKE_SEND_PAIRING_INFO, HDCP_2_2_PAIRING_TIMEOUT_MS,
+				0},
+		{HDCP_2_2_LC_INIT, 0, 0},
+		{HDCP_2_2_LC_SEND_LPRIME, HDCP_2_2_HDMI_LPRIME_TIMEOUT_MS, 0},
+		{HDCP_2_2_SKE_SEND_EKS, 0, 0},
+		{HDCP_2_2_REP_SEND_RECVID_LIST,
+				HDCP_2_2_RECVID_LIST_TIMEOUT_MS, 0},
+		{HDCP_2_2_REP_SEND_ACK, 0, 0},
+		{HDCP_2_2_REP_STREAM_MANAGE, 0, 0},
+		{HDCP_2_2_REP_STREAM_READY, HDCP_2_2_STREAM_READY_TIMEOUT_MS,
+				0},
+	};
+
+static
+int intel_hdmi_hdcp2_read_rx_status(struct intel_digital_port *intel_dig_port,
+				    uint8_t *rx_status)
+{
+	return intel_hdmi_hdcp_read(intel_dig_port,
+				    HDCP_2_2_HDMI_REG_RXSTATUS_OFFSET,
+				    rx_status,
+				    HDCP_2_2_HDMI_RXSTATUS_LEN);
+}
+
+static int get_hdcp2_msg_timeout(u8 msg_id, bool is_paired)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(hdcp2_msg_data); i++)
+		if (hdcp2_msg_data[i].msg_id == msg_id &&
+		    (msg_id != HDCP_2_2_AKE_SEND_HPRIME || is_paired))
+			return hdcp2_msg_data[i].timeout;
+		else if (hdcp2_msg_data[i].msg_id == msg_id)
+			return hdcp2_msg_data[i].timeout2;
+
+	return -EINVAL;
+}
+
+static inline
+int hdcp2_detect_msg_availability(struct intel_digital_port *intel_digital_port,
+				  u8 msg_id, bool *msg_ready,
+				  ssize_t *msg_sz)
+{
+	u8 rx_status[HDCP_2_2_HDMI_RXSTATUS_LEN];
+	int ret;
+
+	ret = intel_hdmi_hdcp2_read_rx_status(intel_digital_port, rx_status);
+	if (ret < 0) {
+		DRM_DEBUG_KMS("rx_status read failed. Err %d\n", ret);
+		return ret;
+	}
+
+	*msg_sz = ((HDCP_2_2_HDMI_RXSTATUS_MSG_SZ_HI(rx_status[1]) << 8) |
+		  rx_status[0]);
+
+	if (msg_id == HDCP_2_2_REP_SEND_RECVID_LIST)
+		*msg_ready = (HDCP_2_2_HDMI_RXSTATUS_READY(rx_status[1]) &&
+			     *msg_sz);
+	else
+		*msg_ready = *msg_sz;
+
+	return 0;
+}
+
+static ssize_t
+intel_hdmi_hdcp2_wait_for_msg(struct intel_digital_port *intel_dig_port,
+			      u8 msg_id, bool paired)
+{
+	bool msg_ready = false;
+	int timeout, ret;
+	ssize_t msg_sz = 0;
+
+	timeout = get_hdcp2_msg_timeout(msg_id, paired);
+	if (timeout < 0)
+		return timeout;
+
+	ret = __wait_for(ret = hdcp2_detect_msg_availability(intel_dig_port,
+							     msg_id, &msg_ready,
+							     &msg_sz),
+			 !ret && msg_ready && msg_sz, timeout * 1000,
+			 1000, 5 * 1000);
+	if (ret)
+		DRM_DEBUG_KMS("msg_id: %d, ret: %d, timeout: %d\n",
+			      msg_id, ret, timeout);
+
+	return ret ? ret : msg_sz;
+}
+
+static
+int intel_hdmi_hdcp2_write_msg(struct intel_digital_port *intel_dig_port,
+			       void *buf, size_t size)
+{
+	unsigned int offset;
+
+	offset = HDCP_2_2_HDMI_REG_WR_MSG_OFFSET;
+	return intel_hdmi_hdcp_write(intel_dig_port, offset, buf, size);
+}
+
+static
+int intel_hdmi_hdcp2_read_msg(struct intel_digital_port *intel_dig_port,
+			      u8 msg_id, void *buf, size_t size)
+{
+	struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
+	struct intel_hdcp *hdcp = &hdmi->attached_connector->hdcp;
+	unsigned int offset;
+	ssize_t ret;
+
+	ret = intel_hdmi_hdcp2_wait_for_msg(intel_dig_port, msg_id,
+					    hdcp->is_paired);
+	if (ret < 0)
+		return ret;
+
+	/*
+	 * Available msg size should be equal to or lesser than the
+	 * available buffer.
+	 */
+	if (ret > size) {
+		DRM_DEBUG_KMS("msg_sz(%zd) is more than exp size(%zu)\n",
+			      ret, size);
+		return -1;
+	}
+
+	offset = HDCP_2_2_HDMI_REG_RD_MSG_OFFSET;
+	ret = intel_hdmi_hdcp_read(intel_dig_port, offset, buf, ret);
+	if (ret)
+		DRM_DEBUG_KMS("Failed to read msg_id: %d(%zd)\n", msg_id, ret);
+
+	return ret;
+}
+
+static
+int intel_hdmi_hdcp2_check_link(struct intel_digital_port *intel_dig_port)
+{
+	u8 rx_status[HDCP_2_2_HDMI_RXSTATUS_LEN];
+	int ret;
+
+	ret = intel_hdmi_hdcp2_read_rx_status(intel_dig_port, rx_status);
+	if (ret)
+		return ret;
+
+	/*
+	 * Re-auth request and Link Integrity Failures are represented by
+	 * same bit. i.e reauth_req.
+	 */
+	if (HDCP_2_2_HDMI_RXSTATUS_REAUTH_REQ(rx_status[1]))
+		ret = HDCP_REAUTH_REQUEST;
+	else if (HDCP_2_2_HDMI_RXSTATUS_READY(rx_status[1]))
+		ret = HDCP_TOPOLOGY_CHANGE;
+
+	return ret;
+}
+
+static
+int intel_hdmi_hdcp2_capable(struct intel_digital_port *intel_dig_port,
+			     bool *capable)
+{
+	u8 hdcp2_version;
+	int ret;
+
+	*capable = false;
+	ret = intel_hdmi_hdcp_read(intel_dig_port, HDCP_2_2_HDMI_REG_VER_OFFSET,
+				   &hdcp2_version, sizeof(hdcp2_version));
+	if (!ret && hdcp2_version & HDCP_2_2_HDMI_SUPPORT_MASK)
+		*capable = true;
+
+	return ret;
+}
+
+static inline
+enum hdcp_wired_protocol intel_hdmi_hdcp2_protocol(void)
+{
+	return HDCP_PROTOCOL_HDMI;
+}
+
 static const struct intel_hdcp_shim intel_hdmi_hdcp_shim = {
 	.write_an_aksv = intel_hdmi_hdcp_write_an_aksv,
 	.read_bksv = intel_hdmi_hdcp_read_bksv,
@@ -1140,6 +1324,11 @@ static const struct intel_hdcp_shim intel_hdmi_hdcp_shim = {
 	.read_v_prime_part = intel_hdmi_hdcp_read_v_prime_part,
 	.toggle_signalling = intel_hdmi_hdcp_toggle_signalling,
 	.check_link = intel_hdmi_hdcp_check_link,
+	.write_2_2_msg = intel_hdmi_hdcp2_write_msg,
+	.read_2_2_msg = intel_hdmi_hdcp2_read_msg,
+	.check_2_2_link	= intel_hdmi_hdcp2_check_link,
+	.hdcp_2_2_capable = intel_hdmi_hdcp2_capable,
+	.protocol = HDCP_PROTOCOL_HDMI,
 };
 
 static void intel_hdmi_prepare(struct intel_encoder *encoder,
-- 
2.7.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  parent reply	other threads:[~2019-02-06 21:04 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-06 21:03 [PATCH v11 00/42] drm/i915: Implement HDCP2.2 Ramalingam C
2019-02-06 21:03 ` [PATCH v11 01/42] component: Add documentation Ramalingam C
2019-02-07 14:54   ` Winkler, Tomas
2019-02-06 21:03 ` [PATCH v11 02/42] components: multiple components for a device Ramalingam C
2019-02-06 21:03 ` [PATCH v11 03/42] drm/doc: document recommended component helper usage Ramalingam C
2019-02-06 21:03 ` [PATCH v11 04/42] i915/snd_hdac: I915 subcomponent for the snd_hdac Ramalingam C
2019-02-06 21:03 ` [PATCH v11 05/42] drm/i915: Gathering the HDCP1.4 routines together Ramalingam C
2019-02-07 15:00   ` Winkler, Tomas
2019-02-06 21:03 ` [PATCH v11 06/42] drm: header for i915 - MEI_HDCP interface Ramalingam C
2019-02-07 15:06   ` Winkler, Tomas
2019-02-06 21:03 ` [PATCH v11 07/42] drm/i915: Initialize HDCP2.2 Ramalingam C
2019-02-07 15:13   ` Winkler, Tomas
2019-02-07 16:09     ` C, Ramalingam
2019-02-06 21:03 ` [PATCH v11 08/42] drm/i915: MEI interface definition Ramalingam C
2019-02-06 21:34   ` C, Ramalingam
2019-02-07 19:40   ` Daniel Vetter
2019-02-07 19:48     ` Daniel Vetter
2019-02-08  8:48       ` C, Ramalingam
2019-02-06 21:03 ` [PATCH v11 09/42] drm/i915: hdcp1.4 CP_IRQ handling and SW encryption tracking Ramalingam C
2019-02-06 21:03 ` [PATCH v11 10/42] drm/i915: Enable and Disable of HDCP2.2 Ramalingam C
2019-02-06 21:04 ` [PATCH v11 11/42] drm/i915: Implement HDCP2.2 receiver authentication Ramalingam C
2019-02-06 21:04 ` [PATCH v11 12/42] drm: helper functions for hdcp2 seq_num to from u32 Ramalingam C
2019-02-06 21:04 ` [PATCH v11 13/42] drm/i915: Implement HDCP2.2 repeater authentication Ramalingam C
2019-02-06 21:04 ` [PATCH v11 14/42] drm: HDCP2.2 link check period Ramalingam C
2019-02-06 21:04 ` [PATCH v11 15/42] drm/i915: Implement HDCP2.2 link integrity check Ramalingam C
2019-02-06 21:04 ` [PATCH v11 16/42] drm/i915: Handle HDCP2.2 downstream topology change Ramalingam C
2019-02-06 21:04 ` [PATCH v11 17/42] drm: removing the DP Errata msg and its msg id Ramalingam C
2019-02-06 21:04 ` [PATCH v11 18/42] drm/i915: Implement the HDCP2.2 support for DP Ramalingam C
2019-02-06 21:04 ` Ramalingam C [this message]
2019-02-06 21:04 ` [PATCH v11 20/42] drm/i915: CP_IRQ handling for DP HDCP2.2 msgs Ramalingam C
2019-02-06 21:04 ` [PATCH v11 21/42] drm/i915: HDCP state handling in ddi_update_pipe Ramalingam C
2019-02-06 21:04 ` [PATCH v11 22/42] drm/i915: Fix KBL HDCP2.2 encrypt status signalling Ramalingam C
2019-02-06 21:04 ` [PATCH v11 23/42] mei: bus: whitelist hdcp client Ramalingam C
2019-02-06 21:04 ` [PATCH v11 24/42] mei: me: add ice lake point device ids Ramalingam C
2019-02-07  7:16   ` Winkler, Tomas
2019-02-07  7:22     ` C, Ramalingam
2019-02-07  7:48       ` Daniel Vetter
2019-02-06 21:04 ` [PATCH v11 25/42] mei: bus: export to_mei_cl_device for mei client device drivers Ramalingam C
2019-02-06 21:04 ` [PATCH v11 26/42] misc/mei/hdcp: Client driver for HDCP application Ramalingam C
2019-02-07 21:07   ` Winkler, Tomas
2019-02-06 21:04 ` [PATCH v11 27/42] misc/mei/hdcp: Define ME FW interface for HDCP2.2 Ramalingam C
2019-02-06 21:04 ` [PATCH v11 28/42] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session Ramalingam C
2019-02-07 21:35   ` Winkler, Tomas
2019-02-08  5:15     ` C, Ramalingam
2019-02-06 21:04 ` [PATCH v11 29/42] misc/mei/hdcp: Verify Receiver Cert and prepare km Ramalingam C
2019-02-07 21:23   ` Winkler, Tomas
2019-02-06 21:04 ` [PATCH v11 30/42] misc/mei/hdcp: Verify H_prime Ramalingam C
2019-02-07 21:37   ` Winkler, Tomas
2019-02-06 21:04 ` [PATCH v11 31/42] misc/mei/hdcp: Store the HDCP Pairing info Ramalingam C
2019-02-07 21:39   ` Winkler, Tomas
2019-02-06 21:04 ` [PATCH v11 32/42] misc/mei/hdcp: Initiate Locality check Ramalingam C
2019-02-07 21:38   ` Winkler, Tomas
2019-02-06 21:04 ` [PATCH v11 33/42] misc/mei/hdcp: Verify L_prime Ramalingam C
2019-02-07 21:41   ` Winkler, Tomas
2019-02-06 21:04 ` [PATCH v11 34/42] misc/mei/hdcp: Prepare Session Key Ramalingam C
2019-02-07 21:45   ` Winkler, Tomas
2019-02-06 21:04 ` [PATCH v11 35/42] misc/mei/hdcp: Repeater topology verification and ack Ramalingam C
2019-02-07 21:41   ` Winkler, Tomas
2019-02-06 21:04 ` [PATCH v11 36/42] misc/mei/hdcp: Verify M_prime Ramalingam C
2019-02-07 21:46   ` Winkler, Tomas
2019-02-06 21:04 ` [PATCH v11 37/42] misc/mei/hdcp: Enabling the HDCP authentication Ramalingam C
2019-02-07 21:46   ` Winkler, Tomas
2019-02-06 21:04 ` [PATCH v11 38/42] misc/mei/hdcp: Closing wired HDCP2.2 Tx Session Ramalingam C
2019-02-07 21:47   ` Winkler, Tomas
2019-02-06 21:04 ` [PATCH v11 39/42] misc/mei/hdcp: Component framework for I915 Interface Ramalingam C
2019-02-07 22:12   ` Winkler, Tomas
2019-02-08  5:15     ` C, Ramalingam
2019-02-06 21:04 ` [PATCH v11 40/42] FOR_TEST_ONLY: i915/Kconfig: Select mei_hdcp by I915 Ramalingam C
2019-02-06 21:04 ` [PATCH v11 41/42] FOR_TESTING_ONLY: debugfs: Excluding the LSPCon for HDCP1.4 Ramalingam C
2019-02-06 21:39 ` [PATCH v11 42/42] FOR_TESTING_ONLY: ICL: Limit clk to <= 340MHz Ramalingam C
2019-02-06 22:53 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Implement HDCP2.2 (rev17) Patchwork
2019-02-06 23:04 ` ✗ Fi.CI.SPARSE: " Patchwork
2019-02-06 23:12 ` ✓ Fi.CI.BAT: success " Patchwork
2019-02-07  5:00 ` ✓ Fi.CI.IGT: " 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=1549487071-15343-20-git-send-email-ramalingam.c@intel.com \
    --to=ramalingam.c@intel.com \
    --cc=daniel.vetter@ffwll.ch \
    --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.