GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / net / ethernet / marvell / octeontx2 / nic / otx2_flows.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Marvell RVU Ethernet driver
3  *
4  * Copyright (C) 2020 Marvell.
5  *
6  */
7
8 #include <net/ipv6.h>
9 #include <linux/sort.h>
10
11 #include "otx2_common.h"
12
13 #define OTX2_DEFAULT_ACTION     0x1
14
15 static int otx2_mcam_entry_init(struct otx2_nic *pfvf);
16
17 struct otx2_flow {
18         struct ethtool_rx_flow_spec flow_spec;
19         struct list_head list;
20         u32 location;
21         u32 entry;
22         bool is_vf;
23         u8 rss_ctx_id;
24 #define DMAC_FILTER_RULE                BIT(0)
25 #define PFC_FLOWCTRL_RULE               BIT(1)
26         u16 rule_type;
27         int vf;
28 };
29
30 enum dmac_req {
31         DMAC_ADDR_UPDATE,
32         DMAC_ADDR_DEL
33 };
34
35 static void otx2_clear_ntuple_flow_info(struct otx2_nic *pfvf, struct otx2_flow_config *flow_cfg)
36 {
37         devm_kfree(pfvf->dev, flow_cfg->flow_ent);
38         flow_cfg->flow_ent = NULL;
39         flow_cfg->max_flows = 0;
40 }
41
42 static int otx2_free_ntuple_mcam_entries(struct otx2_nic *pfvf)
43 {
44         struct otx2_flow_config *flow_cfg = pfvf->flow_cfg;
45         struct npc_mcam_free_entry_req *req;
46         int ent, err;
47
48         if (!flow_cfg->max_flows)
49                 return 0;
50
51         mutex_lock(&pfvf->mbox.lock);
52         for (ent = 0; ent < flow_cfg->max_flows; ent++) {
53                 req = otx2_mbox_alloc_msg_npc_mcam_free_entry(&pfvf->mbox);
54                 if (!req)
55                         break;
56
57                 req->entry = flow_cfg->flow_ent[ent];
58
59                 /* Send message to AF to free MCAM entries */
60                 err = otx2_sync_mbox_msg(&pfvf->mbox);
61                 if (err)
62                         break;
63         }
64         mutex_unlock(&pfvf->mbox.lock);
65         otx2_clear_ntuple_flow_info(pfvf, flow_cfg);
66         return 0;
67 }
68
69 static int mcam_entry_cmp(const void *a, const void *b)
70 {
71         return *(u16 *)a - *(u16 *)b;
72 }
73
74 int otx2_alloc_mcam_entries(struct otx2_nic *pfvf, u16 count)
75 {
76         struct otx2_flow_config *flow_cfg = pfvf->flow_cfg;
77         struct npc_mcam_alloc_entry_req *req;
78         struct npc_mcam_alloc_entry_rsp *rsp;
79         int ent, allocated = 0;
80
81         /* Free current ones and allocate new ones with requested count */
82         otx2_free_ntuple_mcam_entries(pfvf);
83
84         if (!count)
85                 return 0;
86
87         flow_cfg->flow_ent = devm_kmalloc_array(pfvf->dev, count,
88                                                 sizeof(u16), GFP_KERNEL);
89         if (!flow_cfg->flow_ent) {
90                 netdev_err(pfvf->netdev,
91                            "%s: Unable to allocate memory for flow entries\n",
92                             __func__);
93                 return -ENOMEM;
94         }
95
96         mutex_lock(&pfvf->mbox.lock);
97
98         /* In a single request a max of NPC_MAX_NONCONTIG_ENTRIES MCAM entries
99          * can only be allocated.
100          */
101         while (allocated < count) {
102                 req = otx2_mbox_alloc_msg_npc_mcam_alloc_entry(&pfvf->mbox);
103                 if (!req)
104                         goto exit;
105
106                 req->contig = false;
107                 req->count = (count - allocated) > NPC_MAX_NONCONTIG_ENTRIES ?
108                                 NPC_MAX_NONCONTIG_ENTRIES : count - allocated;
109
110                 /* Allocate higher priority entries for PFs, so that VF's entries
111                  * will be on top of PF.
112                  */
113                 if (!is_otx2_vf(pfvf->pcifunc)) {
114                         req->priority = NPC_MCAM_HIGHER_PRIO;
115                         req->ref_entry = flow_cfg->def_ent[0];
116                 }
117
118                 /* Send message to AF */
119                 if (otx2_sync_mbox_msg(&pfvf->mbox))
120                         goto exit;
121
122                 rsp = (struct npc_mcam_alloc_entry_rsp *)otx2_mbox_get_rsp
123                         (&pfvf->mbox.mbox, 0, &req->hdr);
124
125                 for (ent = 0; ent < rsp->count; ent++)
126                         flow_cfg->flow_ent[ent + allocated] = rsp->entry_list[ent];
127
128                 allocated += rsp->count;
129
130                 /* If this request is not fulfilled, no need to send
131                  * further requests.
132                  */
133                 if (rsp->count != req->count)
134                         break;
135         }
136
137         /* Multiple MCAM entry alloc requests could result in non-sequential
138          * MCAM entries in the flow_ent[] array. Sort them in an ascending order,
139          * otherwise user installed ntuple filter index and MCAM entry index will
140          * not be in sync.
141          */
142         if (allocated)
143                 sort(&flow_cfg->flow_ent[0], allocated,
144                      sizeof(flow_cfg->flow_ent[0]), mcam_entry_cmp, NULL);
145
146 exit:
147         mutex_unlock(&pfvf->mbox.lock);
148
149         flow_cfg->max_flows = allocated;
150
151         if (allocated) {
152                 pfvf->flags |= OTX2_FLAG_MCAM_ENTRIES_ALLOC;
153                 pfvf->flags |= OTX2_FLAG_NTUPLE_SUPPORT;
154         }
155
156         if (allocated != count)
157                 netdev_info(pfvf->netdev,
158                             "Unable to allocate %d MCAM entries, got only %d\n",
159                             count, allocated);
160         return allocated;
161 }
162 EXPORT_SYMBOL(otx2_alloc_mcam_entries);
163
164 static int otx2_mcam_entry_init(struct otx2_nic *pfvf)
165 {
166         struct otx2_flow_config *flow_cfg = pfvf->flow_cfg;
167         struct npc_get_field_status_req *freq;
168         struct npc_get_field_status_rsp *frsp;
169         struct npc_mcam_alloc_entry_req *req;
170         struct npc_mcam_alloc_entry_rsp *rsp;
171         int vf_vlan_max_flows;
172         int ent, count;
173
174         vf_vlan_max_flows = pfvf->total_vfs * OTX2_PER_VF_VLAN_FLOWS;
175         count = OTX2_MAX_UNICAST_FLOWS +
176                         OTX2_MAX_VLAN_FLOWS + vf_vlan_max_flows;
177
178         flow_cfg->def_ent = devm_kmalloc_array(pfvf->dev, count,
179                                                sizeof(u16), GFP_KERNEL);
180         if (!flow_cfg->def_ent)
181                 return -ENOMEM;
182
183         mutex_lock(&pfvf->mbox.lock);
184
185         req = otx2_mbox_alloc_msg_npc_mcam_alloc_entry(&pfvf->mbox);
186         if (!req) {
187                 mutex_unlock(&pfvf->mbox.lock);
188                 return -ENOMEM;
189         }
190
191         req->contig = false;
192         req->count = count;
193
194         /* Send message to AF */
195         if (otx2_sync_mbox_msg(&pfvf->mbox)) {
196                 mutex_unlock(&pfvf->mbox.lock);
197                 return -EINVAL;
198         }
199
200         rsp = (struct npc_mcam_alloc_entry_rsp *)otx2_mbox_get_rsp
201                (&pfvf->mbox.mbox, 0, &req->hdr);
202
203         if (rsp->count != req->count) {
204                 netdev_info(pfvf->netdev,
205                             "Unable to allocate MCAM entries for ucast, vlan and vf_vlan\n");
206                 mutex_unlock(&pfvf->mbox.lock);
207                 devm_kfree(pfvf->dev, flow_cfg->def_ent);
208                 return 0;
209         }
210
211         for (ent = 0; ent < rsp->count; ent++)
212                 flow_cfg->def_ent[ent] = rsp->entry_list[ent];
213
214         flow_cfg->vf_vlan_offset = 0;
215         flow_cfg->unicast_offset = vf_vlan_max_flows;
216         flow_cfg->rx_vlan_offset = flow_cfg->unicast_offset +
217                                         OTX2_MAX_UNICAST_FLOWS;
218         pfvf->flags |= OTX2_FLAG_UCAST_FLTR_SUPPORT;
219
220         /* Check if NPC_DMAC field is supported
221          * by the mkex profile before setting VLAN support flag.
222          */
223         freq = otx2_mbox_alloc_msg_npc_get_field_status(&pfvf->mbox);
224         if (!freq) {
225                 mutex_unlock(&pfvf->mbox.lock);
226                 return -ENOMEM;
227         }
228
229         freq->field = NPC_DMAC;
230         if (otx2_sync_mbox_msg(&pfvf->mbox)) {
231                 mutex_unlock(&pfvf->mbox.lock);
232                 return -EINVAL;
233         }
234
235         frsp = (struct npc_get_field_status_rsp *)otx2_mbox_get_rsp
236                (&pfvf->mbox.mbox, 0, &freq->hdr);
237
238         if (frsp->enable) {
239                 pfvf->flags |= OTX2_FLAG_RX_VLAN_SUPPORT;
240                 pfvf->flags |= OTX2_FLAG_VF_VLAN_SUPPORT;
241         }
242
243         pfvf->flags |= OTX2_FLAG_MCAM_ENTRIES_ALLOC;
244         mutex_unlock(&pfvf->mbox.lock);
245
246         /* Allocate entries for Ntuple filters */
247         count = otx2_alloc_mcam_entries(pfvf, OTX2_DEFAULT_FLOWCOUNT);
248         if (count <= 0) {
249                 otx2_clear_ntuple_flow_info(pfvf, flow_cfg);
250                 return 0;
251         }
252
253         pfvf->flags |= OTX2_FLAG_TC_FLOWER_SUPPORT;
254
255         return 0;
256 }
257
258 /* TODO : revisit on size */
259 #define OTX2_DMAC_FLTR_BITMAP_SZ (4 * 2048 + 32)
260
261 int otx2vf_mcam_flow_init(struct otx2_nic *pfvf)
262 {
263         struct otx2_flow_config *flow_cfg;
264
265         pfvf->flow_cfg = devm_kzalloc(pfvf->dev,
266                                       sizeof(struct otx2_flow_config),
267                                       GFP_KERNEL);
268         if (!pfvf->flow_cfg)
269                 return -ENOMEM;
270
271         pfvf->flow_cfg->dmacflt_bmap = devm_kcalloc(pfvf->dev,
272                                                     BITS_TO_LONGS(OTX2_DMAC_FLTR_BITMAP_SZ),
273                                                     sizeof(long), GFP_KERNEL);
274         if (!pfvf->flow_cfg->dmacflt_bmap)
275                 return -ENOMEM;
276
277         flow_cfg = pfvf->flow_cfg;
278         INIT_LIST_HEAD(&flow_cfg->flow_list);
279         INIT_LIST_HEAD(&flow_cfg->flow_list_tc);
280         flow_cfg->max_flows = 0;
281
282         return 0;
283 }
284 EXPORT_SYMBOL(otx2vf_mcam_flow_init);
285
286 int otx2_mcam_flow_init(struct otx2_nic *pf)
287 {
288         int err;
289
290         pf->flow_cfg = devm_kzalloc(pf->dev, sizeof(struct otx2_flow_config),
291                                     GFP_KERNEL);
292         if (!pf->flow_cfg)
293                 return -ENOMEM;
294
295         pf->flow_cfg->dmacflt_bmap = devm_kcalloc(pf->dev,
296                                                   BITS_TO_LONGS(OTX2_DMAC_FLTR_BITMAP_SZ),
297                                                   sizeof(long), GFP_KERNEL);
298         if (!pf->flow_cfg->dmacflt_bmap)
299                 return -ENOMEM;
300
301         INIT_LIST_HEAD(&pf->flow_cfg->flow_list);
302         INIT_LIST_HEAD(&pf->flow_cfg->flow_list_tc);
303
304         /* Allocate bare minimum number of MCAM entries needed for
305          * unicast and ntuple filters.
306          */
307         err = otx2_mcam_entry_init(pf);
308         if (err)
309                 return err;
310
311         /* Check if MCAM entries are allocate or not */
312         if (!(pf->flags & OTX2_FLAG_UCAST_FLTR_SUPPORT))
313                 return 0;
314
315         pf->mac_table = devm_kzalloc(pf->dev, sizeof(struct otx2_mac_table)
316                                         * OTX2_MAX_UNICAST_FLOWS, GFP_KERNEL);
317         if (!pf->mac_table)
318                 return -ENOMEM;
319
320         otx2_dmacflt_get_max_cnt(pf);
321
322         /* DMAC filters are not allocated */
323         if (!pf->flow_cfg->dmacflt_max_flows)
324                 return 0;
325
326         pf->flow_cfg->bmap_to_dmacindex =
327                         devm_kzalloc(pf->dev, sizeof(u32) *
328                                      pf->flow_cfg->dmacflt_max_flows,
329                                      GFP_KERNEL);
330
331         if (!pf->flow_cfg->bmap_to_dmacindex)
332                 return -ENOMEM;
333
334         pf->flags |= OTX2_FLAG_DMACFLTR_SUPPORT;
335
336         return 0;
337 }
338
339 void otx2_mcam_flow_del(struct otx2_nic *pf)
340 {
341         otx2_destroy_mcam_flows(pf);
342 }
343 EXPORT_SYMBOL(otx2_mcam_flow_del);
344
345 /*  On success adds mcam entry
346  *  On failure enable promisous mode
347  */
348 static int otx2_do_add_macfilter(struct otx2_nic *pf, const u8 *mac)
349 {
350         struct otx2_flow_config *flow_cfg = pf->flow_cfg;
351         struct npc_install_flow_req *req;
352         int err, i;
353
354         if (!(pf->flags & OTX2_FLAG_UCAST_FLTR_SUPPORT))
355                 return -ENOMEM;
356
357         /* dont have free mcam entries or uc list is greater than alloted */
358         if (netdev_uc_count(pf->netdev) > OTX2_MAX_UNICAST_FLOWS)
359                 return -ENOMEM;
360
361         mutex_lock(&pf->mbox.lock);
362         req = otx2_mbox_alloc_msg_npc_install_flow(&pf->mbox);
363         if (!req) {
364                 mutex_unlock(&pf->mbox.lock);
365                 return -ENOMEM;
366         }
367
368         /* unicast offset starts with 32 0..31 for ntuple */
369         for (i = 0; i <  OTX2_MAX_UNICAST_FLOWS; i++) {
370                 if (pf->mac_table[i].inuse)
371                         continue;
372                 ether_addr_copy(pf->mac_table[i].addr, mac);
373                 pf->mac_table[i].inuse = true;
374                 pf->mac_table[i].mcam_entry =
375                         flow_cfg->def_ent[i + flow_cfg->unicast_offset];
376                 req->entry =  pf->mac_table[i].mcam_entry;
377                 break;
378         }
379
380         ether_addr_copy(req->packet.dmac, mac);
381         eth_broadcast_addr((u8 *)&req->mask.dmac);
382         req->features = BIT_ULL(NPC_DMAC);
383         req->channel = pf->hw.rx_chan_base;
384         req->intf = NIX_INTF_RX;
385         req->op = NIX_RX_ACTION_DEFAULT;
386         req->set_cntr = 1;
387
388         err = otx2_sync_mbox_msg(&pf->mbox);
389         mutex_unlock(&pf->mbox.lock);
390
391         return err;
392 }
393
394 int otx2_add_macfilter(struct net_device *netdev, const u8 *mac)
395 {
396         struct otx2_nic *pf = netdev_priv(netdev);
397
398         if (!bitmap_empty(pf->flow_cfg->dmacflt_bmap,
399                           pf->flow_cfg->dmacflt_max_flows))
400                 netdev_warn(netdev,
401                             "Add %pM to CGX/RPM DMAC filters list as well\n",
402                             mac);
403
404         return otx2_do_add_macfilter(pf, mac);
405 }
406
407 static bool otx2_get_mcamentry_for_mac(struct otx2_nic *pf, const u8 *mac,
408                                        int *mcam_entry)
409 {
410         int i;
411
412         for (i = 0; i < OTX2_MAX_UNICAST_FLOWS; i++) {
413                 if (!pf->mac_table[i].inuse)
414                         continue;
415
416                 if (ether_addr_equal(pf->mac_table[i].addr, mac)) {
417                         *mcam_entry = pf->mac_table[i].mcam_entry;
418                         pf->mac_table[i].inuse = false;
419                         return true;
420                 }
421         }
422         return false;
423 }
424
425 int otx2_del_macfilter(struct net_device *netdev, const u8 *mac)
426 {
427         struct otx2_nic *pf = netdev_priv(netdev);
428         struct npc_delete_flow_req *req;
429         int err, mcam_entry;
430
431         /* check does mcam entry exists for given mac */
432         if (!otx2_get_mcamentry_for_mac(pf, mac, &mcam_entry))
433                 return 0;
434
435         mutex_lock(&pf->mbox.lock);
436         req = otx2_mbox_alloc_msg_npc_delete_flow(&pf->mbox);
437         if (!req) {
438                 mutex_unlock(&pf->mbox.lock);
439                 return -ENOMEM;
440         }
441         req->entry = mcam_entry;
442         /* Send message to AF */
443         err = otx2_sync_mbox_msg(&pf->mbox);
444         mutex_unlock(&pf->mbox.lock);
445
446         return err;
447 }
448
449 static struct otx2_flow *otx2_find_flow(struct otx2_nic *pfvf, u32 location)
450 {
451         struct otx2_flow *iter;
452
453         list_for_each_entry(iter, &pfvf->flow_cfg->flow_list, list) {
454                 if (iter->location == location)
455                         return iter;
456         }
457
458         return NULL;
459 }
460
461 static void otx2_add_flow_to_list(struct otx2_nic *pfvf, struct otx2_flow *flow)
462 {
463         struct list_head *head = &pfvf->flow_cfg->flow_list;
464         struct otx2_flow *iter;
465
466         list_for_each_entry(iter, &pfvf->flow_cfg->flow_list, list) {
467                 if (iter->location > flow->location)
468                         break;
469                 head = &iter->list;
470         }
471
472         list_add(&flow->list, head);
473 }
474
475 int otx2_get_maxflows(struct otx2_flow_config *flow_cfg)
476 {
477         if (!flow_cfg)
478                 return 0;
479
480         if (flow_cfg->nr_flows == flow_cfg->max_flows ||
481             !bitmap_empty(flow_cfg->dmacflt_bmap,
482                           flow_cfg->dmacflt_max_flows))
483                 return flow_cfg->max_flows + flow_cfg->dmacflt_max_flows;
484         else
485                 return flow_cfg->max_flows;
486 }
487 EXPORT_SYMBOL(otx2_get_maxflows);
488
489 int otx2_get_flow(struct otx2_nic *pfvf, struct ethtool_rxnfc *nfc,
490                   u32 location)
491 {
492         struct otx2_flow *iter;
493
494         if (location >= otx2_get_maxflows(pfvf->flow_cfg))
495                 return -EINVAL;
496
497         list_for_each_entry(iter, &pfvf->flow_cfg->flow_list, list) {
498                 if (iter->location == location) {
499                         nfc->fs = iter->flow_spec;
500                         nfc->rss_context = iter->rss_ctx_id;
501                         return 0;
502                 }
503         }
504
505         return -ENOENT;
506 }
507
508 int otx2_get_all_flows(struct otx2_nic *pfvf, struct ethtool_rxnfc *nfc,
509                        u32 *rule_locs)
510 {
511         u32 rule_cnt = nfc->rule_cnt;
512         u32 location = 0;
513         int idx = 0;
514         int err = 0;
515
516         nfc->data = otx2_get_maxflows(pfvf->flow_cfg);
517         while ((!err || err == -ENOENT) && idx < rule_cnt) {
518                 err = otx2_get_flow(pfvf, nfc, location);
519                 if (!err)
520                         rule_locs[idx++] = location;
521                 location++;
522         }
523         nfc->rule_cnt = rule_cnt;
524
525         return err;
526 }
527
528 static int otx2_prepare_ipv4_flow(struct ethtool_rx_flow_spec *fsp,
529                                   struct npc_install_flow_req *req,
530                                   u32 flow_type)
531 {
532         struct ethtool_usrip4_spec *ipv4_usr_mask = &fsp->m_u.usr_ip4_spec;
533         struct ethtool_usrip4_spec *ipv4_usr_hdr = &fsp->h_u.usr_ip4_spec;
534         struct ethtool_tcpip4_spec *ipv4_l4_mask = &fsp->m_u.tcp_ip4_spec;
535         struct ethtool_tcpip4_spec *ipv4_l4_hdr = &fsp->h_u.tcp_ip4_spec;
536         struct ethtool_ah_espip4_spec *ah_esp_hdr = &fsp->h_u.ah_ip4_spec;
537         struct ethtool_ah_espip4_spec *ah_esp_mask = &fsp->m_u.ah_ip4_spec;
538         struct flow_msg *pmask = &req->mask;
539         struct flow_msg *pkt = &req->packet;
540
541         switch (flow_type) {
542         case IP_USER_FLOW:
543                 if (ipv4_usr_mask->ip4src) {
544                         memcpy(&pkt->ip4src, &ipv4_usr_hdr->ip4src,
545                                sizeof(pkt->ip4src));
546                         memcpy(&pmask->ip4src, &ipv4_usr_mask->ip4src,
547                                sizeof(pmask->ip4src));
548                         req->features |= BIT_ULL(NPC_SIP_IPV4);
549                 }
550                 if (ipv4_usr_mask->ip4dst) {
551                         memcpy(&pkt->ip4dst, &ipv4_usr_hdr->ip4dst,
552                                sizeof(pkt->ip4dst));
553                         memcpy(&pmask->ip4dst, &ipv4_usr_mask->ip4dst,
554                                sizeof(pmask->ip4dst));
555                         req->features |= BIT_ULL(NPC_DIP_IPV4);
556                 }
557                 if (ipv4_usr_mask->tos) {
558                         pkt->tos = ipv4_usr_hdr->tos;
559                         pmask->tos = ipv4_usr_mask->tos;
560                         req->features |= BIT_ULL(NPC_TOS);
561                 }
562                 if (ipv4_usr_mask->proto) {
563                         switch (ipv4_usr_hdr->proto) {
564                         case IPPROTO_ICMP:
565                                 req->features |= BIT_ULL(NPC_IPPROTO_ICMP);
566                                 break;
567                         case IPPROTO_TCP:
568                                 req->features |= BIT_ULL(NPC_IPPROTO_TCP);
569                                 break;
570                         case IPPROTO_UDP:
571                                 req->features |= BIT_ULL(NPC_IPPROTO_UDP);
572                                 break;
573                         case IPPROTO_SCTP:
574                                 req->features |= BIT_ULL(NPC_IPPROTO_SCTP);
575                                 break;
576                         case IPPROTO_AH:
577                                 req->features |= BIT_ULL(NPC_IPPROTO_AH);
578                                 break;
579                         case IPPROTO_ESP:
580                                 req->features |= BIT_ULL(NPC_IPPROTO_ESP);
581                                 break;
582                         default:
583                                 return -EOPNOTSUPP;
584                         }
585                 }
586                 pkt->etype = cpu_to_be16(ETH_P_IP);
587                 pmask->etype = cpu_to_be16(0xFFFF);
588                 req->features |= BIT_ULL(NPC_ETYPE);
589                 break;
590         case TCP_V4_FLOW:
591         case UDP_V4_FLOW:
592         case SCTP_V4_FLOW:
593                 pkt->etype = cpu_to_be16(ETH_P_IP);
594                 pmask->etype = cpu_to_be16(0xFFFF);
595                 req->features |= BIT_ULL(NPC_ETYPE);
596                 if (ipv4_l4_mask->ip4src) {
597                         memcpy(&pkt->ip4src, &ipv4_l4_hdr->ip4src,
598                                sizeof(pkt->ip4src));
599                         memcpy(&pmask->ip4src, &ipv4_l4_mask->ip4src,
600                                sizeof(pmask->ip4src));
601                         req->features |= BIT_ULL(NPC_SIP_IPV4);
602                 }
603                 if (ipv4_l4_mask->ip4dst) {
604                         memcpy(&pkt->ip4dst, &ipv4_l4_hdr->ip4dst,
605                                sizeof(pkt->ip4dst));
606                         memcpy(&pmask->ip4dst, &ipv4_l4_mask->ip4dst,
607                                sizeof(pmask->ip4dst));
608                         req->features |= BIT_ULL(NPC_DIP_IPV4);
609                 }
610                 if (ipv4_l4_mask->tos) {
611                         pkt->tos = ipv4_l4_hdr->tos;
612                         pmask->tos = ipv4_l4_mask->tos;
613                         req->features |= BIT_ULL(NPC_TOS);
614                 }
615                 if (ipv4_l4_mask->psrc) {
616                         memcpy(&pkt->sport, &ipv4_l4_hdr->psrc,
617                                sizeof(pkt->sport));
618                         memcpy(&pmask->sport, &ipv4_l4_mask->psrc,
619                                sizeof(pmask->sport));
620                         if (flow_type == UDP_V4_FLOW)
621                                 req->features |= BIT_ULL(NPC_SPORT_UDP);
622                         else if (flow_type == TCP_V4_FLOW)
623                                 req->features |= BIT_ULL(NPC_SPORT_TCP);
624                         else
625                                 req->features |= BIT_ULL(NPC_SPORT_SCTP);
626                 }
627                 if (ipv4_l4_mask->pdst) {
628                         memcpy(&pkt->dport, &ipv4_l4_hdr->pdst,
629                                sizeof(pkt->dport));
630                         memcpy(&pmask->dport, &ipv4_l4_mask->pdst,
631                                sizeof(pmask->dport));
632                         if (flow_type == UDP_V4_FLOW)
633                                 req->features |= BIT_ULL(NPC_DPORT_UDP);
634                         else if (flow_type == TCP_V4_FLOW)
635                                 req->features |= BIT_ULL(NPC_DPORT_TCP);
636                         else
637                                 req->features |= BIT_ULL(NPC_DPORT_SCTP);
638                 }
639                 if (flow_type == UDP_V4_FLOW)
640                         req->features |= BIT_ULL(NPC_IPPROTO_UDP);
641                 else if (flow_type == TCP_V4_FLOW)
642                         req->features |= BIT_ULL(NPC_IPPROTO_TCP);
643                 else
644                         req->features |= BIT_ULL(NPC_IPPROTO_SCTP);
645                 break;
646         case AH_V4_FLOW:
647         case ESP_V4_FLOW:
648                 pkt->etype = cpu_to_be16(ETH_P_IP);
649                 pmask->etype = cpu_to_be16(0xFFFF);
650                 req->features |= BIT_ULL(NPC_ETYPE);
651                 if (ah_esp_mask->ip4src) {
652                         memcpy(&pkt->ip4src, &ah_esp_hdr->ip4src,
653                                sizeof(pkt->ip4src));
654                         memcpy(&pmask->ip4src, &ah_esp_mask->ip4src,
655                                sizeof(pmask->ip4src));
656                         req->features |= BIT_ULL(NPC_SIP_IPV4);
657                 }
658                 if (ah_esp_mask->ip4dst) {
659                         memcpy(&pkt->ip4dst, &ah_esp_hdr->ip4dst,
660                                sizeof(pkt->ip4dst));
661                         memcpy(&pmask->ip4dst, &ah_esp_mask->ip4dst,
662                                sizeof(pmask->ip4dst));
663                         req->features |= BIT_ULL(NPC_DIP_IPV4);
664                 }
665                 if (ah_esp_mask->tos) {
666                         pkt->tos = ah_esp_hdr->tos;
667                         pmask->tos = ah_esp_mask->tos;
668                         req->features |= BIT_ULL(NPC_TOS);
669                 }
670
671                 /* NPC profile doesn't extract AH/ESP header fields */
672                 if (ah_esp_mask->spi & ah_esp_hdr->spi)
673                         return -EOPNOTSUPP;
674
675                 if (flow_type == AH_V4_FLOW)
676                         req->features |= BIT_ULL(NPC_IPPROTO_AH);
677                 else
678                         req->features |= BIT_ULL(NPC_IPPROTO_ESP);
679                 break;
680         default:
681                 break;
682         }
683
684         return 0;
685 }
686
687 static int otx2_prepare_ipv6_flow(struct ethtool_rx_flow_spec *fsp,
688                                   struct npc_install_flow_req *req,
689                                   u32 flow_type)
690 {
691         struct ethtool_usrip6_spec *ipv6_usr_mask = &fsp->m_u.usr_ip6_spec;
692         struct ethtool_usrip6_spec *ipv6_usr_hdr = &fsp->h_u.usr_ip6_spec;
693         struct ethtool_tcpip6_spec *ipv6_l4_mask = &fsp->m_u.tcp_ip6_spec;
694         struct ethtool_tcpip6_spec *ipv6_l4_hdr = &fsp->h_u.tcp_ip6_spec;
695         struct ethtool_ah_espip6_spec *ah_esp_hdr = &fsp->h_u.ah_ip6_spec;
696         struct ethtool_ah_espip6_spec *ah_esp_mask = &fsp->m_u.ah_ip6_spec;
697         struct flow_msg *pmask = &req->mask;
698         struct flow_msg *pkt = &req->packet;
699
700         switch (flow_type) {
701         case IPV6_USER_FLOW:
702                 if (!ipv6_addr_any((struct in6_addr *)ipv6_usr_mask->ip6src)) {
703                         memcpy(&pkt->ip6src, &ipv6_usr_hdr->ip6src,
704                                sizeof(pkt->ip6src));
705                         memcpy(&pmask->ip6src, &ipv6_usr_mask->ip6src,
706                                sizeof(pmask->ip6src));
707                         req->features |= BIT_ULL(NPC_SIP_IPV6);
708                 }
709                 if (!ipv6_addr_any((struct in6_addr *)ipv6_usr_mask->ip6dst)) {
710                         memcpy(&pkt->ip6dst, &ipv6_usr_hdr->ip6dst,
711                                sizeof(pkt->ip6dst));
712                         memcpy(&pmask->ip6dst, &ipv6_usr_mask->ip6dst,
713                                sizeof(pmask->ip6dst));
714                         req->features |= BIT_ULL(NPC_DIP_IPV6);
715                 }
716                 if (ipv6_usr_hdr->l4_proto == IPPROTO_FRAGMENT) {
717                         pkt->next_header = ipv6_usr_hdr->l4_proto;
718                         pmask->next_header = ipv6_usr_mask->l4_proto;
719                         req->features |= BIT_ULL(NPC_IPFRAG_IPV6);
720                 }
721                 pkt->etype = cpu_to_be16(ETH_P_IPV6);
722                 pmask->etype = cpu_to_be16(0xFFFF);
723                 req->features |= BIT_ULL(NPC_ETYPE);
724                 break;
725         case TCP_V6_FLOW:
726         case UDP_V6_FLOW:
727         case SCTP_V6_FLOW:
728                 pkt->etype = cpu_to_be16(ETH_P_IPV6);
729                 pmask->etype = cpu_to_be16(0xFFFF);
730                 req->features |= BIT_ULL(NPC_ETYPE);
731                 if (!ipv6_addr_any((struct in6_addr *)ipv6_l4_mask->ip6src)) {
732                         memcpy(&pkt->ip6src, &ipv6_l4_hdr->ip6src,
733                                sizeof(pkt->ip6src));
734                         memcpy(&pmask->ip6src, &ipv6_l4_mask->ip6src,
735                                sizeof(pmask->ip6src));
736                         req->features |= BIT_ULL(NPC_SIP_IPV6);
737                 }
738                 if (!ipv6_addr_any((struct in6_addr *)ipv6_l4_mask->ip6dst)) {
739                         memcpy(&pkt->ip6dst, &ipv6_l4_hdr->ip6dst,
740                                sizeof(pkt->ip6dst));
741                         memcpy(&pmask->ip6dst, &ipv6_l4_mask->ip6dst,
742                                sizeof(pmask->ip6dst));
743                         req->features |= BIT_ULL(NPC_DIP_IPV6);
744                 }
745                 if (ipv6_l4_mask->psrc) {
746                         memcpy(&pkt->sport, &ipv6_l4_hdr->psrc,
747                                sizeof(pkt->sport));
748                         memcpy(&pmask->sport, &ipv6_l4_mask->psrc,
749                                sizeof(pmask->sport));
750                         if (flow_type == UDP_V6_FLOW)
751                                 req->features |= BIT_ULL(NPC_SPORT_UDP);
752                         else if (flow_type == TCP_V6_FLOW)
753                                 req->features |= BIT_ULL(NPC_SPORT_TCP);
754                         else
755                                 req->features |= BIT_ULL(NPC_SPORT_SCTP);
756                 }
757                 if (ipv6_l4_mask->pdst) {
758                         memcpy(&pkt->dport, &ipv6_l4_hdr->pdst,
759                                sizeof(pkt->dport));
760                         memcpy(&pmask->dport, &ipv6_l4_mask->pdst,
761                                sizeof(pmask->dport));
762                         if (flow_type == UDP_V6_FLOW)
763                                 req->features |= BIT_ULL(NPC_DPORT_UDP);
764                         else if (flow_type == TCP_V6_FLOW)
765                                 req->features |= BIT_ULL(NPC_DPORT_TCP);
766                         else
767                                 req->features |= BIT_ULL(NPC_DPORT_SCTP);
768                 }
769                 if (flow_type == UDP_V6_FLOW)
770                         req->features |= BIT_ULL(NPC_IPPROTO_UDP);
771                 else if (flow_type == TCP_V6_FLOW)
772                         req->features |= BIT_ULL(NPC_IPPROTO_TCP);
773                 else
774                         req->features |= BIT_ULL(NPC_IPPROTO_SCTP);
775                 break;
776         case AH_V6_FLOW:
777         case ESP_V6_FLOW:
778                 pkt->etype = cpu_to_be16(ETH_P_IPV6);
779                 pmask->etype = cpu_to_be16(0xFFFF);
780                 req->features |= BIT_ULL(NPC_ETYPE);
781                 if (!ipv6_addr_any((struct in6_addr *)ah_esp_hdr->ip6src)) {
782                         memcpy(&pkt->ip6src, &ah_esp_hdr->ip6src,
783                                sizeof(pkt->ip6src));
784                         memcpy(&pmask->ip6src, &ah_esp_mask->ip6src,
785                                sizeof(pmask->ip6src));
786                         req->features |= BIT_ULL(NPC_SIP_IPV6);
787                 }
788                 if (!ipv6_addr_any((struct in6_addr *)ah_esp_hdr->ip6dst)) {
789                         memcpy(&pkt->ip6dst, &ah_esp_hdr->ip6dst,
790                                sizeof(pkt->ip6dst));
791                         memcpy(&pmask->ip6dst, &ah_esp_mask->ip6dst,
792                                sizeof(pmask->ip6dst));
793                         req->features |= BIT_ULL(NPC_DIP_IPV6);
794                 }
795
796                 /* NPC profile doesn't extract AH/ESP header fields */
797                 if ((ah_esp_mask->spi & ah_esp_hdr->spi) ||
798                     (ah_esp_mask->tclass & ah_esp_hdr->tclass))
799                         return -EOPNOTSUPP;
800
801                 if (flow_type == AH_V6_FLOW)
802                         req->features |= BIT_ULL(NPC_IPPROTO_AH);
803                 else
804                         req->features |= BIT_ULL(NPC_IPPROTO_ESP);
805                 break;
806         default:
807                 break;
808         }
809
810         return 0;
811 }
812
813 static int otx2_prepare_flow_request(struct ethtool_rx_flow_spec *fsp,
814                               struct npc_install_flow_req *req)
815 {
816         struct ethhdr *eth_mask = &fsp->m_u.ether_spec;
817         struct ethhdr *eth_hdr = &fsp->h_u.ether_spec;
818         struct flow_msg *pmask = &req->mask;
819         struct flow_msg *pkt = &req->packet;
820         u32 flow_type;
821         int ret;
822
823         flow_type = fsp->flow_type & ~(FLOW_EXT | FLOW_MAC_EXT | FLOW_RSS);
824         switch (flow_type) {
825         /* bits not set in mask are don't care */
826         case ETHER_FLOW:
827                 if (!is_zero_ether_addr(eth_mask->h_source)) {
828                         ether_addr_copy(pkt->smac, eth_hdr->h_source);
829                         ether_addr_copy(pmask->smac, eth_mask->h_source);
830                         req->features |= BIT_ULL(NPC_SMAC);
831                 }
832                 if (!is_zero_ether_addr(eth_mask->h_dest)) {
833                         ether_addr_copy(pkt->dmac, eth_hdr->h_dest);
834                         ether_addr_copy(pmask->dmac, eth_mask->h_dest);
835                         req->features |= BIT_ULL(NPC_DMAC);
836                 }
837                 if (eth_hdr->h_proto) {
838                         memcpy(&pkt->etype, &eth_hdr->h_proto,
839                                sizeof(pkt->etype));
840                         memcpy(&pmask->etype, &eth_mask->h_proto,
841                                sizeof(pmask->etype));
842                         req->features |= BIT_ULL(NPC_ETYPE);
843                 }
844                 break;
845         case IP_USER_FLOW:
846         case TCP_V4_FLOW:
847         case UDP_V4_FLOW:
848         case SCTP_V4_FLOW:
849         case AH_V4_FLOW:
850         case ESP_V4_FLOW:
851                 ret = otx2_prepare_ipv4_flow(fsp, req, flow_type);
852                 if (ret)
853                         return ret;
854                 break;
855         case IPV6_USER_FLOW:
856         case TCP_V6_FLOW:
857         case UDP_V6_FLOW:
858         case SCTP_V6_FLOW:
859         case AH_V6_FLOW:
860         case ESP_V6_FLOW:
861                 ret = otx2_prepare_ipv6_flow(fsp, req, flow_type);
862                 if (ret)
863                         return ret;
864                 break;
865         default:
866                 return -EOPNOTSUPP;
867         }
868         if (fsp->flow_type & FLOW_EXT) {
869                 u16 vlan_etype;
870
871                 if (fsp->m_ext.vlan_etype) {
872                         /* Partial masks not supported */
873                         if (be16_to_cpu(fsp->m_ext.vlan_etype) != 0xFFFF)
874                                 return -EINVAL;
875
876                         vlan_etype = be16_to_cpu(fsp->h_ext.vlan_etype);
877
878                         /* Drop rule with vlan_etype == 802.1Q
879                          * and vlan_id == 0 is not supported
880                          */
881                         if (vlan_etype == ETH_P_8021Q && !fsp->m_ext.vlan_tci &&
882                             fsp->ring_cookie == RX_CLS_FLOW_DISC)
883                                 return -EINVAL;
884
885                         /* Only ETH_P_8021Q and ETH_P_802AD types supported */
886                         if (vlan_etype != ETH_P_8021Q &&
887                             vlan_etype != ETH_P_8021AD)
888                                 return -EINVAL;
889
890                         memcpy(&pkt->vlan_etype, &fsp->h_ext.vlan_etype,
891                                sizeof(pkt->vlan_etype));
892                         memcpy(&pmask->vlan_etype, &fsp->m_ext.vlan_etype,
893                                sizeof(pmask->vlan_etype));
894
895                         if (vlan_etype == ETH_P_8021Q)
896                                 req->features |= BIT_ULL(NPC_VLAN_ETYPE_CTAG);
897                         else
898                                 req->features |= BIT_ULL(NPC_VLAN_ETYPE_STAG);
899                 }
900
901                 if (fsp->m_ext.vlan_tci) {
902                         memcpy(&pkt->vlan_tci, &fsp->h_ext.vlan_tci,
903                                sizeof(pkt->vlan_tci));
904                         memcpy(&pmask->vlan_tci, &fsp->m_ext.vlan_tci,
905                                sizeof(pmask->vlan_tci));
906                         req->features |= BIT_ULL(NPC_OUTER_VID);
907                 }
908
909                 if (fsp->m_ext.data[1]) {
910                         if (flow_type == IP_USER_FLOW) {
911                                 if (be32_to_cpu(fsp->h_ext.data[1]) != IPV4_FLAG_MORE)
912                                         return -EINVAL;
913
914                                 pkt->ip_flag = be32_to_cpu(fsp->h_ext.data[1]);
915                                 pmask->ip_flag = be32_to_cpu(fsp->m_ext.data[1]);
916                                 req->features |= BIT_ULL(NPC_IPFRAG_IPV4);
917                         } else if (fsp->h_ext.data[1] ==
918                                         cpu_to_be32(OTX2_DEFAULT_ACTION)) {
919                                 /* Not Drop/Direct to queue but use action
920                                  * in default entry
921                                  */
922                                 req->op = NIX_RX_ACTION_DEFAULT;
923                         }
924                 }
925         }
926
927         if (fsp->flow_type & FLOW_MAC_EXT &&
928             !is_zero_ether_addr(fsp->m_ext.h_dest)) {
929                 ether_addr_copy(pkt->dmac, fsp->h_ext.h_dest);
930                 ether_addr_copy(pmask->dmac, fsp->m_ext.h_dest);
931                 req->features |= BIT_ULL(NPC_DMAC);
932         }
933
934         if (!req->features)
935                 return -EOPNOTSUPP;
936
937         return 0;
938 }
939
940 static int otx2_is_flow_rule_dmacfilter(struct otx2_nic *pfvf,
941                                         struct ethtool_rx_flow_spec *fsp)
942 {
943         struct ethhdr *eth_mask = &fsp->m_u.ether_spec;
944         struct ethhdr *eth_hdr = &fsp->h_u.ether_spec;
945         u64 ring_cookie = fsp->ring_cookie;
946         u32 flow_type;
947
948         if (!(pfvf->flags & OTX2_FLAG_DMACFLTR_SUPPORT))
949                 return false;
950
951         flow_type = fsp->flow_type & ~(FLOW_EXT | FLOW_MAC_EXT | FLOW_RSS);
952
953         /* CGX/RPM block dmac filtering configured for white listing
954          * check for action other than DROP
955          */
956         if (flow_type == ETHER_FLOW && ring_cookie != RX_CLS_FLOW_DISC &&
957             !ethtool_get_flow_spec_ring_vf(ring_cookie)) {
958                 if (is_zero_ether_addr(eth_mask->h_dest) &&
959                     is_valid_ether_addr(eth_hdr->h_dest))
960                         return true;
961         }
962
963         return false;
964 }
965
966 static int otx2_add_flow_msg(struct otx2_nic *pfvf, struct otx2_flow *flow)
967 {
968         u64 ring_cookie = flow->flow_spec.ring_cookie;
969 #ifdef CONFIG_DCB
970         int vlan_prio, qidx, pfc_rule = 0;
971 #endif
972         struct npc_install_flow_req *req;
973         int err, vf = 0;
974
975         mutex_lock(&pfvf->mbox.lock);
976         req = otx2_mbox_alloc_msg_npc_install_flow(&pfvf->mbox);
977         if (!req) {
978                 mutex_unlock(&pfvf->mbox.lock);
979                 return -ENOMEM;
980         }
981
982         err = otx2_prepare_flow_request(&flow->flow_spec, req);
983         if (err) {
984                 /* free the allocated msg above */
985                 otx2_mbox_reset(&pfvf->mbox.mbox, 0);
986                 mutex_unlock(&pfvf->mbox.lock);
987                 return err;
988         }
989
990         req->entry = flow->entry;
991         req->intf = NIX_INTF_RX;
992         req->set_cntr = 1;
993         req->channel = pfvf->hw.rx_chan_base;
994         if (ring_cookie == RX_CLS_FLOW_DISC) {
995                 req->op = NIX_RX_ACTIONOP_DROP;
996         } else {
997                 /* change to unicast only if action of default entry is not
998                  * requested by user
999                  */
1000                 if (flow->flow_spec.flow_type & FLOW_RSS) {
1001                         req->op = NIX_RX_ACTIONOP_RSS;
1002                         req->index = flow->rss_ctx_id;
1003                         req->flow_key_alg = pfvf->hw.flowkey_alg_idx;
1004                 } else {
1005                         req->op = NIX_RX_ACTIONOP_UCAST;
1006                         req->index = ethtool_get_flow_spec_ring(ring_cookie);
1007                 }
1008                 vf = ethtool_get_flow_spec_ring_vf(ring_cookie);
1009                 if (vf > pci_num_vf(pfvf->pdev)) {
1010                         mutex_unlock(&pfvf->mbox.lock);
1011                         return -EINVAL;
1012                 }
1013
1014 #ifdef CONFIG_DCB
1015                 /* Identify PFC rule if PFC enabled and ntuple rule is vlan */
1016                 if (!vf && (req->features & BIT_ULL(NPC_OUTER_VID)) &&
1017                     pfvf->pfc_en && req->op != NIX_RX_ACTIONOP_RSS) {
1018                         vlan_prio = ntohs(req->packet.vlan_tci) &
1019                                     ntohs(req->mask.vlan_tci);
1020
1021                         /* Get the priority */
1022                         vlan_prio >>= 13;
1023                         flow->rule_type |= PFC_FLOWCTRL_RULE;
1024                         /* Check if PFC enabled for this priority */
1025                         if (pfvf->pfc_en & BIT(vlan_prio)) {
1026                                 pfc_rule = true;
1027                                 qidx = req->index;
1028                         }
1029                 }
1030 #endif
1031         }
1032
1033         /* ethtool ring_cookie has (VF + 1) for VF */
1034         if (vf) {
1035                 req->vf = vf;
1036                 flow->is_vf = true;
1037                 flow->vf = vf;
1038         }
1039
1040         /* Send message to AF */
1041         err = otx2_sync_mbox_msg(&pfvf->mbox);
1042
1043 #ifdef CONFIG_DCB
1044         if (!err && pfc_rule)
1045                 otx2_update_bpid_in_rqctx(pfvf, vlan_prio, qidx, true);
1046 #endif
1047
1048         mutex_unlock(&pfvf->mbox.lock);
1049         return err;
1050 }
1051
1052 static int otx2_add_flow_with_pfmac(struct otx2_nic *pfvf,
1053                                     struct otx2_flow *flow)
1054 {
1055         struct otx2_flow *pf_mac;
1056         struct ethhdr *eth_hdr;
1057
1058         pf_mac = kzalloc(sizeof(*pf_mac), GFP_KERNEL);
1059         if (!pf_mac)
1060                 return -ENOMEM;
1061
1062         pf_mac->entry = 0;
1063         pf_mac->rule_type |= DMAC_FILTER_RULE;
1064         pf_mac->location = pfvf->flow_cfg->max_flows;
1065         memcpy(&pf_mac->flow_spec, &flow->flow_spec,
1066                sizeof(struct ethtool_rx_flow_spec));
1067         pf_mac->flow_spec.location = pf_mac->location;
1068
1069         /* Copy PF mac address */
1070         eth_hdr = &pf_mac->flow_spec.h_u.ether_spec;
1071         ether_addr_copy(eth_hdr->h_dest, pfvf->netdev->dev_addr);
1072
1073         /* Install DMAC filter with PF mac address */
1074         otx2_dmacflt_add(pfvf, eth_hdr->h_dest, 0);
1075
1076         otx2_add_flow_to_list(pfvf, pf_mac);
1077         pfvf->flow_cfg->nr_flows++;
1078         set_bit(0, pfvf->flow_cfg->dmacflt_bmap);
1079
1080         return 0;
1081 }
1082
1083 int otx2_add_flow(struct otx2_nic *pfvf, struct ethtool_rxnfc *nfc)
1084 {
1085         struct otx2_flow_config *flow_cfg = pfvf->flow_cfg;
1086         struct ethtool_rx_flow_spec *fsp = &nfc->fs;
1087         struct otx2_flow *flow;
1088         struct ethhdr *eth_hdr;
1089         bool new = false;
1090         int err = 0;
1091         u64 vf_num;
1092         u32 ring;
1093
1094         if (!flow_cfg->max_flows) {
1095                 netdev_err(pfvf->netdev,
1096                            "Ntuple rule count is 0, allocate and retry\n");
1097                 return -EINVAL;
1098         }
1099
1100         ring = ethtool_get_flow_spec_ring(fsp->ring_cookie);
1101         if (!(pfvf->flags & OTX2_FLAG_NTUPLE_SUPPORT))
1102                 return -ENOMEM;
1103
1104         /* Number of queues on a VF can be greater or less than
1105          * the PF's queue. Hence no need to check for the
1106          * queue count. Hence no need to check queue count if PF
1107          * is installing for its VF. Below is the expected vf_num value
1108          * based on the ethtool commands.
1109          *
1110          * e.g.
1111          * 1. ethtool -U <netdev> ... action -1  ==> vf_num:255
1112          * 2. ethtool -U <netdev> ... action <queue_num>  ==> vf_num:0
1113          * 3. ethtool -U <netdev> ... vf <vf_idx> queue <queue_num>  ==>
1114          *    vf_num:vf_idx+1
1115          */
1116         vf_num = ethtool_get_flow_spec_ring_vf(fsp->ring_cookie);
1117         if (!is_otx2_vf(pfvf->pcifunc) && !vf_num &&
1118             ring >= pfvf->hw.rx_queues && fsp->ring_cookie != RX_CLS_FLOW_DISC)
1119                 return -EINVAL;
1120
1121         if (fsp->location >= otx2_get_maxflows(flow_cfg))
1122                 return -EINVAL;
1123
1124         flow = otx2_find_flow(pfvf, fsp->location);
1125         if (!flow) {
1126                 flow = kzalloc(sizeof(*flow), GFP_KERNEL);
1127                 if (!flow)
1128                         return -ENOMEM;
1129                 flow->location = fsp->location;
1130                 flow->entry = flow_cfg->flow_ent[flow->location];
1131                 new = true;
1132         }
1133         /* struct copy */
1134         flow->flow_spec = *fsp;
1135
1136         if (fsp->flow_type & FLOW_RSS)
1137                 flow->rss_ctx_id = nfc->rss_context;
1138
1139         if (otx2_is_flow_rule_dmacfilter(pfvf, &flow->flow_spec)) {
1140                 eth_hdr = &flow->flow_spec.h_u.ether_spec;
1141
1142                 /* Sync dmac filter table with updated fields */
1143                 if (flow->rule_type & DMAC_FILTER_RULE)
1144                         return otx2_dmacflt_update(pfvf, eth_hdr->h_dest,
1145                                                    flow->entry);
1146
1147                 if (bitmap_full(flow_cfg->dmacflt_bmap,
1148                                 flow_cfg->dmacflt_max_flows)) {
1149                         netdev_warn(pfvf->netdev,
1150                                     "Can't insert the rule %d as max allowed dmac filters are %d\n",
1151                                     flow->location +
1152                                     flow_cfg->dmacflt_max_flows,
1153                                     flow_cfg->dmacflt_max_flows);
1154                         err = -EINVAL;
1155                         if (new)
1156                                 kfree(flow);
1157                         return err;
1158                 }
1159
1160                 /* Install PF mac address to DMAC filter list */
1161                 if (!test_bit(0, flow_cfg->dmacflt_bmap))
1162                         otx2_add_flow_with_pfmac(pfvf, flow);
1163
1164                 flow->rule_type |= DMAC_FILTER_RULE;
1165                 flow->entry = find_first_zero_bit(flow_cfg->dmacflt_bmap,
1166                                                   flow_cfg->dmacflt_max_flows);
1167                 fsp->location = flow_cfg->max_flows + flow->entry;
1168                 flow->flow_spec.location = fsp->location;
1169                 flow->location = fsp->location;
1170
1171                 set_bit(flow->entry, flow_cfg->dmacflt_bmap);
1172                 otx2_dmacflt_add(pfvf, eth_hdr->h_dest, flow->entry);
1173
1174         } else {
1175                 if (flow->location >= pfvf->flow_cfg->max_flows) {
1176                         netdev_warn(pfvf->netdev,
1177                                     "Can't insert non dmac ntuple rule at %d, allowed range %d-0\n",
1178                                     flow->location,
1179                                     flow_cfg->max_flows - 1);
1180                         err = -EINVAL;
1181                 } else {
1182                         err = otx2_add_flow_msg(pfvf, flow);
1183                 }
1184         }
1185
1186         if (err) {
1187                 if (err == MBOX_MSG_INVALID)
1188                         err = -EINVAL;
1189                 if (new)
1190                         kfree(flow);
1191                 return err;
1192         }
1193
1194         /* add the new flow installed to list */
1195         if (new) {
1196                 otx2_add_flow_to_list(pfvf, flow);
1197                 flow_cfg->nr_flows++;
1198         }
1199
1200         if (flow->is_vf)
1201                 netdev_info(pfvf->netdev,
1202                             "Make sure that VF's queue number is within its queue limit\n");
1203         return 0;
1204 }
1205
1206 static int otx2_remove_flow_msg(struct otx2_nic *pfvf, u16 entry, bool all)
1207 {
1208         struct npc_delete_flow_req *req;
1209         int err;
1210
1211         mutex_lock(&pfvf->mbox.lock);
1212         req = otx2_mbox_alloc_msg_npc_delete_flow(&pfvf->mbox);
1213         if (!req) {
1214                 mutex_unlock(&pfvf->mbox.lock);
1215                 return -ENOMEM;
1216         }
1217
1218         req->entry = entry;
1219         if (all)
1220                 req->all = 1;
1221
1222         /* Send message to AF */
1223         err = otx2_sync_mbox_msg(&pfvf->mbox);
1224         mutex_unlock(&pfvf->mbox.lock);
1225         return err;
1226 }
1227
1228 static void otx2_update_rem_pfmac(struct otx2_nic *pfvf, int req)
1229 {
1230         struct otx2_flow *iter;
1231         struct ethhdr *eth_hdr;
1232         bool found = false;
1233
1234         list_for_each_entry(iter, &pfvf->flow_cfg->flow_list, list) {
1235                 if ((iter->rule_type & DMAC_FILTER_RULE) && iter->entry == 0) {
1236                         eth_hdr = &iter->flow_spec.h_u.ether_spec;
1237                         if (req == DMAC_ADDR_DEL) {
1238                                 otx2_dmacflt_remove(pfvf, eth_hdr->h_dest,
1239                                                     0);
1240                                 clear_bit(0, pfvf->flow_cfg->dmacflt_bmap);
1241                                 found = true;
1242                         } else {
1243                                 ether_addr_copy(eth_hdr->h_dest,
1244                                                 pfvf->netdev->dev_addr);
1245
1246                                 otx2_dmacflt_update(pfvf, eth_hdr->h_dest, 0);
1247                         }
1248                         break;
1249                 }
1250         }
1251
1252         if (found) {
1253                 list_del(&iter->list);
1254                 kfree(iter);
1255                 pfvf->flow_cfg->nr_flows--;
1256         }
1257 }
1258
1259 int otx2_remove_flow(struct otx2_nic *pfvf, u32 location)
1260 {
1261         struct otx2_flow_config *flow_cfg = pfvf->flow_cfg;
1262         struct otx2_flow *flow;
1263         int err;
1264
1265         if (location >= otx2_get_maxflows(flow_cfg))
1266                 return -EINVAL;
1267
1268         flow = otx2_find_flow(pfvf, location);
1269         if (!flow)
1270                 return -ENOENT;
1271
1272         if (flow->rule_type & DMAC_FILTER_RULE) {
1273                 struct ethhdr *eth_hdr = &flow->flow_spec.h_u.ether_spec;
1274
1275                 /* user not allowed to remove dmac filter with interface mac */
1276                 if (ether_addr_equal(pfvf->netdev->dev_addr, eth_hdr->h_dest))
1277                         return -EPERM;
1278
1279                 err = otx2_dmacflt_remove(pfvf, eth_hdr->h_dest,
1280                                           flow->entry);
1281                 clear_bit(flow->entry, flow_cfg->dmacflt_bmap);
1282                 /* If all dmac filters are removed delete macfilter with
1283                  * interface mac address and configure CGX/RPM block in
1284                  * promiscuous mode
1285                  */
1286                 if (bitmap_weight(flow_cfg->dmacflt_bmap,
1287                                   flow_cfg->dmacflt_max_flows) == 1)
1288                         otx2_update_rem_pfmac(pfvf, DMAC_ADDR_DEL);
1289         } else {
1290 #ifdef CONFIG_DCB
1291                 if (flow->rule_type & PFC_FLOWCTRL_RULE)
1292                         otx2_update_bpid_in_rqctx(pfvf, 0,
1293                                                   flow->flow_spec.ring_cookie,
1294                                                   false);
1295 #endif
1296
1297                 err = otx2_remove_flow_msg(pfvf, flow->entry, false);
1298         }
1299
1300         if (err)
1301                 return err;
1302
1303         list_del(&flow->list);
1304         kfree(flow);
1305         flow_cfg->nr_flows--;
1306
1307         return 0;
1308 }
1309
1310 void otx2_rss_ctx_flow_del(struct otx2_nic *pfvf, int ctx_id)
1311 {
1312         struct otx2_flow *flow, *tmp;
1313         int err;
1314
1315         list_for_each_entry_safe(flow, tmp, &pfvf->flow_cfg->flow_list, list) {
1316                 if (flow->rss_ctx_id != ctx_id)
1317                         continue;
1318                 err = otx2_remove_flow(pfvf, flow->location);
1319                 if (err)
1320                         netdev_warn(pfvf->netdev,
1321                                     "Can't delete the rule %d associated with this rss group err:%d",
1322                                     flow->location, err);
1323         }
1324 }
1325
1326 int otx2_destroy_ntuple_flows(struct otx2_nic *pfvf)
1327 {
1328         struct otx2_flow_config *flow_cfg = pfvf->flow_cfg;
1329         struct npc_delete_flow_req *req;
1330         struct otx2_flow *iter, *tmp;
1331         int err;
1332
1333         if (!(pfvf->flags & OTX2_FLAG_NTUPLE_SUPPORT))
1334                 return 0;
1335
1336         if (!flow_cfg->max_flows)
1337                 return 0;
1338
1339         mutex_lock(&pfvf->mbox.lock);
1340         req = otx2_mbox_alloc_msg_npc_delete_flow(&pfvf->mbox);
1341         if (!req) {
1342                 mutex_unlock(&pfvf->mbox.lock);
1343                 return -ENOMEM;
1344         }
1345
1346         req->start = flow_cfg->flow_ent[0];
1347         req->end   = flow_cfg->flow_ent[flow_cfg->max_flows - 1];
1348         err = otx2_sync_mbox_msg(&pfvf->mbox);
1349         mutex_unlock(&pfvf->mbox.lock);
1350
1351         list_for_each_entry_safe(iter, tmp, &flow_cfg->flow_list, list) {
1352                 list_del(&iter->list);
1353                 kfree(iter);
1354                 flow_cfg->nr_flows--;
1355         }
1356         return err;
1357 }
1358
1359 int otx2_destroy_mcam_flows(struct otx2_nic *pfvf)
1360 {
1361         struct otx2_flow_config *flow_cfg = pfvf->flow_cfg;
1362         struct npc_mcam_free_entry_req *req;
1363         struct otx2_flow *iter, *tmp;
1364         int err;
1365
1366         if (!(pfvf->flags & OTX2_FLAG_MCAM_ENTRIES_ALLOC))
1367                 return 0;
1368
1369         /* remove all flows */
1370         err = otx2_remove_flow_msg(pfvf, 0, true);
1371         if (err)
1372                 return err;
1373
1374         list_for_each_entry_safe(iter, tmp, &flow_cfg->flow_list, list) {
1375                 list_del(&iter->list);
1376                 kfree(iter);
1377                 flow_cfg->nr_flows--;
1378         }
1379
1380         mutex_lock(&pfvf->mbox.lock);
1381         req = otx2_mbox_alloc_msg_npc_mcam_free_entry(&pfvf->mbox);
1382         if (!req) {
1383                 mutex_unlock(&pfvf->mbox.lock);
1384                 return -ENOMEM;
1385         }
1386
1387         req->all = 1;
1388         /* Send message to AF to free MCAM entries */
1389         err = otx2_sync_mbox_msg(&pfvf->mbox);
1390         if (err) {
1391                 mutex_unlock(&pfvf->mbox.lock);
1392                 return err;
1393         }
1394
1395         pfvf->flags &= ~OTX2_FLAG_MCAM_ENTRIES_ALLOC;
1396         mutex_unlock(&pfvf->mbox.lock);
1397
1398         return 0;
1399 }
1400
1401 int otx2_install_rxvlan_offload_flow(struct otx2_nic *pfvf)
1402 {
1403         struct otx2_flow_config *flow_cfg = pfvf->flow_cfg;
1404         struct npc_install_flow_req *req;
1405         int err;
1406
1407         mutex_lock(&pfvf->mbox.lock);
1408         req = otx2_mbox_alloc_msg_npc_install_flow(&pfvf->mbox);
1409         if (!req) {
1410                 mutex_unlock(&pfvf->mbox.lock);
1411                 return -ENOMEM;
1412         }
1413
1414         req->entry = flow_cfg->def_ent[flow_cfg->rx_vlan_offset];
1415         req->intf = NIX_INTF_RX;
1416         ether_addr_copy(req->packet.dmac, pfvf->netdev->dev_addr);
1417         eth_broadcast_addr((u8 *)&req->mask.dmac);
1418         req->channel = pfvf->hw.rx_chan_base;
1419         req->op = NIX_RX_ACTION_DEFAULT;
1420         req->features = BIT_ULL(NPC_OUTER_VID) | BIT_ULL(NPC_DMAC);
1421         req->vtag0_valid = true;
1422         req->vtag0_type = NIX_AF_LFX_RX_VTAG_TYPE0;
1423
1424         /* Send message to AF */
1425         err = otx2_sync_mbox_msg(&pfvf->mbox);
1426         mutex_unlock(&pfvf->mbox.lock);
1427         return err;
1428 }
1429
1430 static int otx2_delete_rxvlan_offload_flow(struct otx2_nic *pfvf)
1431 {
1432         struct otx2_flow_config *flow_cfg = pfvf->flow_cfg;
1433         struct npc_delete_flow_req *req;
1434         int err;
1435
1436         mutex_lock(&pfvf->mbox.lock);
1437         req = otx2_mbox_alloc_msg_npc_delete_flow(&pfvf->mbox);
1438         if (!req) {
1439                 mutex_unlock(&pfvf->mbox.lock);
1440                 return -ENOMEM;
1441         }
1442
1443         req->entry = flow_cfg->def_ent[flow_cfg->rx_vlan_offset];
1444         /* Send message to AF */
1445         err = otx2_sync_mbox_msg(&pfvf->mbox);
1446         mutex_unlock(&pfvf->mbox.lock);
1447         return err;
1448 }
1449
1450 int otx2_enable_rxvlan(struct otx2_nic *pf, bool enable)
1451 {
1452         struct nix_vtag_config *req;
1453         struct mbox_msghdr *rsp_hdr;
1454         int err;
1455
1456         /* Dont have enough mcam entries */
1457         if (!(pf->flags & OTX2_FLAG_RX_VLAN_SUPPORT))
1458                 return -ENOMEM;
1459
1460         if (enable) {
1461                 err = otx2_install_rxvlan_offload_flow(pf);
1462                 if (err)
1463                         return err;
1464         } else {
1465                 err = otx2_delete_rxvlan_offload_flow(pf);
1466                 if (err)
1467                         return err;
1468         }
1469
1470         mutex_lock(&pf->mbox.lock);
1471         req = otx2_mbox_alloc_msg_nix_vtag_cfg(&pf->mbox);
1472         if (!req) {
1473                 mutex_unlock(&pf->mbox.lock);
1474                 return -ENOMEM;
1475         }
1476
1477         /* config strip, capture and size */
1478         req->vtag_size = VTAGSIZE_T4;
1479         req->cfg_type = 1; /* rx vlan cfg */
1480         req->rx.vtag_type = NIX_AF_LFX_RX_VTAG_TYPE0;
1481         req->rx.strip_vtag = enable;
1482         req->rx.capture_vtag = enable;
1483
1484         err = otx2_sync_mbox_msg(&pf->mbox);
1485         if (err) {
1486                 mutex_unlock(&pf->mbox.lock);
1487                 return err;
1488         }
1489
1490         rsp_hdr = otx2_mbox_get_rsp(&pf->mbox.mbox, 0, &req->hdr);
1491         if (IS_ERR(rsp_hdr)) {
1492                 mutex_unlock(&pf->mbox.lock);
1493                 return PTR_ERR(rsp_hdr);
1494         }
1495
1496         mutex_unlock(&pf->mbox.lock);
1497         return rsp_hdr->rc;
1498 }
1499
1500 void otx2_dmacflt_reinstall_flows(struct otx2_nic *pf)
1501 {
1502         struct otx2_flow *iter;
1503         struct ethhdr *eth_hdr;
1504
1505         list_for_each_entry(iter, &pf->flow_cfg->flow_list, list) {
1506                 if (iter->rule_type & DMAC_FILTER_RULE) {
1507                         eth_hdr = &iter->flow_spec.h_u.ether_spec;
1508                         otx2_dmacflt_add(pf, eth_hdr->h_dest,
1509                                          iter->entry);
1510                 }
1511         }
1512 }
1513
1514 void otx2_dmacflt_update_pfmac_flow(struct otx2_nic *pfvf)
1515 {
1516         otx2_update_rem_pfmac(pfvf, DMAC_ADDR_UPDATE);
1517 }