diff mbox

[v3,15/40] misc/mei/hdcp: Repeater topology verifcation and ack

Message ID 1522763873-23041-16-git-send-email-ramalingam.c@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ramalingam C April 3, 2018, 1:57 p.m. UTC
Request ot ME to verify the downatream topology information received.

ME FW will validate the Repeaters receiver id list and
downstream topology.

On Success ME FW will provide the Least Significant
128bits of VPrime, which forms the repeater ack.

v2:
  Rebased.
v3:
  cldev is passed as first parameter [Tomas]
  Redundant comments and cast are removed [Tomas]

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
---
 drivers/misc/mei/hdcp/mei_hdcp.c | 75 ++++++++++++++++++++++++++++++++++++++++
 include/linux/mei_hdcp.h         | 15 ++++++++
 2 files changed, 90 insertions(+)

Comments

Uma Shankar May 9, 2018, 11:04 a.m. UTC | #1
>-----Original Message-----

>From: dri-devel [mailto:dri-devel-bounces@lists.freedesktop.org] On Behalf Of

>Ramalingam C

>Sent: Tuesday, April 3, 2018 7:27 PM

>To: intel-gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org;

>seanpaul@chromium.org; daniel@ffwll.ch; chris@chris-wilson.co.uk;

>jani.nikula@linux.intel.com; Winkler, Tomas <tomas.winkler@intel.com>;

>Usyskin, Alexander <alexander.usyskin@intel.com>

>Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>

>Subject: [PATCH v3 15/40] misc/mei/hdcp: Repeater topology verifcation and ack


Typo in verification.

>

>Request ot ME to verify the downatream topology information received.


"To" misspelled. Also typo in downstream.

>

>ME FW will validate the Repeaters receiver id list and downstream topology.

>

>On Success ME FW will provide the Least Significant 128bits of VPrime, which

>forms the repeater ack.

>

>v2:

>  Rebased.

>v3:

>  cldev is passed as first parameter [Tomas]

>  Redundant comments and cast are removed [Tomas]

>

>Signed-off-by: Ramalingam C <ramalingam.c@intel.com>

>---

> drivers/misc/mei/hdcp/mei_hdcp.c | 75

>++++++++++++++++++++++++++++++++++++++++

> include/linux/mei_hdcp.h         | 15 ++++++++

> 2 files changed, 90 insertions(+)

>

>diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c

>b/drivers/misc/mei/hdcp/mei_hdcp.c

>index abfcc57863b8..64fcecfa5b10 100644

>--- a/drivers/misc/mei/hdcp/mei_hdcp.c

>+++ b/drivers/misc/mei/hdcp/mei_hdcp.c

>@@ -478,6 +478,81 @@ int mei_get_session_key(struct mei_cl_device *cldev,

>struct mei_hdcp_data *data,  }  EXPORT_SYMBOL(mei_get_session_key);

>

>+/**

>+ * mei_repeater_check_flow_prepare_ack:

>+ *	Function to validate the Downstream topology and prepare rep_ack.

>+ *

>+ * @cldev		: Pointer for mei client device

>+ * @data		: Intel HW specific Data

>+ * @rep_topology	: Pointer for Receiver Id List to be validated.

>+ * @rep_send_ack	: Pointer for repeater ack

>+ *

>+ * Returns 0 on Success, <0 on Failure

>+ */

>+

>+int

>+mei_repeater_check_flow_prepare_ack(struct mei_cl_device *cldev,

>+				    struct mei_hdcp_data *data,

>+				    struct hdcp2_rep_send_receiverid_list

>+							*rep_topology,

>+				    struct hdcp2_rep_send_ack *rep_send_ack) {

>+	struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } };

>+	struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 } };

>+	struct device *dev;

>+	ssize_t byte;

>+

>+	if (!rep_topology || !rep_send_ack || !data)

>+		return -EINVAL;

>+

>+	dev = &cldev->dev;

>+

>+	verify_repeater_in.header.api_version = HDCP_API_VERSION;

>+	verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER;

>+	verify_repeater_in.header.status = ME_HDCP_STATUS_SUCCESS;

>+	verify_repeater_in.header.buffer_len =

>+

>	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;

>+

>+	verify_repeater_in.port.integrated_port_type = data->port_type;

>+	verify_repeater_in.port.physical_port = data->port;

>+

>+	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,

>+	       HDCP_2_2_RXINFO_LEN);

>+	memcpy(verify_repeater_in.seq_num_v, rep_topology->seq_num_v,

>+	       HDCP_2_2_SEQ_NUM_LEN);

>+	memcpy(verify_repeater_in.v_prime, rep_topology->v_prime,

>+	       HDCP_2_2_LPRIME_HALF_LEN);

>+	memcpy(verify_repeater_in.receiver_ids, rep_topology->receiver_ids,

>+	       HDCP_2_2_RECEIVER_IDS_MAX_LEN);


Check for validity of rep_topology->... pointers.

>+

>+	byte = mei_cldev_send(cldev, (u8 *)&verify_repeater_in,

>+			      sizeof(verify_repeater_in));

>+	if (byte < 0) {

>+		dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);

>+		return byte;

>+	}

>+

>+	byte = mei_cldev_recv(cldev, (u8 *)&verify_repeater_out,

>+			      sizeof(verify_repeater_out));

>+	if (byte < 0) {

>+		dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);

>+		return byte;

>+	}

>+

>+	if (verify_repeater_out.header.status != ME_HDCP_STATUS_SUCCESS) {

>+		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",

>+			WIRED_VERIFY_REPEATER,

>+			verify_repeater_out.header.status);

>+		return -1;

>+	}

>+

>+	memcpy(rep_send_ack->v, verify_repeater_out.v,


Same as above.

>+	       HDCP_2_2_LPRIME_HALF_LEN);

>+	rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK;


Leave a blank line here.

>+	return 0;

>+}

>+EXPORT_SYMBOL(mei_repeater_check_flow_prepare_ack);

>+

> void mei_cldev_state_notify_clients(struct mei_cl_device *cldev, bool enabled)  {

> 	if (enabled)

>diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index

>534170d746af..46e2dc295d03 100644

>--- a/include/linux/mei_hdcp.h

>+++ b/include/linux/mei_hdcp.h

>@@ -128,6 +128,12 @@ int mei_verify_lprime(struct mei_cl_device *cldev,

>struct mei_hdcp_data *data,

> 		      struct hdcp2_lc_send_lprime *rx_lprime);  int

>mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data *data,

> 			struct hdcp2_ske_send_eks *ske_data);

>+int

>+mei_repeater_check_flow_prepare_ack(struct mei_cl_device *cldev,

>+				    struct mei_hdcp_data *data,

>+				    struct hdcp2_rep_send_receiverid_list

>+							*rep_topology,

>+				    struct hdcp2_rep_send_ack *rep_send_ack);

> #else

> static int mei_cldev_register_notify(struct notifier_block *nb)  { @@ -186,5

>+192,14 @@ int mei_get_session_key(struct mei_cl_device *cldev, struct

>mei_hdcp_data *data,  {

> 	return -ENODEV;

> }

>+static inline int

>+mei_repeater_check_flow_prepare_ack(struct mei_cl_device *cldev,

>+				    struct mei_hdcp_data *data,

>+				    struct hdcp2_rep_send_receiverid_list

>+							*rep_topology,

>+				    struct hdcp2_rep_send_ack *rep_send_ack) {

>+	return -ENODEV;

>+}

> #endif /* defined (CONFIG_INTEL_MEI_HDCP) */  #endif /* defined

>(_LINUX_MEI_HDCP_H) */

>--

>2.7.4

>

>_______________________________________________

>dri-devel mailing list

>dri-devel@lists.freedesktop.org

>https://lists.freedesktop.org/mailman/listinfo/dri-devel
Ramalingam C May 16, 2018, 4:32 p.m. UTC | #2
On Wednesday 09 May 2018 04:34 PM, Shankar, Uma wrote:
>
>> -----Original Message-----
>> From: dri-devel [mailto:dri-devel-bounces@lists.freedesktop.org] On Behalf Of
>> Ramalingam C
>> Sent: Tuesday, April 3, 2018 7:27 PM
>> To: intel-gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org;
>> seanpaul@chromium.org; daniel@ffwll.ch; chris@chris-wilson.co.uk;
>> jani.nikula@linux.intel.com; Winkler, Tomas <tomas.winkler@intel.com>;
>> Usyskin, Alexander <alexander.usyskin@intel.com>
>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>
>> Subject: [PATCH v3 15/40] misc/mei/hdcp: Repeater topology verifcation and ack
> Typo in verification.
>
>> Request ot ME to verify the downatream topology information received.
> "To" misspelled. Also typo in downstream.
ok. Will fix it.
>
>> ME FW will validate the Repeaters receiver id list and downstream topology.
>>
>> On Success ME FW will provide the Least Significant 128bits of VPrime, which
>> forms the repeater ack.
>>
>> v2:
>>   Rebased.
>> v3:
>>   cldev is passed as first parameter [Tomas]
>>   Redundant comments and cast are removed [Tomas]
>>
>> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
>> ---
>> drivers/misc/mei/hdcp/mei_hdcp.c | 75
>> ++++++++++++++++++++++++++++++++++++++++
>> include/linux/mei_hdcp.h         | 15 ++++++++
>> 2 files changed, 90 insertions(+)
>>
>> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c
>> b/drivers/misc/mei/hdcp/mei_hdcp.c
>> index abfcc57863b8..64fcecfa5b10 100644
>> --- a/drivers/misc/mei/hdcp/mei_hdcp.c
>> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
>> @@ -478,6 +478,81 @@ int mei_get_session_key(struct mei_cl_device *cldev,
>> struct mei_hdcp_data *data,  }  EXPORT_SYMBOL(mei_get_session_key);
>>
>> +/**
>> + * mei_repeater_check_flow_prepare_ack:
>> + *	Function to validate the Downstream topology and prepare rep_ack.
>> + *
>> + * @cldev		: Pointer for mei client device
>> + * @data		: Intel HW specific Data
>> + * @rep_topology	: Pointer for Receiver Id List to be validated.
>> + * @rep_send_ack	: Pointer for repeater ack
>> + *
>> + * Returns 0 on Success, <0 on Failure
>> + */
>> +
>> +int
>> +mei_repeater_check_flow_prepare_ack(struct mei_cl_device *cldev,
>> +				    struct mei_hdcp_data *data,
>> +				    struct hdcp2_rep_send_receiverid_list
>> +							*rep_topology,
>> +				    struct hdcp2_rep_send_ack *rep_send_ack) {
>> +	struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } };
>> +	struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 } };
>> +	struct device *dev;
>> +	ssize_t byte;
>> +
>> +	if (!rep_topology || !rep_send_ack || !data)
>> +		return -EINVAL;
>> +
>> +	dev = &cldev->dev;
>> +
>> +	verify_repeater_in.header.api_version = HDCP_API_VERSION;
>> +	verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER;
>> +	verify_repeater_in.header.status = ME_HDCP_STATUS_SUCCESS;
>> +	verify_repeater_in.header.buffer_len =
>> +
>> 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
>> +
>> +	verify_repeater_in.port.integrated_port_type = data->port_type;
>> +	verify_repeater_in.port.physical_port = data->port;
>> +
>> +	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
>> +	       HDCP_2_2_RXINFO_LEN);
>> +	memcpy(verify_repeater_in.seq_num_v, rep_topology->seq_num_v,
>> +	       HDCP_2_2_SEQ_NUM_LEN);
>> +	memcpy(verify_repeater_in.v_prime, rep_topology->v_prime,
>> +	       HDCP_2_2_LPRIME_HALF_LEN);
>> +	memcpy(verify_repeater_in.receiver_ids, rep_topology->receiver_ids,
>> +	       HDCP_2_2_RECEIVER_IDS_MAX_LEN);
> Check for validity of rep_topology->... pointers.
>
>> +
>> +	byte = mei_cldev_send(cldev, (u8 *)&verify_repeater_in,
>> +			      sizeof(verify_repeater_in));
>> +	if (byte < 0) {
>> +		dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
>> +		return byte;
>> +	}
>> +
>> +	byte = mei_cldev_recv(cldev, (u8 *)&verify_repeater_out,
>> +			      sizeof(verify_repeater_out));
>> +	if (byte < 0) {
>> +		dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
>> +		return byte;
>> +	}
>> +
>> +	if (verify_repeater_out.header.status != ME_HDCP_STATUS_SUCCESS) {
>> +		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
>> +			WIRED_VERIFY_REPEATER,
>> +			verify_repeater_out.header.status);
>> +		return -1;
>> +	}
>> +
>> +	memcpy(rep_send_ack->v, verify_repeater_out.v,
> Same as above.
>
>> +	       HDCP_2_2_LPRIME_HALF_LEN);
>> +	rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK;
> Leave a blank line here.
Ok.

--Ram
>
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(mei_repeater_check_flow_prepare_ack);
>> +
>> void mei_cldev_state_notify_clients(struct mei_cl_device *cldev, bool enabled)  {
>> 	if (enabled)
>> diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index
>> 534170d746af..46e2dc295d03 100644
>> --- a/include/linux/mei_hdcp.h
>> +++ b/include/linux/mei_hdcp.h
>> @@ -128,6 +128,12 @@ int mei_verify_lprime(struct mei_cl_device *cldev,
>> struct mei_hdcp_data *data,
>> 		      struct hdcp2_lc_send_lprime *rx_lprime);  int
>> mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data *data,
>> 			struct hdcp2_ske_send_eks *ske_data);
>> +int
>> +mei_repeater_check_flow_prepare_ack(struct mei_cl_device *cldev,
>> +				    struct mei_hdcp_data *data,
>> +				    struct hdcp2_rep_send_receiverid_list
>> +							*rep_topology,
>> +				    struct hdcp2_rep_send_ack *rep_send_ack);
>> #else
>> static int mei_cldev_register_notify(struct notifier_block *nb)  { @@ -186,5
>> +192,14 @@ int mei_get_session_key(struct mei_cl_device *cldev, struct
>> mei_hdcp_data *data,  {
>> 	return -ENODEV;
>> }
>> +static inline int
>> +mei_repeater_check_flow_prepare_ack(struct mei_cl_device *cldev,
>> +				    struct mei_hdcp_data *data,
>> +				    struct hdcp2_rep_send_receiverid_list
>> +							*rep_topology,
>> +				    struct hdcp2_rep_send_ack *rep_send_ack) {
>> +	return -ENODEV;
>> +}
>> #endif /* defined (CONFIG_INTEL_MEI_HDCP) */  #endif /* defined
>> (_LINUX_MEI_HDCP_H) */
>> --
>> 2.7.4
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox

Patch

diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
index abfcc57863b8..64fcecfa5b10 100644
--- a/drivers/misc/mei/hdcp/mei_hdcp.c
+++ b/drivers/misc/mei/hdcp/mei_hdcp.c
@@ -478,6 +478,81 @@  int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data *data,
 }
 EXPORT_SYMBOL(mei_get_session_key);
 
+/**
+ * mei_repeater_check_flow_prepare_ack:
+ *	Function to validate the Downstream topology and prepare rep_ack.
+ *
+ * @cldev		: Pointer for mei client device
+ * @data		: Intel HW specific Data
+ * @rep_topology	: Pointer for Receiver Id List to be validated.
+ * @rep_send_ack	: Pointer for repeater ack
+ *
+ * Returns 0 on Success, <0 on Failure
+ */
+
+int
+mei_repeater_check_flow_prepare_ack(struct mei_cl_device *cldev,
+				    struct mei_hdcp_data *data,
+				    struct hdcp2_rep_send_receiverid_list
+							*rep_topology,
+				    struct hdcp2_rep_send_ack *rep_send_ack)
+{
+	struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } };
+	struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 } };
+	struct device *dev;
+	ssize_t byte;
+
+	if (!rep_topology || !rep_send_ack || !data)
+		return -EINVAL;
+
+	dev = &cldev->dev;
+
+	verify_repeater_in.header.api_version = HDCP_API_VERSION;
+	verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER;
+	verify_repeater_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	verify_repeater_in.header.buffer_len =
+					WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
+
+	verify_repeater_in.port.integrated_port_type = data->port_type;
+	verify_repeater_in.port.physical_port = data->port;
+
+	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
+	       HDCP_2_2_RXINFO_LEN);
+	memcpy(verify_repeater_in.seq_num_v, rep_topology->seq_num_v,
+	       HDCP_2_2_SEQ_NUM_LEN);
+	memcpy(verify_repeater_in.v_prime, rep_topology->v_prime,
+	       HDCP_2_2_LPRIME_HALF_LEN);
+	memcpy(verify_repeater_in.receiver_ids, rep_topology->receiver_ids,
+	       HDCP_2_2_RECEIVER_IDS_MAX_LEN);
+
+	byte = mei_cldev_send(cldev, (u8 *)&verify_repeater_in,
+			      sizeof(verify_repeater_in));
+	if (byte < 0) {
+		dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
+		return byte;
+	}
+
+	byte = mei_cldev_recv(cldev, (u8 *)&verify_repeater_out,
+			      sizeof(verify_repeater_out));
+	if (byte < 0) {
+		dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
+		return byte;
+	}
+
+	if (verify_repeater_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
+			WIRED_VERIFY_REPEATER,
+			verify_repeater_out.header.status);
+		return -1;
+	}
+
+	memcpy(rep_send_ack->v, verify_repeater_out.v,
+	       HDCP_2_2_LPRIME_HALF_LEN);
+	rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK;
+	return 0;
+}
+EXPORT_SYMBOL(mei_repeater_check_flow_prepare_ack);
+
 void mei_cldev_state_notify_clients(struct mei_cl_device *cldev, bool enabled)
 {
 	if (enabled)
diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h
index 534170d746af..46e2dc295d03 100644
--- a/include/linux/mei_hdcp.h
+++ b/include/linux/mei_hdcp.h
@@ -128,6 +128,12 @@  int mei_verify_lprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data,
 		      struct hdcp2_lc_send_lprime *rx_lprime);
 int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data *data,
 			struct hdcp2_ske_send_eks *ske_data);
+int
+mei_repeater_check_flow_prepare_ack(struct mei_cl_device *cldev,
+				    struct mei_hdcp_data *data,
+				    struct hdcp2_rep_send_receiverid_list
+							*rep_topology,
+				    struct hdcp2_rep_send_ack *rep_send_ack);
 #else
 static int mei_cldev_register_notify(struct notifier_block *nb)
 {
@@ -186,5 +192,14 @@  int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data *data,
 {
 	return -ENODEV;
 }
+static inline int
+mei_repeater_check_flow_prepare_ack(struct mei_cl_device *cldev,
+				    struct mei_hdcp_data *data,
+				    struct hdcp2_rep_send_receiverid_list
+							*rep_topology,
+				    struct hdcp2_rep_send_ack *rep_send_ack)
+{
+	return -ENODEV;
+}
 #endif /* defined (CONFIG_INTEL_MEI_HDCP) */
 #endif /* defined (_LINUX_MEI_HDCP_H) */