@@ -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;
@@ -563,11 +571,12 @@ void __init load_ucode_amd_bsp(struct early_load_data *ed, unsigned int cpuid_1_
563
571
struct cont_desc desc = { };
564
572
struct microcode_amd * mc ;
565
573
struct cpio_data cp = { };
566
- u32 dummy ;
574
+ u32 rev ;
567
575
568
576
bsp_cpuid_1_eax = cpuid_1_eax ;
569
577
570
- native_rdmsr (MSR_AMD64_PATCH_LEVEL , ed -> old_rev , dummy );
578
+ rev = get_patch_level ();
579
+ ed -> old_rev = rev ;
571
580
572
581
/* Needed in load_microcode_amd() */
573
582
ucode_cpu_info [0 ].cpu_sig .sig = cpuid_1_eax ;
@@ -589,8 +598,8 @@ void __init load_ucode_amd_bsp(struct early_load_data *ed, unsigned int cpuid_1_
589
598
if (ed -> old_rev > mc -> hdr .patch_id )
590
599
return ;
591
600
592
- if (__apply_microcode_amd (mc , desc .psize ))
593
- native_rdmsr ( MSR_AMD64_PATCH_LEVEL , ed -> new_rev , dummy ) ;
601
+ if (__apply_microcode_amd (mc , & rev , desc .psize ))
602
+ ed -> new_rev = rev ;
594
603
}
595
604
596
605
static inline bool patch_cpus_equivalent (struct ucode_patch * p ,
@@ -692,14 +701,9 @@ static void free_cache(void)
692
701
static struct ucode_patch * find_patch (unsigned int cpu )
693
702
{
694
703
struct ucode_cpu_info * uci = ucode_cpu_info + cpu ;
695
- u32 rev , dummy __always_unused ;
696
704
u16 equiv_id = 0 ;
697
705
698
- /* fetch rev if not populated yet: */
699
- if (!uci -> cpu_sig .rev ) {
700
- rdmsr (MSR_AMD64_PATCH_LEVEL , rev , dummy );
701
- uci -> cpu_sig .rev = rev ;
702
- }
706
+ uci -> cpu_sig .rev = get_patch_level ();
703
707
704
708
if (x86_family (bsp_cpuid_1_eax ) < 0x17 ) {
705
709
equiv_id = find_equiv_id (& equiv_table , uci -> cpu_sig .sig );
@@ -722,22 +726,20 @@ void reload_ucode_amd(unsigned int cpu)
722
726
723
727
mc = p -> data ;
724
728
725
- rdmsr (MSR_AMD64_PATCH_LEVEL , rev , dummy );
726
-
729
+ rev = get_patch_level ();
727
730
if (rev < mc -> hdr .patch_id ) {
728
- if (__apply_microcode_amd (mc , p -> size ))
729
- pr_info_once ("reload revision: 0x%08x\n" , mc -> hdr . patch_id );
731
+ if (__apply_microcode_amd (mc , & rev , p -> size ))
732
+ pr_info_once ("reload revision: 0x%08x\n" , rev );
730
733
}
731
734
}
732
735
733
736
static int collect_cpu_info_amd (int cpu , struct cpu_signature * csig )
734
737
{
735
- struct cpuinfo_x86 * c = & cpu_data (cpu );
736
738
struct ucode_cpu_info * uci = ucode_cpu_info + cpu ;
737
739
struct ucode_patch * p ;
738
740
739
741
csig -> sig = cpuid_eax (0x00000001 );
740
- csig -> rev = c -> microcode ;
742
+ csig -> rev = get_patch_level () ;
741
743
742
744
/*
743
745
* a patch could have been loaded early, set uci->mc so that
@@ -778,7 +780,7 @@ static enum ucode_state apply_microcode_amd(int cpu)
778
780
goto out ;
779
781
}
780
782
781
- if (!__apply_microcode_amd (mc_amd , p -> size )) {
783
+ if (!__apply_microcode_amd (mc_amd , & rev , p -> size )) {
782
784
pr_err ("CPU%d: update failed for patch_level=0x%08x\n" ,
783
785
cpu , mc_amd -> hdr .patch_id );
784
786
return UCODE_ERROR ;
0 commit comments