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