mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
cxl: Fix devm host device for CXL fwctl initialization
Testing revealed the following error message for a CXL memdev that has
Feature support:
[ 56.690430] cxl mem0: Resources present before probing
Attach the allocation of cxl_fwctl to the parent device of cxl_memdev.
devm_add_* calls for cxl_memdev should not happen before the memdev
probe function or outside the scope of the memdev driver.
cxl_test missed this bug because cxl_test always arranges for the
cxl_mem driver to be loaded before cxl_mock_mem runs. So the driver core
always finds the devres list idle in that case.
[DJ: Updated subject title and added commit log suggestion from djbw]
Fixes: 858ce2f56b
("cxl: Add FWCTL support to CXL")
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Alison Schofield <alison.schofield@intel.com>
Link: https://lore.kernel.org/linux-cxl/6801aea053466_71fe2944c@dwillia2-xfh.jf.intel.com.notmuch/
Link: https://patch.msgid.link/20250418002933.406439-1-dave.jiang@intel.com
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
This commit is contained in:
parent
36aace15d9
commit
dc915672f9
4 changed files with 7 additions and 6 deletions
|
@ -677,7 +677,7 @@ static void free_memdev_fwctl(void *_fwctl_dev)
|
|||
fwctl_put(fwctl_dev);
|
||||
}
|
||||
|
||||
int devm_cxl_setup_fwctl(struct cxl_memdev *cxlmd)
|
||||
int devm_cxl_setup_fwctl(struct device *host, struct cxl_memdev *cxlmd)
|
||||
{
|
||||
struct cxl_dev_state *cxlds = cxlmd->cxlds;
|
||||
struct cxl_features_state *cxlfs;
|
||||
|
@ -700,7 +700,7 @@ int devm_cxl_setup_fwctl(struct cxl_memdev *cxlmd)
|
|||
if (rc)
|
||||
return rc;
|
||||
|
||||
return devm_add_action_or_reset(&cxlmd->dev, free_memdev_fwctl,
|
||||
return devm_add_action_or_reset(host, free_memdev_fwctl,
|
||||
no_free_ptr(fwctl_dev));
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(devm_cxl_setup_fwctl, "CXL");
|
||||
|
|
|
@ -1018,7 +1018,7 @@ static int cxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = devm_cxl_setup_fwctl(cxlmd);
|
||||
rc = devm_cxl_setup_fwctl(&pdev->dev, cxlmd);
|
||||
if (rc)
|
||||
dev_dbg(&pdev->dev, "No CXL FWCTL setup\n");
|
||||
|
||||
|
|
|
@ -66,7 +66,7 @@ struct cxl_memdev;
|
|||
#ifdef CONFIG_CXL_FEATURES
|
||||
inline struct cxl_features_state *to_cxlfs(struct cxl_dev_state *cxlds);
|
||||
int devm_cxl_setup_features(struct cxl_dev_state *cxlds);
|
||||
int devm_cxl_setup_fwctl(struct cxl_memdev *cxlmd);
|
||||
int devm_cxl_setup_fwctl(struct device *host, struct cxl_memdev *cxlmd);
|
||||
#else
|
||||
static inline struct cxl_features_state *to_cxlfs(struct cxl_dev_state *cxlds)
|
||||
{
|
||||
|
@ -78,7 +78,8 @@ static inline int devm_cxl_setup_features(struct cxl_dev_state *cxlds)
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int devm_cxl_setup_fwctl(struct cxl_memdev *cxlmd)
|
||||
static inline int devm_cxl_setup_fwctl(struct device *host,
|
||||
struct cxl_memdev *cxlmd)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
|
|
@ -1780,7 +1780,7 @@ static int cxl_mock_mem_probe(struct platform_device *pdev)
|
|||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = devm_cxl_setup_fwctl(cxlmd);
|
||||
rc = devm_cxl_setup_fwctl(&pdev->dev, cxlmd);
|
||||
if (rc)
|
||||
dev_dbg(dev, "No CXL FWCTL setup\n");
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue