@@ -145,6 +145,15 @@ ucode_path[] __maybe_unused = "kernel/x86/microcode/AuthenticAMD.bin";
145
145
*/
146
146
static u32 bsp_cpuid_1_eax __ro_after_init ;
147
147
148
+ static u32 get_patch_level (void )
149
+ {
150
+ u32 rev , dummy __always_unused ;
151
+
152
+ native_rdmsr (MSR_AMD64_PATCH_LEVEL , rev , dummy );
153
+
154
+ return rev ;
155
+ }
156
+
148
157
static union cpuid_1_eax ucode_rev_to_cpuid (unsigned int val )
149
158
{
150
159
union zen_patch_rev p ;
@@ -483,10 +492,10 @@ static void scan_containers(u8 *ucode, size_t size, struct cont_desc *desc)
483
492
}
484
493
}
485
494
486
- static bool __apply_microcode_amd (struct microcode_amd * mc , unsigned int psize )
495
+ static bool __apply_microcode_amd (struct microcode_amd * mc , u32 * cur_rev ,
496
+ unsigned int psize )
487
497
{
488
498
unsigned long p_addr = (unsigned long )& mc -> hdr .data_code ;
489
- u32 rev , dummy ;
490
499
491
500
native_wrmsrl (MSR_AMD64_PATCH_LOADER , p_addr );
492
501
@@ -504,9 +513,8 @@ static bool __apply_microcode_amd(struct microcode_amd *mc, unsigned int psize)
504
513
}
505
514
506
515
/* verify patch application was successful */
507
- native_rdmsr (MSR_AMD64_PATCH_LEVEL , rev , dummy );
508
-
509
- if (rev != mc -> hdr .patch_id )
516
+ * cur_rev = get_patch_level ();
517
+ if (* cur_rev != mc -> hdr .patch_id )
510
518
return false;
511
519
512
520
return true;
@@ -564,11 +572,12 @@ void __init load_ucode_amd_bsp(struct early_load_data *ed, unsigned int cpuid_1_
564
572
struct cont_desc desc = { };
565
573
struct microcode_amd * mc ;
566
574
struct cpio_data cp = { };
567
- u32 dummy ;
575
+ u32 rev ;
568
576
569
577
bsp_cpuid_1_eax = cpuid_1_eax ;
570
578
571
- native_rdmsr (MSR_AMD64_PATCH_LEVEL , ed -> old_rev , dummy );
579
+ rev = get_patch_level ();
580
+ ed -> old_rev = rev ;
572
581
573
582
/* Needed in load_microcode_amd() */
574
583
ucode_cpu_info [0 ].cpu_sig .sig = cpuid_1_eax ;
@@ -590,8 +599,8 @@ void __init load_ucode_amd_bsp(struct early_load_data *ed, unsigned int cpuid_1_
590
599
if (ed -> old_rev > mc -> hdr .patch_id )
591
600
return ;
592
601
593
- if (__apply_microcode_amd (mc , desc .psize ))
594
- native_rdmsr ( MSR_AMD64_PATCH_LEVEL , ed -> new_rev , dummy ) ;
602
+ if (__apply_microcode_amd (mc , & rev , desc .psize ))
603
+ ed -> new_rev = rev ;
595
604
}
596
605
597
606
static inline bool patch_cpus_equivalent (struct ucode_patch * p ,
@@ -693,14 +702,9 @@ static void free_cache(void)
693
702
static struct ucode_patch * find_patch (unsigned int cpu )
694
703
{
695
704
struct ucode_cpu_info * uci = ucode_cpu_info + cpu ;
696
- u32 rev , dummy __always_unused ;
697
705
u16 equiv_id = 0 ;
698
706
699
- /* fetch rev if not populated yet: */
700
- if (!uci -> cpu_sig .rev ) {
701
- rdmsr (MSR_AMD64_PATCH_LEVEL , rev , dummy );
702
- uci -> cpu_sig .rev = rev ;
703
- }
707
+ uci -> cpu_sig .rev = get_patch_level ();
704
708
705
709
if (x86_family (bsp_cpuid_1_eax ) < 0x17 ) {
706
710
equiv_id = find_equiv_id (& equiv_table , uci -> cpu_sig .sig );
@@ -723,22 +727,20 @@ void reload_ucode_amd(unsigned int cpu)
723
727
724
728
mc = p -> data ;
725
729
726
- rdmsr (MSR_AMD64_PATCH_LEVEL , rev , dummy );
727
-
730
+ rev = get_patch_level ();
728
731
if (rev < mc -> hdr .patch_id ) {
729
- if (__apply_microcode_amd (mc , p -> size ))
730
- pr_info_once ("reload revision: 0x%08x\n" , mc -> hdr . patch_id );
732
+ if (__apply_microcode_amd (mc , & rev , p -> size ))
733
+ pr_info_once ("reload revision: 0x%08x\n" , rev );
731
734
}
732
735
}
733
736
734
737
static int collect_cpu_info_amd (int cpu , struct cpu_signature * csig )
735
738
{
736
- struct cpuinfo_x86 * c = & cpu_data (cpu );
737
739
struct ucode_cpu_info * uci = ucode_cpu_info + cpu ;
738
740
struct ucode_patch * p ;
739
741
740
742
csig -> sig = cpuid_eax (0x00000001 );
741
- csig -> rev = c -> microcode ;
743
+ csig -> rev = get_patch_level () ;
742
744
743
745
/*
744
746
* a patch could have been loaded early, set uci->mc so that
@@ -779,7 +781,7 @@ static enum ucode_state apply_microcode_amd(int cpu)
779
781
goto out ;
780
782
}
781
783
782
- if (!__apply_microcode_amd (mc_amd , p -> size )) {
784
+ if (!__apply_microcode_amd (mc_amd , & rev , p -> size )) {
783
785
pr_err ("CPU%d: update failed for patch_level=0x%08x\n" ,
784
786
cpu , mc_amd -> hdr .patch_id );
785
787
return UCODE_ERROR ;
0 commit comments