]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/PeiIoLibCpuIo/IoLibMmioBuffer.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdePkg / Library / PeiIoLibCpuIo / IoLibMmioBuffer.c
CommitLineData
11f43dfd 1/** @file\r
2 I/O Library MMIO Buffer Functions.\r
4ca0802e 3 The implementations are based on EFI_PEI_SERVICE->CpuIo interface.\r
11f43dfd 4\r
9095d37b 5 Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
9344f092 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
11f43dfd 7\r
8**/\r
9\r
11f43dfd 10#include <PiPei.h>\r
c892d846 11\r
11f43dfd 12#include <Library/IoLib.h>\r
13#include <Library/DebugLib.h>\r
14#include <Library/BaseLib.h>\r
15#include <Library/PeiServicesTablePointerLib.h>\r
16\r
17/**\r
18 Copy data from MMIO region to system memory by using 8-bit access.\r
19\r
9095d37b
LG
20 Copy data from MMIO region specified by starting address StartAddress\r
21 to system memory specified by Buffer by using 8-bit access. The total\r
11f43dfd 22 number of byte to be copied is specified by Length. Buffer is returned.\r
9095d37b
LG
23\r
24 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().\r
11f43dfd 25 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
26\r
27\r
2fc59a00 28 @param StartAddress The starting address for the MMIO region to be copied from.\r
80f0c0c4 29 @param Length The size, in bytes, of Buffer.\r
2fc59a00 30 @param Buffer The pointer to a system memory buffer receiving the data read.\r
11f43dfd 31\r
80f0c0c4 32 @return Buffer\r
11f43dfd 33\r
34**/\r
35UINT8 *\r
36EFIAPI\r
37MmioReadBuffer8 (\r
2f88bd3a
MK
38 IN UINTN StartAddress,\r
39 IN UINTN Length,\r
40 OUT UINT8 *Buffer\r
11f43dfd 41 )\r
42{\r
2f88bd3a 43 UINT8 *ReturnBuffer;\r
11f43dfd 44\r
45 ASSERT ((Length - 1) <= (MAX_ADDRESS - StartAddress));\r
2f88bd3a 46 ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));\r
9095d37b 47\r
11f43dfd 48 ReturnBuffer = Buffer;\r
9095d37b 49\r
42eedea9 50 while (Length-- != 0) {\r
11f43dfd 51 *(Buffer++) = MmioRead8 (StartAddress++);\r
52 }\r
53\r
54 return ReturnBuffer;\r
55}\r
56\r
57/**\r
58 Copy data from MMIO region to system memory by using 16-bit access.\r
59\r
9095d37b
LG
60 Copy data from MMIO region specified by starting address StartAddress\r
61 to system memory specified by Buffer by using 16-bit access. The total\r
11f43dfd 62 number of byte to be copied is specified by Length. Buffer is returned.\r
9095d37b 63\r
11f43dfd 64 If StartAddress is not aligned on a 16-bit boundary, then ASSERT().\r
65\r
9095d37b 66 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().\r
11f43dfd 67 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
68\r
69 If Length is not aligned on a 16-bit boundary, then ASSERT().\r
70 If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
71\r
2fc59a00 72 @param StartAddress The starting address for the MMIO region to be copied from.\r
80f0c0c4 73 @param Length The size, in bytes, of Buffer.\r
2fc59a00 74 @param Buffer The pointer to a system memory buffer receiving the data read.\r
11f43dfd 75\r
80f0c0c4 76 @return Buffer\r
11f43dfd 77\r
78**/\r
79UINT16 *\r
80EFIAPI\r
81MmioReadBuffer16 (\r
2f88bd3a
MK
82 IN UINTN StartAddress,\r
83 IN UINTN Length,\r
84 OUT UINT16 *Buffer\r
11f43dfd 85 )\r
86{\r
2f88bd3a 87 UINT16 *ReturnBuffer;\r
11f43dfd 88\r
89 ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
9095d37b 90\r
11f43dfd 91 ASSERT ((Length - 1) <= (MAX_ADDRESS - StartAddress));\r
2f88bd3a 92 ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));\r
11f43dfd 93\r
94 ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
2f88bd3a 95 ASSERT (((UINTN)Buffer & (sizeof (UINT16) - 1)) == 0);\r
9095d37b 96\r
11f43dfd 97 ReturnBuffer = Buffer;\r
9095d37b 98\r
42eedea9 99 while (Length != 0) {\r
2f88bd3a 100 *(Buffer++) = MmioRead16 (StartAddress);\r
11f43dfd 101 StartAddress += sizeof (UINT16);\r
2f88bd3a 102 Length -= sizeof (UINT16);\r
11f43dfd 103 }\r
104\r
105 return ReturnBuffer;\r
106}\r
107\r
108/**\r
109 Copy data from MMIO region to system memory by using 32-bit access.\r
110\r
9095d37b
LG
111 Copy data from MMIO region specified by starting address StartAddress\r
112 to system memory specified by Buffer by using 32-bit access. The total\r
11f43dfd 113 number of byte to be copied is specified by Length. Buffer is returned.\r
9095d37b 114\r
11f43dfd 115 If StartAddress is not aligned on a 32-bit boundary, then ASSERT().\r
116\r
9095d37b 117 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().\r
11f43dfd 118 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
119\r
120 If Length is not aligned on a 32-bit boundary, then ASSERT().\r
121 If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
122\r
2fc59a00 123 @param StartAddress The starting address for the MMIO region to be copied from.\r
80f0c0c4 124 @param Length The size, in bytes, of Buffer.\r
2fc59a00 125 @param Buffer The pointer to a system memory buffer receiving the data read.\r
11f43dfd 126\r
80f0c0c4 127 @return Buffer\r
11f43dfd 128\r
129**/\r
130UINT32 *\r
131EFIAPI\r
132MmioReadBuffer32 (\r
2f88bd3a
MK
133 IN UINTN StartAddress,\r
134 IN UINTN Length,\r
135 OUT UINT32 *Buffer\r
11f43dfd 136 )\r
137{\r
2f88bd3a 138 UINT32 *ReturnBuffer;\r
11f43dfd 139\r
140 ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
9095d37b 141\r
11f43dfd 142 ASSERT ((Length - 1) <= (MAX_ADDRESS - StartAddress));\r
2f88bd3a 143 ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));\r
11f43dfd 144\r
145 ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
2f88bd3a 146 ASSERT (((UINTN)Buffer & (sizeof (UINT32) - 1)) == 0);\r
9095d37b 147\r
11f43dfd 148 ReturnBuffer = Buffer;\r
9095d37b 149\r
42eedea9 150 while (Length != 0) {\r
2f88bd3a 151 *(Buffer++) = MmioRead32 (StartAddress);\r
11f43dfd 152 StartAddress += sizeof (UINT32);\r
2f88bd3a 153 Length -= sizeof (UINT32);\r
11f43dfd 154 }\r
155\r
156 return ReturnBuffer;\r
157}\r
158\r
159/**\r
160 Copy data from MMIO region to system memory by using 64-bit access.\r
161\r
9095d37b
LG
162 Copy data from MMIO region specified by starting address StartAddress\r
163 to system memory specified by Buffer by using 64-bit access. The total\r
11f43dfd 164 number of byte to be copied is specified by Length. Buffer is returned.\r
9095d37b 165\r
11f43dfd 166 If StartAddress is not aligned on a 64-bit boundary, then ASSERT().\r
167\r
9095d37b 168 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().\r
11f43dfd 169 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
170\r
171 If Length is not aligned on a 64-bit boundary, then ASSERT().\r
172 If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
173\r
2fc59a00 174 @param StartAddress The starting address for the MMIO region to be copied from.\r
80f0c0c4 175 @param Length The size, in bytes, of Buffer.\r
2fc59a00 176 @param Buffer The pointer to a system memory buffer receiving the data read.\r
11f43dfd 177\r
80f0c0c4 178 @return Buffer\r
11f43dfd 179\r
180**/\r
181UINT64 *\r
182EFIAPI\r
183MmioReadBuffer64 (\r
2f88bd3a
MK
184 IN UINTN StartAddress,\r
185 IN UINTN Length,\r
186 OUT UINT64 *Buffer\r
11f43dfd 187 )\r
188{\r
2f88bd3a 189 UINT64 *ReturnBuffer;\r
11f43dfd 190\r
191 ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
9095d37b 192\r
11f43dfd 193 ASSERT ((Length - 1) <= (MAX_ADDRESS - StartAddress));\r
2f88bd3a 194 ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));\r
11f43dfd 195\r
196 ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
2f88bd3a 197 ASSERT (((UINTN)Buffer & (sizeof (UINT64) - 1)) == 0);\r
9095d37b 198\r
11f43dfd 199 ReturnBuffer = Buffer;\r
9095d37b 200\r
42eedea9 201 while (Length != 0) {\r
2f88bd3a 202 *(Buffer++) = MmioRead64 (StartAddress);\r
11f43dfd 203 StartAddress += sizeof (UINT64);\r
2f88bd3a 204 Length -= sizeof (UINT64);\r
11f43dfd 205 }\r
206\r
207 return ReturnBuffer;\r
208}\r
209\r
11f43dfd 210/**\r
211 Copy data from system memory to MMIO region by using 8-bit access.\r
212\r
9095d37b
LG
213 Copy data from system memory specified by Buffer to MMIO region specified\r
214 by starting address StartAddress by using 8-bit access. The total number\r
11f43dfd 215 of byte to be copied is specified by Length. Buffer is returned.\r
9095d37b
LG
216\r
217 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().\r
11f43dfd 218 If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
219\r
220\r
2fc59a00 221 @param StartAddress The starting address for the MMIO region to be copied to.\r
80f0c0c4 222 @param Length The size, in bytes, of Buffer.\r
2fc59a00 223 @param Buffer The pointer to a system memory buffer containing the data to write.\r
11f43dfd 224\r
3222ffc0 225 @return Buffer\r
11f43dfd 226\r
227**/\r
228UINT8 *\r
229EFIAPI\r
230MmioWriteBuffer8 (\r
2f88bd3a
MK
231 IN UINTN StartAddress,\r
232 IN UINTN Length,\r
233 IN CONST UINT8 *Buffer\r
11f43dfd 234 )\r
235{\r
2f88bd3a 236 VOID *ReturnBuffer;\r
11f43dfd 237\r
238 ASSERT ((Length - 1) <= (MAX_ADDRESS - StartAddress));\r
2f88bd3a 239 ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));\r
9095d37b 240\r
2f88bd3a 241 ReturnBuffer = (UINT8 *)Buffer;\r
9095d37b 242\r
42eedea9 243 while (Length-- != 0) {\r
2f88bd3a 244 MmioWrite8 (StartAddress++, *(Buffer++));\r
11f43dfd 245 }\r
246\r
247 return ReturnBuffer;\r
11f43dfd 248}\r
249\r
250/**\r
251 Copy data from system memory to MMIO region by using 16-bit access.\r
252\r
9095d37b
LG
253 Copy data from system memory specified by Buffer to MMIO region specified\r
254 by starting address StartAddress by using 16-bit access. The total number\r
3222ffc0 255 of byte to be copied is specified by Length. Buffer is returned.\r
9095d37b 256\r
11f43dfd 257 If StartAddress is not aligned on a 16-bit boundary, then ASSERT().\r
258\r
9095d37b 259 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().\r
11f43dfd 260 If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
261\r
262 If Length is not aligned on a 16-bit boundary, then ASSERT().\r
263\r
264 If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
265\r
2fc59a00 266 @param StartAddress The starting address for the MMIO region to be copied to.\r
80f0c0c4 267 @param Length The size, in bytes, of Buffer.\r
2fc59a00 268 @param Buffer The pointer to a system memory buffer containing the data to write.\r
11f43dfd 269\r
3222ffc0 270 @return Buffer\r
11f43dfd 271\r
272**/\r
273UINT16 *\r
274EFIAPI\r
275MmioWriteBuffer16 (\r
2f88bd3a
MK
276 IN UINTN StartAddress,\r
277 IN UINTN Length,\r
278 IN CONST UINT16 *Buffer\r
11f43dfd 279 )\r
280{\r
2f88bd3a 281 UINT16 *ReturnBuffer;\r
11f43dfd 282\r
283 ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
9095d37b 284\r
11f43dfd 285 ASSERT ((Length - 1) <= (MAX_ADDRESS - StartAddress));\r
2f88bd3a 286 ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));\r
11f43dfd 287\r
288 ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
2f88bd3a 289 ASSERT (((UINTN)Buffer & (sizeof (UINT16) - 1)) == 0);\r
11f43dfd 290\r
2f88bd3a 291 ReturnBuffer = (UINT16 *)Buffer;\r
9095d37b 292\r
42eedea9 293 while (Length != 0) {\r
11f43dfd 294 MmioWrite16 (StartAddress, *(Buffer++));\r
9095d37b 295\r
11f43dfd 296 StartAddress += sizeof (UINT16);\r
2f88bd3a 297 Length -= sizeof (UINT16);\r
11f43dfd 298 }\r
299\r
300 return ReturnBuffer;\r
301}\r
302\r
11f43dfd 303/**\r
304 Copy data from system memory to MMIO region by using 32-bit access.\r
305\r
9095d37b
LG
306 Copy data from system memory specified by Buffer to MMIO region specified\r
307 by starting address StartAddress by using 32-bit access. The total number\r
3222ffc0 308 of byte to be copied is specified by Length. Buffer is returned.\r
9095d37b 309\r
11f43dfd 310 If StartAddress is not aligned on a 32-bit boundary, then ASSERT().\r
311\r
9095d37b 312 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().\r
11f43dfd 313 If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
314\r
315 If Length is not aligned on a 32-bit boundary, then ASSERT().\r
316\r
317 If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
318\r
2fc59a00 319 @param StartAddress The starting address for the MMIO region to be copied to.\r
80f0c0c4 320 @param Length The size, in bytes, of Buffer.\r
2fc59a00 321 @param Buffer The pointer to a system memory buffer containing the data to write.\r
11f43dfd 322\r
3222ffc0 323 @return Buffer\r
11f43dfd 324\r
325**/\r
326UINT32 *\r
327EFIAPI\r
328MmioWriteBuffer32 (\r
2f88bd3a
MK
329 IN UINTN StartAddress,\r
330 IN UINTN Length,\r
331 IN CONST UINT32 *Buffer\r
11f43dfd 332 )\r
333{\r
2f88bd3a 334 UINT32 *ReturnBuffer;\r
11f43dfd 335\r
336 ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
9095d37b 337\r
11f43dfd 338 ASSERT ((Length - 1) <= (MAX_ADDRESS - StartAddress));\r
2f88bd3a 339 ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));\r
11f43dfd 340\r
341 ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
2f88bd3a 342 ASSERT (((UINTN)Buffer & (sizeof (UINT32) - 1)) == 0);\r
11f43dfd 343\r
2f88bd3a 344 ReturnBuffer = (UINT32 *)Buffer;\r
9095d37b 345\r
42eedea9 346 while (Length != 0) {\r
11f43dfd 347 MmioWrite32 (StartAddress, *(Buffer++));\r
9095d37b 348\r
11f43dfd 349 StartAddress += sizeof (UINT32);\r
2f88bd3a 350 Length -= sizeof (UINT32);\r
11f43dfd 351 }\r
352\r
353 return ReturnBuffer;\r
354}\r
355\r
356/**\r
357 Copy data from system memory to MMIO region by using 64-bit access.\r
358\r
9095d37b
LG
359 Copy data from system memory specified by Buffer to MMIO region specified\r
360 by starting address StartAddress by using 64-bit access. The total number\r
3222ffc0 361 of byte to be copied is specified by Length. Buffer is returned.\r
9095d37b 362\r
11f43dfd 363 If StartAddress is not aligned on a 64-bit boundary, then ASSERT().\r
364\r
9095d37b 365 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().\r
11f43dfd 366 If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
367\r
368 If Length is not aligned on a 64-bit boundary, then ASSERT().\r
369\r
370 If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
371\r
2fc59a00 372 @param StartAddress The starting address for the MMIO region to be copied to.\r
80f0c0c4 373 @param Length The size, in bytes, of Buffer.\r
2fc59a00 374 @param Buffer The pointer to a system memory buffer containing the data to write.\r
11f43dfd 375\r
3222ffc0 376 @return Buffer\r
11f43dfd 377\r
378**/\r
379UINT64 *\r
380EFIAPI\r
381MmioWriteBuffer64 (\r
2f88bd3a
MK
382 IN UINTN StartAddress,\r
383 IN UINTN Length,\r
384 IN CONST UINT64 *Buffer\r
11f43dfd 385 )\r
386{\r
2f88bd3a 387 UINT64 *ReturnBuffer;\r
11f43dfd 388\r
389 ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
9095d37b 390\r
11f43dfd 391 ASSERT ((Length - 1) <= (MAX_ADDRESS - StartAddress));\r
2f88bd3a 392 ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));\r
11f43dfd 393\r
394 ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
2f88bd3a 395 ASSERT (((UINTN)Buffer & (sizeof (UINT64) - 1)) == 0);\r
11f43dfd 396\r
2f88bd3a 397 ReturnBuffer = (UINT64 *)Buffer;\r
9095d37b 398\r
42eedea9 399 while (Length != 0) {\r
11f43dfd 400 MmioWrite64 (StartAddress, *(Buffer++));\r
9095d37b 401\r
11f43dfd 402 StartAddress += sizeof (UINT64);\r
2f88bd3a 403 Length -= sizeof (UINT64);\r
11f43dfd 404 }\r
405\r
406 return ReturnBuffer;\r
407}\r