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,
|
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.
|
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
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
@ -140,6 +140,64 @@ MtrrDebugPrintAllMtrrsWorker (
|
||||||
IN MTRR_SETTINGS *MtrrSetting
|
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.
|
Worker function returns the variable MTRR count for the CPU.
|
||||||
|
|
||||||
|
@ -2847,28 +2905,7 @@ IsMtrrSupported (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CPUID_VERSION_INFO_EDX Edx;
|
return MtrrLibIsMtrrSupported (NULL, NULL);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue