UefiCpuPkg/MtrrLib: Reduce the loop time to get fixed-MTRR MSR index

Add input fixed-MTRR MSR index to be start MSR index to avoid finding fixed-MTRR
MSR index from 0 at each time.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
This commit is contained in:
Jeff Fan 2016-04-20 16:51:46 +08:00
parent 21cc5ebf36
commit 0f35412232
1 changed files with 8 additions and 6 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
MTRR setting library MTRR setting library
Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR> Copyright (c) 2008 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at which accompanies this distribution. The full text of the license may be found at
@ -438,7 +438,8 @@ MtrrGetVariableMtrr (
@param[in] MemoryCacheType The memory type to set. @param[in] MemoryCacheType The memory type to set.
@param[in, out] Base The base address of memory range. @param[in, out] Base The base address of memory range.
@param[in, out] Length The length of memory range. @param[in, out] Length The length of memory range.
@param[out] ReturnMsrNum The index of the fixed MTRR MSR to program. @param[in, out] LastMsrNum On input, the last index of the fixed MTRR MSR to program.
On return, the current index of the fixed MTRR MSR to program.
@param[out] ReturnClearMask The bits to clear in the fixed MTRR MSR. @param[out] ReturnClearMask The bits to clear in the fixed MTRR MSR.
@param[out] ReturnOrMask The bits to set in the fixed MTRR MSR. @param[out] ReturnOrMask The bits to set in the fixed MTRR MSR.
@ -452,7 +453,7 @@ ProgramFixedMtrr (
IN UINT64 MemoryCacheType, IN UINT64 MemoryCacheType,
IN OUT UINT64 *Base, IN OUT UINT64 *Base,
IN OUT UINT64 *Length, IN OUT UINT64 *Length,
OUT UINT32 *ReturnMsrNum, IN OUT UINT32 *LastMsrNum,
OUT UINT64 *ReturnClearMask, OUT UINT64 *ReturnClearMask,
OUT UINT64 *ReturnOrMask OUT UINT64 *ReturnOrMask
) )
@ -465,7 +466,7 @@ ProgramFixedMtrr (
OrMask = 0; OrMask = 0;
ClearMask = 0; ClearMask = 0;
for (MsrNum = 0; MsrNum < MTRR_NUMBER_OF_FIXED_MTRR; MsrNum++) { for (MsrNum = *LastMsrNum + 1; MsrNum < MTRR_NUMBER_OF_FIXED_MTRR; MsrNum++) {
if ((*Base >= mMtrrLibFixedMtrrTable[MsrNum].BaseAddress) && if ((*Base >= mMtrrLibFixedMtrrTable[MsrNum].BaseAddress) &&
(*Base < (*Base <
( (
@ -478,7 +479,7 @@ ProgramFixedMtrr (
} }
} }
if (MsrNum == MTRR_NUMBER_OF_FIXED_MTRR) { if (MsrNum >= MTRR_NUMBER_OF_FIXED_MTRR) {
return RETURN_UNSUPPORTED; return RETURN_UNSUPPORTED;
} }
@ -515,7 +516,7 @@ ProgramFixedMtrr (
return RETURN_UNSUPPORTED; return RETURN_UNSUPPORTED;
} }
*ReturnMsrNum = MsrNum; *LastMsrNum = MsrNum;
*ReturnClearMask = ClearMask; *ReturnClearMask = ClearMask;
*ReturnOrMask = OrMask; *ReturnOrMask = OrMask;
@ -1528,6 +1529,7 @@ MtrrSetMemoryAttributeWorker (
// //
Status = RETURN_SUCCESS; Status = RETURN_SUCCESS;
if (BaseAddress < BASE_1MB) { if (BaseAddress < BASE_1MB) {
MsrNum = (UINT32)-1;
while ((BaseAddress < BASE_1MB) && (Length > 0) && Status == RETURN_SUCCESS) { while ((BaseAddress < BASE_1MB) && (Length > 0) && Status == RETURN_SUCCESS) {
Status = ProgramFixedMtrr (MemoryType, &BaseAddress, &Length, &MsrNum, &ClearMask, &OrMask); Status = ProgramFixedMtrr (MemoryType, &BaseAddress, &Length, &MsrNum, &ClearMask, &OrMask);
if (RETURN_ERROR (Status)) { if (RETURN_ERROR (Status)) {