| .. | .. |
|---|
| 33 | 33 | }; |
|---|
| 34 | 34 | |
|---|
| 35 | 35 | #define MVPP22_CLS_HEK_OPT_MAC_DA BIT(0) |
|---|
| 36 | | -#define MVPP22_CLS_HEK_OPT_VLAN BIT(1) |
|---|
| 37 | | -#define MVPP22_CLS_HEK_OPT_L3_PROTO BIT(2) |
|---|
| 38 | | -#define MVPP22_CLS_HEK_OPT_IP4SA BIT(3) |
|---|
| 39 | | -#define MVPP22_CLS_HEK_OPT_IP4DA BIT(4) |
|---|
| 40 | | -#define MVPP22_CLS_HEK_OPT_IP6SA BIT(5) |
|---|
| 41 | | -#define MVPP22_CLS_HEK_OPT_IP6DA BIT(6) |
|---|
| 42 | | -#define MVPP22_CLS_HEK_OPT_L4SIP BIT(7) |
|---|
| 43 | | -#define MVPP22_CLS_HEK_OPT_L4DIP BIT(8) |
|---|
| 44 | | -#define MVPP22_CLS_HEK_N_FIELDS 9 |
|---|
| 36 | +#define MVPP22_CLS_HEK_OPT_VLAN_PRI BIT(1) |
|---|
| 37 | +#define MVPP22_CLS_HEK_OPT_VLAN BIT(2) |
|---|
| 38 | +#define MVPP22_CLS_HEK_OPT_L3_PROTO BIT(3) |
|---|
| 39 | +#define MVPP22_CLS_HEK_OPT_IP4SA BIT(4) |
|---|
| 40 | +#define MVPP22_CLS_HEK_OPT_IP4DA BIT(5) |
|---|
| 41 | +#define MVPP22_CLS_HEK_OPT_IP6SA BIT(6) |
|---|
| 42 | +#define MVPP22_CLS_HEK_OPT_IP6DA BIT(7) |
|---|
| 43 | +#define MVPP22_CLS_HEK_OPT_L4SIP BIT(8) |
|---|
| 44 | +#define MVPP22_CLS_HEK_OPT_L4DIP BIT(9) |
|---|
| 45 | +#define MVPP22_CLS_HEK_N_FIELDS 10 |
|---|
| 45 | 46 | |
|---|
| 46 | 47 | #define MVPP22_CLS_HEK_L4_OPTS (MVPP22_CLS_HEK_OPT_L4SIP | \ |
|---|
| 47 | 48 | MVPP22_CLS_HEK_OPT_L4DIP) |
|---|
| .. | .. |
|---|
| 59 | 60 | #define MVPP22_CLS_HEK_IP6_5T (MVPP22_CLS_HEK_IP6_2T | \ |
|---|
| 60 | 61 | MVPP22_CLS_HEK_L4_OPTS) |
|---|
| 61 | 62 | |
|---|
| 63 | +#define MVPP22_CLS_HEK_TAGGED (MVPP22_CLS_HEK_OPT_VLAN | \ |
|---|
| 64 | + MVPP22_CLS_HEK_OPT_VLAN_PRI) |
|---|
| 65 | + |
|---|
| 62 | 66 | enum mvpp2_cls_field_id { |
|---|
| 63 | 67 | MVPP22_CLS_FIELD_MAC_DA = 0x03, |
|---|
| 68 | + MVPP22_CLS_FIELD_VLAN_PRI = 0x05, |
|---|
| 64 | 69 | MVPP22_CLS_FIELD_VLAN = 0x06, |
|---|
| 65 | 70 | MVPP22_CLS_FIELD_L3_PROTO = 0x0f, |
|---|
| 66 | 71 | MVPP22_CLS_FIELD_IP4SA = 0x10, |
|---|
| .. | .. |
|---|
| 69 | 74 | MVPP22_CLS_FIELD_IP6DA = 0x1a, |
|---|
| 70 | 75 | MVPP22_CLS_FIELD_L4SIP = 0x1d, |
|---|
| 71 | 76 | MVPP22_CLS_FIELD_L4DIP = 0x1e, |
|---|
| 72 | | -}; |
|---|
| 73 | | - |
|---|
| 74 | | -enum mvpp2_cls_flow_seq { |
|---|
| 75 | | - MVPP2_CLS_FLOW_SEQ_NORMAL = 0, |
|---|
| 76 | | - MVPP2_CLS_FLOW_SEQ_FIRST1, |
|---|
| 77 | | - MVPP2_CLS_FLOW_SEQ_FIRST2, |
|---|
| 78 | | - MVPP2_CLS_FLOW_SEQ_LAST, |
|---|
| 79 | | - MVPP2_CLS_FLOW_SEQ_MIDDLE |
|---|
| 80 | 77 | }; |
|---|
| 81 | 78 | |
|---|
| 82 | 79 | /* Classifier C2 engine constants */ |
|---|
| .. | .. |
|---|
| 100 | 97 | MVPP22_C2_FWD_HW_LOW_LAT_LOCK, |
|---|
| 101 | 98 | }; |
|---|
| 102 | 99 | |
|---|
| 100 | +enum mvpp22_cls_c2_color_action { |
|---|
| 101 | + MVPP22_C2_COL_NO_UPD = 0, |
|---|
| 102 | + MVPP22_C2_COL_NO_UPD_LOCK, |
|---|
| 103 | + MVPP22_C2_COL_GREEN, |
|---|
| 104 | + MVPP22_C2_COL_GREEN_LOCK, |
|---|
| 105 | + MVPP22_C2_COL_YELLOW, |
|---|
| 106 | + MVPP22_C2_COL_YELLOW_LOCK, |
|---|
| 107 | + MVPP22_C2_COL_RED, /* Drop */ |
|---|
| 108 | + MVPP22_C2_COL_RED_LOCK, /* Drop */ |
|---|
| 109 | +}; |
|---|
| 110 | + |
|---|
| 103 | 111 | #define MVPP2_CLS_C2_TCAM_WORDS 5 |
|---|
| 104 | 112 | #define MVPP2_CLS_C2_ATTR_WORDS 5 |
|---|
| 105 | 113 | |
|---|
| 106 | 114 | struct mvpp2_cls_c2_entry { |
|---|
| 107 | 115 | u32 index; |
|---|
| 116 | + /* TCAM lookup key */ |
|---|
| 108 | 117 | u32 tcam[MVPP2_CLS_C2_TCAM_WORDS]; |
|---|
| 118 | + /* Actions to perform upon TCAM match */ |
|---|
| 109 | 119 | u32 act; |
|---|
| 120 | + /* Attributes relative to the actions to perform */ |
|---|
| 110 | 121 | u32 attr[MVPP2_CLS_C2_ATTR_WORDS]; |
|---|
| 122 | + /* Entry validity */ |
|---|
| 123 | + u8 valid; |
|---|
| 111 | 124 | }; |
|---|
| 112 | 125 | |
|---|
| 126 | +#define MVPP22_FLOW_ETHER_BIT BIT(0) |
|---|
| 127 | +#define MVPP22_FLOW_IP4_BIT BIT(1) |
|---|
| 128 | +#define MVPP22_FLOW_IP6_BIT BIT(2) |
|---|
| 129 | +#define MVPP22_FLOW_TCP_BIT BIT(3) |
|---|
| 130 | +#define MVPP22_FLOW_UDP_BIT BIT(4) |
|---|
| 131 | + |
|---|
| 132 | +#define MVPP22_FLOW_TCP4 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP4_BIT | MVPP22_FLOW_TCP_BIT) |
|---|
| 133 | +#define MVPP22_FLOW_TCP6 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP6_BIT | MVPP22_FLOW_TCP_BIT) |
|---|
| 134 | +#define MVPP22_FLOW_UDP4 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP4_BIT | MVPP22_FLOW_UDP_BIT) |
|---|
| 135 | +#define MVPP22_FLOW_UDP6 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP6_BIT | MVPP22_FLOW_UDP_BIT) |
|---|
| 136 | +#define MVPP22_FLOW_IP4 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP4_BIT) |
|---|
| 137 | +#define MVPP22_FLOW_IP6 (MVPP22_FLOW_ETHER_BIT | MVPP22_FLOW_IP6_BIT) |
|---|
| 138 | +#define MVPP22_FLOW_ETHERNET (MVPP22_FLOW_ETHER_BIT) |
|---|
| 139 | + |
|---|
| 113 | 140 | /* Classifier C2 engine entries */ |
|---|
| 114 | | -#define MVPP22_CLS_C2_RSS_ENTRY(port) (port) |
|---|
| 115 | | -#define MVPP22_CLS_C2_N_ENTRIES MVPP2_MAX_PORTS |
|---|
| 141 | +#define MVPP22_CLS_C2_N_ENTRIES 256 |
|---|
| 116 | 142 | |
|---|
| 117 | | -/* RSS flow entries in the flow table. We have 2 entries per port for RSS. |
|---|
| 118 | | - * |
|---|
| 119 | | - * The first performs a lookup using the C2 TCAM engine, to tag the |
|---|
| 120 | | - * packet for software forwarding (needed for RSS), enable or disable RSS, and |
|---|
| 121 | | - * assign the default rx queue. |
|---|
| 122 | | - * |
|---|
| 123 | | - * The second configures the hash generation, by specifying which fields of the |
|---|
| 124 | | - * packet header are used to generate the hash, and specifies the relevant hash |
|---|
| 125 | | - * engine to use. |
|---|
| 143 | +/* Number of per-port dedicated entries in the C2 TCAM */ |
|---|
| 144 | +#define MVPP22_CLS_C2_PORT_N_FLOWS MVPP2_N_RFS_ENTRIES_PER_FLOW |
|---|
| 145 | + |
|---|
| 146 | +/* Each port has oen range per flow type + one entry controling the global RSS |
|---|
| 147 | + * setting and the default rx queue |
|---|
| 126 | 148 | */ |
|---|
| 127 | | -#define MVPP22_RSS_FLOW_C2_OFFS 0 |
|---|
| 128 | | -#define MVPP22_RSS_FLOW_HASH_OFFS 1 |
|---|
| 129 | | -#define MVPP22_RSS_FLOW_SIZE (MVPP22_RSS_FLOW_HASH_OFFS + 1) |
|---|
| 149 | +#define MVPP22_CLS_C2_PORT_RANGE (MVPP22_CLS_C2_PORT_N_FLOWS + 1) |
|---|
| 150 | +#define MVPP22_CLS_C2_PORT_FIRST(p) ((p) * MVPP22_CLS_C2_PORT_RANGE) |
|---|
| 151 | +#define MVPP22_CLS_C2_RSS_ENTRY(p) (MVPP22_CLS_C2_PORT_FIRST((p) + 1) - 1) |
|---|
| 130 | 152 | |
|---|
| 131 | | -#define MVPP22_RSS_FLOW_C2(port) ((port) * MVPP22_RSS_FLOW_SIZE + \ |
|---|
| 132 | | - MVPP22_RSS_FLOW_C2_OFFS) |
|---|
| 133 | | -#define MVPP22_RSS_FLOW_HASH(port) ((port) * MVPP22_RSS_FLOW_SIZE + \ |
|---|
| 134 | | - MVPP22_RSS_FLOW_HASH_OFFS) |
|---|
| 135 | | -#define MVPP22_RSS_FLOW_FIRST(port) MVPP22_RSS_FLOW_C2(port) |
|---|
| 153 | +#define MVPP22_CLS_C2_PORT_FLOW_FIRST(p) (MVPP22_CLS_C2_PORT_FIRST(p)) |
|---|
| 154 | + |
|---|
| 155 | +#define MVPP22_CLS_C2_RFS_LOC(p, loc) (MVPP22_CLS_C2_PORT_FLOW_FIRST(p) + (loc)) |
|---|
| 136 | 156 | |
|---|
| 137 | 157 | /* Packet flow ID */ |
|---|
| 138 | 158 | enum mvpp2_prs_flow { |
|---|
| .. | .. |
|---|
| 162 | 182 | MVPP2_FL_LAST, |
|---|
| 163 | 183 | }; |
|---|
| 164 | 184 | |
|---|
| 185 | +/* LU Type defined for all engines, and specified in the flow table */ |
|---|
| 186 | +#define MVPP2_CLS_LU_TYPE_MASK 0x3f |
|---|
| 187 | + |
|---|
| 188 | +enum mvpp2_cls_lu_type { |
|---|
| 189 | + /* rule->loc is used as a lu-type for the entries 0 - 62. */ |
|---|
| 190 | + MVPP22_CLS_LU_TYPE_ALL = 63, |
|---|
| 191 | +}; |
|---|
| 192 | + |
|---|
| 193 | +#define MVPP2_N_FLOWS (MVPP2_FL_LAST - MVPP2_FL_START) |
|---|
| 194 | + |
|---|
| 165 | 195 | struct mvpp2_cls_flow { |
|---|
| 166 | 196 | /* The L2-L4 traffic flow type */ |
|---|
| 167 | 197 | int flow_type; |
|---|
| .. | .. |
|---|
| 176 | 206 | struct mvpp2_prs_result_info prs_ri; |
|---|
| 177 | 207 | }; |
|---|
| 178 | 208 | |
|---|
| 179 | | -#define MVPP2_N_FLOWS 52 |
|---|
| 209 | +#define MVPP2_CLS_FLT_ENTRIES_PER_FLOW (MVPP2_MAX_PORTS + 1 + 16) |
|---|
| 210 | +#define MVPP2_CLS_FLT_FIRST(id) (((id) - MVPP2_FL_START) * \ |
|---|
| 211 | + MVPP2_CLS_FLT_ENTRIES_PER_FLOW) |
|---|
| 180 | 212 | |
|---|
| 181 | | -#define MVPP2_ENTRIES_PER_FLOW (MVPP2_MAX_PORTS + 1) |
|---|
| 182 | | -#define MVPP2_FLOW_C2_ENTRY(id) ((id) * MVPP2_ENTRIES_PER_FLOW) |
|---|
| 183 | | -#define MVPP2_PORT_FLOW_HASH_ENTRY(port, id) ((id) * MVPP2_ENTRIES_PER_FLOW + \ |
|---|
| 184 | | - (port) + 1) |
|---|
| 213 | +#define MVPP2_CLS_FLT_C2_RFS(port, id, rfs_n) (MVPP2_CLS_FLT_FIRST(id) + \ |
|---|
| 214 | + ((port) * MVPP2_MAX_PORTS) + \ |
|---|
| 215 | + (rfs_n)) |
|---|
| 216 | + |
|---|
| 217 | +#define MVPP2_CLS_FLT_C2_RSS_ENTRY(id) (MVPP2_CLS_FLT_C2_RFS(MVPP2_MAX_PORTS, id, 0)) |
|---|
| 218 | +#define MVPP2_CLS_FLT_HASH_ENTRY(port, id) (MVPP2_CLS_FLT_C2_RSS_ENTRY(id) + 1 + (port)) |
|---|
| 219 | +#define MVPP2_CLS_FLT_LAST(id) (MVPP2_CLS_FLT_FIRST(id) + \ |
|---|
| 220 | + MVPP2_CLS_FLT_ENTRIES_PER_FLOW - 1) |
|---|
| 221 | + |
|---|
| 222 | +/* Iterate on each classifier flow id. Sets 'i' to be the index of the first |
|---|
| 223 | + * entry in the cls_flows table for each different flow_id. |
|---|
| 224 | + * This relies on entries having the same flow_id in the cls_flows table being |
|---|
| 225 | + * contiguous. |
|---|
| 226 | + */ |
|---|
| 227 | +#define for_each_cls_flow_id(i) \ |
|---|
| 228 | + for ((i) = 0; (i) < MVPP2_N_PRS_FLOWS; (i)++) \ |
|---|
| 229 | + if ((i) > 0 && \ |
|---|
| 230 | + cls_flows[(i)].flow_id == cls_flows[(i) - 1].flow_id) \ |
|---|
| 231 | + continue; \ |
|---|
| 232 | + else |
|---|
| 233 | + |
|---|
| 234 | +/* Iterate on each classifier flow that has a given flow_type. Sets 'i' to be |
|---|
| 235 | + * the index of the first entry in the cls_flow table for each different flow_id |
|---|
| 236 | + * that has the given flow_type. This allows to operate on all flows that |
|---|
| 237 | + * matches a given ethtool flow type. |
|---|
| 238 | + */ |
|---|
| 239 | +#define for_each_cls_flow_id_with_type(i, type) \ |
|---|
| 240 | + for_each_cls_flow_id((i)) \ |
|---|
| 241 | + if (cls_flows[(i)].flow_type != (type)) \ |
|---|
| 242 | + continue; \ |
|---|
| 243 | + else |
|---|
| 244 | + |
|---|
| 245 | +#define for_each_cls_flow_id_containing_type(i, type) \ |
|---|
| 246 | + for_each_cls_flow_id((i)) \ |
|---|
| 247 | + if ((cls_flows[(i)].flow_type & (type)) != (type)) \ |
|---|
| 248 | + continue; \ |
|---|
| 249 | + else |
|---|
| 250 | + |
|---|
| 185 | 251 | struct mvpp2_cls_flow_entry { |
|---|
| 186 | 252 | u32 index; |
|---|
| 187 | 253 | u32 data[MVPP2_CLS_FLOWS_TBL_DATA_WORDS]; |
|---|
| .. | .. |
|---|
| 193 | 259 | u32 data; |
|---|
| 194 | 260 | }; |
|---|
| 195 | 261 | |
|---|
| 196 | | -void mvpp22_rss_fill_table(struct mvpp2_port *port, u32 table); |
|---|
| 262 | +int mvpp22_port_rss_init(struct mvpp2_port *port); |
|---|
| 197 | 263 | |
|---|
| 198 | | -void mvpp22_rss_port_init(struct mvpp2_port *port); |
|---|
| 264 | +int mvpp22_port_rss_enable(struct mvpp2_port *port); |
|---|
| 265 | +int mvpp22_port_rss_disable(struct mvpp2_port *port); |
|---|
| 199 | 266 | |
|---|
| 200 | | -void mvpp22_rss_enable(struct mvpp2_port *port); |
|---|
| 201 | | -void mvpp22_rss_disable(struct mvpp2_port *port); |
|---|
| 267 | +int mvpp22_port_rss_ctx_create(struct mvpp2_port *port, u32 *rss_ctx); |
|---|
| 268 | +int mvpp22_port_rss_ctx_delete(struct mvpp2_port *port, u32 rss_ctx); |
|---|
| 269 | + |
|---|
| 270 | +int mvpp22_port_rss_ctx_indir_set(struct mvpp2_port *port, u32 rss_ctx, |
|---|
| 271 | + const u32 *indir); |
|---|
| 272 | +int mvpp22_port_rss_ctx_indir_get(struct mvpp2_port *port, u32 rss_ctx, |
|---|
| 273 | + u32 *indir); |
|---|
| 202 | 274 | |
|---|
| 203 | 275 | int mvpp2_ethtool_rxfh_get(struct mvpp2_port *port, struct ethtool_rxnfc *info); |
|---|
| 204 | 276 | int mvpp2_ethtool_rxfh_set(struct mvpp2_port *port, struct ethtool_rxnfc *info); |
|---|
| .. | .. |
|---|
| 213 | 285 | |
|---|
| 214 | 286 | u16 mvpp2_flow_get_hek_fields(struct mvpp2_cls_flow_entry *fe); |
|---|
| 215 | 287 | |
|---|
| 216 | | -struct mvpp2_cls_flow *mvpp2_cls_flow_get(int flow); |
|---|
| 288 | +const struct mvpp2_cls_flow *mvpp2_cls_flow_get(int flow); |
|---|
| 217 | 289 | |
|---|
| 218 | 290 | u32 mvpp2_cls_flow_hits(struct mvpp2 *priv, int index); |
|---|
| 219 | 291 | |
|---|
| .. | .. |
|---|
| 230 | 302 | void mvpp2_cls_c2_read(struct mvpp2 *priv, int index, |
|---|
| 231 | 303 | struct mvpp2_cls_c2_entry *c2); |
|---|
| 232 | 304 | |
|---|
| 305 | +int mvpp2_ethtool_cls_rule_get(struct mvpp2_port *port, |
|---|
| 306 | + struct ethtool_rxnfc *rxnfc); |
|---|
| 307 | + |
|---|
| 308 | +int mvpp2_ethtool_cls_rule_ins(struct mvpp2_port *port, |
|---|
| 309 | + struct ethtool_rxnfc *info); |
|---|
| 310 | + |
|---|
| 311 | +int mvpp2_ethtool_cls_rule_del(struct mvpp2_port *port, |
|---|
| 312 | + struct ethtool_rxnfc *info); |
|---|
| 313 | + |
|---|
| 233 | 314 | #endif |
|---|