From: Alejandro Lucero 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 Signed-off-by: Alejandro Lucero --- 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