diff options
Diffstat (limited to 'arch/x86/kernel/cpu/microcode')
| -rw-r--r-- | arch/x86/kernel/cpu/microcode/intel_early.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/arch/x86/kernel/cpu/microcode/intel_early.c b/arch/x86/kernel/cpu/microcode/intel_early.c index f04d0d6638ca..ec9df6f9cd47 100644 --- a/arch/x86/kernel/cpu/microcode/intel_early.c +++ b/arch/x86/kernel/cpu/microcode/intel_early.c | |||
| @@ -34,8 +34,6 @@ static struct mc_saved_data { | |||
| 34 | struct microcode_intel **mc_saved; | 34 | struct microcode_intel **mc_saved; |
| 35 | } mc_saved_data; | 35 | } mc_saved_data; |
| 36 | 36 | ||
| 37 | static struct microcode_intel bsp_patch; | ||
| 38 | |||
| 39 | static enum ucode_state | 37 | static enum ucode_state |
| 40 | generic_load_microcode_early(struct microcode_intel **mc_saved_p, | 38 | generic_load_microcode_early(struct microcode_intel **mc_saved_p, |
| 41 | unsigned int mc_saved_count, | 39 | unsigned int mc_saved_count, |
| @@ -717,8 +715,7 @@ _load_ucode_intel_bsp(struct mc_saved_data *mc_saved_data, | |||
| 717 | unsigned long *mc_saved_in_initrd, | 715 | unsigned long *mc_saved_in_initrd, |
| 718 | unsigned long initrd_start_early, | 716 | unsigned long initrd_start_early, |
| 719 | unsigned long initrd_end_early, | 717 | unsigned long initrd_end_early, |
| 720 | struct ucode_cpu_info *uci, | 718 | struct ucode_cpu_info *uci) |
| 721 | struct microcode_intel *bsp) | ||
| 722 | { | 719 | { |
| 723 | enum ucode_state ret; | 720 | enum ucode_state ret; |
| 724 | 721 | ||
| @@ -729,10 +726,8 @@ _load_ucode_intel_bsp(struct mc_saved_data *mc_saved_data, | |||
| 729 | ret = load_microcode(mc_saved_data, mc_saved_in_initrd, | 726 | ret = load_microcode(mc_saved_data, mc_saved_in_initrd, |
| 730 | initrd_start_early, uci); | 727 | initrd_start_early, uci); |
| 731 | 728 | ||
| 732 | if (ret == UCODE_OK) { | 729 | if (ret == UCODE_OK) |
| 733 | apply_microcode_early(uci, true); | 730 | apply_microcode_early(uci, true); |
| 734 | memcpy(bsp, uci->mc, sizeof(*bsp)); | ||
| 735 | } | ||
| 736 | } | 731 | } |
| 737 | 732 | ||
| 738 | void __init | 733 | void __init |
| @@ -741,12 +736,10 @@ load_ucode_intel_bsp(void) | |||
| 741 | u64 ramdisk_image, ramdisk_size; | 736 | u64 ramdisk_image, ramdisk_size; |
| 742 | unsigned long initrd_start_early, initrd_end_early; | 737 | unsigned long initrd_start_early, initrd_end_early; |
| 743 | struct ucode_cpu_info uci; | 738 | struct ucode_cpu_info uci; |
| 744 | struct microcode_intel *bsp_p; | ||
| 745 | #ifdef CONFIG_X86_32 | 739 | #ifdef CONFIG_X86_32 |
| 746 | struct boot_params *boot_params_p; | 740 | struct boot_params *boot_params_p; |
| 747 | 741 | ||
| 748 | boot_params_p = (struct boot_params *)__pa_nodebug(&boot_params); | 742 | boot_params_p = (struct boot_params *)__pa_nodebug(&boot_params); |
| 749 | bsp_p = (struct microcode_intel *)__pa_nodebug(&bsp_patch); | ||
| 750 | ramdisk_image = boot_params_p->hdr.ramdisk_image; | 743 | ramdisk_image = boot_params_p->hdr.ramdisk_image; |
| 751 | ramdisk_size = boot_params_p->hdr.ramdisk_size; | 744 | ramdisk_size = boot_params_p->hdr.ramdisk_size; |
| 752 | initrd_start_early = ramdisk_image; | 745 | initrd_start_early = ramdisk_image; |
| @@ -755,9 +748,8 @@ load_ucode_intel_bsp(void) | |||
| 755 | _load_ucode_intel_bsp( | 748 | _load_ucode_intel_bsp( |
| 756 | (struct mc_saved_data *)__pa_nodebug(&mc_saved_data), | 749 | (struct mc_saved_data *)__pa_nodebug(&mc_saved_data), |
| 757 | (unsigned long *)__pa_nodebug(&mc_saved_in_initrd), | 750 | (unsigned long *)__pa_nodebug(&mc_saved_in_initrd), |
| 758 | initrd_start_early, initrd_end_early, &uci, bsp_p); | 751 | initrd_start_early, initrd_end_early, &uci); |
| 759 | #else | 752 | #else |
| 760 | bsp_p = &bsp_patch; | ||
| 761 | ramdisk_image = boot_params.hdr.ramdisk_image; | 753 | ramdisk_image = boot_params.hdr.ramdisk_image; |
| 762 | ramdisk_size = boot_params.hdr.ramdisk_size; | 754 | ramdisk_size = boot_params.hdr.ramdisk_size; |
| 763 | initrd_start_early = ramdisk_image + PAGE_OFFSET; | 755 | initrd_start_early = ramdisk_image + PAGE_OFFSET; |
| @@ -765,7 +757,7 @@ load_ucode_intel_bsp(void) | |||
| 765 | 757 | ||
| 766 | _load_ucode_intel_bsp(&mc_saved_data, mc_saved_in_initrd, | 758 | _load_ucode_intel_bsp(&mc_saved_data, mc_saved_in_initrd, |
| 767 | initrd_start_early, initrd_end_early, | 759 | initrd_start_early, initrd_end_early, |
| 768 | &uci, bsp_p); | 760 | &uci); |
| 769 | #endif | 761 | #endif |
| 770 | } | 762 | } |
| 771 | 763 | ||
| @@ -805,11 +797,17 @@ void load_ucode_intel_ap(void) | |||
| 805 | void reload_ucode_intel(void) | 797 | void reload_ucode_intel(void) |
| 806 | { | 798 | { |
| 807 | struct ucode_cpu_info uci; | 799 | struct ucode_cpu_info uci; |
| 800 | enum ucode_state ret; | ||
| 808 | 801 | ||
| 809 | if (!bsp_patch.hdr.rev) | 802 | if (!mc_saved_data.mc_saved_count) |
| 810 | return; | 803 | return; |
| 811 | 804 | ||
| 812 | uci.mc = &bsp_patch; | 805 | collect_cpu_info_early(&uci); |
| 806 | |||
| 807 | ret = generic_load_microcode_early(mc_saved_data.mc_saved, | ||
| 808 | mc_saved_data.mc_saved_count, &uci); | ||
| 809 | if (ret != UCODE_OK) | ||
| 810 | return; | ||
| 813 | 811 | ||
| 814 | apply_microcode_early(&uci, false); | 812 | apply_microcode_early(&uci, false); |
| 815 | } | 813 | } |
