aboutsummaryrefslogtreecommitdiff
path: root/src/soc/intel/baytrail/tsc_freq.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/intel/baytrail/tsc_freq.c')
-rw-r--r--src/soc/intel/baytrail/tsc_freq.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/src/soc/intel/baytrail/tsc_freq.c b/src/soc/intel/baytrail/tsc_freq.c
index 7795ab45b0..90f154c896 100644
--- a/src/soc/intel/baytrail/tsc_freq.c
+++ b/src/soc/intel/baytrail/tsc_freq.c
@@ -22,28 +22,32 @@
#include <cpu/x86/tsc.h>
#include <baytrail/msr.h>
-unsigned long tsc_freq_mhz(void)
+unsigned bus_freq_khz(void)
{
- msr_t platform_info;
- msr_t clk_info;
- unsigned long bclk_khz;
-
- platform_info = rdmsr(MSR_PLATFORM_INFO);
- clk_info = rdmsr(MSR_BSEL_CR_OVERCLOCK_CONTROL);
+ msr_t clk_info = rdmsr(MSR_BSEL_CR_OVERCLOCK_CONTROL);
switch (clk_info.lo & 0x3) {
case 0:
- bclk_khz = 83333;
- break;
+ return 83333;
case 1:
- bclk_khz = 100000;
- break;
+ return 100000;
case 2:
- bclk_khz = 133333;
- break;
+ return 133333;
case 3:
- bclk_khz = 116666;
- break;
+ return 116666;
+ default:
+ return 0;
}
+}
+
+unsigned long tsc_freq_mhz(void)
+{
+ msr_t platform_info;
+ unsigned bclk_khz = bus_freq_khz();
+
+ if (!bclk_khz)
+ return 0;
+
+ platform_info = rdmsr(MSR_PLATFORM_INFO);
return (bclk_khz * ((platform_info.lo >> 8) & 0xff)) / 1000;
}