diff options
author | Andrey Petrov <anpetrov@fb.com> | 2019-10-23 17:12:10 -0700 |
---|---|---|
committer | Andrey Petrov <anpetrov@fb.com> | 2019-10-28 18:27:35 +0000 |
commit | 0108c8b742bd7a3a7c2db8357677211e7eb14fac (patch) | |
tree | a8a95f552020a2723228a8f6af4ea8869861e8e2 | |
parent | 2e032f07df0d4ff5c1d9814b82ed32820cb0ee59 (diff) |
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>
-rw-r--r-- | src/soc/intel/fsp_broadwell_de/cpu.c | 22 | ||||
-rw-r--r-- | src/soc/intel/fsp_broadwell_de/include/soc/msr.h | 1 |
2 files changed, 23 insertions, 0 deletions
diff --git a/src/soc/intel/fsp_broadwell_de/cpu.c b/src/soc/intel/fsp_broadwell_de/cpu.c index ac4dcc92dd..b94ee78d7a 100644 --- a/src/soc/intel/fsp_broadwell_de/cpu.c +++ b/src/soc/intel/fsp_broadwell_de/cpu.c @@ -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); diff --git a/src/soc/intel/fsp_broadwell_de/include/soc/msr.h b/src/soc/intel/fsp_broadwell_de/include/soc/msr.h index e4b8c50e20..f9fdffb2bf 100644 --- a/src/soc/intel/fsp_broadwell_de/include/soc/msr.h +++ b/src/soc/intel/fsp_broadwell_de/include/soc/msr.h @@ -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 |