Skip to content

Commit c625dab

Browse files
yghannambp3tk0v
authored andcommitted
x86/amd_nb: Check for invalid SMN reads
AMD Zen-based systems use a System Management Network (SMN) that provides access to implementation-specific registers. SMN accesses are done indirectly through an index/data pair in PCI config space. The PCI config access may fail and return an error code. This would prevent the "read" value from being updated. However, the PCI config access may succeed, but the return value may be invalid. This is in similar fashion to PCI bad reads, i.e. return all bits set. Most systems will return 0 for SMN addresses that are not accessible. This is in line with AMD convention that unavailable registers are Read-as-Zero/Writes-Ignored. However, some systems will return a "PCI Error Response" instead. This value, along with an error code of 0 from the PCI config access, will confuse callers of the amd_smn_read() function. Check for this condition, clear the return value, and set a proper error code. Fixes: ddfe43c ("x86/amd_nb: Add SMN and Indirect Data Fabric access for AMD Fam17h") Signed-off-by: Yazen Ghannam <[email protected]> Signed-off-by: Borislav Petkov (AMD) <[email protected]> Cc: [email protected] Link: https://lore.kernel.org/r/[email protected]
1 parent 93c1800 commit c625dab

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

arch/x86/kernel/amd_nb.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,14 @@ static int __amd_smn_rw(u16 node, u32 address, u32 *value, bool write)
215215

216216
int amd_smn_read(u16 node, u32 address, u32 *value)
217217
{
218-
return __amd_smn_rw(node, address, value, false);
218+
int err = __amd_smn_rw(node, address, value, false);
219+
220+
if (PCI_POSSIBLE_ERROR(*value)) {
221+
err = -ENODEV;
222+
*value = 0;
223+
}
224+
225+
return err;
219226
}
220227
EXPORT_SYMBOL_GPL(amd_smn_read);
221228

0 commit comments

Comments
 (0)