cxl/pci: Get AER capability address from RCRB only for RCH dport
authorLi Ming <ming4.li@intel.com>
Fri, 9 Aug 2024 08:27:49 +0000 (08:27 +0000)
committerDave Jiang <dave.jiang@intel.com>
Fri, 9 Aug 2024 22:13:07 +0000 (15:13 -0700)
cxl_setup_parent_dport() needs to get RCH dport AER capability address
from RCRB to disable AER interrupt. The function does not check if dport
is RCH dport, it will get a wrong pci_host_bridge structure by dport_dev
in VH case because dport_dev points to a pci device(RP or switch DSP)
rather than a pci host bridge device.

Fixes: f05fd10d138d ("cxl/pci: Add RCH downstream port AER register discovery")
Signed-off-by: Li Ming <ming4.li@intel.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Tested-by: Ira Weiny <ira.weiny@intel.com>
Tested-by: Alison Schofield <alison.schofield@intel.com>
Link: https://patch.msgid.link/20240809082750.3015641-2-ming4.li@intel.com
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
drivers/cxl/core/pci.c

index a663e7566c480d8c684aa7681f3de4371cad0a85..51132a575b2766a6409124e894d340903bff64bb 100644 (file)
@@ -834,11 +834,13 @@ static void cxl_disable_rch_root_ints(struct cxl_dport *dport)
 void cxl_setup_parent_dport(struct device *host, struct cxl_dport *dport)
 {
        struct device *dport_dev = dport->dport_dev;
-       struct pci_host_bridge *host_bridge;
 
-       host_bridge = to_pci_host_bridge(dport_dev);
-       if (host_bridge->native_aer)
-               dport->rcrb.aer_cap = cxl_rcrb_to_aer(dport_dev, dport->rcrb.base);
+       if (dport->rch) {
+               struct pci_host_bridge *host_bridge = to_pci_host_bridge(dport_dev);
+
+               if (host_bridge->native_aer)
+                       dport->rcrb.aer_cap = cxl_rcrb_to_aer(dport_dev, dport->rcrb.base);
+       }
 
        dport->reg_map.host = host;
        cxl_dport_map_regs(dport);