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