From patchwork Thu Feb 8 03:53:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Saeed Mahameed X-Patchwork-Id: 13549301 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 673EF2DF92 for ; Thu, 8 Feb 2024 03:54:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707364451; cv=none; b=GrD3h/Ie0AXY4wPReAA3gyDKfr2fRYG5X1AscyjyndsGdBu7CRMp/cT3b3QQK25PQlPYxNz+Yo2YWcxaJfkUlCMVe2PPpAFjBnhbqyF0l5pi0+LXP/dBIgV+AaRq5R+TupRMCX9NazK3AgvdNHl6ebrOreUO4QjEf+0JRU/CKbg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707364451; c=relaxed/simple; bh=Wrb/NVxUr5BqLMjMCXvH/jmxv/YWdcsuXCpA68TWWa0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=D71eClJm558Y+osYDKnV+GEtM8SRHka3l8whW+RPfd0/Bmly1nbsM1tuPsmzO9GiLQYLkkLRGUuy/mnB0KZjgAaMRQJBglsWPSvimld3IcJfALZqUTBcylRhJfnHD14IgLVbwSJjiQeRYBvBpI4duPUaXCAVUk7vRqlAR7YUDpw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=sYbaFXuB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="sYbaFXuB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C5FCEC433C7; Thu, 8 Feb 2024 03:54:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707364450; bh=Wrb/NVxUr5BqLMjMCXvH/jmxv/YWdcsuXCpA68TWWa0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sYbaFXuBCEUTvpzcgjQhx5UfgUjaOljbbDsdzAd8Sj5og+tP8HQNWWfhgFnCvxTmw JlInwOpsePm0FaltRl8QXEAzxZ3TmEoj23CjWPdVkZ0pablafScYAWKWpgYa7rBojg 0o2sbNrEmlNfFbNIcszPF0u0zXxCRZ1wbEjV63dmvOpW0LNpco6HTLkp7r1AdhlpwJ oLHpn6LusZgy56/cylU2HlouamIXb+vICf5uQgBy1BjxYiHq+TRR6mi6FAW3d5hhf5 n6jzT42l5oE69HQZxB8imoW+9n3nEEsCxdn6bw8HMEnPwsa/GqMWF8tU92RnDvXDGH FPggDf9kTMubQ== From: Saeed Mahameed To: "David S. Miller" , Jakub Kicinski , Paolo Abeni , Eric Dumazet Cc: Saeed Mahameed , netdev@vger.kernel.org, Tariq Toukan , Gal Pressman , Leon Romanovsky Subject: [net-next v2 03/15] net/mlx5: SD, Implement basic query and instantiation Date: Wed, 7 Feb 2024 19:53:40 -0800 Message-ID: <20240208035352.387423-4-saeed@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240208035352.387423-1-saeed@kernel.org> References: <20240208035352.387423-1-saeed@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Tariq Toukan Add implementation for querying the MPIR register for Socket-Direct attributes, and instantiating a SD struct accordingly. Signed-off-by: Tariq Toukan Signed-off-by: Saeed Mahameed --- .../net/ethernet/mellanox/mlx5/core/lib/sd.c | 110 +++++++++++++++++- 1 file changed, 109 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/sd.c b/drivers/net/ethernet/mellanox/mlx5/core/lib/sd.c index ea37238c4519..b1f86549af1c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/lib/sd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/sd.c @@ -3,6 +3,8 @@ #include "lib/sd.h" #include "mlx5_core.h" +#include "lib/mlx5.h" +#include #define sd_info(__dev, format, ...) \ dev_info((__dev)->device, "Socket-Direct: " format, ##__VA_ARGS__) @@ -10,11 +12,18 @@ dev_warn((__dev)->device, "Socket-Direct: " format, ##__VA_ARGS__) struct mlx5_sd { + u32 group_id; + u8 host_buses; }; static int mlx5_sd_get_host_buses(struct mlx5_core_dev *dev) { - return 1; + struct mlx5_sd *sd = mlx5_get_sd(dev); + + if (!sd) + return 1; + + return sd->host_buses; } struct mlx5_core_dev * @@ -43,13 +52,112 @@ struct mlx5_core_dev *mlx5_sd_ch_ix_get_dev(struct mlx5_core_dev *primary, int c return mlx5_sd_primary_get_peer(primary, mdev_idx); } +static bool mlx5_sd_is_supported(struct mlx5_core_dev *dev, u8 host_buses) +{ + /* Feature is currently implemented for PFs only */ + if (!mlx5_core_is_pf(dev)) + return false; + + /* Honor the SW implementation limit */ + if (host_buses > MLX5_SD_MAX_GROUP_SZ) + return false; + + return true; +} + +static int mlx5_query_sd(struct mlx5_core_dev *dev, bool *sdm, + u8 *host_buses, u8 *sd_group) +{ + u32 out[MLX5_ST_SZ_DW(mpir_reg)]; + int err; + + err = mlx5_query_mpir_reg(dev, out); + if (err) + return err; + + err = mlx5_query_nic_vport_sd_group(dev, sd_group); + if (err) + return err; + + *sdm = MLX5_GET(mpir_reg, out, sdm); + *host_buses = MLX5_GET(mpir_reg, out, host_buses); + + return 0; +} + +static u32 mlx5_sd_group_id(struct mlx5_core_dev *dev, u8 sd_group) +{ + return (u32)((MLX5_CAP_GEN(dev, native_port_num) << 8) | sd_group); +} + +static int sd_init(struct mlx5_core_dev *dev) +{ + u8 host_buses, sd_group; + struct mlx5_sd *sd; + u32 group_id; + bool sdm; + int err; + + if (!MLX5_CAP_MCAM_REG(dev, mpir)) + return 0; + + err = mlx5_query_sd(dev, &sdm, &host_buses, &sd_group); + if (err) + return err; + + if (!sdm) + return 0; + + if (!sd_group) + return 0; + + group_id = mlx5_sd_group_id(dev, sd_group); + + if (!mlx5_sd_is_supported(dev, host_buses)) { + sd_warn(dev, "can't support requested netdev combining for group id 0x%x), skipping\n", + group_id); + return 0; + } + + sd = kzalloc(sizeof(*sd), GFP_KERNEL); + if (!sd) + return -ENOMEM; + + sd->host_buses = host_buses; + sd->group_id = group_id; + + mlx5_set_sd(dev, sd); + + return 0; +} + +static void sd_cleanup(struct mlx5_core_dev *dev) +{ + struct mlx5_sd *sd = mlx5_get_sd(dev); + + mlx5_set_sd(dev, NULL); + kfree(sd); +} + int mlx5_sd_init(struct mlx5_core_dev *dev) { + int err; + + err = sd_init(dev); + if (err) + return err; + return 0; } void mlx5_sd_cleanup(struct mlx5_core_dev *dev) { + struct mlx5_sd *sd = mlx5_get_sd(dev); + + if (!sd) + return; + + sd_cleanup(dev); } struct auxiliary_device *mlx5_sd_get_adev(struct mlx5_core_dev *dev,