Re: [PATCH v23 11/22] sfc: obtain decoder and region if committed by firmware
From: Alejandro Lucero Palau <hidden>
Date: 2026-02-20 08:08:52
Also in:
linux-cxl
On 2/19/26 23:31, Dave Jiang wrote:
On 2/1/26 8:54 AM, alejandro.lucero-palau@amd.com wrote:quoted
From: Alejandro Lucero <redacted> Check if device HDM is already committed during firmware/BIOS initialization. A CXL region should exist if so after memdev allocation/initialization. Get HPA from region and map it. Signed-off-by: Alejandro Lucero <redacted> --- drivers/net/ethernet/sfc/efx_cxl.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-)diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c index a77ef4783fcb..3536eccf1b2a 100644 --- a/drivers/net/ethernet/sfc/efx_cxl.c +++ b/drivers/net/ethernet/sfc/efx_cxl.c@@ -19,6 +19,7 @@ int efx_cxl_init(struct efx_probe_data *probe_data) struct efx_nic *efx = &probe_data->efx; struct pci_dev *pci_dev = efx->pci_dev; struct efx_cxl *cxl; + struct range range; u16 dvsec; int rc;@@ -90,13 +91,38 @@ int efx_cxl_init(struct efx_probe_data *probe_data) return PTR_ERR(cxl->cxlmd); } - probe_data->cxl = cxl; + cxl->cxled = cxl_get_committed_decoder(cxl->cxlmd, &cxl->efx_region); + if (cxl->cxled) {if (!cxl->cxled) return 0; Should save you a level of indent.
Yes, but subsequent patches add the else branch ... Thanks
DJquoted
+ if (!cxl->efx_region) { + pci_err(pci_dev, "CXL found committed decoder without a region"); + return -ENODEV; + } + rc = cxl_get_region_range(cxl->efx_region, &range); + if (rc) { + pci_err(pci_dev, + "CXL getting regions params from a committed decoder failed"); + return rc; + } + + cxl->ctpio_cxl = ioremap(range.start, range.end - range.start + 1); + if (!cxl->ctpio_cxl) { + pci_err(pci_dev, "CXL ioremap region (%pra) failed", &range); + return -ENOMEM; + } + + probe_data->cxl = cxl; + } return 0; } void efx_cxl_exit(struct efx_probe_data *probe_data) { + if (!probe_data->cxl) + return; + + iounmap(probe_data->cxl->ctpio_cxl); + cxl_unregister_region(probe_data->cxl->efx_region); } MODULE_IMPORT_NS("CXL");