aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBorislav Petkov <bp@suse.de>2018-02-28 05:28:45 -0500
committerThomas Gleixner <tglx@linutronix.de>2018-03-08 04:19:26 -0500
commitcfb52a5a09c8ae3a1dafb44ce549fde5b69e8117 (patch)
tree1fdbd2483d37be773484910ac7928341ff901d9c
parentd8c3b52c00a05036e0a6b315b4b17921a7b67997 (diff)
x86/microcode: Request microcode on the BSP
... so that any newer version can land in the cache and can later be fished out by the application functions. Do that before grabbing the hotplug lock. Signed-off-by: Borislav Petkov <bp@suse.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Tom Lendacky <thomas.lendacky@amd.com> Tested-by: Ashok Raj <ashok.raj@intel.com> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Cc: Arjan Van De Ven <arjan.van.de.ven@intel.com> Link: https://lkml.kernel.org/r/20180228102846.13447-7-bp@alien8.de
-rw-r--r--arch/x86/kernel/cpu/microcode/core.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c
index fa32cb3dcca5..5dd157d48606 100644
--- a/arch/x86/kernel/cpu/microcode/core.c
+++ b/arch/x86/kernel/cpu/microcode/core.c
@@ -499,15 +499,10 @@ static int check_online_cpus(void)
499static enum ucode_state reload_for_cpu(int cpu) 499static enum ucode_state reload_for_cpu(int cpu)
500{ 500{
501 struct ucode_cpu_info *uci = ucode_cpu_info + cpu; 501 struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
502 enum ucode_state ustate;
503 502
504 if (!uci->valid) 503 if (!uci->valid)
505 return UCODE_OK; 504 return UCODE_OK;
506 505
507 ustate = microcode_ops->request_microcode_fw(cpu, &microcode_pdev->dev, true);
508 if (ustate != UCODE_OK)
509 return ustate;
510
511 return apply_microcode_on_target(cpu); 506 return apply_microcode_on_target(cpu);
512} 507}
513 508
@@ -515,11 +510,11 @@ static ssize_t reload_store(struct device *dev,
515 struct device_attribute *attr, 510 struct device_attribute *attr,
516 const char *buf, size_t size) 511 const char *buf, size_t size)
517{ 512{
513 int cpu, bsp = boot_cpu_data.cpu_index;
518 enum ucode_state tmp_ret = UCODE_OK; 514 enum ucode_state tmp_ret = UCODE_OK;
519 bool do_callback = false; 515 bool do_callback = false;
520 unsigned long val; 516 unsigned long val;
521 ssize_t ret = 0; 517 ssize_t ret = 0;
522 int cpu;
523 518
524 ret = kstrtoul(buf, 0, &val); 519 ret = kstrtoul(buf, 0, &val);
525 if (ret) 520 if (ret)
@@ -528,6 +523,10 @@ static ssize_t reload_store(struct device *dev,
528 if (val != 1) 523 if (val != 1)
529 return size; 524 return size;
530 525
526 tmp_ret = microcode_ops->request_microcode_fw(bsp, &microcode_pdev->dev, true);
527 if (tmp_ret != UCODE_OK)
528 return size;
529
531 get_online_cpus(); 530 get_online_cpus();
532 531
533 ret = check_online_cpus(); 532 ret = check_online_cpus();