]> git.dujemihanovic.xyz Git - linux.git/commitdiff
EINJ, CXL: Fix CXL device SBDF calculation
authorBen Cheatham <Benjamin.Cheatham@amd.com>
Fri, 27 Sep 2024 16:34:28 +0000 (11:34 -0500)
committerIra Weiny <ira.weiny@intel.com>
Mon, 30 Sep 2024 13:10:39 +0000 (08:10 -0500)
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>
drivers/acpi/apei/einj-cxl.c

index 4f81a119ec0896b4b93601865d783d56f24c76dc..a4e709937236f66146790c044df473b151257892 100644 (file)
@@ -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;
 }