]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Include/Library/MtrrLib.h
Add some security check.
[mirror_edk2.git] / UefiCpuPkg / Include / Library / MtrrLib.h
CommitLineData
e50466da 1/** @file\r
2 MTRR setting library\r
3\r
759f21f1 4 Copyright (c) 2008 - 2010, Intel Corporation\r
e50466da 5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#ifndef _MTRR_LIB_H_\r
16#define _MTRR_LIB_H_\r
17\r
18//\r
19// According to IA32 SDM, MTRRs number and msr offset are always consistent\r
20// for IA32 processor family\r
21//\r
22#define MTRR_NUMBER_OF_VARIABLE_MTRR 8\r
23#define MTRR_NUMBER_OF_FIXED_MTRR 11\r
24#define FIRMWARE_VARIABLE_MTRR_NUMBER 6\r
25#define MTRR_LIB_IA32_MTRR_FIX64K_00000 0x250\r
26#define MTRR_LIB_IA32_MTRR_FIX16K_80000 0x258\r
27#define MTRR_LIB_IA32_MTRR_FIX16K_A0000 0x259\r
28#define MTRR_LIB_IA32_MTRR_FIX4K_C0000 0x268\r
29#define MTRR_LIB_IA32_MTRR_FIX4K_C8000 0x269\r
30#define MTRR_LIB_IA32_MTRR_FIX4K_D0000 0x26A\r
31#define MTRR_LIB_IA32_MTRR_FIX4K_D8000 0x26B\r
32#define MTRR_LIB_IA32_MTRR_FIX4K_E0000 0x26C\r
33#define MTRR_LIB_IA32_MTRR_FIX4K_E8000 0x26D\r
34#define MTRR_LIB_IA32_MTRR_FIX4K_F0000 0x26E\r
35#define MTRR_LIB_IA32_MTRR_FIX4K_F8000 0x26F\r
36#define MTRR_LIB_IA32_VARIABLE_MTRR_BASE 0x200\r
37#define MTRR_LIB_IA32_VARIABLE_MTRR_END 0x20F\r
38#define MTRR_LIB_IA32_MTRR_DEF_TYPE 0x2FF\r
39#define MTRR_LIB_MSR_VALID_MASK 0xFFFFFFFFFULL\r
40#define MTRR_LIB_CACHE_VALID_ADDRESS 0xFFFFFF000ULL\r
41#define MTRR_LIB_CACHE_MTRR_ENABLED 0x800\r
42#define MTRR_LIB_CACHE_FIXED_MTRR_ENABLED 0x400\r
43\r
44//\r
45// Structure to describe a fixed MTRR\r
46//\r
47typedef struct {\r
48 UINT32 Msr;\r
49 UINT32 BaseAddress;\r
50 UINT32 Length;\r
51} FIXED_MTRR;\r
52\r
53//\r
54// Structure to describe a variable MTRR\r
55//\r
56typedef struct {\r
57 UINT64 BaseAddress;\r
58 UINT64 Length;\r
59 UINT64 Type;\r
60 UINT32 Msr;\r
61 BOOLEAN Valid;\r
62 BOOLEAN Used;\r
63} VARIABLE_MTRR;\r
64\r
65//\r
66// Structure to hold base and mask pair for variable MTRR register\r
67//\r
68typedef struct _MTRR_VARIABLE_SETTING_ {\r
69 UINT64 Base;\r
70 UINT64 Mask;\r
71} MTRR_VARIABLE_SETTING;\r
72\r
73//\r
74// Array for variable MTRRs\r
75//\r
76typedef struct _MTRR_VARIABLE_SETTINGS_ {\r
77 MTRR_VARIABLE_SETTING Mtrr[MTRR_NUMBER_OF_VARIABLE_MTRR];\r
78} MTRR_VARIABLE_SETTINGS;\r
79\r
80//\r
81// Array for fixed mtrrs\r
82//\r
83typedef struct _MTRR_FIXED_SETTINGS_ {\r
84 UINT64 Mtrr[MTRR_NUMBER_OF_FIXED_MTRR];\r
85} MTRR_FIXED_SETTINGS;\r
86\r
87//\r
88// Structure to hold all MTRRs\r
89//\r
90typedef struct _MTRR_SETTINGS_ {\r
91 MTRR_FIXED_SETTINGS Fixed;\r
92 MTRR_VARIABLE_SETTINGS Variables;\r
93 UINT64 MtrrDefType;\r
94} MTRR_SETTINGS;\r
95\r
96//\r
97// Memory cache types\r
98//\r
99typedef enum {\r
100 CacheUncacheable = 0,\r
101 CacheWriteCombining = 1,\r
102 CacheWriteThrough = 4,\r
103 CacheWriteProtected = 5,\r
104 CacheWriteBack = 6\r
105} MTRR_MEMORY_CACHE_TYPE;\r
106\r
107#define MTRR_CACHE_UNCACHEABLE 0\r
108#define MTRR_CACHE_WRITE_COMBINING 1\r
109#define MTRR_CACHE_WRITE_THROUGH 4\r
110#define MTRR_CACHE_WRITE_PROTECTED 5\r
111#define MTRR_CACHE_WRITE_BACK 6\r
112#define MTRR_CACHE_INVALID_TYPE 7\r
113\r
e50466da 114/**\r
115 This function attempts to set the attributes for a memory range.\r
116\r
117 @param BaseAddress The physical address that is the start address of a memory region.\r
118 @param Length The size in bytes of the memory region.\r
119 @param Attributes The bit mask of attributes to set for the memory region.\r
120\r
121 @retval RETURN_SUCCESS The attributes were set for the memory region.\r
122 @retval RETURN_INVALID_PARAMETER Length is zero.\r
123 @retval RETURN_UNSUPPORTED The processor does not support one or more bytes of the\r
124 memory resource range specified by BaseAddress and Length.\r
125 @retval RETURN_UNSUPPORTED The bit mask of attributes is not support for the memory resource\r
126 range specified by BaseAddress and Length.\r
127 @retval RETURN_ACCESS_DENIED The attributes for the memory resource range specified by\r
128 BaseAddress and Length cannot be modified.\r
129 @retval RETURN_OUT_OF_RESOURCES There are not enough system resources to modify the attributes of\r
130 the memory resource range.\r
131\r
132**/\r
133RETURN_STATUS\r
134EFIAPI\r
135MtrrSetMemoryAttribute (\r
136 IN PHYSICAL_ADDRESS BaseAddress,\r
137 IN UINT64 Length,\r
138 IN MTRR_MEMORY_CACHE_TYPE Attribute\r
139 );\r
140\r
141\r
142/**\r
143 This function will get the memory cache type of the specific address.\r
144 This function is mainly for debugging purposes.\r
145\r
146 @param Address The specific address\r
147\r
148 @return The memory cache type of the specific address\r
149\r
150**/\r
151MTRR_MEMORY_CACHE_TYPE\r
152EFIAPI\r
153MtrrGetMemoryAttribute (\r
154 IN PHYSICAL_ADDRESS Address\r
155 );\r
156\r
157\r
158/**\r
159 This function will get the raw value in variable MTRRs\r
160\r
161 @param VariableSettings A buffer to hold variable MTRRs content.\r
162\r
163 @return The buffer point to MTRR_VARIABLE_SETTINGS in which holds the content of the variable mtrr\r
164\r
165**/\r
166MTRR_VARIABLE_SETTINGS*\r
167EFIAPI\r
168MtrrGetVariableMtrr (\r
169 OUT MTRR_VARIABLE_SETTINGS *VariableSettings\r
170 );\r
171\r
172\r
173/**\r
174 This function sets fixed MTRRs\r
175\r
176 @param VariableSettings A buffer to hold variable MTRRs content.\r
177\r
178 @return The pointer of VariableSettings\r
179\r
180**/\r
181MTRR_VARIABLE_SETTINGS*\r
182EFIAPI\r
183MtrrSetVariableMtrr (\r
184 IN MTRR_VARIABLE_SETTINGS *VariableSettings\r
185 );\r
186\r
187\r
188/**\r
189 This function gets the content in fixed MTRRs\r
190\r
191 @param FixedSettings A buffer to hold fixed MTRRs content.\r
192\r
193 @return The pointer of FixedSettings\r
194\r
195**/\r
196MTRR_FIXED_SETTINGS*\r
197EFIAPI\r
198MtrrGetFixedMtrr (\r
199 OUT MTRR_FIXED_SETTINGS *FixedSettings\r
200 );\r
201\r
202\r
203/**\r
204 This function sets fixed MTRRs\r
205\r
206 @param FixedSettings A buffer holding fixed MTRRs content.\r
207\r
208 @return The pointer of FixedSettings\r
209\r
210**/\r
211MTRR_FIXED_SETTINGS*\r
212EFIAPI\r
213MtrrSetFixedMtrr (\r
214 IN MTRR_FIXED_SETTINGS *FixedSettings\r
215 );\r
216\r
217\r
218/**\r
219 This function gets the content in all MTRRs (variable and fixed)\r
220\r
221 @param MtrrSetting A buffer to hold all MTRRs content.\r
222\r
223 @return The pointer of MtrrSetting\r
224\r
225**/\r
226MTRR_SETTINGS *\r
227EFIAPI\r
228MtrrGetAllMtrrs (\r
229 OUT MTRR_SETTINGS *MtrrSetting\r
230 );\r
231\r
232\r
233/**\r
234 This function sets all MTRRs (variable and fixed)\r
235\r
236 @param MtrrSetting A buffer to hold all MTRRs content.\r
237\r
238 @return The pointer of MtrrSetting\r
239\r
240**/\r
241MTRR_SETTINGS *\r
242EFIAPI\r
243MtrrSetAllMtrrs (\r
244 IN MTRR_SETTINGS *MtrrSetting\r
245 );\r
246\r
247\r
248/**\r
249 Get the attribute of variable MTRRs.\r
250\r
251 This function shadows the content of variable MTRRs into\r
252 an internal array: VariableMtrr\r
253\r
254 @param MtrrValidBitsMask The mask for the valid bit of the MTRR\r
255 @param MtrrValidAddressMask The valid address mask for MTRR since the base address in\r
256 MTRR must align to 4K, so valid address mask equal to\r
257 MtrrValidBitsMask & 0xfffffffffffff000ULL\r
258 @param VariableMtrr The array to shadow variable MTRRs content\r
259 @return The ruturn value of this paramter indicates the number of\r
260 MTRRs which has been used.\r
261**/\r
262UINT32\r
263EFIAPI\r
264MtrrGetMemoryAttributeInVariableMtrr (\r
265 IN UINT64 MtrrValidBitsMask,\r
266 IN UINT64 MtrrValidAddressMask,\r
267 OUT VARIABLE_MTRR *VariableMtrr\r
268 );\r
269\r
270\r
271/**\r
272 This function prints all MTRRs for debugging.\r
273**/\r
274VOID\r
275MtrrDebugPrintAllMtrrs (\r
276 );\r
277\r
278#endif // _MTRR_LIB_H_\r