On Sat, May 02, 2020 at 10:35:36PM +0200, Eric Auger wrote: > In case it is dynamically instantiated, add the TPM 2.0 device object > under the DSDT table in the ACPI namespace. Its HID is MSFT0101 > while its current resource settings (CRS) property is initialized > with the guest physical address and MMIO size of the device. > > Signed-off-by: Eric Auger <eric.au...@redhat.com> > --- > hw/arm/virt-acpi-build.c | 34 ++++++++++++++++++++++++++++++++++ > 1 file changed, 34 insertions(+) > > diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c > index cc5863eaf2..0cb9cdb2ce 100644 > --- a/hw/arm/virt-acpi-build.c > +++ b/hw/arm/virt-acpi-build.c > @@ -45,6 +45,7 @@ > #include "hw/pci/pcie_host.h" > #include "hw/pci/pci.h" > #include "hw/arm/virt.h" > +#include "hw/platform-bus.h" > #include "sysemu/numa.h" > #include "sysemu/reset.h" > #include "sysemu/tpm.h" > @@ -362,6 +363,38 @@ static void acpi_dsdt_add_power_button(Aml *scope) > aml_append(scope, dev); > } > > +static void acpi_dsdt_add_tpm(Aml *scope, VirtMachineState *vms) > +{ > + hwaddr pbus_base = vms->memmap[VIRT_PLATFORM_BUS].base; > + PlatformBusDevice *pbus = PLATFORM_BUS_DEVICE(vms->platform_bus_dev); > + MemoryRegion *sbdev_mr; > + SysBusDevice *sbdev; > + hwaddr tpm_base; > + > + sbdev = (SysBusDevice *)object_dynamic_cast(OBJECT(tpm_find()), > + TYPE_SYS_BUS_DEVICE); > + if (!sbdev) { > + return; > + } > + > + tpm_base = platform_bus_get_mmio_addr(pbus, sbdev, 0); > + assert(tpm_base != -1); > + > + tpm_base += pbus_base; > + > + sbdev_mr = sysbus_mmio_get_region(sbdev, 0); > + > + Aml *dev = aml_device("TPM0"); > + aml_append(dev, aml_name_decl("_HID", aml_string("MSFT0101"))); > + aml_append(dev, aml_name_decl("_UID", aml_int(0))); > + > + Aml *crs = aml_resource_template(); > + aml_append(crs, > + aml_memory32_fixed(tpm_base, sbdev_mr->size, AML_READ_WRITE));
I don't think you are supposed to poke at memory region struct internals like this. > + aml_append(dev, aml_name_decl("_CRS", crs)); > + aml_append(scope, dev); > +} > + > static void > build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms) > { > @@ -785,6 +818,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, > VirtMachineState *vms) > } > > acpi_dsdt_add_power_button(scope); > + acpi_dsdt_add_tpm(scope, vms); > > aml_append(dsdt, scope); > > -- > 2.20.1