| @@ -1258,8 +1258,9 @@ static bool tunnel_offload_supported(struct mlx5_core_dev *dev) · 1257 unmodified lines |
| 1258 | 1258 | |
| 1259 | 1259 | static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev, |
| 1260 | 1260 | struct mlx5_ib_rq *rq, u32 tdn, |
| 1261 | | − bool tunnel_offload_en) |
| 1261 | + u32 *qp_flags_en) |
| 1262 | 1262 | { |
| 1263 | + u8 lb_flag = 0; |
| 1263 | 1264 | u32 *in; |
| 1264 | 1265 | void *tirc; |
| 1265 | 1266 | int inlen; |
| @@ -1274,12 +1275,21 @@ static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev, · 8 unmodified lines |
| 1274 | 1275 | MLX5_SET(tirc, tirc, disp_type, MLX5_TIRC_DISP_TYPE_DIRECT); |
| 1275 | 1276 | MLX5_SET(tirc, tirc, inline_rqn, rq->base.mqp.qpn); |
| 1276 | 1277 | MLX5_SET(tirc, tirc, transport_domain, tdn); |
| 1277 | | − if (tunnel_offload_en) |
| 1278 | + if (*qp_flags_en & MLX5_QP_FLAG_TUNNEL_OFFLOADS) |
| 1278 | 1279 | MLX5_SET(tirc, tirc, tunneled_offload_en, 1); |
| 1279 | 1280 | |
| 1280 | | − if (dev->rep) |
| 1281 | | − MLX5_SET(tirc, tirc, self_lb_block, |
| 1282 | | − MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST); |
| 1281 | + if (*qp_flags_en & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC) |
| 1282 | + lb_flag |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST; |
| 1283 | + |
| 1284 | + if (*qp_flags_en & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC) |
| 1285 | + lb_flag |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST; |
| 1286 | + |
| 1287 | + if (dev->rep) { |
| 1288 | + lb_flag |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST; |
| 1289 | + *qp_flags_en |= MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC; |
| 1290 | + } |
| 1291 | + |
| 1292 | + MLX5_SET(tirc, tirc, self_lb_block, lb_flag); |
| 1283 | 1293 | |
| 1284 | 1294 | err = mlx5_core_create_tir(dev->mdev, in, inlen, &rq->tirn); |
| 1285 | 1295 | |
| @@ -1332,8 +1342,7 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 46 unmodified lines |
| 1332 | 1342 | goto err_destroy_sq; |
| 1333 | 1343 | |
| 1334 | 1344 | |
| 1335 | | − err = create_raw_packet_qp_tir(dev, rq, tdn, |
| 1336 | | − qp->tunnel_offload_en); |
| 1345 | + err = create_raw_packet_qp_tir(dev, rq, tdn, &qp->flags_en); |
| 1337 | 1346 | if (err) |
| 1338 | 1347 | goto err_destroy_rq; |
| 1339 | 1348 | } |
| @@ -1410,6 +1419,7 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 70 unmodified lines |
| 1410 | 1419 | u32 tdn = mucontext->tdn; |
| 1411 | 1420 | struct mlx5_ib_create_qp_rss ucmd = {}; |
| 1412 | 1421 | size_t required_cmd_sz; |
| 1422 | + u8 lb_flag = 0; |
| 1413 | 1423 | |
| 1414 | 1424 | if (init_attr->qp_type != IB_QPT_RAW_PACKET) |
| 1415 | 1425 | return -EOPNOTSUPP; |
| @@ -1444,7 +1454,9 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 28 unmodified lines |
| 1444 | 1454 | return -EOPNOTSUPP; |
| 1445 | 1455 | } |
| 1446 | 1456 | |
| 1447 | | − if (ucmd.flags & ~MLX5_QP_FLAG_TUNNEL_OFFLOADS) { |
| 1457 | + if (ucmd.flags & ~(MLX5_QP_FLAG_TUNNEL_OFFLOADS | |
| 1458 | + MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC | |
| 1459 | + MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC)) { |
| 1448 | 1460 | mlx5_ib_dbg(dev, "invalid flags\n"); |
| 1449 | 1461 | return -EOPNOTSUPP; |
| 1450 | 1462 | } |
| @@ -1461,6 +1473,16 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 10 unmodified lines |
| 1461 | 1473 | return -EOPNOTSUPP; |
| 1462 | 1474 | } |
| 1463 | 1475 | |
| 1476 | + if (ucmd.flags & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC || dev->rep) { |
| 1477 | + lb_flag |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST; |
| 1478 | + qp->flags_en |= MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC; |
| 1479 | + } |
| 1480 | + |
| 1481 | + if (ucmd.flags & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC) { |
| 1482 | + lb_flag |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST; |
| 1483 | + qp->flags_en |= MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC; |
| 1484 | + } |
| 1485 | + |
| 1464 | 1486 | err = ib_copy_to_udata(udata, &resp, min(udata->outlen, sizeof(resp))); |
| 1465 | 1487 | if (err) { |
| 1466 | 1488 | mlx5_ib_dbg(dev, "copy failed\n"); |
| @@ -1484,6 +1506,8 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 17 unmodified lines |
| 1484 | 1506 | if (ucmd.flags & MLX5_QP_FLAG_TUNNEL_OFFLOADS) |
| 1485 | 1507 | MLX5_SET(tirc, tirc, tunneled_offload_en, 1); |
| 1486 | 1508 | |
| 1509 | + MLX5_SET(tirc, tirc, self_lb_block, lb_flag); |
| 1510 | + |
| 1487 | 1511 | if (ucmd.rx_hash_fields_mask & MLX5_RX_HASH_INNER) |
| 1488 | 1512 | hfso = MLX5_ADDR_OF(tirc, tirc, rx_hash_field_selector_inner); |
| 1489 | 1513 | else |
| @@ -1580,10 +1604,6 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 90 unmodified lines |
| 1580 | 1604 | MLX5_SET(rx_hash_field_select, hfso, selected_fields, selected_fields); |
| 1581 | 1605 | |
| 1582 | 1606 | create_tir: |
| 1583 | | − if (dev->rep) |
| 1584 | | − MLX5_SET(tirc, tirc, self_lb_block, |
| 1585 | | − MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST); |
| 1586 | | − |
| 1587 | 1607 | err = mlx5_core_create_tir(dev->mdev, in, inlen, &qp->rss_qp.tirn); |
| 1588 | 1608 | |
| 1589 | 1609 | if (err) |
| @@ -1710,7 +1730,23 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, · 120 unmodified lines |
| 1710 | 1730 | mlx5_ib_dbg(dev, "Tunnel offload isn't supported\n"); |
| 1711 | 1731 | return -EOPNOTSUPP; |
| 1712 | 1732 | } |
| 1713 | | − qp->tunnel_offload_en = true; |
| 1733 | + qp->flags_en |= MLX5_QP_FLAG_TUNNEL_OFFLOADS; |
| 1734 | + } |
| 1735 | + |
| 1736 | + if (ucmd.flags & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC) { |
| 1737 | + if (init_attr->qp_type != IB_QPT_RAW_PACKET) { |
| 1738 | + mlx5_ib_dbg(dev, "Self-LB UC isn't supported\n"); |
| 1739 | + return -EOPNOTSUPP; |
| 1740 | + } |
| 1741 | + qp->flags_en |= MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC; |
| 1742 | + } |
| 1743 | + |
| 1744 | + if (ucmd.flags & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC) { |
| 1745 | + if (init_attr->qp_type != IB_QPT_RAW_PACKET) { |
| 1746 | + mlx5_ib_dbg(dev, "Self-LB UM isn't supported\n"); |
| 1747 | + return -EOPNOTSUPP; |
| 1748 | + } |
| 1749 | + qp->flags_en |= MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC; |
| 1714 | 1750 | } |
| 1715 | 1751 | |
| 1716 | 1752 | if (init_attr->create_flags & IB_QP_CREATE_SOURCE_QPN) { |