We need to have some conditional code while generating GTDT due to adding non-secure EL2 virtual timer.
Signed-off-by: Marcin Juszkiewicz <marcin.juszkiew...@linaro.org> --- .../Qemu/SbsaQemu/AcpiTables/AcpiTables.inf | 1 - .../SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf | 6 + .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h | 29 +++++ .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c | 101 +++++++++++++++++ Silicon/Qemu/SbsaQemu/AcpiTables/Gtdt.aslc | 107 ------------------ 5 files changed, 136 insertions(+), 108 deletions(-) delete mode 100644 Silicon/Qemu/SbsaQemu/AcpiTables/Gtdt.aslc diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf b/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf index 97021f7971c7..61ff3dff3356 100644 --- a/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf +++ b/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf @@ -19,7 +19,6 @@ [Sources] Dbg2.aslc Dsdt.asl Fadt.aslc - Gtdt.aslc Mcfg.aslc Spcr.aslc diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf index 14d760b36400..19f186f4310c 100644 --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf @@ -68,3 +68,9 @@ [FixedPcd] gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemTableId gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemRevision + + gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerHypVirtIntrNum diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h index f13ee3f738c2..7c9074b10960 100644 --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h @@ -34,4 +34,33 @@ typedef struct { SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE RcNode; } SBSA_IO_REMAPPING_STRUCTURE; +typedef struct { + EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE mGtdt; + EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE mGwdt; +} GENERIC_TIMER_DESCRIPTION_TABLES; + +#ifndef SYSTEM_TIMER_BASE_ADDRESS + #define SYSTEM_TIMER_BASE_ADDRESS MAX_ADDRESS +#endif + +#define GTDT_TIMER_LEVEL_TRIGGERED 0 +#define GTDT_TIMER_ACTIVE_LOW EFI_ACPI_6_3_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY +#define GTDT_TIMER_ALWAYS_ON EFI_ACPI_6_3_GTDT_TIMER_FLAG_ALWAYS_ON_CAPABILITY + +#define GTDT_GTIMER_FLAGS (GTDT_TIMER_ACTIVE_LOW | \ + GTDT_TIMER_LEVEL_TRIGGERED | \ + GTDT_TIMER_ALWAYS_ON) + +#define SBSA_PLATFORM_WATCHDOG_COUNT 1 +#define SBSA_PLATFORM_TIMER_COUNT (SBSA_PLATFORM_WATCHDOG_COUNT) + +#define SBSAQEMU_WDT_REFRESH_FRAME_BASE 0x50010000 +#define SBSAQEMU_WDT_CONTROL_FRAME_BASE 0x50011000 +#define SBSAQEMU_WDT_IRQ 48 + +#define GTDT_WDTIMER_LEVEL_TRIGGERED 0 +#define GTDT_WDTIMER_ACTIVE_HIGH 0 + +#define GTDT_WDTIMER_FLAGS (GTDT_WDTIMER_ACTIVE_HIGH | GTDT_WDTIMER_LEVEL_TRIGGERED) + #endif diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c index e52256616936..1f10214e264b 100644 --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c @@ -11,6 +11,7 @@ #include <IndustryStandard/IoRemappingTable.h> #include <IndustryStandard/SbsaQemuAcpi.h> #include <Library/AcpiLib.h> +#include <Library/ArmLib.h> #include <Library/BaseMemoryLib.h> #include <Library/DebugLib.h> #include <Library/FdtHelperLib.h> @@ -586,6 +587,101 @@ AddPpttTable ( return Status; } +/* + * A function that adds the GTDT ACPI table. + */ +EFI_STATUS +AddGtdtTable ( + IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable + ) +{ + EFI_STATUS Status; + UINTN TableHandle; + UINT32 TableSize; + EFI_PHYSICAL_ADDRESS PageAddress; + UINT8 *New; + + TableSize = sizeof (EFI_ACPI_6_5_GENERIC_TIMER_DESCRIPTION_TABLE) + + sizeof (EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE); + + Status = gBS->AllocatePages ( + AllocateAnyPages, + EfiACPIReclaimMemory, + EFI_SIZE_TO_PAGES (TableSize), + &PageAddress + ); + + if (EFI_ERROR(Status)) { + DEBUG ((DEBUG_ERROR, "Failed to allocate pages for GTDT table\n")); + return EFI_OUT_OF_RESOURCES; + } + + EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE Gtdt = { + + SBSAQEMU_ACPI_HEADER ( + EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, + GENERIC_TIMER_DESCRIPTION_TABLES, + EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION), + + SYSTEM_TIMER_BASE_ADDRESS, // UINT64 PhysicalAddress + 0, // UINT32 Reserved + FixedPcdGet32 (PcdArmArchTimerSecIntrNum), // UINT32 SecurePL1TimerGSIV + GTDT_GTIMER_FLAGS, // UINT32 SecurePL1TimerFlags + FixedPcdGet32 (PcdArmArchTimerIntrNum), // UINT32 NonSecurePL1TimerGSIV + GTDT_GTIMER_FLAGS, // UINT32 NonSecurePL1TimerFlags + FixedPcdGet32 (PcdArmArchTimerVirtIntrNum), // UINT32 VirtualTimerGSIV + GTDT_GTIMER_FLAGS, // UINT32 VirtualTimerFlags + FixedPcdGet32 (PcdArmArchTimerHypIntrNum), // UINT32 NonSecurePL2TimerGSIV + GTDT_GTIMER_FLAGS, // UINT32 NonSecurePL2TimerFlags + MAX_ADDRESS, // UINT64 CntReadBasePhysicalAddress + SBSA_PLATFORM_TIMER_COUNT, // UINT32 PlatformTimerCount + sizeof(EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE), + // UINT32 PlatformTimerOffset + FixedPcdGet32 (PcdArmArchTimerHypVirtIntrNum),// UINT32 VirtualPL2TimerGSIV + GTDT_GTIMER_FLAGS // UINT32 VirtualPL2TimerFlags + }; + + // Non-secure EL2 virtual timer requires VHE support (v8.1+) + if (! ArmHasVhe()) { + Gtdt.VirtualPL2TimerGSIV = 0; + Gtdt.VirtualPL2TimerFlags = 0; + } + + EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE Gwdt = { + EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG, + sizeof(EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE), + EFI_ACPI_RESERVED_WORD, + SBSAQEMU_WDT_REFRESH_FRAME_BASE, + SBSAQEMU_WDT_CONTROL_FRAME_BASE, + SBSAQEMU_WDT_IRQ, + GTDT_WDTIMER_FLAGS + }; + + New = (UINT8 *)(UINTN) PageAddress; + ZeroMem (New, TableSize); + + CopyMem (New, &Gtdt, sizeof (EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE)); + New += sizeof (EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE); + + CopyMem (New, &Gwdt, sizeof (EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE)); + New += sizeof (EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE); + + // Perform Checksum + AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize); + + Status = AcpiTable->InstallAcpiTable ( + AcpiTable, + (EFI_ACPI_COMMON_HEADER *)PageAddress, + TableSize, + &TableHandle + ); + if (EFI_ERROR(Status)) { + DEBUG ((DEBUG_ERROR, "Failed to install GTDT table\n")); + } + + return Status; +} + EFI_STATUS EFIAPI InitializeSbsaQemuAcpiDxe ( @@ -637,5 +733,10 @@ InitializeSbsaQemuAcpiDxe ( DEBUG ((DEBUG_ERROR, "Failed to add PPTT table\n")); } + Status = AddGtdtTable (AcpiTable); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to add GTDT table\n")); + } + return EFI_SUCCESS; } diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/Gtdt.aslc b/Silicon/Qemu/SbsaQemu/AcpiTables/Gtdt.aslc deleted file mode 100644 index ba145aff6413..000000000000 --- a/Silicon/Qemu/SbsaQemu/AcpiTables/Gtdt.aslc +++ /dev/null @@ -1,107 +0,0 @@ -/** @file -* Generic Timer Description Table (GTDT) -* -* Copyrignt (c) 2020, Linaro Limited. All rights reserved. -* -* SPDX-License-Identifier: BSD-2-Clause-Patent -**/ - -#include <Library/AcpiLib.h> -#include <Library/PcdLib.h> -#include <IndustryStandard/Acpi.h> -#include <IndustryStandard/SbsaQemuAcpi.h> - -#define GTDT_GLOBAL_FLAGS_MAPPED EFI_ACPI_5_0_GTDT_GLOBAL_FLAG_MEMORY_MAPPED_BLOCK_PRESENT -#define GTDT_GLOBAL_FLAGS_NOT_MAPPED 0 -#define GTDT_GLOBAL_FLAGS_EDGE EFI_ACPI_5_0_GTDT_GLOBAL_FLAG_INTERRUPT_MODE -#define GTDT_GLOBAL_FLAGS_LEVEL 0 - -// Note: We could have a build flag that switches between memory mapped/non-memory mapped timer -#ifdef SYSTEM_TIMER_BASE_ADDRESS - #define GTDT_GLOBAL_FLAGS (GTDT_GLOBAL_FLAGS_MAPPED | GTDT_GLOBAL_FLAGS_LEVEL) -#else - #define GTDT_GLOBAL_FLAGS (GTDT_GLOBAL_FLAGS_NOT_MAPPED | GTDT_GLOBAL_FLAGS_LEVEL) - #define SYSTEM_TIMER_BASE_ADDRESS 0xFFFFFFFFFFFFFFFF -#endif - -#define GTDT_TIMER_EDGE_TRIGGERED EFI_ACPI_6_3_GTDT_TIMER_FLAG_TIMER_INTERRUPT_MODE -#define GTDT_TIMER_LEVEL_TRIGGERED 0 -#define GTDT_TIMER_ACTIVE_LOW EFI_ACPI_6_3_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY -#define GTDT_TIMER_ACTIVE_HIGH 0 -#define GTDT_TIMER_ALWAYS_ON EFI_ACPI_6_3_GTDT_TIMER_FLAG_ALWAYS_ON_CAPABILITY - -#define GTDT_GTIMER_FLAGS (GTDT_TIMER_ACTIVE_LOW | \ - GTDT_TIMER_LEVEL_TRIGGERED | \ - GTDT_TIMER_ALWAYS_ON) - -#define SBSA_PLATFORM_WATCHDOG_COUNT 1 -#define SBSA_PLATFORM_TIMER_COUNT (SBSA_PLATFORM_WATCHDOG_COUNT) - -#define SBSAQEMU_WDT_REFRESH_FRAME_BASE 0x50010000 -#define SBSAQEMU_WDT_CONTROL_FRAME_BASE 0x50011000 -#define SBSAQEMU_WDT_IRQ 48 - -#define GTDT_WDTIMER_EDGE_TRIGGERED EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_MODE -#define GTDT_WDTIMER_LEVEL_TRIGGERED 0 -#define GTDT_WDTIMER_ACTIVE_LOW EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_POLARITY -#define GTDT_WDTIMER_ACTIVE_HIGH 0 - -#define GTDT_WDTIMER_FLAGS (GTDT_WDTIMER_ACTIVE_HIGH | GTDT_WDTIMER_LEVEL_TRIGGERED) - -#define EFI_ACPI_6_3_SBSA_GENERIC_WATCHDOG_STRUCTURE_INIT( \ - RefreshFramePhysicalAddress, ControlFramePhysicalAddress, \ - WatchdogTimerGSIV, WatchdogTimerFlags) \ - { \ - EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG, \ - sizeof(EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE), \ - EFI_ACPI_RESERVED_WORD, \ - RefreshFramePhysicalAddress, \ - ControlFramePhysicalAddress, \ - WatchdogTimerGSIV, \ - WatchdogTimerFlags \ - } - - #pragma pack (1) - - typedef struct { - EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE Gtdt; - EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE Gwdt; - } GENERIC_TIMER_DESCRIPTION_TABLES; - - #pragma pack () - - GENERIC_TIMER_DESCRIPTION_TABLES Gtdt = { - { - SBSAQEMU_ACPI_HEADER( - EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, - GENERIC_TIMER_DESCRIPTION_TABLES, - EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION - ), - SYSTEM_TIMER_BASE_ADDRESS, // UINT64 PhysicalAddress - 0, // UINT32 Reserved - FixedPcdGet32 (PcdArmArchTimerSecIntrNum), // UINT32 SecurePL1TimerGSIV - GTDT_GTIMER_FLAGS, // UINT32 SecurePL1TimerFlags - FixedPcdGet32 (PcdArmArchTimerIntrNum), // UINT32 NonSecurePL1TimerGSIV - GTDT_GTIMER_FLAGS, // UINT32 NonSecurePL1TimerFlags - FixedPcdGet32 (PcdArmArchTimerVirtIntrNum), // UINT32 VirtualTimerGSIV - GTDT_GTIMER_FLAGS, // UINT32 VirtualTimerFlags - FixedPcdGet32 (PcdArmArchTimerHypIntrNum), // UINT32 NonSecurePL2TimerGSIV - GTDT_GTIMER_FLAGS, // UINT32 NonSecurePL2TimerFlags - 0xFFFFFFFFFFFFFFFF, // UINT64 CntReadBasePhysicalAddress - SBSA_PLATFORM_TIMER_COUNT, // UINT32 PlatformTimerCount - sizeof(EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE), - // UINT32 PlatformTimerOffset - 0, // UINT32 VirtualPL2TimerGSIV - 0 // UINT32 VirtualPL2TimerFlags - }, - EFI_ACPI_6_3_SBSA_GENERIC_WATCHDOG_STRUCTURE_INIT( - SBSAQEMU_WDT_REFRESH_FRAME_BASE, - SBSAQEMU_WDT_CONTROL_FRAME_BASE, - SBSAQEMU_WDT_IRQ, - GTDT_WDTIMER_FLAGS - ) - }; - -// Reference the table being generated to prevent the optimizer from removing the -// data structure from the executable -VOID* CONST ReferenceAcpiTable = &Gtdt; -- 2.41.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#108915): https://edk2.groups.io/g/devel/message/108915 Mute This Topic: https://groups.io/mt/101479615/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-