1bdfde4623daff97f8f796a89329048ece94d4be9jljusten/** @file
2bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Implementation for S3 Boot Script Saver state driver.
3bdfde4623daff97f8f796a89329048ece94d4be9jljusten
430522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
5bdfde4623daff97f8f796a89329048ece94d4be9jljusten
6bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This program and the accompanying materials
7bdfde4623daff97f8f796a89329048ece94d4be9jljusten  are licensed and made available under the terms and conditions
8bdfde4623daff97f8f796a89329048ece94d4be9jljusten  of the BSD License which accompanies this distribution.  The
9bdfde4623daff97f8f796a89329048ece94d4be9jljusten  full text of the license may be found at
10bdfde4623daff97f8f796a89329048ece94d4be9jljusten  http://opensource.org/licenses/bsd-license.php
11bdfde4623daff97f8f796a89329048ece94d4be9jljusten
12bdfde4623daff97f8f796a89329048ece94d4be9jljusten  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13bdfde4623daff97f8f796a89329048ece94d4be9jljusten  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14bdfde4623daff97f8f796a89329048ece94d4be9jljusten
15bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
16bdfde4623daff97f8f796a89329048ece94d4be9jljusten#include "InternalS3SaveState.h"
17bdfde4623daff97f8f796a89329048ece94d4be9jljusten
18bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_HANDLE                    mHandle = NULL;
19bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_S3_SAVE_STATE_PROTOCOL    mS3SaveState = {
20bdfde4623daff97f8f796a89329048ece94d4be9jljusten  BootScriptWrite,
21bdfde4623daff97f8f796a89329048ece94d4be9jljusten  BootScriptInsert,
22bdfde4623daff97f8f796a89329048ece94d4be9jljusten  BootScriptLabel,
23bdfde4623daff97f8f796a89329048ece94d4be9jljusten  BootScriptCompare
24bdfde4623daff97f8f796a89329048ece94d4be9jljusten  };
25bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
26bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add IO write opcode to the table.
27bdfde4623daff97f8f796a89329048ece94d4be9jljusten
28bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
29bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
30bdfde4623daff97f8f796a89329048ece94d4be9jljusten
31bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
32bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
33bdfde4623daff97f8f796a89329048ece94d4be9jljusten
34bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
35bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
36bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteIoWrite (
37bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
38bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
39bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
40bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
41bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
42bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                 Count;
43bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Buffer;
44bdfde4623daff97f8f796a89329048ece94d4be9jljusten
45bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
46bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
47bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Count       = VA_ARG (Marker, UINTN);
48bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Buffer      = VA_ARG (Marker, UINT8 *);
49bdfde4623daff97f8f796a89329048ece94d4be9jljusten
50bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveIoWrite (Width, Address, Count, Buffer);
51bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
52bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
53bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add IO read/write opcode to the table.
54bdfde4623daff97f8f796a89329048ece94d4be9jljusten
55bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
56bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
57bdfde4623daff97f8f796a89329048ece94d4be9jljusten
58bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
59bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
60bdfde4623daff97f8f796a89329048ece94d4be9jljusten
61bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
62bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
63bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteIoReadWrite (
64bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
65bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
66bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
67bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
68bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
69bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Data;
70bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *DataMask;
71bdfde4623daff97f8f796a89329048ece94d4be9jljusten
72bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
73bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
74bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Data        = VA_ARG (Marker, UINT8 *);
75bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataMask    = VA_ARG (Marker, UINT8 *);
76bdfde4623daff97f8f796a89329048ece94d4be9jljusten
77bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveIoReadWrite (Width, Address, Data, DataMask);
78bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
79bdfde4623daff97f8f796a89329048ece94d4be9jljusten
80bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
81bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add memory write opcode to the table.
82bdfde4623daff97f8f796a89329048ece94d4be9jljusten
83bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
84bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
85bdfde4623daff97f8f796a89329048ece94d4be9jljusten
86bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
87bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
88bdfde4623daff97f8f796a89329048ece94d4be9jljusten
89bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
90bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
91bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteMemWrite (
92bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
93bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
94bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
95bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
96bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
97bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                 Count;
98bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Buffer;
99bdfde4623daff97f8f796a89329048ece94d4be9jljusten
100bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
101bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
102bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Count       = VA_ARG (Marker, UINTN);
103bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Buffer      = VA_ARG (Marker, UINT8 *);
104bdfde4623daff97f8f796a89329048ece94d4be9jljusten
105bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveMemWrite (Width, Address, Count, Buffer);
106bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
107bdfde4623daff97f8f796a89329048ece94d4be9jljusten
108bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
109bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add memory read/write opcode to the table.
110bdfde4623daff97f8f796a89329048ece94d4be9jljusten
111bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
112bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
113bdfde4623daff97f8f796a89329048ece94d4be9jljusten
114bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
115bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
116bdfde4623daff97f8f796a89329048ece94d4be9jljusten
117bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
118bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
119bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteMemReadWrite (
120bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
121bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
122bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
123bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
124bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
125bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Data;
126bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *DataMask;
127bdfde4623daff97f8f796a89329048ece94d4be9jljusten
128bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
129bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
130bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Data        = VA_ARG (Marker, UINT8 *);
131bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataMask    = VA_ARG (Marker, UINT8 *);
132bdfde4623daff97f8f796a89329048ece94d4be9jljusten
133bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveMemReadWrite (Width, Address, Data, DataMask);
134bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
135bdfde4623daff97f8f796a89329048ece94d4be9jljusten
136bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
137bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add PciCfg write opcode to the table.
138bdfde4623daff97f8f796a89329048ece94d4be9jljusten
139bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
140bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
141bdfde4623daff97f8f796a89329048ece94d4be9jljusten
142bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
143bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
144bdfde4623daff97f8f796a89329048ece94d4be9jljusten
145bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
146bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
147bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciCfgWrite (
148bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
149bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
150bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
151bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
152bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
153bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                 Count;
154bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Buffer;
155bdfde4623daff97f8f796a89329048ece94d4be9jljusten
156bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
157bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
158bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Count       = VA_ARG (Marker, UINTN);
159bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Buffer      = VA_ARG (Marker, UINT8 *);
160bdfde4623daff97f8f796a89329048ece94d4be9jljusten
161bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSavePciCfgWrite (Width, Address, Count, Buffer);
162bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
163bdfde4623daff97f8f796a89329048ece94d4be9jljusten
164bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
165bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to PciCfg read/write opcode to the table.
166bdfde4623daff97f8f796a89329048ece94d4be9jljusten
167bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
168bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
169bdfde4623daff97f8f796a89329048ece94d4be9jljusten
170bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
171bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
172bdfde4623daff97f8f796a89329048ece94d4be9jljusten
173bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
174bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
175bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciCfgReadWrite (
176bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
177bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
178bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
179bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
180bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
181bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Data;
182bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *DataMask;
183bdfde4623daff97f8f796a89329048ece94d4be9jljusten
184bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
185bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
186bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Data        = VA_ARG (Marker, UINT8 *);
187bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataMask    = VA_ARG (Marker, UINT8 *);
188bdfde4623daff97f8f796a89329048ece94d4be9jljusten
189bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSavePciCfgReadWrite (Width, Address, Data, DataMask);
190bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
191bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
192bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add PciCfg2 write opcode to the table.
193bdfde4623daff97f8f796a89329048ece94d4be9jljusten
194bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
195bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
196bdfde4623daff97f8f796a89329048ece94d4be9jljusten
197bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
198bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
199bdfde4623daff97f8f796a89329048ece94d4be9jljusten
200bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
201bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
202bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciCfg2Write (
203bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
204bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
205bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
206bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
207bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
208bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                 Count;
209bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Buffer;
210bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT16                Segment;
211bdfde4623daff97f8f796a89329048ece94d4be9jljusten
212bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
213bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
214bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Count       = VA_ARG (Marker, UINTN);
215bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Buffer      = VA_ARG (Marker, UINT8 *);
216bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Segment     = VA_ARG (Marker, UINT16);
217bdfde4623daff97f8f796a89329048ece94d4be9jljusten
218bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSavePciCfg2Write (Width, Segment, Address, Count, Buffer);
219bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
220bdfde4623daff97f8f796a89329048ece94d4be9jljusten
221bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
222bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to PciCfg2 read/write opcode to the table.
223bdfde4623daff97f8f796a89329048ece94d4be9jljusten
224bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
225bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
226bdfde4623daff97f8f796a89329048ece94d4be9jljusten
227bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
228bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
229bdfde4623daff97f8f796a89329048ece94d4be9jljusten
230bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
231bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
232bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciCfg2ReadWrite (
233bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
234bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
235bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
236bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH Width;
237bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT16                Segment;
238bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                Address;
239bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *Data;
240bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT8                 *DataMask;
241bdfde4623daff97f8f796a89329048ece94d4be9jljusten
242bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
243bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address     = VA_ARG (Marker, UINT64);
244bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Segment     = VA_ARG (Marker, UINT16);
245bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Data        = VA_ARG (Marker, UINT8 *);
246bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataMask    = VA_ARG (Marker, UINT8 *);
247bdfde4623daff97f8f796a89329048ece94d4be9jljusten
248bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSavePciCfg2ReadWrite (Width, Segment, Address, Data, DataMask);
249bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
250bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
251bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add smbus excute opcode to the table.
252bdfde4623daff97f8f796a89329048ece94d4be9jljusten
253bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
254bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
255bdfde4623daff97f8f796a89329048ece94d4be9jljusten
256bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
257bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
258bdfde4623daff97f8f796a89329048ece94d4be9jljusten
259bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
260bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
261bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteSmbusExecute (
262bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
263bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
264bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
265bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_SMBUS_DEVICE_ADDRESS  SlaveAddress;
266bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_SMBUS_DEVICE_COMMAND  Command;
267bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_SMBUS_OPERATION       Operation;
268bdfde4623daff97f8f796a89329048ece94d4be9jljusten  BOOLEAN                   PecCheck;
269bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID                     *Buffer;
270bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                    *DataSize;
271bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                     SmBusAddress;
272bdfde4623daff97f8f796a89329048ece94d4be9jljusten
273bdfde4623daff97f8f796a89329048ece94d4be9jljusten  SlaveAddress.SmbusDeviceAddress = VA_ARG (Marker, UINTN);
274bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Command                         = VA_ARG (Marker, EFI_SMBUS_DEVICE_COMMAND);
275bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Operation                       = VA_ARG (Marker, EFI_SMBUS_OPERATION);
276bdfde4623daff97f8f796a89329048ece94d4be9jljusten  PecCheck                        = VA_ARG (Marker, BOOLEAN);
277bdfde4623daff97f8f796a89329048ece94d4be9jljusten  SmBusAddress                    = SMBUS_LIB_ADDRESS (SlaveAddress.SmbusDeviceAddress,Command,0,PecCheck);
278bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataSize                        = VA_ARG (Marker, UINTN *);
279bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Buffer                          = VA_ARG (Marker, VOID *);
280bdfde4623daff97f8f796a89329048ece94d4be9jljusten
281bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveSmbusExecute (SmBusAddress, Operation, DataSize, Buffer);
282bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
283bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
284bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add stall opcode to the table.
285bdfde4623daff97f8f796a89329048ece94d4be9jljusten
286bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
287bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
288bdfde4623daff97f8f796a89329048ece94d4be9jljusten
289bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
290bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
291bdfde4623daff97f8f796a89329048ece94d4be9jljusten
292bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
293bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
294bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteStall (
295bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
296bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
297bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
298bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT32                Duration;
299bdfde4623daff97f8f796a89329048ece94d4be9jljusten
300bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Duration    = VA_ARG (Marker, UINT32);
301bdfde4623daff97f8f796a89329048ece94d4be9jljusten
302bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveStall (Duration);
303bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
304bdfde4623daff97f8f796a89329048ece94d4be9jljusten
305bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
306bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add Save jmp address according to DISPATCH_OPCODE.
307bdfde4623daff97f8f796a89329048ece94d4be9jljusten  We ignore "Context" parameter
308bdfde4623daff97f8f796a89329048ece94d4be9jljusten
309bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
310bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
311bdfde4623daff97f8f796a89329048ece94d4be9jljusten
312bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
313bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
314bdfde4623daff97f8f796a89329048ece94d4be9jljusten
315bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
316bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
317bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteDispatch (
318bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
319bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
320bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
321bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID        *EntryPoint;
322bdfde4623daff97f8f796a89329048ece94d4be9jljusten
323bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
324bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveDispatch (EntryPoint);
325bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
326bdfde4623daff97f8f796a89329048ece94d4be9jljusten
327bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
328bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add memory pool operation to the table.
329bdfde4623daff97f8f796a89329048ece94d4be9jljusten
330bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
331bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
332bdfde4623daff97f8f796a89329048ece94d4be9jljusten
333bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
334bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
335bdfde4623daff97f8f796a89329048ece94d4be9jljusten
336bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
337bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
338bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteMemPoll (
339bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
340bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
341bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
342bdfde4623daff97f8f796a89329048ece94d4be9jljusten  S3_BOOT_SCRIPT_LIB_WIDTH   Width;
343bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT64                     Address;
344bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID                      *Data;
345bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID                      *DataMask;
346bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINTN                     Delay;
34730522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  UINTN                     LoopTimes;
34830522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  UINT32                    Remainder;
34930522140a12f360d24babc36c9d9c8e4be8b1b5elzeng
350bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
351bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Address  = VA_ARG (Marker, UINT64);
352bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Data     = VA_ARG (Marker, VOID *);
353bdfde4623daff97f8f796a89329048ece94d4be9jljusten  DataMask = VA_ARG (Marker, VOID *);
354bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Delay    = (UINTN)VA_ARG (Marker, UINT64);
355bdfde4623daff97f8f796a89329048ece94d4be9jljusten  //
35630522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  // According to the spec, the interval between 2 polls is 100ns,
35730522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  // but the unit of Duration for S3BootScriptSaveMemPoll() is microsecond(1000ns).
35830522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  // Duration * 1000ns * LoopTimes = Delay * 100ns
35930522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  // Duration will be minimum 1(microsecond) to be minimum deviation,
36030522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  // so LoopTimes = Delay / 10.
36130522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  //
3629f0b11ca07832189d8ceb82d9a5ed38f9b4cdc17lzeng  LoopTimes = (UINTN) DivU64x32Remainder (
36330522140a12f360d24babc36c9d9c8e4be8b1b5elzeng                Delay,
36430522140a12f360d24babc36c9d9c8e4be8b1b5elzeng                10,
36530522140a12f360d24babc36c9d9c8e4be8b1b5elzeng                &Remainder
36630522140a12f360d24babc36c9d9c8e4be8b1b5elzeng                );
36730522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  if (Remainder != 0) {
36830522140a12f360d24babc36c9d9c8e4be8b1b5elzeng    //
36930522140a12f360d24babc36c9d9c8e4be8b1b5elzeng    // If Remainder is not zero, LoopTimes will be rounded up by 1.
37030522140a12f360d24babc36c9d9c8e4be8b1b5elzeng    //
37130522140a12f360d24babc36c9d9c8e4be8b1b5elzeng    LoopTimes +=1;
37230522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  }
37330522140a12f360d24babc36c9d9c8e4be8b1b5elzeng  return S3BootScriptSaveMemPoll (Width, Address, DataMask, Data, 1, LoopTimes);
374bdfde4623daff97f8f796a89329048ece94d4be9jljusten
375bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
376bdfde4623daff97f8f796a89329048ece94d4be9jljusten
377bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
378bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add Save jmp address according to DISPATCH_OPCODE2.
379bdfde4623daff97f8f796a89329048ece94d4be9jljusten  The "Context" parameter is not ignored.
380bdfde4623daff97f8f796a89329048ece94d4be9jljusten
381bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
382bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
383bdfde4623daff97f8f796a89329048ece94d4be9jljusten
384bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enough resource to do operation.
385bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Opcode is added.
386bdfde4623daff97f8f796a89329048ece94d4be9jljusten
387bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
388bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
389bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteDispatch2 (
390bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
391bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
392bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
393bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID                  *EntryPoint;
394bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VOID                  *Context;
395bdfde4623daff97f8f796a89329048ece94d4be9jljusten
396bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
397bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Context    = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
398bdfde4623daff97f8f796a89329048ece94d4be9jljusten
399bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveDispatch2 (EntryPoint, Context);
400bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
401bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
402bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add INFORAMTION opcode node to the table
403bdfde4623daff97f8f796a89329048ece94d4be9jljusten  list.
404bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
405bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
406bdfde4623daff97f8f796a89329048ece94d4be9jljusten
407bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enought resource to complete the operations.
408bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The opcode entry is added to the  table
409bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                successfully.
410bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
411bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
412bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteInformation (
413bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
414bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
415bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
416bdfde4623daff97f8f796a89329048ece94d4be9jljusten  UINT32                InformationLength;
417bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_PHYSICAL_ADDRESS  Information;
418bdfde4623daff97f8f796a89329048ece94d4be9jljusten
419bdfde4623daff97f8f796a89329048ece94d4be9jljusten  InformationLength = VA_ARG (Marker, UINT32);
420bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Information = VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
421bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return S3BootScriptSaveInformation (InformationLength, (VOID*)(UINTN)Information);
422bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
423bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
424bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add IO poll opcode node  to the table
425bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
426bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
427bdfde4623daff97f8f796a89329048ece94d4be9jljusten
428bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enought resource to complete the operations.
429bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The opcode entry is added to the  table
430bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                successfully.
431bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
432bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
433bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWriteIoPoll (
434bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
435bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
436bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
437bdfde4623daff97f8f796a89329048ece94d4be9jljusten   S3_BOOT_SCRIPT_LIB_WIDTH     Width;
438bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                     Address;
439bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                      *Data;
440bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                      *DataMask;
441bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                     Delay;
442bdfde4623daff97f8f796a89329048ece94d4be9jljusten
443bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
444bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Address  = VA_ARG (Marker, UINT64);
445bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Data     = VA_ARG (Marker, VOID *);
446bdfde4623daff97f8f796a89329048ece94d4be9jljusten   DataMask = VA_ARG (Marker, VOID *);
447bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Delay    = (UINT64)VA_ARG (Marker, UINT64);
448bdfde4623daff97f8f796a89329048ece94d4be9jljusten
449bdfde4623daff97f8f796a89329048ece94d4be9jljusten   return S3BootScriptSaveIoPoll (Width, Address, Data, DataMask, Delay);
450bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
451bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
452bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add PCI config poll opcode node to the table
453bdfde4623daff97f8f796a89329048ece94d4be9jljusten
454bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
455bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
456bdfde4623daff97f8f796a89329048ece94d4be9jljusten
457bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enought resource to complete the operations.
458bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The opcode entry is added to the  table
459bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                successfully.
460bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
461bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
462bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciConfigPoll (
463bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
464bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
465bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
466bdfde4623daff97f8f796a89329048ece94d4be9jljusten   S3_BOOT_SCRIPT_LIB_WIDTH   Width;
467bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                     Address;
468bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                      *Data;
469bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                      *DataMask;
470bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                     Delay;
471bdfde4623daff97f8f796a89329048ece94d4be9jljusten
472bdfde4623daff97f8f796a89329048ece94d4be9jljusten
473bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
474bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Address  = VA_ARG (Marker, UINT64);
475bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Data     = VA_ARG (Marker, VOID *);
476bdfde4623daff97f8f796a89329048ece94d4be9jljusten   DataMask = VA_ARG (Marker, VOID *);
477bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Delay    = (UINT64)VA_ARG (Marker, UINT64);
478bdfde4623daff97f8f796a89329048ece94d4be9jljusten
479bdfde4623daff97f8f796a89329048ece94d4be9jljusten   return S3BootScriptSavePciPoll (Width, Address, Data, DataMask, Delay);
480bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
481bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
482bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Internal function to add PCI config 2 poll opcode node to the table
483bdfde4623daff97f8f796a89329048ece94d4be9jljusten
484bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Marker                The variable argument list to get the opcode
485bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                and associated attributes.
486bdfde4623daff97f8f796a89329048ece94d4be9jljusten
487bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  Not enought resource to complete the operations.
488bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The opcode entry is added to the  table
489bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                successfully.
490bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
491bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
492bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWritePciConfig2Poll (
493bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN VA_LIST                       Marker
494bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
495bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
496bdfde4623daff97f8f796a89329048ece94d4be9jljusten   S3_BOOT_SCRIPT_LIB_WIDTH      Width;
497bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT16                        Segment;
498bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                        Address;
499bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                         *Data;
500bdfde4623daff97f8f796a89329048ece94d4be9jljusten   VOID                         *DataMask;
501bdfde4623daff97f8f796a89329048ece94d4be9jljusten   UINT64                        Delay;
502bdfde4623daff97f8f796a89329048ece94d4be9jljusten
503bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);
504bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Segment  = VA_ARG (Marker, UINT16);
505bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Address  = VA_ARG (Marker, UINT64);
506bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Data     = VA_ARG (Marker, VOID *);
507bdfde4623daff97f8f796a89329048ece94d4be9jljusten   DataMask = VA_ARG (Marker, VOID *);
508bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Delay    = (UINT64)VA_ARG (Marker, UINT64);
509bdfde4623daff97f8f796a89329048ece94d4be9jljusten
510bdfde4623daff97f8f796a89329048ece94d4be9jljusten   return S3BootScriptSavePci2Poll (Width, Segment, Address, Data, DataMask, Delay);
511bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
512bdfde4623daff97f8f796a89329048ece94d4be9jljusten
513bdfde4623daff97f8f796a89329048ece94d4be9jljusten
514bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
515bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Adds a record into S3 boot script table.
516bdfde4623daff97f8f796a89329048ece94d4be9jljusten
517bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This function is used to store a boot script record into a given boot
518bdfde4623daff97f8f796a89329048ece94d4be9jljusten  script table. If the table specified by TableName is nonexistent in the
519bdfde4623daff97f8f796a89329048ece94d4be9jljusten  system, a new table will automatically be created and then the script record
520bdfde4623daff97f8f796a89329048ece94d4be9jljusten  will be added into the new table. This function is responsible for allocating
521bdfde4623daff97f8f796a89329048ece94d4be9jljusten  necessary memory for the script.
522bdfde4623daff97f8f796a89329048ece94d4be9jljusten
523bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This function has a variable parameter list. The exact parameter list depends on
524bdfde4623daff97f8f796a89329048ece94d4be9jljusten  the OpCode that is passed into the function. If an unsupported OpCode or illegal
525bdfde4623daff97f8f796a89329048ece94d4be9jljusten  parameter list is passed in, this function returns EFI_INVALID_PARAMETER.
526bdfde4623daff97f8f796a89329048ece94d4be9jljusten  If there are not enough resources available for storing more scripts, this function returns
527bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_OUT_OF_RESOURCES.
528bdfde4623daff97f8f796a89329048ece94d4be9jljusten
529bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  This                  A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
530bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  OpCode                The operation code (opcode) number.
531bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  ...                   Argument list that is specific to each opcode.
532bdfde4623daff97f8f796a89329048ece94d4be9jljusten
533bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The operation succeeded. A record was added into the
534bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                specified script table.
535bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_INVALID_PARAMETER The parameter is illegal or the given boot script is not supported.
536bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                If the opcode is unknow or not supported because of the PCD
537bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                Feature Flags.
538bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  There is insufficient memory to store the boot script.
539bdfde4623daff97f8f796a89329048ece94d4be9jljusten
540bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
541bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
542bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI
543bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptWrite (
544bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN CONST EFI_S3_SAVE_STATE_PROTOCOL      *This,
545bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       UINT16                           OpCode,
546bdfde4623daff97f8f796a89329048ece94d4be9jljusten  ...
547bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
548bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
549bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_STATUS                Status;
550bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VA_LIST                   Marker;
551bdfde4623daff97f8f796a89329048ece94d4be9jljusten  //
552bdfde4623daff97f8f796a89329048ece94d4be9jljusten  // Build script according to opcode
553bdfde4623daff97f8f796a89329048ece94d4be9jljusten  //
554bdfde4623daff97f8f796a89329048ece94d4be9jljusten  switch (OpCode) {
555bdfde4623daff97f8f796a89329048ece94d4be9jljusten
556bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:
557bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
558bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoWrite (Marker);
559bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
560bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
561bdfde4623daff97f8f796a89329048ece94d4be9jljusten
562bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:
563bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
564bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoReadWrite (Marker);
565bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
566bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
567bdfde4623daff97f8f796a89329048ece94d4be9jljusten
568bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:
569bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
570bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemWrite (Marker);
571bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
572bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
573bdfde4623daff97f8f796a89329048ece94d4be9jljusten
574bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:
575bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
576bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemReadWrite (Marker);
577bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
578bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
579bdfde4623daff97f8f796a89329048ece94d4be9jljusten
580bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:
581bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
582bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfgWrite (Marker);
583bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
584bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
585bdfde4623daff97f8f796a89329048ece94d4be9jljusten
586bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:
587bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
588bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfgReadWrite (Marker);
589bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
590bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
591bdfde4623daff97f8f796a89329048ece94d4be9jljusten
592bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:
593bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
594bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteSmbusExecute (Marker);
595bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
596bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
597bdfde4623daff97f8f796a89329048ece94d4be9jljusten
598bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_STALL_OPCODE:
599bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
600bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteStall (Marker);
601bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
602bdfde4623daff97f8f796a89329048ece94d4be9jljusten
603bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
604bdfde4623daff97f8f796a89329048ece94d4be9jljusten
605bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:
606bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
607bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteDispatch (Marker);
608bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
609bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
610bdfde4623daff97f8f796a89329048ece94d4be9jljusten
611bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:
612bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
613bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteDispatch2 (Marker);
614bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
615bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
616bdfde4623daff97f8f796a89329048ece94d4be9jljusten
617bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:
618bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
619bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteInformation (Marker);
620bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
621bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
622bdfde4623daff97f8f796a89329048ece94d4be9jljusten
623bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:
624bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
625bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemPoll (Marker);
626bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
627bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
628bdfde4623daff97f8f796a89329048ece94d4be9jljusten
629bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:
630bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
631bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfg2Write (Marker);
632bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
633bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
634bdfde4623daff97f8f796a89329048ece94d4be9jljusten
635bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:
636bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
637bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfg2ReadWrite (Marker);
638bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
639bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
640bdfde4623daff97f8f796a89329048ece94d4be9jljusten
641bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_POLL_OPCODE:
642bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
643bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoPoll (Marker);
644bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
645bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
646bdfde4623daff97f8f796a89329048ece94d4be9jljusten
647bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE:
648bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
649bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciConfigPoll (Marker);
650bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
651bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
652bdfde4623daff97f8f796a89329048ece94d4be9jljusten
653bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE:
654bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
655bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciConfig2Poll (Marker);
656bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
657bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
658bdfde4623daff97f8f796a89329048ece94d4be9jljusten
659bdfde4623daff97f8f796a89329048ece94d4be9jljusten  default:
660bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = EFI_INVALID_PARAMETER;
661bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
662bdfde4623daff97f8f796a89329048ece94d4be9jljusten  }
663bdfde4623daff97f8f796a89329048ece94d4be9jljusten
664bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return Status;
665bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
666bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
667bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Insert a record into a specified Framework boot script table.
668bdfde4623daff97f8f796a89329048ece94d4be9jljusten
669bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This function is used to store an OpCode to be replayed as part of the S3 resume boot path. It is
670bdfde4623daff97f8f796a89329048ece94d4be9jljusten  assumed this protocol has platform specific mechanism to store the OpCode set and replay them
671bdfde4623daff97f8f796a89329048ece94d4be9jljusten  during the S3 resume.
672bdfde4623daff97f8f796a89329048ece94d4be9jljusten  The opcode is inserted before or after the specified position in the boot script table. If Position is
673bdfde4623daff97f8f796a89329048ece94d4be9jljusten  NULL then that position is after the last opcode in the table (BeforeOrAfter is FALSE) or before
674bdfde4623daff97f8f796a89329048ece94d4be9jljusten  the first opcode in the table (BeforeOrAfter is TRUE). The position which is pointed to by
675bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Position upon return can be used for subsequent insertions.
676bdfde4623daff97f8f796a89329048ece94d4be9jljusten
677bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  This                  A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
678bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  BeforeOrAfter         Specifies whether the opcode is stored before (TRUE) or after (FALSE) the position
679bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                in the boot script table specified by Position. If Position is NULL or points to
680bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                NULL then the new opcode is inserted at the beginning of the table (if TRUE) or end
681bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                of the table (if FALSE).
682bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Position              On entry, specifies the position in the boot script table where the opcode will be
683bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                inserted, either before or after, depending on BeforeOrAfter. On exit, specifies
684bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                the position of the inserted opcode in the boot script table.
685bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  OpCode                The operation code (opcode) number.
686bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  ...                   Argument list that is specific to each opcode.
687bdfde4623daff97f8f796a89329048ece94d4be9jljusten
688bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The operation succeeded. A record was added into the
689bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                specified script table.
690bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_INVALID_PARAMETER The Opcode is an invalid opcode value or the Position is not a valid position in the boot script table..
691bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  There is insufficient memory to store the boot script.
692bdfde4623daff97f8f796a89329048ece94d4be9jljusten
693bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
694bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
695bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI
696bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptInsert (
697bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN CONST EFI_S3_SAVE_STATE_PROTOCOL     *This,
698bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       BOOLEAN                        BeforeOrAfter,
699bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN OUT   EFI_S3_BOOT_SCRIPT_POSITION    *Position OPTIONAL,
700bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       UINT16                         OpCode,
701bdfde4623daff97f8f796a89329048ece94d4be9jljusten  ...
702bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
703bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
704bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_STATUS                Status;
705bdfde4623daff97f8f796a89329048ece94d4be9jljusten  VA_LIST                   Marker;
706bdfde4623daff97f8f796a89329048ece94d4be9jljusten  //
707bdfde4623daff97f8f796a89329048ece94d4be9jljusten  // Build script according to opcode
708bdfde4623daff97f8f796a89329048ece94d4be9jljusten  //
709bdfde4623daff97f8f796a89329048ece94d4be9jljusten  switch (OpCode) {
710bdfde4623daff97f8f796a89329048ece94d4be9jljusten
711bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:
712bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
713bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoWrite (Marker);
714bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
715bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
716bdfde4623daff97f8f796a89329048ece94d4be9jljusten
717bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:
718bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
719bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoReadWrite (Marker);
720bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
721bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
722bdfde4623daff97f8f796a89329048ece94d4be9jljusten
723bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:
724bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
725bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemWrite (Marker);
726bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
727bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
728bdfde4623daff97f8f796a89329048ece94d4be9jljusten
729bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:
730bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
731bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemReadWrite (Marker);
732bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
733bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
734bdfde4623daff97f8f796a89329048ece94d4be9jljusten
735bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:
736bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
737bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfgWrite (Marker);
738bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
739bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
740bdfde4623daff97f8f796a89329048ece94d4be9jljusten
741bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:
742bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
743bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfgReadWrite (Marker);
744bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
745bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
746bdfde4623daff97f8f796a89329048ece94d4be9jljusten
747bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:
748bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
749bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteSmbusExecute (Marker);
750bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
751bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
752bdfde4623daff97f8f796a89329048ece94d4be9jljusten
753bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_STALL_OPCODE:
754bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
755bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteStall (Marker);
756bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
757bdfde4623daff97f8f796a89329048ece94d4be9jljusten
758bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
759bdfde4623daff97f8f796a89329048ece94d4be9jljusten
760bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:
761bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
762bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteDispatch (Marker);
763bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
764bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
765bdfde4623daff97f8f796a89329048ece94d4be9jljusten
766bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:
767bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
768bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteDispatch2 (Marker);
769bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
770bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
771bdfde4623daff97f8f796a89329048ece94d4be9jljusten
772bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:
773bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
774bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteInformation (Marker);
775bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
776bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
777bdfde4623daff97f8f796a89329048ece94d4be9jljusten
778bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:
779bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
780bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteMemPoll (Marker);
781bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
782bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
783bdfde4623daff97f8f796a89329048ece94d4be9jljusten
784bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:
785bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
786bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfg2Write (Marker);
787bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
788bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
789bdfde4623daff97f8f796a89329048ece94d4be9jljusten
790bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:
791bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
792bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciCfg2ReadWrite (Marker);
793bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
794bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
795bdfde4623daff97f8f796a89329048ece94d4be9jljusten
796bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_IO_POLL_OPCODE:
797bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
798bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWriteIoPoll (Marker);
799bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
800bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
801bdfde4623daff97f8f796a89329048ece94d4be9jljusten
802bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE:
803bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
804bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciConfigPoll (Marker);
805bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
806bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
807bdfde4623daff97f8f796a89329048ece94d4be9jljusten
808bdfde4623daff97f8f796a89329048ece94d4be9jljusten  case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE:
809bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_START (Marker, OpCode);
810bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = BootScriptWritePciConfig2Poll (Marker);
811bdfde4623daff97f8f796a89329048ece94d4be9jljusten    VA_END (Marker);
812bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
813bdfde4623daff97f8f796a89329048ece94d4be9jljusten
814bdfde4623daff97f8f796a89329048ece94d4be9jljusten  default:
815bdfde4623daff97f8f796a89329048ece94d4be9jljusten    Status = EFI_INVALID_PARAMETER;
816bdfde4623daff97f8f796a89329048ece94d4be9jljusten    break;
817bdfde4623daff97f8f796a89329048ece94d4be9jljusten  }
818bdfde4623daff97f8f796a89329048ece94d4be9jljusten
819bdfde4623daff97f8f796a89329048ece94d4be9jljusten  if (!EFI_ERROR (Status)) {
820bdfde4623daff97f8f796a89329048ece94d4be9jljusten   Status = S3BootScriptMoveLastOpcode (BeforeOrAfter, Position);
821bdfde4623daff97f8f796a89329048ece94d4be9jljusten  }
822bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return Status;
823bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
824bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
825bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Find a label within the boot script table and, if not present, optionally create it.
826bdfde4623daff97f8f796a89329048ece94d4be9jljusten
827bdfde4623daff97f8f796a89329048ece94d4be9jljusten  If the label Label is already exists in the boot script table, then no new label is created, the
828bdfde4623daff97f8f796a89329048ece94d4be9jljusten  position of the Label is returned in *Position and EFI_SUCCESS is returned.
829bdfde4623daff97f8f796a89329048ece94d4be9jljusten  If the label Label does not already exist and CreateIfNotFound is TRUE, then it will be
830bdfde4623daff97f8f796a89329048ece94d4be9jljusten  created before or after the specified position and EFI_SUCCESS is returned.
831bdfde4623daff97f8f796a89329048ece94d4be9jljusten  If the label Label does not already exist and CreateIfNotFound is FALSE, then
832bdfde4623daff97f8f796a89329048ece94d4be9jljusten  EFI_NOT_FOUND is returned.
833bdfde4623daff97f8f796a89329048ece94d4be9jljusten
834bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  This                  A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
835bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  BeforeOrAfter         Specifies whether the label is stored before (TRUE) or after (FALSE) the position in
836bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                the boot script table specified by Position. If Position is NULL or points to
837bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                NULL then the new label is inserted at the beginning of the table (if TRUE) or end of
838bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                the table (if FALSE).
839bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  CreateIfNotFound      Specifies whether the label will be created if the label does not exists (TRUE) or not
840bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                (FALSE).
841bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Position              On entry, specifies the position in the boot script table where the label will be inserted,
842bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                either before or after, depending on BeforeOrAfter. On exit, specifies the position
843bdfde4623daff97f8f796a89329048ece94d4be9jljusten                                of the inserted label in the boot script table.
844bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Label                 Points to the label which will be inserted in the boot script table.
845bdfde4623daff97f8f796a89329048ece94d4be9jljusten
846bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The label already exists or was inserted.
847960729473e14c847526af94c430bc38f93105ec7jyao  @retval EFI_INVALID_PARAMETER The Label is NULL or points to an empty string.
848960729473e14c847526af94c430bc38f93105ec7jyao  @retval EFI_INVALID_PARAMETER The Position is not a valid position in the boot script table.
849bdfde4623daff97f8f796a89329048ece94d4be9jljusten
850bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
851bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
852bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI
853bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptLabel (
854bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN CONST EFI_S3_SAVE_STATE_PROTOCOL           *This,
855bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       BOOLEAN                              BeforeOrAfter,
856bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       BOOLEAN                              CreateIfNotFound,
857bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN OUT   EFI_S3_BOOT_SCRIPT_POSITION          *Position OPTIONAL,
858bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN CONST CHAR8                                *Label
859bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
860bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
861bdfde4623daff97f8f796a89329048ece94d4be9jljusten	return S3BootScriptLabel (BeforeOrAfter, CreateIfNotFound, Position, Label);
862bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
863bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
864bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Compare two positions in the boot script table and return their relative position.
865bdfde4623daff97f8f796a89329048ece94d4be9jljusten
866bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This function compares two positions in the boot script table and returns their relative positions. If
867bdfde4623daff97f8f796a89329048ece94d4be9jljusten  Position1 is before Position2, then -1 is returned. If Position1 is equal to Position2,
868bdfde4623daff97f8f796a89329048ece94d4be9jljusten  then 0 is returned. If Position1 is after Position2, then 1 is returned.
869bdfde4623daff97f8f796a89329048ece94d4be9jljusten
870bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  This                  A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
871bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Position1             The positions in the boot script table to compare
872bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  Position2             The positions in the boot script table to compare
873bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  RelativePosition      On return, points to the result of the comparison
874bdfde4623daff97f8f796a89329048ece94d4be9jljusten
875bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           The operation succeeded.
876bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_INVALID_PARAMETER The Position1 or Position2 is not a valid position in the boot script table.
877960729473e14c847526af94c430bc38f93105ec7jyao  @retval EFI_INVALID_PARAMETER The RelativePosition is NULL.
878bdfde4623daff97f8f796a89329048ece94d4be9jljusten
879bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
880bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
881bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI
882bdfde4623daff97f8f796a89329048ece94d4be9jljustenBootScriptCompare (
883bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN CONST EFI_S3_SAVE_STATE_PROTOCOL      *This,
884bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       EFI_S3_BOOT_SCRIPT_POSITION      Position1,
885bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN       EFI_S3_BOOT_SCRIPT_POSITION      Position2,
886bdfde4623daff97f8f796a89329048ece94d4be9jljusten  OUT      UINTN                           *RelativePosition
887bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
888bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
889bdfde4623daff97f8f796a89329048ece94d4be9jljusten	return S3BootScriptCompare (Position1, Position2, RelativePosition);
890bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
891bdfde4623daff97f8f796a89329048ece94d4be9jljusten/**
892bdfde4623daff97f8f796a89329048ece94d4be9jljusten  This routine is entry point of ScriptSave driver.
893bdfde4623daff97f8f796a89329048ece94d4be9jljusten
894bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  ImageHandle           Handle for this drivers loaded image protocol.
895bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @param  SystemTable           EFI system table.
896bdfde4623daff97f8f796a89329048ece94d4be9jljusten
897bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_OUT_OF_RESOURCES  No enough resource
898bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval EFI_SUCCESS           Succesfully installed the ScriptSave driver.
899bdfde4623daff97f8f796a89329048ece94d4be9jljusten  @retval other                 Errors occured.
900bdfde4623daff97f8f796a89329048ece94d4be9jljusten
901bdfde4623daff97f8f796a89329048ece94d4be9jljusten**/
902bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFI_STATUS
903bdfde4623daff97f8f796a89329048ece94d4be9jljustenEFIAPI
904bdfde4623daff97f8f796a89329048ece94d4be9jljustenInitializeS3SaveState (
905bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN EFI_HANDLE           ImageHandle,
906bdfde4623daff97f8f796a89329048ece94d4be9jljusten  IN EFI_SYSTEM_TABLE     *SystemTable
907bdfde4623daff97f8f796a89329048ece94d4be9jljusten  )
908bdfde4623daff97f8f796a89329048ece94d4be9jljusten{
909bdfde4623daff97f8f796a89329048ece94d4be9jljusten
910bdfde4623daff97f8f796a89329048ece94d4be9jljusten
911bdfde4623daff97f8f796a89329048ece94d4be9jljusten  return  gBS->InstallProtocolInterface (
912bdfde4623daff97f8f796a89329048ece94d4be9jljusten                  &mHandle,
913bdfde4623daff97f8f796a89329048ece94d4be9jljusten                  &gEfiS3SaveStateProtocolGuid,
914bdfde4623daff97f8f796a89329048ece94d4be9jljusten                  EFI_NATIVE_INTERFACE,
915bdfde4623daff97f8f796a89329048ece94d4be9jljusten                  &mS3SaveState
916bdfde4623daff97f8f796a89329048ece94d4be9jljusten                  );
917bdfde4623daff97f8f796a89329048ece94d4be9jljusten
918bdfde4623daff97f8f796a89329048ece94d4be9jljusten}
919bdfde4623daff97f8f796a89329048ece94d4be9jljusten
920bdfde4623daff97f8f796a89329048ece94d4be9jljusten
921