cpu/intel/microcode: Create helper function to load microcode patch
This patch refactors the microcode loading and reloading API with a
helper function that perform the actual MSR write operation after
taking the microcode pointer from the caller function.
Also, convert the microcode loading failure msg type from `BIOS_INFO`
to `BIOS_ERR` to catch the error in proper.
TEST=Able to perform microcode loading on google/kano.
Signed-off-by: Subrata Banik <subratabanik@google.com>
Change-Id: I9a7cdc2d2c9211f1e0c7921015126f7a1be87761
Reviewed-on: https://review.coreboot.org/c/coreboot/+/65249
Reviewed-by: Eric Lai <eric_lai@quanta.corp-partner.google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/src/cpu/intel/microcode/microcode.c b/src/cpu/intel/microcode/microcode.c
index 5ed6190..4c85a56 100644
--- a/src/cpu/intel/microcode/microcode.c
+++ b/src/cpu/intel/microcode/microcode.c
@@ -68,10 +68,30 @@
#define MICROCODE_CBFS_FILE "cpu_microcode_blob.bin"
-void intel_microcode_load_unlocked(const void *microcode_patch)
+static int load_microcode(const struct microcode *ucode_patch)
{
u32 current_rev;
msr_t msr;
+
+ msr.lo = (unsigned long)ucode_patch + sizeof(struct microcode);
+ msr.hi = 0;
+ wrmsr(IA32_BIOS_UPDT_TRIG, msr);
+
+ current_rev = read_microcode_rev();
+ if (current_rev == ucode_patch->rev) {
+ printk(BIOS_INFO, "microcode: updated to revision "
+ "0x%x date=%04x-%02x-%02x\n", read_microcode_rev(),
+ ucode_patch->date & 0xffff, (ucode_patch->date >> 24) & 0xff,
+ (ucode_patch->date >> 16) & 0xff);
+ return 0;
+ }
+
+ return -1;
+}
+
+void intel_microcode_load_unlocked(const void *microcode_patch)
+{
+ u32 current_rev;
const struct microcode *m = microcode_patch;
if (!m)
@@ -93,20 +113,9 @@
}
#endif
- msr.lo = (unsigned long)m + sizeof(struct microcode);
- msr.hi = 0;
- wrmsr(IA32_BIOS_UPDT_TRIG, msr);
-
- current_rev = read_microcode_rev();
- if (current_rev == m->rev) {
- printk(BIOS_INFO, "microcode: updated to revision "
- "0x%x date=%04x-%02x-%02x\n", read_microcode_rev(),
- m->date & 0xffff, (m->date >> 24) & 0xff,
- (m->date >> 16) & 0xff);
- return;
- }
-
- printk(BIOS_INFO, "microcode: Update failed\n");
+ printk(BIOS_INFO, "microcode: load microcode patch\n");
+ if (load_microcode(m) < 0)
+ printk(BIOS_ERR, "microcode: Update failed\n");
}
uint32_t get_current_microcode_rev(void)
@@ -255,8 +264,6 @@
if (!CONFIG(RELOAD_MICROCODE_PATCH))
return;
- u32 current_rev;
- msr_t msr;
const struct microcode *m = intel_microcode_find();
if (!m) {
@@ -266,20 +273,8 @@
printk(BIOS_INFO, "microcode: Re-load microcode patch\n");
- msr.lo = (unsigned long)m + sizeof(struct microcode);
- msr.hi = 0;
- wrmsr(IA32_BIOS_UPDT_TRIG, msr);
-
- current_rev = read_microcode_rev();
- if (current_rev == m->rev) {
- printk(BIOS_INFO, "microcode: updated to revision "
- "0x%x date=%04x-%02x-%02x\n", read_microcode_rev(),
- m->date & 0xffff, (m->date >> 24) & 0xff,
- (m->date >> 16) & 0xff);
- return;
- }
-
- printk(BIOS_ERR, "microcode: Re-load failed\n");
+ if (load_microcode(m) < 0)
+ printk(BIOS_ERR, "microcode: Re-load failed\n");
}
#if ENV_RAMSTAGE