From patchwork Thu Mar 8 11:58:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ramalingam C X-Patchwork-Id: 10267793 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D2EB860364 for ; Thu, 8 Mar 2018 12:07:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C437A29889 for ; Thu, 8 Mar 2018 12:07:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B92B8298B9; Thu, 8 Mar 2018 12:07:08 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 737D629889 for ; Thu, 8 Mar 2018 12:07:08 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1E8606E919; Thu, 8 Mar 2018 12:05:53 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTPS id 167BD6E919; Thu, 8 Mar 2018 12:05:51 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Mar 2018 04:05:50 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,440,1515484800"; d="scan'208";a="32287875" Received: from mint-dev.iind.intel.com ([10.223.25.164]) by FMSMGA003.fm.intel.com with ESMTP; 08 Mar 2018 04:05:47 -0800 From: Ramalingam C To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, seanpaul@chromium.org, chris@chris-wilson.co.uk, tomas.winkler@intel.com, jani.nikula@linux.intel.com Date: Thu, 8 Mar 2018 17:28:42 +0530 Message-Id: <1520510349-8385-16-git-send-email-ramalingam.c@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1520510349-8385-1-git-send-email-ramalingam.c@intel.com> References: <1520510349-8385-1-git-send-email-ramalingam.c@intel.com> Subject: [Intel-gfx] [PATCH v2 15/42] misc/mei/hdcp: Verify L_prime X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: rodrigo.vivi@intel.com MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP Request to ME to verify the LPrime received from HDCP sink. On Success, ME FW will verify the received Lprime by calculating and comparing with L. This represents the completion of Locality Check. v2: Rebased. Signed-off-by: Ramalingam C --- drivers/misc/mei/hdcp/mei_hdcp.c | 65 ++++++++++++++++++++++++++++++++++++++++ include/linux/mei_hdcp.h | 8 +++++ 2 files changed, 73 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index ff19de58222f..c3c8b9a28498 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -403,6 +403,71 @@ int mei_initiate_locality_check(struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_initiate_locality_check); +/** + * mei_verify_lprime: + * Function to verify lprime. + * + * @data : Intel HW specific Data + * @rx_lprime : Pointer for LC_Send_L_prime + * + * Returns 0 on Success, <0 on Failure + */ +int mei_verify_lprime(struct mei_hdcp_data *data, + struct hdcp2_lc_send_lprime *rx_lprime) +{ + struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } }; + struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } }; + enum me_hdcp_status status; + struct device *dev; + ssize_t byte; + + if (!data || !rx_lprime) + return -EINVAL; + + /* check for the mei_device enabled or not */ + if (!mei_cldev_active_and_enabled(data->cldev)) + return -ENODEV; + + dev = &data->cldev->dev; + + verify_lprime_in.header.api_version = HDCP_API_VERSION; + verify_lprime_in.header.command_id = WIRED_VALIDATE_LOCALITY; + verify_lprime_in.header.status = ME_HDCP_STATUS_SUCCESS; + verify_lprime_in.header.buffer_len = + WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN; + + verify_lprime_in.port.integrated_port_type = data->port_type; + verify_lprime_in.port.physical_port = data->port; + + memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime, + sizeof(rx_lprime->l_prime)); + + /* Request to ME */ + byte = mei_cldev_send(data->cldev, (u8 *)&verify_lprime_in, + sizeof(verify_lprime_in)); + if (byte < 0) { + dev_err(dev, "mei_cldev_send failed. %d\n", (int)byte); + return byte; + } + + /* Response from ME */ + byte = mei_cldev_recv(data->cldev, (u8 *)&verify_lprime_out, + sizeof(verify_lprime_out)); + if (byte < 0) { + dev_err(dev, "mei_cldev_recv failed. %d\n", (int)byte); + return byte; + } + + status = (enum me_hdcp_status)verify_lprime_out.header.status; + if (status != ME_HDCP_STATUS_SUCCESS) { + dev_err(dev, "ME cmd 0x%08X failed. status: 0x%X\n", + WIRED_VALIDATE_LOCALITY, status); + return -1; + } + return 0; +} +EXPORT_SYMBOL(mei_verify_lprime); + static int mei_hdcp_probe(struct mei_cl_device *cldev, const struct mei_cl_device_id *id) { diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index fd8a26dddacb..d8c2b440cd81 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -117,6 +117,8 @@ int mei_store_pairing_info(struct mei_hdcp_data *data, struct hdcp2_ake_send_pairing_info *pairing_info); int mei_initiate_locality_check(struct mei_hdcp_data *data, struct hdcp2_lc_init *lc_init_data); +int mei_verify_lprime(struct mei_hdcp_data *data, + struct hdcp2_lc_send_lprime *rx_lprime); #else static inline int mei_hdcp_cldev_get_reference(void *client_data, @@ -164,5 +166,11 @@ int mei_initiate_locality_check(struct mei_hdcp_data *data, { return -ENODEV; } +static inline +int mei_verify_lprime(struct mei_hdcp_data *data, + struct hdcp2_lc_send_lprime *rx_lprime) +{ + return -ENODEV; +} #endif /* defined (CONFIG_INTEL_MEI_HDCP) */ #endif /* defined (_LINUX_MEI_HDCP_H) */