All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel@ffwll.ch>
To: Ramalingam C <ramalingam.c@intel.com>
Cc: intel-gfx@lists.freedesktop.org, alexander.usyskin@intel.com,
	uma.shankar@intel.com, dri-devel@lists.freedesktop.org,
	tomas.winkler@intel.com
Subject: Re: [PATCH v4 39/41] drm/i915: Implement the HDCP2.2 support for HDMI
Date: Thu, 31 May 2018 09:24:06 +0200	[thread overview]
Message-ID: <20180531072406.GO3438@phenom.ffwll.local> (raw)
In-Reply-To: <1526907240-17639-40-git-send-email-ramalingam.c@intel.com>

On Mon, May 21, 2018 at 06:23:58PM +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
> 
> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_hdmi.c | 186 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 186 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> index a5cc73101acb..042205e57e42 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>
> @@ -1106,6 +1107,186 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
>  	return true;
>  }
>  
> +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 inline
> +int intel_hdmi_hdcp2_timeout_for_msg(uint8_t msg_id, bool is_paired)

So at a glance this is the same timeout stuff as for dp. I think this
should be moved out of the low-level callbacks into commont code. Maybe
wrap the low-level callbacks for read/write into small helper functions,
which then also do the timeout handling?

And I think the timeouts and availability checks should be done in the
hdcp flow directly, instead of far away from where the register read/write
is issue. Just to keep the entire register i/o closely together.
-Daniel

> +{
> +	int timeout;
> +
> +	switch (msg_id) {
> +	case HDCP_2_2_AKE_SEND_CERT:
> +		timeout = HDCP_2_2_CERT_TIMEOUT;
> +		break;
> +	case HDCP_2_2_AKE_SEND_HPRIME:
> +		if (is_paired)
> +			timeout = HDCP_2_2_HPRIME_PAIRED_TIMEOUT;
> +		else
> +			timeout = HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT;
> +		break;
> +	case HDCP_2_2_AKE_SEND_PAIRING_INFO:
> +		timeout = HDCP_2_2_PAIRING_TIMEOUT;
> +		break;
> +	case HDCP_2_2_LC_SEND_LPRIME:
> +		timeout = HDCP_2_2_HDMI_LPRIME_TIMEOUT;
> +		break;
> +	case HDCP_2_2_REP_SEND_RECVID_LIST:
> +		timeout = HDCP_2_2_RECVID_LIST_TIMEOUT;
> +		break;
> +	case HDCP_2_2_REP_STREAM_READY:
> +		timeout = HDCP_2_2_STREAM_READY_TIMEOUT;
> +		break;
> +	default:
> +		timeout = -EINVAL;
> +		DRM_ERROR("Unsupported msg_id: %d\n", (int)msg_id);
> +	}
> +
> +	return timeout;
> +}
> +
> +static inline
> +int hdcp2_detect_msg_availability(struct intel_digital_port *intel_digital_port,
> +				  uint8_t msg_id, bool *msg_ready,
> +				  ssize_t *msg_sz)
> +{
> +	uint8_t 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,
> +			      uint8_t msg_id, bool paired)
> +{
> +	bool msg_ready = false;
> +	int timeout, ret;
> +	ssize_t msg_sz;
> +
> +	timeout = intel_hdmi_hdcp2_timeout_for_msg(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_ERROR("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,
> +			      uint8_t 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(%d) is more than exp size(%d)\n",
> +			      (int)ret, (int)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)
> +{
> +	uint8_t 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)
> +{
> +	uint8_t 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
> +enum hdcp_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,
> @@ -1117,6 +1298,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-05-31  7:24 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 ` [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface Ramalingam C
2018-05-24  8:06   ` 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 [this message]
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=20180531072406.GO3438@phenom.ffwll.local \
    --to=daniel@ffwll.ch \
    --cc=alexander.usyskin@intel.com \
    --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.