soc/intel/broadwell_de: Implement smbios_cpu_get_maximum_freq_mhz()

Determine maximum speed by looking at either turbo flex limit or
uncore ratio limit.

Signed-off-by: Andrey Petrov <anpetrov@fb.com>
Change-Id: I0f3a64a40cb1d28d8eb9380c2071ec748e345b88
Reviewed-on: https://review.coreboot.org/c/coreboot/+/36284
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: David Hendricks <david.hendricks@gmail.com>
This commit is contained in:
Andrey Petrov 2019-10-23 17:12:10 -07:00
parent 2e032f07df
commit 0108c8b742
2 changed files with 23 additions and 0 deletions

View File

@ -20,6 +20,7 @@
#include <cpu/cpu.h>
#include <cpu/intel/microcode.h>
#include <cpu/intel/smm_reloc.h>
#include <cpu/intel/turbo.h>
#include <cpu/x86/cache.h>
#include <cpu/x86/lapic.h>
#include <cpu/x86/mp.h>
@ -27,6 +28,8 @@
#include <cpu/x86/mtrr.h>
#include <device/device.h>
#include <device/pci_ops.h>
#include <smbios.h>
#include <soc/broadwell_de.h>
#include <soc/lpc.h>
#include <soc/msr.h>
#include <soc/pattrs.h>
@ -98,6 +101,25 @@ static void set_max_ratio(void)
wrmsr(IA32_PERF_CTL, perf_ctl);
}
unsigned int smbios_cpu_get_max_speed_mhz(void)
{
msr_t msr;
uint32_t uncore_max_ratio, turbo_max_ratio = 0;
/*
* Use turbo's max ratio if it is enabled, otherwise use
* uncore's max ratio.
*/
msr = rdmsr(MSR_UNCORE_RATIO_LIMIT);
uncore_max_ratio = msr.lo & 0x7f;
if (get_turbo_state() == TURBO_ENABLED) {
msr = rdmsr(MSR_TURBO_RATIO_LIMIT);
turbo_max_ratio = msr.lo & 0xff; /* 1 core */
}
return MAX(uncore_max_ratio, turbo_max_ratio) * CPU_BCLK;
}
static void alt_smm_lock(void)
{
struct device *dev = pcidev_on_root(LPC_DEV, LPC_FUNC);

View File

@ -23,6 +23,7 @@
#define MSR_TURBO_RATIO_LIMIT 0x1ad
#define MSR_PKG_POWER_SKU_UNIT 0x606
#define MSR_PKG_POWER_LIMIT 0x610
#define MSR_UNCORE_RATIO_LIMIT 0x620
#define MSR_CONFIG_TDP_NOMINAL 0x648
#define SMM_MCA_CAP_MSR 0x17d