summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorYazen Ghannam <yazen.ghannam@amd.com>2023-04-03 16:42:44 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-07-05 09:00:30 +0200
commitd4e52b36c73f44d2b5f41d0cd3f57b3d2efbf180 (patch)
treee04b923fae6a4b2ce2e43589a7447f3b3c6c6324 /arch
parent4c003aef56d5642aefd4d11ee9d7e6755d4c1a6e (diff)
downloadlinux-stable-d4e52b36c73f44d2b5f41d0cd3f57b3d2efbf180.tar.gz
linux-stable-d4e52b36c73f44d2b5f41d0cd3f57b3d2efbf180.tar.bz2
linux-stable-d4e52b36c73f44d2b5f41d0cd3f57b3d2efbf180.zip
x86/amd_nb: Check for invalid SMN reads
[ Upstream commit c625dabbf1c4a8e77e4734014f2fde7aa9071a1f ] 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: ddfe43cdc0da ("x86/amd_nb: Add SMN and Indirect Data Fabric access for AMD Fam17h") Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20230403164244.471141-1-yazen.ghannam@amd.com Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kernel/amd_nb.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/arch/x86/kernel/amd_nb.c b/arch/x86/kernel/amd_nb.c
index 923b4bac9613..ef1fa51ea98e 100644
--- a/arch/x86/kernel/amd_nb.c
+++ b/arch/x86/kernel/amd_nb.c
@@ -145,7 +145,14 @@ out:
int amd_smn_read(u16 node, u32 address, u32 *value)
{
- return __amd_smn_rw(node, address, value, false);
+ int err = __amd_smn_rw(node, address, value, false);
+
+ if (PCI_POSSIBLE_ERROR(*value)) {
+ err = -ENODEV;
+ *value = 0;
+ }
+
+ return err;
}
EXPORT_SYMBOL_GPL(amd_smn_read);