Lines Matching refs:res

38 static u32 *get_vhca_ids(struct mlx5e_rx_res *res, int offset)
40 bool multi_vhca = res->features & MLX5E_RX_RES_FEATURE_MULTI_VHCA;
42 return multi_vhca ? res->rss_vhca_ids + offset : NULL;
45 void mlx5e_rx_res_rss_update_num_channels(struct mlx5e_rx_res *res, u32 nch)
50 if (res->rss[i])
51 mlx5e_rss_params_indir_modify_actual_size(res->rss[i], nch);
55 static int mlx5e_rx_res_rss_init_def(struct mlx5e_rx_res *res,
58 bool inner_ft_support = res->features & MLX5E_RX_RES_FEATURE_INNER_FT;
61 if (WARN_ON(res->rss[0]))
64 rss = mlx5e_rss_init(res->mdev, inner_ft_support, res->drop_rqn,
65 &res->pkt_merge_param, MLX5E_RSS_INIT_TIRS, init_nch, res->max_nch);
71 res->rss[0] = rss;
76 int mlx5e_rx_res_rss_init(struct mlx5e_rx_res *res, u32 *rss_idx, unsigned int init_nch)
78 bool inner_ft_support = res->features & MLX5E_RX_RES_FEATURE_INNER_FT;
83 if (!res->rss[i])
89 rss = mlx5e_rss_init(res->mdev, inner_ft_support, res->drop_rqn,
90 &res->pkt_merge_param, MLX5E_RSS_INIT_NO_TIRS, init_nch,
91 res->max_nch);
96 if (res->rss_active) {
97 u32 *vhca_ids = get_vhca_ids(res, 0);
99 mlx5e_rss_enable(rss, res->rss_rqns, vhca_ids, res->rss_nch);
102 res->rss[i] = rss;
108 static int __mlx5e_rx_res_rss_destroy(struct mlx5e_rx_res *res, u32 rss_idx)
110 struct mlx5e_rss *rss = res->rss[rss_idx];
117 res->rss[rss_idx] = NULL;
122 int mlx5e_rx_res_rss_destroy(struct mlx5e_rx_res *res, u32 rss_idx)
129 rss = res->rss[rss_idx];
133 return __mlx5e_rx_res_rss_destroy(res, rss_idx);
136 static void mlx5e_rx_res_rss_destroy_all(struct mlx5e_rx_res *res)
141 struct mlx5e_rss *rss = res->rss[i];
147 err = __mlx5e_rx_res_rss_destroy(res, i);
152 mlx5_core_warn(res->mdev,
159 static void mlx5e_rx_res_rss_enable(struct mlx5e_rx_res *res)
163 res->rss_active = true;
166 struct mlx5e_rss *rss = res->rss[i];
171 vhca_ids = get_vhca_ids(res, 0);
172 mlx5e_rss_enable(rss, res->rss_rqns, vhca_ids, res->rss_nch);
176 static void mlx5e_rx_res_rss_disable(struct mlx5e_rx_res *res)
180 res->rss_active = false;
183 struct mlx5e_rss *rss = res->rss[i];
192 void mlx5e_rx_res_rss_set_indir_uniform(struct mlx5e_rx_res *res, unsigned int nch)
194 WARN_ON_ONCE(res->rss_active);
195 mlx5e_rss_set_indir_uniform(res->rss[0], nch);
198 int mlx5e_rx_res_rss_get_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
206 rss = res->rss[rss_idx];
213 int mlx5e_rx_res_rss_set_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
216 u32 *vhca_ids = get_vhca_ids(res, 0);
222 rss = res->rss[rss_idx];
226 return mlx5e_rss_set_rxfh(rss, indir, key, hfunc, res->rss_rqns, vhca_ids,
227 res->rss_nch);
230 int mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
238 rss = res->rss[rss_idx];
245 int mlx5e_rx_res_rss_set_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
253 rss = res->rss[rss_idx];
260 int mlx5e_rx_res_rss_cnt(struct mlx5e_rx_res *res)
266 if (res->rss[i])
272 int mlx5e_rx_res_rss_index(struct mlx5e_rx_res *res, struct mlx5e_rss *rss)
280 if (rss == res->rss[i])
286 struct mlx5e_rss *mlx5e_rx_res_rss_get(struct mlx5e_rx_res *res, u32 rss_idx)
291 return res->rss[rss_idx];
296 static void mlx5e_rx_res_free(struct mlx5e_rx_res *res)
298 kvfree(res->rss_vhca_ids);
299 kvfree(res->rss_rqns);
300 kvfree(res);
330 static int mlx5e_rx_res_channels_init(struct mlx5e_rx_res *res)
332 bool inner_ft_support = res->features & MLX5E_RX_RES_FEATURE_INNER_FT;
341 res->channels = kvcalloc(res->max_nch, sizeof(*res->channels), GFP_KERNEL);
342 if (!res->channels) {
347 for (ix = 0; ix < res->max_nch; ix++) {
348 err = mlx5e_rqt_init_direct(&res->channels[ix].direct_rqt,
349 res->mdev, false, res->drop_rqn,
350 mlx5e_rqt_size(res->mdev, res->max_nch));
352 mlx5_core_warn(res->mdev, "Failed to create a direct RQT: err = %d, ix = %u\n",
358 for (ix = 0; ix < res->max_nch; ix++) {
359 mlx5e_tir_builder_build_rqt(builder, res->mdev->mlx5e_res.hw_objs.td.tdn,
360 mlx5e_rqt_get_rqtn(&res->channels[ix].direct_rqt),
362 mlx5e_tir_builder_build_packet_merge(builder, &res->pkt_merge_param);
365 err = mlx5e_tir_init(&res->channels[ix].direct_tir, builder, res->mdev, true);
367 mlx5_core_warn(res->mdev, "Failed to create a direct TIR: err = %d, ix = %u\n",
379 mlx5e_tir_destroy(&res->channels[ix].direct_tir);
381 ix = res->max_nch;
384 mlx5e_rqt_destroy(&res->channels[ix].direct_rqt);
386 kvfree(res->channels);
394 static int mlx5e_rx_res_ptp_init(struct mlx5e_rx_res *res)
396 bool inner_ft_support = res->features & MLX5E_RX_RES_FEATURE_INNER_FT;
404 err = mlx5e_rqt_init_direct(&res->ptp.rqt, res->mdev, false, res->drop_rqn,
405 mlx5e_rqt_size(res->mdev, res->max_nch));
410 mlx5e_tir_builder_build_rqt(builder, res->mdev->mlx5e_res.hw_objs.td.tdn,
411 mlx5e_rqt_get_rqtn(&res->ptp.rqt),
415 err = mlx5e_tir_init(&res->ptp.tir, builder, res->mdev, true);
422 mlx5e_rqt_destroy(&res->ptp.rqt);
429 static void mlx5e_rx_res_channels_destroy(struct mlx5e_rx_res *res)
433 for (ix = 0; ix < res->max_nch; ix++) {
434 mlx5e_tir_destroy(&res->channels[ix].direct_tir);
435 mlx5e_rqt_destroy(&res->channels[ix].direct_rqt);
438 kvfree(res->channels);
441 static void mlx5e_rx_res_ptp_destroy(struct mlx5e_rx_res *res)
443 mlx5e_tir_destroy(&res->ptp.tir);
444 mlx5e_rqt_destroy(&res->ptp.rqt);
454 struct mlx5e_rx_res *res;
457 res = mlx5e_rx_res_alloc(mdev, max_nch, multi_vhca);
458 if (!res)
461 res->mdev = mdev;
462 res->features = features;
463 res->max_nch = max_nch;
464 res->drop_rqn = drop_rqn;
466 res->pkt_merge_param = *init_pkt_merge_param;
467 init_rwsem(&res->pkt_merge_param_sem);
469 err = mlx5e_rx_res_rss_init_def(res, init_nch);
473 err = mlx5e_rx_res_channels_init(res);
477 err = mlx5e_rx_res_ptp_init(res);
481 return res;
484 mlx5e_rx_res_channels_destroy(res);
486 __mlx5e_rx_res_rss_destroy(res, 0);
488 mlx5e_rx_res_free(res);
492 void mlx5e_rx_res_destroy(struct mlx5e_rx_res *res)
494 mlx5e_rx_res_ptp_destroy(res);
495 mlx5e_rx_res_channels_destroy(res);
496 mlx5e_rx_res_rss_destroy_all(res);
497 mlx5e_rx_res_free(res);
500 u32 mlx5e_rx_res_get_tirn_direct(struct mlx5e_rx_res *res, unsigned int ix)
502 return mlx5e_tir_get_tirn(&res->channels[ix].direct_tir);
505 u32 mlx5e_rx_res_get_tirn_rss(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt)
507 struct mlx5e_rss *rss = res->rss[0];
512 u32 mlx5e_rx_res_get_tirn_rss_inner(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt)
514 struct mlx5e_rss *rss = res->rss[0];
519 u32 mlx5e_rx_res_get_tirn_ptp(struct mlx5e_rx_res *res)
521 WARN_ON(!(res->features & MLX5E_RX_RES_FEATURE_PTP));
522 return mlx5e_tir_get_tirn(&res->ptp.tir);
525 static u32 mlx5e_rx_res_get_rqtn_direct(struct mlx5e_rx_res *res, unsigned int ix)
527 return mlx5e_rqt_get_rqtn(&res->channels[ix].direct_rqt);
530 static void mlx5e_rx_res_channel_activate_direct(struct mlx5e_rx_res *res,
534 u32 *vhca_id = get_vhca_ids(res, ix);
535 u32 rqn = res->rss_rqns[ix];
538 err = mlx5e_rqt_redirect_direct(&res->channels[ix].direct_rqt, rqn, vhca_id);
540 mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to RQ %#x (channel %u): err = %d\n",
541 mlx5e_rqt_get_rqtn(&res->channels[ix].direct_rqt),
545 static void mlx5e_rx_res_channel_deactivate_direct(struct mlx5e_rx_res *res,
550 err = mlx5e_rqt_redirect_direct(&res->channels[ix].direct_rqt, res->drop_rqn, NULL);
552 mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to drop RQ %#x (channel %u): err = %d\n",
553 mlx5e_rqt_get_rqtn(&res->channels[ix].direct_rqt),
554 res->drop_rqn, ix, err);
557 void mlx5e_rx_res_channels_activate(struct mlx5e_rx_res *res, struct mlx5e_channels *chs)
565 u32 *vhca_id = get_vhca_ids(res, ix);
568 mlx5e_channels_get_xsk_rqn(chs, ix, &res->rss_rqns[ix], vhca_id);
570 mlx5e_channels_get_regular_rqn(chs, ix, &res->rss_rqns[ix], vhca_id);
572 res->rss_nch = chs->num;
574 mlx5e_rx_res_rss_enable(res);
577 mlx5e_rx_res_channel_activate_direct(res, chs, ix);
578 for (ix = nch; ix < res->max_nch; ix++)
579 mlx5e_rx_res_channel_deactivate_direct(res, ix);
581 if (res->features & MLX5E_RX_RES_FEATURE_PTP) {
585 rqn = res->drop_rqn;
587 err = mlx5e_rqt_redirect_direct(&res->ptp.rqt, rqn, NULL);
589 mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to RQ %#x (PTP): err = %d\n",
590 mlx5e_rqt_get_rqtn(&res->ptp.rqt),
595 void mlx5e_rx_res_channels_deactivate(struct mlx5e_rx_res *res)
600 mlx5e_rx_res_rss_disable(res);
602 for (ix = 0; ix < res->max_nch; ix++)
603 mlx5e_rx_res_channel_deactivate_direct(res, ix);
605 if (res->features & MLX5E_RX_RES_FEATURE_PTP) {
606 err = mlx5e_rqt_redirect_direct(&res->ptp.rqt, res->drop_rqn, NULL);
608 mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to drop RQ %#x (PTP): err = %d\n",
609 mlx5e_rqt_get_rqtn(&res->ptp.rqt),
610 res->drop_rqn, err);
614 void mlx5e_rx_res_xsk_update(struct mlx5e_rx_res *res, struct mlx5e_channels *chs,
617 u32 *vhca_id = get_vhca_ids(res, ix);
620 mlx5e_channels_get_xsk_rqn(chs, ix, &res->rss_rqns[ix], vhca_id);
622 mlx5e_channels_get_regular_rqn(chs, ix, &res->rss_rqns[ix], vhca_id);
624 mlx5e_rx_res_rss_enable(res);
626 mlx5e_rx_res_channel_activate_direct(res, chs, ix);
629 int mlx5e_rx_res_packet_merge_set_param(struct mlx5e_rx_res *res,
640 down_write(&res->pkt_merge_param_sem);
641 res->pkt_merge_param = *pkt_merge_param;
648 struct mlx5e_rss *rss = res->rss[ix];
658 for (ix = 0; ix < res->max_nch; ix++) {
659 err = mlx5e_tir_modify(&res->channels[ix].direct_tir, builder);
661 mlx5_core_warn(res->mdev, "Failed to update packet merge state of direct TIR %#x for channel %u: err = %d\n",
662 mlx5e_tir_get_tirn(&res->channels[ix].direct_tir), ix, err);
668 up_write(&res->pkt_merge_param_sem);
673 struct mlx5e_rss_params_hash mlx5e_rx_res_get_current_hash(struct mlx5e_rx_res *res)
675 return mlx5e_rss_get_hash(res->rss[0]);
678 int mlx5e_rx_res_tls_tir_create(struct mlx5e_rx_res *res, unsigned int rxq,
681 bool inner_ft_support = res->features & MLX5E_RX_RES_FEATURE_INNER_FT;
690 rqtn = mlx5e_rx_res_get_rqtn_direct(res, rxq);
692 mlx5e_tir_builder_build_rqt(builder, res->mdev->mlx5e_res.hw_objs.td.tdn, rqtn,
696 down_read(&res->pkt_merge_param_sem);
697 mlx5e_tir_builder_build_packet_merge(builder, &res->pkt_merge_param);
698 err = mlx5e_tir_init(tir, builder, res->mdev, false);
699 up_read(&res->pkt_merge_param_sem);