12ffc1057SHemant Agrawal /* SPDX-License-Identifier: BSD-3-Clause 22ffc1057SHemant Agrawal * Copyright 2008-2016 Freescale Semiconductor Inc. 3*6be4899cSHemant Agrawal * Copyright 2017-2024 NXP 42ffc1057SHemant Agrawal */ 52ffc1057SHemant Agrawal 62ffc1057SHemant Agrawal #include <stdio.h> 72ffc1057SHemant Agrawal #include <stdlib.h> 82ffc1057SHemant Agrawal #include <string.h> 92ffc1057SHemant Agrawal #include <fcntl.h> 102ffc1057SHemant Agrawal #include <errno.h> 112ffc1057SHemant Agrawal #include <unistd.h> 122ffc1057SHemant Agrawal #include <termios.h> 132ffc1057SHemant Agrawal #include <sys/ioctl.h> 142ffc1057SHemant Agrawal #include <stdbool.h> 152ffc1057SHemant Agrawal #include <rte_common.h> 162ffc1057SHemant Agrawal 172ffc1057SHemant Agrawal #include "fm_ext.h" 182ffc1057SHemant Agrawal #include "fm_pcd_ext.h" 192ffc1057SHemant Agrawal #include "fm_port_ext.h" 202ffc1057SHemant Agrawal #include <dpaa_ethdev.h> 212ffc1057SHemant Agrawal 222ffc1057SHemant Agrawal #define DEV_TO_ID(p) \ 232ffc1057SHemant Agrawal do { \ 242ffc1057SHemant Agrawal t_device *p_dev = (t_device *)p; \ 252ffc1057SHemant Agrawal p = UINT_TO_PTR(p_dev->id); \ 262ffc1057SHemant Agrawal } while (0) 272ffc1057SHemant Agrawal 282ffc1057SHemant Agrawal /* Major and minor are in sync with FMD, respin is for fmlib identification */ 292ffc1057SHemant Agrawal #define FM_LIB_VERSION_MAJOR 21 302ffc1057SHemant Agrawal #define FM_LIB_VERSION_MINOR 1 312ffc1057SHemant Agrawal #define FM_LIB_VERSION_RESPIN 0 322ffc1057SHemant Agrawal 332ffc1057SHemant Agrawal #if (FMD_API_VERSION_MAJOR != FM_LIB_VERSION_MAJOR) || \ 342ffc1057SHemant Agrawal (FMD_API_VERSION_MINOR != FM_LIB_VERSION_MINOR) 352ffc1057SHemant Agrawal #warning FMD and FMLIB version mismatch 362ffc1057SHemant Agrawal #endif 372ffc1057SHemant Agrawal 382ffc1057SHemant Agrawal t_handle 392ffc1057SHemant Agrawal fm_open(uint8_t id) 402ffc1057SHemant Agrawal { 412ffc1057SHemant Agrawal t_device *p_dev; 422ffc1057SHemant Agrawal int fd; 432ffc1057SHemant Agrawal char dev_name[20]; 442ffc1057SHemant Agrawal static bool called; 452ffc1057SHemant Agrawal ioc_fm_api_version_t ver; 462ffc1057SHemant Agrawal 47*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 482ffc1057SHemant Agrawal 492ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 502ffc1057SHemant Agrawal if (p_dev == NULL) 512ffc1057SHemant Agrawal return NULL; 522ffc1057SHemant Agrawal 532ffc1057SHemant Agrawal memset(dev_name, 0, 20); 542ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%d", "/dev/", DEV_FM_NAME, id); 552ffc1057SHemant Agrawal fd = open(dev_name, O_RDWR); 562ffc1057SHemant Agrawal if (fd < 0) { 572ffc1057SHemant Agrawal free(p_dev); 582ffc1057SHemant Agrawal return NULL; 592ffc1057SHemant Agrawal } 602ffc1057SHemant Agrawal 612ffc1057SHemant Agrawal p_dev->id = id; 622ffc1057SHemant Agrawal p_dev->fd = fd; 632ffc1057SHemant Agrawal if (!called) { 642ffc1057SHemant Agrawal called = true; 652ffc1057SHemant Agrawal fm_get_api_version((t_handle)p_dev, &ver); 662ffc1057SHemant Agrawal 672ffc1057SHemant Agrawal if (ver.version.major != FMD_API_VERSION_MAJOR || 682ffc1057SHemant Agrawal ver.version.minor != FMD_API_VERSION_MINOR || 692ffc1057SHemant Agrawal ver.version.respin != FMD_API_VERSION_RESPIN) { 702ffc1057SHemant Agrawal DPAA_PMD_WARN("Compiled against FMD API ver %u.%u.%u", 712ffc1057SHemant Agrawal FMD_API_VERSION_MAJOR, 722ffc1057SHemant Agrawal FMD_API_VERSION_MINOR, FMD_API_VERSION_RESPIN); 732ffc1057SHemant Agrawal DPAA_PMD_WARN("Running with FMD API ver %u.%u.%u", 742ffc1057SHemant Agrawal ver.version.major, ver.version.minor, 752ffc1057SHemant Agrawal ver.version.respin); 762ffc1057SHemant Agrawal } 772ffc1057SHemant Agrawal } 78*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 792ffc1057SHemant Agrawal 802ffc1057SHemant Agrawal return (t_handle)p_dev; 812ffc1057SHemant Agrawal } 822ffc1057SHemant Agrawal 832ffc1057SHemant Agrawal void fm_close(t_handle h_fm) 842ffc1057SHemant Agrawal { 852ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm; 862ffc1057SHemant Agrawal 87*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 882ffc1057SHemant Agrawal 892ffc1057SHemant Agrawal close(p_dev->fd); 902ffc1057SHemant Agrawal free(p_dev); 912ffc1057SHemant Agrawal 92*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 932ffc1057SHemant Agrawal } 942ffc1057SHemant Agrawal 952ffc1057SHemant Agrawal uint32_t 962ffc1057SHemant Agrawal fm_get_api_version(t_handle h_fm, ioc_fm_api_version_t *p_version) 972ffc1057SHemant Agrawal { 982ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm; 992ffc1057SHemant Agrawal int ret; 1002ffc1057SHemant Agrawal 101*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 1022ffc1057SHemant Agrawal 1032ffc1057SHemant Agrawal ret = ioctl(p_dev->fd, FM_IOC_GET_API_VERSION, p_version); 1042ffc1057SHemant Agrawal if (ret) { 1051ec9a3afSHemant Agrawal DPAA_PMD_ERR("cannot get API version, error %i (%s)", 1062ffc1057SHemant Agrawal errno, strerror(errno)); 1072ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 1082ffc1057SHemant Agrawal } 109*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 1102ffc1057SHemant Agrawal 1112ffc1057SHemant Agrawal return E_OK; 1122ffc1057SHemant Agrawal } 1132ffc1057SHemant Agrawal 1142ffc1057SHemant Agrawal t_handle 1152ffc1057SHemant Agrawal fm_pcd_open(t_fm_pcd_params *p_fm_pcd_params) 1162ffc1057SHemant Agrawal { 1172ffc1057SHemant Agrawal t_device *p_dev; 1182ffc1057SHemant Agrawal int fd; 1192ffc1057SHemant Agrawal char dev_name[20]; 1202ffc1057SHemant Agrawal 121*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 1222ffc1057SHemant Agrawal 1232ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 1242ffc1057SHemant Agrawal if (p_dev == NULL) 1252ffc1057SHemant Agrawal return NULL; 1262ffc1057SHemant Agrawal 1272ffc1057SHemant Agrawal memset(dev_name, 0, 20); 1282ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-pcd", "/dev/", DEV_FM_NAME, 1292ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_pcd_params->h_fm)->id); 1302ffc1057SHemant Agrawal fd = open(dev_name, O_RDWR); 1312ffc1057SHemant Agrawal if (fd < 0) { 1322ffc1057SHemant Agrawal free(p_dev); 1332ffc1057SHemant Agrawal return NULL; 1342ffc1057SHemant Agrawal } 1352ffc1057SHemant Agrawal 1362ffc1057SHemant Agrawal p_dev->id = ((t_device *)p_fm_pcd_params->h_fm)->id; 1372ffc1057SHemant Agrawal p_dev->fd = fd; 1382ffc1057SHemant Agrawal p_dev->owners = 0; 1392ffc1057SHemant Agrawal 140*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 1412ffc1057SHemant Agrawal 1422ffc1057SHemant Agrawal return (t_handle)p_dev; 1432ffc1057SHemant Agrawal } 1442ffc1057SHemant Agrawal 1452ffc1057SHemant Agrawal void 1462ffc1057SHemant Agrawal fm_pcd_close(t_handle h_fm_pcd) 1472ffc1057SHemant Agrawal { 1482ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_pcd; 1492ffc1057SHemant Agrawal 150*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 1512ffc1057SHemant Agrawal 1522ffc1057SHemant Agrawal close(p_dev->fd); 1532ffc1057SHemant Agrawal 1542ffc1057SHemant Agrawal if (p_dev->owners) { 155*6be4899cSHemant Agrawal printf("\nTry delete a prev created pcd handler(owners:%u)!", 1562ffc1057SHemant Agrawal p_dev->owners); 1572ffc1057SHemant Agrawal return; 1582ffc1057SHemant Agrawal } 1592ffc1057SHemant Agrawal 1602ffc1057SHemant Agrawal free(p_dev); 1612ffc1057SHemant Agrawal 162*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 1632ffc1057SHemant Agrawal } 1642ffc1057SHemant Agrawal 1652ffc1057SHemant Agrawal uint32_t 1662ffc1057SHemant Agrawal fm_pcd_enable(t_handle h_fm_pcd) 1672ffc1057SHemant Agrawal { 1682ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_pcd; 1692ffc1057SHemant Agrawal 170*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 1712ffc1057SHemant Agrawal 1722ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PCD_IOC_ENABLE)) 1732ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 1742ffc1057SHemant Agrawal 175*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 1762ffc1057SHemant Agrawal 1772ffc1057SHemant Agrawal return E_OK; 1782ffc1057SHemant Agrawal } 1792ffc1057SHemant Agrawal 1802ffc1057SHemant Agrawal uint32_t 1812ffc1057SHemant Agrawal fm_pcd_disable(t_handle h_fm_pcd) 1822ffc1057SHemant Agrawal { 1832ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_pcd; 1842ffc1057SHemant Agrawal 185*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 1862ffc1057SHemant Agrawal 1872ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PCD_IOC_DISABLE)) 1882ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 1892ffc1057SHemant Agrawal 190*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 1912ffc1057SHemant Agrawal 1922ffc1057SHemant Agrawal return E_OK; 1932ffc1057SHemant Agrawal } 1942ffc1057SHemant Agrawal 1952ffc1057SHemant Agrawal t_handle 1962ffc1057SHemant Agrawal fm_pcd_net_env_characteristics_set(t_handle h_fm_pcd, 1972ffc1057SHemant Agrawal ioc_fm_pcd_net_env_params_t *params) 1982ffc1057SHemant Agrawal { 1992ffc1057SHemant Agrawal t_device *p_pcd_dev = (t_device *)h_fm_pcd; 2002ffc1057SHemant Agrawal t_device *p_dev = NULL; 2012ffc1057SHemant Agrawal 202*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 2032ffc1057SHemant Agrawal 2042ffc1057SHemant Agrawal params->id = NULL; 2052ffc1057SHemant Agrawal 2062ffc1057SHemant Agrawal if (ioctl(p_pcd_dev->fd, FM_PCD_IOC_NET_ENV_CHARACTERISTICS_SET, 2072ffc1057SHemant Agrawal params)) 2082ffc1057SHemant Agrawal return NULL; 2092ffc1057SHemant Agrawal 2102ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 2112ffc1057SHemant Agrawal if (p_dev == NULL) 2122ffc1057SHemant Agrawal return NULL; 2132ffc1057SHemant Agrawal 2142ffc1057SHemant Agrawal memset(p_dev, 0, sizeof(t_device)); 2152ffc1057SHemant Agrawal p_dev->h_user_priv = (t_handle)p_pcd_dev; 2162ffc1057SHemant Agrawal p_pcd_dev->owners++; 2172ffc1057SHemant Agrawal p_dev->id = PTR_TO_UINT(params->id); 2182ffc1057SHemant Agrawal 219*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 2202ffc1057SHemant Agrawal 2212ffc1057SHemant Agrawal return (t_handle)p_dev; 2222ffc1057SHemant Agrawal } 2232ffc1057SHemant Agrawal 2242ffc1057SHemant Agrawal uint32_t 2252ffc1057SHemant Agrawal fm_pcd_net_env_characteristics_delete(t_handle h_net_env) 2262ffc1057SHemant Agrawal { 2272ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_net_env; 2282ffc1057SHemant Agrawal t_device *p_pcd_dev = NULL; 2292ffc1057SHemant Agrawal ioc_fm_obj_t id; 2302ffc1057SHemant Agrawal 231*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 2322ffc1057SHemant Agrawal 2332ffc1057SHemant Agrawal p_pcd_dev = (t_device *)p_dev->h_user_priv; 2342ffc1057SHemant Agrawal id.obj = UINT_TO_PTR(p_dev->id); 2352ffc1057SHemant Agrawal 2362ffc1057SHemant Agrawal if (ioctl(p_pcd_dev->fd, FM_PCD_IOC_NET_ENV_CHARACTERISTICS_DELETE, 2372ffc1057SHemant Agrawal &id)) 2382ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 2392ffc1057SHemant Agrawal 2402ffc1057SHemant Agrawal p_pcd_dev->owners--; 2412ffc1057SHemant Agrawal free(p_dev); 2422ffc1057SHemant Agrawal 243*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 2442ffc1057SHemant Agrawal 2452ffc1057SHemant Agrawal return E_OK; 2462ffc1057SHemant Agrawal } 2472ffc1057SHemant Agrawal 2482ffc1057SHemant Agrawal t_handle 2492ffc1057SHemant Agrawal fm_pcd_kg_scheme_set(t_handle h_fm_pcd, 2502ffc1057SHemant Agrawal ioc_fm_pcd_kg_scheme_params_t *params) 2512ffc1057SHemant Agrawal { 2522ffc1057SHemant Agrawal t_device *p_pcd_dev = (t_device *)h_fm_pcd; 2532ffc1057SHemant Agrawal t_device *p_dev = NULL; 2542ffc1057SHemant Agrawal int ret; 2552ffc1057SHemant Agrawal 256*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 2572ffc1057SHemant Agrawal 2582ffc1057SHemant Agrawal params->id = NULL; 2592ffc1057SHemant Agrawal 2602ffc1057SHemant Agrawal if (params->param.modify) { 2612ffc1057SHemant Agrawal if (params->param.scm_id.scheme_id) 2622ffc1057SHemant Agrawal DEV_TO_ID(params->param.scm_id.scheme_id); 2632ffc1057SHemant Agrawal else 2642ffc1057SHemant Agrawal return NULL; 2652ffc1057SHemant Agrawal } 2662ffc1057SHemant Agrawal 2672ffc1057SHemant Agrawal /* correct h_net_env param from scheme */ 2682ffc1057SHemant Agrawal if (params->param.net_env_params.net_env_id) 2692ffc1057SHemant Agrawal DEV_TO_ID(params->param.net_env_params.net_env_id); 2702ffc1057SHemant Agrawal 2712ffc1057SHemant Agrawal /* correct next engine params handlers: cc*/ 2722ffc1057SHemant Agrawal if (params->param.next_engine == e_IOC_FM_PCD_CC && 2732ffc1057SHemant Agrawal params->param.kg_next_engine_params.cc.tree_id) 2742ffc1057SHemant Agrawal DEV_TO_ID(params->param.kg_next_engine_params.cc.tree_id); 2752ffc1057SHemant Agrawal 2762ffc1057SHemant Agrawal ret = ioctl(p_pcd_dev->fd, FM_PCD_IOC_KG_SCHEME_SET, params); 2772ffc1057SHemant Agrawal if (ret) { 2781ec9a3afSHemant Agrawal DPAA_PMD_ERR(" cannot set kg scheme, error %i (%s)", 2792ffc1057SHemant Agrawal errno, strerror(errno)); 2802ffc1057SHemant Agrawal return NULL; 2812ffc1057SHemant Agrawal } 2822ffc1057SHemant Agrawal 2832ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 2842ffc1057SHemant Agrawal if (p_dev == NULL) 2852ffc1057SHemant Agrawal return NULL; 2862ffc1057SHemant Agrawal 2872ffc1057SHemant Agrawal memset(p_dev, 0, sizeof(t_device)); 2882ffc1057SHemant Agrawal p_dev->h_user_priv = (t_handle)p_pcd_dev; 2892ffc1057SHemant Agrawal /* increase owners only if a new scheme is created */ 2902ffc1057SHemant Agrawal if (!params->param.modify) 2912ffc1057SHemant Agrawal p_pcd_dev->owners++; 2922ffc1057SHemant Agrawal p_dev->id = PTR_TO_UINT(params->id); 2932ffc1057SHemant Agrawal 294*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 2952ffc1057SHemant Agrawal 2962ffc1057SHemant Agrawal return (t_handle)p_dev; 2972ffc1057SHemant Agrawal } 2982ffc1057SHemant Agrawal 2992ffc1057SHemant Agrawal uint32_t 3002ffc1057SHemant Agrawal fm_pcd_kg_scheme_delete(t_handle h_scheme) 3012ffc1057SHemant Agrawal { 3022ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_scheme; 3032ffc1057SHemant Agrawal t_device *p_pcd_dev = NULL; 3042ffc1057SHemant Agrawal ioc_fm_obj_t id; 3052ffc1057SHemant Agrawal 306*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 3072ffc1057SHemant Agrawal 3082ffc1057SHemant Agrawal p_pcd_dev = (t_device *)p_dev->h_user_priv; 3092ffc1057SHemant Agrawal id.obj = UINT_TO_PTR(p_dev->id); 3102ffc1057SHemant Agrawal 3112ffc1057SHemant Agrawal if (ioctl(p_pcd_dev->fd, FM_PCD_IOC_KG_SCHEME_DELETE, &id)) { 3121ec9a3afSHemant Agrawal DPAA_PMD_WARN("cannot delete kg scheme, error %i (%s)", 3132ffc1057SHemant Agrawal errno, strerror(errno)); 3142ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 3152ffc1057SHemant Agrawal } 3162ffc1057SHemant Agrawal 3172ffc1057SHemant Agrawal p_pcd_dev->owners--; 3182ffc1057SHemant Agrawal free(p_dev); 3192ffc1057SHemant Agrawal 320*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 3212ffc1057SHemant Agrawal 3222ffc1057SHemant Agrawal return E_OK; 3232ffc1057SHemant Agrawal } 3242ffc1057SHemant Agrawal 3252ffc1057SHemant Agrawal typedef struct { 3262ffc1057SHemant Agrawal e_fm_port_type port_type; /**< Port type */ 3272ffc1057SHemant Agrawal uint8_t port_id; /**< Port Id - relative to type */ 3282ffc1057SHemant Agrawal } t_fm_port; 3292ffc1057SHemant Agrawal 3302ffc1057SHemant Agrawal t_handle 3312ffc1057SHemant Agrawal fm_port_open(t_fm_port_params *p_fm_port_params) 3322ffc1057SHemant Agrawal { 3332ffc1057SHemant Agrawal t_device *p_dev; 3342ffc1057SHemant Agrawal int fd; 3352ffc1057SHemant Agrawal char dev_name[30]; 3362ffc1057SHemant Agrawal t_fm_port *p_fm_port; 3372ffc1057SHemant Agrawal 338*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 3392ffc1057SHemant Agrawal 3402ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 3412ffc1057SHemant Agrawal if (p_dev == NULL) 3422ffc1057SHemant Agrawal return NULL; 3432ffc1057SHemant Agrawal 3442ffc1057SHemant Agrawal memset(p_dev, 0, sizeof(t_device)); 3452ffc1057SHemant Agrawal 3462ffc1057SHemant Agrawal p_fm_port = (t_fm_port *)malloc(sizeof(t_fm_port)); 3472ffc1057SHemant Agrawal if (!p_fm_port) { 3482ffc1057SHemant Agrawal free(p_dev); 3492ffc1057SHemant Agrawal return NULL; 3502ffc1057SHemant Agrawal } 3512ffc1057SHemant Agrawal memset(p_fm_port, 0, sizeof(t_fm_port)); 3522ffc1057SHemant Agrawal memset(dev_name, 0, sizeof(dev_name)); 3532ffc1057SHemant Agrawal switch (p_fm_port_params->port_type) { 3542ffc1057SHemant Agrawal case e_FM_PORT_TYPE_OH_OFFLINE_PARSING: 3552ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-port-oh%d", "/dev/", DEV_FM_NAME, 3562ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_port_params->h_fm)->id, 3572ffc1057SHemant Agrawal p_fm_port_params->port_id); 3582ffc1057SHemant Agrawal break; 3592ffc1057SHemant Agrawal case e_FM_PORT_TYPE_RX: 3602ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-port-rx%d", "/dev/", DEV_FM_NAME, 3612ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_port_params->h_fm)->id, 3622ffc1057SHemant Agrawal p_fm_port_params->port_id); 3632ffc1057SHemant Agrawal break; 3642ffc1057SHemant Agrawal case e_FM_PORT_TYPE_RX_10G: 3652ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-port-rx%d", "/dev/", DEV_FM_NAME, 3662ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_port_params->h_fm)->id, 3672ffc1057SHemant Agrawal FM_MAX_NUM_OF_1G_RX_PORTS + p_fm_port_params->port_id); 3682ffc1057SHemant Agrawal break; 3692ffc1057SHemant Agrawal case e_FM_PORT_TYPE_TX: 3702ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-port-tx%d", "/dev/", DEV_FM_NAME, 3712ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_port_params->h_fm)->id, 3722ffc1057SHemant Agrawal p_fm_port_params->port_id); 3732ffc1057SHemant Agrawal break; 3742ffc1057SHemant Agrawal case e_FM_PORT_TYPE_TX_10G: 3752ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-port-tx%d", "/dev/", DEV_FM_NAME, 3762ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_port_params->h_fm)->id, 3772ffc1057SHemant Agrawal FM_MAX_NUM_OF_1G_TX_PORTS + p_fm_port_params->port_id); 3782ffc1057SHemant Agrawal break; 3792ffc1057SHemant Agrawal default: 3802ffc1057SHemant Agrawal free(p_fm_port); 3812ffc1057SHemant Agrawal free(p_dev); 3822ffc1057SHemant Agrawal return NULL; 3832ffc1057SHemant Agrawal } 3842ffc1057SHemant Agrawal 3852ffc1057SHemant Agrawal fd = open(dev_name, O_RDWR); 3862ffc1057SHemant Agrawal if (fd < 0) { 3872ffc1057SHemant Agrawal free(p_fm_port); 3882ffc1057SHemant Agrawal free(p_dev); 3892ffc1057SHemant Agrawal return NULL; 3902ffc1057SHemant Agrawal } 3912ffc1057SHemant Agrawal 3922ffc1057SHemant Agrawal p_fm_port->port_type = p_fm_port_params->port_type; 3932ffc1057SHemant Agrawal p_fm_port->port_id = p_fm_port_params->port_id; 3942ffc1057SHemant Agrawal p_dev->id = p_fm_port_params->port_id; 3952ffc1057SHemant Agrawal p_dev->fd = fd; 3962ffc1057SHemant Agrawal p_dev->h_user_priv = (t_handle)p_fm_port; 3972ffc1057SHemant Agrawal 398*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 3992ffc1057SHemant Agrawal 4002ffc1057SHemant Agrawal return (t_handle)p_dev; 4012ffc1057SHemant Agrawal } 4022ffc1057SHemant Agrawal 4032ffc1057SHemant Agrawal void 4042ffc1057SHemant Agrawal fm_port_close(t_handle h_fm_port) 4052ffc1057SHemant Agrawal { 4062ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_port; 4072ffc1057SHemant Agrawal 408*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 4092ffc1057SHemant Agrawal 4102ffc1057SHemant Agrawal close(p_dev->fd); 4112ffc1057SHemant Agrawal free(p_dev->h_user_priv); 4122ffc1057SHemant Agrawal free(p_dev); 4132ffc1057SHemant Agrawal 414*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 4152ffc1057SHemant Agrawal } 4162ffc1057SHemant Agrawal 4172ffc1057SHemant Agrawal uint32_t 4182ffc1057SHemant Agrawal fm_port_disable(t_handle h_fm_port) 4192ffc1057SHemant Agrawal { 4202ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_port; 4212ffc1057SHemant Agrawal 422*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 4232ffc1057SHemant Agrawal 4242ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PORT_IOC_DISABLE)) 4252ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 4262ffc1057SHemant Agrawal 427*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 4282ffc1057SHemant Agrawal 4292ffc1057SHemant Agrawal return E_OK; 4302ffc1057SHemant Agrawal } 4312ffc1057SHemant Agrawal 4322ffc1057SHemant Agrawal uint32_t 4332ffc1057SHemant Agrawal fm_port_enable(t_handle h_fm_port) 4342ffc1057SHemant Agrawal { 4352ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_port; 4362ffc1057SHemant Agrawal 437*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 4382ffc1057SHemant Agrawal 4392ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PORT_IOC_ENABLE)) 4402ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 4412ffc1057SHemant Agrawal 442*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 4432ffc1057SHemant Agrawal 4442ffc1057SHemant Agrawal return E_OK; 4452ffc1057SHemant Agrawal } 4462ffc1057SHemant Agrawal 4472ffc1057SHemant Agrawal uint32_t 4482ffc1057SHemant Agrawal fm_port_set_pcd(t_handle h_fm_port, 4492ffc1057SHemant Agrawal ioc_fm_port_pcd_params_t *p) 4502ffc1057SHemant Agrawal { 4512ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_port; 4522ffc1057SHemant Agrawal 453*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 4542ffc1057SHemant Agrawal 4552ffc1057SHemant Agrawal /* correct h_net_env param from t_fm_portPcdParams */ 4562ffc1057SHemant Agrawal DEV_TO_ID(p->net_env_id); 4572ffc1057SHemant Agrawal 4582ffc1057SHemant Agrawal /* correct pcd structures according to what support was set */ 4592ffc1057SHemant Agrawal if (p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_CC || 4602ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_CC_AND_PLCR || 4612ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_CC) { 4622ffc1057SHemant Agrawal if (p->p_cc_params && p->p_cc_params->cc_tree_id) 4632ffc1057SHemant Agrawal DEV_TO_ID(p->p_cc_params->cc_tree_id); 4642ffc1057SHemant Agrawal else 4652ffc1057SHemant Agrawal DPAA_PMD_WARN("Coarse Classification not set !"); 4662ffc1057SHemant Agrawal } 4672ffc1057SHemant Agrawal 4682ffc1057SHemant Agrawal if (p->pcd_support == e_IOC_FM_PCD_PRS_KG || 4692ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_CC || 4702ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_CC_AND_PLCR || 4712ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_PLCR){ 4722ffc1057SHemant Agrawal if (p->p_kg_params) { 4732ffc1057SHemant Agrawal uint32_t i; 4742ffc1057SHemant Agrawal ioc_fm_port_pcd_kg_params_t *kg_params; 4752ffc1057SHemant Agrawal 4762ffc1057SHemant Agrawal kg_params = p->p_kg_params; 4772ffc1057SHemant Agrawal 4782ffc1057SHemant Agrawal for (i = 0; i < kg_params->num_schemes; i++) 4792ffc1057SHemant Agrawal if (kg_params->scheme_ids[i]) 4802ffc1057SHemant Agrawal DEV_TO_ID(kg_params->scheme_ids[i]); 4812ffc1057SHemant Agrawal else 4822ffc1057SHemant Agrawal DPAA_PMD_WARN("Scheme:%u not set!!", i); 4832ffc1057SHemant Agrawal 4842ffc1057SHemant Agrawal if (kg_params->direct_scheme) 4852ffc1057SHemant Agrawal DEV_TO_ID(kg_params->direct_scheme_id); 4862ffc1057SHemant Agrawal } else { 4872ffc1057SHemant Agrawal DPAA_PMD_WARN("KeyGen not set !"); 4882ffc1057SHemant Agrawal } 4892ffc1057SHemant Agrawal } 4902ffc1057SHemant Agrawal 4912ffc1057SHemant Agrawal if (p->pcd_support == e_IOC_FM_PCD_PLCR_ONLY || 4922ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_PLCR || 4932ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_CC_AND_PLCR || 4942ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_PLCR) { 4952ffc1057SHemant Agrawal if (p->p_plcr_params) { 4962ffc1057SHemant Agrawal if (p->p_plcr_params->plcr_profile_id) 4972ffc1057SHemant Agrawal DEV_TO_ID(p->p_plcr_params->plcr_profile_id); 4982ffc1057SHemant Agrawal else 4992ffc1057SHemant Agrawal DPAA_PMD_WARN("Policer not set !"); 5002ffc1057SHemant Agrawal } 5012ffc1057SHemant Agrawal } 5022ffc1057SHemant Agrawal 5032ffc1057SHemant Agrawal if (p->p_ip_reassembly_manip) 5042ffc1057SHemant Agrawal DEV_TO_ID(p->p_ip_reassembly_manip); 5052ffc1057SHemant Agrawal 5062ffc1057SHemant Agrawal if (p->p_capwap_reassembly_manip) 5072ffc1057SHemant Agrawal DEV_TO_ID(p->p_capwap_reassembly_manip); 5082ffc1057SHemant Agrawal 5092ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PORT_IOC_SET_PCD, p)) 5102ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 5112ffc1057SHemant Agrawal 512*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 5132ffc1057SHemant Agrawal 5142ffc1057SHemant Agrawal return E_OK; 5152ffc1057SHemant Agrawal } 5162ffc1057SHemant Agrawal 5172ffc1057SHemant Agrawal uint32_t 5182ffc1057SHemant Agrawal fm_port_delete_pcd(t_handle h_fm_port) 5192ffc1057SHemant Agrawal { 5202ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_port; 5212ffc1057SHemant Agrawal 522*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 5232ffc1057SHemant Agrawal 5242ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PORT_IOC_DELETE_PCD)) 5252ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 5262ffc1057SHemant Agrawal 527*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 5282ffc1057SHemant Agrawal 5292ffc1057SHemant Agrawal return E_OK; 5302ffc1057SHemant Agrawal } 5312ffc1057SHemant Agrawal 5322ffc1057SHemant Agrawal t_handle 5332ffc1057SHemant Agrawal create_device(t_handle h_user_priv, t_handle h_dev_id) 5342ffc1057SHemant Agrawal { 5352ffc1057SHemant Agrawal t_device *p_user_priv_dev = (t_device *)h_user_priv; 5362ffc1057SHemant Agrawal t_device *p_dev = NULL; 5372ffc1057SHemant Agrawal 538*6be4899cSHemant Agrawal _fml_dbg("Calling..."); 5392ffc1057SHemant Agrawal 5402ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 5412ffc1057SHemant Agrawal if (p_dev == NULL) 5422ffc1057SHemant Agrawal return NULL; 5432ffc1057SHemant Agrawal 5442ffc1057SHemant Agrawal memset(p_dev, 0, sizeof(t_device)); 5452ffc1057SHemant Agrawal p_dev->h_user_priv = h_user_priv; 5462ffc1057SHemant Agrawal p_user_priv_dev->owners++; 5472ffc1057SHemant Agrawal p_dev->id = PTR_TO_UINT(h_dev_id); 5482ffc1057SHemant Agrawal 549*6be4899cSHemant Agrawal _fml_dbg("Finishing."); 5502ffc1057SHemant Agrawal 5512ffc1057SHemant Agrawal return (t_handle)p_dev; 5522ffc1057SHemant Agrawal } 5532ffc1057SHemant Agrawal 5542ffc1057SHemant Agrawal t_handle 5552ffc1057SHemant Agrawal get_device_id(t_handle h_dev) 5562ffc1057SHemant Agrawal { 5572ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_dev; 5582ffc1057SHemant Agrawal 5592ffc1057SHemant Agrawal return (t_handle)p_dev->id; 5602ffc1057SHemant Agrawal } 561