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,
	tomas.winkler@intel.com, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v8 08/35] drm/i915: Implement HDCP2.2 repeater authentication
Date: Thu, 6 Dec 2018 11:45:49 +0100	[thread overview]
Message-ID: <20181206104549.GQ21184@phenom.ffwll.local> (raw)
In-Reply-To: <1543315413-24302-9-git-send-email-ramalingam.c@intel.com>

On Tue, Nov 27, 2018 at 04:13:06PM +0530, Ramalingam C wrote:
> Implements the HDCP2.2 repeaters authentication steps such as verifying
> the downstream topology and sending stream management information.
> 
> v2:
>   Rebased.
> v3:
>   No Changes.
> v4:
>   -EINVAL is returned for topology error and rollover scenario.
>   Endianness conversion func from drm_hdcp.h is used [Uma]
> v5:
>   Rebased as part of patches reordering.
>   Defined the mei service functions [Daniel]
> v6:
>   Redefined the mei service functions as per comp redesign.
> v7:
>   %s/uintxx_t/uxx
>   Check for comp_master is removed.
> v8:
>   Adjust to the new mei interface.
>   style issue fixed.
> 
> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_hdcp.c | 125 +++++++++++++++++++++++++++++++++++++-
>  include/drm/drm_hdcp.h            |  15 +++++
>  2 files changed, 138 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
> index 0d7fea9c9bb1..679f3c164582 100644
> --- a/drivers/gpu/drm/i915/intel_hdcp.c
> +++ b/drivers/gpu/drm/i915/intel_hdcp.c
> @@ -1069,7 +1069,7 @@ static int hdcp2_prepare_skey(struct intel_connector *connector,
>  	return ret;
>  }
>  
> -static __attribute__((unused)) int
> +static int
>  hdcp2_verify_rep_topology_prepare_ack(struct intel_connector *connector,
>  				      struct hdcp2_rep_send_receiverid_list
>  								*rep_topology,
> @@ -1099,7 +1099,7 @@ hdcp2_verify_rep_topology_prepare_ack(struct intel_connector *connector,
>  	return ret;
>  }
>  
> -static __attribute__((unused)) int
> +static int
>  hdcp2_verify_mprime(struct intel_connector *connector,
>  		    struct hdcp2_rep_stream_ready *stream_ready)
>  {
> @@ -1315,6 +1315,121 @@ static int hdcp2_session_key_exchange(struct intel_connector *connector)
>  	return 0;
>  }
>  
> +static
> +int hdcp2_propagate_stream_management_info(struct intel_connector *connector)
> +{
> +	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
> +	struct intel_hdcp *hdcp = &connector->hdcp;
> +	union {
> +		struct hdcp2_rep_stream_manage stream_manage;
> +		struct hdcp2_rep_stream_ready stream_ready;
> +	} msgs;
> +	const struct intel_hdcp_shim *shim = hdcp->shim;
> +	int ret;
> +
> +	/* Prepare RepeaterAuth_Stream_Manage msg */
> +	msgs.stream_manage.msg_id = HDCP_2_2_REP_STREAM_MANAGE;
> +	reverse_endianness(msgs.stream_manage.seq_num_m, HDCP_2_2_SEQ_NUM_LEN,
> +			   (u8 *)&hdcp->seq_num_m);
> +
> +	/* K no of streams is fixed as 1. Stored as big-endian. */
> +	msgs.stream_manage.k = __swab16(1);
> +
> +	/* For HDMI this is forced to be 0x0. For DP SST also this is 0x0. */
> +	msgs.stream_manage.streams[0].stream_id = 0;
> +	msgs.stream_manage.streams[0].stream_type = hdcp->content_type;
> +
> +	/* Send it to Repeater */
> +	ret = shim->write_2_2_msg(intel_dig_port, &msgs.stream_manage,
> +				  sizeof(msgs.stream_manage));
> +	if (ret < 0)
> +		return ret;
> +
> +	ret = shim->read_2_2_msg(intel_dig_port, HDCP_2_2_REP_STREAM_READY,
> +				 &msgs.stream_ready, sizeof(msgs.stream_ready));
> +	if (ret < 0)
> +		return ret;
> +
> +	hdcp->mei_data.seq_num_m = hdcp->seq_num_m;
> +	hdcp->mei_data.streams[0].stream_type = hdcp->content_type;
> +
> +	ret = hdcp2_verify_mprime(connector, &msgs.stream_ready);
> +	if (ret < 0)
> +		return ret;
> +
> +	hdcp->seq_num_m++;
> +
> +	if (hdcp->seq_num_m > HDCP_2_2_SEQ_NUM_MAX) {
> +		DRM_DEBUG_KMS("seq_num_m roll over.\n");
> +		return -1;
> +	}
> +
> +	return 0;
> +}
> +
> +static
> +int hdcp2_authenticate_repeater_topology(struct intel_connector *connector)
> +{
> +	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
> +	struct intel_hdcp *hdcp = &connector->hdcp;
> +	union {
> +		struct hdcp2_rep_send_receiverid_list recvid_list;
> +		struct hdcp2_rep_send_ack rep_ack;
> +	} msgs;
> +	const struct intel_hdcp_shim *shim = hdcp->shim;
> +	u8 *rx_info;
> +	u32 seq_num_v;
> +	int ret;
> +
> +	ret = shim->read_2_2_msg(intel_dig_port, HDCP_2_2_REP_SEND_RECVID_LIST,
> +				 &msgs.recvid_list, sizeof(msgs.recvid_list));
> +	if (ret < 0)
> +		return ret;
> +
> +	rx_info = msgs.recvid_list.rx_info;
> +
> +	if (HDCP_2_2_MAX_CASCADE_EXCEEDED(rx_info[1]) ||
> +	    HDCP_2_2_MAX_DEVS_EXCEEDED(rx_info[1])) {
> +		DRM_DEBUG_KMS("Topology Max Size Exceeded\n");
> +		return -EINVAL;
> +	}
> +
> +	/* Converting and Storing the seq_num_v to local variable as DWORD */
> +	reverse_endianness((u8 *)&seq_num_v, HDCP_2_2_SEQ_NUM_LEN,
> +			   msgs.recvid_list.seq_num_v);
> +
> +	if (seq_num_v < hdcp->seq_num_v) {
> +		/* Roll over of the seq_num_v from repeater. Reauthenticate. */
> +		DRM_DEBUG_KMS("Seq_num_v roll over.\n");
> +		return -EINVAL;
> +	}
> +
> +	ret = hdcp2_verify_rep_topology_prepare_ack(connector,
> +						    &msgs.recvid_list,
> +						    &msgs.rep_ack);
> +	if (ret < 0)
> +		return ret;
> +
> +	hdcp->seq_num_v = seq_num_v;
> +	ret = shim->write_2_2_msg(intel_dig_port, &msgs.rep_ack,
> +				  sizeof(msgs.rep_ack));
> +	if (ret < 0)
> +		return ret;
> +
> +	return 0;
> +}
> +
> +static int hdcp2_authenticate_repeater(struct intel_connector *connector)
> +{
> +	int ret;
> +
> +	ret = hdcp2_authenticate_repeater_topology(connector);
> +	if (ret < 0)
> +		return ret;
> +
> +	return hdcp2_propagate_stream_management_info(connector);
> +}
> +
>  static int hdcp2_authenticate_sink(struct intel_connector *connector)
>  {
>  	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
> @@ -1356,6 +1471,12 @@ static int hdcp2_authenticate_sink(struct intel_connector *connector)
>  					       sizeof(stream_type_msg));
>  		if (ret < 0)
>  			return ret;
> +	} else if (hdcp->is_repeater) {
> +		ret = hdcp2_authenticate_repeater(connector);
> +		if (ret < 0) {
> +			DRM_DEBUG_KMS("Repeater Auth Failed. Err: %d\n", ret);
> +			return ret;
> +		}
>  	}
>  
>  	hdcp->mei_data.streams[0].stream_type = hdcp->content_type;
> diff --git a/include/drm/drm_hdcp.h b/include/drm/drm_hdcp.h
> index a6de09c5e47f..3e45a7618ab3 100644
> --- a/include/drm/drm_hdcp.h
> +++ b/include/drm/drm_hdcp.h
> @@ -250,4 +250,19 @@ struct hdcp2_dp_errata_stream_type {
>  #define HDCP_2_2_HDMI_RXSTATUS_READY(x)		((x) & BIT(2))
>  #define HDCP_2_2_HDMI_RXSTATUS_REAUTH_REQ(x)	((x) & BIT(3))
>  
> +/*
> + * Library functions for endianness are aligned for 16/32/64 bits.
> + * But hdcp sequence numbers are 24bits. So for their Byte swapping,
> + * a conversion function is developed.
> + */
> +static inline void reverse_endianness(u8 *dest, size_t sz, u8 *src)

This feels a bit fake-generic and doesn't fit that well into what you want
it to do in the code actually. What about:

u32 drm_hdcp2_seq_num_to_u32(u8 seq_num[HDCP_2_2_SEQ_NUM_LEN])
{
	return seq_num[2] | seq_num[1] << 8 | seq_num[0] << 16;
}

(I didn't check the math).

I think this would both make the code more clearer and avoid the problem
of "shouldn't we make sure this works for everything and put it into
linux/string.h?"

Again I'll check the actual hdcp2 flow later on.

In general I'm kinda not happy with the shim midlayer design, but I wasn't
happy with that with hdcp1 either, and hdcp2 is just an extension, and I
don't really have a better idea either so seems all good to me.
-Daniel

> +{
> +	u32 index;
> +
> +	if (!sz || sz > sizeof(u32))
> +		return;
> +	for (index = 0; index < sz; index++)
> +		dest[sz - index - 1] = src[index];
> +}
> +
>  #endif
> -- 
> 2.7.4
> 

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

  reply	other threads:[~2018-12-06 10:45 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 [this message]
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
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=20181206104549.GQ21184@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 \
    /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.