[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