mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02: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…
	
		Reference in a new issue
	
	 Dave Jiang
						Dave Jiang