Skip to content

Commit 0619337

Browse files
committed
cxl/rch: Prepare for caching the MMIO mapped PCIe AER capability
Prepare cxl_probe_rcrb() for retrieving more than just the component register block. The RCH AER handling code wants to get back to the AER capability that happens to be MMIO mapped rather then configuration cycles. Move RCRB specific downstream port data, like the RCRB base and the AER capability offset, into its own data structure ('struct cxl_rcrb_info') for cxl_probe_rcrb() to fill. Extend 'struct cxl_dport' to include a 'struct cxl_rcrb_info' attribute. This centralizes all RCRB scanning in one routine. Co-developed-by: Robert Richter <rrichter@amd.com> Signed-off-by: Robert Richter <rrichter@amd.com> Signed-off-by: Terry Bowman <terry.bowman@amd.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Link: https://lore.kernel.org/r/20230622205523.85375-4-terry.bowman@amd.com Signed-off-by: Dan Williams <dan.j.williams@intel.com>
1 parent eb4663b commit 0619337

5 files changed

Lines changed: 18 additions & 8 deletions

File tree

drivers/cxl/core/core.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ enum cxl_rcrb {
6868
CXL_RCRB_DOWNSTREAM,
6969
CXL_RCRB_UPSTREAM,
7070
};
71-
resource_size_t __rcrb_to_component(struct device *dev, resource_size_t rcrb,
71+
struct cxl_rcrb_info;
72+
resource_size_t __rcrb_to_component(struct device *dev,
73+
struct cxl_rcrb_info *ri,
7274
enum cxl_rcrb which);
7375

7476
extern struct rw_semaphore cxl_dpa_rwsem;

drivers/cxl/core/port.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -939,7 +939,8 @@ __devm_cxl_add_dport(struct cxl_port *port, struct device *dport_dev,
939939
return ERR_PTR(-ENOMEM);
940940

941941
if (rcrb != CXL_RESOURCE_NONE) {
942-
component_reg_phys = __rcrb_to_component(dport_dev, rcrb,
942+
dport->rcrb.base = rcrb;
943+
component_reg_phys = __rcrb_to_component(dport_dev, &dport->rcrb,
943944
CXL_RCRB_DOWNSTREAM);
944945
if (component_reg_phys == CXL_RESOURCE_NONE) {
945946
dev_warn(dport_dev, "Invalid Component Registers in RCRB");
@@ -957,7 +958,6 @@ __devm_cxl_add_dport(struct cxl_port *port, struct device *dport_dev,
957958
dport->port_id = port_id;
958959
dport->component_reg_phys = component_reg_phys;
959960
dport->port = port;
960-
dport->rcrb = rcrb;
961961

962962
cond_cxl_root_lock(port);
963963
rc = add_dport(port, dport);

drivers/cxl/core/regs.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,10 +332,11 @@ int cxl_find_regblock(struct pci_dev *pdev, enum cxl_regloc_type type,
332332
}
333333
EXPORT_SYMBOL_NS_GPL(cxl_find_regblock, CXL);
334334

335-
resource_size_t __rcrb_to_component(struct device *dev, resource_size_t rcrb,
335+
resource_size_t __rcrb_to_component(struct device *dev, struct cxl_rcrb_info *ri,
336336
enum cxl_rcrb which)
337337
{
338338
resource_size_t component_reg_phys;
339+
resource_size_t rcrb = ri->base;
339340
void __iomem *addr;
340341
u32 bar0, bar1;
341342
u16 cmd;
@@ -400,6 +401,6 @@ resource_size_t cxl_rcd_component_reg_phys(struct device *dev,
400401
{
401402
if (!dport->rch)
402403
return CXL_RESOURCE_NONE;
403-
return __rcrb_to_component(dev, dport->rcrb, CXL_RCRB_UPSTREAM);
404+
return __rcrb_to_component(dev, &dport->rcrb, CXL_RCRB_UPSTREAM);
404405
}
405406
EXPORT_SYMBOL_NS_GPL(cxl_rcd_component_reg_phys, CXL);

drivers/cxl/cxl.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,20 +582,25 @@ cxl_find_dport_by_dev(struct cxl_port *port, const struct device *dport_dev)
582582
return xa_load(&port->dports, (unsigned long)dport_dev);
583583
}
584584

585+
struct cxl_rcrb_info {
586+
resource_size_t base;
587+
u16 aer_cap;
588+
};
589+
585590
/**
586591
* struct cxl_dport - CXL downstream port
587592
* @dport: PCI bridge or firmware device representing the downstream link
588593
* @port_id: unique hardware identifier for dport in decoder target list
589594
* @component_reg_phys: downstream port component registers
590-
* @rcrb: base address for the Root Complex Register Block
595+
* @rcrb: Data about the Root Complex Register Block layout
591596
* @rch: Indicate whether this dport was enumerated in RCH or VH mode
592597
* @port: reference to cxl_port that contains this downstream port
593598
*/
594599
struct cxl_dport {
595600
struct device *dport;
596601
int port_id;
597602
resource_size_t component_reg_phys;
598-
resource_size_t rcrb;
603+
struct cxl_rcrb_info rcrb;
599604
bool rch;
600605
struct cxl_port *port;
601606
};

tools/testing/cxl/test/mock.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,10 @@ struct cxl_dport *__wrap_devm_cxl_add_rch_dport(struct cxl_port *port,
271271
if (ops && ops->is_mock_port(dport_dev)) {
272272
dport = devm_cxl_add_dport(port, dport_dev, port_id,
273273
CXL_RESOURCE_NONE);
274-
if (!IS_ERR(dport))
274+
if (!IS_ERR(dport)) {
275+
dport->rcrb.base = rcrb;
275276
dport->rch = true;
277+
}
276278
} else
277279
dport = devm_cxl_add_rch_dport(port, dport_dev, port_id, rcrb);
278280
put_cxl_mock_ops(index);

0 commit comments

Comments
 (0)