AGESA F15: AMD family15 AGESA code
[coreboot.git] / src / vendorcode / amd / agesa / f15 / Proc / Recovery / Mem / NB / mrnmct.c
1 /* $NoKeywords:$ */
2 /**
3  * @file
4  *
5  * mrnmct.c
6  *
7  * Northbridge Common MCT supporting functions Recovery
8  *
9  * @xrefitem bom "File Content Label" "Release Content"
10  * @e project: AGESA
11  * @e sub-project: (Proc/Recovery/Mem/NB)
12  * @e \$Revision: 56555 $ @e \$Date: 2011-07-15 06:18:49 -0600 (Fri, 15 Jul 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 /*
47  *----------------------------------------------------------------------------
48  *                                MODULES USED
49  *
50  *----------------------------------------------------------------------------
51  */
52
53
54
55 #include "AGESA.h"
56 #include "amdlib.h"
57 #include "Ids.h"
58 #include "mrport.h"
59 #include "mm.h"
60 #include "mn.h"
61 #include "mt.h"
62 #include "cpuFamilyTranslation.h"
63 #include "cpuCacheInit.h"
64 #include "Filecode.h"
65 #define FILECODE PROC_RECOVERY_MEM_NB_MRNMCT_FILECODE
66
67 /*----------------------------------------------------------------------------
68  *                          DEFINITIONS AND MACROS
69  *
70  *----------------------------------------------------------------------------
71  */
72 /*----------------------------------------------------------------------------
73  *                           TYPEDEFS AND STRUCTURES
74  *
75  *----------------------------------------------------------------------------
76  */
77
78 /*----------------------------------------------------------------------------
79  *                        PROTOTYPES OF LOCAL FUNCTIONS
80  *
81  *----------------------------------------------------------------------------
82  */
83
84
85 /*----------------------------------------------------------------------------
86  *                            EXPORTED FUNCTIONS
87  *
88  *----------------------------------------------------------------------------
89  */
90
91 /* -----------------------------------------------------------------------------*/
92 /**
93  *
94  *      This function is the Recovery memory configuration function for Nb DDR3
95  *
96  *     @param[in,out]   *NBPtr   - Pointer to the MEM_NB_BLOCK
97  *
98  *     @return          AGESA_STATUS
99  *                          - AGESA_ALERT
100  *                          - AGESA_FATAL
101  *                          - AGESA_SUCCESS
102  *                          - AGESA_WARNING
103  */
104
105 AGESA_STATUS
106 MemRecNMemInitNb (
107   IN OUT   MEM_NB_BLOCK *NBPtr
108   )
109 {
110   AGESA_STATUS Status;
111   MEM_TECH_BLOCK *TechPtr;
112
113   TechPtr = NBPtr->TechPtr;
114
115   NBPtr->MemRecNInitializeMctNb (NBPtr);
116
117   if (NBPtr->IsSupported[DramModeBeforeDimmPres]) {
118     TechPtr->SetDramMode (TechPtr);
119   }
120
121   Status = AGESA_FATAL;
122   if (TechPtr->DimmPresence (TechPtr)) {
123
124     if (NBPtr->IsSupported[DramModeAfterDimmPres]) {
125       TechPtr->SetDramMode (TechPtr);
126     }
127
128     if (MemRecNAutoConfigNb (NBPtr)) {
129
130       AGESA_TESTPOINT (TpProcMemPlatformSpecificConfig, &(NBPtr->MemPtr->StdHeader));
131       if (MemRecNPlatformSpecNb (NBPtr)) {
132         AgesaHookBeforeDramInitRecovery (0, NBPtr->MemPtr);
133         AGESA_TESTPOINT (TpProcMemStartDcts, &(NBPtr->MemPtr->StdHeader));
134         MemRecNStartupDCTNb (NBPtr);
135
136         AGESA_TESTPOINT (TpProcMemMtrrConfiguration, &(NBPtr->MemPtr->StdHeader));
137         MemRecNCPUMemRecTypingNb (NBPtr);
138
139         AGESA_TESTPOINT (TpProcMemDramTraining, &(NBPtr->MemPtr->StdHeader));
140         NBPtr->TrainingFlow (NBPtr);
141
142         Status = AGESA_SUCCESS;
143       }
144     }
145   }
146
147   NBPtr->MemRecNFinalizeMctNb (NBPtr);
148
149   return Status;
150 }
151
152 /* -----------------------------------------------------------------------------*/
153 /**
154  *
155  *   This function returns a physical address of a corresponding Chip select
156  *
157  *     @return      Addr -  System Address
158  */
159
160 UINT32
161 MemRecNGetMCTSysAddrNb ( VOID )
162 {
163   UINT32 CSBase;
164
165   CSBase = (UINT32) 1 << 21;       // 1MB offset to avoid compat area from the base address.
166   if ((CSBase >= (MCT_TRNG_KEEPOUT_START << 8)) && (CSBase <= (MCT_TRNG_KEEPOUT_END << 8))) {
167     CSBase += (((MCT_TRNG_KEEPOUT_END << 8) - CSBase) + 0x0FFFFF) & 0xFFF00000;
168   }
169
170   return CSBase;
171 }
172
173 /* -----------------------------------------------------------------------------*/
174 /**
175  *
176  *   This function runs on the BSP only, it sets the fixed MTRRs for common legacy ranges.
177  *   It sets TOP_MEM and TOM2 and some variable MTRRs with WB Uncacheable type.
178  *
179  *     @param[in,out]   *NBPtr   - Pointer to the MEM_NB_BLOCK
180  *
181  */
182
183 VOID
184 MemRecNCPUMemRecTypingNb (
185   IN OUT   MEM_NB_BLOCK *NBPtr
186   )
187 {
188   S_UINT64 SMsr;
189
190   MEM_DATA_STRUCT *MemPtr;
191   MemPtr = NBPtr->MemPtr;
192
193   //
194   //======================================================================
195   // Set default values for CPU registers
196   //======================================================================
197   //
198
199   LibAmdMsrRead (SYS_CFG, (UINT64 *)&SMsr, &MemPtr->StdHeader);
200   SMsr.lo |= 0x1C0000;                // turn on modification enable bit and
201                                       // mtrr enable bits
202   LibAmdMsrWrite (SYS_CFG, (UINT64 *)&SMsr, &MemPtr->StdHeader);
203
204   SMsr.lo = SMsr.hi = 0x1E1E1E1E;
205   LibAmdMsrWrite (0x250, (UINT64 *)&SMsr, &MemPtr->StdHeader);      // 0 - 512K = WB Mem
206   LibAmdMsrWrite (0x258, (UINT64 *)&SMsr, &MemPtr->StdHeader);      // 512K - 640K = WB Mem
207
208   LibAmdMsrRead (SYS_CFG, (UINT64 *)&SMsr, &MemPtr->StdHeader);
209   SMsr.lo &= 0xFFF7FFFF;                // turn off modification enable bit
210   LibAmdMsrWrite (SYS_CFG, (UINT64 *)&SMsr, &MemPtr->StdHeader);
211   //
212   //======================================================================
213   // Set TOP_MEM and TOM2 CPU registers
214   //======================================================================
215   //
216   SMsr.hi = 0;
217   SMsr.lo = 0x08000000;
218   LibAmdMsrWrite (TOP_MEM, (UINT64 *)&SMsr, &MemPtr->StdHeader);  // TOP_MEM
219
220   // Set FS Base address for later memory accesses
221   SMsr.lo = 0;
222   LibAmdMsrWrite (FS_BASE, (UINT64 *)&SMsr, &MemPtr->StdHeader);
223
224   //
225   //======================================================================
226   // Set variable MTRR values
227   //======================================================================
228   //
229   SMsr.lo = 0x00000006;
230   LibAmdMsrWrite (0x200, (UINT64 *)&SMsr, &MemPtr->StdHeader);      // MTRRPhysBase0
231
232   SMsr.hi = NBPtr->VarMtrrHiMsk;
233   SMsr.lo = 0xF8000800;
234   LibAmdMsrWrite (0x201, (UINT64 *)&SMsr, &MemPtr->StdHeader);      // MTRRPhysMask0
235
236 }
237
238 /*-----------------------------------------------------------------------------*/
239 /**
240  *
241  *     This function returns the upper 32 bits mask for variable MTRR based on
242  *     the CPU_LOGICAL_ID.
243  *     @param[in]       *LogicalIdPtr - Pointer to the CPU_LOGICAL_ID
244  *     @param[in]       StdHeader - Header for library and services
245  *
246  *     @return          UINT32 - MTRR mask for upper 32 bits
247  *
248  */
249 UINT32
250 MemRecGetVarMtrrHiMsk (
251   IN       CPU_LOGICAL_ID *LogicalIdPtr,
252   IN       AMD_CONFIG_PARAMS *StdHeader
253   )
254 {
255   UINT8 TempNotCare;
256   CPU_SPECIFIC_SERVICES *FamilySpecificServices;
257   CACHE_INFO *CacheInfoPtr;
258
259   GetCpuServicesFromLogicalId (LogicalIdPtr, (CONST CPU_SPECIFIC_SERVICES **)&FamilySpecificServices, StdHeader);
260   FamilySpecificServices->GetCacheInfo (FamilySpecificServices, (CONST VOID **) &CacheInfoPtr, &TempNotCare, StdHeader);
261   return (UINT32) (CacheInfoPtr->VariableMtrrMask >> 32);
262 }
263
264 /*-----------------------------------------------------------------------------
265  *
266  *
267  *     This function re-enable phy compensation.
268  *
269  *     @param[in,out]  *NBPtr     - Pointer to the MEM_NB_BLOCK
270  *     @param[in,out]  OptParam   - Optional parameter
271  *
272  *     @return    TRUE
273  * ----------------------------------------------------------------------------
274  */
275 BOOLEAN
276 MemRecNReEnablePhyCompNb (
277   IN OUT   MEM_NB_BLOCK *NBPtr,
278   IN OUT   VOID *OptParam
279   )
280 {
281   UINT8 Dct;
282
283   Dct = NBPtr->Dct;
284
285   NBPtr->SwitchDCT (NBPtr, 0);
286   // Clear DisableCal and set DisablePredriverCal
287   MemRecNSetBitFieldNb (NBPtr, BFDisablePredriverCal, 0x2000);
288   NBPtr->SwitchDCT (NBPtr, Dct);
289
290   return TRUE;
291 }
292 /*----------------------------------------------------------------------------
293  *                              LOCAL FUNCTIONS
294  *
295  *----------------------------------------------------------------------------
296  */