diff mbox

[v3,08/40] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session

Message ID 1522763873-23041-9-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 ME FW to start the HDCP2.2 session for a intel port.
Prepares payloads for command WIRED_INITIATE_HDCP2_SESSION and sent
to ME FW.

On Success, ME FW will start a HDCP2.2 session for the port and
provides the content for HDCP2.2 AKE_Init message.

v2:
  Rebased.
v3:
  cldev is add as a separate parameter [Tomas]
  Redundant comment and typecast are removed [Tomas]

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

Comments

kernel test robot April 3, 2018, 9:20 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:122: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:117: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:113: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:123: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:117: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:117:12: warning: 'mei_cldev_unregister_notify' defined but not used [-Wunused-function]
   include/linux/mei_hdcp.h:113: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_hdcp2_session +52 drivers/misc/mei/hdcp/mei_hdcp.c

    41	
    42	/**
    43	 * mei_initiate_hdcp2_session:
    44	 *	Function to start a Wired HDCP2.2 Tx Session with ME FW
    45	 *
    46	 * @cldev		: Pointer for mei client device
    47	 * @data		: Intel HW specific Data
    48	 * @ake_data		: ptr to store AKE_Init
    49	 *
    50	 * Returns 0 on Success, <0 on Failure.
    51	 */
  > 52	int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
    53				       struct mei_hdcp_data *data,
    54				       struct hdcp2_ake_init *ake_data)
    55	{
    56		struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 } };
    57		struct wired_cmd_initiate_hdcp2_session_out
    58							session_init_out = { { 0 } };
    59		struct device *dev;
    60		ssize_t byte;
    61	
    62		if (!data || !ake_data)
    63			return -EINVAL;
    64	
    65		dev = &cldev->dev;
    66	
    67		session_init_in.header.api_version = HDCP_API_VERSION;
    68		session_init_in.header.command_id = WIRED_INITIATE_HDCP2_SESSION;
    69		session_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
    70		session_init_in.header.buffer_len =
    71					WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
    72	
    73		session_init_in.port.integrated_port_type = data->port_type;
    74		session_init_in.port.physical_port = data->port;
    75		session_init_in.protocol = (uint8_t)data->protocol;
    76	
    77		byte = mei_cldev_send(cldev, (u8 *)&session_init_in,
    78				      sizeof(session_init_in));
    79		if (byte < 0) {
    80			dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
    81			return byte;
    82		}
    83	
    84		byte = mei_cldev_recv(cldev, (u8 *)&session_init_out,
    85				      sizeof(session_init_out));
    86		if (byte < 0) {
    87			dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
    88			return byte;
    89		}
    90	
    91		if (session_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
    92			dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
    93				WIRED_INITIATE_HDCP2_SESSION,
    94				session_init_out.header.status);
    95			return -1;
    96		}
    97	
    98		ake_data->msg_id = HDCP_2_2_AKE_INIT;
    99		ake_data->tx_caps = session_init_out.tx_caps;
   100		memcpy(ake_data->r_tx, session_init_out.r_tx,
   101		       sizeof(session_init_out.r_tx));
   102	
   103		return 0;
   104	}
   105	EXPORT_SYMBOL(mei_initiate_hdcp2_session);
   106	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Alexander Usyskin April 4, 2018, 6:45 a.m. UTC | #2
> -----Original Message-----
> From: C, Ramalingam
> Sent: Tuesday, April 03, 2018 16:57
> 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>; C, Ramalingam
> <ramalingam.c@intel.com>
> Subject: [PATCH v3 08/40] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session
> 
> Request ME FW to start the HDCP2.2 session for a intel port.
> Prepares payloads for command WIRED_INITIATE_HDCP2_SESSION and sent
> to ME FW.
> 
> On Success, ME FW will start a HDCP2.2 session for the port and
> provides the content for HDCP2.2 AKE_Init message.
> 
> v2:
>   Rebased.
> v3:
>   cldev is add as a separate parameter [Tomas]
>   Redundant comment and typecast are removed [Tomas]
> 
> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> ---
>  drivers/misc/mei/hdcp/mei_hdcp.c | 68
> ++++++++++++++++++++++++++++++++++++++++
>  include/linux/mei_hdcp.h         | 11 +++++++
>  2 files changed, 79 insertions(+)
> 
> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c
> b/drivers/misc/mei/hdcp/mei_hdcp.c
> index 2811a25f8c57..7caee0947761 100644
> --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> @@ -33,9 +33,77 @@
>  #include <linux/mei_cl_bus.h>
>  #include <linux/notifier.h>
>  #include <linux/mei_hdcp.h>
> +#include <drm/drm_connector.h>
> +
> +#include "mei_hdcp.h"
> 
>  static BLOCKING_NOTIFIER_HEAD(mei_cldev_notifier_list);
> 
> +/**
> + * mei_initiate_hdcp2_session:
> + *	Function to start a Wired HDCP2.2 Tx Session with ME FW
> + *
> + * @cldev		: Pointer for mei client device
> + * @data		: Intel HW specific Data
> + * @ake_data		: ptr to store AKE_Init
> + *
> + * Returns 0 on Success, <0 on Failure.
> + */
> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
> +			       struct mei_hdcp_data *data,
> +			       struct hdcp2_ake_init *ake_data)
> +{
> +	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 }
> };
> +	struct wired_cmd_initiate_hdcp2_session_out
> +						session_init_out = { { 0 } };
> +	struct device *dev;
> +	ssize_t byte;
> +
> +	if (!data || !ake_data)
> +		return -EINVAL;
> +
> +	dev = &cldev->dev;
> +
> +	session_init_in.header.api_version = HDCP_API_VERSION;
> +	session_init_in.header.command_id =
> WIRED_INITIATE_HDCP2_SESSION;
> +	session_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
> +	session_init_in.header.buffer_len =
> +
> 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> +
> +	session_init_in.port.integrated_port_type = data->port_type;
> +	session_init_in.port.physical_port = data->port;
> +	session_init_in.protocol = (uint8_t)data->protocol;
> +
> +	byte = mei_cldev_send(cldev, (u8 *)&session_init_in,
> +			      sizeof(session_init_in));
> +	if (byte < 0) {
> +		dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
%zd don't require (int)
> +		return byte;
> +	}
> +
> +	byte = mei_cldev_recv(cldev, (u8 *)&session_init_out,
> +			      sizeof(session_init_out));
> +	if (byte < 0) {
> +		dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
%zd don't require (int)
> +		return byte;
> +	}
> +
> +	if (session_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +		dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
> +			WIRED_INITIATE_HDCP2_SESSION,
> +			session_init_out.header.status);
> +		return -1;
It will be better to return some meaningful error code here.
> +	}
> +
> +	ake_data->msg_id = HDCP_2_2_AKE_INIT;
> +	ake_data->tx_caps = session_init_out.tx_caps;
> +	memcpy(ake_data->r_tx, session_init_out.r_tx,
> +	       sizeof(session_init_out.r_tx));
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL(mei_initiate_hdcp2_session);
> +
>  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 634c1a5bdf1e..bb4f27d3abcb 100644
> --- a/include/linux/mei_hdcp.h
> +++ b/include/linux/mei_hdcp.h
> @@ -28,6 +28,7 @@
>  #define _LINUX_MEI_HDCP_H
> 
>  #include <linux/mei_cl_bus.h>
> +#include <drm/drm_hdcp.h>
> 
>  enum mei_cldev_state {
>  	MEI_CLDEV_DISABLED,
> @@ -105,6 +106,9 @@ struct mei_hdcp_data {
>  #ifdef CONFIG_INTEL_MEI_HDCP
>  int mei_cldev_register_notify(struct notifier_block *nb);
>  int mei_cldev_unregister_notify(struct notifier_block *nb);
> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
> +			       struct mei_hdcp_data *data,
> +			       struct hdcp2_ake_init *ake_data);
>  #else
>  static int mei_cldev_register_notify(struct notifier_block *nb)
>  {
> @@ -114,5 +118,12 @@ static int mei_cldev_unregister_notify(struct
> notifier_block *nb)
>  {
>  	return -ENODEV;
>  }
> +static inline
> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
> +			       struct mei_hdcp_data *data,
> +			       struct hdcp2_ake_init *ake_data)
> +{
> +	return -ENODEV;
> +}
>  #endif /* defined (CONFIG_INTEL_MEI_HDCP) */
>  #endif /* defined (_LINUX_MEI_HDCP_H) */
> --
> 2.7.4
Shankar, Uma May 9, 2018, 10:13 a.m. UTC | #3
>-----Original Message-----

>From: Intel-gfx [mailto:intel-gfx-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: [Intel-gfx] [PATCH v3 08/40] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx

>Session

>

>Request ME FW to start the HDCP2.2 session for a intel port.


Change "a" to "an".

>Prepares payloads for command WIRED_INITIATE_HDCP2_SESSION and sent to


"sent" to "sends"

>ME FW.

>

>On Success, ME FW will start a HDCP2.2 session for the port and provides the

>content for HDCP2.2 AKE_Init message.

>

>v2:

>  Rebased.

>v3:

>  cldev is add as a separate parameter [Tomas]

>  Redundant comment and typecast are removed [Tomas]

>

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

>---

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

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

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

> 2 files changed, 79 insertions(+)

>

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

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

>index 2811a25f8c57..7caee0947761 100644

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

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

>@@ -33,9 +33,77 @@

> #include <linux/mei_cl_bus.h>

> #include <linux/notifier.h>

> #include <linux/mei_hdcp.h>

>+#include <drm/drm_connector.h>

>+

>+#include "mei_hdcp.h"

>

> static BLOCKING_NOTIFIER_HEAD(mei_cldev_notifier_list);

>

>+/**

>+ * mei_initiate_hdcp2_session:

>+ *	Function to start a Wired HDCP2.2 Tx Session with ME FW

>+ *

>+ * @cldev		: Pointer for mei client device

>+ * @data		: Intel HW specific Data

>+ * @ake_data		: ptr to store AKE_Init

>+ *

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

>+ */

>+int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,

>+			       struct mei_hdcp_data *data,

>+			       struct hdcp2_ake_init *ake_data) {

>+	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 } };

>+	struct wired_cmd_initiate_hdcp2_session_out

>+						session_init_out = { { 0 } };

>+	struct device *dev;

>+	ssize_t byte;

>+

>+	if (!data || !ake_data)

>+		return -EINVAL;

>+

>+	dev = &cldev->dev;

>+

>+	session_init_in.header.api_version = HDCP_API_VERSION;

>+	session_init_in.header.command_id =

>WIRED_INITIATE_HDCP2_SESSION;

>+	session_init_in.header.status = ME_HDCP_STATUS_SUCCESS;

>+	session_init_in.header.buffer_len =

>+

>	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;

>+

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

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

>+	session_init_in.protocol = (uint8_t)data->protocol;

>+

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

>+			      sizeof(session_init_in));

>+	if (byte < 0) {

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

>+		return byte;

>+	}

>+

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

>+			      sizeof(session_init_out));

>+	if (byte < 0) {

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

>+		return byte;

>+	}

>+

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

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

>+			WIRED_INITIATE_HDCP2_SESSION,

>+			session_init_out.header.status);

>+		return -1;

>+	}

>+

>+	ake_data->msg_id = HDCP_2_2_AKE_INIT;

>+	ake_data->tx_caps = session_init_out.tx_caps;

>+	memcpy(ake_data->r_tx, session_init_out.r_tx,


We should check for ake_data->r_tx for NULL as well before attempting this copy.

>+	       sizeof(session_init_out.r_tx));

>+

>+	return 0;

>+}

>+EXPORT_SYMBOL(mei_initiate_hdcp2_session);

>+

> 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

>634c1a5bdf1e..bb4f27d3abcb 100644

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

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

>@@ -28,6 +28,7 @@

> #define _LINUX_MEI_HDCP_H

>

> #include <linux/mei_cl_bus.h>

>+#include <drm/drm_hdcp.h>

>

> enum mei_cldev_state {

> 	MEI_CLDEV_DISABLED,

>@@ -105,6 +106,9 @@ struct mei_hdcp_data {  #ifdef

>CONFIG_INTEL_MEI_HDCP  int mei_cldev_register_notify(struct notifier_block

>*nb);  int mei_cldev_unregister_notify(struct notifier_block *nb);

>+int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,

>+			       struct mei_hdcp_data *data,

>+			       struct hdcp2_ake_init *ake_data);

> #else

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

>+118,12 @@ static int mei_cldev_unregister_notify(struct notifier_block *nb)  {

> 	return -ENODEV;

> }

>+static inline

>+int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,

>+			       struct mei_hdcp_data *data,

>+			       struct hdcp2_ake_init *ake_data) {

>+	return -ENODEV;

>+}

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

>(_LINUX_MEI_HDCP_H) */

>--

>2.7.4

>

>_______________________________________________

>Intel-gfx mailing list

>Intel-gfx@lists.freedesktop.org

>https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Ramalingam C May 16, 2018, 3:19 p.m. UTC | #4
On Wednesday 04 April 2018 12:15 PM, Usyskin, Alexander wrote:
>
>> -----Original Message-----
>> From: C, Ramalingam
>> Sent: Tuesday, April 03, 2018 16:57
>> 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>; C, Ramalingam
>> <ramalingam.c@intel.com>
>> Subject: [PATCH v3 08/40] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session
>>
>> Request ME FW to start the HDCP2.2 session for a intel port.
>> Prepares payloads for command WIRED_INITIATE_HDCP2_SESSION and sent
>> to ME FW.
>>
>> On Success, ME FW will start a HDCP2.2 session for the port and
>> provides the content for HDCP2.2 AKE_Init message.
>>
>> v2:
>>    Rebased.
>> v3:
>>    cldev is add as a separate parameter [Tomas]
>>    Redundant comment and typecast are removed [Tomas]
>>
>> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
>> ---
>>   drivers/misc/mei/hdcp/mei_hdcp.c | 68
>> ++++++++++++++++++++++++++++++++++++++++
>>   include/linux/mei_hdcp.h         | 11 +++++++
>>   2 files changed, 79 insertions(+)
>>
>> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c
>> b/drivers/misc/mei/hdcp/mei_hdcp.c
>> index 2811a25f8c57..7caee0947761 100644
>> --- a/drivers/misc/mei/hdcp/mei_hdcp.c
>> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
>> @@ -33,9 +33,77 @@
>>   #include <linux/mei_cl_bus.h>
>>   #include <linux/notifier.h>
>>   #include <linux/mei_hdcp.h>
>> +#include <drm/drm_connector.h>
>> +
>> +#include "mei_hdcp.h"
>>
>>   static BLOCKING_NOTIFIER_HEAD(mei_cldev_notifier_list);
>>
>> +/**
>> + * mei_initiate_hdcp2_session:
>> + *	Function to start a Wired HDCP2.2 Tx Session with ME FW
>> + *
>> + * @cldev		: Pointer for mei client device
>> + * @data		: Intel HW specific Data
>> + * @ake_data		: ptr to store AKE_Init
>> + *
>> + * Returns 0 on Success, <0 on Failure.
>> + */
>> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
>> +			       struct mei_hdcp_data *data,
>> +			       struct hdcp2_ake_init *ake_data)
>> +{
>> +	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 }
>> };
>> +	struct wired_cmd_initiate_hdcp2_session_out
>> +						session_init_out = { { 0 } };
>> +	struct device *dev;
>> +	ssize_t byte;
>> +
>> +	if (!data || !ake_data)
>> +		return -EINVAL;
>> +
>> +	dev = &cldev->dev;
>> +
>> +	session_init_in.header.api_version = HDCP_API_VERSION;
>> +	session_init_in.header.command_id =
>> WIRED_INITIATE_HDCP2_SESSION;
>> +	session_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
>> +	session_init_in.header.buffer_len =
>> +
>> 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
>> +
>> +	session_init_in.port.integrated_port_type = data->port_type;
>> +	session_init_in.port.physical_port = data->port;
>> +	session_init_in.protocol = (uint8_t)data->protocol;
>> +
>> +	byte = mei_cldev_send(cldev, (u8 *)&session_init_in,
>> +			      sizeof(session_init_in));
>> +	if (byte < 0) {
>> +		dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
> %zd don't require (int)
Sure. Thanks
>> +		return byte;
>> +	}
>> +
>> +	byte = mei_cldev_recv(cldev, (u8 *)&session_init_out,
>> +			      sizeof(session_init_out));
>> +	if (byte < 0) {
>> +		dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
> %zd don't require (int)
>> +		return byte;
>> +	}
>> +
>> +	if (session_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
>> +		dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
>> +			WIRED_INITIATE_HDCP2_SESSION,
>> +			session_init_out.header.status);
>> +		return -1;
> It will be better to return some meaningful error code here.
I dont think default error codes will match here. And at present other 
side I915 doesn't expect the reason but the failure state.
May be we could do something like -(session_init_out.header.status). But 
error codes of ME FW is not known to I915.

So may be as of now lets keep it as some -ve return value -1?

--Ram
>> +	}
>> +
>> +	ake_data->msg_id = HDCP_2_2_AKE_INIT;
>> +	ake_data->tx_caps = session_init_out.tx_caps;
>> +	memcpy(ake_data->r_tx, session_init_out.r_tx,
>> +	       sizeof(session_init_out.r_tx));
>> +
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(mei_initiate_hdcp2_session);
>> +
>>   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 634c1a5bdf1e..bb4f27d3abcb 100644
>> --- a/include/linux/mei_hdcp.h
>> +++ b/include/linux/mei_hdcp.h
>> @@ -28,6 +28,7 @@
>>   #define _LINUX_MEI_HDCP_H
>>
>>   #include <linux/mei_cl_bus.h>
>> +#include <drm/drm_hdcp.h>
>>
>>   enum mei_cldev_state {
>>   	MEI_CLDEV_DISABLED,
>> @@ -105,6 +106,9 @@ struct mei_hdcp_data {
>>   #ifdef CONFIG_INTEL_MEI_HDCP
>>   int mei_cldev_register_notify(struct notifier_block *nb);
>>   int mei_cldev_unregister_notify(struct notifier_block *nb);
>> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
>> +			       struct mei_hdcp_data *data,
>> +			       struct hdcp2_ake_init *ake_data);
>>   #else
>>   static int mei_cldev_register_notify(struct notifier_block *nb)
>>   {
>> @@ -114,5 +118,12 @@ static int mei_cldev_unregister_notify(struct
>> notifier_block *nb)
>>   {
>>   	return -ENODEV;
>>   }
>> +static inline
>> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
>> +			       struct mei_hdcp_data *data,
>> +			       struct hdcp2_ake_init *ake_data)
>> +{
>> +	return -ENODEV;
>> +}
>>   #endif /* defined (CONFIG_INTEL_MEI_HDCP) */
>>   #endif /* defined (_LINUX_MEI_HDCP_H) */
>> --
>> 2.7.4
Ramalingam C May 16, 2018, 3:26 p.m. UTC | #5
On Wednesday 09 May 2018 03:43 PM, Shankar, Uma wrote:
>
>> -----Original Message-----
>> From: Intel-gfx [mailto:intel-gfx-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: [Intel-gfx] [PATCH v3 08/40] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx
>> Session
>>
>> Request ME FW to start the HDCP2.2 session for a intel port.
> Change "a" to "an".
>
>> Prepares payloads for command WIRED_INITIATE_HDCP2_SESSION and sent to
> "sent" to "sends"
>
>> ME FW.
>>
>> On Success, ME FW will start a HDCP2.2 session for the port and provides the
>> content for HDCP2.2 AKE_Init message.
>>
>> v2:
>>   Rebased.
>> v3:
>>   cldev is add as a separate parameter [Tomas]
>>   Redundant comment and typecast are removed [Tomas]
>>
>> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
>> ---
>> drivers/misc/mei/hdcp/mei_hdcp.c | 68
>> ++++++++++++++++++++++++++++++++++++++++
>> include/linux/mei_hdcp.h         | 11 +++++++
>> 2 files changed, 79 insertions(+)
>>
>> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c
>> b/drivers/misc/mei/hdcp/mei_hdcp.c
>> index 2811a25f8c57..7caee0947761 100644
>> --- a/drivers/misc/mei/hdcp/mei_hdcp.c
>> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
>> @@ -33,9 +33,77 @@
>> #include <linux/mei_cl_bus.h>
>> #include <linux/notifier.h>
>> #include <linux/mei_hdcp.h>
>> +#include <drm/drm_connector.h>
>> +
>> +#include "mei_hdcp.h"
>>
>> static BLOCKING_NOTIFIER_HEAD(mei_cldev_notifier_list);
>>
>> +/**
>> + * mei_initiate_hdcp2_session:
>> + *	Function to start a Wired HDCP2.2 Tx Session with ME FW
>> + *
>> + * @cldev		: Pointer for mei client device
>> + * @data		: Intel HW specific Data
>> + * @ake_data		: ptr to store AKE_Init
>> + *
>> + * Returns 0 on Success, <0 on Failure.
>> + */
>> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
>> +			       struct mei_hdcp_data *data,
>> +			       struct hdcp2_ake_init *ake_data) {
>> +	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 } };
>> +	struct wired_cmd_initiate_hdcp2_session_out
>> +						session_init_out = { { 0 } };
>> +	struct device *dev;
>> +	ssize_t byte;
>> +
>> +	if (!data || !ake_data)
>> +		return -EINVAL;
>> +
>> +	dev = &cldev->dev;
>> +
>> +	session_init_in.header.api_version = HDCP_API_VERSION;
>> +	session_init_in.header.command_id =
>> WIRED_INITIATE_HDCP2_SESSION;
>> +	session_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
>> +	session_init_in.header.buffer_len =
>> +
>> 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
>> +
>> +	session_init_in.port.integrated_port_type = data->port_type;
>> +	session_init_in.port.physical_port = data->port;
>> +	session_init_in.protocol = (uint8_t)data->protocol;
>> +
>> +	byte = mei_cldev_send(cldev, (u8 *)&session_init_in,
>> +			      sizeof(session_init_in));
>> +	if (byte < 0) {
>> +		dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
>> +		return byte;
>> +	}
>> +
>> +	byte = mei_cldev_recv(cldev, (u8 *)&session_init_out,
>> +			      sizeof(session_init_out));
>> +	if (byte < 0) {
>> +		dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
>> +		return byte;
>> +	}
>> +
>> +	if (session_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
>> +		dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
>> +			WIRED_INITIATE_HDCP2_SESSION,
>> +			session_init_out.header.status);
>> +		return -1;
>> +	}
>> +
>> +	ake_data->msg_id = HDCP_2_2_AKE_INIT;
>> +	ake_data->tx_caps = session_init_out.tx_caps;
>> +	memcpy(ake_data->r_tx, session_init_out.r_tx,
> We should check for ake_data->r_tx for NULL as well before attempting this copy.
r_tx is statically allocated array within struct ake_data. So I guess 
once ptr ake_data is valid
we need not check for r_tx.

--Ram
>
>> +	       sizeof(session_init_out.r_tx));
>> +
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(mei_initiate_hdcp2_session);
>> +
>> 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
>> 634c1a5bdf1e..bb4f27d3abcb 100644
>> --- a/include/linux/mei_hdcp.h
>> +++ b/include/linux/mei_hdcp.h
>> @@ -28,6 +28,7 @@
>> #define _LINUX_MEI_HDCP_H
>>
>> #include <linux/mei_cl_bus.h>
>> +#include <drm/drm_hdcp.h>
>>
>> enum mei_cldev_state {
>> 	MEI_CLDEV_DISABLED,
>> @@ -105,6 +106,9 @@ struct mei_hdcp_data {  #ifdef
>> CONFIG_INTEL_MEI_HDCP  int mei_cldev_register_notify(struct notifier_block
>> *nb);  int mei_cldev_unregister_notify(struct notifier_block *nb);
>> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
>> +			       struct mei_hdcp_data *data,
>> +			       struct hdcp2_ake_init *ake_data);
>> #else
>> static int mei_cldev_register_notify(struct notifier_block *nb)  { @@ -114,5
>> +118,12 @@ static int mei_cldev_unregister_notify(struct notifier_block *nb)  {
>> 	return -ENODEV;
>> }
>> +static inline
>> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
>> +			       struct mei_hdcp_data *data,
>> +			       struct hdcp2_ake_init *ake_data) {
>> +	return -ENODEV;
>> +}
>> #endif /* defined (CONFIG_INTEL_MEI_HDCP) */  #endif /* defined
>> (_LINUX_MEI_HDCP_H) */
>> --
>> 2.7.4
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Alexander Usyskin May 17, 2018, 5:56 a.m. UTC | #6
> -----Original Message-----

> From: C, Ramalingam

> Sent: Wednesday, May 16, 2018 18:20

> To: Usyskin, Alexander <alexander.usyskin@intel.com>; 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>

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

> Subject: Re: [PATCH v3 08/40] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx

> Session

> 

> 

> 

> On Wednesday 04 April 2018 12:15 PM, Usyskin, Alexander wrote:

> >

> >> -----Original Message-----

> >> From: C, Ramalingam

> >> Sent: Tuesday, April 03, 2018 16:57

> >> 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>; C, Ramalingam

> >> <ramalingam.c@intel.com>

> >> Subject: [PATCH v3 08/40] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx

> >> Session

> >>

> >> Request ME FW to start the HDCP2.2 session for a intel port.

> >> Prepares payloads for command WIRED_INITIATE_HDCP2_SESSION and

> sent

> >> to ME FW.

> >>

> >> On Success, ME FW will start a HDCP2.2 session for the port and

> >> provides the content for HDCP2.2 AKE_Init message.

> >>

> >> v2:

> >>    Rebased.

> >> v3:

> >>    cldev is add as a separate parameter [Tomas]

> >>    Redundant comment and typecast are removed [Tomas]

> >>

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

> >> ---

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

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

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

> >>   2 files changed, 79 insertions(+)

> >>

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

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

> >> index 2811a25f8c57..7caee0947761 100644

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

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

> >> @@ -33,9 +33,77 @@

> >>   #include <linux/mei_cl_bus.h>

> >>   #include <linux/notifier.h>

> >>   #include <linux/mei_hdcp.h>

> >> +#include <drm/drm_connector.h>

> >> +

> >> +#include "mei_hdcp.h"

> >>

> >>   static BLOCKING_NOTIFIER_HEAD(mei_cldev_notifier_list);

> >>

> >> +/**

> >> + * mei_initiate_hdcp2_session:

> >> + *	Function to start a Wired HDCP2.2 Tx Session with ME FW

> >> + *

> >> + * @cldev		: Pointer for mei client device

> >> + * @data		: Intel HW specific Data

> >> + * @ake_data		: ptr to store AKE_Init

> >> + *

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

> >> + */

> >> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,

> >> +			       struct mei_hdcp_data *data,

> >> +			       struct hdcp2_ake_init *ake_data) {

> >> +	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0

> >> +}

> >> };

> >> +	struct wired_cmd_initiate_hdcp2_session_out

> >> +						session_init_out = { { 0 } };

> >> +	struct device *dev;

> >> +	ssize_t byte;

> >> +

> >> +	if (!data || !ake_data)

> >> +		return -EINVAL;

> >> +

> >> +	dev = &cldev->dev;

> >> +

> >> +	session_init_in.header.api_version = HDCP_API_VERSION;

> >> +	session_init_in.header.command_id =

> >> WIRED_INITIATE_HDCP2_SESSION;

> >> +	session_init_in.header.status = ME_HDCP_STATUS_SUCCESS;

> >> +	session_init_in.header.buffer_len =

> >> +

> >> 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;

> >> +

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

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

> >> +	session_init_in.protocol = (uint8_t)data->protocol;

> >> +

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

> >> +			      sizeof(session_init_in));

> >> +	if (byte < 0) {

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

> > %zd don't require (int)

> Sure. Thanks

> >> +		return byte;

> >> +	}

> >> +

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

> >> +			      sizeof(session_init_out));

> >> +	if (byte < 0) {

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

> > %zd don't require (int)

> >> +		return byte;

> >> +	}

> >> +

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

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

> >> +			WIRED_INITIATE_HDCP2_SESSION,

> >> +			session_init_out.header.status);

> >> +		return -1;

> > It will be better to return some meaningful error code here.

> I dont think default error codes will match here. And at present other side

> I915 doesn't expect the reason but the failure state.

> May be we could do something like -(session_init_out.header.status). But

> error codes of ME FW is not known to I915.

> 

> So may be as of now lets keep it as some -ve return value -1?


-1 is -EPERM - that may confuse, better to use some neutral value, like -EIO

> 

> --Ram

> >> +	}

> >> +

> >> +	ake_data->msg_id = HDCP_2_2_AKE_INIT;

> >> +	ake_data->tx_caps = session_init_out.tx_caps;

> >> +	memcpy(ake_data->r_tx, session_init_out.r_tx,

> >> +	       sizeof(session_init_out.r_tx));

> >> +

> >> +	return 0;

> >> +}

> >> +EXPORT_SYMBOL(mei_initiate_hdcp2_session);

> >> +

> >>   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 634c1a5bdf1e..bb4f27d3abcb 100644

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

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

> >> @@ -28,6 +28,7 @@

> >>   #define _LINUX_MEI_HDCP_H

> >>

> >>   #include <linux/mei_cl_bus.h>

> >> +#include <drm/drm_hdcp.h>

> >>

> >>   enum mei_cldev_state {

> >>   	MEI_CLDEV_DISABLED,

> >> @@ -105,6 +106,9 @@ struct mei_hdcp_data {

> >>   #ifdef CONFIG_INTEL_MEI_HDCP

> >>   int mei_cldev_register_notify(struct notifier_block *nb);

> >>   int mei_cldev_unregister_notify(struct notifier_block *nb);

> >> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,

> >> +			       struct mei_hdcp_data *data,

> >> +			       struct hdcp2_ake_init *ake_data);

> >>   #else

> >>   static int mei_cldev_register_notify(struct notifier_block *nb)

> >>   {

> >> @@ -114,5 +118,12 @@ static int mei_cldev_unregister_notify(struct

> >> notifier_block *nb)

> >>   {

> >>   	return -ENODEV;

> >>   }

> >> +static inline

> >> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,

> >> +			       struct mei_hdcp_data *data,

> >> +			       struct hdcp2_ake_init *ake_data) {

> >> +	return -ENODEV;

> >> +}

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

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

> >> --

> >> 2.7.4
Ramalingam C May 17, 2018, 6:08 a.m. UTC | #7
On Thursday 17 May 2018 11:26 AM, Usyskin, Alexander wrote:
>
>> -----Original Message-----
>> From: C, Ramalingam
>> Sent: Wednesday, May 16, 2018 18:20
>> To: Usyskin, Alexander <alexander.usyskin@intel.com>; 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>
>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>
>> Subject: Re: [PATCH v3 08/40] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx
>> Session
>>
>>
>>
>> On Wednesday 04 April 2018 12:15 PM, Usyskin, Alexander wrote:
>>>> -----Original Message-----
>>>> From: C, Ramalingam
>>>> Sent: Tuesday, April 03, 2018 16:57
>>>> 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>; C, Ramalingam
>>>> <ramalingam.c@intel.com>
>>>> Subject: [PATCH v3 08/40] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx
>>>> Session
>>>>
>>>> Request ME FW to start the HDCP2.2 session for a intel port.
>>>> Prepares payloads for command WIRED_INITIATE_HDCP2_SESSION and
>> sent
>>>> to ME FW.
>>>>
>>>> On Success, ME FW will start a HDCP2.2 session for the port and
>>>> provides the content for HDCP2.2 AKE_Init message.
>>>>
>>>> v2:
>>>>     Rebased.
>>>> v3:
>>>>     cldev is add as a separate parameter [Tomas]
>>>>     Redundant comment and typecast are removed [Tomas]
>>>>
>>>> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
>>>> ---
>>>>    drivers/misc/mei/hdcp/mei_hdcp.c | 68
>>>> ++++++++++++++++++++++++++++++++++++++++
>>>>    include/linux/mei_hdcp.h         | 11 +++++++
>>>>    2 files changed, 79 insertions(+)
>>>>
>>>> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c
>>>> b/drivers/misc/mei/hdcp/mei_hdcp.c
>>>> index 2811a25f8c57..7caee0947761 100644
>>>> --- a/drivers/misc/mei/hdcp/mei_hdcp.c
>>>> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
>>>> @@ -33,9 +33,77 @@
>>>>    #include <linux/mei_cl_bus.h>
>>>>    #include <linux/notifier.h>
>>>>    #include <linux/mei_hdcp.h>
>>>> +#include <drm/drm_connector.h>
>>>> +
>>>> +#include "mei_hdcp.h"
>>>>
>>>>    static BLOCKING_NOTIFIER_HEAD(mei_cldev_notifier_list);
>>>>
>>>> +/**
>>>> + * mei_initiate_hdcp2_session:
>>>> + *	Function to start a Wired HDCP2.2 Tx Session with ME FW
>>>> + *
>>>> + * @cldev		: Pointer for mei client device
>>>> + * @data		: Intel HW specific Data
>>>> + * @ake_data		: ptr to store AKE_Init
>>>> + *
>>>> + * Returns 0 on Success, <0 on Failure.
>>>> + */
>>>> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
>>>> +			       struct mei_hdcp_data *data,
>>>> +			       struct hdcp2_ake_init *ake_data) {
>>>> +	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0
>>>> +}
>>>> };
>>>> +	struct wired_cmd_initiate_hdcp2_session_out
>>>> +						session_init_out = { { 0 } };
>>>> +	struct device *dev;
>>>> +	ssize_t byte;
>>>> +
>>>> +	if (!data || !ake_data)
>>>> +		return -EINVAL;
>>>> +
>>>> +	dev = &cldev->dev;
>>>> +
>>>> +	session_init_in.header.api_version = HDCP_API_VERSION;
>>>> +	session_init_in.header.command_id =
>>>> WIRED_INITIATE_HDCP2_SESSION;
>>>> +	session_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
>>>> +	session_init_in.header.buffer_len =
>>>> +
>>>> 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
>>>> +
>>>> +	session_init_in.port.integrated_port_type = data->port_type;
>>>> +	session_init_in.port.physical_port = data->port;
>>>> +	session_init_in.protocol = (uint8_t)data->protocol;
>>>> +
>>>> +	byte = mei_cldev_send(cldev, (u8 *)&session_init_in,
>>>> +			      sizeof(session_init_in));
>>>> +	if (byte < 0) {
>>>> +		dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
>>> %zd don't require (int)
>> Sure. Thanks
>>>> +		return byte;
>>>> +	}
>>>> +
>>>> +	byte = mei_cldev_recv(cldev, (u8 *)&session_init_out,
>>>> +			      sizeof(session_init_out));
>>>> +	if (byte < 0) {
>>>> +		dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
>>> %zd don't require (int)
>>>> +		return byte;
>>>> +	}
>>>> +
>>>> +	if (session_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
>>>> +		dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
>>>> +			WIRED_INITIATE_HDCP2_SESSION,
>>>> +			session_init_out.header.status);
>>>> +		return -1;
>>> It will be better to return some meaningful error code here.
>> I dont think default error codes will match here. And at present other side
>> I915 doesn't expect the reason but the failure state.
>> May be we could do something like -(session_init_out.header.status). But
>> error codes of ME FW is not known to I915.
>>
>> So may be as of now lets keep it as some -ve return value -1?
> -1 is -EPERM - that may confuse, better to use some neutral value, like -EIO
-EIO also misleading. Not only this but other err codes in 1 to 34 range 
also. As the failure could be
due to the wrong state of  state machine for the port or n other number 
of reasons.

But as mentioned I915 looks for 0 on success or <0 for errors. So fir 
functionality any value <0 will work.
So I will start using -EIO.

--Ram
>
>> --Ram
>>>> +	}
>>>> +
>>>> +	ake_data->msg_id = HDCP_2_2_AKE_INIT;
>>>> +	ake_data->tx_caps = session_init_out.tx_caps;
>>>> +	memcpy(ake_data->r_tx, session_init_out.r_tx,
>>>> +	       sizeof(session_init_out.r_tx));
>>>> +
>>>> +	return 0;
>>>> +}
>>>> +EXPORT_SYMBOL(mei_initiate_hdcp2_session);
>>>> +
>>>>    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 634c1a5bdf1e..bb4f27d3abcb 100644
>>>> --- a/include/linux/mei_hdcp.h
>>>> +++ b/include/linux/mei_hdcp.h
>>>> @@ -28,6 +28,7 @@
>>>>    #define _LINUX_MEI_HDCP_H
>>>>
>>>>    #include <linux/mei_cl_bus.h>
>>>> +#include <drm/drm_hdcp.h>
>>>>
>>>>    enum mei_cldev_state {
>>>>    	MEI_CLDEV_DISABLED,
>>>> @@ -105,6 +106,9 @@ struct mei_hdcp_data {
>>>>    #ifdef CONFIG_INTEL_MEI_HDCP
>>>>    int mei_cldev_register_notify(struct notifier_block *nb);
>>>>    int mei_cldev_unregister_notify(struct notifier_block *nb);
>>>> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
>>>> +			       struct mei_hdcp_data *data,
>>>> +			       struct hdcp2_ake_init *ake_data);
>>>>    #else
>>>>    static int mei_cldev_register_notify(struct notifier_block *nb)
>>>>    {
>>>> @@ -114,5 +118,12 @@ static int mei_cldev_unregister_notify(struct
>>>> notifier_block *nb)
>>>>    {
>>>>    	return -ENODEV;
>>>>    }
>>>> +static inline
>>>> +int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
>>>> +			       struct mei_hdcp_data *data,
>>>> +			       struct hdcp2_ake_init *ake_data) {
>>>> +	return -ENODEV;
>>>> +}
>>>>    #endif /* defined (CONFIG_INTEL_MEI_HDCP) */
>>>>    #endif /* defined (_LINUX_MEI_HDCP_H) */
>>>> --
>>>> 2.7.4
diff mbox

Patch

diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
index 2811a25f8c57..7caee0947761 100644
--- a/drivers/misc/mei/hdcp/mei_hdcp.c
+++ b/drivers/misc/mei/hdcp/mei_hdcp.c
@@ -33,9 +33,77 @@ 
 #include <linux/mei_cl_bus.h>
 #include <linux/notifier.h>
 #include <linux/mei_hdcp.h>
+#include <drm/drm_connector.h>
+
+#include "mei_hdcp.h"
 
 static BLOCKING_NOTIFIER_HEAD(mei_cldev_notifier_list);
 
+/**
+ * mei_initiate_hdcp2_session:
+ *	Function to start a Wired HDCP2.2 Tx Session with ME FW
+ *
+ * @cldev		: Pointer for mei client device
+ * @data		: Intel HW specific Data
+ * @ake_data		: ptr to store AKE_Init
+ *
+ * Returns 0 on Success, <0 on Failure.
+ */
+int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
+			       struct mei_hdcp_data *data,
+			       struct hdcp2_ake_init *ake_data)
+{
+	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 } };
+	struct wired_cmd_initiate_hdcp2_session_out
+						session_init_out = { { 0 } };
+	struct device *dev;
+	ssize_t byte;
+
+	if (!data || !ake_data)
+		return -EINVAL;
+
+	dev = &cldev->dev;
+
+	session_init_in.header.api_version = HDCP_API_VERSION;
+	session_init_in.header.command_id = WIRED_INITIATE_HDCP2_SESSION;
+	session_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	session_init_in.header.buffer_len =
+				WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
+
+	session_init_in.port.integrated_port_type = data->port_type;
+	session_init_in.port.physical_port = data->port;
+	session_init_in.protocol = (uint8_t)data->protocol;
+
+	byte = mei_cldev_send(cldev, (u8 *)&session_init_in,
+			      sizeof(session_init_in));
+	if (byte < 0) {
+		dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte);
+		return byte;
+	}
+
+	byte = mei_cldev_recv(cldev, (u8 *)&session_init_out,
+			      sizeof(session_init_out));
+	if (byte < 0) {
+		dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte);
+		return byte;
+	}
+
+	if (session_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+		dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
+			WIRED_INITIATE_HDCP2_SESSION,
+			session_init_out.header.status);
+		return -1;
+	}
+
+	ake_data->msg_id = HDCP_2_2_AKE_INIT;
+	ake_data->tx_caps = session_init_out.tx_caps;
+	memcpy(ake_data->r_tx, session_init_out.r_tx,
+	       sizeof(session_init_out.r_tx));
+
+	return 0;
+}
+EXPORT_SYMBOL(mei_initiate_hdcp2_session);
+
 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 634c1a5bdf1e..bb4f27d3abcb 100644
--- a/include/linux/mei_hdcp.h
+++ b/include/linux/mei_hdcp.h
@@ -28,6 +28,7 @@ 
 #define _LINUX_MEI_HDCP_H
 
 #include <linux/mei_cl_bus.h>
+#include <drm/drm_hdcp.h>
 
 enum mei_cldev_state {
 	MEI_CLDEV_DISABLED,
@@ -105,6 +106,9 @@  struct mei_hdcp_data {
 #ifdef CONFIG_INTEL_MEI_HDCP
 int mei_cldev_register_notify(struct notifier_block *nb);
 int mei_cldev_unregister_notify(struct notifier_block *nb);
+int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
+			       struct mei_hdcp_data *data,
+			       struct hdcp2_ake_init *ake_data);
 #else
 static int mei_cldev_register_notify(struct notifier_block *nb)
 {
@@ -114,5 +118,12 @@  static int mei_cldev_unregister_notify(struct notifier_block *nb)
 {
 	return -ENODEV;
 }
+static inline
+int mei_initiate_hdcp2_session(struct mei_cl_device *cldev,
+			       struct mei_hdcp_data *data,
+			       struct hdcp2_ake_init *ake_data)
+{
+	return -ENODEV;
+}
 #endif /* defined (CONFIG_INTEL_MEI_HDCP) */
 #endif /* defined (_LINUX_MEI_HDCP_H) */