xref: /dpdk/drivers/net/dpaa/dpaa_flow.c (revision 133332f01d91aef2056cbdc407f3fd3d61b24b83)
14defbc8cSSachin Saxena /* SPDX-License-Identifier: BSD-3-Clause
24defbc8cSSachin Saxena  * Copyright 2017-2019 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>
154defbc8cSSachin Saxena 
164defbc8cSSachin Saxena #define DPAA_MAX_NUM_ETH_DEV	8
174defbc8cSSachin Saxena 
184defbc8cSSachin Saxena static inline
194defbc8cSSachin Saxena ioc_fm_pcd_extract_entry_t *
204defbc8cSSachin Saxena SCH_EXT_ARR(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
214defbc8cSSachin Saxena {
224defbc8cSSachin Saxena return &scheme_params->param.key_ext_and_hash.extract_array[hdr_idx];
234defbc8cSSachin Saxena }
244defbc8cSSachin Saxena 
254defbc8cSSachin Saxena #define SCH_EXT_HDR(scheme_params, hdr_idx) \
264defbc8cSSachin Saxena 	SCH_EXT_ARR(scheme_params, hdr_idx)->extract_params.extract_by_hdr
274defbc8cSSachin Saxena 
284defbc8cSSachin Saxena #define SCH_EXT_FULL_FLD(scheme_params, hdr_idx) \
294defbc8cSSachin Saxena 	SCH_EXT_HDR(scheme_params, hdr_idx).extract_by_hdr_type.full_field
304defbc8cSSachin Saxena 
314defbc8cSSachin Saxena /* FM global info */
324defbc8cSSachin Saxena struct dpaa_fm_info {
334defbc8cSSachin Saxena 	t_handle fman_handle;
344defbc8cSSachin Saxena 	t_handle pcd_handle;
354defbc8cSSachin Saxena };
364defbc8cSSachin Saxena 
374defbc8cSSachin Saxena /*FM model to read and write from file */
384defbc8cSSachin Saxena struct dpaa_fm_model {
394defbc8cSSachin Saxena 	uint32_t dev_count;
404defbc8cSSachin Saxena 	uint8_t device_order[DPAA_MAX_NUM_ETH_DEV];
414defbc8cSSachin Saxena 	t_fm_port_params fm_port_params[DPAA_MAX_NUM_ETH_DEV];
424defbc8cSSachin Saxena 	t_handle netenv_devid[DPAA_MAX_NUM_ETH_DEV];
434defbc8cSSachin Saxena 	t_handle scheme_devid[DPAA_MAX_NUM_ETH_DEV][2];
444defbc8cSSachin Saxena };
454defbc8cSSachin Saxena 
464defbc8cSSachin Saxena static struct dpaa_fm_info fm_info;
474defbc8cSSachin Saxena static struct dpaa_fm_model fm_model;
484defbc8cSSachin Saxena static const char *fm_log = "/tmp/fmdpdk.bin";
494defbc8cSSachin Saxena 
504defbc8cSSachin Saxena static void fm_prev_cleanup(void)
514defbc8cSSachin Saxena {
524defbc8cSSachin Saxena 	uint32_t fman_id = 0, i = 0, devid;
534defbc8cSSachin Saxena 	struct dpaa_if dpaa_intf = {0};
544defbc8cSSachin Saxena 	t_fm_pcd_params fm_pcd_params = {0};
554defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
564defbc8cSSachin Saxena 
574defbc8cSSachin Saxena 	fm_info.fman_handle = fm_open(fman_id);
584defbc8cSSachin Saxena 	if (!fm_info.fman_handle) {
594defbc8cSSachin Saxena 		printf("\n%s- unable to open FMAN", __func__);
604defbc8cSSachin Saxena 		return;
614defbc8cSSachin Saxena 	}
624defbc8cSSachin Saxena 
634defbc8cSSachin Saxena 	fm_pcd_params.h_fm = fm_info.fman_handle;
644defbc8cSSachin Saxena 	fm_pcd_params.prs_support = true;
654defbc8cSSachin Saxena 	fm_pcd_params.kg_support = true;
664defbc8cSSachin Saxena 	/* FM PCD Open */
674defbc8cSSachin Saxena 	fm_info.pcd_handle = fm_pcd_open(&fm_pcd_params);
684defbc8cSSachin Saxena 	if (!fm_info.pcd_handle) {
694defbc8cSSachin Saxena 		printf("\n%s- unable to open PCD", __func__);
704defbc8cSSachin Saxena 		return;
714defbc8cSSachin Saxena 	}
724defbc8cSSachin Saxena 
734defbc8cSSachin Saxena 	while (i < fm_model.dev_count) {
744defbc8cSSachin Saxena 		devid = fm_model.device_order[i];
754defbc8cSSachin Saxena 		/* FM Port Open */
764defbc8cSSachin Saxena 		fm_model.fm_port_params[devid].h_fm = fm_info.fman_handle;
774defbc8cSSachin Saxena 		dpaa_intf.port_handle =
784defbc8cSSachin Saxena 				fm_port_open(&fm_model.fm_port_params[devid]);
794defbc8cSSachin Saxena 		dpaa_intf.scheme_handle[0] = create_device(fm_info.pcd_handle,
804defbc8cSSachin Saxena 					fm_model.scheme_devid[devid][0]);
814defbc8cSSachin Saxena 		dpaa_intf.scheme_count = 1;
824defbc8cSSachin Saxena 		if (fm_model.scheme_devid[devid][1]) {
834defbc8cSSachin Saxena 			dpaa_intf.scheme_handle[1] =
844defbc8cSSachin Saxena 				create_device(fm_info.pcd_handle,
854defbc8cSSachin Saxena 					fm_model.scheme_devid[devid][1]);
864defbc8cSSachin Saxena 			if (dpaa_intf.scheme_handle[1])
874defbc8cSSachin Saxena 				dpaa_intf.scheme_count++;
884defbc8cSSachin Saxena 		}
894defbc8cSSachin Saxena 
904defbc8cSSachin Saxena 		dpaa_intf.netenv_handle = create_device(fm_info.pcd_handle,
914defbc8cSSachin Saxena 					fm_model.netenv_devid[devid]);
924defbc8cSSachin Saxena 		i++;
934defbc8cSSachin Saxena 		if (!dpaa_intf.netenv_handle ||
944defbc8cSSachin Saxena 			!dpaa_intf.scheme_handle[0] ||
954defbc8cSSachin Saxena 			!dpaa_intf.port_handle)
964defbc8cSSachin Saxena 			continue;
974defbc8cSSachin Saxena 
984defbc8cSSachin Saxena 		if (dpaa_fm_deconfig(&dpaa_intf, NULL))
994defbc8cSSachin Saxena 			printf("\nDPAA FM deconfig failed\n");
1004defbc8cSSachin Saxena 	}
1014defbc8cSSachin Saxena 
1024defbc8cSSachin Saxena 	if (dpaa_fm_term())
1034defbc8cSSachin Saxena 		printf("\nDPAA FM term failed\n");
1044defbc8cSSachin Saxena 
1054defbc8cSSachin Saxena 	memset(&fm_model, 0, sizeof(struct dpaa_fm_model));
1064defbc8cSSachin Saxena }
1074defbc8cSSachin Saxena 
1084defbc8cSSachin Saxena void dpaa_write_fm_config_to_file(void)
1094defbc8cSSachin Saxena {
1104defbc8cSSachin Saxena 	size_t bytes_write;
1114defbc8cSSachin Saxena 	FILE *fp = fopen(fm_log, "wb");
1124defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
1134defbc8cSSachin Saxena 
1144defbc8cSSachin Saxena 	if (!fp) {
1154defbc8cSSachin Saxena 		DPAA_PMD_ERR("File open failed");
1164defbc8cSSachin Saxena 		return;
1174defbc8cSSachin Saxena 	}
1184defbc8cSSachin Saxena 	bytes_write = fwrite(&fm_model, sizeof(struct dpaa_fm_model), 1, fp);
1194defbc8cSSachin Saxena 	if (!bytes_write) {
1204defbc8cSSachin Saxena 		DPAA_PMD_WARN("No bytes write");
1214defbc8cSSachin Saxena 		fclose(fp);
1224defbc8cSSachin Saxena 		return;
1234defbc8cSSachin Saxena 	}
1244defbc8cSSachin Saxena 	fclose(fp);
1254defbc8cSSachin Saxena }
1264defbc8cSSachin Saxena 
1274defbc8cSSachin Saxena static void dpaa_read_fm_config_from_file(void)
1284defbc8cSSachin Saxena {
1294defbc8cSSachin Saxena 	size_t bytes_read;
1304defbc8cSSachin Saxena 	FILE *fp = fopen(fm_log, "rb");
1314defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
1324defbc8cSSachin Saxena 
1334defbc8cSSachin Saxena 	if (!fp)
1344defbc8cSSachin Saxena 		return;
1354defbc8cSSachin Saxena 	DPAA_PMD_INFO("Previous DPDK-FM config instance present, cleaning up.");
1364defbc8cSSachin Saxena 
1374defbc8cSSachin Saxena 	bytes_read = fread(&fm_model, sizeof(struct dpaa_fm_model), 1, fp);
1384defbc8cSSachin Saxena 	if (!bytes_read) {
1394defbc8cSSachin Saxena 		DPAA_PMD_WARN("No bytes read");
1404defbc8cSSachin Saxena 		fclose(fp);
1414defbc8cSSachin Saxena 		return;
1424defbc8cSSachin Saxena 	}
1434defbc8cSSachin Saxena 	fclose(fp);
1444defbc8cSSachin Saxena 
1454defbc8cSSachin Saxena 	/*FM cleanup from previous configured app */
1464defbc8cSSachin Saxena 	fm_prev_cleanup();
1474defbc8cSSachin Saxena }
1484defbc8cSSachin Saxena 
1494defbc8cSSachin Saxena static inline int
1504defbc8cSSachin Saxena set_hash_params_eth(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
1514defbc8cSSachin Saxena {
1524defbc8cSSachin Saxena 	int k;
1534defbc8cSSachin Saxena 
1544defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
1554defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
1564defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
1574defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
1584defbc8cSSachin Saxena 						HEADER_TYPE_ETH;
1594defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
1604defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
1614defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
1624defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
1634defbc8cSSachin Saxena 		if (k == 0)
1644defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).eth =
1654defbc8cSSachin Saxena 						IOC_NET_HF_ETH_SA;
1664defbc8cSSachin Saxena 		else
1674defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).eth =
1684defbc8cSSachin Saxena 						IOC_NET_HF_ETH_DA;
1694defbc8cSSachin Saxena 		hdr_idx++;
1704defbc8cSSachin Saxena 	}
1714defbc8cSSachin Saxena 	return hdr_idx;
1724defbc8cSSachin Saxena }
1734defbc8cSSachin Saxena 
1744defbc8cSSachin Saxena static inline int
1754defbc8cSSachin Saxena set_hash_params_ipv4(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
1764defbc8cSSachin Saxena {
1774defbc8cSSachin Saxena 	int k;
1784defbc8cSSachin Saxena 
1794defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
1804defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
1814defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
1824defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
1834defbc8cSSachin Saxena 						HEADER_TYPE_IPV4;
1844defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
1854defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
1864defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
1874defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
1884defbc8cSSachin Saxena 		if (k == 0)
1894defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv4 =
1904defbc8cSSachin Saxena 					ioc_net_hf_ipv_4_src_ip;
1914defbc8cSSachin Saxena 		else
1924defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv4 =
1934defbc8cSSachin Saxena 					ioc_net_hf_ipv_4_dst_ip;
1944defbc8cSSachin Saxena 		hdr_idx++;
1954defbc8cSSachin Saxena 	}
1964defbc8cSSachin Saxena 	return hdr_idx;
1974defbc8cSSachin Saxena }
1984defbc8cSSachin Saxena 
1994defbc8cSSachin Saxena static inline int
2004defbc8cSSachin Saxena set_hash_params_ipv6(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
2014defbc8cSSachin Saxena {
2024defbc8cSSachin Saxena 	int k;
2034defbc8cSSachin Saxena 
2044defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
2054defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
2064defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
2074defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
2084defbc8cSSachin Saxena 							HEADER_TYPE_IPV6;
2094defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
2104defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
2114defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
2124defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
2134defbc8cSSachin Saxena 		if (k == 0)
2144defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv6 =
2154defbc8cSSachin Saxena 					ioc_net_hf_ipv_6_src_ip;
2164defbc8cSSachin Saxena 		else
2174defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv6 =
2184defbc8cSSachin Saxena 					ioc_net_hf_ipv_6_dst_ip;
2194defbc8cSSachin Saxena 		hdr_idx++;
2204defbc8cSSachin Saxena 	}
2214defbc8cSSachin Saxena 	return hdr_idx;
2224defbc8cSSachin Saxena }
2234defbc8cSSachin Saxena 
2244defbc8cSSachin Saxena static inline int
2254defbc8cSSachin Saxena set_hash_params_udp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
2264defbc8cSSachin Saxena {
2274defbc8cSSachin Saxena 	int k;
2284defbc8cSSachin Saxena 
2294defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
2304defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
2314defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
2324defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
2334defbc8cSSachin Saxena 						HEADER_TYPE_UDP;
2344defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
2354defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
2364defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
2374defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
2384defbc8cSSachin Saxena 		if (k == 0)
2394defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).udp =
2404defbc8cSSachin Saxena 					IOC_NET_HF_UDP_PORT_SRC;
2414defbc8cSSachin Saxena 		else
2424defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).udp =
2434defbc8cSSachin Saxena 					IOC_NET_HF_UDP_PORT_DST;
2444defbc8cSSachin Saxena 		hdr_idx++;
2454defbc8cSSachin Saxena 	}
2464defbc8cSSachin Saxena 	return hdr_idx;
2474defbc8cSSachin Saxena }
2484defbc8cSSachin Saxena 
2494defbc8cSSachin Saxena static inline int
2504defbc8cSSachin Saxena set_hash_params_tcp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
2514defbc8cSSachin Saxena {
2524defbc8cSSachin Saxena 	int k;
2534defbc8cSSachin Saxena 
2544defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
2554defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
2564defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
2574defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
2584defbc8cSSachin Saxena 						HEADER_TYPE_TCP;
2594defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
2604defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
2614defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
2624defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
2634defbc8cSSachin Saxena 		if (k == 0)
2644defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).tcp =
2654defbc8cSSachin Saxena 					IOC_NET_HF_TCP_PORT_SRC;
2664defbc8cSSachin Saxena 		else
2674defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).tcp =
2684defbc8cSSachin Saxena 					IOC_NET_HF_TCP_PORT_DST;
2694defbc8cSSachin Saxena 		hdr_idx++;
2704defbc8cSSachin Saxena 	}
2714defbc8cSSachin Saxena 	return hdr_idx;
2724defbc8cSSachin Saxena }
2734defbc8cSSachin Saxena 
2744defbc8cSSachin Saxena static inline int
2754defbc8cSSachin Saxena set_hash_params_sctp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)
2764defbc8cSSachin Saxena {
2774defbc8cSSachin Saxena 	int k;
2784defbc8cSSachin Saxena 
2794defbc8cSSachin Saxena 	for (k = 0; k < 2; k++) {
2804defbc8cSSachin Saxena 		SCH_EXT_ARR(scheme_params, hdr_idx)->type =
2814defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_BY_HDR;
2824defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr =
2834defbc8cSSachin Saxena 						HEADER_TYPE_SCTP;
2844defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =
2854defbc8cSSachin Saxena 						e_IOC_FM_PCD_HDR_INDEX_NONE;
2864defbc8cSSachin Saxena 		SCH_EXT_HDR(scheme_params, hdr_idx).type =
2874defbc8cSSachin Saxena 						e_IOC_FM_PCD_EXTRACT_FULL_FIELD;
2884defbc8cSSachin Saxena 		if (k == 0)
2894defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).sctp =
2904defbc8cSSachin Saxena 					IOC_NET_HF_SCTP_PORT_SRC;
2914defbc8cSSachin Saxena 		else
2924defbc8cSSachin Saxena 			SCH_EXT_FULL_FLD(scheme_params, hdr_idx).sctp =
2934defbc8cSSachin Saxena 					IOC_NET_HF_SCTP_PORT_DST;
2944defbc8cSSachin Saxena 		hdr_idx++;
2954defbc8cSSachin Saxena 	}
2964defbc8cSSachin Saxena 	return hdr_idx;
2974defbc8cSSachin Saxena }
2984defbc8cSSachin Saxena 
2994defbc8cSSachin Saxena /* Set scheme params for hash distribution */
3004defbc8cSSachin Saxena static int set_scheme_params(ioc_fm_pcd_kg_scheme_params_t *scheme_params,
3014defbc8cSSachin Saxena 	ioc_fm_pcd_net_env_params_t *dist_units,
3024defbc8cSSachin Saxena 	struct dpaa_if *dpaa_intf,
3034defbc8cSSachin Saxena 	struct fman_if *fif __rte_unused)
3044defbc8cSSachin Saxena {
3054defbc8cSSachin Saxena 	int dist_idx, hdr_idx = 0;
3064defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
3074defbc8cSSachin Saxena 
3084defbc8cSSachin Saxena 	scheme_params->param.use_hash = 1;
3094defbc8cSSachin Saxena 	scheme_params->param.modify = false;
3104defbc8cSSachin Saxena 	scheme_params->param.always_direct = false;
3114defbc8cSSachin Saxena 	scheme_params->param.scheme_counter.update = 1;
3124defbc8cSSachin Saxena 	scheme_params->param.scheme_counter.value = 0;
3134defbc8cSSachin Saxena 	scheme_params->param.next_engine = e_IOC_FM_PCD_DONE;
3144defbc8cSSachin Saxena 	scheme_params->param.base_fqid = dpaa_intf->rx_queues[0].fqid;
3154defbc8cSSachin Saxena 	scheme_params->param.net_env_params.net_env_id =
3164defbc8cSSachin Saxena 		dpaa_intf->netenv_handle;
3174defbc8cSSachin Saxena 	scheme_params->param.net_env_params.num_of_distinction_units =
3184defbc8cSSachin Saxena 		dist_units->param.num_of_distinction_units;
3194defbc8cSSachin Saxena 
3204defbc8cSSachin Saxena 	scheme_params->param.key_ext_and_hash.hash_dist_num_of_fqids =
3214defbc8cSSachin Saxena 			dpaa_intf->nb_rx_queues;
3224defbc8cSSachin Saxena 	scheme_params->param.key_ext_and_hash.num_of_used_extracts =
3234defbc8cSSachin Saxena 			2 * dist_units->param.num_of_distinction_units;
3244defbc8cSSachin Saxena 
3254defbc8cSSachin Saxena 	for (dist_idx = 0; dist_idx <
3264defbc8cSSachin Saxena 		dist_units->param.num_of_distinction_units;
3274defbc8cSSachin Saxena 		dist_idx++) {
3284defbc8cSSachin Saxena 		switch (dist_units->param.units[dist_idx].hdrs[0].hdr) {
3294defbc8cSSachin Saxena 		case HEADER_TYPE_ETH:
3304defbc8cSSachin Saxena 			hdr_idx = set_hash_params_eth(scheme_params, hdr_idx);
3314defbc8cSSachin Saxena 			break;
3324defbc8cSSachin Saxena 
3334defbc8cSSachin Saxena 		case HEADER_TYPE_IPV4:
3344defbc8cSSachin Saxena 			hdr_idx = set_hash_params_ipv4(scheme_params, hdr_idx);
3354defbc8cSSachin Saxena 			break;
3364defbc8cSSachin Saxena 
3374defbc8cSSachin Saxena 		case HEADER_TYPE_IPV6:
3384defbc8cSSachin Saxena 			hdr_idx = set_hash_params_ipv6(scheme_params, hdr_idx);
3394defbc8cSSachin Saxena 			break;
3404defbc8cSSachin Saxena 
3414defbc8cSSachin Saxena 		case HEADER_TYPE_UDP:
3424defbc8cSSachin Saxena 			hdr_idx = set_hash_params_udp(scheme_params, hdr_idx);
3434defbc8cSSachin Saxena 			break;
3444defbc8cSSachin Saxena 
3454defbc8cSSachin Saxena 		case HEADER_TYPE_TCP:
3464defbc8cSSachin Saxena 			hdr_idx = set_hash_params_tcp(scheme_params, hdr_idx);
3474defbc8cSSachin Saxena 			break;
3484defbc8cSSachin Saxena 
3494defbc8cSSachin Saxena 		case HEADER_TYPE_SCTP:
3504defbc8cSSachin Saxena 			hdr_idx = set_hash_params_sctp(scheme_params, hdr_idx);
3514defbc8cSSachin Saxena 			break;
3524defbc8cSSachin Saxena 
3534defbc8cSSachin Saxena 		default:
3544defbc8cSSachin Saxena 			DPAA_PMD_ERR("Invalid Distinction Unit");
3554defbc8cSSachin Saxena 			return -1;
3564defbc8cSSachin Saxena 		}
3574defbc8cSSachin Saxena 	}
3584defbc8cSSachin Saxena 
3594defbc8cSSachin Saxena 	return 0;
3604defbc8cSSachin Saxena }
3614defbc8cSSachin Saxena 
3624defbc8cSSachin Saxena static void set_dist_units(ioc_fm_pcd_net_env_params_t *dist_units,
3634defbc8cSSachin Saxena 			   uint64_t req_dist_set)
3644defbc8cSSachin Saxena {
3654defbc8cSSachin Saxena 	uint32_t loop = 0, dist_idx = 0, dist_field = 0;
3664defbc8cSSachin Saxena 	int l2_configured = 0, ipv4_configured = 0, ipv6_configured = 0;
3674defbc8cSSachin Saxena 	int udp_configured = 0, tcp_configured = 0, sctp_configured = 0;
3684defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
3694defbc8cSSachin Saxena 
3704defbc8cSSachin Saxena 	if (!req_dist_set)
3714defbc8cSSachin Saxena 		dist_units->param.units[dist_idx++].hdrs[0].hdr =
3724defbc8cSSachin Saxena 			HEADER_TYPE_ETH;
3734defbc8cSSachin Saxena 
3744defbc8cSSachin Saxena 	while (req_dist_set) {
3754defbc8cSSachin Saxena 		if (req_dist_set % 2 != 0) {
3764defbc8cSSachin Saxena 			dist_field = 1U << loop;
3774defbc8cSSachin Saxena 			switch (dist_field) {
3784defbc8cSSachin Saxena 			case ETH_RSS_L2_PAYLOAD:
3794defbc8cSSachin Saxena 
3804defbc8cSSachin Saxena 				if (l2_configured)
3814defbc8cSSachin Saxena 					break;
3824defbc8cSSachin Saxena 				l2_configured = 1;
3834defbc8cSSachin Saxena 
3844defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
3854defbc8cSSachin Saxena 					= HEADER_TYPE_ETH;
3864defbc8cSSachin Saxena 				break;
3874defbc8cSSachin Saxena 
3884defbc8cSSachin Saxena 			case ETH_RSS_IPV4:
3894defbc8cSSachin Saxena 			case ETH_RSS_FRAG_IPV4:
3904defbc8cSSachin Saxena 			case ETH_RSS_NONFRAG_IPV4_OTHER:
3914defbc8cSSachin Saxena 
3924defbc8cSSachin Saxena 				if (ipv4_configured)
3934defbc8cSSachin Saxena 					break;
3944defbc8cSSachin Saxena 				ipv4_configured = 1;
3954defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
3964defbc8cSSachin Saxena 					= HEADER_TYPE_IPV4;
3974defbc8cSSachin Saxena 				break;
3984defbc8cSSachin Saxena 
3994defbc8cSSachin Saxena 			case ETH_RSS_IPV6:
4004defbc8cSSachin Saxena 			case ETH_RSS_FRAG_IPV6:
4014defbc8cSSachin Saxena 			case ETH_RSS_NONFRAG_IPV6_OTHER:
4024defbc8cSSachin Saxena 			case ETH_RSS_IPV6_EX:
4034defbc8cSSachin Saxena 
4044defbc8cSSachin Saxena 				if (ipv6_configured)
4054defbc8cSSachin Saxena 					break;
4064defbc8cSSachin Saxena 				ipv6_configured = 1;
4074defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
4084defbc8cSSachin Saxena 					= HEADER_TYPE_IPV6;
4094defbc8cSSachin Saxena 				break;
4104defbc8cSSachin Saxena 
4114defbc8cSSachin Saxena 			case ETH_RSS_NONFRAG_IPV4_TCP:
4124defbc8cSSachin Saxena 			case ETH_RSS_NONFRAG_IPV6_TCP:
4134defbc8cSSachin Saxena 			case ETH_RSS_IPV6_TCP_EX:
4144defbc8cSSachin Saxena 
4154defbc8cSSachin Saxena 				if (tcp_configured)
4164defbc8cSSachin Saxena 					break;
4174defbc8cSSachin Saxena 				tcp_configured = 1;
4184defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
4194defbc8cSSachin Saxena 					= HEADER_TYPE_TCP;
4204defbc8cSSachin Saxena 				break;
4214defbc8cSSachin Saxena 
4224defbc8cSSachin Saxena 			case ETH_RSS_NONFRAG_IPV4_UDP:
4234defbc8cSSachin Saxena 			case ETH_RSS_NONFRAG_IPV6_UDP:
4244defbc8cSSachin Saxena 			case ETH_RSS_IPV6_UDP_EX:
4254defbc8cSSachin Saxena 
4264defbc8cSSachin Saxena 				if (udp_configured)
4274defbc8cSSachin Saxena 					break;
4284defbc8cSSachin Saxena 				udp_configured = 1;
4294defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
4304defbc8cSSachin Saxena 					= HEADER_TYPE_UDP;
4314defbc8cSSachin Saxena 				break;
4324defbc8cSSachin Saxena 
4334defbc8cSSachin Saxena 			case ETH_RSS_NONFRAG_IPV4_SCTP:
4344defbc8cSSachin Saxena 			case ETH_RSS_NONFRAG_IPV6_SCTP:
4354defbc8cSSachin Saxena 
4364defbc8cSSachin Saxena 				if (sctp_configured)
4374defbc8cSSachin Saxena 					break;
4384defbc8cSSachin Saxena 				sctp_configured = 1;
4394defbc8cSSachin Saxena 
4404defbc8cSSachin Saxena 				dist_units->param.units[dist_idx++].hdrs[0].hdr
4414defbc8cSSachin Saxena 					= HEADER_TYPE_SCTP;
4424defbc8cSSachin Saxena 				break;
4434defbc8cSSachin Saxena 
4444defbc8cSSachin Saxena 			default:
4454defbc8cSSachin Saxena 				DPAA_PMD_ERR("Bad flow distribution option");
4464defbc8cSSachin Saxena 			}
4474defbc8cSSachin Saxena 		}
4484defbc8cSSachin Saxena 		req_dist_set = req_dist_set >> 1;
4494defbc8cSSachin Saxena 		loop++;
4504defbc8cSSachin Saxena 	}
4514defbc8cSSachin Saxena 
4524defbc8cSSachin Saxena 	/* Dist units is set to dist_idx */
4534defbc8cSSachin Saxena 	dist_units->param.num_of_distinction_units = dist_idx;
4544defbc8cSSachin Saxena }
4554defbc8cSSachin Saxena 
4564defbc8cSSachin Saxena /* Apply PCD configuration on interface */
4574defbc8cSSachin Saxena static inline int set_port_pcd(struct dpaa_if *dpaa_intf)
4584defbc8cSSachin Saxena {
4594defbc8cSSachin Saxena 	int ret = 0;
4604defbc8cSSachin Saxena 	unsigned int idx;
4614defbc8cSSachin Saxena 	ioc_fm_port_pcd_params_t pcd_param;
4624defbc8cSSachin Saxena 	ioc_fm_port_pcd_prs_params_t prs_param;
4634defbc8cSSachin Saxena 	ioc_fm_port_pcd_kg_params_t  kg_param;
4644defbc8cSSachin Saxena 
4654defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
4664defbc8cSSachin Saxena 
4674defbc8cSSachin Saxena 	/* PCD support for hash distribution */
4684defbc8cSSachin Saxena 	uint8_t pcd_support = e_FM_PORT_PCD_SUPPORT_PRS_AND_KG;
4694defbc8cSSachin Saxena 
4704defbc8cSSachin Saxena 	memset(&pcd_param, 0, sizeof(pcd_param));
4714defbc8cSSachin Saxena 	memset(&prs_param, 0, sizeof(prs_param));
4724defbc8cSSachin Saxena 	memset(&kg_param, 0, sizeof(kg_param));
4734defbc8cSSachin Saxena 
4744defbc8cSSachin Saxena 	/* Set parse params */
4754defbc8cSSachin Saxena 	prs_param.first_prs_hdr = HEADER_TYPE_ETH;
4764defbc8cSSachin Saxena 
4774defbc8cSSachin Saxena 	/* Set kg params */
4784defbc8cSSachin Saxena 	for (idx = 0; idx < dpaa_intf->scheme_count; idx++)
4794defbc8cSSachin Saxena 		kg_param.scheme_ids[idx] = dpaa_intf->scheme_handle[idx];
4804defbc8cSSachin Saxena 	kg_param.num_schemes = dpaa_intf->scheme_count;
4814defbc8cSSachin Saxena 
4824defbc8cSSachin Saxena 	/* Set pcd params */
4834defbc8cSSachin Saxena 	pcd_param.net_env_id = dpaa_intf->netenv_handle;
4844defbc8cSSachin Saxena 	pcd_param.pcd_support = pcd_support;
4854defbc8cSSachin Saxena 	pcd_param.p_kg_params = &kg_param;
4864defbc8cSSachin Saxena 	pcd_param.p_prs_params = &prs_param;
4874defbc8cSSachin Saxena 
4884defbc8cSSachin Saxena 	/* FM PORT Disable */
4894defbc8cSSachin Saxena 	ret = fm_port_disable(dpaa_intf->port_handle);
4904defbc8cSSachin Saxena 	if (ret != E_OK) {
4914defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_disable: Failed");
4924defbc8cSSachin Saxena 		return ret;
4934defbc8cSSachin Saxena 	}
4944defbc8cSSachin Saxena 
4954defbc8cSSachin Saxena 	/* FM PORT SetPCD */
4964defbc8cSSachin Saxena 	ret = fm_port_set_pcd(dpaa_intf->port_handle, &pcd_param);
4974defbc8cSSachin Saxena 	if (ret != E_OK) {
4984defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_set_pcd: Failed");
4994defbc8cSSachin Saxena 		return ret;
5004defbc8cSSachin Saxena 	}
5014defbc8cSSachin Saxena 
5024defbc8cSSachin Saxena 	/* FM PORT Enable */
5034defbc8cSSachin Saxena 	ret = fm_port_enable(dpaa_intf->port_handle);
5044defbc8cSSachin Saxena 	if (ret != E_OK) {
5054defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_enable: Failed");
5064defbc8cSSachin Saxena 		goto fm_port_delete_pcd;
5074defbc8cSSachin Saxena 	}
5084defbc8cSSachin Saxena 
5094defbc8cSSachin Saxena 	return 0;
5104defbc8cSSachin Saxena 
5114defbc8cSSachin Saxena fm_port_delete_pcd:
5124defbc8cSSachin Saxena 	/* FM PORT DeletePCD */
5134defbc8cSSachin Saxena 	ret = fm_port_delete_pcd(dpaa_intf->port_handle);
5144defbc8cSSachin Saxena 	if (ret != E_OK) {
5154defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_delete_pcd: Failed\n");
5164defbc8cSSachin Saxena 		return ret;
5174defbc8cSSachin Saxena 	}
5184defbc8cSSachin Saxena 	return -1;
5194defbc8cSSachin Saxena }
5204defbc8cSSachin Saxena 
5214defbc8cSSachin Saxena /* Unset PCD NerEnv and scheme */
5224defbc8cSSachin Saxena static inline void unset_pcd_netenv_scheme(struct dpaa_if *dpaa_intf)
5234defbc8cSSachin Saxena {
5244defbc8cSSachin Saxena 	int ret;
5254defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
5264defbc8cSSachin Saxena 
5274defbc8cSSachin Saxena 	/* reduce scheme count */
5284defbc8cSSachin Saxena 	if (dpaa_intf->scheme_count)
5294defbc8cSSachin Saxena 		dpaa_intf->scheme_count--;
5304defbc8cSSachin Saxena 
5314defbc8cSSachin Saxena 	DPAA_PMD_DEBUG("KG SCHEME DEL %d handle =%p",
5324defbc8cSSachin Saxena 		dpaa_intf->scheme_count,
5334defbc8cSSachin Saxena 		dpaa_intf->scheme_handle[dpaa_intf->scheme_count]);
5344defbc8cSSachin Saxena 
5354defbc8cSSachin Saxena 	ret = fm_pcd_kg_scheme_delete(dpaa_intf->scheme_handle
5364defbc8cSSachin Saxena 					[dpaa_intf->scheme_count]);
5374defbc8cSSachin Saxena 	if (ret != E_OK)
5384defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_kg_scheme_delete: Failed");
5394defbc8cSSachin Saxena 
5404defbc8cSSachin Saxena 	dpaa_intf->scheme_handle[dpaa_intf->scheme_count] = NULL;
5414defbc8cSSachin Saxena }
5424defbc8cSSachin Saxena 
5434defbc8cSSachin Saxena /* Set PCD NetEnv and Scheme and default scheme */
5444defbc8cSSachin Saxena static inline int set_default_scheme(struct dpaa_if *dpaa_intf)
5454defbc8cSSachin Saxena {
5464defbc8cSSachin Saxena 	ioc_fm_pcd_kg_scheme_params_t scheme_params;
5474defbc8cSSachin Saxena 	int idx = dpaa_intf->scheme_count;
5484defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
5494defbc8cSSachin Saxena 
5504defbc8cSSachin Saxena 	/* Set PCD NetEnvCharacteristics */
5514defbc8cSSachin Saxena 	memset(&scheme_params, 0, sizeof(scheme_params));
5524defbc8cSSachin Saxena 
5534defbc8cSSachin Saxena 	/* Adding 10 to default schemes as the number of interface would be
5544defbc8cSSachin Saxena 	 * lesser than 10 and the relative scheme ids should be unique for
5554defbc8cSSachin Saxena 	 * every scheme.
5564defbc8cSSachin Saxena 	 */
5574defbc8cSSachin Saxena 	scheme_params.param.scm_id.relative_scheme_id =
5584defbc8cSSachin Saxena 		10 + dpaa_intf->ifid;
5594defbc8cSSachin Saxena 	scheme_params.param.use_hash = 0;
5604defbc8cSSachin Saxena 	scheme_params.param.next_engine = e_IOC_FM_PCD_DONE;
5614defbc8cSSachin Saxena 	scheme_params.param.net_env_params.num_of_distinction_units = 0;
5624defbc8cSSachin Saxena 	scheme_params.param.net_env_params.net_env_id =
5634defbc8cSSachin Saxena 		dpaa_intf->netenv_handle;
5644defbc8cSSachin Saxena 	scheme_params.param.base_fqid = dpaa_intf->rx_queues[0].fqid;
5654defbc8cSSachin Saxena 	scheme_params.param.key_ext_and_hash.hash_dist_num_of_fqids = 1;
5664defbc8cSSachin Saxena 	scheme_params.param.key_ext_and_hash.num_of_used_extracts = 0;
5674defbc8cSSachin Saxena 	scheme_params.param.modify = false;
5684defbc8cSSachin Saxena 	scheme_params.param.always_direct = false;
5694defbc8cSSachin Saxena 	scheme_params.param.scheme_counter.update = 1;
5704defbc8cSSachin Saxena 	scheme_params.param.scheme_counter.value = 0;
5714defbc8cSSachin Saxena 
5724defbc8cSSachin Saxena 	/* FM PCD KgSchemeSet */
5734defbc8cSSachin Saxena 	dpaa_intf->scheme_handle[idx] =
5744defbc8cSSachin Saxena 		fm_pcd_kg_scheme_set(fm_info.pcd_handle, &scheme_params);
5754defbc8cSSachin Saxena 	DPAA_PMD_DEBUG("KG SCHEME SET %d handle =%p",
5764defbc8cSSachin Saxena 		idx, dpaa_intf->scheme_handle[idx]);
5774defbc8cSSachin Saxena 	if (!dpaa_intf->scheme_handle[idx]) {
5784defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_kg_scheme_set: Failed");
5794defbc8cSSachin Saxena 		return -1;
5804defbc8cSSachin Saxena 	}
5814defbc8cSSachin Saxena 
5824defbc8cSSachin Saxena 	fm_model.scheme_devid[dpaa_intf->ifid][idx] =
5834defbc8cSSachin Saxena 				get_device_id(dpaa_intf->scheme_handle[idx]);
5844defbc8cSSachin Saxena 	dpaa_intf->scheme_count++;
5854defbc8cSSachin Saxena 	return 0;
5864defbc8cSSachin Saxena }
5874defbc8cSSachin Saxena 
5884defbc8cSSachin Saxena 
5894defbc8cSSachin Saxena /* Set PCD NetEnv and Scheme and default scheme */
5904defbc8cSSachin Saxena static inline int set_pcd_netenv_scheme(struct dpaa_if *dpaa_intf,
5914defbc8cSSachin Saxena 					uint64_t req_dist_set,
5924defbc8cSSachin Saxena 					struct fman_if *fif)
5934defbc8cSSachin Saxena {
5944defbc8cSSachin Saxena 	int ret = -1;
5954defbc8cSSachin Saxena 	ioc_fm_pcd_net_env_params_t dist_units;
5964defbc8cSSachin Saxena 	ioc_fm_pcd_kg_scheme_params_t scheme_params;
5974defbc8cSSachin Saxena 	int idx = dpaa_intf->scheme_count;
5984defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
5994defbc8cSSachin Saxena 
6004defbc8cSSachin Saxena 	/* Set PCD NetEnvCharacteristics */
6014defbc8cSSachin Saxena 	memset(&dist_units, 0, sizeof(dist_units));
6024defbc8cSSachin Saxena 	memset(&scheme_params, 0, sizeof(scheme_params));
6034defbc8cSSachin Saxena 
6044defbc8cSSachin Saxena 	/* Set dist unit header type */
6054defbc8cSSachin Saxena 	set_dist_units(&dist_units, req_dist_set);
6064defbc8cSSachin Saxena 
6074defbc8cSSachin Saxena 	scheme_params.param.scm_id.relative_scheme_id = dpaa_intf->ifid;
6084defbc8cSSachin Saxena 
6094defbc8cSSachin Saxena 	/* Set PCD Scheme params */
6104defbc8cSSachin Saxena 	ret = set_scheme_params(&scheme_params, &dist_units, dpaa_intf, fif);
6114defbc8cSSachin Saxena 	if (ret) {
6124defbc8cSSachin Saxena 		DPAA_PMD_ERR("Set scheme params: Failed");
6134defbc8cSSachin Saxena 		return -1;
6144defbc8cSSachin Saxena 	}
6154defbc8cSSachin Saxena 
6164defbc8cSSachin Saxena 	/* FM PCD KgSchemeSet */
6174defbc8cSSachin Saxena 	dpaa_intf->scheme_handle[idx] =
6184defbc8cSSachin Saxena 		fm_pcd_kg_scheme_set(fm_info.pcd_handle, &scheme_params);
6194defbc8cSSachin Saxena 	DPAA_PMD_DEBUG("KG SCHEME SET %d handle =%p",
6204defbc8cSSachin Saxena 			idx, dpaa_intf->scheme_handle[idx]);
6214defbc8cSSachin Saxena 	if (!dpaa_intf->scheme_handle[idx]) {
6224defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_kg_scheme_set: Failed");
6234defbc8cSSachin Saxena 		return -1;
6244defbc8cSSachin Saxena 	}
6254defbc8cSSachin Saxena 
6264defbc8cSSachin Saxena 	fm_model.scheme_devid[dpaa_intf->ifid][idx] =
6274defbc8cSSachin Saxena 				get_device_id(dpaa_intf->scheme_handle[idx]);
6284defbc8cSSachin Saxena 	dpaa_intf->scheme_count++;
6294defbc8cSSachin Saxena 	return 0;
6304defbc8cSSachin Saxena }
6314defbc8cSSachin Saxena 
6324defbc8cSSachin Saxena 
6334defbc8cSSachin Saxena static inline int get_port_type(struct fman_if *fif)
6344defbc8cSSachin Saxena {
6354defbc8cSSachin Saxena 	if (fif->mac_type == fman_mac_1g)
6364defbc8cSSachin Saxena 		return e_FM_PORT_TYPE_RX;
6374defbc8cSSachin Saxena 	else if (fif->mac_type == fman_mac_2_5g)
6384defbc8cSSachin Saxena 		return e_FM_PORT_TYPE_RX_2_5G;
6394defbc8cSSachin Saxena 	else if (fif->mac_type == fman_mac_10g)
6404defbc8cSSachin Saxena 		return e_FM_PORT_TYPE_RX_10G;
6414defbc8cSSachin Saxena 
6424defbc8cSSachin Saxena 	DPAA_PMD_ERR("MAC type unsupported");
6434defbc8cSSachin Saxena 	return -1;
6444defbc8cSSachin Saxena }
6454defbc8cSSachin Saxena 
6464defbc8cSSachin Saxena static inline int set_fm_port_handle(struct dpaa_if *dpaa_intf,
6474defbc8cSSachin Saxena 				     uint64_t req_dist_set,
6484defbc8cSSachin Saxena 				     struct fman_if *fif)
6494defbc8cSSachin Saxena {
6504defbc8cSSachin Saxena 	t_fm_port_params	fm_port_params;
6514defbc8cSSachin Saxena 	ioc_fm_pcd_net_env_params_t dist_units;
6524defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
6534defbc8cSSachin Saxena 
6544defbc8cSSachin Saxena 	/* FMAN mac indexes mappings (0 is unused,
6554defbc8cSSachin Saxena 	 * first 8 are for 1G, next for 10G ports
6564defbc8cSSachin Saxena 	 */
6574defbc8cSSachin Saxena 	uint8_t mac_idx[] = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1};
6584defbc8cSSachin Saxena 
6594defbc8cSSachin Saxena 	/* Memset FM port params */
6604defbc8cSSachin Saxena 	memset(&fm_port_params, 0, sizeof(fm_port_params));
6614defbc8cSSachin Saxena 
6624defbc8cSSachin Saxena 	/* Set FM port params */
6634defbc8cSSachin Saxena 	fm_port_params.h_fm = fm_info.fman_handle;
6644defbc8cSSachin Saxena 	fm_port_params.port_type = get_port_type(fif);
6654defbc8cSSachin Saxena 	fm_port_params.port_id = mac_idx[fif->mac_idx];
6664defbc8cSSachin Saxena 
6674defbc8cSSachin Saxena 	/* FM PORT Open */
6684defbc8cSSachin Saxena 	dpaa_intf->port_handle = fm_port_open(&fm_port_params);
6694defbc8cSSachin Saxena 	if (!dpaa_intf->port_handle) {
6704defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_open: Failed\n");
6714defbc8cSSachin Saxena 		return -1;
6724defbc8cSSachin Saxena 	}
6734defbc8cSSachin Saxena 
6744defbc8cSSachin Saxena 	fm_model.fm_port_params[dpaa_intf->ifid] = fm_port_params;
6754defbc8cSSachin Saxena 
6764defbc8cSSachin Saxena 	/* Set PCD NetEnvCharacteristics */
6774defbc8cSSachin Saxena 	memset(&dist_units, 0, sizeof(dist_units));
6784defbc8cSSachin Saxena 
6794defbc8cSSachin Saxena 	/* Set dist unit header type */
6804defbc8cSSachin Saxena 	set_dist_units(&dist_units, req_dist_set);
6814defbc8cSSachin Saxena 
6824defbc8cSSachin Saxena 	/* FM PCD NetEnvCharacteristicsSet */
6834defbc8cSSachin Saxena 	dpaa_intf->netenv_handle =
6844defbc8cSSachin Saxena 		fm_pcd_net_env_characteristics_set(fm_info.pcd_handle,
6854defbc8cSSachin Saxena 							&dist_units);
6864defbc8cSSachin Saxena 	if (!dpaa_intf->netenv_handle) {
6874defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_net_env_characteristics_set: Failed");
6884defbc8cSSachin Saxena 		return -1;
6894defbc8cSSachin Saxena 	}
6904defbc8cSSachin Saxena 
6914defbc8cSSachin Saxena 	fm_model.netenv_devid[dpaa_intf->ifid] =
6924defbc8cSSachin Saxena 				get_device_id(dpaa_intf->netenv_handle);
6934defbc8cSSachin Saxena 
6944defbc8cSSachin Saxena 	return 0;
6954defbc8cSSachin Saxena }
6964defbc8cSSachin Saxena 
6974defbc8cSSachin Saxena /* De-Configure DPAA FM */
6984defbc8cSSachin Saxena int dpaa_fm_deconfig(struct dpaa_if *dpaa_intf,
6994defbc8cSSachin Saxena 			struct fman_if *fif __rte_unused)
7004defbc8cSSachin Saxena {
7014defbc8cSSachin Saxena 	int ret;
7024defbc8cSSachin Saxena 	unsigned int idx;
7034defbc8cSSachin Saxena 
7044defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
7054defbc8cSSachin Saxena 
7064defbc8cSSachin Saxena 	/* FM PORT Disable */
7074defbc8cSSachin Saxena 	ret = fm_port_disable(dpaa_intf->port_handle);
7084defbc8cSSachin Saxena 	if (ret != E_OK) {
7094defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_disable: Failed");
7104defbc8cSSachin Saxena 		return ret;
7114defbc8cSSachin Saxena 	}
7124defbc8cSSachin Saxena 
7134defbc8cSSachin Saxena 	/* FM PORT DeletePCD */
7144defbc8cSSachin Saxena 	ret = fm_port_delete_pcd(dpaa_intf->port_handle);
7154defbc8cSSachin Saxena 	if (ret != E_OK) {
7164defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_port_delete_pcd: Failed");
7174defbc8cSSachin Saxena 		return ret;
7184defbc8cSSachin Saxena 	}
7194defbc8cSSachin Saxena 
7204defbc8cSSachin Saxena 	for (idx = 0; idx < dpaa_intf->scheme_count; idx++) {
7214defbc8cSSachin Saxena 		DPAA_PMD_DEBUG("KG SCHEME DEL %d, handle =%p",
7224defbc8cSSachin Saxena 			idx, dpaa_intf->scheme_handle[idx]);
7234defbc8cSSachin Saxena 		/* FM PCD KgSchemeDelete */
7244defbc8cSSachin Saxena 		ret = fm_pcd_kg_scheme_delete(dpaa_intf->scheme_handle[idx]);
7254defbc8cSSachin Saxena 		if (ret != E_OK) {
7264defbc8cSSachin Saxena 			DPAA_PMD_ERR("fm_pcd_kg_scheme_delete: Failed");
7274defbc8cSSachin Saxena 			return ret;
7284defbc8cSSachin Saxena 		}
7294defbc8cSSachin Saxena 		dpaa_intf->scheme_handle[idx] = NULL;
7304defbc8cSSachin Saxena 	}
7314defbc8cSSachin Saxena 	/* FM PCD NetEnvCharacteristicsDelete */
7324defbc8cSSachin Saxena 	ret = fm_pcd_net_env_characteristics_delete(dpaa_intf->netenv_handle);
7334defbc8cSSachin Saxena 	if (ret != E_OK) {
7344defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_net_env_characteristics_delete: Failed");
7354defbc8cSSachin Saxena 		return ret;
7364defbc8cSSachin Saxena 	}
7374defbc8cSSachin Saxena 	dpaa_intf->netenv_handle = NULL;
7384defbc8cSSachin Saxena 
739*133332f0SRadu Bulie 	if (fif && fif->is_shared_mac) {
740*133332f0SRadu Bulie 		ret = fm_port_enable(dpaa_intf->port_handle);
741*133332f0SRadu Bulie 		if (ret != E_OK) {
742*133332f0SRadu Bulie 			DPAA_PMD_ERR("shared mac re-enable failed");
743*133332f0SRadu Bulie 			return ret;
744*133332f0SRadu Bulie 		}
745*133332f0SRadu Bulie 	}
746*133332f0SRadu Bulie 
7474defbc8cSSachin Saxena 	/* FM PORT Close */
7484defbc8cSSachin Saxena 	fm_port_close(dpaa_intf->port_handle);
7494defbc8cSSachin Saxena 	dpaa_intf->port_handle = NULL;
7504defbc8cSSachin Saxena 
7514defbc8cSSachin Saxena 	/* Set scheme count to 0 */
7524defbc8cSSachin Saxena 	dpaa_intf->scheme_count = 0;
7534defbc8cSSachin Saxena 
7544defbc8cSSachin Saxena 	return 0;
7554defbc8cSSachin Saxena }
7564defbc8cSSachin Saxena 
7574defbc8cSSachin Saxena int dpaa_fm_config(struct rte_eth_dev *dev, uint64_t req_dist_set)
7584defbc8cSSachin Saxena {
7594defbc8cSSachin Saxena 	struct dpaa_if *dpaa_intf = dev->data->dev_private;
7604defbc8cSSachin Saxena 	struct fman_if *fif = dev->process_private;
7614defbc8cSSachin Saxena 	int ret;
7624defbc8cSSachin Saxena 	unsigned int i = 0;
7634defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
7644defbc8cSSachin Saxena 
7654defbc8cSSachin Saxena 	if (dpaa_intf->port_handle) {
7664defbc8cSSachin Saxena 		if (dpaa_fm_deconfig(dpaa_intf, fif))
7674defbc8cSSachin Saxena 			DPAA_PMD_ERR("DPAA FM deconfig failed");
7684defbc8cSSachin Saxena 	}
7694defbc8cSSachin Saxena 
7704defbc8cSSachin Saxena 	if (!dev->data->nb_rx_queues)
7714defbc8cSSachin Saxena 		return 0;
7724defbc8cSSachin Saxena 
7734defbc8cSSachin Saxena 	if (dev->data->nb_rx_queues & (dev->data->nb_rx_queues - 1)) {
7744defbc8cSSachin Saxena 		DPAA_PMD_ERR("No of queues should be power of 2");
7754defbc8cSSachin Saxena 		return -1;
7764defbc8cSSachin Saxena 	}
7774defbc8cSSachin Saxena 
7784defbc8cSSachin Saxena 	dpaa_intf->nb_rx_queues = dev->data->nb_rx_queues;
7794defbc8cSSachin Saxena 
7804defbc8cSSachin Saxena 	/* Open FM Port and set it in port info */
7814defbc8cSSachin Saxena 	ret = set_fm_port_handle(dpaa_intf, req_dist_set, fif);
7824defbc8cSSachin Saxena 	if (ret) {
7834defbc8cSSachin Saxena 		DPAA_PMD_ERR("Set FM Port handle: Failed");
7844defbc8cSSachin Saxena 		return -1;
7854defbc8cSSachin Saxena 	}
7864defbc8cSSachin Saxena 
7874defbc8cSSachin Saxena 	/* Set PCD netenv and scheme */
7884defbc8cSSachin Saxena 	if (req_dist_set) {
7894defbc8cSSachin Saxena 		ret = set_pcd_netenv_scheme(dpaa_intf, req_dist_set, fif);
7904defbc8cSSachin Saxena 		if (ret) {
7914defbc8cSSachin Saxena 			DPAA_PMD_ERR("Set PCD NetEnv and Scheme dist: Failed");
7924defbc8cSSachin Saxena 			goto unset_fm_port_handle;
7934defbc8cSSachin Saxena 		}
7944defbc8cSSachin Saxena 	}
7954defbc8cSSachin Saxena 	/* Set default netenv and scheme */
796*133332f0SRadu Bulie 	if (!fif->is_shared_mac) {
7974defbc8cSSachin Saxena 		ret = set_default_scheme(dpaa_intf);
7984defbc8cSSachin Saxena 		if (ret) {
7994defbc8cSSachin Saxena 			DPAA_PMD_ERR("Set PCD NetEnv and Scheme: Failed");
8004defbc8cSSachin Saxena 			goto unset_pcd_netenv_scheme1;
8014defbc8cSSachin Saxena 		}
802*133332f0SRadu Bulie 	}
8034defbc8cSSachin Saxena 
8044defbc8cSSachin Saxena 	/* Set Port PCD */
8054defbc8cSSachin Saxena 	ret = set_port_pcd(dpaa_intf);
8064defbc8cSSachin Saxena 	if (ret) {
8074defbc8cSSachin Saxena 		DPAA_PMD_ERR("Set Port PCD: Failed");
8084defbc8cSSachin Saxena 		goto unset_pcd_netenv_scheme;
8094defbc8cSSachin Saxena 	}
8104defbc8cSSachin Saxena 
8114defbc8cSSachin Saxena 	for (; i < fm_model.dev_count; i++)
8124defbc8cSSachin Saxena 		if (fm_model.device_order[i] == dpaa_intf->ifid)
8134defbc8cSSachin Saxena 			return 0;
8144defbc8cSSachin Saxena 
8154defbc8cSSachin Saxena 	fm_model.device_order[fm_model.dev_count] = dpaa_intf->ifid;
8164defbc8cSSachin Saxena 	fm_model.dev_count++;
8174defbc8cSSachin Saxena 
8184defbc8cSSachin Saxena 	return 0;
8194defbc8cSSachin Saxena 
8204defbc8cSSachin Saxena unset_pcd_netenv_scheme:
8214defbc8cSSachin Saxena 	unset_pcd_netenv_scheme(dpaa_intf);
8224defbc8cSSachin Saxena 
8234defbc8cSSachin Saxena unset_pcd_netenv_scheme1:
8244defbc8cSSachin Saxena 	unset_pcd_netenv_scheme(dpaa_intf);
8254defbc8cSSachin Saxena 
8264defbc8cSSachin Saxena unset_fm_port_handle:
8274defbc8cSSachin Saxena 	/* FM PORT Close */
8284defbc8cSSachin Saxena 	fm_port_close(dpaa_intf->port_handle);
8294defbc8cSSachin Saxena 	dpaa_intf->port_handle = NULL;
8304defbc8cSSachin Saxena 	return -1;
8314defbc8cSSachin Saxena }
8324defbc8cSSachin Saxena 
8334defbc8cSSachin Saxena int dpaa_fm_init(void)
8344defbc8cSSachin Saxena {
8354defbc8cSSachin Saxena 	t_handle fman_handle;
8364defbc8cSSachin Saxena 	t_handle pcd_handle;
8374defbc8cSSachin Saxena 	t_fm_pcd_params fm_pcd_params = {0};
8384defbc8cSSachin Saxena 	/* Hard-coded : fman id 0 since one fman is present in LS104x */
8394defbc8cSSachin Saxena 	int fman_id = 0, ret;
8404defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
8414defbc8cSSachin Saxena 
8424defbc8cSSachin Saxena 	dpaa_read_fm_config_from_file();
8434defbc8cSSachin Saxena 
8444defbc8cSSachin Saxena 	/* FM Open */
8454defbc8cSSachin Saxena 	fman_handle = fm_open(fman_id);
8464defbc8cSSachin Saxena 	if (!fman_handle) {
8474defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_open: Failed");
8484defbc8cSSachin Saxena 		return -1;
8494defbc8cSSachin Saxena 	}
8504defbc8cSSachin Saxena 
8514defbc8cSSachin Saxena 	/* FM PCD Open */
8524defbc8cSSachin Saxena 	fm_pcd_params.h_fm = fman_handle;
8534defbc8cSSachin Saxena 	fm_pcd_params.prs_support = true;
8544defbc8cSSachin Saxena 	fm_pcd_params.kg_support = true;
8554defbc8cSSachin Saxena 	pcd_handle = fm_pcd_open(&fm_pcd_params);
8564defbc8cSSachin Saxena 	if (!pcd_handle) {
8574defbc8cSSachin Saxena 		fm_close(fman_handle);
8584defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_open: Failed");
8594defbc8cSSachin Saxena 		return -1;
8604defbc8cSSachin Saxena 	}
8614defbc8cSSachin Saxena 
8624defbc8cSSachin Saxena 	/* FM PCD Enable */
8634defbc8cSSachin Saxena 	ret = fm_pcd_enable(pcd_handle);
8644defbc8cSSachin Saxena 	if (ret) {
8654defbc8cSSachin Saxena 		fm_close(fman_handle);
8664defbc8cSSachin Saxena 		fm_pcd_close(pcd_handle);
8674defbc8cSSachin Saxena 		DPAA_PMD_ERR("fm_pcd_enable: Failed");
8684defbc8cSSachin Saxena 		return -1;
8694defbc8cSSachin Saxena 	}
8704defbc8cSSachin Saxena 
8714defbc8cSSachin Saxena 	/* Set fman and pcd handle in fm info */
8724defbc8cSSachin Saxena 	fm_info.fman_handle = fman_handle;
8734defbc8cSSachin Saxena 	fm_info.pcd_handle = pcd_handle;
8744defbc8cSSachin Saxena 
8754defbc8cSSachin Saxena 	return 0;
8764defbc8cSSachin Saxena }
8774defbc8cSSachin Saxena 
8784defbc8cSSachin Saxena 
8794defbc8cSSachin Saxena /* De-initialization of FM */
8804defbc8cSSachin Saxena int dpaa_fm_term(void)
8814defbc8cSSachin Saxena {
8824defbc8cSSachin Saxena 	int ret;
8834defbc8cSSachin Saxena 
8844defbc8cSSachin Saxena 	PMD_INIT_FUNC_TRACE();
8854defbc8cSSachin Saxena 
8864defbc8cSSachin Saxena 	if (fm_info.pcd_handle && fm_info.fman_handle) {
8874defbc8cSSachin Saxena 		/* FM PCD Disable */
8884defbc8cSSachin Saxena 		ret = fm_pcd_disable(fm_info.pcd_handle);
8894defbc8cSSachin Saxena 		if (ret) {
8904defbc8cSSachin Saxena 			DPAA_PMD_ERR("fm_pcd_disable: Failed");
8914defbc8cSSachin Saxena 			return -1;
8924defbc8cSSachin Saxena 		}
8934defbc8cSSachin Saxena 
8944defbc8cSSachin Saxena 		/* FM PCD Close */
8954defbc8cSSachin Saxena 		fm_pcd_close(fm_info.pcd_handle);
8964defbc8cSSachin Saxena 		fm_info.pcd_handle = NULL;
8974defbc8cSSachin Saxena 	}
8984defbc8cSSachin Saxena 
8994defbc8cSSachin Saxena 	if (fm_info.fman_handle) {
9004defbc8cSSachin Saxena 		/* FM Close */
9014defbc8cSSachin Saxena 		fm_close(fm_info.fman_handle);
9024defbc8cSSachin Saxena 		fm_info.fman_handle = NULL;
9034defbc8cSSachin Saxena 	}
9044defbc8cSSachin Saxena 
9054defbc8cSSachin Saxena 	if (access(fm_log, F_OK) != -1) {
9064defbc8cSSachin Saxena 		ret = remove(fm_log);
9074defbc8cSSachin Saxena 		if (ret)
9084defbc8cSSachin Saxena 			DPAA_PMD_ERR("File remove: Failed");
9094defbc8cSSachin Saxena 	}
9104defbc8cSSachin Saxena 	return 0;
9114defbc8cSSachin Saxena }
912