]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Include/Library/MtrrLib.h
UefiCpuPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / UefiCpuPkg / Include / Library / MtrrLib.h
index 36cd2cd6d574efcb9e24b9e38d05ad0cc4f20330..95ffbc8bf172a589a95d75e82dc679c9e568452d 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   MTRR setting library\r
 \r
-  Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -16,7 +10,7 @@
 #define  _MTRR_LIB_H_\r
 \r
 //\r
-// According to IA32 SDM, MTRRs number and msr offset are always consistent\r
+// According to IA32 SDM, MTRRs number and MSR offset are always consistent\r
 // for IA32 processor family\r
 //\r
 \r
 #define  RESERVED_FIRMWARE_VARIABLE_MTRR_NUMBER  2\r
 \r
 #define  MTRR_NUMBER_OF_FIXED_MTRR      11\r
-//\r
-// Below macro is deprecated, and should not be used.\r
-//\r
-#define  FIRMWARE_VARIABLE_MTRR_NUMBER  6\r
-#define  MTRR_LIB_IA32_MTRR_CAP                      0x0FE\r
-#define  MTRR_LIB_IA32_MTRR_CAP_VCNT_MASK            0x0FF\r
-#define  MTRR_LIB_IA32_MTRR_FIX64K_00000             0x250\r
-#define  MTRR_LIB_IA32_MTRR_FIX16K_80000             0x258\r
-#define  MTRR_LIB_IA32_MTRR_FIX16K_A0000             0x259\r
-#define  MTRR_LIB_IA32_MTRR_FIX4K_C0000              0x268\r
-#define  MTRR_LIB_IA32_MTRR_FIX4K_C8000              0x269\r
-#define  MTRR_LIB_IA32_MTRR_FIX4K_D0000              0x26A\r
-#define  MTRR_LIB_IA32_MTRR_FIX4K_D8000              0x26B\r
-#define  MTRR_LIB_IA32_MTRR_FIX4K_E0000              0x26C\r
-#define  MTRR_LIB_IA32_MTRR_FIX4K_E8000              0x26D\r
-#define  MTRR_LIB_IA32_MTRR_FIX4K_F0000              0x26E\r
-#define  MTRR_LIB_IA32_MTRR_FIX4K_F8000              0x26F\r
-#define  MTRR_LIB_IA32_VARIABLE_MTRR_BASE            0x200\r
-//\r
-// Below macro is deprecated, and should not be used.\r
-//\r
-#define  MTRR_LIB_IA32_VARIABLE_MTRR_END             0x20F\r
-#define  MTRR_LIB_IA32_MTRR_DEF_TYPE                 0x2FF\r
-#define  MTRR_LIB_MSR_VALID_MASK                     0xFFFFFFFFFULL\r
-#define  MTRR_LIB_CACHE_VALID_ADDRESS                0xFFFFFF000ULL\r
-#define  MTRR_LIB_CACHE_MTRR_ENABLED                 0x800\r
-#define  MTRR_LIB_CACHE_FIXED_MTRR_ENABLED           0x400\r
 \r
 //\r
 // Structure to describe a fixed MTRR\r
@@ -92,11 +59,11 @@ typedef struct _MTRR_VARIABLE_SETTING_ {
 // Array for variable MTRRs\r
 //\r
 typedef struct _MTRR_VARIABLE_SETTINGS_ {\r
-       MTRR_VARIABLE_SETTING   Mtrr[MTRR_NUMBER_OF_VARIABLE_MTRR];\r
-}      MTRR_VARIABLE_SETTINGS;\r
+  MTRR_VARIABLE_SETTING   Mtrr[MTRR_NUMBER_OF_VARIABLE_MTRR];\r
+} MTRR_VARIABLE_SETTINGS;\r
 \r
 //\r
-// Array for fixed mtrrs\r
+// Array for fixed MTRRs\r
 //\r
 typedef  struct  _MTRR_FIXED_SETTINGS_ {\r
   UINT64       Mtrr[MTRR_NUMBER_OF_FIXED_MTRR];\r
@@ -119,7 +86,8 @@ typedef enum {
   CacheWriteCombining = 1,\r
   CacheWriteThrough   = 4,\r
   CacheWriteProtected = 5,\r
-  CacheWriteBack      = 6\r
+  CacheWriteBack      = 6,\r
+  CacheInvalid        = 7\r
 } MTRR_MEMORY_CACHE_TYPE;\r
 \r
 #define  MTRR_CACHE_UNCACHEABLE      0\r
@@ -129,6 +97,12 @@ typedef enum {
 #define  MTRR_CACHE_WRITE_BACK       6\r
 #define  MTRR_CACHE_INVALID_TYPE     7\r
 \r
+typedef struct {\r
+  UINT64                 BaseAddress;\r
+  UINT64                 Length;\r
+  MTRR_MEMORY_CACHE_TYPE Type;\r
+} MTRR_MEMORY_RANGE;\r
+\r
 /**\r
   Returns the variable MTRR count for the CPU.\r
 \r
@@ -177,7 +151,14 @@ GetFirmwareVariableMtrrCount (
   @retval RETURN_OUT_OF_RESOURCES   There are not enough system resources to\r
                                     modify the attributes of the memory\r
                                     resource range.\r
-\r
+                                    Multiple memory range attributes setting by calling this API multiple\r
+                                    times may fail with status RETURN_OUT_OF_RESOURCES. It may not mean\r
+                                    the number of CPU MTRRs are too small to set such memory attributes.\r
+                                    Pass the multiple memory range attributes to one call of\r
+                                    MtrrSetMemoryAttributesInMtrrSettings() may succeed.\r
+  @retval RETURN_BUFFER_TOO_SMALL   The fixed internal scratch buffer is too small for MTRR calculation.\r
+                                    Caller should use MtrrSetMemoryAttributesInMtrrSettings() to specify\r
+                                    external scratch buffer.\r
 **/\r
 RETURN_STATUS\r
 EFIAPI\r
@@ -209,7 +190,7 @@ MtrrGetMemoryAttribute (
 \r
   @param[out]  VariableSettings   A buffer to hold variable MTRRs content.\r
 \r
-  @return The buffer point to MTRR_VARIABLE_SETTINGS in which holds the content of the variable mtrr\r
+  @return The buffer point to MTRR_VARIABLE_SETTINGS in which holds the content of the variable MTRR\r
 \r
 **/\r
 MTRR_VARIABLE_SETTINGS*\r
@@ -220,7 +201,7 @@ MtrrGetVariableMtrr (
 \r
 \r
 /**\r
-  This function sets fixed MTRRs\r
+  This function sets variable MTRRs\r
 \r
   @param[in]  VariableSettings   A buffer to hold variable MTRRs content.\r
 \r
@@ -306,7 +287,7 @@ MtrrSetAllMtrrs (
                                     MtrrValidBitsMask & 0xfffffffffffff000ULL\r
   @param[out]  VariableMtrr         The array to shadow variable MTRRs content\r
 \r
-  @return                       The ruturn value of this paramter indicates the number of\r
+  @return                       The return value of this parameter indicates the number of\r
                                 MTRRs which has been used.\r
 **/\r
 UINT32\r
@@ -372,7 +353,14 @@ MtrrGetDefaultMemoryType (
                                     BaseAddress and Length cannot be modified.\r
   @retval RETURN_OUT_OF_RESOURCES   There are not enough system resources to modify the attributes of\r
                                     the memory resource range.\r
-\r
+                                    Multiple memory range attributes setting by calling this API multiple\r
+                                    times may fail with status RETURN_OUT_OF_RESOURCES. It may not mean\r
+                                    the number of CPU MTRRs are too small to set such memory attributes.\r
+                                    Pass the multiple memory range attributes to one call of\r
+                                    MtrrSetMemoryAttributesInMtrrSettings() may succeed.\r
+  @retval RETURN_BUFFER_TOO_SMALL   The fixed internal scratch buffer is too small for MTRR calculation.\r
+                                    Caller should use MtrrSetMemoryAttributesInMtrrSettings() to specify\r
+                                    external scratch buffer.\r
 **/\r
 RETURN_STATUS\r
 EFIAPI\r
@@ -383,4 +371,39 @@ MtrrSetMemoryAttributeInMtrrSettings (
   IN MTRR_MEMORY_CACHE_TYPE  Attribute\r
   );\r
 \r
+/**\r
+  This function attempts to set the attributes into MTRR setting buffer for multiple memory ranges.\r
+\r
+  @param[in, out]  MtrrSetting  MTRR setting buffer to be set.\r
+  @param[in]       Scratch      A temporary scratch buffer that is used to perform the calculation.\r
+  @param[in, out]  ScratchSize  Pointer to the size in bytes of the scratch buffer.\r
+                                It may be updated to the actual required size when the calculation\r
+                                needs more scratch buffer.\r
+  @param[in]       Ranges       Pointer to an array of MTRR_MEMORY_RANGE.\r
+                                When range overlap happens, the last one takes higher priority.\r
+                                When the function returns, either all the attributes are set successfully,\r
+                                or none of them is set.\r
+  @param[in]      RangeCount    Count of MTRR_MEMORY_RANGE.\r
+\r
+  @retval RETURN_SUCCESS            The attributes were set for all the memory ranges.\r
+  @retval RETURN_INVALID_PARAMETER  Length in any range is zero.\r
+  @retval RETURN_UNSUPPORTED        The processor does not support one or more bytes of the\r
+                                    memory resource range specified by BaseAddress and Length in any range.\r
+  @retval RETURN_UNSUPPORTED        The bit mask of attributes is not support for the memory resource\r
+                                    range specified by BaseAddress and Length in any range.\r
+  @retval RETURN_OUT_OF_RESOURCES   There are not enough system resources to modify the attributes of\r
+                                    the memory resource ranges.\r
+  @retval RETURN_ACCESS_DENIED      The attributes for the memory resource range specified by\r
+                                    BaseAddress and Length cannot be modified.\r
+  @retval RETURN_BUFFER_TOO_SMALL   The scratch buffer is too small for MTRR calculation.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+MtrrSetMemoryAttributesInMtrrSettings (\r
+  IN OUT MTRR_SETTINGS           *MtrrSetting,\r
+  IN     VOID                    *Scratch,\r
+  IN OUT UINTN                   *ScratchSize,\r
+  IN     CONST MTRR_MEMORY_RANGE *Ranges,\r
+  IN     UINTN                   RangeCount\r
+  );\r
 #endif // _MTRR_LIB_H_\r