]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/DxeIoLibEsal/IoHighLevel.c
Add ASSERT() for BitField operations to make sure the input value is valid.
[mirror_edk2.git] / MdePkg / Library / DxeIoLibEsal / IoHighLevel.c
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 }