|
@@ -50,17 +50,17 @@ static int microcode_decode_node(const void *blob, int node,
|
|
|
update->date_code = fdtdec_get_int(blob, node,
|
|
|
"intel,date-code", 0);
|
|
|
update->processor_signature = fdtdec_get_int(blob, node,
|
|
|
- "intel.processor-signature", 0);
|
|
|
+ "intel,processor-signature", 0);
|
|
|
update->checksum = fdtdec_get_int(blob, node, "intel,checksum", 0);
|
|
|
update->loader_revision = fdtdec_get_int(blob, node,
|
|
|
- "loader-revision", 0);
|
|
|
+ "intel,loader-revision", 0);
|
|
|
update->processor_flags = fdtdec_get_int(blob, node,
|
|
|
- "processor-flags", 0);
|
|
|
+ "intel,processor-flags", 0);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static uint32_t microcode_read_rev(void)
|
|
|
+static inline uint32_t microcode_read_rev(void)
|
|
|
{
|
|
|
/*
|
|
|
* Some Intel CPUs can be very finicky about the CPUID sequence used.
|
|
@@ -116,6 +116,7 @@ int microcode_update_intel(void)
|
|
|
{
|
|
|
struct microcode_update cpu, update;
|
|
|
const void *blob = gd->fdt_blob;
|
|
|
+ int skipped;
|
|
|
int count;
|
|
|
int node;
|
|
|
int ret;
|
|
@@ -123,12 +124,13 @@ int microcode_update_intel(void)
|
|
|
microcode_read_cpu(&cpu);
|
|
|
node = 0;
|
|
|
count = 0;
|
|
|
+ skipped = 0;
|
|
|
do {
|
|
|
node = fdtdec_next_compatible(blob, node,
|
|
|
COMPAT_INTEL_MICROCODE);
|
|
|
if (node < 0) {
|
|
|
debug("%s: Found %d updates\n", __func__, count);
|
|
|
- return count ? 0 : -ENOENT;
|
|
|
+ return count ? 0 : skipped ? -EEXIST : -ENOENT;
|
|
|
}
|
|
|
|
|
|
ret = microcode_decode_node(blob, node, &update);
|
|
@@ -137,12 +139,15 @@ int microcode_update_intel(void)
|
|
|
ret);
|
|
|
return ret;
|
|
|
}
|
|
|
- if (update.processor_signature == cpu.processor_signature &&
|
|
|
- (update.processor_flags & cpu.processor_flags)) {
|
|
|
- debug("%s: Update already exists\n", __func__);
|
|
|
- return -EEXIST;
|
|
|
+ if (!(update.processor_signature == cpu.processor_signature &&
|
|
|
+ (update.processor_flags & cpu.processor_flags))) {
|
|
|
+ debug("%s: Skipping non-matching update, sig=%x, pf=%x\n",
|
|
|
+ __func__, update.processor_signature,
|
|
|
+ update.processor_flags);
|
|
|
+ skipped++;
|
|
|
+ continue;
|
|
|
}
|
|
|
-
|
|
|
+ ret = microcode_read_rev();
|
|
|
wrmsr(0x79, (ulong)update.data, 0);
|
|
|
debug("microcode: updated to revision 0x%x date=%04x-%02x-%02x\n",
|
|
|
microcode_read_rev(), update.date_code & 0xffff,
|