xref: /dpdk/drivers/net/cnxk/cn9k_flow.c (revision 8a44b2a511114d9bc658d934d6cf16a3d8150d6d)
1795ac238SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause
2795ac238SJerin Jacob  * Copyright(C) 2020 Marvell.
3795ac238SJerin Jacob  */
4795ac238SJerin Jacob #include <cnxk_flow.h>
5795ac238SJerin Jacob #include "cn9k_ethdev.h"
6795ac238SJerin Jacob #include "cn9k_flow.h"
7795ac238SJerin Jacob #include "cn9k_rx.h"
8795ac238SJerin Jacob 
9795ac238SJerin Jacob struct rte_flow *
cn9k_flow_create(struct rte_eth_dev * eth_dev,const struct rte_flow_attr * attr,const struct rte_flow_item pattern[],const struct rte_flow_action actions[],struct rte_flow_error * error)10795ac238SJerin Jacob cn9k_flow_create(struct rte_eth_dev *eth_dev, const struct rte_flow_attr *attr,
11795ac238SJerin Jacob 		 const struct rte_flow_item pattern[],
12795ac238SJerin Jacob 		 const struct rte_flow_action actions[],
13795ac238SJerin Jacob 		 struct rte_flow_error *error)
14795ac238SJerin Jacob {
15795ac238SJerin Jacob 	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
16795ac238SJerin Jacob 	struct roc_npc *npc = &dev->npc;
17795ac238SJerin Jacob 	struct roc_npc_flow *flow;
184c8c8516SSatha Rao 	int vtag_actions = 0;
19*8a44b2a5SHanumanth Pothula 	int mark_actions;
20795ac238SJerin Jacob 
21795ac238SJerin Jacob 	flow = cnxk_flow_create(eth_dev, attr, pattern, actions, error);
22795ac238SJerin Jacob 	if (!flow)
23795ac238SJerin Jacob 		return NULL;
24795ac238SJerin Jacob 
25*8a44b2a5SHanumanth Pothula 	mark_actions = roc_npc_mark_actions_get(npc);
26*8a44b2a5SHanumanth Pothula 
27*8a44b2a5SHanumanth Pothula 	if (mark_actions) {
28*8a44b2a5SHanumanth Pothula 		dev->rx_offload_flags |= NIX_RX_OFFLOAD_MARK_UPDATE_F;
29*8a44b2a5SHanumanth Pothula 		cn9k_eth_set_rx_function(eth_dev);
30*8a44b2a5SHanumanth Pothula 	}
31*8a44b2a5SHanumanth Pothula 
32795ac238SJerin Jacob 	vtag_actions = roc_npc_vtag_actions_get(npc);
33795ac238SJerin Jacob 
34795ac238SJerin Jacob 	if (vtag_actions) {
35795ac238SJerin Jacob 		dev->rx_offload_flags |= NIX_RX_OFFLOAD_VLAN_STRIP_F;
36795ac238SJerin Jacob 		cn9k_eth_set_rx_function(eth_dev);
37795ac238SJerin Jacob 	}
38795ac238SJerin Jacob 
39795ac238SJerin Jacob 	return (struct rte_flow *)flow;
40795ac238SJerin Jacob }
41795ac238SJerin Jacob 
42795ac238SJerin Jacob int
cn9k_flow_destroy(struct rte_eth_dev * eth_dev,struct rte_flow * rte_flow,struct rte_flow_error * error)43795ac238SJerin Jacob cn9k_flow_destroy(struct rte_eth_dev *eth_dev, struct rte_flow *rte_flow,
44795ac238SJerin Jacob 		  struct rte_flow_error *error)
45795ac238SJerin Jacob {
46795ac238SJerin Jacob 	struct roc_npc_flow *flow = (struct roc_npc_flow *)rte_flow;
47795ac238SJerin Jacob 	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
48795ac238SJerin Jacob 	struct roc_npc *npc = &dev->npc;
494c8c8516SSatha Rao 	int vtag_actions = 0;
50*8a44b2a5SHanumanth Pothula 	uint16_t match_id;
51*8a44b2a5SHanumanth Pothula 	int mark_actions;
52*8a44b2a5SHanumanth Pothula 
53*8a44b2a5SHanumanth Pothula 	match_id = (flow->npc_action >> NPC_RX_ACT_MATCH_OFFSET) &
54*8a44b2a5SHanumanth Pothula 		   NPC_RX_ACT_MATCH_MASK;
55*8a44b2a5SHanumanth Pothula 	if (match_id) {
56*8a44b2a5SHanumanth Pothula 		mark_actions = roc_npc_mark_actions_sub_return(npc, 1);
57*8a44b2a5SHanumanth Pothula 		if (mark_actions == 0) {
58*8a44b2a5SHanumanth Pothula 			dev->rx_offload_flags &= ~NIX_RX_OFFLOAD_MARK_UPDATE_F;
59*8a44b2a5SHanumanth Pothula 			cn9k_eth_set_rx_function(eth_dev);
60*8a44b2a5SHanumanth Pothula 		}
61*8a44b2a5SHanumanth Pothula 	}
62795ac238SJerin Jacob 
63795ac238SJerin Jacob 	vtag_actions = roc_npc_vtag_actions_get(npc);
64795ac238SJerin Jacob 	if (vtag_actions) {
65795ac238SJerin Jacob 		if (flow->nix_intf == ROC_NPC_INTF_RX) {
66795ac238SJerin Jacob 			vtag_actions = roc_npc_vtag_actions_sub_return(npc, 1);
67795ac238SJerin Jacob 			if (vtag_actions == 0) {
68795ac238SJerin Jacob 				dev->rx_offload_flags &=
69795ac238SJerin Jacob 					~NIX_RX_OFFLOAD_VLAN_STRIP_F;
70795ac238SJerin Jacob 				cn9k_eth_set_rx_function(eth_dev);
71795ac238SJerin Jacob 			}
72795ac238SJerin Jacob 		}
73795ac238SJerin Jacob 	}
74795ac238SJerin Jacob 
75795ac238SJerin Jacob 	return cnxk_flow_destroy(eth_dev, flow, error);
76795ac238SJerin Jacob }
77cbf10d7fSSatheesh Paul 
78cbf10d7fSSatheesh Paul int
cn9k_flow_info_get(struct rte_eth_dev * dev,struct rte_flow_port_info * port_info,struct rte_flow_queue_info * queue_info,struct rte_flow_error * err)79cbf10d7fSSatheesh Paul cn9k_flow_info_get(struct rte_eth_dev *dev, struct rte_flow_port_info *port_info,
80cbf10d7fSSatheesh Paul 		   struct rte_flow_queue_info *queue_info, struct rte_flow_error *err)
81cbf10d7fSSatheesh Paul {
82cbf10d7fSSatheesh Paul 	RTE_SET_USED(dev);
83cbf10d7fSSatheesh Paul 	RTE_SET_USED(err);
84cbf10d7fSSatheesh Paul 
85cbf10d7fSSatheesh Paul 	memset(port_info, 0, sizeof(*port_info));
86cbf10d7fSSatheesh Paul 	memset(queue_info, 0, sizeof(*queue_info));
87cbf10d7fSSatheesh Paul 
88cbf10d7fSSatheesh Paul 	port_info->max_nb_counters = CN9K_NPC_COUNTERS_MAX;
89cbf10d7fSSatheesh Paul 
90cbf10d7fSSatheesh Paul 	return 0;
91cbf10d7fSSatheesh Paul }
92