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**/
39VOID
40InternalSaveIoWriteValueToBootScript (
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**/
71UINT8
72InternalSaveIoWrite8ValueToBootScript (
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**/
97UINT8
98EFIAPI
99S3IoRead8 (
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**/
122UINT8
123EFIAPI
124S3IoWrite8 (
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**/
151UINT8
152EFIAPI
153S3IoOr8 (
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**/
180UINT8
181EFIAPI
182S3IoAnd8 (
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**/
211UINT8
212EFIAPI
213S3IoAndThenOr8 (
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**/
243UINT8
244EFIAPI
245S3IoBitFieldRead8 (
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**/
279UINT8
280EFIAPI
281S3IoBitFieldWrite8 (
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**/
318UINT8
319EFIAPI
320S3IoBitFieldOr8 (
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**/
357UINT8
358EFIAPI
359S3IoBitFieldAnd8 (
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**/
399UINT8
400EFIAPI
401S3IoBitFieldAndThenOr8 (
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**/
426UINT16
427InternalSaveIoWrite16ValueToBootScript (
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**/
452UINT16
453EFIAPI
454S3IoRead16 (
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**/
477UINT16
478EFIAPI
479S3IoWrite16 (
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**/
506UINT16
507EFIAPI
508S3IoOr16 (
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**/
535UINT16
536EFIAPI
537S3IoAnd16 (
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**/
566UINT16
567EFIAPI
568S3IoAndThenOr16 (
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**/
598UINT16
599EFIAPI
600S3IoBitFieldRead16 (
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**/
634UINT16
635EFIAPI
636S3IoBitFieldWrite16 (
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**/
673UINT16
674EFIAPI
675S3IoBitFieldOr16 (
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**/
712UINT16
713EFIAPI
714S3IoBitFieldAnd16 (
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**/
755UINT16
756EFIAPI
757S3IoBitFieldAndThenOr16 (
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**/
782UINT32
783InternalSaveIoWrite32ValueToBootScript (
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**/
808UINT32
809EFIAPI
810S3IoRead32 (
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**/
833UINT32
834EFIAPI
835S3IoWrite32 (
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**/
862UINT32
863EFIAPI
864S3IoOr32 (
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**/
891UINT32
892EFIAPI
893S3IoAnd32 (
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**/
922UINT32
923EFIAPI
924S3IoAndThenOr32 (
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**/
954UINT32
955EFIAPI
956S3IoBitFieldRead32 (
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**/
990UINT32
991EFIAPI
992S3IoBitFieldWrite32 (
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**/
1029UINT32
1030EFIAPI
1031S3IoBitFieldOr32 (
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**/
1068UINT32
1069EFIAPI
1070S3IoBitFieldAnd32 (
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**/
1111UINT32
1112EFIAPI
1113S3IoBitFieldAndThenOr32 (
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**/
1138UINT64
1139InternalSaveIoWrite64ValueToBootScript (
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**/
1164UINT64
1165EFIAPI
1166S3IoRead64 (
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**/
1189UINT64
1190EFIAPI
1191S3IoWrite64 (
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**/
1218UINT64
1219EFIAPI
1220S3IoOr64 (
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**/
1247UINT64
1248EFIAPI
1249S3IoAnd64 (
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**/
1278UINT64
1279EFIAPI
1280S3IoAndThenOr64 (
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**/
1310UINT64
1311EFIAPI
1312S3IoBitFieldRead64 (
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**/
1346UINT64
1347EFIAPI
1348S3IoBitFieldWrite64 (
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**/
1385UINT64
1386EFIAPI
1387S3IoBitFieldOr64 (
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**/
1424UINT64
1425EFIAPI
1426S3IoBitFieldAnd64 (
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**/
1467UINT64
1468EFIAPI
1469S3IoBitFieldAndThenOr64 (
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**/
1493VOID
1494InternalSaveMmioWriteValueToBootScript (
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**/
1525UINT8
1526InternalSaveMmioWrite8ValueToBootScript (
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**/
1551UINT8
1552EFIAPI
1553S3MmioRead8 (
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**/
1576UINT8
1577EFIAPI
1578S3MmioWrite8 (
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**/
1605UINT8
1606EFIAPI
1607S3MmioOr8 (
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**/
1634UINT8
1635EFIAPI
1636S3MmioAnd8 (
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**/
1665UINT8
1666EFIAPI
1667S3MmioAndThenOr8 (
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**/
1697UINT8
1698EFIAPI
1699S3MmioBitFieldRead8 (
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**/
1732UINT8
1733EFIAPI
1734S3MmioBitFieldWrite8 (
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**/
1772UINT8
1773EFIAPI
1774S3MmioBitFieldOr8 (
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**/
1812UINT8
1813EFIAPI
1814S3MmioBitFieldAnd8 (
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**/
1855UINT8
1856EFIAPI
1857S3MmioBitFieldAndThenOr8 (
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**/
1882UINT16
1883InternalSaveMmioWrite16ValueToBootScript (
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**/
1908UINT16
1909EFIAPI
1910S3MmioRead16 (
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**/
1934UINT16
1935EFIAPI
1936S3MmioWrite16 (
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**/
1963UINT16
1964EFIAPI
1965S3MmioOr16 (
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**/
1992UINT16
1993EFIAPI
1994S3MmioAnd16 (
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**/
2023UINT16
2024EFIAPI
2025S3MmioAndThenOr16 (
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**/
2055UINT16
2056EFIAPI
2057S3MmioBitFieldRead16 (
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**/
2090UINT16
2091EFIAPI
2092S3MmioBitFieldWrite16 (
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**/
2130UINT16
2131EFIAPI
2132S3MmioBitFieldOr16 (
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**/
2170UINT16
2171EFIAPI
2172S3MmioBitFieldAnd16 (
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**/
2213UINT16
2214EFIAPI
2215S3MmioBitFieldAndThenOr16 (
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**/
2240UINT32
2241InternalSaveMmioWrite32ValueToBootScript (
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**/
2266UINT32
2267EFIAPI
2268S3MmioRead32 (
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**/
2291UINT32
2292EFIAPI
2293S3MmioWrite32 (
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**/
2320UINT32
2321EFIAPI
2322S3MmioOr32 (
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**/
2349UINT32
2350EFIAPI
2351S3MmioAnd32 (
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**/
2380UINT32
2381EFIAPI
2382S3MmioAndThenOr32 (
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**/
2412UINT32
2413EFIAPI
2414S3MmioBitFieldRead32 (
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**/
2447UINT32
2448EFIAPI
2449S3MmioBitFieldWrite32 (
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**/
2487UINT32
2488EFIAPI
2489S3MmioBitFieldOr32 (
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**/
2527UINT32
2528EFIAPI
2529S3MmioBitFieldAnd32 (
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**/
2570UINT32
2571EFIAPI
2572S3MmioBitFieldAndThenOr32 (
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**/
2597UINT64
2598InternalSaveMmioWrite64ValueToBootScript (
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**/
2623UINT64
2624EFIAPI
2625S3MmioRead64 (
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**/
2648UINT64
2649EFIAPI
2650S3MmioWrite64 (
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**/
2677UINT64
2678EFIAPI
2679S3MmioOr64 (
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**/
2706UINT64
2707EFIAPI
2708S3MmioAnd64 (
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**/
2737UINT64
2738EFIAPI
2739S3MmioAndThenOr64 (
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**/
2769UINT64
2770EFIAPI
2771S3MmioBitFieldRead64 (
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**/
2804UINT64
2805EFIAPI
2806S3MmioBitFieldWrite64 (
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**/
2844UINT64
2845EFIAPI
2846S3MmioBitFieldOr64 (
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**/
2884UINT64
2885EFIAPI
2886S3MmioBitFieldAnd64 (
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**/
2927UINT64
2928EFIAPI
2929S3MmioBitFieldAndThenOr64 (
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**/
2959UINT8 *
2960EFIAPI
2961S3MmioReadBuffer8 (
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**/
3006UINT16 *
3007EFIAPI
3008S3MmioReadBuffer16 (
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**/
3053UINT32 *
3054EFIAPI
3055S3MmioReadBuffer32 (
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**/
3100UINT64 *
3101EFIAPI
3102S3MmioReadBuffer64 (
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**/
3144UINT8 *
3145EFIAPI
3146S3MmioWriteBuffer8 (
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**/
3192UINT16 *
3193EFIAPI
3194S3MmioWriteBuffer16 (
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**/
3241UINT32 *
3242EFIAPI
3243S3MmioWriteBuffer32 (
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**/
3289UINT64 *
3290EFIAPI
3291S3MmioWriteBuffer64 (
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