u8 ft_type, u8 dv_prt,
        void *in, size_t len)
 {
+       struct mlx5_pkt_reformat_params reformat_params;
        enum mlx5_flow_namespace_type namespace;
        u8 prm_prt;
        int ret;
        if (ret)
                return ret;
 
+       memset(&reformat_params, 0, sizeof(reformat_params));
+       reformat_params.type = prm_prt;
+       reformat_params.size = len;
+       reformat_params.data = in;
        maction->flow_action_raw.pkt_reformat =
-               mlx5_packet_reformat_alloc(dev->mdev, prm_prt, len,
-                                          in, namespace);
+               mlx5_packet_reformat_alloc(dev->mdev, &reformat_params,
+                                          namespace);
        if (IS_ERR(maction->flow_action_raw.pkt_reformat)) {
                ret = PTR_ERR(maction->flow_action_raw.pkt_reformat);
                return ret;
 
 {
        int max_encap_size = MLX5_CAP_ESW(priv->mdev, max_encap_header_size);
        const struct ip_tunnel_key *tun_key = &e->tun_info->key;
+       struct mlx5_pkt_reformat_params reformat_params;
        struct mlx5e_neigh m_neigh = {};
        TC_TUN_ROUTE_ATTR_INIT(attr);
        int ipv4_encap_size;
                 */
                goto release_neigh;
        }
-       e->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev,
-                                                    e->reformat_type,
-                                                    ipv4_encap_size, encap_header,
+
+       memset(&reformat_params, 0, sizeof(reformat_params));
+       reformat_params.type = e->reformat_type;
+       reformat_params.size = ipv4_encap_size;
+       reformat_params.data = encap_header;
+       e->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev, &reformat_params,
                                                     MLX5_FLOW_NAMESPACE_FDB);
        if (IS_ERR(e->pkt_reformat)) {
                err = PTR_ERR(e->pkt_reformat);
 {
        int max_encap_size = MLX5_CAP_ESW(priv->mdev, max_encap_header_size);
        const struct ip_tunnel_key *tun_key = &e->tun_info->key;
+       struct mlx5_pkt_reformat_params reformat_params;
        TC_TUN_ROUTE_ATTR_INIT(attr);
        int ipv4_encap_size;
        char *encap_header;
                 */
                goto release_neigh;
        }
-       e->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev,
-                                                    e->reformat_type,
-                                                    ipv4_encap_size, encap_header,
+
+       memset(&reformat_params, 0, sizeof(reformat_params));
+       reformat_params.type = e->reformat_type;
+       reformat_params.size = ipv4_encap_size;
+       reformat_params.data = encap_header;
+       e->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev, &reformat_params,
                                                     MLX5_FLOW_NAMESPACE_FDB);
        if (IS_ERR(e->pkt_reformat)) {
                err = PTR_ERR(e->pkt_reformat);
 {
        int max_encap_size = MLX5_CAP_ESW(priv->mdev, max_encap_header_size);
        const struct ip_tunnel_key *tun_key = &e->tun_info->key;
+       struct mlx5_pkt_reformat_params reformat_params;
        struct mlx5e_neigh m_neigh = {};
        TC_TUN_ROUTE_ATTR_INIT(attr);
        struct ipv6hdr *ip6h;
                goto release_neigh;
        }
 
-       e->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev,
-                                                    e->reformat_type,
-                                                    ipv6_encap_size, encap_header,
+       memset(&reformat_params, 0, sizeof(reformat_params));
+       reformat_params.type = e->reformat_type;
+       reformat_params.size = ipv6_encap_size;
+       reformat_params.data = encap_header;
+       e->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev, &reformat_params,
                                                     MLX5_FLOW_NAMESPACE_FDB);
        if (IS_ERR(e->pkt_reformat)) {
                err = PTR_ERR(e->pkt_reformat);
 {
        int max_encap_size = MLX5_CAP_ESW(priv->mdev, max_encap_header_size);
        const struct ip_tunnel_key *tun_key = &e->tun_info->key;
+       struct mlx5_pkt_reformat_params reformat_params;
        TC_TUN_ROUTE_ATTR_INIT(attr);
        struct ipv6hdr *ip6h;
        int ipv6_encap_size;
                goto release_neigh;
        }
 
-       e->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev,
-                                                    e->reformat_type,
-                                                    ipv6_encap_size, encap_header,
+       memset(&reformat_params, 0, sizeof(reformat_params));
+       reformat_params.type = e->reformat_type;
+       reformat_params.size = ipv6_encap_size;
+       reformat_params.data = encap_header;
+       e->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev, &reformat_params,
                                                     MLX5_FLOW_NAMESPACE_FDB);
        if (IS_ERR(e->pkt_reformat)) {
                err = PTR_ERR(e->pkt_reformat);
 
                              struct list_head *flow_list)
 {
        struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
+       struct mlx5_pkt_reformat_params reformat_params;
        struct mlx5_esw_flow_attr *esw_attr;
        struct mlx5_flow_handle *rule;
        struct mlx5_flow_attr *attr;
        if (e->flags & MLX5_ENCAP_ENTRY_NO_ROUTE)
                return;
 
+       memset(&reformat_params, 0, sizeof(reformat_params));
+       reformat_params.type = e->reformat_type;
+       reformat_params.size = e->encap_size;
+       reformat_params.data = e->encap_header;
        e->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev,
-                                                    e->reformat_type,
-                                                    e->encap_size, e->encap_header,
+                                                    &reformat_params,
                                                     MLX5_FLOW_NAMESPACE_FDB);
        if (IS_ERR(e->pkt_reformat)) {
                mlx5_core_warn(priv->mdev, "Failed to offload cached encapsulation header, %lu\n",
 {
        struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
        struct mlx5_esw_flow_attr *attr = flow->attr->esw_attr;
+       struct mlx5_pkt_reformat_params reformat_params;
        struct mlx5e_tc_flow_parse_attr *parse_attr;
        struct mlx5e_decap_entry *d;
        struct mlx5e_decap_key key;
        hash_add_rcu(esw->offloads.decap_tbl, &d->hlist, hash_key);
        mutex_unlock(&esw->offloads.decap_tbl_lock);
 
+       memset(&reformat_params, 0, sizeof(reformat_params));
+       reformat_params.type = MLX5_REFORMAT_TYPE_L3_TUNNEL_TO_L2;
+       reformat_params.size = sizeof(parse_attr->eth);
+       reformat_params.data = &parse_attr->eth;
        d->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev,
-                                                    MLX5_REFORMAT_TYPE_L3_TUNNEL_TO_L2,
-                                                    sizeof(parse_attr->eth),
-                                                    &parse_attr->eth,
+                                                    &reformat_params,
                                                     MLX5_FLOW_NAMESPACE_FDB);
        if (IS_ERR(d->pkt_reformat)) {
                err = PTR_ERR(d->pkt_reformat);
 
 }
 
 static int mlx5_cmd_stub_packet_reformat_alloc(struct mlx5_flow_root_namespace *ns,
-                                              int reformat_type,
-                                              size_t size,
-                                              void *reformat_data,
+                                              struct mlx5_pkt_reformat_params *params,
                                               enum mlx5_flow_namespace_type namespace,
                                               struct mlx5_pkt_reformat *pkt_reformat)
 {
 }
 
 static int mlx5_cmd_packet_reformat_alloc(struct mlx5_flow_root_namespace *ns,
-                                         int reformat_type,
-                                         size_t size,
-                                         void *reformat_data,
+                                         struct mlx5_pkt_reformat_params *params,
                                          enum mlx5_flow_namespace_type namespace,
                                          struct mlx5_pkt_reformat *pkt_reformat)
 {
        else
                max_encap_size = MLX5_CAP_FLOWTABLE(dev, max_encap_header_size);
 
-       if (size > max_encap_size) {
+       if (params->size > max_encap_size) {
                mlx5_core_warn(dev, "encap size %zd too big, max supported is %d\n",
-                              size, max_encap_size);
+                              params->size, max_encap_size);
                return -EINVAL;
        }
 
-       in = kzalloc(MLX5_ST_SZ_BYTES(alloc_packet_reformat_context_in) + size,
-                    GFP_KERNEL);
+       in = kzalloc(MLX5_ST_SZ_BYTES(alloc_packet_reformat_context_in) +
+                    params->size, GFP_KERNEL);
        if (!in)
                return -ENOMEM;
 
        reformat = MLX5_ADDR_OF(packet_reformat_context_in,
                                packet_reformat_context_in,
                                reformat_data);
-       inlen = reformat - (void *)in  + size;
+       inlen = reformat - (void *)in + params->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);
+                reformat_data_size, params->size);
        MLX5_SET(packet_reformat_context_in, packet_reformat_context_in,
-                reformat_type, reformat_type);
-       memcpy(reformat, reformat_data, size);
+                reformat_type, params->type);
+       MLX5_SET(packet_reformat_context_in, packet_reformat_context_in,
+                reformat_param_0, params->param_0);
+       MLX5_SET(packet_reformat_context_in, packet_reformat_context_in,
+                reformat_param_1, params->param_1);
+       if (params->data && params->size)
+               memcpy(reformat, params->data, params->size);
 
        err = mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
 
 
                              bool disconnect);
 
        int (*packet_reformat_alloc)(struct mlx5_flow_root_namespace *ns,
-                                    int reformat_type,
-                                    size_t size,
-                                    void *reformat_data,
+                                    struct mlx5_pkt_reformat_params *params,
                                     enum mlx5_flow_namespace_type namespace,
                                     struct mlx5_pkt_reformat *pkt_reformat);
 
 
 EXPORT_SYMBOL(mlx5_modify_header_dealloc);
 
 struct mlx5_pkt_reformat *mlx5_packet_reformat_alloc(struct mlx5_core_dev *dev,
-                                                    int reformat_type,
-                                                    size_t size,
-                                                    void *reformat_data,
+                                                    struct mlx5_pkt_reformat_params *params,
                                                     enum mlx5_flow_namespace_type ns_type)
 {
        struct mlx5_pkt_reformat *pkt_reformat;
                return ERR_PTR(-ENOMEM);
 
        pkt_reformat->ns_type = ns_type;
-       pkt_reformat->reformat_type = reformat_type;
-       err = root->cmds->packet_reformat_alloc(root, reformat_type, size,
-                                               reformat_data, ns_type,
+       pkt_reformat->reformat_type = params->type;
+       err = root->cmds->packet_reformat_alloc(root, params, ns_type,
                                                pkt_reformat);
        if (err) {
                kfree(pkt_reformat);
 
 struct mlx5dr_action *
 mlx5dr_action_create_packet_reformat(struct mlx5dr_domain *dmn,
                                     enum mlx5dr_action_reformat_type reformat_type,
+                                    u8 reformat_param_0,
+                                    u8 reformat_param_1,
                                     size_t data_sz,
                                     void *data)
 {
 
                        DR_ACTION_REFORMAT_TYP_TNL_L2_TO_L2;
 
                tmp_action = mlx5dr_action_create_packet_reformat(domain,
-                                                                 decap_type, 0,
+                                                                 decap_type,
+                                                                 0, 0, 0,
                                                                  NULL);
                if (!tmp_action) {
                        err = -ENOMEM;
 }
 
 static int mlx5_cmd_dr_packet_reformat_alloc(struct mlx5_flow_root_namespace *ns,
-                                            int reformat_type,
-                                            size_t size,
-                                            void *reformat_data,
+                                            struct mlx5_pkt_reformat_params *params,
                                             enum mlx5_flow_namespace_type namespace,
                                             struct mlx5_pkt_reformat *pkt_reformat)
 {
        struct mlx5dr_action *action;
        int dr_reformat;
 
-       switch (reformat_type) {
+       switch (params->type) {
        case MLX5_REFORMAT_TYPE_L2_TO_VXLAN:
        case MLX5_REFORMAT_TYPE_L2_TO_NVGRE:
        case MLX5_REFORMAT_TYPE_L2_TO_L2_TUNNEL:
                break;
        default:
                mlx5_core_err(ns->dev, "Packet-reformat not supported(%d)\n",
-                             reformat_type);
+                             params->type);
                return -EOPNOTSUPP;
        }
 
        action = mlx5dr_action_create_packet_reformat(dr_domain,
                                                      dr_reformat,
-                                                     size,
-                                                     reformat_data);
+                                                     params->param_0,
+                                                     params->param_1,
+                                                     params->size,
+                                                     params->data);
        if (!action) {
                mlx5_core_err(ns->dev, "Failed allocating packet-reformat action\n");
                return -EINVAL;
 
 struct mlx5dr_action *
 mlx5dr_action_create_packet_reformat(struct mlx5dr_domain *dmn,
                                     enum mlx5dr_action_reformat_type reformat_type,
+                                    u8 reformat_param_0,
+                                    u8 reformat_param_1,
                                     size_t data_sz,
                                     void *data);
 
 
 void mlx5_modify_header_dealloc(struct mlx5_core_dev *dev,
                                struct mlx5_modify_hdr *modify_hdr);
 
+struct mlx5_pkt_reformat_params {
+       int type;
+       u8 param_0;
+       u8 param_1;
+       size_t size;
+       void *data;
+};
+
 struct mlx5_pkt_reformat *mlx5_packet_reformat_alloc(struct mlx5_core_dev *dev,
-                                                    int reformat_type,
-                                                    size_t size,
-                                                    void *reformat_data,
+                                                    struct mlx5_pkt_reformat_params *params,
                                                     enum mlx5_flow_namespace_type ns_type);
 void mlx5_packet_reformat_dealloc(struct mlx5_core_dev *dev,
                                  struct mlx5_pkt_reformat *reformat);