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