Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net/mlx5: Refactor MACsec WQE metadata shifts

Introduce MLX5_ETH_WQE_FT_META_SHIFT as a shared base offset for
features that use the lower 8 bits of the WQE flow_table_metadata
field, currently used for timestamping, IPsec, and MACsec.

Define MLX5_ETH_WQE_FT_META_MACSEC_FS_ID_MASK so that fs_id occupies
bits 2–5, making it clear that fs_id occupies bits in the metadata.

Set MLX5_ETH_WQE_FT_META_MACSEC_MASK as the OR of the MACsec flag and
MLX5_ETH_WQE_FT_META_MACSEC_FS_ID_MASK, corresponding to the original
0x3E mask.

Update the fs_id macro to right-shift the MACsec flag by
MLX5_ETH_WQE_FT_META_SHIFT and update the RoCE modify-header action to
use it.

Introduce the helper macro MLX5_MACSEC_TX_METADATA(fs_id) to compose
the full shifted MACsec metadata value.

These changes make it explicit exactly which metadata bits carry MACsec
information, simplifying future feature exclusions when multiple
features share the WQE flowtable metadata.

In addition, drop the incorrect “RX flow steering” comment, since this
applies to TX flow steering.

Signed-off-by: Carolina Jubran <cjubran@nvidia.com>
Reviewed-by: Jianbo Liu <jianbol@nvidia.com>
Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/1757574619-604874-3-git-send-email-tariqt@nvidia.com
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Leon Romanovsky <leon@kernel.org>

authored by

Carolina Jubran and committed by
Leon Romanovsky
cce65f32 de2be985

+28 -10
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c
··· 1676 1676 if (!fs_id) 1677 1677 return; 1678 1678 1679 - eseg->flow_table_metadata = cpu_to_be32(MLX5_ETH_WQE_FT_META_MACSEC | fs_id << 2); 1679 + eseg->flow_table_metadata = cpu_to_be32(MLX5_MACSEC_TX_METADATA(fs_id)); 1680 1680 } 1681 1681 1682 1682 void mlx5e_macsec_offload_handle_rx_skb(struct net_device *netdev,
+5 -7
drivers/net/ethernet/mellanox/mlx5/core/lib/macsec_fs.c
··· 45 45 #define MLX5_SECTAG_HEADER_SIZE_WITHOUT_SCI 0x8 46 46 #define MLX5_SECTAG_HEADER_SIZE_WITH_SCI (MLX5_SECTAG_HEADER_SIZE_WITHOUT_SCI + MACSEC_SCI_LEN) 47 47 48 - /* MACsec RX flow steering */ 49 - #define MLX5_ETH_WQE_FT_META_MACSEC_MASK 0x3E 50 - 51 48 /* MACsec fs_id handling for steering */ 52 - #define macsec_fs_set_tx_fs_id(fs_id) (MLX5_ETH_WQE_FT_META_MACSEC | (fs_id) << 2) 53 49 #define macsec_fs_set_rx_fs_id(fs_id) ((fs_id) | BIT(30)) 54 50 55 51 struct mlx5_sectag_header { ··· 593 597 MLX5_SET(fte_match_param, spec->match_criteria, misc_parameters_2.metadata_reg_a, 594 598 MLX5_ETH_WQE_FT_META_MACSEC_MASK); 595 599 MLX5_SET(fte_match_param, spec->match_value, misc_parameters_2.metadata_reg_a, 596 - macsec_fs_set_tx_fs_id(id)); 600 + MLX5_MACSEC_TX_METADATA(id)); 597 601 598 602 *fs_id = id; 599 603 flow_act->crypto.type = MLX5_FLOW_CONTEXT_ENCRYPT_DECRYPT_TYPE_MACSEC; ··· 2215 2219 2216 2220 MLX5_SET(set_action_in, action, action_type, MLX5_ACTION_TYPE_SET); 2217 2221 MLX5_SET(set_action_in, action, field, MLX5_ACTION_IN_FIELD_METADATA_REG_A); 2218 - MLX5_SET(set_action_in, action, data, macsec_fs_set_tx_fs_id(fs_id)); 2219 - MLX5_SET(set_action_in, action, offset, 0); 2222 + MLX5_SET(set_action_in, action, data, 2223 + mlx5_macsec_fs_set_tx_fs_id(fs_id)); 2224 + MLX5_SET(set_action_in, action, offset, 2225 + MLX5_ETH_WQE_FT_META_MACSEC_SHIFT); 2220 2226 MLX5_SET(set_action_in, action, length, 32); 2221 2227 2222 2228 modify_hdr = mlx5_modify_header_alloc(mdev, MLX5_FLOW_NAMESPACE_RDMA_TX_MACSEC,
+15
drivers/net/ethernet/mellanox/mlx5/core/lib/macsec_fs.h
··· 12 12 #define MLX5_MACSEC_METADATA_MARKER(metadata) ((((metadata) >> 30) & 0x3) == 0x1) 13 13 #define MLX5_MACSEC_RX_METADAT_HANDLE(metadata) ((metadata) & MLX5_MACSEC_RX_FS_ID_MASK) 14 14 15 + /* MACsec TX flow steering */ 16 + #define MLX5_ETH_WQE_FT_META_MACSEC_MASK \ 17 + (MLX5_ETH_WQE_FT_META_MACSEC | MLX5_ETH_WQE_FT_META_MACSEC_FS_ID_MASK) 18 + #define MLX5_ETH_WQE_FT_META_MACSEC_SHIFT MLX5_ETH_WQE_FT_META_SHIFT 19 + 20 + /* MACsec fs_id handling for steering */ 21 + #define mlx5_macsec_fs_set_tx_fs_id(fs_id) \ 22 + (((MLX5_ETH_WQE_FT_META_MACSEC) >> MLX5_ETH_WQE_FT_META_MACSEC_SHIFT) \ 23 + | ((fs_id) << 2)) 24 + 25 + #define MLX5_MACSEC_TX_METADATA(fs_id) \ 26 + (mlx5_macsec_fs_set_tx_fs_id(fs_id) << \ 27 + MLX5_ETH_WQE_FT_META_MACSEC_SHIFT) 28 + 29 + /* MACsec fs_id uses 4 bits, supports up to 16 interfaces */ 15 30 #define MLX5_MACSEC_NUM_OF_SUPPORTED_INTERFACES 16 16 31 17 32 struct mlx5_macsec_fs;
+7 -2
include/linux/mlx5/qp.h
··· 251 251 MLX5_ETH_WQE_SWP_OUTER_L4_UDP = 1 << 5, 252 252 }; 253 253 254 + /* Base shift for metadata bits used by timestamping, IPsec, and MACsec */ 255 + #define MLX5_ETH_WQE_FT_META_SHIFT 0 256 + 254 257 enum { 255 - MLX5_ETH_WQE_FT_META_IPSEC = BIT(0), 256 - MLX5_ETH_WQE_FT_META_MACSEC = BIT(1), 258 + MLX5_ETH_WQE_FT_META_IPSEC = BIT(0) << MLX5_ETH_WQE_FT_META_SHIFT, 259 + MLX5_ETH_WQE_FT_META_MACSEC = BIT(1) << MLX5_ETH_WQE_FT_META_SHIFT, 260 + MLX5_ETH_WQE_FT_META_MACSEC_FS_ID_MASK = 261 + GENMASK(5, 2) << MLX5_ETH_WQE_FT_META_SHIFT, 257 262 }; 258 263 259 264 struct mlx5_wqe_eth_seg {