Message ID | 1522763873-23041-9-git-send-email-ramalingam.c@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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
> -----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
>-----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
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
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
> -----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
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 --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) */
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(+)