From: Alejandro Lucero 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 --- drivers/net/ethernet/sfc/efx_cxl.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c index f6eda93e67e2..ad1f49e76179 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,6 +91,26 @@ int efx_cxl_init(struct efx_probe_data *probe_data) return PTR_ERR(cxl->cxlmd); } + cxl->cxled = cxl_get_committed_decoder(cxl->cxlmd, &cxl->efx_region); + if (cxl->cxled) { + 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; @@ -97,6 +118,12 @@ int efx_cxl_init(struct efx_probe_data *probe_data) void efx_cxl_exit(struct efx_probe_data *probe_data) { + if (!probe_data->cxl) + return; + + iounmap(probe_data->cxl->ctpio_cxl); + cxl_decoder_detach(NULL, probe_data->cxl->cxled, 0, DETACH_INVALIDATE); + unregister_region(probe_data->cxl->efx_region); } MODULE_IMPORT_NS("CXL"); -- 2.34.1