2 * This file is part of the coreboot project.
4 * Copyright (C) 2011 Advanced Micro Devices, Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 #include "agesawrapper.h"
22 #include "BiosCallOuts.h"
23 #include "heapManager.h"
26 AGESA_STATUS GetBiosCallout (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
29 AGESA_STATUS CalloutStatus;
31 CONST BIOS_CALLOUT_STRUCT BiosCallouts[REQUIRED_CALLOUTS] =
33 {AGESA_ALLOCATE_BUFFER,
37 {AGESA_DEALLOCATE_BUFFER,
53 {AGESA_READ_SPD_RECOVERY,
61 {AGESA_HOOKBEFORE_DQS_TRAINING,
62 BiosHookBeforeDQSTraining
65 {AGESA_HOOKBEFORE_DRAM_INIT,
66 BiosHookBeforeDramInit
68 {AGESA_HOOKBEFORE_EXIT_SELF_REF,
69 BiosHookBeforeExitSelfRefresh
71 {AGESA_GNB_PCIE_SLOT_RESET,
76 for (i = 0; i < REQUIRED_CALLOUTS; i++)
78 if (BiosCallouts[i].CalloutName == Func)
84 if(i >= REQUIRED_CALLOUTS)
86 return AGESA_UNSUPPORTED;
89 CalloutStatus = BiosCallouts[i].CalloutPtr (Func, Data, ConfigPtr);
94 AGESA_STATUS BiosAllocateBuffer (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
96 UINT32 AvailableHeapSize;
97 UINT8 *BiosHeapBaseAddr;
98 UINT32 CurrNodeOffset;
99 UINT32 PrevNodeOffset;
100 UINT32 FreedNodeOffset;
101 UINT32 BestFitNodeOffset;
102 UINT32 BestFitPrevNodeOffset;
103 UINT32 NextFreeOffset;
104 BIOS_BUFFER_NODE *CurrNodePtr;
105 BIOS_BUFFER_NODE *FreedNodePtr;
106 BIOS_BUFFER_NODE *BestFitNodePtr;
107 BIOS_BUFFER_NODE *BestFitPrevNodePtr;
108 BIOS_BUFFER_NODE *NextFreePtr;
109 BIOS_HEAP_MANAGER *BiosHeapBasePtr;
110 AGESA_BUFFER_PARAMS *AllocParams;
112 AllocParams = ((AGESA_BUFFER_PARAMS *) ConfigPtr);
113 AllocParams->BufferPointer = NULL;
115 AvailableHeapSize = BIOS_HEAP_SIZE - sizeof (BIOS_HEAP_MANAGER);
116 BiosHeapBaseAddr = (UINT8 *) BIOS_HEAP_START_ADDRESS;
117 BiosHeapBasePtr = (BIOS_HEAP_MANAGER *) BIOS_HEAP_START_ADDRESS;
119 if (BiosHeapBasePtr->StartOfAllocatedNodes == 0) {
120 /* First allocation */
121 CurrNodeOffset = sizeof (BIOS_HEAP_MANAGER);
122 CurrNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + CurrNodeOffset);
123 CurrNodePtr->BufferHandle = AllocParams->BufferHandle;
124 CurrNodePtr->BufferSize = AllocParams->BufferLength;
125 CurrNodePtr->NextNodeOffset = 0;
126 AllocParams->BufferPointer = (UINT8 *) CurrNodePtr + sizeof (BIOS_BUFFER_NODE);
128 /* Update the remaining free space */
129 FreedNodeOffset = CurrNodeOffset + CurrNodePtr->BufferSize + sizeof (BIOS_BUFFER_NODE);
130 FreedNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + FreedNodeOffset);
131 FreedNodePtr->BufferSize = AvailableHeapSize - sizeof (BIOS_BUFFER_NODE) - CurrNodePtr->BufferSize;
132 FreedNodePtr->NextNodeOffset = 0;
134 /* Update the offsets for Allocated and Freed nodes */
135 BiosHeapBasePtr->StartOfAllocatedNodes = CurrNodeOffset;
136 BiosHeapBasePtr->StartOfFreedNodes = FreedNodeOffset;
138 /* Find out whether BufferHandle has been allocated on the heap. */
139 /* If it has, return AGESA_BOUNDS_CHK */
140 CurrNodeOffset = BiosHeapBasePtr->StartOfAllocatedNodes;
141 CurrNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + CurrNodeOffset);
143 while (CurrNodeOffset != 0) {
144 CurrNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + CurrNodeOffset);
145 if (CurrNodePtr->BufferHandle == AllocParams->BufferHandle) {
146 return AGESA_BOUNDS_CHK;
148 CurrNodeOffset = CurrNodePtr->NextNodeOffset;
149 /* If BufferHandle has not been allocated on the heap, CurrNodePtr here points
150 to the end of the allocated nodes list.
154 /* Find the node that best fits the requested buffer size */
155 FreedNodeOffset = BiosHeapBasePtr->StartOfFreedNodes;
156 PrevNodeOffset = FreedNodeOffset;
157 BestFitNodeOffset = 0;
158 BestFitPrevNodeOffset = 0;
159 while (FreedNodeOffset != 0) {
160 FreedNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + FreedNodeOffset);
161 if (FreedNodePtr->BufferSize >= (AllocParams->BufferLength + sizeof (BIOS_BUFFER_NODE))) {
162 if (BestFitNodeOffset == 0) {
163 /* First node that fits the requested buffer size */
164 BestFitNodeOffset = FreedNodeOffset;
165 BestFitPrevNodeOffset = PrevNodeOffset;
167 /* Find out whether current node is a better fit than the previous nodes */
168 BestFitNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + BestFitNodeOffset);
169 if (BestFitNodePtr->BufferSize > FreedNodePtr->BufferSize) {
170 BestFitNodeOffset = FreedNodeOffset;
171 BestFitPrevNodeOffset = PrevNodeOffset;
175 PrevNodeOffset = FreedNodeOffset;
176 FreedNodeOffset = FreedNodePtr->NextNodeOffset;
177 } /* end of while loop */
180 if (BestFitNodeOffset == 0) {
181 /* If we could not find a node that fits the requested buffer */
182 /* size, return AGESA_BOUNDS_CHK */
183 return AGESA_BOUNDS_CHK;
185 BestFitNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + BestFitNodeOffset);
186 BestFitPrevNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + BestFitPrevNodeOffset);
188 /* If BestFitNode is larger than the requested buffer, fragment the node further */
189 if (BestFitNodePtr->BufferSize > (AllocParams->BufferLength + sizeof (BIOS_BUFFER_NODE))) {
190 NextFreeOffset = BestFitNodeOffset + AllocParams->BufferLength + sizeof (BIOS_BUFFER_NODE);
192 NextFreePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + NextFreeOffset);
193 NextFreePtr->BufferSize = BestFitNodePtr->BufferSize - (AllocParams->BufferLength + sizeof (BIOS_BUFFER_NODE));
194 NextFreePtr->NextNodeOffset = BestFitNodePtr->NextNodeOffset;
196 /* Otherwise, next free node is NextNodeOffset of BestFitNode */
197 NextFreeOffset = BestFitNodePtr->NextNodeOffset;
200 /* If BestFitNode is the first buffer in the list, then update
201 StartOfFreedNodes to reflect the new free node
203 if (BestFitNodeOffset == BiosHeapBasePtr->StartOfFreedNodes) {
204 BiosHeapBasePtr->StartOfFreedNodes = NextFreeOffset;
206 BestFitPrevNodePtr->NextNodeOffset = NextFreeOffset;
209 /* Add BestFitNode to the list of Allocated nodes */
210 CurrNodePtr->NextNodeOffset = BestFitNodeOffset;
211 BestFitNodePtr->BufferSize = AllocParams->BufferLength;
212 BestFitNodePtr->BufferHandle = AllocParams->BufferHandle;
213 BestFitNodePtr->NextNodeOffset = 0;
215 /* Remove BestFitNode from list of Freed nodes */
216 AllocParams->BufferPointer = (UINT8 *) BestFitNodePtr + sizeof (BIOS_BUFFER_NODE);
220 return AGESA_SUCCESS;
223 AGESA_STATUS BiosDeallocateBuffer (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
226 UINT8 *BiosHeapBaseAddr;
227 UINT32 AllocNodeOffset;
228 UINT32 PrevNodeOffset;
229 UINT32 NextNodeOffset;
230 UINT32 FreedNodeOffset;
231 UINT32 EndNodeOffset;
232 BIOS_BUFFER_NODE *AllocNodePtr;
233 BIOS_BUFFER_NODE *PrevNodePtr;
234 BIOS_BUFFER_NODE *FreedNodePtr;
235 BIOS_BUFFER_NODE *NextNodePtr;
236 BIOS_HEAP_MANAGER *BiosHeapBasePtr;
237 AGESA_BUFFER_PARAMS *AllocParams;
239 BiosHeapBaseAddr = (UINT8 *) BIOS_HEAP_START_ADDRESS;
240 BiosHeapBasePtr = (BIOS_HEAP_MANAGER *) BIOS_HEAP_START_ADDRESS;
242 AllocParams = (AGESA_BUFFER_PARAMS *) ConfigPtr;
244 /* Find target node to deallocate in list of allocated nodes.
245 Return AGESA_BOUNDS_CHK if the BufferHandle is not found
247 AllocNodeOffset = BiosHeapBasePtr->StartOfAllocatedNodes;
248 AllocNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + AllocNodeOffset);
249 PrevNodeOffset = AllocNodeOffset;
251 while (AllocNodePtr->BufferHandle != AllocParams->BufferHandle) {
252 if (AllocNodePtr->NextNodeOffset == 0) {
253 return AGESA_BOUNDS_CHK;
255 PrevNodeOffset = AllocNodeOffset;
256 AllocNodeOffset = AllocNodePtr->NextNodeOffset;
257 AllocNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + AllocNodeOffset);
260 /* Remove target node from list of allocated nodes */
261 PrevNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + PrevNodeOffset);
262 PrevNodePtr->NextNodeOffset = AllocNodePtr->NextNodeOffset;
264 /* Zero out the buffer, and clear the BufferHandle */
265 LibAmdMemFill ((UINT8 *)AllocNodePtr + sizeof (BIOS_BUFFER_NODE), 0, AllocNodePtr->BufferSize, &(AllocParams->StdHeader));
266 AllocNodePtr->BufferHandle = 0;
267 AllocNodePtr->BufferSize += sizeof (BIOS_BUFFER_NODE);
269 /* Add deallocated node in order to the list of freed nodes */
270 FreedNodeOffset = BiosHeapBasePtr->StartOfFreedNodes;
271 FreedNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + FreedNodeOffset);
273 EndNodeOffset = AllocNodeOffset + AllocNodePtr->BufferSize;
275 if (AllocNodeOffset < FreedNodeOffset) {
276 /* Add to the start of the freed list */
277 if (EndNodeOffset == FreedNodeOffset) {
278 /* If the freed node is adjacent to the first node in the list, concatenate both nodes */
279 AllocNodePtr->BufferSize += FreedNodePtr->BufferSize;
280 AllocNodePtr->NextNodeOffset = FreedNodePtr->NextNodeOffset;
282 /* Clear the BufferSize and NextNodeOffset of the previous first node */
283 FreedNodePtr->BufferSize = 0;
284 FreedNodePtr->NextNodeOffset = 0;
287 /* Otherwise, add freed node to the start of the list
288 Update NextNodeOffset and BufferSize to include the
289 size of BIOS_BUFFER_NODE
291 AllocNodePtr->NextNodeOffset = FreedNodeOffset;
293 /* Update StartOfFreedNodes to the new first node */
294 BiosHeapBasePtr->StartOfFreedNodes = AllocNodeOffset;
296 /* Traverse list of freed nodes to find where the deallocated node
299 NextNodeOffset = FreedNodeOffset;
300 NextNodePtr = FreedNodePtr;
301 while (AllocNodeOffset > NextNodeOffset) {
302 PrevNodeOffset = NextNodeOffset;
303 if (NextNodePtr->NextNodeOffset == 0) {
306 NextNodeOffset = NextNodePtr->NextNodeOffset;
307 NextNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + NextNodeOffset);
310 /* If deallocated node is adjacent to the next node,
311 concatenate both nodes
313 if (NextNodeOffset == EndNodeOffset) {
314 NextNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + NextNodeOffset);
315 AllocNodePtr->BufferSize += NextNodePtr->BufferSize;
316 AllocNodePtr->NextNodeOffset = NextNodePtr->NextNodeOffset;
318 NextNodePtr->BufferSize = 0;
319 NextNodePtr->NextNodeOffset = 0;
321 /*AllocNodePtr->NextNodeOffset = FreedNodePtr->NextNodeOffset; */
322 AllocNodePtr->NextNodeOffset = NextNodeOffset;
324 /* If deallocated node is adjacent to the previous node,
325 concatenate both nodes
327 PrevNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + PrevNodeOffset);
328 EndNodeOffset = PrevNodeOffset + PrevNodePtr->BufferSize;
329 if (AllocNodeOffset == EndNodeOffset) {
330 PrevNodePtr->NextNodeOffset = AllocNodePtr->NextNodeOffset;
331 PrevNodePtr->BufferSize += AllocNodePtr->BufferSize;
333 AllocNodePtr->BufferSize = 0;
334 AllocNodePtr->NextNodeOffset = 0;
336 PrevNodePtr->NextNodeOffset = AllocNodeOffset;
339 return AGESA_SUCCESS;
342 AGESA_STATUS BiosLocateBuffer (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
344 UINT32 AllocNodeOffset;
345 UINT8 *BiosHeapBaseAddr;
346 BIOS_BUFFER_NODE *AllocNodePtr;
347 BIOS_HEAP_MANAGER *BiosHeapBasePtr;
348 AGESA_BUFFER_PARAMS *AllocParams;
350 AllocParams = (AGESA_BUFFER_PARAMS *) ConfigPtr;
352 BiosHeapBaseAddr = (UINT8 *) BIOS_HEAP_START_ADDRESS;
353 BiosHeapBasePtr = (BIOS_HEAP_MANAGER *) BIOS_HEAP_START_ADDRESS;
355 AllocNodeOffset = BiosHeapBasePtr->StartOfAllocatedNodes;
356 AllocNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + AllocNodeOffset);
358 while (AllocParams->BufferHandle != AllocNodePtr->BufferHandle) {
359 if (AllocNodePtr->NextNodeOffset == 0) {
360 AllocParams->BufferPointer = NULL;
361 AllocParams->BufferLength = 0;
362 return AGESA_BOUNDS_CHK;
364 AllocNodeOffset = AllocNodePtr->NextNodeOffset;
365 AllocNodePtr = (BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + AllocNodeOffset);
369 AllocParams->BufferPointer = (UINT8 *) ((UINT8 *) AllocNodePtr + sizeof (BIOS_BUFFER_NODE));
370 AllocParams->BufferLength = AllocNodePtr->BufferSize;
372 return AGESA_SUCCESS;
376 AGESA_STATUS BiosRunFuncOnAp (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
380 Status = agesawrapper_amdlaterunaptask (Func, Data, ConfigPtr);
384 AGESA_STATUS BiosReset (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
389 AMD_CONFIG_PARAMS *StdHeader;
392 StdHeader = ConfigPtr;
395 // Perform the RESET based upon the ResetType. In case of
396 // WARM_RESET_WHENVER and COLD_RESET_WHENEVER, the request will go to
397 // AmdResetManager. During the critical condition, where reset is required
398 // immediately, the reset will be invoked directly by writing 0x04 to port
399 // 0xCF9 (Reset Port).
402 case WARM_RESET_WHENEVER:
403 case COLD_RESET_WHENEVER:
406 case WARM_RESET_IMMEDIATELY:
407 case COLD_RESET_IMMEDIATELY:
409 LibAmdIoWrite (AccessWidth8, 0xCf9, &Value, StdHeader);
420 AGESA_STATUS BiosReadSpd (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
423 Status = AmdMemoryReadSPD (Func, Data, ConfigPtr);
428 AGESA_STATUS BiosDefaultRet (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
430 return AGESA_UNSUPPORTED;
432 /* Call the host environment interface to provide a user hook opportunity. */
433 AGESA_STATUS BiosHookBeforeDQSTraining (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
435 return AGESA_SUCCESS;
437 /* Call the host environment interface to provide a user hook opportunity. */
438 AGESA_STATUS BiosHookBeforeDramInit (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
442 MEM_DATA_STRUCT *MemData;
452 Status = AGESA_SUCCESS;
453 /* Get SB800 MMIO Base (AcpiMmioAddr) */
454 WriteIo8 (0xCD6, 0x27);
455 Data8 = ReadIo8(0xCD7);
457 WriteIo8 (0xCD6, 0x26);
458 Data8 = ReadIo8(0xCD7);
460 AcpiMmioAddr = (UINT32)Data16 << 16;
461 GpioMmioAddr = AcpiMmioAddr + GPIO_BASE;
463 Data8 = Read64Mem8(GpioMmioAddr+SB_GPIO_REG178);
465 TempData8 = Read64Mem8 (GpioMmioAddr+SB_GPIO_REG178);
468 Write64Mem8(GpioMmioAddr+SB_GPIO_REG178, TempData8);
472 TempData8 = Read64Mem8 (GpioMmioAddr+SB_GPIO_REG178);
475 Write64Mem8(GpioMmioAddr+SB_GPIO_REG178, TempData8);
476 Data8 = Read64Mem8(GpioMmioAddr+SB_GPIO_REG179);
478 TempData8 = Read64Mem8 (GpioMmioAddr+SB_GPIO_REG179);
481 Write64Mem8(GpioMmioAddr+SB_GPIO_REG179, TempData8);
484 TempData8 = Read64Mem8 (GpioMmioAddr+SB_GPIO_REG179);
487 Write64Mem8(GpioMmioAddr+SB_GPIO_REG179, TempData8);
489 switch(MemData->ParameterListPtr->DDR3Voltage){
491 Data8 = Read64Mem8 (GpioMmioAddr+SB_GPIO_REG178);
492 Data8 &= ~(UINT8)BIT6;
493 Write64Mem8(GpioMmioAddr+SB_GPIO_REG178, Data8);
494 Data8 = Read64Mem8 (GpioMmioAddr+SB_GPIO_REG179);
495 Data8 |= (UINT8)BIT6;
496 Write64Mem8(GpioMmioAddr+SB_GPIO_REG179, Data8);
499 Data8 = Read64Mem8 (GpioMmioAddr+SB_GPIO_REG178);
500 Data8 &= ~(UINT8)BIT6;
501 Write64Mem8(GpioMmioAddr+SB_GPIO_REG178, Data8);
502 Data8 = Read64Mem8 (GpioMmioAddr+SB_GPIO_REG179);
503 Data8 &= ~(UINT8)BIT6;
504 Write64Mem8(GpioMmioAddr+SB_GPIO_REG179, Data8);
508 Data8 = Read64Mem8 (GpioMmioAddr+SB_GPIO_REG178);
509 Data8 |= (UINT8)BIT6;
510 Write64Mem8(GpioMmioAddr+SB_GPIO_REG178, Data8);
511 Data8 = Read64Mem8 (GpioMmioAddr+SB_GPIO_REG179);
512 Data8 &= ~(UINT8)BIT6;
513 Write64Mem8(GpioMmioAddr+SB_GPIO_REG179, Data8);
515 // disable memory clear for boot time reduction
516 MemData->ParameterListPtr->EnableMemClr = FALSE;
519 /* Call the host environment interface to provide a user hook opportunity. */
520 AGESA_STATUS BiosHookBeforeExitSelfRefresh (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
522 return AGESA_SUCCESS;
524 /* PCIE slot reset control */
525 AGESA_STATUS BiosGnbPcieSlotReset (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
529 PCIe_SLOT_RESET_INFO *ResetInfo;
537 ResetInfo = ConfigPtr;
538 // Get SB800 MMIO Base (AcpiMmioAddr)
539 WriteIo8(0xCD6, 0x27);
540 Data8 = ReadIo8(0xCD7);
542 WriteIo8(0xCD6, 0x26);
543 Data8 = ReadIo8(0xCD7);
545 AcpiMmioAddr = (UINT32)Data16 << 16;
546 Status = AGESA_UNSUPPORTED;
547 GpioMmioAddr = AcpiMmioAddr + GPIO_BASE;
548 switch (ResetInfo->ResetId)
551 switch (ResetInfo->ResetControl)
553 case AssertSlotReset:
554 Data8 = Read64Mem8(GpioMmioAddr+SB_GPIO_REG21);
555 Data8 &= ~(UINT8)BIT6 ;
556 Write64Mem8(GpioMmioAddr+SB_GPIO_REG21, Data8); // MXM_GPIO0. GPIO21
557 Status = AGESA_SUCCESS;
559 case DeassertSlotReset:
560 Data8 = Read64Mem8(GpioMmioAddr+SB_GPIO_REG21);
562 Write64Mem8 (GpioMmioAddr+SB_GPIO_REG21, Data8); // MXM_GPIO0. GPIO21
563 Status = AGESA_SUCCESS;
568 switch (ResetInfo->ResetControl)
570 case AssertSlotReset:
571 Data8 = Read64Mem8(GpioMmioAddr+SB_GPIO_REG25);
572 Data8 &= ~(UINT8)BIT6 ;
573 Write64Mem8(GpioMmioAddr+SB_GPIO_REG25, Data8); // PCIE_RST#_LAN, GPIO25
574 Status = AGESA_SUCCESS;
576 case DeassertSlotReset:
577 Data8 = Read64Mem8(GpioMmioAddr+SB_GPIO_REG25);
579 Write64Mem8 (GpioMmioAddr+SB_GPIO_REG25, Data8); // PCIE_RST#_LAN, GPIO25
580 Status = AGESA_SUCCESS;
585 switch (ResetInfo->ResetControl)
587 case AssertSlotReset:
588 Data8 = Read64Mem8(GpioMmioAddr+SB_GPIO_REG02);
589 Data8 &= ~(UINT8)BIT6 ;
590 Write64Mem8(GpioMmioAddr+SB_GPIO_REG02, Data8); // MPCIE_RST0, GPIO02
591 Status = AGESA_SUCCESS;
593 case DeassertSlotReset:
594 Data8 = Read64Mem8(GpioMmioAddr+SB_GPIO_REG25);
596 Write64Mem8 (GpioMmioAddr+SB_GPIO_REG02, Data8); // MPCIE_RST0, GPIO02
597 Status = AGESA_SUCCESS;