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