[U-Boot] [PATCH 40/69] x86: Record the CPU details when starting each core
Bin Meng
bmeng.cn at gmail.com
Fri Mar 11 07:48:56 CET 2016
Hi Simon,
On Mon, Mar 7, 2016 at 10:28 AM, Simon Glass <sjg at chromium.org> wrote:
> 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 at chromium.org>
> ---
>
> arch/x86/cpu/intel_common/microcode_intel.c | 2 +-
> arch/x86/cpu/mp_init.c | 5 +++++
> arch/x86/include/asm/microcode.h | 9 +++++++++
> 3 files changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/cpu/intel_common/microcode_intel.c b/arch/x86/cpu/intel_common/microcode_intel.c
> index 3054fab..26b1316 100644
> --- a/arch/x86/cpu/intel_common/microcode_intel.c
> +++ b/arch/x86/cpu/intel_common/microcode_intel.c
> @@ -64,7 +64,7 @@ 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)
> {
> /*
> * Some Intel CPUs can be very finicky about the CPUID sequence used.
> diff --git a/arch/x86/cpu/mp_init.c b/arch/x86/cpu/mp_init.c
> index ca47e9e..94ddbbb 100644
> --- a/arch/x86/cpu/mp_init.c
> +++ b/arch/x86/cpu/mp_init.c
> @@ -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();
This won't work on Quark as Quark does not have microcode MSRs.
> + plat->device_id = cpuid_eax(1);
Why not just use gd->arch.x86_device?
>
> return device_probe(cpu);
> }
> diff --git a/arch/x86/include/asm/microcode.h b/arch/x86/include/asm/microcode.h
> index 67f32cc..0478935 100644
> --- a/arch/x86/include/asm/microcode.h
> +++ b/arch/x86/include/asm/microcode.h
> @@ -18,6 +18,15 @@
> * 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
> --
Regards,
Bin
More information about the U-Boot
mailing list