Skip to content

Commit 7974835

Browse files
committed
cxl: Add endpoint decoder flags clear when PCI reset happens
When a PCI reset happens, the lock and enable flags of the CXL device should be cleared to avoid stale state flags after reset. Add flag clearing during cxl_reset_done() to clear the relevant endpoint decoder flags for all decoders of the endpoint device. Reported-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Alison Schofield <alison.schofield@intel.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Link: https://patch.msgid.link/20260319152541.2739343-1-dave.jiang@intel.com Signed-off-by: Dave Jiang <dave.jiang@intel.com>
1 parent 1e1cd49 commit 7974835

2 files changed

Lines changed: 17 additions & 0 deletions

File tree

drivers/cxl/cxl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ int cxl_dport_map_rcd_linkcap(struct pci_dev *pdev, struct cxl_dport *dport);
333333
#define CXL_DECODER_F_LOCK BIT(4)
334334
#define CXL_DECODER_F_ENABLE BIT(5)
335335
#define CXL_DECODER_F_NORMALIZED_ADDRESSING BIT(6)
336+
#define CXL_DECODER_F_RESET_MASK (CXL_DECODER_F_ENABLE | CXL_DECODER_F_LOCK)
336337

337338
enum cxl_decoder_type {
338339
CXL_DECODER_DEVMEM = 2,

drivers/cxl/pci.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,6 +1030,19 @@ static void cxl_error_resume(struct pci_dev *pdev)
10301030
dev->driver ? "successful" : "failed");
10311031
}
10321032

1033+
static int cxl_endpoint_decoder_clear_reset_flags(struct device *dev, void *data)
1034+
{
1035+
struct cxl_endpoint_decoder *cxled;
1036+
1037+
if (!is_endpoint_decoder(dev))
1038+
return 0;
1039+
1040+
cxled = to_cxl_endpoint_decoder(dev);
1041+
cxled->cxld.flags &= ~CXL_DECODER_F_RESET_MASK;
1042+
1043+
return 0;
1044+
}
1045+
10331046
static void cxl_reset_done(struct pci_dev *pdev)
10341047
{
10351048
struct cxl_dev_state *cxlds = pci_get_drvdata(pdev);
@@ -1045,6 +1058,9 @@ static void cxl_reset_done(struct pci_dev *pdev)
10451058
guard(device)(&cxlmd->dev);
10461059
if (cxlmd->endpoint &&
10471060
cxl_endpoint_decoder_reset_detected(cxlmd->endpoint)) {
1061+
device_for_each_child(&cxlmd->endpoint->dev, NULL,
1062+
cxl_endpoint_decoder_clear_reset_flags);
1063+
10481064
dev_crit(dev, "SBR happened without memory regions removal.\n");
10491065
dev_crit(dev, "System may be unstable if regions hosted system memory.\n");
10501066
add_taint(TAINT_USER, LOCKDEP_STILL_OK);

0 commit comments

Comments
 (0)