hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/arch/x86/kernel/cpu/microcode/amd.c
....@@ -55,7 +55,9 @@
5555 };
5656
5757 static u32 ucode_new_rev;
58
-static u8 amd_ucode_patch[PATCH_MAX_SIZE];
58
+
59
+/* One blob per node. */
60
+static u8 amd_ucode_patch[MAX_NUMNODES][PATCH_MAX_SIZE];
5961
6062 /*
6163 * Microcode patch container file is prepended to the initrd in cpio
....@@ -429,7 +431,7 @@
429431 patch = (u8 (*)[PATCH_MAX_SIZE])__pa_nodebug(&amd_ucode_patch);
430432 #else
431433 new_rev = &ucode_new_rev;
432
- patch = &amd_ucode_patch;
434
+ patch = &amd_ucode_patch[0];
433435 #endif
434436
435437 desc.cpuid_1_eax = cpuid_1_eax;
....@@ -548,8 +550,7 @@
548550 apply_microcode_early_amd(cpuid_1_eax, cp.data, cp.size, false);
549551 }
550552
551
-static enum ucode_state
552
-load_microcode_amd(bool save, u8 family, const u8 *data, size_t size);
553
+static enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size);
553554
554555 int __init save_microcode_in_initrd_amd(unsigned int cpuid_1_eax)
555556 {
....@@ -567,19 +568,19 @@
567568 if (!desc.mc)
568569 return -EINVAL;
569570
570
- ret = load_microcode_amd(true, x86_family(cpuid_1_eax), desc.data, desc.size);
571
+ ret = load_microcode_amd(x86_family(cpuid_1_eax), desc.data, desc.size);
571572 if (ret > UCODE_UPDATED)
572573 return -EINVAL;
573574
574575 return 0;
575576 }
576577
577
-void reload_ucode_amd(void)
578
+void reload_ucode_amd(unsigned int cpu)
578579 {
579
- struct microcode_amd *mc;
580580 u32 rev, dummy __always_unused;
581
+ struct microcode_amd *mc;
581582
582
- mc = (struct microcode_amd *)amd_ucode_patch;
583
+ mc = (struct microcode_amd *)amd_ucode_patch[cpu_to_node(cpu)];
583584
584585 rdmsr(MSR_AMD64_PATCH_LEVEL, rev, dummy);
585586
....@@ -699,7 +700,7 @@
699700 rdmsr(MSR_AMD64_PATCH_LEVEL, rev, dummy);
700701
701702 /* need to apply patch? */
702
- if (rev >= mc_amd->hdr.patch_id) {
703
+ if (rev > mc_amd->hdr.patch_id) {
703704 ret = UCODE_OK;
704705 goto out;
705706 }
....@@ -845,9 +846,10 @@
845846 return UCODE_OK;
846847 }
847848
848
-static enum ucode_state
849
-load_microcode_amd(bool save, u8 family, const u8 *data, size_t size)
849
+static enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size)
850850 {
851
+ struct cpuinfo_x86 *c;
852
+ unsigned int nid, cpu;
851853 struct ucode_patch *p;
852854 enum ucode_state ret;
853855
....@@ -860,22 +862,22 @@
860862 return ret;
861863 }
862864
863
- p = find_patch(0);
864
- if (!p) {
865
- return ret;
866
- } else {
867
- if (boot_cpu_data.microcode >= p->patch_id)
868
- return ret;
865
+ for_each_node(nid) {
866
+ cpu = cpumask_first(cpumask_of_node(nid));
867
+ c = &cpu_data(cpu);
868
+
869
+ p = find_patch(cpu);
870
+ if (!p)
871
+ continue;
872
+
873
+ if (c->microcode >= p->patch_id)
874
+ continue;
869875
870876 ret = UCODE_NEW;
877
+
878
+ memset(&amd_ucode_patch[nid], 0, PATCH_MAX_SIZE);
879
+ memcpy(&amd_ucode_patch[nid], p->data, min_t(u32, p->size, PATCH_MAX_SIZE));
871880 }
872
-
873
- /* save BSP's matching patch for early load */
874
- if (!save)
875
- return ret;
876
-
877
- memset(amd_ucode_patch, 0, PATCH_MAX_SIZE);
878
- memcpy(amd_ucode_patch, p->data, min_t(u32, p->size, PATCH_MAX_SIZE));
879881
880882 return ret;
881883 }
....@@ -901,12 +903,11 @@
901903 {
902904 char fw_name[36] = "amd-ucode/microcode_amd.bin";
903905 struct cpuinfo_x86 *c = &cpu_data(cpu);
904
- bool bsp = c->cpu_index == boot_cpu_data.cpu_index;
905906 enum ucode_state ret = UCODE_NFOUND;
906907 const struct firmware *fw;
907908
908909 /* reload ucode container only on the boot cpu */
909
- if (!refresh_fw || !bsp)
910
+ if (!refresh_fw)
910911 return UCODE_OK;
911912
912913 if (c->x86 >= 0x15)
....@@ -921,7 +922,7 @@
921922 if (!verify_container(fw->data, fw->size, false))
922923 goto fw_release;
923924
924
- ret = load_microcode_amd(bsp, c->x86, fw->data, fw->size);
925
+ ret = load_microcode_amd(c->x86, fw->data, fw->size);
925926
926927 fw_release:
927928 release_firmware(fw);