Request to ME to configure a port as authenticated. On Success, ME FW will mark the port as authenticated and provides HDCP cipher with the encryption keys. Enabling the Authentication can be requested once all stages of HDCP2.2 authentication is completed by interacting with ME FW. Only after this stage, driver can enable the HDCP encryption for the port, through HW registers. v2: Rebased. v3: cldev is passed as first parameter [Tomas] Redundant comments and cast are removed [Tomas] v4: %zd for ssize_t [Alexander] %s/return -1/return -EIO [Alexander] Style and typos fixed [Uma] Signed-off-by: Ramalingam C <ramalingam.c@xxxxxxxxx> --- drivers/misc/mei/hdcp/mei_hdcp.c | 55 ++++++++++++++++++++++++++++++++++++++++ include/linux/mei_hdcp.h | 7 +++++ 2 files changed, 62 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index 32a039d46738..cbd3a8a3ae3e 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -627,6 +627,61 @@ int mei_verify_mprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_verify_mprime); +/* + * mei_enable_hdcp_authentication: + * Function to request ME FW to mark a port as authenticated. + * + * cldev : Pointer for mei client device + * data : Intel HW specific Data + * + * Returns 0 on Success, <0 on Failure + */ +int mei_enable_hdcp_authentication(struct mei_cl_device *cldev, + struct mei_hdcp_data *data) +{ + struct wired_cmd_enable_auth_in enable_auth_in = { { 0 } }; + struct wired_cmd_enable_auth_out enable_auth_out = { { 0 } }; + struct device *dev; + ssize_t byte; + + if (!data) + return -EINVAL; + + dev = &cldev->dev; + + enable_auth_in.header.api_version = HDCP_API_VERSION; + enable_auth_in.header.command_id = WIRED_ENABLE_AUTH; + enable_auth_in.header.status = ME_HDCP_STATUS_SUCCESS; + enable_auth_in.header.buffer_len = WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN; + + enable_auth_in.port.integrated_port_type = data->port_type; + enable_auth_in.port.physical_port = data->port; + enable_auth_in.stream_type = data->streams[0].stream_type; + + byte = mei_cldev_send(cldev, (u8 *)&enable_auth_in, + sizeof(enable_auth_in)); + if (byte < 0) { + dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte); + return byte; + } + + byte = mei_cldev_recv(cldev, (u8 *)&enable_auth_out, + sizeof(enable_auth_out)); + if (byte < 0) { + dev_dbg(dev, "mei_cldev_recv failed. %zd\n", byte); + return byte; + } + + if (enable_auth_out.header.status != ME_HDCP_STATUS_SUCCESS) { + dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n", + WIRED_ENABLE_AUTH, enable_auth_out.header.status); + return -EIO; + } + + return 0; +} +EXPORT_SYMBOL(mei_enable_hdcp_authentication); + static void mei_cldev_state_notify_clients(struct mei_cl_device *cldev, bool enabled) { diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index e7e1e86c6663..e6b6f9ace0c2 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -137,6 +137,8 @@ mei_repeater_check_flow_prepare_ack(struct mei_cl_device *cldev, struct hdcp2_rep_send_ack *rep_send_ack); int mei_verify_mprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data, struct hdcp2_rep_stream_ready *stream_ready); +int mei_enable_hdcp_authentication(struct mei_cl_device *cldev, + struct mei_hdcp_data *data); #else static inline int mei_cldev_register_notify(struct notifier_block *nb) { @@ -214,5 +216,10 @@ int mei_verify_mprime(struct mei_cl_device *cldev, struct mei_hdcp_data *data, { return -ENODEV; } +static inline int mei_enable_hdcp_authentication(struct mei_cl_device *cldev, + struct mei_hdcp_data *data) +{ + return -ENODEV; +} #endif /* IS_ENABLED(CONFIG_INTEL_MEI_HDCP) */ #endif /* defined (_LINUX_MEI_HDCP_H) */ -- 2.7.4 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel