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 Acked-by: Edward Cree --- drivers/net/ethernet/sfc/efx_cxl.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c index 63e6f277ae9f..f3bcae22d1dd 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; @@ -81,6 +82,24 @@ int efx_cxl_init(struct efx_probe_data *probe_data) return PTR_ERR(cxl->cxlmd); } + cxl->efx_region = cxl_get_region_from_committed_decoder(cxl->cxlmd); + if (!cxl->efx_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_len(&range)); + if (!cxl->ctpio_cxl) { + pci_err(pci_dev, "CXL ioremap region (%pra) failed", &range); + return -ENOMEM; + } + + probe_data->cxl = cxl; return 0; @@ -88,6 +107,17 @@ 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); + + /* If the sfc cxl initialization was successful, it implies the + * endpoint decoder had an auto discover region which is the one + * we used and we need to remove now. Otherwise the region will + * be around until the root port is removed. + */ + cxl_unregister_region(probe_data->cxl->efx_region); } MODULE_IMPORT_NS("CXL"); -- 2.34.1