amd/amdfam10: Control Fam15h cache partitioning via nvram
Add options to control cache partitioning and overall memory performance via nvram. Change-Id: I3dd5d7f3640aee0395a68645c0242307605d3ce7 Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com> Reviewed-on: http://review.coreboot.org/12041 Tested-by: build bot (Jenkins) Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
parent
b174667534
commit
68130f506d
|
@ -135,9 +135,8 @@ static const struct {
|
||||||
0x00000000, 1 << (42-32)}, /* Bx [PwcDisableWalkerSharing]=1 */
|
0x00000000, 1 << (42-32)}, /* Bx [PwcDisableWalkerSharing]=1 */
|
||||||
|
|
||||||
{ BU_CFG3, AMD_OR_C0, AMD_PTYPE_ALL,
|
{ BU_CFG3, AMD_OR_C0, AMD_PTYPE_ALL,
|
||||||
(0x3 << 20) | (0x1 << 22), 0x00000000,
|
1 << 22, 0x00000000,
|
||||||
(0x3 << 20) | (0x1 << 22), 0x00000000}, /* C0 or above [PfcDoubleStride]=1,
|
1 << 22, 0x00000000}, /* C0 or above [PfcDoubleStride]=1 */
|
||||||
PfcStrideMul]=0x3 */
|
|
||||||
|
|
||||||
{ EX_CFG, AMD_OR_C0, AMD_PTYPE_ALL,
|
{ EX_CFG, AMD_OR_C0, AMD_PTYPE_ALL,
|
||||||
0x00000000, 1 << (54-32),
|
0x00000000, 1 << (54-32),
|
||||||
|
|
|
@ -953,6 +953,7 @@ void cpuSetAMDMSR(uint8_t node_id)
|
||||||
*/
|
*/
|
||||||
msr_t msr;
|
msr_t msr;
|
||||||
u8 i;
|
u8 i;
|
||||||
|
uint8_t nvram;
|
||||||
u32 platform;
|
u32 platform;
|
||||||
uint64_t revision;
|
uint64_t revision;
|
||||||
uint8_t enable_c_states;
|
uint8_t enable_c_states;
|
||||||
|
@ -977,6 +978,13 @@ void cpuSetAMDMSR(uint8_t node_id)
|
||||||
|
|
||||||
/* Revision C0 and above */
|
/* Revision C0 and above */
|
||||||
if (revision & AMD_OR_C0) {
|
if (revision & AMD_OR_C0) {
|
||||||
|
uint8_t enable_experimental_memory_speed_boost;
|
||||||
|
|
||||||
|
/* Check to see if cache partitioning is allowed */
|
||||||
|
enable_experimental_memory_speed_boost = 0;
|
||||||
|
if (get_option(&nvram, "experimental_memory_speed_boost") == CB_SUCCESS)
|
||||||
|
enable_experimental_memory_speed_boost = !!nvram;
|
||||||
|
|
||||||
uint32_t f3x1fc = pci_read_config32(NODE_PCI(node_id, 3), 0x1fc);
|
uint32_t f3x1fc = pci_read_config32(NODE_PCI(node_id, 3), 0x1fc);
|
||||||
msr = rdmsr(FP_CFG);
|
msr = rdmsr(FP_CFG);
|
||||||
msr.hi &= ~(0x7 << (42-32)); /* DiDtCfg4 */
|
msr.hi &= ~(0x7 << (42-32)); /* DiDtCfg4 */
|
||||||
|
@ -996,11 +1004,15 @@ void cpuSetAMDMSR(uint8_t node_id)
|
||||||
msr.lo &= ~(0x1 << 16); /* DiDtMode */
|
msr.lo &= ~(0x1 << 16); /* DiDtMode */
|
||||||
msr.lo |= ((f3x1fc & 0x1) << 16);
|
msr.lo |= ((f3x1fc & 0x1) << 16);
|
||||||
wrmsr(FP_CFG, msr);
|
wrmsr(FP_CFG, msr);
|
||||||
|
|
||||||
|
if (enable_experimental_memory_speed_boost) {
|
||||||
|
msr = rdmsr(BU_CFG3);
|
||||||
|
msr.lo |= (0x3 << 20); /* PfcStrideMul = 0x3 */
|
||||||
|
wrmsr(BU_CFG3, msr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_SOUTHBRIDGE_AMD_SB700) || IS_ENABLED(CONFIG_SOUTHBRIDGE_AMD_SB800)
|
#if IS_ENABLED(CONFIG_SOUTHBRIDGE_AMD_SB700) || IS_ENABLED(CONFIG_SOUTHBRIDGE_AMD_SB800)
|
||||||
uint8_t nvram;
|
|
||||||
|
|
||||||
if (revision & (AMD_DR_GT_D0 | AMD_FAM15_ALL)) {
|
if (revision & (AMD_DR_GT_D0 | AMD_FAM15_ALL)) {
|
||||||
/* Set up message triggered C1E */
|
/* Set up message triggered C1E */
|
||||||
msr = rdmsr(0xc0010055);
|
msr = rdmsr(0xc0010055);
|
||||||
|
|
|
@ -20,6 +20,9 @@ cpu_cc6_state = Enable
|
||||||
sata_ahci_mode = Enable
|
sata_ahci_mode = Enable
|
||||||
sata_alpm = Disable
|
sata_alpm = Disable
|
||||||
maximum_p_state_limit = 0xf
|
maximum_p_state_limit = 0xf
|
||||||
|
probe_filter = Auto
|
||||||
|
l3_cache_partitioning = Disable
|
||||||
ieee1394_controller = Enable
|
ieee1394_controller = Enable
|
||||||
|
experimental_memory_speed_boost = Disable
|
||||||
power_on_after_fail = On
|
power_on_after_fail = On
|
||||||
boot_option = Fallback
|
boot_option = Fallback
|
||||||
|
|
|
@ -44,8 +44,11 @@ entries
|
||||||
468 1 e 1 sata_alpm
|
468 1 e 1 sata_alpm
|
||||||
469 4 h 0 maximum_p_state_limit
|
469 4 h 0 maximum_p_state_limit
|
||||||
473 2 e 13 dimm_spd_checksum
|
473 2 e 13 dimm_spd_checksum
|
||||||
475 1 r 0 allow_spd_nvram_cache_restore
|
475 1 e 14 probe_filter
|
||||||
477 1 e 1 ieee1394_controller
|
476 1 e 1 l3_cache_partitioning
|
||||||
|
477 1 e 1 experimental_memory_speed_boost
|
||||||
|
478 1 r 0 allow_spd_nvram_cache_restore
|
||||||
|
479 1 e 1 ieee1394_controller
|
||||||
728 256 h 0 user_data
|
728 256 h 0 user_data
|
||||||
984 16 h 0 check_sum
|
984 16 h 0 check_sum
|
||||||
# Reserve the extended AMD configuration registers
|
# Reserve the extended AMD configuration registers
|
||||||
|
@ -142,6 +145,8 @@ enumerations
|
||||||
13 0 Enforce
|
13 0 Enforce
|
||||||
13 1 Ignore
|
13 1 Ignore
|
||||||
13 2 Override
|
13 2 Override
|
||||||
|
14 0 Disable
|
||||||
|
14 1 Auto
|
||||||
|
|
||||||
checksums
|
checksums
|
||||||
|
|
||||||
|
|
|
@ -1650,6 +1650,17 @@ static void detect_and_enable_probe_filter(device_t dev)
|
||||||
{
|
{
|
||||||
uint32_t dword;
|
uint32_t dword;
|
||||||
|
|
||||||
|
uint8_t nvram;
|
||||||
|
uint8_t enable_probe_filter;
|
||||||
|
|
||||||
|
/* Check to see if the probe filter is allowed */
|
||||||
|
enable_probe_filter = 1;
|
||||||
|
if (get_option(&nvram, "probe_filter") == CB_SUCCESS)
|
||||||
|
enable_probe_filter = !!nvram;
|
||||||
|
|
||||||
|
if (!enable_probe_filter)
|
||||||
|
return;
|
||||||
|
|
||||||
uint8_t fam15h = 0;
|
uint8_t fam15h = 0;
|
||||||
uint8_t rev_gte_d = 0;
|
uint8_t rev_gte_d = 0;
|
||||||
uint8_t dual_node = 0;
|
uint8_t dual_node = 0;
|
||||||
|
@ -1810,6 +1821,17 @@ static void detect_and_enable_cache_partitioning(device_t dev)
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
uint32_t dword;
|
uint32_t dword;
|
||||||
|
|
||||||
|
uint8_t nvram;
|
||||||
|
uint8_t enable_l3_cache_partitioning;
|
||||||
|
|
||||||
|
/* Check to see if cache partitioning is allowed */
|
||||||
|
enable_l3_cache_partitioning = 0;
|
||||||
|
if (get_option(&nvram, "l3_cache_partitioning") == CB_SUCCESS)
|
||||||
|
enable_l3_cache_partitioning = !!nvram;
|
||||||
|
|
||||||
|
if (!enable_l3_cache_partitioning)
|
||||||
|
return;
|
||||||
|
|
||||||
if (is_fam15h()) {
|
if (is_fam15h()) {
|
||||||
printk(BIOS_DEBUG, "Enabling L3 cache partitioning\n");
|
printk(BIOS_DEBUG, "Enabling L3 cache partitioning\n");
|
||||||
|
|
||||||
|
|
|
@ -5559,6 +5559,14 @@ static void mct_FinalMCT_D(struct MCTStatStruc *pMCTstat,
|
||||||
mct_ExtMCTConfig_Dx(pDCTstat);
|
mct_ExtMCTConfig_Dx(pDCTstat);
|
||||||
} else {
|
} else {
|
||||||
/* Family 15h CPUs */
|
/* Family 15h CPUs */
|
||||||
|
uint8_t nvram;
|
||||||
|
uint8_t enable_experimental_memory_speed_boost;
|
||||||
|
|
||||||
|
/* Check to see if cache partitioning is allowed */
|
||||||
|
enable_experimental_memory_speed_boost = 0;
|
||||||
|
if (get_option(&nvram, "experimental_memory_speed_boost") == CB_SUCCESS)
|
||||||
|
enable_experimental_memory_speed_boost = !!nvram;
|
||||||
|
|
||||||
val = 0x0ce00f00; /* FlushWrOnStpGnt = 0x0 */
|
val = 0x0ce00f00; /* FlushWrOnStpGnt = 0x0 */
|
||||||
val |= 0x10 << 2; /* MctWrLimit = 0x10 */
|
val |= 0x10 << 2; /* MctWrLimit = 0x10 */
|
||||||
val |= 0x1; /* DctWrLimit = 0x1 */
|
val |= 0x1; /* DctWrLimit = 0x1 */
|
||||||
|
@ -5572,7 +5580,8 @@ static void mct_FinalMCT_D(struct MCTStatStruc *pMCTstat,
|
||||||
val &= ~(0x7 << 8); /* CohPrefPrbLmt = 0x1 */
|
val &= ~(0x7 << 8); /* CohPrefPrbLmt = 0x1 */
|
||||||
val |= (0x1 << 8);
|
val |= (0x1 << 8);
|
||||||
val |= (0x1 << 12); /* EnSplitDctLimits = 0x1 */
|
val |= (0x1 << 12); /* EnSplitDctLimits = 0x1 */
|
||||||
val |= (0x1 << 20); /* DblPrefEn = 0x1 */
|
if (enable_experimental_memory_speed_boost)
|
||||||
|
val |= (0x1 << 20); /* DblPrefEn = 0x1 */
|
||||||
val |= (0x7 << 22); /* PrefFourConf = 0x7 */
|
val |= (0x7 << 22); /* PrefFourConf = 0x7 */
|
||||||
val |= (0x7 << 25); /* PrefFiveConf = 0x7 */
|
val |= (0x7 << 25); /* PrefFiveConf = 0x7 */
|
||||||
val &= ~(0xf << 28); /* DcqBwThrotWm = 0x0 */
|
val &= ~(0xf << 28); /* DcqBwThrotWm = 0x0 */
|
||||||
|
|
Loading…
Reference in New Issue