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