Commit e764f122 authored by Dave Jiang's avatar Dave Jiang Committed by Dan Williams

cxl: Move cxl_await_media_ready() to before capacity info retrieval

Move cxl_await_media_ready() to cxl_pci probe before driver starts issuing
IDENTIFY and retrieving memory device information to ensure that the
device is ready to provide the information. Allow cxl_pci_probe() to succeed
even if media is not ready. Cache the media failure in cxlds and don't ask
the device for any media information.

The rationale for proceeding in the !media_ready case is to allow for
mailbox operations to interrogate and/or remediate the device. After
media is repaired then rebinding the cxl_pci driver is expected to
restart the capacity scan.
Suggested-by: default avatarDan Williams <dan.j.williams@intel.com>
Fixes: b39cb105 ("cxl/mem: Register CXL memX devices")
Reviewed-by: default avatarIra Weiny <ira.weiny@intel.com>
Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/168445310026.3251520.8124296540679268206.stgit@djiang5-mobl3
[djbw: fixup cxl_test]
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent ce17ad0d
...@@ -1028,7 +1028,7 @@ static int cxl_mem_get_partition_info(struct cxl_dev_state *cxlds) ...@@ -1028,7 +1028,7 @@ static int cxl_mem_get_partition_info(struct cxl_dev_state *cxlds)
* cxl_dev_state_identify() - Send the IDENTIFY command to the device. * cxl_dev_state_identify() - Send the IDENTIFY command to the device.
* @cxlds: The device data for the operation * @cxlds: The device data for the operation
* *
* Return: 0 if identify was executed successfully. * Return: 0 if identify was executed successfully or media not ready.
* *
* This will dispatch the identify command to the device and on success populate * This will dispatch the identify command to the device and on success populate
* structures to be exported to sysfs. * structures to be exported to sysfs.
...@@ -1041,6 +1041,9 @@ int cxl_dev_state_identify(struct cxl_dev_state *cxlds) ...@@ -1041,6 +1041,9 @@ int cxl_dev_state_identify(struct cxl_dev_state *cxlds)
u32 val; u32 val;
int rc; int rc;
if (!cxlds->media_ready)
return 0;
mbox_cmd = (struct cxl_mbox_cmd) { mbox_cmd = (struct cxl_mbox_cmd) {
.opcode = CXL_MBOX_OP_IDENTIFY, .opcode = CXL_MBOX_OP_IDENTIFY,
.size_out = sizeof(id), .size_out = sizeof(id),
...@@ -1115,10 +1118,12 @@ int cxl_mem_create_range_info(struct cxl_dev_state *cxlds) ...@@ -1115,10 +1118,12 @@ int cxl_mem_create_range_info(struct cxl_dev_state *cxlds)
cxlds->persistent_only_bytes, "pmem"); cxlds->persistent_only_bytes, "pmem");
} }
rc = cxl_mem_get_partition_info(cxlds); if (cxlds->media_ready) {
if (rc) { rc = cxl_mem_get_partition_info(cxlds);
dev_err(dev, "Failed to query partition information\n"); if (rc) {
return rc; dev_err(dev, "Failed to query partition information\n");
return rc;
}
} }
rc = add_dpa_res(dev, &cxlds->dpa_res, &cxlds->ram_res, 0, rc = add_dpa_res(dev, &cxlds->dpa_res, &cxlds->ram_res, 0,
......
...@@ -266,6 +266,7 @@ struct cxl_poison_state { ...@@ -266,6 +266,7 @@ struct cxl_poison_state {
* @regs: Parsed register blocks * @regs: Parsed register blocks
* @cxl_dvsec: Offset to the PCIe device DVSEC * @cxl_dvsec: Offset to the PCIe device DVSEC
* @rcd: operating in RCD mode (CXL 3.0 9.11.8 CXL Devices Attached to an RCH) * @rcd: operating in RCD mode (CXL 3.0 9.11.8 CXL Devices Attached to an RCH)
* @media_ready: Indicate whether the device media is usable
* @payload_size: Size of space for payload * @payload_size: Size of space for payload
* (CXL 2.0 8.2.8.4.3 Mailbox Capabilities Register) * (CXL 2.0 8.2.8.4.3 Mailbox Capabilities Register)
* @lsa_size: Size of Label Storage Area * @lsa_size: Size of Label Storage Area
...@@ -303,6 +304,7 @@ struct cxl_dev_state { ...@@ -303,6 +304,7 @@ struct cxl_dev_state {
int cxl_dvsec; int cxl_dvsec;
bool rcd; bool rcd;
bool media_ready;
size_t payload_size; size_t payload_size;
size_t lsa_size; size_t lsa_size;
struct mutex mbox_mutex; /* Protects device mailbox and firmware */ struct mutex mbox_mutex; /* Protects device mailbox and firmware */
......
...@@ -124,6 +124,9 @@ static int cxl_mem_probe(struct device *dev) ...@@ -124,6 +124,9 @@ static int cxl_mem_probe(struct device *dev)
struct dentry *dentry; struct dentry *dentry;
int rc; int rc;
if (!cxlds->media_ready)
return -EBUSY;
/* /*
* Someone is trying to reattach this device after it lost its port * Someone is trying to reattach this device after it lost its port
* connection (an endpoint port previously registered by this memdev was * connection (an endpoint port previously registered by this memdev was
......
...@@ -708,6 +708,12 @@ static int cxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -708,6 +708,12 @@ static int cxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
if (rc) if (rc)
dev_dbg(&pdev->dev, "Failed to map RAS capability.\n"); dev_dbg(&pdev->dev, "Failed to map RAS capability.\n");
rc = cxl_await_media_ready(cxlds);
if (rc == 0)
cxlds->media_ready = true;
else
dev_warn(&pdev->dev, "Media not active (%d)\n", rc);
rc = cxl_pci_setup_mailbox(cxlds); rc = cxl_pci_setup_mailbox(cxlds);
if (rc) if (rc)
return rc; return rc;
......
...@@ -117,12 +117,6 @@ static int cxl_endpoint_port_probe(struct cxl_port *port) ...@@ -117,12 +117,6 @@ static int cxl_endpoint_port_probe(struct cxl_port *port)
if (rc) if (rc)
return rc; return rc;
rc = cxl_await_media_ready(cxlds);
if (rc) {
dev_err(&port->dev, "Media not active (%d)\n", rc);
return rc;
}
rc = devm_cxl_enumerate_decoders(cxlhdm, &info); rc = devm_cxl_enumerate_decoders(cxlhdm, &info);
if (rc) if (rc)
return rc; return rc;
......
...@@ -1256,6 +1256,7 @@ static int cxl_mock_mem_probe(struct platform_device *pdev) ...@@ -1256,6 +1256,7 @@ static int cxl_mock_mem_probe(struct platform_device *pdev)
if (rc) if (rc)
return rc; return rc;
cxlds->media_ready = true;
rc = cxl_dev_state_identify(cxlds); rc = cxl_dev_state_identify(cxlds);
if (rc) if (rc)
return rc; return rc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment