From: Alistair Francis <alistair.francis@wdc.com>
Imply the TPM sysbus devices. This allows users to add TPM devices to
the RISC-V virt board.
This was tested by first creating an emulated TPM device:
swtpm socket --tpm2 -t -d --tpmstate dir=/tmp/tpm \
--ctrl type=unixio,path=swtpm-sock
Then launching QEMU with:
-chardev socket,id=chrtpm,path=swtpm-sock \
-tpmdev emulator,id=tpm0,chardev=chrtpm \
-device tpm-tis-device,tpmdev=tpm0
The TPM device can be seen in the memory tree and the generated device
tree.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/942
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
---
hw/riscv/virt.c | 4 ++++
hw/riscv/Kconfig | 1 +
2 files changed, 5 insertions(+)
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 6eed1f4d70..b62fd66a49 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -43,6 +43,7 @@
#include "sysemu/device_tree.h"
#include "sysemu/sysemu.h"
#include "sysemu/kvm.h"
+#include "sysemu/tpm.h"
#include "hw/pci/pci.h"
#include "hw/pci-host/gpex.h"
#include "hw/display/ramfb.h"
@@ -1612,6 +1613,9 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
hc->plug = virt_machine_device_plug_cb;
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
+#ifdef CONFIG_TPM
+ machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS_SYSBUS);
+#endif
object_class_property_add_bool(oc, "aclint", virt_get_aclint,
virt_set_aclint);
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
index da790f5936..79ff61c464 100644
--- a/hw/riscv/Kconfig
+++ b/hw/riscv/Kconfig
@@ -34,6 +34,7 @@ config RISCV_VIRT
imply PCI_DEVICES
imply VIRTIO_VGA
imply TEST_DEVICES
+ imply TPM_TIS_SYSBUS
select RISCV_NUMA
select GOLDFISH_RTC
select MSI_NONBROKEN
--
2.35.1
Hi Alistair, On Wed, Apr 20, 2022 at 03:52:48PM +1000, Alistair Francis wrote: > From: Alistair Francis <alistair.francis@wdc.com> > > Imply the TPM sysbus devices. This allows users to add TPM devices to > the RISC-V virt board. > > This was tested by first creating an emulated TPM device: > > swtpm socket --tpm2 -t -d --tpmstate dir=/tmp/tpm \ > --ctrl type=unixio,path=swtpm-sock > > Then launching QEMU with: > > -chardev socket,id=chrtpm,path=swtpm-sock \ > -tpmdev emulator,id=tpm0,chardev=chrtpm \ > -device tpm-tis-device,tpmdev=tpm0 > > The TPM device can be seen in the memory tree and the generated device > tree. > I tried to get this working with qemu 8.0, but I did not have any success. I am quite sure I have the above command line correctly, and it does work with arm64. Any idea what I might be missing ? Thanks, Guenter > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/942 > Signed-off-by: Alistair Francis <alistair.francis@wdc.com> > Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com> > --- > hw/riscv/virt.c | 4 ++++ > hw/riscv/Kconfig | 1 + > 2 files changed, 5 insertions(+) > > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c > index 6eed1f4d70..b62fd66a49 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -43,6 +43,7 @@ > #include "sysemu/device_tree.h" > #include "sysemu/sysemu.h" > #include "sysemu/kvm.h" > +#include "sysemu/tpm.h" > #include "hw/pci/pci.h" > #include "hw/pci-host/gpex.h" > #include "hw/display/ramfb.h" > @@ -1612,6 +1613,9 @@ static void virt_machine_class_init(ObjectClass *oc, void *data) > hc->plug = virt_machine_device_plug_cb; > > machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE); > +#ifdef CONFIG_TPM > + machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS_SYSBUS); > +#endif > > object_class_property_add_bool(oc, "aclint", virt_get_aclint, > virt_set_aclint); > diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig > index da790f5936..79ff61c464 100644 > --- a/hw/riscv/Kconfig > +++ b/hw/riscv/Kconfig > @@ -34,6 +34,7 @@ config RISCV_VIRT > imply PCI_DEVICES > imply VIRTIO_VGA > imply TEST_DEVICES > + imply TPM_TIS_SYSBUS > select RISCV_NUMA > select GOLDFISH_RTC > select MSI_NONBROKEN > -- > 2.35.1 > >
On Mon, Jun 19, 2023 at 01:32:34PM -0700, Guenter Roeck wrote:
> Hi Alistair,
>
> On Wed, Apr 20, 2022 at 03:52:48PM +1000, Alistair Francis wrote:
> > From: Alistair Francis <alistair.francis@wdc.com>
> >
> > Imply the TPM sysbus devices. This allows users to add TPM devices to
> > the RISC-V virt board.
> >
> > This was tested by first creating an emulated TPM device:
> >
> > swtpm socket --tpm2 -t -d --tpmstate dir=/tmp/tpm \
> > --ctrl type=unixio,path=swtpm-sock
> >
> > Then launching QEMU with:
> >
> > -chardev socket,id=chrtpm,path=swtpm-sock \
> > -tpmdev emulator,id=tpm0,chardev=chrtpm \
> > -device tpm-tis-device,tpmdev=tpm0
> >
> > The TPM device can be seen in the memory tree and the generated device
> > tree.
> >
> I tried to get this working with qemu 8.0, but I did not have any success.
> I am quite sure I have the above command line correctly, and it does work
> with arm64. Any idea what I might be missing ?
>
Answering my own question: Nothing. The problem is that the devicetree
is created too early, before the tpm device is instantiated/realized in
qemu. The tpm device therefore does not show up in devicetree, and the
tom device does not instantiate in Linux. The patch below fixes the problem
for me.
Any comments / thoughts ? Is that change acceptable, or should it be
implemented differently ?
Thanks,
Guenter
---
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 4e3efbee16..ea259d7ade 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -1247,6 +1247,11 @@ static void virt_machine_done(Notifier *notifier, void *data)
uint32_t fdt_load_addr;
uint64_t kernel_entry;
+ /* create devicetree if not provided */
+ if (!machine->dtb) {
+ create_fdt(s, memmap);
+ }
+
/*
* Only direct boot kernel is currently supported for KVM VM,
* so the "-bios" parameter is not supported when KVM is enabled.
@@ -1519,15 +1524,13 @@ static void virt_machine_init(MachineState *machine)
}
virt_flash_map(s, system_memory);
- /* load/create device tree */
+ /* load device tree */
if (machine->dtb) {
machine->fdt = load_device_tree(machine->dtb, &s->fdt_size);
if (!machine->fdt) {
error_report("load_device_tree() failed");
exit(1);
}
- } else {
- create_fdt(s, memmap);
}
s->machine_done.notify = virt_machine_done;
On Wed, Jun 21, 2023 at 4:34 PM Guenter Roeck <linux@roeck-us.net> wrote:
>
> On Mon, Jun 19, 2023 at 01:32:34PM -0700, Guenter Roeck wrote:
> > Hi Alistair,
> >
> > On Wed, Apr 20, 2022 at 03:52:48PM +1000, Alistair Francis wrote:
> > > From: Alistair Francis <alistair.francis@wdc.com>
> > >
> > > Imply the TPM sysbus devices. This allows users to add TPM devices to
> > > the RISC-V virt board.
> > >
> > > This was tested by first creating an emulated TPM device:
> > >
> > > swtpm socket --tpm2 -t -d --tpmstate dir=/tmp/tpm \
> > > --ctrl type=unixio,path=swtpm-sock
> > >
> > > Then launching QEMU with:
> > >
> > > -chardev socket,id=chrtpm,path=swtpm-sock \
> > > -tpmdev emulator,id=tpm0,chardev=chrtpm \
> > > -device tpm-tis-device,tpmdev=tpm0
> > >
> > > The TPM device can be seen in the memory tree and the generated device
> > > tree.
> > >
> > I tried to get this working with qemu 8.0, but I did not have any success.
> > I am quite sure I have the above command line correctly, and it does work
> > with arm64. Any idea what I might be missing ?
> >
>
> Answering my own question: Nothing. The problem is that the devicetree
> is created too early, before the tpm device is instantiated/realized in
> qemu. The tpm device therefore does not show up in devicetree, and the
> tom device does not instantiate in Linux. The patch below fixes the problem
> for me.
Thanks for looking into this!
>
> Any comments / thoughts ? Is that change acceptable, or should it be
> implemented differently ?
The diff below looks fine to me. Do you mind sending a patch?
Alistair
>
> Thanks,
> Guenter
>
> ---
> diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
> index 4e3efbee16..ea259d7ade 100644
> --- a/hw/riscv/virt.c
> +++ b/hw/riscv/virt.c
> @@ -1247,6 +1247,11 @@ static void virt_machine_done(Notifier *notifier, void *data)
> uint32_t fdt_load_addr;
> uint64_t kernel_entry;
>
> + /* create devicetree if not provided */
> + if (!machine->dtb) {
> + create_fdt(s, memmap);
> + }
> +
> /*
> * Only direct boot kernel is currently supported for KVM VM,
> * so the "-bios" parameter is not supported when KVM is enabled.
> @@ -1519,15 +1524,13 @@ static void virt_machine_init(MachineState *machine)
> }
> virt_flash_map(s, system_memory);
>
> - /* load/create device tree */
> + /* load device tree */
> if (machine->dtb) {
> machine->fdt = load_device_tree(machine->dtb, &s->fdt_size);
> if (!machine->fdt) {
> error_report("load_device_tree() failed");
> exit(1);
> }
> - } else {
> - create_fdt(s, memmap);
> }
>
> s->machine_done.notify = virt_machine_done;
On Wed, Apr 20, 2022 at 1:53 PM Alistair Francis <alistair.francis@opensource.wdc.com> wrote: > > From: Alistair Francis <alistair.francis@wdc.com> > > Imply the TPM sysbus devices. This allows users to add TPM devices to > the RISC-V virt board. > > This was tested by first creating an emulated TPM device: > > swtpm socket --tpm2 -t -d --tpmstate dir=/tmp/tpm \ > --ctrl type=unixio,path=swtpm-sock > > Then launching QEMU with: > > -chardev socket,id=chrtpm,path=swtpm-sock \ > -tpmdev emulator,id=tpm0,chardev=chrtpm \ > -device tpm-tis-device,tpmdev=tpm0 > > The TPM device can be seen in the memory tree and the generated device > tree. > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/942 > Signed-off-by: Alistair Francis <alistair.francis@wdc.com> > Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com> > --- > hw/riscv/virt.c | 4 ++++ > hw/riscv/Kconfig | 1 + > 2 files changed, 5 insertions(+) > Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
© 2016 - 2026 Red Hat, Inc.