|
@@ -390,15 +390,8 @@ static int collect_cpu_info_early(struct ucode_cpu_info *uci)
|
|
|
native_rdmsr(MSR_IA32_PLATFORM_ID, val[0], val[1]);
|
|
|
csig.pf = 1 << ((val[1] >> 18) & 7);
|
|
|
}
|
|
|
- native_wrmsrl(MSR_IA32_UCODE_REV, 0);
|
|
|
|
|
|
- /* As documented in the SDM: Do a CPUID 1 here */
|
|
|
- native_cpuid_eax(1);
|
|
|
-
|
|
|
- /* get the current revision from MSR 0x8B */
|
|
|
- native_rdmsr(MSR_IA32_UCODE_REV, val[0], val[1]);
|
|
|
-
|
|
|
- csig.rev = val[1];
|
|
|
+ csig.rev = intel_get_microcode_revision();
|
|
|
|
|
|
uci->cpu_sig = csig;
|
|
|
uci->valid = 1;
|
|
@@ -582,7 +575,7 @@ static inline void print_ucode(struct ucode_cpu_info *uci)
|
|
|
static int apply_microcode_early(struct ucode_cpu_info *uci, bool early)
|
|
|
{
|
|
|
struct microcode_intel *mc;
|
|
|
- unsigned int val[2];
|
|
|
+ u32 rev;
|
|
|
|
|
|
mc = uci->mc;
|
|
|
if (!mc)
|
|
@@ -590,21 +583,16 @@ static int apply_microcode_early(struct ucode_cpu_info *uci, bool early)
|
|
|
|
|
|
/* write microcode via MSR 0x79 */
|
|
|
native_wrmsrl(MSR_IA32_UCODE_WRITE, (unsigned long)mc->bits);
|
|
|
- native_wrmsrl(MSR_IA32_UCODE_REV, 0);
|
|
|
|
|
|
- /* As documented in the SDM: Do a CPUID 1 here */
|
|
|
- native_cpuid_eax(1);
|
|
|
-
|
|
|
- /* get the current revision from MSR 0x8B */
|
|
|
- native_rdmsr(MSR_IA32_UCODE_REV, val[0], val[1]);
|
|
|
- if (val[1] != mc->hdr.rev)
|
|
|
+ rev = intel_get_microcode_revision();
|
|
|
+ if (rev != mc->hdr.rev)
|
|
|
return -1;
|
|
|
|
|
|
#ifdef CONFIG_X86_64
|
|
|
/* Flush global tlb. This is precaution. */
|
|
|
flush_tlb_early();
|
|
|
#endif
|
|
|
- uci->cpu_sig.rev = val[1];
|
|
|
+ uci->cpu_sig.rev = rev;
|
|
|
|
|
|
if (early)
|
|
|
print_ucode(uci);
|
|
@@ -784,8 +772,8 @@ static int apply_microcode_intel(int cpu)
|
|
|
struct microcode_intel *mc;
|
|
|
struct ucode_cpu_info *uci;
|
|
|
struct cpuinfo_x86 *c;
|
|
|
- unsigned int val[2];
|
|
|
static int prev_rev;
|
|
|
+ u32 rev;
|
|
|
|
|
|
/* We should bind the task to the CPU */
|
|
|
if (WARN_ON(raw_smp_processor_id() != cpu))
|
|
@@ -802,33 +790,28 @@ static int apply_microcode_intel(int cpu)
|
|
|
|
|
|
/* write microcode via MSR 0x79 */
|
|
|
wrmsrl(MSR_IA32_UCODE_WRITE, (unsigned long)mc->bits);
|
|
|
- wrmsrl(MSR_IA32_UCODE_REV, 0);
|
|
|
-
|
|
|
- /* As documented in the SDM: Do a CPUID 1 here */
|
|
|
- native_cpuid_eax(1);
|
|
|
|
|
|
- /* get the current revision from MSR 0x8B */
|
|
|
- rdmsr(MSR_IA32_UCODE_REV, val[0], val[1]);
|
|
|
+ rev = intel_get_microcode_revision();
|
|
|
|
|
|
- if (val[1] != mc->hdr.rev) {
|
|
|
+ if (rev != mc->hdr.rev) {
|
|
|
pr_err("CPU%d update to revision 0x%x failed\n",
|
|
|
cpu, mc->hdr.rev);
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- if (val[1] != prev_rev) {
|
|
|
+ if (rev != prev_rev) {
|
|
|
pr_info("updated to revision 0x%x, date = %04x-%02x-%02x\n",
|
|
|
- val[1],
|
|
|
+ rev,
|
|
|
mc->hdr.date & 0xffff,
|
|
|
mc->hdr.date >> 24,
|
|
|
(mc->hdr.date >> 16) & 0xff);
|
|
|
- prev_rev = val[1];
|
|
|
+ prev_rev = rev;
|
|
|
}
|
|
|
|
|
|
c = &cpu_data(cpu);
|
|
|
|
|
|
- uci->cpu_sig.rev = val[1];
|
|
|
- c->microcode = val[1];
|
|
|
+ uci->cpu_sig.rev = rev;
|
|
|
+ c->microcode = rev;
|
|
|
|
|
|
return 0;
|
|
|
}
|