x86: ivybridge: Allow microcode to be collated
authorSimon Glass <sjg@chromium.org>
Tue, 26 Jul 2016 00:58:58 +0000 (18:58 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Tue, 30 Aug 2016 01:26:05 +0000 (09:26 +0800)
Generally the microcode is combined into a single block only (and removed
from the device tree) when there are multiple blocks. But this is not a
requirement.

Adjust the ivybridge code to avoid assuming this.

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

index daf0d69494a14b6e7d52d041d6864eb8c6606d85..eac5b781e94cba1ad69275903554c7c723655e61 100644 (file)
@@ -43,7 +43,7 @@ static int microcode_decode_node(const void *blob, int node,
 {
        update->data = fdt_getprop(blob, node, "data", &update->size);
        if (!update->data)
-               return -EINVAL;
+               return -ENOENT;
        update->data += UCODE_HEADER_LEN;
        update->size -= UCODE_HEADER_LEN;
 
@@ -145,6 +145,16 @@ int microcode_update_intel(void)
                }
 
                ret = microcode_decode_node(blob, node, &update);
+               if (ret == -ENOENT && ucode_base) {
+                       /*
+                        * The microcode has been removed from the device tree
+                        * in the build system. In that case it will have
+                        * already been updated in car_init().
+                        */
+                       debug("%s: Microcode data not available\n", __func__);
+                       skipped++;
+                       continue;
+               }
                if (ret) {
                        debug("%s: Unable to decode update: %d\n", __func__,
                              ret);