summaryrefslogtreecommitdiffstats
path: root/UefiCpuPkg
diff options
context:
space:
mode:
authorRay Ni <ray.ni@intel.com>2022-09-29 12:02:56 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-10-09 08:22:02 +0000
commitbf03c4a52ae2dcf8690667aa798fa24b9c94d102 (patch)
tree8cfb85711c47d6210a19ad740d6388c8f8de1310 /UefiCpuPkg
parent4ddd8ac3a29d9c5974a19f36c1dc5896d813dc6e (diff)
downloadedk2-bf03c4a52ae2dcf8690667aa798fa24b9c94d102.tar.gz
edk2-bf03c4a52ae2dcf8690667aa798fa24b9c94d102.tar.bz2
edk2-bf03c4a52ae2dcf8690667aa798fa24b9c94d102.zip
UefiCpuPkg/MtrrLib: Add internal function MtrrLibIsMtrrSupported.
Add internal function MtrrLibIsMtrrSupported and update IsMtrrSupported to call the new internal function. Signed-off-by: Ray Ni <ray.ni@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
Diffstat (limited to 'UefiCpuPkg')
-rw-r--r--UefiCpuPkg/Library/MtrrLib/MtrrLib.c83
1 files 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.<BR>
+ Copyright (c) 2008 - 2023, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -141,6 +141,64 @@ MtrrDebugPrintAllMtrrsWorker (
);
/**
+ 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.
@return Variable MTRR count
@@ -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);
}
/**