cxl/pci: Change CXL AER support check to use native AER
authorTerry Bowman <terry.bowman@amd.com>
Thu, 2 Nov 2023 15:52:32 +0000 (10:52 -0500)
committerDan Williams <dan.j.williams@intel.com>
Thu, 2 Nov 2023 21:09:01 +0000 (14:09 -0700)
Native CXL protocol errors are delivered to the OS through AER
reporting. The owner of AER owns CXL Protocol error management with
respect to _OSC negotiation.[1] CXL device errors are handled by a
separate interrupt with native control gated by _OSC control field
'CXL Memory Error Reporting Control'.

The CXL driver incorrectly checks for 'CXL Memory Error Reporting
Control' before accessing AER registers and caching RCH downport
AER registers. Replace the current check in these 2 cases with
native AER checks.

[1] CXL 3.0 - 9.17.2 CXL _OSC, Table-9-26, Interpretation of CXL
_OSC Support Fields, p.641

Fixes: f05fd10d138d ("cxl/pci: Add RCH downstream port AER register discovery")
Signed-off-by: Terry Bowman <terry.bowman@amd.com>
Reviewed-by: Smita Koralahalli <Smita.KoralahalliChannabasappa@amd.com>
Link: https://lore.kernel.org/r/20231102155232.1421261-1-terry.bowman@amd.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/core/pci.c

index 8c26e9fefa46c44fdcb4196b5902bca7f17325ec..eff20e83d0a64e8ba791a214f8fb4564135baded 100644 (file)
@@ -810,7 +810,7 @@ static void cxl_disable_rch_root_ints(struct cxl_dport *dport)
         * the root cmd register's interrupts is required. But, PCI spec
         * shows these are disabled by default on reset.
         */
-       if (bridge->native_cxl_error) {
+       if (bridge->native_aer) {
                aer_cmd_mask = (PCI_ERR_ROOT_CMD_COR_EN |
                                PCI_ERR_ROOT_CMD_NONFATAL_EN |
                                PCI_ERR_ROOT_CMD_FATAL_EN);
@@ -826,7 +826,7 @@ void cxl_setup_parent_dport(struct device *host, struct cxl_dport *dport)
        struct pci_host_bridge *host_bridge;
 
        host_bridge = to_pci_host_bridge(dport_dev);
-       if (host_bridge->native_cxl_error)
+       if (host_bridge->native_aer)
                dport->rcrb.aer_cap = cxl_rcrb_to_aer(dport_dev, dport->rcrb.base);
 
        dport->reg_map.host = host;