Message ID | 20221028014007.2718352-4-yangxiaojuan@loongson.cn (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Improve FDT and support TPM for LoongArch | expand |
在 2022/10/28 上午9:40, Xiaojuan Yang 写道: > Add TPM device for LoongArch virt machine, including > establish TPM acpi info and add TYPE_TPM_TIS_SYSBUS > to dynamic_sysbus_devices list. > > Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn> > --- > hw/loongarch/acpi-build.c | 50 +++++++++++++++++++++++++++++++++++++-- > hw/loongarch/virt.c | 4 ++++ > 2 files changed, 52 insertions(+), 2 deletions(-) > > diff --git a/hw/loongarch/acpi-build.c b/hw/loonga Reviewed-by: Song Gao <gaosong@loongson.cn> Thanks. Song Gao > rch/acpi-build.c > index 378a6d9d38..1d0e562435 100644 > --- a/hw/loongarch/acpi-build.c > +++ b/hw/loongarch/acpi-build.c > @@ -31,6 +31,9 @@ > > #include "hw/acpi/generic_event_device.h" > #include "hw/pci-host/gpex.h" > +#include "sysemu/tpm.h" > +#include "hw/platform-bus.h" > +#include "hw/acpi/aml-build.h" > > #define ACPI_BUILD_ALIGN_SIZE 0x1000 > #define ACPI_BUILD_TABLE_SIZE 0x20000 > @@ -275,6 +278,41 @@ static void build_pci_device_aml(Aml *scope, LoongArchMachineState *lams) > acpi_dsdt_add_gpex(scope, &cfg); > } > > +#ifdef CONFIG_TPM > +static void acpi_dsdt_add_tpm(Aml *scope, LoongArchMachineState *vms) > +{ > + PlatformBusDevice *pbus = PLATFORM_BUS_DEVICE(vms->platform_bus_dev); > + hwaddr pbus_base = VIRT_PLATFORM_BUS_BASEADDRESS; > + SysBusDevice *sbdev = SYS_BUS_DEVICE(tpm_find()); > + MemoryRegion *sbdev_mr; > + hwaddr tpm_base; > + > + 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("_STR", aml_string("TPM 2.0 Device"))); > + aml_append(dev, aml_name_decl("_UID", aml_int(0))); > + > + Aml *crs = aml_resource_template(); > + aml_append(crs, > + aml_memory32_fixed(tpm_base, > + (uint32_t)memory_region_size(sbdev_mr), > + AML_READ_WRITE)); > + aml_append(dev, aml_name_decl("_CRS", crs)); > + aml_append(scope, dev); > +} > +#endif > + > /* build DSDT */ > static void > build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine) > @@ -289,7 +327,9 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine) > build_uart_device_aml(dsdt); > build_pci_device_aml(dsdt, lams); > build_la_ged_aml(dsdt, machine); > - > +#ifdef CONFIG_TPM > + acpi_dsdt_add_tpm(dsdt, lams); > +#endif > /* System State Package */ > scope = aml_scope("\\"); > pkg = aml_package(4); > @@ -358,7 +398,13 @@ static void acpi_build(AcpiBuildTables *tables, MachineState *machine) > build_mcfg(tables_blob, tables->linker, &mcfg, lams->oem_id, > lams->oem_table_id); > } > - > + /* TPM info */ > + if (tpm_get_version(tpm_find()) == TPM_VERSION_2_0) { > + acpi_add_table(table_offsets, tables_blob); > + build_tpm2(tables_blob, tables->linker, > + tables->tcpalog, lams->oem_id, > + lams->oem_table_id); > + } > /* Add tables supplied by user (if any) */ > for (u = acpi_table_first(); u; u = acpi_table_next(u)) { > unsigned len = acpi_table_len(u); > diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c > index eed9d591e7..c1612d5e05 100644 > --- a/hw/loongarch/virt.c > +++ b/hw/loongarch/virt.c > @@ -41,6 +41,7 @@ > #include "hw/platform-bus.h" > #include "hw/display/ramfb.h" > #include "hw/mem/pc-dimm.h" > +#include "sysemu/tpm.h" > > static void fdt_add_rtc_node(LoongArchMachineState *lams) > { > @@ -993,6 +994,9 @@ static void loongarch_class_init(ObjectClass *oc, void *data) > object_class_property_set_description(oc, "acpi", > "Enable ACPI"); > 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 > } > > static const TypeInfo loongarch_machine_types[] = {
diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c index 378a6d9d38..1d0e562435 100644 --- a/hw/loongarch/acpi-build.c +++ b/hw/loongarch/acpi-build.c @@ -31,6 +31,9 @@ #include "hw/acpi/generic_event_device.h" #include "hw/pci-host/gpex.h" +#include "sysemu/tpm.h" +#include "hw/platform-bus.h" +#include "hw/acpi/aml-build.h" #define ACPI_BUILD_ALIGN_SIZE 0x1000 #define ACPI_BUILD_TABLE_SIZE 0x20000 @@ -275,6 +278,41 @@ static void build_pci_device_aml(Aml *scope, LoongArchMachineState *lams) acpi_dsdt_add_gpex(scope, &cfg); } +#ifdef CONFIG_TPM +static void acpi_dsdt_add_tpm(Aml *scope, LoongArchMachineState *vms) +{ + PlatformBusDevice *pbus = PLATFORM_BUS_DEVICE(vms->platform_bus_dev); + hwaddr pbus_base = VIRT_PLATFORM_BUS_BASEADDRESS; + SysBusDevice *sbdev = SYS_BUS_DEVICE(tpm_find()); + MemoryRegion *sbdev_mr; + hwaddr tpm_base; + + 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("_STR", aml_string("TPM 2.0 Device"))); + aml_append(dev, aml_name_decl("_UID", aml_int(0))); + + Aml *crs = aml_resource_template(); + aml_append(crs, + aml_memory32_fixed(tpm_base, + (uint32_t)memory_region_size(sbdev_mr), + AML_READ_WRITE)); + aml_append(dev, aml_name_decl("_CRS", crs)); + aml_append(scope, dev); +} +#endif + /* build DSDT */ static void build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine) @@ -289,7 +327,9 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine) build_uart_device_aml(dsdt); build_pci_device_aml(dsdt, lams); build_la_ged_aml(dsdt, machine); - +#ifdef CONFIG_TPM + acpi_dsdt_add_tpm(dsdt, lams); +#endif /* System State Package */ scope = aml_scope("\\"); pkg = aml_package(4); @@ -358,7 +398,13 @@ static void acpi_build(AcpiBuildTables *tables, MachineState *machine) build_mcfg(tables_blob, tables->linker, &mcfg, lams->oem_id, lams->oem_table_id); } - + /* TPM info */ + if (tpm_get_version(tpm_find()) == TPM_VERSION_2_0) { + acpi_add_table(table_offsets, tables_blob); + build_tpm2(tables_blob, tables->linker, + tables->tcpalog, lams->oem_id, + lams->oem_table_id); + } /* Add tables supplied by user (if any) */ for (u = acpi_table_first(); u; u = acpi_table_next(u)) { unsigned len = acpi_table_len(u); diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c index eed9d591e7..c1612d5e05 100644 --- a/hw/loongarch/virt.c +++ b/hw/loongarch/virt.c @@ -41,6 +41,7 @@ #include "hw/platform-bus.h" #include "hw/display/ramfb.h" #include "hw/mem/pc-dimm.h" +#include "sysemu/tpm.h" static void fdt_add_rtc_node(LoongArchMachineState *lams) { @@ -993,6 +994,9 @@ static void loongarch_class_init(ObjectClass *oc, void *data) object_class_property_set_description(oc, "acpi", "Enable ACPI"); 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 } static const TypeInfo loongarch_machine_types[] = {
Add TPM device for LoongArch virt machine, including establish TPM acpi info and add TYPE_TPM_TIS_SYSBUS to dynamic_sysbus_devices list. Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn> --- hw/loongarch/acpi-build.c | 50 +++++++++++++++++++++++++++++++++++++-- hw/loongarch/virt.c | 4 ++++ 2 files changed, 52 insertions(+), 2 deletions(-)