From patchwork Fri Mar 10 09:58:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiandi An X-Patchwork-Id: 737339 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.sourceforge.net (lists.sourceforge.net [216.34.181.88]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3vfjmz1p4zz9s7n for ; Fri, 10 Mar 2017 21:14:58 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=sfs-ml-1.v29.ch3.sourceforge.com) by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1cmHZV-0005bA-G7; Fri, 10 Mar 2017 10:14:53 +0000 Received: from sog-mx-4.v43.ch3.sourceforge.com ([172.29.43.194] helo=mx.sourceforge.net) by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1cmHZU-0005b5-PX for tpmdd-devel@lists.sourceforge.net; Fri, 10 Mar 2017 10:14:52 +0000 Received-SPF: pass (sog-mx-4.v43.ch3.sourceforge.com: domain of codeaurora.org designates 198.145.29.96 as permitted sender) client-ip=198.145.29.96; envelope-from=anjiandi@codeaurora.org; helo=smtp.codeaurora.org; Received: from smtp.codeaurora.org ([198.145.29.96]) by sog-mx-4.v43.ch3.sourceforge.com with esmtps (TLSv1:AES256-SHA:256) (Exim 4.76) id 1cmHZT-0002eE-MM for tpmdd-devel@lists.sourceforge.net; Fri, 10 Mar 2017 10:14:52 +0000 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 8F6F560A19; Fri, 10 Mar 2017 09:58:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED, T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from anjiandi-ubuntu.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) (using TLSv1.1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: anjiandi@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 0358F609AC; Fri, 10 Mar 2017 09:58:17 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 0358F609AC Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=anjiandi@codeaurora.org From: Jiandi An To: tpmdd-devel@lists.sourceforge.net Date: Fri, 10 Mar 2017 03:58:09 -0600 Message-Id: <1489139889-14376-4-git-send-email-anjiandi@codeaurora.org> X-Mailer: git-send-email 1.8.2.1 In-Reply-To: <1489139889-14376-1-git-send-email-anjiandi@codeaurora.org> References: <1489139889-14376-1-git-send-email-anjiandi@codeaurora.org> X-Spam-Score: -1.6 (-) X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. -1.5 SPF_CHECK_PASS SPF reports sender host as permitted sender for sender-domain -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [198.145.29.96 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.0 AWL AWL: Adjusted score from AWL reputation of From: address X-Headers-End: 1cmHZT-0002eE-MM Cc: Jiandi An , rafael.j.wysocki@intel.com, robert.moore@intel.com, lv.zheng@intel.com, lenb@kernel.org Subject: [tpmdd-devel] [PATCH 3/3] tpm/tpm_crb: Enable TPM CRB interface for ARM64 X-BeenThere: tpmdd-devel@lists.sourceforge.net X-Mailman-Version: 2.1.9 Precedence: list List-Id: Tpm Device Driver maintainance List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: tpmdd-devel-bounces@lists.sourceforge.net This enables TPM Command Response Buffer interface driver for ARM64 and implements an ARM specific TPM CRB start method that invokes a Secure Monitor Call to request the Firmware to execute or cancel a TPM 2.0 command. Signed-off-by: Jiandi An --- drivers/char/tpm/Kconfig | 2 +- drivers/char/tpm/tpm_crb.c | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/char/tpm/Kconfig b/drivers/char/tpm/Kconfig index d520ac5..9659f40 100644 --- a/drivers/char/tpm/Kconfig +++ b/drivers/char/tpm/Kconfig @@ -136,7 +136,7 @@ config TCG_XEN config TCG_CRB tristate "TPM 2.0 CRB Interface" - depends on X86 && ACPI + depends on (X86 || ARM64) && ACPI ---help--- If you have a TPM security chip that is compliant with the TCG CRB 2.0 TPM specification say Yes and it will be accessible diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c index 089fcf8..d29a84a 100644 --- a/drivers/char/tpm/tpm_crb.c +++ b/drivers/char/tpm/tpm_crb.c @@ -73,6 +73,7 @@ enum crb_status { enum crb_flags { CRB_FL_ACPI_START = BIT(0), CRB_FL_CRB_START = BIT(1), + CRB_FL_CRB_SMC_START = BIT(2), }; struct crb_priv { @@ -82,6 +83,7 @@ struct crb_priv { u8 __iomem *cmd; u8 __iomem *rsp; u32 cmd_size; + u32 smc_func_id; }; /** @@ -101,7 +103,8 @@ struct crb_priv { */ static int __maybe_unused crb_go_idle(struct device *dev, struct crb_priv *priv) { - if (priv->flags & CRB_FL_ACPI_START) + if ((priv->flags & CRB_FL_ACPI_START) || + (priv->flags & CRB_FL_CRB_SMC_START)) return 0; iowrite32(CRB_CTRL_REQ_GO_IDLE, &priv->cca->req); @@ -129,7 +132,8 @@ static int __maybe_unused crb_cmd_ready(struct device *dev, { ktime_t stop, start; - if (priv->flags & CRB_FL_ACPI_START) + if ((priv->flags & CRB_FL_ACPI_START) || + (priv->flags & CRB_FL_CRB_SMC_START)) return 0; iowrite32(CRB_CTRL_REQ_CMD_READY, &priv->cca->req); @@ -229,6 +233,11 @@ static int crb_send(struct tpm_chip *chip, u8 *buf, size_t len) if (priv->flags & CRB_FL_ACPI_START) rc = crb_do_acpi_start(chip); + if (priv->flags & CRB_FL_CRB_SMC_START) { + iowrite32(CRB_START_INVOKE, &priv->cca->start); + rc = tpm_crb_smc_start(priv->smc_func_id); + } + return rc; } @@ -445,6 +454,17 @@ static int crb_acpi_add(struct acpi_device *device) sm == ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD) priv->flags |= CRB_FL_ACPI_START; + if (sm == ACPI_TPM2_COMMAND_BUFFER_WITH_SMC) { + if ((buf->header.length - default_len) != + sizeof(struct tpm2_crb_smc)) { + dev_err(dev, "TPM2 ACPI table has wrong size %u for start method type %d\n", + buf->header.length, ACPI_TPM2_COMMAND_BUFFER_WITH_SMC); + return -EINVAL; + } + priv->flags |= CRB_FL_CRB_SMC_START; + priv->smc_func_id = buf->platform_data.smc_params.smc_func_id; + } + rc = crb_map_io(device, priv, buf); if (rc) return rc;