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

Alejandro Lucero Palau
2026-03-24T22:03:03Z

On 3/24/26 17:38, Dave Jiang wrote:
>
> On 3/23/26 4:31 AM, 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);
> Would a device_put() on the region dev be sufficient here? Not sure if everything should be torn down if SFC didn't create the region to begin with and only retrieved it via cxl_get_commited_decoder()?
>
> DJ

I do not think so. The region will be around as current region creation
is "linked" to the root decoder. Only if the root decoder is removed
will the region release action be invoked. As I have mentioned when
replying Jonathan, maybe that should change.

Thank you

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