On Fri, 19 Nov 2021 16:02:30 -0800
Ben Widawsky [off-list ref] wrote:
The Memory Device Status register is inspected in the same way for at
least two flows in the CXL Type 3 Memory Device Software Guide
(Revision: 1.0): 2.13.9 Device discovery and mailbox ready sequence,
and 2.13.10 Media ready sequence. Extract this common functionality for
use by both.
Signed-off-by: Ben Widawsky <redacted>
Reviewed-by: Jonathan Cameron <redacted>
quoted hunk ↗ jump to hunk
---
This patch did not exist in RFCv2
---
drivers/cxl/pci.c | 33 +++++++++++++++++++++++++--------
1 file changed, 25 insertions(+), 8 deletions(-)
diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
index a6ea9811a05b..6c8d09fb3a17 100644
--- a/drivers/cxl/pci.c
+++ b/drivers/cxl/pci.c
@@ -182,6 +182,27 @@ static int __cxl_pci_mbox_send_cmd(struct cxl_dev_state *cxlds,
return 0;
}
+/*
+ * Implements roughly the bottom half of Figure 42 of the CXL Type 3 Memory
+ * Device Software Guide
+ */
+static int check_device_status(struct cxl_dev_state *cxlds)
+{
+ const u64 md_status = readq(cxlds->regs.memdev + CXLMDEV_STATUS_OFFSET);
+
+ if (md_status & CXLMDEV_DEV_FATAL) {
+ dev_err(cxlds->dev, "Fatal: replace device\n");
+ return -EIO;
+ }
+
+ if (md_status & CXLMDEV_FW_HALT) {
+ dev_err(cxlds->dev, "FWHalt: reset or replace device\n");
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
/**
* cxl_pci_mbox_get() - Acquire exclusive access to the mailbox.
* @cxlds: The device state to gain access to.@@ -231,17 +252,13 @@ static int cxl_pci_mbox_get(struct cxl_dev_state *cxlds)
* Hardware shouldn't allow a ready status but also have failure bits
* set. Spit out an error, this should be a bug report
*/
- rc = -EFAULT;
- if (md_status & CXLMDEV_DEV_FATAL) {
- dev_err(dev, "mbox: reported ready, but fatal\n");
+ rc = check_device_status(cxlds);
+ if (rc)
goto out;
- }
- if (md_status & CXLMDEV_FW_HALT) {
- dev_err(dev, "mbox: reported ready, but halted\n");
- goto out;
- }
+
if (CXLMDEV_RESET_NEEDED(md_status)) {
dev_err(dev, "mbox: reported ready, but reset needed\n");
+ rc = -EFAULT;
goto out;
}