All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel@ffwll.ch>
To: Ramalingam C <ramalingam.c@intel.com>
Cc: daniel.vetter@ffwll.ch, intel-gfx@lists.freedesktop.org,
	uma.shankar@intel.com, tomas.winkler@intel.com,
	dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v8 13/35] drm/i915: Implement the HDCP2.2 support for HDMI
Date: Thu, 6 Dec 2018 15:04:05 +0100	[thread overview]
Message-ID: <20181206140404.GW21184@phenom.ffwll.local> (raw)
In-Reply-To: <1543315413-24302-14-git-send-email-ramalingam.c@intel.com>

On Tue, Nov 27, 2018 at 04:13:11PM +0530, Ramalingam C wrote:
> 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 Changes.
> v4:
>   No more special handling of Gmbus burst read for AKE_SEND_CERT.
>   Style fixed with few naming. [Uma]
>   %s/PARING/PAIRING
> v5:
>   msg_sz is initialized at definition.
>   Lookup table is defined for HDMI HDCP2.2 msgs [Daniel].
> v6:
>   Rebased.
> v7:
>   Make a function as inline [Uma]
>   %s/uintxx_t/uxx
> v8:
>   Errors due to sinks are reported as DEBUG logs.
>   Adjust to the new mei interface.
> 
> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> Reviewed-by: Uma Shankar <uma.shankar@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_hdmi.c | 190 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 190 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> index e755a3370bca..912f50133645 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -30,6 +30,7 @@
>  #include <linux/slab.h>
>  #include <linux/delay.h>
>  #include <linux/hdmi.h>
> +#include <linux/mei_hdcp.h>
>  #include <drm/drmP.h>
>  #include <drm/drm_atomic_helper.h>
>  #include <drm/drm_crtc.h>
> @@ -1117,6 +1118,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 < sizeof(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);

Yeah, doing this also for DP is imo much simpler.

lgtm.
-Daniel

> +	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 = DRM_HDCP_REAUTH_REQUEST;
> +	else if (HDCP_2_2_HDMI_RXSTATUS_READY(rx_status[1]))
> +		ret = DRM_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 mei_hdcp_wired_protocol intel_hdmi_hdcp2_protocol(void)
> +{
> +	return MEI_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,
> @@ -1128,6 +1313,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,
> +	.hdcp_protocol = intel_hdmi_hdcp2_protocol,
>  };
>  
>  static void intel_hdmi_prepare(struct intel_encoder *encoder,
> -- 
> 2.7.4
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2018-12-06 14:04 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-27 10:42 [PATCH v8 00/35] drm/i915: Implement HDCP2.2 Ramalingam C
2018-11-27 10:42 ` [PATCH v8 01/35] drm/i915: debug log for REPLY_ACK missing Ramalingam C
2018-11-27 10:43 ` [PATCH v8 02/35] drm/i915: Increase timeout for Encrypt status change Ramalingam C
2018-11-27 10:43 ` [PATCH v8 03/35] linux/mei: Header for mei_hdcp driver interface Ramalingam C
2018-12-07 13:53   ` C, Ramalingam
2018-12-07 14:10     ` Daniel Vetter
2018-12-08 20:15       ` Winkler, Tomas
2018-12-10  9:31         ` Daniel Vetter
2018-11-27 10:43 ` [PATCH v8 04/35] drm/i915: Initialize HDCP2.2 Ramalingam C
2018-12-06 10:03   ` Daniel Vetter
2018-12-07  4:54     ` C, Ramalingam
2018-12-07 14:16       ` Daniel Vetter
2018-12-08 18:47         ` Winkler, Tomas
2018-12-10  9:28           ` Daniel Vetter
2018-11-27 10:43 ` [PATCH v8 05/35] drm/i915: MEI interface definition Ramalingam C
2018-12-06 10:23   ` Daniel Vetter
2018-12-07  5:52     ` C, Ramalingam
2018-12-07 10:48       ` C, Ramalingam
2018-12-07 10:48       ` C, Ramalingam
2018-12-07 14:32         ` Daniel Vetter
2018-12-07 14:29       ` Daniel Vetter
2018-12-12  8:58         ` C, Ramalingam
2018-12-12 10:38           ` Daniel Vetter
2018-12-12 11:04             ` C, Ramalingam
2018-12-13  3:55               ` C, Ramalingam
2018-11-27 10:43 ` [PATCH v8 06/35] drm/i915: Enable and Disable of HDCP2.2 Ramalingam C
2018-12-06 10:30   ` Daniel Vetter
2018-12-07  6:22     ` C, Ramalingam
2018-12-07 14:33       ` Daniel Vetter
2018-11-27 10:43 ` [PATCH v8 07/35] drm/i915: Implement HDCP2.2 receiver authentication Ramalingam C
2018-11-27 10:43 ` [PATCH v8 08/35] drm/i915: Implement HDCP2.2 repeater authentication Ramalingam C
2018-12-06 10:45   ` Daniel Vetter
2018-12-12  9:11     ` C, Ramalingam
2018-11-27 10:43 ` [PATCH v8 09/35] drm/i915: Implement HDCP2.2 link integrity check Ramalingam C
2018-12-06 13:27   ` Daniel Vetter
2018-12-06 13:41     ` Daniel Vetter
2018-12-07  6:46     ` C, Ramalingam
2018-12-07 14:36       ` Daniel Vetter
2018-11-27 10:43 ` [PATCH v8 10/35] drm/i915: Handle HDCP2.2 downstream topology change Ramalingam C
2018-12-06 13:42   ` Daniel Vetter
2018-11-27 10:43 ` [PATCH v8 11/35] drm/i915: Check HDCP 1.4 and 2.2 link on CP_IRQ Ramalingam C
2018-12-06 13:44   ` Daniel Vetter
2018-11-27 10:43 ` [PATCH v8 12/35] drm/i915: Implement the HDCP2.2 support for DP Ramalingam C
2018-11-27 16:54   ` Bloomfield, Jon
2018-11-27 17:37     ` Daniel Vetter
2018-11-28  5:15       ` C, Ramalingam
2018-11-28  5:26   ` Stéphane Marchesin
2018-11-28  7:24     ` C, Ramalingam
2018-12-06 13:58   ` Daniel Vetter
2018-11-27 10:43 ` [PATCH v8 13/35] drm/i915: Implement the HDCP2.2 support for HDMI Ramalingam C
2018-12-06 14:04   ` Daniel Vetter [this message]
2018-11-27 10:43 ` [PATCH v8 14/35] drm/i915: Add HDCP2.2 support for DP connectors Ramalingam C
2018-11-27 10:43 ` [PATCH v8 15/35] drm/i915: Add HDCP2.2 support for HDMI connectors Ramalingam C
2018-11-27 10:43 ` [PATCH v8 16/35] mei: bus: whitelist hdcp client Ramalingam C
2018-11-27 10:43 ` [PATCH v8 17/35] mei: bus: export to_mei_cl_device for mei client device drivers Ramalingam C
2018-11-27 10:43 ` [PATCH v8 18/35] misc/mei/hdcp: Client driver for HDCP application Ramalingam C
2018-11-27 10:43 ` [PATCH v8 19/35] misc/mei/hdcp: Define ME FW interface for HDCP2.2 Ramalingam C
2018-11-27 10:43 ` [PATCH v8 20/35] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session Ramalingam C
2018-11-27 10:43 ` [PATCH v8 21/35] misc/mei/hdcp: Verify Receiver Cert and prepare km Ramalingam C
2018-11-27 10:43 ` [PATCH v8 22/35] misc/mei/hdcp: Verify H_prime Ramalingam C
2018-11-27 10:43 ` [PATCH v8 23/35] misc/mei/hdcp: Store the HDCP Pairing info Ramalingam C
2018-11-27 10:43 ` [PATCH v8 24/35] misc/mei/hdcp: Initiate Locality check Ramalingam C
2018-11-27 10:43 ` [PATCH v8 25/35] misc/mei/hdcp: Verify L_prime Ramalingam C
2018-11-27 10:43 ` [PATCH v8 26/35] misc/mei/hdcp: Prepare Session Key Ramalingam C
2018-11-27 10:43 ` [PATCH v8 27/35] misc/mei/hdcp: Repeater topology verification and ack Ramalingam C
2018-11-27 10:43 ` [PATCH v8 28/35] misc/mei/hdcp: Verify M_prime Ramalingam C
2018-11-27 10:43 ` [PATCH v8 29/35] misc/mei/hdcp: Enabling the HDCP authentication Ramalingam C
2018-11-27 10:43 ` [PATCH v8 30/35] misc/mei/hdcp: Closing wired HDCP2.2 Tx Session Ramalingam C
2018-11-27 10:43 ` [PATCH v8 31/35] misc/mei/hdcp: Component framework for I915 Interface Ramalingam C
2018-11-27 10:43 ` [PATCH v8 32/35] drm/i915: Commit CP without modeset Ramalingam C
2018-12-06 14:19   ` Daniel Vetter
2018-11-27 10:43 ` [PATCH v8 33/35] drm/i915: Fix KBL HDCP2.2 encrypt status signalling Ramalingam C
2018-12-06 14:20   ` Daniel Vetter
2018-12-07  7:03     ` C, Ramalingam
2018-11-27 10:43 ` [PATCH v8 34/35] FOR_TEST: i915/Kconfig: Select mei_hdcp by I915 Ramalingam C
2018-11-27 10:43 ` [PATCH v8 35/35] FOR_TESTING_ONLY: debugfs: Excluding the LSPCon for HDCP1.4 Ramalingam C
2018-11-27 11:08 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Implement HDCP2.2 (rev10) Patchwork
2018-11-27 11:16 ` ✗ Fi.CI.SPARSE: " Patchwork
2018-11-27 11:36 ` ✗ Fi.CI.BAT: failure " Patchwork
2018-12-06 14:27 ` [PATCH v8 00/35] drm/i915: Implement HDCP2.2 Daniel Vetter

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=20181206140404.GW21184@phenom.ffwll.local \
    --to=daniel@ffwll.ch \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=ramalingam.c@intel.com \
    --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.