x86: Record the CPU details when starting each core
authorSimon Glass <sjg@chromium.org>
Sat, 12 Mar 2016 05:07:09 +0000 (22:07 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Thu, 17 Mar 2016 02:27:25 +0000 (10:27 +0800)
As each core starts up, record its microcode version and CPU ID so these can
be presented with the 'cpu detail' command.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/cpu/intel_common/microcode.c
arch/x86/cpu/mp_init.c
arch/x86/include/asm/microcode.h

index 3054fabfde6a4fe3775c4b50f186479c5fa922b3..daf0d69494a14b6e7d52d041d6864eb8c6606d85 100644 (file)
@@ -64,8 +64,12 @@ static int microcode_decode_node(const void *blob, int node,
        return 0;
 }
 
-static inline uint32_t microcode_read_rev(void)
+int microcode_read_rev(void)
 {
+       /* Quark does not have microcode MSRs */
+#ifdef CONFIG_INTEL_QUARK
+       return 0;
+#else
        /*
         * Some Intel CPUs can be very finicky about the CPUID sequence used.
         * So this is implemented in assembly so that it works reliably.
@@ -90,6 +94,7 @@ static inline uint32_t microcode_read_rev(void)
        );
 
        return high;
+#endif
 }
 
 static void microcode_read_cpu(struct microcode_update *cpu)
index ca47e9e0b20e7f7eacc660cd7ccf525502183e39..4cc655566c3636e85ca97297d32bcfac05962699 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/cpu.h>
 #include <asm/interrupt.h>
 #include <asm/lapic.h>
+#include <asm/microcode.h>
 #include <asm/mp.h>
 #include <asm/msr.h>
 #include <asm/mtrr.h>
@@ -560,12 +561,16 @@ int mp_init(struct mp_params *p)
 
 int mp_init_cpu(struct udevice *cpu, void *unused)
 {
+       struct cpu_platdata *plat = dev_get_parent_platdata(cpu);
+
        /*
         * Multiple APs are brought up simultaneously and they may get the same
         * seq num in the uclass_resolve_seq() during device_probe(). To avoid
         * this, set req_seq to the reg number in the device tree in advance.
         */
        cpu->req_seq = fdtdec_get_int(gd->fdt_blob, cpu->of_offset, "reg", -1);
+       plat->ucode_version = microcode_read_rev();
+       plat->device_id = gd->arch.x86_device;
 
        return device_probe(cpu);
 }
index 67f32cc38facf209c399884248cf7faad29180d6..04789353ecf6a4018afaf3c80a1104257256019a 100644 (file)
  * not updates were found, -EINVAL if an update was invalid
  */
 int microcode_update_intel(void);
+
+/**
+ * microcode_read_rev() - Read the microcode version
+ *
+ * This reads the microcode version of the currently running CPU
+ *
+ * @return microcode version number
+ */
+int microcode_read_rev(void);
 #endif /* __ASSEMBLY__ */
 
 #endif