blob: dcbbf9696928fb450c82316e27a014eda14ec647 [file] [log] [blame]
Frank Vibrans2b4c8312011-02-14 18:30:54 +00001/* $NoKeywords:$ */
2/**
3 * @file
4 *
5 * mns3on.c
6 *
7 * ON memory specific function to support S3 resume
8 *
9 * @xrefitem bom "File Content Label" "Release Content"
10 * @e project: AGESA
11 * @e sub-project: (Mem/NB/ON)
12 * @e \$Revision: 38639 $ @e \$Date: 2010-09-27 21:55:34 +0800 (Mon, 27 Sep 2010) $
13 *
14 **/
15/*
16 *****************************************************************************
17 *
18 * Copyright (c) 2011, 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 *----------------------------------------------------------------------------
49 * MODULES USED
50 *
51 *----------------------------------------------------------------------------
52 */
53
54
55
56#include "AGESA.h"
57#include "AdvancedApi.h"
58#include "amdlib.h"
59#include "Ids.h"
60#include "OptionMemory.h"
61#include "mm.h"
62#include "mn.h"
63#include "S3.h"
64#include "mfs3.h"
65#include "mnon.h"
66#include "cpuRegisters.h"
67#include "cpuFamRegisters.h"
68#include "cpuFamilyTranslation.h"
69#include "GeneralServices.h"
70#include "cpuCommonF14Utilities.h"
71#include "mnS3on.h"
72#include "heapManager.h"
73#include "Filecode.h"
74#define FILECODE PROC_MEM_NB_ON_MNS3ON_FILECODE
75
76/*----------------------------------------------------------------------------
77 * TYPEDEFS AND STRUCTURES
78 *
79 *----------------------------------------------------------------------------
80 */
81
82/*----------------------------------------------------------------------------
83 * PROTOTYPES OF LOCAL FUNCTIONS
84 *
85 *----------------------------------------------------------------------------
86 */
87UINT16
88STATIC
89MemNS3GetRegLstPtrON (
90 IN OUT MEM_NB_BLOCK *NBPtr,
91 IN OUT DESCRIPTOR_GROUP *DescriptPtr
92 );
93
94AGESA_STATUS
95STATIC
96MemNS3GetDeviceRegLstON (
97 IN UINT32 RegisterLstID,
98 OUT VOID **RegisterHeader
99 );
100
101VOID
102STATIC
103MemNS3SetDfltPllLockTimeON (
104 IN ACCESS_WIDTH AccessWidth,
105 IN PCI_ADDR Address,
106 IN OUT VOID *Value,
107 IN OUT VOID *ConfigPtr
108 );
109
110BOOLEAN
111STATIC
112MemNS3ChangeNbFrequencyWrapON (
113 IN OUT MEM_NB_BLOCK *NBPtr,
114 IN UINT32 NBPstate
115 );
116
117VOID
118STATIC
119MemNS3GetConPCIMaskON (
120 IN OUT MEM_NB_BLOCK *NBPtr,
121 IN OUT DESCRIPTOR_GROUP *DescriptPtr
122 );
123/*----------------------------------------------------------------------------
124 * DEFINITIONS AND MACROS
125 *
126 *----------------------------------------------------------------------------
127 */
128PCI_SPECIAL_CASE PciSpecialCaseFuncON[] = {
129 {MemNS3GetCSRNb, MemNS3SetCSRNb},
130 {MemNS3GetBitFieldNb, MemNS3SetBitFieldNb},
131 {MemNS3DisNbPsDbgNb, MemNS3DisNbPsDbgNb},
132 {MemNS3EnNbPsDbg1Nb, MemNS3EnNbPsDbg1Nb},
133 { (VOID (*) (ACCESS_WIDTH, PCI_ADDR, VOID *, VOID *)) memDefRet, MemNS3SetDfltPllLockTimeON},
134 { (VOID (*) (ACCESS_WIDTH, PCI_ADDR, VOID *, VOID *)) memDefRet, MemNS3SetDisAutoCompUnb},
135 { (VOID (*) (ACCESS_WIDTH, PCI_ADDR, VOID *, VOID *)) memDefRet, MemNS3SetDynModeChangeNb},
136 {MemNS3GetBitFieldNb, MemNS3SetPreDriverCalUnb}
137};
138
139PCI_REG_DESCRIPTOR ROMDATA S3PciPreSelfRefDescriptorON[] = {
140 {{0, 2, 0}, FUNC_2, 0x110, 0x00000708},
141 {{0, 0, 0}, FUNC_1, 0x40, 0x0FFF0003},
142 {{0, 0, 0}, FUNC_1, 0x44, 0xFFFF0000},
143 {{0, 0, 0}, FUNC_1, 0xF0, 0xFF00FF81},
144 {{0, 2, 0}, FUNC_2, 0x114, 0x00000200},
145 {{0, 0, 0}, FUNC_2, 0x118, 0x0F00CFFF},
146 {{0, 0, 0}, FUNC_2, 0x11C, 0x61CC507C},
147 {{0, 0, 0}, FUNC_2, 0x40, 0x1FF83FED},
148 {{0, 0, 0}, FUNC_2, 0x44, 0x1FF83FED},
149 {{0, 0, 0}, FUNC_2, 0x48, 0x1FF83FED},
150 {{0, 0, 0}, FUNC_2, 0x4C, 0x1FF83FED},
151 {{0, 0, 0}, FUNC_2, 0x60, 0x1FF83FE0},
152 {{0, 0, 0}, FUNC_2, 0x64, 0x1FF83FE0},
153 {{0, 1, 0}, FUNC_2, 0x80, 0x000000FF},
154 {{0, 0, 0}, FUNC_2, 0x84, 0x00FC2FFF},
155 {{0, 0, 0}, FUNC_2, 0x88, 0xFF00000F},
156 {{0, 0, 0}, FUNC_2, 0x8C, 0x03F7FCFF},
157 {{0, 0, 0}, FUNC_2, 0x90, 0x0EF20003},
158 {{0, 1, 0}, FUNC_2, 0xA4, 0x00000007},
159 {{0, 0, 0}, FUNC_2, 0xA8, 0x0078FF1F},
160 {{0, 2, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x06), 0x00000F8F},
161 {{0, 1, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x16), 0x0000000F},
162 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x40), 0x3F1F0F0F},
163 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x41), 0x00070707},
164 {{0, 2, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x83), 0x00007177},
165 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x180), 0x0F0F0F0F},
166 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x182), 0x0F0F0F0F},
167 {{0, 2, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x200), 0x00001F0F},
168
169 // Phy Initialization
170 {{6, 3, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x0B), 0},
171 // 3. Phy voltage related
172 {{1, 1, 1}, DCT0, BFDataRxVioLvl, 0x00000018},
173 {{1, 1, 1}, DCT0, BFClkRxVioLvl, 0x00000018},
174 {{1, 2, 1}, DCT0, BFCmpVioLvl, 0x0000C000},
175 {{1, 1, 1}, DCT0, BFCmdRxVioLvl, 0x00000018},
176 {{1, 1, 1}, DCT0, BFAddrRxVioLvl, 0x00000018},
177 // 4. Frequency Change
178 {{4, 3, 1}, DCT0, BFPllLockTime, 0},
179 {{0, 0, 0}, FUNC_2, 0x94, 0xFFD1CC1F},
180 // NB Pstate Related Register for Pstate 0
181 {{0, 0, 0}, FUNC_2, 0x78, 0xFFF63FCF},
182 {{0, 2, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x30), 0x00001FFF},
183 {{0, 2, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x31), 0x00001FFF},
184 {{0, 2, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x32), 0x00009F9F},
185 // Access NB Pstate 1
186 {{3, 3, 1}, FUNC_6, 0x98, 0},
187 // NB Pstate Related Register for Pstate 1
188 {{0, 0, 0}, FUNC_2, 0x78, 0xFFF63FCF},
189 {{0, 2, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x30), 0x00001FFF},
190 {{0, 2, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x31), 0x00001FFF},
191 {{0, 2, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_EXTRA_FLAG, 0, 0x32), 0x00009F9F},
192 // Disable Access to NB Pstate 1
193 {{2, 3, 1}, FUNC_6, 0x98, 0},
194 {{1, 1, 1}, DCT0, BFMemClkFreqVal, 0},
195 {{1, 2, 1}, DCT0, BFPllLockTime, 0},
196 // 5. Phy Fence
197 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x0C), 0x7FFF3FFF},
198 {{1, 2, 1}, DCT0, BFDataFence2, 0x00007FFF},
199 {{1, 1, 1}, DCT0, BFClkFence2, 0x0000001F},
200 {{1, 1, 1}, DCT0, BFCmdFence2, 0x0000001F},
201 {{1, 1, 1}, DCT0, BFAddrFence2, 0x0000001F},
202 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x00), 0x70777777},
203 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x04), 0x003F3F3F},
204 {{1, 1, 1}, DCT0, BFDQOdt03, 0x70},
205 {{1, 1, 1}, DCT0, BFDQOdt47, 0x70},
206 // 6. Phy Compensation Init
207 {{5, 3, 1}, DCT0, BFDisablePredriverCal, 0},
208 {{1, 2, 1}, DCT0, BFDataByteTxPreDriverCal2Pad1, 0},
209 {{1, 2, 1}, DCT0, BFDataByteTxPreDriverCal2Pad2, 0},
210 {{7, 2, 1}, DCT0, BFDataByteTxPreDriverCal, 0},
211 {{1, 2, 1}, DCT0, BFCmdAddr0TxPreDriverCal2Pad1, 0},
212 {{1, 2, 1}, DCT0, BFCmdAddr0TxPreDriverCal2Pad2, 0},
213 {{1, 2, 1}, DCT0, BFCmdAddr1TxPreDriverCal2Pad1, 0},
214 {{1, 2, 1}, DCT0, BFCmdAddr1TxPreDriverCal2Pad2, 0},
215 {{1, 2, 1}, DCT0, BFAddrTxPreDriverCal2Pad1, 0},
216 {{1, 2, 1}, DCT0, BFAddrTxPreDriverCal2Pad2, 0},
217 {{1, 2, 1}, DCT0, BFAddrTxPreDriverCal2Pad3, 0},
218 {{1, 2, 1}, DCT0, BFAddrTxPreDriverCal2Pad4, 0},
219 {{7, 2, 1}, DCT0, BFCmdAddr0TxPreDriverCalPad0, 0},
220 {{7, 2, 1}, DCT0, BFCmdAddr1TxPreDriverCalPad0, 0},
221 {{7, 2, 1}, DCT0, BFAddrTxPreDriverCalPad0, 0},
222 {{7, 2, 1}, DCT0, BFClock0TxPreDriverCalPad0, 0},
223 {{7, 2, 1}, DCT0, BFClock1TxPreDriverCalPad0, 0},
224
225 {{1, 2, 1}, DCT0, BFDisablePredriverCal, 0x00006000}
226};
227
228CONST PCI_REGISTER_BLOCK_HEADER ROMDATA S3PciPreSelfRefON = {
229 0,
230 (sizeof (S3PciPreSelfRefDescriptorON) / sizeof (PCI_REG_DESCRIPTOR)),
231 S3PciPreSelfRefDescriptorON,
232 PciSpecialCaseFuncON
233};
234
235CONDITIONAL_PCI_REG_DESCRIPTOR ROMDATA S3CPciPostSelfDescriptorON[] = {
236 // DCT0
237 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x10), 0x01FF01FF, DCT0_MASK, 0x01},
238 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x11), 0x01FF01FF, DCT0_MASK, 0x01},
239 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x13), 0x01FF01FF, DCT0_MASK, 0x04},
240 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x14), 0x01FF01FF, DCT0_MASK, 0x04},
241 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x20), 0x01FF01FF, DCT0_MASK, 0x01},
242 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x21), 0x01FF01FF, DCT0_MASK, 0x01},
243 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x23), 0x01FF01FF, DCT0_MASK, 0x04},
244 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x24), 0x01FF01FF, DCT0_MASK, 0x04},
245 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x01), 0xFFFFFFFF, DCT0_MASK, 0x01},
246 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x02), 0xFFFFFFFF, DCT0_MASK, 0x01},
247 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x101), 0xFFFFFFFF, DCT0_MASK, 0x04},
248 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x102), 0xFFFFFFFF, DCT0_MASK, 0x04},
249 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x05), 0x3E3E3E3E, DCT0_MASK, 0x01},
250 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x06), 0x3E3E3E3E, DCT0_MASK, 0x01},
251 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x105), 0x3E3E3E3E, DCT0_MASK, 0x04},
252 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x106), 0x3E3E3E3E, DCT0_MASK, 0x04},
253 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x30), 0x00FF00FF, DCT0_DDR3_MASK, 0x01},
254 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x31), 0x00FF00FF, DCT0_DDR3_MASK, 0x01},
255 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x33), 0x00FF00FF, DCT0_DDR3_MASK, 0x04},
256 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x34), 0x00FF00FF, DCT0_DDR3_MASK, 0x04},
257 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x40), 0x00FF00FF, DCT0_DDR3_MASK, 0x01},
258 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x41), 0x00FF00FF, DCT0_DDR3_MASK, 0x01},
259 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x43), 0x00FF00FF, DCT0_DDR3_MASK, 0x04},
260 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x44), 0x00FF00FF, DCT0_DDR3_MASK, 0x04},
261 {{0, 0, 1}, FUNC_2, SET_S3_SPECIAL_OFFSET (DCT_PHY_FLAG, 0, 0x0D), 0x037F037F, DCT0_MASK, ANY_DIMM_MASK},
262 {{1, 1, 1}, DCT0, BFPhyClkConfig0, 0x00000010, DCT0_MASK, ANY_DIMM_MASK},
263 {{1, 1, 1}, DCT0, BFPhyClkConfig1, 0x00000010, DCT0_MASK, ANY_DIMM_MASK},
264 {{1, 1, 1}, DCT0, BFPhy0x0D0F0F13Bit0to7, 0x00000083, DCT0_MASK, ANY_DIMM_MASK},
265 {{1, 1, 1}, DCT0, BFAddrCmdTri, 0x0000000B1, DCT0_MASK, ANY_DIMM_MASK},
266 {{1, 2, 1}, DCT0, BFLowPowerDrvStrengthEn, 0x00000100, DCT0_MASK, ANY_DIMM_MASK},
267 {{1, 2, 1}, DCT0, BFEnRxPadStandby, 0x000001000, DCT0_MASK, ANY_DIMM_MASK},
268 {{1, 1, 1}, DCT0, BFDisDllShutdownSR, 0x00000001, DCT0_MASK, ANY_DIMM_MASK},
269
270 {{0, 0, 0}, FUNC_2, 0x1C0, 0x100000, DCT0_MASK, ANY_DIMM_MASK},
271 {{0, 0, 0}, FUNC_3, 0x84, 0x00060006, DCT0_MASK, ANY_DIMM_MASK},
272 {{0, 2, 0}, FUNC_4, 0x12C, 0x0000FFFF, DCT0_MASK, ANY_DIMM_MASK},
273 {{0, 0, 0}, FUNC_4, 0x1A8, 0x3F000000, DCT0_MASK, ANY_DIMM_MASK},
274 {{0, 0, 0}, FUNC_3, 0x188, 0x00400000, DCT0_MASK, ANY_DIMM_MASK},
275 {{0, 2, 0}, FUNC_6, 0x78, 0x0000FF00, DCT0_MASK, ANY_DIMM_MASK},
276 // Release NB P-state force
277 {{0, 0, 0}, FUNC_6, 0x90, 0x50000000, DCT0_MASK, ANY_DIMM_MASK},
278 {{0, 0, 0}, FUNC_2, 0x118, 0x00080000, DCT0_MASK, ANY_DIMM_MASK}
279};
280
281CONST CPCI_REGISTER_BLOCK_HEADER ROMDATA S3CPciPostSelfRefON = {
282 0,
283 (sizeof (S3CPciPostSelfDescriptorON) / sizeof (CONDITIONAL_PCI_REG_DESCRIPTOR)),
284 S3CPciPostSelfDescriptorON,
285 PciSpecialCaseFuncON
286};
287
288MSR_REG_DESCRIPTOR ROMDATA S3MSRPreSelfRefDescriptorON[] = {
289 {{0, 0, 0}, 0xC0010010, 0x00000000007F0000},
290 {{0, 0, 0}, 0xC001001A, 0x0000000FFF800000},
291 {{0, 0, 0}, 0xC001001D, 0x0000000FFF800000},
292 {{0, 0, 0}, 0xC001001F, 0x8480FC6A434243E0}
293};
294
295CONST MSR_REGISTER_BLOCK_HEADER ROMDATA S3MSRPreSelfRefON = {
296 0,
297 (sizeof (S3MSRPreSelfRefDescriptorON) / sizeof (MSR_REG_DESCRIPTOR)),
298 S3MSRPreSelfRefDescriptorON,
299 NULL
300};
301
302VOID *MemS3RegListON[] = {
303 (VOID *)&S3PciPreSelfRefON,
304 NULL,
305 NULL,
306 (VOID *)&S3CPciPostSelfRefON,
307 (VOID *)&S3MSRPreSelfRefON,
308 NULL,
309 NULL,
310 NULL
311};
312
313/*----------------------------------------------------------------------------
314 * EXPORTED FUNCTIONS
315 *
316 *----------------------------------------------------------------------------
317 */
318/* -----------------------------------------------------------------------------*/
319/**
320 *
321 *
322 * This function initializes the northbridge block for S3 resume
323 *
324 * @param[in,out] *S3NBPtr - Pointer to MEM_NB_BLOCK.
325 * @param[in,out] *MemPtr - Pointer to MEM_DATA_STRUCT.
326 * @param[in] NodeID - Node ID of the target node.
327 *
328 * @return BOOLEAN
329 * TRUE - This is the correct constructor for the targeted node.
330 * FALSE - This isn't the correct constructor for the targeted node.
331 */
332BOOLEAN
333MemS3ResumeConstructNBBlockON (
334 IN OUT VOID *S3NBPtr,
335 IN OUT MEM_DATA_STRUCT *MemPtr,
336 IN UINT8 NodeID
337 )
338{
339 INT32 i;
340 MEM_NB_BLOCK *NBPtr;
341
342 NBPtr = ((S3_MEM_NB_BLOCK *)S3NBPtr)->NBPtr;
343
344 //
345 // Determine if this is the expected NB Type
346 //
347 GetLogicalIdOfSocket (MemPtr->DiesPerSystem[NodeID].SocketId, &(MemPtr->DiesPerSystem[NodeID].LogicalCpuid), &(MemPtr->StdHeader));
348 if (!MemNIsIdSupportedON (NBPtr, &(MemPtr->DiesPerSystem[NodeID].LogicalCpuid))) {
349 return FALSE;
350 }
351
352 NBPtr->MemPtr = MemPtr;
353 NBPtr->MCTPtr = &(MemPtr->DiesPerSystem[NodeID]);
354 NBPtr->PciAddr.AddressValue = MemPtr->DiesPerSystem[NodeID].PciAddr.AddressValue;
355 MemNInitNBRegTableON (NBPtr, NBPtr->NBRegTable);
356 NBPtr->Node = ((UINT8) NBPtr->PciAddr.Address.Device) - 24;
357 NBPtr->Dct = 0;
358 NBPtr->Channel = 0;
359 NBPtr->Ganged = FALSE;
360 NBPtr->NodeCount = MAX_NODES_SUPPORTED_ON;
361 NBPtr->DctCount = MAX_DCTS_PER_NODE_ON;
362
363 for (i = 0; i < EnumSize; i++) {
364 NBPtr->IsSupported[i] = FALSE;
365 }
366
367 for (i = 0; i < NumberOfHooks; i++) {
368 NBPtr->FamilySpecificHook[i] = (BOOLEAN (*) (MEM_NB_BLOCK *, VOID *)) memDefTrue;
369 }
370
371 LibAmdMemFill (NBPtr->DctCache, 0, sizeof (NBPtr->DctCache), &MemPtr->StdHeader);
372
373 NBPtr->SwitchDCT = (VOID (*) (MEM_NB_BLOCK*, UINT8)) memDefRet;
374 NBPtr->SwitchChannel = (VOID (*) (MEM_NB_BLOCK*, UINT8)) memDefRet;
375 NBPtr->MemNCmnGetSetFieldNb = MemNCmnGetSetFieldON;
376 NBPtr->GetBitField = MemNGetBitFieldNb;
377 NBPtr->SetBitField = MemNSetBitFieldNb;
378 NBPtr->MemNIsIdSupportedNb = MemNIsIdSupportedON;
379 NBPtr->ChangeNbFrequencyWrap = MemNS3ChangeNbFrequencyWrapON;
380 ((S3_MEM_NB_BLOCK *)S3NBPtr)->MemS3ExitSelfRefReg = (VOID (*) (MEM_NB_BLOCK *, AMD_CONFIG_PARAMS *)) memDefRet;
381 ((S3_MEM_NB_BLOCK *)S3NBPtr)->MemS3GetConPCIMask = MemNS3GetConPCIMaskON;
382 ((S3_MEM_NB_BLOCK *)S3NBPtr)->MemS3GetConMSRMask = (VOID (*) (MEM_NB_BLOCK *, DESCRIPTOR_GROUP *)) memDefRet;
383 ((S3_MEM_NB_BLOCK *)S3NBPtr)->MemS3Resume = MemNS3ResumeClientNb;
384 ((S3_MEM_NB_BLOCK *)S3NBPtr)->MemS3RestoreScrub = (VOID (*) (MEM_NB_BLOCK *, UINT8)) memDefRet;
385 ((S3_MEM_NB_BLOCK *)S3NBPtr)->MemS3GetRegLstPtr = MemNS3GetRegLstPtrON;
386 ((S3_MEM_NB_BLOCK *)S3NBPtr)->MemS3GetDeviceRegLst = MemNS3GetDeviceRegLstON;
387 ((S3_MEM_NB_BLOCK *)S3NBPtr)->MemS3SpecialCaseHeapSize = 0;
388
389 return TRUE;
390}
391
392/*----------------------------------------------------------------------------
393 * LOCAL FUNCTIONS
394 *
395 *----------------------------------------------------------------------------*/
396/* -----------------------------------------------------------------------------*/
397/**
398 *
399 *
400 * This function returns the conditional PCI device mask
401 *
402 * @param[in,out] *NBPtr - Pointer to the MEM_NB_BLOCK
403 * @param[in, out] *DescriptPtr - Pointer to DESCRIPTOR_GROUP
404 * @return none
405 */
406VOID
407STATIC
408MemNS3GetConPCIMaskON (
409 IN OUT MEM_NB_BLOCK *NBPtr,
410 IN OUT DESCRIPTOR_GROUP *DescriptPtr
411 )
412{
413 BIT_FIELD_NAME bitfield;
414 UINT32 RegVal;
415 UINT8 DimmMask;
416
417 DimmMask = 0;
418 for (bitfield = BFCSBaseAddr0Reg; bitfield <= BFCSBaseAddr3Reg; bitfield ++) {
419 RegVal = MemNGetBitFieldNb (NBPtr, bitfield);
420 if (RegVal & 0x1) {
421 DimmMask |= (UINT8) (1 << (((bitfield - BFCSBaseAddr0Reg) >> 1) << 1));
422 }
423 }
424
425 // Set mask before exit self refresh
426 DescriptPtr->CPCIDevice[PRESELFREF].Mask1 = 1;
427 // Set mask after exit self refresh
428 DescriptPtr->CPCIDevice[POSTSELFREF].Mask1 = 1;
429 // Set DDR3 mask if Dimms present are DDR3
430 DescriptPtr->CPCIDevice[POSTSELFREF].Mask1 |= (DescriptPtr->CPCIDevice[POSTSELFREF].Mask1 << 4);
431
432 // Set dimm mask
433 DescriptPtr->CPCIDevice[PRESELFREF].Mask2 = DimmMask;
434 DescriptPtr->CPCIDevice[POSTSELFREF].Mask2 = DimmMask;
435}
436
437/* -----------------------------------------------------------------------------*/
438/**
439 *
440 *
441 * This function returns the register list for each device for LN
442 *
443 * @param[in,out] *NBPtr - Pointer to the MEM_NB_BLOCK
444 * @param[in, out] *DescriptPtr - Pointer to DESCRIPTOR_GROUP
445 * @return UINT16 - size of the device descriptor on the target node.
446 */
447UINT16
448STATIC
449MemNS3GetRegLstPtrON (
450 IN OUT MEM_NB_BLOCK *NBPtr,
451 IN OUT DESCRIPTOR_GROUP *DescriptPtr
452 )
453{
454 UINT8 i;
455 UINT16 Size;
456 Size = 0;
457 for (i = PRESELFREF; i <= POSTSELFREF; i ++) {
458 DescriptPtr->PCIDevice[i].Type = (UINT8) (DEV_TYPE_PCI_PRE_ESR + i);
459 DescriptPtr->PCIDevice[i].Node = NBPtr->Node;
460 DescriptPtr->PCIDevice[i].RegisterListID = 0xFFFFFFFF;
461 if ((PCI_REGISTER_BLOCK_HEADER *) MemS3RegListON[PCI_LST_ESR_ON - PCI_LST_ESR_ON + i] != NULL) {
462 DescriptPtr->PCIDevice[i].RegisterListID = PCI_LST_ESR_ON + i;
463 Size += sizeof (PCI_DEVICE_DESCRIPTOR);
464 }
465 DescriptPtr->CPCIDevice[i].Type = (UINT8) (DEV_TYPE_CPCI_PRE_ESR + i);
466 DescriptPtr->CPCIDevice[i].Node = NBPtr->Node;
467 DescriptPtr->CPCIDevice[i].RegisterListID = 0xFFFFFFFF;
468 if ((CPCI_REGISTER_BLOCK_HEADER *) MemS3RegListON[CPCI_LST_ESR_ON - PCI_LST_ESR_ON + i] != NULL) {
469 DescriptPtr->CPCIDevice[i].RegisterListID = CPCI_LST_ESR_ON + i;
470 Size += sizeof (CONDITIONAL_PCI_DEVICE_DESCRIPTOR);
471 }
472 DescriptPtr->MSRDevice[i].Type = (UINT8) (DEV_TYPE_MSR_PRE_ESR + i);
473 DescriptPtr->MSRDevice[i].RegisterListID = 0xFFFFFFFF;
474 if ((MSR_REGISTER_BLOCK_HEADER *) MemS3RegListON[MSR_LST_ESR_ON - PCI_LST_ESR_ON + i] != NULL) {
475 DescriptPtr->MSRDevice[i].RegisterListID = MSR_LST_ESR_ON + i;
476 Size += sizeof (MSR_DEVICE_DESCRIPTOR);
477 }
478 DescriptPtr->CMSRDevice[i].Type = (UINT8) (DEV_TYPE_CMSR_PRE_ESR + i);
479 DescriptPtr->CMSRDevice[i].RegisterListID = 0xFFFFFFFF;
480 if ((CMSR_REGISTER_BLOCK_HEADER *) MemS3RegListON[CMSR_LST_ESR_ON - PCI_LST_ESR_ON + i] != NULL) {
481 DescriptPtr->CMSRDevice[i].RegisterListID = CMSR_LST_ESR_ON + i;
482 Size += sizeof (CONDITIONAL_MSR_DEVICE_DESCRIPTOR);
483 }
484 }
485 return Size;
486}
487
488/* -----------------------------------------------------------------------------*/
489/**
490 *
491 *
492 * This function return the register list according to the register ID.
493 *
494 * @param[in] RegisterLstID - value of the Register list ID.
495 * @param[out] **RegisterHeader - pointer to the address of the register list.
496 * @return none
497 */
498AGESA_STATUS
499STATIC
500MemNS3GetDeviceRegLstON (
501 IN UINT32 RegisterLstID,
502 OUT VOID **RegisterHeader
503 )
504{
505 if (RegisterLstID >= (sizeof (MemS3RegListON) / sizeof (VOID *))) {
506 ASSERT(FALSE); // RegisterListID exceeded size of Register list
507 return AGESA_FATAL;
508 }
509 if (MemS3RegListON[RegisterLstID] != NULL) {
510 *RegisterHeader = MemS3RegListON[RegisterLstID];
511 return AGESA_SUCCESS;
512 }
513 ASSERT(FALSE); // Device regiser list error
514 return AGESA_FATAL;
515}
516
517/* -----------------------------------------------------------------------------*/
518/**
519 *
520 *
521 * This function that set PllLockTime to default state.
522 *
523 * @param[in] AccessWidth - Access width of the register.
524 * @param[in] Address - address in PCI_ADDR format.
525 * @param[in, out] *Value - Pointer to the value to be written.
526 * @param[in, out] *ConfigPtr - Pointer to Config handle.
527 * @return none
528 */
529VOID
530STATIC
531MemNS3SetDfltPllLockTimeON (
532 IN ACCESS_WIDTH AccessWidth,
533 IN PCI_ADDR Address,
534 IN OUT VOID *Value,
535 IN OUT VOID *ConfigPtr
536 )
537{
538 UINT16 RegValue;
539
540 RegValue = 0x1838;
541 MemNS3SetBitFieldNb (AccessS3SaveWidth16, Address, &RegValue, ConfigPtr);
542}
543
544/* -----------------------------------------------------------------------------*/
545/**
546 *
547 * This function is a wrapper to call a CPU routine to change NB P-state and
548 * update NB frequency.
549 *
550 * @param[in,out] *NBPtr - Pointer to the MEM_NB_BLOCK
551 * @param[in] *NBPstate - NB Pstate
552 *
553 * @return TRUE - Succeed
554 * @return FALSE - Fail
555 */
556
557BOOLEAN
558STATIC
559MemNS3ChangeNbFrequencyWrapON (
560 IN OUT MEM_NB_BLOCK *NBPtr,
561 IN UINT32 NBPstate
562 )
563{
564 BOOLEAN Status;
565 UINT32 NBFreq;
566 UINT32 Speed;
567
568 Speed = MemNGetBitFieldNb (NBPtr, BFMemClkFreq);
569 Status = F14NbPstateInit (((Speed + 6) * 3335) / 100,
570 Speed,
571 NBPstate,
572 &NBFreq,
573 &(NBPtr->MemPtr->StdHeader));
574
575 return Status;
576}