xref: /f-stack/dpdk/drivers/net/dpaa/dpaa_flow.c (revision 2d9fd380)
1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606  * Copyright 2017-2019 NXP
3*2d9fd380Sjfb8856606  */
4*2d9fd380Sjfb8856606 
5*2d9fd380Sjfb8856606 /* System headers */
6*2d9fd380Sjfb8856606 #include <stdio.h>
7*2d9fd380Sjfb8856606 #include <inttypes.h>
8*2d9fd380Sjfb8856606 #include <unistd.h>
9*2d9fd380Sjfb8856606 #include <sys/types.h>
10*2d9fd380Sjfb8856606 
11*2d9fd380Sjfb8856606 #include <dpaa_ethdev.h>
12*2d9fd380Sjfb8856606 #include <dpaa_flow.h>
13*2d9fd380Sjfb8856606 #include <rte_dpaa_logs.h>
14*2d9fd380Sjfb8856606 #include <fmlib/fm_port_ext.h>
15*2d9fd380Sjfb8856606 #include <fmlib/fm_vsp_ext.h>
16*2d9fd380Sjfb8856606 
17*2d9fd380Sjfb8856606 #define DPAA_MAX_NUM_ETH_DEV	8
18*2d9fd380Sjfb8856606 
19*2d9fd380Sjfb8856606 static inline
20*2d9fd380Sjfb8856606 ioc_fm_pcd_extract_entry_t *
SCH_EXT_ARR(ioc_fm_pcd_kg_scheme_params_t * scheme_params,int hdr_idx)21*2d9fd380Sjfb8856606 SCH_EXT_ARR(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
22*2d9fd380Sjfb8856606 {
23*2d9fd380Sjfb8856606 return &scheme_params->param.key_ext_and_hash.extract_array[hdr_idx];
24*2d9fd380Sjfb8856606 }
25*2d9fd380Sjfb8856606 
26*2d9fd380Sjfb8856606 #define SCH_EXT_HDR(scheme_params, hdr_idx) \
27*2d9fd380Sjfb8856606 	SCH_EXT_ARR(scheme_params, hdr_idx)->extract_params.extract_by_hdr
28*2d9fd380Sjfb8856606 
29*2d9fd380Sjfb8856606 #define SCH_EXT_FULL_FLD(scheme_params, hdr_idx) \
30*2d9fd380Sjfb8856606 	SCH_EXT_HDR(scheme_params, hdr_idx).extract_by_hdr_type.full_field
31*2d9fd380Sjfb8856606 
32*2d9fd380Sjfb8856606 /* FM global info */
33*2d9fd380Sjfb8856606 struct dpaa_fm_info {
34*2d9fd380Sjfb8856606 	t_handle fman_handle;
35*2d9fd380Sjfb8856606 	t_handle pcd_handle;
36*2d9fd380Sjfb8856606 };
37*2d9fd380Sjfb8856606 
38*2d9fd380Sjfb8856606 /*FM model to read and write from file */
39*2d9fd380Sjfb8856606 struct dpaa_fm_model {
40*2d9fd380Sjfb8856606 	uint32_t dev_count;
41*2d9fd380Sjfb8856606 	uint8_t device_order[DPAA_MAX_NUM_ETH_DEV];
42*2d9fd380Sjfb8856606 	t_fm_port_params fm_port_params[DPAA_MAX_NUM_ETH_DEV];
43*2d9fd380Sjfb8856606 	t_handle netenv_devid[DPAA_MAX_NUM_ETH_DEV];
44*2d9fd380Sjfb8856606 	t_handle scheme_devid[DPAA_MAX_NUM_ETH_DEV][2];
45*2d9fd380Sjfb8856606 };
46*2d9fd380Sjfb8856606 
47*2d9fd380Sjfb8856606 static struct dpaa_fm_info fm_info;
48*2d9fd380Sjfb8856606 static struct dpaa_fm_model fm_model;
49*2d9fd380Sjfb8856606 static const char *fm_log = "/tmp/fmdpdk.bin";
50*2d9fd380Sjfb8856606 
fm_default_vsp_id(struct fman_if * fif)51*2d9fd380Sjfb8856606 static inline uint8_t fm_default_vsp_id(struct fman_if *fif)
52*2d9fd380Sjfb8856606 {
53*2d9fd380Sjfb8856606 	/* Avoid being same as base profile which could be used
54*2d9fd380Sjfb8856606 	 * for kernel interface of shared mac.
55*2d9fd380Sjfb8856606 	 */
56*2d9fd380Sjfb8856606 	if (fif->base_profile_id)
57*2d9fd380Sjfb8856606 		return 0;
58*2d9fd380Sjfb8856606 	else
59*2d9fd380Sjfb8856606 		return DPAA_DEFAULT_RXQ_VSP_ID;
60*2d9fd380Sjfb8856606 }
61*2d9fd380Sjfb8856606 
fm_prev_cleanup(void)62*2d9fd380Sjfb8856606 static void fm_prev_cleanup(void)
63*2d9fd380Sjfb8856606 {
64*2d9fd380Sjfb8856606 	uint32_t fman_id = 0, i = 0, devid;
65*2d9fd380Sjfb8856606 	struct dpaa_if dpaa_intf = {0};
66*2d9fd380Sjfb8856606 	t_fm_pcd_params fm_pcd_params = {0};
67*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
68*2d9fd380Sjfb8856606 
69*2d9fd380Sjfb8856606 	fm_info.fman_handle = fm_open(fman_id);
70*2d9fd380Sjfb8856606 	if (!fm_info.fman_handle) {
71*2d9fd380Sjfb8856606 		printf("\n%s- unable to open FMAN", __func__);
72*2d9fd380Sjfb8856606 		return;
73*2d9fd380Sjfb8856606 	}
74*2d9fd380Sjfb8856606 
75*2d9fd380Sjfb8856606 	fm_pcd_params.h_fm = fm_info.fman_handle;
76*2d9fd380Sjfb8856606 	fm_pcd_params.prs_support = true;
77*2d9fd380Sjfb8856606 	fm_pcd_params.kg_support = true;
78*2d9fd380Sjfb8856606 	/* FM PCD Open */
79*2d9fd380Sjfb8856606 	fm_info.pcd_handle = fm_pcd_open(&fm_pcd_params);
80*2d9fd380Sjfb8856606 	if (!fm_info.pcd_handle) {
81*2d9fd380Sjfb8856606 		printf("\n%s- unable to open PCD", __func__);
82*2d9fd380Sjfb8856606 		return;
83*2d9fd380Sjfb8856606 	}
84*2d9fd380Sjfb8856606 
85*2d9fd380Sjfb8856606 	while (i < fm_model.dev_count) {
86*2d9fd380Sjfb8856606 		devid = fm_model.device_order[i];
87*2d9fd380Sjfb8856606 		/* FM Port Open */
88*2d9fd380Sjfb8856606 		fm_model.fm_port_params[devid].h_fm = fm_info.fman_handle;
89*2d9fd380Sjfb8856606 		dpaa_intf.port_handle =
90*2d9fd380Sjfb8856606 				fm_port_open(&fm_model.fm_port_params[devid]);
91*2d9fd380Sjfb8856606 		dpaa_intf.scheme_handle[0] = create_device(fm_info.pcd_handle,
92*2d9fd380Sjfb8856606 					fm_model.scheme_devid[devid][0]);
93*2d9fd380Sjfb8856606 		dpaa_intf.scheme_count = 1;
94*2d9fd380Sjfb8856606 		if (fm_model.scheme_devid[devid][1]) {
95*2d9fd380Sjfb8856606 			dpaa_intf.scheme_handle[1] =
96*2d9fd380Sjfb8856606 				create_device(fm_info.pcd_handle,
97*2d9fd380Sjfb8856606 					fm_model.scheme_devid[devid][1]);
98*2d9fd380Sjfb8856606 			if (dpaa_intf.scheme_handle[1])
99*2d9fd380Sjfb8856606 				dpaa_intf.scheme_count++;
100*2d9fd380Sjfb8856606 		}
101*2d9fd380Sjfb8856606 
102*2d9fd380Sjfb8856606 		dpaa_intf.netenv_handle = create_device(fm_info.pcd_handle,
103*2d9fd380Sjfb8856606 					fm_model.netenv_devid[devid]);
104*2d9fd380Sjfb8856606 		i++;
105*2d9fd380Sjfb8856606 		if (!dpaa_intf.netenv_handle ||
106*2d9fd380Sjfb8856606 			!dpaa_intf.scheme_handle[0] ||
107*2d9fd380Sjfb8856606 			!dpaa_intf.port_handle)
108*2d9fd380Sjfb8856606 			continue;
109*2d9fd380Sjfb8856606 
110*2d9fd380Sjfb8856606 		if (dpaa_fm_deconfig(&dpaa_intf, NULL))
111*2d9fd380Sjfb8856606 			printf("\nDPAA FM deconfig failed\n");
112*2d9fd380Sjfb8856606 	}
113*2d9fd380Sjfb8856606 
114*2d9fd380Sjfb8856606 	if (dpaa_fm_term())
115*2d9fd380Sjfb8856606 		printf("\nDPAA FM term failed\n");
116*2d9fd380Sjfb8856606 
117*2d9fd380Sjfb8856606 	memset(&fm_model, 0, sizeof(struct dpaa_fm_model));
118*2d9fd380Sjfb8856606 }
119*2d9fd380Sjfb8856606 
dpaa_write_fm_config_to_file(void)120*2d9fd380Sjfb8856606 void dpaa_write_fm_config_to_file(void)
121*2d9fd380Sjfb8856606 {
122*2d9fd380Sjfb8856606 	size_t bytes_write;
123*2d9fd380Sjfb8856606 	FILE *fp = fopen(fm_log, "wb");
124*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
125*2d9fd380Sjfb8856606 
126*2d9fd380Sjfb8856606 	if (!fp) {
127*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("File open failed");
128*2d9fd380Sjfb8856606 		return;
129*2d9fd380Sjfb8856606 	}
130*2d9fd380Sjfb8856606 	bytes_write = fwrite(&fm_model, sizeof(struct dpaa_fm_model), 1, fp);
131*2d9fd380Sjfb8856606 	if (!bytes_write) {
132*2d9fd380Sjfb8856606 		DPAA_PMD_WARN("No bytes write");
133*2d9fd380Sjfb8856606 		fclose(fp);
134*2d9fd380Sjfb8856606 		return;
135*2d9fd380Sjfb8856606 	}
136*2d9fd380Sjfb8856606 	fclose(fp);
137*2d9fd380Sjfb8856606 }
138*2d9fd380Sjfb8856606 
dpaa_read_fm_config_from_file(void)139*2d9fd380Sjfb8856606 static void dpaa_read_fm_config_from_file(void)
140*2d9fd380Sjfb8856606 {
141*2d9fd380Sjfb8856606 	size_t bytes_read;
142*2d9fd380Sjfb8856606 	FILE *fp = fopen(fm_log, "rb");
143*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
144*2d9fd380Sjfb8856606 
145*2d9fd380Sjfb8856606 	if (!fp)
146*2d9fd380Sjfb8856606 		return;
147*2d9fd380Sjfb8856606 	DPAA_PMD_INFO("Previous DPDK-FM config instance present, cleaning up.");
148*2d9fd380Sjfb8856606 
149*2d9fd380Sjfb8856606 	bytes_read = fread(&fm_model, sizeof(struct dpaa_fm_model), 1, fp);
150*2d9fd380Sjfb8856606 	if (!bytes_read) {
151*2d9fd380Sjfb8856606 		DPAA_PMD_WARN("No bytes read");
152*2d9fd380Sjfb8856606 		fclose(fp);
153*2d9fd380Sjfb8856606 		return;
154*2d9fd380Sjfb8856606 	}
155*2d9fd380Sjfb8856606 	fclose(fp);
156*2d9fd380Sjfb8856606 
157*2d9fd380Sjfb8856606 	/*FM cleanup from previous configured app */
158*2d9fd380Sjfb8856606 	fm_prev_cleanup();
159*2d9fd380Sjfb8856606 }
160*2d9fd380Sjfb8856606 
161*2d9fd380Sjfb8856606 static inline int
set_hash_params_eth(ioc_fm_pcd_kg_scheme_params_t * scheme_params,int hdr_idx)162*2d9fd380Sjfb8856606 set_hash_params_eth(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
163*2d9fd380Sjfb8856606 {
164*2d9fd380Sjfb8856606 	int k;
165*2d9fd380Sjfb8856606 
166*2d9fd380Sjfb8856606 	for (k = 0; k < 2; k++) {
167*2d9fd380Sjfb8856606 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
168*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
169*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
170*2d9fd380Sjfb8856606 						HEADER_TYPE_ETH;
171*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
172*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_HDR_INDEX_NONE;
173*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
174*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
175*2d9fd380Sjfb8856606 		if (k == 0)
176*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).eth =
177*2d9fd380Sjfb8856606 						IOC_NET_HF_ETH_SA;
178*2d9fd380Sjfb8856606 		else
179*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).eth =
180*2d9fd380Sjfb8856606 						IOC_NET_HF_ETH_DA;
181*2d9fd380Sjfb8856606 		hdr_idx++;
182*2d9fd380Sjfb8856606 	}
183*2d9fd380Sjfb8856606 	return hdr_idx;
184*2d9fd380Sjfb8856606 }
185*2d9fd380Sjfb8856606 
186*2d9fd380Sjfb8856606 static inline int
set_hash_params_ipv4(ioc_fm_pcd_kg_scheme_params_t * scheme_params,int hdr_idx)187*2d9fd380Sjfb8856606 set_hash_params_ipv4(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
188*2d9fd380Sjfb8856606 {
189*2d9fd380Sjfb8856606 	int k;
190*2d9fd380Sjfb8856606 
191*2d9fd380Sjfb8856606 	for (k = 0; k < 2; k++) {
192*2d9fd380Sjfb8856606 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
193*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
194*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
195*2d9fd380Sjfb8856606 						HEADER_TYPE_IPV4;
196*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
197*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_HDR_INDEX_NONE;
198*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
199*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
200*2d9fd380Sjfb8856606 		if (k == 0)
201*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv4 =
202*2d9fd380Sjfb8856606 					ioc_net_hf_ipv_4_src_ip;
203*2d9fd380Sjfb8856606 		else
204*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv4 =
205*2d9fd380Sjfb8856606 					ioc_net_hf_ipv_4_dst_ip;
206*2d9fd380Sjfb8856606 		hdr_idx++;
207*2d9fd380Sjfb8856606 	}
208*2d9fd380Sjfb8856606 	return hdr_idx;
209*2d9fd380Sjfb8856606 }
210*2d9fd380Sjfb8856606 
211*2d9fd380Sjfb8856606 static inline int
set_hash_params_ipv6(ioc_fm_pcd_kg_scheme_params_t * scheme_params,int hdr_idx)212*2d9fd380Sjfb8856606 set_hash_params_ipv6(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
213*2d9fd380Sjfb8856606 {
214*2d9fd380Sjfb8856606 	int k;
215*2d9fd380Sjfb8856606 
216*2d9fd380Sjfb8856606 	for (k = 0; k < 2; k++) {
217*2d9fd380Sjfb8856606 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
218*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
219*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
220*2d9fd380Sjfb8856606 							HEADER_TYPE_IPV6;
221*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
222*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_HDR_INDEX_NONE;
223*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
224*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
225*2d9fd380Sjfb8856606 		if (k == 0)
226*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv6 =
227*2d9fd380Sjfb8856606 					ioc_net_hf_ipv_6_src_ip;
228*2d9fd380Sjfb8856606 		else
229*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv6 =
230*2d9fd380Sjfb8856606 					ioc_net_hf_ipv_6_dst_ip;
231*2d9fd380Sjfb8856606 		hdr_idx++;
232*2d9fd380Sjfb8856606 	}
233*2d9fd380Sjfb8856606 	return hdr_idx;
234*2d9fd380Sjfb8856606 }
235*2d9fd380Sjfb8856606 
236*2d9fd380Sjfb8856606 static inline int
set_hash_params_udp(ioc_fm_pcd_kg_scheme_params_t * scheme_params,int hdr_idx)237*2d9fd380Sjfb8856606 set_hash_params_udp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
238*2d9fd380Sjfb8856606 {
239*2d9fd380Sjfb8856606 	int k;
240*2d9fd380Sjfb8856606 
241*2d9fd380Sjfb8856606 	for (k = 0; k < 2; k++) {
242*2d9fd380Sjfb8856606 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
243*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
244*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
245*2d9fd380Sjfb8856606 						HEADER_TYPE_UDP;
246*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
247*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_HDR_INDEX_NONE;
248*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
249*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
250*2d9fd380Sjfb8856606 		if (k == 0)
251*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).udp =
252*2d9fd380Sjfb8856606 					IOC_NET_HF_UDP_PORT_SRC;
253*2d9fd380Sjfb8856606 		else
254*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).udp =
255*2d9fd380Sjfb8856606 					IOC_NET_HF_UDP_PORT_DST;
256*2d9fd380Sjfb8856606 		hdr_idx++;
257*2d9fd380Sjfb8856606 	}
258*2d9fd380Sjfb8856606 	return hdr_idx;
259*2d9fd380Sjfb8856606 }
260*2d9fd380Sjfb8856606 
261*2d9fd380Sjfb8856606 static inline int
set_hash_params_tcp(ioc_fm_pcd_kg_scheme_params_t * scheme_params,int hdr_idx)262*2d9fd380Sjfb8856606 set_hash_params_tcp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
263*2d9fd380Sjfb8856606 {
264*2d9fd380Sjfb8856606 	int k;
265*2d9fd380Sjfb8856606 
266*2d9fd380Sjfb8856606 	for (k = 0; k < 2; k++) {
267*2d9fd380Sjfb8856606 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
268*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
269*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
270*2d9fd380Sjfb8856606 						HEADER_TYPE_TCP;
271*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
272*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_HDR_INDEX_NONE;
273*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
274*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
275*2d9fd380Sjfb8856606 		if (k == 0)
276*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).tcp =
277*2d9fd380Sjfb8856606 					IOC_NET_HF_TCP_PORT_SRC;
278*2d9fd380Sjfb8856606 		else
279*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).tcp =
280*2d9fd380Sjfb8856606 					IOC_NET_HF_TCP_PORT_DST;
281*2d9fd380Sjfb8856606 		hdr_idx++;
282*2d9fd380Sjfb8856606 	}
283*2d9fd380Sjfb8856606 	return hdr_idx;
284*2d9fd380Sjfb8856606 }
285*2d9fd380Sjfb8856606 
286*2d9fd380Sjfb8856606 static inline int
set_hash_params_sctp(ioc_fm_pcd_kg_scheme_params_t * scheme_params,int hdr_idx)287*2d9fd380Sjfb8856606 set_hash_params_sctp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
288*2d9fd380Sjfb8856606 {
289*2d9fd380Sjfb8856606 	int k;
290*2d9fd380Sjfb8856606 
291*2d9fd380Sjfb8856606 	for (k = 0; k < 2; k++) {
292*2d9fd380Sjfb8856606 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
293*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
294*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
295*2d9fd380Sjfb8856606 						HEADER_TYPE_SCTP;
296*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
297*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_HDR_INDEX_NONE;
298*2d9fd380Sjfb8856606 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
299*2d9fd380Sjfb8856606 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
300*2d9fd380Sjfb8856606 		if (k == 0)
301*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).sctp =
302*2d9fd380Sjfb8856606 					IOC_NET_HF_SCTP_PORT_SRC;
303*2d9fd380Sjfb8856606 		else
304*2d9fd380Sjfb8856606 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).sctp =
305*2d9fd380Sjfb8856606 					IOC_NET_HF_SCTP_PORT_DST;
306*2d9fd380Sjfb8856606 		hdr_idx++;
307*2d9fd380Sjfb8856606 	}
308*2d9fd380Sjfb8856606 	return hdr_idx;
309*2d9fd380Sjfb8856606 }
310*2d9fd380Sjfb8856606 
311*2d9fd380Sjfb8856606 /* Set scheme params for hash distribution */
set_scheme_params(ioc_fm_pcd_kg_scheme_params_t * scheme_params,ioc_fm_pcd_net_env_params_t * dist_units,struct dpaa_if * dpaa_intf,struct fman_if * fif)312*2d9fd380Sjfb8856606 static int set_scheme_params(ioc_fm_pcd_kg_scheme_params_t *scheme_params,
313*2d9fd380Sjfb8856606 	ioc_fm_pcd_net_env_params_t *dist_units,
314*2d9fd380Sjfb8856606 	struct dpaa_if *dpaa_intf,
315*2d9fd380Sjfb8856606 	struct fman_if *fif)
316*2d9fd380Sjfb8856606 {
317*2d9fd380Sjfb8856606 	int dist_idx, hdr_idx = 0;
318*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
319*2d9fd380Sjfb8856606 
320*2d9fd380Sjfb8856606 	if (fif->num_profiles) {
321*2d9fd380Sjfb8856606 		scheme_params->param.override_storage_profile = true;
322*2d9fd380Sjfb8856606 		scheme_params->param.storage_profile.direct = true;
323*2d9fd380Sjfb8856606 		scheme_params->param.storage_profile.profile_select
324*2d9fd380Sjfb8856606 			.direct_relative_profile_id = fm_default_vsp_id(fif);
325*2d9fd380Sjfb8856606 	}
326*2d9fd380Sjfb8856606 
327*2d9fd380Sjfb8856606 	scheme_params->param.use_hash = 1;
328*2d9fd380Sjfb8856606 	scheme_params->param.modify = false;
329*2d9fd380Sjfb8856606 	scheme_params->param.always_direct = false;
330*2d9fd380Sjfb8856606 	scheme_params->param.scheme_counter.update = 1;
331*2d9fd380Sjfb8856606 	scheme_params->param.scheme_counter.value = 0;
332*2d9fd380Sjfb8856606 	scheme_params->param.next_engine = e_IOC_FM_PCD_DONE;
333*2d9fd380Sjfb8856606 	scheme_params->param.base_fqid = dpaa_intf->rx_queues[0].fqid;
334*2d9fd380Sjfb8856606 	scheme_params->param.net_env_params.net_env_id =
335*2d9fd380Sjfb8856606 		dpaa_intf->netenv_handle;
336*2d9fd380Sjfb8856606 	scheme_params->param.net_env_params.num_of_distinction_units =
337*2d9fd380Sjfb8856606 		dist_units->param.num_of_distinction_units;
338*2d9fd380Sjfb8856606 
339*2d9fd380Sjfb8856606 	scheme_params->param.key_ext_and_hash.hash_dist_num_of_fqids =
340*2d9fd380Sjfb8856606 			dpaa_intf->nb_rx_queues;
341*2d9fd380Sjfb8856606 	scheme_params->param.key_ext_and_hash.num_of_used_extracts =
342*2d9fd380Sjfb8856606 			2 * dist_units->param.num_of_distinction_units;
343*2d9fd380Sjfb8856606 
344*2d9fd380Sjfb8856606 	for (dist_idx = 0; dist_idx <
345*2d9fd380Sjfb8856606 		dist_units->param.num_of_distinction_units;
346*2d9fd380Sjfb8856606 		dist_idx++) {
347*2d9fd380Sjfb8856606 		switch (dist_units->param.units[dist_idx].hdrs[0].hdr) {
348*2d9fd380Sjfb8856606 		case HEADER_TYPE_ETH:
349*2d9fd380Sjfb8856606 			hdr_idx = set_hash_params_eth(scheme_params, hdr_idx);
350*2d9fd380Sjfb8856606 			break;
351*2d9fd380Sjfb8856606 
352*2d9fd380Sjfb8856606 		case HEADER_TYPE_IPV4:
353*2d9fd380Sjfb8856606 			hdr_idx = set_hash_params_ipv4(scheme_params, hdr_idx);
354*2d9fd380Sjfb8856606 			break;
355*2d9fd380Sjfb8856606 
356*2d9fd380Sjfb8856606 		case HEADER_TYPE_IPV6:
357*2d9fd380Sjfb8856606 			hdr_idx = set_hash_params_ipv6(scheme_params, hdr_idx);
358*2d9fd380Sjfb8856606 			break;
359*2d9fd380Sjfb8856606 
360*2d9fd380Sjfb8856606 		case HEADER_TYPE_UDP:
361*2d9fd380Sjfb8856606 			hdr_idx = set_hash_params_udp(scheme_params, hdr_idx);
362*2d9fd380Sjfb8856606 			break;
363*2d9fd380Sjfb8856606 
364*2d9fd380Sjfb8856606 		case HEADER_TYPE_TCP:
365*2d9fd380Sjfb8856606 			hdr_idx = set_hash_params_tcp(scheme_params, hdr_idx);
366*2d9fd380Sjfb8856606 			break;
367*2d9fd380Sjfb8856606 
368*2d9fd380Sjfb8856606 		case HEADER_TYPE_SCTP:
369*2d9fd380Sjfb8856606 			hdr_idx = set_hash_params_sctp(scheme_params, hdr_idx);
370*2d9fd380Sjfb8856606 			break;
371*2d9fd380Sjfb8856606 
372*2d9fd380Sjfb8856606 		default:
373*2d9fd380Sjfb8856606 			DPAA_PMD_ERR("Invalid Distinction Unit");
374*2d9fd380Sjfb8856606 			return -1;
375*2d9fd380Sjfb8856606 		}
376*2d9fd380Sjfb8856606 	}
377*2d9fd380Sjfb8856606 
378*2d9fd380Sjfb8856606 	return 0;
379*2d9fd380Sjfb8856606 }
380*2d9fd380Sjfb8856606 
set_dist_units(ioc_fm_pcd_net_env_params_t * dist_units,uint64_t req_dist_set)381*2d9fd380Sjfb8856606 static void set_dist_units(ioc_fm_pcd_net_env_params_t *dist_units,
382*2d9fd380Sjfb8856606 			   uint64_t req_dist_set)
383*2d9fd380Sjfb8856606 {
384*2d9fd380Sjfb8856606 	uint32_t loop = 0, dist_idx = 0, dist_field = 0;
385*2d9fd380Sjfb8856606 	int l2_configured = 0, ipv4_configured = 0, ipv6_configured = 0;
386*2d9fd380Sjfb8856606 	int udp_configured = 0, tcp_configured = 0, sctp_configured = 0;
387*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
388*2d9fd380Sjfb8856606 
389*2d9fd380Sjfb8856606 	if (!req_dist_set)
390*2d9fd380Sjfb8856606 		dist_units->param.units[dist_idx++].hdrs[0].hdr =
391*2d9fd380Sjfb8856606 			HEADER_TYPE_ETH;
392*2d9fd380Sjfb8856606 
393*2d9fd380Sjfb8856606 	while (req_dist_set) {
394*2d9fd380Sjfb8856606 		if (req_dist_set % 2 != 0) {
395*2d9fd380Sjfb8856606 			dist_field = 1U << loop;
396*2d9fd380Sjfb8856606 			switch (dist_field) {
397*2d9fd380Sjfb8856606 			case ETH_RSS_L2_PAYLOAD:
398*2d9fd380Sjfb8856606 
399*2d9fd380Sjfb8856606 				if (l2_configured)
400*2d9fd380Sjfb8856606 					break;
401*2d9fd380Sjfb8856606 				l2_configured = 1;
402*2d9fd380Sjfb8856606 
403*2d9fd380Sjfb8856606 				dist_units->param.units[dist_idx++].hdrs[0].hdr
404*2d9fd380Sjfb8856606 					= HEADER_TYPE_ETH;
405*2d9fd380Sjfb8856606 				break;
406*2d9fd380Sjfb8856606 
407*2d9fd380Sjfb8856606 			case ETH_RSS_IPV4:
408*2d9fd380Sjfb8856606 			case ETH_RSS_FRAG_IPV4:
409*2d9fd380Sjfb8856606 			case ETH_RSS_NONFRAG_IPV4_OTHER:
410*2d9fd380Sjfb8856606 
411*2d9fd380Sjfb8856606 				if (ipv4_configured)
412*2d9fd380Sjfb8856606 					break;
413*2d9fd380Sjfb8856606 				ipv4_configured = 1;
414*2d9fd380Sjfb8856606 				dist_units->param.units[dist_idx++].hdrs[0].hdr
415*2d9fd380Sjfb8856606 					= HEADER_TYPE_IPV4;
416*2d9fd380Sjfb8856606 				break;
417*2d9fd380Sjfb8856606 
418*2d9fd380Sjfb8856606 			case ETH_RSS_IPV6:
419*2d9fd380Sjfb8856606 			case ETH_RSS_FRAG_IPV6:
420*2d9fd380Sjfb8856606 			case ETH_RSS_NONFRAG_IPV6_OTHER:
421*2d9fd380Sjfb8856606 			case ETH_RSS_IPV6_EX:
422*2d9fd380Sjfb8856606 
423*2d9fd380Sjfb8856606 				if (ipv6_configured)
424*2d9fd380Sjfb8856606 					break;
425*2d9fd380Sjfb8856606 				ipv6_configured = 1;
426*2d9fd380Sjfb8856606 				dist_units->param.units[dist_idx++].hdrs[0].hdr
427*2d9fd380Sjfb8856606 					= HEADER_TYPE_IPV6;
428*2d9fd380Sjfb8856606 				break;
429*2d9fd380Sjfb8856606 
430*2d9fd380Sjfb8856606 			case ETH_RSS_NONFRAG_IPV4_TCP:
431*2d9fd380Sjfb8856606 			case ETH_RSS_NONFRAG_IPV6_TCP:
432*2d9fd380Sjfb8856606 			case ETH_RSS_IPV6_TCP_EX:
433*2d9fd380Sjfb8856606 
434*2d9fd380Sjfb8856606 				if (tcp_configured)
435*2d9fd380Sjfb8856606 					break;
436*2d9fd380Sjfb8856606 				tcp_configured = 1;
437*2d9fd380Sjfb8856606 				dist_units->param.units[dist_idx++].hdrs[0].hdr
438*2d9fd380Sjfb8856606 					= HEADER_TYPE_TCP;
439*2d9fd380Sjfb8856606 				break;
440*2d9fd380Sjfb8856606 
441*2d9fd380Sjfb8856606 			case ETH_RSS_NONFRAG_IPV4_UDP:
442*2d9fd380Sjfb8856606 			case ETH_RSS_NONFRAG_IPV6_UDP:
443*2d9fd380Sjfb8856606 			case ETH_RSS_IPV6_UDP_EX:
444*2d9fd380Sjfb8856606 
445*2d9fd380Sjfb8856606 				if (udp_configured)
446*2d9fd380Sjfb8856606 					break;
447*2d9fd380Sjfb8856606 				udp_configured = 1;
448*2d9fd380Sjfb8856606 				dist_units->param.units[dist_idx++].hdrs[0].hdr
449*2d9fd380Sjfb8856606 					= HEADER_TYPE_UDP;
450*2d9fd380Sjfb8856606 				break;
451*2d9fd380Sjfb8856606 
452*2d9fd380Sjfb8856606 			case ETH_RSS_NONFRAG_IPV4_SCTP:
453*2d9fd380Sjfb8856606 			case ETH_RSS_NONFRAG_IPV6_SCTP:
454*2d9fd380Sjfb8856606 
455*2d9fd380Sjfb8856606 				if (sctp_configured)
456*2d9fd380Sjfb8856606 					break;
457*2d9fd380Sjfb8856606 				sctp_configured = 1;
458*2d9fd380Sjfb8856606 
459*2d9fd380Sjfb8856606 				dist_units->param.units[dist_idx++].hdrs[0].hdr
460*2d9fd380Sjfb8856606 					= HEADER_TYPE_SCTP;
461*2d9fd380Sjfb8856606 				break;
462*2d9fd380Sjfb8856606 
463*2d9fd380Sjfb8856606 			default:
464*2d9fd380Sjfb8856606 				DPAA_PMD_ERR("Bad flow distribution option");
465*2d9fd380Sjfb8856606 			}
466*2d9fd380Sjfb8856606 		}
467*2d9fd380Sjfb8856606 		req_dist_set = req_dist_set >> 1;
468*2d9fd380Sjfb8856606 		loop++;
469*2d9fd380Sjfb8856606 	}
470*2d9fd380Sjfb8856606 
471*2d9fd380Sjfb8856606 	/* Dist units is set to dist_idx */
472*2d9fd380Sjfb8856606 	dist_units->param.num_of_distinction_units = dist_idx;
473*2d9fd380Sjfb8856606 }
474*2d9fd380Sjfb8856606 
475*2d9fd380Sjfb8856606 /* Apply PCD configuration on interface */
set_port_pcd(struct dpaa_if * dpaa_intf)476*2d9fd380Sjfb8856606 static inline int set_port_pcd(struct dpaa_if *dpaa_intf)
477*2d9fd380Sjfb8856606 {
478*2d9fd380Sjfb8856606 	int ret = 0;
479*2d9fd380Sjfb8856606 	unsigned int idx;
480*2d9fd380Sjfb8856606 	ioc_fm_port_pcd_params_t pcd_param;
481*2d9fd380Sjfb8856606 	ioc_fm_port_pcd_prs_params_t prs_param;
482*2d9fd380Sjfb8856606 	ioc_fm_port_pcd_kg_params_t  kg_param;
483*2d9fd380Sjfb8856606 
484*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
485*2d9fd380Sjfb8856606 
486*2d9fd380Sjfb8856606 	/* PCD support for hash distribution */
487*2d9fd380Sjfb8856606 	uint8_t pcd_support = e_FM_PORT_PCD_SUPPORT_PRS_AND_KG;
488*2d9fd380Sjfb8856606 
489*2d9fd380Sjfb8856606 	memset(&pcd_param, 0, sizeof(pcd_param));
490*2d9fd380Sjfb8856606 	memset(&prs_param, 0, sizeof(prs_param));
491*2d9fd380Sjfb8856606 	memset(&kg_param, 0, sizeof(kg_param));
492*2d9fd380Sjfb8856606 
493*2d9fd380Sjfb8856606 	/* Set parse params */
494*2d9fd380Sjfb8856606 	prs_param.first_prs_hdr = HEADER_TYPE_ETH;
495*2d9fd380Sjfb8856606 
496*2d9fd380Sjfb8856606 	/* Set kg params */
497*2d9fd380Sjfb8856606 	for (idx = 0; idx < dpaa_intf->scheme_count; idx++)
498*2d9fd380Sjfb8856606 		kg_param.scheme_ids[idx] = dpaa_intf->scheme_handle[idx];
499*2d9fd380Sjfb8856606 	kg_param.num_schemes = dpaa_intf->scheme_count;
500*2d9fd380Sjfb8856606 
501*2d9fd380Sjfb8856606 	/* Set pcd params */
502*2d9fd380Sjfb8856606 	pcd_param.net_env_id = dpaa_intf->netenv_handle;
503*2d9fd380Sjfb8856606 	pcd_param.pcd_support = pcd_support;
504*2d9fd380Sjfb8856606 	pcd_param.p_kg_params = &kg_param;
505*2d9fd380Sjfb8856606 	pcd_param.p_prs_params = &prs_param;
506*2d9fd380Sjfb8856606 
507*2d9fd380Sjfb8856606 	/* FM PORT Disable */
508*2d9fd380Sjfb8856606 	ret = fm_port_disable(dpaa_intf->port_handle);
509*2d9fd380Sjfb8856606 	if (ret != E_OK) {
510*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_port_disable: Failed");
511*2d9fd380Sjfb8856606 		return ret;
512*2d9fd380Sjfb8856606 	}
513*2d9fd380Sjfb8856606 
514*2d9fd380Sjfb8856606 	/* FM PORT SetPCD */
515*2d9fd380Sjfb8856606 	ret = fm_port_set_pcd(dpaa_intf->port_handle, &pcd_param);
516*2d9fd380Sjfb8856606 	if (ret != E_OK) {
517*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_port_set_pcd: Failed");
518*2d9fd380Sjfb8856606 		return ret;
519*2d9fd380Sjfb8856606 	}
520*2d9fd380Sjfb8856606 
521*2d9fd380Sjfb8856606 	/* FM PORT Enable */
522*2d9fd380Sjfb8856606 	ret = fm_port_enable(dpaa_intf->port_handle);
523*2d9fd380Sjfb8856606 	if (ret != E_OK) {
524*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_port_enable: Failed");
525*2d9fd380Sjfb8856606 		goto fm_port_delete_pcd;
526*2d9fd380Sjfb8856606 	}
527*2d9fd380Sjfb8856606 
528*2d9fd380Sjfb8856606 	return 0;
529*2d9fd380Sjfb8856606 
530*2d9fd380Sjfb8856606 fm_port_delete_pcd:
531*2d9fd380Sjfb8856606 	/* FM PORT DeletePCD */
532*2d9fd380Sjfb8856606 	ret = fm_port_delete_pcd(dpaa_intf->port_handle);
533*2d9fd380Sjfb8856606 	if (ret != E_OK) {
534*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_port_delete_pcd: Failed\n");
535*2d9fd380Sjfb8856606 		return ret;
536*2d9fd380Sjfb8856606 	}
537*2d9fd380Sjfb8856606 	return -1;
538*2d9fd380Sjfb8856606 }
539*2d9fd380Sjfb8856606 
540*2d9fd380Sjfb8856606 /* Unset PCD NerEnv and scheme */
unset_pcd_netenv_scheme(struct dpaa_if * dpaa_intf)541*2d9fd380Sjfb8856606 static inline void unset_pcd_netenv_scheme(struct dpaa_if *dpaa_intf)
542*2d9fd380Sjfb8856606 {
543*2d9fd380Sjfb8856606 	int ret;
544*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
545*2d9fd380Sjfb8856606 
546*2d9fd380Sjfb8856606 	/* reduce scheme count */
547*2d9fd380Sjfb8856606 	if (dpaa_intf->scheme_count)
548*2d9fd380Sjfb8856606 		dpaa_intf->scheme_count--;
549*2d9fd380Sjfb8856606 
550*2d9fd380Sjfb8856606 	DPAA_PMD_DEBUG("KG SCHEME DEL %d handle =%p",
551*2d9fd380Sjfb8856606 		dpaa_intf->scheme_count,
552*2d9fd380Sjfb8856606 		dpaa_intf->scheme_handle[dpaa_intf->scheme_count]);
553*2d9fd380Sjfb8856606 
554*2d9fd380Sjfb8856606 	ret = fm_pcd_kg_scheme_delete(dpaa_intf->scheme_handle
555*2d9fd380Sjfb8856606 					[dpaa_intf->scheme_count]);
556*2d9fd380Sjfb8856606 	if (ret != E_OK)
557*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_pcd_kg_scheme_delete: Failed");
558*2d9fd380Sjfb8856606 
559*2d9fd380Sjfb8856606 	dpaa_intf->scheme_handle[dpaa_intf->scheme_count] = NULL;
560*2d9fd380Sjfb8856606 }
561*2d9fd380Sjfb8856606 
562*2d9fd380Sjfb8856606 /* Set PCD NetEnv and Scheme and default scheme */
set_default_scheme(struct dpaa_if * dpaa_intf)563*2d9fd380Sjfb8856606 static inline int set_default_scheme(struct dpaa_if *dpaa_intf)
564*2d9fd380Sjfb8856606 {
565*2d9fd380Sjfb8856606 	ioc_fm_pcd_kg_scheme_params_t scheme_params;
566*2d9fd380Sjfb8856606 	int idx = dpaa_intf->scheme_count;
567*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
568*2d9fd380Sjfb8856606 
569*2d9fd380Sjfb8856606 	/* Set PCD NetEnvCharacteristics */
570*2d9fd380Sjfb8856606 	memset(&scheme_params, 0, sizeof(scheme_params));
571*2d9fd380Sjfb8856606 
572*2d9fd380Sjfb8856606 	/* Adding 10 to default schemes as the number of interface would be
573*2d9fd380Sjfb8856606 	 * lesser than 10 and the relative scheme ids should be unique for
574*2d9fd380Sjfb8856606 	 * every scheme.
575*2d9fd380Sjfb8856606 	 */
576*2d9fd380Sjfb8856606 	scheme_params.param.scm_id.relative_scheme_id =
577*2d9fd380Sjfb8856606 		10 + dpaa_intf->ifid;
578*2d9fd380Sjfb8856606 	scheme_params.param.use_hash = 0;
579*2d9fd380Sjfb8856606 	scheme_params.param.next_engine = e_IOC_FM_PCD_DONE;
580*2d9fd380Sjfb8856606 	scheme_params.param.net_env_params.num_of_distinction_units = 0;
581*2d9fd380Sjfb8856606 	scheme_params.param.net_env_params.net_env_id =
582*2d9fd380Sjfb8856606 		dpaa_intf->netenv_handle;
583*2d9fd380Sjfb8856606 	scheme_params.param.base_fqid = dpaa_intf->rx_queues[0].fqid;
584*2d9fd380Sjfb8856606 	scheme_params.param.key_ext_and_hash.hash_dist_num_of_fqids = 1;
585*2d9fd380Sjfb8856606 	scheme_params.param.key_ext_and_hash.num_of_used_extracts = 0;
586*2d9fd380Sjfb8856606 	scheme_params.param.modify = false;
587*2d9fd380Sjfb8856606 	scheme_params.param.always_direct = false;
588*2d9fd380Sjfb8856606 	scheme_params.param.scheme_counter.update = 1;
589*2d9fd380Sjfb8856606 	scheme_params.param.scheme_counter.value = 0;
590*2d9fd380Sjfb8856606 
591*2d9fd380Sjfb8856606 	/* FM PCD KgSchemeSet */
592*2d9fd380Sjfb8856606 	dpaa_intf->scheme_handle[idx] =
593*2d9fd380Sjfb8856606 		fm_pcd_kg_scheme_set(fm_info.pcd_handle, &scheme_params);
594*2d9fd380Sjfb8856606 	DPAA_PMD_DEBUG("KG SCHEME SET %d handle =%p",
595*2d9fd380Sjfb8856606 		idx, dpaa_intf->scheme_handle[idx]);
596*2d9fd380Sjfb8856606 	if (!dpaa_intf->scheme_handle[idx]) {
597*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_pcd_kg_scheme_set: Failed");
598*2d9fd380Sjfb8856606 		return -1;
599*2d9fd380Sjfb8856606 	}
600*2d9fd380Sjfb8856606 
601*2d9fd380Sjfb8856606 	fm_model.scheme_devid[dpaa_intf->ifid][idx] =
602*2d9fd380Sjfb8856606 				get_device_id(dpaa_intf->scheme_handle[idx]);
603*2d9fd380Sjfb8856606 	dpaa_intf->scheme_count++;
604*2d9fd380Sjfb8856606 	return 0;
605*2d9fd380Sjfb8856606 }
606*2d9fd380Sjfb8856606 
607*2d9fd380Sjfb8856606 
608*2d9fd380Sjfb8856606 /* Set PCD NetEnv and Scheme and default scheme */
set_pcd_netenv_scheme(struct dpaa_if * dpaa_intf,uint64_t req_dist_set,struct fman_if * fif)609*2d9fd380Sjfb8856606 static inline int set_pcd_netenv_scheme(struct dpaa_if *dpaa_intf,
610*2d9fd380Sjfb8856606 					uint64_t req_dist_set,
611*2d9fd380Sjfb8856606 					struct fman_if *fif)
612*2d9fd380Sjfb8856606 {
613*2d9fd380Sjfb8856606 	int ret = -1;
614*2d9fd380Sjfb8856606 	ioc_fm_pcd_net_env_params_t dist_units;
615*2d9fd380Sjfb8856606 	ioc_fm_pcd_kg_scheme_params_t scheme_params;
616*2d9fd380Sjfb8856606 	int idx = dpaa_intf->scheme_count;
617*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
618*2d9fd380Sjfb8856606 
619*2d9fd380Sjfb8856606 	/* Set PCD NetEnvCharacteristics */
620*2d9fd380Sjfb8856606 	memset(&dist_units, 0, sizeof(dist_units));
621*2d9fd380Sjfb8856606 	memset(&scheme_params, 0, sizeof(scheme_params));
622*2d9fd380Sjfb8856606 
623*2d9fd380Sjfb8856606 	/* Set dist unit header type */
624*2d9fd380Sjfb8856606 	set_dist_units(&dist_units, req_dist_set);
625*2d9fd380Sjfb8856606 
626*2d9fd380Sjfb8856606 	scheme_params.param.scm_id.relative_scheme_id = dpaa_intf->ifid;
627*2d9fd380Sjfb8856606 
628*2d9fd380Sjfb8856606 	/* Set PCD Scheme params */
629*2d9fd380Sjfb8856606 	ret = set_scheme_params(&scheme_params, &dist_units, dpaa_intf, fif);
630*2d9fd380Sjfb8856606 	if (ret) {
631*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("Set scheme params: Failed");
632*2d9fd380Sjfb8856606 		return -1;
633*2d9fd380Sjfb8856606 	}
634*2d9fd380Sjfb8856606 
635*2d9fd380Sjfb8856606 	/* FM PCD KgSchemeSet */
636*2d9fd380Sjfb8856606 	dpaa_intf->scheme_handle[idx] =
637*2d9fd380Sjfb8856606 		fm_pcd_kg_scheme_set(fm_info.pcd_handle, &scheme_params);
638*2d9fd380Sjfb8856606 	DPAA_PMD_DEBUG("KG SCHEME SET %d handle =%p",
639*2d9fd380Sjfb8856606 			idx, dpaa_intf->scheme_handle[idx]);
640*2d9fd380Sjfb8856606 	if (!dpaa_intf->scheme_handle[idx]) {
641*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_pcd_kg_scheme_set: Failed");
642*2d9fd380Sjfb8856606 		return -1;
643*2d9fd380Sjfb8856606 	}
644*2d9fd380Sjfb8856606 
645*2d9fd380Sjfb8856606 	fm_model.scheme_devid[dpaa_intf->ifid][idx] =
646*2d9fd380Sjfb8856606 				get_device_id(dpaa_intf->scheme_handle[idx]);
647*2d9fd380Sjfb8856606 	dpaa_intf->scheme_count++;
648*2d9fd380Sjfb8856606 	return 0;
649*2d9fd380Sjfb8856606 }
650*2d9fd380Sjfb8856606 
651*2d9fd380Sjfb8856606 
get_port_type(struct fman_if * fif)652*2d9fd380Sjfb8856606 static inline int get_port_type(struct fman_if *fif)
653*2d9fd380Sjfb8856606 {
654*2d9fd380Sjfb8856606 	if (fif->mac_type == fman_mac_1g)
655*2d9fd380Sjfb8856606 		return e_FM_PORT_TYPE_RX;
656*2d9fd380Sjfb8856606 	else if (fif->mac_type == fman_mac_2_5g)
657*2d9fd380Sjfb8856606 		return e_FM_PORT_TYPE_RX_2_5G;
658*2d9fd380Sjfb8856606 	else if (fif->mac_type == fman_mac_10g)
659*2d9fd380Sjfb8856606 		return e_FM_PORT_TYPE_RX_10G;
660*2d9fd380Sjfb8856606 
661*2d9fd380Sjfb8856606 	DPAA_PMD_ERR("MAC type unsupported");
662*2d9fd380Sjfb8856606 	return -1;
663*2d9fd380Sjfb8856606 }
664*2d9fd380Sjfb8856606 
set_fm_port_handle(struct dpaa_if * dpaa_intf,uint64_t req_dist_set,struct fman_if * fif)665*2d9fd380Sjfb8856606 static inline int set_fm_port_handle(struct dpaa_if *dpaa_intf,
666*2d9fd380Sjfb8856606 				     uint64_t req_dist_set,
667*2d9fd380Sjfb8856606 				     struct fman_if *fif)
668*2d9fd380Sjfb8856606 {
669*2d9fd380Sjfb8856606 	t_fm_port_params	fm_port_params;
670*2d9fd380Sjfb8856606 	ioc_fm_pcd_net_env_params_t dist_units;
671*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
672*2d9fd380Sjfb8856606 
673*2d9fd380Sjfb8856606 	/* FMAN mac indexes mappings (0 is unused,
674*2d9fd380Sjfb8856606 	 * first 8 are for 1G, next for 10G ports
675*2d9fd380Sjfb8856606 	 */
676*2d9fd380Sjfb8856606 	uint8_t mac_idx[] = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1};
677*2d9fd380Sjfb8856606 
678*2d9fd380Sjfb8856606 	/* Memset FM port params */
679*2d9fd380Sjfb8856606 	memset(&fm_port_params, 0, sizeof(fm_port_params));
680*2d9fd380Sjfb8856606 
681*2d9fd380Sjfb8856606 	/* Set FM port params */
682*2d9fd380Sjfb8856606 	fm_port_params.h_fm = fm_info.fman_handle;
683*2d9fd380Sjfb8856606 	fm_port_params.port_type = get_port_type(fif);
684*2d9fd380Sjfb8856606 	fm_port_params.port_id = mac_idx[fif->mac_idx];
685*2d9fd380Sjfb8856606 
686*2d9fd380Sjfb8856606 	/* FM PORT Open */
687*2d9fd380Sjfb8856606 	dpaa_intf->port_handle = fm_port_open(&fm_port_params);
688*2d9fd380Sjfb8856606 	if (!dpaa_intf->port_handle) {
689*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_port_open: Failed\n");
690*2d9fd380Sjfb8856606 		return -1;
691*2d9fd380Sjfb8856606 	}
692*2d9fd380Sjfb8856606 
693*2d9fd380Sjfb8856606 	fm_model.fm_port_params[dpaa_intf->ifid] = fm_port_params;
694*2d9fd380Sjfb8856606 
695*2d9fd380Sjfb8856606 	/* Set PCD NetEnvCharacteristics */
696*2d9fd380Sjfb8856606 	memset(&dist_units, 0, sizeof(dist_units));
697*2d9fd380Sjfb8856606 
698*2d9fd380Sjfb8856606 	/* Set dist unit header type */
699*2d9fd380Sjfb8856606 	set_dist_units(&dist_units, req_dist_set);
700*2d9fd380Sjfb8856606 
701*2d9fd380Sjfb8856606 	/* FM PCD NetEnvCharacteristicsSet */
702*2d9fd380Sjfb8856606 	dpaa_intf->netenv_handle =
703*2d9fd380Sjfb8856606 		fm_pcd_net_env_characteristics_set(fm_info.pcd_handle,
704*2d9fd380Sjfb8856606 							&dist_units);
705*2d9fd380Sjfb8856606 	if (!dpaa_intf->netenv_handle) {
706*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_pcd_net_env_characteristics_set: Failed");
707*2d9fd380Sjfb8856606 		return -1;
708*2d9fd380Sjfb8856606 	}
709*2d9fd380Sjfb8856606 
710*2d9fd380Sjfb8856606 	fm_model.netenv_devid[dpaa_intf->ifid] =
711*2d9fd380Sjfb8856606 				get_device_id(dpaa_intf->netenv_handle);
712*2d9fd380Sjfb8856606 
713*2d9fd380Sjfb8856606 	return 0;
714*2d9fd380Sjfb8856606 }
715*2d9fd380Sjfb8856606 
716*2d9fd380Sjfb8856606 /* De-Configure DPAA FM */
dpaa_fm_deconfig(struct dpaa_if * dpaa_intf,struct fman_if * fif __rte_unused)717*2d9fd380Sjfb8856606 int dpaa_fm_deconfig(struct dpaa_if *dpaa_intf,
718*2d9fd380Sjfb8856606 			struct fman_if *fif __rte_unused)
719*2d9fd380Sjfb8856606 {
720*2d9fd380Sjfb8856606 	int ret;
721*2d9fd380Sjfb8856606 	unsigned int idx;
722*2d9fd380Sjfb8856606 
723*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
724*2d9fd380Sjfb8856606 
725*2d9fd380Sjfb8856606 	/* FM PORT Disable */
726*2d9fd380Sjfb8856606 	ret = fm_port_disable(dpaa_intf->port_handle);
727*2d9fd380Sjfb8856606 	if (ret != E_OK) {
728*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_port_disable: Failed");
729*2d9fd380Sjfb8856606 		return ret;
730*2d9fd380Sjfb8856606 	}
731*2d9fd380Sjfb8856606 
732*2d9fd380Sjfb8856606 	/* FM PORT DeletePCD */
733*2d9fd380Sjfb8856606 	ret = fm_port_delete_pcd(dpaa_intf->port_handle);
734*2d9fd380Sjfb8856606 	if (ret != E_OK) {
735*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_port_delete_pcd: Failed");
736*2d9fd380Sjfb8856606 		return ret;
737*2d9fd380Sjfb8856606 	}
738*2d9fd380Sjfb8856606 
739*2d9fd380Sjfb8856606 	for (idx = 0; idx < dpaa_intf->scheme_count; idx++) {
740*2d9fd380Sjfb8856606 		DPAA_PMD_DEBUG("KG SCHEME DEL %d, handle =%p",
741*2d9fd380Sjfb8856606 			idx, dpaa_intf->scheme_handle[idx]);
742*2d9fd380Sjfb8856606 		/* FM PCD KgSchemeDelete */
743*2d9fd380Sjfb8856606 		ret = fm_pcd_kg_scheme_delete(dpaa_intf->scheme_handle[idx]);
744*2d9fd380Sjfb8856606 		if (ret != E_OK) {
745*2d9fd380Sjfb8856606 			DPAA_PMD_ERR("fm_pcd_kg_scheme_delete: Failed");
746*2d9fd380Sjfb8856606 			return ret;
747*2d9fd380Sjfb8856606 		}
748*2d9fd380Sjfb8856606 		dpaa_intf->scheme_handle[idx] = NULL;
749*2d9fd380Sjfb8856606 	}
750*2d9fd380Sjfb8856606 	/* FM PCD NetEnvCharacteristicsDelete */
751*2d9fd380Sjfb8856606 	ret = fm_pcd_net_env_characteristics_delete(dpaa_intf->netenv_handle);
752*2d9fd380Sjfb8856606 	if (ret != E_OK) {
753*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_pcd_net_env_characteristics_delete: Failed");
754*2d9fd380Sjfb8856606 		return ret;
755*2d9fd380Sjfb8856606 	}
756*2d9fd380Sjfb8856606 	dpaa_intf->netenv_handle = NULL;
757*2d9fd380Sjfb8856606 
758*2d9fd380Sjfb8856606 	if (fif && fif->is_shared_mac) {
759*2d9fd380Sjfb8856606 		ret = fm_port_enable(dpaa_intf->port_handle);
760*2d9fd380Sjfb8856606 		if (ret != E_OK) {
761*2d9fd380Sjfb8856606 			DPAA_PMD_ERR("shared mac re-enable failed");
762*2d9fd380Sjfb8856606 			return ret;
763*2d9fd380Sjfb8856606 		}
764*2d9fd380Sjfb8856606 	}
765*2d9fd380Sjfb8856606 
766*2d9fd380Sjfb8856606 	/* FM PORT Close */
767*2d9fd380Sjfb8856606 	fm_port_close(dpaa_intf->port_handle);
768*2d9fd380Sjfb8856606 	dpaa_intf->port_handle = NULL;
769*2d9fd380Sjfb8856606 
770*2d9fd380Sjfb8856606 	/* Set scheme count to 0 */
771*2d9fd380Sjfb8856606 	dpaa_intf->scheme_count = 0;
772*2d9fd380Sjfb8856606 
773*2d9fd380Sjfb8856606 	return 0;
774*2d9fd380Sjfb8856606 }
775*2d9fd380Sjfb8856606 
dpaa_fm_config(struct rte_eth_dev * dev,uint64_t req_dist_set)776*2d9fd380Sjfb8856606 int dpaa_fm_config(struct rte_eth_dev *dev, uint64_t req_dist_set)
777*2d9fd380Sjfb8856606 {
778*2d9fd380Sjfb8856606 	struct dpaa_if *dpaa_intf = dev->data->dev_private;
779*2d9fd380Sjfb8856606 	struct fman_if *fif = dev->process_private;
780*2d9fd380Sjfb8856606 	int ret;
781*2d9fd380Sjfb8856606 	unsigned int i = 0;
782*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
783*2d9fd380Sjfb8856606 
784*2d9fd380Sjfb8856606 	if (dpaa_intf->port_handle) {
785*2d9fd380Sjfb8856606 		if (dpaa_fm_deconfig(dpaa_intf, fif))
786*2d9fd380Sjfb8856606 			DPAA_PMD_ERR("DPAA FM deconfig failed");
787*2d9fd380Sjfb8856606 	}
788*2d9fd380Sjfb8856606 
789*2d9fd380Sjfb8856606 	if (!dev->data->nb_rx_queues)
790*2d9fd380Sjfb8856606 		return 0;
791*2d9fd380Sjfb8856606 
792*2d9fd380Sjfb8856606 	if (dev->data->nb_rx_queues & (dev->data->nb_rx_queues - 1)) {
793*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("No of queues should be power of 2");
794*2d9fd380Sjfb8856606 		return -1;
795*2d9fd380Sjfb8856606 	}
796*2d9fd380Sjfb8856606 
797*2d9fd380Sjfb8856606 	dpaa_intf->nb_rx_queues = dev->data->nb_rx_queues;
798*2d9fd380Sjfb8856606 
799*2d9fd380Sjfb8856606 	/* Open FM Port and set it in port info */
800*2d9fd380Sjfb8856606 	ret = set_fm_port_handle(dpaa_intf, req_dist_set, fif);
801*2d9fd380Sjfb8856606 	if (ret) {
802*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("Set FM Port handle: Failed");
803*2d9fd380Sjfb8856606 		return -1;
804*2d9fd380Sjfb8856606 	}
805*2d9fd380Sjfb8856606 
806*2d9fd380Sjfb8856606 	if (fif->num_profiles) {
807*2d9fd380Sjfb8856606 		for (i = 0; i < dpaa_intf->nb_rx_queues; i++)
808*2d9fd380Sjfb8856606 			dpaa_intf->rx_queues[i].vsp_id =
809*2d9fd380Sjfb8856606 				fm_default_vsp_id(fif);
810*2d9fd380Sjfb8856606 
811*2d9fd380Sjfb8856606 		i = 0;
812*2d9fd380Sjfb8856606 	}
813*2d9fd380Sjfb8856606 
814*2d9fd380Sjfb8856606 	/* Set PCD netenv and scheme */
815*2d9fd380Sjfb8856606 	if (req_dist_set) {
816*2d9fd380Sjfb8856606 		ret = set_pcd_netenv_scheme(dpaa_intf, req_dist_set, fif);
817*2d9fd380Sjfb8856606 		if (ret) {
818*2d9fd380Sjfb8856606 			DPAA_PMD_ERR("Set PCD NetEnv and Scheme dist: Failed");
819*2d9fd380Sjfb8856606 			goto unset_fm_port_handle;
820*2d9fd380Sjfb8856606 		}
821*2d9fd380Sjfb8856606 	}
822*2d9fd380Sjfb8856606 	/* Set default netenv and scheme */
823*2d9fd380Sjfb8856606 	if (!fif->is_shared_mac) {
824*2d9fd380Sjfb8856606 		ret = set_default_scheme(dpaa_intf);
825*2d9fd380Sjfb8856606 		if (ret) {
826*2d9fd380Sjfb8856606 			DPAA_PMD_ERR("Set PCD NetEnv and Scheme: Failed");
827*2d9fd380Sjfb8856606 			goto unset_pcd_netenv_scheme1;
828*2d9fd380Sjfb8856606 		}
829*2d9fd380Sjfb8856606 	}
830*2d9fd380Sjfb8856606 
831*2d9fd380Sjfb8856606 	/* Set Port PCD */
832*2d9fd380Sjfb8856606 	ret = set_port_pcd(dpaa_intf);
833*2d9fd380Sjfb8856606 	if (ret) {
834*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("Set Port PCD: Failed");
835*2d9fd380Sjfb8856606 		goto unset_pcd_netenv_scheme;
836*2d9fd380Sjfb8856606 	}
837*2d9fd380Sjfb8856606 
838*2d9fd380Sjfb8856606 	for (; i < fm_model.dev_count; i++)
839*2d9fd380Sjfb8856606 		if (fm_model.device_order[i] == dpaa_intf->ifid)
840*2d9fd380Sjfb8856606 			return 0;
841*2d9fd380Sjfb8856606 
842*2d9fd380Sjfb8856606 	fm_model.device_order[fm_model.dev_count] = dpaa_intf->ifid;
843*2d9fd380Sjfb8856606 	fm_model.dev_count++;
844*2d9fd380Sjfb8856606 
845*2d9fd380Sjfb8856606 	return 0;
846*2d9fd380Sjfb8856606 
847*2d9fd380Sjfb8856606 unset_pcd_netenv_scheme:
848*2d9fd380Sjfb8856606 	unset_pcd_netenv_scheme(dpaa_intf);
849*2d9fd380Sjfb8856606 
850*2d9fd380Sjfb8856606 unset_pcd_netenv_scheme1:
851*2d9fd380Sjfb8856606 	unset_pcd_netenv_scheme(dpaa_intf);
852*2d9fd380Sjfb8856606 
853*2d9fd380Sjfb8856606 unset_fm_port_handle:
854*2d9fd380Sjfb8856606 	/* FM PORT Close */
855*2d9fd380Sjfb8856606 	fm_port_close(dpaa_intf->port_handle);
856*2d9fd380Sjfb8856606 	dpaa_intf->port_handle = NULL;
857*2d9fd380Sjfb8856606 	return -1;
858*2d9fd380Sjfb8856606 }
859*2d9fd380Sjfb8856606 
dpaa_fm_init(void)860*2d9fd380Sjfb8856606 int dpaa_fm_init(void)
861*2d9fd380Sjfb8856606 {
862*2d9fd380Sjfb8856606 	t_handle fman_handle;
863*2d9fd380Sjfb8856606 	t_handle pcd_handle;
864*2d9fd380Sjfb8856606 	t_fm_pcd_params fm_pcd_params = {0};
865*2d9fd380Sjfb8856606 	/* Hard-coded : fman id 0 since one fman is present in LS104x */
866*2d9fd380Sjfb8856606 	int fman_id = 0, ret;
867*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
868*2d9fd380Sjfb8856606 
869*2d9fd380Sjfb8856606 	dpaa_read_fm_config_from_file();
870*2d9fd380Sjfb8856606 
871*2d9fd380Sjfb8856606 	/* FM Open */
872*2d9fd380Sjfb8856606 	fman_handle = fm_open(fman_id);
873*2d9fd380Sjfb8856606 	if (!fman_handle) {
874*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_open: Failed");
875*2d9fd380Sjfb8856606 		return -1;
876*2d9fd380Sjfb8856606 	}
877*2d9fd380Sjfb8856606 
878*2d9fd380Sjfb8856606 	/* FM PCD Open */
879*2d9fd380Sjfb8856606 	fm_pcd_params.h_fm = fman_handle;
880*2d9fd380Sjfb8856606 	fm_pcd_params.prs_support = true;
881*2d9fd380Sjfb8856606 	fm_pcd_params.kg_support = true;
882*2d9fd380Sjfb8856606 	pcd_handle = fm_pcd_open(&fm_pcd_params);
883*2d9fd380Sjfb8856606 	if (!pcd_handle) {
884*2d9fd380Sjfb8856606 		fm_close(fman_handle);
885*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_pcd_open: Failed");
886*2d9fd380Sjfb8856606 		return -1;
887*2d9fd380Sjfb8856606 	}
888*2d9fd380Sjfb8856606 
889*2d9fd380Sjfb8856606 	/* FM PCD Enable */
890*2d9fd380Sjfb8856606 	ret = fm_pcd_enable(pcd_handle);
891*2d9fd380Sjfb8856606 	if (ret) {
892*2d9fd380Sjfb8856606 		fm_close(fman_handle);
893*2d9fd380Sjfb8856606 		fm_pcd_close(pcd_handle);
894*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_pcd_enable: Failed");
895*2d9fd380Sjfb8856606 		return -1;
896*2d9fd380Sjfb8856606 	}
897*2d9fd380Sjfb8856606 
898*2d9fd380Sjfb8856606 	/* Set fman and pcd handle in fm info */
899*2d9fd380Sjfb8856606 	fm_info.fman_handle = fman_handle;
900*2d9fd380Sjfb8856606 	fm_info.pcd_handle = pcd_handle;
901*2d9fd380Sjfb8856606 
902*2d9fd380Sjfb8856606 	return 0;
903*2d9fd380Sjfb8856606 }
904*2d9fd380Sjfb8856606 
905*2d9fd380Sjfb8856606 
906*2d9fd380Sjfb8856606 /* De-initialization of FM */
dpaa_fm_term(void)907*2d9fd380Sjfb8856606 int dpaa_fm_term(void)
908*2d9fd380Sjfb8856606 {
909*2d9fd380Sjfb8856606 	int ret;
910*2d9fd380Sjfb8856606 
911*2d9fd380Sjfb8856606 	PMD_INIT_FUNC_TRACE();
912*2d9fd380Sjfb8856606 
913*2d9fd380Sjfb8856606 	if (fm_info.pcd_handle && fm_info.fman_handle) {
914*2d9fd380Sjfb8856606 		/* FM PCD Disable */
915*2d9fd380Sjfb8856606 		ret = fm_pcd_disable(fm_info.pcd_handle);
916*2d9fd380Sjfb8856606 		if (ret) {
917*2d9fd380Sjfb8856606 			DPAA_PMD_ERR("fm_pcd_disable: Failed");
918*2d9fd380Sjfb8856606 			return -1;
919*2d9fd380Sjfb8856606 		}
920*2d9fd380Sjfb8856606 
921*2d9fd380Sjfb8856606 		/* FM PCD Close */
922*2d9fd380Sjfb8856606 		fm_pcd_close(fm_info.pcd_handle);
923*2d9fd380Sjfb8856606 		fm_info.pcd_handle = NULL;
924*2d9fd380Sjfb8856606 	}
925*2d9fd380Sjfb8856606 
926*2d9fd380Sjfb8856606 	if (fm_info.fman_handle) {
927*2d9fd380Sjfb8856606 		/* FM Close */
928*2d9fd380Sjfb8856606 		fm_close(fm_info.fman_handle);
929*2d9fd380Sjfb8856606 		fm_info.fman_handle = NULL;
930*2d9fd380Sjfb8856606 	}
931*2d9fd380Sjfb8856606 
932*2d9fd380Sjfb8856606 	if (access(fm_log, F_OK) != -1) {
933*2d9fd380Sjfb8856606 		ret = remove(fm_log);
934*2d9fd380Sjfb8856606 		if (ret)
935*2d9fd380Sjfb8856606 			DPAA_PMD_ERR("File remove: Failed");
936*2d9fd380Sjfb8856606 	}
937*2d9fd380Sjfb8856606 	return 0;
938*2d9fd380Sjfb8856606 }
939*2d9fd380Sjfb8856606 
dpaa_port_vsp_configure(struct dpaa_if * dpaa_intf,uint8_t vsp_id,t_handle fman_handle,struct fman_if * fif)940*2d9fd380Sjfb8856606 static int dpaa_port_vsp_configure(struct dpaa_if *dpaa_intf,
941*2d9fd380Sjfb8856606 		uint8_t vsp_id, t_handle fman_handle,
942*2d9fd380Sjfb8856606 		struct fman_if *fif)
943*2d9fd380Sjfb8856606 {
944*2d9fd380Sjfb8856606 	t_fm_vsp_params vsp_params;
945*2d9fd380Sjfb8856606 	t_fm_buffer_prefix_content buf_prefix_cont;
946*2d9fd380Sjfb8856606 	uint8_t mac_idx[] = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1};
947*2d9fd380Sjfb8856606 	uint8_t idx = mac_idx[fif->mac_idx];
948*2d9fd380Sjfb8856606 	int ret;
949*2d9fd380Sjfb8856606 
950*2d9fd380Sjfb8856606 	if (vsp_id == fif->base_profile_id && fif->is_shared_mac) {
951*2d9fd380Sjfb8856606 		/* For shared interface, VSP of base
952*2d9fd380Sjfb8856606 		 * profile is default pool located in kernel.
953*2d9fd380Sjfb8856606 		 */
954*2d9fd380Sjfb8856606 		dpaa_intf->vsp_bpid[vsp_id] = 0;
955*2d9fd380Sjfb8856606 		return 0;
956*2d9fd380Sjfb8856606 	}
957*2d9fd380Sjfb8856606 
958*2d9fd380Sjfb8856606 	if (vsp_id >= DPAA_VSP_PROFILE_MAX_NUM) {
959*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("VSP ID %d exceeds MAX number %d",
960*2d9fd380Sjfb8856606 			vsp_id, DPAA_VSP_PROFILE_MAX_NUM);
961*2d9fd380Sjfb8856606 		return -1;
962*2d9fd380Sjfb8856606 	}
963*2d9fd380Sjfb8856606 
964*2d9fd380Sjfb8856606 	memset(&vsp_params, 0, sizeof(vsp_params));
965*2d9fd380Sjfb8856606 	vsp_params.h_fm = fman_handle;
966*2d9fd380Sjfb8856606 	vsp_params.relative_profile_id = vsp_id;
967*2d9fd380Sjfb8856606 	vsp_params.port_params.port_id = idx;
968*2d9fd380Sjfb8856606 	if (fif->mac_type == fman_mac_1g) {
969*2d9fd380Sjfb8856606 		vsp_params.port_params.port_type = e_FM_PORT_TYPE_RX;
970*2d9fd380Sjfb8856606 	} else if (fif->mac_type == fman_mac_2_5g) {
971*2d9fd380Sjfb8856606 		vsp_params.port_params.port_type = e_FM_PORT_TYPE_RX_2_5G;
972*2d9fd380Sjfb8856606 	} else if (fif->mac_type == fman_mac_10g) {
973*2d9fd380Sjfb8856606 		vsp_params.port_params.port_type = e_FM_PORT_TYPE_RX_10G;
974*2d9fd380Sjfb8856606 	} else {
975*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("Mac type %d error", fif->mac_type);
976*2d9fd380Sjfb8856606 		return -1;
977*2d9fd380Sjfb8856606 	}
978*2d9fd380Sjfb8856606 	vsp_params.ext_buf_pools.num_of_pools_used = 1;
979*2d9fd380Sjfb8856606 	vsp_params.ext_buf_pools.ext_buf_pool[0].id =
980*2d9fd380Sjfb8856606 		dpaa_intf->vsp_bpid[vsp_id];
981*2d9fd380Sjfb8856606 	vsp_params.ext_buf_pools.ext_buf_pool[0].size =
982*2d9fd380Sjfb8856606 		RTE_MBUF_DEFAULT_BUF_SIZE;
983*2d9fd380Sjfb8856606 
984*2d9fd380Sjfb8856606 	dpaa_intf->vsp_handle[vsp_id] = fm_vsp_config(&vsp_params);
985*2d9fd380Sjfb8856606 	if (!dpaa_intf->vsp_handle[vsp_id]) {
986*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_vsp_config error for profile %d", vsp_id);
987*2d9fd380Sjfb8856606 		return -EINVAL;
988*2d9fd380Sjfb8856606 	}
989*2d9fd380Sjfb8856606 
990*2d9fd380Sjfb8856606 	/* configure the application buffer (structure, size and
991*2d9fd380Sjfb8856606 	 * content)
992*2d9fd380Sjfb8856606 	 */
993*2d9fd380Sjfb8856606 
994*2d9fd380Sjfb8856606 	memset(&buf_prefix_cont, 0, sizeof(buf_prefix_cont));
995*2d9fd380Sjfb8856606 
996*2d9fd380Sjfb8856606 	buf_prefix_cont.priv_data_size = 16;
997*2d9fd380Sjfb8856606 	buf_prefix_cont.data_align = 64;
998*2d9fd380Sjfb8856606 	buf_prefix_cont.pass_prs_result = true;
999*2d9fd380Sjfb8856606 	buf_prefix_cont.pass_time_stamp = true;
1000*2d9fd380Sjfb8856606 	buf_prefix_cont.pass_hash_result = false;
1001*2d9fd380Sjfb8856606 	buf_prefix_cont.pass_all_other_pcdinfo = false;
1002*2d9fd380Sjfb8856606 	ret = fm_vsp_config_buffer_prefix_content(dpaa_intf->vsp_handle[vsp_id],
1003*2d9fd380Sjfb8856606 					       &buf_prefix_cont);
1004*2d9fd380Sjfb8856606 	if (ret != E_OK) {
1005*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_vsp_config_buffer_prefix_content error for profile %d err: %d",
1006*2d9fd380Sjfb8856606 			     vsp_id, ret);
1007*2d9fd380Sjfb8856606 		return ret;
1008*2d9fd380Sjfb8856606 	}
1009*2d9fd380Sjfb8856606 
1010*2d9fd380Sjfb8856606 	/* initialize the FM VSP module */
1011*2d9fd380Sjfb8856606 	ret = fm_vsp_init(dpaa_intf->vsp_handle[vsp_id]);
1012*2d9fd380Sjfb8856606 	if (ret != E_OK) {
1013*2d9fd380Sjfb8856606 		DPAA_PMD_ERR("fm_vsp_init error for profile %d err:%d",
1014*2d9fd380Sjfb8856606 			 vsp_id, ret);
1015*2d9fd380Sjfb8856606 		return ret;
1016*2d9fd380Sjfb8856606 	}
1017*2d9fd380Sjfb8856606 
1018*2d9fd380Sjfb8856606 	return 0;
1019*2d9fd380Sjfb8856606 }
1020*2d9fd380Sjfb8856606 
dpaa_port_vsp_update(struct dpaa_if * dpaa_intf,bool fmc_mode,uint8_t vsp_id,uint32_t bpid,struct fman_if * fif)1021*2d9fd380Sjfb8856606 int dpaa_port_vsp_update(struct dpaa_if *dpaa_intf,
1022*2d9fd380Sjfb8856606 		bool fmc_mode, uint8_t vsp_id, uint32_t bpid,
1023*2d9fd380Sjfb8856606 		struct fman_if *fif)
1024*2d9fd380Sjfb8856606 {
1025*2d9fd380Sjfb8856606 	int ret = 0;
1026*2d9fd380Sjfb8856606 	t_handle fman_handle;
1027*2d9fd380Sjfb8856606 
1028*2d9fd380Sjfb8856606 	if (!fif->num_profiles)
1029*2d9fd380Sjfb8856606 		return 0;
1030*2d9fd380Sjfb8856606 
1031*2d9fd380Sjfb8856606 	if (vsp_id >= fif->num_profiles)
1032*2d9fd380Sjfb8856606 		return 0;
1033*2d9fd380Sjfb8856606 
1034*2d9fd380Sjfb8856606 	if (dpaa_intf->vsp_bpid[vsp_id] == bpid)
1035*2d9fd380Sjfb8856606 		return 0;
1036*2d9fd380Sjfb8856606 
1037*2d9fd380Sjfb8856606 	if (dpaa_intf->vsp_handle[vsp_id]) {
1038*2d9fd380Sjfb8856606 		ret = fm_vsp_free(dpaa_intf->vsp_handle[vsp_id]);
1039*2d9fd380Sjfb8856606 		if (ret != E_OK) {
1040*2d9fd380Sjfb8856606 			DPAA_PMD_ERR("Error fm_vsp_free: err %d vsp_handle[%d]",
1041*2d9fd380Sjfb8856606 				     ret, vsp_id);
1042*2d9fd380Sjfb8856606 			return ret;
1043*2d9fd380Sjfb8856606 		}
1044*2d9fd380Sjfb8856606 		dpaa_intf->vsp_handle[vsp_id] = 0;
1045*2d9fd380Sjfb8856606 	}
1046*2d9fd380Sjfb8856606 
1047*2d9fd380Sjfb8856606 	if (fmc_mode)
1048*2d9fd380Sjfb8856606 		fman_handle = fm_open(0);
1049*2d9fd380Sjfb8856606 	else
1050*2d9fd380Sjfb8856606 		fman_handle = fm_info.fman_handle;
1051*2d9fd380Sjfb8856606 
1052*2d9fd380Sjfb8856606 	dpaa_intf->vsp_bpid[vsp_id] = bpid;
1053*2d9fd380Sjfb8856606 
1054*2d9fd380Sjfb8856606 	return dpaa_port_vsp_configure(dpaa_intf, vsp_id, fman_handle, fif);
1055*2d9fd380Sjfb8856606 }
1056*2d9fd380Sjfb8856606 
dpaa_port_vsp_cleanup(struct dpaa_if * dpaa_intf,struct fman_if * fif)1057*2d9fd380Sjfb8856606 int dpaa_port_vsp_cleanup(struct dpaa_if *dpaa_intf, struct fman_if *fif)
1058*2d9fd380Sjfb8856606 {
1059*2d9fd380Sjfb8856606 	int idx, ret;
1060*2d9fd380Sjfb8856606 
1061*2d9fd380Sjfb8856606 	for (idx = 0; idx < (uint8_t)fif->num_profiles; idx++) {
1062*2d9fd380Sjfb8856606 		if (dpaa_intf->vsp_handle[idx]) {
1063*2d9fd380Sjfb8856606 			ret = fm_vsp_free(dpaa_intf->vsp_handle[idx]);
1064*2d9fd380Sjfb8856606 			if (ret != E_OK) {
1065*2d9fd380Sjfb8856606 				DPAA_PMD_ERR("Error fm_vsp_free: err %d"
1066*2d9fd380Sjfb8856606 					     " vsp_handle[%d]", ret, idx);
1067*2d9fd380Sjfb8856606 				return ret;
1068*2d9fd380Sjfb8856606 			}
1069*2d9fd380Sjfb8856606 		}
1070*2d9fd380Sjfb8856606 	}
1071*2d9fd380Sjfb8856606 
1072*2d9fd380Sjfb8856606 	return E_OK;
1073*2d9fd380Sjfb8856606 }
1074