diff options
Diffstat (limited to 'drivers/cxl/core/pci.c')
| -rw-r--r-- | drivers/cxl/core/pci.c | 49 | 
1 files changed, 34 insertions, 15 deletions
diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c index 6c9c8d92f8f7..e9e6c81ce034 100644 --- a/drivers/cxl/core/pci.c +++ b/drivers/cxl/core/pci.c @@ -477,9 +477,9 @@ int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm,  		allowed++;  	} -	if (!allowed) { -		cxl_set_mem_enable(cxlds, 0); -		info->mem_enabled = 0; +	if (!allowed && info->mem_enabled) { +		dev_err(dev, "Range register decodes outside platform defined CXL ranges.\n"); +		return -ENXIO;  	}  	/* @@ -932,11 +932,21 @@ static void cxl_handle_rdport_errors(struct cxl_dev_state *cxlds) { }  void cxl_cor_error_detected(struct pci_dev *pdev)  {  	struct cxl_dev_state *cxlds = pci_get_drvdata(pdev); +	struct device *dev = &cxlds->cxlmd->dev; + +	scoped_guard(device, dev) { +		if (!dev->driver) { +			dev_warn(&pdev->dev, +				 "%s: memdev disabled, abort error handling\n", +				 dev_name(dev)); +			return; +		} -	if (cxlds->rcd) -		cxl_handle_rdport_errors(cxlds); +		if (cxlds->rcd) +			cxl_handle_rdport_errors(cxlds); -	cxl_handle_endpoint_cor_ras(cxlds); +		cxl_handle_endpoint_cor_ras(cxlds); +	}  }  EXPORT_SYMBOL_NS_GPL(cxl_cor_error_detected, CXL); @@ -948,16 +958,25 @@ pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,  	struct device *dev = &cxlmd->dev;  	bool ue; -	if (cxlds->rcd) -		cxl_handle_rdport_errors(cxlds); +	scoped_guard(device, dev) { +		if (!dev->driver) { +			dev_warn(&pdev->dev, +				 "%s: memdev disabled, abort error handling\n", +				 dev_name(dev)); +			return PCI_ERS_RESULT_DISCONNECT; +		} + +		if (cxlds->rcd) +			cxl_handle_rdport_errors(cxlds); +		/* +		 * A frozen channel indicates an impending reset which is fatal to +		 * CXL.mem operation, and will likely crash the system. On the off +		 * chance the situation is recoverable dump the status of the RAS +		 * capability registers and bounce the active state of the memdev. +		 */ +		ue = cxl_handle_endpoint_ras(cxlds); +	} -	/* -	 * A frozen channel indicates an impending reset which is fatal to -	 * CXL.mem operation, and will likely crash the system. On the off -	 * chance the situation is recoverable dump the status of the RAS -	 * capability registers and bounce the active state of the memdev. -	 */ -	ue = cxl_handle_endpoint_ras(cxlds);  	switch (state) {  	case pci_channel_io_normal:  |