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]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to