AGESA F15: AMD family15 AGESA code
[coreboot.git] / src / vendorcode / amd / agesa / f15 / Proc / Mem / Feat / ECC / mfemp.c
1 /* $NoKeywords:$ */
2 /**
3  * @file
4  *
5  * mfemp.c
6  *
7  * Feature EMP initialization functions
8  *
9  * @xrefitem bom "File Content Label" "Release Content"
10  * @e project: AGESA
11  * @e sub-project: (Mem/Feat/ECC)
12  * @e \$Revision: 53955 $ @e \$Date: 2011-05-29 20:54:54 -0600 (Sun, 29 May 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
49 #include "AGESA.h"
50 #include "mm.h"
51 #include "mn.h"
52 #include "Ids.h"
53 #include "GeneralServices.h"
54 #include "Filecode.h"
55 CODE_GROUP (G2_PEI)
56 RDATA_GROUP (G2_PEI)
57
58 #define FILECODE PROC_MEM_FEAT_ECC_MFEMP_FILECODE
59 /*----------------------------------------------------------------------------
60  *                          DEFINITIONS AND MACROS
61  *
62  *----------------------------------------------------------------------------
63  */
64
65 /*----------------------------------------------------------------------------
66  *                           TYPEDEFS AND STRUCTURES
67  *
68  *----------------------------------------------------------------------------
69  */
70
71 /*----------------------------------------------------------------------------
72  *                        PROTOTYPES OF LOCAL FUNCTIONS
73  *
74  *----------------------------------------------------------------------------
75  */
76 BOOLEAN
77 STATIC
78 IsPowerOfTwo (
79   IN       UINT32 TestNumber
80   );
81
82 BOOLEAN
83 MemFInitEMP (
84   IN OUT   MEM_NB_BLOCK *NBPtr
85   );
86
87 /*
88  *-----------------------------------------------------------------------------
89  *                                EXPORTED FUNCTIONS
90  *
91  *-----------------------------------------------------------------------------
92  */
93
94 extern BUILD_OPT_CFG UserOptions;
95
96 /* -----------------------------------------------------------------------------*/
97 /**
98  *
99  *
100  *      This function initializes EMP (Enhanced Memory Protection)
101  *
102  *     @param[in,out]   *NBPtr   - Pointer to the MEM_NB_BLOCK
103  *
104  *     @return          TRUE -  This feature is enabled.
105  *     @return          FALSE - This feature is not enabled.
106  */
107
108 BOOLEAN
109 MemFInitEMP (
110   IN OUT   MEM_NB_BLOCK *NBPtr
111   )
112 {
113   MEM_PARAMETER_STRUCT *RefPtr;
114   DIE_STRUCT *MCTPtr;
115
116   ASSERT (NBPtr != NULL);
117
118   RefPtr = NBPtr->RefPtr;
119   MCTPtr = NBPtr->MCTPtr;
120   if (RefPtr->EnableEccFeature) {
121     if (NBPtr->GetBitField (NBPtr, BFEnhMemProtCap) == 0) {
122       PutEventLog (AGESA_WARNING, MEM_WARNING_EMP_NOT_SUPPORTED, 0, 0, 0, 0, &NBPtr->MemPtr->StdHeader);
123       MCTPtr->ErrStatus[EsbEMPNotSupported] = TRUE;
124     } else if (RefPtr->EnableChannelIntlv || RefPtr->EnableBankIntlv || RefPtr->EnableBankSwizzle) {
125       PutEventLog (AGESA_WARNING, MEM_WARNING_EMP_CONFLICT, 0, 0, 0, 0, &NBPtr->MemPtr->StdHeader);
126       MCTPtr->ErrStatus[EsbEMPConflict] = TRUE;
127     } else if ((!MCTPtr->GangedMode) &&
128                (!IsPowerOfTwo (MCTPtr->DctData[0].Timings.DctMemSize) &&
129                 !IsPowerOfTwo (MCTPtr->DctData[1].Timings.DctMemSize))) {
130       PutEventLog (AGESA_WARNING, MEM_WARNING_EMP_NOT_ENABLED, 0, 0, 0, 0, &NBPtr->MemPtr->StdHeader);
131       MCTPtr->ErrStatus[EsbEMPDis] = TRUE;
132     } else {
133       // Reduce memory size to 7/8 of the original memory size
134       ASSERT ((MCTPtr->NodeMemSize % 8) == 0);
135       NBPtr->SetBitField (NBPtr, BFDramHoleValid, 0);
136       MCTPtr->NodeMemSize = (MCTPtr->NodeMemSize / 8) * 7;
137       NBPtr->HtMemMapInit (NBPtr);
138       NBPtr->CpuMemTyping (NBPtr);
139
140       // Enable EMP
141       NBPtr->SetBitField (NBPtr, BFDramEccEn, 1);
142
143       // Scrub CTL settings for Dcache, L2
144       NBPtr->SetBitField (NBPtr, BFL2Scrub, UserOptions.CfgScrubL2Rate);
145       NBPtr->SetBitField (NBPtr, BFDcacheScrub, UserOptions.CfgScrubDcRate);
146
147       NBPtr->SetBitField (NBPtr, BFSyncOnUcEccEn, UserOptions.CfgEccSyncFlood);
148       return TRUE;
149     }
150   }
151   return FALSE;
152 }
153
154 /*----------------------------------------------------------------------------
155  *                              LOCAL FUNCTIONS
156  *
157  *----------------------------------------------------------------------------
158  */
159
160 /* -----------------------------------------------------------------------------*/
161 /**
162  *
163  *
164  *      This function checks to see if the input is power of two.
165  *
166  *     @param[in]    TestNumber  - Value to check for power of two
167  *
168  *     @return          TRUE     - is power of two
169  *                      FALSE    - is not power of two
170  */
171 BOOLEAN
172 STATIC
173 IsPowerOfTwo (
174   IN       UINT32 TestNumber
175   )
176 {
177   return (BOOLEAN) ((TestNumber & (TestNumber - 1)) == 0);
178 }