cpu/amd/fam10h-15h: Set PowerStepUp/PowerStepDown on Fam15h

Multilink Family 15h processors were being configured with an
incorrect PowerStepUp/PowerStepDown value.  Set the value
according to the BKDG, and clean up the terrible formatting
of the power_up_down() function that led to the incorrect
values being overlooked until now.

Also change u32 declarations to uint32_t in modified functions.

Change-Id: I16e1f5205d6b5f349a3e7167dea04c9eefda4684
Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com>
Reviewed-on: https://review.coreboot.org/13174
Tested-by: build bot (Jenkins)
Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
Timothy Pearson 2015-11-24 14:12:07 -06:00 committed by Martin Roth
parent 7acb56fa97
commit 606b6ec686
1 changed files with 52 additions and 48 deletions

View File

@ -390,7 +390,7 @@ static u32 nb_clk_did(uint8_t node, uint64_t cpuRev, uint8_t procPkg) {
static u32 power_up_down(int node, u8 procPkg) { static u32 power_up_down(int node, u8 procPkg) {
u32 dword=0; uint32_t dword=0;
/* from CPU rev guide #41322 rev 3.74 June 2010 Table 26 */ /* from CPU rev guide #41322 rev 3.74 June 2010 Table 26 */
u8 singleLinkFlag = ((procPkg == AMD_PKGTYPE_AM3_2r2) u8 singleLinkFlag = ((procPkg == AMD_PKGTYPE_AM3_2r2)
|| (procPkg == AMD_PKGTYPE_S1gX) || (procPkg == AMD_PKGTYPE_S1gX)
@ -403,24 +403,27 @@ static u32 power_up_down(int node, u8 procPkg) {
*/ */
dword |= PW_STP_UP50 | PW_STP_DN50; dword |= PW_STP_UP50 | PW_STP_DN50;
} else { } else {
u32 dispRefModeEn = (pci_read_config32(NODE_PCI(node,0),0x68) >> 24) & 1; uint32_t dispRefModeEn = (pci_read_config32(NODE_PCI(node,0),0x68) >> 24) & 1;
u32 isocEn = 0; uint32_t isocEn = 0;
int j; int j;
for(j=0 ; (j<4) && (!isocEn) ; j++ ) { for (j=0 ; (j<4) && (!isocEn) ; j++ ) {
u8 offset; u8 offset;
if (AMD_CpuFindCapability(node, j, &offset)) { if (AMD_CpuFindCapability(node, j, &offset)) {
isocEn = (pci_read_config32(NODE_PCI(node,0),offset+4) >>12) & 1; isocEn = (pci_read_config32(NODE_PCI(node,0),offset+4) >>12) & 1;
} }
} }
if (dispRefModeEn || isocEn) { if (is_fam15h()) {
/* Family 15h always uses 100ns for multilink processors */
dword |= PW_STP_UP100 | PW_STP_DN100;
} else if (dispRefModeEn || isocEn) {
dword |= PW_STP_UP50 | PW_STP_DN50 ; dword |= PW_STP_UP50 | PW_STP_DN50 ;
} else { } else {
/* get number of cores for PowerStepUp & PowerStepDown in server /* get number of cores for PowerStepUp & PowerStepDown in server
1 core - 400nS - 0000b * 1 core - 400nS - 0000b
2 cores - 200nS - 0010b * 2 cores - 200nS - 0010b
3 cores - 133nS -> 100nS - 0011b * 3 cores - 133nS -> 100nS - 0011b
4 cores - 100nS - 0011b * 4 cores - 100nS - 0011b
*/ */
switch (get_core_num_in_bsp(node)) { switch (get_core_num_in_bsp(node)) {
case 0: case 0:
@ -439,6 +442,7 @@ static u32 power_up_down(int node, u8 procPkg) {
} }
} }
} }
return dword; return dword;
} }
@ -538,7 +542,7 @@ static void config_acpi_pwr_state_ctrl_regs(device_t dev, uint64_t cpuRev, uint8
// if it does, will it be enough to check the current state // if it does, will it be enough to check the current state
// or should we configure for what we'll set up later ? // or should we configure for what we'll set up later ?
dword = pci_read_config32(dev, 0x58); dword = pci_read_config32(dev, 0x58);
u32 scrubbingCache = dword & uint32_t scrubbingCache = dword &
( (0x1F << 16) // DCacheScrub ( (0x1F << 16) // DCacheScrub
| (0x1F << 8) ); // L2Scrub | (0x1F << 8) ); // L2Scrub
if (scrubbingCache) { if (scrubbingCache) {
@ -549,7 +553,7 @@ static void config_acpi_pwr_state_ctrl_regs(device_t dev, uint64_t cpuRev, uint8
} else { // rev C or later } else { // rev C or later
// same doubt as cache scrubbing: ok to check current state ? // same doubt as cache scrubbing: ok to check current state ?
dword = pci_read_config32(dev, 0xdc); dword = pci_read_config32(dev, 0xdc);
u32 cacheFlushOnHalt = dword & (7 << 16); uint32_t cacheFlushOnHalt = dword & (7 << 16);
if (!cacheFlushOnHalt) { if (!cacheFlushOnHalt) {
c1 = 0x80; c1 = 0x80;
} }