mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
x86/microcode/AMD: Handle the case of no BIOS microcode
Machines can be shipped without any microcode in the BIOS. Which means,
the microcode patch revision is 0.
Handle that gracefully.
Fixes: 94838d230a
("x86/microcode/AMD: Use the family,model,stepping encoded in the patch ID")
Reported-by: Vítek Vávra <vit.vavra.kh@gmail.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Cc: <stable@kernel.org>
This commit is contained in:
parent
24963ae1b0
commit
fcf8239ad6
@ -171,8 +171,28 @@ static int cmp_id(const void *key, const void *elem)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u32 cpuid_to_ucode_rev(unsigned int val)
|
||||||
|
{
|
||||||
|
union zen_patch_rev p = {};
|
||||||
|
union cpuid_1_eax c;
|
||||||
|
|
||||||
|
c.full = val;
|
||||||
|
|
||||||
|
p.stepping = c.stepping;
|
||||||
|
p.model = c.model;
|
||||||
|
p.ext_model = c.ext_model;
|
||||||
|
p.ext_fam = c.ext_fam;
|
||||||
|
|
||||||
|
return p.ucode_rev;
|
||||||
|
}
|
||||||
|
|
||||||
static bool need_sha_check(u32 cur_rev)
|
static bool need_sha_check(u32 cur_rev)
|
||||||
{
|
{
|
||||||
|
if (!cur_rev) {
|
||||||
|
cur_rev = cpuid_to_ucode_rev(bsp_cpuid_1_eax);
|
||||||
|
pr_info_once("No current revision, generating the lowest one: 0x%x\n", cur_rev);
|
||||||
|
}
|
||||||
|
|
||||||
switch (cur_rev >> 8) {
|
switch (cur_rev >> 8) {
|
||||||
case 0x80012: return cur_rev <= 0x800126f; break;
|
case 0x80012: return cur_rev <= 0x800126f; break;
|
||||||
case 0x80082: return cur_rev <= 0x800820f; break;
|
case 0x80082: return cur_rev <= 0x800820f; break;
|
||||||
@ -749,8 +769,6 @@ static struct ucode_patch *cache_find_patch(struct ucode_cpu_info *uci, u16 equi
|
|||||||
n.equiv_cpu = equiv_cpu;
|
n.equiv_cpu = equiv_cpu;
|
||||||
n.patch_id = uci->cpu_sig.rev;
|
n.patch_id = uci->cpu_sig.rev;
|
||||||
|
|
||||||
WARN_ON_ONCE(!n.patch_id);
|
|
||||||
|
|
||||||
list_for_each_entry(p, µcode_cache, plist)
|
list_for_each_entry(p, µcode_cache, plist)
|
||||||
if (patch_cpus_equivalent(p, &n, false))
|
if (patch_cpus_equivalent(p, &n, false))
|
||||||
return p;
|
return p;
|
||||||
|
Loading…
Reference in New Issue
Block a user