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