5 * AMD Family_15 Orochi L3 dependent feature support functions.
7 * Provides the functions necessary to initialize L3 dependent features.
9 * @xrefitem bom "File Content Label" "Release Content"
11 * @e sub-project: CPU/Family/0x15/OR
12 * @e \$Revision: 60552 $ @e \$Date: 2011-10-17 18:50:55 -0600 (Mon, 17 Oct 2011) $
16 ******************************************************************************
18 * Copyright (C) 2012 Advanced Micro Devices, Inc.
19 * All rights reserved.
21 * 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.
28 * * Neither the name of Advanced Micro Devices, Inc. nor the names of
29 * its contributors may be used to endorse or promote products derived
30 * from this software without specific prior written permission.
32 * 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.
43 ******************************************************************************
48 *----------------------------------------------------------------------------
51 *----------------------------------------------------------------------------
57 #include "CommonReturns.h"
58 #include "cpuRegisters.h"
59 #include "cpuF15PowerMgmt.h"
60 #include "cpuF15OrPowerMgmt.h"
61 #include "cpuLateInit.h"
62 #include "cpuServices.h"
63 #include "GeneralServices.h"
64 #include "cpuFamilyTranslation.h"
65 #include "cpuL3Features.h"
70 #define FILECODE PROC_CPU_FAMILY_0X15_OR_F15ORL3FEATURES_FILECODE
72 /*----------------------------------------------------------------------------
73 * DEFINITIONS AND MACROS
75 *----------------------------------------------------------------------------
77 #define L3Cache8_0M 0xCCCC
79 /*----------------------------------------------------------------------------
80 * TYPEDEFS AND STRUCTURES
82 *----------------------------------------------------------------------------
86 * The family 15h background scrubber context structure.
88 * These fields need to be saved, modified, then restored
89 * per die as part of HT Assist initialization.
92 UINT32 DramScrub:5; ///< DRAM scrub rate
93 UINT32 :3; ///< Reserved
94 UINT32 L3Scrub:5; ///< L3 scrub rate
95 UINT32 :3; ///< Reserved
96 UINT32 Redirect:1; ///< DRAM scrubber redirect enable
97 UINT32 :15; ///< Reserved
101 /*----------------------------------------------------------------------------
102 * PROTOTYPES OF LOCAL FUNCTIONS
104 *----------------------------------------------------------------------------
107 F15OrIsNonOptimalConfig (
108 IN L3_FEATURE_FAMILY_SERVICES *L3FeatureServices,
110 IN AMD_CONFIG_PARAMS *StdHeader
113 /*----------------------------------------------------------------------------
116 *----------------------------------------------------------------------------
120 /*---------------------------------------------------------------------------------------*/
122 * Check to see if the input CPU supports L3 dependent features.
124 * @param[in] L3FeatureServices L3 feature family services.
125 * @param[in] Socket Processor socket to check.
126 * @param[in] StdHeader Config Handle for library, services.
127 * @param[in] PlatformConfig Contains the runtime modifiable feature input data.
129 * @retval TRUE L3 dependent features are supported.
130 * @retval FALSE L3 dependent features are not supported.
135 F15OrIsL3FeatureSupported (
136 IN L3_FEATURE_FAMILY_SERVICES *L3FeatureServices,
138 IN AMD_CONFIG_PARAMS *StdHeader,
139 IN PLATFORM_CONFIGURATION *PlatformConfig
143 UINT32 LocalPciRegister;
146 AGESA_STATUS IgnoredStatus;
149 for (Module = 0; Module < GetPlatformNumberOfModules (); Module++) {
150 if (GetPciAddress (StdHeader, Socket, Module, &PciAddress, &IgnoredStatus)) {
151 PciAddress.Address.Function = FUNC_3;
152 PciAddress.Address.Register = NB_CAPS_REG;
153 LibAmdPciRead (AccessWidth32, PciAddress, &LocalPciRegister, StdHeader);
154 if (((NB_CAPS_REGISTER *) &LocalPciRegister)->L3Capable == 1) {
164 /*---------------------------------------------------------------------------------------*/
166 * Enable the Probe filter feature
168 * @param[in] L3FeatureServices L3 family services.
169 * @param[in] Socket Processor socket to check.
170 * @param[in] StdHeader Config Handle for library, services.
176 IN L3_FEATURE_FAMILY_SERVICES *L3FeatureServices,
178 IN AMD_CONFIG_PARAMS *StdHeader
182 UINT32 L3CacheParamRegister;
183 UINT32 PfCtrlRegister;
185 AGESA_STATUS IgnoredStatus;
187 for (Module = 0; Module < GetPlatformNumberOfModules (); Module++) {
188 if (GetPciAddress (StdHeader, Socket, Module, &PciAddress, &IgnoredStatus)) {
189 PciAddress.Address.Function = FUNC_3;
190 PciAddress.Address.Register = L3_CACHE_PARAM_REG;
191 LibAmdPciRead (AccessWidth32, PciAddress, &L3CacheParamRegister, StdHeader);
192 ((L3_CACHE_PARAM_REGISTER *) &L3CacheParamRegister)->L3TagInit = 1;
193 LibAmdPciWrite (AccessWidth32, PciAddress, &L3CacheParamRegister, StdHeader);
195 LibAmdPciRead (AccessWidth32, PciAddress, &L3CacheParamRegister, StdHeader);
196 } while (((L3_CACHE_PARAM_REGISTER *) &L3CacheParamRegister)->L3TagInit != 0);
198 PciAddress.Address.Register = PROBE_FILTER_CTRL_REG;
199 LibAmdPciRead (AccessWidth32, PciAddress, &PfCtrlRegister, StdHeader);
200 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFWayHashEn = 1;
201 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFLoIndexHashEn = 1;
202 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFWayNum = 2;
203 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFSubCacheEn = 0xF;
204 if ((L3CacheParamRegister & 0xFFFF) == L3Cache8_0M) {
205 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFSubCacheSize0 = 1;
206 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFSubCacheSize1 = 1;
207 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFSubCacheSize2 = 1;
208 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFSubCacheSize3 = 1;
209 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFMode = 3;
210 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFPreferredSORepl = 2;
212 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFSubCacheSize0 = 0;
213 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFSubCacheSize1 = 0;
214 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFSubCacheSize2 = 0;
215 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFSubCacheSize3 = 0;
216 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFMode = 2;
217 ((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFPreferredSORepl = 0;
219 LibAmdPciWrite (AccessWidth32, PciAddress, &PfCtrlRegister, StdHeader);
222 LibAmdPciRead (AccessWidth32, PciAddress, &PfCtrlRegister, StdHeader);
223 } while (((PROBE_FILTER_CTRL_REGISTER *) &PfCtrlRegister)->PFInitDone != 1);
224 IDS_OPTION_HOOK (IDS_HT_ASSIST, &PciAddress, StdHeader);
230 /*---------------------------------------------------------------------------------------*/
232 * Enable the ATM Mode feature.
234 * @param[in] L3FeatureServices L3 feature family services.
235 * @param[in] Socket Processor socket to check.
236 * @param[in] StdHeader Config Handle for library, services.
242 IN L3_FEATURE_FAMILY_SERVICES *L3FeatureServices,
244 IN AMD_CONFIG_PARAMS *StdHeader
248 UINT32 LocalPciRegister;
250 AGESA_STATUS IgnoredStatus;
252 for (Module = 0; Module < GetPlatformNumberOfModules (); Module++) {
253 if (GetPciAddress (StdHeader, Socket, Module, &PciAddress, &IgnoredStatus)) {
254 PciAddress.Address.Function = FUNC_0;
255 PciAddress.Address.Register = LTC_REG;
256 LibAmdPciRead (AccessWidth32, PciAddress, &LocalPciRegister, StdHeader);
257 ((LTC_REGISTER *) &LocalPciRegister)->ATMModeEn = 1;
258 LibAmdPciWrite (AccessWidth32, PciAddress, &LocalPciRegister, StdHeader);
260 PciAddress.Address.Function = FUNC_3;
261 PciAddress.Address.Register = L3_CONTROL_1_REG;
262 LibAmdPciRead (AccessWidth32, PciAddress, &LocalPciRegister, StdHeader);
263 ((L3_CONTROL_1_REGISTER *) &LocalPciRegister)->L3ATMModeEn = 1;
264 LibAmdPciWrite (AccessWidth32, PciAddress, &LocalPciRegister, StdHeader);
270 /*---------------------------------------------------------------------------------------*/
272 * Save the current settings of the scrubbers, and disabled them.
274 * @param[in] L3FeatureServices L3 feature family services.
275 * @param[in] Socket Processor socket to check.
276 * @param[in] ScrubSettings Location to store current L3 scrubber settings.
277 * @param[in] StdHeader Config Handle for library, services.
282 F15OrGetL3ScrubCtrl (
283 IN L3_FEATURE_FAMILY_SERVICES *L3FeatureServices,
285 IN UINT32 ScrubSettings[L3_SCRUBBER_CONTEXT_ARRAY_SIZE],
286 IN AMD_CONFIG_PARAMS *StdHeader
293 AGESA_STATUS IgnoredStatus;
295 for (Module = 0; Module < GetPlatformNumberOfModules (); Module++) {
296 if (GetPciAddress (StdHeader, Socket, Module, &PciAddress, &IgnoredStatus)) {
298 ASSERT (Module < L3_SCRUBBER_CONTEXT_ARRAY_SIZE);
300 PciAddress.Address.Function = FUNC_3;
301 PciAddress.Address.Register = DRAM_SCRUB_ADDR_LOW_REG;
302 LibAmdPciRead (AccessWidth32, PciAddress, &ScrubAddr, StdHeader);
304 PciAddress.Address.Register = SCRUB_RATE_CTRL_REG;
305 LibAmdPciRead (AccessWidth32, PciAddress, &ScrubCtrl, StdHeader);
307 ((F15_SCRUB_CONTEXT *) &ScrubSettings[Module])->DramScrub =
308 ((SCRUB_RATE_CTRL_REGISTER *) &ScrubCtrl)->DramScrub;
309 ((F15_SCRUB_CONTEXT *) &ScrubSettings[Module])->L3Scrub =
310 ((SCRUB_RATE_CTRL_REGISTER *) &ScrubCtrl)->L3Scrub;
311 ((F15_SCRUB_CONTEXT *) &ScrubSettings[Module])->Redirect =
312 ((DRAM_SCRUB_ADDR_LOW_REGISTER *) &ScrubAddr)->ScrubReDirEn;
314 ((SCRUB_RATE_CTRL_REGISTER *) &ScrubCtrl)->DramScrub = 0;
315 ((SCRUB_RATE_CTRL_REGISTER *) &ScrubCtrl)->L3Scrub = 0;
316 ((DRAM_SCRUB_ADDR_LOW_REGISTER *) &ScrubAddr)->ScrubReDirEn = 0;
317 LibAmdPciWrite (AccessWidth32, PciAddress, &ScrubCtrl, StdHeader);
318 PciAddress.Address.Register = DRAM_SCRUB_ADDR_LOW_REG;
319 LibAmdPciWrite (AccessWidth32, PciAddress, &ScrubAddr, StdHeader);
325 /*---------------------------------------------------------------------------------------*/
327 * Restore the initial settings for the scrubbers.
329 * @param[in] L3FeatureServices L3 Feature family services.
330 * @param[in] Socket Processor socket to check.
331 * @param[in] ScrubSettings Location to store current L3 scrubber settings.
332 * @param[in] StdHeader Config Handle for library, services.
337 F15OrSetL3ScrubCtrl (
338 IN L3_FEATURE_FAMILY_SERVICES *L3FeatureServices,
340 IN UINT32 ScrubSettings[L3_SCRUBBER_CONTEXT_ARRAY_SIZE],
341 IN AMD_CONFIG_PARAMS *StdHeader
345 UINT32 LocalPciRegister;
347 AGESA_STATUS IgnoredStatus;
349 for (Module = 0; Module < GetPlatformNumberOfModules (); Module++) {
350 if (GetPciAddress (StdHeader, Socket, Module, &PciAddress, &IgnoredStatus)) {
352 ASSERT (Module < L3_SCRUBBER_CONTEXT_ARRAY_SIZE);
354 PciAddress.Address.Function = FUNC_3;
355 PciAddress.Address.Register = SCRUB_RATE_CTRL_REG;
356 LibAmdPciRead (AccessWidth32, PciAddress, &LocalPciRegister, StdHeader);
357 ((SCRUB_RATE_CTRL_REGISTER *) &LocalPciRegister)->DramScrub =
358 ((F15_SCRUB_CONTEXT *) &ScrubSettings[Module])->DramScrub;
359 ((SCRUB_RATE_CTRL_REGISTER *) &LocalPciRegister)->L3Scrub =
360 ((F15_SCRUB_CONTEXT *) &ScrubSettings[Module])->L3Scrub;
361 LibAmdPciWrite (AccessWidth32, PciAddress, &LocalPciRegister, StdHeader);
363 PciAddress.Address.Register = DRAM_SCRUB_ADDR_LOW_REG;
364 LibAmdPciRead (AccessWidth32, PciAddress, &LocalPciRegister, StdHeader);
365 ((DRAM_SCRUB_ADDR_LOW_REGISTER *) &LocalPciRegister)->ScrubReDirEn =
366 ((F15_SCRUB_CONTEXT *) &ScrubSettings[Module])->Redirect;
367 LibAmdPciWrite (AccessWidth32, PciAddress, &LocalPciRegister, StdHeader);
373 /*---------------------------------------------------------------------------------------*/
375 * Set MSR bits required for L3 feature support on each core.
377 * @param[in] L3FeatureServices L3 Feature family services.
378 * @param[in] HtAssistEnabled Indicates whether Ht Assist is enabled.
379 * @param[in] StdHeader Config Handle for library, services.
384 F15OrHookDisableCache (
385 IN L3_FEATURE_FAMILY_SERVICES *L3FeatureServices,
386 IN BOOLEAN HtAssistEnabled,
387 IN AMD_CONFIG_PARAMS *StdHeader
390 UINT64 LocalMsrRegister;
392 // This bit is set only if Probe Filter is enabled.
393 if (HtAssistEnabled) {
394 LibAmdMsrRead (MSR_BU_CFG2, &LocalMsrRegister, StdHeader);
395 LocalMsrRegister |= BIT42;
396 LibAmdMsrWrite (MSR_BU_CFG2, &LocalMsrRegister, StdHeader);
401 /*---------------------------------------------------------------------------------------*/
403 * Check to see if the input CPU is running in the optimal configuration.
405 * @param[in] L3FeatureServices L3 Feature family services.
406 * @param[in] Socket Processor socket to check.
407 * @param[in] StdHeader Config Handle for library, services.
409 * @retval TRUE HT Assist is running sub-optimally.
410 * @retval FALSE HT Assist is running optimally.
414 F15OrIsNonOptimalConfig (
415 IN L3_FEATURE_FAMILY_SERVICES *L3FeatureServices,
417 IN AMD_CONFIG_PARAMS *StdHeader
420 BOOLEAN IsNonOptimal;
421 BOOLEAN IsMemoryPresent;
423 UINT32 LocalPciRegister;
425 AGESA_STATUS IgnoredStatus;
427 IsNonOptimal = FALSE;
428 for (Module = 0; Module < GetPlatformNumberOfModules (); Module++) {
429 if (GetPciAddress (StdHeader, Socket, Module, &PciAddress, &IgnoredStatus)) {
430 IsMemoryPresent = FALSE;
431 PciAddress.Address.Function = FUNC_2;
432 PciAddress.Address.Register = DRAM_CFG_HI_REG0;
434 LibAmdPciRead (AccessWidth32, PciAddress, &LocalPciRegister, StdHeader);
435 if (((DRAM_CFG_HI_REGISTER *) &LocalPciRegister)->MemClkFreqVal == 1) {
436 IsMemoryPresent = TRUE;
437 if (((DRAM_CFG_HI_REGISTER *) &LocalPciRegister)->MemClkFreq < 0x0a) {
443 PciAddress.Address.Register = DRAM_CFG_HI_REG1;
445 LibAmdPciRead (AccessWidth32, PciAddress, &LocalPciRegister, StdHeader);
446 if (((DRAM_CFG_HI_REGISTER *) &LocalPciRegister)->MemClkFreqVal == 1) {
447 IsMemoryPresent = TRUE;
448 if (((DRAM_CFG_HI_REGISTER *) &LocalPciRegister)->MemClkFreq < 0x0a) {
453 if (!IsMemoryPresent) {
462 /*---------------------------------------------------------------------------------------*/
464 * Check to see if the input CPU supports HT Assist.
466 * @param[in] L3FeatureServices L3 Feature family services.
467 * @param[in] PlatformConfig Contains the runtime modifiable feature input data.
468 * @param[in] StdHeader Config Handle for library, services.
470 * @retval TRUE HT Assist is supported.
471 * @retval FALSE HT Assist cannot be enabled.
476 F15OrIsHtAssistSupported (
477 IN L3_FEATURE_FAMILY_SERVICES *L3FeatureServices,
478 IN PLATFORM_CONFIGURATION *PlatformConfig,
479 IN AMD_CONFIG_PARAMS *StdHeader
484 AP_MAILBOXES ApMailboxes;
488 if (PlatformConfig->PlatformProfile.UseHtAssist) {
489 CpuCount = GetNumberOfProcessors (StdHeader);
490 ASSERT (CpuCount != 0);
493 GetApMailbox (&ApMailboxes.ApMailInfo.Info, StdHeader);
494 if (ApMailboxes.ApMailInfo.Fields.ModuleType != 0) {
497 } else if (CpuCount > 1) {
504 /*---------------------------------------------------------------------------------------*/
506 * Check to see if the input CPU supports ATM Mode.
508 * @param[in] L3FeatureServices L3 Feature family services.
509 * @param[in] PlatformConfig Contains the runtime modifiable feature input data.
510 * @param[in] StdHeader Config Handle for library, services.
512 * @retval TRUE ATM Mode is supported.
513 * @retval FALSE ATM Mode cannot be enabled.
518 F15OrIsAtmModeSupported (
519 IN L3_FEATURE_FAMILY_SERVICES *L3FeatureServices,
520 IN PLATFORM_CONFIGURATION *PlatformConfig,
521 IN AMD_CONFIG_PARAMS *StdHeader
528 if (!PlatformConfig->PlatformProfile.UseAtmMode) {
534 CONST L3_FEATURE_FAMILY_SERVICES ROMDATA F15OrL3Features =
537 F15OrIsL3FeatureSupported,
540 (PF_L3_FEATURE_BEFORE_INIT) CommonVoid,
541 (PF_L3_FEATURE_AFTER_INIT) CommonVoid,
542 F15OrHookDisableCache,
543 (PF_L3_FEATURE_ENABLE_CACHE) CommonVoid,
544 F15OrIsHtAssistSupported,
546 F15OrIsNonOptimalConfig,
547 F15OrIsAtmModeSupported,