66#include "en/port.h"
77#include "en_accel/en_accel.h"
88#include "accel/ipsec.h"
9+ #include "fpga/ipsec.h"
910
1011static bool mlx5e_rx_is_xdp (struct mlx5e_params * params ,
1112 struct mlx5e_xsk_param * xsk )
@@ -89,30 +90,39 @@ bool mlx5e_rx_is_linear_skb(struct mlx5e_params *params,
8990 return !params -> lro_en && linear_frag_sz <= PAGE_SIZE ;
9091}
9192
92- #define MLX5_MAX_MPWQE_LOG_WQE_STRIDE_SZ ((BIT(__mlx5_bit_sz(wq, log_wqe_stride_size)) - 1) + \
93- MLX5_MPWQE_LOG_STRIDE_SZ_BASE)
94- bool mlx5e_rx_mpwqe_is_linear_skb (struct mlx5_core_dev * mdev ,
95- struct mlx5e_params * params ,
96- struct mlx5e_xsk_param * xsk )
93+ bool mlx5e_verify_rx_mpwqe_strides (struct mlx5_core_dev * mdev ,
94+ u8 log_stride_sz , u8 log_num_strides )
9795{
98- u32 linear_frag_sz = mlx5e_rx_get_linear_frag_sz (params , xsk );
99- s8 signed_log_num_strides_param ;
100- u8 log_num_strides ;
96+ if (log_stride_sz + log_num_strides != MLX5_MPWRQ_LOG_WQE_SZ )
97+ return false;
10198
102- if (!mlx5e_rx_is_linear_skb (params , xsk ))
99+ if (log_stride_sz < MLX5_MPWQE_LOG_STRIDE_SZ_BASE ||
100+ log_stride_sz > MLX5_MPWQE_LOG_STRIDE_SZ_MAX )
103101 return false;
104102
105- if (order_base_2 ( linear_frag_sz ) > MLX5_MAX_MPWQE_LOG_WQE_STRIDE_SZ )
103+ if (log_num_strides > MLX5_MPWQE_LOG_NUM_STRIDES_MAX )
106104 return false;
107105
108106 if (MLX5_CAP_GEN (mdev , ext_stride_num_range ))
109- return true ;
107+ return log_num_strides >= MLX5_MPWQE_LOG_NUM_STRIDES_EXT_BASE ;
110108
111- log_num_strides = MLX5_MPWRQ_LOG_WQE_SZ - order_base_2 (linear_frag_sz );
112- signed_log_num_strides_param =
113- (s8 )log_num_strides - MLX5_MPWQE_LOG_NUM_STRIDES_BASE ;
109+ return log_num_strides >= MLX5_MPWQE_LOG_NUM_STRIDES_BASE ;
110+ }
114111
115- return signed_log_num_strides_param >= 0 ;
112+ bool mlx5e_rx_mpwqe_is_linear_skb (struct mlx5_core_dev * mdev ,
113+ struct mlx5e_params * params ,
114+ struct mlx5e_xsk_param * xsk )
115+ {
116+ s8 log_num_strides ;
117+ u8 log_stride_sz ;
118+
119+ if (!mlx5e_rx_is_linear_skb (params , xsk ))
120+ return false;
121+
122+ log_stride_sz = order_base_2 (mlx5e_rx_get_linear_frag_sz (params , xsk ));
123+ log_num_strides = MLX5_MPWRQ_LOG_WQE_SZ - log_stride_sz ;
124+
125+ return mlx5e_verify_rx_mpwqe_strides (mdev , log_stride_sz , log_num_strides );
116126}
117127
118128u8 mlx5e_mpwqe_get_log_rq_size (struct mlx5e_params * params ,
@@ -282,7 +292,7 @@ bool mlx5e_striding_rq_possible(struct mlx5_core_dev *mdev,
282292 if (!mlx5e_check_fragmented_striding_rq_cap (mdev ))
283293 return false;
284294
285- if (MLX5_IPSEC_DEV (mdev ))
295+ if (mlx5_fpga_is_ipsec_device (mdev ))
286296 return false;
287297
288298 if (params -> xdp_prog ) {
@@ -364,7 +374,7 @@ static void mlx5e_build_rq_frags_info(struct mlx5_core_dev *mdev,
364374 u32 buf_size = 0 ;
365375 int i ;
366376
367- if (MLX5_IPSEC_DEV (mdev ))
377+ if (mlx5_fpga_is_ipsec_device (mdev ))
368378 byte_count += MLX5E_METADATA_ETHER_LEN ;
369379
370380 if (mlx5e_rx_is_linear_skb (params , xsk )) {
@@ -461,26 +471,36 @@ static void mlx5e_build_rx_cq_param(struct mlx5_core_dev *mdev,
461471 param -> cq_period_mode = params -> rx_cq_moderation .cq_period_mode ;
462472}
463473
464- void mlx5e_build_rq_param (struct mlx5_core_dev * mdev ,
465- struct mlx5e_params * params ,
466- struct mlx5e_xsk_param * xsk ,
467- u16 q_counter ,
468- struct mlx5e_rq_param * param )
474+ int mlx5e_build_rq_param (struct mlx5_core_dev * mdev ,
475+ struct mlx5e_params * params ,
476+ struct mlx5e_xsk_param * xsk ,
477+ u16 q_counter ,
478+ struct mlx5e_rq_param * param )
469479{
470480 void * rqc = param -> rqc ;
471481 void * wq = MLX5_ADDR_OF (rqc , rqc , wq );
472482 int ndsegs = 1 ;
473483
474484 switch (params -> rq_wq_type ) {
475- case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ :
485+ case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ : {
486+ u8 log_wqe_num_of_strides = mlx5e_mpwqe_get_log_num_strides (mdev , params , xsk );
487+ u8 log_wqe_stride_size = mlx5e_mpwqe_get_log_stride_size (mdev , params , xsk );
488+
489+ if (!mlx5e_verify_rx_mpwqe_strides (mdev , log_wqe_stride_size ,
490+ log_wqe_num_of_strides )) {
491+ mlx5_core_err (mdev ,
492+ "Bad RX MPWQE params: log_stride_size %u, log_num_strides %u\n" ,
493+ log_wqe_stride_size , log_wqe_num_of_strides );
494+ return - EINVAL ;
495+ }
496+
476497 MLX5_SET (wq , wq , log_wqe_num_of_strides ,
477- mlx5e_mpwqe_get_log_num_strides (mdev , params , xsk ) -
478- MLX5_MPWQE_LOG_NUM_STRIDES_BASE );
498+ log_wqe_num_of_strides - MLX5_MPWQE_LOG_NUM_STRIDES_BASE );
479499 MLX5_SET (wq , wq , log_wqe_stride_size ,
480- mlx5e_mpwqe_get_log_stride_size (mdev , params , xsk ) -
481- MLX5_MPWQE_LOG_STRIDE_SZ_BASE );
500+ log_wqe_stride_size - MLX5_MPWQE_LOG_STRIDE_SZ_BASE );
482501 MLX5_SET (wq , wq , log_wq_sz , mlx5e_mpwqe_get_log_rq_size (params , xsk ));
483502 break ;
503+ }
484504 default : /* MLX5_WQ_TYPE_CYCLIC */
485505 MLX5_SET (wq , wq , log_wq_sz , params -> log_rq_mtu_frames );
486506 mlx5e_build_rq_frags_info (mdev , params , xsk , & param -> frags_info );
@@ -498,6 +518,8 @@ void mlx5e_build_rq_param(struct mlx5_core_dev *mdev,
498518
499519 param -> wq .buf_numa_node = dev_to_node (mlx5_core_dma_dev (mdev ));
500520 mlx5e_build_rx_cq_param (mdev , params , xsk , & param -> cqp );
521+
522+ return 0 ;
501523}
502524
503525void mlx5e_build_drop_rq_param (struct mlx5_core_dev * mdev ,
@@ -642,14 +664,17 @@ void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev,
642664 mlx5e_build_tx_cq_param (mdev , params , & param -> cqp );
643665}
644666
645- void mlx5e_build_channel_param (struct mlx5_core_dev * mdev ,
646- struct mlx5e_params * params ,
647- u16 q_counter ,
648- struct mlx5e_channel_param * cparam )
667+ int mlx5e_build_channel_param (struct mlx5_core_dev * mdev ,
668+ struct mlx5e_params * params ,
669+ u16 q_counter ,
670+ struct mlx5e_channel_param * cparam )
649671{
650672 u8 icosq_log_wq_sz , async_icosq_log_wq_sz ;
673+ int err ;
651674
652- mlx5e_build_rq_param (mdev , params , NULL , q_counter , & cparam -> rq );
675+ err = mlx5e_build_rq_param (mdev , params , NULL , q_counter , & cparam -> rq );
676+ if (err )
677+ return err ;
653678
654679 icosq_log_wq_sz = mlx5e_build_icosq_log_wq_sz (params , & cparam -> rq );
655680 async_icosq_log_wq_sz = mlx5e_build_async_icosq_log_wq_sz (mdev );
@@ -658,4 +683,6 @@ void mlx5e_build_channel_param(struct mlx5_core_dev *mdev,
658683 mlx5e_build_xdpsq_param (mdev , params , & cparam -> xdp_sq );
659684 mlx5e_build_icosq_param (mdev , icosq_log_wq_sz , & cparam -> icosq );
660685 mlx5e_build_async_icosq_param (mdev , async_icosq_log_wq_sz , & cparam -> async_icosq );
686+
687+ return 0 ;
661688}
0 commit comments