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