4 Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 // According to IA32 SDM, MTRRs number and msr offset are always consistent
20 // for IA32 processor family
24 // The semantics of below macro is MAX_MTRR_NUMBER_OF_VARIABLE_MTRR, the real number can be read out from MTRR_CAP register.
26 #define MTRR_NUMBER_OF_VARIABLE_MTRR 32
28 // Firmware need reserve 2 MTRR for OS
30 #define RESERVED_FIRMWARE_VARIABLE_MTRR_NUMBER 2
32 #define MTRR_NUMBER_OF_FIXED_MTRR 11
34 // Below macro is deprecated, and should not be used.
36 #define FIRMWARE_VARIABLE_MTRR_NUMBER 6
37 #define MTRR_LIB_IA32_MTRR_CAP 0x0FE
38 #define MTRR_LIB_IA32_MTRR_CAP_VCNT_MASK 0x0FF
39 #define MTRR_LIB_IA32_MTRR_FIX64K_00000 0x250
40 #define MTRR_LIB_IA32_MTRR_FIX16K_80000 0x258
41 #define MTRR_LIB_IA32_MTRR_FIX16K_A0000 0x259
42 #define MTRR_LIB_IA32_MTRR_FIX4K_C0000 0x268
43 #define MTRR_LIB_IA32_MTRR_FIX4K_C8000 0x269
44 #define MTRR_LIB_IA32_MTRR_FIX4K_D0000 0x26A
45 #define MTRR_LIB_IA32_MTRR_FIX4K_D8000 0x26B
46 #define MTRR_LIB_IA32_MTRR_FIX4K_E0000 0x26C
47 #define MTRR_LIB_IA32_MTRR_FIX4K_E8000 0x26D
48 #define MTRR_LIB_IA32_MTRR_FIX4K_F0000 0x26E
49 #define MTRR_LIB_IA32_MTRR_FIX4K_F8000 0x26F
50 #define MTRR_LIB_IA32_VARIABLE_MTRR_BASE 0x200
52 // Below macro is deprecated, and should not be used.
54 #define MTRR_LIB_IA32_VARIABLE_MTRR_END 0x20F
55 #define MTRR_LIB_IA32_MTRR_DEF_TYPE 0x2FF
56 #define MTRR_LIB_MSR_VALID_MASK 0xFFFFFFFFFULL
57 #define MTRR_LIB_CACHE_VALID_ADDRESS 0xFFFFFF000ULL
58 #define MTRR_LIB_CACHE_MTRR_ENABLED 0x800
59 #define MTRR_LIB_CACHE_FIXED_MTRR_ENABLED 0x400
62 // Structure to describe a fixed MTRR
71 // Structure to describe a variable MTRR
83 // Structure to hold base and mask pair for variable MTRR register
85 typedef struct _MTRR_VARIABLE_SETTING_
{
88 } MTRR_VARIABLE_SETTING
;
91 // Array for variable MTRRs
93 typedef struct _MTRR_VARIABLE_SETTINGS_
{
94 MTRR_VARIABLE_SETTING Mtrr
[MTRR_NUMBER_OF_VARIABLE_MTRR
];
95 } MTRR_VARIABLE_SETTINGS
;
98 // Array for fixed mtrrs
100 typedef struct _MTRR_FIXED_SETTINGS_
{
101 UINT64 Mtrr
[MTRR_NUMBER_OF_FIXED_MTRR
];
102 } MTRR_FIXED_SETTINGS
;
105 // Structure to hold all MTRRs
107 typedef struct _MTRR_SETTINGS_
{
108 MTRR_FIXED_SETTINGS Fixed
;
109 MTRR_VARIABLE_SETTINGS Variables
;
114 // Memory cache types
117 CacheUncacheable
= 0,
118 CacheWriteCombining
= 1,
119 CacheWriteThrough
= 4,
120 CacheWriteProtected
= 5,
122 } MTRR_MEMORY_CACHE_TYPE
;
124 #define MTRR_CACHE_UNCACHEABLE 0
125 #define MTRR_CACHE_WRITE_COMBINING 1
126 #define MTRR_CACHE_WRITE_THROUGH 4
127 #define MTRR_CACHE_WRITE_PROTECTED 5
128 #define MTRR_CACHE_WRITE_BACK 6
129 #define MTRR_CACHE_INVALID_TYPE 7
132 Returns the variable MTRR count for the CPU.
134 @return Variable MTRR count
139 GetVariableMtrrCount (
144 Returns the firmware usable variable MTRR count for the CPU.
146 @return Firmware usable variable MTRR count
151 GetFirmwareVariableMtrrCount (
156 This function attempts to set the attributes for a memory range.
158 @param BaseAddress The physical address that is the start address of a memory region.
159 @param Length The size in bytes of the memory region.
160 @param Attributes The bit mask of attributes to set for the memory region.
162 @retval RETURN_SUCCESS The attributes were set for the memory region.
163 @retval RETURN_INVALID_PARAMETER Length is zero.
164 @retval RETURN_UNSUPPORTED The processor does not support one or more bytes of the
165 memory resource range specified by BaseAddress and Length.
166 @retval RETURN_UNSUPPORTED The bit mask of attributes is not support for the memory resource
167 range specified by BaseAddress and Length.
168 @retval RETURN_ACCESS_DENIED The attributes for the memory resource range specified by
169 BaseAddress and Length cannot be modified.
170 @retval RETURN_OUT_OF_RESOURCES There are not enough system resources to modify the attributes of
171 the memory resource range.
176 MtrrSetMemoryAttribute (
177 IN PHYSICAL_ADDRESS BaseAddress
,
179 IN MTRR_MEMORY_CACHE_TYPE Attribute
184 This function will get the memory cache type of the specific address.
185 This function is mainly for debugging purposes.
187 @param Address The specific address
189 @return The memory cache type of the specific address
192 MTRR_MEMORY_CACHE_TYPE
194 MtrrGetMemoryAttribute (
195 IN PHYSICAL_ADDRESS Address
200 This function will get the raw value in variable MTRRs
202 @param VariableSettings A buffer to hold variable MTRRs content.
204 @return The buffer point to MTRR_VARIABLE_SETTINGS in which holds the content of the variable mtrr
207 MTRR_VARIABLE_SETTINGS
*
209 MtrrGetVariableMtrr (
210 OUT MTRR_VARIABLE_SETTINGS
*VariableSettings
215 This function sets fixed MTRRs
217 @param VariableSettings A buffer to hold variable MTRRs content.
219 @return The pointer of VariableSettings
222 MTRR_VARIABLE_SETTINGS
*
224 MtrrSetVariableMtrr (
225 IN MTRR_VARIABLE_SETTINGS
*VariableSettings
230 This function gets the content in fixed MTRRs
232 @param FixedSettings A buffer to hold fixed MTRRs content.
234 @return The pointer of FixedSettings
240 OUT MTRR_FIXED_SETTINGS
*FixedSettings
245 This function sets fixed MTRRs
247 @param FixedSettings A buffer holding fixed MTRRs content.
249 @return The pointer of FixedSettings
255 IN MTRR_FIXED_SETTINGS
*FixedSettings
260 This function gets the content in all MTRRs (variable and fixed)
262 @param MtrrSetting A buffer to hold all MTRRs content.
264 @return The pointer of MtrrSetting
270 OUT MTRR_SETTINGS
*MtrrSetting
275 This function sets all MTRRs (variable and fixed)
277 @param MtrrSetting A buffer to hold all MTRRs content.
279 @return The pointer of MtrrSetting
285 IN MTRR_SETTINGS
*MtrrSetting
290 Get the attribute of variable MTRRs.
292 This function shadows the content of variable MTRRs into
293 an internal array: VariableMtrr
295 @param MtrrValidBitsMask The mask for the valid bit of the MTRR
296 @param MtrrValidAddressMask The valid address mask for MTRR since the base address in
297 MTRR must align to 4K, so valid address mask equal to
298 MtrrValidBitsMask & 0xfffffffffffff000ULL
299 @param VariableMtrr The array to shadow variable MTRRs content
300 @return The ruturn value of this paramter indicates the number of
301 MTRRs which has been used.
305 MtrrGetMemoryAttributeInVariableMtrr (
306 IN UINT64 MtrrValidBitsMask
,
307 IN UINT64 MtrrValidAddressMask
,
308 OUT VARIABLE_MTRR
*VariableMtrr
313 This function prints all MTRRs for debugging.
317 MtrrDebugPrintAllMtrrs (
322 Checks if MTRR is supported.
324 @retval TRUE MTRR is supported.
325 @retval FALSE MTRR is not supported.
335 Returns the default MTRR cache type for the system.
337 @return The default MTRR cache type.
340 MTRR_MEMORY_CACHE_TYPE
342 MtrrGetDefaultMemoryType (
346 #endif // _MTRR_LIB_H_