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