From patchwork Thu Jul 8 08:23:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilias Apalodimas X-Patchwork-Id: 471211 Delivered-To: patch@linaro.org Received: by 2002:a02:c94a:0:0:0:0:0 with SMTP id u10csp46027jao; Thu, 8 Jul 2021 01:23:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxm3tkmf0AoHaGab+AkaNIyJofQ3c8dPjXGQqz6LToNiixd1VPx+7TvYi7gAaT2eTi30BO4 X-Received: by 2002:a17:906:2287:: with SMTP id p7mr6178311eja.181.1625732621316; Thu, 08 Jul 2021 01:23:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625732621; cv=none; d=google.com; s=arc-20160816; b=wf/XLy52WKsBvs+VVxVJ6Op6G6EpMUjqabvFJSu49Lq8lL0hleueS+7vvtnMg4Keg3 mEHY7pjdZjzVLiHbvgFMe4CC/XZ9sWKi9EFwYEi/Wy+SfreSNksEfm6qJo7iUPTh/S+H taFZfBrkTDiJnuDcJI88yqU6Zcb0VLDUkCClwVbc6tXcZFjZhjmfYTLxBfhwWmD/ghEK FUnX4tbPeovn3TDQfNV9Exlw+tDNKXbUNpS4lNu48oLwh2mLStq/I9qoZsZlU94ZFFXR keuxuvyfalTvIE4N+FCUNcCbvGUNotcEXrJWTDCNURBeIXXmTZh9VFEoqg7M5sdZb/0W YP2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=5hkmll2ug3aLdVqribgnHYAfhnF5Tq0src3sdcXyjO8=; b=GS878g6DAQKcekvGSyuio1rdvGpPDHS0GeswSzZzQCn87RfLdnBDevbjw75O80cZcX O1G7qQji4oa+BU4ksDW+11xolyWJl/raeUyhjqNbMfH7BCw4KK/CmvEu75enGZB+/HR/ fgd1aFtwh+q/tbd54OTH04lnXxblAcrqwrGPuQyVKhWFPh3m47zyP5MhJx/HgL73Dksy 3cMdCUfLezc0s/yWg5s21HTioU+bUze5jYElKsjaNQmUFvj3LXKFp1eF5974OrATrU8p 40tPSoO3dUWmyyBqWj2pQQfkmVXqg4CQlc8QM2PJ7yWRNyGifPRq+MwWcQBWRwTiJG0s GLGQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="Mt/DgZNx"; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from phobos.denx.de (phobos.denx.de. [2a01:238:438b:c500:173d:9f52:ddab:ee01]) by mx.google.com with ESMTPS id dp16si2709160ejc.454.2021.07.08.01.23.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jul 2021 01:23:41 -0700 (PDT) Received-SPF: pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="Mt/DgZNx"; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id E38A882F36; Thu, 8 Jul 2021 10:23:32 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Mt/DgZNx"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id AE00283139; Thu, 8 Jul 2021 10:23:30 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id A7E7283124 for ; Thu, 8 Jul 2021 10:23:22 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ilias.apalodimas@linaro.org Received: by mail-wr1-x435.google.com with SMTP id l7so5465114wrv.7 for ; Thu, 08 Jul 2021 01:23:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5hkmll2ug3aLdVqribgnHYAfhnF5Tq0src3sdcXyjO8=; b=Mt/DgZNx8yIu92W8MzOdkjZnYtcI3jA26yJFcUY1FWHtcOs5TqUgqJQrS6L0T3wofd Es9pUoBx6V5CzM38a4+PwGKhcZEcu+SSDdFbxTjD9ga/osHjcxSWzDJdrGjtqmr18eQx 1oLI9VpBe18zfu47RgF4+l/PISm8vurv5BAnQQLp0ncy6FMz+g2vZP6Ho9nx5CpEPzIi cryHcxd4qo7gZBGBKhvBWKH6clqp55tDg19zQEb2pdBoKou7nx1vNmboy2qR5E+w1MX2 9mYK7cGCoUSRFZfnWGZLWJdNFqs2KjyIqjUfKBLm2mk0T7A/SXmUzBAlA4OJ1JBlgNq2 amPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=5hkmll2ug3aLdVqribgnHYAfhnF5Tq0src3sdcXyjO8=; b=Uth00OQJln1aRRC49iDljXJYab5YTwDzsv7QpfLeYihpv421viKkHPVsrP1Q3rBAzO LalSVPISenN/B4JVMuGRnNkcE4F4ZjnOWuileJcyKfu1ovSzk4A7IFpgNxbfiL5QEp3V OAmbSE43zCq4vF6tNm9vW/aPorjhs45C653U3VslHV9TrmWQ5qW1gZLMe6iaIx4l9G7u ayY5JElTYXd5Jlhks4RmxQ4JpVMhwnuFPgy3pTSMwiGfq50rle1ffh0W+PDhL/7cxcN1 DUCTM6k8sV2FtQaQkTV05Mo/peMqVOVtM4JBrM6w7EEoJkNjC6B+OkAy3/qZFZN7QC+x FAZA== X-Gm-Message-State: AOAM533dOAF16OGjsbjXgAYdd5lUTgGnsHyZqVd45Vn8nJ460rBaHkXz +DWEvcbkrHuI92CUsIVUy40q9g== X-Received: by 2002:adf:d235:: with SMTP id k21mr707074wrh.222.1625732602159; Thu, 08 Jul 2021 01:23:22 -0700 (PDT) Received: from localhost.localdomain (ppp-94-66-242-227.home.otenet.gr. [94.66.242.227]) by smtp.gmail.com with ESMTPSA id z3sm1689362wrv.45.2021.07.08.01.23.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jul 2021 01:23:21 -0700 (PDT) From: Ilias Apalodimas To: xypron.glpk@gmx.de, trini@konsulko.com Cc: Ilias Apalodimas , Simon Glass , Robert Marko , Alex Nemirovsky , Sean Anderson , Weijie Gao , Bin Meng , Rayagonda Kokatanur , Stefan Bosch , Dhananjay Phadke , Masahisa Kojima , u-boot@lists.denx.de Subject: [PATCH 2/3 v3] tpm2: Add a TPMv2 MMIO TIS driver Date: Thu, 8 Jul 2021 11:23:07 +0300 Message-Id: <20210708082310.87540-3-ilias.apalodimas@linaro.org> X-Mailer: git-send-email 2.32.0.rc0 In-Reply-To: <20210708082310.87540-1-ilias.apalodimas@linaro.org> References: <20210708082310.87540-1-ilias.apalodimas@linaro.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean Add support for devices that expose a TPMv2 though MMIO. Apart from those devices, we can use the driver in our QEMU setups and test TPM related code which is difficult to achieve using the sandbox driver (e.g test the EFI TCG2 protocol). It's worth noting that a previous patch added TPMv2 TIS core functions, which the current driver is consuming. Signed-off-by: Ilias Apalodimas --- drivers/tpm/Kconfig | 9 +++ drivers/tpm/Makefile | 1 + drivers/tpm/tpm2_tis_mmio.c | 156 ++++++++++++++++++++++++++++++++++++ 3 files changed, 166 insertions(+) create mode 100644 drivers/tpm/tpm2_tis_mmio.c -- 2.32.0.rc0 diff --git a/drivers/tpm/Kconfig b/drivers/tpm/Kconfig index 9eebab5cfd90..406ee8716e1e 100644 --- a/drivers/tpm/Kconfig +++ b/drivers/tpm/Kconfig @@ -161,6 +161,15 @@ config TPM2_FTPM_TEE help This driver supports firmware TPM running in TEE. +config TPM2_MMIO + bool "MMIO based TPM2 Interface" + depends on TPM_V2 + help + This driver supports firmware TPM2.0 MMIO interface. + The usual TPM operations and the 'tpm' command can be used to talk + to the device using the standard TPM Interface Specification (TIS) + protocol. + endif # TPM_V2 endmenu diff --git a/drivers/tpm/Makefile b/drivers/tpm/Makefile index f64d20067f88..1065c1874f58 100644 --- a/drivers/tpm/Makefile +++ b/drivers/tpm/Makefile @@ -14,3 +14,4 @@ obj-$(CONFIG_$(SPL_TPL_)TPM2_CR50_I2C) += cr50_i2c.o obj-$(CONFIG_TPM2_TIS_SANDBOX) += tpm2_tis_sandbox.o obj-$(CONFIG_TPM2_TIS_SPI) += tpm2_tis_spi.o obj-$(CONFIG_TPM2_FTPM_TEE) += tpm2_ftpm_tee.o +obj-$(CONFIG_TPM2_MMIO) += tpm2_tis_core.o tpm2_tis_mmio.o diff --git a/drivers/tpm/tpm2_tis_mmio.c b/drivers/tpm/tpm2_tis_mmio.c new file mode 100644 index 000000000000..2183a2807162 --- /dev/null +++ b/drivers/tpm/tpm2_tis_mmio.c @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * driver for mmio TCG/TIS TPM (trusted platform module). + * + * Specifications at www.trustedcomputinggroup.org + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "tpm_tis.h" +#include "tpm_internal.h" + +struct tpm_tis_chip_data { + unsigned int pcr_count; + unsigned int pcr_select_min; + unsigned int time_before_first_cmd_ms; + void __iomem *iobase; +}; + +static int mmio_read_bytes(struct udevice *udev, u32 addr, u16 len, + u8 *result) +{ + struct tpm_tis_chip_data *drv_data = (void *)dev_get_driver_data(udev); + + while (len--) + *result++ = ioread8(drv_data->iobase + addr); + return 0; +} + +static int mmio_write_bytes(struct udevice *udev, u32 addr, u16 len, + const u8 *value) +{ + struct tpm_tis_chip_data *drv_data = (void *)dev_get_driver_data(udev); + + while (len--) + iowrite8(*value++, drv_data->iobase + addr); + return 0; +} + +static int mmio_read16(struct udevice *udev, u32 addr, u16 *result) +{ + struct tpm_tis_chip_data *drv_data = (void *)dev_get_driver_data(udev); + + *result = ioread16(drv_data->iobase + addr); + return 0; +} + +static int mmio_read32(struct udevice *udev, u32 addr, u32 *result) +{ + struct tpm_tis_chip_data *drv_data = (void *)dev_get_driver_data(udev); + + *result = ioread32(drv_data->iobase + addr); + return 0; +} + +static int mmio_write32(struct udevice *udev, u32 addr, u32 value) +{ + struct tpm_tis_chip_data *drv_data = (void *)dev_get_driver_data(udev); + + iowrite32(value, drv_data->iobase + addr); + return 0; +} + +static struct tpm_tis_phy_ops phy_ops = { + .read_bytes = mmio_read_bytes, + .write_bytes = mmio_write_bytes, + .read16 = mmio_read16, + .read32 = mmio_read32, + .write32 = mmio_write32, +}; + +static int tpm_tis_probe(struct udevice *udev) +{ + struct tpm_tis_chip_data *drv_data = (void *)dev_get_driver_data(udev); + struct tpm_chip_priv *priv = dev_get_uclass_priv(udev); + int ret = 0; + fdt_addr_t ioaddr; + u64 sz; + + ioaddr = dev_read_addr(udev); + if (ioaddr == FDT_ADDR_T_NONE) + return -EINVAL; + + ret = dev_read_u64(udev, "reg", &sz); + if (ret) + return -EINVAL; + + drv_data->iobase = ioremap(ioaddr, sz); + log_info("Remapped TPM2 base: 0x%llx size: 0x%llx\n", ioaddr, sz); + tpm_tis_ops_register(udev, &phy_ops); + ret = tpm_tis_init(udev); + if (ret) + goto iounmap; + + priv->pcr_count = drv_data->pcr_count; + priv->pcr_select_min = drv_data->pcr_select_min; + /* + * Although the driver probably works with a TPMv1 our Kconfig + * limits the driver to TPMv2 only + */ + priv->version = TPM_V2; + + return ret; +iounmap: + iounmap(drv_data->iobase); + return -EINVAL; +} + +static int tpm_tis_remove(struct udevice *udev) +{ + struct tpm_tis_chip_data *drv_data = (void *)dev_get_driver_data(udev); + + iounmap(drv_data->iobase); + return tpm_tis_cleanup(udev); +} + +static const struct tpm_ops tpm_tis_ops = { + .open = tpm_tis_open, + .close = tpm_tis_close, + .get_desc = tpm_tis_get_desc, + .send = tpm_tis_send, + .recv = tpm_tis_recv, + .cleanup = tpm_tis_cleanup, +}; + +static const struct tpm_tis_chip_data tpm_tis_std_chip_data = { + .pcr_count = 24, + .pcr_select_min = 3, +}; + +static const struct udevice_id tpm_tis_ids[] = { + { + .compatible = "tcg,tpm-tis-mmio", + .data = (ulong)&tpm_tis_std_chip_data, + }, + { } +}; + +U_BOOT_DRIVER(tpm_tis_mmio) = { + .name = "tpm_tis_mmio", + .id = UCLASS_TPM, + .of_match = tpm_tis_ids, + .ops = &tpm_tis_ops, + .probe = tpm_tis_probe, + .remove = tpm_tis_remove, + .priv_auto = sizeof(struct tpm_chip), +};