Before extending the GIC arch revision check to support an emulated
GICv2 on GICv3 capable hardware in the next patch, add a constructor
to ArmGicLib that caches the result of the check so we don't have to
go through it on every call into ArmGicLib.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
---
 ArmPkg/Drivers/ArmGic/ArmGicLib.c   | 42 +++++++++++++++++++------------------
 ArmPkg/Drivers/ArmGic/ArmGicLib.inf |  1 +
 2 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/ArmPkg/Drivers/ArmGic/ArmGicLib.c 
b/ArmPkg/Drivers/ArmGic/ArmGicLib.c
index 1e5924f5a49f..c48b97e3eb4d 100644
--- a/ArmPkg/Drivers/ArmGic/ArmGicLib.c
+++ b/ArmPkg/Drivers/ArmGic/ArmGicLib.c
@@ -20,6 +20,8 @@
 #include "GicV2/ArmGicV2Lib.h"
 #include "GicV3/ArmGicV3Lib.h"
 
+STATIC ARM_GIC_ARCH_REVISION    mGicArchRevision;
+
 UINTN
 EFIAPI
 ArmGicGetInterfaceIdentification (
@@ -72,10 +74,7 @@ ArmGicAcknowledgeInterrupt (
   )
 {
   UINTN Value;
-  ARM_GIC_ARCH_REVISION Revision;
-
-  Revision = ArmGicGetSupportedArchRevision ();
-  if (Revision == ARM_GIC_ARCH_REVISION_2) {
+  if (mGicArchRevision == ARM_GIC_ARCH_REVISION_2) {
     Value = ArmGicV2AcknowledgeInterrupt (GicInterruptInterfaceBase);
     // InterruptId is required for the caller to know if a valid or spurious
     // interrupt has been read
@@ -83,7 +82,7 @@ ArmGicAcknowledgeInterrupt (
     if (InterruptId != NULL) {
       *InterruptId = Value & ARM_GIC_ICCIAR_ACKINTID;
     }
-  } else if (Revision == ARM_GIC_ARCH_REVISION_3) {
+  } else if (mGicArchRevision == ARM_GIC_ARCH_REVISION_3) {
     Value = ArmGicV3AcknowledgeInterrupt ();
   } else {
     ASSERT_EFI_ERROR (EFI_UNSUPPORTED);
@@ -102,12 +101,9 @@ ArmGicEndOfInterrupt (
   IN UINTN                  Source
   )
 {
-  ARM_GIC_ARCH_REVISION Revision;
-
-  Revision = ArmGicGetSupportedArchRevision ();
-  if (Revision == ARM_GIC_ARCH_REVISION_2) {
+  if (mGicArchRevision == ARM_GIC_ARCH_REVISION_2) {
     ArmGicV2EndOfInterrupt (GicInterruptInterfaceBase, Source);
-  } else if (Revision == ARM_GIC_ARCH_REVISION_3) {
+  } else if (mGicArchRevision == ARM_GIC_ARCH_REVISION_3) {
     ArmGicV3EndOfInterrupt (Source);
   } else {
     ASSERT_EFI_ERROR (EFI_UNSUPPORTED);
@@ -183,12 +179,9 @@ ArmGicEnableInterruptInterface (
   IN  INTN          GicInterruptInterfaceBase
   )
 {
-  ARM_GIC_ARCH_REVISION Revision;
-
-  Revision = ArmGicGetSupportedArchRevision ();
-  if (Revision == ARM_GIC_ARCH_REVISION_2) {
+  if (mGicArchRevision == ARM_GIC_ARCH_REVISION_2) {
     ArmGicV2EnableInterruptInterface (GicInterruptInterfaceBase);
-  } else if (Revision == ARM_GIC_ARCH_REVISION_3) {
+  } else if (mGicArchRevision == ARM_GIC_ARCH_REVISION_3) {
     ArmGicV3EnableInterruptInterface ();
   } else {
     ASSERT_EFI_ERROR (EFI_UNSUPPORTED);
@@ -201,14 +194,23 @@ ArmGicDisableInterruptInterface (
   IN  INTN          GicInterruptInterfaceBase
   )
 {
-  ARM_GIC_ARCH_REVISION Revision;
-
-  Revision = ArmGicGetSupportedArchRevision ();
-  if (Revision == ARM_GIC_ARCH_REVISION_2) {
+  if (mGicArchRevision == ARM_GIC_ARCH_REVISION_2) {
     ArmGicV2DisableInterruptInterface (GicInterruptInterfaceBase);
-  } else if (Revision == ARM_GIC_ARCH_REVISION_3) {
+  } else if (mGicArchRevision == ARM_GIC_ARCH_REVISION_3) {
     ArmGicV3DisableInterruptInterface ();
   } else {
     ASSERT_EFI_ERROR (EFI_UNSUPPORTED);
   }
 }
+
+
+RETURN_STATUS
+EFIAPI
+ArmGicLibInitialize (
+  VOID
+  )
+{
+  mGicArchRevision = ArmGicGetSupportedArchRevision ();
+
+  return RETURN_SUCCESS;
+}
diff --git a/ArmPkg/Drivers/ArmGic/ArmGicLib.inf 
b/ArmPkg/Drivers/ArmGic/ArmGicLib.inf
index 81282b9b8299..ceeb95c53e98 100644
--- a/ArmPkg/Drivers/ArmGic/ArmGicLib.inf
+++ b/ArmPkg/Drivers/ArmGic/ArmGicLib.inf
@@ -18,6 +18,7 @@
   MODULE_TYPE                    = SEC
   VERSION_STRING                 = 1.0
   LIBRARY_CLASS                  = ArmGicLib
+  CONSTRUCTOR                    = ArmGicLibInitialize
 
 [Sources]
   ArmGicLib.c
-- 
1.8.3.2


------------------------------------------------------------------------------
Comprehensive Server Monitoring with Site24x7.
Monitor 10 servers for $9/Month.
Get alerted through email, SMS, voice calls or mobile push notifications.
Take corrective actions from your mobile device.
http://pubads.g.doubleclick.net/gampad/clk?id=154624111&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to