soc/amd/common/block/cpu/tsc/tsc_freq: use get_pstate_core_freq
Use get_pstate_core_freq instead of open-coding the calculations in tsc_freq_mhz. In the case of the CPU frequency divider being 0, get_pstate_core_freq will return 0; in this case that shouldn't happen, TSC_DEFAULT_FREQ_MHZ will be used as frequency, since for the TSC frequency it's better to err on the end of the expected frequency being too high which will cause longer than expected delays instead of too short delays. Now that the code is using get_pstate_core_freq, this code is valid for Glinda too, so also remove the comment on the SOC_AMD_COMMON_BLOCK_TSC_FAM17H_19H option being selected in the Glinda Kconfig. This Kconfig option will be renamed in a follow-up patch. Signed-off-by: Felix Held <felix-coreboot@felixheld.de> Change-Id: I01168834d4018c92f44782eda0c65b1aa392030d Reviewed-on: https://review.coreboot.org/c/coreboot/+/74013 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Eric Lai <eric_lai@quanta.corp-partner.google.com> Reviewed-by: Martin Roth <martin.roth@amd.corp-partner.google.com>
This commit is contained in:
parent
ad52185c2d
commit
4057ab4f31
|
@ -1,9 +1,11 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
#include <amdblocks/cpu.h>
|
||||||
#include <cpu/x86/msr.h>
|
#include <cpu/x86/msr.h>
|
||||||
#include <cpu/amd/msr.h>
|
#include <cpu/amd/msr.h>
|
||||||
#include <cpu/x86/tsc.h>
|
#include <cpu/x86/tsc.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
|
#include <soc/msr.h>
|
||||||
|
|
||||||
static unsigned long mhz;
|
static unsigned long mhz;
|
||||||
|
|
||||||
|
@ -13,31 +15,22 @@ static unsigned long mhz;
|
||||||
|
|
||||||
unsigned long tsc_freq_mhz(void)
|
unsigned long tsc_freq_mhz(void)
|
||||||
{
|
{
|
||||||
msr_t msr;
|
union pstate_msr pstate_reg;
|
||||||
uint8_t cpufid;
|
|
||||||
uint8_t cpudid;
|
|
||||||
uint8_t high_state;
|
uint8_t high_state;
|
||||||
|
|
||||||
if (mhz)
|
if (mhz)
|
||||||
return mhz;
|
return mhz;
|
||||||
|
|
||||||
high_state = rdmsr(PS_LIM_REG).lo & 0x7;
|
high_state = rdmsr(PS_LIM_REG).lo & 0x7;
|
||||||
msr = rdmsr(PSTATE_MSR(high_state));
|
pstate_reg.raw = rdmsr(PSTATE_MSR(high_state)).raw;
|
||||||
if (!(msr.hi & 0x80000000))
|
if (!pstate_reg.pstate_en)
|
||||||
die("Unknown error: cannot determine P-state 0\n");
|
die("Unknown error: cannot determine P-state 0\n");
|
||||||
|
|
||||||
cpufid = (msr.lo & 0xff);
|
mhz = get_pstate_core_freq(pstate_reg);
|
||||||
cpudid = (msr.lo & 0x3f00) >> 8;
|
|
||||||
|
|
||||||
/* normally core frequency is calculated as (fid * 25) / (did / 8) */
|
if (!mhz) {
|
||||||
if (!cpudid) {
|
|
||||||
mhz = TSC_DEFAULT_FREQ_MHZ;
|
mhz = TSC_DEFAULT_FREQ_MHZ;
|
||||||
printk(BIOS_ERR, "Invalid divisor, set TSC frequency to %ldMHz\n", mhz);
|
printk(BIOS_ERR, "Invalid divisor, set TSC frequency to %ldMHz\n", mhz);
|
||||||
} else if ((cpudid >= 8) && (cpudid <= 0x30)) {
|
|
||||||
mhz = (200 * cpufid) / cpudid;
|
|
||||||
} else {
|
|
||||||
mhz = 25 * cpufid;
|
|
||||||
printk(BIOS_ERR, "Invalid frequency divisor 0x%x, assume 1\n", cpudid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return mhz;
|
return mhz;
|
||||||
|
|
|
@ -71,7 +71,7 @@ config SOC_AMD_GLINDA
|
||||||
select SOC_AMD_COMMON_BLOCK_SMU_SX_ENTRY # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_SMU_SX_ENTRY # TODO: Check if this is still correct
|
||||||
select SOC_AMD_COMMON_BLOCK_SPI # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_SPI # TODO: Check if this is still correct
|
||||||
select SOC_AMD_COMMON_BLOCK_SVI3
|
select SOC_AMD_COMMON_BLOCK_SVI3
|
||||||
select SOC_AMD_COMMON_BLOCK_TSC_FAM17H_19H # FIXME: This is likely incompatible
|
select SOC_AMD_COMMON_BLOCK_TSC_FAM17H_19H
|
||||||
select SOC_AMD_COMMON_BLOCK_UART # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_UART # TODO: Check if this is still correct
|
||||||
select SOC_AMD_COMMON_BLOCK_UCODE # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_BLOCK_UCODE # TODO: Check if this is still correct
|
||||||
select SOC_AMD_COMMON_FSP_CCX_CPPC_HOB # TODO: Check if this is still correct
|
select SOC_AMD_COMMON_FSP_CCX_CPPC_HOB # TODO: Check if this is still correct
|
||||||
|
|
Loading…
Reference in New Issue