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