|
@@ -589,6 +589,17 @@ static int apply_microcode_early(struct ucode_cpu_info *uci, bool early)
|
|
|
if (!mc)
|
|
|
return 0;
|
|
|
|
|
|
+ /*
|
|
|
+ * Save us the MSR write below - which is a particular expensive
|
|
|
+ * operation - when the other hyperthread has updated the microcode
|
|
|
+ * already.
|
|
|
+ */
|
|
|
+ rev = intel_get_microcode_revision();
|
|
|
+ if (rev >= mc->hdr.rev) {
|
|
|
+ uci->cpu_sig.rev = rev;
|
|
|
+ return UCODE_OK;
|
|
|
+ }
|
|
|
+
|
|
|
/* write microcode via MSR 0x79 */
|
|
|
native_wrmsrl(MSR_IA32_UCODE_WRITE, (unsigned long)mc->bits);
|
|
|
|
|
@@ -776,7 +787,7 @@ static enum ucode_state apply_microcode_intel(int cpu)
|
|
|
{
|
|
|
struct microcode_intel *mc;
|
|
|
struct ucode_cpu_info *uci;
|
|
|
- struct cpuinfo_x86 *c;
|
|
|
+ struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
|
static int prev_rev;
|
|
|
u32 rev;
|
|
|
|
|
@@ -793,6 +804,18 @@ static enum ucode_state apply_microcode_intel(int cpu)
|
|
|
return UCODE_NFOUND;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Save us the MSR write below - which is a particular expensive
|
|
|
+ * operation - when the other hyperthread has updated the microcode
|
|
|
+ * already.
|
|
|
+ */
|
|
|
+ rev = intel_get_microcode_revision();
|
|
|
+ if (rev >= mc->hdr.rev) {
|
|
|
+ uci->cpu_sig.rev = rev;
|
|
|
+ c->microcode = rev;
|
|
|
+ return UCODE_OK;
|
|
|
+ }
|
|
|
+
|
|
|
/* write microcode via MSR 0x79 */
|
|
|
wrmsrl(MSR_IA32_UCODE_WRITE, (unsigned long)mc->bits);
|
|
|
|
|
@@ -813,8 +836,6 @@ static enum ucode_state apply_microcode_intel(int cpu)
|
|
|
prev_rev = rev;
|
|
|
}
|
|
|
|
|
|
- c = &cpu_data(cpu);
|
|
|
-
|
|
|
uci->cpu_sig.rev = rev;
|
|
|
c->microcode = rev;
|
|
|
|