xref: /dpdk/drivers/net/dpaa/fmlib/fm_lib.c (revision 6be4899c951e85595c66cb13b13a229ec1268e45)
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