lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <20230406065706.59664-5-gautam.dawar@amd.com> Date: Thu, 6 Apr 2023 12:26:49 +0530 From: Gautam Dawar <gautam.dawar@....com> To: <linux-net-drivers@....com>, <jasowang@...hat.com>, Edward Cree <ecree.xilinx@...il.com>, Martin Habets <habetsm.xilinx@...il.com>, "David S. Miller" <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>, "Jakub Kicinski" <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>, Richard Cochran <richardcochran@...il.com>, <linux-kernel@...r.kernel.org>, <netdev@...r.kernel.org> CC: <eperezma@...hat.com>, <harpreet.anand@....com>, <tanuj.kamde@....com>, <koushik.dutta@....com>, Gautam Dawar <gautam.dawar@....com> Subject: [PATCH net-next v3 04/14] sfc: evaluate vdpa support based on FW capability CLIENT_CMD_VF_PROXY Add and update vdpa_supported field to struct efx_nic to true if running Firmware supports CLIENT_CMD_VF_PROXY capability. This is required to ensure DMA isolation between MCDI command buffer and guest buffers. Also, split efx_ef100_init_datapath_caps() into a generic API that vDPA can use, and the netdev (TSO) specific code is moved to a new function efx_ef100_update_tso_features() Signed-off-by: Gautam Dawar <gautam.dawar@....com> --- drivers/net/ethernet/sfc/ef100_netdev.c | 26 +++++++++++++-- drivers/net/ethernet/sfc/ef100_nic.c | 43 +++++++++++++------------ drivers/net/ethernet/sfc/ef100_nic.h | 6 ++-- 3 files changed, 49 insertions(+), 26 deletions(-) diff --git a/drivers/net/ethernet/sfc/ef100_netdev.c b/drivers/net/ethernet/sfc/ef100_netdev.c index d916877b5a9a..5d93e870d9b7 100644 --- a/drivers/net/ethernet/sfc/ef100_netdev.c +++ b/drivers/net/ethernet/sfc/ef100_netdev.c @@ -355,6 +355,28 @@ void ef100_remove_netdev(struct efx_probe_data *probe_data) efx->state = STATE_PROBED; } +static void efx_ef100_update_tso_features(struct efx_nic *efx) +{ + struct ef100_nic_data *nic_data = efx->nic_data; + struct net_device *net_dev = efx->net_dev; + netdev_features_t tso; + + if (!efx_ef100_has_cap(nic_data->datapath_caps2, TX_TSO_V3)) + return; + + tso = NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_PARTIAL | + NETIF_F_GSO_UDP_TUNNEL | NETIF_F_GSO_UDP_TUNNEL_CSUM | + NETIF_F_GSO_GRE | NETIF_F_GSO_GRE_CSUM; + + net_dev->features |= tso; + net_dev->hw_features |= tso; + net_dev->hw_enc_features |= tso; + /* EF100 HW can only offload outer checksums if they are UDP, + * so for GRE_CSUM we have to use GSO_PARTIAL. + */ + net_dev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM; +} + int ef100_probe_netdev(struct efx_probe_data *probe_data) { struct efx_nic *efx = &probe_data->efx; @@ -387,9 +409,7 @@ int ef100_probe_netdev(struct efx_probe_data *probe_data) ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT); efx->mdio.dev = net_dev; - rc = efx_ef100_init_datapath_caps(efx); - if (rc < 0) - goto fail; + efx_ef100_update_tso_features(efx); rc = ef100_phy_probe(efx); if (rc) diff --git a/drivers/net/ethernet/sfc/ef100_nic.c b/drivers/net/ethernet/sfc/ef100_nic.c index 54b2ee7a5be6..498b398175d7 100644 --- a/drivers/net/ethernet/sfc/ef100_nic.c +++ b/drivers/net/ethernet/sfc/ef100_nic.c @@ -162,7 +162,7 @@ int ef100_get_mac_address(struct efx_nic *efx, u8 *mac_address, return 0; } -int efx_ef100_init_datapath_caps(struct efx_nic *efx) +static int efx_ef100_init_datapath_caps(struct efx_nic *efx) { MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_CAPABILITIES_V7_OUT_LEN); struct ef100_nic_data *nic_data = efx->nic_data; @@ -198,25 +198,22 @@ int efx_ef100_init_datapath_caps(struct efx_nic *efx) if (rc) return rc; - if (efx_ef100_has_cap(nic_data->datapath_caps2, TX_TSO_V3)) { - struct net_device *net_dev = efx->net_dev; - netdev_features_t tso = NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_PARTIAL | - NETIF_F_GSO_UDP_TUNNEL | NETIF_F_GSO_UDP_TUNNEL_CSUM | - NETIF_F_GSO_GRE | NETIF_F_GSO_GRE_CSUM; - - net_dev->features |= tso; - net_dev->hw_features |= tso; - net_dev->hw_enc_features |= tso; - /* EF100 HW can only offload outer checksums if they are UDP, - * so for GRE_CSUM we have to use GSO_PARTIAL. - */ - net_dev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM; - } efx->num_mac_stats = MCDI_WORD(outbuf, GET_CAPABILITIES_V4_OUT_MAC_STATS_NUM_STATS); netif_dbg(efx, probe, efx->net_dev, "firmware reports num_mac_stats = %u\n", efx->num_mac_stats); + + /* Current EF100 hardware supports vDPA on VFs only, requires MCDI v2 + * and Firmware's capability to proxy MCDI commands from PF to VF + */ + if (IS_ENABLED(CONFIG_SFC_VDPA)) { + nic_data->vdpa_supported = efx->type->is_vf && + (efx->type->mcdi_max_ver > 1) && + efx_ef100_has_cap(nic_data->datapath_caps3, + CLIENT_CMD_VF_PROXY); + } + return 0; } @@ -820,14 +817,12 @@ int efx_ef100_set_bar_config(struct efx_nic *efx, if (WARN_ON_ONCE(nic_data->bar_config > EF100_BAR_CONFIG_VDPA)) return -EINVAL; - /* Current EF100 hardware supports vDPA on VFs only */ - if (IS_ENABLED(CONFIG_SFC_VDPA) && - new_config == EF100_BAR_CONFIG_VDPA && - !efx->type->is_vf) { - pci_err(efx->pci_dev, "vdpa over PF not supported : %s", - efx->name); +#ifdef CONFIG_SFC_VDPA + if (new_config == EF100_BAR_CONFIG_VDPA && !nic_data->vdpa_supported) { + pci_err(efx->pci_dev, "vdpa not supported on %s", efx->name); return -EOPNOTSUPP; } +#endif mutex_lock(&nic_data->bar_config_lock); old_config = nic_data->bar_config; @@ -1203,6 +1198,12 @@ static int ef100_probe_main(struct efx_nic *efx) goto fail; } + rc = efx_ef100_init_datapath_caps(efx); + if (rc) { + pci_info(efx->pci_dev, "Unable to initialize datapath caps\n"); + goto fail; + } + return 0; fail: return rc; diff --git a/drivers/net/ethernet/sfc/ef100_nic.h b/drivers/net/ethernet/sfc/ef100_nic.h index 02e5ab4e9f1f..a01e9d643ccd 100644 --- a/drivers/net/ethernet/sfc/ef100_nic.h +++ b/drivers/net/ethernet/sfc/ef100_nic.h @@ -77,6 +77,9 @@ struct ef100_nic_data { u32 datapath_caps3; unsigned int pf_index; u16 warm_boot_count; +#ifdef CONFIG_SFC_VDPA + bool vdpa_supported; /* true if vdpa is supported on this PCIe FN */ +#endif u8 port_id[ETH_ALEN]; DECLARE_BITMAP(evq_phases, EFX_MAX_CHANNELS); enum ef100_bar_config bar_config; @@ -96,9 +99,8 @@ struct ef100_nic_data { }; #define efx_ef100_has_cap(caps, flag) \ - (!!((caps) & BIT_ULL(MC_CMD_GET_CAPABILITIES_V4_OUT_ ## flag ## _LBN))) + (!!((caps) & BIT_ULL(MC_CMD_GET_CAPABILITIES_V7_OUT_ ## flag ## _LBN))) -int efx_ef100_init_datapath_caps(struct efx_nic *efx); int ef100_phy_probe(struct efx_nic *efx); int ef100_filter_table_probe(struct efx_nic *efx); -- 2.30.1
Powered by blists - more mailing lists