diff mbox series

[v10,30/40] misc/mei/hdcp: Verify L_prime

Message ID 1548917996-28081-31-git-send-email-ramalingam.c@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915: Implement HDCP2.2 | expand

Commit Message

Ramalingam C Jan. 31, 2019, 6:59 a.m. UTC
Request to ME to verify the LPrime received from HDCP sink.

On Success, ME FW will verify the received Lprime by calculating and
comparing with L.

This represents the completion of Locality Check.

v2: Rebased.
v3:
  cldev is passed as first parameter [Tomas]
  Redundant comments and cast are removed [Tomas]
v4:
  %zd for ssize_t [Alexander]
  %s/return -1/return -EIO [Alexander]
  Style fixed [Uma]
v5: Rebased.
v6:
  Collected the Rb-ed by.
  Rebasing.
v7:
  Adjust to the new mei interface.
  Fix for Kdoc.
v8:
  K-Doc addition. [Tomas]
  memcpy for const length.

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
Reviewed-by: Uma Shankar <uma.shankar@intel.com>
---
 drivers/misc/mei/hdcp/mei_hdcp.c | 59 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 58 insertions(+), 1 deletion(-)

Comments

Shankar, Uma Feb. 4, 2019, 4:16 p.m. UTC | #1
>-----Original Message-----
>From: C, Ramalingam
>Sent: Thursday, January 31, 2019 12:30 PM
>To: intel-gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org;
>daniel.vetter@ffwll.ch; Winkler, Tomas <tomas.winkler@intel.com>; Shankar,
>Uma <uma.shankar@intel.com>
>Cc: C, Ramalingam <ramalingam.c@intel.com>
>Subject: [PATCH v10 30/40] misc/mei/hdcp: Verify L_prime
>
>Request to ME to verify the LPrime received from HDCP sink.
>
>On Success, ME FW will verify the received Lprime by calculating and comparing
>with L.
>
>This represents the completion of Locality Check.
>
>v2: Rebased.
>v3:
>  cldev is passed as first parameter [Tomas]
>  Redundant comments and cast are removed [Tomas]
>v4:
>  %zd for ssize_t [Alexander]
>  %s/return -1/return -EIO [Alexander]
>  Style fixed [Uma]
>v5: Rebased.
>v6:
>  Collected the Rb-ed by.
>  Rebasing.
>v7:
>  Adjust to the new mei interface.
>  Fix for Kdoc.
>v8:
>  K-Doc addition. [Tomas]
>  memcpy for const length.
>
>Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
>Reviewed-by: Uma Shankar <uma.shankar@intel.com>

Latest set looks ok. You can keep the RB.

>---
> drivers/misc/mei/hdcp/mei_hdcp.c | 59
>+++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 58 insertions(+), 1 deletion(-)
>
>diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c
>b/drivers/misc/mei/hdcp/mei_hdcp.c
>index 412a33e29d7d..3d7767d944dc 100644
>--- a/drivers/misc/mei/hdcp/mei_hdcp.c
>+++ b/drivers/misc/mei/hdcp/mei_hdcp.c
>@@ -336,6 +336,63 @@ mei_initiate_locality_check(struct device *dev, struct
>hdcp_port_data *data,
> 	return 0;
> }
>
>+/**
>+ * mei_verify_lprime() - Verify lprime.
>+ * @dev: device corresponding to the mei_cl_device
>+ * @hdcp_data: Intel HW specific hdcp data
>+ * @rx_lprime: LC_Send_L_prime msg for ME FW verification
>+ *
>+ * Return: 0 on Success, <0 on Failure
>+ */
>+static int mei_verify_lprime(struct device *dev, struct hdcp_port_data *data,
>+			     struct hdcp2_lc_send_lprime *rx_lprime) {
>+	struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } };
>+	struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } };
>+	struct mei_cl_device *cldev;
>+	ssize_t byte;
>+
>+	if (!dev || !data || !rx_lprime)
>+		return -EINVAL;
>+
>+	cldev = to_mei_cl_device(dev);
>+
>+	verify_lprime_in.header.api_version = HDCP_API_VERSION;
>+	verify_lprime_in.header.command_id = WIRED_VALIDATE_LOCALITY;
>+	verify_lprime_in.header.status = ME_HDCP_STATUS_SUCCESS;
>+	verify_lprime_in.header.buffer_len =
>+
>	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
>+
>+	verify_lprime_in.port.integrated_port_type = data->port_type;
>+	verify_lprime_in.port.physical_port =
>+(u8)GET_MEI_DDI_INDEX(data->port);
>+
>+	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
>+	       HDCP_2_2_L_PRIME_LEN);
>+
>+	byte = mei_cldev_send(cldev, (u8 *)&verify_lprime_in,
>+			      sizeof(verify_lprime_in));
>+	if (byte < 0) {
>+		dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte);
>+		return byte;
>+	}
>+
>+	byte = mei_cldev_recv(cldev, (u8 *)&verify_lprime_out,
>+			      sizeof(verify_lprime_out));
>+	if (byte < 0) {
>+		dev_dbg(dev, "mei_cldev_recv failed. %zd\n", byte);
>+		return byte;
>+	}
>+
>+	if (verify_lprime_out.header.status != ME_HDCP_STATUS_SUCCESS) {
>+		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
>+			WIRED_VALIDATE_LOCALITY,
>+			verify_lprime_out.header.status);
>+		return -EIO;
>+	}
>+
>+	return 0;
>+}
>+
> static __attribute__((unused))
> struct i915_hdcp_component_ops mei_hdcp_ops = {
> 	.owner = THIS_MODULE,
>@@ -344,7 +401,7 @@ struct i915_hdcp_component_ops mei_hdcp_ops = {
> 	.verify_hprime = mei_verify_hprime,
> 	.store_pairing_info = mei_store_pairing_info,
> 	.initiate_locality_check = mei_initiate_locality_check,
>-	.verify_lprime = NULL,
>+	.verify_lprime = mei_verify_lprime,
> 	.get_session_key = NULL,
> 	.repeater_check_flow_prepare_ack = NULL,
> 	.verify_mprime = NULL,
>--
>2.7.4
diff mbox series

Patch

diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
index 412a33e29d7d..3d7767d944dc 100644
--- a/drivers/misc/mei/hdcp/mei_hdcp.c
+++ b/drivers/misc/mei/hdcp/mei_hdcp.c
@@ -336,6 +336,63 @@  mei_initiate_locality_check(struct device *dev, struct hdcp_port_data *data,
 	return 0;
 }
 
+/**
+ * mei_verify_lprime() - Verify lprime.
+ * @dev: device corresponding to the mei_cl_device
+ * @hdcp_data: Intel HW specific hdcp data
+ * @rx_lprime: LC_Send_L_prime msg for ME FW verification
+ *
+ * Return: 0 on Success, <0 on Failure
+ */
+static int mei_verify_lprime(struct device *dev, struct hdcp_port_data *data,
+			     struct hdcp2_lc_send_lprime *rx_lprime)
+{
+	struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } };
+	struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } };
+	struct mei_cl_device *cldev;
+	ssize_t byte;
+
+	if (!dev || !data || !rx_lprime)
+		return -EINVAL;
+
+	cldev = to_mei_cl_device(dev);
+
+	verify_lprime_in.header.api_version = HDCP_API_VERSION;
+	verify_lprime_in.header.command_id = WIRED_VALIDATE_LOCALITY;
+	verify_lprime_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	verify_lprime_in.header.buffer_len =
+					WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
+
+	verify_lprime_in.port.integrated_port_type = data->port_type;
+	verify_lprime_in.port.physical_port = (u8)GET_MEI_DDI_INDEX(data->port);
+
+	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
+	       HDCP_2_2_L_PRIME_LEN);
+
+	byte = mei_cldev_send(cldev, (u8 *)&verify_lprime_in,
+			      sizeof(verify_lprime_in));
+	if (byte < 0) {
+		dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte);
+		return byte;
+	}
+
+	byte = mei_cldev_recv(cldev, (u8 *)&verify_lprime_out,
+			      sizeof(verify_lprime_out));
+	if (byte < 0) {
+		dev_dbg(dev, "mei_cldev_recv failed. %zd\n", byte);
+		return byte;
+	}
+
+	if (verify_lprime_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
+			WIRED_VALIDATE_LOCALITY,
+			verify_lprime_out.header.status);
+		return -EIO;
+	}
+
+	return 0;
+}
+
 static __attribute__((unused))
 struct i915_hdcp_component_ops mei_hdcp_ops = {
 	.owner = THIS_MODULE,
@@ -344,7 +401,7 @@  struct i915_hdcp_component_ops mei_hdcp_ops = {
 	.verify_hprime = mei_verify_hprime,
 	.store_pairing_info = mei_store_pairing_info,
 	.initiate_locality_check = mei_initiate_locality_check,
-	.verify_lprime = NULL,
+	.verify_lprime = mei_verify_lprime,
 	.get_session_key = NULL,
 	.repeater_check_flow_prepare_ack = NULL,
 	.verify_mprime = NULL,