From: Alejandro Lucero Use cxl api for creating a region using the endpoint decoder related to a DPA range. Add a callback for unwinding sfc cxl initialization when the endpoint port is destroyed by potential cxl_acpi or cxl_mem modules removal. Signed-off-by: Alejandro Lucero --- drivers/cxl/core/core.h | 5 ----- drivers/net/ethernet/sfc/efx_cxl.c | 22 ++++++++++++++++++++++ include/cxl/cxl.h | 8 ++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index c4dddbec5d6e..83abaca9f418 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -14,11 +14,6 @@ extern const struct device_type cxl_pmu_type; extern struct attribute_group cxl_base_attribute_group; -enum cxl_detach_mode { - DETACH_ONLY, - DETACH_INVALIDATE, -}; - #ifdef CONFIG_CXL_REGION extern struct device_attribute dev_attr_create_pmem_region; extern struct device_attribute dev_attr_create_ram_region; diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c index 4461b7a4dc2c..85490afc7930 100644 --- a/drivers/net/ethernet/sfc/efx_cxl.c +++ b/drivers/net/ethernet/sfc/efx_cxl.c @@ -14,6 +14,16 @@ #define EFX_CTPIO_BUFFER_SIZE SZ_256M +static void efx_release_cxl_region(void *priv_cxl) +{ + struct efx_probe_data *probe_data = priv_cxl; + struct efx_cxl *cxl = probe_data->cxl; + + probe_data->cxl_pio_initialised = false; + iounmap(cxl->ctpio_cxl); + cxl_put_root_decoder(cxl->cxlrd); +} + int efx_cxl_init(struct efx_probe_data *probe_data) { struct efx_nic *efx = &probe_data->efx; @@ -118,6 +128,16 @@ int efx_cxl_init(struct efx_probe_data *probe_data) goto err_decoder; } + cxl->efx_region = cxl_create_region(cxl->cxlrd, &cxl->cxled, 1, + efx_release_cxl_region, + &probe_data); + if (IS_ERR(cxl->efx_region)) { + pci_err(pci_dev, "CXL accel create region failed"); + cxl_dpa_free(cxl->cxled); + rc = PTR_ERR(cxl->efx_region); + goto err_decoder; + } + probe_data->cxl = cxl; cxl_release_endpoint(cxl->cxlmd, cxl->endpoint); @@ -135,6 +155,8 @@ int efx_cxl_init(struct efx_probe_data *probe_data) void efx_cxl_exit(struct efx_probe_data *probe_data) { if (probe_data->cxl) { + cxl_decoder_detach(NULL, probe_data->cxl->cxled, 0, + DETACH_INVALIDATE); cxl_dpa_free(probe_data->cxl->cxled); cxl_put_root_decoder(probe_data->cxl->cxlrd); } diff --git a/include/cxl/cxl.h b/include/cxl/cxl.h index dbacefff8d60..e82f94921b5b 100644 --- a/include/cxl/cxl.h +++ b/include/cxl/cxl.h @@ -282,4 +282,12 @@ struct cxl_region *cxl_create_region(struct cxl_root_decoder *cxlrd, struct cxl_endpoint_decoder **cxled, int ways, void (*action)(void *), void *data); +enum cxl_detach_mode { + DETACH_ONLY, + DETACH_INVALIDATE, +}; + +int cxl_decoder_detach(struct cxl_region *cxlr, + struct cxl_endpoint_decoder *cxled, int pos, + enum cxl_detach_mode mode); #endif /* __CXL_CXL_H__ */ -- 2.34.1