From patchwork Thu Mar 8 11:58:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ramalingam C X-Patchwork-Id: 10267801 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 CCE8C60364 for ; Thu, 8 Mar 2018 12:07:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BD12329889 for ; Thu, 8 Mar 2018 12:07:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B20A1298B9; Thu, 8 Mar 2018 12:07:24 +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 41EF2298AA for ; Thu, 8 Mar 2018 12:07:24 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C65646E932; Thu, 8 Mar 2018 12:05:58 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTPS id 088166E92E; Thu, 8 Mar 2018 12:05:57 +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:56 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,440,1515484800"; d="scan'208";a="32287893" Received: from mint-dev.iind.intel.com ([10.223.25.164]) by FMSMGA003.fm.intel.com with ESMTP; 08 Mar 2018 04:05:54 -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 Subject: [PATCH v2 17/42] misc/mei/hdcp: Repeater topology verifcation and ack Date: Thu, 8 Mar 2018 17:28:44 +0530 Message-Id: <1520510349-8385-18-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> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: uma.shankar@intel.com, rodrigo.vivi@intel.com MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Request ot ME to verify the downatream topology information received. ME FW will validate the Repeaters receiver id list and downstream topology. On Success ME FW will provide the Least Significant 128bits of VPrime, which forms the repeater ack. v2: Rebased. Signed-off-by: Ramalingam C --- drivers/misc/mei/hdcp/mei_hdcp.c | 84 ++++++++++++++++++++++++++++++++++++++++ include/linux/mei_hdcp.h | 13 +++++++ 2 files changed, 97 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index fbb88a56e10c..02c90770dcb6 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -535,6 +535,90 @@ int mei_get_session_key(struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_get_session_key); +/** + * mei_repeater_check_flow_prepare_ack: + * Function to validate the Downstream topology and prepare rep_ack. + * + * @data : Intel HW specific Data + * @rep_topology : Pointer for Receiver Id List to be validated. + * @rep_send_ack : Pointer for repeater ack + * + * Returns 0 on Success, <0 on Failure + */ + +int +mei_repeater_check_flow_prepare_ack(struct mei_hdcp_data *data, + struct hdcp2_rep_send_receiverid_list + *rep_topology, + struct hdcp2_rep_send_ack *rep_send_ack) +{ + struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } }; + struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 } }; + enum me_hdcp_status status; + struct device *dev; + ssize_t byte; + + if (!rep_topology || !rep_send_ack || !data) + 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_repeater_in.header.api_version = HDCP_API_VERSION; + verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER; + verify_repeater_in.header.status = ME_HDCP_STATUS_SUCCESS; + verify_repeater_in.header.buffer_len = + WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN; + + verify_repeater_in.port.integrated_port_type = data->port_type; + verify_repeater_in.port.physical_port = data->port; + + memcpy(verify_repeater_in.rx_info, rep_topology->rx_info, + HDCP_2_2_RXINFO_LEN); + memcpy(verify_repeater_in.seq_num_v, rep_topology->seq_num_v, + HDCP_2_2_SEQ_NUM_LEN); + memcpy(verify_repeater_in.v_prime, rep_topology->v_prime, + HDCP_2_2_LPRIME_HALF_LEN); + memcpy(verify_repeater_in.receiver_ids, rep_topology->receiver_ids, + HDCP_2_2_RECEIVER_IDS_MAX_LEN); + + /* Request to ME */ + byte = mei_cldev_send(data->cldev, (u8 *)&verify_repeater_in, + sizeof(verify_repeater_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_repeater_out, + sizeof(verify_repeater_out)); + if (byte < 0) { + dev_err(dev, "mei_cldev_recv failed. %d\n", (int)byte); + return byte; + } + + status = (enum me_hdcp_status)verify_repeater_out.header.status; + if (status != ME_HDCP_STATUS_SUCCESS) { + dev_err(dev, "ME cmd 0x%08X failed. status: 0x%X\n", + WIRED_VERIFY_REPEATER, status); + return -1; + } + + /* + * Need to send the last byte of the V prime back to + * the Repeater + */ + memcpy(rep_send_ack->v, verify_repeater_out.v, + HDCP_2_2_LPRIME_HALF_LEN); + rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK; + return 0; +} +EXPORT_SYMBOL(mei_repeater_check_flow_prepare_ack); + 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 193f23ba8fbc..c8f6fc90f475 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -121,6 +121,11 @@ int mei_verify_lprime(struct mei_hdcp_data *data, struct hdcp2_lc_send_lprime *rx_lprime); int mei_get_session_key(struct mei_hdcp_data *data, struct hdcp2_ske_send_eks *ske_data); +int +mei_repeater_check_flow_prepare_ack(struct mei_hdcp_data *data, + struct hdcp2_rep_send_receiverid_list + *rep_topology, + struct hdcp2_rep_send_ack *rep_send_ack); #else static inline int mei_hdcp_cldev_get_reference(void *client_data, @@ -180,5 +185,13 @@ int mei_get_session_key(struct mei_hdcp_data *data, { return -ENODEV; } +static inline int +mei_repeater_check_flow_prepare_ack(struct mei_hdcp_data *data, + struct hdcp2_rep_send_receiverid_list + *rep_topology, + struct hdcp2_rep_send_ack *rep_send_ack) +{ + return -ENODEV; +} #endif /* defined (CONFIG_INTEL_MEI_HDCP) */ #endif /* defined (_LINUX_MEI_HDCP_H) */