From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 511DA42C4E; Mon, 12 Jun 2023 17:49:59 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id ECA1341138; Mon, 12 Jun 2023 17:49:58 +0200 (CEST) Received: from mail-vs1-f43.google.com (mail-vs1-f43.google.com [209.85.217.43]) by mails.dpdk.org (Postfix) with ESMTP id 91FE240698 for ; Mon, 12 Jun 2023 17:49:57 +0200 (CEST) Received: by mail-vs1-f43.google.com with SMTP id ada2fe7eead31-43f30d3f8f4so3084137.2 for ; Mon, 12 Jun 2023 08:49:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1686584997; x=1689176997; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=nt8cwA99wih2VK0yv7itzWgHjsIymy7MHkB/roir5eU=; b=PzLt6hBAjaT6M40iktlZaZdJmitPhd7NZ278KFAamNv+ivE3DiqEeKz9YaLi5Xfxys GCPpDDWm8aWqT1VO6fU6Z1wax9eP8SzrbQMH3q/B21RsZCkIcR/xFe/MOua0pVsqgsTI i+e6X9cbt4/cgfU2f+Zc1EOG6LzrOOhl3hu+LrAOwgr1aXBwzP+mscA4ufGEe0wQ/59B UnUYvx8xsf3YBUYsT6FXwkh/RIT6m5LTC4SUWTPxAwvAI/LQARnHNp/U7ePzb0+b1bnW Q8dM3maQ+CBsNfuksYx1Q7LE67713+eeNoYjEuZS9X1h1mLtpP84Lb3rQh2kBW2xo+pd iUjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686584997; x=1689176997; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nt8cwA99wih2VK0yv7itzWgHjsIymy7MHkB/roir5eU=; b=S62TSSedXGufLPIdbbxTDMuMZQUqP0JFt/CPBqGLDAXAPvTUH7oQUNvY3j42GkvV5K H8LKla3vkFI7fIIWJaw9vjcnTM+ggox/MXIO7rGFiFLqwZWbNITyjl2iqamy8DCHxf5u p5yrbuQXKILkOqacxGiJOUX76jzDql5evkS9S/ta4JIeBWpTLA5ZsikG9eCA+EqMEK/M hnajEQcazg2J30HEadDPGvcV8455jQ0ogFFmAi3QzIYFIiDq96glekp3yEQnK+GuTiw6 48xWOdZ2hEmU1pEuemsW6A7AKD4nDzdFP79ilv36GignwT7f/entWN4Ey/pdCbNDxTb0 rOcA== X-Gm-Message-State: AC+VfDyidvBhvj/9/Na99+bxKi6LwAF1DIYDHiry/HqbYRuAkNCek/dV UN70DBhkr8+SAGiPS+SAbzQrbD/wYePno/xY/nhII+igauo= X-Google-Smtp-Source: ACHHUZ4WGSKCxKomQc/fvgNSKLbl0AGmbmr5Xuexhp6pBzRtVSleTbmu24NfsVGyO+n7SrX/apMjc/+Bal2c52lVq7c= X-Received: by 2002:a05:6102:1352:b0:43d:c337:79bc with SMTP id j18-20020a056102135200b0043dc33779bcmr2268059vsl.13.1686584996634; Mon, 12 Jun 2023 08:49:56 -0700 (PDT) MIME-Version: 1.0 References: <20230609111801.4002034-1-psatheesh@marvell.com> In-Reply-To: <20230609111801.4002034-1-psatheesh@marvell.com> From: Jerin Jacob Date: Mon, 12 Jun 2023 21:19:30 +0530 Message-ID: Subject: Re: [dpdk-dev] [PATCH] net/cnxk: support port ID flow action item To: psatheesh@marvell.com Cc: Nithin Kumar Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao , dev@dpdk.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org On Fri, Jun 9, 2023 at 4:48=E2=80=AFPM wrote: > > From: Satheesh Paul > > Currently PORT_ID action can redirect traffic only between > VFs of a PF. This patch extends PORT_ID action to redirect > traffic from one PF port to another PF port also. > > Signed-off-by: Satheesh Paul > Reviewed-by: Kiran Kumar K Please update the release note. > --- > drivers/common/cnxk/roc_npc.c | 29 ++++++-------- > drivers/common/cnxk/roc_npc.h | 62 +++++++++++------------------- > drivers/common/cnxk/roc_npc_priv.h | 1 + > drivers/net/cnxk/cnxk_flow.c | 51 +++++++++--------------- > 4 files changed, 55 insertions(+), 88 deletions(-) > > diff --git a/drivers/common/cnxk/roc_npc.c b/drivers/common/cnxk/roc_npc.= c > index d88c4d3bd6..848086c8de 100644 > --- a/drivers/common/cnxk/roc_npc.c > +++ b/drivers/common/cnxk/roc_npc.c > @@ -472,10 +472,9 @@ npc_parse_spi_to_sa_action(struct roc_npc *roc_npc, = const struct roc_npc_action > > static int > npc_parse_actions(struct roc_npc *roc_npc, const struct roc_npc_attr *at= tr, > - const struct roc_npc_action actions[], > - struct roc_npc_flow *flow) > + const struct roc_npc_action actions[], struct roc_npc_f= low *flow, > + uint16_t dst_pf_func) > { > - const struct roc_npc_action_port_id *act_portid; > struct npc *npc =3D roc_npc_to_npc_priv(roc_npc); > const struct roc_npc_action *sec_action =3D NULL; > const struct roc_npc_action_mark *act_mark; > @@ -545,10 +544,7 @@ npc_parse_actions(struct roc_npc *roc_npc, const str= uct roc_npc_attr *attr, > break; > > case ROC_NPC_ACTION_TYPE_PORT_ID: > - act_portid =3D (const struct roc_npc_action_port_= id *) > - actions->conf; > - pf_func &=3D (0xfc00); > - pf_func =3D (pf_func | (act_portid->id + 1)); > + pf_func =3D dst_pf_func; > req_act |=3D ROC_NPC_ACTION_TYPE_VF; > break; > > @@ -859,9 +855,8 @@ npc_parse_attr(struct npc *npc, const struct roc_npc_= attr *attr, > > static int > npc_parse_rule(struct roc_npc *roc_npc, const struct roc_npc_attr *attr, > - const struct roc_npc_item_info pattern[], > - const struct roc_npc_action actions[], struct roc_npc_flow= *flow, > - struct npc_parse_state *pst) > + const struct roc_npc_item_info pattern[], const struct roc= _npc_action actions[], > + struct roc_npc_flow *flow, struct npc_parse_state *pst) > { > struct npc *npc =3D roc_npc_to_npc_priv(roc_npc); > struct roc_nix *roc_nix =3D roc_npc->roc_nix; > @@ -881,7 +876,7 @@ npc_parse_rule(struct roc_npc *roc_npc, const struct = roc_npc_attr *attr, > return err; > > /* Check action */ > - err =3D npc_parse_actions(roc_npc, attr, actions, flow); > + err =3D npc_parse_actions(roc_npc, attr, actions, flow, pst->dst_= pf_func); > if (err) > return err; > return 0; > @@ -897,8 +892,7 @@ roc_npc_flow_parse(struct roc_npc *roc_npc, const str= uct roc_npc_attr *attr, > struct npc_parse_state parse_state =3D {0}; > int rc; > > - rc =3D npc_parse_rule(roc_npc, attr, pattern, actions, flow, > - &parse_state); > + rc =3D npc_parse_rule(roc_npc, attr, pattern, actions, flow, &par= se_state); > if (rc) > return rc; > > @@ -1420,8 +1414,8 @@ roc_npc_sdp_channel_get(struct roc_npc *roc_npc, ui= nt16_t *chan_base, uint16_t * > > struct roc_npc_flow * > roc_npc_flow_create(struct roc_npc *roc_npc, const struct roc_npc_attr *= attr, > - const struct roc_npc_item_info pattern[], > - const struct roc_npc_action actions[], int *errcode) > + const struct roc_npc_item_info pattern[], const struc= t roc_npc_action actions[], > + uint16_t dst_pf_func, int *errcode) > { > struct npc *npc =3D roc_npc_to_npc_priv(roc_npc); > uint16_t sdp_chan_base =3D 0, sdp_chan_mask =3D 0; > @@ -1451,8 +1445,9 @@ roc_npc_flow_create(struct roc_npc *roc_npc, const = struct roc_npc_attr *attr, > memset(flow, 0, sizeof(*flow)); > memset(&parse_state, 0, sizeof(parse_state)); > > - rc =3D npc_parse_rule(roc_npc, attr, pattern, actions, flow, > - &parse_state); > + parse_state.dst_pf_func =3D dst_pf_func; > + > + rc =3D npc_parse_rule(roc_npc, attr, pattern, actions, flow, &par= se_state); > if (rc !=3D 0) { > *errcode =3D rc; > goto err_exit; > diff --git a/drivers/common/cnxk/roc_npc.h b/drivers/common/cnxk/roc_npc.= h > index 5984da1c1a..07e6634aa7 100644 > --- a/drivers/common/cnxk/roc_npc.h > +++ b/drivers/common/cnxk/roc_npc.h > @@ -358,41 +358,29 @@ int __roc_api roc_npc_init(struct roc_npc *roc_npc)= ; > int __roc_api roc_npc_fini(struct roc_npc *roc_npc); > const char *__roc_api roc_npc_profile_name_get(struct roc_npc *roc_npc); > > -struct roc_npc_flow *__roc_api > -roc_npc_flow_create(struct roc_npc *roc_npc, const struct roc_npc_attr *= attr, > - const struct roc_npc_item_info pattern[], > - const struct roc_npc_action actions[], int *errcode); > -int __roc_api roc_npc_flow_destroy(struct roc_npc *roc_npc, > - struct roc_npc_flow *flow); > -int __roc_api roc_npc_mcam_free(struct roc_npc *roc_npc, > - struct roc_npc_flow *mcam); > +struct roc_npc_flow *__roc_api roc_npc_flow_create(struct roc_npc *roc_n= pc, > + const struct roc_npc_a= ttr *attr, > + const struct roc_npc_i= tem_info pattern[], > + const struct roc_npc_a= ction actions[], > + uint16_t dst_pf_func, = int *errcode); > +int __roc_api roc_npc_flow_destroy(struct roc_npc *roc_npc, struct roc_n= pc_flow *flow); > +int __roc_api roc_npc_mcam_free(struct roc_npc *roc_npc, struct roc_npc_= flow *mcam); > int __roc_api roc_npc_mcam_free_entry(struct roc_npc *roc_npc, uint32_t = entry); > -int __roc_api roc_npc_mcam_enable_all_entries(struct roc_npc *roc_npc, > - bool enable); > -int __roc_api roc_npc_mcam_alloc_entry(struct roc_npc *roc_npc, > - struct roc_npc_flow *mcam, > - struct roc_npc_flow *ref_mcam, int= prio, > - int *resp_count); > -int __roc_api roc_npc_mcam_alloc_entries(struct roc_npc *roc_npc, int re= f_entry, > - int *alloc_entry, int req_count, > - int priority, int *resp_count); > -int __roc_api roc_npc_mcam_ena_dis_entry(struct roc_npc *roc_npc, > - struct roc_npc_flow *mcam, > +int __roc_api roc_npc_mcam_enable_all_entries(struct roc_npc *roc_npc, b= ool enable); > +int __roc_api roc_npc_mcam_alloc_entry(struct roc_npc *roc_npc, struct r= oc_npc_flow *mcam, > + struct roc_npc_flow *ref_mcam, int= prio, int *resp_count); > +int __roc_api roc_npc_mcam_alloc_entries(struct roc_npc *roc_npc, int re= f_entry, int *alloc_entry, > + int req_count, int priority, int= *resp_count); > +int __roc_api roc_npc_mcam_ena_dis_entry(struct roc_npc *roc_npc, struct= roc_npc_flow *mcam, > bool enable); > -int __roc_api roc_npc_mcam_write_entry(struct roc_npc *roc_npc, > - struct roc_npc_flow *mcam); > -int __roc_api roc_npc_flow_parse(struct roc_npc *roc_npc, > - const struct roc_npc_attr *attr, > +int __roc_api roc_npc_mcam_write_entry(struct roc_npc *roc_npc, struct r= oc_npc_flow *mcam); > +int __roc_api roc_npc_flow_parse(struct roc_npc *roc_npc, const struct r= oc_npc_attr *attr, > const struct roc_npc_item_info pattern[]= , > - const struct roc_npc_action actions[], > - struct roc_npc_flow *flow); > + const struct roc_npc_action actions[], s= truct roc_npc_flow *flow); > int __roc_api roc_npc_get_low_priority_mcam(struct roc_npc *roc_npc); > -int __roc_api roc_npc_mcam_free_counter(struct roc_npc *roc_npc, > - uint16_t ctr_id); > -int __roc_api roc_npc_mcam_read_counter(struct roc_npc *roc_npc, > - uint32_t ctr_id, uint64_t *count)= ; > -int __roc_api roc_npc_mcam_clear_counter(struct roc_npc *roc_npc, > - uint32_t ctr_id); > +int __roc_api roc_npc_mcam_free_counter(struct roc_npc *roc_npc, uint16_= t ctr_id); > +int __roc_api roc_npc_mcam_read_counter(struct roc_npc *roc_npc, uint32_= t ctr_id, uint64_t *count); > +int __roc_api roc_npc_mcam_clear_counter(struct roc_npc *roc_npc, uint32= _t ctr_id); > int __roc_api roc_npc_inl_mcam_read_counter(uint32_t ctr_id, uint64_t *c= ount); > int __roc_api roc_npc_inl_mcam_clear_counter(uint32_t ctr_id); > int __roc_api roc_npc_mcam_free_all_resources(struct roc_npc *roc_npc); > @@ -400,17 +388,13 @@ void __roc_api roc_npc_flow_dump(FILE *file, struct= roc_npc *roc_npc); > void __roc_api roc_npc_flow_mcam_dump(FILE *file, struct roc_npc *roc_np= c, > struct roc_npc_flow *mcam); > int __roc_api roc_npc_mark_actions_get(struct roc_npc *roc_npc); > -int __roc_api roc_npc_mark_actions_sub_return(struct roc_npc *roc_npc, > - uint32_t count); > +int __roc_api roc_npc_mark_actions_sub_return(struct roc_npc *roc_npc, u= int32_t count); > int __roc_api roc_npc_vtag_actions_get(struct roc_npc *roc_npc); > -int __roc_api roc_npc_vtag_actions_sub_return(struct roc_npc *roc_npc, > - uint32_t count); > +int __roc_api roc_npc_vtag_actions_sub_return(struct roc_npc *roc_npc, u= int32_t count); > int __roc_api roc_npc_mcam_merge_base_steering_rule(struct roc_npc *roc_= npc, > struct roc_npc_flow *= flow); > int __roc_api roc_npc_validate_portid_action(struct roc_npc *roc_npc_src= , > struct roc_npc *roc_npc_dst)= ; > -int __roc_api roc_npc_mcam_init(struct roc_npc *roc_npc, > - struct roc_npc_flow *flow, int mcam_id); > -int __roc_api roc_npc_mcam_move(struct roc_npc *roc_npc, uint16_t old_en= t, > - uint16_t new_ent); > +int __roc_api roc_npc_mcam_init(struct roc_npc *roc_npc, struct roc_npc_= flow *flow, int mcam_id); > +int __roc_api roc_npc_mcam_move(struct roc_npc *roc_npc, uint16_t old_en= t, uint16_t new_ent); > #endif /* _ROC_NPC_H_ */ > diff --git a/drivers/common/cnxk/roc_npc_priv.h b/drivers/common/cnxk/roc= _npc_priv.h > index 30274e837b..593dca353b 100644 > --- a/drivers/common/cnxk/roc_npc_priv.h > +++ b/drivers/common/cnxk/roc_npc_priv.h > @@ -201,6 +201,7 @@ struct npc_parse_state { > bool is_second_pass_rule; > bool has_eth_type; > uint16_t nb_tx_queues; > + uint16_t dst_pf_func; > }; > > enum npc_kpu_parser_flag { > diff --git a/drivers/net/cnxk/cnxk_flow.c b/drivers/net/cnxk/cnxk_flow.c > index 9595fe9386..d9d9478ade 100644 > --- a/drivers/net/cnxk/cnxk_flow.c > +++ b/drivers/net/cnxk/cnxk_flow.c > @@ -113,14 +113,13 @@ npc_rss_flowkey_get(struct cnxk_eth_dev *eth_dev, > > static int > cnxk_map_actions(struct rte_eth_dev *eth_dev, const struct rte_flow_attr= *attr, > - const struct rte_flow_action actions[], > - struct roc_npc_action in_actions[], uint32_t *flowkey_cf= g) > + const struct rte_flow_action actions[], struct roc_npc_a= ction in_actions[], > + uint32_t *flowkey_cfg, uint16_t *dst_pf_func) > { > struct cnxk_eth_dev *dev =3D cnxk_eth_pmd_priv(eth_dev); > const struct rte_flow_action_ethdev *act_ethdev; > const struct rte_flow_action_port_id *port_act; > const struct rte_flow_action_queue *act_q; > - struct roc_npc *roc_npc_src =3D &dev->npc; > struct rte_eth_dev *portid_eth_dev; > char if_name[RTE_ETH_NAME_MAX_LEN]; > struct cnxk_eth_dev *hw_dst; > @@ -186,12 +185,7 @@ cnxk_map_actions(struct rte_eth_dev *eth_dev, const = struct rte_flow_attr *attr, > } > hw_dst =3D portid_eth_dev->data->dev_private; > roc_npc_dst =3D &hw_dst->npc; > - > - rc =3D roc_npc_validate_portid_action(roc_npc_src= , > - roc_npc_dst); > - > - if (rc) > - goto err_exit; > + *dst_pf_func =3D roc_npc_dst->pf_func; > break; > > case RTE_FLOW_ACTION_TYPE_QUEUE: > @@ -255,13 +249,10 @@ cnxk_map_actions(struct rte_eth_dev *eth_dev, const= struct rte_flow_attr *attr, > } > > static int > -cnxk_map_flow_data(struct rte_eth_dev *eth_dev, > - const struct rte_flow_attr *attr, > - const struct rte_flow_item pattern[], > - const struct rte_flow_action actions[], > - struct roc_npc_attr *in_attr, > - struct roc_npc_item_info in_pattern[], > - struct roc_npc_action in_actions[], uint32_t *flowkey_= cfg) > +cnxk_map_flow_data(struct rte_eth_dev *eth_dev, const struct rte_flow_at= tr *attr, > + const struct rte_flow_item pattern[], const struct rte= _flow_action actions[], > + struct roc_npc_attr *in_attr, struct roc_npc_item_info= in_pattern[], > + struct roc_npc_action in_actions[], uint32_t *flowkey_= cfg, uint16_t *dst_pf_func) > { > int i =3D 0; > > @@ -280,15 +271,12 @@ cnxk_map_flow_data(struct rte_eth_dev *eth_dev, > } > in_pattern[i].type =3D ROC_NPC_ITEM_TYPE_END; > > - return cnxk_map_actions(eth_dev, attr, actions, in_actions, > - flowkey_cfg); > + return cnxk_map_actions(eth_dev, attr, actions, in_actions, flowk= ey_cfg, dst_pf_func); > } > > static int > -cnxk_flow_validate(struct rte_eth_dev *eth_dev, > - const struct rte_flow_attr *attr, > - const struct rte_flow_item pattern[], > - const struct rte_flow_action actions[], > +cnxk_flow_validate(struct rte_eth_dev *eth_dev, const struct rte_flow_at= tr *attr, > + const struct rte_flow_item pattern[], const struct rte= _flow_action actions[], > struct rte_flow_error *error) > { > struct roc_npc_item_info in_pattern[ROC_NPC_ITEM_TYPE_END + 1]; > @@ -298,13 +286,14 @@ cnxk_flow_validate(struct rte_eth_dev *eth_dev, > struct roc_npc_attr in_attr; > struct roc_npc_flow flow; > uint32_t flowkey_cfg =3D 0; > + uint16_t dst_pf_func =3D 0; > int rc; > > memset(&flow, 0, sizeof(flow)); > flow.is_validate =3D true; > > rc =3D cnxk_map_flow_data(eth_dev, attr, pattern, actions, &in_at= tr, in_pattern, in_actions, > - &flowkey_cfg); > + &flowkey_cfg, &dst_pf_func); > if (rc) { > rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION_N= UM, NULL, > "Failed to map flow data"); > @@ -333,23 +322,21 @@ cnxk_flow_create(struct rte_eth_dev *eth_dev, const= struct rte_flow_attr *attr, > struct roc_npc *npc =3D &dev->npc; > struct roc_npc_attr in_attr; > struct roc_npc_flow *flow; > + uint16_t dst_pf_func =3D 0; > int errcode =3D 0; > int rc; > > - rc =3D cnxk_map_flow_data(eth_dev, attr, pattern, actions, &in_at= tr, > - in_pattern, in_actions, > - &npc->flowkey_cfg_state); > + rc =3D cnxk_map_flow_data(eth_dev, attr, pattern, actions, &in_at= tr, in_pattern, in_actions, > + &npc->flowkey_cfg_state, &dst_pf_func); > if (rc) { > - rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION_N= UM, > - NULL, "Failed to map flow data"); > + rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION_N= UM, NULL, > + "Failed to map flow data"); > return NULL; > } > > - flow =3D roc_npc_flow_create(npc, &in_attr, in_pattern, in_action= s, > - &errcode); > + flow =3D roc_npc_flow_create(npc, &in_attr, in_pattern, in_action= s, dst_pf_func, &errcode); > if (errcode !=3D 0) { > - rte_flow_error_set(error, errcode, errcode, NULL, > - roc_error_msg_get(errcode)); > + rte_flow_error_set(error, errcode, errcode, NULL, roc_err= or_msg_get(errcode)); > return NULL; > } > > -- > 2.39.2 >