xref: /dpdk/drivers/net/dpaa/dpaa_flow.c (revision e498f3b51f3882c43eccb3d5b59b1d045b51c39a)
14defbc8cSSachin Saxena /* SPDX-License-Identifier: BSD-3-Clause
2a0edbb8aSRohit Raj  * Copyright 2017-2019,2021-2024 NXP
34defbc8cSSachin Saxena  */
44defbc8cSSachin Saxena 
54defbc8cSSachin Saxena /* System headers */
64defbc8cSSachin Saxena #include <stdio.h>
74defbc8cSSachin Saxena #include <inttypes.h>
84defbc8cSSachin Saxena #include <unistd.h>
94defbc8cSSachin Saxena #include <sys/types.h>
104defbc8cSSachin Saxena 
114defbc8cSSachin Saxena #include <dpaa_ethdev.h>
124defbc8cSSachin Saxena #include <dpaa_flow.h>
134defbc8cSSachin Saxena #include <rte_dpaa_logs.h>
144defbc8cSSachin Saxena #include <fmlib/fm_port_ext.h>
15e4abd4ffSJun Yang #include <fmlib/fm_vsp_ext.h>
16*e498f3b5SGagandeep Singh #include <rte_pmd_dpaa.h>
174defbc8cSSachin Saxena 
184defbc8cSSachin Saxena #define DPAA_MAX_NUM_ETH_DEV	8
194defbc8cSSachin Saxena 
204defbc8cSSachin Saxena static inline
214defbc8cSSachin Saxena ioc_fm_pcd_extract_entry_t *
224defbc8cSSachin Saxena SCH_EXT_ARR(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
234defbc8cSSachin Saxena {
244defbc8cSSachin Saxena return &scheme_params->param.key_ext_and_hash.extract_array[hdr_idx];
254defbc8cSSachin Saxena }
264defbc8cSSachin Saxena 
274defbc8cSSachin Saxena #define SCH_EXT_HDR(scheme_params, hdr_idx) \
284defbc8cSSachin Saxena 	SCH_EXT_ARR(scheme_params, hdr_idx)->extract_params.extract_by_hdr
294defbc8cSSachin Saxena 
304defbc8cSSachin Saxena #define SCH_EXT_FULL_FLD(scheme_params, hdr_idx) \
314defbc8cSSachin Saxena 	SCH_EXT_HDR(scheme_params, hdr_idx).extract_by_hdr_type.full_field
324defbc8cSSachin Saxena 
33a0edbb8aSRohit Raj /* FMAN mac indexes mappings (0 is unused, first 8 are for 1G, next for 10G
34a0edbb8aSRohit Raj  * ports).
35a0edbb8aSRohit Raj  */
36a0edbb8aSRohit Raj const uint8_t mac_idx[] = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1};
37a0edbb8aSRohit Raj 
384defbc8cSSachin Saxena /* FM global info */
394defbc8cSSachin Saxena struct dpaa_fm_info {
404defbc8cSSachin Saxena 	t_handle fman_handle;
414defbc8cSSachin Saxena 	t_handle pcd_handle;
424defbc8cSSachin Saxena };
434defbc8cSSachin Saxena 
444defbc8cSSachin Saxena /*FM model to read and write from file */
454defbc8cSSachin Saxena struct dpaa_fm_model {
464defbc8cSSachin Saxena 	uint32_t dev_count;
474defbc8cSSachin Saxena 	uint8_t device_order[DPAA_MAX_NUM_ETH_DEV];
484defbc8cSSachin Saxena 	t_fm_port_params fm_port_params[DPAA_MAX_NUM_ETH_DEV];
494defbc8cSSachin Saxena 	t_handle netenv_devid[DPAA_MAX_NUM_ETH_DEV];
504defbc8cSSachin Saxena 	t_handle scheme_devid[DPAA_MAX_NUM_ETH_DEV][2];
514defbc8cSSachin Saxena };
524defbc8cSSachin Saxena 
534defbc8cSSachin Saxena static struct dpaa_fm_info fm_info;
544defbc8cSSachin Saxena static struct dpaa_fm_model fm_model;
554defbc8cSSachin Saxena static const char *fm_log = "/tmp/fmdpdk.bin";
564defbc8cSSachin Saxena 
574defbc8cSSachin Saxena static void fm_prev_cleanup(void)
584defbc8cSSachin Saxena {
594defbc8cSSachin Saxena 	uint32_t fman_id = 0, i = 0, devid;
604defbc8cSSachin Saxena 	struct dpaa_if dpaa_intf = {0};
614defbc8cSSachin Saxena 	t_fm_pcd_params fm_pcd_params = {0};
624defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
634defbc8cSSachin Saxena 
644defbc8cSSachin Saxena 	fm_info.fman_handle = fm_open(fman_id);
654defbc8cSSachin Saxena 	if (!fm_info.fman_handle) {
660fcdbde0SHemant Agrawal 		DPAA_PMD_ERR("unable to open FMAN");
674defbc8cSSachin Saxena 		return;
684defbc8cSSachin Saxena 	}
694defbc8cSSachin Saxena 
704defbc8cSSachin Saxena 	fm_pcd_params.h_fm = fm_info.fman_handle;
714defbc8cSSachin Saxena 	fm_pcd_params.prs_support = true;
724defbc8cSSachin Saxena 	fm_pcd_params.kg_support = true;
734defbc8cSSachin Saxena 	/* FM PCD Open */
744defbc8cSSachin Saxena 	fm_info.pcd_handle = fm_pcd_open(&fm_pcd_params);
754defbc8cSSachin Saxena 	if (!fm_info.pcd_handle) {
760fcdbde0SHemant Agrawal 		DPAA_PMD_ERR("unable to open PCD");
774defbc8cSSachin Saxena 		return;
784defbc8cSSachin Saxena 	}
794defbc8cSSachin Saxena 
804defbc8cSSachin Saxena 	while (i < fm_model.dev_count) {
814defbc8cSSachin Saxena 		devid = fm_model.device_order[i];
824defbc8cSSachin Saxena 		/* FM Port Open */
834defbc8cSSachin Saxena 		fm_model.fm_port_params[devid].h_fm = fm_info.fman_handle;
844defbc8cSSachin Saxena 		dpaa_intf.port_handle =
854defbc8cSSachin Saxena 				fm_port_open(&fm_model.fm_port_params[devid]);
864defbc8cSSachin Saxena 		dpaa_intf.scheme_handle[0] = create_device(fm_info.pcd_handle,
874defbc8cSSachin Saxena 					fm_model.scheme_devid[devid][0]);
884defbc8cSSachin Saxena 		dpaa_intf.scheme_count = 1;
894defbc8cSSachin Saxena 		if (fm_model.scheme_devid[devid][1]) {
904defbc8cSSachin Saxena 			dpaa_intf.scheme_handle[1] =
914defbc8cSSachin Saxena 				create_device(fm_info.pcd_handle,
924defbc8cSSachin Saxena 					fm_model.scheme_devid[devid][1]);
934defbc8cSSachin Saxena 			if (dpaa_intf.scheme_handle[1])
944defbc8cSSachin Saxena 				dpaa_intf.scheme_count++;
954defbc8cSSachin Saxena 		}
964defbc8cSSachin Saxena 
974defbc8cSSachin Saxena 		dpaa_intf.netenv_handle = create_device(fm_info.pcd_handle,
984defbc8cSSachin Saxena 					fm_model.netenv_devid[devid]);
994defbc8cSSachin Saxena 		i++;
1004defbc8cSSachin Saxena 		if (!dpaa_intf.netenv_handle ||
1014defbc8cSSachin Saxena 			!dpaa_intf.scheme_handle[0] ||
1024defbc8cSSachin Saxena 			!dpaa_intf.port_handle)
1034defbc8cSSachin Saxena 			continue;
1044defbc8cSSachin Saxena 
1054defbc8cSSachin Saxena 		if (dpaa_fm_deconfig(&dpaa_intf, NULL))
1060fcdbde0SHemant Agrawal 			DPAA_PMD_ERR("DPAA FM deconfig failed");
1074defbc8cSSachin Saxena 	}
1084defbc8cSSachin Saxena 
1094defbc8cSSachin Saxena 	if (dpaa_fm_term())
1100fcdbde0SHemant Agrawal 		DPAA_PMD_ERR("DPAA FM term failed");
1114defbc8cSSachin Saxena 
1124defbc8cSSachin Saxena 	memset(&fm_model, 0, sizeof(struct dpaa_fm_model));
1134defbc8cSSachin Saxena }
1144defbc8cSSachin Saxena 
1154defbc8cSSachin Saxena void dpaa_write_fm_config_to_file(void)
1164defbc8cSSachin Saxena {
1174defbc8cSSachin Saxena 	size_t bytes_write;
1184defbc8cSSachin Saxena 	FILE *fp = fopen(fm_log, "wb");
1194defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
1204defbc8cSSachin Saxena 
1214defbc8cSSachin Saxena 	if (!fp) {
1224defbc8cSSachin Saxena 		DPAA_PMD_ERR("File open failed");
1234defbc8cSSachin Saxena 		return;
1244defbc8cSSachin Saxena 	}
1254defbc8cSSachin Saxena 	bytes_write = fwrite(&fm_model, sizeof(struct dpaa_fm_model), 1, fp);
1264defbc8cSSachin Saxena 	if (!bytes_write) {
1274defbc8cSSachin Saxena 		DPAA_PMD_WARN("No bytes write");
1284defbc8cSSachin Saxena 		fclose(fp);
1294defbc8cSSachin Saxena 		return;
1304defbc8cSSachin Saxena 	}
1314defbc8cSSachin Saxena 	fclose(fp);
1324defbc8cSSachin Saxena }
1334defbc8cSSachin Saxena 
1344defbc8cSSachin Saxena static void dpaa_read_fm_config_from_file(void)
1354defbc8cSSachin Saxena {
1364defbc8cSSachin Saxena 	size_t bytes_read;
1374defbc8cSSachin Saxena 	FILE *fp = fopen(fm_log, "rb");
1384defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
1394defbc8cSSachin Saxena 
1404defbc8cSSachin Saxena 	if (!fp)
1414defbc8cSSachin Saxena 		return;
1424defbc8cSSachin Saxena 	DPAA_PMD_INFO("Previous DPDK-FM config instance present, cleaning up.");
1434defbc8cSSachin Saxena 
1444defbc8cSSachin Saxena 	bytes_read = fread(&fm_model, sizeof(struct dpaa_fm_model), 1, fp);
1454defbc8cSSachin Saxena 	if (!bytes_read) {
1464defbc8cSSachin Saxena 		DPAA_PMD_WARN("No bytes read");
1474defbc8cSSachin Saxena 		fclose(fp);
1484defbc8cSSachin Saxena 		return;
1494defbc8cSSachin Saxena 	}
1504defbc8cSSachin Saxena 	fclose(fp);
1514defbc8cSSachin Saxena 
1524defbc8cSSachin Saxena 	/*FM cleanup from previous configured app */
1534defbc8cSSachin Saxena 	fm_prev_cleanup();
1544defbc8cSSachin Saxena }
1554defbc8cSSachin Saxena 
1564defbc8cSSachin Saxena static inline int
1574defbc8cSSachin Saxena set_hash_params_eth(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
1584defbc8cSSachin Saxena {
1594defbc8cSSachin Saxena 	int k;
1604defbc8cSSachin Saxena 
1614defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
1624defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
1634defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
1644defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
1654defbc8cSSachin Saxena 						HEADER_TYPE_ETH;
1664defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
1674defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
1684defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
1694defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
1704defbc8cSSachin Saxena 		if (k == 0)
1714defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).eth =
1724defbc8cSSachin Saxena 						IOC_NET_HF_ETH_SA;
1734defbc8cSSachin Saxena 		else
1744defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).eth =
1754defbc8cSSachin Saxena 						IOC_NET_HF_ETH_DA;
1764defbc8cSSachin Saxena 		hdr_idx++;
1774defbc8cSSachin Saxena 	}
1784defbc8cSSachin Saxena 	return hdr_idx;
1794defbc8cSSachin Saxena }
1804defbc8cSSachin Saxena 
1814defbc8cSSachin Saxena static inline int
1824defbc8cSSachin Saxena set_hash_params_ipv4(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
1834defbc8cSSachin Saxena {
1844defbc8cSSachin Saxena 	int k;
1854defbc8cSSachin Saxena 
1864defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
1874defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
1884defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
1894defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
1904defbc8cSSachin Saxena 						HEADER_TYPE_IPV4;
1914defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
1924defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
1934defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
1944defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
1954defbc8cSSachin Saxena 		if (k == 0)
1964defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv4 =
1974defbc8cSSachin Saxena 					ioc_net_hf_ipv_4_src_ip;
1984defbc8cSSachin Saxena 		else
1994defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv4 =
2004defbc8cSSachin Saxena 					ioc_net_hf_ipv_4_dst_ip;
2014defbc8cSSachin Saxena 		hdr_idx++;
2024defbc8cSSachin Saxena 	}
2034defbc8cSSachin Saxena 	return hdr_idx;
2044defbc8cSSachin Saxena }
2054defbc8cSSachin Saxena 
2064defbc8cSSachin Saxena static inline int
2074defbc8cSSachin Saxena set_hash_params_ipv6(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
2084defbc8cSSachin Saxena {
2094defbc8cSSachin Saxena 	int k;
2104defbc8cSSachin Saxena 
2114defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
2124defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
2134defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
2144defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
2154defbc8cSSachin Saxena 							HEADER_TYPE_IPV6;
2164defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
2174defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
2184defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
2194defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
2204defbc8cSSachin Saxena 		if (k == 0)
2214defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv6 =
2224defbc8cSSachin Saxena 					ioc_net_hf_ipv_6_src_ip;
2234defbc8cSSachin Saxena 		else
2244defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv6 =
2254defbc8cSSachin Saxena 					ioc_net_hf_ipv_6_dst_ip;
2264defbc8cSSachin Saxena 		hdr_idx++;
2274defbc8cSSachin Saxena 	}
2284defbc8cSSachin Saxena 	return hdr_idx;
2294defbc8cSSachin Saxena }
2304defbc8cSSachin Saxena 
2314defbc8cSSachin Saxena static inline int
2324defbc8cSSachin Saxena set_hash_params_udp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
2334defbc8cSSachin Saxena {
2344defbc8cSSachin Saxena 	int k;
2354defbc8cSSachin Saxena 
2364defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
2374defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
2384defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
2394defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
2404defbc8cSSachin Saxena 						HEADER_TYPE_UDP;
2414defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
2424defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
2434defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
2444defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
2454defbc8cSSachin Saxena 		if (k == 0)
2464defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).udp =
2474defbc8cSSachin Saxena 					IOC_NET_HF_UDP_PORT_SRC;
2484defbc8cSSachin Saxena 		else
2494defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).udp =
2504defbc8cSSachin Saxena 					IOC_NET_HF_UDP_PORT_DST;
2514defbc8cSSachin Saxena 		hdr_idx++;
2524defbc8cSSachin Saxena 	}
2534defbc8cSSachin Saxena 	return hdr_idx;
2544defbc8cSSachin Saxena }
2554defbc8cSSachin Saxena 
2564defbc8cSSachin Saxena static inline int
2574defbc8cSSachin Saxena set_hash_params_tcp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
2584defbc8cSSachin Saxena {
2594defbc8cSSachin Saxena 	int k;
2604defbc8cSSachin Saxena 
2614defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
2624defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
2634defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
2644defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
2654defbc8cSSachin Saxena 						HEADER_TYPE_TCP;
2664defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
2674defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
2684defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
2694defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
2704defbc8cSSachin Saxena 		if (k == 0)
2714defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).tcp =
2724defbc8cSSachin Saxena 					IOC_NET_HF_TCP_PORT_SRC;
2734defbc8cSSachin Saxena 		else
2744defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).tcp =
2754defbc8cSSachin Saxena 					IOC_NET_HF_TCP_PORT_DST;
2764defbc8cSSachin Saxena 		hdr_idx++;
2774defbc8cSSachin Saxena 	}
2784defbc8cSSachin Saxena 	return hdr_idx;
2794defbc8cSSachin Saxena }
2804defbc8cSSachin Saxena 
2814defbc8cSSachin Saxena static inline int
2824defbc8cSSachin Saxena set_hash_params_sctp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
2834defbc8cSSachin Saxena {
2844defbc8cSSachin Saxena 	int k;
2854defbc8cSSachin Saxena 
2864defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
2874defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
2884defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
2894defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
2904defbc8cSSachin Saxena 						HEADER_TYPE_SCTP;
2914defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
2924defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
2934defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
2944defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
2954defbc8cSSachin Saxena 		if (k == 0)
2964defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).sctp =
2974defbc8cSSachin Saxena 					IOC_NET_HF_SCTP_PORT_SRC;
2984defbc8cSSachin Saxena 		else
2994defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).sctp =
3004defbc8cSSachin Saxena 					IOC_NET_HF_SCTP_PORT_DST;
3014defbc8cSSachin Saxena 		hdr_idx++;
3024defbc8cSSachin Saxena 	}
3034defbc8cSSachin Saxena 	return hdr_idx;
3044defbc8cSSachin Saxena }
3054defbc8cSSachin Saxena 
3064defbc8cSSachin Saxena /* Set scheme params for hash distribution */
3074defbc8cSSachin Saxena static int set_scheme_params(ioc_fm_pcd_kg_scheme_params_t *scheme_params,
3084defbc8cSSachin Saxena 	ioc_fm_pcd_net_env_params_t *dist_units,
3094defbc8cSSachin Saxena 	struct dpaa_if *dpaa_intf,
310e4abd4ffSJun Yang 	struct fman_if *fif)
3114defbc8cSSachin Saxena {
3124defbc8cSSachin Saxena 	int dist_idx, hdr_idx = 0;
3134defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
3144defbc8cSSachin Saxena 
315e4abd4ffSJun Yang 	if (fif->num_profiles) {
316e4abd4ffSJun Yang 		scheme_params->param.override_storage_profile = true;
317e4abd4ffSJun Yang 		scheme_params->param.storage_profile.direct = true;
318e4abd4ffSJun Yang 		scheme_params->param.storage_profile.profile_select
319e4abd4ffSJun Yang 			.direct_relative_profile_id = fm_default_vsp_id(fif);
320e4abd4ffSJun Yang 	}
321e4abd4ffSJun Yang 
3224defbc8cSSachin Saxena 	scheme_params->param.use_hash = 1;
3234defbc8cSSachin Saxena 	scheme_params->param.modify = false;
3244defbc8cSSachin Saxena 	scheme_params->param.always_direct = false;
3254defbc8cSSachin Saxena 	scheme_params->param.scheme_counter.update = 1;
3264defbc8cSSachin Saxena 	scheme_params->param.scheme_counter.value = 0;
3274defbc8cSSachin Saxena 	scheme_params->param.next_engine = e_IOC_FM_PCD_DONE;
3284defbc8cSSachin Saxena 	scheme_params->param.base_fqid = dpaa_intf->rx_queues[0].fqid;
3294defbc8cSSachin Saxena 	scheme_params->param.net_env_params.net_env_id =
3304defbc8cSSachin Saxena 		dpaa_intf->netenv_handle;
3314defbc8cSSachin Saxena 	scheme_params->param.net_env_params.num_of_distinction_units =
3324defbc8cSSachin Saxena 		dist_units->param.num_of_distinction_units;
3334defbc8cSSachin Saxena 
3344defbc8cSSachin Saxena 	scheme_params->param.key_ext_and_hash.hash_dist_num_of_fqids =
3354defbc8cSSachin Saxena 			dpaa_intf->nb_rx_queues;
3364defbc8cSSachin Saxena 	scheme_params->param.key_ext_and_hash.num_of_used_extracts =
3374defbc8cSSachin Saxena 			2 * dist_units->param.num_of_distinction_units;
3384defbc8cSSachin Saxena 
3394defbc8cSSachin Saxena 	for (dist_idx = 0; dist_idx <
3404defbc8cSSachin Saxena 		dist_units->param.num_of_distinction_units;
3414defbc8cSSachin Saxena 		dist_idx++) {
3424defbc8cSSachin Saxena 		switch (dist_units->param.units[dist_idx].hdrs[0].hdr) {
3434defbc8cSSachin Saxena 		case HEADER_TYPE_ETH:
3444defbc8cSSachin Saxena 			hdr_idx = set_hash_params_eth(scheme_params, hdr_idx);
3454defbc8cSSachin Saxena 			break;
3464defbc8cSSachin Saxena 
3474defbc8cSSachin Saxena 		case HEADER_TYPE_IPV4:
3484defbc8cSSachin Saxena 			hdr_idx = set_hash_params_ipv4(scheme_params, hdr_idx);
3494defbc8cSSachin Saxena 			break;
3504defbc8cSSachin Saxena 
3514defbc8cSSachin Saxena 		case HEADER_TYPE_IPV6:
3524defbc8cSSachin Saxena 			hdr_idx = set_hash_params_ipv6(scheme_params, hdr_idx);
3534defbc8cSSachin Saxena 			break;
3544defbc8cSSachin Saxena 
3554defbc8cSSachin Saxena 		case HEADER_TYPE_UDP:
3564defbc8cSSachin Saxena 			hdr_idx = set_hash_params_udp(scheme_params, hdr_idx);
3574defbc8cSSachin Saxena 			break;
3584defbc8cSSachin Saxena 
3594defbc8cSSachin Saxena 		case HEADER_TYPE_TCP:
3604defbc8cSSachin Saxena 			hdr_idx = set_hash_params_tcp(scheme_params, hdr_idx);
3614defbc8cSSachin Saxena 			break;
3624defbc8cSSachin Saxena 
3634defbc8cSSachin Saxena 		case HEADER_TYPE_SCTP:
3644defbc8cSSachin Saxena 			hdr_idx = set_hash_params_sctp(scheme_params, hdr_idx);
3654defbc8cSSachin Saxena 			break;
3664defbc8cSSachin Saxena 
3674defbc8cSSachin Saxena 		default:
3684defbc8cSSachin Saxena 			DPAA_PMD_ERR("Invalid Distinction Unit");
3694defbc8cSSachin Saxena 			return -1;
3704defbc8cSSachin Saxena 		}
3714defbc8cSSachin Saxena 	}
3724defbc8cSSachin Saxena 
3734defbc8cSSachin Saxena 	return 0;
3744defbc8cSSachin Saxena }
3754defbc8cSSachin Saxena 
3764defbc8cSSachin Saxena static void set_dist_units(ioc_fm_pcd_net_env_params_t *dist_units,
3774defbc8cSSachin Saxena 			   uint64_t req_dist_set)
3784defbc8cSSachin Saxena {
3794defbc8cSSachin Saxena 	uint32_t loop = 0, dist_idx = 0, dist_field = 0;
3804defbc8cSSachin Saxena 	int l2_configured = 0, ipv4_configured = 0, ipv6_configured = 0;
3814defbc8cSSachin Saxena 	int udp_configured = 0, tcp_configured = 0, sctp_configured = 0;
3824defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
3834defbc8cSSachin Saxena 
3844defbc8cSSachin Saxena 	if (!req_dist_set)
3854defbc8cSSachin Saxena 		dist_units->param.units[dist_idx++].hdrs[0].hdr =
3864defbc8cSSachin Saxena 			HEADER_TYPE_ETH;
3874defbc8cSSachin Saxena 
3884defbc8cSSachin Saxena 	while (req_dist_set) {
3894defbc8cSSachin Saxena 		if (req_dist_set % 2 != 0) {
3904defbc8cSSachin Saxena 			dist_field = 1U << loop;
3914defbc8cSSachin Saxena 			switch (dist_field) {
392295968d1SFerruh Yigit 			case RTE_ETH_RSS_L2_PAYLOAD:
3934defbc8cSSachin Saxena 
3944defbc8cSSachin Saxena 				if (l2_configured)
3954defbc8cSSachin Saxena 					break;
3964defbc8cSSachin Saxena 				l2_configured = 1;
3974defbc8cSSachin Saxena 
3984defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
3994defbc8cSSachin Saxena 					= HEADER_TYPE_ETH;
4004defbc8cSSachin Saxena 				break;
4014defbc8cSSachin Saxena 
402295968d1SFerruh Yigit 			case RTE_ETH_RSS_IPV4:
403295968d1SFerruh Yigit 			case RTE_ETH_RSS_FRAG_IPV4:
404295968d1SFerruh Yigit 			case RTE_ETH_RSS_NONFRAG_IPV4_OTHER:
4054defbc8cSSachin Saxena 
4064defbc8cSSachin Saxena 				if (ipv4_configured)
4074defbc8cSSachin Saxena 					break;
4084defbc8cSSachin Saxena 				ipv4_configured = 1;
4094defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
4104defbc8cSSachin Saxena 					= HEADER_TYPE_IPV4;
4114defbc8cSSachin Saxena 				break;
4124defbc8cSSachin Saxena 
413295968d1SFerruh Yigit 			case RTE_ETH_RSS_IPV6:
414295968d1SFerruh Yigit 			case RTE_ETH_RSS_FRAG_IPV6:
415295968d1SFerruh Yigit 			case RTE_ETH_RSS_NONFRAG_IPV6_OTHER:
416295968d1SFerruh Yigit 			case RTE_ETH_RSS_IPV6_EX:
4174defbc8cSSachin Saxena 
4184defbc8cSSachin Saxena 				if (ipv6_configured)
4194defbc8cSSachin Saxena 					break;
4204defbc8cSSachin Saxena 				ipv6_configured = 1;
4214defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
4224defbc8cSSachin Saxena 					= HEADER_TYPE_IPV6;
4234defbc8cSSachin Saxena 				break;
4244defbc8cSSachin Saxena 
425295968d1SFerruh Yigit 			case RTE_ETH_RSS_NONFRAG_IPV4_TCP:
426295968d1SFerruh Yigit 			case RTE_ETH_RSS_NONFRAG_IPV6_TCP:
427295968d1SFerruh Yigit 			case RTE_ETH_RSS_IPV6_TCP_EX:
4284defbc8cSSachin Saxena 
4294defbc8cSSachin Saxena 				if (tcp_configured)
4304defbc8cSSachin Saxena 					break;
4314defbc8cSSachin Saxena 				tcp_configured = 1;
4324defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
4334defbc8cSSachin Saxena 					= HEADER_TYPE_TCP;
4344defbc8cSSachin Saxena 				break;
4354defbc8cSSachin Saxena 
436295968d1SFerruh Yigit 			case RTE_ETH_RSS_NONFRAG_IPV4_UDP:
437295968d1SFerruh Yigit 			case RTE_ETH_RSS_NONFRAG_IPV6_UDP:
438295968d1SFerruh Yigit 			case RTE_ETH_RSS_IPV6_UDP_EX:
4394defbc8cSSachin Saxena 
4404defbc8cSSachin Saxena 				if (udp_configured)
4414defbc8cSSachin Saxena 					break;
4424defbc8cSSachin Saxena 				udp_configured = 1;
4434defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
4444defbc8cSSachin Saxena 					= HEADER_TYPE_UDP;
4454defbc8cSSachin Saxena 				break;
4464defbc8cSSachin Saxena 
447295968d1SFerruh Yigit 			case RTE_ETH_RSS_NONFRAG_IPV4_SCTP:
448295968d1SFerruh Yigit 			case RTE_ETH_RSS_NONFRAG_IPV6_SCTP:
4494defbc8cSSachin Saxena 
4504defbc8cSSachin Saxena 				if (sctp_configured)
4514defbc8cSSachin Saxena 					break;
4524defbc8cSSachin Saxena 				sctp_configured = 1;
4534defbc8cSSachin Saxena 
4544defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
4554defbc8cSSachin Saxena 					= HEADER_TYPE_SCTP;
4564defbc8cSSachin Saxena 				break;
4574defbc8cSSachin Saxena 
4584defbc8cSSachin Saxena 			default:
4594defbc8cSSachin Saxena 				DPAA_PMD_ERR("Bad flow distribution option");
4604defbc8cSSachin Saxena 			}
4614defbc8cSSachin Saxena 		}
4624defbc8cSSachin Saxena 		req_dist_set = req_dist_set >> 1;
4634defbc8cSSachin Saxena 		loop++;
4644defbc8cSSachin Saxena 	}
4654defbc8cSSachin Saxena 
4664defbc8cSSachin Saxena 	/* Dist units is set to dist_idx */
4674defbc8cSSachin Saxena 	dist_units->param.num_of_distinction_units = dist_idx;
4684defbc8cSSachin Saxena }
4694defbc8cSSachin Saxena 
4704defbc8cSSachin Saxena /* Apply PCD configuration on interface */
4714defbc8cSSachin Saxena static inline int set_port_pcd(struct dpaa_if *dpaa_intf)
4724defbc8cSSachin Saxena {
4734defbc8cSSachin Saxena 	int ret = 0;
4744defbc8cSSachin Saxena 	unsigned int idx;
4754defbc8cSSachin Saxena 	ioc_fm_port_pcd_params_t pcd_param;
4764defbc8cSSachin Saxena 	ioc_fm_port_pcd_prs_params_t prs_param;
4774defbc8cSSachin Saxena 	ioc_fm_port_pcd_kg_params_t  kg_param;
4784defbc8cSSachin Saxena 
4794defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
4804defbc8cSSachin Saxena 
4814defbc8cSSachin Saxena 	/* PCD support for hash distribution */
4824defbc8cSSachin Saxena 	uint8_t pcd_support = e_FM_PORT_PCD_SUPPORT_PRS_AND_KG;
4834defbc8cSSachin Saxena 
4844defbc8cSSachin Saxena 	memset(&pcd_param, 0, sizeof(pcd_param));
4854defbc8cSSachin Saxena 	memset(&prs_param, 0, sizeof(prs_param));
4864defbc8cSSachin Saxena 	memset(&kg_param, 0, sizeof(kg_param));
4874defbc8cSSachin Saxena 
4884defbc8cSSachin Saxena 	/* Set parse params */
4894defbc8cSSachin Saxena 	prs_param.first_prs_hdr = HEADER_TYPE_ETH;
4904defbc8cSSachin Saxena 
4914defbc8cSSachin Saxena 	/* Set kg params */
4924defbc8cSSachin Saxena 	for (idx = 0; idx < dpaa_intf->scheme_count; idx++)
4934defbc8cSSachin Saxena 		kg_param.scheme_ids[idx] = dpaa_intf->scheme_handle[idx];
4944defbc8cSSachin Saxena 	kg_param.num_schemes = dpaa_intf->scheme_count;
4954defbc8cSSachin Saxena 
4964defbc8cSSachin Saxena 	/* Set pcd params */
4974defbc8cSSachin Saxena 	pcd_param.net_env_id = dpaa_intf->netenv_handle;
4984defbc8cSSachin Saxena 	pcd_param.pcd_support = pcd_support;
4994defbc8cSSachin Saxena 	pcd_param.p_kg_params = &kg_param;
5004defbc8cSSachin Saxena 	pcd_param.p_prs_params = &prs_param;
5014defbc8cSSachin Saxena 
5024defbc8cSSachin Saxena 	/* FM PORT Disable */
5034defbc8cSSachin Saxena 	ret = fm_port_disable(dpaa_intf->port_handle);
5044defbc8cSSachin Saxena 	if (ret != E_OK) {
5054defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_disable: Failed");
5064defbc8cSSachin Saxena 		return ret;
5074defbc8cSSachin Saxena 	}
5084defbc8cSSachin Saxena 
5094defbc8cSSachin Saxena 	/* FM PORT SetPCD */
5104defbc8cSSachin Saxena 	ret = fm_port_set_pcd(dpaa_intf->port_handle, &pcd_param);
5114defbc8cSSachin Saxena 	if (ret != E_OK) {
5124defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_set_pcd: Failed");
5134defbc8cSSachin Saxena 		return ret;
5144defbc8cSSachin Saxena 	}
5154defbc8cSSachin Saxena 
5164defbc8cSSachin Saxena 	/* FM PORT Enable */
5174defbc8cSSachin Saxena 	ret = fm_port_enable(dpaa_intf->port_handle);
5184defbc8cSSachin Saxena 	if (ret != E_OK) {
5194defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_enable: Failed");
5204defbc8cSSachin Saxena 		goto fm_port_delete_pcd;
5214defbc8cSSachin Saxena 	}
5224defbc8cSSachin Saxena 
5234defbc8cSSachin Saxena 	return 0;
5244defbc8cSSachin Saxena 
5254defbc8cSSachin Saxena fm_port_delete_pcd:
5264defbc8cSSachin Saxena 	/* FM PORT DeletePCD */
5274defbc8cSSachin Saxena 	ret = fm_port_delete_pcd(dpaa_intf->port_handle);
5284defbc8cSSachin Saxena 	if (ret != E_OK) {
5291ec9a3afSHemant Agrawal 		DPAA_PMD_ERR("fm_port_delete_pcd: Failed");
5304defbc8cSSachin Saxena 		return ret;
5314defbc8cSSachin Saxena 	}
5324defbc8cSSachin Saxena 	return -1;
5334defbc8cSSachin Saxena }
5344defbc8cSSachin Saxena 
5354defbc8cSSachin Saxena /* Unset PCD NerEnv and scheme */
5364defbc8cSSachin Saxena static inline void unset_pcd_netenv_scheme(struct dpaa_if *dpaa_intf)
5374defbc8cSSachin Saxena {
5384defbc8cSSachin Saxena 	int ret;
5394defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
5404defbc8cSSachin Saxena 
5414defbc8cSSachin Saxena 	/* reduce scheme count */
5424defbc8cSSachin Saxena 	if (dpaa_intf->scheme_count)
5434defbc8cSSachin Saxena 		dpaa_intf->scheme_count--;
5444defbc8cSSachin Saxena 
5454defbc8cSSachin Saxena 	DPAA_PMD_DEBUG("KG SCHEME DEL %d handle =%p",
5464defbc8cSSachin Saxena 		dpaa_intf->scheme_count,
5474defbc8cSSachin Saxena 		dpaa_intf->scheme_handle[dpaa_intf->scheme_count]);
5484defbc8cSSachin Saxena 
5494defbc8cSSachin Saxena 	ret = fm_pcd_kg_scheme_delete(dpaa_intf->scheme_handle
5504defbc8cSSachin Saxena 					[dpaa_intf->scheme_count]);
5514defbc8cSSachin Saxena 	if (ret != E_OK)
5524defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_kg_scheme_delete: Failed");
5534defbc8cSSachin Saxena 
5544defbc8cSSachin Saxena 	dpaa_intf->scheme_handle[dpaa_intf->scheme_count] = NULL;
5554defbc8cSSachin Saxena }
5564defbc8cSSachin Saxena 
5574defbc8cSSachin Saxena /* Set PCD NetEnv and Scheme and default scheme */
5584defbc8cSSachin Saxena static inline int set_default_scheme(struct dpaa_if *dpaa_intf)
5594defbc8cSSachin Saxena {
5604defbc8cSSachin Saxena 	ioc_fm_pcd_kg_scheme_params_t scheme_params;
5614defbc8cSSachin Saxena 	int idx = dpaa_intf->scheme_count;
5624defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
5634defbc8cSSachin Saxena 
5644defbc8cSSachin Saxena 	/* Set PCD NetEnvCharacteristics */
5654defbc8cSSachin Saxena 	memset(&scheme_params, 0, sizeof(scheme_params));
5664defbc8cSSachin Saxena 
5674defbc8cSSachin Saxena 	/* Adding 10 to default schemes as the number of interface would be
5684defbc8cSSachin Saxena 	 * lesser than 10 and the relative scheme ids should be unique for
5694defbc8cSSachin Saxena 	 * every scheme.
5704defbc8cSSachin Saxena 	 */
5714defbc8cSSachin Saxena 	scheme_params.param.scm_id.relative_scheme_id =
5724defbc8cSSachin Saxena 		10 + dpaa_intf->ifid;
5734defbc8cSSachin Saxena 	scheme_params.param.use_hash = 0;
5744defbc8cSSachin Saxena 	scheme_params.param.next_engine = e_IOC_FM_PCD_DONE;
5754defbc8cSSachin Saxena 	scheme_params.param.net_env_params.num_of_distinction_units = 0;
5764defbc8cSSachin Saxena 	scheme_params.param.net_env_params.net_env_id =
5774defbc8cSSachin Saxena 		dpaa_intf->netenv_handle;
5784defbc8cSSachin Saxena 	scheme_params.param.base_fqid = dpaa_intf->rx_queues[0].fqid;
5794defbc8cSSachin Saxena 	scheme_params.param.key_ext_and_hash.hash_dist_num_of_fqids = 1;
5804defbc8cSSachin Saxena 	scheme_params.param.key_ext_and_hash.num_of_used_extracts = 0;
5814defbc8cSSachin Saxena 	scheme_params.param.modify = false;
5824defbc8cSSachin Saxena 	scheme_params.param.always_direct = false;
5834defbc8cSSachin Saxena 	scheme_params.param.scheme_counter.update = 1;
5844defbc8cSSachin Saxena 	scheme_params.param.scheme_counter.value = 0;
5854defbc8cSSachin Saxena 
5864defbc8cSSachin Saxena 	/* FM PCD KgSchemeSet */
5874defbc8cSSachin Saxena 	dpaa_intf->scheme_handle[idx] =
5884defbc8cSSachin Saxena 		fm_pcd_kg_scheme_set(fm_info.pcd_handle, &scheme_params);
5894defbc8cSSachin Saxena 	DPAA_PMD_DEBUG("KG SCHEME SET %d handle =%p",
5904defbc8cSSachin Saxena 		idx, dpaa_intf->scheme_handle[idx]);
5914defbc8cSSachin Saxena 	if (!dpaa_intf->scheme_handle[idx]) {
5924defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_kg_scheme_set: Failed");
5934defbc8cSSachin Saxena 		return -1;
5944defbc8cSSachin Saxena 	}
5954defbc8cSSachin Saxena 
5964defbc8cSSachin Saxena 	fm_model.scheme_devid[dpaa_intf->ifid][idx] =
5974defbc8cSSachin Saxena 				get_device_id(dpaa_intf->scheme_handle[idx]);
5984defbc8cSSachin Saxena 	dpaa_intf->scheme_count++;
5994defbc8cSSachin Saxena 	return 0;
6004defbc8cSSachin Saxena }
6014defbc8cSSachin Saxena 
6024defbc8cSSachin Saxena 
6034defbc8cSSachin Saxena /* Set PCD NetEnv and Scheme and default scheme */
6044defbc8cSSachin Saxena static inline int set_pcd_netenv_scheme(struct dpaa_if *dpaa_intf,
6054defbc8cSSachin Saxena 					uint64_t req_dist_set,
6064defbc8cSSachin Saxena 					struct fman_if *fif)
6074defbc8cSSachin Saxena {
6084defbc8cSSachin Saxena 	int ret = -1;
6094defbc8cSSachin Saxena 	ioc_fm_pcd_net_env_params_t dist_units;
6104defbc8cSSachin Saxena 	ioc_fm_pcd_kg_scheme_params_t scheme_params;
6114defbc8cSSachin Saxena 	int idx = dpaa_intf->scheme_count;
6124defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
6134defbc8cSSachin Saxena 
6144defbc8cSSachin Saxena 	/* Set PCD NetEnvCharacteristics */
6154defbc8cSSachin Saxena 	memset(&dist_units, 0, sizeof(dist_units));
6164defbc8cSSachin Saxena 	memset(&scheme_params, 0, sizeof(scheme_params));
6174defbc8cSSachin Saxena 
6184defbc8cSSachin Saxena 	/* Set dist unit header type */
6194defbc8cSSachin Saxena 	set_dist_units(&dist_units, req_dist_set);
6204defbc8cSSachin Saxena 
6214defbc8cSSachin Saxena 	scheme_params.param.scm_id.relative_scheme_id = dpaa_intf->ifid;
6224defbc8cSSachin Saxena 
6234defbc8cSSachin Saxena 	/* Set PCD Scheme params */
6244defbc8cSSachin Saxena 	ret = set_scheme_params(&scheme_params, &dist_units, dpaa_intf, fif);
6254defbc8cSSachin Saxena 	if (ret) {
6264defbc8cSSachin Saxena 		DPAA_PMD_ERR("Set scheme params: Failed");
6274defbc8cSSachin Saxena 		return -1;
6284defbc8cSSachin Saxena 	}
6294defbc8cSSachin Saxena 
6304defbc8cSSachin Saxena 	/* FM PCD KgSchemeSet */
6314defbc8cSSachin Saxena 	dpaa_intf->scheme_handle[idx] =
6324defbc8cSSachin Saxena 		fm_pcd_kg_scheme_set(fm_info.pcd_handle, &scheme_params);
6334defbc8cSSachin Saxena 	DPAA_PMD_DEBUG("KG SCHEME SET %d handle =%p",
6344defbc8cSSachin Saxena 			idx, dpaa_intf->scheme_handle[idx]);
6354defbc8cSSachin Saxena 	if (!dpaa_intf->scheme_handle[idx]) {
6364defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_kg_scheme_set: Failed");
6374defbc8cSSachin Saxena 		return -1;
6384defbc8cSSachin Saxena 	}
6394defbc8cSSachin Saxena 
6404defbc8cSSachin Saxena 	fm_model.scheme_devid[dpaa_intf->ifid][idx] =
6414defbc8cSSachin Saxena 				get_device_id(dpaa_intf->scheme_handle[idx]);
6424defbc8cSSachin Saxena 	dpaa_intf->scheme_count++;
6434defbc8cSSachin Saxena 	return 0;
6444defbc8cSSachin Saxena }
6454defbc8cSSachin Saxena 
6464defbc8cSSachin Saxena 
647a0edbb8aSRohit Raj static inline int get_rx_port_type(struct fman_if *fif)
6484defbc8cSSachin Saxena {
6497e5f49aeSRohit Raj 	/* For onic ports, configure the VSP as offline ports so that
6507e5f49aeSRohit Raj 	 * kernel can configure correct port.
6517e5f49aeSRohit Raj 	 */
6527e5f49aeSRohit Raj 	if (fif->mac_type == fman_offline_internal ||
6537e5f49aeSRohit Raj 	    fif->mac_type == fman_onic)
654a0edbb8aSRohit Raj 		return e_FM_PORT_TYPE_OH_OFFLINE_PARSING;
6559e97abf2SJun Yang 	/* For 1G fm-mac9 and fm-mac10 ports, configure the VSP as 10G
6569e97abf2SJun Yang 	 * ports so that kernel can configure correct port.
6579e97abf2SJun Yang 	 */
658a0edbb8aSRohit Raj 	else if (fif->mac_type == fman_mac_1g &&
6599e97abf2SJun Yang 		fif->mac_idx >= DPAA_10G_MAC_START_IDX)
6609e97abf2SJun Yang 		return e_FM_PORT_TYPE_RX_10G;
6619e97abf2SJun Yang 	else if (fif->mac_type == fman_mac_1g)
6624defbc8cSSachin Saxena 		return e_FM_PORT_TYPE_RX;
6634defbc8cSSachin Saxena 	else if (fif->mac_type == fman_mac_2_5g)
6644defbc8cSSachin Saxena 		return e_FM_PORT_TYPE_RX_2_5G;
6654defbc8cSSachin Saxena 	else if (fif->mac_type == fman_mac_10g)
6664defbc8cSSachin Saxena 		return e_FM_PORT_TYPE_RX_10G;
6674defbc8cSSachin Saxena 
6684defbc8cSSachin Saxena 	DPAA_PMD_ERR("MAC type unsupported");
669a0edbb8aSRohit Raj 	return e_FM_PORT_TYPE_DUMMY;
6704defbc8cSSachin Saxena }
6714defbc8cSSachin Saxena 
6724defbc8cSSachin Saxena static inline int set_fm_port_handle(struct dpaa_if *dpaa_intf,
6734defbc8cSSachin Saxena 				     uint64_t req_dist_set,
6744defbc8cSSachin Saxena 				     struct fman_if *fif)
6754defbc8cSSachin Saxena {
6764defbc8cSSachin Saxena 	t_fm_port_params	fm_port_params;
6774defbc8cSSachin Saxena 	ioc_fm_pcd_net_env_params_t dist_units;
6784defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
6794defbc8cSSachin Saxena 
6804defbc8cSSachin Saxena 	/* Memset FM port params */
6814defbc8cSSachin Saxena 	memset(&fm_port_params, 0, sizeof(fm_port_params));
6824defbc8cSSachin Saxena 
6834defbc8cSSachin Saxena 	/* Set FM port params */
6844defbc8cSSachin Saxena 	fm_port_params.h_fm = fm_info.fman_handle;
685a0edbb8aSRohit Raj 	fm_port_params.port_type = get_rx_port_type(fif);
6864defbc8cSSachin Saxena 	fm_port_params.port_id = mac_idx[fif->mac_idx];
6874defbc8cSSachin Saxena 
6884defbc8cSSachin Saxena 	/* FM PORT Open */
6894defbc8cSSachin Saxena 	dpaa_intf->port_handle = fm_port_open(&fm_port_params);
6904defbc8cSSachin Saxena 	if (!dpaa_intf->port_handle) {
6911ec9a3afSHemant Agrawal 		DPAA_PMD_ERR("fm_port_open: Failed");
6924defbc8cSSachin Saxena 		return -1;
6934defbc8cSSachin Saxena 	}
6944defbc8cSSachin Saxena 
6954defbc8cSSachin Saxena 	fm_model.fm_port_params[dpaa_intf->ifid] = fm_port_params;
6964defbc8cSSachin Saxena 
6974defbc8cSSachin Saxena 	/* Set PCD NetEnvCharacteristics */
6984defbc8cSSachin Saxena 	memset(&dist_units, 0, sizeof(dist_units));
6994defbc8cSSachin Saxena 
7004defbc8cSSachin Saxena 	/* Set dist unit header type */
7014defbc8cSSachin Saxena 	set_dist_units(&dist_units, req_dist_set);
7024defbc8cSSachin Saxena 
7034defbc8cSSachin Saxena 	/* FM PCD NetEnvCharacteristicsSet */
7044defbc8cSSachin Saxena 	dpaa_intf->netenv_handle =
7054defbc8cSSachin Saxena 		fm_pcd_net_env_characteristics_set(fm_info.pcd_handle,
7064defbc8cSSachin Saxena 							&dist_units);
7074defbc8cSSachin Saxena 	if (!dpaa_intf->netenv_handle) {
7084defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_net_env_characteristics_set: Failed");
7094defbc8cSSachin Saxena 		return -1;
7104defbc8cSSachin Saxena 	}
7114defbc8cSSachin Saxena 
7124defbc8cSSachin Saxena 	fm_model.netenv_devid[dpaa_intf->ifid] =
7134defbc8cSSachin Saxena 				get_device_id(dpaa_intf->netenv_handle);
7144defbc8cSSachin Saxena 
7154defbc8cSSachin Saxena 	return 0;
7164defbc8cSSachin Saxena }
7174defbc8cSSachin Saxena 
7184defbc8cSSachin Saxena /* De-Configure DPAA FM */
7194defbc8cSSachin Saxena int dpaa_fm_deconfig(struct dpaa_if *dpaa_intf,
7204defbc8cSSachin Saxena 			struct fman_if *fif __rte_unused)
7214defbc8cSSachin Saxena {
7224defbc8cSSachin Saxena 	int ret;
7234defbc8cSSachin Saxena 	unsigned int idx;
7244defbc8cSSachin Saxena 
7254defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
7264defbc8cSSachin Saxena 
7274defbc8cSSachin Saxena 	/* FM PORT Disable */
7284defbc8cSSachin Saxena 	ret = fm_port_disable(dpaa_intf->port_handle);
7294defbc8cSSachin Saxena 	if (ret != E_OK) {
7304defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_disable: Failed");
7314defbc8cSSachin Saxena 		return ret;
7324defbc8cSSachin Saxena 	}
7334defbc8cSSachin Saxena 
7344defbc8cSSachin Saxena 	/* FM PORT DeletePCD */
7354defbc8cSSachin Saxena 	ret = fm_port_delete_pcd(dpaa_intf->port_handle);
7364defbc8cSSachin Saxena 	if (ret != E_OK) {
7374defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_delete_pcd: Failed");
7384defbc8cSSachin Saxena 		return ret;
7394defbc8cSSachin Saxena 	}
7404defbc8cSSachin Saxena 
7414defbc8cSSachin Saxena 	for (idx = 0; idx < dpaa_intf->scheme_count; idx++) {
7424defbc8cSSachin Saxena 		DPAA_PMD_DEBUG("KG SCHEME DEL %d, handle =%p",
7434defbc8cSSachin Saxena 			idx, dpaa_intf->scheme_handle[idx]);
7444defbc8cSSachin Saxena 		/* FM PCD KgSchemeDelete */
7454defbc8cSSachin Saxena 		ret = fm_pcd_kg_scheme_delete(dpaa_intf->scheme_handle[idx]);
7464defbc8cSSachin Saxena 		if (ret != E_OK) {
7474defbc8cSSachin Saxena 			DPAA_PMD_ERR("fm_pcd_kg_scheme_delete: Failed");
7484defbc8cSSachin Saxena 			return ret;
7494defbc8cSSachin Saxena 		}
7504defbc8cSSachin Saxena 		dpaa_intf->scheme_handle[idx] = NULL;
7514defbc8cSSachin Saxena 	}
7524defbc8cSSachin Saxena 	/* FM PCD NetEnvCharacteristicsDelete */
7534defbc8cSSachin Saxena 	ret = fm_pcd_net_env_characteristics_delete(dpaa_intf->netenv_handle);
7544defbc8cSSachin Saxena 	if (ret != E_OK) {
7554defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_net_env_characteristics_delete: Failed");
7564defbc8cSSachin Saxena 		return ret;
7574defbc8cSSachin Saxena 	}
7584defbc8cSSachin Saxena 	dpaa_intf->netenv_handle = NULL;
7594defbc8cSSachin Saxena 
760133332f0SRadu Bulie 	if (fif && fif->is_shared_mac) {
761133332f0SRadu Bulie 		ret = fm_port_enable(dpaa_intf->port_handle);
762133332f0SRadu Bulie 		if (ret != E_OK) {
763133332f0SRadu Bulie 			DPAA_PMD_ERR("shared mac re-enable failed");
764133332f0SRadu Bulie 			return ret;
765133332f0SRadu Bulie 		}
766133332f0SRadu Bulie 	}
767133332f0SRadu Bulie 
7684defbc8cSSachin Saxena 	/* FM PORT Close */
7694defbc8cSSachin Saxena 	fm_port_close(dpaa_intf->port_handle);
7704defbc8cSSachin Saxena 	dpaa_intf->port_handle = NULL;
7714defbc8cSSachin Saxena 
7724defbc8cSSachin Saxena 	/* Set scheme count to 0 */
7734defbc8cSSachin Saxena 	dpaa_intf->scheme_count = 0;
7744defbc8cSSachin Saxena 
7754defbc8cSSachin Saxena 	return 0;
7764defbc8cSSachin Saxena }
7774defbc8cSSachin Saxena 
7784defbc8cSSachin Saxena int dpaa_fm_config(struct rte_eth_dev *dev, uint64_t req_dist_set)
7794defbc8cSSachin Saxena {
7804defbc8cSSachin Saxena 	struct dpaa_if *dpaa_intf = dev->data->dev_private;
7814defbc8cSSachin Saxena 	struct fman_if *fif = dev->process_private;
7824defbc8cSSachin Saxena 	int ret;
7834defbc8cSSachin Saxena 	unsigned int i = 0;
7844defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
7854defbc8cSSachin Saxena 
7864defbc8cSSachin Saxena 	if (dpaa_intf->port_handle) {
7874defbc8cSSachin Saxena 		if (dpaa_fm_deconfig(dpaa_intf, fif))
7884defbc8cSSachin Saxena 			DPAA_PMD_ERR("DPAA FM deconfig failed");
7894defbc8cSSachin Saxena 	}
7904defbc8cSSachin Saxena 
7914defbc8cSSachin Saxena 	if (!dev->data->nb_rx_queues)
7924defbc8cSSachin Saxena 		return 0;
7934defbc8cSSachin Saxena 
7944defbc8cSSachin Saxena 	if (dev->data->nb_rx_queues & (dev->data->nb_rx_queues - 1)) {
7954defbc8cSSachin Saxena 		DPAA_PMD_ERR("No of queues should be power of 2");
7964defbc8cSSachin Saxena 		return -1;
7974defbc8cSSachin Saxena 	}
7984defbc8cSSachin Saxena 
7994defbc8cSSachin Saxena 	/* Open FM Port and set it in port info */
8004defbc8cSSachin Saxena 	ret = set_fm_port_handle(dpaa_intf, req_dist_set, fif);
8014defbc8cSSachin Saxena 	if (ret) {
8024defbc8cSSachin Saxena 		DPAA_PMD_ERR("Set FM Port handle: Failed");
8034defbc8cSSachin Saxena 		return -1;
8044defbc8cSSachin Saxena 	}
8054defbc8cSSachin Saxena 
806e4abd4ffSJun Yang 	if (fif->num_profiles) {
807*e498f3b5SGagandeep Singh 		for (i = 0; i < dev->data->nb_rx_queues; i++)
808e4abd4ffSJun Yang 			dpaa_intf->rx_queues[i].vsp_id =
809e4abd4ffSJun Yang 				fm_default_vsp_id(fif);
810e4abd4ffSJun Yang 
811e4abd4ffSJun Yang 		i = 0;
812e4abd4ffSJun Yang 	}
813e4abd4ffSJun Yang 
8144defbc8cSSachin Saxena 	/* Set PCD netenv and scheme */
8154defbc8cSSachin Saxena 	if (req_dist_set) {
8164defbc8cSSachin Saxena 		ret = set_pcd_netenv_scheme(dpaa_intf, req_dist_set, fif);
8174defbc8cSSachin Saxena 		if (ret) {
8184defbc8cSSachin Saxena 			DPAA_PMD_ERR("Set PCD NetEnv and Scheme dist: Failed");
8194defbc8cSSachin Saxena 			goto unset_fm_port_handle;
8204defbc8cSSachin Saxena 		}
8214defbc8cSSachin Saxena 	}
8224defbc8cSSachin Saxena 	/* Set default netenv and scheme */
823133332f0SRadu Bulie 	if (!fif->is_shared_mac) {
8244defbc8cSSachin Saxena 		ret = set_default_scheme(dpaa_intf);
8254defbc8cSSachin Saxena 		if (ret) {
8264defbc8cSSachin Saxena 			DPAA_PMD_ERR("Set PCD NetEnv and Scheme: Failed");
8274defbc8cSSachin Saxena 			goto unset_pcd_netenv_scheme1;
8284defbc8cSSachin Saxena 		}
829133332f0SRadu Bulie 	}
8304defbc8cSSachin Saxena 
8314defbc8cSSachin Saxena 	/* Set Port PCD */
8324defbc8cSSachin Saxena 	ret = set_port_pcd(dpaa_intf);
8334defbc8cSSachin Saxena 	if (ret) {
8344defbc8cSSachin Saxena 		DPAA_PMD_ERR("Set Port PCD: Failed");
8354defbc8cSSachin Saxena 		goto unset_pcd_netenv_scheme;
8364defbc8cSSachin Saxena 	}
8374defbc8cSSachin Saxena 
8384defbc8cSSachin Saxena 	for (; i < fm_model.dev_count; i++)
8394defbc8cSSachin Saxena 		if (fm_model.device_order[i] == dpaa_intf->ifid)
8404defbc8cSSachin Saxena 			return 0;
8414defbc8cSSachin Saxena 
8424defbc8cSSachin Saxena 	fm_model.device_order[fm_model.dev_count] = dpaa_intf->ifid;
8434defbc8cSSachin Saxena 	fm_model.dev_count++;
8444defbc8cSSachin Saxena 
8454defbc8cSSachin Saxena 	return 0;
8464defbc8cSSachin Saxena 
8474defbc8cSSachin Saxena unset_pcd_netenv_scheme:
8484defbc8cSSachin Saxena 	unset_pcd_netenv_scheme(dpaa_intf);
8494defbc8cSSachin Saxena 
8504defbc8cSSachin Saxena unset_pcd_netenv_scheme1:
8514defbc8cSSachin Saxena 	unset_pcd_netenv_scheme(dpaa_intf);
8524defbc8cSSachin Saxena 
8534defbc8cSSachin Saxena unset_fm_port_handle:
8544defbc8cSSachin Saxena 	/* FM PORT Close */
8554defbc8cSSachin Saxena 	fm_port_close(dpaa_intf->port_handle);
8564defbc8cSSachin Saxena 	dpaa_intf->port_handle = NULL;
8574defbc8cSSachin Saxena 	return -1;
8584defbc8cSSachin Saxena }
8594defbc8cSSachin Saxena 
8604defbc8cSSachin Saxena int dpaa_fm_init(void)
8614defbc8cSSachin Saxena {
8624defbc8cSSachin Saxena 	t_handle fman_handle;
8634defbc8cSSachin Saxena 	t_handle pcd_handle;
8644defbc8cSSachin Saxena 	t_fm_pcd_params fm_pcd_params = {0};
8654defbc8cSSachin Saxena 	/* Hard-coded : fman id 0 since one fman is present in LS104x */
8664defbc8cSSachin Saxena 	int fman_id = 0, ret;
8674defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
8684defbc8cSSachin Saxena 
8694defbc8cSSachin Saxena 	dpaa_read_fm_config_from_file();
8704defbc8cSSachin Saxena 
8714defbc8cSSachin Saxena 	/* FM Open */
8724defbc8cSSachin Saxena 	fman_handle = fm_open(fman_id);
8734defbc8cSSachin Saxena 	if (!fman_handle) {
8744defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_open: Failed");
8754defbc8cSSachin Saxena 		return -1;
8764defbc8cSSachin Saxena 	}
8774defbc8cSSachin Saxena 
8784defbc8cSSachin Saxena 	/* FM PCD Open */
8794defbc8cSSachin Saxena 	fm_pcd_params.h_fm = fman_handle;
8804defbc8cSSachin Saxena 	fm_pcd_params.prs_support = true;
8814defbc8cSSachin Saxena 	fm_pcd_params.kg_support = true;
8824defbc8cSSachin Saxena 	pcd_handle = fm_pcd_open(&fm_pcd_params);
8834defbc8cSSachin Saxena 	if (!pcd_handle) {
8844defbc8cSSachin Saxena 		fm_close(fman_handle);
8854defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_open: Failed");
8864defbc8cSSachin Saxena 		return -1;
8874defbc8cSSachin Saxena 	}
8884defbc8cSSachin Saxena 
8894defbc8cSSachin Saxena 	/* FM PCD Enable */
8904defbc8cSSachin Saxena 	ret = fm_pcd_enable(pcd_handle);
8914defbc8cSSachin Saxena 	if (ret) {
8924defbc8cSSachin Saxena 		fm_close(fman_handle);
8934defbc8cSSachin Saxena 		fm_pcd_close(pcd_handle);
8944defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_enable: Failed");
8954defbc8cSSachin Saxena 		return -1;
8964defbc8cSSachin Saxena 	}
8974defbc8cSSachin Saxena 
8984defbc8cSSachin Saxena 	/* Set fman and pcd handle in fm info */
8994defbc8cSSachin Saxena 	fm_info.fman_handle = fman_handle;
9004defbc8cSSachin Saxena 	fm_info.pcd_handle = pcd_handle;
9014defbc8cSSachin Saxena 
9024defbc8cSSachin Saxena 	return 0;
9034defbc8cSSachin Saxena }
9044defbc8cSSachin Saxena 
9054defbc8cSSachin Saxena 
9064defbc8cSSachin Saxena /* De-initialization of FM */
9074defbc8cSSachin Saxena int dpaa_fm_term(void)
9084defbc8cSSachin Saxena {
9094defbc8cSSachin Saxena 	int ret;
9104defbc8cSSachin Saxena 
9114defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
9124defbc8cSSachin Saxena 
9134defbc8cSSachin Saxena 	if (fm_info.pcd_handle && fm_info.fman_handle) {
9144defbc8cSSachin Saxena 		/* FM PCD Disable */
9154defbc8cSSachin Saxena 		ret = fm_pcd_disable(fm_info.pcd_handle);
9164defbc8cSSachin Saxena 		if (ret) {
9174defbc8cSSachin Saxena 			DPAA_PMD_ERR("fm_pcd_disable: Failed");
9184defbc8cSSachin Saxena 			return -1;
9194defbc8cSSachin Saxena 		}
9204defbc8cSSachin Saxena 
9214defbc8cSSachin Saxena 		/* FM PCD Close */
9224defbc8cSSachin Saxena 		fm_pcd_close(fm_info.pcd_handle);
9234defbc8cSSachin Saxena 		fm_info.pcd_handle = NULL;
9244defbc8cSSachin Saxena 	}
9254defbc8cSSachin Saxena 
9264defbc8cSSachin Saxena 	if (fm_info.fman_handle) {
9274defbc8cSSachin Saxena 		/* FM Close */
9284defbc8cSSachin Saxena 		fm_close(fm_info.fman_handle);
9294defbc8cSSachin Saxena 		fm_info.fman_handle = NULL;
9304defbc8cSSachin Saxena 	}
9314defbc8cSSachin Saxena 
9324defbc8cSSachin Saxena 	if (access(fm_log, F_OK) != -1) {
9334defbc8cSSachin Saxena 		ret = remove(fm_log);
9344defbc8cSSachin Saxena 		if (ret)
9354defbc8cSSachin Saxena 			DPAA_PMD_ERR("File remove: Failed");
9364defbc8cSSachin Saxena 	}
9374defbc8cSSachin Saxena 	return 0;
9384defbc8cSSachin Saxena }
939e4abd4ffSJun Yang 
940e4abd4ffSJun Yang static int dpaa_port_vsp_configure(struct dpaa_if *dpaa_intf,
941e4abd4ffSJun Yang 		uint8_t vsp_id, t_handle fman_handle,
94265afdda0SRohit Raj 		struct fman_if *fif, u32 mbuf_data_room_size)
943e4abd4ffSJun Yang {
944e4abd4ffSJun Yang 	t_fm_vsp_params vsp_params;
945e4abd4ffSJun Yang 	t_fm_buffer_prefix_content buf_prefix_cont;
946e4abd4ffSJun Yang 	uint8_t idx = mac_idx[fif->mac_idx];
947e4abd4ffSJun Yang 	int ret;
948e4abd4ffSJun Yang 
949e4abd4ffSJun Yang 	if (vsp_id == fif->base_profile_id && fif->is_shared_mac) {
950e4abd4ffSJun Yang 		/* For shared interface, VSP of base
951e4abd4ffSJun Yang 		 * profile is default pool located in kernel.
952e4abd4ffSJun Yang 		 */
953e4abd4ffSJun Yang 		dpaa_intf->vsp_bpid[vsp_id] = 0;
954e4abd4ffSJun Yang 		return 0;
955e4abd4ffSJun Yang 	}
956e4abd4ffSJun Yang 
957e4abd4ffSJun Yang 	if (vsp_id >= DPAA_VSP_PROFILE_MAX_NUM) {
958e4abd4ffSJun Yang 		DPAA_PMD_ERR("VSP ID %d exceeds MAX number %d",
959e4abd4ffSJun Yang 			vsp_id, DPAA_VSP_PROFILE_MAX_NUM);
960e4abd4ffSJun Yang 		return -1;
961e4abd4ffSJun Yang 	}
962e4abd4ffSJun Yang 
963e4abd4ffSJun Yang 	memset(&vsp_params, 0, sizeof(vsp_params));
964e4abd4ffSJun Yang 	vsp_params.h_fm = fman_handle;
965e4abd4ffSJun Yang 	vsp_params.relative_profile_id = vsp_id;
9667e5f49aeSRohit Raj 	if (fif->mac_type == fman_offline_internal ||
9677e5f49aeSRohit Raj 	    fif->mac_type == fman_onic)
968a0edbb8aSRohit Raj 		vsp_params.port_params.port_id = fif->mac_idx;
969a0edbb8aSRohit Raj 	else
970e4abd4ffSJun Yang 		vsp_params.port_params.port_id = idx;
971a0edbb8aSRohit Raj 
972a0edbb8aSRohit Raj 	vsp_params.port_params.port_type = get_rx_port_type(fif);
973a0edbb8aSRohit Raj 	if (vsp_params.port_params.port_type == e_FM_PORT_TYPE_DUMMY) {
974a0edbb8aSRohit Raj 		DPAA_PMD_ERR("Mac type %d error", fif->mac_type);
975a0edbb8aSRohit Raj 		return -1;
976a0edbb8aSRohit Raj 	}
977a0edbb8aSRohit Raj 
978e4abd4ffSJun Yang 	vsp_params.ext_buf_pools.num_of_pools_used = 1;
97965afdda0SRohit Raj 	vsp_params.ext_buf_pools.ext_buf_pool[0].id = dpaa_intf->vsp_bpid[vsp_id];
98065afdda0SRohit Raj 	vsp_params.ext_buf_pools.ext_buf_pool[0].size = mbuf_data_room_size;
981e4abd4ffSJun Yang 
982e4abd4ffSJun Yang 	dpaa_intf->vsp_handle[vsp_id] = fm_vsp_config(&vsp_params);
983e4abd4ffSJun Yang 	if (!dpaa_intf->vsp_handle[vsp_id]) {
984e4abd4ffSJun Yang 		DPAA_PMD_ERR("fm_vsp_config error for profile %d", vsp_id);
985e4abd4ffSJun Yang 		return -EINVAL;
986e4abd4ffSJun Yang 	}
987e4abd4ffSJun Yang 
988e4abd4ffSJun Yang 	/* configure the application buffer (structure, size and
989e4abd4ffSJun Yang 	 * content)
990e4abd4ffSJun Yang 	 */
991e4abd4ffSJun Yang 
992e4abd4ffSJun Yang 	memset(&buf_prefix_cont, 0, sizeof(buf_prefix_cont));
993e4abd4ffSJun Yang 
994e4abd4ffSJun Yang 	buf_prefix_cont.priv_data_size = 16;
995e4abd4ffSJun Yang 	buf_prefix_cont.data_align = 64;
996e4abd4ffSJun Yang 	buf_prefix_cont.pass_prs_result = true;
997e4abd4ffSJun Yang 	buf_prefix_cont.pass_time_stamp = true;
998e4abd4ffSJun Yang 	buf_prefix_cont.pass_hash_result = false;
999e4abd4ffSJun Yang 	buf_prefix_cont.pass_all_other_pcdinfo = false;
10008d2bf7c1SNipun Gupta 	buf_prefix_cont.manip_ext_space =
10018d2bf7c1SNipun Gupta 		RTE_PKTMBUF_HEADROOM - DPAA_MBUF_HW_ANNOTATION;
10028d2bf7c1SNipun Gupta 
1003e4abd4ffSJun Yang 	ret = fm_vsp_config_buffer_prefix_content(dpaa_intf->vsp_handle[vsp_id],
1004e4abd4ffSJun Yang 					       &buf_prefix_cont);
1005e4abd4ffSJun Yang 	if (ret != E_OK) {
1006e4abd4ffSJun Yang 		DPAA_PMD_ERR("fm_vsp_config_buffer_prefix_content error for profile %d err: %d",
1007e4abd4ffSJun Yang 			     vsp_id, ret);
1008e4abd4ffSJun Yang 		return ret;
1009e4abd4ffSJun Yang 	}
1010e4abd4ffSJun Yang 
1011e4abd4ffSJun Yang 	/* initialize the FM VSP module */
1012e4abd4ffSJun Yang 	ret = fm_vsp_init(dpaa_intf->vsp_handle[vsp_id]);
1013e4abd4ffSJun Yang 	if (ret != E_OK) {
1014e4abd4ffSJun Yang 		DPAA_PMD_ERR("fm_vsp_init error for profile %d err:%d",
1015e4abd4ffSJun Yang 			 vsp_id, ret);
1016e4abd4ffSJun Yang 		return ret;
1017e4abd4ffSJun Yang 	}
1018e4abd4ffSJun Yang 
1019e4abd4ffSJun Yang 	return 0;
1020e4abd4ffSJun Yang }
1021e4abd4ffSJun Yang 
1022e4abd4ffSJun Yang int dpaa_port_vsp_update(struct dpaa_if *dpaa_intf,
1023e4abd4ffSJun Yang 		bool fmc_mode, uint8_t vsp_id, uint32_t bpid,
102465afdda0SRohit Raj 		struct fman_if *fif, u32 mbuf_data_room_size)
1025e4abd4ffSJun Yang {
1026e4abd4ffSJun Yang 	int ret = 0;
1027e4abd4ffSJun Yang 	t_handle fman_handle;
1028e4abd4ffSJun Yang 
1029e4abd4ffSJun Yang 	if (!fif->num_profiles)
1030e4abd4ffSJun Yang 		return 0;
1031e4abd4ffSJun Yang 
1032e4abd4ffSJun Yang 	if (vsp_id >= fif->num_profiles)
1033e4abd4ffSJun Yang 		return 0;
1034e4abd4ffSJun Yang 
1035e4abd4ffSJun Yang 	if (dpaa_intf->vsp_bpid[vsp_id] == bpid)
1036e4abd4ffSJun Yang 		return 0;
1037e4abd4ffSJun Yang 
1038e4abd4ffSJun Yang 	if (dpaa_intf->vsp_handle[vsp_id]) {
1039e4abd4ffSJun Yang 		ret = fm_vsp_free(dpaa_intf->vsp_handle[vsp_id]);
1040e4abd4ffSJun Yang 		if (ret != E_OK) {
1041e4abd4ffSJun Yang 			DPAA_PMD_ERR("Error fm_vsp_free: err %d vsp_handle[%d]",
1042e4abd4ffSJun Yang 				     ret, vsp_id);
1043e4abd4ffSJun Yang 			return ret;
1044e4abd4ffSJun Yang 		}
1045e4abd4ffSJun Yang 		dpaa_intf->vsp_handle[vsp_id] = 0;
1046e4abd4ffSJun Yang 	}
1047e4abd4ffSJun Yang 
1048e4abd4ffSJun Yang 	if (fmc_mode)
1049e4abd4ffSJun Yang 		fman_handle = fm_open(0);
1050e4abd4ffSJun Yang 	else
1051e4abd4ffSJun Yang 		fman_handle = fm_info.fman_handle;
1052e4abd4ffSJun Yang 
1053e4abd4ffSJun Yang 	dpaa_intf->vsp_bpid[vsp_id] = bpid;
1054e4abd4ffSJun Yang 
105565afdda0SRohit Raj 	return dpaa_port_vsp_configure(dpaa_intf, vsp_id, fman_handle, fif,
105665afdda0SRohit Raj 				       mbuf_data_room_size);
1057e4abd4ffSJun Yang }
1058e4abd4ffSJun Yang 
1059e4abd4ffSJun Yang int dpaa_port_vsp_cleanup(struct dpaa_if *dpaa_intf, struct fman_if *fif)
1060e4abd4ffSJun Yang {
1061e4abd4ffSJun Yang 	int idx, ret;
1062e4abd4ffSJun Yang 
1063e4abd4ffSJun Yang 	for (idx = 0; idx < (uint8_t)fif->num_profiles; idx++) {
1064e4abd4ffSJun Yang 		if (dpaa_intf->vsp_handle[idx]) {
1065e4abd4ffSJun Yang 			ret = fm_vsp_free(dpaa_intf->vsp_handle[idx]);
1066e4abd4ffSJun Yang 			if (ret != E_OK) {
1067e4abd4ffSJun Yang 				DPAA_PMD_ERR("Error fm_vsp_free: err %d"
1068e4abd4ffSJun Yang 					     " vsp_handle[%d]", ret, idx);
1069e4abd4ffSJun Yang 				return ret;
1070e4abd4ffSJun Yang 			}
1071e4abd4ffSJun Yang 		}
1072e4abd4ffSJun Yang 	}
1073e4abd4ffSJun Yang 
1074e4abd4ffSJun Yang 	return E_OK;
1075e4abd4ffSJun Yang }
1076