1 /** @file 2 I/O and MMIO Library Services that do I/O and also enable the I/O operatation 3 to be replayed during an S3 resume. 4 5 Copyright (c) 2006 -2012, Intel Corporation. All rights reserved.<BR> 6 7 This program and the accompanying materials 8 are licensed and made available under the terms and conditions 9 of the BSD License which accompanies this distribution. The 10 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 **/ 17 18 #include <Base.h> 19 20 #include <Library/S3IoLib.h> 21 #include <Library/DebugLib.h> 22 #include <Library/IoLib.h> 23 #include <Library/S3BootScriptLib.h> 24 25 26 /** 27 Saves an I/O port value to the boot script. 28 29 This internal worker function saves an I/O port value in the S3 script 30 to be replayed on S3 resume. 31 32 If the saving process fails, then ASSERT(). 33 34 @param Width The width of I/O port. 35 @param Port The I/O port to write. 36 @param Buffer The buffer containing value. 37 38 **/ 39 VOID 40 InternalSaveIoWriteValueToBootScript ( 41 IN S3_BOOT_SCRIPT_LIB_WIDTH Width, 42 IN UINTN Port, 43 IN VOID *Buffer 44 ) 45 { 46 RETURN_STATUS Status; 47 48 Status = S3BootScriptSaveIoWrite ( 49 Width, 50 Port, 51 1, 52 Buffer 53 ); 54 ASSERT (Status == RETURN_SUCCESS); 55 } 56 57 /** 58 Saves an 8-bit I/O port value to the boot script. 59 60 This internal worker function saves an 8-bit I/O port value in the S3 script 61 to be replayed on S3 resume. 62 63 If the saving process fails, then ASSERT(). 64 65 @param Port The I/O port to write. 66 @param Value The value saved to boot script. 67 68 @return Value. 69 70 **/ 71 UINT8 72 InternalSaveIoWrite8ValueToBootScript ( 73 IN UINTN Port, 74 IN UINT8 Value 75 ) 76 { 77 InternalSaveIoWriteValueToBootScript (S3BootScriptWidthUint8, Port, &Value); 78 79 return Value; 80 } 81 82 /** 83 Reads an 8-bit I/O port and saves the value in the S3 script to be replayed 84 on S3 resume. 85 86 Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned. 87 This function must guarantee that all I/O read and write operations are 88 serialized. 89 90 If 8-bit I/O port operations are not supported, then ASSERT(). 91 92 @param Port The I/O port to read. 93 94 @return The value read. 95 96 **/ 97 UINT8 98 EFIAPI 99 S3IoRead8 ( 100 IN UINTN Port 101 ) 102 { 103 return InternalSaveIoWrite8ValueToBootScript (Port, IoRead8 (Port)); 104 } 105 106 /** 107 Writes an 8-bit I/O port and saves the value in the S3 script to be replayed 108 on S3 resume. 109 110 Writes the 8-bit I/O port specified by Port with the value specified by Value 111 and returns Value. This function must guarantee that all I/O read and write 112 operations are serialized. 113 114 If 8-bit I/O port operations are not supported, then ASSERT(). 115 116 @param Port The I/O port to write. 117 @param Value The value to write to the I/O port. 118 119 @return The value written the I/O port. 120 121 **/ 122 UINT8 123 EFIAPI 124 S3IoWrite8 ( 125 IN UINTN Port, 126 IN UINT8 Value 127 ) 128 { 129 return InternalSaveIoWrite8ValueToBootScript (Port, IoWrite8 (Port, Value)); 130 } 131 132 /** 133 Reads an 8-bit I/O port, performs a bitwise OR, and writes the 134 result back to the 8-bit I/O port and saves the value in the S3 script to be 135 replayed on S3 resume. 136 137 Reads the 8-bit I/O port specified by Port, performs a bitwise OR 138 between the read result and the value specified by OrData, and writes the 139 result to the 8-bit I/O port specified by Port. The value written to the I/O 140 port is returned. This function must guarantee that all I/O read and write 141 operations are serialized. 142 143 If 8-bit I/O port operations are not supported, then ASSERT(). 144 145 @param Port The I/O port to write. 146 @param OrData The value to OR with the read value from the I/O port. 147 148 @return The value written back to the I/O port. 149 150 **/ 151 UINT8 152 EFIAPI 153 S3IoOr8 ( 154 IN UINTN Port, 155 IN UINT8 OrData 156 ) 157 { 158 return InternalSaveIoWrite8ValueToBootScript (Port, IoOr8 (Port, OrData)); 159 } 160 161 /** 162 Reads an 8-bit I/O port, performs a bitwise AND, and writes the result back 163 to the 8-bit I/O port and saves the value in the S3 script to be replayed 164 on S3 resume. 165 166 Reads the 8-bit I/O port specified by Port, performs a bitwise AND between 167 the read result and the value specified by AndData, and writes the result to 168 the 8-bit I/O port specified by Port. The value written to the I/O port is 169 returned. This function must guarantee that all I/O read and write operations 170 are serialized. 171 172 If 8-bit I/O port operations are not supported, then ASSERT(). 173 174 @param Port The I/O port to write. 175 @param AndData The value to AND with the read value from the I/O port. 176 177 @return The value written back to the I/O port. 178 179 **/ 180 UINT8 181 EFIAPI 182 S3IoAnd8 ( 183 IN UINTN Port, 184 IN UINT8 AndData 185 ) 186 { 187 return InternalSaveIoWrite8ValueToBootScript (Port, IoAnd8 (Port, AndData)); 188 } 189 190 /** 191 Reads an 8-bit I/O port, performs a bitwise AND followed by a bitwise 192 inclusive OR, and writes the result back to the 8-bit I/O port and saves 193 the value in the S3 script to be replayed on S3 resume. 194 195 Reads the 8-bit I/O port specified by Port, performs a bitwise AND between 196 the read result and the value specified by AndData, performs a bitwise OR 197 between the result of the AND operation and the value specified by OrData, 198 and writes the result to the 8-bit I/O port specified by Port. The value 199 written to the I/O port is returned. This function must guarantee that all 200 I/O read and write operations are serialized. 201 202 If 8-bit I/O port operations are not supported, then ASSERT(). 203 204 @param Port The I/O port to write. 205 @param AndData The value to AND with the read value from the I/O port. 206 @param OrData The value to OR with the result of the AND operation. 207 208 @return The value written back to the I/O port. 209 210 **/ 211 UINT8 212 EFIAPI 213 S3IoAndThenOr8 ( 214 IN UINTN Port, 215 IN UINT8 AndData, 216 IN UINT8 OrData 217 ) 218 { 219 return InternalSaveIoWrite8ValueToBootScript (Port, IoAndThenOr8 (Port, AndData, OrData)); 220 } 221 222 /** 223 Reads a bit field of an I/O register and saves the value in the S3 script to 224 be replayed on S3 resume. 225 226 Reads the bit field in an 8-bit I/O register. The bit field is specified by 227 the StartBit and the EndBit. The value of the bit field is returned. 228 229 If 8-bit I/O port operations are not supported, then ASSERT(). 230 If StartBit is greater than 7, then ASSERT(). 231 If EndBit is greater than 7, then ASSERT(). 232 If EndBit is less than StartBit, then ASSERT(). 233 234 @param Port The I/O port to read. 235 @param StartBit The ordinal of the least significant bit in the bit field. 236 Range 0..7. 237 @param EndBit The ordinal of the most significant bit in the bit field. 238 Range 0..7. 239 240 @return The value read. 241 242 **/ 243 UINT8 244 EFIAPI 245 S3IoBitFieldRead8 ( 246 IN UINTN Port, 247 IN UINTN StartBit, 248 IN UINTN EndBit 249 ) 250 { 251 return InternalSaveIoWrite8ValueToBootScript (Port, IoBitFieldRead8 (Port, StartBit, EndBit)); 252 } 253 254 /** 255 Writes a bit field to an I/O register and saves the value in the S3 script to 256 be replayed on S3 resume. 257 258 Writes Value to the bit field of the I/O register. The bit field is specified 259 by the StartBit and the EndBit. All other bits in the destination I/O 260 register are preserved. The value written to the I/O port is returned. Extra 261 left bits in Value are stripped. 262 263 If 8-bit I/O port operations are not supported, then ASSERT(). 264 If StartBit is greater than 7, then ASSERT(). 265 If EndBit is greater than 7, then ASSERT(). 266 If EndBit is less than StartBit, then ASSERT(). 267 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 268 269 @param Port The I/O port to write. 270 @param StartBit The ordinal of the least significant bit in the bit field. 271 Range 0..7. 272 @param EndBit The ordinal of the most significant bit in the bit field. 273 Range 0..7. 274 @param Value New value of the bit field. 275 276 @return The value written back to the I/O port. 277 278 **/ 279 UINT8 280 EFIAPI 281 S3IoBitFieldWrite8 ( 282 IN UINTN Port, 283 IN UINTN StartBit, 284 IN UINTN EndBit, 285 IN UINT8 Value 286 ) 287 { 288 return InternalSaveIoWrite8ValueToBootScript (Port, IoBitFieldWrite8 (Port, StartBit, EndBit, Value)); 289 } 290 291 /** 292 Reads a bit field in an 8-bit port, performs a bitwise OR, and writes the 293 result back to the bit field in the 8-bit port and saves the value in the 294 S3 script to be replayed on S3 resume. 295 296 Reads the 8-bit I/O port specified by Port, performs a bitwise OR 297 between the read result and the value specified by OrData, and writes the 298 result to the 8-bit I/O port specified by Port. The value written to the I/O 299 port is returned. This function must guarantee that all I/O read and write 300 operations are serialized. Extra left bits in OrData are stripped. 301 302 If 8-bit I/O port operations are not supported, then ASSERT(). 303 If StartBit is greater than 7, then ASSERT(). 304 If EndBit is greater than 7, then ASSERT(). 305 If EndBit is less than StartBit, then ASSERT(). 306 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 307 308 @param Port The I/O port to write. 309 @param StartBit The ordinal of the least significant bit in the bit field. 310 Range 0..7. 311 @param EndBit The ordinal of the most significant bit in the bit field. 312 Range 0..7. 313 @param OrData The value to OR with the read value from the I/O port. 314 315 @return The value written back to the I/O port. 316 317 **/ 318 UINT8 319 EFIAPI 320 S3IoBitFieldOr8 ( 321 IN UINTN Port, 322 IN UINTN StartBit, 323 IN UINTN EndBit, 324 IN UINT8 OrData 325 ) 326 { 327 return InternalSaveIoWrite8ValueToBootScript (Port, IoBitFieldOr8 (Port, StartBit, EndBit, OrData)); 328 } 329 330 /** 331 Reads a bit field in an 8-bit port, performs a bitwise AND, and writes the 332 result back to the bit field in the 8-bit port and saves the value in the 333 S3 script to be replayed on S3 resume. 334 335 Reads the 8-bit I/O port specified by Port, performs a bitwise AND between 336 the read result and the value specified by AndData, and writes the result to 337 the 8-bit I/O port specified by Port. The value written to the I/O port is 338 returned. This function must guarantee that all I/O read and write operations 339 are serialized. Extra left bits in AndData are stripped. 340 341 If 8-bit I/O port operations are not supported, then ASSERT(). 342 If StartBit is greater than 7, then ASSERT(). 343 If EndBit is greater than 7, then ASSERT(). 344 If EndBit is less than StartBit, then ASSERT(). 345 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 346 347 @param Port The I/O port to write. 348 @param StartBit The ordinal of the least significant bit in the bit field. 349 Range 0..7. 350 @param EndBit The ordinal of the most significant bit in the bit field. 351 Range 0..7. 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 UINT8 358 EFIAPI 359 S3IoBitFieldAnd8 ( 360 IN UINTN Port, 361 IN UINTN StartBit, 362 IN UINTN EndBit, 363 IN UINT8 AndData 364 ) 365 { 366 return InternalSaveIoWrite8ValueToBootScript (Port, IoBitFieldAnd8 (Port, StartBit, EndBit, AndData)); 367 } 368 369 /** 370 Reads a bit field in an 8-bit port, performs a bitwise AND followed by a 371 bitwise OR, and writes the result back to the bit field in the 372 8-bit port and saves the value in the S3 script to be replayed on S3 resume. 373 374 Reads the 8-bit I/O port specified by Port, performs a bitwise AND followed 375 by a bitwise OR between the read result and the value specified by 376 AndData, and writes the result to the 8-bit I/O port specified by Port. The 377 value written to the I/O port is returned. This function must guarantee that 378 all I/O read and write operations are serialized. Extra left bits in both 379 AndData and OrData are stripped. 380 381 If 8-bit I/O port operations are not supported, then ASSERT(). 382 If StartBit is greater than 7, then ASSERT(). 383 If EndBit is greater than 7, then ASSERT(). 384 If EndBit is less than StartBit, then ASSERT(). 385 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 386 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 387 388 @param Port The I/O port to write. 389 @param StartBit The ordinal of the least significant bit in the bit field. 390 Range 0..7. 391 @param EndBit The ordinal of the most significant bit in the bit field. 392 Range 0..7. 393 @param AndData The value to AND with the read value from the I/O port. 394 @param OrData The value to OR with the result of the AND operation. 395 396 @return The value written back to the I/O port. 397 398 **/ 399 UINT8 400 EFIAPI 401 S3IoBitFieldAndThenOr8 ( 402 IN UINTN Port, 403 IN UINTN StartBit, 404 IN UINTN EndBit, 405 IN UINT8 AndData, 406 IN UINT8 OrData 407 ) 408 { 409 return InternalSaveIoWrite8ValueToBootScript (Port, IoBitFieldAndThenOr8 (Port, StartBit, EndBit, AndData, OrData)); 410 } 411 412 /** 413 Saves a 16-bit I/O port value to the boot script. 414 415 This internal worker function saves a 16-bit I/O port value in the S3 script 416 to be replayed on S3 resume. 417 418 If the saving process fails, then ASSERT(). 419 420 @param Port The I/O port to write. 421 @param Value The value saved to boot script. 422 423 @return Value. 424 425 **/ 426 UINT16 427 InternalSaveIoWrite16ValueToBootScript ( 428 IN UINTN Port, 429 IN UINT16 Value 430 ) 431 { 432 InternalSaveIoWriteValueToBootScript (S3BootScriptWidthUint16, Port, &Value); 433 434 return Value; 435 } 436 437 /** 438 Reads a 16-bit I/O port and saves the value in the S3 script to be replayed 439 on S3 resume. 440 441 Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned. 442 This function must guarantee that all I/O read and write operations are 443 serialized. 444 445 If 16-bit I/O port operations are not supported, then ASSERT(). 446 447 @param Port The I/O port to read. 448 449 @return The value read. 450 451 **/ 452 UINT16 453 EFIAPI 454 S3IoRead16 ( 455 IN UINTN Port 456 ) 457 { 458 return InternalSaveIoWrite16ValueToBootScript (Port, IoRead16 (Port)); 459 } 460 461 /** 462 Writes a 16-bit I/O port and saves the value in the S3 script to be replayed 463 on S3 resume. 464 465 Writes the 16-bit I/O port specified by Port with the value specified by Value 466 and returns Value. This function must guarantee that all I/O read and write 467 operations are serialized. 468 469 If 16-bit I/O port operations are not supported, then ASSERT(). 470 471 @param Port The I/O port to write. 472 @param Value The value to write to the I/O port. 473 474 @return The value written the I/O port. 475 476 **/ 477 UINT16 478 EFIAPI 479 S3IoWrite16 ( 480 IN UINTN Port, 481 IN UINT16 Value 482 ) 483 { 484 return InternalSaveIoWrite16ValueToBootScript (Port, IoWrite16 (Port, Value)); 485 } 486 487 /** 488 Reads a 16-bit I/O port, performs a bitwise OR, and writes the 489 result back to the 16-bit I/O port and saves the value in the S3 script to 490 be replayed on S3 resume. 491 492 Reads the 16-bit I/O port specified by Port, performs a bitwise OR 493 between the read result and the value specified by OrData, and writes the 494 result to the 16-bit I/O port specified by Port. The value written to the I/O 495 port is returned. This function must guarantee that all I/O read and write 496 operations are serialized. 497 498 If 16-bit I/O port operations are not supported, then ASSERT(). 499 500 @param Port The I/O port to write. 501 @param OrData The value to OR with the read value from the I/O port. 502 503 @return The value written back to the I/O port. 504 505 **/ 506 UINT16 507 EFIAPI 508 S3IoOr16 ( 509 IN UINTN Port, 510 IN UINT16 OrData 511 ) 512 { 513 return InternalSaveIoWrite16ValueToBootScript (Port, IoOr16 (Port, OrData)); 514 } 515 516 /** 517 Reads a 16-bit I/O port, performs a bitwise AND, and writes the result back 518 to the 16-bit I/O port and saves the value in the S3 script to be replayed 519 on S3 resume. 520 521 Reads the 16-bit I/O port specified by Port, performs a bitwise AND between 522 the read result and the value specified by AndData, and writes the result to 523 the 16-bit I/O port specified by Port. The value written to the I/O port is 524 returned. This function must guarantee that all I/O read and write operations 525 are serialized. 526 527 If 16-bit I/O port operations are not supported, then ASSERT(). 528 529 @param Port The I/O port to write. 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 S3IoAnd16 ( 538 IN UINTN Port, 539 IN UINT16 AndData 540 ) 541 { 542 return InternalSaveIoWrite16ValueToBootScript (Port, IoAnd16 (Port, AndData)); 543 } 544 545 /** 546 Reads a 16-bit I/O port, performs a bitwise AND followed by a bitwise 547 inclusive OR, and writes the result back to the 16-bit I/O port and saves 548 the value in the S3 script to be replayed on S3 resume. 549 550 Reads the 16-bit I/O port specified by Port, performs a bitwise AND between 551 the read result and the value specified by AndData, performs a bitwise OR 552 between the result of the AND operation and the value specified by OrData, 553 and writes the result to the 16-bit I/O port specified by Port. The value 554 written to the I/O port is returned. This function must guarantee that all 555 I/O read and write operations are serialized. 556 557 If 16-bit I/O port operations are not supported, then ASSERT(). 558 559 @param Port The I/O port to write. 560 @param AndData The value to AND with the read value from the I/O port. 561 @param OrData The value to OR with the result of the AND operation. 562 563 @return The value written back to the I/O port. 564 565 **/ 566 UINT16 567 EFIAPI 568 S3IoAndThenOr16 ( 569 IN UINTN Port, 570 IN UINT16 AndData, 571 IN UINT16 OrData 572 ) 573 { 574 return InternalSaveIoWrite16ValueToBootScript (Port, IoAndThenOr16 (Port, AndData, OrData)); 575 } 576 577 /** 578 Reads a bit field of an I/O register saves the value in the S3 script to be 579 replayed on S3 resume. 580 581 Reads the bit field in a 16-bit I/O register. The bit field is specified by 582 the StartBit and the EndBit. The value of the bit field is returned. 583 584 If 16-bit I/O port operations are not supported, then ASSERT(). 585 If StartBit is greater than 15, then ASSERT(). 586 If EndBit is greater than 15, then ASSERT(). 587 If EndBit is less than StartBit, then ASSERT(). 588 589 @param Port The I/O port to read. 590 @param StartBit The ordinal of the least significant bit in the bit field. 591 Range 0..15. 592 @param EndBit The ordinal of the most significant bit in the bit field. 593 Range 0..15. 594 595 @return The value read. 596 597 **/ 598 UINT16 599 EFIAPI 600 S3IoBitFieldRead16 ( 601 IN UINTN Port, 602 IN UINTN StartBit, 603 IN UINTN EndBit 604 ) 605 { 606 return InternalSaveIoWrite16ValueToBootScript (Port, IoBitFieldRead16 (Port, StartBit, EndBit)); 607 } 608 609 /** 610 Writes a bit field to an I/O register and saves the value in the S3 script 611 to be replayed on S3 resume. 612 613 Writes Value to the bit field of the I/O register. The bit field is specified 614 by the StartBit and the EndBit. All other bits in the destination I/O 615 register are preserved. The value written to the I/O port is returned. Extra 616 left bits in Value are stripped. 617 618 If 16-bit I/O port operations are not supported, then ASSERT(). 619 If StartBit is greater than 15, then ASSERT(). 620 If EndBit is greater than 15, then ASSERT(). 621 If EndBit is less than StartBit, then ASSERT(). 622 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 623 624 @param Port The I/O port to write. 625 @param StartBit The ordinal of the least significant bit in the bit field. 626 Range 0..15. 627 @param EndBit The ordinal of the most significant bit in the bit field. 628 Range 0..15. 629 @param Value New value of the bit field. 630 631 @return The value written back to the I/O port. 632 633 **/ 634 UINT16 635 EFIAPI 636 S3IoBitFieldWrite16 ( 637 IN UINTN Port, 638 IN UINTN StartBit, 639 IN UINTN EndBit, 640 IN UINT16 Value 641 ) 642 { 643 return InternalSaveIoWrite16ValueToBootScript (Port, IoBitFieldWrite16 (Port, StartBit, EndBit, Value)); 644 } 645 646 /** 647 Reads a bit field in a 16-bit port, performs a bitwise OR, and writes the 648 result back to the bit field in the 16-bit port and saves the value in the 649 S3 script to be replayed on S3 resume. 650 651 Reads the 16-bit I/O port specified by Port, performs a bitwise OR 652 between the read result and the value specified by OrData, and writes the 653 result to the 16-bit I/O port specified by Port. The value written to the I/O 654 port is returned. This function must guarantee that all I/O read and write 655 operations are serialized. Extra left bits in OrData are stripped. 656 657 If 16-bit I/O port operations are not supported, then ASSERT(). 658 If StartBit is greater than 15, then ASSERT(). 659 If EndBit is greater than 15, then ASSERT(). 660 If EndBit is less than StartBit, then ASSERT(). 661 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 662 663 @param Port The I/O port to write. 664 @param StartBit The ordinal of the least significant bit in the bit field. 665 Range 0..15. 666 @param EndBit The ordinal of the most significant bit in the bit field. 667 Range 0..15. 668 @param OrData The value to OR with the read value from the I/O port. 669 670 @return The value written back to the I/O port. 671 672 **/ 673 UINT16 674 EFIAPI 675 S3IoBitFieldOr16 ( 676 IN UINTN Port, 677 IN UINTN StartBit, 678 IN UINTN EndBit, 679 IN UINT16 OrData 680 ) 681 { 682 return InternalSaveIoWrite16ValueToBootScript (Port, IoBitFieldOr16 (Port, StartBit, EndBit, OrData)); 683 } 684 685 /** 686 Reads a bit field in a 16-bit port, performs a bitwise AND, and writes the 687 result back to the bit field in the 16-bit port and saves the value in the 688 S3 script to be replayed on S3 resume. 689 690 Reads the 16-bit I/O port specified by Port, performs a bitwise AND between 691 the read result and the value specified by AndData, and writes the result to 692 the 16-bit I/O port specified by Port. The value written to the I/O port is 693 returned. This function must guarantee that all I/O read and write operations 694 are serialized. Extra left bits in AndData are stripped. 695 696 If 16-bit I/O port operations are not supported, then ASSERT(). 697 If StartBit is greater than 15, then ASSERT(). 698 If EndBit is greater than 15, then ASSERT(). 699 If EndBit is less than StartBit, then ASSERT(). 700 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 701 702 @param Port The I/O port to write. 703 @param StartBit The ordinal of the least significant bit in the bit field. 704 Range 0..15. 705 @param EndBit The ordinal of the most significant bit in the bit field. 706 Range 0..15. 707 @param AndData The value to AND with the read value from the I/O port. 708 709 @return The value written back to the I/O port. 710 711 **/ 712 UINT16 713 EFIAPI 714 S3IoBitFieldAnd16 ( 715 IN UINTN Port, 716 IN UINTN StartBit, 717 IN UINTN EndBit, 718 IN UINT16 AndData 719 ) 720 { 721 return InternalSaveIoWrite16ValueToBootScript (Port, IoBitFieldAnd16 (Port, StartBit, EndBit, AndData)); 722 } 723 724 /** 725 Reads a bit field in a 16-bit port, performs a bitwise AND followed by a 726 bitwise OR, and writes the result back to the bit field in the 727 16-bit port and saves the value in the S3 script to be replayed on S3 728 resume. 729 730 Reads the 16-bit I/O port specified by Port, performs a bitwise AND followed 731 by a bitwise OR between the read result and the value specified by 732 AndData, and writes the result to the 16-bit I/O port specified by Port. The 733 value written to the I/O port is returned. This function must guarantee that 734 all I/O read and write operations are serialized. Extra left bits in both 735 AndData and OrData are stripped. 736 737 If 16-bit I/O port operations are not supported, then ASSERT(). 738 If StartBit is greater than 15, then ASSERT(). 739 If EndBit is greater than 15, then ASSERT(). 740 If EndBit is less than StartBit, then ASSERT(). 741 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 742 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 743 744 @param Port The I/O port to write. 745 @param StartBit The ordinal of the least significant bit in the bit field. 746 Range 0..15. 747 @param EndBit The ordinal of the most significant bit in the bit field. 748 Range 0..15. 749 @param AndData The value to AND with the read value from the I/O port. 750 @param OrData The value to OR with the result of the AND operation. 751 752 @return The value written back to the I/O port. 753 754 **/ 755 UINT16 756 EFIAPI 757 S3IoBitFieldAndThenOr16 ( 758 IN UINTN Port, 759 IN UINTN StartBit, 760 IN UINTN EndBit, 761 IN UINT16 AndData, 762 IN UINT16 OrData 763 ) 764 { 765 return InternalSaveIoWrite16ValueToBootScript (Port, IoBitFieldAndThenOr16 (Port, StartBit, EndBit, AndData, OrData)); 766 } 767 768 /** 769 Saves a 32-bit I/O port value to the boot script. 770 771 This internal worker function saves a 32-bit I/O port value in the S3 script 772 to be replayed on S3 resume. 773 774 If the saving process fails, then ASSERT(). 775 776 @param Port The I/O port to write. 777 @param Value The value saved to boot script. 778 779 @return Value. 780 781 **/ 782 UINT32 783 InternalSaveIoWrite32ValueToBootScript ( 784 IN UINTN Port, 785 IN UINT32 Value 786 ) 787 { 788 InternalSaveIoWriteValueToBootScript (S3BootScriptWidthUint32, Port, &Value); 789 790 return Value; 791 } 792 793 /** 794 Reads a 32-bit I/O port and saves the value in the S3 script to be replayed 795 on S3 resume. 796 797 Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned. 798 This function must guarantee that all I/O read and write operations are 799 serialized. 800 801 If 32-bit I/O port operations are not supported, then ASSERT(). 802 803 @param Port The I/O port to read. 804 805 @return The value read. 806 807 **/ 808 UINT32 809 EFIAPI 810 S3IoRead32 ( 811 IN UINTN Port 812 ) 813 { 814 return InternalSaveIoWrite32ValueToBootScript (Port, IoRead32 (Port)); 815 } 816 817 /** 818 Writes a 32-bit I/O port and saves the value in the S3 script to be replayed 819 on S3 resume. 820 821 Writes the 32-bit I/O port specified by Port with the value specified by Value 822 and returns Value. This function must guarantee that all I/O read and write 823 operations are serialized. 824 825 If 32-bit I/O port operations are not supported, then ASSERT(). 826 827 @param Port The I/O port to write. 828 @param Value The value to write to the I/O port. 829 830 @return The value written the I/O port. 831 832 **/ 833 UINT32 834 EFIAPI 835 S3IoWrite32 ( 836 IN UINTN Port, 837 IN UINT32 Value 838 ) 839 { 840 return InternalSaveIoWrite32ValueToBootScript (Port, IoWrite32 (Port, Value)); 841 } 842 843 /** 844 Reads a 32-bit I/O port, performs a bitwise OR, and writes the 845 result back to the 32-bit I/O port and saves the value in the S3 script to 846 be replayed on S3 resume. 847 848 Reads the 32-bit I/O port specified by Port, performs a bitwise OR 849 between the read result and the value specified by OrData, and writes the 850 result to the 32-bit I/O port specified by Port. The value written to the I/O 851 port is returned. This function must guarantee that all I/O read and write 852 operations are serialized. 853 854 If 32-bit I/O port operations are not supported, then ASSERT(). 855 856 @param Port The I/O port to write. 857 @param OrData The value to OR with the read value from the I/O port. 858 859 @return The value written back to the I/O port. 860 861 **/ 862 UINT32 863 EFIAPI 864 S3IoOr32 ( 865 IN UINTN Port, 866 IN UINT32 OrData 867 ) 868 { 869 return InternalSaveIoWrite32ValueToBootScript (Port, IoOr32 (Port, OrData)); 870 } 871 872 /** 873 Reads a 32-bit I/O port, performs a bitwise AND, and writes the result back 874 to the 32-bit I/O port and saves the value in the S3 script to be replayed 875 on S3 resume. 876 877 Reads the 32-bit I/O port specified by Port, performs a bitwise AND between 878 the read result and the value specified by AndData, and writes the result to 879 the 32-bit I/O port specified by Port. The value written to the I/O port is 880 returned. This function must guarantee that all I/O read and write operations 881 are serialized. 882 883 If 32-bit I/O port operations are not supported, then ASSERT(). 884 885 @param Port The I/O port to write. 886 @param AndData The value to AND with the read value from the I/O port. 887 888 @return The value written back to the I/O port. 889 890 **/ 891 UINT32 892 EFIAPI 893 S3IoAnd32 ( 894 IN UINTN Port, 895 IN UINT32 AndData 896 ) 897 { 898 return InternalSaveIoWrite32ValueToBootScript (Port, IoAnd32 (Port, AndData)); 899 } 900 901 /** 902 Reads a 32-bit I/O port, performs a bitwise AND followed by a bitwise 903 inclusive OR, and writes the result back to the 32-bit I/O port and saves 904 the value in the S3 script to be replayed on S3 resume. 905 906 Reads the 32-bit I/O port specified by Port, performs a bitwise AND between 907 the read result and the value specified by AndData, performs a bitwise OR 908 between the result of the AND operation and the value specified by OrData, 909 and writes the result to the 32-bit I/O port specified by Port. The value 910 written to the I/O port is returned. This function must guarantee that all 911 I/O read and write operations are serialized. 912 913 If 32-bit I/O port operations are not supported, then ASSERT(). 914 915 @param Port The I/O port to write. 916 @param AndData The value to AND with the read value from the I/O port. 917 @param OrData The value to OR with the result of the AND operation. 918 919 @return The value written back to the I/O port. 920 921 **/ 922 UINT32 923 EFIAPI 924 S3IoAndThenOr32 ( 925 IN UINTN Port, 926 IN UINT32 AndData, 927 IN UINT32 OrData 928 ) 929 { 930 return InternalSaveIoWrite32ValueToBootScript (Port, IoAndThenOr32 (Port, AndData, OrData)); 931 } 932 933 /** 934 Reads a bit field of an I/O register and saves the value in the S3 script to 935 be replayed on S3 resume. 936 937 Reads the bit field in a 32-bit I/O register. The bit field is specified by 938 the StartBit and the EndBit. The value of the bit field is returned. 939 940 If 32-bit I/O port operations are not supported, then ASSERT(). 941 If StartBit is greater than 31, then ASSERT(). 942 If EndBit is greater than 31, then ASSERT(). 943 If EndBit is less than StartBit, then ASSERT(). 944 945 @param Port The I/O port to read. 946 @param StartBit The ordinal of the least significant bit in the bit field. 947 Range 0..31. 948 @param EndBit The ordinal of the most significant bit in the bit field. 949 Range 0..31. 950 951 @return The value read. 952 953 **/ 954 UINT32 955 EFIAPI 956 S3IoBitFieldRead32 ( 957 IN UINTN Port, 958 IN UINTN StartBit, 959 IN UINTN EndBit 960 ) 961 { 962 return InternalSaveIoWrite32ValueToBootScript (Port, IoBitFieldRead32 (Port, StartBit, EndBit)); 963 } 964 965 /** 966 Writes a bit field to an I/O register and saves the value in the S3 script to 967 be replayed on S3 resume. 968 969 Writes Value to the bit field of the I/O register. The bit field is specified 970 by the StartBit and the EndBit. All other bits in the destination I/O 971 register are preserved. The value written to the I/O port is returned. Extra 972 left bits in Value are stripped. 973 974 If 32-bit I/O port operations are not supported, then ASSERT(). 975 If StartBit is greater than 31, then ASSERT(). 976 If EndBit is greater than 31, then ASSERT(). 977 If EndBit is less than StartBit, then ASSERT(). 978 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 979 980 @param Port The I/O port to write. 981 @param StartBit The ordinal of the least significant bit in the bit field. 982 Range 0..31. 983 @param EndBit The ordinal of the most significant bit in the bit field. 984 Range 0..31. 985 @param Value New value of the bit field. 986 987 @return The value written back to the I/O port. 988 989 **/ 990 UINT32 991 EFIAPI 992 S3IoBitFieldWrite32 ( 993 IN UINTN Port, 994 IN UINTN StartBit, 995 IN UINTN EndBit, 996 IN UINT32 Value 997 ) 998 { 999 return InternalSaveIoWrite32ValueToBootScript (Port, IoBitFieldWrite32 (Port, StartBit, EndBit, Value)); 1000 } 1001 1002 /** 1003 Reads a bit field in a 32-bit port, performs a bitwise OR, and writes the 1004 result back to the bit field in the 32-bit port and saves the value in the 1005 S3 script to be replayed on S3 resume. 1006 1007 Reads the 32-bit I/O port specified by Port, performs a bitwise OR 1008 between the read result and the value specified by OrData, and writes the 1009 result to the 32-bit I/O port specified by Port. The value written to the I/O 1010 port is returned. This function must guarantee that all I/O read and write 1011 operations are serialized. Extra left bits in OrData are stripped. 1012 1013 If 32-bit I/O port operations are not supported, then ASSERT(). 1014 If StartBit is greater than 31, then ASSERT(). 1015 If EndBit is greater than 31, then ASSERT(). 1016 If EndBit is less than StartBit, then ASSERT(). 1017 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1018 1019 @param Port The I/O port to write. 1020 @param StartBit The ordinal of the least significant bit in the bit field. 1021 Range 0..31. 1022 @param EndBit The ordinal of the most significant bit in the bit field. 1023 Range 0..31. 1024 @param OrData The value to OR with the read value from the I/O port. 1025 1026 @return The value written back to the I/O port. 1027 1028 **/ 1029 UINT32 1030 EFIAPI 1031 S3IoBitFieldOr32 ( 1032 IN UINTN Port, 1033 IN UINTN StartBit, 1034 IN UINTN EndBit, 1035 IN UINT32 OrData 1036 ) 1037 { 1038 return InternalSaveIoWrite32ValueToBootScript (Port, IoBitFieldOr32 (Port, StartBit, EndBit, OrData)); 1039 } 1040 1041 /** 1042 Reads a bit field in a 32-bit port, performs a bitwise AND, and writes the 1043 result back to the bit field in the 32-bit port and saves the value in the 1044 S3 script to be replayed on S3 resume. 1045 1046 Reads the 32-bit I/O port specified by Port, performs a bitwise AND between 1047 the read result and the value specified by AndData, and writes the result to 1048 the 32-bit I/O port specified by Port. The value written to the I/O port is 1049 returned. This function must guarantee that all I/O read and write operations 1050 are serialized. Extra left bits in AndData are stripped. 1051 1052 If 32-bit I/O port operations are not supported, then ASSERT(). 1053 If StartBit is greater than 31, then ASSERT(). 1054 If EndBit is greater than 31, then ASSERT(). 1055 If EndBit is less than StartBit, then ASSERT(). 1056 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1057 1058 @param Port The I/O port to write. 1059 @param StartBit The ordinal of the least significant bit in the bit field. 1060 Range 0..31. 1061 @param EndBit The ordinal of the most significant bit in the bit field. 1062 Range 0..31. 1063 @param AndData The value to AND with the read value from the I/O port. 1064 1065 @return The value written back to the I/O port. 1066 1067 **/ 1068 UINT32 1069 EFIAPI 1070 S3IoBitFieldAnd32 ( 1071 IN UINTN Port, 1072 IN UINTN StartBit, 1073 IN UINTN EndBit, 1074 IN UINT32 AndData 1075 ) 1076 { 1077 return InternalSaveIoWrite32ValueToBootScript (Port, IoBitFieldAnd32 (Port, StartBit, EndBit, AndData)); 1078 } 1079 1080 /** 1081 Reads a bit field in a 32-bit port, performs a bitwise AND followed by a 1082 bitwise OR, and writes the result back to the bit field in the 1083 32-bit port and saves the value in the S3 script to be replayed on S3 1084 resume. 1085 1086 Reads the 32-bit I/O port specified by Port, performs a bitwise AND followed 1087 by a bitwise OR between the read result and the value specified by 1088 AndData, and writes the result to the 32-bit I/O port specified by Port. The 1089 value written to the I/O port is returned. This function must guarantee that 1090 all I/O read and write operations are serialized. Extra left bits in both 1091 AndData and OrData are stripped. 1092 1093 If 32-bit I/O port operations are not supported, then ASSERT(). 1094 If StartBit is greater than 31, then ASSERT(). 1095 If EndBit is greater than 31, then ASSERT(). 1096 If EndBit is less than StartBit, then ASSERT(). 1097 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1098 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1099 1100 @param Port The I/O port to write. 1101 @param StartBit The ordinal of the least significant bit in the bit field. 1102 Range 0..31. 1103 @param EndBit The ordinal of the most significant bit in the bit field. 1104 Range 0..31. 1105 @param AndData The value to AND with the read value from the I/O port. 1106 @param OrData The value to OR with the result of the AND operation. 1107 1108 @return The value written back to the I/O port. 1109 1110 **/ 1111 UINT32 1112 EFIAPI 1113 S3IoBitFieldAndThenOr32 ( 1114 IN UINTN Port, 1115 IN UINTN StartBit, 1116 IN UINTN EndBit, 1117 IN UINT32 AndData, 1118 IN UINT32 OrData 1119 ) 1120 { 1121 return InternalSaveIoWrite32ValueToBootScript (Port, IoBitFieldAndThenOr32 (Port, StartBit, EndBit, AndData, OrData)); 1122 } 1123 1124 /** 1125 Saves a 64-bit I/O port value to the boot script. 1126 1127 This internal worker function saves a 64-bit I/O port value in the S3 script 1128 to be replayed on S3 resume. 1129 1130 If the saving process fails, then ASSERT(). 1131 1132 @param Port The I/O port to write. 1133 @param Value The value saved to boot script. 1134 1135 @return Value. 1136 1137 **/ 1138 UINT64 1139 InternalSaveIoWrite64ValueToBootScript ( 1140 IN UINTN Port, 1141 IN UINT64 Value 1142 ) 1143 { 1144 InternalSaveIoWriteValueToBootScript (S3BootScriptWidthUint64, Port, &Value); 1145 1146 return Value; 1147 } 1148 1149 /** 1150 Reads a 64-bit I/O port and saves the value in the S3 script to be replayed 1151 on S3 resume. 1152 1153 Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned. 1154 This function must guarantee that all I/O read and write operations are 1155 serialized. 1156 1157 If 64-bit I/O port operations are not supported, then ASSERT(). 1158 1159 @param Port The I/O port to read. 1160 1161 @return The value read. 1162 1163 **/ 1164 UINT64 1165 EFIAPI 1166 S3IoRead64 ( 1167 IN UINTN Port 1168 ) 1169 { 1170 return InternalSaveIoWrite64ValueToBootScript (Port, IoRead64 (Port)); 1171 } 1172 1173 /** 1174 Writes a 64-bit I/O port and saves the value in the S3 script to be replayed 1175 on S3 resume. 1176 1177 Writes the 64-bit I/O port specified by Port with the value specified by Value 1178 and returns Value. This function must guarantee that all I/O read and write 1179 operations are serialized. 1180 1181 If 64-bit I/O port operations are not supported, then ASSERT(). 1182 1183 @param Port The I/O port to write. 1184 @param Value The value to write to the I/O port. 1185 1186 @return The value written the I/O port. 1187 1188 **/ 1189 UINT64 1190 EFIAPI 1191 S3IoWrite64 ( 1192 IN UINTN Port, 1193 IN UINT64 Value 1194 ) 1195 { 1196 return InternalSaveIoWrite64ValueToBootScript (Port, IoWrite64 (Port, Value)); 1197 } 1198 1199 /** 1200 Reads a 64-bit I/O port, performs a bitwise OR, and writes the 1201 result back to the 64-bit I/O port and saves the value in the S3 script to 1202 be replayed on S3 resume. 1203 1204 Reads the 64-bit I/O port specified by Port, performs a bitwise OR 1205 between the read result and the value specified by OrData, and writes the 1206 result to the 64-bit I/O port specified by Port. The value written to the I/O 1207 port is returned. This function must guarantee that all I/O read and write 1208 operations are serialized. 1209 1210 If 64-bit I/O port operations are not supported, then ASSERT(). 1211 1212 @param Port The I/O port to write. 1213 @param OrData The value to OR with the read value from the I/O port. 1214 1215 @return The value written back to the I/O port. 1216 1217 **/ 1218 UINT64 1219 EFIAPI 1220 S3IoOr64 ( 1221 IN UINTN Port, 1222 IN UINT64 OrData 1223 ) 1224 { 1225 return InternalSaveIoWrite64ValueToBootScript (Port, IoOr64 (Port, OrData)); 1226 } 1227 1228 /** 1229 Reads a 64-bit I/O port, performs a bitwise AND, and writes the result back 1230 to the 64-bit I/O port and saves the value in the S3 script to be replayed 1231 on S3 resume. 1232 1233 Reads the 64-bit I/O port specified by Port, performs a bitwise AND between 1234 the read result and the value specified by AndData, and writes the result to 1235 the 64-bit I/O port specified by Port. The value written to the I/O port is 1236 returned. This function must guarantee that all I/O read and write operations 1237 are serialized. 1238 1239 If 64-bit I/O port operations are not supported, then ASSERT(). 1240 1241 @param Port The I/O port to write. 1242 @param AndData The value to AND with the read value from the I/O port. 1243 1244 @return The value written back to the I/O port. 1245 1246 **/ 1247 UINT64 1248 EFIAPI 1249 S3IoAnd64 ( 1250 IN UINTN Port, 1251 IN UINT64 AndData 1252 ) 1253 { 1254 return InternalSaveIoWrite64ValueToBootScript (Port, IoAnd64 (Port, AndData)); 1255 } 1256 1257 /** 1258 Reads a 64-bit I/O port, performs a bitwise AND followed by a bitwise 1259 inclusive OR, and writes the result back to the 64-bit I/O port and saves 1260 the value in the S3 script to be replayed on S3 resume. 1261 1262 Reads the 64-bit I/O port specified by Port, performs a bitwise AND between 1263 the read result and the value specified by AndData, performs a bitwise OR 1264 between the result of the AND operation and the value specified by OrData, 1265 and writes the result to the 64-bit I/O port specified by Port. The value 1266 written to the I/O port is returned. This function must guarantee that all 1267 I/O read and write operations are serialized. 1268 1269 If 64-bit I/O port operations are not supported, then ASSERT(). 1270 1271 @param Port The I/O port to write. 1272 @param AndData The value to AND with the read value from the I/O port. 1273 @param OrData The value to OR with the result of the AND operation. 1274 1275 @return The value written back to the I/O port. 1276 1277 **/ 1278 UINT64 1279 EFIAPI 1280 S3IoAndThenOr64 ( 1281 IN UINTN Port, 1282 IN UINT64 AndData, 1283 IN UINT64 OrData 1284 ) 1285 { 1286 return InternalSaveIoWrite64ValueToBootScript (Port, IoAndThenOr64 (Port, AndData, OrData)); 1287 } 1288 1289 /** 1290 Reads a bit field of an I/O register and saves the value in the S3 script to 1291 be replayed on S3 resume. 1292 1293 Reads the bit field in a 64-bit I/O register. The bit field is specified by 1294 the StartBit and the EndBit. The value of the bit field is returned. 1295 1296 If 64-bit I/O port operations are not supported, then ASSERT(). 1297 If StartBit is greater than 63, then ASSERT(). 1298 If EndBit is greater than 63, then ASSERT(). 1299 If EndBit is less than StartBit, then ASSERT(). 1300 1301 @param Port The I/O port to read. 1302 @param StartBit The ordinal of the least significant bit in the bit field. 1303 Range 0..63. 1304 @param EndBit The ordinal of the most significant bit in the bit field. 1305 Range 0..63. 1306 1307 @return The value read. 1308 1309 **/ 1310 UINT64 1311 EFIAPI 1312 S3IoBitFieldRead64 ( 1313 IN UINTN Port, 1314 IN UINTN StartBit, 1315 IN UINTN EndBit 1316 ) 1317 { 1318 return InternalSaveIoWrite64ValueToBootScript (Port, IoBitFieldRead64 (Port, StartBit, EndBit)); 1319 } 1320 1321 /** 1322 Writes a bit field to an I/O register and saves the value in the S3 script to 1323 be replayed on S3 resume. 1324 1325 Writes Value to the bit field of the I/O register. The bit field is specified 1326 by the StartBit and the EndBit. All other bits in the destination I/O 1327 register are preserved. The value written to the I/O port is returned. Extra 1328 left bits in Value are stripped. 1329 1330 If 64-bit I/O port operations are not supported, then ASSERT(). 1331 If StartBit is greater than 63, then ASSERT(). 1332 If EndBit is greater than 63, then ASSERT(). 1333 If EndBit is less than StartBit, then ASSERT(). 1334 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1335 1336 @param Port The I/O port to write. 1337 @param StartBit The ordinal of the least significant bit in the bit field. 1338 Range 0..63. 1339 @param EndBit The ordinal of the most significant bit in the bit field. 1340 Range 0..63. 1341 @param Value New value of the bit field. 1342 1343 @return The value written back to the I/O port. 1344 1345 **/ 1346 UINT64 1347 EFIAPI 1348 S3IoBitFieldWrite64 ( 1349 IN UINTN Port, 1350 IN UINTN StartBit, 1351 IN UINTN EndBit, 1352 IN UINT64 Value 1353 ) 1354 { 1355 return InternalSaveIoWrite64ValueToBootScript (Port, IoBitFieldWrite64 (Port, StartBit, EndBit, Value)); 1356 } 1357 1358 /** 1359 Reads a bit field in a 64-bit port, performs a bitwise OR, and writes the 1360 result back to the bit field in the 64-bit port and saves the value in the 1361 S3 script to be replayed on S3 resume. 1362 1363 Reads the 64-bit I/O port specified by Port, performs a bitwise OR 1364 between the read result and the value specified by OrData, and writes the 1365 result to the 64-bit I/O port specified by Port. The value written to the I/O 1366 port is returned. This function must guarantee that all I/O read and write 1367 operations are serialized. Extra left bits in OrData are stripped. 1368 1369 If 64-bit I/O port operations are not supported, then ASSERT(). 1370 If StartBit is greater than 63, then ASSERT(). 1371 If EndBit is greater than 63, then ASSERT(). 1372 If EndBit is less than StartBit, then ASSERT(). 1373 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1374 1375 @param Port The I/O port to write. 1376 @param StartBit The ordinal of the least significant bit in the bit field. 1377 Range 0..63. 1378 @param EndBit The ordinal of the most significant bit in the bit field. 1379 Range 0..63. 1380 @param OrData The value to OR with the read value from the I/O port. 1381 1382 @return The value written back to the I/O port. 1383 1384 **/ 1385 UINT64 1386 EFIAPI 1387 S3IoBitFieldOr64 ( 1388 IN UINTN Port, 1389 IN UINTN StartBit, 1390 IN UINTN EndBit, 1391 IN UINT64 OrData 1392 ) 1393 { 1394 return InternalSaveIoWrite64ValueToBootScript (Port, IoBitFieldOr64 (Port, StartBit, EndBit, OrData)); 1395 } 1396 1397 /** 1398 Reads a bit field in a 64-bit port, performs a bitwise AND, and writes the 1399 result back to the bit field in the 64-bit port and saves the value in the 1400 S3 script to be replayed on S3 resume. 1401 1402 Reads the 64-bit I/O port specified by Port, performs a bitwise AND between 1403 the read result and the value specified by AndData, and writes the result to 1404 the 64-bit I/O port specified by Port. The value written to the I/O port is 1405 returned. This function must guarantee that all I/O read and write operations 1406 are serialized. Extra left bits in AndData are stripped. 1407 1408 If 64-bit I/O port operations are not supported, then ASSERT(). 1409 If StartBit is greater than 63, then ASSERT(). 1410 If EndBit is greater than 63, then ASSERT(). 1411 If EndBit is less than StartBit, then ASSERT(). 1412 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1413 1414 @param Port The I/O port to write. 1415 @param StartBit The ordinal of the least significant bit in the bit field. 1416 Range 0..63. 1417 @param EndBit The ordinal of the most significant bit in the bit field. 1418 Range 0..63. 1419 @param AndData The value to AND with the read value from the I/O port. 1420 1421 @return The value written back to the I/O port. 1422 1423 **/ 1424 UINT64 1425 EFIAPI 1426 S3IoBitFieldAnd64 ( 1427 IN UINTN Port, 1428 IN UINTN StartBit, 1429 IN UINTN EndBit, 1430 IN UINT64 AndData 1431 ) 1432 { 1433 return InternalSaveIoWrite64ValueToBootScript (Port, IoBitFieldAnd64 (Port, StartBit, EndBit, AndData)); 1434 } 1435 1436 /** 1437 Reads a bit field in a 64-bit port, performs a bitwise AND followed by a 1438 bitwise OR, and writes the result back to the bit field in the 1439 64-bit port and saves the value in the S3 script to be replayed on S3 1440 resume. 1441 1442 Reads the 64-bit I/O port specified by Port, performs a bitwise AND followed 1443 by a bitwise OR between the read result and the value specified by 1444 AndData, and writes the result to the 64-bit I/O port specified by Port. The 1445 value written to the I/O port is returned. This function must guarantee that 1446 all I/O read and write operations are serialized. Extra left bits in both 1447 AndData and OrData are stripped. 1448 1449 If 64-bit I/O port operations are not supported, then ASSERT(). 1450 If StartBit is greater than 63, then ASSERT(). 1451 If EndBit is greater than 63, then ASSERT(). 1452 If EndBit is less than StartBit, then ASSERT(). 1453 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1454 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1455 1456 @param Port The I/O port to write. 1457 @param StartBit The ordinal of the least significant bit in the bit field. 1458 Range 0..63. 1459 @param EndBit The ordinal of the most significant bit in the bit field. 1460 Range 0..63. 1461 @param AndData The value to AND with the read value from the I/O port. 1462 @param OrData The value to OR with the result of the AND operation. 1463 1464 @return The value written back to the I/O port. 1465 1466 **/ 1467 UINT64 1468 EFIAPI 1469 S3IoBitFieldAndThenOr64 ( 1470 IN UINTN Port, 1471 IN UINTN StartBit, 1472 IN UINTN EndBit, 1473 IN UINT64 AndData, 1474 IN UINT64 OrData 1475 ) 1476 { 1477 return InternalSaveIoWrite64ValueToBootScript (Port, IoBitFieldAndThenOr64 (Port, StartBit, EndBit, AndData, OrData)); 1478 } 1479 1480 /** 1481 Saves an MMIO register value to the boot script. 1482 1483 This internal worker function saves an MMIO register value in the S3 script 1484 to be replayed on S3 resume. 1485 1486 If the saving process fails, then ASSERT(). 1487 1488 @param Width The width of MMIO register. 1489 @param Address The MMIO register to write. 1490 @param Buffer The buffer containing value. 1491 1492 **/ 1493 VOID 1494 InternalSaveMmioWriteValueToBootScript ( 1495 IN S3_BOOT_SCRIPT_LIB_WIDTH Width, 1496 IN UINTN Address, 1497 IN VOID *Buffer 1498 ) 1499 { 1500 RETURN_STATUS Status; 1501 1502 Status = S3BootScriptSaveMemWrite ( 1503 Width, 1504 Address, 1505 1, 1506 Buffer 1507 ); 1508 ASSERT (Status == RETURN_SUCCESS); 1509 } 1510 1511 /** 1512 Saves an 8-bit MMIO register value to the boot script. 1513 1514 This internal worker function saves an 8-bit MMIO register value in the S3 script 1515 to be replayed on S3 resume. 1516 1517 If the saving process fails, then ASSERT(). 1518 1519 @param Address The MMIO register to write. 1520 @param Value The value saved to boot script. 1521 1522 @return Value. 1523 1524 **/ 1525 UINT8 1526 InternalSaveMmioWrite8ValueToBootScript ( 1527 IN UINTN Address, 1528 IN UINT8 Value 1529 ) 1530 { 1531 InternalSaveMmioWriteValueToBootScript (S3BootScriptWidthUint8, Address, &Value); 1532 1533 return Value; 1534 } 1535 1536 /** 1537 Reads an 8-bit MMIO register and saves the value in the S3 script to be 1538 replayed on S3 resume. 1539 1540 Reads the 8-bit MMIO register specified by Address. The 8-bit read value is 1541 returned. This function must guarantee that all MMIO read and write 1542 operations are serialized. 1543 1544 If 8-bit MMIO register operations are not supported, then ASSERT(). 1545 1546 @param Address The MMIO register to read. 1547 1548 @return The value read. 1549 1550 **/ 1551 UINT8 1552 EFIAPI 1553 S3MmioRead8 ( 1554 IN UINTN Address 1555 ) 1556 { 1557 return InternalSaveMmioWrite8ValueToBootScript (Address, MmioRead8 (Address)); 1558 } 1559 1560 /** 1561 Writes an 8-bit MMIO register and saves the value in the S3 script to be 1562 replayed on S3 resume. 1563 1564 Writes the 8-bit MMIO register specified by Address with the value specified 1565 by Value and returns Value. This function must guarantee that all MMIO read 1566 and write operations are serialized. 1567 1568 If 8-bit MMIO register operations are not supported, then ASSERT(). 1569 1570 @param Address The MMIO register to write. 1571 @param Value The value to write to the MMIO register. 1572 1573 @return The value written the MMIO register. 1574 1575 **/ 1576 UINT8 1577 EFIAPI 1578 S3MmioWrite8 ( 1579 IN UINTN Address, 1580 IN UINT8 Value 1581 ) 1582 { 1583 return InternalSaveMmioWrite8ValueToBootScript (Address, MmioWrite8 (Address, Value)); 1584 } 1585 1586 /** 1587 Reads an 8-bit MMIO register, performs a bitwise OR, and writes the 1588 result back to the 8-bit MMIO register and saves the value in the S3 script 1589 to be replayed on S3 resume. 1590 1591 Reads the 8-bit MMIO register specified by Address, performs a bitwise 1592 inclusive OR between the read result and the value specified by OrData, and 1593 writes the result to the 8-bit MMIO register specified by Address. The value 1594 written to the MMIO register is returned. This function must guarantee that 1595 all MMIO read and write operations are serialized. 1596 1597 If 8-bit MMIO register operations are not supported, then ASSERT(). 1598 1599 @param Address The MMIO register to write. 1600 @param OrData The value to OR with the read value from the MMIO register. 1601 1602 @return The value written back to the MMIO register. 1603 1604 **/ 1605 UINT8 1606 EFIAPI 1607 S3MmioOr8 ( 1608 IN UINTN Address, 1609 IN UINT8 OrData 1610 ) 1611 { 1612 return InternalSaveMmioWrite8ValueToBootScript (Address, MmioOr8 (Address, OrData)); 1613 } 1614 1615 /** 1616 Reads an 8-bit MMIO register, performs a bitwise AND, and writes the result 1617 back to the 8-bit MMIO register and saves the value in the S3 script to be 1618 replayed on S3 resume. 1619 1620 Reads the 8-bit MMIO register specified by Address, performs a bitwise AND 1621 between the read result and the value specified by AndData, and writes the 1622 result to the 8-bit MMIO register specified by Address. The value written to 1623 the MMIO register is returned. This function must guarantee that all MMIO 1624 read and write operations are serialized. 1625 1626 If 8-bit MMIO register operations are not supported, then ASSERT(). 1627 1628 @param Address The MMIO register to write. 1629 @param AndData The value to AND with the read value from the MMIO register. 1630 1631 @return The value written back to the MMIO register. 1632 1633 **/ 1634 UINT8 1635 EFIAPI 1636 S3MmioAnd8 ( 1637 IN UINTN Address, 1638 IN UINT8 AndData 1639 ) 1640 { 1641 return InternalSaveMmioWrite8ValueToBootScript (Address, MmioAnd8 (Address, AndData)); 1642 } 1643 1644 /** 1645 Reads an 8-bit MMIO register, performs a bitwise AND followed by a bitwise 1646 inclusive OR, and writes the result back to the 8-bit MMIO register and saves 1647 the value in the S3 script to be replayed on S3 resume. 1648 1649 Reads the 8-bit MMIO register specified by Address, performs a bitwise AND 1650 between the read result and the value specified by AndData, performs a 1651 bitwise OR between the result of the AND operation and the value specified by 1652 OrData, and writes the result to the 8-bit MMIO register specified by 1653 Address. The value written to the MMIO register is returned. This function 1654 must guarantee that all MMIO read and write operations are serialized. 1655 1656 If 8-bit MMIO register operations are not supported, then ASSERT(). 1657 1658 @param Address The MMIO register to write. 1659 @param AndData The value to AND with the read value from the MMIO register. 1660 @param OrData The value to OR with the result of the AND operation. 1661 1662 @return The value written back to the MMIO register. 1663 1664 **/ 1665 UINT8 1666 EFIAPI 1667 S3MmioAndThenOr8 ( 1668 IN UINTN Address, 1669 IN UINT8 AndData, 1670 IN UINT8 OrData 1671 ) 1672 { 1673 return InternalSaveMmioWrite8ValueToBootScript (Address, MmioAndThenOr8 (Address, AndData, OrData)); 1674 } 1675 1676 /** 1677 Reads a bit field of a MMIO register and saves the value in the S3 script to 1678 be replayed on S3 resume. 1679 1680 Reads the bit field in an 8-bit MMIO register. The bit field is specified by 1681 the StartBit and the EndBit. The value of the bit field is returned. 1682 1683 If 8-bit MMIO register operations are not supported, then ASSERT(). 1684 If StartBit is greater than 7, then ASSERT(). 1685 If EndBit is greater than 7, then ASSERT(). 1686 If EndBit is less than StartBit, then ASSERT(). 1687 1688 @param Address MMIO register to read. 1689 @param StartBit The ordinal of the least significant bit in the bit field. 1690 Range 0..7. 1691 @param EndBit The ordinal of the most significant bit in the bit field. 1692 Range 0..7. 1693 1694 @return The value read. 1695 1696 **/ 1697 UINT8 1698 EFIAPI 1699 S3MmioBitFieldRead8 ( 1700 IN UINTN Address, 1701 IN UINTN StartBit, 1702 IN UINTN EndBit 1703 ) 1704 { 1705 return InternalSaveMmioWrite8ValueToBootScript (Address, MmioBitFieldRead8 (Address, StartBit, EndBit)); 1706 } 1707 1708 /** 1709 Writes a bit field to an MMIO register and saves the value in the S3 script to 1710 be replayed on S3 resume. 1711 1712 Writes Value to the bit field of the MMIO register. The bit field is 1713 specified by the StartBit and the EndBit. All other bits in the destination 1714 MMIO register are preserved. The new value of the 8-bit register is returned. 1715 1716 If 8-bit MMIO register operations are not supported, then ASSERT(). 1717 If StartBit is greater than 7, then ASSERT(). 1718 If EndBit is greater than 7, then ASSERT(). 1719 If EndBit is less than StartBit, then ASSERT(). 1720 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1721 1722 @param Address The MMIO register to write. 1723 @param StartBit The ordinal of the least significant bit in the bit field. 1724 Range 0..7. 1725 @param EndBit The ordinal of the most significant bit in the bit field. 1726 Range 0..7. 1727 @param Value New value of the bit field. 1728 1729 @return The value written back to the MMIO register. 1730 1731 **/ 1732 UINT8 1733 EFIAPI 1734 S3MmioBitFieldWrite8 ( 1735 IN UINTN Address, 1736 IN UINTN StartBit, 1737 IN UINTN EndBit, 1738 IN UINT8 Value 1739 ) 1740 { 1741 return InternalSaveMmioWrite8ValueToBootScript (Address, MmioBitFieldWrite8 (Address, StartBit, EndBit, Value)); 1742 } 1743 1744 /** 1745 Reads a bit field in an 8-bit MMIO register, performs a bitwise OR, and 1746 writes the result back to the bit field in the 8-bit MMIO register and saves 1747 the value in the S3 script to be replayed on S3 resume. 1748 1749 Reads the 8-bit MMIO register specified by Address, performs a bitwise 1750 inclusive OR between the read result and the value specified by OrData, and 1751 writes the result to the 8-bit MMIO register specified by Address. The value 1752 written to the MMIO register is returned. This function must guarantee that 1753 all MMIO read and write operations are serialized. Extra left bits in OrData 1754 are stripped. 1755 1756 If 8-bit MMIO register operations are not supported, then ASSERT(). 1757 If StartBit is greater than 7, then ASSERT(). 1758 If EndBit is greater than 7, then ASSERT(). 1759 If EndBit is less than StartBit, then ASSERT(). 1760 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1761 1762 @param Address The MMIO register to write. 1763 @param StartBit The ordinal of the least significant bit in the bit field. 1764 Range 0..7. 1765 @param EndBit The ordinal of the most significant bit in the bit field. 1766 Range 0..7. 1767 @param OrData The value to OR with the read value from the MMIO register. 1768 1769 @return The value written back to the MMIO register. 1770 1771 **/ 1772 UINT8 1773 EFIAPI 1774 S3MmioBitFieldOr8 ( 1775 IN UINTN Address, 1776 IN UINTN StartBit, 1777 IN UINTN EndBit, 1778 IN UINT8 OrData 1779 ) 1780 { 1781 return InternalSaveMmioWrite8ValueToBootScript (Address, MmioBitFieldOr8 (Address, StartBit, EndBit, OrData)); 1782 } 1783 1784 /** 1785 Reads a bit field in an 8-bit MMIO register, performs a bitwise AND, and 1786 writes the result back to the bit field in the 8-bit MMIO register and saves 1787 the value in the S3 script to be replayed on S3 resume. 1788 1789 Reads the 8-bit MMIO register specified by Address, performs a bitwise AND 1790 between the read result and the value specified by AndData, and writes the 1791 result to the 8-bit MMIO register specified by Address. The value written to 1792 the MMIO register is returned. This function must guarantee that all MMIO 1793 read and write operations are serialized. Extra left bits in AndData are 1794 stripped. 1795 1796 If 8-bit MMIO register operations are not supported, then ASSERT(). 1797 If StartBit is greater than 7, then ASSERT(). 1798 If EndBit is greater than 7, then ASSERT(). 1799 If EndBit is less than StartBit, then ASSERT(). 1800 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1801 1802 @param Address The MMIO register to write. 1803 @param StartBit The ordinal of the least significant bit in the bit field. 1804 Range 0..7. 1805 @param EndBit The ordinal of the most significant bit in the bit field. 1806 Range 0..7. 1807 @param AndData The value to AND with the read value from the MMIO register. 1808 1809 @return The value written back to the MMIO register. 1810 1811 **/ 1812 UINT8 1813 EFIAPI 1814 S3MmioBitFieldAnd8 ( 1815 IN UINTN Address, 1816 IN UINTN StartBit, 1817 IN UINTN EndBit, 1818 IN UINT8 AndData 1819 ) 1820 { 1821 return InternalSaveMmioWrite8ValueToBootScript (Address, MmioBitFieldAnd8 (Address, StartBit, EndBit, AndData)); 1822 } 1823 1824 /** 1825 Reads a bit field in an 8-bit MMIO register, performs a bitwise AND followed 1826 by a bitwise OR, and writes the result back to the bit field in the 1827 8-bit MMIO register and saves the value in the S3 script to be replayed 1828 on S3 resume. 1829 1830 Reads the 8-bit MMIO register specified by Address, performs a bitwise AND 1831 followed by a bitwise OR between the read result and the value 1832 specified by AndData, and writes the result to the 8-bit MMIO register 1833 specified by Address. The value written to the MMIO register is returned. 1834 This function must guarantee that all MMIO read and write operations are 1835 serialized. Extra left bits in both AndData and OrData are stripped. 1836 1837 If 8-bit MMIO register operations are not supported, then ASSERT(). 1838 If StartBit is greater than 7, then ASSERT(). 1839 If EndBit is greater than 7, then ASSERT(). 1840 If EndBit is less than StartBit, then ASSERT(). 1841 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1842 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1843 1844 @param Address The MMIO register to write. 1845 @param StartBit The ordinal of the least significant bit in the bit field. 1846 Range 0..7. 1847 @param EndBit The ordinal of the most significant bit in the bit field. 1848 Range 0..7. 1849 @param AndData The value to AND with the read value from the MMIO register. 1850 @param OrData The value to OR with the result of the AND operation. 1851 1852 @return The value written back to the MMIO register. 1853 1854 **/ 1855 UINT8 1856 EFIAPI 1857 S3MmioBitFieldAndThenOr8 ( 1858 IN UINTN Address, 1859 IN UINTN StartBit, 1860 IN UINTN EndBit, 1861 IN UINT8 AndData, 1862 IN UINT8 OrData 1863 ) 1864 { 1865 return InternalSaveMmioWrite8ValueToBootScript (Address, MmioBitFieldAndThenOr8 (Address, StartBit, EndBit, AndData, OrData)); 1866 } 1867 1868 /** 1869 Saves a 16-bit MMIO register value to the boot script. 1870 1871 This internal worker function saves a 16-bit MMIO register value in the S3 script 1872 to be replayed on S3 resume. 1873 1874 If the saving process fails, then ASSERT(). 1875 1876 @param Address The MMIO register to write. 1877 @param Value The value saved to boot script. 1878 1879 @return Value. 1880 1881 **/ 1882 UINT16 1883 InternalSaveMmioWrite16ValueToBootScript ( 1884 IN UINTN Address, 1885 IN UINT16 Value 1886 ) 1887 { 1888 InternalSaveMmioWriteValueToBootScript (S3BootScriptWidthUint16, Address, &Value); 1889 1890 return Value; 1891 } 1892 1893 /** 1894 Reads a 16-bit MMIO register and saves the value in the S3 script to be replayed 1895 on S3 resume. 1896 1897 Reads the 16-bit MMIO register specified by Address. The 16-bit read value is 1898 returned. This function must guarantee that all MMIO read and write 1899 operations are serialized. 1900 1901 If 16-bit MMIO register operations are not supported, then ASSERT(). 1902 1903 @param Address The MMIO register to read. 1904 1905 @return The value read. 1906 1907 **/ 1908 UINT16 1909 EFIAPI 1910 S3MmioRead16 ( 1911 IN UINTN Address 1912 ) 1913 { 1914 return InternalSaveMmioWrite16ValueToBootScript (Address, MmioRead16 (Address)); 1915 } 1916 1917 /** 1918 Writes a 16-bit MMIO register and saves the value in the S3 script to be replayed 1919 on S3 resume. 1920 1921 Writes the 16-bit MMIO register specified by Address with the value specified 1922 by Value and returns Value. This function must guarantee that all MMIO read 1923 and write operations are serialized and saves the value in the S3 script to be 1924 replayed on S3 resume. 1925 1926 If 16-bit MMIO register operations are not supported, then ASSERT(). 1927 1928 @param Address The MMIO register to write. 1929 @param Value The value to write to the MMIO register. 1930 1931 @return The value written the MMIO register. 1932 1933 **/ 1934 UINT16 1935 EFIAPI 1936 S3MmioWrite16 ( 1937 IN UINTN Address, 1938 IN UINT16 Value 1939 ) 1940 { 1941 return InternalSaveMmioWrite16ValueToBootScript (Address, MmioWrite16 (Address, Value)); 1942 } 1943 1944 /** 1945 Reads a 16-bit MMIO register, performs a bitwise OR, and writes the 1946 result back to the 16-bit MMIO register and saves the value in the S3 script 1947 to be replayed on S3 resume. 1948 1949 Reads the 16-bit MMIO register specified by Address, performs a bitwise 1950 inclusive OR between the read result and the value specified by OrData, and 1951 writes the result to the 16-bit MMIO register specified by Address. The value 1952 written to the MMIO register is returned. This function must guarantee that 1953 all MMIO read and write operations are serialized. 1954 1955 If 16-bit MMIO register operations are not supported, then ASSERT(). 1956 1957 @param Address The MMIO register to write. 1958 @param OrData The value to OR with the read value from the MMIO register. 1959 1960 @return The value written back to the MMIO register. 1961 1962 **/ 1963 UINT16 1964 EFIAPI 1965 S3MmioOr16 ( 1966 IN UINTN Address, 1967 IN UINT16 OrData 1968 ) 1969 { 1970 return InternalSaveMmioWrite16ValueToBootScript (Address, MmioOr16 (Address, OrData)); 1971 } 1972 1973 /** 1974 Reads a 16-bit MMIO register, performs a bitwise AND, and writes the result 1975 back to the 16-bit MMIO register and saves the value in the S3 script to be 1976 replayed on S3 resume. 1977 1978 Reads the 16-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 16-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. 1983 1984 If 16-bit MMIO register operations are not supported, then ASSERT(). 1985 1986 @param Address The MMIO register to write. 1987 @param AndData The value to AND with the read value from the MMIO register. 1988 1989 @return The value written back to the MMIO register. 1990 1991 **/ 1992 UINT16 1993 EFIAPI 1994 S3MmioAnd16 ( 1995 IN UINTN Address, 1996 IN UINT16 AndData 1997 ) 1998 { 1999 return InternalSaveMmioWrite16ValueToBootScript (Address, MmioAnd16 (Address, AndData)); 2000 } 2001 2002 /** 2003 Reads a 16-bit MMIO register, performs a bitwise AND followed by a bitwise 2004 inclusive OR, and writes the result back to the 16-bit MMIO register and 2005 saves the value in the S3 script to be replayed on S3 resume. 2006 2007 Reads the 16-bit MMIO register specified by Address, performs a bitwise AND 2008 between the read result and the value specified by AndData, performs a 2009 bitwise OR between the result of the AND operation and the value specified by 2010 OrData, and writes the result to the 16-bit MMIO register specified by 2011 Address. The value written to the MMIO register is returned. This function 2012 must guarantee that all MMIO read and write operations are serialized. 2013 2014 If 16-bit MMIO register operations are not supported, then ASSERT(). 2015 2016 @param Address The MMIO register to write. 2017 @param AndData The value to AND with the read value from the MMIO register. 2018 @param OrData The value to OR with the result of the AND operation. 2019 2020 @return The value written back to the MMIO register. 2021 2022 **/ 2023 UINT16 2024 EFIAPI 2025 S3MmioAndThenOr16 ( 2026 IN UINTN Address, 2027 IN UINT16 AndData, 2028 IN UINT16 OrData 2029 ) 2030 { 2031 return InternalSaveMmioWrite16ValueToBootScript (Address, MmioAndThenOr16 (Address, AndData, OrData)); 2032 } 2033 2034 /** 2035 Reads a bit field of a MMIO register and saves the value in the S3 script to 2036 be replayed on S3 resume. 2037 2038 Reads the bit field in a 16-bit MMIO register. The bit field is specified by 2039 the StartBit and the EndBit. The value of the bit field is returned. 2040 2041 If 16-bit MMIO register operations are not supported, then ASSERT(). 2042 If StartBit is greater than 15, then ASSERT(). 2043 If EndBit is greater than 15, then ASSERT(). 2044 If EndBit is less than StartBit, then ASSERT(). 2045 2046 @param Address MMIO register to read. 2047 @param StartBit The ordinal of the least significant bit in the bit field. 2048 Range 0..15. 2049 @param EndBit The ordinal of the most significant bit in the bit field. 2050 Range 0..15. 2051 2052 @return The value read. 2053 2054 **/ 2055 UINT16 2056 EFIAPI 2057 S3MmioBitFieldRead16 ( 2058 IN UINTN Address, 2059 IN UINTN StartBit, 2060 IN UINTN EndBit 2061 ) 2062 { 2063 return InternalSaveMmioWrite16ValueToBootScript (Address, MmioBitFieldRead16 (Address, StartBit, EndBit)); 2064 } 2065 2066 /** 2067 Writes a bit field to a MMIO register and saves the value in the S3 script to 2068 be replayed on S3 resume. 2069 2070 Writes Value to the bit field of the MMIO register. The bit field is 2071 specified by the StartBit and the EndBit. All other bits in the destination 2072 MMIO register are preserved. The new value of the 16-bit register is returned. 2073 2074 If 16-bit MMIO register operations are not supported, then ASSERT(). 2075 If StartBit is greater than 15, then ASSERT(). 2076 If EndBit is greater than 15, then ASSERT(). 2077 If EndBit is less than StartBit, then ASSERT(). 2078 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2079 2080 @param Address The MMIO register to write. 2081 @param StartBit The ordinal of the least significant bit in the bit field. 2082 Range 0..15. 2083 @param EndBit The ordinal of the most significant bit in the bit field. 2084 Range 0..15. 2085 @param Value New value of the bit field. 2086 2087 @return The value written back to the MMIO register. 2088 2089 **/ 2090 UINT16 2091 EFIAPI 2092 S3MmioBitFieldWrite16 ( 2093 IN UINTN Address, 2094 IN UINTN StartBit, 2095 IN UINTN EndBit, 2096 IN UINT16 Value 2097 ) 2098 { 2099 return InternalSaveMmioWrite16ValueToBootScript (Address, MmioBitFieldWrite16 (Address, StartBit, EndBit, Value)); 2100 } 2101 2102 /** 2103 Reads a bit field in a 16-bit MMIO register, performs a bitwise OR, and 2104 writes the result back to the bit field in the 16-bit MMIO register and 2105 saves the value in the S3 script to be replayed on S3 resume. 2106 2107 Reads the 16-bit MMIO register specified by Address, performs a bitwise 2108 inclusive OR between the read result and the value specified by OrData, and 2109 writes the result to the 16-bit MMIO register specified by Address. The value 2110 written to the MMIO register is returned. This function must guarantee that 2111 all MMIO read and write operations are serialized. Extra left bits in OrData 2112 are stripped. 2113 2114 If 16-bit MMIO register operations are not supported, then ASSERT(). 2115 If StartBit is greater than 15, then ASSERT(). 2116 If EndBit is greater than 15, then ASSERT(). 2117 If EndBit is less than StartBit, then ASSERT(). 2118 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2119 2120 @param Address The MMIO register to write. 2121 @param StartBit The ordinal of the least significant bit in the bit field. 2122 Range 0..15. 2123 @param EndBit The ordinal of the most significant bit in the bit field. 2124 Range 0..15. 2125 @param OrData The value to OR with the read value from the MMIO register. 2126 2127 @return The value written back to the MMIO register. 2128 2129 **/ 2130 UINT16 2131 EFIAPI 2132 S3MmioBitFieldOr16 ( 2133 IN UINTN Address, 2134 IN UINTN StartBit, 2135 IN UINTN EndBit, 2136 IN UINT16 OrData 2137 ) 2138 { 2139 return InternalSaveMmioWrite16ValueToBootScript (Address, MmioBitFieldOr16 (Address, StartBit, EndBit, OrData)); 2140 } 2141 2142 /** 2143 Reads a bit field in a 16-bit MMIO register, performs a bitwise AND, and 2144 writes the result back to the bit field in the 16-bit MMIO register and 2145 saves the value in the S3 script to be replayed on S3 resume. 2146 2147 Reads the 16-bit MMIO register specified by Address, performs a bitwise AND 2148 between the read result and the value specified by AndData, and writes the 2149 result to the 16-bit MMIO register specified by Address. The value written to 2150 the MMIO register is returned. This function must guarantee that all MMIO 2151 read and write operations are serialized. Extra left bits in AndData are 2152 stripped. 2153 2154 If 16-bit MMIO register operations are not supported, then ASSERT(). 2155 If StartBit is greater than 15, then ASSERT(). 2156 If EndBit is greater than 15, then ASSERT(). 2157 If EndBit is less than StartBit, then ASSERT(). 2158 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2159 2160 @param Address The MMIO register to write. 2161 @param StartBit The ordinal of the least significant bit in the bit field. 2162 Range 0..15. 2163 @param EndBit The ordinal of the most significant bit in the bit field. 2164 Range 0..15. 2165 @param AndData The value to AND with the read value from the MMIO register. 2166 2167 @return The value written back to the MMIO register. 2168 2169 **/ 2170 UINT16 2171 EFIAPI 2172 S3MmioBitFieldAnd16 ( 2173 IN UINTN Address, 2174 IN UINTN StartBit, 2175 IN UINTN EndBit, 2176 IN UINT16 AndData 2177 ) 2178 { 2179 return InternalSaveMmioWrite16ValueToBootScript (Address, MmioBitFieldAnd16 (Address, StartBit, EndBit, AndData)); 2180 } 2181 2182 /** 2183 Reads a bit field in a 16-bit MMIO register, performs a bitwise AND followed 2184 by a bitwise OR, and writes the result back to the bit field in the 2185 16-bit MMIO register and saves the value in the S3 script to be replayed 2186 on S3 resume. 2187 2188 Reads the 16-bit MMIO register specified by Address, performs a bitwise AND 2189 followed by a bitwise OR between the read result and the value 2190 specified by AndData, and writes the result to the 16-bit MMIO register 2191 specified by Address. The value written to the MMIO register is returned. 2192 This function must guarantee that all MMIO read and write operations are 2193 serialized. Extra left bits in both AndData and OrData are stripped. 2194 2195 If 16-bit MMIO register operations are not supported, then ASSERT(). 2196 If StartBit is greater than 15, then ASSERT(). 2197 If EndBit is greater than 15, then ASSERT(). 2198 If EndBit is less than StartBit, then ASSERT(). 2199 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2200 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2201 2202 @param Address The MMIO register to write. 2203 @param StartBit The ordinal of the least significant bit in the bit field. 2204 Range 0..15. 2205 @param EndBit The ordinal of the most significant bit in the bit field. 2206 Range 0..15. 2207 @param AndData The value to AND with the read value from the MMIO register. 2208 @param OrData The value to OR with the result of the AND operation. 2209 2210 @return The value written back to the MMIO register. 2211 2212 **/ 2213 UINT16 2214 EFIAPI 2215 S3MmioBitFieldAndThenOr16 ( 2216 IN UINTN Address, 2217 IN UINTN StartBit, 2218 IN UINTN EndBit, 2219 IN UINT16 AndData, 2220 IN UINT16 OrData 2221 ) 2222 { 2223 return InternalSaveMmioWrite16ValueToBootScript (Address, MmioBitFieldAndThenOr16 (Address, StartBit, EndBit, AndData, OrData)); 2224 } 2225 2226 /** 2227 Saves a 32-bit MMIO register value to the boot script. 2228 2229 This internal worker function saves a 32-bit MMIO register value in the S3 script 2230 to be replayed on S3 resume. 2231 2232 If the saving process fails, then ASSERT(). 2233 2234 @param Address The MMIO register to write. 2235 @param Value The value saved to boot script. 2236 2237 @return Value. 2238 2239 **/ 2240 UINT32 2241 InternalSaveMmioWrite32ValueToBootScript ( 2242 IN UINTN Address, 2243 IN UINT32 Value 2244 ) 2245 { 2246 InternalSaveMmioWriteValueToBootScript (S3BootScriptWidthUint32, Address, &Value); 2247 2248 return Value; 2249 } 2250 2251 /** 2252 Reads a 32-bit MMIO register saves the value in the S3 script to be 2253 replayed on S3 resume. 2254 2255 Reads the 32-bit MMIO register specified by Address. The 32-bit read value is 2256 returned. This function must guarantee that all MMIO read and write 2257 operations are serialized. 2258 2259 If 32-bit MMIO register operations are not supported, then ASSERT(). 2260 2261 @param Address The MMIO register to read. 2262 2263 @return The value read. 2264 2265 **/ 2266 UINT32 2267 EFIAPI 2268 S3MmioRead32 ( 2269 IN UINTN Address 2270 ) 2271 { 2272 return InternalSaveMmioWrite32ValueToBootScript (Address, MmioRead32 (Address)); 2273 } 2274 2275 /** 2276 Writes a 32-bit MMIO register and saves the value in the S3 script to be 2277 replayed on S3 resume. 2278 2279 Writes the 32-bit MMIO register specified by Address with the value specified 2280 by Value and returns Value. This function must guarantee that all MMIO read 2281 and write operations are serialized. 2282 2283 If 32-bit MMIO register operations are not supported, then ASSERT(). 2284 2285 @param Address The MMIO register to write. 2286 @param Value The value to write to the MMIO register. 2287 2288 @return The value written the MMIO register. 2289 2290 **/ 2291 UINT32 2292 EFIAPI 2293 S3MmioWrite32 ( 2294 IN UINTN Address, 2295 IN UINT32 Value 2296 ) 2297 { 2298 return InternalSaveMmioWrite32ValueToBootScript (Address, MmioWrite32 (Address, Value)); 2299 } 2300 2301 /** 2302 Reads a 32-bit MMIO register, performs a bitwise OR, and writes the 2303 result back to the 32-bit MMIO register and saves the value in the S3 script 2304 to be replayed on S3 resume. 2305 2306 Reads the 32-bit MMIO register specified by Address, performs a bitwise 2307 inclusive OR between the read result and the value specified by OrData, and 2308 writes the result to the 32-bit MMIO register specified by Address. The value 2309 written to the MMIO register is returned. This function must guarantee that 2310 all MMIO read and write operations are serialized. 2311 2312 If 32-bit MMIO register operations are not supported, then ASSERT(). 2313 2314 @param Address The MMIO register to write. 2315 @param OrData The value to OR with the read value from the MMIO register. 2316 2317 @return The value written back to the MMIO register. 2318 2319 **/ 2320 UINT32 2321 EFIAPI 2322 S3MmioOr32 ( 2323 IN UINTN Address, 2324 IN UINT32 OrData 2325 ) 2326 { 2327 return InternalSaveMmioWrite32ValueToBootScript (Address, MmioOr32 (Address, OrData)); 2328 } 2329 2330 /** 2331 Reads a 32-bit MMIO register, performs a bitwise AND, and writes the result 2332 back to the 32-bit MMIO register and saves the value in the S3 script to be 2333 replayed on S3 resume. 2334 2335 Reads the 32-bit MMIO register specified by Address, performs a bitwise AND 2336 between the read result and the value specified by AndData, and writes the 2337 result to the 32-bit MMIO register specified by Address. The value written to 2338 the MMIO register is returned. This function must guarantee that all MMIO 2339 read and write operations are serialized. 2340 2341 If 32-bit MMIO register operations are not supported, then ASSERT(). 2342 2343 @param Address The MMIO register to write. 2344 @param AndData The value to AND with the read value from the MMIO register. 2345 2346 @return The value written back to the MMIO register. 2347 2348 **/ 2349 UINT32 2350 EFIAPI 2351 S3MmioAnd32 ( 2352 IN UINTN Address, 2353 IN UINT32 AndData 2354 ) 2355 { 2356 return InternalSaveMmioWrite32ValueToBootScript (Address, MmioAnd32 (Address, AndData)); 2357 } 2358 2359 /** 2360 Reads a 32-bit MMIO register, performs a bitwise AND followed by a bitwise 2361 inclusive OR, and writes the result back to the 32-bit MMIO register and 2362 saves the value in the S3 script to be replayed on S3 resume. 2363 2364 Reads the 32-bit MMIO register specified by Address, performs a bitwise AND 2365 between the read result and the value specified by AndData, performs a 2366 bitwise OR between the result of the AND operation and the value specified by 2367 OrData, and writes the result to the 32-bit MMIO register specified by 2368 Address. The value written to the MMIO register is returned. This function 2369 must guarantee that all MMIO read and write operations are serialized. 2370 2371 If 32-bit MMIO register operations are not supported, then ASSERT(). 2372 2373 @param Address The MMIO register to write. 2374 @param AndData The value to AND with the read value from the MMIO register. 2375 @param OrData The value to OR with the result of the AND operation. 2376 2377 @return The value written back to the MMIO register. 2378 2379 **/ 2380 UINT32 2381 EFIAPI 2382 S3MmioAndThenOr32 ( 2383 IN UINTN Address, 2384 IN UINT32 AndData, 2385 IN UINT32 OrData 2386 ) 2387 { 2388 return InternalSaveMmioWrite32ValueToBootScript (Address, MmioAndThenOr32 (Address, AndData, OrData)); 2389 } 2390 2391 /** 2392 Reads a bit field of a MMIO register and saves the value in the S3 script 2393 to be replayed on S3 resume. 2394 2395 Reads the bit field in a 32-bit MMIO register. The bit field is specified by 2396 the StartBit and the EndBit. The value of the bit field is returned. 2397 2398 If 32-bit MMIO register operations are not supported, then ASSERT(). 2399 If StartBit is greater than 31, then ASSERT(). 2400 If EndBit is greater than 31, then ASSERT(). 2401 If EndBit is less than StartBit, then ASSERT(). 2402 2403 @param Address MMIO register to read. 2404 @param StartBit The ordinal of the least significant bit in the bit field. 2405 Range 0..31. 2406 @param EndBit The ordinal of the most significant bit in the bit field. 2407 Range 0..31. 2408 2409 @return The value read. 2410 2411 **/ 2412 UINT32 2413 EFIAPI 2414 S3MmioBitFieldRead32 ( 2415 IN UINTN Address, 2416 IN UINTN StartBit, 2417 IN UINTN EndBit 2418 ) 2419 { 2420 return InternalSaveMmioWrite32ValueToBootScript (Address, MmioBitFieldRead32 (Address, StartBit, EndBit)); 2421 } 2422 2423 /** 2424 Writes a bit field to a MMIO register and saves the value in the S3 script 2425 to be replayed on S3 resume. 2426 2427 Writes Value to the bit field of the MMIO register. The bit field is 2428 specified by the StartBit and the EndBit. All other bits in the destination 2429 MMIO register are preserved. The new value of the 32-bit register is returned. 2430 2431 If 32-bit MMIO register operations are not supported, then ASSERT(). 2432 If StartBit is greater than 31, then ASSERT(). 2433 If EndBit is greater than 31, then ASSERT(). 2434 If EndBit is less than StartBit, then ASSERT(). 2435 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2436 2437 @param Address The MMIO register to write. 2438 @param StartBit The ordinal of the least significant bit in the bit field. 2439 Range 0..31. 2440 @param EndBit The ordinal of the most significant bit in the bit field. 2441 Range 0..31. 2442 @param Value New value of the bit field. 2443 2444 @return The value written back to the MMIO register. 2445 2446 **/ 2447 UINT32 2448 EFIAPI 2449 S3MmioBitFieldWrite32 ( 2450 IN UINTN Address, 2451 IN UINTN StartBit, 2452 IN UINTN EndBit, 2453 IN UINT32 Value 2454 ) 2455 { 2456 return InternalSaveMmioWrite32ValueToBootScript (Address, MmioBitFieldWrite32 (Address, StartBit, EndBit, Value)); 2457 } 2458 2459 /** 2460 Reads a bit field in a 32-bit MMIO register, performs a bitwise OR, and 2461 writes the result back to the bit field in the 32-bit MMIO register and 2462 saves the value in the S3 script to be replayed on S3 resume. 2463 2464 Reads the 32-bit MMIO register specified by Address, performs a bitwise 2465 inclusive OR between the read result and the value specified by OrData, and 2466 writes the result to the 32-bit MMIO register specified by Address. The value 2467 written to the MMIO register is returned. This function must guarantee that 2468 all MMIO read and write operations are serialized. Extra left bits in OrData 2469 are stripped. 2470 2471 If 32-bit MMIO register operations are not supported, then ASSERT(). 2472 If StartBit is greater than 31, then ASSERT(). 2473 If EndBit is greater than 31, then ASSERT(). 2474 If EndBit is less than StartBit, then ASSERT(). 2475 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2476 2477 @param Address The MMIO register to write. 2478 @param StartBit The ordinal of the least significant bit in the bit field. 2479 Range 0..31. 2480 @param EndBit The ordinal of the most significant bit in the bit field. 2481 Range 0..31. 2482 @param OrData The value to OR with the read value from the MMIO register. 2483 2484 @return The value written back to the MMIO register. 2485 2486 **/ 2487 UINT32 2488 EFIAPI 2489 S3MmioBitFieldOr32 ( 2490 IN UINTN Address, 2491 IN UINTN StartBit, 2492 IN UINTN EndBit, 2493 IN UINT32 OrData 2494 ) 2495 { 2496 return InternalSaveMmioWrite32ValueToBootScript (Address, MmioBitFieldOr32 (Address, StartBit, EndBit, OrData)); 2497 } 2498 2499 /** 2500 Reads a bit field in a 32-bit MMIO register, performs a bitwise AND, and 2501 writes the result back to the bit field in the 32-bit MMIO register and 2502 saves the value in the S3 script to be replayed on S3 resume. 2503 2504 Reads the 32-bit MMIO register specified by Address, performs a bitwise AND 2505 between the read result and the value specified by AndData, and writes the 2506 result to the 32-bit MMIO register specified by Address. The value written to 2507 the MMIO register is returned. This function must guarantee that all MMIO 2508 read and write operations are serialized. Extra left bits in AndData are 2509 stripped. 2510 2511 If 32-bit MMIO register operations are not supported, then ASSERT(). 2512 If StartBit is greater than 31, then ASSERT(). 2513 If EndBit is greater than 31, then ASSERT(). 2514 If EndBit is less than StartBit, then ASSERT(). 2515 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2516 2517 @param Address The MMIO register to write. 2518 @param StartBit The ordinal of the least significant bit in the bit field. 2519 Range 0..31. 2520 @param EndBit The ordinal of the most significant bit in the bit field. 2521 Range 0..31. 2522 @param AndData The value to AND with the read value from the MMIO register. 2523 2524 @return The value written back to the MMIO register. 2525 2526 **/ 2527 UINT32 2528 EFIAPI 2529 S3MmioBitFieldAnd32 ( 2530 IN UINTN Address, 2531 IN UINTN StartBit, 2532 IN UINTN EndBit, 2533 IN UINT32 AndData 2534 ) 2535 { 2536 return InternalSaveMmioWrite32ValueToBootScript (Address, MmioBitFieldAnd32 (Address, StartBit, EndBit, AndData)); 2537 } 2538 2539 /** 2540 Reads a bit field in a 32-bit MMIO register, performs a bitwise AND followed 2541 by a bitwise OR, and writes the result back to the bit field in the 2542 32-bit MMIO register and saves the value in the S3 script to be replayed 2543 on S3 resume. 2544 2545 Reads the 32-bit MMIO register specified by Address, performs a bitwise AND 2546 followed by a bitwise OR between the read result and the value 2547 specified by AndData, and writes the result to the 32-bit MMIO register 2548 specified by Address. The value written to the MMIO register is returned. 2549 This function must guarantee that all MMIO read and write operations are 2550 serialized. Extra left bits in both AndData and OrData are stripped. 2551 2552 If 32-bit MMIO register operations are not supported, then ASSERT(). 2553 If StartBit is greater than 31, then ASSERT(). 2554 If EndBit is greater than 31, then ASSERT(). 2555 If EndBit is less than StartBit, then ASSERT(). 2556 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2557 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2558 2559 @param Address The MMIO register to write. 2560 @param StartBit The ordinal of the least significant bit in the bit field. 2561 Range 0..31. 2562 @param EndBit The ordinal of the most significant bit in the bit field. 2563 Range 0..31. 2564 @param AndData The value to AND with the read value from the MMIO register. 2565 @param OrData The value to OR with the result of the AND operation. 2566 2567 @return The value written back to the MMIO register. 2568 2569 **/ 2570 UINT32 2571 EFIAPI 2572 S3MmioBitFieldAndThenOr32 ( 2573 IN UINTN Address, 2574 IN UINTN StartBit, 2575 IN UINTN EndBit, 2576 IN UINT32 AndData, 2577 IN UINT32 OrData 2578 ) 2579 { 2580 return InternalSaveMmioWrite32ValueToBootScript (Address, MmioBitFieldAndThenOr32 (Address, StartBit, EndBit, AndData, OrData)); 2581 } 2582 2583 /** 2584 Saves a 64-bit MMIO register value to the boot script. 2585 2586 This internal worker function saves a 64-bit MMIO register value in the S3 script 2587 to be replayed on S3 resume. 2588 2589 If the saving process fails, then ASSERT(). 2590 2591 @param Address The MMIO register to write. 2592 @param Value The value saved to boot script. 2593 2594 @return Value. 2595 2596 **/ 2597 UINT64 2598 InternalSaveMmioWrite64ValueToBootScript ( 2599 IN UINTN Address, 2600 IN UINT64 Value 2601 ) 2602 { 2603 InternalSaveMmioWriteValueToBootScript (S3BootScriptWidthUint64, Address, &Value); 2604 2605 return Value; 2606 } 2607 2608 /** 2609 Reads a 64-bit MMIO register and saves the value in the S3 script to be 2610 replayed on S3 resume. 2611 2612 Reads the 64-bit MMIO register specified by Address. The 64-bit read value is 2613 returned. This function must guarantee that all MMIO read and write 2614 operations are serialized. 2615 2616 If 64-bit MMIO register operations are not supported, then ASSERT(). 2617 2618 @param Address The MMIO register to read. 2619 2620 @return The value read. 2621 2622 **/ 2623 UINT64 2624 EFIAPI 2625 S3MmioRead64 ( 2626 IN UINTN Address 2627 ) 2628 { 2629 return InternalSaveMmioWrite64ValueToBootScript (Address, MmioRead64 (Address)); 2630 } 2631 2632 /** 2633 Writes a 64-bit MMIO register and saves the value in the S3 script to be 2634 replayed on S3 resume. 2635 2636 Writes the 64-bit MMIO register specified by Address with the value specified 2637 by Value and returns Value. This function must guarantee that all MMIO read 2638 and write operations are serialized. 2639 2640 If 64-bit MMIO register operations are not supported, then ASSERT(). 2641 2642 @param Address The MMIO register to write. 2643 @param Value The value to write to the MMIO register. 2644 2645 @return The value written the MMIO register. 2646 2647 **/ 2648 UINT64 2649 EFIAPI 2650 S3MmioWrite64 ( 2651 IN UINTN Address, 2652 IN UINT64 Value 2653 ) 2654 { 2655 return InternalSaveMmioWrite64ValueToBootScript (Address, MmioWrite64 (Address, Value)); 2656 } 2657 2658 /** 2659 Reads a 64-bit MMIO register, performs a bitwise OR, and writes the 2660 result back to the 64-bit MMIO register and saves the value in the S3 script 2661 to be replayed on S3 resume. 2662 2663 Reads the 64-bit MMIO register specified by Address, performs a bitwise 2664 inclusive OR between the read result and the value specified by OrData, and 2665 writes the result to the 64-bit MMIO register specified by Address. The value 2666 written to the MMIO register is returned. This function must guarantee that 2667 all MMIO read and write operations are serialized. 2668 2669 If 64-bit MMIO register operations are not supported, then ASSERT(). 2670 2671 @param Address The MMIO register to write. 2672 @param OrData The value to OR with the read value from the MMIO register. 2673 2674 @return The value written back to the MMIO register. 2675 2676 **/ 2677 UINT64 2678 EFIAPI 2679 S3MmioOr64 ( 2680 IN UINTN Address, 2681 IN UINT64 OrData 2682 ) 2683 { 2684 return InternalSaveMmioWrite64ValueToBootScript (Address, MmioOr64 (Address, OrData)); 2685 } 2686 2687 /** 2688 Reads a 64-bit MMIO register, performs a bitwise AND, and writes the result 2689 back to the 64-bit MMIO register and saves the value in the S3 script to be 2690 replayed on S3 resume. 2691 2692 Reads the 64-bit MMIO register specified by Address, performs a bitwise AND 2693 between the read result and the value specified by AndData, and writes the 2694 result to the 64-bit MMIO register specified by Address. The value written to 2695 the MMIO register is returned. This function must guarantee that all MMIO 2696 read and write operations are serialized. 2697 2698 If 64-bit MMIO register operations are not supported, then ASSERT(). 2699 2700 @param Address The MMIO register to write. 2701 @param AndData The value to AND with the read value from the MMIO register. 2702 2703 @return The value written back to the MMIO register. 2704 2705 **/ 2706 UINT64 2707 EFIAPI 2708 S3MmioAnd64 ( 2709 IN UINTN Address, 2710 IN UINT64 AndData 2711 ) 2712 { 2713 return InternalSaveMmioWrite64ValueToBootScript (Address, MmioAnd64 (Address, AndData)); 2714 } 2715 2716 /** 2717 Reads a 64-bit MMIO register, performs a bitwise AND followed by a bitwise 2718 inclusive OR, and writes the result back to the 64-bit MMIO register and 2719 saves the value in the S3 script to be replayed on S3 resume. 2720 2721 Reads the 64-bit MMIO register specified by Address, performs a bitwise AND 2722 between the read result and the value specified by AndData, performs a 2723 bitwise OR between the result of the AND operation and the value specified by 2724 OrData, and writes the result to the 64-bit MMIO register specified by 2725 Address. The value written to the MMIO register is returned. This function 2726 must guarantee that all MMIO read and write operations are serialized. 2727 2728 If 64-bit MMIO register operations are not supported, then ASSERT(). 2729 2730 @param Address The MMIO register to write. 2731 @param AndData The value to AND with the read value from the MMIO register. 2732 @param OrData The value to OR with the result of the AND operation. 2733 2734 @return The value written back to the MMIO register. 2735 2736 **/ 2737 UINT64 2738 EFIAPI 2739 S3MmioAndThenOr64 ( 2740 IN UINTN Address, 2741 IN UINT64 AndData, 2742 IN UINT64 OrData 2743 ) 2744 { 2745 return InternalSaveMmioWrite64ValueToBootScript (Address, MmioAndThenOr64 (Address, AndData, OrData)); 2746 } 2747 2748 /** 2749 Reads a bit field of a MMIO register saves the value in the S3 script to 2750 be replayed on S3 resume. 2751 2752 Reads the bit field in a 64-bit MMIO register. The bit field is specified by 2753 the StartBit and the EndBit. The value of the bit field is returned. 2754 2755 If 64-bit MMIO register operations are not supported, then ASSERT(). 2756 If StartBit is greater than 63, then ASSERT(). 2757 If EndBit is greater than 63, then ASSERT(). 2758 If EndBit is less than StartBit, then ASSERT(). 2759 2760 @param Address MMIO register to read. 2761 @param StartBit The ordinal of the least significant bit in the bit field. 2762 Range 0..63. 2763 @param EndBit The ordinal of the most significant bit in the bit field. 2764 Range 0..63. 2765 2766 @return The value read. 2767 2768 **/ 2769 UINT64 2770 EFIAPI 2771 S3MmioBitFieldRead64 ( 2772 IN UINTN Address, 2773 IN UINTN StartBit, 2774 IN UINTN EndBit 2775 ) 2776 { 2777 return InternalSaveMmioWrite64ValueToBootScript (Address, MmioBitFieldRead64 (Address, StartBit, EndBit)); 2778 } 2779 2780 /** 2781 Writes a bit field to a MMIO register and saves the value in the S3 script to 2782 be replayed on S3 resume. 2783 2784 Writes Value to the bit field of the MMIO register. The bit field is 2785 specified by the StartBit and the EndBit. All other bits in the destination 2786 MMIO register are preserved. The new value of the 64-bit register is returned. 2787 2788 If 64-bit MMIO register operations are not supported, then ASSERT(). 2789 If StartBit is greater than 63, then ASSERT(). 2790 If EndBit is greater than 63, then ASSERT(). 2791 If EndBit is less than StartBit, then ASSERT(). 2792 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2793 2794 @param Address The MMIO register to write. 2795 @param StartBit The ordinal of the least significant bit in the bit field. 2796 Range 0..63. 2797 @param EndBit The ordinal of the most significant bit in the bit field. 2798 Range 0..63. 2799 @param Value New value of the bit field. 2800 2801 @return The value written back to the MMIO register. 2802 2803 **/ 2804 UINT64 2805 EFIAPI 2806 S3MmioBitFieldWrite64 ( 2807 IN UINTN Address, 2808 IN UINTN StartBit, 2809 IN UINTN EndBit, 2810 IN UINT64 Value 2811 ) 2812 { 2813 return InternalSaveMmioWrite64ValueToBootScript (Address, MmioBitFieldWrite64 (Address, StartBit, EndBit, Value)); 2814 } 2815 2816 /** 2817 Reads a bit field in a 64-bit MMIO register, performs a bitwise OR, and 2818 writes the result back to the bit field in the 64-bit MMIO register and 2819 saves the value in the S3 script to be replayed on S3 resume. 2820 2821 Reads the 64-bit MMIO register specified by Address, performs a bitwise 2822 inclusive OR between the read result and the value specified by OrData, and 2823 writes the result to the 64-bit MMIO register specified by Address. The value 2824 written to the MMIO register is returned. This function must guarantee that 2825 all MMIO read and write operations are serialized. Extra left bits in OrData 2826 are stripped. 2827 2828 If 64-bit MMIO register operations are not supported, then ASSERT(). 2829 If StartBit is greater than 63, then ASSERT(). 2830 If EndBit is greater than 63, then ASSERT(). 2831 If EndBit is less than StartBit, then ASSERT(). 2832 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2833 2834 @param Address The MMIO register to write. 2835 @param StartBit The ordinal of the least significant bit in the bit field. 2836 Range 0..63. 2837 @param EndBit The ordinal of the most significant bit in the bit field. 2838 Range 0..63. 2839 @param OrData The value to OR with the read value from the MMIO register. 2840 2841 @return The value written back to the MMIO register. 2842 2843 **/ 2844 UINT64 2845 EFIAPI 2846 S3MmioBitFieldOr64 ( 2847 IN UINTN Address, 2848 IN UINTN StartBit, 2849 IN UINTN EndBit, 2850 IN UINT64 OrData 2851 ) 2852 { 2853 return InternalSaveMmioWrite64ValueToBootScript (Address, MmioBitFieldOr64 (Address, StartBit, EndBit, OrData)); 2854 } 2855 2856 /** 2857 Reads a bit field in a 64-bit MMIO register, performs a bitwise AND, and 2858 writes the result back to the bit field in the 64-bit MMIO register and saves 2859 the value in the S3 script to be replayed on S3 resume. 2860 2861 Reads the 64-bit MMIO register specified by Address, performs a bitwise AND 2862 between the read result and the value specified by AndData, and writes the 2863 result to the 64-bit MMIO register specified by Address. The value written to 2864 the MMIO register is returned. This function must guarantee that all MMIO 2865 read and write operations are serialized. Extra left bits in AndData are 2866 stripped. 2867 2868 If 64-bit MMIO register operations are not supported, then ASSERT(). 2869 If StartBit is greater than 63, then ASSERT(). 2870 If EndBit is greater than 63, then ASSERT(). 2871 If EndBit is less than StartBit, then ASSERT(). 2872 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2873 2874 @param Address The MMIO register to write. 2875 @param StartBit The ordinal of the least significant bit in the bit field. 2876 Range 0..63. 2877 @param EndBit The ordinal of the most significant bit in the bit field. 2878 Range 0..63. 2879 @param AndData The value to AND with the read value from the MMIO register. 2880 2881 @return The value written back to the MMIO register. 2882 2883 **/ 2884 UINT64 2885 EFIAPI 2886 S3MmioBitFieldAnd64 ( 2887 IN UINTN Address, 2888 IN UINTN StartBit, 2889 IN UINTN EndBit, 2890 IN UINT64 AndData 2891 ) 2892 { 2893 return InternalSaveMmioWrite64ValueToBootScript (Address, MmioBitFieldAnd64 (Address, StartBit, EndBit, AndData)); 2894 } 2895 2896 /** 2897 Reads a bit field in a 64-bit MMIO register, performs a bitwise AND followed 2898 by a bitwise OR, and writes the result back to the bit field in the 2899 64-bit MMIO register and saves the value in the S3 script to be replayed 2900 on S3 resume. 2901 2902 Reads the 64-bit MMIO register specified by Address, performs a bitwise AND 2903 followed by a bitwise OR between the read result and the value 2904 specified by AndData, and writes the result to the 64-bit MMIO register 2905 specified by Address. The value written to the MMIO register is returned. 2906 This function must guarantee that all MMIO read and write operations are 2907 serialized. Extra left bits in both AndData and OrData are stripped. 2908 2909 If 64-bit MMIO register operations are not supported, then ASSERT(). 2910 If StartBit is greater than 63, then ASSERT(). 2911 If EndBit is greater than 63, then ASSERT(). 2912 If EndBit is less than StartBit, then ASSERT(). 2913 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2914 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 2915 2916 @param Address The MMIO register to write. 2917 @param StartBit The ordinal of the least significant bit in the bit field. 2918 Range 0..63. 2919 @param EndBit The ordinal of the most significant bit in the bit field. 2920 Range 0..63. 2921 @param AndData The value to AND with the read value from the MMIO register. 2922 @param OrData The value to OR with the result of the AND operation. 2923 2924 @return The value written back to the MMIO register. 2925 2926 **/ 2927 UINT64 2928 EFIAPI 2929 S3MmioBitFieldAndThenOr64 ( 2930 IN UINTN Address, 2931 IN UINTN StartBit, 2932 IN UINTN EndBit, 2933 IN UINT64 AndData, 2934 IN UINT64 OrData 2935 ) 2936 { 2937 return InternalSaveMmioWrite64ValueToBootScript (Address, MmioBitFieldAndThenOr64 (Address, StartBit, EndBit, AndData, OrData)); 2938 } 2939 2940 /** 2941 Copy data from MMIO region to system memory by using 8-bit access 2942 and saves the value in the S3 script to be replayed on S3 resume. 2943 2944 Copy data from MMIO region specified by starting address StartAddress 2945 to system memory specified by Buffer by using 8-bit access. The total 2946 number of byte to be copied is specified by Length. Buffer is returned. 2947 2948 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 2949 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 2950 2951 2952 @param StartAddress Starting address for the MMIO region to be copied from. 2953 @param Length Size in bytes of the copy. 2954 @param Buffer Pointer to a system memory buffer receiving the data read. 2955 2956 @return Buffer 2957 2958 **/ 2959 UINT8 * 2960 EFIAPI 2961 S3MmioReadBuffer8 ( 2962 IN UINTN StartAddress, 2963 IN UINTN Length, 2964 OUT UINT8 *Buffer 2965 ) 2966 { 2967 UINT8 *ReturnBuffer; 2968 RETURN_STATUS Status; 2969 2970 ReturnBuffer = MmioReadBuffer8 (StartAddress, Length, Buffer); 2971 2972 Status = S3BootScriptSaveMemWrite ( 2973 S3BootScriptWidthUint8, 2974 StartAddress, 2975 Length / sizeof (UINT8), 2976 ReturnBuffer 2977 ); 2978 ASSERT (Status == RETURN_SUCCESS); 2979 2980 return ReturnBuffer; 2981 } 2982 2983 /** 2984 Copy data from MMIO region to system memory by using 16-bit access 2985 and saves the value in the S3 script to be replayed on S3 resume. 2986 2987 Copy data from MMIO region specified by starting address StartAddress 2988 to system memory specified by Buffer by using 16-bit access. The total 2989 number of byte to be copied is specified by Length. Buffer is returned. 2990 2991 If StartAddress is not aligned on a 16-bit boundary, then ASSERT(). 2992 2993 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 2994 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 2995 2996 If Length is not aligned on a 16-bit boundary, then ASSERT(). 2997 If Buffer is not aligned on a 16-bit boundary, then ASSERT(). 2998 2999 @param StartAddress Starting address for the MMIO region to be copied from. 3000 @param Length Size in bytes of the copy. 3001 @param Buffer Pointer to a system memory buffer receiving the data read. 3002 3003 @return Buffer 3004 3005 **/ 3006 UINT16 * 3007 EFIAPI 3008 S3MmioReadBuffer16 ( 3009 IN UINTN StartAddress, 3010 IN UINTN Length, 3011 OUT UINT16 *Buffer 3012 ) 3013 { 3014 UINT16 *ReturnBuffer; 3015 RETURN_STATUS Status; 3016 3017 ReturnBuffer = MmioReadBuffer16 (StartAddress, Length, Buffer); 3018 3019 Status = S3BootScriptSaveMemWrite ( 3020 S3BootScriptWidthUint16, 3021 StartAddress, 3022 Length / sizeof (UINT16), 3023 ReturnBuffer 3024 ); 3025 ASSERT (Status == RETURN_SUCCESS); 3026 3027 return ReturnBuffer; 3028 } 3029 3030 /** 3031 Copy data from MMIO region to system memory by using 32-bit access 3032 and saves the value in the S3 script to be replayed on S3 resume. 3033 3034 Copy data from MMIO region specified by starting address StartAddress 3035 to system memory specified by Buffer by using 32-bit access. The total 3036 number of byte to be copied is specified by Length. Buffer is returned. 3037 3038 If StartAddress is not aligned on a 32-bit boundary, then ASSERT(). 3039 3040 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 3041 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 3042 3043 If Length is not aligned on a 32-bit boundary, then ASSERT(). 3044 If Buffer is not aligned on a 32-bit boundary, then ASSERT(). 3045 3046 @param StartAddress Starting address for the MMIO region to be copied from. 3047 @param Length Size in bytes of the copy. 3048 @param Buffer Pointer to a system memory buffer receiving the data read. 3049 3050 @return Buffer 3051 3052 **/ 3053 UINT32 * 3054 EFIAPI 3055 S3MmioReadBuffer32 ( 3056 IN UINTN StartAddress, 3057 IN UINTN Length, 3058 OUT UINT32 *Buffer 3059 ) 3060 { 3061 UINT32 *ReturnBuffer; 3062 RETURN_STATUS Status; 3063 3064 ReturnBuffer = MmioReadBuffer32 (StartAddress, Length, Buffer); 3065 3066 Status = S3BootScriptSaveMemWrite ( 3067 S3BootScriptWidthUint32, 3068 StartAddress, 3069 Length / sizeof (UINT32), 3070 ReturnBuffer 3071 ); 3072 ASSERT (Status == RETURN_SUCCESS); 3073 3074 return ReturnBuffer; 3075 } 3076 3077 /** 3078 Copy data from MMIO region to system memory by using 64-bit access 3079 and saves the value in the S3 script to be replayed on S3 resume. 3080 3081 Copy data from MMIO region specified by starting address StartAddress 3082 to system memory specified by Buffer by using 64-bit access. The total 3083 number of byte to be copied is specified by Length. Buffer is returned. 3084 3085 If StartAddress is not aligned on a 64-bit boundary, then ASSERT(). 3086 3087 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 3088 If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 3089 3090 If Length is not aligned on a 64-bit boundary, then ASSERT(). 3091 If Buffer is not aligned on a 64-bit boundary, then ASSERT(). 3092 3093 @param StartAddress Starting address for the MMIO region to be copied from. 3094 @param Length Size in bytes of the copy. 3095 @param Buffer Pointer to a system memory buffer receiving the data read. 3096 3097 @return Buffer 3098 3099 **/ 3100 UINT64 * 3101 EFIAPI 3102 S3MmioReadBuffer64 ( 3103 IN UINTN StartAddress, 3104 IN UINTN Length, 3105 OUT UINT64 *Buffer 3106 ) 3107 { 3108 UINT64 *ReturnBuffer; 3109 RETURN_STATUS Status; 3110 3111 ReturnBuffer = MmioReadBuffer64 (StartAddress, Length, Buffer); 3112 3113 Status = S3BootScriptSaveMemWrite ( 3114 S3BootScriptWidthUint64, 3115 StartAddress, 3116 Length / sizeof (UINT64), 3117 ReturnBuffer 3118 ); 3119 ASSERT (Status == RETURN_SUCCESS); 3120 3121 return ReturnBuffer; 3122 } 3123 3124 3125 /** 3126 Copy data from system memory to MMIO region by using 8-bit access 3127 and saves the value in the S3 script to be replayed on S3 resume. 3128 3129 Copy data from system memory specified by Buffer to MMIO region specified 3130 by starting address StartAddress by using 8-bit access. The total number 3131 of byte to be copied is specified by Length. Buffer is returned. 3132 3133 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 3134 If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT(). 3135 3136 3137 @param StartAddress Starting address for the MMIO region to be copied to. 3138 @param Length Size in bytes of the copy. 3139 @param Buffer Pointer to a system memory buffer containing the data to write. 3140 3141 @return Buffer 3142 3143 **/ 3144 UINT8 * 3145 EFIAPI 3146 S3MmioWriteBuffer8 ( 3147 IN UINTN StartAddress, 3148 IN UINTN Length, 3149 IN CONST UINT8 *Buffer 3150 ) 3151 { 3152 UINT8 *ReturnBuffer; 3153 RETURN_STATUS Status; 3154 3155 ReturnBuffer = MmioWriteBuffer8 (StartAddress, Length, Buffer); 3156 3157 Status = S3BootScriptSaveMemWrite ( 3158 S3BootScriptWidthUint8, 3159 StartAddress, 3160 Length / sizeof (UINT8), 3161 ReturnBuffer 3162 ); 3163 ASSERT (Status == RETURN_SUCCESS); 3164 3165 return ReturnBuffer; 3166 } 3167 3168 /** 3169 Copy data from system memory to MMIO region by using 16-bit access 3170 and saves the value in the S3 script to be replayed on S3 resume. 3171 3172 Copy data from system memory specified by Buffer to MMIO region specified 3173 by starting address StartAddress by using 16-bit access. The total number 3174 of byte to be copied is specified by Length. Buffer is returned. 3175 3176 If StartAddress is not aligned on a 16-bit boundary, then ASSERT(). 3177 3178 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 3179 If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT(). 3180 3181 If Length is not aligned on a 16-bit boundary, then ASSERT(). 3182 3183 If Buffer is not aligned on a 16-bit boundary, then ASSERT(). 3184 3185 @param StartAddress Starting address for the MMIO region to be copied to. 3186 @param Length Size in bytes of the copy. 3187 @param Buffer Pointer to a system memory buffer containing the data to write. 3188 3189 @return Buffer 3190 3191 **/ 3192 UINT16 * 3193 EFIAPI 3194 S3MmioWriteBuffer16 ( 3195 IN UINTN StartAddress, 3196 IN UINTN Length, 3197 IN CONST UINT16 *Buffer 3198 ) 3199 { 3200 UINT16 *ReturnBuffer; 3201 RETURN_STATUS Status; 3202 3203 ReturnBuffer = MmioWriteBuffer16 (StartAddress, Length, Buffer); 3204 3205 Status = S3BootScriptSaveMemWrite ( 3206 S3BootScriptWidthUint16, 3207 StartAddress, 3208 Length / sizeof (UINT16), 3209 ReturnBuffer 3210 ); 3211 ASSERT (Status == RETURN_SUCCESS); 3212 3213 return ReturnBuffer; 3214 } 3215 3216 3217 /** 3218 Copy data from system memory to MMIO region by using 32-bit access 3219 and saves the value in the S3 script to be replayed on S3 resume. 3220 3221 Copy data from system memory specified by Buffer to MMIO region specified 3222 by starting address StartAddress by using 32-bit access. The total number 3223 of byte to be copied is specified by Length. Buffer is returned. 3224 3225 If StartAddress is not aligned on a 32-bit boundary, then ASSERT(). 3226 3227 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 3228 If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT(). 3229 3230 If Length is not aligned on a 32-bit boundary, then ASSERT(). 3231 3232 If Buffer is not aligned on a 32-bit boundary, then ASSERT(). 3233 3234 @param StartAddress Starting address for the MMIO region to be copied to. 3235 @param Length Size in bytes of the copy. 3236 @param Buffer Pointer to a system memory buffer containing the data to write. 3237 3238 @return Buffer 3239 3240 **/ 3241 UINT32 * 3242 EFIAPI 3243 S3MmioWriteBuffer32 ( 3244 IN UINTN StartAddress, 3245 IN UINTN Length, 3246 IN CONST UINT32 *Buffer 3247 ) 3248 { 3249 UINT32 *ReturnBuffer; 3250 RETURN_STATUS Status; 3251 3252 ReturnBuffer = MmioWriteBuffer32 (StartAddress, Length, Buffer); 3253 3254 Status = S3BootScriptSaveMemWrite ( 3255 S3BootScriptWidthUint32, 3256 StartAddress, 3257 Length / sizeof (UINT32), 3258 ReturnBuffer 3259 ); 3260 ASSERT (Status == RETURN_SUCCESS); 3261 3262 return ReturnBuffer; 3263 } 3264 3265 /** 3266 Copy data from system memory to MMIO region by using 64-bit access 3267 and saves the value in the S3 script to be replayed on S3 resume. 3268 3269 Copy data from system memory specified by Buffer to MMIO region specified 3270 by starting address StartAddress by using 64-bit access. The total number 3271 of byte to be copied is specified by Length. Buffer is returned. 3272 3273 If StartAddress is not aligned on a 64-bit boundary, then ASSERT(). 3274 3275 If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 3276 If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT(). 3277 3278 If Length is not aligned on a 64-bit boundary, then ASSERT(). 3279 3280 If Buffer is not aligned on a 64-bit boundary, then ASSERT(). 3281 3282 @param StartAddress Starting address for the MMIO region to be copied to. 3283 @param Length Size in bytes of the copy. 3284 @param Buffer Pointer to a system memory buffer containing the data to write. 3285 3286 @return Buffer 3287 3288 **/ 3289 UINT64 * 3290 EFIAPI 3291 S3MmioWriteBuffer64 ( 3292 IN UINTN StartAddress, 3293 IN UINTN Length, 3294 IN CONST UINT64 *Buffer 3295 ) 3296 { 3297 UINT64 *ReturnBuffer; 3298 RETURN_STATUS Status; 3299 3300 ReturnBuffer = MmioWriteBuffer64 (StartAddress, Length, Buffer); 3301 3302 Status = S3BootScriptSaveMemWrite ( 3303 S3BootScriptWidthUint64, 3304 StartAddress, 3305 Length / sizeof (UINT64), 3306 ReturnBuffer 3307 ); 3308 ASSERT (Status == RETURN_SUCCESS); 3309 3310 return ReturnBuffer; 3311 } 3312 3313