Angel Pons | c3f58f6 | 2020-04-05 15:46:41 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Aaron Durbin | 9a7d7bc | 2013-09-07 00:41:48 -0500 | [diff] [blame] | 2 | |
Aaron Durbin | 9a7d7bc | 2013-09-07 00:41:48 -0500 | [diff] [blame] | 3 | #include <cpu/x86/msr.h> |
| 4 | #include <cpu/x86/tsc.h> |
Julius Werner | 18ea2d3 | 2014-10-07 16:42:17 -0700 | [diff] [blame] | 5 | #include <soc/msr.h> |
Aaron Durbin | bb3ee83 | 2013-10-07 17:12:20 -0500 | [diff] [blame] | 6 | |
Martin Roth | 57e8909 | 2019-10-23 21:45:23 -0600 | [diff] [blame] | 7 | unsigned int bus_freq_khz(void) |
Duncan Laurie | 6aa9f1f | 2013-11-07 12:47:35 -0800 | [diff] [blame] | 8 | { |
| 9 | msr_t clk_info = rdmsr(MSR_BSEL_CR_OVERCLOCK_CONTROL); |
| 10 | switch (clk_info.lo & 0x3) { |
| 11 | case 0: |
| 12 | return 83333; |
| 13 | case 1: |
| 14 | return 100000; |
| 15 | case 2: |
| 16 | return 133333; |
| 17 | case 3: |
| 18 | return 116666; |
| 19 | default: |
| 20 | return 0; |
| 21 | } |
| 22 | } |
| 23 | |
Aaron Durbin | 9a7d7bc | 2013-09-07 00:41:48 -0500 | [diff] [blame] | 24 | unsigned long tsc_freq_mhz(void) |
| 25 | { |
| 26 | msr_t platform_info; |
Martin Roth | 57e8909 | 2019-10-23 21:45:23 -0600 | [diff] [blame] | 27 | unsigned int bclk_khz = bus_freq_khz(); |
Duncan Laurie | 6aa9f1f | 2013-11-07 12:47:35 -0800 | [diff] [blame] | 28 | |
| 29 | if (!bclk_khz) |
| 30 | return 0; |
Aaron Durbin | 9a7d7bc | 2013-09-07 00:41:48 -0500 | [diff] [blame] | 31 | |
| 32 | platform_info = rdmsr(MSR_PLATFORM_INFO); |
Aaron Durbin | 9d9d7f0 | 2013-10-11 00:44:06 -0500 | [diff] [blame] | 33 | return (bclk_khz * ((platform_info.lo >> 8) & 0xff)) / 1000; |
Aaron Durbin | 9a7d7bc | 2013-09-07 00:41:48 -0500 | [diff] [blame] | 34 | } |
Aaron Durbin | bb3ee83 | 2013-10-07 17:12:20 -0500 | [diff] [blame] | 35 | |
| 36 | void set_max_freq(void) |
| 37 | { |
| 38 | msr_t perf_ctl; |
| 39 | msr_t msr; |
| 40 | |
| 41 | /* Enable speed step. */ |
Elyes HAOUAS | 419bfbc | 2018-10-01 08:47:51 +0200 | [diff] [blame] | 42 | msr = rdmsr(IA32_MISC_ENABLE); |
Aaron Durbin | bb3ee83 | 2013-10-07 17:12:20 -0500 | [diff] [blame] | 43 | msr.lo |= (1 << 16); |
Elyes HAOUAS | 419bfbc | 2018-10-01 08:47:51 +0200 | [diff] [blame] | 44 | wrmsr(IA32_MISC_ENABLE, msr); |
Aaron Durbin | bb3ee83 | 2013-10-07 17:12:20 -0500 | [diff] [blame] | 45 | |
Martin Roth | 99a3bba | 2014-12-07 14:57:26 -0700 | [diff] [blame] | 46 | /* Set guaranteed ratio [21:16] from IACORE_RATIOS to bits [15:8] of |
Aaron Durbin | bb3ee83 | 2013-10-07 17:12:20 -0500 | [diff] [blame] | 47 | * the PERF_CTL. */ |
| 48 | msr = rdmsr(MSR_IACORE_RATIOS); |
| 49 | perf_ctl.lo = (msr.lo & 0x3f0000) >> 8; |
Martin Roth | 99a3bba | 2014-12-07 14:57:26 -0700 | [diff] [blame] | 50 | /* Set guaranteed vid [21:16] from IACORE_VIDS to bits [7:0] of |
Aaron Durbin | bb3ee83 | 2013-10-07 17:12:20 -0500 | [diff] [blame] | 51 | * the PERF_CTL. */ |
| 52 | msr = rdmsr(MSR_IACORE_VIDS); |
| 53 | perf_ctl.lo |= (msr.lo & 0x7f0000) >> 16; |
| 54 | perf_ctl.hi = 0; |
| 55 | |
Elyes HAOUAS | 419bfbc | 2018-10-01 08:47:51 +0200 | [diff] [blame] | 56 | wrmsr(IA32_PERF_CTL, perf_ctl); |
Aaron Durbin | bb3ee83 | 2013-10-07 17:12:20 -0500 | [diff] [blame] | 57 | } |