Re: [PATCH v24 09/11] sfc: obtain decoder and region if committed by firmware

Alejandro Lucero Palau
2026-03-24T21:43:27Z

On 3/24/26 16:56, Jonathan Cameron wrote:
> On Mon, 23 Mar 2026 11:31:15 +0000
> alejandro.lucero-palau@amd.com wrote:
>
>> From: Alejandro Lucero <alucerop@amd.com>
>>
>> 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 <alucerop@amd.com>
>> Acked-by: Edward Cree <ecree.xilinx@gmail.com>
>> ---
>> drivers/net/ethernet/sfc/efx_cxl.c | 24 ++++++++++++++++++++++++
>> 1 file changed, 24 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c
>> index 22a7d1d95425..78f926300943 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;
>>
>> @@ -82,6 +83,24 @@ 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 || !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;
>> @@ -89,6 +108,11 @@ 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_unregister_region(probe_data->cxl->efx_region);
> When something called cxl_unregister_region() is called in exit() I look for
> where cxl_register_region() is.... and I can't find it (more than possible
> I'm failing to search the code though! What is this undoing?

It obviously requires a comment for avoiding this confusion. The region
is auto discovered when memdev is created:

memdev->port->hdm->region

so if the sfc cxl initialization was successful, it implies the endpoint
decoder has an auto discover region which is the one we need to remove
on exit, otherwise the region will be around until the root port is
removed. That is something that maybe should change likely linking the
region release to the endpoint memdev removal.

I will add such a comment.

Thank you

>
>> }
>>
>> MODULE_IMPORT_NS("CXL");