mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-26 11:25:09 +07:00
net/mlx5e: Use WQ API functions instead of direct fields access
Use the WQ API to get the WQ size, and to map a counter into a WQ entry index. Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
e4ad91f23f
commit
ddf385e31f
@ -450,7 +450,7 @@ struct mlx5e_icosq {
|
||||
static inline bool
|
||||
mlx5e_wqc_has_room_for(struct mlx5_wq_cyc *wq, u16 cc, u16 pc, u16 n)
|
||||
{
|
||||
return (((wq->sz_m1 & (cc - pc)) >= n) || (cc == pc));
|
||||
return (mlx5_wq_cyc_ctr2ix(wq, cc - pc) >= n) || (cc == pc);
|
||||
}
|
||||
|
||||
struct mlx5e_dma_info {
|
||||
@ -956,10 +956,9 @@ static inline void mlx5e_sq_fetch_wqe(struct mlx5e_txqsq *sq,
|
||||
struct mlx5e_tx_wqe **wqe,
|
||||
u16 *pi)
|
||||
{
|
||||
struct mlx5_wq_cyc *wq;
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
|
||||
wq = &sq->wq;
|
||||
*pi = sq->pc & wq->sz_m1;
|
||||
*pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
|
||||
*wqe = mlx5_wq_cyc_get_wqe(wq, *pi);
|
||||
memset(*wqe, 0, sizeof(**wqe));
|
||||
}
|
||||
@ -967,7 +966,7 @@ static inline void mlx5e_sq_fetch_wqe(struct mlx5e_txqsq *sq,
|
||||
static inline
|
||||
struct mlx5e_tx_wqe *mlx5e_post_nop(struct mlx5_wq_cyc *wq, u32 sqn, u16 *pc)
|
||||
{
|
||||
u16 pi = *pc & wq->sz_m1;
|
||||
u16 pi = mlx5_wq_cyc_ctr2ix(wq, *pc);
|
||||
struct mlx5e_tx_wqe *wqe = mlx5_wq_cyc_get_wqe(wq, pi);
|
||||
struct mlx5_wqe_ctrl_seg *cseg = &wqe->ctrl;
|
||||
|
||||
|
@ -836,13 +836,15 @@ static int mlx5e_open_rq(struct mlx5e_channel *c,
|
||||
static void mlx5e_activate_rq(struct mlx5e_rq *rq)
|
||||
{
|
||||
struct mlx5e_icosq *sq = &rq->channel->icosq;
|
||||
u16 pi = sq->pc & sq->wq.sz_m1;
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
struct mlx5e_tx_wqe *nopwqe;
|
||||
|
||||
u16 pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
|
||||
|
||||
set_bit(MLX5E_RQ_STATE_ENABLED, &rq->state);
|
||||
sq->db.ico_wqe[pi].opcode = MLX5_OPCODE_NOP;
|
||||
nopwqe = mlx5e_post_nop(&sq->wq, sq->sqn, &sq->pc);
|
||||
mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, &nopwqe->ctrl);
|
||||
nopwqe = mlx5e_post_nop(wq, sq->sqn, &sq->pc);
|
||||
mlx5e_notify_hw(wq, sq->pc, sq->uar_map, &nopwqe->ctrl);
|
||||
}
|
||||
|
||||
static void mlx5e_deactivate_rq(struct mlx5e_rq *rq)
|
||||
@ -885,6 +887,7 @@ static int mlx5e_alloc_xdpsq(struct mlx5e_channel *c,
|
||||
{
|
||||
void *sqc_wq = MLX5_ADDR_OF(sqc, param->sqc, wq);
|
||||
struct mlx5_core_dev *mdev = c->mdev;
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
int err;
|
||||
|
||||
sq->pdev = c->pdev;
|
||||
@ -894,10 +897,10 @@ static int mlx5e_alloc_xdpsq(struct mlx5e_channel *c,
|
||||
sq->min_inline_mode = params->tx_min_inline_mode;
|
||||
|
||||
param->wq.db_numa_node = cpu_to_node(c->cpu);
|
||||
err = mlx5_wq_cyc_create(mdev, ¶m->wq, sqc_wq, &sq->wq, &sq->wq_ctrl);
|
||||
err = mlx5_wq_cyc_create(mdev, ¶m->wq, sqc_wq, wq, &sq->wq_ctrl);
|
||||
if (err)
|
||||
return err;
|
||||
sq->wq.db = &sq->wq.db[MLX5_SND_DBR];
|
||||
wq->db = &wq->db[MLX5_SND_DBR];
|
||||
|
||||
err = mlx5e_alloc_xdpsq_db(sq, cpu_to_node(c->cpu));
|
||||
if (err)
|
||||
@ -940,22 +943,23 @@ static int mlx5e_alloc_icosq(struct mlx5e_channel *c,
|
||||
{
|
||||
void *sqc_wq = MLX5_ADDR_OF(sqc, param->sqc, wq);
|
||||
struct mlx5_core_dev *mdev = c->mdev;
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
int err;
|
||||
|
||||
sq->channel = c;
|
||||
sq->uar_map = mdev->mlx5e_res.bfreg.map;
|
||||
|
||||
param->wq.db_numa_node = cpu_to_node(c->cpu);
|
||||
err = mlx5_wq_cyc_create(mdev, ¶m->wq, sqc_wq, &sq->wq, &sq->wq_ctrl);
|
||||
err = mlx5_wq_cyc_create(mdev, ¶m->wq, sqc_wq, wq, &sq->wq_ctrl);
|
||||
if (err)
|
||||
return err;
|
||||
sq->wq.db = &sq->wq.db[MLX5_SND_DBR];
|
||||
wq->db = &wq->db[MLX5_SND_DBR];
|
||||
|
||||
err = mlx5e_alloc_icosq_db(sq, cpu_to_node(c->cpu));
|
||||
if (err)
|
||||
goto err_sq_wq_destroy;
|
||||
|
||||
sq->edge = (sq->wq.sz_m1 + 1) - MLX5E_ICOSQ_MAX_WQEBBS;
|
||||
sq->edge = mlx5_wq_cyc_get_size(wq) - MLX5E_ICOSQ_MAX_WQEBBS;
|
||||
|
||||
return 0;
|
||||
|
||||
@ -1005,6 +1009,7 @@ static int mlx5e_alloc_txqsq(struct mlx5e_channel *c,
|
||||
{
|
||||
void *sqc_wq = MLX5_ADDR_OF(sqc, param->sqc, wq);
|
||||
struct mlx5_core_dev *mdev = c->mdev;
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
int err;
|
||||
|
||||
sq->pdev = c->pdev;
|
||||
@ -1022,10 +1027,10 @@ static int mlx5e_alloc_txqsq(struct mlx5e_channel *c,
|
||||
set_bit(MLX5E_SQ_STATE_TLS, &sq->state);
|
||||
|
||||
param->wq.db_numa_node = cpu_to_node(c->cpu);
|
||||
err = mlx5_wq_cyc_create(mdev, ¶m->wq, sqc_wq, &sq->wq, &sq->wq_ctrl);
|
||||
err = mlx5_wq_cyc_create(mdev, ¶m->wq, sqc_wq, wq, &sq->wq_ctrl);
|
||||
if (err)
|
||||
return err;
|
||||
sq->wq.db = &sq->wq.db[MLX5_SND_DBR];
|
||||
wq->db = &wq->db[MLX5_SND_DBR];
|
||||
|
||||
err = mlx5e_alloc_txqsq_db(sq, cpu_to_node(c->cpu));
|
||||
if (err)
|
||||
@ -1034,7 +1039,7 @@ static int mlx5e_alloc_txqsq(struct mlx5e_channel *c,
|
||||
INIT_WORK(&sq->dim.work, mlx5e_tx_dim_work);
|
||||
sq->dim.mode = params->tx_cq_moderation.cq_period_mode;
|
||||
|
||||
sq->edge = (sq->wq.sz_m1 + 1) - MLX5_SEND_WQE_MAX_WQEBBS;
|
||||
sq->edge = mlx5_wq_cyc_get_size(wq) - MLX5_SEND_WQE_MAX_WQEBBS;
|
||||
|
||||
return 0;
|
||||
|
||||
@ -1238,6 +1243,7 @@ static inline void netif_tx_disable_queue(struct netdev_queue *txq)
|
||||
static void mlx5e_deactivate_txqsq(struct mlx5e_txqsq *sq)
|
||||
{
|
||||
struct mlx5e_channel *c = sq->channel;
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
|
||||
clear_bit(MLX5E_SQ_STATE_ENABLED, &sq->state);
|
||||
/* prevent netif_tx_wake_queue */
|
||||
@ -1246,12 +1252,13 @@ static void mlx5e_deactivate_txqsq(struct mlx5e_txqsq *sq)
|
||||
netif_tx_disable_queue(sq->txq);
|
||||
|
||||
/* last doorbell out, godspeed .. */
|
||||
if (mlx5e_wqc_has_room_for(&sq->wq, sq->cc, sq->pc, 1)) {
|
||||
if (mlx5e_wqc_has_room_for(wq, sq->cc, sq->pc, 1)) {
|
||||
u16 pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
|
||||
struct mlx5e_tx_wqe *nop;
|
||||
|
||||
sq->db.wqe_info[(sq->pc & sq->wq.sz_m1)].skb = NULL;
|
||||
nop = mlx5e_post_nop(&sq->wq, sq->sqn, &sq->pc);
|
||||
mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, &nop->ctrl);
|
||||
sq->db.wqe_info[pi].skb = NULL;
|
||||
nop = mlx5e_post_nop(wq, sq->sqn, &sq->pc);
|
||||
mlx5e_notify_hw(wq, sq->pc, sq->uar_map, &nop->ctrl);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -54,7 +54,7 @@ static inline bool mlx5e_rx_hw_stamp(struct hwtstamp_config *config)
|
||||
static inline void mlx5e_read_cqe_slot(struct mlx5e_cq *cq, u32 cqcc,
|
||||
void *data)
|
||||
{
|
||||
u32 ci = cqcc & cq->wq.fbc.sz_m1;
|
||||
u32 ci = mlx5_cqwq_ctr2ix(&cq->wq, cqcc);
|
||||
|
||||
memcpy(data, mlx5_cqwq_get_wqe(&cq->wq, ci), sizeof(struct mlx5_cqe64));
|
||||
}
|
||||
@ -76,10 +76,11 @@ static inline void mlx5e_read_mini_arr_slot(struct mlx5e_cq *cq, u32 cqcc)
|
||||
|
||||
static inline void mlx5e_cqes_update_owner(struct mlx5e_cq *cq, u32 cqcc, int n)
|
||||
{
|
||||
struct mlx5_frag_buf_ctrl *fbc = &cq->wq.fbc;
|
||||
u8 op_own = (cqcc >> fbc->log_sz) & 1;
|
||||
u32 wq_sz = 1 << fbc->log_sz;
|
||||
u32 ci = cqcc & fbc->sz_m1;
|
||||
struct mlx5_cqwq *wq = &cq->wq;
|
||||
|
||||
u8 op_own = mlx5_cqwq_get_ctr_wrap_cnt(wq, cqcc) & 1;
|
||||
u32 ci = mlx5_cqwq_ctr2ix(wq, cqcc);
|
||||
u32 wq_sz = mlx5_cqwq_get_size(wq);
|
||||
u32 ci_top = min_t(u32, wq_sz, ci + n);
|
||||
|
||||
for (; ci < ci_top; ci++, n--) {
|
||||
@ -112,7 +113,7 @@ static inline void mlx5e_decompress_cqe(struct mlx5e_rq *rq,
|
||||
mpwrq_get_cqe_consumed_strides(&cq->title);
|
||||
else
|
||||
cq->decmprs_wqe_counter =
|
||||
(cq->decmprs_wqe_counter + 1) & rq->wq.sz_m1;
|
||||
mlx5_wq_ll_ctr2ix(&rq->wq, cq->decmprs_wqe_counter + 1);
|
||||
}
|
||||
|
||||
static inline void mlx5e_decompress_cqe_no_hash(struct mlx5e_rq *rq,
|
||||
@ -395,7 +396,7 @@ static int mlx5e_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
|
||||
int i;
|
||||
|
||||
/* fill sq edge with nops to avoid wqe wrap around */
|
||||
while ((pi = (sq->pc & wq->sz_m1)) > sq->edge) {
|
||||
while ((pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc)) > sq->edge) {
|
||||
sq->db.ico_wqe[pi].opcode = MLX5_OPCODE_NOP;
|
||||
mlx5e_post_nop(wq, sq->sqn, &sq->pc);
|
||||
}
|
||||
@ -482,7 +483,7 @@ static inline void mlx5e_poll_ico_single_cqe(struct mlx5e_cq *cq,
|
||||
struct mlx5_cqe64 *cqe)
|
||||
{
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
u16 ci = be16_to_cpu(cqe->wqe_counter) & wq->sz_m1;
|
||||
u16 ci = mlx5_wq_cyc_ctr2ix(wq, be16_to_cpu(cqe->wqe_counter));
|
||||
struct mlx5e_sq_wqe_info *icowi = &sq->db.ico_wqe[ci];
|
||||
|
||||
mlx5_cqwq_pop(&cq->wq);
|
||||
@ -731,7 +732,7 @@ static inline void mlx5e_xmit_xdp_doorbell(struct mlx5e_xdpsq *sq)
|
||||
{
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
struct mlx5e_tx_wqe *wqe;
|
||||
u16 pi = (sq->pc - 1) & wq->sz_m1; /* last pi */
|
||||
u16 pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc - 1); /* last pi */
|
||||
|
||||
wqe = mlx5_wq_cyc_get_wqe(wq, pi);
|
||||
|
||||
@ -744,7 +745,7 @@ static inline bool mlx5e_xmit_xdp_frame(struct mlx5e_rq *rq,
|
||||
{
|
||||
struct mlx5e_xdpsq *sq = &rq->xdpsq;
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
u16 pi = sq->pc & wq->sz_m1;
|
||||
u16 pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
|
||||
struct mlx5e_tx_wqe *wqe = mlx5_wq_cyc_get_wqe(wq, pi);
|
||||
|
||||
struct mlx5_wqe_ctrl_seg *cseg = &wqe->ctrl;
|
||||
@ -1214,7 +1215,7 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq)
|
||||
|
||||
last_wqe = (sqcc == wqe_counter);
|
||||
|
||||
ci = sqcc & sq->wq.sz_m1;
|
||||
ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sqcc);
|
||||
di = &sq->db.di[ci];
|
||||
|
||||
sqcc++;
|
||||
@ -1239,7 +1240,7 @@ void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq)
|
||||
u16 ci;
|
||||
|
||||
while (sq->cc != sq->pc) {
|
||||
ci = sq->cc & sq->wq.sz_m1;
|
||||
ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->cc);
|
||||
di = &sq->db.di[ci];
|
||||
sq->cc++;
|
||||
|
||||
|
@ -331,7 +331,7 @@ mlx5e_txwqe_complete(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
mlx5e_notify_hw(wq, sq->pc, sq->uar_map, cseg);
|
||||
|
||||
/* fill sq edge with nops to avoid wqe wrap around */
|
||||
while ((pi = (sq->pc & wq->sz_m1)) > sq->edge) {
|
||||
while ((pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc)) > sq->edge) {
|
||||
sq->db.wqe_info[pi].skb = NULL;
|
||||
mlx5e_post_nop(wq, sq->sqn, &sq->pc);
|
||||
sq->stats.nop++;
|
||||
@ -496,7 +496,7 @@ bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget)
|
||||
|
||||
last_wqe = (sqcc == wqe_counter);
|
||||
|
||||
ci = sqcc & sq->wq.sz_m1;
|
||||
ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sqcc);
|
||||
wi = &sq->db.wqe_info[ci];
|
||||
skb = wi->skb;
|
||||
|
||||
@ -559,7 +559,7 @@ void mlx5e_free_txqsq_descs(struct mlx5e_txqsq *sq)
|
||||
int i;
|
||||
|
||||
while (sq->cc != sq->pc) {
|
||||
ci = sq->cc & sq->wq.sz_m1;
|
||||
ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->cc);
|
||||
wi = &sq->db.wqe_info[ci];
|
||||
skb = wi->skb;
|
||||
|
||||
@ -606,7 +606,7 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
struct mlx5_av *av, u32 dqpn, u32 dqkey)
|
||||
{
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
u16 pi = sq->pc & wq->sz_m1;
|
||||
u16 pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
|
||||
struct mlx5i_tx_wqe *wqe = mlx5_wq_cyc_get_wqe(wq, pi);
|
||||
struct mlx5e_tx_wqe_info *wi = &sq->db.wqe_info[pi];
|
||||
|
||||
|
@ -123,9 +123,14 @@ static inline int mlx5_wq_cyc_cc_bigger(u16 cc1, u16 cc2)
|
||||
return !equal && !smaller;
|
||||
}
|
||||
|
||||
static inline u32 mlx5_cqwq_ctr2ix(struct mlx5_cqwq *wq, u32 ctr)
|
||||
{
|
||||
return ctr & wq->fbc.sz_m1;
|
||||
}
|
||||
|
||||
static inline u32 mlx5_cqwq_get_ci(struct mlx5_cqwq *wq)
|
||||
{
|
||||
return wq->cc & wq->fbc.sz_m1;
|
||||
return mlx5_cqwq_ctr2ix(wq, wq->cc);
|
||||
}
|
||||
|
||||
static inline void *mlx5_cqwq_get_wqe(struct mlx5_cqwq *wq, u32 ix)
|
||||
@ -133,9 +138,14 @@ static inline void *mlx5_cqwq_get_wqe(struct mlx5_cqwq *wq, u32 ix)
|
||||
return mlx5_frag_buf_get_wqe(&wq->fbc, ix);
|
||||
}
|
||||
|
||||
static inline u32 mlx5_cqwq_get_ctr_wrap_cnt(struct mlx5_cqwq *wq, u32 ctr)
|
||||
{
|
||||
return ctr >> wq->fbc.log_sz;
|
||||
}
|
||||
|
||||
static inline u32 mlx5_cqwq_get_wrap_cnt(struct mlx5_cqwq *wq)
|
||||
{
|
||||
return wq->cc >> wq->fbc.log_sz;
|
||||
return mlx5_cqwq_get_ctr_wrap_cnt(wq, wq->cc);
|
||||
}
|
||||
|
||||
static inline void mlx5_cqwq_pop(struct mlx5_cqwq *wq)
|
||||
@ -174,6 +184,11 @@ static inline int mlx5_wq_ll_is_empty(struct mlx5_wq_ll *wq)
|
||||
return !wq->cur_sz;
|
||||
}
|
||||
|
||||
static inline u16 mlx5_wq_ll_ctr2ix(struct mlx5_wq_ll *wq, u16 ctr)
|
||||
{
|
||||
return ctr & wq->sz_m1;
|
||||
}
|
||||
|
||||
static inline void *mlx5_wq_ll_get_wqe(struct mlx5_wq_ll *wq, u16 ix)
|
||||
{
|
||||
return wq->buf + (ix << wq->log_stride);
|
||||
|
Loading…
Reference in New Issue
Block a user