Skip to content

Commit 30aa60b

Browse files
Eli CohenSaeed Mahameed
authored andcommitted
IB/mlx5: Support 4k UAR for libmlx5
Add fields to structs to convey to kernel an indication whether the library supports multi UARs per page and return to the library the size of a UAR based on the queried value. Signed-off-by: Eli Cohen <[email protected]> Reviewed-by: Matan Barak <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent b037c29 commit 30aa60b

File tree

9 files changed

+42
-100
lines changed

9 files changed

+42
-100
lines changed

drivers/infiniband/hw/mlx5/main.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -992,6 +992,12 @@ static int mlx5_ib_modify_port(struct ib_device *ibdev, u8 port, int mask,
992992
return err;
993993
}
994994

995+
static void print_lib_caps(struct mlx5_ib_dev *dev, u64 caps)
996+
{
997+
mlx5_ib_dbg(dev, "MLX5_LIB_CAP_4K_UAR = %s\n",
998+
caps & MLX5_LIB_CAP_4K_UAR ? "y" : "n");
999+
}
1000+
9951001
static int calc_total_bfregs(struct mlx5_ib_dev *dev, bool lib_uar_4k,
9961002
struct mlx5_ib_alloc_ucontext_req_v2 *req,
9971003
u32 *num_sys_pages)
@@ -1122,14 +1128,18 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
11221128
resp.cqe_version = min_t(__u8,
11231129
(__u8)MLX5_CAP_GEN(dev->mdev, cqe_version),
11241130
req.max_cqe_version);
1131+
resp.log_uar_size = MLX5_CAP_GEN(dev->mdev, uar_4k) ?
1132+
MLX5_ADAPTER_PAGE_SHIFT : PAGE_SHIFT;
1133+
resp.num_uars_per_page = MLX5_CAP_GEN(dev->mdev, uar_4k) ?
1134+
MLX5_CAP_GEN(dev->mdev, num_of_uars_per_page) : 1;
11251135
resp.response_length = min(offsetof(typeof(resp), response_length) +
11261136
sizeof(resp.response_length), udata->outlen);
11271137

11281138
context = kzalloc(sizeof(*context), GFP_KERNEL);
11291139
if (!context)
11301140
return ERR_PTR(-ENOMEM);
11311141

1132-
lib_uar_4k = false;
1142+
lib_uar_4k = req.lib_caps & MLX5_LIB_CAP_4K_UAR;
11331143
bfregi = &context->bfregi;
11341144

11351145
/* updates req->total_num_bfregs */
@@ -1209,14 +1219,21 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
12091219
sizeof(resp.reserved2);
12101220
}
12111221

1222+
if (field_avail(typeof(resp), log_uar_size, udata->outlen))
1223+
resp.response_length += sizeof(resp.log_uar_size);
1224+
1225+
if (field_avail(typeof(resp), num_uars_per_page, udata->outlen))
1226+
resp.response_length += sizeof(resp.num_uars_per_page);
1227+
12121228
err = ib_copy_to_udata(udata, &resp, resp.response_length);
12131229
if (err)
12141230
goto out_td;
12151231

12161232
bfregi->ver = ver;
12171233
bfregi->num_low_latency_bfregs = req.num_low_latency_bfregs;
12181234
context->cqe_version = resp.cqe_version;
1219-
context->lib_caps = false;
1235+
context->lib_caps = req.lib_caps;
1236+
print_lib_caps(dev, context->lib_caps);
12201237

12211238
return &context->ibucontext;
12221239

drivers/net/ethernet/mellanox/mlx5/core/cq.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ int mlx5_core_create_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq,
179179
mlx5_core_dbg(dev, "failed adding CP 0x%x to debug file system\n",
180180
cq->cqn);
181181

182+
cq->uar = dev->priv.uar;
183+
182184
return 0;
183185

184186
err_cmd:

drivers/net/ethernet/mellanox/mlx5/core/en.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,6 @@ struct mlx5e_sq {
465465
/* read only */
466466
struct mlx5_wq_cyc wq;
467467
u32 dma_fifo_mask;
468-
void __iomem *uar_map;
469468
struct netdev_queue *txq;
470469
u32 sqn;
471470
u16 bf_buf_size;
@@ -479,7 +478,7 @@ struct mlx5e_sq {
479478

480479
/* control path */
481480
struct mlx5_wq_ctrl wq_ctrl;
482-
struct mlx5_uar uar;
481+
struct mlx5_sq_bfreg bfreg;
483482
struct mlx5e_channel *channel;
484483
int tc;
485484
u32 rate_limit;
@@ -806,7 +805,7 @@ void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params,
806805
static inline void mlx5e_tx_notify_hw(struct mlx5e_sq *sq,
807806
struct mlx5_wqe_ctrl_seg *ctrl, int bf_sz)
808807
{
809-
u16 ofst = MLX5_BF_OFFSET + sq->bf_offset;
808+
u16 ofst = sq->bf_offset;
810809

811810
/* ensure wqe is visible to device before updating doorbell record */
812811
dma_wmb();
@@ -818,9 +817,9 @@ static inline void mlx5e_tx_notify_hw(struct mlx5e_sq *sq,
818817
*/
819818
wmb();
820819
if (bf_sz)
821-
__iowrite64_copy(sq->uar_map + ofst, ctrl, bf_sz);
820+
__iowrite64_copy(sq->bfreg.map + ofst, ctrl, bf_sz);
822821
else
823-
mlx5_write64((__be32 *)ctrl, sq->uar_map + ofst, NULL);
822+
mlx5_write64((__be32 *)ctrl, sq->bfreg.map + ofst, NULL);
824823
/* flush the write-combining mapped buffer */
825824
wmb();
826825

drivers/net/ethernet/mellanox/mlx5/core/en_common.c

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,10 @@ int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
8989
struct mlx5e_resources *res = &mdev->mlx5e_res;
9090
int err;
9191

92-
err = mlx5_alloc_map_uar(mdev, &res->cq_uar, false);
93-
if (err) {
94-
mlx5_core_err(mdev, "alloc_map uar failed, %d\n", err);
95-
return err;
96-
}
97-
9892
err = mlx5_core_alloc_pd(mdev, &res->pdn);
9993
if (err) {
10094
mlx5_core_err(mdev, "alloc pd failed, %d\n", err);
101-
goto err_unmap_free_uar;
95+
return err;
10296
}
10397

10498
err = mlx5_core_alloc_transport_domain(mdev, &res->td.tdn);
@@ -121,9 +115,6 @@ int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
121115
mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
122116
err_dealloc_pd:
123117
mlx5_core_dealloc_pd(mdev, res->pdn);
124-
err_unmap_free_uar:
125-
mlx5_unmap_free_uar(mdev, &res->cq_uar);
126-
127118
return err;
128119
}
129120

@@ -134,7 +125,6 @@ void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev)
134125
mlx5_core_destroy_mkey(mdev, &res->mkey);
135126
mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
136127
mlx5_core_dealloc_pd(mdev, res->pdn);
137-
mlx5_unmap_free_uar(mdev, &res->cq_uar);
138128
}
139129

140130
int mlx5e_refresh_tirs_self_loopback(struct mlx5_core_dev *mdev,

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,7 @@ static int mlx5e_create_sq(struct mlx5e_channel *c,
991991
sq->channel = c;
992992
sq->tc = tc;
993993

994-
err = mlx5_alloc_map_uar(mdev, &sq->uar, !!MLX5_CAP_GEN(mdev, bf));
994+
err = mlx5_alloc_bfreg(mdev, &sq->bfreg, MLX5_CAP_GEN(mdev, bf), false);
995995
if (err)
996996
return err;
997997

@@ -1003,12 +1003,9 @@ static int mlx5e_create_sq(struct mlx5e_channel *c,
10031003
goto err_unmap_free_uar;
10041004

10051005
sq->wq.db = &sq->wq.db[MLX5_SND_DBR];
1006-
if (sq->uar.bf_map) {
1006+
if (sq->bfreg.wc)
10071007
set_bit(MLX5E_SQ_STATE_BF_ENABLE, &sq->state);
1008-
sq->uar_map = sq->uar.bf_map;
1009-
} else {
1010-
sq->uar_map = sq->uar.map;
1011-
}
1008+
10121009
sq->bf_buf_size = (1 << MLX5_CAP_GEN(mdev, log_bf_reg_size)) / 2;
10131010
sq->max_inline = param->max_inline;
10141011
sq->min_inline_mode =
@@ -1036,7 +1033,7 @@ static int mlx5e_create_sq(struct mlx5e_channel *c,
10361033
mlx5_wq_destroy(&sq->wq_ctrl);
10371034

10381035
err_unmap_free_uar:
1039-
mlx5_unmap_free_uar(mdev, &sq->uar);
1036+
mlx5_free_bfreg(mdev, &sq->bfreg);
10401037

10411038
return err;
10421039
}
@@ -1048,7 +1045,7 @@ static void mlx5e_destroy_sq(struct mlx5e_sq *sq)
10481045

10491046
mlx5e_free_sq_db(sq);
10501047
mlx5_wq_destroy(&sq->wq_ctrl);
1051-
mlx5_unmap_free_uar(priv->mdev, &sq->uar);
1048+
mlx5_free_bfreg(priv->mdev, &sq->bfreg);
10521049
}
10531050

10541051
static int mlx5e_enable_sq(struct mlx5e_sq *sq, struct mlx5e_sq_param *param)
@@ -1082,7 +1079,7 @@ static int mlx5e_enable_sq(struct mlx5e_sq *sq, struct mlx5e_sq_param *param)
10821079
MLX5_SET(sqc, sqc, tis_lst_sz, param->type == MLX5E_SQ_ICO ? 0 : 1);
10831080

10841081
MLX5_SET(wq, wq, wq_type, MLX5_WQ_TYPE_CYCLIC);
1085-
MLX5_SET(wq, wq, uar_page, sq->uar.index);
1082+
MLX5_SET(wq, wq, uar_page, sq->bfreg.index);
10861083
MLX5_SET(wq, wq, log_wq_pg_sz, sq->wq_ctrl.buf.page_shift -
10871084
MLX5_ADAPTER_PAGE_SHIFT);
10881085
MLX5_SET64(wq, wq, dbr_addr, sq->wq_ctrl.db.dma);
@@ -1240,7 +1237,6 @@ static int mlx5e_create_cq(struct mlx5e_channel *c,
12401237
mcq->comp = mlx5e_completion_event;
12411238
mcq->event = mlx5e_cq_error_event;
12421239
mcq->irqn = irqn;
1243-
mcq->uar = &mdev->mlx5e_res.cq_uar;
12441240

12451241
for (i = 0; i < mlx5_cqwq_get_size(&cq->wq); i++) {
12461242
struct mlx5_cqe64 *cqe = mlx5_cqwq_get_wqe(&cq->wq, i);
@@ -1289,7 +1285,7 @@ static int mlx5e_enable_cq(struct mlx5e_cq *cq, struct mlx5e_cq_param *param)
12891285

12901286
MLX5_SET(cqc, cqc, cq_period_mode, param->cq_period_mode);
12911287
MLX5_SET(cqc, cqc, c_eqn, eqn);
1292-
MLX5_SET(cqc, cqc, uar_page, mcq->uar->index);
1288+
MLX5_SET(cqc, cqc, uar_page, mdev->priv.uar->index);
12931289
MLX5_SET(cqc, cqc, log_page_size, cq->wq_ctrl.frag_buf.page_shift -
12941290
MLX5_ADAPTER_PAGE_SHIFT);
12951291
MLX5_SET64(cqc, cqc, dbr_addr, cq->wq_ctrl.db.dma);
@@ -1701,7 +1697,7 @@ static void mlx5e_build_common_cq_param(struct mlx5e_priv *priv,
17011697
{
17021698
void *cqc = param->cqc;
17031699

1704-
MLX5_SET(cqc, cqc, uar_page, priv->mdev->mlx5e_res.cq_uar.index);
1700+
MLX5_SET(cqc, cqc, uar_page, priv->mdev->priv.uar->index);
17051701
}
17061702

17071703
static void mlx5e_build_rx_cq_param(struct mlx5e_priv *priv,
@@ -2320,7 +2316,6 @@ static int mlx5e_create_drop_cq(struct mlx5e_priv *priv,
23202316
mcq->comp = mlx5e_completion_event;
23212317
mcq->event = mlx5e_cq_error_event;
23222318
mcq->irqn = irqn;
2323-
mcq->uar = &mdev->mlx5e_res.cq_uar;
23242319

23252320
cq->priv = priv;
23262321

drivers/net/ethernet/mellanox/mlx5/core/uar.c

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,6 @@
3737
#include <linux/mlx5/cmd.h>
3838
#include "mlx5_core.h"
3939

40-
enum {
41-
NUM_DRIVER_UARS = 4,
42-
NUM_LOW_LAT_BFREGS = 4,
43-
};
44-
4540
int mlx5_cmd_alloc_uar(struct mlx5_core_dev *dev, u32 *uarn)
4641
{
4742
u32 out[MLX5_ST_SZ_DW(alloc_uar_out)] = {0};
@@ -67,57 +62,6 @@ int mlx5_cmd_free_uar(struct mlx5_core_dev *dev, u32 uarn)
6762
}
6863
EXPORT_SYMBOL(mlx5_cmd_free_uar);
6964

70-
int mlx5_alloc_map_uar(struct mlx5_core_dev *mdev, struct mlx5_uar *uar,
71-
bool map_wc)
72-
{
73-
phys_addr_t pfn;
74-
phys_addr_t uar_bar_start;
75-
int err;
76-
77-
err = mlx5_cmd_alloc_uar(mdev, &uar->index);
78-
if (err) {
79-
mlx5_core_warn(mdev, "mlx5_cmd_alloc_uar() failed, %d\n", err);
80-
return err;
81-
}
82-
83-
uar_bar_start = pci_resource_start(mdev->pdev, 0);
84-
pfn = (uar_bar_start >> PAGE_SHIFT) + uar->index;
85-
86-
if (map_wc) {
87-
uar->bf_map = ioremap_wc(pfn << PAGE_SHIFT, PAGE_SIZE);
88-
if (!uar->bf_map) {
89-
mlx5_core_warn(mdev, "ioremap_wc() failed\n");
90-
uar->map = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE);
91-
if (!uar->map)
92-
goto err_free_uar;
93-
}
94-
} else {
95-
uar->map = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE);
96-
if (!uar->map)
97-
goto err_free_uar;
98-
}
99-
100-
return 0;
101-
102-
err_free_uar:
103-
mlx5_core_warn(mdev, "ioremap() failed\n");
104-
err = -ENOMEM;
105-
mlx5_cmd_free_uar(mdev, uar->index);
106-
107-
return err;
108-
}
109-
EXPORT_SYMBOL(mlx5_alloc_map_uar);
110-
111-
void mlx5_unmap_free_uar(struct mlx5_core_dev *mdev, struct mlx5_uar *uar)
112-
{
113-
if (uar->map)
114-
iounmap(uar->map);
115-
else
116-
iounmap(uar->bf_map);
117-
mlx5_cmd_free_uar(mdev, uar->index);
118-
}
119-
EXPORT_SYMBOL(mlx5_unmap_free_uar);
120-
12165
static int uars_per_sys_page(struct mlx5_core_dev *mdev)
12266
{
12367
if (MLX5_CAP_GEN(mdev, uar_4k))

include/linux/mlx5/cq.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ struct mlx5_core_cq {
4242
int cqe_sz;
4343
__be32 *set_ci_db;
4444
__be32 *arm_db;
45+
struct mlx5_uars_page *uar;
4546
atomic_t refcount;
4647
struct completion free;
4748
unsigned vector;
4849
unsigned int irqn;
4950
void (*comp) (struct mlx5_core_cq *);
5051
void (*event) (struct mlx5_core_cq *, enum mlx5_event);
51-
struct mlx5_uar *uar;
5252
u32 cons_index;
5353
unsigned arm_sn;
5454
struct mlx5_rsc_debug *dbg;

include/linux/mlx5/driver.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -467,12 +467,6 @@ struct mlx5_sq_bfreg {
467467
unsigned int offset;
468468
};
469469

470-
struct mlx5_uar {
471-
u32 index;
472-
void __iomem *map;
473-
void __iomem *bf_map;
474-
};
475-
476470
struct mlx5_core_health {
477471
struct health_buffer __iomem *health;
478472
__be32 __iomem *health_counter;
@@ -725,7 +719,6 @@ struct mlx5_td {
725719
};
726720

727721
struct mlx5e_resources {
728-
struct mlx5_uar cq_uar;
729722
u32 pdn;
730723
struct mlx5_td td;
731724
struct mlx5_core_mkey mkey;
@@ -915,11 +908,6 @@ void mlx5_cmd_mbox_status(void *out, u8 *status, u32 *syndrome);
915908
int mlx5_core_get_caps(struct mlx5_core_dev *dev, enum mlx5_cap_type cap_type);
916909
int mlx5_cmd_alloc_uar(struct mlx5_core_dev *dev, u32 *uarn);
917910
int mlx5_cmd_free_uar(struct mlx5_core_dev *dev, u32 uarn);
918-
int mlx5_alloc_bfregs(struct mlx5_core_dev *dev, struct mlx5_bfreg_info *bfregi);
919-
int mlx5_free_bfregs(struct mlx5_core_dev *dev, struct mlx5_bfreg_info *bfregi);
920-
int mlx5_alloc_map_uar(struct mlx5_core_dev *mdev, struct mlx5_uar *uar,
921-
bool map_wc);
922-
void mlx5_unmap_free_uar(struct mlx5_core_dev *mdev, struct mlx5_uar *uar);
923911
void mlx5_health_cleanup(struct mlx5_core_dev *dev);
924912
int mlx5_health_init(struct mlx5_core_dev *dev);
925913
void mlx5_start_health_poll(struct mlx5_core_dev *dev);

include/uapi/rdma/mlx5-abi.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ struct mlx5_ib_alloc_ucontext_req {
6565
__u32 num_low_latency_bfregs;
6666
};
6767

68+
enum mlx5_lib_caps {
69+
MLX5_LIB_CAP_4K_UAR = (u64)1 << 0,
70+
};
71+
6872
struct mlx5_ib_alloc_ucontext_req_v2 {
6973
__u32 total_num_bfregs;
7074
__u32 num_low_latency_bfregs;
@@ -74,6 +78,7 @@ struct mlx5_ib_alloc_ucontext_req_v2 {
7478
__u8 reserved0;
7579
__u16 reserved1;
7680
__u32 reserved2;
81+
__u64 lib_caps;
7782
};
7883

7984
enum mlx5_ib_alloc_ucontext_resp_mask {
@@ -103,6 +108,8 @@ struct mlx5_ib_alloc_ucontext_resp {
103108
__u8 cmds_supp_uhw;
104109
__u16 reserved2;
105110
__u64 hca_core_clock_offset;
111+
__u32 log_uar_size;
112+
__u32 num_uars_per_page;
106113
};
107114

108115
struct mlx5_ib_alloc_pd_resp {

0 commit comments

Comments
 (0)