common/cnxk: support port ID action
authorSatheesh Paul <psatheesh@marvell.com>
Thu, 21 Oct 2021 05:11:14 +0000 (10:41 +0530)
committerJerin Jacob <jerinj@marvell.com>
Thu, 21 Oct 2021 16:58:50 +0000 (18:58 +0200)
This patch adds ROC API to support flow port ID action type.

Signed-off-by: Satheesh Paul <psatheesh@marvell.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
drivers/common/cnxk/roc_npc.c
drivers/common/cnxk/roc_npc.h
drivers/common/cnxk/version.map

index 3ab8daa..0a7966b 100644 (file)
@@ -261,11 +261,38 @@ roc_npc_fini(struct roc_npc *roc_npc)
        return 0;
 }
 
+int
+roc_npc_validate_portid_action(struct roc_npc *roc_npc_src,
+                              struct roc_npc *roc_npc_dst)
+{
+       struct roc_nix *roc_nix_src = roc_npc_src->roc_nix;
+       struct nix *nix_src = roc_nix_to_nix_priv(roc_nix_src);
+       struct roc_nix *roc_nix_dst = roc_npc_dst->roc_nix;
+       struct nix *nix_dst = roc_nix_to_nix_priv(roc_nix_dst);
+
+       if (roc_nix_is_pf(roc_npc_dst->roc_nix)) {
+               plt_err("Output port should be VF");
+               return -EINVAL;
+       }
+
+       if (nix_dst->dev.vf >= nix_src->dev.maxvf) {
+               plt_err("Invalid VF for output port");
+               return -EINVAL;
+       }
+
+       if (nix_src->dev.pf != nix_dst->dev.pf) {
+               plt_err("Output port should be VF of ingress PF");
+               return -EINVAL;
+       }
+       return 0;
+}
+
 static int
 npc_parse_actions(struct roc_npc *roc_npc, const struct roc_npc_attr *attr,
                  const struct roc_npc_action actions[],
                  struct roc_npc_flow *flow)
 {
+       const struct roc_npc_action_port_id *act_portid;
        struct npc *npc = roc_npc_to_npc_priv(roc_npc);
        const struct roc_npc_action_mark *act_mark;
        const struct roc_npc_action_meter *act_mtr;
@@ -328,6 +355,14 @@ npc_parse_actions(struct roc_npc *roc_npc, const struct roc_npc_attr *attr,
                        pf_func = (pf_func | (vf_id + 1));
                        break;
 
+               case ROC_NPC_ACTION_TYPE_PORT_ID:
+                       act_portid = (const struct roc_npc_action_port_id *)
+                                            actions->conf;
+                       pf_func &= (0xfc00);
+                       pf_func = (pf_func | (act_portid->id + 1));
+                       req_act |= ROC_NPC_ACTION_TYPE_VF;
+                       break;
+
                case ROC_NPC_ACTION_TYPE_QUEUE:
                        act_q = (const struct roc_npc_action_queue *)
                                        actions->conf;
index 10d1ac8..ef85073 100644 (file)
@@ -77,6 +77,7 @@ enum roc_npc_action_type {
        ROC_NPC_ACTION_TYPE_VLAN_INSERT = (1 << 13),
        ROC_NPC_ACTION_TYPE_VLAN_ETHTYPE_INSERT = (1 << 14),
        ROC_NPC_ACTION_TYPE_VLAN_PCP_INSERT = (1 << 15),
+       ROC_NPC_ACTION_TYPE_PORT_ID = (1 << 16),
        ROC_NPC_ACTION_TYPE_METER = (1 << 17),
 };
 
@@ -95,6 +96,12 @@ struct roc_npc_action_vf {
        uint32_t id;            /**< VF ID. */
 };
 
+struct roc_npc_action_port_id {
+       uint32_t original : 1;  /**< Use original DPDK port ID if possible. */
+       uint32_t reserved : 31; /**< Reserved, must be zero. */
+       uint32_t id;            /**< port ID. */
+};
+
 struct roc_npc_action_queue {
        uint16_t index; /**< Queue index to use. */
 };
@@ -240,4 +247,6 @@ int __roc_api roc_npc_vtag_actions_sub_return(struct roc_npc *roc_npc,
                                              uint32_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);
 #endif /* _ROC_NPC_H_ */
index f5de985..8d4d42f 100644 (file)
@@ -302,6 +302,7 @@ INTERNAL {
        roc_npc_mcam_write_entry;
        roc_npc_mcam_read_counter;
        roc_npc_profile_name_get;
+       roc_npc_validate_portid_action;
        roc_plt_init;
        roc_plt_init_cb_register;
        roc_sso_dev_fini;