]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/BaseIoLibIntrinsic/IoLib.c
MdePkg: Support mmio for Tdx guest in BaseIoLibIntrinsic
[mirror_edk2.git] / MdePkg / Library / BaseIoLibIntrinsic / IoLib.c
CommitLineData
e1f414b6 1/** @file\r
2 Common I/O Library routines.\r
3\r
38c8be12 4 Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
9344f092 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
e1f414b6 6\r
e1f414b6 7**/\r
8\r
f734a10a 9#include "BaseIoLibIntrinsicInternal.h"\r
b6b2de88 10#include "IoLibTdx.h"\r
e1f414b6 11\r
12/**\r
13 Reads a 64-bit I/O port.\r
14\r
15 Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned.\r
16 This function must guarantee that all I/O read and write operations are\r
17 serialized.\r
18\r
19 If 64-bit I/O port operations are not supported, then ASSERT().\r
2281e7a9 20 If Port is not aligned on a 64-bit boundary, then ASSERT().\r
e1f414b6 21\r
22 @param Port The I/O port to read.\r
23\r
2281e7a9 24 @return The value read.\r
e1f414b6 25\r
26**/\r
27UINT64\r
28EFIAPI\r
29IoRead64 (\r
2f88bd3a 30 IN UINTN Port\r
e1f414b6 31 )\r
32{\r
33 ASSERT (FALSE);\r
34 return 0;\r
35}\r
36\r
37/**\r
38 Writes a 64-bit I/O port.\r
39\r
40 Writes the 64-bit I/O port specified by Port with the value specified by Value\r
41 and returns Value. This function must guarantee that all I/O read and write\r
42 operations are serialized.\r
43\r
44 If 64-bit I/O port operations are not supported, then ASSERT().\r
2281e7a9 45 If Port is not aligned on a 64-bit boundary, then ASSERT().\r
e1f414b6 46\r
47 @param Port The I/O port to write.\r
48 @param Value The value to write to the I/O port.\r
49\r
2281e7a9 50 @return The value written the I/O port.\r
e1f414b6 51\r
52**/\r
53UINT64\r
54EFIAPI\r
55IoWrite64 (\r
2f88bd3a
MK
56 IN UINTN Port,\r
57 IN UINT64 Value\r
e1f414b6 58 )\r
59{\r
60 ASSERT (FALSE);\r
61 return 0;\r
62}\r
63\r
9de780dc
LG
64/**\r
65 Reads an 8-bit MMIO register.\r
66\r
67 Reads the 8-bit MMIO register specified by Address. The 8-bit read value is\r
68 returned. This function must guarantee that all MMIO read and write\r
69 operations are serialized.\r
70\r
71 If 8-bit MMIO register operations are not supported, then ASSERT().\r
72\r
b6b2de88
MX
73 For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
74\r
9de780dc
LG
75 @param Address The MMIO register to read.\r
76\r
77 @return The value read.\r
78\r
79**/\r
80UINT8\r
81EFIAPI\r
82MmioRead8 (\r
2f88bd3a 83 IN UINTN Address\r
9de780dc
LG
84 )\r
85{\r
2f88bd3a
MK
86 UINT8 Value;\r
87 BOOLEAN Flag;\r
9de780dc 88\r
38c8be12
DB
89 Flag = FilterBeforeMmIoRead (FilterWidth8, Address, &Value);\r
90 if (Flag) {\r
91 MemoryFence ();\r
b6b2de88
MX
92\r
93 if (IsTdxGuest ()) {\r
94 Value = TdMmioRead8 (Address);\r
95 } else {\r
96 Value = *(volatile UINT8 *)Address;\r
97 }\r
98\r
38c8be12
DB
99 MemoryFence ();\r
100 }\r
2f88bd3a 101\r
38c8be12 102 FilterAfterMmIoRead (FilterWidth8, Address, &Value);\r
9de780dc
LG
103\r
104 return Value;\r
105}\r
106\r
107/**\r
108 Writes an 8-bit MMIO register.\r
109\r
110 Writes the 8-bit MMIO register specified by Address with the value specified\r
111 by Value and returns Value. This function must guarantee that all MMIO read\r
112 and write operations are serialized.\r
113\r
114 If 8-bit MMIO register operations are not supported, then ASSERT().\r
115\r
b6b2de88
MX
116 For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
117\r
9de780dc
LG
118 @param Address The MMIO register to write.\r
119 @param Value The value to write to the MMIO register.\r
9095d37b 120\r
9de780dc
LG
121 @return Value.\r
122\r
123**/\r
124UINT8\r
125EFIAPI\r
126MmioWrite8 (\r
2f88bd3a
MK
127 IN UINTN Address,\r
128 IN UINT8 Value\r
9de780dc
LG
129 )\r
130{\r
2f88bd3a 131 BOOLEAN Flag;\r
38c8be12
DB
132\r
133 Flag = FilterBeforeMmIoWrite (FilterWidth8, Address, &Value);\r
134 if (Flag) {\r
135 MemoryFence ();\r
b6b2de88
MX
136\r
137 if (IsTdxGuest ()) {\r
138 TdMmioWrite8 (Address, Value);\r
139 } else {\r
140 *(volatile UINT8 *)Address = Value;\r
141 }\r
142\r
38c8be12
DB
143 MemoryFence ();\r
144 }\r
2f88bd3a 145\r
38c8be12 146 FilterAfterMmIoWrite (FilterWidth8, Address, &Value);\r
9de780dc
LG
147\r
148 return Value;\r
149}\r
150\r
151/**\r
152 Reads a 16-bit MMIO register.\r
153\r
154 Reads the 16-bit MMIO register specified by Address. The 16-bit read value is\r
155 returned. This function must guarantee that all MMIO read and write\r
156 operations are serialized.\r
157\r
158 If 16-bit MMIO register operations are not supported, then ASSERT().\r
159 If Address is not aligned on a 16-bit boundary, then ASSERT().\r
160\r
b6b2de88
MX
161 For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
162\r
9de780dc
LG
163 @param Address The MMIO register to read.\r
164\r
165 @return The value read.\r
166\r
167**/\r
168UINT16\r
169EFIAPI\r
170MmioRead16 (\r
2f88bd3a 171 IN UINTN Address\r
9de780dc
LG
172 )\r
173{\r
2f88bd3a
MK
174 UINT16 Value;\r
175 BOOLEAN Flag;\r
9de780dc
LG
176\r
177 ASSERT ((Address & 1) == 0);\r
38c8be12
DB
178 Flag = FilterBeforeMmIoRead (FilterWidth16, Address, &Value);\r
179 if (Flag) {\r
180 MemoryFence ();\r
b6b2de88
MX
181\r
182 if (IsTdxGuest ()) {\r
183 Value = TdMmioRead16 (Address);\r
184 } else {\r
185 Value = *(volatile UINT16 *)Address;\r
186 }\r
187\r
38c8be12
DB
188 MemoryFence ();\r
189 }\r
2f88bd3a 190\r
38c8be12 191 FilterAfterMmIoRead (FilterWidth16, Address, &Value);\r
9de780dc
LG
192\r
193 return Value;\r
194}\r
195\r
196/**\r
197 Writes a 16-bit MMIO register.\r
198\r
199 Writes the 16-bit MMIO register specified by Address with the value specified\r
200 by Value and returns Value. This function must guarantee that all MMIO read\r
201 and write operations are serialized.\r
202\r
203 If 16-bit MMIO register operations are not supported, then ASSERT().\r
204 If Address is not aligned on a 16-bit boundary, then ASSERT().\r
205\r
b6b2de88
MX
206 For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
207\r
9de780dc
LG
208 @param Address The MMIO register to write.\r
209 @param Value The value to write to the MMIO register.\r
9095d37b 210\r
9de780dc
LG
211 @return Value.\r
212\r
213**/\r
214UINT16\r
215EFIAPI\r
216MmioWrite16 (\r
2f88bd3a
MK
217 IN UINTN Address,\r
218 IN UINT16 Value\r
9de780dc
LG
219 )\r
220{\r
2f88bd3a 221 BOOLEAN Flag;\r
38c8be12 222\r
9de780dc
LG
223 ASSERT ((Address & 1) == 0);\r
224\r
38c8be12
DB
225 Flag = FilterBeforeMmIoWrite (FilterWidth16, Address, &Value);\r
226 if (Flag) {\r
227 MemoryFence ();\r
b6b2de88
MX
228\r
229 if (IsTdxGuest ()) {\r
230 TdMmioWrite16 (Address, Value);\r
231 } else {\r
232 *(volatile UINT16 *)Address = Value;\r
233 }\r
234\r
38c8be12
DB
235 MemoryFence ();\r
236 }\r
2f88bd3a 237\r
38c8be12 238 FilterAfterMmIoWrite (FilterWidth16, Address, &Value);\r
9095d37b 239\r
9de780dc
LG
240 return Value;\r
241}\r
242\r
243/**\r
244 Reads a 32-bit MMIO register.\r
245\r
246 Reads the 32-bit MMIO register specified by Address. The 32-bit read value is\r
247 returned. This function must guarantee that all MMIO read and write\r
248 operations are serialized.\r
249\r
250 If 32-bit MMIO register operations are not supported, then ASSERT().\r
251 If Address is not aligned on a 32-bit boundary, then ASSERT().\r
252\r
b6b2de88
MX
253 For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
254\r
9de780dc
LG
255 @param Address The MMIO register to read.\r
256\r
257 @return The value read.\r
258\r
259**/\r
260UINT32\r
261EFIAPI\r
262MmioRead32 (\r
2f88bd3a 263 IN UINTN Address\r
9de780dc
LG
264 )\r
265{\r
2f88bd3a
MK
266 UINT32 Value;\r
267 BOOLEAN Flag;\r
9de780dc
LG
268\r
269 ASSERT ((Address & 3) == 0);\r
9095d37b 270\r
38c8be12
DB
271 Flag = FilterBeforeMmIoRead (FilterWidth32, Address, &Value);\r
272 if (Flag) {\r
273 MemoryFence ();\r
b6b2de88
MX
274\r
275 if (IsTdxGuest ()) {\r
276 Value = TdMmioRead32 (Address);\r
277 } else {\r
278 Value = *(volatile UINT32 *)Address;\r
279 }\r
280\r
38c8be12
DB
281 MemoryFence ();\r
282 }\r
2f88bd3a 283\r
38c8be12 284 FilterAfterMmIoRead (FilterWidth32, Address, &Value);\r
9095d37b 285\r
9de780dc
LG
286 return Value;\r
287}\r
288\r
289/**\r
290 Writes a 32-bit MMIO register.\r
291\r
292 Writes the 32-bit MMIO register specified by Address with the value specified\r
293 by Value and returns Value. This function must guarantee that all MMIO read\r
294 and write operations are serialized.\r
295\r
296 If 32-bit MMIO register operations are not supported, then ASSERT().\r
297 If Address is not aligned on a 32-bit boundary, then ASSERT().\r
298\r
b6b2de88
MX
299 For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
300\r
9de780dc
LG
301 @param Address The MMIO register to write.\r
302 @param Value The value to write to the MMIO register.\r
9095d37b 303\r
9de780dc
LG
304 @return Value.\r
305\r
306**/\r
307UINT32\r
308EFIAPI\r
309MmioWrite32 (\r
2f88bd3a
MK
310 IN UINTN Address,\r
311 IN UINT32 Value\r
9de780dc
LG
312 )\r
313{\r
2f88bd3a 314 BOOLEAN Flag;\r
38c8be12 315\r
9de780dc 316 ASSERT ((Address & 3) == 0);\r
9095d37b 317\r
38c8be12
DB
318 Flag = FilterBeforeMmIoWrite (FilterWidth32, Address, &Value);\r
319 if (Flag) {\r
320 MemoryFence ();\r
b6b2de88
MX
321\r
322 if (IsTdxGuest ()) {\r
323 TdMmioWrite32 (Address, Value);\r
324 } else {\r
325 *(volatile UINT32 *)Address = Value;\r
326 }\r
327\r
38c8be12
DB
328 MemoryFence ();\r
329 }\r
2f88bd3a 330\r
38c8be12 331 FilterAfterMmIoWrite (FilterWidth32, Address, &Value);\r
9095d37b 332\r
9de780dc
LG
333 return Value;\r
334}\r
335\r
336/**\r
337 Reads a 64-bit MMIO register.\r
338\r
339 Reads the 64-bit MMIO register specified by Address. The 64-bit read value is\r
340 returned. This function must guarantee that all MMIO read and write\r
341 operations are serialized.\r
342\r
343 If 64-bit MMIO register operations are not supported, then ASSERT().\r
344 If Address is not aligned on a 64-bit boundary, then ASSERT().\r
345\r
b6b2de88
MX
346 For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
347\r
9de780dc
LG
348 @param Address The MMIO register to read.\r
349\r
350 @return The value read.\r
351\r
352**/\r
353UINT64\r
354EFIAPI\r
355MmioRead64 (\r
2f88bd3a 356 IN UINTN Address\r
9de780dc
LG
357 )\r
358{\r
2f88bd3a
MK
359 UINT64 Value;\r
360 BOOLEAN Flag;\r
9de780dc
LG
361\r
362 ASSERT ((Address & 7) == 0);\r
9095d37b 363\r
38c8be12
DB
364 Flag = FilterBeforeMmIoRead (FilterWidth64, Address, &Value);\r
365 if (Flag) {\r
366 MemoryFence ();\r
b6b2de88
MX
367\r
368 if (IsTdxGuest ()) {\r
369 Value = TdMmioRead64 (Address);\r
370 } else {\r
371 Value = *(volatile UINT64 *)Address;\r
372 }\r
373\r
38c8be12
DB
374 MemoryFence ();\r
375 }\r
2f88bd3a 376\r
38c8be12 377 FilterAfterMmIoRead (FilterWidth64, Address, &Value);\r
9de780dc
LG
378\r
379 return Value;\r
380}\r
381\r
382/**\r
383 Writes a 64-bit MMIO register.\r
384\r
385 Writes the 64-bit MMIO register specified by Address with the value specified\r
386 by Value and returns Value. This function must guarantee that all MMIO read\r
387 and write operations are serialized.\r
388\r
389 If 64-bit MMIO register operations are not supported, then ASSERT().\r
390 If Address is not aligned on a 64-bit boundary, then ASSERT().\r
391\r
b6b2de88
MX
392 For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
393\r
9de780dc
LG
394 @param Address The MMIO register to write.\r
395 @param Value The value to write to the MMIO register.\r
396\r
397**/\r
398UINT64\r
399EFIAPI\r
400MmioWrite64 (\r
2f88bd3a
MK
401 IN UINTN Address,\r
402 IN UINT64 Value\r
9de780dc
LG
403 )\r
404{\r
2f88bd3a 405 BOOLEAN Flag;\r
38c8be12 406\r
9de780dc 407 ASSERT ((Address & 7) == 0);\r
9095d37b 408\r
38c8be12
DB
409 Flag = FilterBeforeMmIoWrite (FilterWidth64, Address, &Value);\r
410 if (Flag) {\r
411 MemoryFence ();\r
b6b2de88
MX
412\r
413 if (IsTdxGuest ()) {\r
414 TdMmioWrite64 (Address, Value);\r
415 } else {\r
416 *(volatile UINT64 *)Address = Value;\r
417 }\r
418\r
38c8be12
DB
419 MemoryFence ();\r
420 }\r
2f88bd3a 421\r
38c8be12 422 FilterAfterMmIoWrite (FilterWidth64, Address, &Value);\r
9095d37b 423\r
9de780dc
LG
424 return Value;\r
425}\r