hw/loongarch: Add TPM device for LoongArch virt machine
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> Reviewed-by: Song Gao <gaosong@loongson.cn> Message-Id: <20221028014007.2718352-4-yangxiaojuan@loongson.cn> Signed-off-by: Song Gao <gaosong@loongson.cn>
This commit is contained in:
		
							parent
							
								
									ca5bf7ad02
								
							
						
					
					
						commit
						3dfbb6dee5
					
				@ -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);
 | 
			
		||||
@ -359,6 +399,15 @@ static void acpi_build(AcpiBuildTables *tables, MachineState *machine)
 | 
			
		||||
                   lams->oem_table_id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_TPM
 | 
			
		||||
    /* 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);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    /* Add tables supplied by user (if any) */
 | 
			
		||||
    for (u = acpi_table_first(); u; u = acpi_table_next(u)) {
 | 
			
		||||
        unsigned len = acpi_table_len(u);
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
{
 | 
			
		||||
@ -960,6 +961,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[] = {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user