x86: Use microcode update from device tree for all processors
authorIvan Gorinov <ivan.gorinov@intel.com>
Fri, 22 Jun 2018 04:16:16 +0000 (21:16 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 2 Jul 2018 01:23:28 +0000 (09:23 +0800)
Built without a ROM image with FSP (u-boot.rom), the U-Boot loader applies
the microcode update data block encoded in Device Tree to the bootstrap
processor but not passed to the other CPUs when multiprocessing is enabled.

If the bootstrap processor successfully performs a microcode update
from Device Tree, use the same data block for the other processors.

Signed-off-by: Ivan Gorinov <ivan.gorinov@intel.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
[bmeng: fixed build errors on edison and qemu-x86]
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/cpu/intel_common/car.S
arch/x86/cpu/intel_common/microcode.c
arch/x86/include/asm/microcode.h
arch/x86/lib/fsp/fsp_car.S

index fe8dfbc9ca6ec9e57ca2d45740468c3885239a39..52a77bb2d18819cd705b9a28b8a0d944a3c1dd75 100644 (file)
@@ -239,4 +239,6 @@ _dt_ucode_base_size:
 .globl ucode_base
 ucode_base:    /* Declared in microcode.h */
        .long   0                       /* microcode base */
+.globl ucode_size
+ucode_size:    /* Declared in microcode.h */
        .long   0                       /* microcode size */
index 11b1ec89553e00bfcc0b68c9bed5ef84ec73d3f2..c7a539d281942d63ec2b19e3b38d15450c46ead3 100644 (file)
@@ -43,8 +43,6 @@ static int microcode_decode_node(const void *blob, int node,
        update->data = fdt_getprop(blob, node, "data", &update->size);
        if (!update->data)
                return -ENOENT;
-       update->data += UCODE_HEADER_LEN;
-       update->size -= UCODE_HEADER_LEN;
 
        update->header_version = fdtdec_get_int(blob, node,
                                                "intel,header-version", 0);
@@ -124,6 +122,7 @@ static void microcode_read_cpu(struct microcode_update *cpu)
 int microcode_update_intel(void)
 {
        struct microcode_update cpu, update;
+       ulong address;
        const void *blob = gd->fdt_blob;
        int skipped;
        int count;
@@ -167,7 +166,8 @@ int microcode_update_intel(void)
                        skipped++;
                        continue;
                }
-               wrmsr(MSR_IA32_UCODE_WRITE, (ulong)update.data, 0);
+               address = (ulong)update.data + UCODE_HEADER_LEN;
+               wrmsr(MSR_IA32_UCODE_WRITE, address, 0);
                rev = microcode_read_rev();
                debug("microcode: updated to revision 0x%x date=%04x-%02x-%02x\n",
                      rev, update.date_code & 0xffff,
@@ -178,5 +178,9 @@ int microcode_update_intel(void)
                        return -EFAULT;
                }
                count++;
+               if (!ucode_base) {
+                       ucode_base = (ulong)update.data;
+                       ucode_size = update.size;
+               }
        } while (1);
 }
index f7b32a5eb166aebda168fe7d1b294ea433c7a7a1..4ab75049315d3b301692e5fd4290d33af02f5958 100644 (file)
@@ -10,6 +10,7 @@
 
 /* This is a declaration for ucode_base in start.S */
 extern u32 ucode_base;
+extern u32 ucode_size;
 
 /**
  * microcode_update_intel() - Apply microcode updates
index 549d863070bcf8cc3e2e17f7720c37849711f0d7..48edc8362a7edde632a33abfb1f3520978192e8f 100644 (file)
@@ -102,8 +102,10 @@ temp_ram_init_params:
 _dt_ucode_base_size:
        /* These next two fields are filled in by ifdtool */
 .globl ucode_base
-ucode_base:    /* Declared in micrcode.h */
+ucode_base:    /* Declared in microcode.h */
        .long   0                       /* microcode base */
+.globl ucode_size
+ucode_size:    /* Declared in microcode.h */
        .long   0                       /* microcode size */
        .long   CONFIG_SYS_MONITOR_BASE /* code region base */
        .long   CONFIG_SYS_MONITOR_LEN  /* code region size */