7 * Northbridge Common MCT supporting functions Recovery
9 * @xrefitem bom "File Content Label" "Release Content"
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) $
15 /*****************************************************************************
17 * Copyright (C) 2012 Advanced Micro Devices, Inc.
18 * All rights reserved.
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.
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.
42 * ***************************************************************************
47 *----------------------------------------------------------------------------
50 *----------------------------------------------------------------------------
62 #include "cpuFamilyTranslation.h"
63 #include "cpuCacheInit.h"
65 #define FILECODE PROC_RECOVERY_MEM_NB_MRNMCT_FILECODE
67 /*----------------------------------------------------------------------------
68 * DEFINITIONS AND MACROS
70 *----------------------------------------------------------------------------
72 /*----------------------------------------------------------------------------
73 * TYPEDEFS AND STRUCTURES
75 *----------------------------------------------------------------------------
78 /*----------------------------------------------------------------------------
79 * PROTOTYPES OF LOCAL FUNCTIONS
81 *----------------------------------------------------------------------------
85 /*----------------------------------------------------------------------------
88 *----------------------------------------------------------------------------
91 /* -----------------------------------------------------------------------------*/
94 * This function is the Recovery memory configuration function for Nb DDR3
96 * @param[in,out] *NBPtr - Pointer to the MEM_NB_BLOCK
98 * @return AGESA_STATUS
107 IN OUT MEM_NB_BLOCK *NBPtr
111 MEM_TECH_BLOCK *TechPtr;
113 TechPtr = NBPtr->TechPtr;
115 NBPtr->MemRecNInitializeMctNb (NBPtr);
117 if (NBPtr->IsSupported[DramModeBeforeDimmPres]) {
118 TechPtr->SetDramMode (TechPtr);
121 Status = AGESA_FATAL;
122 if (TechPtr->DimmPresence (TechPtr)) {
124 if (NBPtr->IsSupported[DramModeAfterDimmPres]) {
125 TechPtr->SetDramMode (TechPtr);
128 if (MemRecNAutoConfigNb (NBPtr)) {
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);
136 AGESA_TESTPOINT (TpProcMemMtrrConfiguration, &(NBPtr->MemPtr->StdHeader));
137 MemRecNCPUMemRecTypingNb (NBPtr);
139 AGESA_TESTPOINT (TpProcMemDramTraining, &(NBPtr->MemPtr->StdHeader));
140 NBPtr->TrainingFlow (NBPtr);
142 Status = AGESA_SUCCESS;
147 NBPtr->MemRecNFinalizeMctNb (NBPtr);
152 /* -----------------------------------------------------------------------------*/
155 * This function returns a physical address of a corresponding Chip select
157 * @return Addr - System Address
161 MemRecNGetMCTSysAddrNb ( VOID )
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;
173 /* -----------------------------------------------------------------------------*/
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.
179 * @param[in,out] *NBPtr - Pointer to the MEM_NB_BLOCK
184 MemRecNCPUMemRecTypingNb (
185 IN OUT MEM_NB_BLOCK *NBPtr
190 MEM_DATA_STRUCT *MemPtr;
191 MemPtr = NBPtr->MemPtr;
194 //======================================================================
195 // Set default values for CPU registers
196 //======================================================================
199 LibAmdMsrRead (SYS_CFG, (UINT64 *)&SMsr, &MemPtr->StdHeader);
200 SMsr.lo |= 0x1C0000; // turn on modification enable bit and
202 LibAmdMsrWrite (SYS_CFG, (UINT64 *)&SMsr, &MemPtr->StdHeader);
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
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);
212 //======================================================================
213 // Set TOP_MEM and TOM2 CPU registers
214 //======================================================================
217 SMsr.lo = 0x08000000;
218 LibAmdMsrWrite (TOP_MEM, (UINT64 *)&SMsr, &MemPtr->StdHeader); // TOP_MEM
220 // Set FS Base address for later memory accesses
222 LibAmdMsrWrite (FS_BASE, (UINT64 *)&SMsr, &MemPtr->StdHeader);
225 //======================================================================
226 // Set variable MTRR values
227 //======================================================================
229 SMsr.lo = 0x00000006;
230 LibAmdMsrWrite (0x200, (UINT64 *)&SMsr, &MemPtr->StdHeader); // MTRRPhysBase0
232 SMsr.hi = NBPtr->VarMtrrHiMsk;
233 SMsr.lo = 0xF8000800;
234 LibAmdMsrWrite (0x201, (UINT64 *)&SMsr, &MemPtr->StdHeader); // MTRRPhysMask0
238 /*-----------------------------------------------------------------------------*/
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
246 * @return UINT32 - MTRR mask for upper 32 bits
250 MemRecGetVarMtrrHiMsk (
251 IN CPU_LOGICAL_ID *LogicalIdPtr,
252 IN AMD_CONFIG_PARAMS *StdHeader
256 CPU_SPECIFIC_SERVICES *FamilySpecificServices;
257 CACHE_INFO *CacheInfoPtr;
259 GetCpuServicesFromLogicalId (LogicalIdPtr, (CONST CPU_SPECIFIC_SERVICES **)&FamilySpecificServices, StdHeader);
260 FamilySpecificServices->GetCacheInfo (FamilySpecificServices, (CONST VOID **) &CacheInfoPtr, &TempNotCare, StdHeader);
261 return (UINT32) (CacheInfoPtr->VariableMtrrMask >> 32);
264 /*-----------------------------------------------------------------------------
267 * This function re-enable phy compensation.
269 * @param[in,out] *NBPtr - Pointer to the MEM_NB_BLOCK
270 * @param[in,out] OptParam - Optional parameter
273 * ----------------------------------------------------------------------------
276 MemRecNReEnablePhyCompNb (
277 IN OUT MEM_NB_BLOCK *NBPtr,
278 IN OUT VOID *OptParam
285 NBPtr->SwitchDCT (NBPtr, 0);
286 // Clear DisableCal and set DisablePredriverCal
287 MemRecNSetBitFieldNb (NBPtr, BFDisablePredriverCal, 0x2000);
288 NBPtr->SwitchDCT (NBPtr, Dct);
292 /*----------------------------------------------------------------------------
295 *----------------------------------------------------------------------------