Message ID | 20241211134223.389616-11-tariqt@nvidia.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | mlx5 misc changes 2024-12-11 | expand |
On Wed, Dec 11, 2024 at 03:42:21PM +0200, Tariq Toukan wrote: > From: Itamar Gozlan <igozlan@nvidia.com> > > Add support for a new steering format version that is implemented by > ConnectX-8. > Except for several differences, the STEv3 is identical to STEv2, so > for most callbacks STEv3 context struct will call STEv2 functions. > > Signed-off-by: Itamar Gozlan <igozlan@nvidia.com> > Signed-off-by: Yevgeny Kliteynik <kliteyn@nvidia.com> > Signed-off-by: Tariq Toukan <tariqt@nvidia.com> > --- > .../net/ethernet/mellanox/mlx5/core/Makefile | 1 + > .../mlx5/core/steering/sws/dr_domain.c | 2 +- > .../mellanox/mlx5/core/steering/sws/dr_ste.c | 2 + > .../mellanox/mlx5/core/steering/sws/dr_ste.h | 1 + > .../mlx5/core/steering/sws/dr_ste_v3.c | 221 ++++++++++++++++++ > .../mlx5/core/steering/sws/mlx5_ifc_dr.h | 40 ++++ > .../mellanox/mlx5/core/steering/sws/mlx5dr.h | 2 +- > 7 files changed, 267 insertions(+), 2 deletions(-) > create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v3.c > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Makefile b/drivers/net/ethernet/mellanox/mlx5/core/Makefile > index 79fe09de0a9f..10a763e668ed 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/Makefile > +++ b/drivers/net/ethernet/mellanox/mlx5/core/Makefile > @@ -123,6 +123,7 @@ mlx5_core-$(CONFIG_MLX5_SW_STEERING) += steering/sws/dr_domain.o \ > steering/sws/dr_ste_v0.o \ > steering/sws/dr_ste_v1.o \ > steering/sws/dr_ste_v2.o \ > + steering/sws/dr_ste_v3.o \ > steering/sws/dr_cmd.o \ > steering/sws/dr_fw.o \ > steering/sws/dr_action.o \ > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c > index 3d74109f8230..bd361ba6658c 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c > +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c > @@ -8,7 +8,7 @@ > #define DR_DOMAIN_SW_STEERING_SUPPORTED(dmn, dmn_type) \ > ((dmn)->info.caps.dmn_type##_sw_owner || \ > ((dmn)->info.caps.dmn_type##_sw_owner_v2 && \ > - (dmn)->info.caps.sw_format_ver <= MLX5_STEERING_FORMAT_CONNECTX_7)) > + (dmn)->info.caps.sw_format_ver <= MLX5_STEERING_FORMAT_CONNECTX_8)) A definition for MLX5_STEERING_FORMAT_CONNECTX_8 seems to be missing from this patch. > > bool mlx5dr_domain_is_support_ptrn_arg(struct mlx5dr_domain *dmn) > { ...
On 12/12/2024 19:31, Simon Horman wrote: > On Wed, Dec 11, 2024 at 03:42:21PM +0200, Tariq Toukan wrote: >> From: Itamar Gozlan <igozlan@nvidia.com> >> >> Add support for a new steering format version that is implemented by >> ConnectX-8. >> Except for several differences, the STEv3 is identical to STEv2, so >> for most callbacks STEv3 context struct will call STEv2 functions. >> >> Signed-off-by: Itamar Gozlan <igozlan@nvidia.com> >> Signed-off-by: Yevgeny Kliteynik <kliteyn@nvidia.com> >> Signed-off-by: Tariq Toukan <tariqt@nvidia.com> >> --- >> .../net/ethernet/mellanox/mlx5/core/Makefile | 1 + >> .../mlx5/core/steering/sws/dr_domain.c | 2 +- >> .../mellanox/mlx5/core/steering/sws/dr_ste.c | 2 + >> .../mellanox/mlx5/core/steering/sws/dr_ste.h | 1 + >> .../mlx5/core/steering/sws/dr_ste_v3.c | 221 ++++++++++++++++++ >> .../mlx5/core/steering/sws/mlx5_ifc_dr.h | 40 ++++ >> .../mellanox/mlx5/core/steering/sws/mlx5dr.h | 2 +- >> 7 files changed, 267 insertions(+), 2 deletions(-) >> create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v3.c >> >> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Makefile b/drivers/net/ethernet/mellanox/mlx5/core/Makefile >> index 79fe09de0a9f..10a763e668ed 100644 >> --- a/drivers/net/ethernet/mellanox/mlx5/core/Makefile >> +++ b/drivers/net/ethernet/mellanox/mlx5/core/Makefile >> @@ -123,6 +123,7 @@ mlx5_core-$(CONFIG_MLX5_SW_STEERING) += steering/sws/dr_domain.o \ >> steering/sws/dr_ste_v0.o \ >> steering/sws/dr_ste_v1.o \ >> steering/sws/dr_ste_v2.o \ >> + steering/sws/dr_ste_v3.o \ >> steering/sws/dr_cmd.o \ >> steering/sws/dr_fw.o \ >> steering/sws/dr_action.o \ >> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c >> index 3d74109f8230..bd361ba6658c 100644 >> --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c >> +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c >> @@ -8,7 +8,7 @@ >> #define DR_DOMAIN_SW_STEERING_SUPPORTED(dmn, dmn_type) \ >> ((dmn)->info.caps.dmn_type##_sw_owner || \ >> ((dmn)->info.caps.dmn_type##_sw_owner_v2 && \ >> - (dmn)->info.caps.sw_format_ver <= MLX5_STEERING_FORMAT_CONNECTX_7)) >> + (dmn)->info.caps.sw_format_ver <= MLX5_STEERING_FORMAT_CONNECTX_8)) > > A definition for MLX5_STEERING_FORMAT_CONNECTX_8 seems to be missing > from this patch. > Should be pulled from mlx5-next, as described in the cover letter. Copying here for your convenience: It requires pulling 4 IFC patches that were applied to mlx5-next: https://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux.git/log/?h=mlx5-next >> >> bool mlx5dr_domain_is_support_ptrn_arg(struct mlx5dr_domain *dmn) >> { > > ... >
On Thu, 12 Dec 2024 20:31:30 +0200 Tariq Toukan wrote: > It requires pulling 4 IFC patches that were applied to > mlx5-next: > https://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux.git/log/?h=mlx5-next What do you expect we'll do with this series? If you expect it to be set to Awaiting Upstream - could you make sure that the cover letter has "mlx5-next" in the subject? That will makes it easier to automate in patchwork. If you expect the series to be applied / merged - LMK, I can try to explain why that's impossible..
On Thu, Dec 12, 2024 at 08:31:30PM +0200, Tariq Toukan wrote: > > > On 12/12/2024 19:31, Simon Horman wrote: > > On Wed, Dec 11, 2024 at 03:42:21PM +0200, Tariq Toukan wrote: > > > From: Itamar Gozlan <igozlan@nvidia.com> > > > > > > Add support for a new steering format version that is implemented by > > > ConnectX-8. > > > Except for several differences, the STEv3 is identical to STEv2, so > > > for most callbacks STEv3 context struct will call STEv2 functions. > > > > > > Signed-off-by: Itamar Gozlan <igozlan@nvidia.com> > > > Signed-off-by: Yevgeny Kliteynik <kliteyn@nvidia.com> > > > Signed-off-by: Tariq Toukan <tariqt@nvidia.com> > > > --- > > > .../net/ethernet/mellanox/mlx5/core/Makefile | 1 + > > > .../mlx5/core/steering/sws/dr_domain.c | 2 +- > > > .../mellanox/mlx5/core/steering/sws/dr_ste.c | 2 + > > > .../mellanox/mlx5/core/steering/sws/dr_ste.h | 1 + > > > .../mlx5/core/steering/sws/dr_ste_v3.c | 221 ++++++++++++++++++ > > > .../mlx5/core/steering/sws/mlx5_ifc_dr.h | 40 ++++ > > > .../mellanox/mlx5/core/steering/sws/mlx5dr.h | 2 +- > > > 7 files changed, 267 insertions(+), 2 deletions(-) > > > create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v3.c > > > > > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Makefile b/drivers/net/ethernet/mellanox/mlx5/core/Makefile > > > index 79fe09de0a9f..10a763e668ed 100644 > > > --- a/drivers/net/ethernet/mellanox/mlx5/core/Makefile > > > +++ b/drivers/net/ethernet/mellanox/mlx5/core/Makefile > > > @@ -123,6 +123,7 @@ mlx5_core-$(CONFIG_MLX5_SW_STEERING) += steering/sws/dr_domain.o \ > > > steering/sws/dr_ste_v0.o \ > > > steering/sws/dr_ste_v1.o \ > > > steering/sws/dr_ste_v2.o \ > > > + steering/sws/dr_ste_v3.o \ > > > steering/sws/dr_cmd.o \ > > > steering/sws/dr_fw.o \ > > > steering/sws/dr_action.o \ > > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c > > > index 3d74109f8230..bd361ba6658c 100644 > > > --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c > > > +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c > > > @@ -8,7 +8,7 @@ > > > #define DR_DOMAIN_SW_STEERING_SUPPORTED(dmn, dmn_type) \ > > > ((dmn)->info.caps.dmn_type##_sw_owner || \ > > > ((dmn)->info.caps.dmn_type##_sw_owner_v2 && \ > > > - (dmn)->info.caps.sw_format_ver <= MLX5_STEERING_FORMAT_CONNECTX_7)) > > > + (dmn)->info.caps.sw_format_ver <= MLX5_STEERING_FORMAT_CONNECTX_8)) > > > > A definition for MLX5_STEERING_FORMAT_CONNECTX_8 seems to be missing > > from this patch. > > > > Should be pulled from mlx5-next, as described in the cover letter. > > Copying here for your convenience: > > It requires pulling 4 IFC patches that were applied to > mlx5-next: > https://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux.git/log/?h=mlx5-next Thanks, sorry for missing that.
On 13/12/2024 3:11, Jakub Kicinski wrote: > On Thu, 12 Dec 2024 20:31:30 +0200 Tariq Toukan wrote: >> It requires pulling 4 IFC patches that were applied to >> mlx5-next: >> https://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux.git/log/?h=mlx5-next > > What do you expect we'll do with this series? > > If you expect it to be set to Awaiting Upstream - could you make sure > that the cover letter has "mlx5-next" in the subject? That will makes > it easier to automate in patchwork. > The relevant patches have mlx5-next in their topic. Should the cover letter as well? What about other non-IFC patches, keep them with net-next? > If you expect the series to be applied / merged - LMK, I can try > to explain why that's impossible.. The motivation is to avoid potential conflicts with rdma trees. AFAIK this is the agreed practice and is being followed for some time... If not, what's the suggested procedure then? How do you suggest getting these IFC changes to both net and rdma trees?
On Sun, 15 Dec 2024 08:25:44 +0200 Tariq Toukan wrote: > > What do you expect we'll do with this series? > > > > If you expect it to be set to Awaiting Upstream - could you make sure > > that the cover letter has "mlx5-next" in the subject? That will makes > > it easier to automate in patchwork. > > The relevant patches have mlx5-next in their topic. > Should the cover letter as well? > What about other non-IFC patches, keep them with net-next? > > > If you expect the series to be applied / merged - LMK, I can try > > to explain why that's impossible.. > > The motivation is to avoid potential conflicts with rdma trees. > AFAIK this is the agreed practice and is being followed for some time... > > If not, what's the suggested procedure then? > How do you suggest getting these IFC changes to both net and rdma trees? You can post just the mlx5-next patches (preferably) or the combined set (with mlx5-next in the cover letter tag). Wait a day or two (normal review period, like netdev maintainers would when applying to net-next). Apply the mlx5-next patches to mlx5-next. Send us a pull request with just the mlx5-next stuff. Post the net-next patches which depend on mlx5-next interface changes. We can count this as the posting, so feel free to apply patch 1 to mlx5-next and send the PR.
On 15/12/2024 23:12, Jakub Kicinski wrote: > On Sun, 15 Dec 2024 08:25:44 +0200 Tariq Toukan wrote: >>> What do you expect we'll do with this series? >>> >>> If you expect it to be set to Awaiting Upstream - could you make sure >>> that the cover letter has "mlx5-next" in the subject? That will makes >>> it easier to automate in patchwork. >> >> The relevant patches have mlx5-next in their topic. >> Should the cover letter as well? >> What about other non-IFC patches, keep them with net-next? >> >>> If you expect the series to be applied / merged - LMK, I can try >>> to explain why that's impossible.. >> >> The motivation is to avoid potential conflicts with rdma trees. >> AFAIK this is the agreed practice and is being followed for some time... >> >> If not, what's the suggested procedure then? >> How do you suggest getting these IFC changes to both net and rdma trees? > > You can post just the mlx5-next patches (preferably) or the combined > set (with mlx5-next in the cover letter tag). Wait a day or two (normal > review period, like netdev maintainers would when applying to > net-next). Apply the mlx5-next patches to mlx5-next. Send us a pull > request with just the mlx5-next stuff. > Done. > Post the net-next patches which depend on mlx5-next interface changes. > > We can count this as the posting, so feel free to apply patch 1 to > mlx5-next and send the PR. Done. Let me know of any issue. Thanks for your help.
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Makefile b/drivers/net/ethernet/mellanox/mlx5/core/Makefile index 79fe09de0a9f..10a763e668ed 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/Makefile +++ b/drivers/net/ethernet/mellanox/mlx5/core/Makefile @@ -123,6 +123,7 @@ mlx5_core-$(CONFIG_MLX5_SW_STEERING) += steering/sws/dr_domain.o \ steering/sws/dr_ste_v0.o \ steering/sws/dr_ste_v1.o \ steering/sws/dr_ste_v2.o \ + steering/sws/dr_ste_v3.o \ steering/sws/dr_cmd.o \ steering/sws/dr_fw.o \ steering/sws/dr_action.o \ diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c index 3d74109f8230..bd361ba6658c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c @@ -8,7 +8,7 @@ #define DR_DOMAIN_SW_STEERING_SUPPORTED(dmn, dmn_type) \ ((dmn)->info.caps.dmn_type##_sw_owner || \ ((dmn)->info.caps.dmn_type##_sw_owner_v2 && \ - (dmn)->info.caps.sw_format_ver <= MLX5_STEERING_FORMAT_CONNECTX_7)) + (dmn)->info.caps.sw_format_ver <= MLX5_STEERING_FORMAT_CONNECTX_8)) bool mlx5dr_domain_is_support_ptrn_arg(struct mlx5dr_domain *dmn) { diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste.c index 01ba8eae2983..c8b8ff80c7c7 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste.c @@ -1458,6 +1458,8 @@ struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx(u8 version) return mlx5dr_ste_get_ctx_v1(); else if (version == MLX5_STEERING_FORMAT_CONNECTX_7) return mlx5dr_ste_get_ctx_v2(); + else if (version == MLX5_STEERING_FORMAT_CONNECTX_8) + return mlx5dr_ste_get_ctx_v3(); return NULL; } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste.h b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste.h index b6ec8d30d990..5f409dc30aca 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste.h @@ -217,5 +217,6 @@ struct mlx5dr_ste_ctx { struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx_v0(void); struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx_v1(void); struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx_v2(void); +struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx_v3(void); #endif /* _DR_STE_ */ diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v3.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v3.c new file mode 100644 index 000000000000..cc60ce1d274e --- /dev/null +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v3.c @@ -0,0 +1,221 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +/* Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ + +#include "dr_ste_v1.h" +#include "dr_ste_v2.h" + +static void dr_ste_v3_set_encap(u8 *hw_ste_p, u8 *d_action, + u32 reformat_id, int size) +{ + MLX5_SET(ste_double_action_insert_with_ptr_v3, d_action, action_id, + DR_STE_V1_ACTION_ID_INSERT_POINTER); + /* The hardware expects here size in words (2 byte) */ + MLX5_SET(ste_double_action_insert_with_ptr_v3, d_action, size, size / 2); + MLX5_SET(ste_double_action_insert_with_ptr_v3, d_action, pointer, reformat_id); + MLX5_SET(ste_double_action_insert_with_ptr_v3, d_action, attributes, + DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); + dr_ste_v1_set_reparse(hw_ste_p); +} + +static void dr_ste_v3_set_push_vlan(u8 *ste, u8 *d_action, + u32 vlan_hdr) +{ + MLX5_SET(ste_double_action_insert_with_inline_v3, d_action, action_id, + DR_STE_V1_ACTION_ID_INSERT_INLINE); + /* The hardware expects here offset to vlan header in words (2 byte) */ + MLX5_SET(ste_double_action_insert_with_inline_v3, d_action, start_offset, + HDR_LEN_L2_MACS >> 1); + MLX5_SET(ste_double_action_insert_with_inline_v3, d_action, inline_data, vlan_hdr); + dr_ste_v1_set_reparse(ste); +} + +static void dr_ste_v3_set_pop_vlan(u8 *hw_ste_p, u8 *s_action, + u8 vlans_num) +{ + MLX5_SET(ste_single_action_remove_header_size_v3, s_action, + action_id, DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); + MLX5_SET(ste_single_action_remove_header_size_v3, s_action, + start_anchor, DR_STE_HEADER_ANCHOR_1ST_VLAN); + /* The hardware expects here size in words (2 byte) */ + MLX5_SET(ste_single_action_remove_header_size_v3, s_action, + remove_size, (HDR_LEN_L2_VLAN >> 1) * vlans_num); + + dr_ste_v1_set_reparse(hw_ste_p); +} + +static void dr_ste_v3_set_encap_l3(u8 *hw_ste_p, + u8 *frst_s_action, + u8 *scnd_d_action, + u32 reformat_id, + int size) +{ + /* Remove L2 headers */ + MLX5_SET(ste_single_action_remove_header_v3, frst_s_action, action_id, + DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); + MLX5_SET(ste_single_action_remove_header_v3, frst_s_action, end_anchor, + DR_STE_HEADER_ANCHOR_IPV6_IPV4); + + /* Encapsulate with given reformat ID */ + MLX5_SET(ste_double_action_insert_with_ptr_v3, scnd_d_action, action_id, + DR_STE_V1_ACTION_ID_INSERT_POINTER); + /* The hardware expects here size in words (2 byte) */ + MLX5_SET(ste_double_action_insert_with_ptr_v3, scnd_d_action, size, size / 2); + MLX5_SET(ste_double_action_insert_with_ptr_v3, scnd_d_action, pointer, reformat_id); + MLX5_SET(ste_double_action_insert_with_ptr_v3, scnd_d_action, attributes, + DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); + + dr_ste_v1_set_reparse(hw_ste_p); +} + +static void dr_ste_v3_set_rx_decap(u8 *hw_ste_p, u8 *s_action) +{ + MLX5_SET(ste_single_action_remove_header_v3, s_action, action_id, + DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); + MLX5_SET(ste_single_action_remove_header_v3, s_action, decap, 1); + MLX5_SET(ste_single_action_remove_header_v3, s_action, vni_to_cqe, 1); + MLX5_SET(ste_single_action_remove_header_v3, s_action, end_anchor, + DR_STE_HEADER_ANCHOR_INNER_MAC); + + dr_ste_v1_set_reparse(hw_ste_p); +} + +static int +dr_ste_v3_set_action_decap_l3_list(void *data, u32 data_sz, + u8 *hw_action, u32 hw_action_sz, + uint16_t *used_hw_action_num) +{ + u8 padded_data[DR_STE_L2_HDR_MAX_SZ] = {}; + void *data_ptr = padded_data; + u16 used_actions = 0; + u32 inline_data_sz; + u32 i; + + if (hw_action_sz / DR_STE_ACTION_DOUBLE_SZ < DR_STE_DECAP_L3_ACTION_NUM) + return -EINVAL; + + inline_data_sz = + MLX5_FLD_SZ_BYTES(ste_double_action_insert_with_inline_v3, inline_data); + + /* Add an alignment padding */ + memcpy(padded_data + data_sz % inline_data_sz, data, data_sz); + + /* Remove L2L3 outer headers */ + MLX5_SET(ste_single_action_remove_header_v3, hw_action, action_id, + DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); + MLX5_SET(ste_single_action_remove_header_v3, hw_action, decap, 1); + MLX5_SET(ste_single_action_remove_header_v3, hw_action, vni_to_cqe, 1); + MLX5_SET(ste_single_action_remove_header_v3, hw_action, end_anchor, + DR_STE_HEADER_ANCHOR_INNER_IPV6_IPV4); + hw_action += DR_STE_ACTION_DOUBLE_SZ; + used_actions++; /* Remove and NOP are a single double action */ + + /* Point to the last dword of the header */ + data_ptr += (data_sz / inline_data_sz) * inline_data_sz; + + /* Add the new header using inline action 4Byte at a time, the header + * is added in reversed order to the beginning of the packet to avoid + * incorrect parsing by the HW. Since header is 14B or 18B an extra + * two bytes are padded and later removed. + */ + for (i = 0; i < data_sz / inline_data_sz + 1; i++) { + void *addr_inline; + + MLX5_SET(ste_double_action_insert_with_inline_v3, hw_action, action_id, + DR_STE_V1_ACTION_ID_INSERT_INLINE); + /* The hardware expects here offset to words (2 bytes) */ + MLX5_SET(ste_double_action_insert_with_inline_v3, hw_action, start_offset, 0); + + /* Copy bytes one by one to avoid endianness problem */ + addr_inline = MLX5_ADDR_OF(ste_double_action_insert_with_inline_v3, + hw_action, inline_data); + memcpy(addr_inline, data_ptr - i * inline_data_sz, inline_data_sz); + hw_action += DR_STE_ACTION_DOUBLE_SZ; + used_actions++; + } + + /* Remove first 2 extra bytes */ + MLX5_SET(ste_single_action_remove_header_size_v3, hw_action, action_id, + DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); + MLX5_SET(ste_single_action_remove_header_size_v3, hw_action, start_offset, 0); + /* The hardware expects here size in words (2 bytes) */ + MLX5_SET(ste_single_action_remove_header_size_v3, hw_action, remove_size, 1); + used_actions++; + + *used_hw_action_num = used_actions; + + return 0; +} + +static struct mlx5dr_ste_ctx ste_ctx_v3 = { + /* Builders */ + .build_eth_l2_src_dst_init = &dr_ste_v1_build_eth_l2_src_dst_init, + .build_eth_l3_ipv6_src_init = &dr_ste_v1_build_eth_l3_ipv6_src_init, + .build_eth_l3_ipv6_dst_init = &dr_ste_v1_build_eth_l3_ipv6_dst_init, + .build_eth_l3_ipv4_5_tuple_init = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_init, + .build_eth_l2_src_init = &dr_ste_v1_build_eth_l2_src_init, + .build_eth_l2_dst_init = &dr_ste_v1_build_eth_l2_dst_init, + .build_eth_l2_tnl_init = &dr_ste_v1_build_eth_l2_tnl_init, + .build_eth_l3_ipv4_misc_init = &dr_ste_v1_build_eth_l3_ipv4_misc_init, + .build_eth_ipv6_l3_l4_init = &dr_ste_v1_build_eth_ipv6_l3_l4_init, + .build_mpls_init = &dr_ste_v1_build_mpls_init, + .build_tnl_gre_init = &dr_ste_v1_build_tnl_gre_init, + .build_tnl_mpls_init = &dr_ste_v1_build_tnl_mpls_init, + .build_tnl_mpls_over_udp_init = &dr_ste_v1_build_tnl_mpls_over_udp_init, + .build_tnl_mpls_over_gre_init = &dr_ste_v1_build_tnl_mpls_over_gre_init, + .build_icmp_init = &dr_ste_v1_build_icmp_init, + .build_general_purpose_init = &dr_ste_v1_build_general_purpose_init, + .build_eth_l4_misc_init = &dr_ste_v1_build_eth_l4_misc_init, + .build_tnl_vxlan_gpe_init = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init, + .build_tnl_geneve_init = &dr_ste_v1_build_flex_parser_tnl_geneve_init, + .build_tnl_geneve_tlv_opt_init = &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_init, + .build_tnl_geneve_tlv_opt_exist_init = + &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_init, + .build_register_0_init = &dr_ste_v1_build_register_0_init, + .build_register_1_init = &dr_ste_v1_build_register_1_init, + .build_src_gvmi_qpn_init = &dr_ste_v1_build_src_gvmi_qpn_init, + .build_flex_parser_0_init = &dr_ste_v1_build_flex_parser_0_init, + .build_flex_parser_1_init = &dr_ste_v1_build_flex_parser_1_init, + .build_tnl_gtpu_init = &dr_ste_v1_build_flex_parser_tnl_gtpu_init, + .build_tnl_header_0_1_init = &dr_ste_v1_build_tnl_header_0_1_init, + .build_tnl_gtpu_flex_parser_0_init = &dr_ste_v1_build_tnl_gtpu_flex_parser_0_init, + .build_tnl_gtpu_flex_parser_1_init = &dr_ste_v1_build_tnl_gtpu_flex_parser_1_init, + + /* Getters and Setters */ + .ste_init = &dr_ste_v1_init, + .set_next_lu_type = &dr_ste_v1_set_next_lu_type, + .get_next_lu_type = &dr_ste_v1_get_next_lu_type, + .is_miss_addr_set = &dr_ste_v1_is_miss_addr_set, + .set_miss_addr = &dr_ste_v1_set_miss_addr, + .get_miss_addr = &dr_ste_v1_get_miss_addr, + .set_hit_addr = &dr_ste_v1_set_hit_addr, + .set_byte_mask = &dr_ste_v1_set_byte_mask, + .get_byte_mask = &dr_ste_v1_get_byte_mask, + + /* Actions */ + .actions_caps = DR_STE_CTX_ACTION_CAP_TX_POP | + DR_STE_CTX_ACTION_CAP_RX_PUSH | + DR_STE_CTX_ACTION_CAP_RX_ENCAP, + .set_actions_rx = &dr_ste_v1_set_actions_rx, + .set_actions_tx = &dr_ste_v1_set_actions_tx, + .modify_field_arr_sz = ARRAY_SIZE(dr_ste_v2_action_modify_field_arr), + .modify_field_arr = dr_ste_v2_action_modify_field_arr, + .set_action_set = &dr_ste_v1_set_action_set, + .set_action_add = &dr_ste_v1_set_action_add, + .set_action_copy = &dr_ste_v1_set_action_copy, + .set_action_decap_l3_list = &dr_ste_v3_set_action_decap_l3_list, + .alloc_modify_hdr_chunk = &dr_ste_v1_alloc_modify_hdr_ptrn_arg, + .dealloc_modify_hdr_chunk = &dr_ste_v1_free_modify_hdr_ptrn_arg, + /* Actions bit set */ + .set_encap = &dr_ste_v3_set_encap, + .set_push_vlan = &dr_ste_v3_set_push_vlan, + .set_pop_vlan = &dr_ste_v3_set_pop_vlan, + .set_rx_decap = &dr_ste_v3_set_rx_decap, + .set_encap_l3 = &dr_ste_v3_set_encap_l3, + /* Send */ + .prepare_for_postsend = &dr_ste_v1_prepare_for_postsend, +}; + +struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx_v3(void) +{ + return &ste_ctx_v3; +} diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/mlx5_ifc_dr.h b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/mlx5_ifc_dr.h index fb078fa0f0cc..898c3618ff26 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/mlx5_ifc_dr.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/mlx5_ifc_dr.h @@ -600,4 +600,44 @@ struct mlx5_ifc_ste_double_action_aso_v1_bits { }; }; +struct mlx5_ifc_ste_single_action_remove_header_v3_bits { + u8 action_id[0x8]; + u8 start_anchor[0x7]; + u8 end_anchor[0x7]; + u8 reserved_at_16[0x1]; + u8 outer_l4_remove[0x1]; + u8 reserved_at_18[0x4]; + u8 decap[0x1]; + u8 vni_to_cqe[0x1]; + u8 qos_profile[0x2]; +}; + +struct mlx5_ifc_ste_single_action_remove_header_size_v3_bits { + u8 action_id[0x8]; + u8 start_anchor[0x7]; + u8 start_offset[0x8]; + u8 outer_l4_remove[0x1]; + u8 reserved_at_18[0x2]; + u8 remove_size[0x6]; +}; + +struct mlx5_ifc_ste_double_action_insert_with_inline_v3_bits { + u8 action_id[0x8]; + u8 start_anchor[0x7]; + u8 start_offset[0x8]; + u8 reserved_at_17[0x9]; + + u8 inline_data[0x20]; +}; + +struct mlx5_ifc_ste_double_action_insert_with_ptr_v3_bits { + u8 action_id[0x8]; + u8 start_anchor[0x7]; + u8 start_offset[0x8]; + u8 size[0x6]; + u8 attributes[0x3]; + + u8 pointer[0x20]; +}; + #endif /* MLX5_IFC_DR_H */ diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/mlx5dr.h b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/mlx5dr.h index 3ac7dc67509f..0bb3724c10c2 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/mlx5dr.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/mlx5dr.h @@ -160,7 +160,7 @@ mlx5dr_is_supported(struct mlx5_core_dev *dev) (MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner) || (MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner_v2) && (MLX5_CAP_GEN(dev, steering_format_version) <= - MLX5_STEERING_FORMAT_CONNECTX_7))); + MLX5_STEERING_FORMAT_CONNECTX_8))); } /* buddy functions & structure */