hw/riscv: Enable TPM backends
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>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Message-Id: <20220427234146.1130752-7-alistair.francis@opensource.wdc.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
@@ -162,3 +162,23 @@ The minimal QEMU commands to run U-Boot SPL are:
|
|||||||
To test 32-bit U-Boot images, switch to use qemu-riscv32_smode_defconfig and
|
To test 32-bit U-Boot images, switch to use qemu-riscv32_smode_defconfig and
|
||||||
riscv32_spl_defconfig builds, and replace ``qemu-system-riscv64`` with
|
riscv32_spl_defconfig builds, and replace ``qemu-system-riscv64`` with
|
||||||
``qemu-system-riscv32`` in the command lines above to boot the 32-bit U-Boot.
|
``qemu-system-riscv32`` in the command lines above to boot the 32-bit U-Boot.
|
||||||
|
|
||||||
|
Enabling TPM
|
||||||
|
------------
|
||||||
|
|
||||||
|
A TPM device can be connected to the virt board by following the steps below.
|
||||||
|
|
||||||
|
First launch the TPM emulator
|
||||||
|
|
||||||
|
swtpm socket --tpm2 -t -d --tpmstate dir=/tmp/tpm \
|
||||||
|
--ctrl type=unixio,path=swtpm-sock
|
||||||
|
|
||||||
|
Then launch 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 and should be accessible from the guest software.
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ config RISCV_VIRT
|
|||||||
imply PCI_DEVICES
|
imply PCI_DEVICES
|
||||||
imply VIRTIO_VGA
|
imply VIRTIO_VGA
|
||||||
imply TEST_DEVICES
|
imply TEST_DEVICES
|
||||||
|
imply TPM_TIS_SYSBUS
|
||||||
select RISCV_NUMA
|
select RISCV_NUMA
|
||||||
select GOLDFISH_RTC
|
select GOLDFISH_RTC
|
||||||
select MSI_NONBROKEN
|
select MSI_NONBROKEN
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
#include "sysemu/device_tree.h"
|
#include "sysemu/device_tree.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "sysemu/kvm.h"
|
#include "sysemu/kvm.h"
|
||||||
|
#include "sysemu/tpm.h"
|
||||||
#include "hw/pci/pci.h"
|
#include "hw/pci/pci.h"
|
||||||
#include "hw/pci-host/gpex.h"
|
#include "hw/pci-host/gpex.h"
|
||||||
#include "hw/display/ramfb.h"
|
#include "hw/display/ramfb.h"
|
||||||
@@ -1617,6 +1618,9 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
|||||||
hc->plug = virt_machine_device_plug_cb;
|
hc->plug = virt_machine_device_plug_cb;
|
||||||
|
|
||||||
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
|
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,
|
object_class_property_add_bool(oc, "aclint", virt_get_aclint,
|
||||||
virt_set_aclint);
|
virt_set_aclint);
|
||||||
|
|||||||
Reference in New Issue
Block a user