mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-02 13:03:28 +01:00
410 lines
13 KiB
C
410 lines
13 KiB
C
/** @file
|
|
MTRR setting library
|
|
|
|
Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#ifndef _MTRR_LIB_H_
|
|
#define _MTRR_LIB_H_
|
|
|
|
//
|
|
// According to IA32 SDM, MTRRs number and MSR offset are always consistent
|
|
// for IA32 processor family
|
|
//
|
|
|
|
//
|
|
// The semantics of below macro is MAX_MTRR_NUMBER_OF_VARIABLE_MTRR, the real number can be read out from MTRR_CAP register.
|
|
//
|
|
#define MTRR_NUMBER_OF_VARIABLE_MTRR 32
|
|
//
|
|
// Firmware need reserve 2 MTRR for OS
|
|
// Note: It is replaced by PCD PcdCpuNumberOfReservedVariableMtrrs
|
|
//
|
|
#define RESERVED_FIRMWARE_VARIABLE_MTRR_NUMBER 2
|
|
|
|
#define MTRR_NUMBER_OF_FIXED_MTRR 11
|
|
|
|
//
|
|
// Structure to describe a fixed MTRR
|
|
//
|
|
typedef struct {
|
|
UINT32 Msr;
|
|
UINT32 BaseAddress;
|
|
UINT32 Length;
|
|
} FIXED_MTRR;
|
|
|
|
//
|
|
// Structure to describe a variable MTRR
|
|
//
|
|
typedef struct {
|
|
UINT64 BaseAddress;
|
|
UINT64 Length;
|
|
UINT64 Type;
|
|
UINT32 Msr;
|
|
BOOLEAN Valid;
|
|
BOOLEAN Used;
|
|
} VARIABLE_MTRR;
|
|
|
|
//
|
|
// Structure to hold base and mask pair for variable MTRR register
|
|
//
|
|
typedef struct _MTRR_VARIABLE_SETTING_ {
|
|
UINT64 Base;
|
|
UINT64 Mask;
|
|
} MTRR_VARIABLE_SETTING;
|
|
|
|
//
|
|
// Array for variable MTRRs
|
|
//
|
|
typedef struct _MTRR_VARIABLE_SETTINGS_ {
|
|
MTRR_VARIABLE_SETTING Mtrr[MTRR_NUMBER_OF_VARIABLE_MTRR];
|
|
} MTRR_VARIABLE_SETTINGS;
|
|
|
|
//
|
|
// Array for fixed MTRRs
|
|
//
|
|
typedef struct _MTRR_FIXED_SETTINGS_ {
|
|
UINT64 Mtrr[MTRR_NUMBER_OF_FIXED_MTRR];
|
|
} MTRR_FIXED_SETTINGS;
|
|
|
|
//
|
|
// Structure to hold all MTRRs
|
|
//
|
|
typedef struct _MTRR_SETTINGS_ {
|
|
MTRR_FIXED_SETTINGS Fixed;
|
|
MTRR_VARIABLE_SETTINGS Variables;
|
|
UINT64 MtrrDefType;
|
|
} MTRR_SETTINGS;
|
|
|
|
//
|
|
// Memory cache types
|
|
//
|
|
typedef enum {
|
|
CacheUncacheable = 0,
|
|
CacheWriteCombining = 1,
|
|
CacheWriteThrough = 4,
|
|
CacheWriteProtected = 5,
|
|
CacheWriteBack = 6,
|
|
CacheInvalid = 7
|
|
} MTRR_MEMORY_CACHE_TYPE;
|
|
|
|
#define MTRR_CACHE_UNCACHEABLE 0
|
|
#define MTRR_CACHE_WRITE_COMBINING 1
|
|
#define MTRR_CACHE_WRITE_THROUGH 4
|
|
#define MTRR_CACHE_WRITE_PROTECTED 5
|
|
#define MTRR_CACHE_WRITE_BACK 6
|
|
#define MTRR_CACHE_INVALID_TYPE 7
|
|
|
|
typedef struct {
|
|
UINT64 BaseAddress;
|
|
UINT64 Length;
|
|
MTRR_MEMORY_CACHE_TYPE Type;
|
|
} MTRR_MEMORY_RANGE;
|
|
|
|
/**
|
|
Returns the variable MTRR count for the CPU.
|
|
|
|
@return Variable MTRR count
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
GetVariableMtrrCount (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Returns the firmware usable variable MTRR count for the CPU.
|
|
|
|
@return Firmware usable variable MTRR count
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
GetFirmwareVariableMtrrCount (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
This function attempts to set the attributes for a memory range.
|
|
|
|
@param[in] BaseAddress The physical address that is the start
|
|
address of a memory region.
|
|
@param[in] Length The size in bytes of the memory region.
|
|
@param[in] Attribute The bit mask of attributes to set for the
|
|
memory region.
|
|
|
|
@retval RETURN_SUCCESS The attributes were set for the memory
|
|
region.
|
|
@retval RETURN_INVALID_PARAMETER Length is zero.
|
|
@retval RETURN_UNSUPPORTED The processor does not support one or
|
|
more bytes of the memory resource range
|
|
specified by BaseAddress and Length.
|
|
@retval RETURN_UNSUPPORTED The bit mask of attributes is not support
|
|
for the memory resource range specified
|
|
by BaseAddress and Length.
|
|
@retval RETURN_ACCESS_DENIED The attributes for the memory resource
|
|
range specified by BaseAddress and Length
|
|
cannot be modified.
|
|
@retval RETURN_OUT_OF_RESOURCES There are not enough system resources to
|
|
modify the attributes of the memory
|
|
resource range.
|
|
Multiple memory range attributes setting by calling this API multiple
|
|
times may fail with status RETURN_OUT_OF_RESOURCES. It may not mean
|
|
the number of CPU MTRRs are too small to set such memory attributes.
|
|
Pass the multiple memory range attributes to one call of
|
|
MtrrSetMemoryAttributesInMtrrSettings() may succeed.
|
|
@retval RETURN_BUFFER_TOO_SMALL The fixed internal scratch buffer is too small for MTRR calculation.
|
|
Caller should use MtrrSetMemoryAttributesInMtrrSettings() to specify
|
|
external scratch buffer.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
MtrrSetMemoryAttribute (
|
|
IN PHYSICAL_ADDRESS BaseAddress,
|
|
IN UINT64 Length,
|
|
IN MTRR_MEMORY_CACHE_TYPE Attribute
|
|
);
|
|
|
|
|
|
/**
|
|
This function will get the memory cache type of the specific address.
|
|
This function is mainly for debugging purposes.
|
|
|
|
@param[in] Address The specific address
|
|
|
|
@return The memory cache type of the specific address
|
|
|
|
**/
|
|
MTRR_MEMORY_CACHE_TYPE
|
|
EFIAPI
|
|
MtrrGetMemoryAttribute (
|
|
IN PHYSICAL_ADDRESS Address
|
|
);
|
|
|
|
|
|
/**
|
|
This function will get the raw value in variable MTRRs
|
|
|
|
@param[out] VariableSettings A buffer to hold variable MTRRs content.
|
|
|
|
@return The buffer point to MTRR_VARIABLE_SETTINGS in which holds the content of the variable MTRR
|
|
|
|
**/
|
|
MTRR_VARIABLE_SETTINGS*
|
|
EFIAPI
|
|
MtrrGetVariableMtrr (
|
|
OUT MTRR_VARIABLE_SETTINGS *VariableSettings
|
|
);
|
|
|
|
|
|
/**
|
|
This function sets variable MTRRs
|
|
|
|
@param[in] VariableSettings A buffer to hold variable MTRRs content.
|
|
|
|
@return The pointer of VariableSettings
|
|
|
|
**/
|
|
MTRR_VARIABLE_SETTINGS*
|
|
EFIAPI
|
|
MtrrSetVariableMtrr (
|
|
IN MTRR_VARIABLE_SETTINGS *VariableSettings
|
|
);
|
|
|
|
|
|
/**
|
|
This function gets the content in fixed MTRRs
|
|
|
|
@param[out] FixedSettings A buffer to hold fixed MTRRs content.
|
|
|
|
@return The pointer of FixedSettings
|
|
|
|
**/
|
|
MTRR_FIXED_SETTINGS*
|
|
EFIAPI
|
|
MtrrGetFixedMtrr (
|
|
OUT MTRR_FIXED_SETTINGS *FixedSettings
|
|
);
|
|
|
|
|
|
/**
|
|
This function sets fixed MTRRs
|
|
|
|
@param[in] FixedSettings A buffer holding fixed MTRRs content.
|
|
|
|
@return The pointer of FixedSettings
|
|
|
|
**/
|
|
MTRR_FIXED_SETTINGS*
|
|
EFIAPI
|
|
MtrrSetFixedMtrr (
|
|
IN MTRR_FIXED_SETTINGS *FixedSettings
|
|
);
|
|
|
|
|
|
/**
|
|
This function gets the content in all MTRRs (variable and fixed)
|
|
|
|
@param[out] MtrrSetting A buffer to hold all MTRRs content.
|
|
|
|
@return The pointer of MtrrSetting
|
|
|
|
**/
|
|
MTRR_SETTINGS *
|
|
EFIAPI
|
|
MtrrGetAllMtrrs (
|
|
OUT MTRR_SETTINGS *MtrrSetting
|
|
);
|
|
|
|
|
|
/**
|
|
This function sets all MTRRs (variable and fixed)
|
|
|
|
@param[in] MtrrSetting A buffer to hold all MTRRs content.
|
|
|
|
@return The pointer of MtrrSetting
|
|
|
|
**/
|
|
MTRR_SETTINGS *
|
|
EFIAPI
|
|
MtrrSetAllMtrrs (
|
|
IN MTRR_SETTINGS *MtrrSetting
|
|
);
|
|
|
|
|
|
/**
|
|
Get the attribute of variable MTRRs.
|
|
|
|
This function shadows the content of variable MTRRs into
|
|
an internal array: VariableMtrr
|
|
|
|
@param[in] MtrrValidBitsMask The mask for the valid bit of the MTRR
|
|
@param[in] MtrrValidAddressMask The valid address mask for MTRR since the base address in
|
|
MTRR must align to 4K, so valid address mask equal to
|
|
MtrrValidBitsMask & 0xfffffffffffff000ULL
|
|
@param[out] VariableMtrr The array to shadow variable MTRRs content
|
|
|
|
@return The return value of this parameter indicates the number of
|
|
MTRRs which has been used.
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
MtrrGetMemoryAttributeInVariableMtrr (
|
|
IN UINT64 MtrrValidBitsMask,
|
|
IN UINT64 MtrrValidAddressMask,
|
|
OUT VARIABLE_MTRR *VariableMtrr
|
|
);
|
|
|
|
|
|
/**
|
|
This function prints all MTRRs for debugging.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
MtrrDebugPrintAllMtrrs (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Checks if MTRR is supported.
|
|
|
|
@retval TRUE MTRR is supported.
|
|
@retval FALSE MTRR is not supported.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
IsMtrrSupported (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Returns the default MTRR cache type for the system.
|
|
|
|
@return The default MTRR cache type.
|
|
|
|
**/
|
|
MTRR_MEMORY_CACHE_TYPE
|
|
EFIAPI
|
|
MtrrGetDefaultMemoryType (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
This function attempts to set the attributes into MTRR setting buffer for a memory range.
|
|
|
|
@param[in, out] MtrrSetting MTRR setting buffer to be set.
|
|
@param[in] BaseAddress The physical address that is the start address
|
|
of a memory region.
|
|
@param[in] Length The size in bytes of the memory region.
|
|
@param[in] Attribute The bit mask of attributes to set for the
|
|
memory region.
|
|
|
|
@retval RETURN_SUCCESS The attributes were set for the memory region.
|
|
@retval RETURN_INVALID_PARAMETER Length is zero.
|
|
@retval RETURN_UNSUPPORTED The processor does not support one or more bytes of the
|
|
memory resource range specified by BaseAddress and Length.
|
|
@retval RETURN_UNSUPPORTED The bit mask of attributes is not support for the memory resource
|
|
range specified by BaseAddress and Length.
|
|
@retval RETURN_ACCESS_DENIED The attributes for the memory resource range specified by
|
|
BaseAddress and Length cannot be modified.
|
|
@retval RETURN_OUT_OF_RESOURCES There are not enough system resources to modify the attributes of
|
|
the memory resource range.
|
|
Multiple memory range attributes setting by calling this API multiple
|
|
times may fail with status RETURN_OUT_OF_RESOURCES. It may not mean
|
|
the number of CPU MTRRs are too small to set such memory attributes.
|
|
Pass the multiple memory range attributes to one call of
|
|
MtrrSetMemoryAttributesInMtrrSettings() may succeed.
|
|
@retval RETURN_BUFFER_TOO_SMALL The fixed internal scratch buffer is too small for MTRR calculation.
|
|
Caller should use MtrrSetMemoryAttributesInMtrrSettings() to specify
|
|
external scratch buffer.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
MtrrSetMemoryAttributeInMtrrSettings (
|
|
IN OUT MTRR_SETTINGS *MtrrSetting,
|
|
IN PHYSICAL_ADDRESS BaseAddress,
|
|
IN UINT64 Length,
|
|
IN MTRR_MEMORY_CACHE_TYPE Attribute
|
|
);
|
|
|
|
/**
|
|
This function attempts to set the attributes into MTRR setting buffer for multiple memory ranges.
|
|
|
|
@param[in, out] MtrrSetting MTRR setting buffer to be set.
|
|
@param[in] Scratch A temporary scratch buffer that is used to perform the calculation.
|
|
@param[in, out] ScratchSize Pointer to the size in bytes of the scratch buffer.
|
|
It may be updated to the actual required size when the calculation
|
|
needs more scratch buffer.
|
|
@param[in] Ranges Pointer to an array of MTRR_MEMORY_RANGE.
|
|
When range overlap happens, the last one takes higher priority.
|
|
When the function returns, either all the attributes are set successfully,
|
|
or none of them is set.
|
|
@param[in] RangeCount Count of MTRR_MEMORY_RANGE.
|
|
|
|
@retval RETURN_SUCCESS The attributes were set for all the memory ranges.
|
|
@retval RETURN_INVALID_PARAMETER Length in any range is zero.
|
|
@retval RETURN_UNSUPPORTED The processor does not support one or more bytes of the
|
|
memory resource range specified by BaseAddress and Length in any range.
|
|
@retval RETURN_UNSUPPORTED The bit mask of attributes is not support for the memory resource
|
|
range specified by BaseAddress and Length in any range.
|
|
@retval RETURN_OUT_OF_RESOURCES There are not enough system resources to modify the attributes of
|
|
the memory resource ranges.
|
|
@retval RETURN_ACCESS_DENIED The attributes for the memory resource range specified by
|
|
BaseAddress and Length cannot be modified.
|
|
@retval RETURN_BUFFER_TOO_SMALL The scratch buffer is too small for MTRR calculation.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
MtrrSetMemoryAttributesInMtrrSettings (
|
|
IN OUT MTRR_SETTINGS *MtrrSetting,
|
|
IN VOID *Scratch,
|
|
IN OUT UINTN *ScratchSize,
|
|
IN CONST MTRR_MEMORY_RANGE *Ranges,
|
|
IN UINTN RangeCount
|
|
);
|
|
#endif // _MTRR_LIB_H_
|