1 /** @file
2   Provide services to access I/O Ports and MMIO registers.
3 
4 Copyright (c) 2006 - 2012, 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
9 
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.
12 
13 **/
14 
15 #ifndef __IO_LIB_H__
16 #define __IO_LIB_H__
17 
18 /**
19   Macro that converts PCI Segment and I/O Port to an address that can be
20   passed to the I/O Library functions.
21 
22   Computes an address that is compatible with the I/O Library functions.
23   The unused upper bits of Segment, and Port are stripped prior to the
24   generation of the address.
25 
26   @param  Segment   PCI Segment number.  Range 0..65535.
27   @param  Port      I/O Port number.  Range 0..65535.
28 
29   @return An address that the I/o Library functions need.
30 
31 **/
32 
33 #define IO_LIB_ADDRESS(Segment,Port) \
34   ( ((Port) & 0xffff) | (((Segment) & 0xffff) << 16) )
35 
36 /**
37   Reads an 8-bit I/O port.
38 
39   Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned.
40   This function must guarantee that all I/O read and write operations are
41   serialized.
42 
43   If 8-bit I/O port operations are not supported, then ASSERT().
44 
45   @param  Port  The I/O port to read.
46 
47   @return The value read.
48 
49 **/
50 UINT8
51 EFIAPI
52 IoRead8 (
53   IN      UINTN                     Port
54   );
55 
56 /**
57   Writes an 8-bit I/O port.
58 
59   Writes the 8-bit I/O port specified by Port with the value specified by Value
60   and returns Value. This function must guarantee that all I/O read and write
61   operations are serialized.
62 
63   If 8-bit I/O port operations are not supported, then ASSERT().
64 
65   @param  Port  The I/O port to write.
66   @param  Value The value to write to the I/O port.
67 
68   @return The value written the I/O port.
69 
70 **/
71 UINT8
72 EFIAPI
73 IoWrite8 (
74   IN      UINTN                     Port,
75   IN      UINT8                     Value
76   );
77 
78 /**
79   Reads an 8-bit I/O port, performs a bitwise OR, and writes the
80   result back to the 8-bit I/O port.
81 
82   Reads the 8-bit I/O port specified by Port, performs a bitwise OR
83   between the read result and the value specified by OrData, and writes the
84   result to the 8-bit I/O port specified by Port. The value written to the I/O
85   port is returned. This function must guarantee that all I/O read and write
86   operations are serialized.
87 
88   If 8-bit I/O port operations are not supported, then ASSERT().
89 
90   @param  Port    The I/O port to write.
91   @param  OrData  The value to OR with the read value from the I/O port.
92 
93   @return The value written back to the I/O port.
94 
95 **/
96 UINT8
97 EFIAPI
98 IoOr8 (
99   IN      UINTN                     Port,
100   IN      UINT8                     OrData
101   );
102 
103 /**
104   Reads an 8-bit I/O port, performs a bitwise AND, and writes the result back
105   to the 8-bit I/O port.
106 
107   Reads the 8-bit I/O port specified by Port, performs a bitwise AND between
108   the read result and the value specified by AndData, and writes the result to
109   the 8-bit I/O port specified by Port. The value written to the I/O port is
110   returned. This function must guarantee that all I/O read and write operations
111   are serialized.
112 
113   If 8-bit I/O port operations are not supported, then ASSERT().
114 
115   @param  Port    The I/O port to write.
116   @param  AndData The value to AND with the read value from the I/O port.
117 
118   @return The value written back to the I/O port.
119 
120 **/
121 UINT8
122 EFIAPI
123 IoAnd8 (
124   IN      UINTN                     Port,
125   IN      UINT8                     AndData
126   );
127 
128 /**
129   Reads an 8-bit I/O port, performs a bitwise AND followed by a bitwise
130   OR, and writes the result back to the 8-bit I/O port.
131 
132   Reads the 8-bit I/O port specified by Port, performs a bitwise AND between
133   the read result and the value specified by AndData, performs a bitwise OR
134   between the result of the AND operation and the value specified by OrData,
135   and writes the result to the 8-bit I/O port specified by Port. The value
136   written to the I/O port is returned. This function must guarantee that all
137   I/O read and write operations are serialized.
138 
139   If 8-bit I/O port operations are not supported, then ASSERT().
140 
141   @param  Port    The I/O port to write.
142   @param  AndData The value to AND with the read value from the I/O port.
143   @param  OrData  The value to OR with the result of the AND operation.
144 
145   @return The value written back to the I/O port.
146 
147 **/
148 UINT8
149 EFIAPI
150 IoAndThenOr8 (
151   IN      UINTN                     Port,
152   IN      UINT8                     AndData,
153   IN      UINT8                     OrData
154   );
155 
156 /**
157   Reads a bit field of an I/O register.
158 
159   Reads the bit field in an 8-bit I/O register. The bit field is specified by
160   the StartBit and the EndBit. The value of the bit field is returned.
161 
162   If 8-bit I/O port operations are not supported, then ASSERT().
163   If StartBit is greater than 7, then ASSERT().
164   If EndBit is greater than 7, then ASSERT().
165   If EndBit is less than StartBit, then ASSERT().
166 
167   @param  Port      The I/O port to read.
168   @param  StartBit  The ordinal of the least significant bit in the bit field.
169                     Range 0..7.
170   @param  EndBit    The ordinal of the most significant bit in the bit field.
171                     Range 0..7.
172 
173   @return The value read.
174 
175 **/
176 UINT8
177 EFIAPI
178 IoBitFieldRead8 (
179   IN      UINTN                     Port,
180   IN      UINTN                     StartBit,
181   IN      UINTN                     EndBit
182   );
183 
184 /**
185   Writes a bit field to an I/O register.
186 
187   Writes Value to the bit field of the I/O register. The bit field is specified
188   by the StartBit and the EndBit. All other bits in the destination I/O
189   register are preserved. The value written to the I/O port is returned.
190 
191   If 8-bit I/O port operations are not supported, then ASSERT().
192   If StartBit is greater than 7, then ASSERT().
193   If EndBit is greater than 7, then ASSERT().
194   If EndBit is less than StartBit, then ASSERT().
195   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
196 
197   @param  Port      The I/O port to write.
198   @param  StartBit  The ordinal of the least significant bit in the bit field.
199                     Range 0..7.
200   @param  EndBit    The ordinal of the most significant bit in the bit field.
201                     Range 0..7.
202   @param  Value     New value of the bit field.
203 
204   @return The value written back to the I/O port.
205 
206 **/
207 UINT8
208 EFIAPI
209 IoBitFieldWrite8 (
210   IN      UINTN                     Port,
211   IN      UINTN                     StartBit,
212   IN      UINTN                     EndBit,
213   IN      UINT8                     Value
214   );
215 
216 /**
217   Reads a bit field in an 8-bit port, performs a bitwise OR, and writes the
218   result back to the bit field in the 8-bit port.
219 
220   Reads the 8-bit I/O port specified by Port, performs a bitwise OR
221   between the read result and the value specified by OrData, and writes the
222   result to the 8-bit I/O port specified by Port. The value written to the I/O
223   port is returned. This function must guarantee that all I/O read and write
224   operations are serialized. Extra left bits in OrData are stripped.
225 
226   If 8-bit I/O port operations are not supported, then ASSERT().
227   If StartBit is greater than 7, then ASSERT().
228   If EndBit is greater than 7, then ASSERT().
229   If EndBit is less than StartBit, then ASSERT().
230   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
231 
232   @param  Port      The I/O port to write.
233   @param  StartBit  The ordinal of the least significant bit in the bit field.
234                     Range 0..7.
235   @param  EndBit    The ordinal of the most significant bit in the bit field.
236                     Range 0..7.
237   @param  OrData    The value to OR with the read value from the I/O port.
238 
239   @return The value written back to the I/O port.
240 
241 **/
242 UINT8
243 EFIAPI
244 IoBitFieldOr8 (
245   IN      UINTN                     Port,
246   IN      UINTN                     StartBit,
247   IN      UINTN                     EndBit,
248   IN      UINT8                     OrData
249   );
250 
251 /**
252   Reads a bit field in an 8-bit port, performs a bitwise AND, and writes the
253   result back to the bit field in the 8-bit port.
254 
255   Reads the 8-bit I/O port specified by Port, performs a bitwise AND between
256   the read result and the value specified by AndData, and writes the result to
257   the 8-bit I/O port specified by Port. The value written to the I/O port is
258   returned. This function must guarantee that all I/O read and write operations
259   are serialized. Extra left bits in AndData are stripped.
260 
261   If 8-bit I/O port operations are not supported, then ASSERT().
262   If StartBit is greater than 7, then ASSERT().
263   If EndBit is greater than 7, then ASSERT().
264   If EndBit is less than StartBit, then ASSERT().
265   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
266 
267   @param  Port      The I/O port to write.
268   @param  StartBit  The ordinal of the least significant bit in the bit field.
269                     Range 0..7.
270   @param  EndBit    The ordinal of the most significant bit in the bit field.
271                     Range 0..7.
272   @param  AndData   The value to AND with the read value from the I/O port.
273 
274   @return The value written back to the I/O port.
275 
276 **/
277 UINT8
278 EFIAPI
279 IoBitFieldAnd8 (
280   IN      UINTN                     Port,
281   IN      UINTN                     StartBit,
282   IN      UINTN                     EndBit,
283   IN      UINT8                     AndData
284   );
285 
286 /**
287   Reads a bit field in an 8-bit port, performs a bitwise AND followed by a
288   bitwise OR, and writes the result back to the bit field in the
289   8-bit port.
290 
291   Reads the 8-bit I/O port specified by Port, performs a bitwise AND followed
292   by a bitwise OR between the read result and the value specified by
293   AndData, and writes the result to the 8-bit I/O port specified by Port. The
294   value written to the I/O port is returned. This function must guarantee that
295   all I/O read and write operations are serialized. Extra left bits in both
296   AndData and OrData are stripped.
297 
298   If 8-bit I/O port operations are not supported, then ASSERT().
299   If StartBit is greater than 7, then ASSERT().
300   If EndBit is greater than 7, then ASSERT().
301   If EndBit is less than StartBit, then ASSERT().
302   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
303   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
304 
305   @param  Port      The I/O port to write.
306   @param  StartBit  The ordinal of the least significant bit in the bit field.
307                     Range 0..7.
308   @param  EndBit    The ordinal of the most significant bit in the bit field.
309                     Range 0..7.
310   @param  AndData   The value to AND with the read value from the I/O port.
311   @param  OrData    The value to OR with the result of the AND operation.
312 
313   @return The value written back to the I/O port.
314 
315 **/
316 UINT8
317 EFIAPI
318 IoBitFieldAndThenOr8 (
319   IN      UINTN                     Port,
320   IN      UINTN                     StartBit,
321   IN      UINTN                     EndBit,
322   IN      UINT8                     AndData,
323   IN      UINT8                     OrData
324   );
325 
326 /**
327   Reads a 16-bit I/O port.
328 
329   Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned.
330   This function must guarantee that all I/O read and write operations are
331   serialized.
332 
333   If 16-bit I/O port operations are not supported, then ASSERT().
334   If Port is not aligned on a 16-bit boundary, then ASSERT().
335 
336   @param  Port  The I/O port to read.
337 
338   @return The value read.
339 
340 **/
341 UINT16
342 EFIAPI
343 IoRead16 (
344   IN      UINTN                     Port
345   );
346 
347 /**
348   Writes a 16-bit I/O port.
349 
350   Writes the 16-bit I/O port specified by Port with the value specified by Value
351   and returns Value. This function must guarantee that all I/O read and write
352   operations are serialized.
353 
354   If 16-bit I/O port operations are not supported, then ASSERT().
355   If Port is not aligned on a 16-bit boundary, then ASSERT().
356 
357   @param  Port  The I/O port to write.
358   @param  Value The value to write to the I/O port.
359 
360   @return The value written the I/O port.
361 
362 **/
363 UINT16
364 EFIAPI
365 IoWrite16 (
366   IN      UINTN                     Port,
367   IN      UINT16                    Value
368   );
369 
370 /**
371   Reads a 16-bit I/O port, performs a bitwise OR, and writes the
372   result back to the 16-bit I/O port.
373 
374   Reads the 16-bit I/O port specified by Port, performs a bitwise OR
375   between the read result and the value specified by OrData, and writes the
376   result to the 16-bit I/O port specified by Port. The value written to the I/O
377   port is returned. This function must guarantee that all I/O read and write
378   operations are serialized.
379 
380   If 16-bit I/O port operations are not supported, then ASSERT().
381   If Port is not aligned on a 16-bit boundary, then ASSERT().
382 
383   @param  Port    The I/O port to write.
384   @param  OrData  The value to OR with the read value from the I/O port.
385 
386   @return The value written back to the I/O port.
387 
388 **/
389 UINT16
390 EFIAPI
391 IoOr16 (
392   IN      UINTN                     Port,
393   IN      UINT16                    OrData
394   );
395 
396 /**
397   Reads a 16-bit I/O port, performs a bitwise AND, and writes the result back
398   to the 16-bit I/O port.
399 
400   Reads the 16-bit I/O port specified by Port, performs a bitwise AND between
401   the read result and the value specified by AndData, and writes the result to
402   the 16-bit I/O port specified by Port. The value written to the I/O port is
403   returned. This function must guarantee that all I/O read and write operations
404   are serialized.
405 
406   If 16-bit I/O port operations are not supported, then ASSERT().
407   If Port is not aligned on a 16-bit boundary, then ASSERT().
408 
409   @param  Port    The I/O port to write.
410   @param  AndData The value to AND with the read value from the I/O port.
411 
412   @return The value written back to the I/O port.
413 
414 **/
415 UINT16
416 EFIAPI
417 IoAnd16 (
418   IN      UINTN                     Port,
419   IN      UINT16                    AndData
420   );
421 
422 /**
423   Reads a 16-bit I/O port, performs a bitwise AND followed by a bitwise
424   OR, and writes the result back to the 16-bit I/O port.
425 
426   Reads the 16-bit I/O port specified by Port, performs a bitwise AND between
427   the read result and the value specified by AndData, performs a bitwise OR
428   between the result of the AND operation and the value specified by OrData,
429   and writes the result to the 16-bit I/O port specified by Port. The value
430   written to the I/O port is returned. This function must guarantee that all
431   I/O read and write operations are serialized.
432 
433   If 16-bit I/O port operations are not supported, then ASSERT().
434   If Port is not aligned on a 16-bit boundary, then ASSERT().
435 
436   @param  Port    The I/O port to write.
437   @param  AndData The value to AND with the read value from the I/O port.
438   @param  OrData  The value to OR with the result of the AND operation.
439 
440   @return The value written back to the I/O port.
441 
442 **/
443 UINT16
444 EFIAPI
445 IoAndThenOr16 (
446   IN      UINTN                     Port,
447   IN      UINT16                    AndData,
448   IN      UINT16                    OrData
449   );
450 
451 /**
452   Reads a bit field of an I/O register.
453 
454   Reads the bit field in a 16-bit I/O register. The bit field is specified by
455   the StartBit and the EndBit. The value of the bit field is returned.
456 
457   If 16-bit I/O port operations are not supported, then ASSERT().
458   If Port is not aligned on a 16-bit boundary, then ASSERT().
459   If StartBit is greater than 15, then ASSERT().
460   If EndBit is greater than 15, then ASSERT().
461   If EndBit is less than StartBit, then ASSERT().
462 
463   @param  Port      The I/O port to read.
464   @param  StartBit  The ordinal of the least significant bit in the bit field.
465                     Range 0..15.
466   @param  EndBit    The ordinal of the most significant bit in the bit field.
467                     Range 0..15.
468 
469   @return The value read.
470 
471 **/
472 UINT16
473 EFIAPI
474 IoBitFieldRead16 (
475   IN      UINTN                     Port,
476   IN      UINTN                     StartBit,
477   IN      UINTN                     EndBit
478   );
479 
480 /**
481   Writes a bit field to an I/O register.
482 
483   Writes Value to the bit field of the I/O register. The bit field is specified
484   by the StartBit and the EndBit. All other bits in the destination I/O
485   register are preserved. The value written to the I/O port is returned. Extra
486   left bits in Value are stripped.
487 
488   If 16-bit I/O port operations are not supported, then ASSERT().
489   If Port is not aligned on a 16-bit boundary, then ASSERT().
490   If StartBit is greater than 15, then ASSERT().
491   If EndBit is greater than 15, then ASSERT().
492   If EndBit is less than StartBit, then ASSERT().
493   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
494 
495   @param  Port      The I/O port to write.
496   @param  StartBit  The ordinal of the least significant bit in the bit field.
497                     Range 0..15.
498   @param  EndBit    The ordinal of the most significant bit in the bit field.
499                     Range 0..15.
500   @param  Value     New value of the bit field.
501 
502   @return The value written back to the I/O port.
503 
504 **/
505 UINT16
506 EFIAPI
507 IoBitFieldWrite16 (
508   IN      UINTN                     Port,
509   IN      UINTN                     StartBit,
510   IN      UINTN                     EndBit,
511   IN      UINT16                    Value
512   );
513 
514 /**
515   Reads a bit field in a 16-bit port, performs a bitwise OR, and writes the
516   result back to the bit field in the 16-bit port.
517 
518   Reads the 16-bit I/O port specified by Port, performs a bitwise OR
519   between the read result and the value specified by OrData, and writes the
520   result to the 16-bit I/O port specified by Port. The value written to the I/O
521   port is returned. This function must guarantee that all I/O read and write
522   operations are serialized. Extra left bits in OrData are stripped.
523 
524   If 16-bit I/O port operations are not supported, then ASSERT().
525   If Port is not aligned on a 16-bit boundary, then ASSERT().
526   If StartBit is greater than 15, then ASSERT().
527   If EndBit is greater than 15, then ASSERT().
528   If EndBit is less than StartBit, then ASSERT().
529   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
530 
531   @param  Port      The I/O port to write.
532   @param  StartBit  The ordinal of the least significant bit in the bit field.
533                     Range 0..15.
534   @param  EndBit    The ordinal of the most significant bit in the bit field.
535                     Range 0..15.
536   @param  OrData    The value to OR with the read value from the I/O port.
537 
538   @return The value written back to the I/O port.
539 
540 **/
541 UINT16
542 EFIAPI
543 IoBitFieldOr16 (
544   IN      UINTN                     Port,
545   IN      UINTN                     StartBit,
546   IN      UINTN                     EndBit,
547   IN      UINT16                    OrData
548   );
549 
550 /**
551   Reads a bit field in a 16-bit port, performs a bitwise AND, and writes the
552   result back to the bit field in the 16-bit port.
553 
554   Reads the 16-bit I/O port specified by Port, performs a bitwise AND between
555   the read result and the value specified by AndData, and writes the result to
556   the 16-bit I/O port specified by Port. The value written to the I/O port is
557   returned. This function must guarantee that all I/O read and write operations
558   are serialized. Extra left bits in AndData are stripped.
559 
560   If 16-bit I/O port operations are not supported, then ASSERT().
561   If Port is not aligned on a 16-bit boundary, then ASSERT().
562   If StartBit is greater than 15, then ASSERT().
563   If EndBit is greater than 15, then ASSERT().
564   If EndBit is less than StartBit, then ASSERT().
565   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
566 
567   @param  Port      The I/O port to write.
568   @param  StartBit  The ordinal of the least significant bit in the bit field.
569                     Range 0..15.
570   @param  EndBit    The ordinal of the most significant bit in the bit field.
571                     Range 0..15.
572   @param  AndData   The value to AND with the read value from the I/O port.
573 
574   @return The value written back to the I/O port.
575 
576 **/
577 UINT16
578 EFIAPI
579 IoBitFieldAnd16 (
580   IN      UINTN                     Port,
581   IN      UINTN                     StartBit,
582   IN      UINTN                     EndBit,
583   IN      UINT16                    AndData
584   );
585 
586 /**
587   Reads a bit field in a 16-bit port, performs a bitwise AND followed by a
588   bitwise OR, and writes the result back to the bit field in the
589   16-bit port.
590 
591   Reads the 16-bit I/O port specified by Port, performs a bitwise AND followed
592   by a bitwise OR between the read result and the value specified by
593   AndData, and writes the result to the 16-bit I/O port specified by Port. The
594   value written to the I/O port is returned. This function must guarantee that
595   all I/O read and write operations are serialized. Extra left bits in both
596   AndData and OrData are stripped.
597 
598   If 16-bit I/O port operations are not supported, then ASSERT().
599   If Port is not aligned on a 16-bit boundary, then ASSERT().
600   If StartBit is greater than 15, then ASSERT().
601   If EndBit is greater than 15, then ASSERT().
602   If EndBit is less than StartBit, then ASSERT().
603   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
604   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
605 
606   @param  Port      The I/O port to write.
607   @param  StartBit  The ordinal of the least significant bit in the bit field.
608                     Range 0..15.
609   @param  EndBit    The ordinal of the most significant bit in the bit field.
610                     Range 0..15.
611   @param  AndData   The value to AND with the read value from the I/O port.
612   @param  OrData    The value to OR with the result of the AND operation.
613 
614   @return The value written back to the I/O port.
615 
616 **/
617 UINT16
618 EFIAPI
619 IoBitFieldAndThenOr16 (
620   IN      UINTN                     Port,
621   IN      UINTN                     StartBit,
622   IN      UINTN                     EndBit,
623   IN      UINT16                    AndData,
624   IN      UINT16                    OrData
625   );
626 
627 /**
628   Reads a 32-bit I/O port.
629 
630   Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned.
631   This function must guarantee that all I/O read and write operations are
632   serialized.
633 
634   If 32-bit I/O port operations are not supported, then ASSERT().
635   If Port is not aligned on a 32-bit boundary, then ASSERT().
636 
637   @param  Port  The I/O port to read.
638 
639   @return The value read.
640 
641 **/
642 UINT32
643 EFIAPI
644 IoRead32 (
645   IN      UINTN                     Port
646   );
647 
648 /**
649   Writes a 32-bit I/O port.
650 
651   Writes the 32-bit I/O port specified by Port with the value specified by Value
652   and returns Value. This function must guarantee that all I/O read and write
653   operations are serialized.
654 
655   If 32-bit I/O port operations are not supported, then ASSERT().
656   If Port is not aligned on a 32-bit boundary, then ASSERT().
657 
658   @param  Port  The I/O port to write.
659   @param  Value The value to write to the I/O port.
660 
661   @return The value written the I/O port.
662 
663 **/
664 UINT32
665 EFIAPI
666 IoWrite32 (
667   IN      UINTN                     Port,
668   IN      UINT32                    Value
669   );
670 
671 /**
672   Reads a 32-bit I/O port, performs a bitwise OR, and writes the
673   result back to the 32-bit I/O port.
674 
675   Reads the 32-bit I/O port specified by Port, performs a bitwise OR
676   between the read result and the value specified by OrData, and writes the
677   result to the 32-bit I/O port specified by Port. The value written to the I/O
678   port is returned. This function must guarantee that all I/O read and write
679   operations are serialized.
680 
681   If 32-bit I/O port operations are not supported, then ASSERT().
682   If Port is not aligned on a 32-bit boundary, then ASSERT().
683 
684   @param  Port    The I/O port to write.
685   @param  OrData  The value to OR with the read value from the I/O port.
686 
687   @return The value written back to the I/O port.
688 
689 **/
690 UINT32
691 EFIAPI
692 IoOr32 (
693   IN      UINTN                     Port,
694   IN      UINT32                    OrData
695   );
696 
697 /**
698   Reads a 32-bit I/O port, performs a bitwise AND, and writes the result back
699   to the 32-bit I/O port.
700 
701   Reads the 32-bit I/O port specified by Port, performs a bitwise AND between
702   the read result and the value specified by AndData, and writes the result to
703   the 32-bit I/O port specified by Port. The value written to the I/O port is
704   returned. This function must guarantee that all I/O read and write operations
705   are serialized.
706 
707   If 32-bit I/O port operations are not supported, then ASSERT().
708   If Port is not aligned on a 32-bit boundary, then ASSERT().
709 
710   @param  Port    The I/O port to write.
711   @param  AndData The value to AND with the read value from the I/O port.
712 
713   @return The value written back to the I/O port.
714 
715 **/
716 UINT32
717 EFIAPI
718 IoAnd32 (
719   IN      UINTN                     Port,
720   IN      UINT32                    AndData
721   );
722 
723 /**
724   Reads a 32-bit I/O port, performs a bitwise AND followed by a bitwise
725   OR, and writes the result back to the 32-bit I/O port.
726 
727   Reads the 32-bit I/O port specified by Port, performs a bitwise AND between
728   the read result and the value specified by AndData, performs a bitwise OR
729   between the result of the AND operation and the value specified by OrData,
730   and writes the result to the 32-bit I/O port specified by Port. The value
731   written to the I/O port is returned. This function must guarantee that all
732   I/O read and write operations are serialized.
733 
734   If 32-bit I/O port operations are not supported, then ASSERT().
735   If Port is not aligned on a 32-bit boundary, then ASSERT().
736 
737   @param  Port    The I/O port to write.
738   @param  AndData The value to AND with the read value from the I/O port.
739   @param  OrData  The value to OR with the result of the AND operation.
740 
741   @return The value written back to the I/O port.
742 
743 **/
744 UINT32
745 EFIAPI
746 IoAndThenOr32 (
747   IN      UINTN                     Port,
748   IN      UINT32                    AndData,
749   IN      UINT32                    OrData
750   );
751 
752 /**
753   Reads a bit field of an I/O register.
754 
755   Reads the bit field in a 32-bit I/O register. The bit field is specified by
756   the StartBit and the EndBit. The value of the bit field is returned.
757 
758   If 32-bit I/O port operations are not supported, then ASSERT().
759   If Port is not aligned on a 32-bit boundary, then ASSERT().
760   If StartBit is greater than 31, then ASSERT().
761   If EndBit is greater than 31, then ASSERT().
762   If EndBit is less than StartBit, then ASSERT().
763 
764   @param  Port      The I/O port to read.
765   @param  StartBit  The ordinal of the least significant bit in the bit field.
766                     Range 0..31.
767   @param  EndBit    The ordinal of the most significant bit in the bit field.
768                     Range 0..31.
769 
770   @return The value read.
771 
772 **/
773 UINT32
774 EFIAPI
775 IoBitFieldRead32 (
776   IN      UINTN                     Port,
777   IN      UINTN                     StartBit,
778   IN      UINTN                     EndBit
779   );
780 
781 /**
782   Writes a bit field to an I/O register.
783 
784   Writes Value to the bit field of the I/O register. The bit field is specified
785   by the StartBit and the EndBit. All other bits in the destination I/O
786   register are preserved. The value written to the I/O port is returned. Extra
787   left bits in Value are stripped.
788 
789   If 32-bit I/O port operations are not supported, then ASSERT().
790   If Port is not aligned on a 32-bit boundary, then ASSERT().
791   If StartBit is greater than 31, then ASSERT().
792   If EndBit is greater than 31, then ASSERT().
793   If EndBit is less than StartBit, then ASSERT().
794   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
795 
796   @param  Port      The I/O port to write.
797   @param  StartBit  The ordinal of the least significant bit in the bit field.
798                     Range 0..31.
799   @param  EndBit    The ordinal of the most significant bit in the bit field.
800                     Range 0..31.
801   @param  Value     New value of the bit field.
802 
803   @return The value written back to the I/O port.
804 
805 **/
806 UINT32
807 EFIAPI
808 IoBitFieldWrite32 (
809   IN      UINTN                     Port,
810   IN      UINTN                     StartBit,
811   IN      UINTN                     EndBit,
812   IN      UINT32                    Value
813   );
814 
815 /**
816   Reads a bit field in a 32-bit port, performs a bitwise OR, and writes the
817   result back to the bit field in the 32-bit port.
818 
819   Reads the 32-bit I/O port specified by Port, performs a bitwise OR
820   between the read result and the value specified by OrData, and writes the
821   result to the 32-bit I/O port specified by Port. The value written to the I/O
822   port is returned. This function must guarantee that all I/O read and write
823   operations are serialized. Extra left bits in OrData are stripped.
824 
825   If 32-bit I/O port operations are not supported, then ASSERT().
826   If Port is not aligned on a 32-bit boundary, then ASSERT().
827   If StartBit is greater than 31, then ASSERT().
828   If EndBit is greater than 31, then ASSERT().
829   If EndBit is less than StartBit, then ASSERT().
830   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
831 
832   @param  Port      The I/O port to write.
833   @param  StartBit  The ordinal of the least significant bit in the bit field.
834                     Range 0..31.
835   @param  EndBit    The ordinal of the most significant bit in the bit field.
836                     Range 0..31.
837   @param  OrData    The value to OR with the read value from the I/O port.
838 
839   @return The value written back to the I/O port.
840 
841 **/
842 UINT32
843 EFIAPI
844 IoBitFieldOr32 (
845   IN      UINTN                     Port,
846   IN      UINTN                     StartBit,
847   IN      UINTN                     EndBit,
848   IN      UINT32                    OrData
849   );
850 
851 /**
852   Reads a bit field in a 32-bit port, performs a bitwise AND, and writes the
853   result back to the bit field in the 32-bit port.
854 
855   Reads the 32-bit I/O port specified by Port, performs a bitwise AND between
856   the read result and the value specified by AndData, and writes the result to
857   the 32-bit I/O port specified by Port. The value written to the I/O port is
858   returned. This function must guarantee that all I/O read and write operations
859   are serialized. Extra left bits in AndData are stripped.
860 
861   If 32-bit I/O port operations are not supported, then ASSERT().
862   If Port is not aligned on a 32-bit boundary, then ASSERT().
863   If StartBit is greater than 31, then ASSERT().
864   If EndBit is greater than 31, then ASSERT().
865   If EndBit is less than StartBit, then ASSERT().
866   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
867 
868   @param  Port      The I/O port to write.
869   @param  StartBit  The ordinal of the least significant bit in the bit field.
870                     Range 0..31.
871   @param  EndBit    The ordinal of the most significant bit in the bit field.
872                     Range 0..31.
873   @param  AndData   The value to AND with the read value from the I/O port.
874 
875   @return The value written back to the I/O port.
876 
877 **/
878 UINT32
879 EFIAPI
880 IoBitFieldAnd32 (
881   IN      UINTN                     Port,
882   IN      UINTN                     StartBit,
883   IN      UINTN                     EndBit,
884   IN      UINT32                    AndData
885   );
886 
887 /**
888   Reads a bit field in a 32-bit port, performs a bitwise AND followed by a
889   bitwise OR, and writes the result back to the bit field in the
890   32-bit port.
891 
892   Reads the 32-bit I/O port specified by Port, performs a bitwise AND followed
893   by a bitwise OR between the read result and the value specified by
894   AndData, and writes the result to the 32-bit I/O port specified by Port. The
895   value written to the I/O port is returned. This function must guarantee that
896   all I/O read and write operations are serialized. Extra left bits in both
897   AndData and OrData are stripped.
898 
899   If 32-bit I/O port operations are not supported, then ASSERT().
900   If Port is not aligned on a 32-bit boundary, then ASSERT().
901   If StartBit is greater than 31, then ASSERT().
902   If EndBit is greater than 31, then ASSERT().
903   If EndBit is less than StartBit, then ASSERT().
904   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
905   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
906 
907   @param  Port      The I/O port to write.
908   @param  StartBit  The ordinal of the least significant bit in the bit field.
909                     Range 0..31.
910   @param  EndBit    The ordinal of the most significant bit in the bit field.
911                     Range 0..31.
912   @param  AndData   The value to AND with the read value from the I/O port.
913   @param  OrData    The value to OR with the result of the AND operation.
914 
915   @return The value written back to the I/O port.
916 
917 **/
918 UINT32
919 EFIAPI
920 IoBitFieldAndThenOr32 (
921   IN      UINTN                     Port,
922   IN      UINTN                     StartBit,
923   IN      UINTN                     EndBit,
924   IN      UINT32                    AndData,
925   IN      UINT32                    OrData
926   );
927 
928 /**
929   Reads a 64-bit I/O port.
930 
931   Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned.
932   This function must guarantee that all I/O read and write operations are
933   serialized.
934 
935   If 64-bit I/O port operations are not supported, then ASSERT().
936   If Port is not aligned on a 64-bit boundary, then ASSERT().
937 
938   @param  Port  The I/O port to read.
939 
940   @return The value read.
941 
942 **/
943 UINT64
944 EFIAPI
945 IoRead64 (
946   IN      UINTN                     Port
947   );
948 
949 /**
950   Writes a 64-bit I/O port.
951 
952   Writes the 64-bit I/O port specified by Port with the value specified by Value
953   and returns Value. This function must guarantee that all I/O read and write
954   operations are serialized.
955 
956   If 64-bit I/O port operations are not supported, then ASSERT().
957   If Port is not aligned on a 64-bit boundary, then ASSERT().
958 
959   @param  Port  The I/O port to write.
960   @param  Value The value to write to the I/O port.
961 
962   @return The value written the I/O port.
963 
964 **/
965 UINT64
966 EFIAPI
967 IoWrite64 (
968   IN      UINTN                     Port,
969   IN      UINT64                    Value
970   );
971 
972 /**
973   Reads a 64-bit I/O port, performs a bitwise OR, and writes the
974   result back to the 64-bit I/O port.
975 
976   Reads the 64-bit I/O port specified by Port, performs a bitwise OR
977   between the read result and the value specified by OrData, and writes the
978   result to the 64-bit I/O port specified by Port. The value written to the I/O
979   port is returned. This function must guarantee that all I/O read and write
980   operations are serialized.
981 
982   If 64-bit I/O port operations are not supported, then ASSERT().
983   If Port is not aligned on a 64-bit boundary, then ASSERT().
984 
985   @param  Port    The I/O port to write.
986   @param  OrData  The value to OR with the read value from the I/O port.
987 
988   @return The value written back to the I/O port.
989 
990 **/
991 UINT64
992 EFIAPI
993 IoOr64 (
994   IN      UINTN                     Port,
995   IN      UINT64                    OrData
996   );
997 
998 /**
999   Reads a 64-bit I/O port, performs a bitwise AND, and writes the result back
1000   to the 64-bit I/O port.
1001 
1002   Reads the 64-bit I/O port specified by Port, performs a bitwise AND between
1003   the read result and the value specified by AndData, and writes the result to
1004   the 64-bit I/O port specified by Port. The value written to the I/O port is
1005   returned. This function must guarantee that all I/O read and write operations
1006   are serialized.
1007 
1008   If 64-bit I/O port operations are not supported, then ASSERT().
1009   If Port is not aligned on a 64-bit boundary, then ASSERT().
1010 
1011   @param  Port    The I/O port to write.
1012   @param  AndData The value to AND with the read value from the I/O port.
1013 
1014   @return The value written back to the I/O port.
1015 
1016 **/
1017 UINT64
1018 EFIAPI
1019 IoAnd64 (
1020   IN      UINTN                     Port,
1021   IN      UINT64                    AndData
1022   );
1023 
1024 /**
1025   Reads a 64-bit I/O port, performs a bitwise AND followed by a bitwise
1026   OR, and writes the result back to the 64-bit I/O port.
1027 
1028   Reads the 64-bit I/O port specified by Port, performs a bitwise AND between
1029   the read result and the value specified by AndData, performs a bitwise OR
1030   between the result of the AND operation and the value specified by OrData,
1031   and writes the result to the 64-bit I/O port specified by Port. The value
1032   written to the I/O port is returned. This function must guarantee that all
1033   I/O read and write operations are serialized.
1034 
1035   If 64-bit I/O port operations are not supported, then ASSERT().
1036   If Port is not aligned on a 64-bit boundary, then ASSERT().
1037 
1038   @param  Port    The I/O port to write.
1039   @param  AndData The value to AND with the read value from the I/O port.
1040   @param  OrData  The value to OR with the result of the AND operation.
1041 
1042   @return The value written back to the I/O port.
1043 
1044 **/
1045 UINT64
1046 EFIAPI
1047 IoAndThenOr64 (
1048   IN      UINTN                     Port,
1049   IN      UINT64                    AndData,
1050   IN      UINT64                    OrData
1051   );
1052 
1053 /**
1054   Reads a bit field of an I/O register.
1055 
1056   Reads the bit field in a 64-bit I/O register. The bit field is specified by
1057   the StartBit and the EndBit. The value of the bit field is returned.
1058 
1059   If 64-bit I/O port operations are not supported, then ASSERT().
1060   If Port is not aligned on a 64-bit boundary, then ASSERT().
1061   If StartBit is greater than 63, then ASSERT().
1062   If EndBit is greater than 63, then ASSERT().
1063   If EndBit is less than StartBit, then ASSERT().
1064 
1065   @param  Port      The I/O port to read.
1066   @param  StartBit  The ordinal of the least significant bit in the bit field.
1067                     Range 0..63.
1068   @param  EndBit    The ordinal of the most significant bit in the bit field.
1069                     Range 0..63.
1070 
1071   @return The value read.
1072 
1073 **/
1074 UINT64
1075 EFIAPI
1076 IoBitFieldRead64 (
1077   IN      UINTN                     Port,
1078   IN      UINTN                     StartBit,
1079   IN      UINTN                     EndBit
1080   );
1081 
1082 /**
1083   Writes a bit field to an I/O register.
1084 
1085   Writes Value to the bit field of the I/O register. The bit field is specified
1086   by the StartBit and the EndBit. All other bits in the destination I/O
1087   register are preserved. The value written to the I/O port is returned. Extra
1088   left bits in Value are stripped.
1089 
1090   If 64-bit I/O port operations are not supported, then ASSERT().
1091   If Port is not aligned on a 64-bit boundary, then ASSERT().
1092   If StartBit is greater than 63, then ASSERT().
1093   If EndBit is greater than 63, then ASSERT().
1094   If EndBit is less than StartBit, then ASSERT().
1095   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1096 
1097   @param  Port      The I/O port to write.
1098   @param  StartBit  The ordinal of the least significant bit in the bit field.
1099                     Range 0..63.
1100   @param  EndBit    The ordinal of the most significant bit in the bit field.
1101                     Range 0..63.
1102   @param  Value     New value of the bit field.
1103 
1104   @return The value written back to the I/O port.
1105 
1106 **/
1107 UINT64
1108 EFIAPI
1109 IoBitFieldWrite64 (
1110   IN      UINTN                     Port,
1111   IN      UINTN                     StartBit,
1112   IN      UINTN                     EndBit,
1113   IN      UINT64                    Value
1114   );
1115 
1116 /**
1117   Reads a bit field in a 64-bit port, performs a bitwise OR, and writes the
1118   result back to the bit field in the 64-bit port.
1119 
1120   Reads the 64-bit I/O port specified by Port, performs a bitwise OR
1121   between the read result and the value specified by OrData, and writes the
1122   result to the 64-bit I/O port specified by Port. The value written to the I/O
1123   port is returned. This function must guarantee that all I/O read and write
1124   operations are serialized. Extra left bits in OrData are stripped.
1125 
1126   If 64-bit I/O port operations are not supported, then ASSERT().
1127   If Port is not aligned on a 64-bit boundary, then ASSERT().
1128   If StartBit is greater than 63, then ASSERT().
1129   If EndBit is greater than 63, then ASSERT().
1130   If EndBit is less than StartBit, then ASSERT().
1131   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1132 
1133   @param  Port      The I/O port to write.
1134   @param  StartBit  The ordinal of the least significant bit in the bit field.
1135                     Range 0..63.
1136   @param  EndBit    The ordinal of the most significant bit in the bit field.
1137                     Range 0..63.
1138   @param  OrData    The value to OR with the read value from the I/O port.
1139 
1140   @return The value written back to the I/O port.
1141 
1142 **/
1143 UINT64
1144 EFIAPI
1145 IoBitFieldOr64 (
1146   IN      UINTN                     Port,
1147   IN      UINTN                     StartBit,
1148   IN      UINTN                     EndBit,
1149   IN      UINT64                    OrData
1150   );
1151 
1152 /**
1153   Reads a bit field in a 64-bit port, performs a bitwise AND, and writes the
1154   result back to the bit field in the 64-bit port.
1155 
1156   Reads the 64-bit I/O port specified by Port, performs a bitwise AND between
1157   the read result and the value specified by AndData, and writes the result to
1158   the 64-bit I/O port specified by Port. The value written to the I/O port is
1159   returned. This function must guarantee that all I/O read and write operations
1160   are serialized. Extra left bits in AndData are stripped.
1161 
1162   If 64-bit I/O port operations are not supported, then ASSERT().
1163   If Port is not aligned on a 64-bit boundary, then ASSERT().
1164   If StartBit is greater than 63, then ASSERT().
1165   If EndBit is greater than 63, then ASSERT().
1166   If EndBit is less than StartBit, then ASSERT().
1167   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1168 
1169   @param  Port      The I/O port to write.
1170   @param  StartBit  The ordinal of the least significant bit in the bit field.
1171                     Range 0..63.
1172   @param  EndBit    The ordinal of the most significant bit in the bit field.
1173                     Range 0..63.
1174   @param  AndData   The value to AND with the read value from the I/O port.
1175 
1176   @return The value written back to the I/O port.
1177 
1178 **/
1179 UINT64
1180 EFIAPI
1181 IoBitFieldAnd64 (
1182   IN      UINTN                     Port,
1183   IN      UINTN                     StartBit,
1184   IN      UINTN                     EndBit,
1185   IN      UINT64                    AndData
1186   );
1187 
1188 /**
1189   Reads a bit field in a 64-bit port, performs a bitwise AND followed by a
1190   bitwise OR, and writes the result back to the bit field in the
1191   64-bit port.
1192 
1193   Reads the 64-bit I/O port specified by Port, performs a bitwise AND followed
1194   by a bitwise OR between the read result and the value specified by
1195   AndData, and writes the result to the 64-bit I/O port specified by Port. The
1196   value written to the I/O port is returned. This function must guarantee that
1197   all I/O read and write operations are serialized. Extra left bits in both
1198   AndData and OrData are stripped.
1199 
1200   If 64-bit I/O port operations are not supported, then ASSERT().
1201   If Port is not aligned on a 64-bit boundary, then ASSERT().
1202   If StartBit is greater than 63, then ASSERT().
1203   If EndBit is greater than 63, then ASSERT().
1204   If EndBit is less than StartBit, then ASSERT().
1205   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1206   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1207 
1208   @param  Port      The I/O port to write.
1209   @param  StartBit  The ordinal of the least significant bit in the bit field.
1210                     Range 0..63.
1211   @param  EndBit    The ordinal of the most significant bit in the bit field.
1212                     Range 0..63.
1213   @param  AndData   The value to AND with the read value from the I/O port.
1214   @param  OrData    The value to OR with the result of the AND operation.
1215 
1216   @return The value written back to the I/O port.
1217 
1218 **/
1219 UINT64
1220 EFIAPI
1221 IoBitFieldAndThenOr64 (
1222   IN      UINTN                     Port,
1223   IN      UINTN                     StartBit,
1224   IN      UINTN                     EndBit,
1225   IN      UINT64                    AndData,
1226   IN      UINT64                    OrData
1227   );
1228 
1229 /**
1230   Reads an 8-bit MMIO register.
1231 
1232   Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
1233   returned. This function must guarantee that all MMIO read and write
1234   operations are serialized.
1235 
1236   If 8-bit MMIO register operations are not supported, then ASSERT().
1237 
1238   @param  Address The MMIO register to read.
1239 
1240   @return The value read.
1241 
1242 **/
1243 UINT8
1244 EFIAPI
1245 MmioRead8 (
1246   IN      UINTN                     Address
1247   );
1248 
1249 /**
1250   Writes an 8-bit MMIO register.
1251 
1252   Writes the 8-bit MMIO register specified by Address with the value specified
1253   by Value and returns Value. This function must guarantee that all MMIO read
1254   and write operations are serialized.
1255 
1256   If 8-bit MMIO register operations are not supported, then ASSERT().
1257 
1258   @param  Address The MMIO register to write.
1259   @param  Value   The value to write to the MMIO register.
1260 
1261   @return Value.
1262 
1263 **/
1264 UINT8
1265 EFIAPI
1266 MmioWrite8 (
1267   IN      UINTN                     Address,
1268   IN      UINT8                     Value
1269   );
1270 
1271 /**
1272   Reads an 8-bit MMIO register, performs a bitwise OR, and writes the
1273   result back to the 8-bit MMIO register.
1274 
1275   Reads the 8-bit MMIO register specified by Address, performs a bitwise
1276   OR between the read result and the value specified by OrData, and
1277   writes the result to the 8-bit MMIO register specified by Address. The value
1278   written to the MMIO register is returned. This function must guarantee that
1279   all MMIO read and write operations are serialized.
1280 
1281   If 8-bit MMIO register operations are not supported, then ASSERT().
1282 
1283   @param  Address The MMIO register to write.
1284   @param  OrData  The value to OR with the read value from the MMIO register.
1285 
1286   @return The value written back to the MMIO register.
1287 
1288 **/
1289 UINT8
1290 EFIAPI
1291 MmioOr8 (
1292   IN      UINTN                     Address,
1293   IN      UINT8                     OrData
1294   );
1295 
1296 /**
1297   Reads an 8-bit MMIO register, performs a bitwise AND, and writes the result
1298   back to the 8-bit MMIO register.
1299 
1300   Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
1301   between the read result and the value specified by AndData, and writes the
1302   result to the 8-bit MMIO register specified by Address. The value written to
1303   the MMIO register is returned. This function must guarantee that all MMIO
1304   read and write operations are serialized.
1305 
1306   If 8-bit MMIO register operations are not supported, then ASSERT().
1307 
1308   @param  Address The MMIO register to write.
1309   @param  AndData The value to AND with the read value from the MMIO register.
1310 
1311   @return The value written back to the MMIO register.
1312 
1313 **/
1314 UINT8
1315 EFIAPI
1316 MmioAnd8 (
1317   IN      UINTN                     Address,
1318   IN      UINT8                     AndData
1319   );
1320 
1321 /**
1322   Reads an 8-bit MMIO register, performs a bitwise AND followed by a bitwise
1323   OR, and writes the result back to the 8-bit MMIO register.
1324 
1325   Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
1326   between the read result and the value specified by AndData, performs a
1327   bitwise OR between the result of the AND operation and the value specified by
1328   OrData, and writes the result to the 8-bit MMIO register specified by
1329   Address. The value written to the MMIO register is returned. This function
1330   must guarantee that all MMIO read and write operations are serialized.
1331 
1332   If 8-bit MMIO register operations are not supported, then ASSERT().
1333 
1334 
1335   @param  Address The MMIO register to write.
1336   @param  AndData The value to AND with the read value from the MMIO register.
1337   @param  OrData  The value to OR with the result of the AND operation.
1338 
1339   @return The value written back to the MMIO register.
1340 
1341 **/
1342 UINT8
1343 EFIAPI
1344 MmioAndThenOr8 (
1345   IN      UINTN                     Address,
1346   IN      UINT8                     AndData,
1347   IN      UINT8                     OrData
1348   );
1349 
1350 /**
1351   Reads a bit field of a MMIO register.
1352 
1353   Reads the bit field in an 8-bit MMIO register. The bit field is specified by
1354   the StartBit and the EndBit. The value of the bit field is returned.
1355 
1356   If 8-bit MMIO register operations are not supported, then ASSERT().
1357   If StartBit is greater than 7, then ASSERT().
1358   If EndBit is greater than 7, then ASSERT().
1359   If EndBit is less than StartBit, then ASSERT().
1360 
1361   @param  Address   MMIO register to read.
1362   @param  StartBit  The ordinal of the least significant bit in the bit field.
1363                     Range 0..7.
1364   @param  EndBit    The ordinal of the most significant bit in the bit field.
1365                     Range 0..7.
1366 
1367   @return The value read.
1368 
1369 **/
1370 UINT8
1371 EFIAPI
1372 MmioBitFieldRead8 (
1373   IN      UINTN                     Address,
1374   IN      UINTN                     StartBit,
1375   IN      UINTN                     EndBit
1376   );
1377 
1378 /**
1379   Writes a bit field to a MMIO register.
1380 
1381   Writes Value to the bit field of the MMIO register. The bit field is
1382   specified by the StartBit and the EndBit. All other bits in the destination
1383   MMIO register are preserved. The new value of the 8-bit register is returned.
1384 
1385   If 8-bit MMIO register operations are not supported, then ASSERT().
1386   If StartBit is greater than 7, then ASSERT().
1387   If EndBit is greater than 7, then ASSERT().
1388   If EndBit is less than StartBit, then ASSERT().
1389   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1390 
1391   @param  Address   MMIO register to write.
1392   @param  StartBit  The ordinal of the least significant bit in the bit field.
1393                     Range 0..7.
1394   @param  EndBit    The ordinal of the most significant bit in the bit field.
1395                     Range 0..7.
1396   @param  Value     New value of the bit field.
1397 
1398   @return The value written back to the MMIO register.
1399 
1400 **/
1401 UINT8
1402 EFIAPI
1403 MmioBitFieldWrite8 (
1404   IN      UINTN                     Address,
1405   IN      UINTN                     StartBit,
1406   IN      UINTN                     EndBit,
1407   IN      UINT8                     Value
1408   );
1409 
1410 /**
1411   Reads a bit field in an 8-bit MMIO register, performs a bitwise OR, and
1412   writes the result back to the bit field in the 8-bit MMIO register.
1413 
1414   Reads the 8-bit MMIO register specified by Address, performs a bitwise
1415   OR between the read result and the value specified by OrData, and
1416   writes the result to the 8-bit MMIO register specified by Address. The value
1417   written to the MMIO register is returned. This function must guarantee that
1418   all MMIO read and write operations are serialized. Extra left bits in OrData
1419   are stripped.
1420 
1421   If 8-bit MMIO register operations are not supported, then ASSERT().
1422   If StartBit is greater than 7, then ASSERT().
1423   If EndBit is greater than 7, then ASSERT().
1424   If EndBit is less than StartBit, then ASSERT().
1425   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1426 
1427   @param  Address   MMIO register to write.
1428   @param  StartBit  The ordinal of the least significant bit in the bit field.
1429                     Range 0..7.
1430   @param  EndBit    The ordinal of the most significant bit in the bit field.
1431                     Range 0..7.
1432   @param  OrData    The value to OR with read value from the MMIO register.
1433 
1434   @return The value written back to the MMIO register.
1435 
1436 **/
1437 UINT8
1438 EFIAPI
1439 MmioBitFieldOr8 (
1440   IN      UINTN                     Address,
1441   IN      UINTN                     StartBit,
1442   IN      UINTN                     EndBit,
1443   IN      UINT8                     OrData
1444   );
1445 
1446 /**
1447   Reads a bit field in an 8-bit MMIO register, performs a bitwise AND, and
1448   writes the result back to the bit field in the 8-bit MMIO register.
1449 
1450   Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
1451   between the read result and the value specified by AndData, and writes the
1452   result to the 8-bit MMIO register specified by Address. The value written to
1453   the MMIO register is returned. This function must guarantee that all MMIO
1454   read and write operations are serialized. Extra left bits in AndData are
1455   stripped.
1456 
1457   If 8-bit MMIO register operations are not supported, then ASSERT().
1458   If StartBit is greater than 7, then ASSERT().
1459   If EndBit is greater than 7, then ASSERT().
1460   If EndBit is less than StartBit, then ASSERT().
1461   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1462 
1463   @param  Address   MMIO register to write.
1464   @param  StartBit  The ordinal of the least significant bit in the bit field.
1465                     Range 0..7.
1466   @param  EndBit    The ordinal of the most significant bit in the bit field.
1467                     Range 0..7.
1468   @param  AndData   The value to AND with read value from the MMIO register.
1469 
1470   @return The value written back to the MMIO register.
1471 
1472 **/
1473 UINT8
1474 EFIAPI
1475 MmioBitFieldAnd8 (
1476   IN      UINTN                     Address,
1477   IN      UINTN                     StartBit,
1478   IN      UINTN                     EndBit,
1479   IN      UINT8                     AndData
1480   );
1481 
1482 /**
1483   Reads a bit field in an 8-bit MMIO register, performs a bitwise AND followed
1484   by a bitwise OR, and writes the result back to the bit field in the
1485   8-bit MMIO register.
1486 
1487   Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
1488   followed by a bitwise OR between the read result and the value
1489   specified by AndData, and writes the result to the 8-bit MMIO register
1490   specified by Address. The value written to the MMIO register is returned.
1491   This function must guarantee that all MMIO read and write operations are
1492   serialized. Extra left bits in both AndData and OrData are stripped.
1493 
1494   If 8-bit MMIO register operations are not supported, then ASSERT().
1495   If StartBit is greater than 7, then ASSERT().
1496   If EndBit is greater than 7, then ASSERT().
1497   If EndBit is less than StartBit, then ASSERT().
1498   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1499   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1500 
1501   @param  Address   MMIO register to write.
1502   @param  StartBit  The ordinal of the least significant bit in the bit field.
1503                     Range 0..7.
1504   @param  EndBit    The ordinal of the most significant bit in the bit field.
1505                     Range 0..7.
1506   @param  AndData   The value to AND with read value from the MMIO register.
1507   @param  OrData    The value to OR with the result of the AND operation.
1508 
1509   @return The value written back to the MMIO register.
1510 
1511 **/
1512 UINT8
1513 EFIAPI
1514 MmioBitFieldAndThenOr8 (
1515   IN      UINTN                     Address,
1516   IN      UINTN                     StartBit,
1517   IN      UINTN                     EndBit,
1518   IN      UINT8                     AndData,
1519   IN      UINT8                     OrData
1520   );
1521 
1522 /**
1523   Reads a 16-bit MMIO register.
1524 
1525   Reads the 16-bit MMIO register specified by Address. The 16-bit read value is
1526   returned. This function must guarantee that all MMIO read and write
1527   operations are serialized.
1528 
1529   If 16-bit MMIO register operations are not supported, then ASSERT().
1530   If Address is not aligned on a 16-bit boundary, then ASSERT().
1531 
1532   @param  Address The MMIO register to read.
1533 
1534   @return The value read.
1535 
1536 **/
1537 UINT16
1538 EFIAPI
1539 MmioRead16 (
1540   IN      UINTN                     Address
1541   );
1542 
1543 /**
1544   Writes a 16-bit MMIO register.
1545 
1546   Writes the 16-bit MMIO register specified by Address with the value specified
1547   by Value and returns Value. This function must guarantee that all MMIO read
1548   and write operations are serialized.
1549 
1550   If 16-bit MMIO register operations are not supported, then ASSERT().
1551   If Address is not aligned on a 16-bit boundary, then ASSERT().
1552 
1553   @param  Address The MMIO register to write.
1554   @param  Value   The value to write to the MMIO register.
1555 
1556   @return Value.
1557 
1558 **/
1559 UINT16
1560 EFIAPI
1561 MmioWrite16 (
1562   IN      UINTN                     Address,
1563   IN      UINT16                    Value
1564   );
1565 
1566 /**
1567   Reads a 16-bit MMIO register, performs a bitwise OR, and writes the
1568   result back to the 16-bit MMIO register.
1569 
1570   Reads the 16-bit MMIO register specified by Address, performs a bitwise
1571   OR between the read result and the value specified by OrData, and
1572   writes the result to the 16-bit MMIO register specified by Address. The value
1573   written to the MMIO register is returned. This function must guarantee that
1574   all MMIO read and write operations are serialized.
1575 
1576   If 16-bit MMIO register operations are not supported, then ASSERT().
1577   If Address is not aligned on a 16-bit boundary, then ASSERT().
1578 
1579   @param  Address The MMIO register to write.
1580   @param  OrData  The value to OR with the read value from the MMIO register.
1581 
1582   @return The value written back to the MMIO register.
1583 
1584 **/
1585 UINT16
1586 EFIAPI
1587 MmioOr16 (
1588   IN      UINTN                     Address,
1589   IN      UINT16                    OrData
1590   );
1591 
1592 /**
1593   Reads a 16-bit MMIO register, performs a bitwise AND, and writes the result
1594   back to the 16-bit MMIO register.
1595 
1596   Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
1597   between the read result and the value specified by AndData, and writes the
1598   result to the 16-bit MMIO register specified by Address. The value written to
1599   the MMIO register is returned. This function must guarantee that all MMIO
1600   read and write operations are serialized.
1601 
1602   If 16-bit MMIO register operations are not supported, then ASSERT().
1603   If Address is not aligned on a 16-bit boundary, then ASSERT().
1604 
1605   @param  Address The MMIO register to write.
1606   @param  AndData The value to AND with the read value from the MMIO register.
1607 
1608   @return The value written back to the MMIO register.
1609 
1610 **/
1611 UINT16
1612 EFIAPI
1613 MmioAnd16 (
1614   IN      UINTN                     Address,
1615   IN      UINT16                    AndData
1616   );
1617 
1618 /**
1619   Reads a 16-bit MMIO register, performs a bitwise AND followed by a bitwise
1620   OR, and writes the result back to the 16-bit MMIO register.
1621 
1622   Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
1623   between the read result and the value specified by AndData, performs a
1624   bitwise OR between the result of the AND operation and the value specified by
1625   OrData, and writes the result to the 16-bit MMIO register specified by
1626   Address. The value written to the MMIO register is returned. This function
1627   must guarantee that all MMIO read and write operations are serialized.
1628 
1629   If 16-bit MMIO register operations are not supported, then ASSERT().
1630   If Address is not aligned on a 16-bit boundary, then ASSERT().
1631 
1632   @param  Address The MMIO register to write.
1633   @param  AndData The value to AND with the read value from the MMIO register.
1634   @param  OrData  The value to OR with the result of the AND operation.
1635 
1636   @return The value written back to the MMIO register.
1637 
1638 **/
1639 UINT16
1640 EFIAPI
1641 MmioAndThenOr16 (
1642   IN      UINTN                     Address,
1643   IN      UINT16                    AndData,
1644   IN      UINT16                    OrData
1645   );
1646 
1647 /**
1648   Reads a bit field of a MMIO register.
1649 
1650   Reads the bit field in a 16-bit MMIO register. The bit field is specified by
1651   the StartBit and the EndBit. The value of the bit field is returned.
1652 
1653   If 16-bit MMIO register operations are not supported, then ASSERT().
1654   If Address is not aligned on a 16-bit boundary, then ASSERT().
1655   If StartBit is greater than 15, then ASSERT().
1656   If EndBit is greater than 15, then ASSERT().
1657   If EndBit is less than StartBit, then ASSERT().
1658 
1659   @param  Address   MMIO register to read.
1660   @param  StartBit  The ordinal of the least significant bit in the bit field.
1661                     Range 0..15.
1662   @param  EndBit    The ordinal of the most significant bit in the bit field.
1663                     Range 0..15.
1664 
1665   @return The value read.
1666 
1667 **/
1668 UINT16
1669 EFIAPI
1670 MmioBitFieldRead16 (
1671   IN      UINTN                     Address,
1672   IN      UINTN                     StartBit,
1673   IN      UINTN                     EndBit
1674   );
1675 
1676 /**
1677   Writes a bit field to a MMIO register.
1678 
1679   Writes Value to the bit field of the MMIO register. The bit field is
1680   specified by the StartBit and the EndBit. All other bits in the destination
1681   MMIO register are preserved. The new value of the 16-bit register is returned.
1682 
1683   If 16-bit MMIO register operations are not supported, then ASSERT().
1684   If Address is not aligned on a 16-bit boundary, then ASSERT().
1685   If StartBit is greater than 15, then ASSERT().
1686   If EndBit is greater than 15, then ASSERT().
1687   If EndBit is less than StartBit, then ASSERT().
1688   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1689 
1690   @param  Address   MMIO register to write.
1691   @param  StartBit  The ordinal of the least significant bit in the bit field.
1692                     Range 0..15.
1693   @param  EndBit    The ordinal of the most significant bit in the bit field.
1694                     Range 0..15.
1695   @param  Value     New value of the bit field.
1696 
1697   @return The value written back to the MMIO register.
1698 
1699 **/
1700 UINT16
1701 EFIAPI
1702 MmioBitFieldWrite16 (
1703   IN      UINTN                     Address,
1704   IN      UINTN                     StartBit,
1705   IN      UINTN                     EndBit,
1706   IN      UINT16                    Value
1707   );
1708 
1709 /**
1710   Reads a bit field in a 16-bit MMIO register, performs a bitwise OR, and
1711   writes the result back to the bit field in the 16-bit MMIO register.
1712 
1713   Reads the 16-bit MMIO register specified by Address, performs a bitwise
1714   OR between the read result and the value specified by OrData, and
1715   writes the result to the 16-bit MMIO register specified by Address. The value
1716   written to the MMIO register is returned. This function must guarantee that
1717   all MMIO read and write operations are serialized. Extra left bits in OrData
1718   are stripped.
1719 
1720   If 16-bit MMIO register operations are not supported, then ASSERT().
1721   If Address is not aligned on a 16-bit boundary, then ASSERT().
1722   If StartBit is greater than 15, then ASSERT().
1723   If EndBit is greater than 15, then ASSERT().
1724   If EndBit is less than StartBit, then ASSERT().
1725   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1726 
1727   @param  Address   MMIO register to write.
1728   @param  StartBit  The ordinal of the least significant bit in the bit field.
1729                     Range 0..15.
1730   @param  EndBit    The ordinal of the most significant bit in the bit field.
1731                     Range 0..15.
1732   @param  OrData    The value to OR with read value from the MMIO register.
1733 
1734   @return The value written back to the MMIO register.
1735 
1736 **/
1737 UINT16
1738 EFIAPI
1739 MmioBitFieldOr16 (
1740   IN      UINTN                     Address,
1741   IN      UINTN                     StartBit,
1742   IN      UINTN                     EndBit,
1743   IN      UINT16                    OrData
1744   );
1745 
1746 /**
1747   Reads a bit field in a 16-bit MMIO register, performs a bitwise AND, and
1748   writes the result back to the bit field in the 16-bit MMIO register.
1749 
1750   Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
1751   between the read result and the value specified by AndData, and writes the
1752   result to the 16-bit MMIO register specified by Address. The value written to
1753   the MMIO register is returned. This function must guarantee that all MMIO
1754   read and write operations are serialized. Extra left bits in AndData are
1755   stripped.
1756 
1757   If 16-bit MMIO register operations are not supported, then ASSERT().
1758   If Address is not aligned on a 16-bit boundary, then ASSERT().
1759   If StartBit is greater than 15, then ASSERT().
1760   If EndBit is greater than 15, then ASSERT().
1761   If EndBit is less than StartBit, then ASSERT().
1762   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1763 
1764   @param  Address   MMIO register to write.
1765   @param  StartBit  The ordinal of the least significant bit in the bit field.
1766                     Range 0..15.
1767   @param  EndBit    The ordinal of the most significant bit in the bit field.
1768                     Range 0..15.
1769   @param  AndData   The value to AND with read value from the MMIO register.
1770 
1771   @return The value written back to the MMIO register.
1772 
1773 **/
1774 UINT16
1775 EFIAPI
1776 MmioBitFieldAnd16 (
1777   IN      UINTN                     Address,
1778   IN      UINTN                     StartBit,
1779   IN      UINTN                     EndBit,
1780   IN      UINT16                    AndData
1781   );
1782 
1783 /**
1784   Reads a bit field in a 16-bit MMIO register, performs a bitwise AND followed
1785   by a bitwise OR, and writes the result back to the bit field in the
1786   16-bit MMIO register.
1787 
1788   Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
1789   followed by a bitwise OR between the read result and the value
1790   specified by AndData, and writes the result to the 16-bit MMIO register
1791   specified by Address. The value written to the MMIO register is returned.
1792   This function must guarantee that all MMIO read and write operations are
1793   serialized. Extra left bits in both AndData and OrData are stripped.
1794 
1795   If 16-bit MMIO register operations are not supported, then ASSERT().
1796   If Address is not aligned on a 16-bit boundary, then ASSERT().
1797   If StartBit is greater than 15, then ASSERT().
1798   If EndBit is greater than 15, then ASSERT().
1799   If EndBit is less than StartBit, then ASSERT().
1800   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1801   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1802 
1803   @param  Address   MMIO register to write.
1804   @param  StartBit  The ordinal of the least significant bit in the bit field.
1805                     Range 0..15.
1806   @param  EndBit    The ordinal of the most significant bit in the bit field.
1807                     Range 0..15.
1808   @param  AndData   The value to AND with read value from the MMIO register.
1809   @param  OrData    The value to OR with the result of the AND operation.
1810 
1811   @return The value written back to the MMIO register.
1812 
1813 **/
1814 UINT16
1815 EFIAPI
1816 MmioBitFieldAndThenOr16 (
1817   IN      UINTN                     Address,
1818   IN      UINTN                     StartBit,
1819   IN      UINTN                     EndBit,
1820   IN      UINT16                    AndData,
1821   IN      UINT16                    OrData
1822   );
1823 
1824 /**
1825   Reads a 32-bit MMIO register.
1826 
1827   Reads the 32-bit MMIO register specified by Address. The 32-bit read value is
1828   returned. This function must guarantee that all MMIO read and write
1829   operations are serialized.
1830 
1831   If 32-bit MMIO register operations are not supported, then ASSERT().
1832   If Address is not aligned on a 32-bit boundary, then ASSERT().
1833 
1834   @param  Address The MMIO register to read.
1835 
1836   @return The value read.
1837 
1838 **/
1839 UINT32
1840 EFIAPI
1841 MmioRead32 (
1842   IN      UINTN                     Address
1843   );
1844 
1845 /**
1846   Writes a 32-bit MMIO register.
1847 
1848   Writes the 32-bit MMIO register specified by Address with the value specified
1849   by Value and returns Value. This function must guarantee that all MMIO read
1850   and write operations are serialized.
1851 
1852   If 32-bit MMIO register operations are not supported, then ASSERT().
1853   If Address is not aligned on a 32-bit boundary, then ASSERT().
1854 
1855   @param  Address The MMIO register to write.
1856   @param  Value   The value to write to the MMIO register.
1857 
1858   @return Value.
1859 
1860 **/
1861 UINT32
1862 EFIAPI
1863 MmioWrite32 (
1864   IN      UINTN                     Address,
1865   IN      UINT32                    Value
1866   );
1867 
1868 /**
1869   Reads a 32-bit MMIO register, performs a bitwise OR, and writes the
1870   result back to the 32-bit MMIO register.
1871 
1872   Reads the 32-bit MMIO register specified by Address, performs a bitwise
1873   OR between the read result and the value specified by OrData, and
1874   writes the result to the 32-bit MMIO register specified by Address. The value
1875   written to the MMIO register is returned. This function must guarantee that
1876   all MMIO read and write operations are serialized.
1877 
1878   If 32-bit MMIO register operations are not supported, then ASSERT().
1879   If Address is not aligned on a 32-bit boundary, then ASSERT().
1880 
1881   @param  Address The MMIO register to write.
1882   @param  OrData  The value to OR with the read value from the MMIO register.
1883 
1884   @return The value written back to the MMIO register.
1885 
1886 **/
1887 UINT32
1888 EFIAPI
1889 MmioOr32 (
1890   IN      UINTN                     Address,
1891   IN      UINT32                    OrData
1892   );
1893 
1894 /**
1895   Reads a 32-bit MMIO register, performs a bitwise AND, and writes the result
1896   back to the 32-bit MMIO register.
1897 
1898   Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
1899   between the read result and the value specified by AndData, and writes the
1900   result to the 32-bit MMIO register specified by Address. The value written to
1901   the MMIO register is returned. This function must guarantee that all MMIO
1902   read and write operations are serialized.
1903 
1904   If 32-bit MMIO register operations are not supported, then ASSERT().
1905   If Address is not aligned on a 32-bit boundary, then ASSERT().
1906 
1907   @param  Address The MMIO register to write.
1908   @param  AndData The value to AND with the read value from the MMIO register.
1909 
1910   @return The value written back to the MMIO register.
1911 
1912 **/
1913 UINT32
1914 EFIAPI
1915 MmioAnd32 (
1916   IN      UINTN                     Address,
1917   IN      UINT32                    AndData
1918   );
1919 
1920 /**
1921   Reads a 32-bit MMIO register, performs a bitwise AND followed by a bitwise
1922   OR, and writes the result back to the 32-bit MMIO register.
1923 
1924   Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
1925   between the read result and the value specified by AndData, performs a
1926   bitwise OR between the result of the AND operation and the value specified by
1927   OrData, and writes the result to the 32-bit MMIO register specified by
1928   Address. The value written to the MMIO register is returned. This function
1929   must guarantee that all MMIO read and write operations are serialized.
1930 
1931   If 32-bit MMIO register operations are not supported, then ASSERT().
1932   If Address is not aligned on a 32-bit boundary, then ASSERT().
1933 
1934   @param  Address The MMIO register to write.
1935   @param  AndData The value to AND with the read value from the MMIO register.
1936   @param  OrData  The value to OR with the result of the AND operation.
1937 
1938   @return The value written back to the MMIO register.
1939 
1940 **/
1941 UINT32
1942 EFIAPI
1943 MmioAndThenOr32 (
1944   IN      UINTN                     Address,
1945   IN      UINT32                    AndData,
1946   IN      UINT32                    OrData
1947   );
1948 
1949 /**
1950   Reads a bit field of a MMIO register.
1951 
1952   Reads the bit field in a 32-bit MMIO register. The bit field is specified by
1953   the StartBit and the EndBit. The value of the bit field is returned.
1954 
1955   If 32-bit MMIO register operations are not supported, then ASSERT().
1956   If Address is not aligned on a 32-bit boundary, then ASSERT().
1957   If StartBit is greater than 31, then ASSERT().
1958   If EndBit is greater than 31, then ASSERT().
1959   If EndBit is less than StartBit, then ASSERT().
1960 
1961   @param  Address   MMIO register to read.
1962   @param  StartBit  The ordinal of the least significant bit in the bit field.
1963                     Range 0..31.
1964   @param  EndBit    The ordinal of the most significant bit in the bit field.
1965                     Range 0..31.
1966 
1967   @return The value read.
1968 
1969 **/
1970 UINT32
1971 EFIAPI
1972 MmioBitFieldRead32 (
1973   IN      UINTN                     Address,
1974   IN      UINTN                     StartBit,
1975   IN      UINTN                     EndBit
1976   );
1977 
1978 /**
1979   Writes a bit field to a MMIO register.
1980 
1981   Writes Value to the bit field of the MMIO register. The bit field is
1982   specified by the StartBit and the EndBit. All other bits in the destination
1983   MMIO register are preserved. The new value of the 32-bit register is returned.
1984 
1985   If 32-bit MMIO register operations are not supported, then ASSERT().
1986   If Address is not aligned on a 32-bit boundary, then ASSERT().
1987   If StartBit is greater than 31, then ASSERT().
1988   If EndBit is greater than 31, then ASSERT().
1989   If EndBit is less than StartBit, then ASSERT().
1990   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
1991 
1992   @param  Address   MMIO register to write.
1993   @param  StartBit  The ordinal of the least significant bit in the bit field.
1994                     Range 0..31.
1995   @param  EndBit    The ordinal of the most significant bit in the bit field.
1996                     Range 0..31.
1997   @param  Value     New value of the bit field.
1998 
1999   @return The value written back to the MMIO register.
2000 
2001 **/
2002 UINT32
2003 EFIAPI
2004 MmioBitFieldWrite32 (
2005   IN      UINTN                     Address,
2006   IN      UINTN                     StartBit,
2007   IN      UINTN                     EndBit,
2008   IN      UINT32                    Value
2009   );
2010 
2011 /**
2012   Reads a bit field in a 32-bit MMIO register, performs a bitwise OR, and
2013   writes the result back to the bit field in the 32-bit MMIO register.
2014 
2015   Reads the 32-bit MMIO register specified by Address, performs a bitwise
2016   OR between the read result and the value specified by OrData, and
2017   writes the result to the 32-bit MMIO register specified by Address. The value
2018   written to the MMIO register is returned. This function must guarantee that
2019   all MMIO read and write operations are serialized. Extra left bits in OrData
2020   are stripped.
2021 
2022   If 32-bit MMIO register operations are not supported, then ASSERT().
2023   If Address is not aligned on a 32-bit boundary, then ASSERT().
2024   If StartBit is greater than 31, then ASSERT().
2025   If EndBit is greater than 31, then ASSERT().
2026   If EndBit is less than StartBit, then ASSERT().
2027   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
2028 
2029   @param  Address   MMIO register to write.
2030   @param  StartBit  The ordinal of the least significant bit in the bit field.
2031                     Range 0..31.
2032   @param  EndBit    The ordinal of the most significant bit in the bit field.
2033                     Range 0..31.
2034   @param  OrData    The value to OR with read value from the MMIO register.
2035 
2036   @return The value written back to the MMIO register.
2037 
2038 **/
2039 UINT32
2040 EFIAPI
2041 MmioBitFieldOr32 (
2042   IN      UINTN                     Address,
2043   IN      UINTN                     StartBit,
2044   IN      UINTN                     EndBit,
2045   IN      UINT32                    OrData
2046   );
2047 
2048 /**
2049   Reads a bit field in a 32-bit MMIO register, performs a bitwise AND, and
2050   writes the result back to the bit field in the 32-bit MMIO register.
2051 
2052   Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
2053   between the read result and the value specified by AndData, and writes the
2054   result to the 32-bit MMIO register specified by Address. The value written to
2055   the MMIO register is returned. This function must guarantee that all MMIO
2056   read and write operations are serialized. Extra left bits in AndData are
2057   stripped.
2058 
2059   If 32-bit MMIO register operations are not supported, then ASSERT().
2060   If Address is not aligned on a 32-bit boundary, then ASSERT().
2061   If StartBit is greater than 31, then ASSERT().
2062   If EndBit is greater than 31, then ASSERT().
2063   If EndBit is less than StartBit, then ASSERT().
2064   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
2065 
2066   @param  Address   MMIO register to write.
2067   @param  StartBit  The ordinal of the least significant bit in the bit field.
2068                     Range 0..31.
2069   @param  EndBit    The ordinal of the most significant bit in the bit field.
2070                     Range 0..31.
2071   @param  AndData   The value to AND with read value from the MMIO register.
2072 
2073   @return The value written back to the MMIO register.
2074 
2075 **/
2076 UINT32
2077 EFIAPI
2078 MmioBitFieldAnd32 (
2079   IN      UINTN                     Address,
2080   IN      UINTN                     StartBit,
2081   IN      UINTN                     EndBit,
2082   IN      UINT32                    AndData
2083   );
2084 
2085 /**
2086   Reads a bit field in a 32-bit MMIO register, performs a bitwise AND followed
2087   by a bitwise OR, and writes the result back to the bit field in the
2088   32-bit MMIO register.
2089 
2090   Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
2091   followed by a bitwise OR between the read result and the value
2092   specified by AndData, and writes the result to the 32-bit MMIO register
2093   specified by Address. The value written to the MMIO register is returned.
2094   This function must guarantee that all MMIO read and write operations are
2095   serialized. Extra left bits in both AndData and OrData are stripped.
2096 
2097   If 32-bit MMIO register operations are not supported, then ASSERT().
2098   If Address is not aligned on a 32-bit boundary, then ASSERT().
2099   If StartBit is greater than 31, then ASSERT().
2100   If EndBit is greater than 31, then ASSERT().
2101   If EndBit is less than StartBit, then ASSERT().
2102   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
2103   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
2104 
2105   @param  Address   MMIO register to write.
2106   @param  StartBit  The ordinal of the least significant bit in the bit field.
2107                     Range 0..31.
2108   @param  EndBit    The ordinal of the most significant bit in the bit field.
2109                     Range 0..31.
2110   @param  AndData   The value to AND with read value from the MMIO register.
2111   @param  OrData    The value to OR with the result of the AND operation.
2112 
2113   @return The value written back to the MMIO register.
2114 
2115 **/
2116 UINT32
2117 EFIAPI
2118 MmioBitFieldAndThenOr32 (
2119   IN      UINTN                     Address,
2120   IN      UINTN                     StartBit,
2121   IN      UINTN                     EndBit,
2122   IN      UINT32                    AndData,
2123   IN      UINT32                    OrData
2124   );
2125 
2126 /**
2127   Reads a 64-bit MMIO register.
2128 
2129   Reads the 64-bit MMIO register specified by Address. The 64-bit read value is
2130   returned. This function must guarantee that all MMIO read and write
2131   operations are serialized.
2132 
2133   If 64-bit MMIO register operations are not supported, then ASSERT().
2134   If Address is not aligned on a 64-bit boundary, then ASSERT().
2135 
2136   @param  Address The MMIO register to read.
2137 
2138   @return The value read.
2139 
2140 **/
2141 UINT64
2142 EFIAPI
2143 MmioRead64 (
2144   IN      UINTN                     Address
2145   );
2146 
2147 /**
2148   Writes a 64-bit MMIO register.
2149 
2150   Writes the 64-bit MMIO register specified by Address with the value specified
2151   by Value and returns Value. This function must guarantee that all MMIO read
2152   and write operations are serialized.
2153 
2154   If 64-bit MMIO register operations are not supported, then ASSERT().
2155   If Address is not aligned on a 64-bit boundary, then ASSERT().
2156 
2157   @param  Address The MMIO register to write.
2158   @param  Value   The value to write to the MMIO register.
2159 
2160 **/
2161 UINT64
2162 EFIAPI
2163 MmioWrite64 (
2164   IN      UINTN                     Address,
2165   IN      UINT64                    Value
2166   );
2167 
2168 /**
2169   Reads a 64-bit MMIO register, performs a bitwise OR, and writes the
2170   result back to the 64-bit MMIO register.
2171 
2172   Reads the 64-bit MMIO register specified by Address, performs a bitwise
2173   OR between the read result and the value specified by OrData, and
2174   writes the result to the 64-bit MMIO register specified by Address. The value
2175   written to the MMIO register is returned. This function must guarantee that
2176   all MMIO read and write operations are serialized.
2177 
2178   If 64-bit MMIO register operations are not supported, then ASSERT().
2179   If Address is not aligned on a 64-bit boundary, then ASSERT().
2180 
2181   @param  Address The MMIO register to write.
2182   @param  OrData  The value to OR with the read value from the MMIO register.
2183 
2184   @return The value written back to the MMIO register.
2185 
2186 **/
2187 UINT64
2188 EFIAPI
2189 MmioOr64 (
2190   IN      UINTN                     Address,
2191   IN      UINT64                    OrData
2192   );
2193 
2194 /**
2195   Reads a 64-bit MMIO register, performs a bitwise AND, and writes the result
2196   back to the 64-bit MMIO register.
2197 
2198   Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
2199   between the read result and the value specified by AndData, and writes the
2200   result to the 64-bit MMIO register specified by Address. The value written to
2201   the MMIO register is returned. This function must guarantee that all MMIO
2202   read and write operations are serialized.
2203 
2204   If 64-bit MMIO register operations are not supported, then ASSERT().
2205   If Address is not aligned on a 64-bit boundary, then ASSERT().
2206 
2207   @param  Address The MMIO register to write.
2208   @param  AndData The value to AND with the read value from the MMIO register.
2209 
2210   @return The value written back to the MMIO register.
2211 
2212 **/
2213 UINT64
2214 EFIAPI
2215 MmioAnd64 (
2216   IN      UINTN                     Address,
2217   IN      UINT64                    AndData
2218   );
2219 
2220 /**
2221   Reads a 64-bit MMIO register, performs a bitwise AND followed by a bitwise
2222   OR, and writes the result back to the 64-bit MMIO register.
2223 
2224   Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
2225   between the read result and the value specified by AndData, performs a
2226   bitwise OR between the result of the AND operation and the value specified by
2227   OrData, and writes the result to the 64-bit MMIO register specified by
2228   Address. The value written to the MMIO register is returned. This function
2229   must guarantee that all MMIO read and write operations are serialized.
2230 
2231   If 64-bit MMIO register operations are not supported, then ASSERT().
2232   If Address is not aligned on a 64-bit boundary, then ASSERT().
2233 
2234   @param  Address The MMIO register to write.
2235   @param  AndData The value to AND with the read value from the MMIO register.
2236   @param  OrData  The value to OR with the result of the AND operation.
2237 
2238   @return The value written back to the MMIO register.
2239 
2240 **/
2241 UINT64
2242 EFIAPI
2243 MmioAndThenOr64 (
2244   IN      UINTN                     Address,
2245   IN      UINT64                    AndData,
2246   IN      UINT64                    OrData
2247   );
2248 
2249 /**
2250   Reads a bit field of a MMIO register.
2251 
2252   Reads the bit field in a 64-bit MMIO register. The bit field is specified by
2253   the StartBit and the EndBit. The value of the bit field is returned.
2254 
2255   If 64-bit MMIO register operations are not supported, then ASSERT().
2256   If Address is not aligned on a 64-bit boundary, then ASSERT().
2257   If StartBit is greater than 63, then ASSERT().
2258   If EndBit is greater than 63, then ASSERT().
2259   If EndBit is less than StartBit, then ASSERT().
2260 
2261   @param  Address   MMIO register to read.
2262   @param  StartBit  The ordinal of the least significant bit in the bit field.
2263                     Range 0..63.
2264   @param  EndBit    The ordinal of the most significant bit in the bit field.
2265                     Range 0..63.
2266 
2267   @return The value read.
2268 
2269 **/
2270 UINT64
2271 EFIAPI
2272 MmioBitFieldRead64 (
2273   IN      UINTN                     Address,
2274   IN      UINTN                     StartBit,
2275   IN      UINTN                     EndBit
2276   );
2277 
2278 /**
2279   Writes a bit field to a MMIO register.
2280 
2281   Writes Value to the bit field of the MMIO register. The bit field is
2282   specified by the StartBit and the EndBit. All other bits in the destination
2283   MMIO register are preserved. The new value of the 64-bit register is returned.
2284 
2285   If 64-bit MMIO register operations are not supported, then ASSERT().
2286   If Address is not aligned on a 64-bit boundary, then ASSERT().
2287   If StartBit is greater than 63, then ASSERT().
2288   If EndBit is greater than 63, then ASSERT().
2289   If EndBit is less than StartBit, then ASSERT().
2290   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
2291 
2292   @param  Address   MMIO register to write.
2293   @param  StartBit  The ordinal of the least significant bit in the bit field.
2294                     Range 0..63.
2295   @param  EndBit    The ordinal of the most significant bit in the bit field.
2296                     Range 0..63.
2297   @param  Value     New value of the bit field.
2298 
2299   @return The value written back to the MMIO register.
2300 
2301 **/
2302 UINT64
2303 EFIAPI
2304 MmioBitFieldWrite64 (
2305   IN      UINTN                     Address,
2306   IN      UINTN                     StartBit,
2307   IN      UINTN                     EndBit,
2308   IN      UINT64                    Value
2309   );
2310 
2311 /**
2312   Reads a bit field in a 64-bit MMIO register, performs a bitwise OR, and
2313   writes the result back to the bit field in the 64-bit MMIO register.
2314 
2315   Reads the 64-bit MMIO register specified by Address, performs a bitwise
2316   OR between the read result and the value specified by OrData, and
2317   writes the result to the 64-bit MMIO register specified by Address. The value
2318   written to the MMIO register is returned. This function must guarantee that
2319   all MMIO read and write operations are serialized. Extra left bits in OrData
2320   are stripped.
2321 
2322   If 64-bit MMIO register operations are not supported, then ASSERT().
2323   If Address is not aligned on a 64-bit boundary, then ASSERT().
2324   If StartBit is greater than 63, then ASSERT().
2325   If EndBit is greater than 63, then ASSERT().
2326   If EndBit is less than StartBit, then ASSERT().
2327   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
2328 
2329   @param  Address   MMIO register to write.
2330   @param  StartBit  The ordinal of the least significant bit in the bit field.
2331                     Range 0..63.
2332   @param  EndBit    The ordinal of the most significant bit in the bit field.
2333                     Range 0..63.
2334   @param  OrData    The value to OR with read value from the MMIO register.
2335 
2336   @return The value written back to the MMIO register.
2337 
2338 **/
2339 UINT64
2340 EFIAPI
2341 MmioBitFieldOr64 (
2342   IN      UINTN                     Address,
2343   IN      UINTN                     StartBit,
2344   IN      UINTN                     EndBit,
2345   IN      UINT64                    OrData
2346   );
2347 
2348 /**
2349   Reads a bit field in a 64-bit MMIO register, performs a bitwise AND, and
2350   writes the result back to the bit field in the 64-bit MMIO register.
2351 
2352   Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
2353   between the read result and the value specified by AndData, and writes the
2354   result to the 64-bit MMIO register specified by Address. The value written to
2355   the MMIO register is returned. This function must guarantee that all MMIO
2356   read and write operations are serialized. Extra left bits in AndData are
2357   stripped.
2358 
2359   If 64-bit MMIO register operations are not supported, then ASSERT().
2360   If Address is not aligned on a 64-bit boundary, then ASSERT().
2361   If StartBit is greater than 63, then ASSERT().
2362   If EndBit is greater than 63, then ASSERT().
2363   If EndBit is less than StartBit, then ASSERT().
2364   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
2365 
2366   @param  Address   MMIO register to write.
2367   @param  StartBit  The ordinal of the least significant bit in the bit field.
2368                     Range 0..63.
2369   @param  EndBit    The ordinal of the most significant bit in the bit field.
2370                     Range 0..63.
2371   @param  AndData   The value to AND with read value from the MMIO register.
2372 
2373   @return The value written back to the MMIO register.
2374 
2375 **/
2376 UINT64
2377 EFIAPI
2378 MmioBitFieldAnd64 (
2379   IN      UINTN                     Address,
2380   IN      UINTN                     StartBit,
2381   IN      UINTN                     EndBit,
2382   IN      UINT64                    AndData
2383   );
2384 
2385 /**
2386   Reads a bit field in a 64-bit MMIO register, performs a bitwise AND followed
2387   by a bitwise OR, and writes the result back to the bit field in the
2388   64-bit MMIO register.
2389 
2390   Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
2391   followed by a bitwise OR between the read result and the value
2392   specified by AndData, and writes the result to the 64-bit MMIO register
2393   specified by Address. The value written to the MMIO register is returned.
2394   This function must guarantee that all MMIO read and write operations are
2395   serialized. Extra left bits in both AndData and OrData are stripped.
2396 
2397   If 64-bit MMIO register operations are not supported, then ASSERT().
2398   If Address is not aligned on a 64-bit boundary, then ASSERT().
2399   If StartBit is greater than 63, then ASSERT().
2400   If EndBit is greater than 63, then ASSERT().
2401   If EndBit is less than StartBit, then ASSERT().
2402   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
2403   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
2404 
2405   @param  Address   MMIO register to write.
2406   @param  StartBit  The ordinal of the least significant bit in the bit field.
2407                     Range 0..63.
2408   @param  EndBit    The ordinal of the most significant bit in the bit field.
2409                     Range 0..63.
2410   @param  AndData   The value to AND with read value from the MMIO register.
2411   @param  OrData    The value to OR with the result of the AND operation.
2412 
2413   @return The value written back to the MMIO register.
2414 
2415 **/
2416 UINT64
2417 EFIAPI
2418 MmioBitFieldAndThenOr64 (
2419   IN      UINTN                     Address,
2420   IN      UINTN                     StartBit,
2421   IN      UINTN                     EndBit,
2422   IN      UINT64                    AndData,
2423   IN      UINT64                    OrData
2424   );
2425 
2426 /**
2427   Copy data from MMIO region to system memory by using 8-bit access.
2428 
2429   Copy data from MMIO region specified by starting address StartAddress
2430   to system memory specified by Buffer by using 8-bit access. The total
2431   number of byte to be copied is specified by Length. Buffer is returned.
2432 
2433   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
2434   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
2435 
2436 
2437   @param  StartAddress    Starting address for the MMIO region to be copied from.
2438   @param  Length          The size, in bytes, of Buffer.
2439   @param  Buffer          Pointer to a system memory buffer receiving the data read.
2440 
2441   @return Buffer
2442 
2443 **/
2444 UINT8 *
2445 EFIAPI
2446 MmioReadBuffer8 (
2447   IN  UINTN       StartAddress,
2448   IN  UINTN       Length,
2449   OUT UINT8       *Buffer
2450   );
2451 
2452 /**
2453   Copy data from MMIO region to system memory by using 16-bit access.
2454 
2455   Copy data from MMIO region specified by starting address StartAddress
2456   to system memory specified by Buffer by using 16-bit access. The total
2457   number of byte to be copied is specified by Length. Buffer is returned.
2458 
2459   If StartAddress is not aligned on a 16-bit boundary, then ASSERT().
2460 
2461   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
2462   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
2463 
2464   If Length is not aligned on a 16-bit boundary, then ASSERT().
2465   If Buffer is not aligned on a 16-bit boundary, then ASSERT().
2466 
2467   @param  StartAddress    Starting address for the MMIO region to be copied from.
2468   @param  Length          The size, in bytes, of Buffer.
2469   @param  Buffer          Pointer to a system memory buffer receiving the data read.
2470 
2471   @return Buffer
2472 
2473 **/
2474 UINT16 *
2475 EFIAPI
2476 MmioReadBuffer16 (
2477   IN  UINTN       StartAddress,
2478   IN  UINTN       Length,
2479   OUT UINT16      *Buffer
2480   );
2481 
2482 /**
2483   Copy data from MMIO region to system memory by using 32-bit access.
2484 
2485   Copy data from MMIO region specified by starting address StartAddress
2486   to system memory specified by Buffer by using 32-bit access. The total
2487   number of byte to be copied is specified by Length. Buffer is returned.
2488 
2489   If StartAddress is not aligned on a 32-bit boundary, then ASSERT().
2490 
2491   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
2492   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
2493 
2494   If Length is not aligned on a 32-bit boundary, then ASSERT().
2495   If Buffer is not aligned on a 32-bit boundary, then ASSERT().
2496 
2497   @param  StartAddress    Starting address for the MMIO region to be copied from.
2498   @param  Length          The size, in bytes, of Buffer.
2499   @param  Buffer          Pointer to a system memory buffer receiving the data read.
2500 
2501   @return Buffer
2502 
2503 **/
2504 UINT32 *
2505 EFIAPI
2506 MmioReadBuffer32 (
2507   IN  UINTN       StartAddress,
2508   IN  UINTN       Length,
2509   OUT UINT32      *Buffer
2510   );
2511 
2512 /**
2513   Copy data from MMIO region to system memory by using 64-bit access.
2514 
2515   Copy data from MMIO region specified by starting address StartAddress
2516   to system memory specified by Buffer by using 64-bit access. The total
2517   number of byte to be copied is specified by Length. Buffer is returned.
2518 
2519   If StartAddress is not aligned on a 64-bit boundary, then ASSERT().
2520 
2521   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
2522   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
2523 
2524   If Length is not aligned on a 64-bit boundary, then ASSERT().
2525   If Buffer is not aligned on a 64-bit boundary, then ASSERT().
2526 
2527   @param  StartAddress    Starting address for the MMIO region to be copied from.
2528   @param  Length          The size, in bytes, of Buffer.
2529   @param  Buffer          Pointer to a system memory buffer receiving the data read.
2530 
2531   @return Buffer
2532 
2533 **/
2534 UINT64 *
2535 EFIAPI
2536 MmioReadBuffer64 (
2537   IN  UINTN       StartAddress,
2538   IN  UINTN       Length,
2539   OUT UINT64      *Buffer
2540   );
2541 
2542 /**
2543   Copy data from system memory to MMIO region by using 8-bit access.
2544 
2545   Copy data from system memory specified by Buffer to MMIO region specified
2546   by starting address StartAddress by using 8-bit access. The total number
2547   of byte to be copied is specified by Length. Buffer is returned.
2548 
2549   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
2550   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
2551 
2552 
2553   @param  StartAddress    Starting address for the MMIO region to be copied to.
2554   @param  Length          The size, in bytes, of Buffer.
2555   @param  Buffer          Pointer to a system memory buffer containing the data to write.
2556 
2557   @return Buffer
2558 
2559 **/
2560 UINT8 *
2561 EFIAPI
2562 MmioWriteBuffer8 (
2563   IN  UINTN         StartAddress,
2564   IN  UINTN         Length,
2565   IN  CONST UINT8   *Buffer
2566   );
2567 
2568 /**
2569   Copy data from system memory to MMIO region by using 16-bit access.
2570 
2571   Copy data from system memory specified by Buffer to MMIO region specified
2572   by starting address StartAddress by using 16-bit access. The total number
2573   of byte to be copied is specified by Length. Buffer is returned.
2574 
2575   If StartAddress is not aligned on a 16-bit boundary, then ASSERT().
2576 
2577   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
2578   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
2579 
2580   If Length is not aligned on a 16-bit boundary, then ASSERT().
2581 
2582   If Buffer is not aligned on a 16-bit boundary, then ASSERT().
2583 
2584   @param  StartAddress    Starting address for the MMIO region to be copied to.
2585   @param  Length          The size, in bytes, of Buffer.
2586   @param  Buffer          Pointer to a system memory buffer containing the data to write.
2587 
2588   @return Buffer
2589 
2590 **/
2591 UINT16 *
2592 EFIAPI
2593 MmioWriteBuffer16 (
2594   IN  UINTN        StartAddress,
2595   IN  UINTN        Length,
2596   IN  CONST UINT16 *Buffer
2597   );
2598 
2599 /**
2600   Copy data from system memory to MMIO region by using 32-bit access.
2601 
2602   Copy data from system memory specified by Buffer to MMIO region specified
2603   by starting address StartAddress by using 32-bit access. The total number
2604   of byte to be copied is specified by Length. Buffer is returned.
2605 
2606   If StartAddress is not aligned on a 32-bit boundary, then ASSERT().
2607 
2608   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
2609   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
2610 
2611   If Length is not aligned on a 32-bit boundary, then ASSERT().
2612 
2613   If Buffer is not aligned on a 32-bit boundary, then ASSERT().
2614 
2615   @param  StartAddress    Starting address for the MMIO region to be copied to.
2616   @param  Length          The size, in bytes, of Buffer.
2617   @param  Buffer          Pointer to a system memory buffer containing the data to write.
2618 
2619   @return Buffer
2620 
2621 **/
2622 UINT32 *
2623 EFIAPI
2624 MmioWriteBuffer32 (
2625   IN  UINTN        StartAddress,
2626   IN  UINTN        Length,
2627   IN  CONST UINT32 *Buffer
2628   );
2629 
2630 /**
2631   Copy data from system memory to MMIO region by using 64-bit access.
2632 
2633   Copy data from system memory specified by Buffer to MMIO region specified
2634   by starting address StartAddress by using 64-bit access. The total number
2635   of byte to be copied is specified by Length. Buffer is returned.
2636 
2637   If StartAddress is not aligned on a 64-bit boundary, then ASSERT().
2638 
2639   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
2640   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
2641 
2642   If Length is not aligned on a 64-bit boundary, then ASSERT().
2643 
2644   If Buffer is not aligned on a 64-bit boundary, then ASSERT().
2645 
2646   @param  StartAddress    Starting address for the MMIO region to be copied to.
2647   @param  Length          The size, in bytes, of Buffer.
2648   @param  Buffer          Pointer to a system memory buffer containing the data to write.
2649 
2650   @return Buffer
2651 
2652 **/
2653 UINT64 *
2654 EFIAPI
2655 MmioWriteBuffer64 (
2656   IN  UINTN        StartAddress,
2657   IN  UINTN        Length,
2658   IN  CONST UINT64 *Buffer
2659   );
2660 
2661 
2662 #endif
2663 
2664