AGESA F15: AMD family15 AGESA code
[coreboot.git] / src / vendorcode / amd / agesa / f15 / Proc / Mem / mfs3.h
1 /* $NoKeywords:$ */
2 /**
3  * @file
4  *
5  * mfS3.h
6  *
7  * S3 resume memory related functions.
8  *
9  * @xrefitem bom "File Content Label" "Release Content"
10  * @e project: AGESA
11  * @e sub-project: (Mem/Feat/S3)
12  * @e \$Revision: 51373 $ @e \$Date: 2011-04-21 13:10:59 -0600 (Thu, 21 Apr 2011) $
13  *
14  **/
15 /*****************************************************************************
16 *
17 * Copyright (C) 2012 Advanced Micro Devices, Inc.
18 * All rights reserved.
19 *
20 * Redistribution and use in source and binary forms, with or without
21 * modification, are permitted provided that the following conditions are met:
22 *     * Redistributions of source code must retain the above copyright
23 *       notice, this list of conditions and the following disclaimer.
24 *     * Redistributions in binary form must reproduce the above copyright
25 *       notice, this list of conditions and the following disclaimer in the
26 *       documentation and/or other materials provided with the distribution.
27 *     * Neither the name of Advanced Micro Devices, Inc. nor the names of
28 *       its contributors may be used to endorse or promote products derived
29 *       from this software without specific prior written permission.
30 *
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
32 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
33 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
34 * DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY
35 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
36 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
37 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
38 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
39 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
40 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 *
42 * ***************************************************************************
43 *
44 */
45
46 #ifndef _MFS3_H_
47 #define _MFS3_H_
48
49 /*----------------------------------------------------------------------------
50  *   Mixed (DEFINITIONS AND MACROS / TYPEDEFS, STRUCTURES, ENUMS)
51  *
52  *----------------------------------------------------------------------------
53  */
54
55 /*-----------------------------------------------------------------------------
56  *                         DEFINITIONS AND MACROS
57  *
58  *-----------------------------------------------------------------------------
59  */
60 #define PRESELFREF 0
61 #define POSTSELFREF 1
62 #define DCT0 0
63 #define DCT1 1
64 #define DCT0_MASK 0x1
65 #define DCT1_MASK 0x2
66 #define DCT0_NBPSTATE_SUPPORT_MASK 0x4
67 #define DCT1_NBPSTATE_SUPPORT_MASK 0x8
68 #define DCT0_DDR3_MASK 0x10
69 #define DCT1_DDR3_MASK 0x20
70 #define NODE_WITHOUT_DIMM_MASK 0x80
71 #define DCT0_ANY_DIMM_MASK 0x55
72 #define DCT1_ANY_DIMM_MASK 0xAA
73 #define ANY_DIMM_MASK 0xFF
74
75 #define DCT_PHY_FLAG 0
76 #define DCT_EXTRA_FLAG 1
77 #define SET_S3_SPECIAL_OFFSET(AccessType, Dct, Offset) ((AccessType << 11) | (Dct << 10) | Offset)
78
79 /*----------------------------------------------------------------------------
80  *                         TYPEDEFS, STRUCTURES, ENUMS
81  *
82  *----------------------------------------------------------------------------
83  */
84 /// struct for all the descriptor for pre exit self refresh and post exit self refresh
85 typedef struct _DESCRIPTOR_GROUP {
86   PCI_DEVICE_DESCRIPTOR PCIDevice[2];  ///< PCI device descriptor
87   CONDITIONAL_PCI_DEVICE_DESCRIPTOR CPCIDevice[2];  ///< Conditional PCI device descriptor
88   MSR_DEVICE_DESCRIPTOR MSRDevice[2];  ///< MSR device descriptor
89   CONDITIONAL_MSR_DEVICE_DESCRIPTOR CMSRDevice[2];  ///< Conditional MSR device descriptor
90 } DESCRIPTOR_GROUP;
91
92 /// Northbridge block to be used in S3 resume and save.
93 typedef struct _S3_MEM_NB_BLOCK {
94   UINT8 MemS3SpecialCaseHeapSize; ///< Heap size for the special case register heap.
95   struct _MEM_NB_BLOCK *NBPtr;    ///< Pointer to the north bridge block.
96   VOID (*MemS3ExitSelfRefReg) (MEM_NB_BLOCK *NBPtr, AMD_CONFIG_PARAMS *StdHeaderPtr); ///< S3 Exit self refresh register
97   VOID (*MemS3GetConPCIMask) (MEM_NB_BLOCK *NBPtr, DESCRIPTOR_GROUP *DescriptPtr); ///< Get conditional mask for PCI register setting
98   VOID (*MemS3GetConMSRMask) (MEM_NB_BLOCK *NBPtr, DESCRIPTOR_GROUP *DescriptPtr); ///< Get conditional mask for MSR register setting
99   UINT16 (*MemS3GetRegLstPtr) (MEM_NB_BLOCK *NBPtr, DESCRIPTOR_GROUP *DescriptPtr); ///< Get register list pointer for both PCI and MSR register
100   BOOLEAN (*MemS3Resume) (struct _S3_MEM_NB_BLOCK *S3NBPtr, UINT8 NodeID);///< Exit Self Refresh
101   VOID (*MemS3RestoreScrub) (MEM_NB_BLOCK *NBPtr, UINT8 NodeID);///< Restore scrubber base
102   AGESA_STATUS (*MemS3GetDeviceRegLst) (UINT32 ReigsterLstID, VOID **RegisterHeader); ///< Get register list for a device
103 } S3_MEM_NB_BLOCK;
104
105 /// Header for heap space to store the special case register.
106 typedef struct _S3_SPECIAL_CASE_HEAP_HEADER {
107   UINT8 Node;  ///< Node ID for the the header
108   UINT8 Offset;  ///< Offset for the target node
109 } S3_SPECIAL_CASE_HEAP_HEADER;
110 /*----------------------------------------------------------------------------
111  *                           FUNCTIONS PROTOTYPE
112  *
113  *----------------------------------------------------------------------------
114  */
115 AGESA_STATUS
116 AmdMemS3Resume (
117   IN   AMD_CONFIG_PARAMS *StdHeader
118   );
119
120 AGESA_STATUS
121 MemS3ResumeInitNB (
122   IN       AMD_CONFIG_PARAMS *StdHeader
123   );
124
125 AGESA_STATUS
126 MemS3Deallocate (
127   IN   AMD_CONFIG_PARAMS *StdHeader
128   );
129
130 AGESA_STATUS
131 MemFS3GetPciDeviceRegisterList (
132   IN       PCI_DEVICE_DESCRIPTOR     *Device,
133      OUT   PCI_REGISTER_BLOCK_HEADER **RegisterHdr,
134   IN       AMD_CONFIG_PARAMS         *StdHeader
135   );
136
137 AGESA_STATUS
138 MemFS3GetCPciDeviceRegisterList (
139   IN       CONDITIONAL_PCI_DEVICE_DESCRIPTOR *Device,
140      OUT   CPCI_REGISTER_BLOCK_HEADER        **RegisterHdr,
141   IN       AMD_CONFIG_PARAMS                 *StdHeader
142   );
143
144 AGESA_STATUS
145 MemFS3GetMsrDeviceRegisterList (
146   IN       MSR_DEVICE_DESCRIPTOR     *Device,
147      OUT   MSR_REGISTER_BLOCK_HEADER **RegisterHdr,
148   IN       AMD_CONFIG_PARAMS         *StdHeader
149   );
150
151 AGESA_STATUS
152 MemFS3GetCMsrDeviceRegisterList (
153   IN       CONDITIONAL_MSR_DEVICE_DESCRIPTOR     *Device,
154      OUT   CMSR_REGISTER_BLOCK_HEADER            **RegisterHdr,
155   IN       AMD_CONFIG_PARAMS                     *StdHeader
156   );
157
158 AGESA_STATUS
159 MemFS3GetDeviceList (
160   IN OUT   DEVICE_BLOCK_HEADER **DeviceBlockHdrPtr,
161   IN       AMD_CONFIG_PARAMS *StdHeader
162   );
163
164 VOID
165 MemFS3Wait10ns (
166   IN       UINT32 Count,
167   IN OUT   MEM_DATA_STRUCT *MemPtr
168   );
169
170 BOOLEAN
171 MemNS3ResumeNb (
172   IN OUT   S3_MEM_NB_BLOCK *S3NBPtr,
173   IN       UINT8 NodeID
174   );
175
176 BOOLEAN
177 MemNS3ResumeClientNb (
178   IN OUT   S3_MEM_NB_BLOCK *S3NBPtr,
179   IN       UINT8 NodeID
180   );
181
182 BOOLEAN
183 MemNS3ResumeUNb (
184   IN OUT   S3_MEM_NB_BLOCK *S3NBPtr,
185   IN       UINT8 NodeID
186   );
187
188 VOID
189 MemNS3GetConPCIMaskNb (
190   IN OUT   MEM_NB_BLOCK *NBPtr,
191   IN OUT   DESCRIPTOR_GROUP *DescriptPtr
192   );
193
194 VOID
195 MemNS3GetConPCIMaskUnb (
196   IN OUT   MEM_NB_BLOCK *NBPtr,
197   IN OUT   DESCRIPTOR_GROUP *DescriptPtr
198   );
199
200 VOID
201 MemNS3GetCSRNb (
202   IN       ACCESS_WIDTH AccessWidth,
203   IN       PCI_ADDR Address,
204   IN       VOID *Value,
205   IN OUT   VOID *ConfigPtr
206   );
207
208 VOID
209 MemNS3SetCSRNb (
210   IN       ACCESS_WIDTH AccessWidth,
211   IN       PCI_ADDR Address,
212   IN OUT   VOID *Value,
213   IN OUT   VOID *ConfigPtr
214   );
215
216 VOID
217 MemNS3GetBitFieldNb (
218   IN       ACCESS_WIDTH AccessWidth,
219   IN       PCI_ADDR Address,
220   IN OUT   VOID *Value,
221   IN OUT   VOID *ConfigPtr
222   );
223
224 VOID
225 MemNS3SetBitFieldNb (
226   IN       ACCESS_WIDTH AccessWidth,
227   IN       PCI_ADDR Address,
228   IN OUT   VOID *Value,
229   IN OUT   VOID *ConfigPtr
230   );
231
232 VOID
233 MemNS3RestoreScrubNb (
234   IN OUT   MEM_NB_BLOCK *NBPtr,
235   IN       UINT8 Node
236   );
237
238 AGESA_STATUS
239 MemS3InitNB (
240   IN OUT   S3_MEM_NB_BLOCK **S3NBPtr,
241   IN OUT   MEM_DATA_STRUCT **MemPtr,
242   IN OUT   MEM_MAIN_DATA_BLOCK *mmData,
243   IN       AMD_CONFIG_PARAMS *StdHeader
244   );
245
246 VOID
247 MemNS3DisNbPsDbgNb (
248   IN       ACCESS_WIDTH AccessWidth,
249   IN       PCI_ADDR Address,
250   IN OUT   VOID *Value,
251   IN OUT   VOID *ConfigPtr
252   );
253
254 VOID
255 MemNS3EnNbPsDbg1Nb (
256   IN       ACCESS_WIDTH AccessWidth,
257   IN       PCI_ADDR Address,
258   IN OUT   VOID *Value,
259   IN OUT   VOID *ConfigPtr
260   );
261
262 VOID
263 MemNS3SetDynModeChangeNb (
264   IN       ACCESS_WIDTH AccessWidth,
265   IN       PCI_ADDR Address,
266   IN OUT   VOID *Value,
267   IN OUT   VOID *ConfigPtr
268   );
269
270 VOID
271 MemNS3DisableChannelNb (
272   IN       ACCESS_WIDTH AccessWidth,
273   IN       PCI_ADDR Address,
274   IN OUT   VOID *Value,
275   IN OUT   VOID *ConfigPtr
276   );
277
278 VOID
279 MemNS3SetDisAutoCompUnb (
280   IN       ACCESS_WIDTH AccessWidth,
281   IN       PCI_ADDR Address,
282   IN OUT   VOID *Value,
283   IN OUT   VOID *ConfigPtr
284   );
285
286 VOID
287 MemNS3SetPreDriverCalUnb (
288   IN       ACCESS_WIDTH AccessWidth,
289   IN       PCI_ADDR Address,
290   IN OUT   VOID *Value,
291   IN OUT   VOID *ConfigPtr
292   );
293
294 BOOLEAN
295 MemNS3DctCfgSelectUnb (
296   IN OUT   MEM_NB_BLOCK *NBPtr,
297   IN       VOID *Dct
298   );
299
300 VOID
301 MemNS3GetNBPStateDepRegUnb (
302   IN       ACCESS_WIDTH AccessWidth,
303   IN       PCI_ADDR Address,
304   IN OUT   VOID *Value,
305   IN OUT   VOID *ConfigPtr
306   );
307
308 VOID
309 MemNS3SetNBPStateDepRegUnb (
310   IN       ACCESS_WIDTH AccessWidth,
311   IN       PCI_ADDR Address,
312   IN OUT   VOID *Value,
313   IN OUT   VOID *ConfigPtr
314   );
315
316 VOID
317 MemNS3SaveNBRegiserUnb (
318   IN       ACCESS_WIDTH AccessWidth,
319   IN       PCI_ADDR Address,
320   IN OUT   VOID *Value,
321   IN OUT   VOID *ConfigPtr
322   );
323
324 VOID
325 MemNS3RestoreNBRegiserUnb (
326   IN       ACCESS_WIDTH AccessWidth,
327   IN       PCI_ADDR Address,
328   IN OUT   VOID *Value,
329   IN OUT   VOID *ConfigPtr
330   );
331
332 VOID
333 MemNS3SetMemClkFreqValUnb (
334   IN       ACCESS_WIDTH AccessWidth,
335   IN       PCI_ADDR Address,
336   IN OUT   VOID *Value,
337   IN OUT   VOID *ConfigPtr
338   );
339
340 VOID
341 MemNS3ChangeMemPStateContextNb (
342   IN       ACCESS_WIDTH AccessWidth,
343   IN       PCI_ADDR Address,
344   IN OUT   VOID *Value,
345   IN OUT   VOID *ConfigPtr
346   );
347
348 VOID
349 MemNS3SetPhyClkDllFineClientNb (
350   IN       ACCESS_WIDTH AccessWidth,
351   IN       PCI_ADDR Address,
352   IN OUT   VOID *Value,
353   IN OUT   VOID *ConfigPtr
354   );
355
356 #endif //_MFS3_H_