|
46 | 46 | #include "hw/pci/pci.h"
|
47 | 47 | #include "hw/arm/virt.h"
|
48 | 48 | #include "hw/mem/nvdimm.h"
|
| 49 | +#include "hw/platform-bus.h" |
49 | 50 | #include "sysemu/numa.h"
|
50 | 51 | #include "sysemu/reset.h"
|
51 | 52 | #include "sysemu/tpm.h"
|
@@ -364,6 +365,38 @@ static void acpi_dsdt_add_power_button(Aml *scope)
|
364 | 365 | aml_append(scope, dev);
|
365 | 366 | }
|
366 | 367 |
|
| 368 | +static void acpi_dsdt_add_tpm(Aml *scope, VirtMachineState *vms) |
| 369 | +{ |
| 370 | + PlatformBusDevice *pbus = PLATFORM_BUS_DEVICE(vms->platform_bus_dev); |
| 371 | + hwaddr pbus_base = vms->memmap[VIRT_PLATFORM_BUS].base; |
| 372 | + SysBusDevice *sbdev = SYS_BUS_DEVICE(tpm_find()); |
| 373 | + MemoryRegion *sbdev_mr; |
| 374 | + hwaddr tpm_base; |
| 375 | + |
| 376 | + if (!sbdev) { |
| 377 | + return; |
| 378 | + } |
| 379 | + |
| 380 | + tpm_base = platform_bus_get_mmio_addr(pbus, sbdev, 0); |
| 381 | + assert(tpm_base != -1); |
| 382 | + |
| 383 | + tpm_base += pbus_base; |
| 384 | + |
| 385 | + sbdev_mr = sysbus_mmio_get_region(sbdev, 0); |
| 386 | + |
| 387 | + Aml *dev = aml_device("TPM0"); |
| 388 | + aml_append(dev, aml_name_decl("_HID", aml_string("MSFT0101"))); |
| 389 | + aml_append(dev, aml_name_decl("_UID", aml_int(0))); |
| 390 | + |
| 391 | + Aml *crs = aml_resource_template(); |
| 392 | + aml_append(crs, |
| 393 | + aml_memory32_fixed(tpm_base, |
| 394 | + (uint32_t)memory_region_size(sbdev_mr), |
| 395 | + AML_READ_WRITE)); |
| 396 | + aml_append(dev, aml_name_decl("_CRS", crs)); |
| 397 | + aml_append(scope, dev); |
| 398 | +} |
| 399 | + |
367 | 400 | static void
|
368 | 401 | build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
369 | 402 | {
|
@@ -762,6 +795,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
762 | 795 | }
|
763 | 796 |
|
764 | 797 | acpi_dsdt_add_power_button(scope);
|
| 798 | + acpi_dsdt_add_tpm(scope, vms); |
765 | 799 |
|
766 | 800 | aml_append(dsdt, scope);
|
767 | 801 |
|
|
0 commit comments