1*2ffc1057SHemant Agrawal /* SPDX-License-Identifier: BSD-3-Clause 2*2ffc1057SHemant Agrawal * Copyright 2008-2016 Freescale Semiconductor Inc. 3*2ffc1057SHemant Agrawal * Copyright 2017-2020 NXP 4*2ffc1057SHemant Agrawal */ 5*2ffc1057SHemant Agrawal 6*2ffc1057SHemant Agrawal #include <stdio.h> 7*2ffc1057SHemant Agrawal #include <stdlib.h> 8*2ffc1057SHemant Agrawal #include <string.h> 9*2ffc1057SHemant Agrawal #include <fcntl.h> 10*2ffc1057SHemant Agrawal #include <errno.h> 11*2ffc1057SHemant Agrawal #include <unistd.h> 12*2ffc1057SHemant Agrawal #include <termios.h> 13*2ffc1057SHemant Agrawal #include <sys/ioctl.h> 14*2ffc1057SHemant Agrawal #include <stdbool.h> 15*2ffc1057SHemant Agrawal #include <rte_common.h> 16*2ffc1057SHemant Agrawal 17*2ffc1057SHemant Agrawal #include "fm_ext.h" 18*2ffc1057SHemant Agrawal #include "fm_pcd_ext.h" 19*2ffc1057SHemant Agrawal #include "fm_port_ext.h" 20*2ffc1057SHemant Agrawal #include <dpaa_ethdev.h> 21*2ffc1057SHemant Agrawal 22*2ffc1057SHemant Agrawal #define DEV_TO_ID(p) \ 23*2ffc1057SHemant Agrawal do { \ 24*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)p; \ 25*2ffc1057SHemant Agrawal p = UINT_TO_PTR(p_dev->id); \ 26*2ffc1057SHemant Agrawal } while (0) 27*2ffc1057SHemant Agrawal 28*2ffc1057SHemant Agrawal /* Major and minor are in sync with FMD, respin is for fmlib identification */ 29*2ffc1057SHemant Agrawal #define FM_LIB_VERSION_MAJOR 21 30*2ffc1057SHemant Agrawal #define FM_LIB_VERSION_MINOR 1 31*2ffc1057SHemant Agrawal #define FM_LIB_VERSION_RESPIN 0 32*2ffc1057SHemant Agrawal 33*2ffc1057SHemant Agrawal #if (FMD_API_VERSION_MAJOR != FM_LIB_VERSION_MAJOR) || \ 34*2ffc1057SHemant Agrawal (FMD_API_VERSION_MINOR != FM_LIB_VERSION_MINOR) 35*2ffc1057SHemant Agrawal #warning FMD and FMLIB version mismatch 36*2ffc1057SHemant Agrawal #endif 37*2ffc1057SHemant Agrawal 38*2ffc1057SHemant Agrawal t_handle 39*2ffc1057SHemant Agrawal fm_open(uint8_t id) 40*2ffc1057SHemant Agrawal { 41*2ffc1057SHemant Agrawal t_device *p_dev; 42*2ffc1057SHemant Agrawal int fd; 43*2ffc1057SHemant Agrawal char dev_name[20]; 44*2ffc1057SHemant Agrawal static bool called; 45*2ffc1057SHemant Agrawal ioc_fm_api_version_t ver; 46*2ffc1057SHemant Agrawal 47*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 48*2ffc1057SHemant Agrawal 49*2ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 50*2ffc1057SHemant Agrawal if (p_dev == NULL) 51*2ffc1057SHemant Agrawal return NULL; 52*2ffc1057SHemant Agrawal 53*2ffc1057SHemant Agrawal memset(dev_name, 0, 20); 54*2ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%d", "/dev/", DEV_FM_NAME, id); 55*2ffc1057SHemant Agrawal fd = open(dev_name, O_RDWR); 56*2ffc1057SHemant Agrawal if (fd < 0) { 57*2ffc1057SHemant Agrawal free(p_dev); 58*2ffc1057SHemant Agrawal return NULL; 59*2ffc1057SHemant Agrawal } 60*2ffc1057SHemant Agrawal 61*2ffc1057SHemant Agrawal p_dev->id = id; 62*2ffc1057SHemant Agrawal p_dev->fd = fd; 63*2ffc1057SHemant Agrawal if (!called) { 64*2ffc1057SHemant Agrawal called = true; 65*2ffc1057SHemant Agrawal fm_get_api_version((t_handle)p_dev, &ver); 66*2ffc1057SHemant Agrawal 67*2ffc1057SHemant Agrawal if (ver.version.major != FMD_API_VERSION_MAJOR || 68*2ffc1057SHemant Agrawal ver.version.minor != FMD_API_VERSION_MINOR || 69*2ffc1057SHemant Agrawal ver.version.respin != FMD_API_VERSION_RESPIN) { 70*2ffc1057SHemant Agrawal DPAA_PMD_WARN("Compiled against FMD API ver %u.%u.%u", 71*2ffc1057SHemant Agrawal FMD_API_VERSION_MAJOR, 72*2ffc1057SHemant Agrawal FMD_API_VERSION_MINOR, FMD_API_VERSION_RESPIN); 73*2ffc1057SHemant Agrawal DPAA_PMD_WARN("Running with FMD API ver %u.%u.%u", 74*2ffc1057SHemant Agrawal ver.version.major, ver.version.minor, 75*2ffc1057SHemant Agrawal ver.version.respin); 76*2ffc1057SHemant Agrawal } 77*2ffc1057SHemant Agrawal } 78*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 79*2ffc1057SHemant Agrawal 80*2ffc1057SHemant Agrawal return (t_handle)p_dev; 81*2ffc1057SHemant Agrawal } 82*2ffc1057SHemant Agrawal 83*2ffc1057SHemant Agrawal void fm_close(t_handle h_fm) 84*2ffc1057SHemant Agrawal { 85*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm; 86*2ffc1057SHemant Agrawal 87*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 88*2ffc1057SHemant Agrawal 89*2ffc1057SHemant Agrawal close(p_dev->fd); 90*2ffc1057SHemant Agrawal free(p_dev); 91*2ffc1057SHemant Agrawal 92*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 93*2ffc1057SHemant Agrawal } 94*2ffc1057SHemant Agrawal 95*2ffc1057SHemant Agrawal uint32_t 96*2ffc1057SHemant Agrawal fm_get_api_version(t_handle h_fm, ioc_fm_api_version_t *p_version) 97*2ffc1057SHemant Agrawal { 98*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm; 99*2ffc1057SHemant Agrawal int ret; 100*2ffc1057SHemant Agrawal 101*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 102*2ffc1057SHemant Agrawal 103*2ffc1057SHemant Agrawal ret = ioctl(p_dev->fd, FM_IOC_GET_API_VERSION, p_version); 104*2ffc1057SHemant Agrawal if (ret) { 105*2ffc1057SHemant Agrawal DPAA_PMD_ERR("cannot get API version, error %i (%s)\n", 106*2ffc1057SHemant Agrawal errno, strerror(errno)); 107*2ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 108*2ffc1057SHemant Agrawal } 109*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 110*2ffc1057SHemant Agrawal 111*2ffc1057SHemant Agrawal return E_OK; 112*2ffc1057SHemant Agrawal } 113*2ffc1057SHemant Agrawal 114*2ffc1057SHemant Agrawal t_handle 115*2ffc1057SHemant Agrawal fm_pcd_open(t_fm_pcd_params *p_fm_pcd_params) 116*2ffc1057SHemant Agrawal { 117*2ffc1057SHemant Agrawal t_device *p_dev; 118*2ffc1057SHemant Agrawal int fd; 119*2ffc1057SHemant Agrawal char dev_name[20]; 120*2ffc1057SHemant Agrawal 121*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 122*2ffc1057SHemant Agrawal 123*2ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 124*2ffc1057SHemant Agrawal if (p_dev == NULL) 125*2ffc1057SHemant Agrawal return NULL; 126*2ffc1057SHemant Agrawal 127*2ffc1057SHemant Agrawal memset(dev_name, 0, 20); 128*2ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-pcd", "/dev/", DEV_FM_NAME, 129*2ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_pcd_params->h_fm)->id); 130*2ffc1057SHemant Agrawal fd = open(dev_name, O_RDWR); 131*2ffc1057SHemant Agrawal if (fd < 0) { 132*2ffc1057SHemant Agrawal free(p_dev); 133*2ffc1057SHemant Agrawal return NULL; 134*2ffc1057SHemant Agrawal } 135*2ffc1057SHemant Agrawal 136*2ffc1057SHemant Agrawal p_dev->id = ((t_device *)p_fm_pcd_params->h_fm)->id; 137*2ffc1057SHemant Agrawal p_dev->fd = fd; 138*2ffc1057SHemant Agrawal p_dev->owners = 0; 139*2ffc1057SHemant Agrawal 140*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 141*2ffc1057SHemant Agrawal 142*2ffc1057SHemant Agrawal return (t_handle)p_dev; 143*2ffc1057SHemant Agrawal } 144*2ffc1057SHemant Agrawal 145*2ffc1057SHemant Agrawal void 146*2ffc1057SHemant Agrawal fm_pcd_close(t_handle h_fm_pcd) 147*2ffc1057SHemant Agrawal { 148*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_pcd; 149*2ffc1057SHemant Agrawal 150*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 151*2ffc1057SHemant Agrawal 152*2ffc1057SHemant Agrawal close(p_dev->fd); 153*2ffc1057SHemant Agrawal 154*2ffc1057SHemant Agrawal if (p_dev->owners) { 155*2ffc1057SHemant Agrawal printf("\nTry delete a prev created pcd handler(owners:%u)!\n", 156*2ffc1057SHemant Agrawal p_dev->owners); 157*2ffc1057SHemant Agrawal return; 158*2ffc1057SHemant Agrawal } 159*2ffc1057SHemant Agrawal 160*2ffc1057SHemant Agrawal free(p_dev); 161*2ffc1057SHemant Agrawal 162*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 163*2ffc1057SHemant Agrawal } 164*2ffc1057SHemant Agrawal 165*2ffc1057SHemant Agrawal uint32_t 166*2ffc1057SHemant Agrawal fm_pcd_enable(t_handle h_fm_pcd) 167*2ffc1057SHemant Agrawal { 168*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_pcd; 169*2ffc1057SHemant Agrawal 170*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 171*2ffc1057SHemant Agrawal 172*2ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PCD_IOC_ENABLE)) 173*2ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 174*2ffc1057SHemant Agrawal 175*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 176*2ffc1057SHemant Agrawal 177*2ffc1057SHemant Agrawal return E_OK; 178*2ffc1057SHemant Agrawal } 179*2ffc1057SHemant Agrawal 180*2ffc1057SHemant Agrawal uint32_t 181*2ffc1057SHemant Agrawal fm_pcd_disable(t_handle h_fm_pcd) 182*2ffc1057SHemant Agrawal { 183*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_pcd; 184*2ffc1057SHemant Agrawal 185*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 186*2ffc1057SHemant Agrawal 187*2ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PCD_IOC_DISABLE)) 188*2ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 189*2ffc1057SHemant Agrawal 190*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 191*2ffc1057SHemant Agrawal 192*2ffc1057SHemant Agrawal return E_OK; 193*2ffc1057SHemant Agrawal } 194*2ffc1057SHemant Agrawal 195*2ffc1057SHemant Agrawal t_handle 196*2ffc1057SHemant Agrawal fm_pcd_net_env_characteristics_set(t_handle h_fm_pcd, 197*2ffc1057SHemant Agrawal ioc_fm_pcd_net_env_params_t *params) 198*2ffc1057SHemant Agrawal { 199*2ffc1057SHemant Agrawal t_device *p_pcd_dev = (t_device *)h_fm_pcd; 200*2ffc1057SHemant Agrawal t_device *p_dev = NULL; 201*2ffc1057SHemant Agrawal 202*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 203*2ffc1057SHemant Agrawal 204*2ffc1057SHemant Agrawal params->id = NULL; 205*2ffc1057SHemant Agrawal 206*2ffc1057SHemant Agrawal if (ioctl(p_pcd_dev->fd, FM_PCD_IOC_NET_ENV_CHARACTERISTICS_SET, 207*2ffc1057SHemant Agrawal params)) 208*2ffc1057SHemant Agrawal return NULL; 209*2ffc1057SHemant Agrawal 210*2ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 211*2ffc1057SHemant Agrawal if (p_dev == NULL) 212*2ffc1057SHemant Agrawal return NULL; 213*2ffc1057SHemant Agrawal 214*2ffc1057SHemant Agrawal memset(p_dev, 0, sizeof(t_device)); 215*2ffc1057SHemant Agrawal p_dev->h_user_priv = (t_handle)p_pcd_dev; 216*2ffc1057SHemant Agrawal p_pcd_dev->owners++; 217*2ffc1057SHemant Agrawal p_dev->id = PTR_TO_UINT(params->id); 218*2ffc1057SHemant Agrawal 219*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 220*2ffc1057SHemant Agrawal 221*2ffc1057SHemant Agrawal return (t_handle)p_dev; 222*2ffc1057SHemant Agrawal } 223*2ffc1057SHemant Agrawal 224*2ffc1057SHemant Agrawal uint32_t 225*2ffc1057SHemant Agrawal fm_pcd_net_env_characteristics_delete(t_handle h_net_env) 226*2ffc1057SHemant Agrawal { 227*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_net_env; 228*2ffc1057SHemant Agrawal t_device *p_pcd_dev = NULL; 229*2ffc1057SHemant Agrawal ioc_fm_obj_t id; 230*2ffc1057SHemant Agrawal 231*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 232*2ffc1057SHemant Agrawal 233*2ffc1057SHemant Agrawal p_pcd_dev = (t_device *)p_dev->h_user_priv; 234*2ffc1057SHemant Agrawal id.obj = UINT_TO_PTR(p_dev->id); 235*2ffc1057SHemant Agrawal 236*2ffc1057SHemant Agrawal if (ioctl(p_pcd_dev->fd, FM_PCD_IOC_NET_ENV_CHARACTERISTICS_DELETE, 237*2ffc1057SHemant Agrawal &id)) 238*2ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 239*2ffc1057SHemant Agrawal 240*2ffc1057SHemant Agrawal p_pcd_dev->owners--; 241*2ffc1057SHemant Agrawal free(p_dev); 242*2ffc1057SHemant Agrawal 243*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 244*2ffc1057SHemant Agrawal 245*2ffc1057SHemant Agrawal return E_OK; 246*2ffc1057SHemant Agrawal } 247*2ffc1057SHemant Agrawal 248*2ffc1057SHemant Agrawal t_handle 249*2ffc1057SHemant Agrawal fm_pcd_kg_scheme_set(t_handle h_fm_pcd, 250*2ffc1057SHemant Agrawal ioc_fm_pcd_kg_scheme_params_t *params) 251*2ffc1057SHemant Agrawal { 252*2ffc1057SHemant Agrawal t_device *p_pcd_dev = (t_device *)h_fm_pcd; 253*2ffc1057SHemant Agrawal t_device *p_dev = NULL; 254*2ffc1057SHemant Agrawal int ret; 255*2ffc1057SHemant Agrawal 256*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 257*2ffc1057SHemant Agrawal 258*2ffc1057SHemant Agrawal params->id = NULL; 259*2ffc1057SHemant Agrawal 260*2ffc1057SHemant Agrawal if (params->param.modify) { 261*2ffc1057SHemant Agrawal if (params->param.scm_id.scheme_id) 262*2ffc1057SHemant Agrawal DEV_TO_ID(params->param.scm_id.scheme_id); 263*2ffc1057SHemant Agrawal else 264*2ffc1057SHemant Agrawal return NULL; 265*2ffc1057SHemant Agrawal } 266*2ffc1057SHemant Agrawal 267*2ffc1057SHemant Agrawal /* correct h_net_env param from scheme */ 268*2ffc1057SHemant Agrawal if (params->param.net_env_params.net_env_id) 269*2ffc1057SHemant Agrawal DEV_TO_ID(params->param.net_env_params.net_env_id); 270*2ffc1057SHemant Agrawal 271*2ffc1057SHemant Agrawal /* correct next engine params handlers: cc*/ 272*2ffc1057SHemant Agrawal if (params->param.next_engine == e_IOC_FM_PCD_CC && 273*2ffc1057SHemant Agrawal params->param.kg_next_engine_params.cc.tree_id) 274*2ffc1057SHemant Agrawal DEV_TO_ID(params->param.kg_next_engine_params.cc.tree_id); 275*2ffc1057SHemant Agrawal 276*2ffc1057SHemant Agrawal ret = ioctl(p_pcd_dev->fd, FM_PCD_IOC_KG_SCHEME_SET, params); 277*2ffc1057SHemant Agrawal if (ret) { 278*2ffc1057SHemant Agrawal DPAA_PMD_ERR(" cannot set kg scheme, error %i (%s)\n", 279*2ffc1057SHemant Agrawal errno, strerror(errno)); 280*2ffc1057SHemant Agrawal return NULL; 281*2ffc1057SHemant Agrawal } 282*2ffc1057SHemant Agrawal 283*2ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 284*2ffc1057SHemant Agrawal if (p_dev == NULL) 285*2ffc1057SHemant Agrawal return NULL; 286*2ffc1057SHemant Agrawal 287*2ffc1057SHemant Agrawal memset(p_dev, 0, sizeof(t_device)); 288*2ffc1057SHemant Agrawal p_dev->h_user_priv = (t_handle)p_pcd_dev; 289*2ffc1057SHemant Agrawal /* increase owners only if a new scheme is created */ 290*2ffc1057SHemant Agrawal if (!params->param.modify) 291*2ffc1057SHemant Agrawal p_pcd_dev->owners++; 292*2ffc1057SHemant Agrawal p_dev->id = PTR_TO_UINT(params->id); 293*2ffc1057SHemant Agrawal 294*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 295*2ffc1057SHemant Agrawal 296*2ffc1057SHemant Agrawal return (t_handle)p_dev; 297*2ffc1057SHemant Agrawal } 298*2ffc1057SHemant Agrawal 299*2ffc1057SHemant Agrawal uint32_t 300*2ffc1057SHemant Agrawal fm_pcd_kg_scheme_delete(t_handle h_scheme) 301*2ffc1057SHemant Agrawal { 302*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_scheme; 303*2ffc1057SHemant Agrawal t_device *p_pcd_dev = NULL; 304*2ffc1057SHemant Agrawal ioc_fm_obj_t id; 305*2ffc1057SHemant Agrawal 306*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 307*2ffc1057SHemant Agrawal 308*2ffc1057SHemant Agrawal p_pcd_dev = (t_device *)p_dev->h_user_priv; 309*2ffc1057SHemant Agrawal id.obj = UINT_TO_PTR(p_dev->id); 310*2ffc1057SHemant Agrawal 311*2ffc1057SHemant Agrawal if (ioctl(p_pcd_dev->fd, FM_PCD_IOC_KG_SCHEME_DELETE, &id)) { 312*2ffc1057SHemant Agrawal DPAA_PMD_WARN("cannot delete kg scheme, error %i (%s)\n", 313*2ffc1057SHemant Agrawal errno, strerror(errno)); 314*2ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 315*2ffc1057SHemant Agrawal } 316*2ffc1057SHemant Agrawal 317*2ffc1057SHemant Agrawal p_pcd_dev->owners--; 318*2ffc1057SHemant Agrawal free(p_dev); 319*2ffc1057SHemant Agrawal 320*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 321*2ffc1057SHemant Agrawal 322*2ffc1057SHemant Agrawal return E_OK; 323*2ffc1057SHemant Agrawal } 324*2ffc1057SHemant Agrawal 325*2ffc1057SHemant Agrawal typedef struct { 326*2ffc1057SHemant Agrawal e_fm_port_type port_type; /**< Port type */ 327*2ffc1057SHemant Agrawal uint8_t port_id; /**< Port Id - relative to type */ 328*2ffc1057SHemant Agrawal } t_fm_port; 329*2ffc1057SHemant Agrawal 330*2ffc1057SHemant Agrawal t_handle 331*2ffc1057SHemant Agrawal fm_port_open(t_fm_port_params *p_fm_port_params) 332*2ffc1057SHemant Agrawal { 333*2ffc1057SHemant Agrawal t_device *p_dev; 334*2ffc1057SHemant Agrawal int fd; 335*2ffc1057SHemant Agrawal char dev_name[30]; 336*2ffc1057SHemant Agrawal t_fm_port *p_fm_port; 337*2ffc1057SHemant Agrawal 338*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 339*2ffc1057SHemant Agrawal 340*2ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 341*2ffc1057SHemant Agrawal if (p_dev == NULL) 342*2ffc1057SHemant Agrawal return NULL; 343*2ffc1057SHemant Agrawal 344*2ffc1057SHemant Agrawal memset(p_dev, 0, sizeof(t_device)); 345*2ffc1057SHemant Agrawal 346*2ffc1057SHemant Agrawal p_fm_port = (t_fm_port *)malloc(sizeof(t_fm_port)); 347*2ffc1057SHemant Agrawal if (!p_fm_port) { 348*2ffc1057SHemant Agrawal free(p_dev); 349*2ffc1057SHemant Agrawal return NULL; 350*2ffc1057SHemant Agrawal } 351*2ffc1057SHemant Agrawal memset(p_fm_port, 0, sizeof(t_fm_port)); 352*2ffc1057SHemant Agrawal memset(dev_name, 0, sizeof(dev_name)); 353*2ffc1057SHemant Agrawal switch (p_fm_port_params->port_type) { 354*2ffc1057SHemant Agrawal case e_FM_PORT_TYPE_OH_OFFLINE_PARSING: 355*2ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-port-oh%d", "/dev/", DEV_FM_NAME, 356*2ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_port_params->h_fm)->id, 357*2ffc1057SHemant Agrawal p_fm_port_params->port_id); 358*2ffc1057SHemant Agrawal break; 359*2ffc1057SHemant Agrawal case e_FM_PORT_TYPE_RX: 360*2ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-port-rx%d", "/dev/", DEV_FM_NAME, 361*2ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_port_params->h_fm)->id, 362*2ffc1057SHemant Agrawal p_fm_port_params->port_id); 363*2ffc1057SHemant Agrawal break; 364*2ffc1057SHemant Agrawal case e_FM_PORT_TYPE_RX_10G: 365*2ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-port-rx%d", "/dev/", DEV_FM_NAME, 366*2ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_port_params->h_fm)->id, 367*2ffc1057SHemant Agrawal FM_MAX_NUM_OF_1G_RX_PORTS + p_fm_port_params->port_id); 368*2ffc1057SHemant Agrawal break; 369*2ffc1057SHemant Agrawal case e_FM_PORT_TYPE_TX: 370*2ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-port-tx%d", "/dev/", DEV_FM_NAME, 371*2ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_port_params->h_fm)->id, 372*2ffc1057SHemant Agrawal p_fm_port_params->port_id); 373*2ffc1057SHemant Agrawal break; 374*2ffc1057SHemant Agrawal case e_FM_PORT_TYPE_TX_10G: 375*2ffc1057SHemant Agrawal sprintf(dev_name, "%s%s%u-port-tx%d", "/dev/", DEV_FM_NAME, 376*2ffc1057SHemant Agrawal (uint32_t)((t_device *)p_fm_port_params->h_fm)->id, 377*2ffc1057SHemant Agrawal FM_MAX_NUM_OF_1G_TX_PORTS + p_fm_port_params->port_id); 378*2ffc1057SHemant Agrawal break; 379*2ffc1057SHemant Agrawal default: 380*2ffc1057SHemant Agrawal free(p_fm_port); 381*2ffc1057SHemant Agrawal free(p_dev); 382*2ffc1057SHemant Agrawal return NULL; 383*2ffc1057SHemant Agrawal } 384*2ffc1057SHemant Agrawal 385*2ffc1057SHemant Agrawal fd = open(dev_name, O_RDWR); 386*2ffc1057SHemant Agrawal if (fd < 0) { 387*2ffc1057SHemant Agrawal free(p_fm_port); 388*2ffc1057SHemant Agrawal free(p_dev); 389*2ffc1057SHemant Agrawal return NULL; 390*2ffc1057SHemant Agrawal } 391*2ffc1057SHemant Agrawal 392*2ffc1057SHemant Agrawal p_fm_port->port_type = p_fm_port_params->port_type; 393*2ffc1057SHemant Agrawal p_fm_port->port_id = p_fm_port_params->port_id; 394*2ffc1057SHemant Agrawal p_dev->id = p_fm_port_params->port_id; 395*2ffc1057SHemant Agrawal p_dev->fd = fd; 396*2ffc1057SHemant Agrawal p_dev->h_user_priv = (t_handle)p_fm_port; 397*2ffc1057SHemant Agrawal 398*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 399*2ffc1057SHemant Agrawal 400*2ffc1057SHemant Agrawal return (t_handle)p_dev; 401*2ffc1057SHemant Agrawal } 402*2ffc1057SHemant Agrawal 403*2ffc1057SHemant Agrawal void 404*2ffc1057SHemant Agrawal fm_port_close(t_handle h_fm_port) 405*2ffc1057SHemant Agrawal { 406*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_port; 407*2ffc1057SHemant Agrawal 408*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 409*2ffc1057SHemant Agrawal 410*2ffc1057SHemant Agrawal close(p_dev->fd); 411*2ffc1057SHemant Agrawal if (p_dev->h_user_priv) 412*2ffc1057SHemant Agrawal free(p_dev->h_user_priv); 413*2ffc1057SHemant Agrawal free(p_dev); 414*2ffc1057SHemant Agrawal 415*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 416*2ffc1057SHemant Agrawal } 417*2ffc1057SHemant Agrawal 418*2ffc1057SHemant Agrawal uint32_t 419*2ffc1057SHemant Agrawal fm_port_disable(t_handle h_fm_port) 420*2ffc1057SHemant Agrawal { 421*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_port; 422*2ffc1057SHemant Agrawal 423*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 424*2ffc1057SHemant Agrawal 425*2ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PORT_IOC_DISABLE)) 426*2ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 427*2ffc1057SHemant Agrawal 428*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 429*2ffc1057SHemant Agrawal 430*2ffc1057SHemant Agrawal return E_OK; 431*2ffc1057SHemant Agrawal } 432*2ffc1057SHemant Agrawal 433*2ffc1057SHemant Agrawal uint32_t 434*2ffc1057SHemant Agrawal fm_port_enable(t_handle h_fm_port) 435*2ffc1057SHemant Agrawal { 436*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_port; 437*2ffc1057SHemant Agrawal 438*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 439*2ffc1057SHemant Agrawal 440*2ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PORT_IOC_ENABLE)) 441*2ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 442*2ffc1057SHemant Agrawal 443*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 444*2ffc1057SHemant Agrawal 445*2ffc1057SHemant Agrawal return E_OK; 446*2ffc1057SHemant Agrawal } 447*2ffc1057SHemant Agrawal 448*2ffc1057SHemant Agrawal uint32_t 449*2ffc1057SHemant Agrawal fm_port_set_pcd(t_handle h_fm_port, 450*2ffc1057SHemant Agrawal ioc_fm_port_pcd_params_t *p) 451*2ffc1057SHemant Agrawal { 452*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_port; 453*2ffc1057SHemant Agrawal 454*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 455*2ffc1057SHemant Agrawal 456*2ffc1057SHemant Agrawal /* correct h_net_env param from t_fm_portPcdParams */ 457*2ffc1057SHemant Agrawal DEV_TO_ID(p->net_env_id); 458*2ffc1057SHemant Agrawal 459*2ffc1057SHemant Agrawal /* correct pcd structures according to what support was set */ 460*2ffc1057SHemant Agrawal if (p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_CC || 461*2ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_CC_AND_PLCR || 462*2ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_CC) { 463*2ffc1057SHemant Agrawal if (p->p_cc_params && p->p_cc_params->cc_tree_id) 464*2ffc1057SHemant Agrawal DEV_TO_ID(p->p_cc_params->cc_tree_id); 465*2ffc1057SHemant Agrawal else 466*2ffc1057SHemant Agrawal DPAA_PMD_WARN("Coarse Classification not set !"); 467*2ffc1057SHemant Agrawal } 468*2ffc1057SHemant Agrawal 469*2ffc1057SHemant Agrawal if (p->pcd_support == e_IOC_FM_PCD_PRS_KG || 470*2ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_CC || 471*2ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_CC_AND_PLCR || 472*2ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_PLCR){ 473*2ffc1057SHemant Agrawal if (p->p_kg_params) { 474*2ffc1057SHemant Agrawal uint32_t i; 475*2ffc1057SHemant Agrawal ioc_fm_port_pcd_kg_params_t *kg_params; 476*2ffc1057SHemant Agrawal 477*2ffc1057SHemant Agrawal kg_params = p->p_kg_params; 478*2ffc1057SHemant Agrawal 479*2ffc1057SHemant Agrawal for (i = 0; i < kg_params->num_schemes; i++) 480*2ffc1057SHemant Agrawal if (kg_params->scheme_ids[i]) 481*2ffc1057SHemant Agrawal DEV_TO_ID(kg_params->scheme_ids[i]); 482*2ffc1057SHemant Agrawal else 483*2ffc1057SHemant Agrawal DPAA_PMD_WARN("Scheme:%u not set!!", i); 484*2ffc1057SHemant Agrawal 485*2ffc1057SHemant Agrawal if (kg_params->direct_scheme) 486*2ffc1057SHemant Agrawal DEV_TO_ID(kg_params->direct_scheme_id); 487*2ffc1057SHemant Agrawal } else { 488*2ffc1057SHemant Agrawal DPAA_PMD_WARN("KeyGen not set !"); 489*2ffc1057SHemant Agrawal } 490*2ffc1057SHemant Agrawal } 491*2ffc1057SHemant Agrawal 492*2ffc1057SHemant Agrawal if (p->pcd_support == e_IOC_FM_PCD_PLCR_ONLY || 493*2ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_PLCR || 494*2ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_CC_AND_PLCR || 495*2ffc1057SHemant Agrawal p->pcd_support == e_IOC_FM_PCD_PRS_KG_AND_PLCR) { 496*2ffc1057SHemant Agrawal if (p->p_plcr_params) { 497*2ffc1057SHemant Agrawal if (p->p_plcr_params->plcr_profile_id) 498*2ffc1057SHemant Agrawal DEV_TO_ID(p->p_plcr_params->plcr_profile_id); 499*2ffc1057SHemant Agrawal else 500*2ffc1057SHemant Agrawal DPAA_PMD_WARN("Policer not set !"); 501*2ffc1057SHemant Agrawal } 502*2ffc1057SHemant Agrawal } 503*2ffc1057SHemant Agrawal 504*2ffc1057SHemant Agrawal if (p->p_ip_reassembly_manip) 505*2ffc1057SHemant Agrawal DEV_TO_ID(p->p_ip_reassembly_manip); 506*2ffc1057SHemant Agrawal 507*2ffc1057SHemant Agrawal if (p->p_capwap_reassembly_manip) 508*2ffc1057SHemant Agrawal DEV_TO_ID(p->p_capwap_reassembly_manip); 509*2ffc1057SHemant Agrawal 510*2ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PORT_IOC_SET_PCD, p)) 511*2ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 512*2ffc1057SHemant Agrawal 513*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 514*2ffc1057SHemant Agrawal 515*2ffc1057SHemant Agrawal return E_OK; 516*2ffc1057SHemant Agrawal } 517*2ffc1057SHemant Agrawal 518*2ffc1057SHemant Agrawal uint32_t 519*2ffc1057SHemant Agrawal fm_port_delete_pcd(t_handle h_fm_port) 520*2ffc1057SHemant Agrawal { 521*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_fm_port; 522*2ffc1057SHemant Agrawal 523*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 524*2ffc1057SHemant Agrawal 525*2ffc1057SHemant Agrawal if (ioctl(p_dev->fd, FM_PORT_IOC_DELETE_PCD)) 526*2ffc1057SHemant Agrawal RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 527*2ffc1057SHemant Agrawal 528*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 529*2ffc1057SHemant Agrawal 530*2ffc1057SHemant Agrawal return E_OK; 531*2ffc1057SHemant Agrawal } 532*2ffc1057SHemant Agrawal 533*2ffc1057SHemant Agrawal t_handle 534*2ffc1057SHemant Agrawal create_device(t_handle h_user_priv, t_handle h_dev_id) 535*2ffc1057SHemant Agrawal { 536*2ffc1057SHemant Agrawal t_device *p_user_priv_dev = (t_device *)h_user_priv; 537*2ffc1057SHemant Agrawal t_device *p_dev = NULL; 538*2ffc1057SHemant Agrawal 539*2ffc1057SHemant Agrawal _fml_dbg("Calling...\n"); 540*2ffc1057SHemant Agrawal 541*2ffc1057SHemant Agrawal p_dev = (t_device *)malloc(sizeof(t_device)); 542*2ffc1057SHemant Agrawal if (p_dev == NULL) 543*2ffc1057SHemant Agrawal return NULL; 544*2ffc1057SHemant Agrawal 545*2ffc1057SHemant Agrawal memset(p_dev, 0, sizeof(t_device)); 546*2ffc1057SHemant Agrawal p_dev->h_user_priv = h_user_priv; 547*2ffc1057SHemant Agrawal p_user_priv_dev->owners++; 548*2ffc1057SHemant Agrawal p_dev->id = PTR_TO_UINT(h_dev_id); 549*2ffc1057SHemant Agrawal 550*2ffc1057SHemant Agrawal _fml_dbg("Finishing.\n"); 551*2ffc1057SHemant Agrawal 552*2ffc1057SHemant Agrawal return (t_handle)p_dev; 553*2ffc1057SHemant Agrawal } 554*2ffc1057SHemant Agrawal 555*2ffc1057SHemant Agrawal t_handle 556*2ffc1057SHemant Agrawal get_device_id(t_handle h_dev) 557*2ffc1057SHemant Agrawal { 558*2ffc1057SHemant Agrawal t_device *p_dev = (t_device *)h_dev; 559*2ffc1057SHemant Agrawal 560*2ffc1057SHemant Agrawal return (t_handle)p_dev->id; 561*2ffc1057SHemant Agrawal } 562