From patchwork Mon Feb 10 13:15:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Auger X-Patchwork-Id: 11373233 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9140F1805 for ; Mon, 10 Feb 2020 13:17:21 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6804D2070A for ; Mon, 10 Feb 2020 13:17:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="BtI+jiEo" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6804D2070A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:33463 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j18wC-0005zW-3m for patchwork-qemu-devel@patchwork.kernel.org; Mon, 10 Feb 2020 08:17:20 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46013) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j18us-00045t-PO for qemu-devel@nongnu.org; Mon, 10 Feb 2020 08:16:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1j18ur-0007MB-H8 for qemu-devel@nongnu.org; Mon, 10 Feb 2020 08:15:58 -0500 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:21023 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1j18ur-0007Lp-Dh for qemu-devel@nongnu.org; Mon, 10 Feb 2020 08:15:57 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1581340557; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DravC8YXTkGc7LI6oW602bIznZkWbfHP2rsChoxtCaY=; b=BtI+jiEojTl0dTY6ovxbiIMBZb1NQzct5yX/80uYuGSqCM3V7usO2TRtXr3uDJlddd01hJ bmrTqx+RGAOsVOr/wAbKZuQLoS5M9PbP4s2nrA+6Ws2LOoQRXSGsPHBRCVihUWQAwyWN/h 5oU4EhRSPKKaEa/GYnH+2QR+5zzJYDc= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-7-3RqJDGWEN_aFKsPGiGkIoA-1; Mon, 10 Feb 2020 08:15:53 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1446E13E4; Mon, 10 Feb 2020 13:15:52 +0000 (UTC) Received: from laptop.redhat.com (ovpn-116-37.ams2.redhat.com [10.36.116.37]) by smtp.corp.redhat.com (Postfix) with ESMTP id CB48B26DF6; Mon, 10 Feb 2020 13:15:47 +0000 (UTC) From: Eric Auger To: eric.auger.pro@gmail.com, eric.auger@redhat.com, stefanb@linux.ibm.com, qemu-devel@nongnu.org, qemu-arm@nongnu.org, peter.maydell@linaro.org Subject: [RFC 1/2] tpm: Let the TPM TIS device be usable on ARM Date: Mon, 10 Feb 2020 14:15:22 +0100 Message-Id: <20200210131523.27540-2-eric.auger@redhat.com> In-Reply-To: <20200210131523.27540-1-eric.auger@redhat.com> References: <20200210131523.27540-1-eric.auger@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-MC-Unique: 3RqJDGWEN_aFKsPGiGkIoA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.120 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: marcandre.lureau@redhat.com, lersek@redhat.com, ardb@kernel.org, philmd@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Implement support for TPM on aarch64 by using the TPM TIS MMIO frontend. Instead of being an ISA device, the TPM TIS device becomes a sysbus device on ARM. It is bound to be dynamically instantiated. Signed-off-by: Eric Auger --- I am aware such kind of #ifde'fy is frown upon but this is just for starting the discussion --- hw/tpm/Kconfig | 2 +- hw/tpm/tpm_tis.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/hw/tpm/Kconfig b/hw/tpm/Kconfig index 9e67d990e8..326c89e6df 100644 --- a/hw/tpm/Kconfig +++ b/hw/tpm/Kconfig @@ -4,7 +4,7 @@ config TPMDEV config TPM_TIS bool - depends on TPM && ISA_BUS + depends on TPM select TPMDEV config TPM_CRB diff --git a/hw/tpm/tpm_tis.c b/hw/tpm/tpm_tis.c index 31facb896d..cfc840942f 100644 --- a/hw/tpm/tpm_tis.c +++ b/hw/tpm/tpm_tis.c @@ -30,6 +30,7 @@ #include "hw/acpi/tpm.h" #include "hw/pci/pci_ids.h" +#include "hw/sysbus.h" #include "hw/qdev-properties.h" #include "migration/vmstate.h" #include "sysemu/tpm_backend.h" @@ -65,7 +66,11 @@ typedef struct TPMLocality { } TPMLocality; typedef struct TPMState { +#ifdef CONFIG_ISA_BUS ISADevice busdev; +#else + SysBusDevice busdev; +#endif MemoryRegion mmio; unsigned char buffer[TPM_TIS_BUFFER_MAX]; @@ -967,6 +972,7 @@ static void tpm_tis_realizefn(DeviceState *dev, Error **errp) error_setg(errp, "'tpmdev' property is required"); return; } +#ifdef CONFIG_ISA_BUS if (s->irq_num > 15) { error_setg(errp, "IRQ %d is outside valid range of 0 to 15", s->irq_num); @@ -982,6 +988,7 @@ static void tpm_tis_realizefn(DeviceState *dev, Error **errp) tpm_ppi_init(&s->ppi, isa_address_space(ISA_DEVICE(dev)), TPM_PPI_ADDR_BASE, OBJECT(s)); } +#endif } static void tpm_tis_initfn(Object *obj) @@ -991,6 +998,10 @@ static void tpm_tis_initfn(Object *obj) memory_region_init_io(&s->mmio, OBJECT(s), &tpm_tis_memory_ops, s, "tpm-tis-mmio", TPM_TIS_NUM_LOCALITIES << TPM_TIS_LOCALITY_SHIFT); +#ifndef CONFIG_ISA_BUS + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); + sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq); +#endif } static void tpm_tis_class_init(ObjectClass *klass, void *data) @@ -1002,6 +1013,7 @@ static void tpm_tis_class_init(ObjectClass *klass, void *data) device_class_set_props(dc, tpm_tis_properties); dc->reset = tpm_tis_reset; dc->vmsd = &vmstate_tpm_tis; + dc->user_creatable = true; tc->model = TPM_MODEL_TPM_TIS; tc->get_version = tpm_tis_get_tpm_version; tc->request_completed = tpm_tis_request_completed; @@ -1009,7 +1021,11 @@ static void tpm_tis_class_init(ObjectClass *klass, void *data) static const TypeInfo tpm_tis_info = { .name = TYPE_TPM_TIS, +#ifdef CONFIG_ISA_BUS .parent = TYPE_ISA_DEVICE, +#else + .parent = TYPE_SYS_BUS_DEVICE, +#endif .instance_size = sizeof(TPMState), .instance_init = tpm_tis_initfn, .class_init = tpm_tis_class_init, From patchwork Mon Feb 10 13:15:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Auger X-Patchwork-Id: 11373231 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AB812138D for ; Mon, 10 Feb 2020 13:17:16 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 828B72070A for ; Mon, 10 Feb 2020 13:17:16 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ZYfEpvh6" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 828B72070A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:33460 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j18w7-0005qp-NV for patchwork-qemu-devel@patchwork.kernel.org; Mon, 10 Feb 2020 08:17:15 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46029) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j18uv-0004Ac-U7 for qemu-devel@nongnu.org; Mon, 10 Feb 2020 08:16:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1j18uu-0007On-Lo for qemu-devel@nongnu.org; Mon, 10 Feb 2020 08:16:01 -0500 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:53403 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1j18uu-0007OG-Hf for qemu-devel@nongnu.org; Mon, 10 Feb 2020 08:16:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1581340560; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dh/lSWBqXBxbybD/o6JKzrOm4+bjnhpVXPdo7sUTQ8I=; b=ZYfEpvh6a9iIJ3yqzoTND9n5SKMjsBV1HvvLHDGIvTCHliXp9nxpBodTJq1mCleB56bVjc D0ja1oQECVRWlTX0C5sjKs1VWSliCLG966QEfxfC3oGLzf3MgfOoEk80+3PEWgXu1WsBPv oz3yKfXdDCQtm7+VZNxdZyN+6XbvD/E= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-379-7xB0NNApNLGiCcRMz9TNAw-1; Mon, 10 Feb 2020 08:15:58 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 50925800D5C; Mon, 10 Feb 2020 13:15:57 +0000 (UTC) Received: from laptop.redhat.com (ovpn-116-37.ams2.redhat.com [10.36.116.37]) by smtp.corp.redhat.com (Postfix) with ESMTP id C97AB2656C; Mon, 10 Feb 2020 13:15:52 +0000 (UTC) From: Eric Auger To: eric.auger.pro@gmail.com, eric.auger@redhat.com, stefanb@linux.ibm.com, qemu-devel@nongnu.org, qemu-arm@nongnu.org, peter.maydell@linaro.org Subject: [RFC 2/2] hw/arm/virt: vTPM support Date: Mon, 10 Feb 2020 14:15:23 +0100 Message-Id: <20200210131523.27540-3-eric.auger@redhat.com> In-Reply-To: <20200210131523.27540-1-eric.auger@redhat.com> References: <20200210131523.27540-1-eric.auger@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-MC-Unique: 7xB0NNApNLGiCcRMz9TNAw-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.120 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: marcandre.lureau@redhat.com, lersek@redhat.com, ardb@kernel.org, philmd@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Let the TPM TIS device be dynamically instantiable in ARM virt. A device tree node is dynamically created (TPM via MMIO). The TPM Physical Presence interface (PPI) is not supported. To run with the swtmp TPM emulator, the qemu command line must be augmented with: -chardev socket,id=chrtpm,path=swtpm-sock \ -tpmdev emulator,id=tpm0,chardev=chrtpm \ -device tpm-tis,tpmdev=tpm0 \ swtpm/libtpms command line example: swtpm socket --tpm2 -t -d --tpmstate dir=/tmp/tpm \ --ctrl type=unixio,path=swtpm-sock Signed-off-by: Eric Auger --- hw/arm/Kconfig | 1 + hw/arm/sysbus-fdt.c | 36 ++++++++++++++++++++++++++++++++++++ hw/arm/virt.c | 7 +++++++ 3 files changed, 44 insertions(+) diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig index 3d86691ae0..ce0852f148 100644 --- a/hw/arm/Kconfig +++ b/hw/arm/Kconfig @@ -5,6 +5,7 @@ config ARM_VIRT imply VFIO_AMD_XGBE imply VFIO_PLATFORM imply VFIO_XGMAC + imply TPM_TIS select A15MPCORE select ACPI select ARM_SMMUV3 diff --git a/hw/arm/sysbus-fdt.c b/hw/arm/sysbus-fdt.c index 022fc97ecd..d723fad6ba 100644 --- a/hw/arm/sysbus-fdt.c +++ b/hw/arm/sysbus-fdt.c @@ -30,6 +30,7 @@ #include "hw/arm/sysbus-fdt.h" #include "qemu/error-report.h" #include "sysemu/device_tree.h" +#include "sysemu/tpm.h" #include "hw/platform-bus.h" #include "hw/vfio/vfio-platform.h" #include "hw/vfio/vfio-calxeda-xgmac.h" @@ -434,6 +435,40 @@ static bool vfio_platform_match(SysBusDevice *sbdev, #define VFIO_PLATFORM_BINDING(compat, add_fn) \ {TYPE_VFIO_PLATFORM, (compat), (add_fn), vfio_platform_match} +/* + * add_tpm_tis_fdt_node: Create a DT node for TPM TIS + * + * See kernel documentation: + * Documentation/devicetree/bindings/security/tpm/tpm_tis_mmio.txt + * Optional interrupt for command completion is not exposed + */ +static int add_tpm_tis_fdt_node(SysBusDevice *sbdev, void *opaque) +{ + PlatformBusFDTData *data = opaque; + PlatformBusDevice *pbus = data->pbus; + void *fdt = data->fdt; + const char *parent_node = data->pbus_node_name; + int compat_str_len; + char *nodename; + uint32_t reg_attr[2]; + uint64_t mmio_base; + + mmio_base = platform_bus_get_mmio_addr(pbus, sbdev, 0); + nodename = g_strdup_printf("%s/tpm_tis@%" PRIx64, parent_node, mmio_base); + qemu_fdt_add_subnode(fdt, nodename); + + compat_str_len = strlen("tcg,tpm-tis-mmio") + 1; + qemu_fdt_setprop(fdt, nodename, "compatible", "tcg,tpm-tis-mmio", + compat_str_len); + + reg_attr[0] = cpu_to_be32(mmio_base); + reg_attr[1] = cpu_to_be32(0x5000); + qemu_fdt_setprop(fdt, nodename, "reg", reg_attr, 2 * sizeof(uint32_t)); + + g_free(nodename); + return 0; +} + #endif /* CONFIG_LINUX */ static int no_fdt_node(SysBusDevice *sbdev, void *opaque) @@ -455,6 +490,7 @@ static const BindingEntry bindings[] = { TYPE_BINDING(TYPE_VFIO_CALXEDA_XGMAC, add_calxeda_midway_xgmac_fdt_node), TYPE_BINDING(TYPE_VFIO_AMD_XGBE, add_amd_xgbe_fdt_node), VFIO_PLATFORM_BINDING("amd,xgbe-seattle-v1a", add_amd_xgbe_fdt_node), + TYPE_BINDING(TYPE_TPM_TIS, add_tpm_tis_fdt_node), #endif TYPE_BINDING(TYPE_RAMFB_DEVICE, no_fdt_node), TYPE_BINDING("", NULL), /* last element */ diff --git a/hw/arm/virt.c b/hw/arm/virt.c index f788fe27d6..1bb34dfa0b 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -47,6 +47,7 @@ #include "sysemu/numa.h" #include "sysemu/runstate.h" #include "sysemu/sysemu.h" +#include "sysemu/tpm.h" #include "sysemu/kvm.h" #include "hw/loader.h" #include "exec/address-spaces.h" @@ -2041,6 +2042,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data) machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_AMD_XGBE); machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE); machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_PLATFORM); + machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS); mc->block_default_type = IF_VIRTIO; mc->no_cdrom = 1; mc->pci_allow_0_address = true; @@ -2153,6 +2155,11 @@ type_init(machvirt_machine_init); static void virt_machine_5_0_options(MachineClass *mc) { + static GlobalProperty compat[] = { + { TYPE_TPM_TIS, "ppi", "false" }, + }; + + compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat)); } DEFINE_VIRT_MACHINE_AS_LATEST(5, 0)