diff mbox

[v3,12/40] misc/mei/hdcp: Initiate Locality check

Message ID 1522763873-23041-13-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
Requests ME to start the second stage of HDCP2.2 authentication,
called Locality Check.

On Success, ME FW will provide LC_Init message to send to hdcp sink.

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 | 56 ++++++++++++++++++++++++++++++++++++++++
 include/linux/mei_hdcp.h         | 10 +++++++
 2 files changed, 66 insertions(+)

Comments

kernel test robot April 3, 2018, 11:02 p.m. UTC | #1
Hi Ramalingam,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on drm-intel/for-linux-next]
[also build test ERROR on next-20180403]
[cannot apply to v4.16]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Ramalingam-C/drm-i915-Implement-HDCP2-2/20180404-031743
base:   git://anongit.freedesktop.org/drm-intel for-linux-next
config: i386-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   drivers/misc/mei/hdcp/mei_hdcp.c:52:5: error: redefinition of 'mei_initiate_hdcp2_session'
    int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
        ^~~~~~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/misc/mei/hdcp/mei_hdcp.c:35:0:
   include/linux/mei_hdcp.h:137:5: note: previous definition of 'mei_initiate_hdcp2_session' was here
    int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
        ^~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/misc/mei/hdcp/mei_hdcp.c:122:1: error: redefinition of 'mei_verify_receiver_cert_prepare_km'
    mei_verify_receiver_cert_prepare_km(struct mei_cl_device *cldev,
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/misc/mei/hdcp/mei_hdcp.c:35:0:
   include/linux/mei_hdcp.h:144:1: note: previous definition of 'mei_verify_receiver_cert_prepare_km' was here
    mei_verify_receiver_cert_prepare_km(struct mei_cl_device *cldev,
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/misc/mei/hdcp/mei_hdcp.c:200:5: error: redefinition of 'mei_verify_hprime'
    int mei_verify_hprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data,
        ^~~~~~~~~~~~~~~~~
   In file included from drivers/misc/mei/hdcp/mei_hdcp.c:35:0:
   include/linux/mei_hdcp.h:154:5: note: previous definition of 'mei_verify_hprime' was here
    int mei_verify_hprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data,
        ^~~~~~~~~~~~~~~~~
   drivers/misc/mei/hdcp/mei_hdcp.c:258:5: error: redefinition of 'mei_store_pairing_info'
    int mei_store_pairing_info(struct mei_cl_device *cldev,
        ^~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/misc/mei/hdcp/mei_hdcp.c:35:0:
   include/linux/mei_hdcp.h:160:5: note: previous definition of 'mei_store_pairing_info' was here
    int mei_store_pairing_info(struct mei_cl_device *cldev,
        ^~~~~~~~~~~~~~~~~~~~~~
>> drivers/misc/mei/hdcp/mei_hdcp.c:318:5: error: redefinition of 'mei_initiate_locality_check'
    int mei_initiate_locality_check(struct mei_cl_device *cldev,
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/misc/mei/hdcp/mei_hdcp.c:35:0:
   include/linux/mei_hdcp.h:167:5: note: previous definition of 'mei_initiate_locality_check' was here
    int mei_initiate_locality_check(struct mei_cl_device *cldev,
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/misc/mei/hdcp/mei_hdcp.c:374:5: error: redefinition of 'mei_cldev_register_notify'
    int mei_cldev_register_notify(struct notifier_block *nb)
        ^~~~~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/misc/mei/hdcp/mei_hdcp.c:35:0:
   include/linux/mei_hdcp.h:128:12: note: previous definition of 'mei_cldev_register_notify' was here
    static int mei_cldev_register_notify(struct notifier_block *nb)
               ^~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/misc/mei/hdcp/mei_hdcp.c:380:5: error: redefinition of 'mei_cldev_unregister_notify'
    int mei_cldev_unregister_notify(struct notifier_block *nb)
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/misc/mei/hdcp/mei_hdcp.c:35:0:
   include/linux/mei_hdcp.h:132:12: note: previous definition of 'mei_cldev_unregister_notify' was here
    static int mei_cldev_unregister_notify(struct notifier_block *nb)
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/mei_hdcp.h:132:12: warning: 'mei_cldev_unregister_notify' defined but not used [-Wunused-function]
   include/linux/mei_hdcp.h:128:12: warning: 'mei_cldev_register_notify' defined but not used [-Wunused-function]
    static int mei_cldev_register_notify(struct notifier_block *nb)
               ^~~~~~~~~~~~~~~~~~~~~~~~~

vim +/mei_initiate_locality_check +318 drivers/misc/mei/hdcp/mei_hdcp.c

   246	
   247	/**
   248	 * mei_store_pairing_info:
   249	 *	Function to store pairing info received from panel
   250	 *
   251	 * @cldev		: Pointer for mei client device
   252	 * @data		: Intel HW specific Data
   253	 * @pairing_info	: Pointer for AKE_Send_Pairing_Info
   254	 *
   255	 * Returns 0 on Success, <0 on Failure
   256	 */
   257	
 > 258	int mei_store_pairing_info(struct mei_cl_device *cldev,
   259				   struct mei_hdcp_data *data,
   260				   struct hdcp2_ake_send_pairing_info *pairing_info)
   261	{
   262		struct wired_cmd_ake_send_pairing_info_in pairing_info_in = { { 0 } };
   263		struct wired_cmd_ake_send_pairing_info_out pairing_info_out = { { 0 } };
   264		struct device *dev;
   265		ssize_t byte;
   266	
   267		if (!data || !pairing_info)
   268			return -EINVAL;
   269	
   270		dev = &cldev->dev;
   271	
   272		pairing_info_in.header.api_version = HDCP_API_VERSION;
   273		pairing_info_in.header.command_id = WIRED_AKE_SEND_PAIRING_INFO;
   274		pairing_info_in.header.status = ME_HDCP_STATUS_SUCCESS;
   275		pairing_info_in.header.buffer_len =
   276						WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
   277	
   278		pairing_info_in.port.integrated_port_type = data->port_type;
   279		pairing_info_in.port.physical_port = data->port;
   280	
   281		memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
   282		       sizeof(pairing_info_in.e_kh_km));
   283	
   284		byte = mei_cldev_send(cldev, (u8 *)&pairing_info_in,
   285				      sizeof(pairing_info_in));
   286		if (byte < 0) {
   287			dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
   288			return byte;
   289		}
   290	
   291		byte = mei_cldev_recv(cldev, (u8 *)&pairing_info_out,
   292				      sizeof(pairing_info_out));
   293		if (byte < 0) {
   294			dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
   295			return byte;
   296		}
   297	
   298		if (pairing_info_out.header.status != ME_HDCP_STATUS_SUCCESS) {
   299			dev_dbg(dev, "ME cmd 0x%08X failed. Status: 0x%X\n",
   300				WIRED_AKE_SEND_PAIRING_INFO,
   301				pairing_info_out.header.status);
   302			return -1;
   303		}
   304		return 0;
   305	}
   306	EXPORT_SYMBOL(mei_store_pairing_info);
   307	
   308	/**
   309	 * mei_initiate_locality_check:
   310	 *	Function to prepare LC_Init.
   311	 *
   312	 * @cldev		: Pointer for mei client device
   313	 * @data		: Intel HW specific Data
   314	 * @hdcp2_lc_init	: Pointer for storing LC_Init
   315	 *
   316	 * Returns 0 on Success, <0 on Failure
   317	 */
 > 318	int mei_initiate_locality_check(struct mei_cl_device *cldev,
   319					struct mei_hdcp_data *data,
   320					struct hdcp2_lc_init *lc_init_data)
   321	{
   322		struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
   323		struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } };
   324		struct device *dev;
   325		ssize_t byte;
   326	
   327		if (!data || !lc_init_data)
   328			return -EINVAL;
   329	
   330		dev = &cldev->dev;
   331	
   332		lc_init_in.header.api_version = HDCP_API_VERSION;
   333		lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
   334		lc_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
   335		lc_init_in.header.buffer_len = WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
   336	
   337		lc_init_in.port.integrated_port_type = data->port_type;
   338		lc_init_in.port.physical_port = data->port;
   339	
   340		byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
   341		if (byte < 0) {
   342			dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
   343			return byte;
   344		}
   345	
   346		byte = mei_cldev_recv(cldev, (u8 *)&lc_init_out, sizeof(lc_init_out));
   347		if (byte < 0) {
   348			dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
   349			return byte;
   350		}
   351	
   352		if (lc_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
   353			dev_dbg(dev, "ME cmd 0x%08X Failed. status: 0x%X\n",
   354				WIRED_INIT_LOCALITY_CHECK, lc_init_out.header.status);
   355			return -1;
   356		}
   357	
   358		lc_init_data->msg_id = HDCP_2_2_LC_INIT;
   359		memcpy(lc_init_data->r_n, lc_init_out.r_n, HDCP_2_2_RN_LEN);
   360		return 0;
   361	}
   362	EXPORT_SYMBOL(mei_initiate_locality_check);
   363	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Shankar, Uma May 9, 2018, 10:31 a.m. UTC | #2
>-----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 12/40] misc/mei/hdcp: Initiate Locality check

>

>Requests ME to start the second stage of HDCP2.2 authentication, called Locality

>Check.

>

>On Success, ME FW will provide LC_Init message to send to hdcp sink.

>

>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 | 56

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

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

> 2 files changed, 66 insertions(+)

>

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

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

>index 60afdd0cee79..9bd7e66a91e4 100644

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

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

>@@ -305,6 +305,62 @@ int mei_store_pairing_info(struct mei_cl_device *cldev,

>}  EXPORT_SYMBOL(mei_store_pairing_info);

>

>+/**

>+ * mei_initiate_locality_check:

>+ *	Function to prepare LC_Init.

>+ *

>+ * @cldev		: Pointer for mei client device

>+ * @data		: Intel HW specific Data

>+ * @hdcp2_lc_init	: Pointer for storing LC_Init

>+ *

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

>+ */

>+int mei_initiate_locality_check(struct mei_cl_device *cldev,

>+				struct mei_hdcp_data *data,

>+				struct hdcp2_lc_init *lc_init_data) {

>+	struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };

>+	struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } };

>+	struct device *dev;

>+	ssize_t byte;

>+

>+	if (!data || !lc_init_data)

>+		return -EINVAL;

>+

>+	dev = &cldev->dev;

>+

>+	lc_init_in.header.api_version = HDCP_API_VERSION;

>+	lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;

>+	lc_init_in.header.status = ME_HDCP_STATUS_SUCCESS;

>+	lc_init_in.header.buffer_len =

>+WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;

>+

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

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

>+

>+	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));

>+	if (byte < 0) {

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

>+		return byte;

>+	}

>+

>+	byte = mei_cldev_recv(cldev, (u8 *)&lc_init_out, sizeof(lc_init_out));

>+	if (byte < 0) {

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

>+		return byte;

>+	}

>+

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

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

>+			WIRED_INIT_LOCALITY_CHECK,

>lc_init_out.header.status);

>+		return -1;

>+	}

>+

>+	lc_init_data->msg_id = HDCP_2_2_LC_INIT;

>+	memcpy(lc_init_data->r_n, lc_init_out.r_n, HDCP_2_2_RN_LEN);


Check for validity of lc_init_data->r_n.
Also, leave a blank line.

>+	return 0;

>+}

>+EXPORT_SYMBOL(mei_initiate_locality_check);

>+

> 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

>be16e49d8018..d9c4cac0b276 100644

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

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

>@@ -121,6 +121,9 @@ int mei_verify_hprime(struct mei_cl_device *cldev, struct

>mei_hdcp_data *data,  int mei_store_pairing_info(struct mei_cl_device *cldev,

> 			   struct mei_hdcp_data *data,

> 			   struct hdcp2_ake_send_pairing_info *pairing_info);

>+int mei_initiate_locality_check(struct mei_cl_device *cldev,

>+				struct mei_hdcp_data *data,

>+				struct hdcp2_lc_init *lc_init_data);

> #else

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

>+163,12 @@ int mei_store_pairing_info(struct mei_cl_device *cldev,  {

> 	return -ENODEV;

> }

>+static inline

>+int mei_initiate_locality_check(struct mei_cl_device *cldev,

>+				struct mei_hdcp_data *data,

>+				struct hdcp2_lc_init *lc_init_data) {

>+	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:02 p.m. UTC | #3
On Wednesday 09 May 2018 04:01 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 12/40] misc/mei/hdcp: Initiate Locality check
>>
>> Requests ME to start the second stage of HDCP2.2 authentication, called Locality
>> Check.
>>
>> On Success, ME FW will provide LC_Init message to send to hdcp sink.
>>
>> 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 | 56
>> ++++++++++++++++++++++++++++++++++++++++
>> include/linux/mei_hdcp.h         | 10 +++++++
>> 2 files changed, 66 insertions(+)
>>
>> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c
>> b/drivers/misc/mei/hdcp/mei_hdcp.c
>> index 60afdd0cee79..9bd7e66a91e4 100644
>> --- a/drivers/misc/mei/hdcp/mei_hdcp.c
>> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
>> @@ -305,6 +305,62 @@ int mei_store_pairing_info(struct mei_cl_device *cldev,
>> }  EXPORT_SYMBOL(mei_store_pairing_info);
>>
>> +/**
>> + * mei_initiate_locality_check:
>> + *	Function to prepare LC_Init.
>> + *
>> + * @cldev		: Pointer for mei client device
>> + * @data		: Intel HW specific Data
>> + * @hdcp2_lc_init	: Pointer for storing LC_Init
>> + *
>> + * Returns 0 on Success, <0 on Failure
>> + */
>> +int mei_initiate_locality_check(struct mei_cl_device *cldev,
>> +				struct mei_hdcp_data *data,
>> +				struct hdcp2_lc_init *lc_init_data) {
>> +	struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
>> +	struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } };
>> +	struct device *dev;
>> +	ssize_t byte;
>> +
>> +	if (!data || !lc_init_data)
>> +		return -EINVAL;
>> +
>> +	dev = &cldev->dev;
>> +
>> +	lc_init_in.header.api_version = HDCP_API_VERSION;
>> +	lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
>> +	lc_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
>> +	lc_init_in.header.buffer_len =
>> +WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
>> +
>> +	lc_init_in.port.integrated_port_type = data->port_type;
>> +	lc_init_in.port.physical_port = data->port;
>> +
>> +	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
>> +	if (byte < 0) {
>> +		dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
>> +		return byte;
>> +	}
>> +
>> +	byte = mei_cldev_recv(cldev, (u8 *)&lc_init_out, sizeof(lc_init_out));
>> +	if (byte < 0) {
>> +		dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
>> +		return byte;
>> +	}
>> +
>> +	if (lc_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
>> +		dev_dbg(dev, "ME cmd 0x%08X Failed. status: 0x%X\n",
>> +			WIRED_INIT_LOCALITY_CHECK,
>> lc_init_out.header.status);
>> +		return -1;
>> +	}
>> +
>> +	lc_init_data->msg_id = HDCP_2_2_LC_INIT;
>> +	memcpy(lc_init_data->r_n, lc_init_out.r_n, HDCP_2_2_RN_LEN);
> Check for validity of lc_init_data->r_n.
> Also, leave a blank line.
ok

--Ram
>
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(mei_initiate_locality_check);
>> +
>> 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
>> be16e49d8018..d9c4cac0b276 100644
>> --- a/include/linux/mei_hdcp.h
>> +++ b/include/linux/mei_hdcp.h
>> @@ -121,6 +121,9 @@ int mei_verify_hprime(struct mei_cl_device *cldev, struct
>> mei_hdcp_data *data,  int mei_store_pairing_info(struct mei_cl_device *cldev,
>> 			   struct mei_hdcp_data *data,
>> 			   struct hdcp2_ake_send_pairing_info *pairing_info);
>> +int mei_initiate_locality_check(struct mei_cl_device *cldev,
>> +				struct mei_hdcp_data *data,
>> +				struct hdcp2_lc_init *lc_init_data);
>> #else
>> static int mei_cldev_register_notify(struct notifier_block *nb)  { @@ -160,5
>> +163,12 @@ int mei_store_pairing_info(struct mei_cl_device *cldev,  {
>> 	return -ENODEV;
>> }
>> +static inline
>> +int mei_initiate_locality_check(struct mei_cl_device *cldev,
>> +				struct mei_hdcp_data *data,
>> +				struct hdcp2_lc_init *lc_init_data) {
>> +	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 60afdd0cee79..9bd7e66a91e4 100644
--- a/drivers/misc/mei/hdcp/mei_hdcp.c
+++ b/drivers/misc/mei/hdcp/mei_hdcp.c
@@ -305,6 +305,62 @@  int mei_store_pairing_info(struct mei_cl_device *cldev,
 }
 EXPORT_SYMBOL(mei_store_pairing_info);
 
+/**
+ * mei_initiate_locality_check:
+ *	Function to prepare LC_Init.
+ *
+ * @cldev		: Pointer for mei client device
+ * @data		: Intel HW specific Data
+ * @hdcp2_lc_init	: Pointer for storing LC_Init
+ *
+ * Returns 0 on Success, <0 on Failure
+ */
+int mei_initiate_locality_check(struct mei_cl_device *cldev,
+				struct mei_hdcp_data *data,
+				struct hdcp2_lc_init *lc_init_data)
+{
+	struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
+	struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } };
+	struct device *dev;
+	ssize_t byte;
+
+	if (!data || !lc_init_data)
+		return -EINVAL;
+
+	dev = &cldev->dev;
+
+	lc_init_in.header.api_version = HDCP_API_VERSION;
+	lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
+	lc_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	lc_init_in.header.buffer_len = WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
+
+	lc_init_in.port.integrated_port_type = data->port_type;
+	lc_init_in.port.physical_port = data->port;
+
+	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
+	if (byte < 0) {
+		dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
+		return byte;
+	}
+
+	byte = mei_cldev_recv(cldev, (u8 *)&lc_init_out, sizeof(lc_init_out));
+	if (byte < 0) {
+		dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
+		return byte;
+	}
+
+	if (lc_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+		dev_dbg(dev, "ME cmd 0x%08X Failed. status: 0x%X\n",
+			WIRED_INIT_LOCALITY_CHECK, lc_init_out.header.status);
+		return -1;
+	}
+
+	lc_init_data->msg_id = HDCP_2_2_LC_INIT;
+	memcpy(lc_init_data->r_n, lc_init_out.r_n, HDCP_2_2_RN_LEN);
+	return 0;
+}
+EXPORT_SYMBOL(mei_initiate_locality_check);
+
 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 be16e49d8018..d9c4cac0b276 100644
--- a/include/linux/mei_hdcp.h
+++ b/include/linux/mei_hdcp.h
@@ -121,6 +121,9 @@  int mei_verify_hprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data,
 int mei_store_pairing_info(struct mei_cl_device *cldev,
 			   struct mei_hdcp_data *data,
 			   struct hdcp2_ake_send_pairing_info *pairing_info);
+int mei_initiate_locality_check(struct mei_cl_device *cldev,
+				struct mei_hdcp_data *data,
+				struct hdcp2_lc_init *lc_init_data);
 #else
 static int mei_cldev_register_notify(struct notifier_block *nb)
 {
@@ -160,5 +163,12 @@  int mei_store_pairing_info(struct mei_cl_device *cldev,
 {
 	return -ENODEV;
 }
+static inline
+int mei_initiate_locality_check(struct mei_cl_device *cldev,
+				struct mei_hdcp_data *data,
+				struct hdcp2_lc_init *lc_init_data)
+{
+	return -ENODEV;
+}
 #endif /* defined (CONFIG_INTEL_MEI_HDCP) */
 #endif /* defined (_LINUX_MEI_HDCP_H) */