Gtdt.aslc 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /** @file
  2. Generic Timer Description Table (GTDT)
  3. GTDT provides OSPM with information about a system’s Generic Timers
  4. configuration. This table lists the watchdog and generic timer instances
  5. available on the reference design platforms.
  6. Copyright (c) 2018 - 2022, Arm Limited. All rights reserved.
  7. SPDX-License-Identifier: BSD-2-Clause-Patent
  8. @par Specification Reference:
  9. - ACPI 6.4, Chapter 5, Section 5.2.24, Generic Timer Description Table
  10. **/
  11. #include <Library/AcpiLib.h>
  12. #include <Library/PcdLib.h>
  13. #include "SgiAcpiHeader.h"
  14. #define SGI_PLATFORM_WATCHDOG_COUNT 2
  15. #define SGI_PLATFORM_TIMER_COUNT (SGI_PLATFORM_WATCHDOG_COUNT + 1)
  16. #define SGI_TIMER_FRAMES_COUNT 2
  17. #define SYSTEM_TIMER_BASE_ADDRESS 0xFFFFFFFFFFFFFFFF
  18. #define GTDT_GLOBAL_FLAGS 0
  19. #define GTDT_GTIMER_FLAGS EFI_ACPI_6_4_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY
  20. #define SGI_GT_BLOCK_CTL_BASE 0x2A810000
  21. #define SGI_GT_BLOCK_FRAME1_CTL_BASE 0x2A820000
  22. #define SGI_GT_BLOCK_FRAME1_CTL_EL0_BASE 0xFFFFFFFFFFFFFFFF
  23. #define SGI_GT_BLOCK_FRAME1_GSIV FixedPcdGet32 (PcdGtFrame1Gsiv)
  24. #define SGI_GT_BLOCK_FRAME0_CTL_BASE 0x2A830000
  25. #define SGI_GT_BLOCK_FRAME0_CTL_EL0_BASE 0xFFFFFFFFFFFFFFFF
  26. #define SGI_GT_BLOCK_FRAME0_GSIV FixedPcdGet32 (PcdGtFrame0Gsiv)
  27. #define SGI_GTX_TIMER_FLAGS 0
  28. #define GTX_TIMER_SECURE EFI_ACPI_6_4_GTDT_GT_BLOCK_COMMON_FLAG_SECURE_TIMER
  29. #define GTX_TIMER_NON_SECURE 0
  30. #define GTX_TIMER_SAVE_CONTEXT EFI_ACPI_6_4_GTDT_GT_BLOCK_COMMON_FLAG_ALWAYS_ON_CAPABILITY
  31. #define SGI_GTX_COMMON_FLAGS_S (GTX_TIMER_SAVE_CONTEXT | GTX_TIMER_SECURE)
  32. #define SGI_GTX_COMMON_FLAGS_NS (GTX_TIMER_SAVE_CONTEXT | GTX_TIMER_NON_SECURE)
  33. #define EFI_ACPI_6_4_ARM_GENERIC_WATCHDOG_STRUCTURE_INIT( \
  34. RefreshFramePhysicalAddress, ControlFramePhysicalAddress, \
  35. WatchdogTimerGSIV, WatchdogTimerFlags) \
  36. { \
  37. EFI_ACPI_6_4_GTDT_ARM_GENERIC_WATCHDOG, \
  38. sizeof (EFI_ACPI_6_4_GTDT_ARM_GENERIC_WATCHDOG_STRUCTURE), \
  39. EFI_ACPI_RESERVED_WORD, \
  40. RefreshFramePhysicalAddress, \
  41. ControlFramePhysicalAddress, \
  42. WatchdogTimerGSIV, \
  43. WatchdogTimerFlags \
  44. }
  45. #pragma pack (1)
  46. typedef struct {
  47. EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLE Gtdt;
  48. EFI_ACPI_6_4_GTDT_GT_BLOCK_STRUCTURE GtBlock;
  49. EFI_ACPI_6_4_GTDT_GT_BLOCK_TIMER_STRUCTURE Frames[SGI_TIMER_FRAMES_COUNT];
  50. EFI_ACPI_6_4_GTDT_ARM_GENERIC_WATCHDOG_STRUCTURE Watchdogs[SGI_PLATFORM_WATCHDOG_COUNT];
  51. } EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLES;
  52. #pragma pack ()
  53. STATIC EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLES Gtdt = {
  54. {
  55. ARM_ACPI_HEADER (
  56. EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,
  57. EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLES,
  58. EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION
  59. ),
  60. SYSTEM_TIMER_BASE_ADDRESS, // UINT64 PhysicalAddress
  61. 0, // UINT32 Reserved
  62. FixedPcdGet32 (PcdArmArchTimerSecIntrNum), // UINT32 SecurePL1TimerGSIV
  63. GTDT_GTIMER_FLAGS, // UINT32 SecurePL1TimerFlags
  64. FixedPcdGet32 (PcdArmArchTimerIntrNum), // UINT32 NonSecurePL1TimerGSIV
  65. GTDT_GTIMER_FLAGS, // UINT32 NonSecurePL1TimerFlags
  66. FixedPcdGet32 (PcdArmArchTimerVirtIntrNum), // UINT32 VirtualTimerGSIV
  67. GTDT_GTIMER_FLAGS, // UINT32 VirtualTimerFlags
  68. FixedPcdGet32 (PcdArmArchTimerHypIntrNum), // UINT32 NonSecurePL2TimerGSIV
  69. GTDT_GTIMER_FLAGS, // UINT32 NonSecurePL2TimerFlags
  70. 0xFFFFFFFFFFFFFFFF, // UINT64 CntReadBasePhysicalAddress
  71. SGI_PLATFORM_TIMER_COUNT, // UINT32 PlatformTimerCount
  72. sizeof (EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLE), // UINT32 PlatfromTimerOffset
  73. 0, // UINT32 VirtualPL2TimerGSIV
  74. 0 // UINT32 VirtualPL2TimerFlags
  75. },
  76. {
  77. EFI_ACPI_6_4_GTDT_GT_BLOCK, // UINT8 Type
  78. sizeof (EFI_ACPI_6_4_GTDT_GT_BLOCK_STRUCTURE) + // UINT16 Length
  79. sizeof (EFI_ACPI_6_4_GTDT_GT_BLOCK_TIMER_STRUCTURE) *
  80. SGI_TIMER_FRAMES_COUNT,
  81. EFI_ACPI_RESERVED_BYTE, // UINT8 Reserved
  82. SGI_GT_BLOCK_CTL_BASE, // UINT64 CntCtlBase
  83. SGI_TIMER_FRAMES_COUNT, // UINT32 GTBlockTimerCount
  84. sizeof (EFI_ACPI_6_4_GTDT_GT_BLOCK_STRUCTURE) // UINT32 GTBlockTimerOffset
  85. },
  86. {
  87. {
  88. 0, // UINT8 GTFrameNumber
  89. {
  90. EFI_ACPI_RESERVED_BYTE,
  91. EFI_ACPI_RESERVED_BYTE,
  92. EFI_ACPI_RESERVED_BYTE
  93. }, // UINT8 Reserved[3]
  94. SGI_GT_BLOCK_FRAME0_CTL_BASE, // UINT64 CntBaseX
  95. SGI_GT_BLOCK_FRAME0_CTL_EL0_BASE, // UINT64 CntEL0BaseX
  96. SGI_GT_BLOCK_FRAME0_GSIV, // UINT32 GTxPhysicalTimerGSIV
  97. SGI_GTX_TIMER_FLAGS, // UINT32 GTxPhysicalTimerFlags
  98. 0, // UINT32 GTxVirtualTimerGSIV
  99. 0, // UINT32 GTxVirtualTimerFlags
  100. SGI_GTX_COMMON_FLAGS_NS // UINT32 GTxCommonFlags
  101. },
  102. {
  103. 1, // UINT8 GTFrameNumber
  104. {
  105. EFI_ACPI_RESERVED_BYTE,
  106. EFI_ACPI_RESERVED_BYTE,
  107. EFI_ACPI_RESERVED_BYTE
  108. }, // UINT8 Reserved[3]
  109. SGI_GT_BLOCK_FRAME1_CTL_BASE, // UINT64 CntBaseX
  110. SGI_GT_BLOCK_FRAME1_CTL_EL0_BASE, // UINT64 CntEL0BaseX
  111. SGI_GT_BLOCK_FRAME1_GSIV, // UINT32 GTxPhysicalTimerGSIV
  112. SGI_GTX_TIMER_FLAGS, // UINT32 GTxPhysicalTimerFlags
  113. 0, // UINT32 GTxVirtualTimerGSIV
  114. 0, // UINT32 GTxVirtualTimerFlags
  115. SGI_GTX_COMMON_FLAGS_S // UINT32 GTxCommonFlags
  116. }
  117. },
  118. {
  119. EFI_ACPI_6_4_ARM_GENERIC_WATCHDOG_STRUCTURE_INIT (
  120. FixedPcdGet32 (PcdGenericWatchdogRefreshBase),
  121. FixedPcdGet32 (PcdGenericWatchdogControlBase),
  122. FixedPcdGet32 (PcdWdogWS0Gsiv),
  123. 0
  124. ),
  125. EFI_ACPI_6_4_ARM_GENERIC_WATCHDOG_STRUCTURE_INIT (
  126. FixedPcdGet32 (PcdGenericWatchdogRefreshBase),
  127. FixedPcdGet32 (PcdGenericWatchdogControlBase),
  128. FixedPcdGet32 (PcdWdogWS1Gsiv),
  129. EFI_ACPI_6_4_GTDT_ARM_GENERIC_WATCHDOG_FLAG_SECURE_TIMER
  130. )
  131. }
  132. };
  133. //
  134. // Reference the table being generated to prevent the optimizer from removing the
  135. // data structure from the executable
  136. //
  137. VOID* CONST ReferenceAcpiTable = &Gtdt;