OSDN Git Service

Merge branch 'mlx5-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox...
authorSaeed Mahameed <saeedm@mellanox.com>
Wed, 17 Oct 2018 21:13:36 +0000 (14:13 -0700)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 17 Oct 2018 21:13:36 +0000 (14:13 -0700)
mlx5 updates for both net-next and rdma-next

* 'mlx5-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux: (21 commits)
  net/mlx5: Expose DC scatter to CQE capability bit
  net/mlx5: Update mlx5_ifc with DEVX UID bits
  net/mlx5: Set uid as part of DCT commands
  net/mlx5: Set uid as part of SRQ commands
  net/mlx5: Set uid as part of SQ commands
  net/mlx5: Set uid as part of RQ commands
  net/mlx5: Set uid as part of QP commands
  net/mlx5: Set uid as part of CQ commands
  net/mlx5: Rename incorrect naming in IFC file
  net/mlx5: Export packet reformat alloc/dealloc functions
  net/mlx5: Pass a namespace for packet reformat ID allocation
  net/mlx5: Expose new packet reformat capabilities
  {net, RDMA}/mlx5: Rename encap to reformat packet
  net/mlx5: Move header encap type to IFC header file
  net/mlx5: Break encap/decap into two separated flow table creation flags
  net/mlx5: Add support for more namespaces when allocating modify header
  net/mlx5: Export modify header alloc/dealloc functions
  net/mlx5: Add proper NIC TX steering flow tables support
  net/mlx5: Cleanup flow namespace getter switch logic
  net/mlx5: Add memic command opcode to command checker
  ...

Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
21 files changed:
drivers/infiniband/hw/mlx5/devx.c
drivers/infiniband/hw/mlx5/qp.c
drivers/net/ethernet/mellanox/mlx5/core/cmd.c
drivers/net/ethernet/mellanox/mlx5/core/cq.c
drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h
drivers/net/ethernet/mellanox/mlx5/core/en_common.c
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
drivers/net/ethernet/mellanox/mlx5/core/qp.c
drivers/net/ethernet/mellanox/mlx5/core/srq.c
include/linux/mlx5/cq.h
include/linux/mlx5/device.h
include/linux/mlx5/driver.h
include/linux/mlx5/fs.h
include/linux/mlx5/mlx5_ifc.h
include/linux/mlx5/qp.h
include/linux/mlx5/srq.h

index f2f11e6..66dc337 100644 (file)
@@ -284,7 +284,7 @@ static bool devx_is_obj_create_cmd(const void *in)
        case MLX5_CMD_OP_CREATE_FLOW_TABLE:
        case MLX5_CMD_OP_CREATE_FLOW_GROUP:
        case MLX5_CMD_OP_ALLOC_FLOW_COUNTER:
-       case MLX5_CMD_OP_ALLOC_ENCAP_HEADER:
+       case MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT:
        case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:
        case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT:
        case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
@@ -627,9 +627,9 @@ static void devx_obj_build_destroy_cmd(void *in, void *out, void *din,
                MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
                         MLX5_CMD_OP_DEALLOC_FLOW_COUNTER);
                break;
-       case MLX5_CMD_OP_ALLOC_ENCAP_HEADER:
+       case MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT:
                MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
-                        MLX5_CMD_OP_DEALLOC_ENCAP_HEADER);
+                        MLX5_CMD_OP_DEALLOC_PACKET_REFORMAT_CONTEXT);
                break;
        case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:
                MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
index 6cba2a0..daf1eb8 100644 (file)
@@ -1279,7 +1279,7 @@ static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
 
        if (dev->rep)
                MLX5_SET(tirc, tirc, self_lb_block,
-                        MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST_);
+                        MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST);
 
        err = mlx5_core_create_tir(dev->mdev, in, inlen, &rq->tirn);
 
@@ -1582,7 +1582,7 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
 create_tir:
        if (dev->rep)
                MLX5_SET(tirc, tirc, self_lb_block,
-                        MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST_);
+                        MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST);
 
        err = mlx5_core_create_tir(dev->mdev, in, inlen, &qp->rss_qp.tirn);
 
index a53736c..a5a0823 100644 (file)
@@ -308,10 +308,11 @@ static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op,
        case MLX5_CMD_OP_MODIFY_FLOW_TABLE:
        case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
        case MLX5_CMD_OP_SET_FLOW_TABLE_ROOT:
-       case MLX5_CMD_OP_DEALLOC_ENCAP_HEADER:
+       case MLX5_CMD_OP_DEALLOC_PACKET_REFORMAT_CONTEXT:
        case MLX5_CMD_OP_DEALLOC_MODIFY_HEADER_CONTEXT:
        case MLX5_CMD_OP_FPGA_DESTROY_QP:
        case MLX5_CMD_OP_DESTROY_GENERAL_OBJECT:
+       case MLX5_CMD_OP_DEALLOC_MEMIC:
                return MLX5_CMD_STAT_OK;
 
        case MLX5_CMD_OP_QUERY_HCA_CAP:
@@ -426,7 +427,7 @@ static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op,
        case MLX5_CMD_OP_QUERY_FLOW_TABLE_ENTRY:
        case MLX5_CMD_OP_ALLOC_FLOW_COUNTER:
        case MLX5_CMD_OP_QUERY_FLOW_COUNTER:
-       case MLX5_CMD_OP_ALLOC_ENCAP_HEADER:
+       case MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT:
        case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:
        case MLX5_CMD_OP_FPGA_CREATE_QP:
        case MLX5_CMD_OP_FPGA_MODIFY_QP:
@@ -435,6 +436,7 @@ static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op,
        case MLX5_CMD_OP_CREATE_GENERAL_OBJECT:
        case MLX5_CMD_OP_MODIFY_GENERAL_OBJECT:
        case MLX5_CMD_OP_QUERY_GENERAL_OBJECT:
+       case MLX5_CMD_OP_ALLOC_MEMIC:
                *status = MLX5_DRIVER_STATUS_ABORTED;
                *synd = MLX5_DRIVER_SYND;
                return -EIO;
@@ -599,8 +601,8 @@ const char *mlx5_command_str(int command)
        MLX5_COMMAND_STR_CASE(DEALLOC_FLOW_COUNTER);
        MLX5_COMMAND_STR_CASE(QUERY_FLOW_COUNTER);
        MLX5_COMMAND_STR_CASE(MODIFY_FLOW_TABLE);
-       MLX5_COMMAND_STR_CASE(ALLOC_ENCAP_HEADER);
-       MLX5_COMMAND_STR_CASE(DEALLOC_ENCAP_HEADER);
+       MLX5_COMMAND_STR_CASE(ALLOC_PACKET_REFORMAT_CONTEXT);
+       MLX5_COMMAND_STR_CASE(DEALLOC_PACKET_REFORMAT_CONTEXT);
        MLX5_COMMAND_STR_CASE(ALLOC_MODIFY_HEADER_CONTEXT);
        MLX5_COMMAND_STR_CASE(DEALLOC_MODIFY_HEADER_CONTEXT);
        MLX5_COMMAND_STR_CASE(FPGA_CREATE_QP);
@@ -617,6 +619,8 @@ const char *mlx5_command_str(int command)
        MLX5_COMMAND_STR_CASE(MODIFY_GENERAL_OBJECT);
        MLX5_COMMAND_STR_CASE(QUERY_GENERAL_OBJECT);
        MLX5_COMMAND_STR_CASE(QUERY_MODIFY_HEADER_CONTEXT);
+       MLX5_COMMAND_STR_CASE(ALLOC_MEMIC);
+       MLX5_COMMAND_STR_CASE(DEALLOC_MEMIC);
        default: return "unknown command opcode";
        }
 }
index a417912..4b85abb 100644 (file)
@@ -109,6 +109,7 @@ int mlx5_core_create_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq,
        cq->cons_index = 0;
        cq->arm_sn     = 0;
        cq->eq         = eq;
+       cq->uid = MLX5_GET(create_cq_in, in, uid);
        refcount_set(&cq->refcount, 1);
        init_completion(&cq->free);
        if (!cq->comp)
@@ -144,6 +145,7 @@ err_cmd:
        memset(dout, 0, sizeof(dout));
        MLX5_SET(destroy_cq_in, din, opcode, MLX5_CMD_OP_DESTROY_CQ);
        MLX5_SET(destroy_cq_in, din, cqn, cq->cqn);
+       MLX5_SET(destroy_cq_in, din, uid, cq->uid);
        mlx5_cmd_exec(dev, din, sizeof(din), dout, sizeof(dout));
        return err;
 }
@@ -165,6 +167,7 @@ int mlx5_core_destroy_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq)
 
        MLX5_SET(destroy_cq_in, in, opcode, MLX5_CMD_OP_DESTROY_CQ);
        MLX5_SET(destroy_cq_in, in, cqn, cq->cqn);
+       MLX5_SET(destroy_cq_in, in, uid, cq->uid);
        err = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
        if (err)
                return err;
@@ -196,6 +199,7 @@ int mlx5_core_modify_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq,
        u32 out[MLX5_ST_SZ_DW(modify_cq_out)] = {0};
 
        MLX5_SET(modify_cq_in, in, opcode, MLX5_CMD_OP_MODIFY_CQ);
+       MLX5_SET(modify_cq_in, in, uid, cq->uid);
        return mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
 }
 EXPORT_SYMBOL(mlx5_core_modify_cq);
index 0240aee..e83dda4 100644 (file)
@@ -133,7 +133,7 @@ TRACE_EVENT(mlx5_fs_del_fg,
        {MLX5_FLOW_CONTEXT_ACTION_DROP,          "DROP"},\
        {MLX5_FLOW_CONTEXT_ACTION_FWD_DEST,      "FWD"},\
        {MLX5_FLOW_CONTEXT_ACTION_COUNT,         "CNT"},\
-       {MLX5_FLOW_CONTEXT_ACTION_ENCAP,         "ENCAP"},\
+       {MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT, "REFORMAT"},\
        {MLX5_FLOW_CONTEXT_ACTION_DECAP,         "DECAP"},\
        {MLX5_FLOW_CONTEXT_ACTION_MOD_HDR,       "MOD_HDR"},\
        {MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH,     "VLAN_PUSH"},\
index db3278c..3078491 100644 (file)
@@ -153,7 +153,7 @@ int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb)
 
        if (enable_uc_lb)
                MLX5_SET(modify_tir_in, in, ctx.self_lb_block,
-                        MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST_);
+                        MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST);
 
        MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1);
 
index 6de21d9..acf7a84 100644 (file)
@@ -100,11 +100,6 @@ struct mlx5e_tc_flow_parse_attr {
        int mirred_ifindex;
 };
 
-enum {
-       MLX5_HEADER_TYPE_VXLAN = 0x0,
-       MLX5_HEADER_TYPE_NVGRE = 0x1,
-};
-
 #define MLX5E_TC_TABLE_NUM_GROUPS 4
 #define MLX5E_TC_TABLE_MAX_GROUP_SIZE BIT(16)
 
@@ -690,7 +685,7 @@ mlx5e_tc_add_nic_flow(struct mlx5e_priv *priv,
                .action = attr->action,
                .has_flow_tag = true,
                .flow_tag = attr->flow_tag,
-               .encap_id = 0,
+               .reformat_id = 0,
        };
        struct mlx5_fc *counter = NULL;
        struct mlx5_flow_handle *rule;
@@ -842,7 +837,7 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
        struct mlx5e_priv *out_priv;
        int err;
 
-       if (attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP) {
+       if (attr->action & MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT) {
                out_dev = __dev_get_by_index(dev_net(priv->netdev),
                                             attr->parse_attr->mirred_ifindex);
                err = mlx5e_attach_encap(priv, &parse_attr->tun_info,
@@ -898,7 +893,7 @@ err_add_rule:
 err_mod_hdr:
        mlx5_eswitch_del_vlan_action(esw, attr);
 err_add_vlan:
-       if (attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP)
+       if (attr->action & MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT)
                mlx5e_detach_encap(priv, flow);
 err_attach_encap:
        return rule;
@@ -919,7 +914,7 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
 
        mlx5_eswitch_del_vlan_action(esw, attr);
 
-       if (attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP) {
+       if (attr->action & MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT) {
                mlx5e_detach_encap(priv, flow);
                kvfree(attr->parse_attr);
        }
@@ -936,9 +931,10 @@ void mlx5e_tc_encap_flows_add(struct mlx5e_priv *priv,
        struct mlx5e_tc_flow *flow;
        int err;
 
-       err = mlx5_encap_alloc(priv->mdev, e->tunnel_type,
-                              e->encap_size, e->encap_header,
-                              &e->encap_id);
+       err = mlx5_packet_reformat_alloc(priv->mdev, e->tunnel_type,
+                                        e->encap_size, e->encap_header,
+                                        MLX5_FLOW_NAMESPACE_FDB,
+                                        &e->encap_id);
        if (err) {
                mlx5_core_warn(priv->mdev, "Failed to offload cached encapsulation header, %d\n",
                               err);
@@ -992,7 +988,7 @@ void mlx5e_tc_encap_flows_del(struct mlx5e_priv *priv,
 
        if (e->flags & MLX5_ENCAP_ENTRY_VALID) {
                e->flags &= ~MLX5_ENCAP_ENTRY_VALID;
-               mlx5_encap_dealloc(priv->mdev, e->encap_id);
+               mlx5_packet_reformat_dealloc(priv->mdev, e->encap_id);
        }
 }
 
@@ -1061,7 +1057,7 @@ static void mlx5e_detach_encap(struct mlx5e_priv *priv,
                mlx5e_rep_encap_entry_detach(netdev_priv(e->out_dev), e);
 
                if (e->flags & MLX5_ENCAP_ENTRY_VALID)
-                       mlx5_encap_dealloc(priv->mdev, e->encap_id);
+                       mlx5_packet_reformat_dealloc(priv->mdev, e->encap_id);
 
                hash_del_rcu(&e->encap_hlist);
                kfree(e->encap_header);
@@ -2391,7 +2387,7 @@ static int mlx5e_create_encap_header_ipv4(struct mlx5e_priv *priv,
                return -ENOMEM;
 
        switch (e->tunnel_type) {
-       case MLX5_HEADER_TYPE_VXLAN:
+       case MLX5_REFORMAT_TYPE_L2_TO_VXLAN:
                fl4.flowi4_proto = IPPROTO_UDP;
                fl4.fl4_dport = tun_key->tp_dst;
                break;
@@ -2435,7 +2431,7 @@ static int mlx5e_create_encap_header_ipv4(struct mlx5e_priv *priv,
        read_unlock_bh(&n->lock);
 
        switch (e->tunnel_type) {
-       case MLX5_HEADER_TYPE_VXLAN:
+       case MLX5_REFORMAT_TYPE_L2_TO_VXLAN:
                gen_vxlan_header_ipv4(out_dev, encap_header,
                                      ipv4_encap_size, e->h_dest, tos, ttl,
                                      fl4.daddr,
@@ -2455,8 +2451,10 @@ static int mlx5e_create_encap_header_ipv4(struct mlx5e_priv *priv,
                goto out;
        }
 
-       err = mlx5_encap_alloc(priv->mdev, e->tunnel_type,
-                              ipv4_encap_size, encap_header, &e->encap_id);
+       err = mlx5_packet_reformat_alloc(priv->mdev, e->tunnel_type,
+                                        ipv4_encap_size, encap_header,
+                                        MLX5_FLOW_NAMESPACE_FDB,
+                                        &e->encap_id);
        if (err)
                goto destroy_neigh_entry;
 
@@ -2500,7 +2498,7 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv,
                return -ENOMEM;
 
        switch (e->tunnel_type) {
-       case MLX5_HEADER_TYPE_VXLAN:
+       case MLX5_REFORMAT_TYPE_L2_TO_VXLAN:
                fl6.flowi6_proto = IPPROTO_UDP;
                fl6.fl6_dport = tun_key->tp_dst;
                break;
@@ -2544,7 +2542,7 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv,
        read_unlock_bh(&n->lock);
 
        switch (e->tunnel_type) {
-       case MLX5_HEADER_TYPE_VXLAN:
+       case MLX5_REFORMAT_TYPE_L2_TO_VXLAN:
                gen_vxlan_header_ipv6(out_dev, encap_header,
                                      ipv6_encap_size, e->h_dest, tos, ttl,
                                      &fl6.daddr,
@@ -2565,8 +2563,10 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv,
                goto out;
        }
 
-       err = mlx5_encap_alloc(priv->mdev, e->tunnel_type,
-                              ipv6_encap_size, encap_header, &e->encap_id);
+       err = mlx5_packet_reformat_alloc(priv->mdev, e->tunnel_type,
+                                        ipv6_encap_size, encap_header,
+                                        MLX5_FLOW_NAMESPACE_FDB,
+                                        &e->encap_id);
        if (err)
                goto destroy_neigh_entry;
 
@@ -2617,7 +2617,7 @@ vxlan_encap_offload_err:
 
        if (mlx5_vxlan_lookup_port(priv->mdev->vxlan, be16_to_cpu(key->tp_dst)) &&
            MLX5_CAP_ESW(priv->mdev, vxlan_encap_decap)) {
-               tunnel_type = MLX5_HEADER_TYPE_VXLAN;
+               tunnel_type = MLX5_REFORMAT_TYPE_L2_TO_VXLAN;
        } else {
                NL_SET_ERR_MSG_MOD(extack,
                                   "port isn't an offloaded vxlan udp dport");
@@ -2797,7 +2797,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
                                parse_attr->mirred_ifindex = out_dev->ifindex;
                                parse_attr->tun_info = *info;
                                attr->parse_attr = parse_attr;
-                               action |= MLX5_FLOW_CONTEXT_ACTION_ENCAP |
+                               action |= MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT |
                                          MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
                                          MLX5_FLOW_CONTEXT_ACTION_COUNT;
                                /* attr->out_rep is resolved when we handle encap */
@@ -2954,7 +2954,8 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv,
                flow->flags |= MLX5E_TC_FLOW_OFFLOADED;
 
        if (!(flow->flags & MLX5E_TC_FLOW_ESWITCH) ||
-           !(flow->esw_attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP))
+           !(flow->esw_attr->action &
+             MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT))
                kvfree(parse_attr);
 
        err = rhashtable_insert_fast(tc_ht, &flow->node, tc_ht_params);
index ea7dedc..e1d47fa 100644 (file)
@@ -1746,7 +1746,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
        esw->enabled_vports = 0;
        esw->mode = SRIOV_NONE;
        esw->offloads.inline_mode = MLX5_INLINE_MODE_NONE;
-       if (MLX5_CAP_ESW_FLOWTABLE_FDB(dev, encap) &&
+       if (MLX5_CAP_ESW_FLOWTABLE_FDB(dev, reformat) &&
            MLX5_CAP_ESW_FLOWTABLE_FDB(dev, decap))
                esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_BASIC;
        else
index a35a231..0741683 100644 (file)
@@ -127,8 +127,8 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
        if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
                flow_act.modify_id = attr->mod_hdr_id;
 
-       if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_ENCAP)
-               flow_act.encap_id = attr->encap_id;
+       if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT)
+               flow_act.reformat_id = attr->encap_id;
 
        rule = mlx5_add_flow_rules(ft, spec, &flow_act, dest, i);
        if (IS_ERR(rule))
@@ -529,7 +529,8 @@ static int esw_create_offloads_fast_fdb_table(struct mlx5_eswitch *esw)
                esw_size >>= 1;
 
        if (esw->offloads.encap != DEVLINK_ESWITCH_ENCAP_MODE_NONE)
-               flags |= MLX5_FLOW_TABLE_TUNNEL_EN;
+               flags |= (MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT |
+                         MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
 
        fdb = mlx5_create_auto_grouped_flow_table(root_ns, FDB_FAST_PATH,
                                                  esw_size,
@@ -1256,7 +1257,7 @@ int mlx5_devlink_eswitch_encap_mode_set(struct devlink *devlink, u8 encap,
                return err;
 
        if (encap != DEVLINK_ESWITCH_ENCAP_MODE_NONE &&
-           (!MLX5_CAP_ESW_FLOWTABLE_FDB(dev, encap) ||
+           (!MLX5_CAP_ESW_FLOWTABLE_FDB(dev, reformat) ||
             !MLX5_CAP_ESW_FLOWTABLE_FDB(dev, decap)))
                return -EOPNOTSUPP;
 
index 8e01f81..dc8d7f6 100644 (file)
@@ -152,7 +152,8 @@ static int mlx5_cmd_create_flow_table(struct mlx5_core_dev *dev,
                                      struct mlx5_flow_table *next_ft,
                                      unsigned int *table_id, u32 flags)
 {
-       int en_encap_decap = !!(flags & MLX5_FLOW_TABLE_TUNNEL_EN);
+       int en_encap = !!(flags & MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT);
+       int en_decap = !!(flags & MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
        u32 out[MLX5_ST_SZ_DW(create_flow_table_out)] = {0};
        u32 in[MLX5_ST_SZ_DW(create_flow_table_in)]   = {0};
        int err;
@@ -169,9 +170,9 @@ static int mlx5_cmd_create_flow_table(struct mlx5_core_dev *dev,
        }
 
        MLX5_SET(create_flow_table_in, in, flow_table_context.decap_en,
-                en_encap_decap);
-       MLX5_SET(create_flow_table_in, in, flow_table_context.encap_en,
-                en_encap_decap);
+                en_decap);
+       MLX5_SET(create_flow_table_in, in, flow_table_context.reformat_en,
+                en_encap);
 
        switch (op_mod) {
        case FS_FT_OP_MOD_NORMAL:
@@ -343,7 +344,8 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
 
        MLX5_SET(flow_context, in_flow_context, flow_tag, fte->action.flow_tag);
        MLX5_SET(flow_context, in_flow_context, action, fte->action.action);
-       MLX5_SET(flow_context, in_flow_context, encap_id, fte->action.encap_id);
+       MLX5_SET(flow_context, in_flow_context, packet_reformat_id,
+                fte->action.reformat_id);
        MLX5_SET(flow_context, in_flow_context, modify_header_id,
                 fte->action.modify_id);
 
@@ -594,62 +596,78 @@ void mlx5_cmd_fc_bulk_get(struct mlx5_core_dev *dev,
        *bytes = MLX5_GET64(traffic_counter, stats, octets);
 }
 
-int mlx5_encap_alloc(struct mlx5_core_dev *dev,
-                    int header_type,
-                    size_t size,
-                    void *encap_header,
-                    u32 *encap_id)
+int mlx5_packet_reformat_alloc(struct mlx5_core_dev *dev,
+                              int reformat_type,
+                              size_t size,
+                              void *reformat_data,
+                              enum mlx5_flow_namespace_type namespace,
+                              u32 *packet_reformat_id)
 {
-       int max_encap_size = MLX5_CAP_ESW(dev, max_encap_header_size);
-       u32 out[MLX5_ST_SZ_DW(alloc_encap_header_out)];
-       void *encap_header_in;
-       void *header;
+       u32 out[MLX5_ST_SZ_DW(alloc_packet_reformat_context_out)];
+       void *packet_reformat_context_in;
+       int max_encap_size;
+       void *reformat;
        int inlen;
        int err;
        u32 *in;
 
+       if (namespace == MLX5_FLOW_NAMESPACE_FDB)
+               max_encap_size = MLX5_CAP_ESW(dev, max_encap_header_size);
+       else
+               max_encap_size = MLX5_CAP_FLOWTABLE(dev, max_encap_header_size);
+
        if (size > max_encap_size) {
                mlx5_core_warn(dev, "encap size %zd too big, max supported is %d\n",
                               size, max_encap_size);
                return -EINVAL;
        }
 
-       in = kzalloc(MLX5_ST_SZ_BYTES(alloc_encap_header_in) + size,
+       in = kzalloc(MLX5_ST_SZ_BYTES(alloc_packet_reformat_context_in) + size,
                     GFP_KERNEL);
        if (!in)
                return -ENOMEM;
 
-       encap_header_in = MLX5_ADDR_OF(alloc_encap_header_in, in, encap_header);
-       header = MLX5_ADDR_OF(encap_header_in, encap_header_in, encap_header);
-       inlen = header - (void *)in  + size;
+       packet_reformat_context_in = MLX5_ADDR_OF(alloc_packet_reformat_context_in,
+                                                 in, packet_reformat_context);
+       reformat = MLX5_ADDR_OF(packet_reformat_context_in,
+                               packet_reformat_context_in,
+                               reformat_data);
+       inlen = reformat - (void *)in  + size;
 
        memset(in, 0, inlen);
-       MLX5_SET(alloc_encap_header_in, in, opcode,
-                MLX5_CMD_OP_ALLOC_ENCAP_HEADER);
-       MLX5_SET(encap_header_in, encap_header_in, encap_header_size, size);
-       MLX5_SET(encap_header_in, encap_header_in, header_type, header_type);
-       memcpy(header, encap_header, size);
+       MLX5_SET(alloc_packet_reformat_context_in, in, opcode,
+                MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT);
+       MLX5_SET(packet_reformat_context_in, packet_reformat_context_in,
+                reformat_data_size, size);
+       MLX5_SET(packet_reformat_context_in, packet_reformat_context_in,
+                reformat_type, reformat_type);
+       memcpy(reformat, reformat_data, size);
 
        memset(out, 0, sizeof(out));
        err = mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
 
-       *encap_id = MLX5_GET(alloc_encap_header_out, out, encap_id);
+       *packet_reformat_id = MLX5_GET(alloc_packet_reformat_context_out,
+                                      out, packet_reformat_id);
        kfree(in);
        return err;
 }
+EXPORT_SYMBOL(mlx5_packet_reformat_alloc);
 
-void mlx5_encap_dealloc(struct mlx5_core_dev *dev, u32 encap_id)
+void mlx5_packet_reformat_dealloc(struct mlx5_core_dev *dev,
+                                 u32 packet_reformat_id)
 {
-       u32 in[MLX5_ST_SZ_DW(dealloc_encap_header_in)];
-       u32 out[MLX5_ST_SZ_DW(dealloc_encap_header_out)];
+       u32 in[MLX5_ST_SZ_DW(dealloc_packet_reformat_context_in)];
+       u32 out[MLX5_ST_SZ_DW(dealloc_packet_reformat_context_out)];
 
        memset(in, 0, sizeof(in));
-       MLX5_SET(dealloc_encap_header_in, in, opcode,
-                MLX5_CMD_OP_DEALLOC_ENCAP_HEADER);
-       MLX5_SET(dealloc_encap_header_in, in, encap_id, encap_id);
+       MLX5_SET(dealloc_packet_reformat_context_in, in, opcode,
+                MLX5_CMD_OP_DEALLOC_PACKET_REFORMAT_CONTEXT);
+       MLX5_SET(dealloc_packet_reformat_context_in, in, packet_reformat_id,
+                packet_reformat_id);
 
        mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
 }
+EXPORT_SYMBOL(mlx5_packet_reformat_dealloc);
 
 int mlx5_modify_header_alloc(struct mlx5_core_dev *dev,
                             u8 namespace, u8 num_actions,
@@ -667,9 +685,14 @@ int mlx5_modify_header_alloc(struct mlx5_core_dev *dev,
                table_type = FS_FT_FDB;
                break;
        case MLX5_FLOW_NAMESPACE_KERNEL:
+       case MLX5_FLOW_NAMESPACE_BYPASS:
                max_actions = MLX5_CAP_FLOWTABLE_NIC_RX(dev, max_modify_header_actions);
                table_type = FS_FT_NIC_RX;
                break;
+       case MLX5_FLOW_NAMESPACE_EGRESS:
+               max_actions = MLX5_CAP_FLOWTABLE_NIC_TX(dev, max_modify_header_actions);
+               table_type = FS_FT_NIC_TX;
+               break;
        default:
                return -EOPNOTSUPP;
        }
@@ -702,6 +725,7 @@ int mlx5_modify_header_alloc(struct mlx5_core_dev *dev,
        kfree(in);
        return err;
 }
+EXPORT_SYMBOL(mlx5_modify_header_alloc);
 
 void mlx5_modify_header_dealloc(struct mlx5_core_dev *dev, u32 modify_header_id)
 {
@@ -716,6 +740,7 @@ void mlx5_modify_header_dealloc(struct mlx5_core_dev *dev, u32 modify_header_id)
 
        mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
 }
+EXPORT_SYMBOL(mlx5_modify_header_dealloc);
 
 static const struct mlx5_flow_cmds mlx5_flow_cmds = {
        .create_flow_table = mlx5_cmd_create_flow_table,
@@ -760,8 +785,8 @@ const struct mlx5_flow_cmds *mlx5_fs_cmd_get_default(enum fs_flow_table_type typ
        case FS_FT_FDB:
        case FS_FT_SNIFFER_RX:
        case FS_FT_SNIFFER_TX:
-               return mlx5_fs_cmd_get_fw_cmds();
        case FS_FT_NIC_TX:
+               return mlx5_fs_cmd_get_fw_cmds();
        default:
                return mlx5_fs_cmd_get_stub_cmds();
        }
index 37d114c..8d340e5 100644 (file)
                                           FS_CAP(flow_table_properties_nic_receive.identified_miss_table_mode), \
                                           FS_CAP(flow_table_properties_nic_receive.flow_table_modify))
 
+#define FS_CHAINING_CAPS_EGRESS                                                \
+       FS_REQUIRED_CAPS(                                                      \
+               FS_CAP(flow_table_properties_nic_transmit.flow_modify_en),     \
+               FS_CAP(flow_table_properties_nic_transmit.modify_root),        \
+               FS_CAP(flow_table_properties_nic_transmit                      \
+                              .identified_miss_table_mode),                   \
+               FS_CAP(flow_table_properties_nic_transmit.flow_table_modify))
+
 #define LEFTOVERS_NUM_LEVELS 1
 #define LEFTOVERS_NUM_PRIOS 1
 
@@ -151,6 +159,17 @@ static struct init_tree_node {
        }
 };
 
+static struct init_tree_node egress_root_fs = {
+       .type = FS_TYPE_NAMESPACE,
+       .ar_size = 1,
+       .children = (struct init_tree_node[]) {
+               ADD_PRIO(0, MLX5_BY_PASS_NUM_PRIOS, 0,
+                        FS_CHAINING_CAPS_EGRESS,
+                        ADD_NS(ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_PRIOS,
+                                                 BY_PASS_PRIO_NUM_LEVELS))),
+       }
+};
+
 enum fs_i_lock_class {
        FS_LOCK_GRANDPARENT,
        FS_LOCK_PARENT,
@@ -1388,7 +1407,7 @@ static bool check_conflicting_actions(u32 action1, u32 action2)
                return false;
 
        if (xored_actions & (MLX5_FLOW_CONTEXT_ACTION_DROP  |
-                            MLX5_FLOW_CONTEXT_ACTION_ENCAP |
+                            MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT |
                             MLX5_FLOW_CONTEXT_ACTION_DECAP |
                             MLX5_FLOW_CONTEXT_ACTION_MOD_HDR  |
                             MLX5_FLOW_CONTEXT_ACTION_VLAN_POP |
@@ -1980,7 +1999,7 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
 {
        struct mlx5_flow_steering *steering = dev->priv.steering;
        struct mlx5_flow_root_namespace *root_ns;
-       int prio;
+       int prio = 0;
        struct fs_prio *fs_prio;
        struct mlx5_flow_namespace *ns;
 
@@ -1988,40 +2007,29 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
                return NULL;
 
        switch (type) {
-       case MLX5_FLOW_NAMESPACE_BYPASS:
-       case MLX5_FLOW_NAMESPACE_LAG:
-       case MLX5_FLOW_NAMESPACE_OFFLOADS:
-       case MLX5_FLOW_NAMESPACE_ETHTOOL:
-       case MLX5_FLOW_NAMESPACE_KERNEL:
-       case MLX5_FLOW_NAMESPACE_LEFTOVERS:
-       case MLX5_FLOW_NAMESPACE_ANCHOR:
-               prio = type;
-               break;
        case MLX5_FLOW_NAMESPACE_FDB:
                if (steering->fdb_root_ns)
                        return &steering->fdb_root_ns->ns;
-               else
-                       return NULL;
+               return NULL;
        case MLX5_FLOW_NAMESPACE_SNIFFER_RX:
                if (steering->sniffer_rx_root_ns)
                        return &steering->sniffer_rx_root_ns->ns;
-               else
-                       return NULL;
+               return NULL;
        case MLX5_FLOW_NAMESPACE_SNIFFER_TX:
                if (steering->sniffer_tx_root_ns)
                        return &steering->sniffer_tx_root_ns->ns;
-               else
-                       return NULL;
-       case MLX5_FLOW_NAMESPACE_EGRESS:
-               if (steering->egress_root_ns)
-                       return &steering->egress_root_ns->ns;
-               else
-                       return NULL;
-       default:
                return NULL;
+       default:
+               break;
+       }
+
+       if (type == MLX5_FLOW_NAMESPACE_EGRESS) {
+               root_ns = steering->egress_root_ns;
+       } else { /* Must be NIC RX */
+               root_ns = steering->root_ns;
+               prio = type;
        }
 
-       root_ns = steering->root_ns;
        if (!root_ns)
                return NULL;
 
@@ -2537,16 +2545,23 @@ cleanup_root_ns:
 
 static int init_egress_root_ns(struct mlx5_flow_steering *steering)
 {
-       struct fs_prio *prio;
+       int err;
 
        steering->egress_root_ns = create_root_ns(steering,
                                                  FS_FT_NIC_TX);
        if (!steering->egress_root_ns)
                return -ENOMEM;
 
-       /* create 1 prio*/
-       prio = fs_create_prio(&steering->egress_root_ns->ns, 0, 1);
-       return PTR_ERR_OR_ZERO(prio);
+       err = init_root_tree(steering, &egress_root_fs,
+                            &steering->egress_root_ns->ns.node);
+       if (err)
+               goto cleanup;
+       set_prio_attrs(steering->egress_root_ns);
+       return 0;
+cleanup:
+       cleanup_root_ns(steering->egress_root_ns);
+       steering->egress_root_ns = NULL;
+       return err;
 }
 
 int mlx5_init_fs(struct mlx5_core_dev *dev)
@@ -2614,7 +2629,7 @@ int mlx5_init_fs(struct mlx5_core_dev *dev)
                        goto err;
        }
 
-       if (MLX5_IPSEC_DEV(dev)) {
+       if (MLX5_IPSEC_DEV(dev) || MLX5_CAP_FLOWTABLE_NIC_TX(dev, ft_support)) {
                err = init_egress_root_ns(steering);
                if (err)
                        goto err;
index cc29852..0594d09 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/if_link.h>
 #include <linux/firmware.h>
 #include <linux/mlx5/cq.h>
+#include <linux/mlx5/fs.h>
 
 #define DRIVER_NAME "mlx5_core"
 #define DRIVER_VERSION "5.0-0"
@@ -171,17 +172,6 @@ struct mlx5_core_dev *mlx5_get_next_phys_dev(struct mlx5_core_dev *dev);
 void mlx5_dev_list_lock(void);
 void mlx5_dev_list_unlock(void);
 int mlx5_dev_list_trylock(void);
-int mlx5_encap_alloc(struct mlx5_core_dev *dev,
-                    int header_type,
-                    size_t size,
-                    void *encap_header,
-                    u32 *encap_id);
-void mlx5_encap_dealloc(struct mlx5_core_dev *dev, u32 encap_id);
-
-int mlx5_modify_header_alloc(struct mlx5_core_dev *dev,
-                            u8 namespace, u8 num_actions,
-                            void *modify_actions, u32 *modify_header_id);
-void mlx5_modify_header_dealloc(struct mlx5_core_dev *dev, u32 modify_header_id);
 
 bool mlx5_lag_intf_add(struct mlx5_interface *intf, struct mlx5_priv *priv);
 
index 4ca07bf..91b8139 100644 (file)
@@ -211,6 +211,7 @@ int mlx5_core_create_dct(struct mlx5_core_dev *dev,
        }
 
        qp->qpn = MLX5_GET(create_dct_out, out, dctn);
+       qp->uid = MLX5_GET(create_dct_in, in, uid);
        err = create_resource_common(dev, qp, MLX5_RES_DCT);
        if (err)
                goto err_cmd;
@@ -219,6 +220,7 @@ int mlx5_core_create_dct(struct mlx5_core_dev *dev,
 err_cmd:
        MLX5_SET(destroy_dct_in, din, opcode, MLX5_CMD_OP_DESTROY_DCT);
        MLX5_SET(destroy_dct_in, din, dctn, qp->qpn);
+       MLX5_SET(destroy_dct_in, din, uid, qp->uid);
        mlx5_cmd_exec(dev, (void *)&in, sizeof(din),
                      (void *)&out, sizeof(dout));
        return err;
@@ -240,6 +242,7 @@ int mlx5_core_create_qp(struct mlx5_core_dev *dev,
        if (err)
                return err;
 
+       qp->uid = MLX5_GET(create_qp_in, in, uid);
        qp->qpn = MLX5_GET(create_qp_out, out, qpn);
        mlx5_core_dbg(dev, "qpn = 0x%x\n", qp->qpn);
 
@@ -261,6 +264,7 @@ err_cmd:
        memset(dout, 0, sizeof(dout));
        MLX5_SET(destroy_qp_in, din, opcode, MLX5_CMD_OP_DESTROY_QP);
        MLX5_SET(destroy_qp_in, din, qpn, qp->qpn);
+       MLX5_SET(destroy_qp_in, din, uid, qp->uid);
        mlx5_cmd_exec(dev, din, sizeof(din), dout, sizeof(dout));
        return err;
 }
@@ -275,6 +279,7 @@ static int mlx5_core_drain_dct(struct mlx5_core_dev *dev,
 
        MLX5_SET(drain_dct_in, in, opcode, MLX5_CMD_OP_DRAIN_DCT);
        MLX5_SET(drain_dct_in, in, dctn, qp->qpn);
+       MLX5_SET(drain_dct_in, in, uid, qp->uid);
        return mlx5_cmd_exec(dev, (void *)&in, sizeof(in),
                             (void *)&out, sizeof(out));
 }
@@ -301,6 +306,7 @@ destroy:
        destroy_resource_common(dev, &dct->mqp);
        MLX5_SET(destroy_dct_in, in, opcode, MLX5_CMD_OP_DESTROY_DCT);
        MLX5_SET(destroy_dct_in, in, dctn, qp->qpn);
+       MLX5_SET(destroy_dct_in, in, uid, qp->uid);
        err = mlx5_cmd_exec(dev, (void *)&in, sizeof(in),
                            (void *)&out, sizeof(out));
        return err;
@@ -320,6 +326,7 @@ int mlx5_core_destroy_qp(struct mlx5_core_dev *dev,
 
        MLX5_SET(destroy_qp_in, in, opcode, MLX5_CMD_OP_DESTROY_QP);
        MLX5_SET(destroy_qp_in, in, qpn, qp->qpn);
+       MLX5_SET(destroy_qp_in, in, uid, qp->uid);
        err = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
        if (err)
                return err;
@@ -373,7 +380,7 @@ static void mbox_free(struct mbox_info *mbox)
 
 static int modify_qp_mbox_alloc(struct mlx5_core_dev *dev, u16 opcode, int qpn,
                                u32 opt_param_mask, void *qpc,
-                               struct mbox_info *mbox)
+                               struct mbox_info *mbox, u16 uid)
 {
        mbox->out = NULL;
        mbox->in = NULL;
@@ -381,26 +388,32 @@ static int modify_qp_mbox_alloc(struct mlx5_core_dev *dev, u16 opcode, int qpn,
 #define MBOX_ALLOC(mbox, typ)  \
        mbox_alloc(mbox, MLX5_ST_SZ_BYTES(typ##_in), MLX5_ST_SZ_BYTES(typ##_out))
 
-#define MOD_QP_IN_SET(typ, in, _opcode, _qpn) \
-       MLX5_SET(typ##_in, in, opcode, _opcode); \
-       MLX5_SET(typ##_in, in, qpn, _qpn)
-
-#define MOD_QP_IN_SET_QPC(typ, in, _opcode, _qpn, _opt_p, _qpc) \
-       MOD_QP_IN_SET(typ, in, _opcode, _qpn); \
-       MLX5_SET(typ##_in, in, opt_param_mask, _opt_p); \
-       memcpy(MLX5_ADDR_OF(typ##_in, in, qpc), _qpc, MLX5_ST_SZ_BYTES(qpc))
+#define MOD_QP_IN_SET(typ, in, _opcode, _qpn, _uid)                            \
+       do {                                                                   \
+               MLX5_SET(typ##_in, in, opcode, _opcode);                       \
+               MLX5_SET(typ##_in, in, qpn, _qpn);                             \
+               MLX5_SET(typ##_in, in, uid, _uid);                             \
+       } while (0)
+
+#define MOD_QP_IN_SET_QPC(typ, in, _opcode, _qpn, _opt_p, _qpc, _uid)          \
+       do {                                                                   \
+               MOD_QP_IN_SET(typ, in, _opcode, _qpn, _uid);                   \
+               MLX5_SET(typ##_in, in, opt_param_mask, _opt_p);                \
+               memcpy(MLX5_ADDR_OF(typ##_in, in, qpc), _qpc,                  \
+                      MLX5_ST_SZ_BYTES(qpc));                                 \
+       } while (0)
 
        switch (opcode) {
        /* 2RST & 2ERR */
        case MLX5_CMD_OP_2RST_QP:
                if (MBOX_ALLOC(mbox, qp_2rst))
                        return -ENOMEM;
-               MOD_QP_IN_SET(qp_2rst, mbox->in, opcode, qpn);
+               MOD_QP_IN_SET(qp_2rst, mbox->in, opcode, qpn, uid);
                break;
        case MLX5_CMD_OP_2ERR_QP:
                if (MBOX_ALLOC(mbox, qp_2err))
                        return -ENOMEM;
-               MOD_QP_IN_SET(qp_2err, mbox->in, opcode, qpn);
+               MOD_QP_IN_SET(qp_2err, mbox->in, opcode, qpn, uid);
                break;
 
        /* MODIFY with QPC */
@@ -408,37 +421,37 @@ static int modify_qp_mbox_alloc(struct mlx5_core_dev *dev, u16 opcode, int qpn,
                if (MBOX_ALLOC(mbox, rst2init_qp))
                        return -ENOMEM;
                MOD_QP_IN_SET_QPC(rst2init_qp, mbox->in, opcode, qpn,
-                                 opt_param_mask, qpc);
+                                 opt_param_mask, qpc, uid);
                break;
        case MLX5_CMD_OP_INIT2RTR_QP:
                if (MBOX_ALLOC(mbox, init2rtr_qp))
                        return -ENOMEM;
                MOD_QP_IN_SET_QPC(init2rtr_qp, mbox->in, opcode, qpn,
-                                 opt_param_mask, qpc);
+                                 opt_param_mask, qpc, uid);
                break;
        case MLX5_CMD_OP_RTR2RTS_QP:
                if (MBOX_ALLOC(mbox, rtr2rts_qp))
                        return -ENOMEM;
                MOD_QP_IN_SET_QPC(rtr2rts_qp, mbox->in, opcode, qpn,
-                                 opt_param_mask, qpc);
+                                 opt_param_mask, qpc, uid);
                break;
        case MLX5_CMD_OP_RTS2RTS_QP:
                if (MBOX_ALLOC(mbox, rts2rts_qp))
                        return -ENOMEM;
                MOD_QP_IN_SET_QPC(rts2rts_qp, mbox->in, opcode, qpn,
-                                 opt_param_mask, qpc);
+                                 opt_param_mask, qpc, uid);
                break;
        case MLX5_CMD_OP_SQERR2RTS_QP:
                if (MBOX_ALLOC(mbox, sqerr2rts_qp))
                        return -ENOMEM;
                MOD_QP_IN_SET_QPC(sqerr2rts_qp, mbox->in, opcode, qpn,
-                                 opt_param_mask, qpc);
+                                 opt_param_mask, qpc, uid);
                break;
        case MLX5_CMD_OP_INIT2INIT_QP:
                if (MBOX_ALLOC(mbox, init2init_qp))
                        return -ENOMEM;
                MOD_QP_IN_SET_QPC(init2init_qp, mbox->in, opcode, qpn,
-                                 opt_param_mask, qpc);
+                                 opt_param_mask, qpc, uid);
                break;
        default:
                mlx5_core_err(dev, "Unknown transition for modify QP: OP(0x%x) QPN(0x%x)\n",
@@ -456,7 +469,7 @@ int mlx5_core_qp_modify(struct mlx5_core_dev *dev, u16 opcode,
        int err;
 
        err = modify_qp_mbox_alloc(dev, opcode, qp->qpn,
-                                  opt_param_mask, qpc, &mbox);
+                                  opt_param_mask, qpc, &mbox, qp->uid);
        if (err)
                return err;
 
@@ -531,6 +544,17 @@ int mlx5_core_xrcd_dealloc(struct mlx5_core_dev *dev, u32 xrcdn)
 }
 EXPORT_SYMBOL_GPL(mlx5_core_xrcd_dealloc);
 
+static void destroy_rq_tracked(struct mlx5_core_dev *dev, u32 rqn, u16 uid)
+{
+       u32 in[MLX5_ST_SZ_DW(destroy_rq_in)]   = {};
+       u32 out[MLX5_ST_SZ_DW(destroy_rq_out)] = {};
+
+       MLX5_SET(destroy_rq_in, in, opcode, MLX5_CMD_OP_DESTROY_RQ);
+       MLX5_SET(destroy_rq_in, in, rqn, rqn);
+       MLX5_SET(destroy_rq_in, in, uid, uid);
+       mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
+}
+
 int mlx5_core_create_rq_tracked(struct mlx5_core_dev *dev, u32 *in, int inlen,
                                struct mlx5_core_qp *rq)
 {
@@ -541,6 +565,7 @@ int mlx5_core_create_rq_tracked(struct mlx5_core_dev *dev, u32 *in, int inlen,
        if (err)
                return err;
 
+       rq->uid = MLX5_GET(create_rq_in, in, uid);
        rq->qpn = rqn;
        err = create_resource_common(dev, rq, MLX5_RES_RQ);
        if (err)
@@ -549,7 +574,7 @@ int mlx5_core_create_rq_tracked(struct mlx5_core_dev *dev, u32 *in, int inlen,
        return 0;
 
 err_destroy_rq:
-       mlx5_core_destroy_rq(dev, rq->qpn);
+       destroy_rq_tracked(dev, rq->qpn, rq->uid);
 
        return err;
 }
@@ -559,10 +584,21 @@ void mlx5_core_destroy_rq_tracked(struct mlx5_core_dev *dev,
                                  struct mlx5_core_qp *rq)
 {
        destroy_resource_common(dev, rq);
-       mlx5_core_destroy_rq(dev, rq->qpn);
+       destroy_rq_tracked(dev, rq->qpn, rq->uid);
 }
 EXPORT_SYMBOL(mlx5_core_destroy_rq_tracked);
 
+static void destroy_sq_tracked(struct mlx5_core_dev *dev, u32 sqn, u16 uid)
+{
+       u32 in[MLX5_ST_SZ_DW(destroy_sq_in)]   = {};
+       u32 out[MLX5_ST_SZ_DW(destroy_sq_out)] = {};
+
+       MLX5_SET(destroy_sq_in, in, opcode, MLX5_CMD_OP_DESTROY_SQ);
+       MLX5_SET(destroy_sq_in, in, sqn, sqn);
+       MLX5_SET(destroy_sq_in, in, uid, uid);
+       mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
+}
+
 int mlx5_core_create_sq_tracked(struct mlx5_core_dev *dev, u32 *in, int inlen,
                                struct mlx5_core_qp *sq)
 {
@@ -573,6 +609,7 @@ int mlx5_core_create_sq_tracked(struct mlx5_core_dev *dev, u32 *in, int inlen,
        if (err)
                return err;
 
+       sq->uid = MLX5_GET(create_sq_in, in, uid);
        sq->qpn = sqn;
        err = create_resource_common(dev, sq, MLX5_RES_SQ);
        if (err)
@@ -581,7 +618,7 @@ int mlx5_core_create_sq_tracked(struct mlx5_core_dev *dev, u32 *in, int inlen,
        return 0;
 
 err_destroy_sq:
-       mlx5_core_destroy_sq(dev, sq->qpn);
+       destroy_sq_tracked(dev, sq->qpn, sq->uid);
 
        return err;
 }
@@ -591,7 +628,7 @@ void mlx5_core_destroy_sq_tracked(struct mlx5_core_dev *dev,
                                  struct mlx5_core_qp *sq)
 {
        destroy_resource_common(dev, sq);
-       mlx5_core_destroy_sq(dev, sq->qpn);
+       destroy_sq_tracked(dev, sq->qpn, sq->uid);
 }
 EXPORT_SYMBOL(mlx5_core_destroy_sq_tracked);
 
index 7e20666..6a6fc9b 100644 (file)
@@ -166,6 +166,7 @@ static int create_srq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
        if (!create_in)
                return -ENOMEM;
 
+       MLX5_SET(create_srq_in, create_in, uid, in->uid);
        srqc = MLX5_ADDR_OF(create_srq_in, create_in, srq_context_entry);
        pas = MLX5_ADDR_OF(create_srq_in, create_in, pas);
 
@@ -178,8 +179,10 @@ static int create_srq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
        err = mlx5_cmd_exec(dev, create_in, inlen, create_out,
                            sizeof(create_out));
        kvfree(create_in);
-       if (!err)
+       if (!err) {
                srq->srqn = MLX5_GET(create_srq_out, create_out, srqn);
+               srq->uid = in->uid;
+       }
 
        return err;
 }
@@ -193,6 +196,7 @@ static int destroy_srq_cmd(struct mlx5_core_dev *dev,
        MLX5_SET(destroy_srq_in, srq_in, opcode,
                 MLX5_CMD_OP_DESTROY_SRQ);
        MLX5_SET(destroy_srq_in, srq_in, srqn, srq->srqn);
+       MLX5_SET(destroy_srq_in, srq_in, uid, srq->uid);
 
        return mlx5_cmd_exec(dev, srq_in, sizeof(srq_in),
                             srq_out, sizeof(srq_out));
@@ -208,6 +212,7 @@ static int arm_srq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
        MLX5_SET(arm_rq_in, srq_in, op_mod, MLX5_ARM_RQ_IN_OP_MOD_SRQ);
        MLX5_SET(arm_rq_in, srq_in, srq_number, srq->srqn);
        MLX5_SET(arm_rq_in, srq_in, lwm,      lwm);
+       MLX5_SET(arm_rq_in, srq_in, uid, srq->uid);
 
        return  mlx5_cmd_exec(dev, srq_in, sizeof(srq_in),
                              srq_out, sizeof(srq_out));
@@ -260,6 +265,7 @@ static int create_xrc_srq_cmd(struct mlx5_core_dev *dev,
        if (!create_in)
                return -ENOMEM;
 
+       MLX5_SET(create_xrc_srq_in, create_in, uid, in->uid);
        xrc_srqc = MLX5_ADDR_OF(create_xrc_srq_in, create_in,
                                xrc_srq_context_entry);
        pas      = MLX5_ADDR_OF(create_xrc_srq_in, create_in, pas);
@@ -277,6 +283,7 @@ static int create_xrc_srq_cmd(struct mlx5_core_dev *dev,
                goto out;
 
        srq->srqn = MLX5_GET(create_xrc_srq_out, create_out, xrc_srqn);
+       srq->uid = in->uid;
 out:
        kvfree(create_in);
        return err;
@@ -291,6 +298,7 @@ static int destroy_xrc_srq_cmd(struct mlx5_core_dev *dev,
        MLX5_SET(destroy_xrc_srq_in, xrcsrq_in, opcode,
                 MLX5_CMD_OP_DESTROY_XRC_SRQ);
        MLX5_SET(destroy_xrc_srq_in, xrcsrq_in, xrc_srqn, srq->srqn);
+       MLX5_SET(destroy_xrc_srq_in, xrcsrq_in, uid, srq->uid);
 
        return mlx5_cmd_exec(dev, xrcsrq_in, sizeof(xrcsrq_in),
                             xrcsrq_out, sizeof(xrcsrq_out));
@@ -306,6 +314,7 @@ static int arm_xrc_srq_cmd(struct mlx5_core_dev *dev,
        MLX5_SET(arm_xrc_srq_in, xrcsrq_in, op_mod,   MLX5_ARM_XRC_SRQ_IN_OP_MOD_XRC_SRQ);
        MLX5_SET(arm_xrc_srq_in, xrcsrq_in, xrc_srqn, srq->srqn);
        MLX5_SET(arm_xrc_srq_in, xrcsrq_in, lwm,      lwm);
+       MLX5_SET(arm_xrc_srq_in, xrcsrq_in, uid, srq->uid);
 
        return  mlx5_cmd_exec(dev, xrcsrq_in, sizeof(xrcsrq_in),
                              xrcsrq_out, sizeof(xrcsrq_out));
@@ -365,10 +374,13 @@ static int create_rmp_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
        wq = MLX5_ADDR_OF(rmpc, rmpc, wq);
 
        MLX5_SET(rmpc, rmpc, state, MLX5_RMPC_STATE_RDY);
+       MLX5_SET(create_rmp_in, create_in, uid, in->uid);
        set_wq(wq, in);
        memcpy(MLX5_ADDR_OF(rmpc, rmpc, wq.pas), in->pas, pas_size);
 
        err = mlx5_core_create_rmp(dev, create_in, inlen, &srq->srqn);
+       if (!err)
+               srq->uid = in->uid;
 
        kvfree(create_in);
        return err;
@@ -377,7 +389,13 @@ static int create_rmp_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
 static int destroy_rmp_cmd(struct mlx5_core_dev *dev,
                           struct mlx5_core_srq *srq)
 {
-       return mlx5_core_destroy_rmp(dev, srq->srqn);
+       u32 in[MLX5_ST_SZ_DW(destroy_rmp_in)]   = {};
+       u32 out[MLX5_ST_SZ_DW(destroy_rmp_out)] = {};
+
+       MLX5_SET(destroy_rmp_in, in, opcode, MLX5_CMD_OP_DESTROY_RMP);
+       MLX5_SET(destroy_rmp_in, in, rmpn, srq->srqn);
+       MLX5_SET(destroy_rmp_in, in, uid, srq->uid);
+       return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
 }
 
 static int arm_rmp_cmd(struct mlx5_core_dev *dev,
@@ -400,6 +418,7 @@ static int arm_rmp_cmd(struct mlx5_core_dev *dev,
 
        MLX5_SET(modify_rmp_in, in,      rmp_state, MLX5_RMPC_STATE_RDY);
        MLX5_SET(modify_rmp_in, in,      rmpn,      srq->srqn);
+       MLX5_SET(modify_rmp_in, in, uid, srq->uid);
        MLX5_SET(wq,            wq,      lwm,       lwm);
        MLX5_SET(rmp_bitmask,   bitmask, lwm,       1);
        MLX5_SET(rmpc, rmpc, state, MLX5_RMPC_STATE_RDY);
@@ -469,11 +488,14 @@ static int create_xrq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
        MLX5_SET(xrqc, xrqc, user_index, in->user_index);
        MLX5_SET(xrqc, xrqc, cqn, in->cqn);
        MLX5_SET(create_xrq_in, create_in, opcode, MLX5_CMD_OP_CREATE_XRQ);
+       MLX5_SET(create_xrq_in, create_in, uid, in->uid);
        err = mlx5_cmd_exec(dev, create_in, inlen, create_out,
                            sizeof(create_out));
        kvfree(create_in);
-       if (!err)
+       if (!err) {
                srq->srqn = MLX5_GET(create_xrq_out, create_out, xrqn);
+               srq->uid = in->uid;
+       }
 
        return err;
 }
@@ -485,6 +507,7 @@ static int destroy_xrq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq)
 
        MLX5_SET(destroy_xrq_in, in, opcode, MLX5_CMD_OP_DESTROY_XRQ);
        MLX5_SET(destroy_xrq_in, in, xrqn,   srq->srqn);
+       MLX5_SET(destroy_xrq_in, in, uid, srq->uid);
 
        return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
 }
@@ -500,6 +523,7 @@ static int arm_xrq_cmd(struct mlx5_core_dev *dev,
        MLX5_SET(arm_rq_in, in, op_mod,     MLX5_ARM_RQ_IN_OP_MOD_XRQ);
        MLX5_SET(arm_rq_in, in, srq_number, srq->srqn);
        MLX5_SET(arm_rq_in, in, lwm,        lwm);
+       MLX5_SET(arm_rq_in, in, uid, srq->uid);
 
        return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
 }
index 0ef6138..31a7505 100644 (file)
@@ -61,6 +61,7 @@ struct mlx5_core_cq {
        int                     reset_notify_added;
        struct list_head        reset_notify;
        struct mlx5_eq          *eq;
+       u16 uid;
 };
 
 
index e9b502d..b4c0457 100644 (file)
@@ -1124,6 +1124,12 @@ enum mlx5_qcam_feature_groups {
 #define MLX5_CAP_FLOWTABLE_NIC_RX_MAX(mdev, cap) \
        MLX5_CAP_FLOWTABLE_MAX(mdev, flow_table_properties_nic_receive.cap)
 
+#define MLX5_CAP_FLOWTABLE_NIC_TX(mdev, cap) \
+               MLX5_CAP_FLOWTABLE(mdev, flow_table_properties_nic_transmit.cap)
+
+#define MLX5_CAP_FLOWTABLE_NIC_TX_MAX(mdev, cap) \
+       MLX5_CAP_FLOWTABLE_MAX(mdev, flow_table_properties_nic_transmit.cap)
+
 #define MLX5_CAP_FLOWTABLE_SNIFFER_RX(mdev, cap) \
        MLX5_CAP_FLOWTABLE(mdev, flow_table_properties_nic_receive_sniffer.cap)
 
index 4b75796..94ffd02 100644 (file)
@@ -163,10 +163,7 @@ enum mlx5_dcbx_oper_mode {
 };
 
 enum mlx5_dct_atomic_mode {
-       MLX5_ATOMIC_MODE_DCT_OFF        = 20,
-       MLX5_ATOMIC_MODE_DCT_NONE       = 0 << MLX5_ATOMIC_MODE_DCT_OFF,
-       MLX5_ATOMIC_MODE_DCT_IB_COMP    = 1 << MLX5_ATOMIC_MODE_DCT_OFF,
-       MLX5_ATOMIC_MODE_DCT_CX         = 2 << MLX5_ATOMIC_MODE_DCT_OFF,
+       MLX5_ATOMIC_MODE_DCT_CX         = 2,
 };
 
 enum {
@@ -477,6 +474,7 @@ struct mlx5_core_srq {
 
        atomic_t                refcount;
        struct completion       free;
+       u16             uid;
 };
 
 struct mlx5_eq_table {
index 804516e..b1c026f 100644 (file)
@@ -45,7 +45,8 @@ enum {
 };
 
 enum {
-       MLX5_FLOW_TABLE_TUNNEL_EN = BIT(0),
+       MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT = BIT(0),
+       MLX5_FLOW_TABLE_TUNNEL_EN_DECAP = BIT(1),
 };
 
 #define LEFTOVERS_RULE_NUM      2
@@ -159,7 +160,7 @@ struct mlx5_flow_act {
        u32 action;
        bool has_flow_tag;
        u32 flow_tag;
-       u32 encap_id;
+       u32 reformat_id;
        u32 modify_id;
        uintptr_t esp_id;
        struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH];
@@ -196,4 +197,19 @@ int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter,
 int mlx5_fs_add_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn);
 int mlx5_fs_remove_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn);
 
+int mlx5_modify_header_alloc(struct mlx5_core_dev *dev,
+                            u8 namespace, u8 num_actions,
+                            void *modify_actions, u32 *modify_header_id);
+void mlx5_modify_header_dealloc(struct mlx5_core_dev *dev,
+                               u32 modify_header_id);
+
+int mlx5_packet_reformat_alloc(struct mlx5_core_dev *dev,
+                              int reformat_type,
+                              size_t size,
+                              void *reformat_data,
+                              enum mlx5_flow_namespace_type namespace,
+                              u32 *packet_reformat_id);
+void mlx5_packet_reformat_dealloc(struct mlx5_core_dev *dev,
+                                 u32 packet_reformat_id);
+
 #endif
index 6e8a882..15e3619 100644 (file)
@@ -243,8 +243,8 @@ enum {
        MLX5_CMD_OP_DEALLOC_FLOW_COUNTER          = 0x93a,
        MLX5_CMD_OP_QUERY_FLOW_COUNTER            = 0x93b,
        MLX5_CMD_OP_MODIFY_FLOW_TABLE             = 0x93c,
-       MLX5_CMD_OP_ALLOC_ENCAP_HEADER            = 0x93d,
-       MLX5_CMD_OP_DEALLOC_ENCAP_HEADER          = 0x93e,
+       MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT = 0x93d,
+       MLX5_CMD_OP_DEALLOC_PACKET_REFORMAT_CONTEXT = 0x93e,
        MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT   = 0x940,
        MLX5_CMD_OP_DEALLOC_MODIFY_HEADER_CONTEXT = 0x941,
        MLX5_CMD_OP_QUERY_MODIFY_HEADER_CONTEXT   = 0x942,
@@ -336,7 +336,7 @@ struct mlx5_ifc_flow_table_prop_layout_bits {
        u8         modify_root[0x1];
        u8         identified_miss_table_mode[0x1];
        u8         flow_table_modify[0x1];
-       u8         encap[0x1];
+       u8         reformat[0x1];
        u8         decap[0x1];
        u8         reserved_at_9[0x1];
        u8         pop_vlan[0x1];
@@ -344,8 +344,12 @@ struct mlx5_ifc_flow_table_prop_layout_bits {
        u8         reserved_at_c[0x1];
        u8         pop_vlan_2[0x1];
        u8         push_vlan_2[0x1];
-       u8         reserved_at_f[0x11];
-
+       u8         reformat_and_vlan_action[0x1];
+       u8         reserved_at_10[0x2];
+       u8         reformat_l3_tunnel_to_l2[0x1];
+       u8         reformat_l2_to_l3_tunnel[0x1];
+       u8         reformat_and_modify_action[0x1];
+       u8         reserved_at_14[0xb];
        u8         reserved_at_20[0x2];
        u8         log_max_ft_size[0x6];
        u8         log_max_modify_header_context[0x8];
@@ -554,7 +558,13 @@ struct mlx5_ifc_flow_table_nic_cap_bits {
        u8         nic_rx_multi_path_tirs[0x1];
        u8         nic_rx_multi_path_tirs_fts[0x1];
        u8         allow_sniffer_and_nic_rx_shared_tir[0x1];
-       u8         reserved_at_3[0x1fd];
+       u8         reserved_at_3[0x1d];
+       u8         encap_general_header[0x1];
+       u8         reserved_at_21[0xa];
+       u8         log_max_packet_reformat_context[0x5];
+       u8         reserved_at_30[0x6];
+       u8         max_encap_header_size[0xa];
+       u8         reserved_at_40[0x1c0];
 
        struct mlx5_ifc_flow_table_prop_layout_bits flow_table_properties_nic_receive;
 
@@ -599,7 +609,7 @@ struct mlx5_ifc_e_switch_cap_bits {
        u8         vxlan_encap_decap[0x1];
        u8         nvgre_encap_decap[0x1];
        u8         reserved_at_22[0x9];
-       u8         log_max_encap_headers[0x5];
+       u8         log_max_packet_reformat_context[0x5];
        u8         reserved_2b[0x6];
        u8         max_encap_header_size[0xa];
 
@@ -996,7 +1006,8 @@ struct mlx5_ifc_cmd_hca_cap_bits {
        u8         umr_modify_atomic_disabled[0x1];
        u8         umr_indirect_mkey_disabled[0x1];
        u8         umr_fence[0x2];
-       u8         reserved_at_20c[0x3];
+       u8         dc_req_scat_data_cqe[0x1];
+       u8         reserved_at_20d[0x2];
        u8         drain_sigerr[0x1];
        u8         cmdif_checksum[0x2];
        u8         sigerr_cqe[0x1];
@@ -1281,7 +1292,9 @@ struct mlx5_ifc_wq_bits {
        u8         reserved_at_118[0x3];
        u8         log_wq_sz[0x5];
 
-       u8         reserved_at_120[0x3];
+       u8         dbr_umem_valid[0x1];
+       u8         wq_umem_valid[0x1];
+       u8         reserved_at_122[0x1];
        u8         log_hairpin_num_packets[0x5];
        u8         reserved_at_128[0x3];
        u8         log_hairpin_data_sz[0x5];
@@ -2355,7 +2368,10 @@ struct mlx5_ifc_qpc_bits {
 
        u8         dc_access_key[0x40];
 
-       u8         reserved_at_680[0xc0];
+       u8         reserved_at_680[0x3];
+       u8         dbr_umem_valid[0x1];
+
+       u8         reserved_at_684[0xbc];
 };
 
 struct mlx5_ifc_roce_addr_layout_bits {
@@ -2395,7 +2411,7 @@ enum {
        MLX5_FLOW_CONTEXT_ACTION_DROP      = 0x2,
        MLX5_FLOW_CONTEXT_ACTION_FWD_DEST  = 0x4,
        MLX5_FLOW_CONTEXT_ACTION_COUNT     = 0x8,
-       MLX5_FLOW_CONTEXT_ACTION_ENCAP     = 0x10,
+       MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT = 0x10,
        MLX5_FLOW_CONTEXT_ACTION_DECAP     = 0x20,
        MLX5_FLOW_CONTEXT_ACTION_MOD_HDR   = 0x40,
        MLX5_FLOW_CONTEXT_ACTION_VLAN_POP  = 0x80,
@@ -2428,7 +2444,7 @@ struct mlx5_ifc_flow_context_bits {
        u8         reserved_at_a0[0x8];
        u8         flow_counter_list_size[0x18];
 
-       u8         encap_id[0x20];
+       u8         packet_reformat_id[0x20];
 
        u8         modify_header_id[0x20];
 
@@ -2455,7 +2471,7 @@ struct mlx5_ifc_xrc_srqc_bits {
 
        u8         wq_signature[0x1];
        u8         cont_srq[0x1];
-       u8         reserved_at_22[0x1];
+       u8         dbr_umem_valid[0x1];
        u8         rlky[0x1];
        u8         basic_cyclic_rcv_wqe[0x1];
        u8         log_rq_stride[0x3];
@@ -2550,8 +2566,8 @@ enum {
 };
 
 enum {
-       MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST_    = 0x1,
-       MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST_  = 0x2,
+       MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST    = 0x1,
+       MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST  = 0x2,
 };
 
 struct mlx5_ifc_tirc_bits {
@@ -3119,7 +3135,9 @@ enum {
 
 struct mlx5_ifc_cqc_bits {
        u8         status[0x4];
-       u8         reserved_at_4[0x4];
+       u8         reserved_at_4[0x2];
+       u8         dbr_umem_valid[0x1];
+       u8         reserved_at_7[0x1];
        u8         cqe_sz[0x3];
        u8         cc[0x1];
        u8         reserved_at_c[0x1];
@@ -3386,7 +3404,7 @@ struct mlx5_ifc_sqerr2rts_qp_out_bits {
 
 struct mlx5_ifc_sqerr2rts_qp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -3416,7 +3434,7 @@ struct mlx5_ifc_sqd2rts_qp_out_bits {
 
 struct mlx5_ifc_sqd2rts_qp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -3621,7 +3639,7 @@ struct mlx5_ifc_rts2rts_qp_out_bits {
 
 struct mlx5_ifc_rts2rts_qp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -3651,7 +3669,7 @@ struct mlx5_ifc_rtr2rts_qp_out_bits {
 
 struct mlx5_ifc_rtr2rts_qp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -3681,7 +3699,7 @@ struct mlx5_ifc_rst2init_qp_out_bits {
 
 struct mlx5_ifc_rst2init_qp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -4804,19 +4822,19 @@ struct mlx5_ifc_query_eq_in_bits {
        u8         reserved_at_60[0x20];
 };
 
-struct mlx5_ifc_encap_header_in_bits {
+struct mlx5_ifc_packet_reformat_context_in_bits {
        u8         reserved_at_0[0x5];
-       u8         header_type[0x3];
+       u8         reformat_type[0x3];
        u8         reserved_at_8[0xe];
-       u8         encap_header_size[0xa];
+       u8         reformat_data_size[0xa];
 
        u8         reserved_at_20[0x10];
-       u8         encap_header[2][0x8];
+       u8         reformat_data[2][0x8];
 
-       u8         more_encap_header[0][0x8];
+       u8         more_reformat_data[0][0x8];
 };
 
-struct mlx5_ifc_query_encap_header_out_bits {
+struct mlx5_ifc_query_packet_reformat_context_out_bits {
        u8         status[0x8];
        u8         reserved_at_8[0x18];
 
@@ -4824,33 +4842,41 @@ struct mlx5_ifc_query_encap_header_out_bits {
 
        u8         reserved_at_40[0xa0];
 
-       struct mlx5_ifc_encap_header_in_bits encap_header[0];
+       struct mlx5_ifc_packet_reformat_context_in_bits packet_reformat_context[0];
 };
 
-struct mlx5_ifc_query_encap_header_in_bits {
+struct mlx5_ifc_query_packet_reformat_context_in_bits {
        u8         opcode[0x10];
        u8         reserved_at_10[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
 
-       u8         encap_id[0x20];
+       u8         packet_reformat_id[0x20];
 
        u8         reserved_at_60[0xa0];
 };
 
-struct mlx5_ifc_alloc_encap_header_out_bits {
+struct mlx5_ifc_alloc_packet_reformat_context_out_bits {
        u8         status[0x8];
        u8         reserved_at_8[0x18];
 
        u8         syndrome[0x20];
 
-       u8         encap_id[0x20];
+       u8         packet_reformat_id[0x20];
 
        u8         reserved_at_60[0x20];
 };
 
-struct mlx5_ifc_alloc_encap_header_in_bits {
+enum {
+       MLX5_REFORMAT_TYPE_L2_TO_VXLAN = 0x0,
+       MLX5_REFORMAT_TYPE_L2_TO_NVGRE = 0x1,
+       MLX5_REFORMAT_TYPE_L2_TO_L2_TUNNEL = 0x2,
+       MLX5_REFORMAT_TYPE_L3_TUNNEL_TO_L2 = 0x3,
+       MLX5_REFORMAT_TYPE_L2_TO_L3_TUNNEL = 0x4,
+};
+
+struct mlx5_ifc_alloc_packet_reformat_context_in_bits {
        u8         opcode[0x10];
        u8         reserved_at_10[0x10];
 
@@ -4859,10 +4885,10 @@ struct mlx5_ifc_alloc_encap_header_in_bits {
 
        u8         reserved_at_40[0xa0];
 
-       struct mlx5_ifc_encap_header_in_bits encap_header;
+       struct mlx5_ifc_packet_reformat_context_in_bits packet_reformat_context;
 };
 
-struct mlx5_ifc_dealloc_encap_header_out_bits {
+struct mlx5_ifc_dealloc_packet_reformat_context_out_bits {
        u8         status[0x8];
        u8         reserved_at_8[0x18];
 
@@ -4871,14 +4897,14 @@ struct mlx5_ifc_dealloc_encap_header_out_bits {
        u8         reserved_at_40[0x40];
 };
 
-struct mlx5_ifc_dealloc_encap_header_in_bits {
+struct mlx5_ifc_dealloc_packet_reformat_context_in_bits {
        u8         opcode[0x10];
        u8         reserved_at_10[0x10];
 
        u8         reserved_20[0x10];
        u8         op_mod[0x10];
 
-       u8         encap_id[0x20];
+       u8         packet_reformat_id[0x20];
 
        u8         reserved_60[0x20];
 };
@@ -5176,7 +5202,7 @@ struct mlx5_ifc_qp_2rst_out_bits {
 
 struct mlx5_ifc_qp_2rst_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5198,7 +5224,7 @@ struct mlx5_ifc_qp_2err_out_bits {
 
 struct mlx5_ifc_qp_2err_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5298,7 +5324,7 @@ struct mlx5_ifc_modify_tis_bitmask_bits {
 
 struct mlx5_ifc_modify_tis_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5337,7 +5363,7 @@ struct mlx5_ifc_modify_tir_out_bits {
 
 struct mlx5_ifc_modify_tir_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5365,7 +5391,7 @@ struct mlx5_ifc_modify_sq_out_bits {
 
 struct mlx5_ifc_modify_sq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5438,7 +5464,7 @@ struct mlx5_ifc_rqt_bitmask_bits {
 
 struct mlx5_ifc_modify_rqt_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5472,7 +5498,7 @@ enum {
 
 struct mlx5_ifc_modify_rq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5508,7 +5534,7 @@ struct mlx5_ifc_rmp_bitmask_bits {
 
 struct mlx5_ifc_modify_rmp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5613,7 +5639,7 @@ enum {
 
 struct mlx5_ifc_modify_cq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5625,7 +5651,10 @@ struct mlx5_ifc_modify_cq_in_bits {
 
        struct mlx5_ifc_cqc_bits cq_context;
 
-       u8         reserved_at_280[0x600];
+       u8         reserved_at_280[0x40];
+
+       u8         cq_umem_valid[0x1];
+       u8         reserved_at_2c1[0x5bf];
 
        u8         pas[0][0x40];
 };
@@ -5773,7 +5802,7 @@ struct mlx5_ifc_init2rtr_qp_out_bits {
 
 struct mlx5_ifc_init2rtr_qp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5803,7 +5832,7 @@ struct mlx5_ifc_init2init_qp_out_bits {
 
 struct mlx5_ifc_init2init_qp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5902,7 +5931,7 @@ struct mlx5_ifc_drain_dct_out_bits {
 
 struct mlx5_ifc_drain_dct_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5946,7 +5975,7 @@ struct mlx5_ifc_detach_from_mcg_out_bits {
 
 struct mlx5_ifc_detach_from_mcg_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5970,7 +5999,7 @@ struct mlx5_ifc_destroy_xrq_out_bits {
 
 struct mlx5_ifc_destroy_xrq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -5992,7 +6021,7 @@ struct mlx5_ifc_destroy_xrc_srq_out_bits {
 
 struct mlx5_ifc_destroy_xrc_srq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6014,7 +6043,7 @@ struct mlx5_ifc_destroy_tis_out_bits {
 
 struct mlx5_ifc_destroy_tis_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6036,7 +6065,7 @@ struct mlx5_ifc_destroy_tir_out_bits {
 
 struct mlx5_ifc_destroy_tir_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6058,7 +6087,7 @@ struct mlx5_ifc_destroy_srq_out_bits {
 
 struct mlx5_ifc_destroy_srq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6080,7 +6109,7 @@ struct mlx5_ifc_destroy_sq_out_bits {
 
 struct mlx5_ifc_destroy_sq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6126,7 +6155,7 @@ struct mlx5_ifc_destroy_rqt_out_bits {
 
 struct mlx5_ifc_destroy_rqt_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6148,7 +6177,7 @@ struct mlx5_ifc_destroy_rq_out_bits {
 
 struct mlx5_ifc_destroy_rq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6192,7 +6221,7 @@ struct mlx5_ifc_destroy_rmp_out_bits {
 
 struct mlx5_ifc_destroy_rmp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6214,7 +6243,7 @@ struct mlx5_ifc_destroy_qp_out_bits {
 
 struct mlx5_ifc_destroy_qp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6366,7 +6395,7 @@ struct mlx5_ifc_destroy_dct_out_bits {
 
 struct mlx5_ifc_destroy_dct_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6388,7 +6417,7 @@ struct mlx5_ifc_destroy_cq_out_bits {
 
 struct mlx5_ifc_destroy_cq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6491,7 +6520,7 @@ struct mlx5_ifc_dealloc_xrcd_out_bits {
 
 struct mlx5_ifc_dealloc_xrcd_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6579,7 +6608,7 @@ struct mlx5_ifc_dealloc_pd_out_bits {
 
 struct mlx5_ifc_dealloc_pd_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6625,7 +6654,7 @@ struct mlx5_ifc_create_xrq_out_bits {
 
 struct mlx5_ifc_create_xrq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6649,7 +6678,7 @@ struct mlx5_ifc_create_xrc_srq_out_bits {
 
 struct mlx5_ifc_create_xrc_srq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6658,7 +6687,9 @@ struct mlx5_ifc_create_xrc_srq_in_bits {
 
        struct mlx5_ifc_xrc_srqc_bits xrc_srq_context_entry;
 
-       u8         reserved_at_280[0x600];
+       u8         reserved_at_280[0x40];
+       u8         xrc_srq_umem_valid[0x1];
+       u8         reserved_at_2c1[0x5bf];
 
        u8         pas[0][0x40];
 };
@@ -6677,7 +6708,7 @@ struct mlx5_ifc_create_tis_out_bits {
 
 struct mlx5_ifc_create_tis_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6701,7 +6732,7 @@ struct mlx5_ifc_create_tir_out_bits {
 
 struct mlx5_ifc_create_tir_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6725,7 +6756,7 @@ struct mlx5_ifc_create_srq_out_bits {
 
 struct mlx5_ifc_create_srq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6753,7 +6784,7 @@ struct mlx5_ifc_create_sq_out_bits {
 
 struct mlx5_ifc_create_sq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6807,7 +6838,7 @@ struct mlx5_ifc_create_rqt_out_bits {
 
 struct mlx5_ifc_create_rqt_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6831,7 +6862,7 @@ struct mlx5_ifc_create_rq_out_bits {
 
 struct mlx5_ifc_create_rq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6855,7 +6886,7 @@ struct mlx5_ifc_create_rmp_out_bits {
 
 struct mlx5_ifc_create_rmp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6879,7 +6910,7 @@ struct mlx5_ifc_create_qp_out_bits {
 
 struct mlx5_ifc_create_qp_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -6892,7 +6923,10 @@ struct mlx5_ifc_create_qp_in_bits {
 
        struct mlx5_ifc_qpc_bits qpc;
 
-       u8         reserved_at_800[0x80];
+       u8         reserved_at_800[0x60];
+
+       u8         wq_umem_valid[0x1];
+       u8         reserved_at_861[0x1f];
 
        u8         pas[0][0x40];
 };
@@ -6954,7 +6988,8 @@ struct mlx5_ifc_create_mkey_in_bits {
        u8         reserved_at_40[0x20];
 
        u8         pg_access[0x1];
-       u8         reserved_at_61[0x1f];
+       u8         mkey_umem_valid[0x1];
+       u8         reserved_at_62[0x1e];
 
        struct mlx5_ifc_mkc_bits memory_key_mkey_entry;
 
@@ -6980,7 +7015,7 @@ struct mlx5_ifc_create_flow_table_out_bits {
 };
 
 struct mlx5_ifc_flow_table_context_bits {
-       u8         encap_en[0x1];
+       u8         reformat_en[0x1];
        u8         decap_en[0x1];
        u8         reserved_at_2[0x2];
        u8         table_miss_action[0x4];
@@ -7122,7 +7157,7 @@ struct mlx5_ifc_create_dct_out_bits {
 
 struct mlx5_ifc_create_dct_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -7148,7 +7183,7 @@ struct mlx5_ifc_create_cq_out_bits {
 
 struct mlx5_ifc_create_cq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -7157,7 +7192,10 @@ struct mlx5_ifc_create_cq_in_bits {
 
        struct mlx5_ifc_cqc_bits cq_context;
 
-       u8         reserved_at_280[0x600];
+       u8         reserved_at_280[0x60];
+
+       u8         cq_umem_valid[0x1];
+       u8         reserved_at_2e1[0x59f];
 
        u8         pas[0][0x40];
 };
@@ -7205,7 +7243,7 @@ struct mlx5_ifc_attach_to_mcg_out_bits {
 
 struct mlx5_ifc_attach_to_mcg_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -7256,7 +7294,7 @@ enum {
 
 struct mlx5_ifc_arm_xrc_srq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -7284,7 +7322,7 @@ enum {
 
 struct mlx5_ifc_arm_rq_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -7332,7 +7370,7 @@ struct mlx5_ifc_alloc_xrcd_out_bits {
 
 struct mlx5_ifc_alloc_xrcd_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
@@ -7420,7 +7458,7 @@ struct mlx5_ifc_alloc_pd_out_bits {
 
 struct mlx5_ifc_alloc_pd_in_bits {
        u8         opcode[0x10];
-       u8         reserved_at_10[0x10];
+       u8         uid[0x10];
 
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
index 4778d41..fbe322c 100644 (file)
@@ -471,6 +471,7 @@ struct mlx5_core_qp {
        int                     qpn;
        struct mlx5_rsc_debug   *dbg;
        int                     pid;
+       u16                     uid;
 };
 
 struct mlx5_core_dct {
index 24ff23e..1b1f3c2 100644 (file)
@@ -61,6 +61,7 @@ struct mlx5_srq_attr {
        u32 tm_next_tag;
        u32 tm_hw_phase_cnt;
        u32 tm_sw_phase_cnt;
+       u16 uid;
 };
 
 struct mlx5_core_dev;