From bf03c4a52ae2dcf8690667aa798fa24b9c94d102 Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Thu, 29 Sep 2022 12:02:56 +0800 Subject: UefiCpuPkg/MtrrLib: Add internal function MtrrLibIsMtrrSupported. Add internal function MtrrLibIsMtrrSupported and update IsMtrrSupported to call the new internal function. Signed-off-by: Ray Ni Cc: Eric Dong Cc: Rahul Kumar Cc: Gerd Hoffmann Reviewed-by: Eric Dong Reviewed-by: Ray Ni --- UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 83 ++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 23 deletions(-) diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c index 22ec8d2a48..bd61ffc240 100644 --- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c +++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c @@ -5,7 +5,7 @@ Most of services in this library instance are suggested to be invoked by BSP only, except for MtrrSetAllMtrrs() which is used to sync BSP's MTRR setting to APs. - Copyright (c) 2008 - 2020, Intel Corporation. All rights reserved.
+ Copyright (c) 2008 - 2023, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -140,6 +140,64 @@ MtrrDebugPrintAllMtrrsWorker ( IN MTRR_SETTINGS *MtrrSetting ); +/** + Return whether MTRR is supported. + + @param[out] FixedMtrrSupported Return whether fixed MTRR is supported. + @param[out] VariableMtrrCount Return the max number of variable MTRRs. + + @retval TRUE MTRR is supported when either fixed MTRR is supported or max number + of variable MTRRs is not 0. + @retval FALSE MTRR is not supported when both fixed MTRR is not supported and max + number of variable MTRRs is 0. +**/ +BOOLEAN +MtrrLibIsMtrrSupported ( + OUT BOOLEAN *FixedMtrrSupported OPTIONAL, + OUT UINT32 *VariableMtrrCount OPTIONAL + ) +{ + CPUID_VERSION_INFO_EDX Edx; + MSR_IA32_MTRRCAP_REGISTER MtrrCap; + + // + // Check CPUID(1).EDX[12] for MTRR capability + // + AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, NULL, &Edx.Uint32); + if (Edx.Bits.MTRR == 0) { + if (FixedMtrrSupported != NULL) { + *FixedMtrrSupported = FALSE; + } + + if (VariableMtrrCount != NULL) { + *VariableMtrrCount = 0; + } + + return FALSE; + } + + // + // Check the number of variable MTRRs and determine whether fixed MTRRs exist. + // If the count of variable MTRRs is zero and there are no fixed MTRRs, + // then return false + // + MtrrCap.Uint64 = AsmReadMsr64 (MSR_IA32_MTRRCAP); + ASSERT (MtrrCap.Bits.VCNT <= ARRAY_SIZE (((MTRR_VARIABLE_SETTINGS *)0)->Mtrr)); + if (FixedMtrrSupported != NULL) { + *FixedMtrrSupported = (BOOLEAN)(MtrrCap.Bits.FIX == 1); + } + + if (VariableMtrrCount != NULL) { + *VariableMtrrCount = MtrrCap.Bits.VCNT; + } + + if ((MtrrCap.Bits.VCNT == 0) && (MtrrCap.Bits.FIX == 0)) { + return FALSE; + } + + return TRUE; +} + /** Worker function returns the variable MTRR count for the CPU. @@ -2847,28 +2905,7 @@ IsMtrrSupported ( VOID ) { - CPUID_VERSION_INFO_EDX Edx; - MSR_IA32_MTRRCAP_REGISTER MtrrCap; - - // - // Check CPUID(1).EDX[12] for MTRR capability - // - AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, NULL, &Edx.Uint32); - if (Edx.Bits.MTRR == 0) { - return FALSE; - } - - // - // Check number of variable MTRRs and fixed MTRRs existence. - // If number of variable MTRRs is zero, or fixed MTRRs do not - // exist, return false. - // - MtrrCap.Uint64 = AsmReadMsr64 (MSR_IA32_MTRRCAP); - if ((MtrrCap.Bits.VCNT == 0) || (MtrrCap.Bits.FIX == 0)) { - return FALSE; - } - - return TRUE; + return MtrrLibIsMtrrSupported (NULL, NULL); } /** -- cgit v1.2.3