Instead of inferring the GIC revision from the CPU id registers
and the presence/availability of the system register interface
upon each invocation, move the logic to a constructor and cache
the result.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
---
 ArmPkg/Library/ArmGicArchLib/AArch64/ArmGicArchLib.c | 23 ++++++++++--
 ArmPkg/Library/ArmGicArchLib/Arm/ArmGicArchLib.c     | 23 ++++++++++--
 ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf       |  3 +-
 3 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/ArmPkg/Library/ArmGicArchLib/AArch64/ArmGicArchLib.c 
b/ArmPkg/Library/ArmGicArchLib/AArch64/ArmGicArchLib.c
index 0e0fa3b9f33e..9853c7ba8566 100644
--- a/ArmPkg/Library/ArmGicArchLib/AArch64/ArmGicArchLib.c
+++ b/ArmPkg/Library/ArmGicArchLib/AArch64/ArmGicArchLib.c
@@ -15,9 +15,11 @@
 #include <Library/ArmLib.h>
 #include <Library/ArmGicLib.h>
 
-ARM_GIC_ARCH_REVISION
+STATIC ARM_GIC_ARCH_REVISION        mGicArchRevision;
+
+RETURN_STATUS
 EFIAPI
-ArmGicGetSupportedArchRevision (
+ArmGicArchLibInitialize (
   VOID
   )
 {
@@ -43,9 +45,22 @@ ArmGicGetSupportedArchRevision (
       IccSre = ArmGicV3GetControlSystemRegisterEnable ();
     }
     if (IccSre & ICC_SRE_EL2_SRE) {
-      return ARM_GIC_ARCH_REVISION_3;
+      mGicArchRevision = ARM_GIC_ARCH_REVISION_3;
+      goto Done;
     }
   }
 
-  return ARM_GIC_ARCH_REVISION_2;
+  mGicArchRevision = ARM_GIC_ARCH_REVISION_2;
+
+Done:
+  return RETURN_SUCCESS;
+}
+
+ARM_GIC_ARCH_REVISION
+EFIAPI
+ArmGicGetSupportedArchRevision (
+  VOID
+  )
+{
+  return mGicArchRevision;
 }
diff --git a/ArmPkg/Library/ArmGicArchLib/Arm/ArmGicArchLib.c 
b/ArmPkg/Library/ArmGicArchLib/Arm/ArmGicArchLib.c
index f256de704631..f8822a224580 100644
--- a/ArmPkg/Library/ArmGicArchLib/Arm/ArmGicArchLib.c
+++ b/ArmPkg/Library/ArmGicArchLib/Arm/ArmGicArchLib.c
@@ -15,9 +15,11 @@
 #include <Library/ArmLib.h>
 #include <Library/ArmGicLib.h>
 
-ARM_GIC_ARCH_REVISION
+STATIC ARM_GIC_ARCH_REVISION        mGicArchRevision;
+
+RETURN_STATUS
 EFIAPI
-ArmGicGetSupportedArchRevision (
+ArmGicArchLibInitialize (
   VOID
   )
 {
@@ -43,9 +45,22 @@ ArmGicGetSupportedArchRevision (
       IccSre = ArmGicV3GetControlSystemRegisterEnable ();
     }
     if (IccSre & ICC_SRE_EL2_SRE) {
-      return ARM_GIC_ARCH_REVISION_3;
+      mGicArchRevision = ARM_GIC_ARCH_REVISION_3;
+      goto Done;
     }
   }
 
-  return ARM_GIC_ARCH_REVISION_2;
+  mGicArchRevision = ARM_GIC_ARCH_REVISION_2;
+
+Done:
+  return RETURN_SUCCESS;
+}
+
+ARM_GIC_ARCH_REVISION
+EFIAPI
+ArmGicGetSupportedArchRevision (
+  VOID
+  )
+{
+  return mGicArchRevision;
 }
diff --git a/ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf 
b/ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf
index d71b2adc3027..7dbcb08f50d6 100644
--- a/ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf
+++ b/ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf
@@ -17,7 +17,8 @@
   FILE_GUID                      = cd67f41a-26e9-4482-90c9-a9aff803382a
   MODULE_TYPE                    = BASE
   VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = ArmGicArchLib
+  LIBRARY_CLASS                  = ArmGicArchLib|DXE_DRIVER UEFI_DRIVER 
UEFI_APPLICATION
+  CONSTRUCTOR                    = ArmGicArchLibInitialize
 
 [Sources.ARM]
   Arm/ArmGicArchLib.c
-- 
1.9.1


------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to