aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-05-01 17:13:14 -0400
committerDavid S. Miller <davem@davemloft.net>2019-05-01 17:13:14 -0400
commitf76c4b571feea8eb03184d8ba0ee45f98fff47ff (patch)
treedc28c02b3d457355d77f8a89a9a5c679e89022ac
parent2a369ae003881612ef5c2f03adcfc0ddc4ea817e (diff)
parentbec2d46d143d467f92d7d1b54d1e7c1e3a25a7b9 (diff)
Merge branch 'net-mvpp2-cls-Add-classification'
Maxime Chevallier says: ==================== net: mvpp2: cls: Add classification This series is a rework of the previously standalone patch adding classification support for mvpp2 : https://lore.kernel.org/netdev/20190423075031.26074-1-maxime.chevallier@bootlin.com/ This patch has been reworked according to Saeed's review, to make sure that the location of the rule is always respected and serves as a way to prioritize rules between each other. This the 3rd iteration of this submission, but since it's now a series, I reset the revision numbering. This series implements that in a limited configuration for now, since we limit the total number of rules per port to 4. The main factors for this limitation are that : - We share the classification tables between all ports (4 max, although one is only used for internal loopback), hence we have to perform a logical separation between rules, which is done today by dedicated ranges for each port in each table - The "Flow table", which dictates which lookups operations are performed for an ingress packet, in subdivided into 22 "sub flows", each corresponding to a traffic type based on the L3 proto, L4 proto, the presence or not of a VLAN tag and the L3 fragmentation. This makes so that when adding a rule, it has to be added into each of these subflows, introducing duplications of entries and limiting our max number of entries. These limitations can be overcomed in several ways, but for readability sake, I'd rather submit basic classification offload support for now, and improve it gradually. This series also adds a small cosmetic cleanup patch (1), and also adds support for the "Drop" action compared to the first submission of this feature. It is simple enough to be added with this basic support. Compared to the first submissions, the NETIF_F_NTUPLE flag was also removed, following Saeed's comment. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/marvell/mvpp2/mvpp2.h42
-rw-r--r--drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c497
-rw-r--r--drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.h70
-rw-r--r--drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c20
4 files changed, 545 insertions, 84 deletions
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
index 67cce2736806..6171270a016c 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
@@ -14,6 +14,7 @@
14#include <linux/netdevice.h> 14#include <linux/netdevice.h>
15#include <linux/phy.h> 15#include <linux/phy.h>
16#include <linux/phylink.h> 16#include <linux/phylink.h>
17#include <net/flow_offload.h>
17 18
18/* Fifo Registers */ 19/* Fifo Registers */
19#define MVPP2_RX_DATA_FIFO_SIZE_REG(port) (0x00 + 4 * (port)) 20#define MVPP2_RX_DATA_FIFO_SIZE_REG(port) (0x00 + 4 * (port))
@@ -126,6 +127,7 @@
126#define MVPP22_CLS_C2_TCAM_DATA4 0x1b20 127#define MVPP22_CLS_C2_TCAM_DATA4 0x1b20
127#define MVPP22_CLS_C2_LU_TYPE(lu) ((lu) & 0x3f) 128#define MVPP22_CLS_C2_LU_TYPE(lu) ((lu) & 0x3f)
128#define MVPP22_CLS_C2_PORT_ID(port) ((port) << 8) 129#define MVPP22_CLS_C2_PORT_ID(port) ((port) << 8)
130#define MVPP22_CLS_C2_PORT_MASK (0xff << 8)
129#define MVPP22_CLS_C2_TCAM_INV 0x1b24 131#define MVPP22_CLS_C2_TCAM_INV 0x1b24
130#define MVPP22_CLS_C2_TCAM_INV_BIT BIT(31) 132#define MVPP22_CLS_C2_TCAM_INV_BIT BIT(31)
131#define MVPP22_CLS_C2_HIT_CTR 0x1b50 133#define MVPP22_CLS_C2_HIT_CTR 0x1b50
@@ -134,6 +136,7 @@
134#define MVPP22_CLS_C2_ACT_FWD(act) (((act) & 0x7) << 13) 136#define MVPP22_CLS_C2_ACT_FWD(act) (((act) & 0x7) << 13)
135#define MVPP22_CLS_C2_ACT_QHIGH(act) (((act) & 0x3) << 11) 137#define MVPP22_CLS_C2_ACT_QHIGH(act) (((act) & 0x3) << 11)
136#define MVPP22_CLS_C2_ACT_QLOW(act) (((act) & 0x3) << 9) 138#define MVPP22_CLS_C2_ACT_QLOW(act) (((act) & 0x3) << 9)
139#define MVPP22_CLS_C2_ACT_COLOR(act) ((act) & 0x7)
137#define MVPP22_CLS_C2_ATTR0 0x1b64 140#define MVPP22_CLS_C2_ATTR0 0x1b64
138#define MVPP22_CLS_C2_ATTR0_QHIGH(qh) (((qh) & 0x1f) << 24) 141#define MVPP22_CLS_C2_ATTR0_QHIGH(qh) (((qh) & 0x1f) << 24)
139#define MVPP22_CLS_C2_ATTR0_QHIGH_MASK 0x1f 142#define MVPP22_CLS_C2_ATTR0_QHIGH_MASK 0x1f
@@ -615,6 +618,10 @@
615#define MVPP2_BIT_IN_WORD(bit) ((bit) % 32) 618#define MVPP2_BIT_IN_WORD(bit) ((bit) % 32)
616 619
617#define MVPP2_N_PRS_FLOWS 52 620#define MVPP2_N_PRS_FLOWS 52
621#define MVPP2_N_RFS_ENTRIES_PER_FLOW 4
622
623/* There are 7 supported high-level flows */
624#define MVPP2_N_RFS_RULES (MVPP2_N_RFS_ENTRIES_PER_FLOW * 7)
618 625
619/* RSS constants */ 626/* RSS constants */
620#define MVPP22_RSS_TABLE_ENTRIES 32 627#define MVPP22_RSS_TABLE_ENTRIES 32
@@ -812,6 +819,37 @@ struct mvpp2_queue_vector {
812 struct cpumask *mask; 819 struct cpumask *mask;
813}; 820};
814 821
822/* Internal represention of a Flow Steering rule */
823struct mvpp2_rfs_rule {
824 /* Rule location inside the flow*/
825 int loc;
826
827 /* Flow type, such as TCP_V4_FLOW, IP6_FLOW, etc. */
828 int flow_type;
829
830 /* Index of the C2 TCAM entry handling this rule */
831 int c2_index;
832
833 /* Header fields that needs to be extracted to match this flow */
834 u16 hek_fields;
835
836 /* CLS engine : only c2 is supported for now. */
837 u8 engine;
838
839 /* TCAM key and mask for C2-based steering. These fields should be
840 * encapsulated in a union should we add more engines.
841 */
842 u64 c2_tcam;
843 u64 c2_tcam_mask;
844
845 struct flow_rule *flow;
846};
847
848struct mvpp2_ethtool_fs {
849 struct mvpp2_rfs_rule rule;
850 struct ethtool_rxnfc rxnfc;
851};
852
815struct mvpp2_port { 853struct mvpp2_port {
816 u8 id; 854 u8 id;
817 855
@@ -883,6 +921,10 @@ struct mvpp2_port {
883 921
884 /* RSS indirection table */ 922 /* RSS indirection table */
885 u32 indir[MVPP22_RSS_TABLE_ENTRIES]; 923 u32 indir[MVPP22_RSS_TABLE_ENTRIES];
924
925 /* List of steering rules active on that port */
926 struct mvpp2_ethtool_fs *rfs_rules[MVPP2_N_RFS_RULES];
927 int n_rfs_rules;
886}; 928};
887 929
888/* The mvpp2_tx_desc and mvpp2_rx_desc structures describe the 930/* The mvpp2_tx_desc and mvpp2_rx_desc structures describe the
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
index 1087974d3b98..4989fb13244f 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
@@ -24,300 +24,300 @@
24 24
25static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = { 25static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
26 /* TCP over IPv4 flows, Not fragmented, no vlan tag */ 26 /* TCP over IPv4 flows, Not fragmented, no vlan tag */
27 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_NF_UNTAG, 27 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_NF_UNTAG,
28 MVPP22_CLS_HEK_IP4_5T, 28 MVPP22_CLS_HEK_IP4_5T,
29 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4 | 29 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4 |
30 MVPP2_PRS_RI_L4_TCP, 30 MVPP2_PRS_RI_L4_TCP,
31 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 31 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
32 32
33 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_NF_UNTAG, 33 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_NF_UNTAG,
34 MVPP22_CLS_HEK_IP4_5T, 34 MVPP22_CLS_HEK_IP4_5T,
35 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT | 35 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT |
36 MVPP2_PRS_RI_L4_TCP, 36 MVPP2_PRS_RI_L4_TCP,
37 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 37 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
38 38
39 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_NF_UNTAG, 39 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_NF_UNTAG,
40 MVPP22_CLS_HEK_IP4_5T, 40 MVPP22_CLS_HEK_IP4_5T,
41 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER | 41 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER |
42 MVPP2_PRS_RI_L4_TCP, 42 MVPP2_PRS_RI_L4_TCP,
43 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 43 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
44 44
45 /* TCP over IPv4 flows, Not fragmented, with vlan tag */ 45 /* TCP over IPv4 flows, Not fragmented, with vlan tag */
46 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_NF_TAG, 46 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_NF_TAG,
47 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN, 47 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
48 MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_TCP, 48 MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_TCP,
49 MVPP2_PRS_IP_MASK), 49 MVPP2_PRS_IP_MASK),
50 50
51 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_NF_TAG, 51 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_NF_TAG,
52 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN, 52 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
53 MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_TCP, 53 MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_TCP,
54 MVPP2_PRS_IP_MASK), 54 MVPP2_PRS_IP_MASK),
55 55
56 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_NF_TAG, 56 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_NF_TAG,
57 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN, 57 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
58 MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_TCP, 58 MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_TCP,
59 MVPP2_PRS_IP_MASK), 59 MVPP2_PRS_IP_MASK),
60 60
61 /* TCP over IPv4 flows, fragmented, no vlan tag */ 61 /* TCP over IPv4 flows, fragmented, no vlan tag */
62 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_FRAG_UNTAG, 62 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_UNTAG,
63 MVPP22_CLS_HEK_IP4_2T, 63 MVPP22_CLS_HEK_IP4_2T,
64 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4 | 64 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4 |
65 MVPP2_PRS_RI_L4_TCP, 65 MVPP2_PRS_RI_L4_TCP,
66 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 66 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
67 67
68 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_FRAG_UNTAG, 68 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_UNTAG,
69 MVPP22_CLS_HEK_IP4_2T, 69 MVPP22_CLS_HEK_IP4_2T,
70 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT | 70 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT |
71 MVPP2_PRS_RI_L4_TCP, 71 MVPP2_PRS_RI_L4_TCP,
72 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 72 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
73 73
74 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_FRAG_UNTAG, 74 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_UNTAG,
75 MVPP22_CLS_HEK_IP4_2T, 75 MVPP22_CLS_HEK_IP4_2T,
76 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER | 76 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER |
77 MVPP2_PRS_RI_L4_TCP, 77 MVPP2_PRS_RI_L4_TCP,
78 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 78 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
79 79
80 /* TCP over IPv4 flows, fragmented, with vlan tag */ 80 /* TCP over IPv4 flows, fragmented, with vlan tag */
81 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_FRAG_TAG, 81 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_TAG,
82 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN, 82 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
83 MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_TCP, 83 MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_TCP,
84 MVPP2_PRS_IP_MASK), 84 MVPP2_PRS_IP_MASK),
85 85
86 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_FRAG_TAG, 86 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_TAG,
87 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN, 87 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
88 MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_TCP, 88 MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_TCP,
89 MVPP2_PRS_IP_MASK), 89 MVPP2_PRS_IP_MASK),
90 90
91 MVPP2_DEF_FLOW(TCP_V4_FLOW, MVPP2_FL_IP4_TCP_FRAG_TAG, 91 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_TAG,
92 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN, 92 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
93 MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_TCP, 93 MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_TCP,
94 MVPP2_PRS_IP_MASK), 94 MVPP2_PRS_IP_MASK),
95 95
96 /* UDP over IPv4 flows, Not fragmented, no vlan tag */ 96 /* UDP over IPv4 flows, Not fragmented, no vlan tag */
97 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_NF_UNTAG, 97 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_NF_UNTAG,
98 MVPP22_CLS_HEK_IP4_5T, 98 MVPP22_CLS_HEK_IP4_5T,
99 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4 | 99 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4 |
100 MVPP2_PRS_RI_L4_UDP, 100 MVPP2_PRS_RI_L4_UDP,
101 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 101 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
102 102
103 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_NF_UNTAG, 103 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_NF_UNTAG,
104 MVPP22_CLS_HEK_IP4_5T, 104 MVPP22_CLS_HEK_IP4_5T,
105 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT | 105 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT |
106 MVPP2_PRS_RI_L4_UDP, 106 MVPP2_PRS_RI_L4_UDP,
107 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 107 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
108 108
109 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_NF_UNTAG, 109 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_NF_UNTAG,
110 MVPP22_CLS_HEK_IP4_5T, 110 MVPP22_CLS_HEK_IP4_5T,
111 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER | 111 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER |
112 MVPP2_PRS_RI_L4_UDP, 112 MVPP2_PRS_RI_L4_UDP,
113 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 113 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
114 114
115 /* UDP over IPv4 flows, Not fragmented, with vlan tag */ 115 /* UDP over IPv4 flows, Not fragmented, with vlan tag */
116 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_NF_TAG, 116 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_NF_TAG,
117 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN, 117 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
118 MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_UDP, 118 MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_UDP,
119 MVPP2_PRS_IP_MASK), 119 MVPP2_PRS_IP_MASK),
120 120
121 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_NF_TAG, 121 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_NF_TAG,
122 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN, 122 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
123 MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_UDP, 123 MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_UDP,
124 MVPP2_PRS_IP_MASK), 124 MVPP2_PRS_IP_MASK),
125 125
126 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_NF_TAG, 126 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_NF_TAG,
127 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN, 127 MVPP22_CLS_HEK_IP4_5T | MVPP22_CLS_HEK_OPT_VLAN,
128 MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_UDP, 128 MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_UDP,
129 MVPP2_PRS_IP_MASK), 129 MVPP2_PRS_IP_MASK),
130 130
131 /* UDP over IPv4 flows, fragmented, no vlan tag */ 131 /* UDP over IPv4 flows, fragmented, no vlan tag */
132 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_FRAG_UNTAG, 132 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_UNTAG,
133 MVPP22_CLS_HEK_IP4_2T, 133 MVPP22_CLS_HEK_IP4_2T,
134 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4 | 134 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4 |
135 MVPP2_PRS_RI_L4_UDP, 135 MVPP2_PRS_RI_L4_UDP,
136 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 136 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
137 137
138 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_FRAG_UNTAG, 138 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_UNTAG,
139 MVPP22_CLS_HEK_IP4_2T, 139 MVPP22_CLS_HEK_IP4_2T,
140 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT | 140 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT |
141 MVPP2_PRS_RI_L4_UDP, 141 MVPP2_PRS_RI_L4_UDP,
142 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 142 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
143 143
144 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_FRAG_UNTAG, 144 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_UNTAG,
145 MVPP22_CLS_HEK_IP4_2T, 145 MVPP22_CLS_HEK_IP4_2T,
146 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER | 146 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER |
147 MVPP2_PRS_RI_L4_UDP, 147 MVPP2_PRS_RI_L4_UDP,
148 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 148 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
149 149
150 /* UDP over IPv4 flows, fragmented, with vlan tag */ 150 /* UDP over IPv4 flows, fragmented, with vlan tag */
151 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_FRAG_TAG, 151 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_TAG,
152 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN, 152 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
153 MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_UDP, 153 MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_UDP,
154 MVPP2_PRS_IP_MASK), 154 MVPP2_PRS_IP_MASK),
155 155
156 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_FRAG_TAG, 156 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_TAG,
157 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN, 157 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
158 MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_UDP, 158 MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_UDP,
159 MVPP2_PRS_IP_MASK), 159 MVPP2_PRS_IP_MASK),
160 160
161 MVPP2_DEF_FLOW(UDP_V4_FLOW, MVPP2_FL_IP4_UDP_FRAG_TAG, 161 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_TAG,
162 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN, 162 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
163 MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_UDP, 163 MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_UDP,
164 MVPP2_PRS_IP_MASK), 164 MVPP2_PRS_IP_MASK),
165 165
166 /* TCP over IPv6 flows, not fragmented, no vlan tag */ 166 /* TCP over IPv6 flows, not fragmented, no vlan tag */
167 MVPP2_DEF_FLOW(TCP_V6_FLOW, MVPP2_FL_IP6_TCP_NF_UNTAG, 167 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_NF_UNTAG,
168 MVPP22_CLS_HEK_IP6_5T, 168 MVPP22_CLS_HEK_IP6_5T,
169 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6 | 169 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6 |
170 MVPP2_PRS_RI_L4_TCP, 170 MVPP2_PRS_RI_L4_TCP,
171 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 171 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
172 172
173 MVPP2_DEF_FLOW(TCP_V6_FLOW, MVPP2_FL_IP6_TCP_NF_UNTAG, 173 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_NF_UNTAG,
174 MVPP22_CLS_HEK_IP6_5T, 174 MVPP22_CLS_HEK_IP6_5T,
175 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6_EXT | 175 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6_EXT |
176 MVPP2_PRS_RI_L4_TCP, 176 MVPP2_PRS_RI_L4_TCP,
177 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 177 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
178 178
179 /* TCP over IPv6 flows, not fragmented, with vlan tag */ 179 /* TCP over IPv6 flows, not fragmented, with vlan tag */
180 MVPP2_DEF_FLOW(TCP_V6_FLOW, MVPP2_FL_IP6_TCP_NF_TAG, 180 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_NF_TAG,
181 MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN, 181 MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN,
182 MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_L4_TCP, 182 MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_L4_TCP,
183 MVPP2_PRS_IP_MASK), 183 MVPP2_PRS_IP_MASK),
184 184
185 MVPP2_DEF_FLOW(TCP_V6_FLOW, MVPP2_FL_IP6_TCP_NF_TAG, 185 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_NF_TAG,
186 MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN, 186 MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN,
187 MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_L4_TCP, 187 MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_L4_TCP,
188 MVPP2_PRS_IP_MASK), 188 MVPP2_PRS_IP_MASK),
189 189
190 /* TCP over IPv6 flows, fragmented, no vlan tag */ 190 /* TCP over IPv6 flows, fragmented, no vlan tag */
191 MVPP2_DEF_FLOW(TCP_V6_FLOW, MVPP2_FL_IP6_TCP_FRAG_UNTAG, 191 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_FRAG_UNTAG,
192 MVPP22_CLS_HEK_IP6_2T, 192 MVPP22_CLS_HEK_IP6_2T,
193 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6 | 193 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6 |
194 MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_TCP, 194 MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_TCP,
195 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 195 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
196 196
197 MVPP2_DEF_FLOW(TCP_V6_FLOW, MVPP2_FL_IP6_TCP_FRAG_UNTAG, 197 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_FRAG_UNTAG,
198 MVPP22_CLS_HEK_IP6_2T, 198 MVPP22_CLS_HEK_IP6_2T,
199 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6_EXT | 199 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6_EXT |
200 MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_TCP, 200 MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_TCP,
201 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 201 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
202 202
203 /* TCP over IPv6 flows, fragmented, with vlan tag */ 203 /* TCP over IPv6 flows, fragmented, with vlan tag */
204 MVPP2_DEF_FLOW(TCP_V6_FLOW, MVPP2_FL_IP6_TCP_FRAG_TAG, 204 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_FRAG_TAG,
205 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN, 205 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
206 MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_IP_FRAG_TRUE | 206 MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_IP_FRAG_TRUE |
207 MVPP2_PRS_RI_L4_TCP, 207 MVPP2_PRS_RI_L4_TCP,
208 MVPP2_PRS_IP_MASK), 208 MVPP2_PRS_IP_MASK),
209 209
210 MVPP2_DEF_FLOW(TCP_V6_FLOW, MVPP2_FL_IP6_TCP_FRAG_TAG, 210 MVPP2_DEF_FLOW(MVPP22_FLOW_TCP6, MVPP2_FL_IP6_TCP_FRAG_TAG,
211 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN, 211 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
212 MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_IP_FRAG_TRUE | 212 MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_IP_FRAG_TRUE |
213 MVPP2_PRS_RI_L4_TCP, 213 MVPP2_PRS_RI_L4_TCP,
214 MVPP2_PRS_IP_MASK), 214 MVPP2_PRS_IP_MASK),
215 215
216 /* UDP over IPv6 flows, not fragmented, no vlan tag */ 216 /* UDP over IPv6 flows, not fragmented, no vlan tag */
217 MVPP2_DEF_FLOW(UDP_V6_FLOW, MVPP2_FL_IP6_UDP_NF_UNTAG, 217 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_NF_UNTAG,
218 MVPP22_CLS_HEK_IP6_5T, 218 MVPP22_CLS_HEK_IP6_5T,
219 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6 | 219 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6 |
220 MVPP2_PRS_RI_L4_UDP, 220 MVPP2_PRS_RI_L4_UDP,
221 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 221 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
222 222
223 MVPP2_DEF_FLOW(UDP_V6_FLOW, MVPP2_FL_IP6_UDP_NF_UNTAG, 223 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_NF_UNTAG,
224 MVPP22_CLS_HEK_IP6_5T, 224 MVPP22_CLS_HEK_IP6_5T,
225 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6_EXT | 225 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6_EXT |
226 MVPP2_PRS_RI_L4_UDP, 226 MVPP2_PRS_RI_L4_UDP,
227 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 227 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
228 228
229 /* UDP over IPv6 flows, not fragmented, with vlan tag */ 229 /* UDP over IPv6 flows, not fragmented, with vlan tag */
230 MVPP2_DEF_FLOW(UDP_V6_FLOW, MVPP2_FL_IP6_UDP_NF_TAG, 230 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_NF_TAG,
231 MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN, 231 MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN,
232 MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_L4_UDP, 232 MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_L4_UDP,
233 MVPP2_PRS_IP_MASK), 233 MVPP2_PRS_IP_MASK),
234 234
235 MVPP2_DEF_FLOW(UDP_V6_FLOW, MVPP2_FL_IP6_UDP_NF_TAG, 235 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_NF_TAG,
236 MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN, 236 MVPP22_CLS_HEK_IP6_5T | MVPP22_CLS_HEK_OPT_VLAN,
237 MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_L4_UDP, 237 MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_L4_UDP,
238 MVPP2_PRS_IP_MASK), 238 MVPP2_PRS_IP_MASK),
239 239
240 /* UDP over IPv6 flows, fragmented, no vlan tag */ 240 /* UDP over IPv6 flows, fragmented, no vlan tag */
241 MVPP2_DEF_FLOW(UDP_V6_FLOW, MVPP2_FL_IP6_UDP_FRAG_UNTAG, 241 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_FRAG_UNTAG,
242 MVPP22_CLS_HEK_IP6_2T, 242 MVPP22_CLS_HEK_IP6_2T,
243 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6 | 243 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6 |
244 MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_UDP, 244 MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_UDP,
245 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 245 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
246 246
247 MVPP2_DEF_FLOW(UDP_V6_FLOW, MVPP2_FL_IP6_UDP_FRAG_UNTAG, 247 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_FRAG_UNTAG,
248 MVPP22_CLS_HEK_IP6_2T, 248 MVPP22_CLS_HEK_IP6_2T,
249 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6_EXT | 249 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6_EXT |
250 MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_UDP, 250 MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_UDP,
251 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK), 251 MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
252 252
253 /* UDP over IPv6 flows, fragmented, with vlan tag */ 253 /* UDP over IPv6 flows, fragmented, with vlan tag */
254 MVPP2_DEF_FLOW(UDP_V6_FLOW, MVPP2_FL_IP6_UDP_FRAG_TAG, 254 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_FRAG_TAG,
255 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN, 255 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
256 MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_IP_FRAG_TRUE | 256 MVPP2_PRS_RI_L3_IP6 | MVPP2_PRS_RI_IP_FRAG_TRUE |
257 MVPP2_PRS_RI_L4_UDP, 257 MVPP2_PRS_RI_L4_UDP,
258 MVPP2_PRS_IP_MASK), 258 MVPP2_PRS_IP_MASK),
259 259
260 MVPP2_DEF_FLOW(UDP_V6_FLOW, MVPP2_FL_IP6_UDP_FRAG_TAG, 260 MVPP2_DEF_FLOW(MVPP22_FLOW_UDP6, MVPP2_FL_IP6_UDP_FRAG_TAG,
261 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN, 261 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
262 MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_IP_FRAG_TRUE | 262 MVPP2_PRS_RI_L3_IP6_EXT | MVPP2_PRS_RI_IP_FRAG_TRUE |
263 MVPP2_PRS_RI_L4_UDP, 263 MVPP2_PRS_RI_L4_UDP,
264 MVPP2_PRS_IP_MASK), 264 MVPP2_PRS_IP_MASK),
265 265
266 /* IPv4 flows, no vlan tag */ 266 /* IPv4 flows, no vlan tag */
267 MVPP2_DEF_FLOW(IPV4_FLOW, MVPP2_FL_IP4_UNTAG, 267 MVPP2_DEF_FLOW(MVPP22_FLOW_IP4, MVPP2_FL_IP4_UNTAG,
268 MVPP22_CLS_HEK_IP4_2T, 268 MVPP22_CLS_HEK_IP4_2T,
269 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4, 269 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4,
270 MVPP2_PRS_RI_VLAN_MASK | MVPP2_PRS_RI_L3_PROTO_MASK), 270 MVPP2_PRS_RI_VLAN_MASK | MVPP2_PRS_RI_L3_PROTO_MASK),
271 MVPP2_DEF_FLOW(IPV4_FLOW, MVPP2_FL_IP4_UNTAG, 271 MVPP2_DEF_FLOW(MVPP22_FLOW_IP4, MVPP2_FL_IP4_UNTAG,
272 MVPP22_CLS_HEK_IP4_2T, 272 MVPP22_CLS_HEK_IP4_2T,
273 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT, 273 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT,
274 MVPP2_PRS_RI_VLAN_MASK | MVPP2_PRS_RI_L3_PROTO_MASK), 274 MVPP2_PRS_RI_VLAN_MASK | MVPP2_PRS_RI_L3_PROTO_MASK),
275 MVPP2_DEF_FLOW(IPV4_FLOW, MVPP2_FL_IP4_UNTAG, 275 MVPP2_DEF_FLOW(MVPP22_FLOW_IP4, MVPP2_FL_IP4_UNTAG,
276 MVPP22_CLS_HEK_IP4_2T, 276 MVPP22_CLS_HEK_IP4_2T,
277 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER, 277 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER,
278 MVPP2_PRS_RI_VLAN_MASK | MVPP2_PRS_RI_L3_PROTO_MASK), 278 MVPP2_PRS_RI_VLAN_MASK | MVPP2_PRS_RI_L3_PROTO_MASK),
279 279
280 /* IPv4 flows, with vlan tag */ 280 /* IPv4 flows, with vlan tag */
281 MVPP2_DEF_FLOW(IPV4_FLOW, MVPP2_FL_IP4_TAG, 281 MVPP2_DEF_FLOW(MVPP22_FLOW_IP4, MVPP2_FL_IP4_TAG,
282 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN, 282 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
283 MVPP2_PRS_RI_L3_IP4, 283 MVPP2_PRS_RI_L3_IP4,
284 MVPP2_PRS_RI_L3_PROTO_MASK), 284 MVPP2_PRS_RI_L3_PROTO_MASK),
285 MVPP2_DEF_FLOW(IPV4_FLOW, MVPP2_FL_IP4_TAG, 285 MVPP2_DEF_FLOW(MVPP22_FLOW_IP4, MVPP2_FL_IP4_TAG,
286 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN, 286 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
287 MVPP2_PRS_RI_L3_IP4_OPT, 287 MVPP2_PRS_RI_L3_IP4_OPT,
288 MVPP2_PRS_RI_L3_PROTO_MASK), 288 MVPP2_PRS_RI_L3_PROTO_MASK),
289 MVPP2_DEF_FLOW(IPV4_FLOW, MVPP2_FL_IP4_TAG, 289 MVPP2_DEF_FLOW(MVPP22_FLOW_IP4, MVPP2_FL_IP4_TAG,
290 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN, 290 MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_OPT_VLAN,
291 MVPP2_PRS_RI_L3_IP4_OTHER, 291 MVPP2_PRS_RI_L3_IP4_OTHER,
292 MVPP2_PRS_RI_L3_PROTO_MASK), 292 MVPP2_PRS_RI_L3_PROTO_MASK),
293 293
294 /* IPv6 flows, no vlan tag */ 294 /* IPv6 flows, no vlan tag */
295 MVPP2_DEF_FLOW(IPV6_FLOW, MVPP2_FL_IP6_UNTAG, 295 MVPP2_DEF_FLOW(MVPP22_FLOW_IP6, MVPP2_FL_IP6_UNTAG,
296 MVPP22_CLS_HEK_IP6_2T, 296 MVPP22_CLS_HEK_IP6_2T,
297 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6, 297 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6,
298 MVPP2_PRS_RI_VLAN_MASK | MVPP2_PRS_RI_L3_PROTO_MASK), 298 MVPP2_PRS_RI_VLAN_MASK | MVPP2_PRS_RI_L3_PROTO_MASK),
299 MVPP2_DEF_FLOW(IPV6_FLOW, MVPP2_FL_IP6_UNTAG, 299 MVPP2_DEF_FLOW(MVPP22_FLOW_IP6, MVPP2_FL_IP6_UNTAG,
300 MVPP22_CLS_HEK_IP6_2T, 300 MVPP22_CLS_HEK_IP6_2T,
301 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6, 301 MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP6,
302 MVPP2_PRS_RI_VLAN_MASK | MVPP2_PRS_RI_L3_PROTO_MASK), 302 MVPP2_PRS_RI_VLAN_MASK | MVPP2_PRS_RI_L3_PROTO_MASK),
303 303
304 /* IPv6 flows, with vlan tag */ 304 /* IPv6 flows, with vlan tag */
305 MVPP2_DEF_FLOW(IPV6_FLOW, MVPP2_FL_IP6_TAG, 305 MVPP2_DEF_FLOW(MVPP22_FLOW_IP6, MVPP2_FL_IP6_TAG,
306 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN, 306 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
307 MVPP2_PRS_RI_L3_IP6, 307 MVPP2_PRS_RI_L3_IP6,
308 MVPP2_PRS_RI_L3_PROTO_MASK), 308 MVPP2_PRS_RI_L3_PROTO_MASK),
309 MVPP2_DEF_FLOW(IPV6_FLOW, MVPP2_FL_IP6_TAG, 309 MVPP2_DEF_FLOW(MVPP22_FLOW_IP6, MVPP2_FL_IP6_TAG,
310 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN, 310 MVPP22_CLS_HEK_IP6_2T | MVPP22_CLS_HEK_OPT_VLAN,
311 MVPP2_PRS_RI_L3_IP6, 311 MVPP2_PRS_RI_L3_IP6,
312 MVPP2_PRS_RI_L3_PROTO_MASK), 312 MVPP2_PRS_RI_L3_PROTO_MASK),
313 313
314 /* Non IP flow, no vlan tag */ 314 /* Non IP flow, no vlan tag */
315 MVPP2_DEF_FLOW(ETHER_FLOW, MVPP2_FL_NON_IP_UNTAG, 315 MVPP2_DEF_FLOW(MVPP22_FLOW_ETHERNET, MVPP2_FL_NON_IP_UNTAG,
316 0, 316 0,
317 MVPP2_PRS_RI_VLAN_NONE, 317 MVPP2_PRS_RI_VLAN_NONE,
318 MVPP2_PRS_RI_VLAN_MASK), 318 MVPP2_PRS_RI_VLAN_MASK),
319 /* Non IP flow, with vlan tag */ 319 /* Non IP flow, with vlan tag */
320 MVPP2_DEF_FLOW(ETHER_FLOW, MVPP2_FL_NON_IP_TAG, 320 MVPP2_DEF_FLOW(MVPP22_FLOW_ETHERNET, MVPP2_FL_NON_IP_TAG,
321 MVPP22_CLS_HEK_OPT_VLAN, 321 MVPP22_CLS_HEK_OPT_VLAN,
322 0, 0), 322 0, 0),
323}; 323};
@@ -344,9 +344,9 @@ static void mvpp2_cls_flow_write(struct mvpp2 *priv,
344 struct mvpp2_cls_flow_entry *fe) 344 struct mvpp2_cls_flow_entry *fe)
345{ 345{
346 mvpp2_write(priv, MVPP2_CLS_FLOW_INDEX_REG, fe->index); 346 mvpp2_write(priv, MVPP2_CLS_FLOW_INDEX_REG, fe->index);
347 mvpp2_write(priv, MVPP2_CLS_FLOW_TBL0_REG, fe->data[0]); 347 mvpp2_write(priv, MVPP2_CLS_FLOW_TBL0_REG, fe->data[0]);
348 mvpp2_write(priv, MVPP2_CLS_FLOW_TBL1_REG, fe->data[1]); 348 mvpp2_write(priv, MVPP2_CLS_FLOW_TBL1_REG, fe->data[1]);
349 mvpp2_write(priv, MVPP2_CLS_FLOW_TBL2_REG, fe->data[2]); 349 mvpp2_write(priv, MVPP2_CLS_FLOW_TBL2_REG, fe->data[2]);
350} 350}
351 351
352u32 mvpp2_cls_lookup_hits(struct mvpp2 *priv, int index) 352u32 mvpp2_cls_lookup_hits(struct mvpp2 *priv, int index)
@@ -448,6 +448,12 @@ static void mvpp2_cls_flow_port_add(struct mvpp2_cls_flow_entry *fe,
448 fe->data[0] |= MVPP2_CLS_FLOW_TBL0_PORT_ID(port); 448 fe->data[0] |= MVPP2_CLS_FLOW_TBL0_PORT_ID(port);
449} 449}
450 450
451static void mvpp2_cls_flow_port_remove(struct mvpp2_cls_flow_entry *fe,
452 u32 port)
453{
454 fe->data[0] &= ~MVPP2_CLS_FLOW_TBL0_PORT_ID(port);
455}
456
451static void mvpp2_cls_flow_lu_type_set(struct mvpp2_cls_flow_entry *fe, 457static void mvpp2_cls_flow_lu_type_set(struct mvpp2_cls_flow_entry *fe,
452 u8 lu_type) 458 u8 lu_type)
453{ 459{
@@ -539,6 +545,31 @@ void mvpp2_cls_c2_read(struct mvpp2 *priv, int index,
539 c2->valid = !(val & MVPP22_CLS_C2_TCAM_INV_BIT); 545 c2->valid = !(val & MVPP22_CLS_C2_TCAM_INV_BIT);
540} 546}
541 547
548static int mvpp2_cls_ethtool_flow_to_type(int flow_type)
549{
550 switch (flow_type & ~(FLOW_EXT | FLOW_MAC_EXT | FLOW_RSS)) {
551 case TCP_V4_FLOW:
552 return MVPP22_FLOW_TCP4;
553 case TCP_V6_FLOW:
554 return MVPP22_FLOW_TCP6;
555 case UDP_V4_FLOW:
556 return MVPP22_FLOW_UDP4;
557 case UDP_V6_FLOW:
558 return MVPP22_FLOW_UDP6;
559 case IPV4_FLOW:
560 return MVPP22_FLOW_IP4;
561 case IPV6_FLOW:
562 return MVPP22_FLOW_IP6;
563 default:
564 return -EOPNOTSUPP;
565 }
566}
567
568static int mvpp2_cls_c2_port_flow_index(struct mvpp2_port *port, int loc)
569{
570 return MVPP22_CLS_C2_RFS_LOC(port->id, loc);
571}
572
542/* Initialize the flow table entries for the given flow */ 573/* Initialize the flow table entries for the given flow */
543static void mvpp2_cls_flow_init(struct mvpp2 *priv, 574static void mvpp2_cls_flow_init(struct mvpp2 *priv,
544 const struct mvpp2_cls_flow *flow) 575 const struct mvpp2_cls_flow *flow)
@@ -565,7 +596,7 @@ static void mvpp2_cls_flow_init(struct mvpp2 *priv,
565 596
566 mvpp2_cls_flow_eng_set(&fe, MVPP22_CLS_ENGINE_C2); 597 mvpp2_cls_flow_eng_set(&fe, MVPP22_CLS_ENGINE_C2);
567 mvpp2_cls_flow_port_id_sel(&fe, true); 598 mvpp2_cls_flow_port_id_sel(&fe, true);
568 mvpp2_cls_flow_lu_type_set(&fe, MVPP2_CLS_LU_ALL); 599 mvpp2_cls_flow_lu_type_set(&fe, MVPP22_FLOW_ETHERNET);
569 600
570 /* Add all ports */ 601 /* Add all ports */
571 for (i = 0; i < MVPP2_MAX_PORTS; i++) 602 for (i = 0; i < MVPP2_MAX_PORTS; i++)
@@ -652,6 +683,26 @@ static int mvpp2_flow_set_hek_fields(struct mvpp2_cls_flow_entry *fe,
652 return 0; 683 return 0;
653} 684}
654 685
686/* Returns the size, in bits, of the corresponding HEK field */
687static int mvpp2_cls_hek_field_size(u32 field)
688{
689 switch (field) {
690 case MVPP22_CLS_HEK_OPT_MAC_DA:
691 return 48;
692 case MVPP22_CLS_HEK_OPT_IP4SA:
693 case MVPP22_CLS_HEK_OPT_IP4DA:
694 return 32;
695 case MVPP22_CLS_HEK_OPT_IP6SA:
696 case MVPP22_CLS_HEK_OPT_IP6DA:
697 return 128;
698 case MVPP22_CLS_HEK_OPT_L4SIP:
699 case MVPP22_CLS_HEK_OPT_L4DIP:
700 return 16;
701 default:
702 return -1;
703 }
704}
705
655const struct mvpp2_cls_flow *mvpp2_cls_flow_get(int flow) 706const struct mvpp2_cls_flow *mvpp2_cls_flow_get(int flow)
656{ 707{
657 if (flow >= MVPP2_N_PRS_FLOWS) 708 if (flow >= MVPP2_N_PRS_FLOWS)
@@ -810,7 +861,7 @@ static void mvpp2_port_c2_cls_init(struct mvpp2_port *port)
810 861
811 /* Match on Lookup Type */ 862 /* Match on Lookup Type */
812 c2.tcam[4] |= MVPP22_CLS_C2_TCAM_EN(MVPP22_CLS_C2_LU_TYPE(MVPP2_CLS_LU_TYPE_MASK)); 863 c2.tcam[4] |= MVPP22_CLS_C2_TCAM_EN(MVPP22_CLS_C2_LU_TYPE(MVPP2_CLS_LU_TYPE_MASK));
813 c2.tcam[4] |= MVPP22_CLS_C2_LU_TYPE(MVPP2_CLS_LU_ALL); 864 c2.tcam[4] |= MVPP22_CLS_C2_LU_TYPE(MVPP22_FLOW_ETHERNET);
814 865
815 /* Update RSS status after matching this entry */ 866 /* Update RSS status after matching this entry */
816 c2.act = MVPP22_CLS_C2_ACT_RSS_EN(MVPP22_C2_UPD_LOCK); 867 c2.act = MVPP22_CLS_C2_ACT_RSS_EN(MVPP22_C2_UPD_LOCK);
@@ -944,6 +995,18 @@ void mvpp22_port_rss_disable(struct mvpp2_port *port)
944 mvpp2_rss_port_c2_disable(port); 995 mvpp2_rss_port_c2_disable(port);
945} 996}
946 997
998static void mvpp22_port_c2_lookup_disable(struct mvpp2_port *port, int entry)
999{
1000 struct mvpp2_cls_c2_entry c2;
1001
1002 mvpp2_cls_c2_read(port->priv, entry, &c2);
1003
1004 /* Clear the port map so that the entry doesn't match anymore */
1005 c2.tcam[4] &= ~(MVPP22_CLS_C2_PORT_ID(BIT(port->id)));
1006
1007 mvpp2_cls_c2_write(port->priv, &c2);
1008}
1009
947/* Set CPU queue number for oversize packets */ 1010/* Set CPU queue number for oversize packets */
948void mvpp2_cls_oversize_rxq_set(struct mvpp2_port *port) 1011void mvpp2_cls_oversize_rxq_set(struct mvpp2_port *port)
949{ 1012{
@@ -960,6 +1023,290 @@ void mvpp2_cls_oversize_rxq_set(struct mvpp2_port *port)
960 mvpp2_write(port->priv, MVPP2_CLS_SWFWD_PCTRL_REG, val); 1023 mvpp2_write(port->priv, MVPP2_CLS_SWFWD_PCTRL_REG, val);
961} 1024}
962 1025
1026static int mvpp2_port_c2_tcam_rule_add(struct mvpp2_port *port,
1027 struct mvpp2_rfs_rule *rule)
1028{
1029 struct flow_action_entry *act;
1030 struct mvpp2_cls_c2_entry c2;
1031 u8 qh, ql, pmap;
1032
1033 memset(&c2, 0, sizeof(c2));
1034
1035 c2.index = mvpp2_cls_c2_port_flow_index(port, rule->loc);
1036 if (c2.index < 0)
1037 return -EINVAL;
1038
1039 act = &rule->flow->action.entries[0];
1040
1041 rule->c2_index = c2.index;
1042
1043 c2.tcam[0] = (rule->c2_tcam & 0xffff) |
1044 ((rule->c2_tcam_mask & 0xffff) << 16);
1045 c2.tcam[1] = ((rule->c2_tcam >> 16) & 0xffff) |
1046 (((rule->c2_tcam_mask >> 16) & 0xffff) << 16);
1047 c2.tcam[2] = ((rule->c2_tcam >> 32) & 0xffff) |
1048 (((rule->c2_tcam_mask >> 32) & 0xffff) << 16);
1049 c2.tcam[3] = ((rule->c2_tcam >> 48) & 0xffff) |
1050 (((rule->c2_tcam_mask >> 48) & 0xffff) << 16);
1051
1052 pmap = BIT(port->id);
1053 c2.tcam[4] = MVPP22_CLS_C2_PORT_ID(pmap);
1054 c2.tcam[4] |= MVPP22_CLS_C2_TCAM_EN(MVPP22_CLS_C2_PORT_ID(pmap));
1055
1056 /* Match on Lookup Type */
1057 c2.tcam[4] |= MVPP22_CLS_C2_TCAM_EN(MVPP22_CLS_C2_LU_TYPE(MVPP2_CLS_LU_TYPE_MASK));
1058 c2.tcam[4] |= MVPP22_CLS_C2_LU_TYPE(rule->loc);
1059
1060 if (act->id == FLOW_ACTION_DROP) {
1061 c2.act = MVPP22_CLS_C2_ACT_COLOR(MVPP22_C2_COL_RED_LOCK);
1062 } else {
1063 /* We want to keep the default color derived from the Header
1064 * Parser drop entries, for VLAN and MAC filtering. This will
1065 * assign a default color of Green or Red, and we want matches
1066 * with a non-drop action to keep that color.
1067 */
1068 c2.act = MVPP22_CLS_C2_ACT_COLOR(MVPP22_C2_COL_NO_UPD_LOCK);
1069
1070 /* Mark packet as "forwarded to software", needed for RSS */
1071 c2.act |= MVPP22_CLS_C2_ACT_FWD(MVPP22_C2_FWD_SW_LOCK);
1072
1073 c2.act |= MVPP22_CLS_C2_ACT_QHIGH(MVPP22_C2_UPD_LOCK) |
1074 MVPP22_CLS_C2_ACT_QLOW(MVPP22_C2_UPD_LOCK);
1075
1076 qh = ((act->queue.index + port->first_rxq) >> 3) & MVPP22_CLS_C2_ATTR0_QHIGH_MASK;
1077 ql = (act->queue.index + port->first_rxq) & MVPP22_CLS_C2_ATTR0_QLOW_MASK;
1078
1079 c2.attr[0] = MVPP22_CLS_C2_ATTR0_QHIGH(qh) |
1080 MVPP22_CLS_C2_ATTR0_QLOW(ql);
1081 }
1082
1083 c2.valid = true;
1084
1085 mvpp2_cls_c2_write(port->priv, &c2);
1086
1087 return 0;
1088}
1089
1090static int mvpp2_port_c2_rfs_rule_insert(struct mvpp2_port *port,
1091 struct mvpp2_rfs_rule *rule)
1092{
1093 return mvpp2_port_c2_tcam_rule_add(port, rule);
1094}
1095
1096static int mvpp2_port_cls_rfs_rule_remove(struct mvpp2_port *port,
1097 struct mvpp2_rfs_rule *rule)
1098{
1099 const struct mvpp2_cls_flow *flow;
1100 struct mvpp2_cls_flow_entry fe;
1101 int index, i;
1102
1103 for_each_cls_flow_id_containing_type(i, rule->flow_type) {
1104 flow = mvpp2_cls_flow_get(i);
1105 if (!flow)
1106 return 0;
1107
1108 index = MVPP2_CLS_FLT_C2_RFS(port->id, flow->flow_id, rule->loc);
1109
1110 mvpp2_cls_flow_read(port->priv, index, &fe);
1111 mvpp2_cls_flow_port_remove(&fe, BIT(port->id));
1112 mvpp2_cls_flow_write(port->priv, &fe);
1113 }
1114
1115 if (rule->c2_index >= 0)
1116 mvpp22_port_c2_lookup_disable(port, rule->c2_index);
1117
1118 return 0;
1119}
1120
1121static int mvpp2_port_flt_rfs_rule_insert(struct mvpp2_port *port,
1122 struct mvpp2_rfs_rule *rule)
1123{
1124 const struct mvpp2_cls_flow *flow;
1125 struct mvpp2 *priv = port->priv;
1126 struct mvpp2_cls_flow_entry fe;
1127 int index, ret, i;
1128
1129 if (rule->engine != MVPP22_CLS_ENGINE_C2)
1130 return -EOPNOTSUPP;
1131
1132 ret = mvpp2_port_c2_rfs_rule_insert(port, rule);
1133 if (ret)
1134 return ret;
1135
1136 for_each_cls_flow_id_containing_type(i, rule->flow_type) {
1137 flow = mvpp2_cls_flow_get(i);
1138 if (!flow)
1139 return 0;
1140
1141 index = MVPP2_CLS_FLT_C2_RFS(port->id, flow->flow_id, rule->loc);
1142
1143 mvpp2_cls_flow_read(priv, index, &fe);
1144 mvpp2_cls_flow_eng_set(&fe, rule->engine);
1145 mvpp2_cls_flow_port_id_sel(&fe, true);
1146 mvpp2_flow_set_hek_fields(&fe, rule->hek_fields);
1147 mvpp2_cls_flow_lu_type_set(&fe, rule->loc);
1148 mvpp2_cls_flow_port_add(&fe, 0xf);
1149
1150 mvpp2_cls_flow_write(priv, &fe);
1151 }
1152
1153 return 0;
1154}
1155
1156static int mvpp2_cls_c2_build_match(struct mvpp2_rfs_rule *rule)
1157{
1158 struct flow_rule *flow = rule->flow;
1159 struct flow_action_entry *act;
1160 int offs = 64;
1161
1162 act = &flow->action.entries[0];
1163
1164 if (flow_rule_match_key(flow, FLOW_DISSECTOR_KEY_PORTS)) {
1165 struct flow_match_ports match;
1166
1167 flow_rule_match_ports(flow, &match);
1168 if (match.mask->src) {
1169 rule->hek_fields |= MVPP22_CLS_HEK_OPT_L4SIP;
1170 offs -= mvpp2_cls_hek_field_size(MVPP22_CLS_HEK_OPT_L4SIP);
1171
1172 rule->c2_tcam |= ((u64)ntohs(match.key->src)) << offs;
1173 rule->c2_tcam_mask |= ((u64)ntohs(match.mask->src)) << offs;
1174 }
1175
1176 if (match.mask->dst) {
1177 rule->hek_fields |= MVPP22_CLS_HEK_OPT_L4DIP;
1178 offs -= mvpp2_cls_hek_field_size(MVPP22_CLS_HEK_OPT_L4DIP);
1179
1180 rule->c2_tcam |= ((u64)ntohs(match.key->dst)) << offs;
1181 rule->c2_tcam_mask |= ((u64)ntohs(match.mask->dst)) << offs;
1182 }
1183 }
1184
1185 if (hweight16(rule->hek_fields) > MVPP2_FLOW_N_FIELDS)
1186 return -EOPNOTSUPP;
1187
1188 return 0;
1189}
1190
1191static int mvpp2_cls_rfs_parse_rule(struct mvpp2_rfs_rule *rule)
1192{
1193 struct flow_rule *flow = rule->flow;
1194 struct flow_action_entry *act;
1195
1196 act = &flow->action.entries[0];
1197 if (act->id != FLOW_ACTION_QUEUE && act->id != FLOW_ACTION_DROP)
1198 return -EOPNOTSUPP;
1199
1200 /* For now, only use the C2 engine which has a HEK size limited to 64
1201 * bits for TCAM matching.
1202 */
1203 rule->engine = MVPP22_CLS_ENGINE_C2;
1204
1205 if (mvpp2_cls_c2_build_match(rule))
1206 return -EINVAL;
1207
1208 return 0;
1209}
1210
1211int mvpp2_ethtool_cls_rule_get(struct mvpp2_port *port,
1212 struct ethtool_rxnfc *rxnfc)
1213{
1214 struct mvpp2_ethtool_fs *efs;
1215
1216 if (rxnfc->fs.location >= MVPP2_N_RFS_RULES)
1217 return -EINVAL;
1218
1219 efs = port->rfs_rules[rxnfc->fs.location];
1220 if (!efs)
1221 return -ENOENT;
1222
1223 memcpy(rxnfc, &efs->rxnfc, sizeof(efs->rxnfc));
1224
1225 return 0;
1226}
1227
1228int mvpp2_ethtool_cls_rule_ins(struct mvpp2_port *port,
1229 struct ethtool_rxnfc *info)
1230{
1231 struct ethtool_rx_flow_spec_input input = {};
1232 struct ethtool_rx_flow_rule *ethtool_rule;
1233 struct mvpp2_ethtool_fs *efs, *old_efs;
1234 int ret = 0;
1235
1236 if (info->fs.location >= 4 ||
1237 info->fs.location < 0)
1238 return -EINVAL;
1239
1240 efs = kzalloc(sizeof(*efs), GFP_KERNEL);
1241 if (!efs)
1242 return -ENOMEM;
1243
1244 input.fs = &info->fs;
1245
1246 ethtool_rule = ethtool_rx_flow_rule_create(&input);
1247 if (IS_ERR(ethtool_rule)) {
1248 ret = PTR_ERR(ethtool_rule);
1249 goto clean_rule;
1250 }
1251
1252 efs->rule.flow = ethtool_rule->rule;
1253 efs->rule.flow_type = mvpp2_cls_ethtool_flow_to_type(info->fs.flow_type);
1254
1255 ret = mvpp2_cls_rfs_parse_rule(&efs->rule);
1256 if (ret)
1257 goto clean_eth_rule;
1258
1259 efs->rule.loc = info->fs.location;
1260
1261 /* Replace an already existing rule */
1262 if (port->rfs_rules[efs->rule.loc]) {
1263 old_efs = port->rfs_rules[efs->rule.loc];
1264 ret = mvpp2_port_cls_rfs_rule_remove(port, &old_efs->rule);
1265 if (ret)
1266 goto clean_eth_rule;
1267 kfree(old_efs);
1268 port->n_rfs_rules--;
1269 }
1270
1271 ret = mvpp2_port_flt_rfs_rule_insert(port, &efs->rule);
1272 if (ret)
1273 goto clean_eth_rule;
1274
1275 memcpy(&efs->rxnfc, info, sizeof(*info));
1276 port->rfs_rules[efs->rule.loc] = efs;
1277 port->n_rfs_rules++;
1278
1279 return ret;
1280
1281clean_eth_rule:
1282 ethtool_rx_flow_rule_destroy(ethtool_rule);
1283clean_rule:
1284 kfree(efs);
1285 return ret;
1286}
1287
1288int mvpp2_ethtool_cls_rule_del(struct mvpp2_port *port,
1289 struct ethtool_rxnfc *info)
1290{
1291 struct mvpp2_ethtool_fs *efs;
1292 int ret;
1293
1294 efs = port->rfs_rules[info->fs.location];
1295 if (!efs)
1296 return -EINVAL;
1297
1298 /* Remove the rule from the engines. */
1299 ret = mvpp2_port_cls_rfs_rule_remove(port, &efs->rule);
1300 if (ret)
1301 return ret;
1302
1303 port->n_rfs_rules--;
1304 port->rfs_rules[info->fs.location] = NULL;
1305 kfree(efs);
1306
1307 return 0;
1308}
1309
963static inline u32 mvpp22_rxfh_indir(struct mvpp2_port *port, u32 rxq) 1310static inline u32 mvpp22_rxfh_indir(struct mvpp2_port *port, u32 rxq)
964{ 1311{
965 int nrxqs, cpu, cpus = num_possible_cpus(); 1312 int nrxqs, cpu, cpus = num_possible_cpus();
@@ -997,19 +1344,22 @@ void mvpp22_rss_fill_table(struct mvpp2_port *port, u32 table)
997int mvpp2_ethtool_rxfh_set(struct mvpp2_port *port, struct ethtool_rxnfc *info) 1344int mvpp2_ethtool_rxfh_set(struct mvpp2_port *port, struct ethtool_rxnfc *info)
998{ 1345{
999 u16 hash_opts = 0; 1346 u16 hash_opts = 0;
1347 u32 flow_type;
1000 1348
1001 switch (info->flow_type) { 1349 flow_type = mvpp2_cls_ethtool_flow_to_type(info->flow_type);
1002 case TCP_V4_FLOW: 1350
1003 case UDP_V4_FLOW: 1351 switch (flow_type) {
1004 case TCP_V6_FLOW: 1352 case MVPP22_FLOW_TCP4:
1005 case UDP_V6_FLOW: 1353 case MVPP22_FLOW_UDP4:
1354 case MVPP22_FLOW_TCP6:
1355 case MVPP22_FLOW_UDP6:
1006 if (info->data & RXH_L4_B_0_1) 1356 if (info->data & RXH_L4_B_0_1)
1007 hash_opts |= MVPP22_CLS_HEK_OPT_L4SIP; 1357 hash_opts |= MVPP22_CLS_HEK_OPT_L4SIP;
1008 if (info->data & RXH_L4_B_2_3) 1358 if (info->data & RXH_L4_B_2_3)
1009 hash_opts |= MVPP22_CLS_HEK_OPT_L4DIP; 1359 hash_opts |= MVPP22_CLS_HEK_OPT_L4DIP;
1010 /* Fallthrough */ 1360 /* Fallthrough */
1011 case IPV4_FLOW: 1361 case MVPP22_FLOW_IP4:
1012 case IPV6_FLOW: 1362 case MVPP22_FLOW_IP6:
1013 if (info->data & RXH_L2DA) 1363 if (info->data & RXH_L2DA)
1014 hash_opts |= MVPP22_CLS_HEK_OPT_MAC_DA; 1364 hash_opts |= MVPP22_CLS_HEK_OPT_MAC_DA;
1015 if (info->data & RXH_VLAN) 1365 if (info->data & RXH_VLAN)
@@ -1026,15 +1376,18 @@ int mvpp2_ethtool_rxfh_set(struct mvpp2_port *port, struct ethtool_rxnfc *info)
1026 default: return -EOPNOTSUPP; 1376 default: return -EOPNOTSUPP;
1027 } 1377 }
1028 1378
1029 return mvpp2_port_rss_hash_opts_set(port, info->flow_type, hash_opts); 1379 return mvpp2_port_rss_hash_opts_set(port, flow_type, hash_opts);
1030} 1380}
1031 1381
1032int mvpp2_ethtool_rxfh_get(struct mvpp2_port *port, struct ethtool_rxnfc *info) 1382int mvpp2_ethtool_rxfh_get(struct mvpp2_port *port, struct ethtool_rxnfc *info)
1033{ 1383{
1034 unsigned long hash_opts; 1384 unsigned long hash_opts;
1385 u32 flow_type;
1035 int i; 1386 int i;
1036 1387
1037 hash_opts = mvpp2_port_rss_hash_opts_get(port, info->flow_type); 1388 flow_type = mvpp2_cls_ethtool_flow_to_type(info->flow_type);
1389
1390 hash_opts = mvpp2_port_rss_hash_opts_get(port, flow_type);
1038 info->data = 0; 1391 info->data = 0;
1039 1392
1040 for_each_set_bit(i, &hash_opts, MVPP22_CLS_HEK_N_FIELDS) { 1393 for_each_set_bit(i, &hash_opts, MVPP22_CLS_HEK_N_FIELDS) {
@@ -1097,10 +1450,10 @@ void mvpp22_port_rss_init(struct mvpp2_port *port)
1097 mvpp22_rss_fill_table(port, port->id); 1450 mvpp22_rss_fill_table(port, port->id);
1098 1451
1099 /* Configure default flows */ 1452 /* Configure default flows */
1100 mvpp2_port_rss_hash_opts_set(port, IPV4_FLOW, MVPP22_CLS_HEK_IP4_2T); 1453 mvpp2_port_rss_hash_opts_set(port, MVPP22_FLOW_IP4, MVPP22_CLS_HEK_IP4_2T);
1101 mvpp2_port_rss_hash_opts_set(port, IPV6_FLOW, MVPP22_CLS_HEK_IP6_2T); 1454 mvpp2_port_rss_hash_opts_set(port, MVPP22_FLOW_IP6, MVPP22_CLS_HEK_IP6_2T);
1102 mvpp2_port_rss_hash_opts_set(port, TCP_V4_FLOW, MVPP22_CLS_HEK_IP4_5T); 1455 mvpp2_port_rss_hash_opts_set(port, MVPP22_FLOW_TCP4, MVPP22_CLS_HEK_IP4_5T);
1103 mvpp2_port_rss_hash_opts_set(port, TCP_V6_FLOW, MVPP22_CLS_HEK_IP6_5T); 1456 mvpp2_port_rss_hash_opts_set(port, MVPP22_FLOW_TCP6, MVPP22_CLS_HEK_IP6_5T);
1104 mvpp2_port_rss_hash_opts_set(port, UDP_V4_FLOW, MVPP22_CLS_HEK_IP4_5T); 1457 mvpp2_port_rss_hash_opts_set(port, MVPP22_FLOW_UDP4, MVPP22_CLS_HEK_IP4_5T);
1105 mvpp2_port_rss_hash_opts_set(port, UDP_V6_FLOW, MVPP22_CLS_HEK_IP6_5T); 1458 mvpp2_port_rss_hash_opts_set(port, MVPP22_FLOW_UDP6, MVPP22_CLS_HEK_IP6_5T);
1106} 1459}
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.h b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.h
index 96304ffc5d49..56b617375a65 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.h
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.h
@@ -92,6 +92,17 @@ enum mvpp22_cls_c2_fwd_action {
92 MVPP22_C2_FWD_HW_LOW_LAT_LOCK, 92 MVPP22_C2_FWD_HW_LOW_LAT_LOCK,
93}; 93};
94 94
95enum mvpp22_cls_c2_color_action {
96 MVPP22_C2_COL_NO_UPD = 0,
97 MVPP22_C2_COL_NO_UPD_LOCK,
98 MVPP22_C2_COL_GREEN,
99 MVPP22_C2_COL_GREEN_LOCK,
100 MVPP22_C2_COL_YELLOW,
101 MVPP22_C2_COL_YELLOW_LOCK,
102 MVPP22_C2_COL_RED, /* Drop */
103 MVPP22_C2_COL_RED_LOCK, /* Drop */
104};
105
95#define MVPP2_CLS_C2_TCAM_WORDS 5 106#define MVPP2_CLS_C2_TCAM_WORDS 5
96#define MVPP2_CLS_C2_ATTR_WORDS 5 107#define MVPP2_CLS_C2_ATTR_WORDS 5
97 108
@@ -107,15 +118,36 @@ struct mvpp2_cls_c2_entry {
107 u8 valid; 118 u8 valid;
108}; 119};
109 120
121#define MVPP22_FLOW_ETHER_BIT BIT(0)
122#define MVPP22_FLOW_IP4_BIT BIT(1)
123#define MVPP22_FLOW_IP6_BIT BIT(2)
124#define MVPP22_FLOW_TCP_BIT BIT(3)
125#define MVPP22_FLOW_UDP_BIT BIT(4)
126
127#define MVPP22_FLOW_TCP4 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP4_BIT | MVPP22_FLOW_TCP_BIT)
128#define MVPP22_FLOW_TCP6 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP6_BIT | MVPP22_FLOW_TCP_BIT)
129#define MVPP22_FLOW_UDP4 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP4_BIT | MVPP22_FLOW_UDP_BIT)
130#define MVPP22_FLOW_UDP6 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP6_BIT | MVPP22_FLOW_UDP_BIT)
131#define MVPP22_FLOW_IP4 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP4_BIT)
132#define MVPP22_FLOW_IP6 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP6_BIT)
133#define MVPP22_FLOW_ETHERNET (MVPP22_FLOW_ETHER_BIT)
134
110/* Classifier C2 engine entries */ 135/* Classifier C2 engine entries */
111#define MVPP22_CLS_C2_N_ENTRIES 256 136#define MVPP22_CLS_C2_N_ENTRIES 256
112 137
113/* Number of per-port dedicated entries in the C2 TCAM */ 138/* Number of per-port dedicated entries in the C2 TCAM */
114#define MVPP22_CLS_C2_PORT_RANGE 8 139#define MVPP22_CLS_C2_PORT_N_FLOWS MVPP2_N_RFS_ENTRIES_PER_FLOW
115 140
116#define MVPP22_CLS_C2_PORT_FIRST(p) (MVPP22_CLS_C2_N_ENTRIES - \ 141/* Each port has oen range per flow type + one entry controling the global RSS
117 ((p) * MVPP22_CLS_C2_PORT_RANGE)) 142 * setting and the default rx queue
118#define MVPP22_CLS_C2_RSS_ENTRY(p) (MVPP22_CLS_C2_PORT_FIRST(p) - 1) 143 */
144#define MVPP22_CLS_C2_PORT_RANGE (MVPP22_CLS_C2_PORT_N_FLOWS + 1)
145#define MVPP22_CLS_C2_PORT_FIRST(p) ((p) * MVPP22_CLS_C2_PORT_RANGE)
146#define MVPP22_CLS_C2_RSS_ENTRY(p) (MVPP22_CLS_C2_PORT_FIRST((p) + 1) - 1)
147
148#define MVPP22_CLS_C2_PORT_FLOW_FIRST(p) (MVPP22_CLS_C2_PORT_FIRST(p))
149
150#define MVPP22_CLS_C2_RFS_LOC(p, loc) (MVPP22_CLS_C2_PORT_FLOW_FIRST(p) + (loc))
119 151
120/* Packet flow ID */ 152/* Packet flow ID */
121enum mvpp2_prs_flow { 153enum mvpp2_prs_flow {
@@ -145,10 +177,6 @@ enum mvpp2_prs_flow {
145 MVPP2_FL_LAST, 177 MVPP2_FL_LAST,
146}; 178};
147 179
148enum mvpp2_cls_lu_type {
149 MVPP2_CLS_LU_ALL = 0,
150};
151
152/* LU Type defined for all engines, and specified in the flow table */ 180/* LU Type defined for all engines, and specified in the flow table */
153#define MVPP2_CLS_LU_TYPE_MASK 0x3f 181#define MVPP2_CLS_LU_TYPE_MASK 0x3f
154 182
@@ -168,11 +196,16 @@ struct mvpp2_cls_flow {
168 struct mvpp2_prs_result_info prs_ri; 196 struct mvpp2_prs_result_info prs_ri;
169}; 197};
170 198
171#define MVPP2_CLS_FLT_ENTRIES_PER_FLOW (MVPP2_MAX_PORTS + 1) 199#define MVPP2_CLS_FLT_ENTRIES_PER_FLOW (MVPP2_MAX_PORTS + 1 + 16)
172#define MVPP2_CLS_FLT_FIRST(id) (((id) - MVPP2_FL_START) * \ 200#define MVPP2_CLS_FLT_FIRST(id) (((id) - MVPP2_FL_START) * \
173 MVPP2_CLS_FLT_ENTRIES_PER_FLOW) 201 MVPP2_CLS_FLT_ENTRIES_PER_FLOW)
174#define MVPP2_CLS_FLT_C2_RSS_ENTRY(id) (MVPP2_CLS_FLT_FIRST(id)) 202
175#define MVPP2_CLS_FLT_HASH_ENTRY(port, id) (MVPP2_CLS_FLT_C2_RSS_ENTRY(id) + (port) + 1) 203#define MVPP2_CLS_FLT_C2_RFS(port, id, rfs_n) (MVPP2_CLS_FLT_FIRST(id) + \
204 ((port) * MVPP2_MAX_PORTS) + \
205 (rfs_n))
206
207#define MVPP2_CLS_FLT_C2_RSS_ENTRY(id) (MVPP2_CLS_FLT_C2_RFS(MVPP2_MAX_PORTS, id, 0))
208#define MVPP2_CLS_FLT_HASH_ENTRY(port, id) (MVPP2_CLS_FLT_C2_RSS_ENTRY(id) + 1 + (port))
176#define MVPP2_CLS_FLT_LAST(id) (MVPP2_CLS_FLT_FIRST(id) + \ 209#define MVPP2_CLS_FLT_LAST(id) (MVPP2_CLS_FLT_FIRST(id) + \
177 MVPP2_CLS_FLT_ENTRIES_PER_FLOW - 1) 210 MVPP2_CLS_FLT_ENTRIES_PER_FLOW - 1)
178 211
@@ -199,6 +232,12 @@ struct mvpp2_cls_flow {
199 continue; \ 232 continue; \
200 else 233 else
201 234
235#define for_each_cls_flow_id_containing_type(i, type) \
236 for_each_cls_flow_id((i)) \
237 if ((cls_flows[(i)].flow_type & (type)) != (type)) \
238 continue; \
239 else
240
202struct mvpp2_cls_flow_entry { 241struct mvpp2_cls_flow_entry {
203 u32 index; 242 u32 index;
204 u32 data[MVPP2_CLS_FLOWS_TBL_DATA_WORDS]; 243 u32 data[MVPP2_CLS_FLOWS_TBL_DATA_WORDS];
@@ -246,4 +285,13 @@ u32 mvpp2_cls_c2_hit_count(struct mvpp2 *priv, int c2_index);
246void mvpp2_cls_c2_read(struct mvpp2 *priv, int index, 285void mvpp2_cls_c2_read(struct mvpp2 *priv, int index,
247 struct mvpp2_cls_c2_entry *c2); 286 struct mvpp2_cls_c2_entry *c2);
248 287
288int mvpp2_ethtool_cls_rule_get(struct mvpp2_port *port,
289 struct ethtool_rxnfc *rxnfc);
290
291int mvpp2_ethtool_cls_rule_ins(struct mvpp2_port *port,
292 struct ethtool_rxnfc *info);
293
294int mvpp2_ethtool_cls_rule_del(struct mvpp2_port *port,
295 struct ethtool_rxnfc *info);
296
249#endif 297#endif
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
index f128ea22b339..56d43d9b43ef 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
@@ -3937,7 +3937,7 @@ static int mvpp2_ethtool_get_rxnfc(struct net_device *dev,
3937 struct ethtool_rxnfc *info, u32 *rules) 3937 struct ethtool_rxnfc *info, u32 *rules)
3938{ 3938{
3939 struct mvpp2_port *port = netdev_priv(dev); 3939 struct mvpp2_port *port = netdev_priv(dev);
3940 int ret = 0; 3940 int ret = 0, i, loc = 0;
3941 3941
3942 if (!mvpp22_rss_is_supported()) 3942 if (!mvpp22_rss_is_supported())
3943 return -EOPNOTSUPP; 3943 return -EOPNOTSUPP;
@@ -3949,6 +3949,18 @@ static int mvpp2_ethtool_get_rxnfc(struct net_device *dev,
3949 case ETHTOOL_GRXRINGS: 3949 case ETHTOOL_GRXRINGS:
3950 info->data = port->nrxqs; 3950 info->data = port->nrxqs;
3951 break; 3951 break;
3952 case ETHTOOL_GRXCLSRLCNT:
3953 info->rule_cnt = port->n_rfs_rules;
3954 break;
3955 case ETHTOOL_GRXCLSRULE:
3956 ret = mvpp2_ethtool_cls_rule_get(port, info);
3957 break;
3958 case ETHTOOL_GRXCLSRLALL:
3959 for (i = 0; i < MVPP2_N_RFS_RULES; i++) {
3960 if (port->rfs_rules[i])
3961 rules[loc++] = i;
3962 }
3963 break;
3952 default: 3964 default:
3953 return -ENOTSUPP; 3965 return -ENOTSUPP;
3954 } 3966 }
@@ -3969,6 +3981,12 @@ static int mvpp2_ethtool_set_rxnfc(struct net_device *dev,
3969 case ETHTOOL_SRXFH: 3981 case ETHTOOL_SRXFH:
3970 ret = mvpp2_ethtool_rxfh_set(port, info); 3982 ret = mvpp2_ethtool_rxfh_set(port, info);
3971 break; 3983 break;
3984 case ETHTOOL_SRXCLSRLINS:
3985 ret = mvpp2_ethtool_cls_rule_ins(port, info);
3986 break;
3987 case ETHTOOL_SRXCLSRLDEL:
3988 ret = mvpp2_ethtool_cls_rule_del(port, info);
3989 break;
3972 default: 3990 default:
3973 return -EOPNOTSUPP; 3991 return -EOPNOTSUPP;
3974 } 3992 }