x86: Move common Intel CPU info code into a function
authorSimon Glass <sjg@chromium.org>
Wed, 25 Sep 2019 14:11:35 +0000 (08:11 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Tue, 8 Oct 2019 05:57:35 +0000 (13:57 +0800)
Add cpu_intel_get_info() to find out the CPU info on modern Intel CPUs.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
[bmeng: add parameter and return value descriptions]
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/cpu/broadwell/cpu_full.c
arch/x86/cpu/intel_common/cpu.c
arch/x86/cpu/ivybridge/model_206ax.c
arch/x86/include/asm/cpu_common.h

index c1db184..d8b8482 100644 (file)
@@ -645,14 +645,7 @@ void cpu_set_power_limits(int power_limit_1_time)
 
 static int broadwell_get_info(struct udevice *dev, struct cpu_info *info)
 {
-       msr_t msr;
-
-       msr = msr_read(IA32_PERF_CTL);
-       info->cpu_freq = ((msr.lo >> 8) & 0xff) * BROADWELL_BCLK * 1000000;
-       info->features = 1 << CPU_FEAT_L1_CACHE | 1 << CPU_FEAT_MMU |
-               1 << CPU_FEAT_UCODE | 1 << CPU_FEAT_DEVICE_ID;
-
-       return 0;
+       return cpu_intel_get_info(info, BROADWELL_BCLK);
 }
 
 static int broadwell_get_count(struct udevice *dev)
index d0ac178..9357626 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include <common.h>
+#include <cpu.h>
 #include <dm.h>
 #include <errno.h>
 #include <asm/cpu_common.h>
@@ -110,3 +111,15 @@ int cpu_set_flex_ratio_to_tdp_nominal(void)
        /* Not reached */
        return -EINVAL;
 }
+
+int cpu_intel_get_info(struct cpu_info *info, int bclk)
+{
+       msr_t msr;
+
+       msr = msr_read(IA32_PERF_CTL);
+       info->cpu_freq = ((msr.lo >> 8) & 0xff) * bclk * 1000000;
+       info->features = 1 << CPU_FEAT_L1_CACHE | 1 << CPU_FEAT_MMU |
+               1 << CPU_FEAT_UCODE | 1 << CPU_FEAT_DEVICE_ID;
+
+       return 0;
+}
index 6edc3e2..68e78e9 100644 (file)
@@ -12,6 +12,7 @@
 #include <fdtdec.h>
 #include <malloc.h>
 #include <asm/cpu.h>
+#include <asm/cpu_common.h>
 #include <asm/cpu_x86.h>
 #include <asm/msr.h>
 #include <asm/msr-index.h>
@@ -436,12 +437,7 @@ static int model_206ax_init(struct udevice *dev)
 
 static int model_206ax_get_info(struct udevice *dev, struct cpu_info *info)
 {
-       msr_t msr;
-
-       msr = msr_read(MSR_IA32_PERF_CTL);
-       info->cpu_freq = ((msr.lo >> 8) & 0xff) * SANDYBRIDGE_BCLK * 1000000;
-       info->features = 1 << CPU_FEAT_L1_CACHE | 1 << CPU_FEAT_MMU |
-               1 << CPU_FEAT_UCODE;
+       return cpu_intel_get_info(info, SANDYBRIDGE_BCLK);
 
        return 0;
 }
index 4c91a5d..5e398be 100644 (file)
@@ -8,6 +8,8 @@
 
 #define IA32_PERF_CTL                  0x199
 
+struct cpu_info;
+
 /**
  * cpu_common_init() - Set up common CPU init
  *
@@ -31,4 +33,18 @@ int cpu_common_init(void);
  */
 int cpu_set_flex_ratio_to_tdp_nominal(void);
 
+/**
+ * cpu_intel_get_info() - Obtain CPU info for Intel CPUs
+ *
+ * Most Intel CPUs use the same MSR to obtain the clock speed, and use the same
+ * features. This function fills in these values, given the value of the base
+ * clock in MHz (typically this should be set to 100).
+ *
+ * @info:      cpu_info struct to fill in
+ * @bclk_mz:   the base clock in MHz
+ *
+ * @return 0 always
+ */
+int cpu_intel_get_info(struct cpu_info *info, int bclk_mz);
+
 #endif