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