7 * Common Technology file
9 * @xrefitem bom "File Content Label" "Release Content"
11 * @e sub-project: (Mem/Tech)
12 * @e \$Revision: 56279 $ @e \$Date: 2011-07-11 13:11:28 -0600 (Mon, 11 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 *----------------------------------------------------------------------------
64 #define FILECODE PROC_MEM_TECH_MT_FILECODE
65 /*----------------------------------------------------------------------------
66 * DEFINITIONS AND MACROS
68 *----------------------------------------------------------------------------
71 /*----------------------------------------------------------------------------
72 * TYPEDEFS AND STRUCTURES
74 *----------------------------------------------------------------------------
77 /*----------------------------------------------------------------------------
78 * PROTOTYPES OF LOCAL FUNCTIONS
80 *----------------------------------------------------------------------------
84 MemTDefaultTechnologyHook (
85 IN OUT MEM_TECH_BLOCK *TechPtr,
88 /*----------------------------------------------------------------------------
91 *----------------------------------------------------------------------------
94 /* -----------------------------------------------------------------------------*/
97 * This function is the default return for non-training technology features
99 * @param[in,out] *TechPtr - Pointer to the MEM_TECH_BLOCK
103 IN OUT MEM_TECH_BLOCK *TechPtr
109 /* -----------------------------------------------------------------------------*/
112 * This function sets the TestFail bit for all CS that fail training.
114 * @param[in,out] *TechPtr - Pointer to the MEM_TECH_BLOCK
118 IN OUT MEM_TECH_BLOCK *TechPtr
125 NBPtr = TechPtr->NBPtr;
126 for (Dct = 0; Dct < NBPtr->DctCount; Dct ++) {
127 NBPtr->SwitchDCT (NBPtr, Dct);
128 NBPtr->DCTPtr->Timings.CsEnabled &= ~NBPtr->DCTPtr->Timings.CsTrainFail;
129 for (ChipSel = 0; ChipSel < MAX_CS_PER_CHANNEL; ChipSel ++) {
130 if ((NBPtr->DCTPtr->Timings.CsTrainFail & ((UINT16)1 << ChipSel)) != 0) {
131 NBPtr->SetBitField (NBPtr, (BFCSBaseAddr0Reg + ChipSel), (UINT32)1 << BFTestFail);
137 /* -----------------------------------------------------------------------------*/
140 * This function sets the initial controller environment before training.
142 * @param[in,out] *TechPtr - Pointer to the MEM_TECH_BLOCK
148 IN OUT MEM_TECH_BLOCK *TechPtr
152 MEM_DATA_STRUCT *MemPtr;
155 NBPtr = TechPtr->NBPtr;
156 MemPtr = NBPtr->MemPtr;
158 LibAmdReadCpuReg (CR4_REG, &TechPtr->CR4reg);
159 LibAmdWriteCpuReg (CR4_REG, TechPtr->CR4reg | ((UINT32)1 << 9)); // enable SSE2
161 LibAmdMsrRead (HWCR, (UINT64 *) (&SMsr), &MemPtr->StdHeader); // HWCR
162 TechPtr->HwcrLo = SMsr.lo;
163 SMsr.lo |= 0x00020000; // turn on HWCR.wrap32dis
164 SMsr.lo &= 0xFFFF7FFF; // turn off HWCR.SSEDIS
165 LibAmdMsrWrite (HWCR, (UINT64 *) (&SMsr), &MemPtr->StdHeader);
167 TechPtr->DramEcc = (UINT8) NBPtr->GetBitField (NBPtr, BFDramEccEn);
168 NBPtr->SetBitField (NBPtr, BFDramEccEn, 0); // Disable ECC
171 /* -----------------------------------------------------------------------------*/
174 * This function sets the final controller environment after training.
176 * @param[in,out] *TechPtr - Pointer to the MEM_TECH_BLOCK
182 IN OUT MEM_TECH_BLOCK *TechPtr
186 MEM_DATA_STRUCT *MemPtr;
189 NBPtr = TechPtr->NBPtr;
190 MemPtr = NBPtr->MemPtr;
192 LibAmdWriteCpuReg (CR4_REG, TechPtr->CR4reg);
194 LibAmdMsrRead (HWCR, (UINT64 *)&SMsr, &MemPtr->StdHeader);
195 SMsr.lo = TechPtr->HwcrLo;
196 LibAmdMsrWrite (HWCR, (UINT64 *)&SMsr, &MemPtr->StdHeader);
198 NBPtr->SetBitField (NBPtr, BFDramEccEn, TechPtr->DramEcc);
201 /* -----------------------------------------------------------------------------*/
204 * This function sets all the bytelanes/nibbles to the same delay value
206 * @param[in,out] *TechPtr - Pointer to the MEM_TECH_BLOCK
207 * @param[in] Dly - Delay value to set
212 MemTSetDQSDelayAllCSR (
213 IN OUT MEM_TECH_BLOCK *TechPtr,
219 MaxBytelanes = (TechPtr->NBPtr->MCTPtr->Status[SbEccDimms] && TechPtr->NBPtr->IsSupported[EccByteTraining]) ? 9 : 8;
221 for (i = 0; i < MaxBytelanes; i++) {
222 TechPtr->SetDQSDelayCSR (TechPtr, i, Dly);
224 TechPtr->NBPtr->FamilySpecificHook[RegAccessFence] (TechPtr->NBPtr, NULL);
226 /*-----------------------------------------------------------------------------
229 * This function is used to intialize common technology functions
231 * @param[in,out] *TechPtr - Pointer to the MEM_TECH_BLOCK
232 * ----------------------------------------------------------------------------
236 IN OUT MEM_TECH_BLOCK *TechPtr
240 for (i = 0; i < NumberOfTechHooks; i++) {
241 TechPtr->TechnologySpecificHook[i] = MemTDefaultTechnologyHook;
244 /*-----------------------------------------------------------------------------
247 * This function is an empty function used to intialize TechnologySpecificHook array
249 * @param[in,out] *TechPtr - Pointer to the MEM_NB_BLOCK
250 * @param[in,out] OptParam - Optional parameter
252 * @return FALSE - always
253 * ----------------------------------------------------------------------------
257 MemTDefaultTechnologyHook (
258 IN OUT MEM_TECH_BLOCK *TechPtr,
259 IN OUT VOID *OptParam