summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Cheatham <Benjamin.Cheatham@amd.com>2024-09-27 11:34:28 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-10-10 12:00:41 +0200
commitc34d1aac89226af8eeceab55c8401eb755d7c51d (patch)
treed731df88b2f8c8f3d152b6bbc864f4c85d7c6c28
parent4902a6a0dc593c82055fc8c9ada371bafe26c9cc (diff)
downloadlinux-stable-c34d1aac89226af8eeceab55c8401eb755d7c51d.tar.gz
linux-stable-c34d1aac89226af8eeceab55c8401eb755d7c51d.tar.bz2
linux-stable-c34d1aac89226af8eeceab55c8401eb755d7c51d.zip
EINJ, CXL: Fix CXL device SBDF calculation
[ Upstream commit ee1e3c46ed19c096be22472c728fa7f68b1352c4 ] The SBDF of the target CXL 2.0 compliant root port is required to inject a CXL protocol error as per ACPI 6.5. The SBDF given has to be in the following format: 31 24 23 16 15 11 10 8 7 0 +-------------------------------------------------+ | segment | bus | device | function | reserved | +-------------------------------------------------+ The SBDF calculated in cxl_dport_get_sbdf() doesn't account for the reserved bits currently, causing the wrong SBDF to be used. Fix said calculation to properly shift the SBDF. Without this fix, error injection into CXL 2.0 root ports through the CXL debugfs interface (<debugfs>/cxl) is broken. Injection through the legacy interface (<debugfs>/apei/einj/) will still work because the SBDF is manually provided by the user. Fixes: 12fb28ea6b1cf ("EINJ: Add CXL error type support") Signed-off-by: Ben Cheatham <Benjamin.Cheatham@amd.com> Reviewed-by: Dan Williams <dan.j.williams@intel.com> Tested-by: Srinivasulu Thanneeru <sthanneeru.opensrc@micron.com> Reviewed-by: Srinivasulu Thanneeru <sthanneeru.opensrc@micron.com> Link: https://patch.msgid.link/20240927163428.366557-1-Benjamin.Cheatham@amd.com Signed-off-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/acpi/apei/einj-cxl.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/acpi/apei/einj-cxl.c b/drivers/acpi/apei/einj-cxl.c
index 8b8be0c90709..d64e2713aae4 100644
--- a/drivers/acpi/apei/einj-cxl.c
+++ b/drivers/acpi/apei/einj-cxl.c
@@ -63,7 +63,7 @@ static int cxl_dport_get_sbdf(struct pci_dev *dport_dev, u64 *sbdf)
seg = bridge->domain_nr;
bus = pbus->number;
- *sbdf = (seg << 24) | (bus << 16) | dport_dev->devfn;
+ *sbdf = (seg << 24) | (bus << 16) | (dport_dev->devfn << 8);
return 0;
}