mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
sfc: support pio mapping based on cxl
A PIO buffer is a region of device memory to which the driver can write a packet for TX, with the device handling the transmit doorbell without requiring a DMA for getting the packet data, which helps reducing latency in certain exchanges. With CXL mem protocol this latency can be lowered further. With a device supporting CXL and successfully initialised, use the cxl region to map the memory range and use this mapping for PIO buffers. Signed-off-by: Alejandro Lucero <alucerop@amd.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> Acked-by: Edward Cree <ecree.xilinx@gmail.com> Link: https://patch.msgid.link/20260630151346.31201-6-alejandro.lucero-palau@amd.com Signed-off-by: Dave Jiang <dave.jiang@intel.com>
This commit is contained in:
parent
0418860ef2
commit
bd6550bcdb
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/wait.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <net/udp_tunnel.h>
|
||||
#include "efx_cxl.h"
|
||||
|
||||
/* Hardware control for EF10 architecture including 'Huntington'. */
|
||||
|
||||
|
|
@ -106,7 +107,7 @@ static int efx_ef10_get_vf_index(struct efx_nic *efx)
|
|||
|
||||
static int efx_ef10_init_datapath_caps(struct efx_nic *efx)
|
||||
{
|
||||
MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_CAPABILITIES_V4_OUT_LEN);
|
||||
MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_CAPABILITIES_V7_OUT_LEN);
|
||||
struct efx_ef10_nic_data *nic_data = efx->nic_data;
|
||||
size_t outlen;
|
||||
int rc;
|
||||
|
|
@ -177,6 +178,12 @@ static int efx_ef10_init_datapath_caps(struct efx_nic *efx)
|
|||
efx->num_mac_stats);
|
||||
}
|
||||
|
||||
if (outlen < MC_CMD_GET_CAPABILITIES_V7_OUT_LEN)
|
||||
nic_data->datapath_caps3 = 0;
|
||||
else
|
||||
nic_data->datapath_caps3 = MCDI_DWORD(outbuf,
|
||||
GET_CAPABILITIES_V7_OUT_FLAGS3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1140,6 +1147,9 @@ static int efx_ef10_dimension_resources(struct efx_nic *efx)
|
|||
unsigned int channel_vis, pio_write_vi_base, max_vis;
|
||||
struct efx_ef10_nic_data *nic_data = efx->nic_data;
|
||||
unsigned int uc_mem_map_size, wc_mem_map_size;
|
||||
#ifdef CONFIG_SFC_CXL
|
||||
struct efx_probe_data *probe_data;
|
||||
#endif
|
||||
void __iomem *membase;
|
||||
int rc;
|
||||
|
||||
|
|
@ -1263,8 +1273,23 @@ static int efx_ef10_dimension_resources(struct efx_nic *efx)
|
|||
iounmap(efx->membase);
|
||||
efx->membase = membase;
|
||||
|
||||
/* Set up the WC mapping if needed */
|
||||
if (wc_mem_map_size) {
|
||||
if (!wc_mem_map_size)
|
||||
goto skip_pio;
|
||||
|
||||
/* Set up the WC mapping */
|
||||
|
||||
#ifdef CONFIG_SFC_CXL
|
||||
probe_data = container_of(efx, struct efx_probe_data, efx);
|
||||
if ((nic_data->datapath_caps3 &
|
||||
(1 << MC_CMD_GET_CAPABILITIES_V7_OUT_CXL_CONFIG_ENABLE_LBN)) &&
|
||||
probe_data->cxl_pio_initialised) {
|
||||
/* Using PIO through CXL mapping */
|
||||
nic_data->pio_write_base = probe_data->cxl->ctpio_cxl;
|
||||
nic_data->pio_write_vi_base = pio_write_vi_base;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
/* Using legacy PIO BAR mapping */
|
||||
nic_data->wc_membase = ioremap_wc(efx->membase_phys +
|
||||
uc_mem_map_size,
|
||||
wc_mem_map_size);
|
||||
|
|
@ -1279,12 +1304,14 @@ static int efx_ef10_dimension_resources(struct efx_nic *efx)
|
|||
nic_data->wc_membase +
|
||||
(pio_write_vi_base * efx->vi_stride + ER_DZ_TX_PIOBUF -
|
||||
uc_mem_map_size);
|
||||
|
||||
rc = efx_ef10_link_piobufs(efx);
|
||||
if (rc)
|
||||
efx_ef10_free_piobufs(efx);
|
||||
}
|
||||
|
||||
rc = efx_ef10_link_piobufs(efx);
|
||||
if (rc)
|
||||
efx_ef10_free_piobufs(efx);
|
||||
|
||||
skip_pio:
|
||||
|
||||
netif_dbg(efx, probe, efx->net_dev,
|
||||
"memory BAR at %pa (virtual %p+%x UC, %p+%x WC)\n",
|
||||
&efx->membase_phys, efx->membase, uc_mem_map_size,
|
||||
|
|
|
|||
|
|
@ -88,6 +88,7 @@ int efx_cxl_init(struct efx_probe_data *probe_data)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
probe_data->cxl_pio_initialised = true;
|
||||
probe_data->cxl = cxl;
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -1206,12 +1206,14 @@ struct efx_cxl;
|
|||
* @pci_dev: The PCI device
|
||||
* @efx: Efx NIC details
|
||||
* @cxl: details of related cxl objects
|
||||
* @cxl_pio_initialised: cxl initialization outcome.
|
||||
*/
|
||||
struct efx_probe_data {
|
||||
struct pci_dev *pci_dev;
|
||||
struct efx_nic efx;
|
||||
#ifdef CONFIG_SFC_CXL
|
||||
struct efx_cxl *cxl;
|
||||
bool cxl_pio_initialised;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -152,6 +152,8 @@ enum {
|
|||
* %MC_CMD_GET_CAPABILITIES response)
|
||||
* @datapath_caps2: Further Capabilities of datapath firmware (FLAGS2 field of
|
||||
* %MC_CMD_GET_CAPABILITIES response)
|
||||
* @datapath_caps3: Further Capabilities of datapath firmware (FLAGS3 field of
|
||||
* %MC_CMD_GET_CAPABILITIES response)
|
||||
* @rx_dpcpu_fw_id: Firmware ID of the RxDPCPU
|
||||
* @tx_dpcpu_fw_id: Firmware ID of the TxDPCPU
|
||||
* @must_probe_vswitching: Flag: vswitching has yet to be setup after MC reboot
|
||||
|
|
@ -187,6 +189,7 @@ struct efx_ef10_nic_data {
|
|||
bool must_check_datapath_caps;
|
||||
u32 datapath_caps;
|
||||
u32 datapath_caps2;
|
||||
u32 datapath_caps3;
|
||||
unsigned int rx_dpcpu_fw_id;
|
||||
unsigned int tx_dpcpu_fw_id;
|
||||
bool must_probe_vswitching;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user