xref: /dpdk/drivers/net/dpaa/fmlib/fm_vsp.c (revision 6be4899c951e85595c66cb13b13a229ec1268e45)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2019-2020 NXP
3  */
4 
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <fcntl.h>
9 #include <errno.h>
10 #include <unistd.h>
11 #include <termios.h>
12 #include <sys/ioctl.h>
13 #include <stdbool.h>
14 
15 #include <rte_common.h>
16 #include "fm_ext.h"
17 #include "fm_pcd_ext.h"
18 #include "fm_port_ext.h"
19 #include "fm_vsp_ext.h"
20 #include <dpaa_ethdev.h>
21 
22 uint32_t
23 fm_port_vsp_alloc(t_handle h_fm_port,
24 		  t_fm_port_vspalloc_params *p_params)
25 {
26 	t_device *p_dev = (t_device *)h_fm_port;
27 	ioc_fm_port_vsp_alloc_params_t params;
28 
29 	_fml_dbg("Calling...");
30 	memset(&params, 0, sizeof(ioc_fm_port_vsp_alloc_params_t));
31 	memcpy(&params.params, p_params, sizeof(t_fm_port_vspalloc_params));
32 
33 	if (ioctl(p_dev->fd, FM_PORT_IOC_VSP_ALLOC, &params))
34 		RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
35 
36 	_fml_dbg("Called.");
37 
38 	return E_OK;
39 }
40 
41 t_handle
42 fm_vsp_config(t_fm_vsp_params *p_fm_vsp_params)
43 {
44 	t_device *p_dev = NULL;
45 	t_device *p_vsp_dev = NULL;
46 	ioc_fm_vsp_params_t param;
47 
48 	p_dev = p_fm_vsp_params->h_fm;
49 
50 	_fml_dbg("Performing VSP Configuration...");
51 
52 	memset(&param, 0, sizeof(ioc_fm_vsp_params_t));
53 	memcpy(&param, p_fm_vsp_params, sizeof(t_fm_vsp_params));
54 	param.vsp_params.h_fm = UINT_TO_PTR(p_dev->id);
55 	param.id = NULL;
56 
57 	if (ioctl(p_dev->fd, FM_IOC_VSP_CONFIG, &param)) {
58 		DPAA_PMD_ERR("ioctl error");
59 		return NULL;
60 	}
61 
62 	p_vsp_dev = (t_device *)malloc(sizeof(t_device));
63 	if (!p_vsp_dev) {
64 		DPAA_PMD_ERR("FM VSP Params!");
65 		return NULL;
66 	}
67 	memset(p_vsp_dev, 0, sizeof(t_device));
68 	p_vsp_dev->h_user_priv = (t_handle)p_dev;
69 	p_dev->owners++;
70 	p_vsp_dev->id = PTR_TO_UINT(param.id);
71 
72 	_fml_dbg("VSP Configuration completed");
73 
74 	return (t_handle)p_vsp_dev;
75 }
76 
77 uint32_t
78 fm_vsp_init(t_handle h_fm_vsp)
79 {
80 	t_device *p_dev = NULL;
81 	t_device *p_vsp_dev = (t_device *)h_fm_vsp;
82 	ioc_fm_obj_t id;
83 
84 	_fml_dbg("Calling...");
85 
86 	p_dev = (t_device *)p_vsp_dev->h_user_priv;
87 	id.obj = UINT_TO_PTR(p_vsp_dev->id);
88 
89 	if (ioctl(p_dev->fd, FM_IOC_VSP_INIT, &id)) {
90 		DPAA_PMD_ERR("ioctl error");
91 		RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
92 	}
93 
94 	_fml_dbg("Called.");
95 
96 	return E_OK;
97 }
98 
99 uint32_t
100 fm_vsp_free(t_handle h_fm_vsp)
101 {
102 	t_device *p_dev = NULL;
103 	t_device *p_vsp_dev = (t_device *)h_fm_vsp;
104 	ioc_fm_obj_t id;
105 
106 	_fml_dbg("Calling...");
107 
108 	p_dev = (t_device *)p_vsp_dev->h_user_priv;
109 	id.obj = UINT_TO_PTR(p_vsp_dev->id);
110 
111 	if (ioctl(p_dev->fd, FM_IOC_VSP_FREE, &id)) {
112 		DPAA_PMD_ERR("ioctl error");
113 		RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
114 	}
115 
116 	p_dev->owners--;
117 	free(p_vsp_dev);
118 
119 	_fml_dbg("Called.");
120 
121 	return E_OK;
122 }
123 
124 uint32_t
125 fm_vsp_config_buffer_prefix_content(t_handle h_fm_vsp,
126 		t_fm_buffer_prefix_content *p_fm_buffer_prefix_content)
127 {
128 	t_device *p_dev = NULL;
129 	t_device *p_vsp_dev = (t_device *)h_fm_vsp;
130 	ioc_fm_buffer_prefix_content_params_t params;
131 
132 	_fml_dbg("Calling...");
133 
134 	p_dev = (t_device *)p_vsp_dev->h_user_priv;
135 	params.p_fm_vsp = UINT_TO_PTR(p_vsp_dev->id);
136 	memcpy(&params.fm_buffer_prefix_content,
137 	       p_fm_buffer_prefix_content, sizeof(*p_fm_buffer_prefix_content));
138 
139 	if (ioctl(p_dev->fd, FM_IOC_VSP_CONFIG_BUFFER_PREFIX_CONTENT,
140 		  &params)) {
141 		DPAA_PMD_ERR("ioctl error");
142 		RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
143 	}
144 
145 	_fml_dbg("Called.");
146 
147 	return E_OK;
148 }
149