blob: 6382745bac32292bd04bf8dfe24a1d18e120a58f [file] [log] [blame]
Frank Vibrans2b4c8312011-02-14 18:30:54 +00001/* $NoKeywords:$ */
2/**
3 * @file
4 *
5 * lvddr3.c
6 *
7 * Voltage change for DDR3 DIMMs.
8 *
9 * @xrefitem bom "File Content Label" "Release Content"
10 * @e project: AGESA
11 * @e sub-project: (Mem/Feat/LVDDR3)
12 * @e \$Revision: 35136 $ @e \$Date: 2010-07-16 11:29:48 +0800 (Fri, 16 Jul 2010) $
13 *
14 **/
15/*
16 *****************************************************************************
17 *
18 * Copyright (c) 2011, Advanced Micro Devices, Inc.
19 * All rights reserved.
Edward O'Callaghan1542a6f2014-07-06 19:24:06 +100020 *
Frank Vibrans2b4c8312011-02-14 18:30:54 +000021 * 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.
Edward O'Callaghan1542a6f2014-07-06 19:24:06 +100028 * * Neither the name of Advanced Micro Devices, Inc. nor the names of
29 * its contributors may be used to endorse or promote products derived
Frank Vibrans2b4c8312011-02-14 18:30:54 +000030 * from this software without specific prior written permission.
Edward O'Callaghan1542a6f2014-07-06 19:24:06 +100031 *
Frank Vibrans2b4c8312011-02-14 18:30:54 +000032 * 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.
Edward O'Callaghan1542a6f2014-07-06 19:24:06 +100042 *
Frank Vibrans2b4c8312011-02-14 18:30:54 +000043 * ***************************************************************************
44 *
45 */
46
47/*
48 *----------------------------------------------------------------------------
49 * MODULES USED
50 *
51 *----------------------------------------------------------------------------
52 */
53
54
55
56#include "AGESA.h"
57#include "amdlib.h"
58#include "Ids.h"
59#include "mm.h"
60#include "mn.h"
61#include "mt.h"
62#include "Filecode.h"
63CODE_GROUP (G2_PEI)
64RDATA_GROUP (G2_PEI)
65
66#define FILECODE PROC_MEM_FEAT_LVDDR3_MFLVDDR3_FILECODE
67/* features */
68#include "mflvddr3.h"
69
70
71/*----------------------------------------------------------------------------
72 * DEFINITIONS AND MACROS
73 *
74 *----------------------------------------------------------------------------
75 */
76
77/*----------------------------------------------------------------------------
78 * TYPEDEFS AND STRUCTURES
79 *
80 *----------------------------------------------------------------------------
81 */
82
83/*----------------------------------------------------------------------------
84 * PROTOTYPES OF LOCAL FUNCTIONS
85 *
86 *----------------------------------------------------------------------------
87 */
88
89/*----------------------------------------------------------------------------
90 * EXPORTED FUNCTIONS
91 *
92 *----------------------------------------------------------------------------
93 */
94
95/*-----------------------------------------------------------------------------*/
96/**
97 *
98 * This function calculate the common lowest voltage supported by all DDR3
99 * DIMMs in the system. This function only needs to be called on BSP.
100 *
101 * @param[in, out] *NBPtr - Pointer to NB block
102 *
103 * @return TRUE - This feature is enabled.
104 * @return FALSE - This feature is not enabled.
105 */
106
107BOOLEAN
108MemFLvDdr3 (
109 IN OUT MEM_NB_BLOCK *NBPtr
110 )
111{
112 CH_DEF_STRUCT *ChannelPtr;
113 MEM_TECH_BLOCK *TechPtr;
114 MEM_SHARED_DATA *mmSharedPtr;
115 UINT8 Dct;
116 UINT8 Channel;
117 UINT8 Dimm;
118 UINT8 *SpdBufferPtr;
119 UINT8 VDDByte;
120 UINT8 VoltageMap;
121
122 mmSharedPtr = NBPtr->SharedPtr;
123 TechPtr = NBPtr->TechPtr;
124 VoltageMap = 0xFF;
125
126 for (Dct = 0; Dct < NBPtr->DctCount; Dct++) {
127 NBPtr->SwitchDCT (NBPtr, Dct);
128 for (Channel = 0; Channel < NBPtr->ChannelCount; Channel++) {
129 NBPtr->SwitchChannel (NBPtr, Channel);
130 ChannelPtr = NBPtr->ChannelPtr;
131 for (Dimm = 0; Dimm < MAX_DIMMS_PER_CHANNEL; Dimm++) {
132 if (TechPtr->GetDimmSpdBuffer (TechPtr, &SpdBufferPtr, Dimm)) {
133 // SPD byte 6: Module Nominal Voltage, VDD
134 // 1.5v - bit 0
135 // 1.35v - bit 1
136 // 1.2v - bit 2
137 VDDByte = SpdBufferPtr[MNVVDD];
138 // Reverse the 1.5V operable bit. So its encoding can be consistent
139 // with that of 1.35V and 1.25V operable bit.
140 VDDByte ^= 1;
141 ASSERT (VDDByte != 0);
142
143 if (mmSharedPtr->VoltageMap != 0) {
144 // Get the common supported voltage map
145 VoltageMap &= VDDByte;
146 } else {
147 // This is the second execution of all the loop as no common voltage is found
148 if (VDDByte == (1 << VOLT1_5)) {
149 // Always exclude 1.5V dimm if no common voltage is found
150 ChannelPtr->DimmExclude |= (UINT16) 1 << Dimm;
151 }
152 }
153 }
154 }
155 if (mmSharedPtr->VoltageMap == 0) {
156 NBPtr->DCTPtr->Timings.DimmExclude |= ChannelPtr->DimmExclude;
157 }
158 }
159 }
160
161 if (mmSharedPtr->VoltageMap != 0) {
162 mmSharedPtr->VoltageMap &= VoltageMap;
163 }
164
165 return TRUE;
166}
167
168/*----------------------------------------------------------------------------
169 * LOCAL FUNCTIONS
170 *
171 *----------------------------------------------------------------------------
172 */