From e6294e0579897a682a823aefc99fe416c78aaf6e Mon Sep 17 00:00:00 2001
From: Simon Glass <sjg@chromium.org>
Date: Mon, 25 Jul 2016 18:58:58 -0600
Subject: [PATCH] x86: ivybridge: Allow microcode to be collated

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 | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/arch/x86/cpu/intel_common/microcode.c b/arch/x86/cpu/intel_common/microcode.c
index daf0d69494..eac5b781e9 100644
--- a/arch/x86/cpu/intel_common/microcode.c
+++ b/arch/x86/cpu/intel_common/microcode.c
@@ -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);
-- 
2.39.5