REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the UefiCpuPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
		
			
				
	
	
		
			360 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			360 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   MTRR setting library
 | |
| 
 | |
|   Copyright (c) 2008 - 2020, 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 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 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_
 |