]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
net: mscc: ocelot: only install TCAM entries into a specific lookup and PAG
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 2 Oct 2020 12:02:25 +0000 (15:02 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 2 Oct 2020 22:40:30 +0000 (15:40 -0700)
We were installing TCAM rules with the LOOKUP field as unmasked, meaning
that all entries were matching on all lookups. Now that lookups are
exposed as individual chains, let's make the LOOKUP explicit when
offloading TCAM entries.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mscc/ocelot_flower.c
drivers/net/ethernet/mscc/ocelot_vcap.c

index feeaf016f8cafb6865a792365e166ea90db195ff..b26a5f8dc62d6280439fbd74c19ab3770abb0b2b 100644 (file)
@@ -164,6 +164,8 @@ static int ocelot_flower_parse_action(struct flow_cls_offload *f, bool ingress,
        }
        if (filter->block_id == VCAP_IS1 || filter->block_id == VCAP_IS2)
                filter->lookup = ocelot_chain_to_lookup(chain);
+       if (filter->block_id == VCAP_IS2)
+               filter->pag = ocelot_chain_to_pag(chain);
 
        filter->goto_target = -1;
        filter->type = OCELOT_VCAP_FILTER_DUMMY;
@@ -205,9 +207,10 @@ static int ocelot_flower_parse_action(struct flow_cls_offload *f, bool ingress,
                        filter->type = OCELOT_VCAP_FILTER_OFFLOAD;
                        break;
                case FLOW_ACTION_POLICE:
-                       if (filter->block_id != VCAP_IS2) {
+                       if (filter->block_id != VCAP_IS2 ||
+                           filter->lookup != 0) {
                                NL_SET_ERR_MSG_MOD(extack,
-                                                  "Police action can only be offloaded to VCAP IS2");
+                                                  "Police action can only be offloaded to VCAP IS2 lookup 0");
                                return -EOPNOTSUPP;
                        }
                        if (filter->goto_target != -1) {
@@ -259,8 +262,7 @@ static int ocelot_flower_parse_action(struct flow_cls_offload *f, bool ingress,
                case FLOW_ACTION_GOTO:
                        filter->goto_target = a->chain_index;
 
-                       if (filter->block_id == VCAP_IS1 &&
-                           ocelot_chain_to_lookup(chain) == 2) {
+                       if (filter->block_id == VCAP_IS1 && filter->lookup == 2) {
                                int pag = ocelot_chain_to_pag(filter->goto_target);
 
                                filter->action.pag_override_mask = 0xff;
index d0e5c5bbdbf844c76b8d798808e4c208d48592bb..0656e146129acad5220bcd58820abc0de648462a 100644 (file)
@@ -367,7 +367,10 @@ static void is2_entry_set(struct ocelot *ocelot, int ix,
 
        data.type = IS2_ACTION_TYPE_NORMAL;
 
-       vcap_key_set(vcap, &data, VCAP_IS2_HK_PAG, 0, 0);
+       vcap_key_set(vcap, &data, VCAP_IS2_HK_PAG, filter->pag, 0xff);
+       vcap_key_bit_set(vcap, &data, VCAP_IS2_HK_FIRST,
+                        (filter->lookup == 0) ? OCELOT_VCAP_BIT_1 :
+                        OCELOT_VCAP_BIT_0);
        vcap_key_set(vcap, &data, VCAP_IS2_HK_IGR_PORT_MASK, 0,
                     ~filter->ingress_port_mask);
        vcap_key_bit_set(vcap, &data, VCAP_IS2_HK_FIRST, OCELOT_VCAP_BIT_ANY);
@@ -688,6 +691,7 @@ static void is1_entry_set(struct ocelot *ocelot, int ix,
        if (filter->prio != 0)
                data.tg |= data.tg_value;
 
+       vcap_key_set(vcap, &data, VCAP_IS1_HK_LOOKUP, filter->lookup, 0x3);
        vcap_key_set(vcap, &data, VCAP_IS1_HK_IGR_PORT_MASK, 0,
                     ~filter->ingress_port_mask);
        vcap_key_bit_set(vcap, &data, VCAP_IS1_HK_L2_MC, filter->dmac_mc);