diff mbox series

[v7,18/28] sfc: get endpoint decoder

Message ID 20241209185429.54054-19-alejandro.lucero-palau@amd.com
State Superseded
Headers show
Series cxl: add type2 device basic support | expand

Commit Message

Lucero Palau, Alejandro Dec. 9, 2024, 6:54 p.m. UTC
From: Alejandro Lucero <alucerop@amd.com>

Use cxl api for getting DPA (Device Physical Address) to use through an
endpoint decoder.

Signed-off-by: Alejandro Lucero <alucerop@amd.com>
Reviewed-by: Martin Habets <habetsm.xilinx@gmail.com>
---
 drivers/net/ethernet/sfc/efx_cxl.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Edward Cree Dec. 11, 2024, 12:25 a.m. UTC | #1
On 09/12/2024 18:54, alejandro.lucero-palau@amd.com wrote:
> From: Alejandro Lucero <alucerop@amd.com>
> 
> Use cxl api for getting DPA (Device Physical Address) to use through an
> endpoint decoder.
> 
> Signed-off-by: Alejandro Lucero <alucerop@amd.com>
> Reviewed-by: Martin Habets <habetsm.xilinx@gmail.com>

Acked-by: Edward Cree <ecree.xilinx@gmail.com>

> +	cxl->cxled = cxl_request_dpa(cxl->cxlmd, true, EFX_CTPIO_BUFFER_SIZE,
> +				     EFX_CTPIO_BUFFER_SIZE);

Just for my education, could you explain what's the difference between
 cxl_dpa_alloc(..., size) and cxl_request_dpa(..., size, size)?  Since
 you're not really making use of the min/max flexibility here, I assume
 there's some other reason for using the latter.  Is it just that it's
 a convenience wrapper that saves open-coding some of the boilerplate?
Alejandro Lucero Palau Dec. 11, 2024, 9:15 a.m. UTC | #2
On 12/11/24 00:25, Edward Cree wrote:
> On 09/12/2024 18:54, alejandro.lucero-palau@amd.com wrote:
>> From: Alejandro Lucero <alucerop@amd.com>
>>
>> Use cxl api for getting DPA (Device Physical Address) to use through an
>> endpoint decoder.
>>
>> Signed-off-by: Alejandro Lucero <alucerop@amd.com>
>> Reviewed-by: Martin Habets <habetsm.xilinx@gmail.com>
> Acked-by: Edward Cree <ecree.xilinx@gmail.com>


Thanks

>> +	cxl->cxled = cxl_request_dpa(cxl->cxlmd, true, EFX_CTPIO_BUFFER_SIZE,
>> +				     EFX_CTPIO_BUFFER_SIZE);
> Just for my education, could you explain what's the difference between
>   cxl_dpa_alloc(..., size) and cxl_request_dpa(..., size, size)?  Since
>   you're not really making use of the min/max flexibility here, I assume
>   there's some other reason for using the latter.  Is it just that it's
>   a convenience wrapper that saves open-coding some of the boilerplate?


A device advertises CXL memory but the Host being able to map it depends 
on the current state of CXL configuration regarding CXL decoders in the 
path to the device and the request itself.


Our case is simple since we rely on having all that memory mapped or not 
having it at all. And we count on our device being directly connected to 
the CXL Root Complex or to one of the CXL Root Complex available, but 
CXL switches and things like memory interleaving can make things far 
more complex.


About min and max, the former specifies the minimal driver requirements 
for mapping CXL memory, and the latter tells about the maximal size the 
driver could be interested in. I think this is more a legacy of how 
Type3 devices are managed and arguably not so important for 
accelerators, and for some as ours, not needed.
Simon Horman Dec. 12, 2024, 6:21 p.m. UTC | #3
On Mon, Dec 09, 2024 at 06:54:19PM +0000, alejandro.lucero-palau@amd.com wrote:
> From: Alejandro Lucero <alucerop@amd.com>
> 
> Use cxl api for getting DPA (Device Physical Address) to use through an
> endpoint decoder.
> 
> Signed-off-by: Alejandro Lucero <alucerop@amd.com>
> Reviewed-by: Martin Habets <habetsm.xilinx@gmail.com>
> ---
>  drivers/net/ethernet/sfc/efx_cxl.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c
> index f2dc025c9fbb..09827bb9e861 100644
> --- a/drivers/net/ethernet/sfc/efx_cxl.c
> +++ b/drivers/net/ethernet/sfc/efx_cxl.c
> @@ -120,6 +120,14 @@ int efx_cxl_init(struct efx_probe_data *probe_data)
>  		goto err3;
>  	}
>  
> +	cxl->cxled = cxl_request_dpa(cxl->cxlmd, true, EFX_CTPIO_BUFFER_SIZE,
> +				     EFX_CTPIO_BUFFER_SIZE);
> +	if (IS_ERR_OR_NULL(cxl->cxled)) {

Hi Alejandro,

The Kernel doc for cxl_request_dpa says that it returns either
a valid pointer or an error pointer. So perhaps IS_ERR() is
sufficient here.

> +		pci_err(pci_dev, "CXL accel request DPA failed");
> +		rc = PTR_ERR(cxl->cxlrd);

Otherwise, if cxl->cxlrd is NULL here, then rc, the return value for
this function, will be 0 here. Which doesn't seem to align with the
error message on the line above.

Flagged by Smatch.

> +		goto err3;
> +	}
> +
>  	probe_data->cxl = cxl;
>  
>  	return 0;
> @@ -136,6 +144,7 @@ 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_dpa_free(probe_data->cxl->cxled);
>  		cxl_release_resource(probe_data->cxl->cxlds, CXL_RES_RAM);
>  		kfree(probe_data->cxl->cxlds);
>  		kfree(probe_data->cxl);
> -- 
> 2.17.1
> 
>
Alejandro Lucero Palau Dec. 13, 2024, 9:42 a.m. UTC | #4
On 12/12/24 18:21, Simon Horman wrote:
> On Mon, Dec 09, 2024 at 06:54:19PM +0000, alejandro.lucero-palau@amd.com wrote:
>> From: Alejandro Lucero <alucerop@amd.com>
>>
>> Use cxl api for getting DPA (Device Physical Address) to use through an
>> endpoint decoder.
>>
>> Signed-off-by: Alejandro Lucero <alucerop@amd.com>
>> Reviewed-by: Martin Habets <habetsm.xilinx@gmail.com>
>> ---
>>   drivers/net/ethernet/sfc/efx_cxl.c | 9 +++++++++
>>   1 file changed, 9 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c
>> index f2dc025c9fbb..09827bb9e861 100644
>> --- a/drivers/net/ethernet/sfc/efx_cxl.c
>> +++ b/drivers/net/ethernet/sfc/efx_cxl.c
>> @@ -120,6 +120,14 @@ int efx_cxl_init(struct efx_probe_data *probe_data)
>>   		goto err3;
>>   	}
>>   
>> +	cxl->cxled = cxl_request_dpa(cxl->cxlmd, true, EFX_CTPIO_BUFFER_SIZE,
>> +				     EFX_CTPIO_BUFFER_SIZE);
>> +	if (IS_ERR_OR_NULL(cxl->cxled)) {
> Hi Alejandro,
>
> The Kernel doc for cxl_request_dpa says that it returns either
> a valid pointer or an error pointer. So perhaps IS_ERR() is
> sufficient here.
>
>> +		pci_err(pci_dev, "CXL accel request DPA failed");
>> +		rc = PTR_ERR(cxl->cxlrd);
> Otherwise, if cxl->cxlrd is NULL here, then rc, the return value for
> this function, will be 0 here. Which doesn't seem to align with the
> error message on the line above.


Indisputable.


I'll fix it.


Thanks!


> Flagged by Smatch.
>
>> +		goto err3;
>> +	}
>> +
>>   	probe_data->cxl = cxl;
>>   
>>   	return 0;
>> @@ -136,6 +144,7 @@ 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_dpa_free(probe_data->cxl->cxled);
>>   		cxl_release_resource(probe_data->cxl->cxlds, CXL_RES_RAM);
>>   		kfree(probe_data->cxl->cxlds);
>>   		kfree(probe_data->cxl);
>> -- 
>> 2.17.1
>>
>>
diff mbox series

Patch

diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c
index f2dc025c9fbb..09827bb9e861 100644
--- a/drivers/net/ethernet/sfc/efx_cxl.c
+++ b/drivers/net/ethernet/sfc/efx_cxl.c
@@ -120,6 +120,14 @@  int efx_cxl_init(struct efx_probe_data *probe_data)
 		goto err3;
 	}
 
+	cxl->cxled = cxl_request_dpa(cxl->cxlmd, true, EFX_CTPIO_BUFFER_SIZE,
+				     EFX_CTPIO_BUFFER_SIZE);
+	if (IS_ERR_OR_NULL(cxl->cxled)) {
+		pci_err(pci_dev, "CXL accel request DPA failed");
+		rc = PTR_ERR(cxl->cxlrd);
+		goto err3;
+	}
+
 	probe_data->cxl = cxl;
 
 	return 0;
@@ -136,6 +144,7 @@  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_dpa_free(probe_data->cxl->cxled);
 		cxl_release_resource(probe_data->cxl->cxlds, CXL_RES_RAM);
 		kfree(probe_data->cxl->cxlds);
 		kfree(probe_data->cxl);