Message ID | 1522763873-23041-15-git-send-email-ramalingam.c@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
>-----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 14/40] misc/mei/hdcp: Prepare Session Key > >Request to ME to prepare the encrypted session key. > >On Success, ME provides Encrypted session key. Functions populates the HDCP2.2 Drop "s" from function. >authentication msg SKE_Send_Eks. > >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 | 58 >++++++++++++++++++++++++++++++++++++++++ > include/linux/mei_hdcp.h | 8 ++++++ > 2 files changed, 66 insertions(+) > >diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c >b/drivers/misc/mei/hdcp/mei_hdcp.c >index ea84177311b7..abfcc57863b8 100644 >--- a/drivers/misc/mei/hdcp/mei_hdcp.c >+++ b/drivers/misc/mei/hdcp/mei_hdcp.c >@@ -420,6 +420,64 @@ int mei_verify_lprime(struct mei_cl_device *cldev, >struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_verify_lprime); > >+/** >+ * mei_get_session_key: >+ * Function to prepare SKE_Send_Eks. >+ * >+ * @cldev : Pointer for mei client device >+ * @data : Intel HW specific Data >+ * @ske_data : Pointer for SKE_Send_Eks. >+ * >+ * Returns 0 on Success, <0 on Failure >+ */ >+int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data >*data, >+ struct hdcp2_ske_send_eks *ske_data) { >+ struct wired_cmd_get_session_key_in get_skey_in = { { 0 } }; >+ struct wired_cmd_get_session_key_out get_skey_out = { { 0 } }; >+ struct device *dev; >+ ssize_t byte; >+ >+ if (!data || !ske_data) >+ return -EINVAL; >+ >+ dev = &cldev->dev; >+ >+ get_skey_in.header.api_version = HDCP_API_VERSION; >+ get_skey_in.header.command_id = WIRED_GET_SESSION_KEY; >+ get_skey_in.header.status = ME_HDCP_STATUS_SUCCESS; >+ get_skey_in.header.buffer_len = >WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN; >+ >+ get_skey_in.port.integrated_port_type = data->port_type; >+ get_skey_in.port.physical_port = data->port; >+ >+ byte = mei_cldev_send(cldev, (u8 *)&get_skey_in, sizeof(get_skey_in)); >+ if (byte < 0) { >+ dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte); >+ return byte; >+ } >+ >+ byte = mei_cldev_recv(cldev, (u8 *)&get_skey_out, >+sizeof(get_skey_out)); >+ >+ if (byte < 0) { >+ dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte); >+ return byte; >+ } >+ >+ if (get_skey_out.header.status != ME_HDCP_STATUS_SUCCESS) { >+ dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n", >+ WIRED_GET_SESSION_KEY, >get_skey_out.header.status); >+ return -1; >+ } >+ >+ ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS; >+ memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks, Check for validity of ske_data->e_dkey_ks. >+ HDCP_2_2_E_DKEY_KS_LEN); >+ memcpy(ske_data->riv, get_skey_out.r_iv, HDCP_2_2_RIV_LEN); Again check for ske_data->riv. Also leave a blank line here. >+ return 0; >+} >+EXPORT_SYMBOL(mei_get_session_key); >+ > 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 >792143563c46..534170d746af 100644 >--- a/include/linux/mei_hdcp.h >+++ b/include/linux/mei_hdcp.h >@@ -126,6 +126,8 @@ int mei_initiate_locality_check(struct mei_cl_device >*cldev, > struct hdcp2_lc_init *lc_init_data); int >mei_verify_lprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data, > struct hdcp2_lc_send_lprime *rx_lprime); >+int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data >*data, >+ struct hdcp2_ske_send_eks *ske_data); > #else > static int mei_cldev_register_notify(struct notifier_block *nb) { @@ -178,5 >+180,11 @@ int mei_verify_lprime(struct mei_cl_device *cldev, struct >mei_hdcp_data *data, { > return -ENODEV; > } >+static inline >+int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data >*data, >+ struct hdcp2_ske_send_eks *ske_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 09 May 2018 04:29 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 14/40] misc/mei/hdcp: Prepare Session Key >> >> Request to ME to prepare the encrypted session key. >> >> On Success, ME provides Encrypted session key. Functions populates the HDCP2.2 > Drop "s" from function. ok. Thanks. > >> authentication msg SKE_Send_Eks. >> >> 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 | 58 >> ++++++++++++++++++++++++++++++++++++++++ >> include/linux/mei_hdcp.h | 8 ++++++ >> 2 files changed, 66 insertions(+) >> >> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c >> b/drivers/misc/mei/hdcp/mei_hdcp.c >> index ea84177311b7..abfcc57863b8 100644 >> --- a/drivers/misc/mei/hdcp/mei_hdcp.c >> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c >> @@ -420,6 +420,64 @@ int mei_verify_lprime(struct mei_cl_device *cldev, >> struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_verify_lprime); >> >> +/** >> + * mei_get_session_key: >> + * Function to prepare SKE_Send_Eks. >> + * >> + * @cldev : Pointer for mei client device >> + * @data : Intel HW specific Data >> + * @ske_data : Pointer for SKE_Send_Eks. >> + * >> + * Returns 0 on Success, <0 on Failure >> + */ >> +int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data >> *data, >> + struct hdcp2_ske_send_eks *ske_data) { >> + struct wired_cmd_get_session_key_in get_skey_in = { { 0 } }; >> + struct wired_cmd_get_session_key_out get_skey_out = { { 0 } }; >> + struct device *dev; >> + ssize_t byte; >> + >> + if (!data || !ske_data) >> + return -EINVAL; >> + >> + dev = &cldev->dev; >> + >> + get_skey_in.header.api_version = HDCP_API_VERSION; >> + get_skey_in.header.command_id = WIRED_GET_SESSION_KEY; >> + get_skey_in.header.status = ME_HDCP_STATUS_SUCCESS; >> + get_skey_in.header.buffer_len = >> WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN; >> + >> + get_skey_in.port.integrated_port_type = data->port_type; >> + get_skey_in.port.physical_port = data->port; >> + >> + byte = mei_cldev_send(cldev, (u8 *)&get_skey_in, sizeof(get_skey_in)); >> + if (byte < 0) { >> + dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte); >> + return byte; >> + } >> + >> + byte = mei_cldev_recv(cldev, (u8 *)&get_skey_out, >> +sizeof(get_skey_out)); >> + >> + if (byte < 0) { >> + dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte); >> + return byte; >> + } >> + >> + if (get_skey_out.header.status != ME_HDCP_STATUS_SUCCESS) { >> + dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n", >> + WIRED_GET_SESSION_KEY, >> get_skey_out.header.status); >> + return -1; >> + } >> + >> + ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS; >> + memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks, > Check for validity of ske_data->e_dkey_ks. > >> + HDCP_2_2_E_DKEY_KS_LEN); >> + memcpy(ske_data->riv, get_skey_out.r_iv, HDCP_2_2_RIV_LEN); > Again check for ske_data->riv. Also leave a blank line here. New line will be added --Ram > >> + return 0; >> +} >> +EXPORT_SYMBOL(mei_get_session_key); >> + >> 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 >> 792143563c46..534170d746af 100644 >> --- a/include/linux/mei_hdcp.h >> +++ b/include/linux/mei_hdcp.h >> @@ -126,6 +126,8 @@ int mei_initiate_locality_check(struct mei_cl_device >> *cldev, >> struct hdcp2_lc_init *lc_init_data); int >> mei_verify_lprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data, >> struct hdcp2_lc_send_lprime *rx_lprime); >> +int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data >> *data, >> + struct hdcp2_ske_send_eks *ske_data); >> #else >> static int mei_cldev_register_notify(struct notifier_block *nb) { @@ -178,5 >> +180,11 @@ int mei_verify_lprime(struct mei_cl_device *cldev, struct >> mei_hdcp_data *data, { >> return -ENODEV; >> } >> +static inline >> +int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data >> *data, >> + struct hdcp2_ske_send_eks *ske_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
diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index ea84177311b7..abfcc57863b8 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -420,6 +420,64 @@ int mei_verify_lprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_verify_lprime); +/** + * mei_get_session_key: + * Function to prepare SKE_Send_Eks. + * + * @cldev : Pointer for mei client device + * @data : Intel HW specific Data + * @ske_data : Pointer for SKE_Send_Eks. + * + * Returns 0 on Success, <0 on Failure + */ +int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data *data, + struct hdcp2_ske_send_eks *ske_data) +{ + struct wired_cmd_get_session_key_in get_skey_in = { { 0 } }; + struct wired_cmd_get_session_key_out get_skey_out = { { 0 } }; + struct device *dev; + ssize_t byte; + + if (!data || !ske_data) + return -EINVAL; + + dev = &cldev->dev; + + get_skey_in.header.api_version = HDCP_API_VERSION; + get_skey_in.header.command_id = WIRED_GET_SESSION_KEY; + get_skey_in.header.status = ME_HDCP_STATUS_SUCCESS; + get_skey_in.header.buffer_len = WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN; + + get_skey_in.port.integrated_port_type = data->port_type; + get_skey_in.port.physical_port = data->port; + + byte = mei_cldev_send(cldev, (u8 *)&get_skey_in, sizeof(get_skey_in)); + if (byte < 0) { + dev_dbg(dev, "mei_cldev_send failed. %d\n", (int)byte); + return byte; + } + + byte = mei_cldev_recv(cldev, (u8 *)&get_skey_out, sizeof(get_skey_out)); + + if (byte < 0) { + dev_dbg(dev, "mei_cldev_recv failed. %d\n", (int)byte); + return byte; + } + + if (get_skey_out.header.status != ME_HDCP_STATUS_SUCCESS) { + dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n", + WIRED_GET_SESSION_KEY, get_skey_out.header.status); + return -1; + } + + ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS; + memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks, + HDCP_2_2_E_DKEY_KS_LEN); + memcpy(ske_data->riv, get_skey_out.r_iv, HDCP_2_2_RIV_LEN); + return 0; +} +EXPORT_SYMBOL(mei_get_session_key); + 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 792143563c46..534170d746af 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -126,6 +126,8 @@ int mei_initiate_locality_check(struct mei_cl_device *cldev, struct hdcp2_lc_init *lc_init_data); int mei_verify_lprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data, struct hdcp2_lc_send_lprime *rx_lprime); +int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data *data, + struct hdcp2_ske_send_eks *ske_data); #else static int mei_cldev_register_notify(struct notifier_block *nb) { @@ -178,5 +180,11 @@ int mei_verify_lprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data, { return -ENODEV; } +static inline +int mei_get_session_key(struct mei_cl_device *cldev, struct mei_hdcp_data *data, + struct hdcp2_ske_send_eks *ske_data) +{ + return -ENODEV; +} #endif /* defined (CONFIG_INTEL_MEI_HDCP) */ #endif /* defined (_LINUX_MEI_HDCP_H) */
Request to ME to prepare the encrypted session key. On Success, ME provides Encrypted session key. Functions populates the HDCP2.2 authentication msg SKE_Send_Eks. 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 | 58 ++++++++++++++++++++++++++++++++++++++++ include/linux/mei_hdcp.h | 8 ++++++ 2 files changed, 66 insertions(+)