AGESA F15: AMD family15 AGESA code
[coreboot.git] / src / vendorcode / amd / agesa / f15 / Proc / Common / S3RestoreState.c
1 /* $NoKeywords:$ */
2 /**
3  * @file
4  *
5  * S3 save/restore script
6  *
7  *
8  *
9  * @xrefitem bom "File Content Label" "Release Content"
10  * @e project:     AGESA
11  * @e sub-project: GNB
12  * @e \$Revision: 56279 $   @e \$Date: 2011-07-11 13:11:28 -0600 (Mon, 11 Jul 2011) $
13  *
14  */
15 /*
16 *****************************************************************************
17 *
18 * Copyright (C) 2012 Advanced Micro Devices, Inc.
19 * All rights reserved.
20 *
21 * Redistribution and use in source and binary forms, with or without
22 * modification, are permitted provided that the following conditions are met:
23 *     * Redistributions of source code must retain the above copyright
24 *       notice, this list of conditions and the following disclaimer.
25 *     * Redistributions in binary form must reproduce the above copyright
26 *       notice, this list of conditions and the following disclaimer in the
27 *       documentation and/or other materials provided with the distribution.
28 *     * Neither the name of Advanced Micro Devices, Inc. nor the names of
29 *       its contributors may be used to endorse or promote products derived
30 *       from this software without specific prior written permission.
31 *
32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
33 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
34 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
35 * DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY
36 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
38 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
39 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
40 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
41 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42 *
43 * ***************************************************************************
44 *
45 */
46
47 /*----------------------------------------------------------------------------------------
48  *                             M O D U L E S    U S E D
49  *----------------------------------------------------------------------------------------
50  */
51 #include "Porting.h"
52 #include "AMD.h"
53 #include "AGESA.h"
54 #include "Ids.h"
55 #include "amdlib.h"
56 #include "S3SaveState.h"
57 #include "Filecode.h"
58 CODE_GROUP (G1_PEICC)
59 RDATA_GROUP (G2_PEI)
60
61 #define FILECODE PROC_COMMON_S3RESTORESTATE_FILECODE
62 /*----------------------------------------------------------------------------------------
63  *                   D E F I N I T I O N S    A N D    M A C R O S
64  *----------------------------------------------------------------------------------------
65  */
66
67 /*----------------------------------------------------------------------------------------
68  *                  T Y P E D E F S     A N D     S T R U C T U  R E S
69  *----------------------------------------------------------------------------------------
70  */
71
72 extern S3_SCRIPT_CONFIGURATION    OptionS3ScriptConfiguration;
73 extern S3_DISPATCH_FUNCTION_ENTRY S3DispatchFunctionTable[];
74 /*----------------------------------------------------------------------------------------
75  *           P R O T O T Y P E S     O F     L O C A L     F U  N C T I O N S
76  *----------------------------------------------------------------------------------------
77  */
78
79
80 AGESA_STATUS
81 STATIC
82 S3RestoreStateFromTable (
83   IN      S3_SAVE_TABLE_HEADER  *S3SaveTablePtr,
84   IN      AMD_CONFIG_PARAMS     *StdHeader
85   );
86
87
88
89 /*----------------------------------------------------------------------------------------*/
90 /**
91  * Initialize S3 Script framework
92  *
93  *
94  *
95  * @param[in] StdHeader          Pointer to standard header
96  */
97 AGESA_STATUS
98 S3ScriptRestore (
99   IN      AMD_CONFIG_PARAMS   *StdHeader
100   )
101 {
102   return OptionS3ScriptConfiguration.Restore (StdHeader);
103 }
104
105
106 /*----------------------------------------------------------------------------------------*/
107 /**
108  * Initialize S3 Script framework
109  *
110  *
111  *
112  * @param[in] StdHeader          Pointer to standard header
113  */
114 AGESA_STATUS
115 S3ScriptRestoreStateStub (
116   IN      AMD_CONFIG_PARAMS   *StdHeader
117   )
118 {
119   return AGESA_SUCCESS;
120 }
121
122
123 /*----------------------------------------------------------------------------------------*/
124 /**
125  * Initialize S3 Script framework
126  *
127  *
128  *
129  * @param[in] StdHeader          Pointer to standard header
130  */
131 AGESA_STATUS
132 S3ScriptRestoreState (
133   IN      AMD_CONFIG_PARAMS   *StdHeader
134   )
135 {
136   AGESA_STATUS          Status;
137   S3_SAVE_TABLE_HEADER  *S3SaveTablePtr;
138   Status = S3ScriptGetS3SaveTable (StdHeader, &S3SaveTablePtr);
139   if (Status != AGESA_SUCCESS) {
140     IDS_ERROR_TRAP;
141     return  AGESA_FATAL;
142   }
143   S3SaveTablePtr->Locked = TRUE;
144   Status = S3RestoreStateFromTable (S3SaveTablePtr, StdHeader);
145   return  Status;
146 }
147
148
149 /*----------------------------------------------------------------------------------------*/
150 /**
151  * Initialize S3 Script framework
152  *
153  *
154  *
155  * @param[in] S3SaveTablePtr     Pointer to S3 Save Table
156  * @param[in] StdHeader          Pointer to standard header
157  */
158 AGESA_STATUS
159 STATIC
160 S3RestoreStateFromTable (
161   IN      S3_SAVE_TABLE_HEADER  *S3SaveTablePtr,
162   IN      AMD_CONFIG_PARAMS     *StdHeader
163   )
164 {
165   VOID                  *S3SaveTableRecordPtr;
166   PCI_ADDR              PciAddress;
167   UINTN                 Index;
168   S3SaveTableRecordPtr = (UINT8 *) S3SaveTablePtr + sizeof (S3_SAVE_TABLE_HEADER);
169   IDS_HDT_CONSOLE (S3_TRACE, "Start S3 restore\n", ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Address);
170   while ((UINT8 *) S3SaveTableRecordPtr < ((UINT8 *) S3SaveTablePtr + S3SaveTablePtr->SaveOffset)) {
171     switch  (*(UINT16 *) S3SaveTableRecordPtr) {
172     case  SAVE_STATE_IO_WRITE_OPCODE:
173       S3_SCRIPT_DEBUG_CODE (
174         IDS_HDT_CONSOLE (S3_TRACE, "  S3 Restore: %s Address: 0x%08x Data: ", S3SaveDebugOpcodeString (StdHeader, *(UINT16 *) S3SaveTableRecordPtr), (UINT16) ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Address);
175         S3SaveDebugPrintHexArray (StdHeader, (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_WRITE_OP_HEADER), 1, ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width);
176         IDS_HDT_CONSOLE (S3_TRACE, "\n");
177         );
178       LibAmdIoWrite (
179         ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width,
180         (UINT16) ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Address,
181         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_WRITE_OP_HEADER),
182         StdHeader
183         );
184       S3SaveTableRecordPtr = (UINT8 *) S3SaveTableRecordPtr +
185                               sizeof (S3_WRITE_OP_HEADER) +
186                               LibAmdAccessWidth (((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width);
187       break;
188     case  SAVE_STATE_IO_READ_WRITE_OPCODE:
189       S3_SCRIPT_DEBUG_CODE (
190         IDS_HDT_CONSOLE (S3_TRACE, "  S3 Restore: %s Address: 0x%08x Data: ", S3SaveDebugOpcodeString (StdHeader, *(UINT16 *) S3SaveTableRecordPtr), (UINT16) ((S3_READ_WRITE_OP_HEADER*) S3SaveTableRecordPtr)->Address);
191         S3SaveDebugPrintHexArray (
192           StdHeader,
193           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER),
194           1,
195           ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width
196           );
197         IDS_HDT_CONSOLE (S3_TRACE, " Mask: ");
198         S3SaveDebugPrintHexArray (
199           StdHeader,
200           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER) + LibAmdAccessWidth (((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width),
201           1,
202           ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width
203           );
204         IDS_HDT_CONSOLE (S3_TRACE, "\n");
205         );
206       LibAmdIoRMW (
207         ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width,
208         (UINT16) ((S3_READ_WRITE_OP_HEADER*) S3SaveTableRecordPtr)->Address,
209         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER),
210         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER) + LibAmdAccessWidth (((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width),
211         StdHeader
212         );
213       S3SaveTableRecordPtr = (UINT8 *) S3SaveTableRecordPtr +
214                               sizeof (S3_READ_WRITE_OP_HEADER) +
215                               2 * LibAmdAccessWidth (((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width);
216       break;
217     case  SAVE_STATE_MEM_WRITE_OPCODE:
218       S3_SCRIPT_DEBUG_CODE (
219         IDS_HDT_CONSOLE (S3_TRACE, "  S3 Restore: %s Address: 0x%08x Data: ", S3SaveDebugOpcodeString (StdHeader, *(UINT16 *) S3SaveTableRecordPtr), (UINT16) ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Address);
220         S3SaveDebugPrintHexArray (StdHeader, (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_WRITE_OP_HEADER), 1, ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width);
221         IDS_HDT_CONSOLE (S3_TRACE, "\n");
222         );
223      LibAmdMemWrite (
224         ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width,
225         ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Address,
226         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_WRITE_OP_HEADER),
227         StdHeader
228         );
229       S3SaveTableRecordPtr = (UINT8 *) S3SaveTableRecordPtr +
230                               sizeof (S3_WRITE_OP_HEADER) +
231                               LibAmdAccessWidth (((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width);
232       break;
233     case  SAVE_STATE_MEM_READ_WRITE_OPCODE:
234       S3_SCRIPT_DEBUG_CODE (
235         IDS_HDT_CONSOLE (S3_TRACE, "  S3 Restore: %s Address: 0x%08x Data: ", S3SaveDebugOpcodeString (StdHeader, *(UINT16 *) S3SaveTableRecordPtr), (UINT16) ((S3_READ_WRITE_OP_HEADER*) S3SaveTableRecordPtr)->Address);
236         S3SaveDebugPrintHexArray (
237           StdHeader,
238           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER),
239           1,
240           ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width
241           );
242         IDS_HDT_CONSOLE (S3_TRACE, " Mask: ");
243         S3SaveDebugPrintHexArray (
244           StdHeader,
245           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER) + LibAmdAccessWidth (((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width),
246           1,
247           ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width
248           );
249         IDS_HDT_CONSOLE (S3_TRACE, "\n");
250         );
251       LibAmdMemRMW (
252         ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width,
253         ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Address,
254         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER),
255         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER) + LibAmdAccessWidth (((S3_READ_WRITE_OP_HEADER*) S3SaveTableRecordPtr)->Width),
256         StdHeader
257         );
258       S3SaveTableRecordPtr = (UINT8 *) S3SaveTableRecordPtr +
259                               sizeof (S3_READ_WRITE_OP_HEADER) +
260                               2 * LibAmdAccessWidth (((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width);
261       break;
262     case  SAVE_STATE_PCI_CONFIG_WRITE_OPCODE:
263       PciAddress.AddressValue = (UINT32) ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Address;
264       S3_SCRIPT_DEBUG_CODE (
265         IDS_HDT_CONSOLE (S3_TRACE, "  S3 Restore: %s Address: 0x%08x Data: ", S3SaveDebugOpcodeString (StdHeader, *(UINT16 *) S3SaveTableRecordPtr), (UINT16) ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Address);
266         S3SaveDebugPrintHexArray (StdHeader, (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_WRITE_OP_HEADER), 1, ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width);
267         IDS_HDT_CONSOLE (S3_TRACE, "\n");
268         );
269       LibAmdPciWrite (
270         ((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width,
271         PciAddress,
272         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_WRITE_OP_HEADER),
273         StdHeader
274         );
275       S3SaveTableRecordPtr = (UINT8 *) S3SaveTableRecordPtr +
276                               sizeof (S3_WRITE_OP_HEADER) +
277                               LibAmdAccessWidth (((S3_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width);
278       break;
279     case  SAVE_STATE_PCI_CONFIG_READ_WRITE_OPCODE:
280       PciAddress.AddressValue = (UINT32) ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Address;
281       S3_SCRIPT_DEBUG_CODE (
282         IDS_HDT_CONSOLE (S3_TRACE, "  S3 Restore: %s Address: 0x%08x Data: ", S3SaveDebugOpcodeString (StdHeader, *(UINT16 *) S3SaveTableRecordPtr), (UINT16) ((S3_READ_WRITE_OP_HEADER*) S3SaveTableRecordPtr)->Address);
283         S3SaveDebugPrintHexArray (
284           StdHeader,
285           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER),
286           1,
287           ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width
288           );
289         IDS_HDT_CONSOLE (S3_TRACE, " Mask: ");
290         S3SaveDebugPrintHexArray (
291           StdHeader,
292           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER) + LibAmdAccessWidth (((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width),
293           1,
294           ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width
295           );
296         IDS_HDT_CONSOLE (S3_TRACE, "\n");
297         );
298       LibAmdPciRMW (
299         ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width,
300         PciAddress,
301         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER),
302         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_READ_WRITE_OP_HEADER) + LibAmdAccessWidth (((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width),
303         StdHeader
304         );
305       S3SaveTableRecordPtr = (UINT8 *) S3SaveTableRecordPtr +
306                               sizeof (S3_READ_WRITE_OP_HEADER) +
307                               2 * LibAmdAccessWidth (((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width);
308       break;
309     case  SAVE_STATE_STALL_OPCODE:
310       break;
311     case  SAVE_STATE_INFORMATION_OPCODE:
312       IDS_HDT_CONSOLE (S3_TRACE, "  S3 Restore: Info: [%s]\n", (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_INFO_OP_HEADER));
313       S3SaveTableRecordPtr = (UINT8 *) S3SaveTableRecordPtr +
314                              sizeof (S3_INFO_OP_HEADER) +
315                              ((S3_INFO_OP_HEADER*) S3SaveTableRecordPtr)->Length;
316       break;
317     case  SAVE_STATE_DISPATCH_OPCODE:
318       S3_SCRIPT_DEBUG_CODE (
319         IDS_HDT_CONSOLE (S3_TRACE, "  S3 Restore: %s Function Id: 0x%02x, Context: ",  S3SaveDebugOpcodeString (StdHeader, *(UINT16 *) S3SaveTableRecordPtr), ((S3_DISPATCH_OP_HEADER*) S3SaveTableRecordPtr)->FunctionId);
320         S3SaveDebugPrintHexArray (
321           StdHeader,
322           (VOID*)((UINT8*) S3SaveTableRecordPtr + sizeof (S3_DISPATCH_OP_HEADER)),
323           ((S3_DISPATCH_OP_HEADER*) S3SaveTableRecordPtr)->Length,
324           AccessWidth8);
325         IDS_HDT_CONSOLE (S3_TRACE, "\n");
326         );
327       Index = 0;
328       while (S3DispatchFunctionTable[Index].FunctionId != 0) {
329         if (S3DispatchFunctionTable[Index].FunctionId == ((S3_DISPATCH_OP_HEADER*) S3SaveTableRecordPtr)->FunctionId) {
330           (S3DispatchFunctionTable[Index].Function) (
331             StdHeader,
332             ((S3_DISPATCH_OP_HEADER*) S3SaveTableRecordPtr)->Length,
333             (VOID*)((UINT8*) S3SaveTableRecordPtr + sizeof (S3_DISPATCH_OP_HEADER))
334             );
335           break;
336         }
337         Index++;
338       }
339       ASSERT (S3DispatchFunctionTable[Index].FunctionId != 0);
340       S3SaveTableRecordPtr = (UINT8 *) S3SaveTableRecordPtr +
341                              sizeof (S3_DISPATCH_OP_HEADER) +
342                              ((S3_DISPATCH_OP_HEADER*) S3SaveTableRecordPtr)->Length;
343       break;
344
345     case  SAVE_STATE_IO_POLL_OPCODE:
346       S3_SCRIPT_DEBUG_CODE (
347         IDS_HDT_CONSOLE (S3_TRACE, "  S3 Restore: %s Address: 0x%04x Data: ", S3SaveDebugOpcodeString (StdHeader, *(UINT16 *) S3SaveTableRecordPtr), (UINT16) ((S3_POLL_OP_HEADER*) S3SaveTableRecordPtr)->Address);
348         S3SaveDebugPrintHexArray (
349           StdHeader,
350           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER),
351           1,
352           ((S3_READ_WRITE_OP_HEADER *) S3SaveTableRecordPtr)->Width
353           );
354         IDS_HDT_CONSOLE (S3_TRACE, " Mask: ");
355         S3SaveDebugPrintHexArray (
356           StdHeader,
357           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER) + LibAmdAccessWidth (((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width),
358           1,
359           ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width
360           );
361         )
362       LibAmdIoPoll (
363         ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width,
364         (UINT16) ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Address,
365         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER),
366         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER) + LibAmdAccessWidth (((S3_POLL_OP_HEADER*) S3SaveTableRecordPtr)->Width),
367         ((S3_POLL_OP_HEADER*) S3SaveTableRecordPtr)->Delay,
368         StdHeader
369         );
370       S3SaveTableRecordPtr = (UINT8 *) S3SaveTableRecordPtr +
371                               sizeof (S3_POLL_OP_HEADER) +
372                               2 * LibAmdAccessWidth (((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width);
373       break;
374     case  SAVE_STATE_MEM_POLL_OPCODE:
375       S3_SCRIPT_DEBUG_CODE (
376         IDS_HDT_CONSOLE (S3_TRACE, "  S3 Restore: %s Address: 0x%08x Data: ", S3SaveDebugOpcodeString (StdHeader, *(UINT16 *) S3SaveTableRecordPtr), (UINT32) ((S3_POLL_OP_HEADER*) S3SaveTableRecordPtr)->Address);
377         S3SaveDebugPrintHexArray (
378           StdHeader,
379           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER),
380           1,
381           ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width
382           );
383         IDS_HDT_CONSOLE (S3_TRACE, " Mask: ");
384         S3SaveDebugPrintHexArray (
385           StdHeader,
386           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER) + LibAmdAccessWidth (((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width),
387           1,
388           ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width
389           );
390         )
391       LibAmdMemPoll (
392         ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width,
393         ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Address,
394         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER),
395         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER) + LibAmdAccessWidth (((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width),
396         ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Delay,
397         StdHeader
398         );
399       S3SaveTableRecordPtr = (UINT8 *) S3SaveTableRecordPtr +
400                               sizeof (S3_POLL_OP_HEADER) +
401                               2 * LibAmdAccessWidth (((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width);
402       break;
403     case  SAVE_STATE_PCI_CONFIG_POLL_OPCODE:
404       PciAddress.AddressValue = (UINT32) ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Address;
405       S3_SCRIPT_DEBUG_CODE (
406         IDS_HDT_CONSOLE (S3_TRACE, "  S3 Restore: %s Address: 0x%08x Data: ", S3SaveDebugOpcodeString (StdHeader, *(UINT16 *) S3SaveTableRecordPtr), (UINT32) ((S3_POLL_OP_HEADER*) S3SaveTableRecordPtr)->Address);
407         S3SaveDebugPrintHexArray (
408           StdHeader,
409           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER),
410           1,
411           ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width
412           );
413         IDS_HDT_CONSOLE (S3_TRACE, " Mask: ");
414         S3SaveDebugPrintHexArray (
415           StdHeader,
416           (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER) + LibAmdAccessWidth (((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width),
417           1,
418           ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width
419           );
420         )
421       LibAmdPciPoll (
422         ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width,
423         PciAddress,
424         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER),
425         (UINT8 *) S3SaveTableRecordPtr + sizeof (S3_POLL_OP_HEADER) + LibAmdAccessWidth (((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width),
426         ((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Delay,
427         StdHeader
428         );
429       S3SaveTableRecordPtr = (UINT8 *) S3SaveTableRecordPtr +
430                               sizeof (S3_POLL_OP_HEADER) +
431                               2 * LibAmdAccessWidth (((S3_POLL_OP_HEADER *) S3SaveTableRecordPtr)->Width);
432       break;
433     default:
434       IDS_HDT_CONSOLE (S3_TRACE, " ERROR!!! Invalid S3 restore opcode\n");
435       ASSERT (FALSE);
436       return AGESA_ERROR;
437     }
438   }
439   IDS_HDT_CONSOLE (S3_TRACE, " End S3 Restore \n");
440   return AGESA_SUCCESS;
441 }
442