mirror of https://github.com/acidanthera/audk.git
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>
This commit is contained in:
parent
4ddd8ac3a2
commit
bf03c4a52a
|
@ -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
|
||||
|
||||
**/
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue