/** @file | |
* Generic Timer Description Table (GTDT) | |
* | |
* Copyright (c) 2012 - 2016, ARM Limited. All rights reserved. | |
* | |
* This program and the accompanying materials | |
* are licensed and made available under the terms and conditions of the BSD License | |
* which accompanies this distribution. The full text of the license may be found at | |
* http://opensource.org/licenses/bsd-license.php | |
* | |
* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
* | |
**/ | |
#include "ArmPlatform.h" | |
#include <Library/AcpiLib.h> | |
#include <Library/PcdLib.h> | |
#include <IndustryStandard/Acpi.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_5_0_GTDT_TIMER_FLAG_TIMER_INTERRUPT_MODE | |
#define GTDT_TIMER_LEVEL_TRIGGERED 0 | |
#define GTDT_TIMER_ACTIVE_LOW EFI_ACPI_5_0_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY | |
#define GTDT_TIMER_ACTIVE_HIGH 0 | |
#define GTDT_GTIMER_FLAGS (GTDT_TIMER_ACTIVE_LOW | GTDT_TIMER_LEVEL_TRIGGERED) | |
#ifdef ARM_JUNO_ACPI_5_0 | |
EFI_ACPI_5_0_GENERIC_TIMER_DESCRIPTION_TABLE Gtdt = { | |
ARM_ACPI_HEADER( | |
EFI_ACPI_5_0_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, | |
EFI_ACPI_5_0_GENERIC_TIMER_DESCRIPTION_TABLE, | |
EFI_ACPI_5_0_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION | |
), | |
SYSTEM_TIMER_BASE_ADDRESS, // UINT64 PhysicalAddress | |
GTDT_GLOBAL_FLAGS, // UINT32 GlobalFlags | |
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 | |
}; | |
#else | |
#pragma pack (1) | |
typedef struct { | |
EFI_ACPI_5_1_GENERIC_TIMER_DESCRIPTION_TABLE Gtdt; | |
EFI_ACPI_5_1_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE Watchdogs[JUNO_WATCHDOG_COUNT]; | |
} EFI_ACPI_5_1_GENERIC_TIMER_DESCRIPTION_TABLES; | |
#pragma pack () | |
EFI_ACPI_5_1_GENERIC_TIMER_DESCRIPTION_TABLES Gtdt = { | |
{ | |
ARM_ACPI_HEADER( | |
EFI_ACPI_5_1_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, | |
EFI_ACPI_5_1_GENERIC_TIMER_DESCRIPTION_TABLES, | |
EFI_ACPI_5_1_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 | |
JUNO_WATCHDOG_COUNT, // UINT32 PlatformTimerCount | |
sizeof (EFI_ACPI_5_1_GENERIC_TIMER_DESCRIPTION_TABLE) // UINT32 PlatfromTimerOffset | |
}, | |
{ | |
EFI_ACPI_5_1_SBSA_GENERIC_WATCHDOG_STRUCTURE_INIT( | |
FixedPcdGet32 (PcdGenericWatchdogRefreshBase), FixedPcdGet32 (PcdGenericWatchdogControlBase), 93, 0), | |
EFI_ACPI_5_1_SBSA_GENERIC_WATCHDOG_STRUCTURE_INIT( | |
FixedPcdGet32 (PcdGenericWatchdogRefreshBase), FixedPcdGet32 (PcdGenericWatchdogControlBase), 94, EFI_ACPI_5_1_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_SECURE_TIMER) | |
} | |
}; | |
#endif | |
// | |
// Reference the table being generated to prevent the optimizer from removing the | |
// data structure from the executable | |
// | |
VOID* CONST ReferenceAcpiTable = &Gtdt; |