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