[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251119192236.2527305-3-alejandro.lucero-palau@amd.com>
Date: Wed, 19 Nov 2025 19:22:15 +0000
From: <alejandro.lucero-palau@....com>
To: <linux-cxl@...r.kernel.org>, <netdev@...r.kernel.org>,
<dan.j.williams@...el.com>, <edward.cree@....com>, <davem@...emloft.net>,
<kuba@...nel.org>, <pabeni@...hat.com>, <edumazet@...gle.com>,
<dave.jiang@...el.com>
CC: Alejandro Lucero <alucerop@....com>
Subject: [PATCH v21 02/23] cxl/mem: Arrange for always-synchronous memdev attach
From: Alejandro Lucero <alucerop@....com>
In preparation for CXL accelerator drivers that have a hard dependency on
CXL capability initialization, arrange for the endpoint probe result to be
conveyed to the caller of devm_cxl_add_memdev().
As it stands cxl_pci does not care about the attach state of the cxl_memdev
because all generic memory expansion functionality can be handled by the
cxl_core. For accelerators, that driver needs to know perform driver
specific initialization if CXL is available, or exectute a fallback to PCIe
only operation.
By moving devm_cxl_add_memdev() to cxl_mem.ko it removes async module
loading as one reason that a memdev may not be attached upon return from
devm_cxl_add_memdev().
Signed-off-by: Dan Williams <dan.j.williams@...el.com>
Signed-off-by: Alejandro Lucero <alucerop@....com>
---
drivers/cxl/Kconfig | 2 +-
drivers/cxl/core/memdev.c | 44 -------------------------------------
drivers/cxl/mem.c | 46 +++++++++++++++++++++++++++++++++++++++
3 files changed, 47 insertions(+), 45 deletions(-)
diff --git a/drivers/cxl/Kconfig b/drivers/cxl/Kconfig
index 360c78fa7e97..6b871cbbce13 100644
--- a/drivers/cxl/Kconfig
+++ b/drivers/cxl/Kconfig
@@ -22,6 +22,7 @@ if CXL_BUS
config CXL_PCI
bool "PCI manageability"
default CXL_BUS
+ select CXL_MEM
help
The CXL specification defines a "CXL memory device" sub-class in the
PCI "memory controller" base class of devices. Device's identified by
@@ -89,7 +90,6 @@ config CXL_PMEM
config CXL_MEM
tristate "CXL: Memory Expansion"
- depends on CXL_PCI
default CXL_BUS
help
The CXL.mem protocol allows a device to act as a provider of "System
diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c
index 8de19807ac7b..639bd0376d32 100644
--- a/drivers/cxl/core/memdev.c
+++ b/drivers/cxl/core/memdev.c
@@ -1070,50 +1070,6 @@ struct cxl_memdev *cxl_memdev_alloc(struct cxl_dev_state *cxlds)
}
EXPORT_SYMBOL_NS_GPL(cxl_memdev_alloc, "CXL");
-static void __cxlmd_free(struct cxl_memdev *cxlmd)
-{
- if (IS_ERR(cxlmd))
- return;
-
- if (cxlmd->cxlds)
- cxlmd->cxlds->cxlmd = NULL;
-
- put_device(&cxlmd->dev);
- kfree(cxlmd);
-}
-
-DEFINE_FREE(cxlmd_free, struct cxl_memdev *, __cxlmd_free(_T))
-
-/**
- * devm_cxl_add_memdev - Add a CXL memory device
- * @host: devres alloc/release context and parent for the memdev
- * @cxlds: CXL device state to associate with the memdev
- *
- * Upon return the device will have had a chance to attach to the
- * cxl_mem driver, but may fail if the CXL topology is not ready
- * (hardware CXL link down, or software platform CXL root not attached)
- */
-struct cxl_memdev *devm_cxl_add_memdev(struct device *host,
- struct cxl_dev_state *cxlds)
-{
- struct cxl_memdev *cxlmd __free(cxlmd_free) = cxl_memdev_alloc(cxlds);
- int rc;
-
- if (IS_ERR(cxlmd))
- return cxlmd;
-
- rc = dev_set_name(&cxlmd->dev, "mem%d", cxlmd->id);
- if (rc)
- return ERR_PTR(rc);
-
- rc = devm_cxl_memdev_add_or_reset(host, cxlmd);
- if (rc)
- return ERR_PTR(rc);
-
- return no_free_ptr(cxlmd);
-}
-EXPORT_SYMBOL_NS_GPL(devm_cxl_add_memdev, "CXL");
-
static void sanitize_teardown_notifier(void *data)
{
struct cxl_memdev_state *mds = data;
diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c
index d2155f45240d..3f581c37f3ba 100644
--- a/drivers/cxl/mem.c
+++ b/drivers/cxl/mem.c
@@ -7,6 +7,7 @@
#include "cxlmem.h"
#include "cxlpci.h"
+#include "private.h"
/**
* DOC: cxl mem
@@ -202,6 +203,50 @@ static int cxl_mem_probe(struct device *dev)
return devm_add_action_or_reset(dev, enable_suspend, NULL);
}
+static void __cxlmd_free(struct cxl_memdev *cxlmd)
+{
+ if (IS_ERR(cxlmd))
+ return;
+
+ if (cxlmd->cxlds)
+ cxlmd->cxlds->cxlmd = NULL;
+
+ put_device(&cxlmd->dev);
+ kfree(cxlmd);
+}
+
+DEFINE_FREE(cxlmd_free, struct cxl_memdev *, __cxlmd_free(_T))
+
+/**
+ * devm_cxl_add_memdev - Add a CXL memory device
+ * @host: devres alloc/release context and parent for the memdev
+ * @cxlds: CXL device state to associate with the memdev
+ *
+ * Upon return the device will have had a chance to attach to the
+ * cxl_mem driver, but may fail if the CXL topology is not ready
+ * (hardware CXL link down, or software platform CXL root not attached)
+ */
+struct cxl_memdev *devm_cxl_add_memdev(struct device *host,
+ struct cxl_dev_state *cxlds)
+{
+ struct cxl_memdev *cxlmd __free(cxlmd_free) = cxl_memdev_alloc(cxlds);
+ int rc;
+
+ if (IS_ERR(cxlmd))
+ return cxlmd;
+
+ rc = dev_set_name(&cxlmd->dev, "mem%d", cxlmd->id);
+ if (rc)
+ return ERR_PTR(rc);
+
+ rc = devm_cxl_memdev_add_or_reset(host, cxlmd);
+ if (rc)
+ return ERR_PTR(rc);
+
+ return no_free_ptr(cxlmd);
+}
+EXPORT_SYMBOL_NS_GPL(devm_cxl_add_memdev, "CXL");
+
static ssize_t trigger_poison_list_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t len)
@@ -249,6 +294,7 @@ static struct cxl_driver cxl_mem_driver = {
.probe = cxl_mem_probe,
.id = CXL_DEVICE_MEMORY_EXPANDER,
.drv = {
+ .probe_type = PROBE_FORCE_SYNCHRONOUS,
.dev_groups = cxl_mem_groups,
},
};
--
2.34.1
Powered by blists - more mailing lists