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