net: microchip: sparx5: Add TC support for the ES2 VCAP
authorSteen Hegelund <steen.hegelund@microchip.com>
Fri, 27 Jan 2023 13:08:29 +0000 (14:08 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 Jan 2023 07:36:22 +0000 (07:36 +0000)
This enables the TC command to use the Sparx5 ES2 VCAP, and provides a new
ES2 ethertype table and handling of rule links between IS0 and ES2.

Signed-off-by: Steen Hegelund <steen.hegelund@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/microchip/sparx5/sparx5_tc_flower.c
drivers/net/ethernet/microchip/sparx5/sparx5_vcap_impl.c

index 96f82612cc4afc0c969c1c69ec19cf2ce537567c..217ff127e3c7ecb11ada00edc75c3611007a3f12 100644 (file)
@@ -680,7 +680,7 @@ static int sparx5_tc_add_rule_counter(struct vcap_admin *admin,
 {
        int err;
 
-       if (admin->vtype == VCAP_TYPE_IS2) {
+       if (admin->vtype == VCAP_TYPE_IS2 || admin->vtype == VCAP_TYPE_ES2) {
                err = vcap_rule_mod_action_u32(vrule, VCAP_AF_CNT_ID,
                                               vrule->id);
                if (err)
@@ -883,6 +883,9 @@ static int sparx5_tc_set_actionset(struct vcap_admin *admin,
        case VCAP_TYPE_IS2:
                aset = VCAP_AFS_BASE_TYPE;
                break;
+       case VCAP_TYPE_ES2:
+               aset = VCAP_AFS_BASE_TYPE;
+               break;
        default:
                return -EINVAL;
        }
@@ -919,6 +922,10 @@ static int sparx5_tc_add_rule_link_target(struct vcap_admin *admin,
                return vcap_rule_add_key_u32(vrule, VCAP_KF_LOOKUP_PAG,
                                             link_val, /* target */
                                             ~0);
+       case VCAP_TYPE_ES2:
+               /* Add ISDX key for chaining rules from IS0 */
+               return vcap_rule_add_key_u32(vrule, VCAP_KF_ISDX_CLS, link_val,
+                                            ~0);
        default:
                break;
        }
@@ -961,6 +968,18 @@ static int sparx5_tc_add_rule_link(struct vcap_control *vctrl,
                                               0xff);
                if (err)
                        goto out;
+       } else if (admin->vtype == VCAP_TYPE_IS0 &&
+                  to_admin->vtype == VCAP_TYPE_ES2) {
+               /* Between IS0 and ES2 the ISDX value is used */
+               err = vcap_rule_add_action_u32(vrule, VCAP_AF_ISDX_VAL,
+                                              diff);
+               if (err)
+                       goto out;
+               err = vcap_rule_add_action_bit(vrule,
+                                              VCAP_AF_ISDX_ADD_REPLACE_SEL,
+                                              VCAP_BIT_1);
+               if (err)
+                       goto out;
        } else {
                pr_err("%s:%d: unsupported chain destination: %d\n",
                       __func__, __LINE__, to_cid);
@@ -1015,7 +1034,8 @@ static int sparx5_tc_flower_replace(struct net_device *ndev,
        flow_action_for_each(idx, act, &frule->action) {
                switch (act->id) {
                case FLOW_ACTION_TRAP:
-                       if (admin->vtype != VCAP_TYPE_IS2) {
+                       if (admin->vtype != VCAP_TYPE_IS2 &&
+                           admin->vtype != VCAP_TYPE_ES2) {
                                NL_SET_ERR_MSG_MOD(fco->common.extack,
                                                   "Trap action not supported in this VCAP");
                                err = -EOPNOTSUPP;
@@ -1030,8 +1050,11 @@ static int sparx5_tc_flower_replace(struct net_device *ndev,
                                                       VCAP_AF_CPU_QUEUE_NUM, 0);
                        if (err)
                                goto out;
-                       err = vcap_rule_add_action_u32(vrule, VCAP_AF_MASK_MODE,
-                                                      SPX5_PMM_REPLACE_ALL);
+                       if (admin->vtype != VCAP_TYPE_IS2)
+                               break;
+                       err = vcap_rule_add_action_u32(vrule,
+                                                      VCAP_AF_MASK_MODE,
+                               SPX5_PMM_REPLACE_ALL);
                        if (err)
                                goto out;
                        break;
index ccb993bbd614009ff9188eeec0be91c22d7de455..cadc4926d550ec161b9fedc63968b99c4463d782 100644 (file)
@@ -143,6 +143,14 @@ static u16 sparx5_vcap_is2_known_etypes[] = {
        ETH_P_IPV6,
 };
 
+/* These protocols have dedicated keysets in ES2 and a TC dissector */
+static u16 sparx5_vcap_es2_known_etypes[] = {
+       ETH_P_ALL,
+       ETH_P_ARP,
+       ETH_P_IP,
+       ETH_P_IPV6,
+};
+
 static void sparx5_vcap_type_err(struct sparx5 *sparx5,
                                 struct vcap_admin *admin,
                                 const char *fname)
@@ -667,6 +675,10 @@ bool sparx5_vcap_is_known_etype(struct vcap_admin *admin, u16 etype)
                known_etypes = sparx5_vcap_is2_known_etypes;
                size = ARRAY_SIZE(sparx5_vcap_is2_known_etypes);
                break;
+       case VCAP_TYPE_ES2:
+               known_etypes = sparx5_vcap_es2_known_etypes;
+               size = ARRAY_SIZE(sparx5_vcap_es2_known_etypes);
+               break;
        default:
                return false;
        }