cpu/intel/microcode: Have API to re-load microcode patch

This patch introduces a newer API to reload the microcode patch when
SoC selects RELOAD_MICROCODE_PATCH config.

Expected to call this API being independent of CPU MP Init regular
flow hence, doesn't regress the boot time.

BUG=b:233199592
TEST=Build and boot google/kano to ChromeOS.

Signed-off-by: Subrata Banik <subratabanik@google.com>
Change-Id: If480e44b88d04e5cb25d7104961b70f7be041a23
Reviewed-on: https://review.coreboot.org/c/coreboot/+/65156
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Werner Zeh <werner.zeh@siemens.com>
Reviewed-by: Lean Sheng Tan <sheng.tan@9elements.com>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
This commit is contained in:
Subrata Banik 2022-06-15 21:24:13 +05:30 committed by Felix Held
parent d36aca5e22
commit bd0aef0f2a
2 changed files with 36 additions and 0 deletions

View File

@ -250,6 +250,38 @@ void intel_update_microcode_from_cbfs(void)
spin_unlock(&microcode_lock); spin_unlock(&microcode_lock);
} }
void intel_reload_microcode(void)
{
if (!CONFIG(RELOAD_MICROCODE_PATCH))
return;
u32 current_rev;
msr_t msr;
const struct microcode *m = intel_microcode_find();
if (!m) {
printk(BIOS_ERR, "microcode: failed because no ucode was found\n");
return;
}
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 ENV_RAMSTAGE #if ENV_RAMSTAGE
__weak int soc_skip_ucode_update(u32 current_patch_id, __weak int soc_skip_ucode_update(u32 current_patch_id,
u32 new_patch_id) u32 new_patch_id)

View File

@ -4,6 +4,10 @@
#include <stdint.h> #include <stdint.h>
/* Find the microcode and reload the microcode if SoC has RELOAD_MICROCODE_PATCH
* config selected. */
void intel_reload_microcode(void);
void intel_update_microcode_from_cbfs(void); void intel_update_microcode_from_cbfs(void);
/* Find a microcode that matches the revision and platform family returning /* Find a microcode that matches the revision and platform family returning
* NULL if none found. The found microcode is cached for faster access on * NULL if none found. The found microcode is cached for faster access on